LDMX Software
ReSimulator.cxx
1#include "SimCore/ReSimulator.h"
2
3#include "SimCore/SDs/SensitiveDetector.h"
4
5namespace simcore {
6
8 SimulatorBase::configure(parameters);
9 resimulate_all_events_ = parameters.get<bool>("resimulate_all_events");
11 care_about_run_ = parameters.get<bool>("care_about_run");
12 auto configured_events{
13 parameters.get<std::vector<framework::config::Parameters>>(
14 "events_to_resimulate", {})};
15 if (configured_events.size() == 0) {
16 EXCEPTION_RAISE(
17 "ReSimNoEvents",
18 "ReSim was configured with resimulate_all_events marked false but "
19 "no event numbers were requested.\n\nDid you forget to configure "
20 "the events_to_resimulate parameter?\n");
21 }
22 for (const auto& run_event : configured_events) {
23 events_to_resimulate_.emplace_back(run_event.get<int>("run"),
24 run_event.get<int>("event"));
25 }
26 }
27}
28
30 /* num_events_began_++; */
31 auto& event_header{event.getEventHeader()};
32 const auto event_number{event_header.getEventNumber()};
33 if (skip(event)) {
34 ldmx_log(trace) << "Skipping event: " << event_number
35 << " since it wasn't part of the requested events...";
36
37 this->abortEvent(); // get out of processors loop
38 return;
39 }
40
41 ldmx_log(trace) << "Resimulating " << event_number;
42
43 std::istringstream iss(event_header.getStringParameter("eventSeed"));
44 G4Random::restoreFullState(iss);
45
47 run_manager_->ProcessOneEvent(event_number);
48
49 ldmx_log(trace) << "Finished with event number " << event_number;
50
51 if (run_manager_->GetCurrentEvent()->IsAborted()) {
52 run_manager_->TerminateOneEvent();
53 SensitiveDetector::Factory::get().apply(
54 [](auto sd) { sd->onFinishedEvent(); });
55 EXCEPTION_RAISE(
56 "ReSimAbortedEvent",
57 "Resimulation resulted in an aborted event, something is wrong with "
58 "the seed from event " +
59 std::to_string(event_number));
60 }
61
62 event_header.setEventNumber(++events_resimulated_);
63 updateEventHeader(event_header);
64 saveTracks(event);
65
66 saveSDHits(event);
67
68 run_manager_->TerminateOneEvent();
69}
70
76 if (resimulate_all_events_) return false;
83 auto found_event_to_resim = std::find_if(
84 std::begin(events_to_resimulate_), std::end(events_to_resimulate_),
85 [&](const std::pair<int, int>& run_event) -> bool {
86 bool runs_match = true;
88 runs_match = (event.getEventHeader().getRun() == run_event.first);
89 return event.getEventNumber() == run_event.second and runs_match;
90 });
91 return (found_event_to_resim == std::end(events_to_resimulate_));
92}
93
94} // namespace simcore
#define DECLARE_PRODUCER(CLASS)
Macro which allows the framework to construct a producer given its name during configuration.
void abortEvent()
Abort the event immediately.
Implements an event buffer system for storing event data.
Definition Event.h:40
Class encapsulating parameters for configuring a processor.
Definition Parameters.h:26
const T & get(const std::string &name) const
Retrieve the parameter of the given name.
Definition Parameters.h:75
void produce(framework::Event &event) override
Run resimulation if the event is part of the requested sets of events to resimulate.
std::vector< std::pair< int, int > > events_to_resimulate_
List of events in the input files that should be resimulated if resimulate_all_events is false.
Definition ReSimulator.h:44
void configure(framework::config::Parameters &parameters) override
Callback for the processor to configure itself from the given set of parameters.
bool care_about_run_
Whether or not we should check the run number when seeing if a specific event should be resimulated.
Definition ReSimulator.h:55
bool skip(framework::Event &event) const
Check if an event should be skipped during resimulation.
bool resimulate_all_events_
Whether to resimulate all events in the input files.
Definition ReSimulator.h:49
std::unique_ptr< RunManager > run_manager_
Manager controlling G4 simulation run.
virtual void prepEvent(framework::Event &event)
prepare a new event before entering into the Geant4 simulation
void configure(framework::config::Parameters &parameters) override
Callback for the EventProcessor to configure itself from the given set of parameters.
Dynamically loadable photonuclear models either from SimCore or external libraries implementing this ...