9 #include <framework/modules/core/EventInfoSetterModule.h>
11 #include <framework/core/Environment.h>
12 #include <framework/utilities/Utils.h>
31 if (getenv(
"BELLE2_PRODUCTION"))
32 m_production = stoi(getenv(
"BELLE2_PRODUCTION"));
36 "Sets the event meta data information (exp, run, evt). You must use this "
37 "module to tell basf2 about the number of events you want to generate, "
38 "unless you have an input module that already does so. Note that all "
39 "experiment/run combinations specified must be unique."
43 addParam(
"expList", m_expList,
"List of experiment numbers. Can be overridden via --experiment argument to basf2.", m_expList);
44 addParam(
"runList", m_runList,
"List of run numbers. Can be overridden via --run argument to basf2.", m_runList);
45 addParam(
"evtNumList", m_evtNumList,
"List of the number of events which "
46 "should be processed. Can be overridden via -n argument to basf2.",
48 addParam(
"skipNEvents", m_eventsToSkip,
"Skip this number of events before "
49 "starting. Equivalent to running over this many events without performing "
50 "any action, to allow starting at higher event numbers.", m_eventsToSkip);
51 addParam(
"skipToEvent", m_skipToEvent,
"Skip events until the event with "
52 "the specified (experiment, run, event number) occurs. This parameter "
53 "is useful for debugging to start with a specific event.", m_skipToEvent);
56 EventInfoSetterModule::~EventInfoSetterModule() =
default;
58 void EventInfoSetterModule::initialize()
61 m_eventMetaDataPtr.registerInDataStore(DataStore::c_ErrorIfAlreadyRegistered);
64 unsigned int numEventsArgument = Environment::Instance().getNumberEventsOverride();
65 int runOverride = Environment::Instance().getRunOverride();
66 int expOverride = Environment::Instance().getExperimentOverride();
67 if (numEventsArgument > 0 or runOverride >= 0 or expOverride >= 0) {
68 if (m_evtNumList.size() > 1) {
69 B2ERROR(
"The -n/--events, --run, and --experiment options cannot be used when multiple runs are specified for EventInfoSetter!");
71 m_evtNumList[0] = numEventsArgument;
73 m_runList[0] = runOverride;
75 m_expList[0] = expOverride;
78 unsigned int skipNEventsOverride = Environment::Instance().getSkipEventsOverride();
79 if (skipNEventsOverride != 0)
80 m_eventsToSkip = skipNEventsOverride;
83 unsigned int defListSize = m_expList.size();
84 if ((m_runList.size() != defListSize) || (m_evtNumList.size() != defListSize)) {
85 B2ERROR(
"Parameters are inconsistent. The exp, run and evt lists must have the same number of entries.");
86 }
else if (defListSize == 0) {
87 B2ERROR(
"There are no events to be processed!");
89 set<pair<int, int>> expRunSet;
90 for (
unsigned int i = 0; i < defListSize; i++) {
91 auto ret = expRunSet.insert(make_pair(m_expList[i], m_runList[i]));
93 B2ERROR(
"Exp " << ret.first->first <<
", run " << ret.first->second <<
94 " used more than once! Please make sure all experiment/run combinations are unique.");
96 if (m_expList[i] < 0 or m_expList[i] > 1023)
97 B2ERROR(
"Experiment " << m_expList[i] <<
" is out of range, should be in [0, 1023]!");
99 B2ERROR(
"Run " << m_runList[i] <<
" is out of range, should be >= 0!");
100 unsigned int nevents = m_evtNumList[i];
101 if (nevents == std::numeric_limits<unsigned int>::max()) {
102 B2ERROR(
"Invalid number of events (valid range: 0.." << std::numeric_limits<unsigned int>::max() - 1 <<
")!");
107 if (!m_skipToEvent.empty()) {
109 if (m_skipToEvent.size() != 3) {
110 B2ERROR(
"skipToEvent must be a list of three values: experiment, run, event number");
112 m_skipToEvent.clear();
114 if (m_eventsToSkip > 0) {
115 B2ERROR(
"You cannot supply a number of events to skip (skipNEvents) and an "
116 "event to skip to (skipToEvent) at the same time, ignoring skipNEvents");
126 unsigned int totalevents = 0;
128 while (copy.advanceEventCounter()) {
132 B2DEBUG(100,
"EventInfoSetter: will process " << totalevents <<
" events in total.");
133 if (totalevents == 0) {
134 B2FATAL(
"Total processed number of events is 0, please check your inputs, -n and --skip-events arguments!");
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());
Module to set event, run, experiment numbers.
#define branch_unlikely(x)
A macro to tell the compiler that the argument x will be very likely be false.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Abstract base class for different kinds of events.