CMS 3D CMS Logo

EventSkipperByID.cc
Go to the documentation of this file.
5 
6 namespace edm {
8  // The default value provided as the second argument to the getUntrackedParameter function call
9  // is not used when the ParameterSet has been validated and the parameters are not optional
10  // in the description. As soon as all primary input sources and all modules with a secondary
11  // input sources have defined descriptions, the defaults in the getUntrackedParameterSet function
12  // calls can and should be deleted from the code.
13  firstRun_(pset.getUntrackedParameter<unsigned int>("firstRun", 1U)),
14  firstLumi_(pset.getUntrackedParameter<unsigned int>("firstLuminosityBlock", 0U)),
15  firstEvent_(pset.existsAs<unsigned int>("firstEvent", false) ? pset.getUntrackedParameter<unsigned int>("firstEvent") :
16  pset.getUntrackedParameter<unsigned long long>("firstEvent", 1U)),
17  whichLumisToSkip_(pset.getUntrackedParameter<std::vector<LuminosityBlockRange> >("lumisToSkip", std::vector<LuminosityBlockRange>())),
18  whichLumisToProcess_(pset.getUntrackedParameter<std::vector<LuminosityBlockRange> >("lumisToProcess", std::vector<LuminosityBlockRange>())),
19  whichEventsToSkip_(pset.getUntrackedParameter<std::vector<EventRange> >("eventsToSkip",std::vector<EventRange>())),
20  whichEventsToProcess_(pset.getUntrackedParameter<std::vector<EventRange> >("eventsToProcess",std::vector<EventRange>())),
21  skippingLumis_(!(whichLumisToSkip_.empty() && whichLumisToProcess_.empty())),
22  skippingEvents_(!(whichEventsToSkip_.empty() && whichEventsToProcess_.empty())),
23  somethingToSkip_(skippingLumis_ || skippingEvents_ || !(firstRun_ <= 1U && firstLumi_ <= 1U && firstEvent_ <= 1U)) {
24 
29  }
30 
32 
33  std::unique_ptr<EventSkipperByID>
35  auto evSkp = std::make_unique<EventSkipperByID>(pset);
36  if (!evSkp->somethingToSkip()) {
37  evSkp.reset();
38  }
39  return evSkp;
40  }
41 
42  // Determines whether a run, lumi, or event will be skipped based on the run, lumi, and event number.
43  // This function is called by a predicate, so it must not modify the state of the EventSkipperByID_ object.
44  // The mutable lumi_ and event_ data members are just temporary caches, so they may be modified.
45  bool
47 
48  if(run == 0U) run = 1U; // Correct zero run number
49  if(run < firstRun_) {
50  // Skip all entries before the first run.
51  return true;
52  }
53  if(lumi == 0U) {
54  // This is a run entry that is not before the first run.
55  // Keep it, since there are no other parameters to skip runs.
56  return false;
57  }
58  // If we get here, this is a lumi or event entry.
59  if(run == firstRun_) {
60  // This lumi or event entry is in the first run to be processed.
61  if(lumi < firstLumi_) {
62  // This lumi or event entry is for a lumi prior to the first lumi to be processed. Skip it.
63  return true;
64  }
65  if(firstLumi_ == 0 || lumi == firstLumi_) {
66  // If we get here, this entry is in the first lumi to be processed in the first run.
67  // Note that if firstLumi_ == 0, we are processing all lumis in the run.
68  if(event != 0U && event < firstEvent_) {
69  // This is an event entry prior to the first event to be processed. Skip it.
70  return true;
71  }
72  }
73  }
74  if (skippingLumis()) {
75  // If we get here, the entry was not skipped due to firstRun, firstLuminosityBlock, and/or firstEvent.
76  LuminosityBlockID lumiID = LuminosityBlockID(run, lumi);
77  LuminosityBlockRange lumiRange = LuminosityBlockRange(lumiID, lumiID);
79  if(binary_search_all(whichLumisToSkip_, lumiRange, lt)) {
80  // The entry is in a lumi specified in whichLumisToSkip. Skip it.
81  return true;
82  }
83  if(!whichLumisToProcess_.empty() && !binary_search_all(whichLumisToProcess_, lumiRange, lt)) {
84  // The entry is not in a lumi specified in non-empty whichLumisToProcess. Skip it.
85  return true;
86  }
87  }
88  if(event == 0U) {
89  // The entry is a lumi entry that was not skipped above. Keep it.
90  return false;
91  }
92  if (skippingEvents()) {
93  // If we get here, the entry was not skipped due to firstRun, firstLuminosityBlock, and/or firstEvent.
94  EventID eventID = EventID(run, lumi, event);
95  EventRange eventRange = EventRange(eventID, eventID);
96  EventID eventIDNoLumi = EventID(run, 0U, event);
97  EventRange eventRangeNoLumi = EventRange(eventIDNoLumi, eventIDNoLumi);
98  bool(*lt)(EventRange const&, EventRange const&) = &lessThanSpecial;
99  if(binary_search_all(whichEventsToSkip_, eventRange, lt) || binary_search_all(whichEventsToSkip_, eventRangeNoLumi, lt)) {
100  // The entry is an event specified in whichEventsToSkip. Skip it.
101  return true;
102  }
103  if(!whichEventsToProcess_.empty() && !binary_search_all(whichEventsToProcess_, eventRange, lt) && !binary_search_all(whichEventsToProcess_, eventRangeNoLumi, lt)) {
104  // The entry is not an event specified in non-empty whichEventsToProcess. Skip it.
105  return true;
106  }
107  }
108  return false;
109  }
110 
111  void
113 
114  desc.addUntracked<unsigned int>("firstRun", 1U)
115  ->setComment("Skip any run with run number < 'firstRun'.");
116  desc.addUntracked<unsigned int>("firstLuminosityBlock", 0U)
117  ->setComment("Skip any lumi in run 'firstRun' with lumi number < 'firstLuminosityBlock'.");
118 
119  desc.addNode( edm::ParameterDescription<unsigned int>("firstEvent", 1U, false) xor
120  edm::ParameterDescription<unsigned long long>("firstEvent", 1ULL, false))
121  ->setComment("'firstEvent' is an XOR group because it can have type uint32 or uint64, default:1\n"
122  "If 'firstLuminosityBlock' == 0, skip any event in run 'firstRun' with event number < 'firstEvent'.\n"
123  "If 'firstLuminosityBlock' != 0, skip any event in lumi 'firstRun:firstLuminosityBlock' with event number < 'firstEvent'.");
124 
125  std::vector<LuminosityBlockRange> defaultLumis;
126  desc.addUntracked<std::vector<LuminosityBlockRange> >("lumisToSkip", defaultLumis)
127  ->setComment("Skip any lumi inside the specified run:lumi range. In python do 'help(cms.LuminosityBlockRange)' for documentation.");
128  desc.addUntracked<std::vector<LuminosityBlockRange> >("lumisToProcess", defaultLumis)
129  ->setComment("If not empty, skip any lumi outside the specified run:lumi range. In python do 'help(cms.LuminosityBlockRange)' for documentation.");
130 
131  std::vector<EventRange> defaultEvents;
132  desc.addUntracked<std::vector<EventRange> >("eventsToSkip", defaultEvents)
133  ->setComment("Skip any event inside the specified run:event or run:lumi:event range. In python do 'help(cms.EventRange)' for documentation.");
134  desc.addUntracked<std::vector<EventRange> >("eventsToProcess", defaultEvents)
135  ->setComment("If not empty, skip any event outside the specified run:event or run:lumi:event range. In python do 'help(cms.EventRange)' for documentation.");
136  }
137 }
void setComment(std::string const &value)
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
bool skippingLumis() const
static std::unique_ptr< EventSkipperByID > create(ParameterSet const &pset)
unsigned long long EventNumber_t
ParameterDescriptionNode * addNode(ParameterDescriptionNode const &node)
bool skipIt(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const
LuminosityBlockNumber_t firstLumi_
unsigned int LuminosityBlockNumber_t
bool skippingEvents() const
std::vector< LuminosityBlockRange > whichLumisToSkip_
std::vector< EventRange > whichEventsToProcess_
bool lessThanSpecial(EventRange const &lh, EventRange const &rh)
Definition: EventRange.cc:59
std::vector< LuminosityBlockRange > whichLumisToProcess_
std::vector< EventRange > whichEventsToSkip_
EventNumber_t firstEvent_
static void fillDescription(ParameterSetDescription &desc)
HLT enums.
std::vector< EventRange > & sortAndRemoveOverlaps(std::vector< EventRange > &eventRange)
Definition: EventRange.cc:102
bool binary_search_all(ForwardSequence const &s, Datum const &d)
wrappers for std::binary_search
Definition: Algorithms.h:76
bool lessThan(EventRange const &lh, EventRange const &rh)
Definition: EventRange.cc:67
unsigned int RunNumber_t
EventSkipperByID(ParameterSet const &pset)
Definition: event.py:1