11 #include <framework/modules/core/EventInfoSetterModule.h>
13 #include <framework/core/Environment.h>
14 #include <framework/utilities/Utils.h>
33 if (getenv(
"BELLE2_PRODUCTION"))
34 m_production = stoi(getenv(
"BELLE2_PRODUCTION"));
38 "Sets the event meta data information (exp, run, evt). You must use this "
39 "module to tell basf2 about the number of events you want to generate, "
40 "unless you have an input module that already does so. Note that all "
41 "experiment/run combinations specified must be unique."
45 addParam(
"expList", m_expList,
"List of experiment numbers. Can be overridden via --experiment argument to basf2.", m_expList);
46 addParam(
"runList", m_runList,
"List of run numbers. Can be overridden via --run argument to basf2.", m_runList);
47 addParam(
"evtNumList", m_evtNumList,
"List of the number of events which "
48 "should be processed. Can be overridden via -n argument to basf2.",
50 addParam(
"skipNEvents", m_eventsToSkip,
"Skip this number of events before "
51 "starting. Equivalent to running over this many events without performing "
52 "any action, to allow starting at higher event numbers.", m_eventsToSkip);
53 addParam(
"skipToEvent", m_skipToEvent,
"Skip events until the event with "
54 "the specified (experiment, run, event number) occurs. This parameter "
55 "is useful for debugging to start with a specific event.", m_skipToEvent);
58 EventInfoSetterModule::~EventInfoSetterModule() =
default;
60 void EventInfoSetterModule::initialize()
63 m_eventMetaDataPtr.registerInDataStore(DataStore::c_ErrorIfAlreadyRegistered);
66 unsigned int numEventsArgument = Environment::Instance().getNumberEventsOverride();
67 int runOverride = Environment::Instance().getRunOverride();
68 int expOverride = Environment::Instance().getExperimentOverride();
69 if (numEventsArgument > 0 or runOverride >= 0 or expOverride >= 0) {
70 if (m_evtNumList.size() > 1) {
71 B2ERROR(
"The -n/--events, --run, and --experiment options cannot be used when multiple runs are specified for EventInfoSetter!");
73 m_evtNumList[0] = numEventsArgument;
75 m_runList[0] = runOverride;
77 m_expList[0] = expOverride;
80 unsigned int skipNEventsOverride = Environment::Instance().getSkipEventsOverride();
81 if (skipNEventsOverride != 0)
82 m_eventsToSkip = skipNEventsOverride;
85 unsigned int defListSize = m_expList.size();
86 if ((m_runList.size() != defListSize) || (m_evtNumList.size() != defListSize)) {
87 B2ERROR(
"Parameters are inconsistent. The exp, run and evt lists must have the same number of entries.");
88 }
else if (defListSize == 0) {
89 B2ERROR(
"There are no events to be processed!");
91 set<pair<int, int>> expRunSet;
92 for (
unsigned int i = 0; i < defListSize; i++) {
93 auto ret = expRunSet.insert(make_pair(m_expList[i], m_runList[i]));
95 B2ERROR(
"Exp " << ret.first->first <<
", run " << ret.first->second <<
96 " used more than once! Please make sure all experiment/run combinations are unique.");
98 if (m_expList[i] < 0 or m_expList[i] > 1023)
99 B2ERROR(
"Experiment " << m_expList[i] <<
" is out of range, should be in [0, 1023]!");
100 if (m_runList[i] < 0)
101 B2ERROR(
"Run " << m_runList[i] <<
" is out of range, should be >= 0!");
102 unsigned int nevents = m_evtNumList[i];
103 if (nevents == std::numeric_limits<unsigned int>::max()) {
104 B2ERROR(
"Invalid number of events (valid range: 0.." << std::numeric_limits<unsigned int>::max() - 1 <<
")!");
109 if (!m_skipToEvent.empty()) {
111 if (m_skipToEvent.size() != 3) {
112 B2ERROR(
"skipToEvent must be a list of three values: experiment, run, event number");
114 m_skipToEvent.clear();
116 if (m_eventsToSkip > 0) {
117 B2ERROR(
"You cannot supply a number of events to skip (skipNEvents) and an "
118 "event to skip to (skipToEvent) at the same time, ignoring skipNEvents");
128 unsigned int totalevents = 0;
130 while (copy.advanceEventCounter()) {
134 B2DEBUG(100,
"EventInfoSetter: will process " << totalevents <<
" events in total.");
136 Environment::Instance().setNumberOfMCEvents(totalevents);
140 bool EventInfoSetterModule::advanceEventCounter()
154 }
while ((m_colIndex <
static_cast<int>(m_expList.size())) &&
155 (m_evtNumList[m_colIndex] == 0));
157 if (m_colIndex <
static_cast<int>(m_expList.size())) {
167 if (m_skipToEvent[0] != m_expList[m_colIndex] || m_skipToEvent[1] != m_runList[m_colIndex]) {
169 m_evtNumber = m_evtNumList[m_colIndex] + 1;
172 m_evtNumber = m_skipToEvent[2];
174 m_skipToEvent.clear();
178 unsigned int nskip = 1;
179 const unsigned int eventsInList = m_evtNumList[m_colIndex];
180 if (m_evtNumber <= eventsInList)
181 nskip = eventsInList - m_evtNumber + 1;
182 if (nskip > m_eventsToSkip)
183 nskip = m_eventsToSkip;
185 m_eventsToSkip -= nskip;
186 m_evtNumber += nskip;
194 void EventInfoSetterModule::event()
196 if (!advanceEventCounter())
199 m_eventMetaDataPtr.create();
200 m_eventMetaDataPtr->setProduction(m_production);
201 m_eventMetaDataPtr->setExperiment(m_expList[m_colIndex]);
202 m_eventMetaDataPtr->setRun(m_runList[m_colIndex]);
203 m_eventMetaDataPtr->setEvent(m_evtNumber);
204 auto time = std::chrono::high_resolution_clock::now().time_since_epoch();
205 m_eventMetaDataPtr->setTime(std::chrono::duration_cast<std::chrono::nanoseconds>(time).count());