art-framework-suite / art

The implementation of the art physics event processing framework
Other
2 stars 7 forks source link

Event resampling support #100

Open knoepfel opened 2 years ago

knoepfel commented 2 years ago

This issue has been migrated from https://cdcvs.fnal.gov/redmine/issues/23925 (FNAL account required) Originally created by @gaponenko on 2020-01-18 05:39:42


Hello,

Mu2e uses "resampling" techniques in physics studies to increase the effective statistics of simulated samples. For example, one simulation job can produce a muon stopping in the Mu2e target. The next job will "resample" that muon stop event by decaying the muon and simulating the electron track many times, with different random seeds.

In general, we want the ability to take an existing art event and put all of its content into an empty event with a new event id. This is similar to the "event mixing" situation, and Mu2e currently uses a ResamplingMixer module to support this use case

https://github.com/Mu2e/Offline/blob/master/EventMixing/src/ResamplingMixer_module.cc

However the "resampling" use case is simpler than mixing: there is no need to aggregate data products. It is sufficient to support the nSecondaries==1 case, in the mixing terms. The limitation of the ResamplingMixer implementation is that one has to implement mixing of all possible user data types (which may be a meaningless concept for some types), and then provide run time configuration that lists all products in the event. This is burdensome.

Art can already provide all data products to a module via the RootInput source, without listing each one explicitly. It would be useful to add either a new "resampling source" or "resampling module" to the framework to support the resampling functionality. The new code should have the same resampling related settings like readMode, coverageFraction, etc., as the existing mixing code.

It is probably OK to lose provenance of resampled data products; this is what happens in the current Mu2e ResamplingMixer implementation.

We need a way to preserve original event IDs, even after multiple stages of resampling. In the ResamplingMixer case this is achieved by writing out event ID from the current mixing stage in the finalizeEvent() mixer detail call, and transmitting IDs from earlier stages via MixOps.

Please consider adding event resampling functionality to the framework.

Andrei