CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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.getUntrackedParameter<unsigned int>("firstEvent", 1U)),
16  whichLumisToSkip_(pset.getUntrackedParameter<std::vector<LuminosityBlockRange> >("lumisToSkip", std::vector<LuminosityBlockRange>())),
17  whichLumisToProcess_(pset.getUntrackedParameter<std::vector<LuminosityBlockRange> >("lumisToProcess", std::vector<LuminosityBlockRange>())),
18  whichEventsToSkip_(pset.getUntrackedParameter<std::vector<EventRange> >("eventsToSkip",std::vector<EventRange>())),
19  whichEventsToProcess_(pset.getUntrackedParameter<std::vector<EventRange> >("eventsToProcess",std::vector<EventRange>())),
20  skippingLumis_(!(whichLumisToSkip_.empty() && whichLumisToProcess_.empty())),
21  skippingEvents_(!(whichEventsToSkip_.empty() && whichEventsToProcess_.empty())),
22  somethingToSkip_(skippingLumis_ || skippingEvents_ || !(firstRun_ <= 1U && firstLumi_ <= 1U && firstEvent_ <= 1U)) {
27  }
28 
30 
31  std::auto_ptr<EventSkipperByID>
33  std::auto_ptr<EventSkipperByID> evSkp(new EventSkipperByID(pset));
34  if (!evSkp->somethingToSkip()) {
35  evSkp.reset();
36  }
37  return evSkp;
38  }
39 
40  // Determines whether a run, lumi, or event will be skipped based on the run, lumi, and event number.
41  // This function is called by a predicate, so it must not modify the state of the EventSkipperByID_ object.
42  // The mutable lumi_ and event_ data members are just temporary caches, so they may be modified.
43  bool
45 
46  if(run == 0U) run = 1U; // Correct zero run number
47  if(run < firstRun_) {
48  // Skip all entries before the first run.
49  return true;
50  }
51  if(lumi == 0U) {
52  // This is a run entry that is not before the first run.
53  // Keep it, since there are no other parameters to skip runs.
54  return false;
55  }
56  // If we get here, this is a lumi or event entry.
57  if(run == firstRun_) {
58  // This lumi or event entry is in the first run to be processed.
59  if(lumi < firstLumi_) {
60  // This lumi or event entry is for a lumi prior to the first lumi to be processed. Skip it.
61  return true;
62  }
63  if(firstLumi_ == 0 || lumi == firstLumi_) {
64  // If we get here, this entry is in the first lumi to be processed in the first run.
65  // Note that if firstLumi_ == 0, we are processing all lumis in the run.
66  if(event != 0U && event < firstEvent_) {
67  // This is an event entry prior to the first event to be processed. Skip it.
68  return true;
69  }
70  }
71  }
72  if (skippingLumis()) {
73  // If we get here, the entry was not skipped due to firstRun, firstLuminosityBlock, and/or firstEvent.
74  LuminosityBlockID lumiID = LuminosityBlockID(run, lumi);
75  LuminosityBlockRange lumiRange = LuminosityBlockRange(lumiID, lumiID);
76  bool(*lt)(LuminosityBlockRange const&, LuminosityBlockRange const&) = &lessThan;
77  if(binary_search_all(whichLumisToSkip_, lumiRange, lt)) {
78  // The entry is in a lumi specified in whichLumisToSkip. Skip it.
79  return true;
80  }
81  if(!whichLumisToProcess_.empty() && !binary_search_all(whichLumisToProcess_, lumiRange, lt)) {
82  // The entry is not in a lumi specified in non-empty whichLumisToProcess. Skip it.
83  return true;
84  }
85  }
86  if(event == 0U) {
87  // The entry is a lumi entry that was not skipped above. Keep it.
88  return false;
89  }
90  if (skippingEvents()) {
91  // If we get here, the entry was not skipped due to firstRun, firstLuminosityBlock, and/or firstEvent.
92  EventID eventID = EventID(run, lumi, event);
93  EventRange eventRange = EventRange(eventID, eventID);
94  EventID eventIDNoLumi = EventID(run, 0U, event);
95  EventRange eventRangeNoLumi = EventRange(eventIDNoLumi, eventIDNoLumi);
96  bool(*lt)(EventRange const&, EventRange const&) = &lessThanSpecial;
97  if(binary_search_all(whichEventsToSkip_, eventRange, lt) || binary_search_all(whichEventsToSkip_, eventRangeNoLumi, lt)) {
98  // The entry is an event specified in whichEventsToSkip. Skip it.
99  return true;
100  }
101  if(!whichEventsToProcess_.empty() && !binary_search_all(whichEventsToProcess_, eventRange, lt) && !binary_search_all(whichEventsToProcess_, eventRangeNoLumi, lt)) {
102  // The entry is not an event specified in non-empty whichEventsToProcess. Skip it.
103  return true;
104  }
105  }
106  return false;
107  }
108 
109  void
111 
112  desc.addUntracked<unsigned int>("firstRun", 1U)
113  ->setComment("Skip any run with run number < 'firstRun'.");
114  desc.addUntracked<unsigned int>("firstLuminosityBlock", 0U)
115  ->setComment("Skip any lumi in run 'firstRun' with lumi number < 'firstLuminosityBlock'.");
116  desc.addUntracked<unsigned int>("firstEvent", 1U)
117  ->setComment("If 'firstLuminosityBlock' == 0, skip any event in run 'firstRun' with event number < 'firstEvent'.\n"
118  "If 'firstLuminosityBlock' != 0, skip any event in lumi 'firstRun:firstLuminosityBlock' with event number < 'firstEvent'.");
119 
120  std::vector<LuminosityBlockRange> defaultLumis;
121  desc.addUntracked<std::vector<LuminosityBlockRange> >("lumisToSkip", defaultLumis)
122  ->setComment("Skip any lumi inside the specified run:lumi range. In python do 'help(cms.LuminosityBlockRange)' for documentation.");
123  desc.addUntracked<std::vector<LuminosityBlockRange> >("lumisToProcess", defaultLumis)
124  ->setComment("If not empty, skip any lumi outside the specified run:lumi range. In python do 'help(cms.LuminosityBlockRange)' for documentation.");
125 
126  std::vector<EventRange> defaultEvents;
127  desc.addUntracked<std::vector<EventRange> >("eventsToSkip", defaultEvents)
128  ->setComment("Skip any event inside the specified run:event or run:lumi:event range. In python do 'help(cms.EventRange)' for documentation.");
129  desc.addUntracked<std::vector<EventRange> >("eventsToProcess", defaultEvents)
130  ->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.");
131  }
132 }
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
unsigned int EventNumber_t
Definition: EventID.h:30
bool skippingLumis() const
tuple lumi
Definition: fjr2json.py:35
bool skipIt(RunNumber_t run, LuminosityBlockNumber_t lumi, EventNumber_t event) const
LuminosityBlockNumber_t firstLumi_
unsigned int LuminosityBlockNumber_t
Definition: EventID.h:31
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_
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
std::vector< EventRange > whichEventsToSkip_
EventNumber_t firstEvent_
static void fillDescription(ParameterSetDescription &desc)
< trclass="colgroup">< tdclass="colgroup"colspan=5 > DT local reconstruction</td ></tr >< tr >< td >< ahref="classDTRecHit1DPair.html"> DTRecHit1DPair</a ></td >< td >< ahref="DataFormats_DTRecHit.html"> edm::RangeMap & lt
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
Definition: EventRange.h:32
static std::auto_ptr< EventSkipperByID > create(ParameterSet const &pset)
EventSkipperByID(ParameterSet const &pset)