CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
EventWithHistoryFilter.cc
Go to the documentation of this file.
5 //#include "DPGAnalysis/SiStripTools/interface/APVLatency.h"
6 //#include "DPGAnalysis/SiStripTools/interface/APVLatencyRcd.h"
10 //#include "FWCore/Utilities/interface/Exception.h"
11 
13 
14 
16  m_historyToken(),
17  m_partition(),
18  m_APVPhaseToken(),
19  m_apvmodes(),
20  m_dbxrange(), m_dbxrangelat(),
21  m_bxrange(), m_bxrangelat(),
22  m_bxcyclerange(), m_bxcyclerangelat(),
23  m_dbxcyclerange(), m_dbxcyclerangelat(),
24  m_dbxtrpltrange(),
25  m_dbxgenericrange(),m_dbxgenericfirst(0),m_dbxgenericlast(1),
26  m_noAPVPhase(true)
27 {
29 }
30 
32  m_historyToken(iC.consumes<EventWithHistory>(iConfig.getUntrackedParameter<edm::InputTag>("historyProduct",edm::InputTag("consecutiveHEs")))),
33  m_partition(iConfig.getUntrackedParameter<std::string>("partitionName","Any")),
34  m_APVPhaseToken(iC.consumes<APVCyclePhaseCollection>(edm::InputTag(iConfig.getUntrackedParameter<std::string>("APVPhaseLabel","APVPhases")))),
35  m_apvmodes(iConfig.getUntrackedParameter<std::vector<int> >("apvModes",std::vector<int>())),
36  m_dbxrange(iConfig.getUntrackedParameter<std::vector<int> >("dbxRange",std::vector<int>())),
37  m_dbxrangelat(iConfig.getUntrackedParameter<std::vector<int> >("dbxRangeLtcyAware",std::vector<int>())),
38  m_bxrange(iConfig.getUntrackedParameter<std::vector<int> >("absBXRange",std::vector<int>())),
39  m_bxrangelat(iConfig.getUntrackedParameter<std::vector<int> >("absBXRangeLtcyAware",std::vector<int>())),
40  m_bxcyclerange(iConfig.getUntrackedParameter<std::vector<int> >("absBXInCycleRange",std::vector<int>())),
41  m_bxcyclerangelat(iConfig.getUntrackedParameter<std::vector<int> >("absBXInCycleRangeLtcyAware",std::vector<int>())),
42  m_dbxcyclerange(iConfig.getUntrackedParameter<std::vector<int> >("dbxInCycleRange",std::vector<int>())),
43  m_dbxcyclerangelat(iConfig.getUntrackedParameter<std::vector<int> >("dbxInCycleRangeLtcyAware",std::vector<int>())),
44  m_dbxtrpltrange(iConfig.getUntrackedParameter<std::vector<int> >("dbxTripletRange",std::vector<int>())),
45  m_dbxgenericrange(iConfig.getUntrackedParameter<std::vector<int> >("dbxGenericRange",std::vector<int>())),
46  m_dbxgenericfirst(iConfig.getUntrackedParameter<unsigned int>("dbxGenericFirst",0)),
47  m_dbxgenericlast(iConfig.getUntrackedParameter<unsigned int>("dbxGenericLast",1))
48 
49 {
51  printConfig(iConfig.getUntrackedParameter<edm::InputTag>("historyProduct",edm::InputTag("consecutiveHEs")),
52  edm::InputTag(iConfig.getUntrackedParameter<std::string>("APVPhaseLabel","APVPhases")));
53 }
54 
56 
57 
58  m_historyToken = iC.consumes<EventWithHistory>(iConfig.getUntrackedParameter<edm::InputTag>("historyProduct",edm::InputTag("consecutiveHEs")));
59  m_partition = iConfig.getUntrackedParameter<std::string>("partitionName","Any");
60  m_APVPhaseToken = iC.consumes<APVCyclePhaseCollection>(edm::InputTag(iConfig.getUntrackedParameter<std::string>("APVPhaseLabel","APVPhases")));
61  m_dbxrange = iConfig.getUntrackedParameter<std::vector<int> >("dbxRange",std::vector<int>());
62  m_dbxrangelat = iConfig.getUntrackedParameter<std::vector<int> >("dbxRangeLtcyAware",std::vector<int>());
63  m_bxrange = iConfig.getUntrackedParameter<std::vector<int> >("absBXRange",std::vector<int>());
64  m_bxrangelat = iConfig.getUntrackedParameter<std::vector<int> >("absBXRangeLtcyAware",std::vector<int>());
65  m_bxcyclerange = iConfig.getUntrackedParameter<std::vector<int> >("absBXInCycleRange",std::vector<int>());
66  m_bxcyclerangelat = iConfig.getUntrackedParameter<std::vector<int> >("absBXInCycleRangeLtcyAware",std::vector<int>());
67  m_dbxcyclerange = iConfig.getUntrackedParameter<std::vector<int> >("dbxInCycleRange",std::vector<int>());
68  m_dbxcyclerangelat = iConfig.getUntrackedParameter<std::vector<int> >("dbxInCycleRangeLtcyAware",std::vector<int>());
69  m_dbxtrpltrange = iConfig.getUntrackedParameter<std::vector<int> >("dbxTripletRange",std::vector<int>());
70  m_dbxgenericrange = iConfig.getUntrackedParameter<std::vector<int> >("dbxGenericRange",std::vector<int>());
71  m_dbxgenericfirst = iConfig.getUntrackedParameter<int>("dbxGenericFirst",0);
72  m_dbxgenericlast = iConfig.getUntrackedParameter<int>("dbxGenericLast",1);
73 
75  printConfig(iConfig.getUntrackedParameter<edm::InputTag>("historyProduct",edm::InputTag("consecutiveHEs")),
76  edm::InputTag(iConfig.getUntrackedParameter<std::string>("APVPhaseLabel","APVPhases")));
77 
78 }
79 
80 const bool EventWithHistoryFilter::selected(const EventWithHistory& he, const edm::EventSetup& iSetup) const {
81 
82  const std::vector<int> dummy;
83  return is_selected(he,iSetup,dummy);
84 
85 }
86 
87 const bool EventWithHistoryFilter::selected(const EventWithHistory& he, const edm::Event& iEvent, const edm::EventSetup& iSetup) const {
88 
89  const std::vector<int> apvphases = getAPVPhase(iEvent);
90  return is_selected(he,iSetup,apvphases);
91 
92 }
93 
94 const bool EventWithHistoryFilter::selected(const edm::Event& event, const edm::EventSetup& iSetup) const {
95 
96  const std::vector<int> apvphases = getAPVPhase(event);
97 
99  event.getByToken(m_historyToken,hEvent);
100 
101  return is_selected(*hEvent,iSetup,apvphases);
102 
103 }
104 
105 
106 const bool EventWithHistoryFilter::is_selected(const EventWithHistory& he, const edm::EventSetup& iSetup, const std::vector<int>& _apvphases) const {
107 
108  const std::vector<int> apvphases = _apvphases;
109  const int latency = getAPVLatency(iSetup);
110 
111 
112  bool selected = true;
113 
114  if(!isAPVModeNotNeeded()) {
115  const int apvmode = getAPVMode(iSetup);
116  bool modeok = false;
117  for(std::vector<int>::const_iterator wantedmode =m_apvmodes.begin();wantedmode!=m_apvmodes.end();++wantedmode) {
118  modeok = modeok || (apvmode == *wantedmode);
119  }
120  if(!modeok) return false;
121  }
122 
123  selected = selected && (isCutInactive(m_dbxrange) || isInRange(he.deltaBX(),m_dbxrange,he.depth()!=0));
124 
125  selected = selected && (isCutInactive(m_dbxrangelat) ||
126  isInRange(he.deltaBX()-latency,m_dbxrangelat,he.depth()!=0 && latency>=0));
127 
128  selected = selected && (isCutInactive(m_bxrange) || isInRange(he.absoluteBX()%70,m_bxrange,1));
129 
130  selected = selected && (isCutInactive(m_bxrangelat) ||
131  isInRange((he.absoluteBX()-latency)%70,m_bxrangelat,latency>=0));
132 
133  // loop on all the phases and require that the cut is fulfilled for at least one of them
134 
135 
136  bool phaseselected;
137 
138  phaseselected = isCutInactive(m_bxcyclerange);
139  for(std::vector<int>::const_iterator phase=apvphases.begin();phase!=apvphases.end();++phase) {
140  phaseselected = phaseselected || isInRange(he.absoluteBXinCycle(*phase)%70,m_bxcyclerange,*phase>=0);
141  }
142  selected = selected && phaseselected;
143 
144  phaseselected = isCutInactive(m_bxcyclerangelat);
145  for(std::vector<int>::const_iterator phase=apvphases.begin();phase!=apvphases.end();++phase) {
146  phaseselected = phaseselected || isInRange((he.absoluteBXinCycle(*phase)-latency)%70,m_bxcyclerangelat,
147  *phase>=0 && latency>=0);
148  }
149  selected = selected && phaseselected;
150 
151  phaseselected = isCutInactive(m_dbxcyclerange);
152  for(std::vector<int>::const_iterator phase=apvphases.begin();phase!=apvphases.end();++phase) {
153  phaseselected = phaseselected || isInRange(he.deltaBXinCycle(*phase),m_dbxcyclerange,he.depth()!=0 && *phase>=0);
154  }
155  selected = selected && phaseselected;
156 
157  phaseselected = isCutInactive(m_dbxcyclerangelat);
158  for(std::vector<int>::const_iterator phase=apvphases.begin();phase!=apvphases.end();++phase) {
159  phaseselected = phaseselected || isInRange(he.deltaBXinCycle(*phase)-latency,m_dbxcyclerangelat,
160  he.depth()!=0 && *phase>=0 && latency>=0);
161  }
162  selected = selected && phaseselected;
163 
164  // end of phase-dependent cuts
165 
166  selected = selected && (isCutInactive(m_dbxtrpltrange) ||
167  isInRange(he.deltaBX(1,2),m_dbxtrpltrange,he.depth()>1));
168 
169  selected = selected && (isCutInactive(m_dbxgenericrange) ||
171 
172  return selected;
173 
174 }
175 
177 
178  if(isAPVLatencyNotNeeded()) return -1;
179 
181  iSetup.get<SiStripLatencyRcd>().get(apvlat);
182  const int latency = apvlat->singleLatency()!=255 ? apvlat->singleLatency(): -1;
183 
184  // thrown an exception if latency value is invalid
185  /*
186  if(latency < 0 && !isAPVLatencyNotNeeded())
187  throw cms::Exception("InvalidAPVLatency") << " invalid APVLatency found ";
188  */
189 
190  return latency;
191 
192 }
193 
194 const int EventWithHistoryFilter::getAPVMode(const edm::EventSetup& iSetup) const {
195 
196  if(isAPVModeNotNeeded()) return -1;
197 
199  iSetup.get<SiStripLatencyRcd>().get(apvlat);
200  int mode = -1;
201  if(apvlat->singleReadOutMode()==1) mode = 47;
202  if(apvlat->singleReadOutMode()==0) mode = 37;
203 
204  // thrown an exception if mode value is invalid
205  /*
206  if(mode < 0 && !isAPVModeNotNeeded())
207  throw cms::Exception("InvalidAPVMode") << " invalid APVMode found ";
208  */
209 
210  return mode;
211 
212 }
213 
214 const std::vector<int> EventWithHistoryFilter::getAPVPhase(const edm::Event& iEvent) const {
215 
216  if(m_noAPVPhase) {
217  const std::vector<int> dummy;
218  return dummy;
219  }
220 
222  iEvent.getByToken(m_APVPhaseToken,apvPhases);
223 
224  const std::vector<int> phases = apvPhases->getPhases(m_partition.c_str());
225 
226  /*
227  if(!m_noAPVPhase) {
228  if(phases.size()==0) throw cms::Exception("NoPartitionAPVPhase")
229  << " No APV phase for partition " << m_partition.c_str() << " : check if a proper partition has been chosen ";
230  }
231  */
232 
233  return phases;
234 }
235 
237 
238  return
243 
244 }
245 
247 
248  return
253 
254 }
255 
257 
258  return (m_apvmodes.size()==0) ;
259 
260 }
261 
262 const bool EventWithHistoryFilter::isCutInactive(const std::vector<int>& range) const {
263 
264  return ((range.size()==0 ||
265  (range.size()==1 && range[0]<0) ||
266  (range.size()==2 && range[0]<0 && range[1]<0)));
267 
268 }
269 
270 const bool EventWithHistoryFilter::isInRange(const long long bx, const std::vector<int>& range, const bool extra) const {
271 
272  bool cut1 = range.size()<1 || range[0]<0 || (extra && bx >= range[0]);
273  bool cut2 = range.size()<2 || range[1]<0 || (extra && bx <= range[1]);
274 
275  if(range.size()>=2 && range[0]>=0 && range[1]>=0 && (range[0] > range[1])) {
276  return cut1 || cut2;
277  }
278  else {
279  return cut1 && cut2;
280  }
281 
282 }
283 
284 void EventWithHistoryFilter::printConfig(const edm::InputTag& historyTag, const edm::InputTag& apvphaseTag) const {
285 
286  std::string msgcategory = "EventWithHistoryFilterConfiguration";
287 
288  if(!(
299  )) {
300 
301  edm::LogInfo(msgcategory.c_str()) << "historyProduct: " << historyTag << " APVCyclePhase: " << apvphaseTag;
302 
303  edm::LogVerbatim(msgcategory.c_str()) << "-----------------------";
304  edm::LogVerbatim(msgcategory.c_str()) << "List of active cuts:";
305  if(!isCutInactive(m_bxrange)) {
306  edm::LogVerbatim(msgcategory.c_str()) << "......................";
307  if(m_bxrange.size()>=1) edm::LogVerbatim(msgcategory.c_str()) << "absoluteBX lower limit " << m_bxrange[0];
308  if(m_bxrange.size()>=2) edm::LogVerbatim(msgcategory.c_str()) << "absoluteBX upper limit " << m_bxrange[1];
309  edm::LogVerbatim(msgcategory.c_str()) << "......................";
310  }
312  edm::LogVerbatim(msgcategory.c_str()) << "......................";
313  if(m_bxrangelat.size()>=1) edm::LogVerbatim(msgcategory.c_str()) << "absoluteBXLtcyAware lower limit "
314  << m_bxrangelat[0];
315  if(m_bxrangelat.size()>=2) edm::LogVerbatim(msgcategory.c_str()) << "absoluteBXLtcyAware upper limit "
316  << m_bxrangelat[1];
317  edm::LogVerbatim(msgcategory.c_str()) << "......................";
318  }
320  edm::LogVerbatim(msgcategory.c_str()) << "......................";
321  edm::LogVerbatim(msgcategory.c_str()) <<"absoluteBXinCycle partition: " << m_partition;
322  if(m_bxcyclerange.size()>=1) edm::LogVerbatim(msgcategory.c_str()) << "absoluteBXinCycle lower limit "
323  << m_bxcyclerange[0];
324  if(m_bxcyclerange.size()>=2) edm::LogVerbatim(msgcategory.c_str()) << "absoluteBXinCycle upper limit "
325  << m_bxcyclerange[1];
326  edm::LogVerbatim(msgcategory.c_str()) << "......................";
327  }
329  edm::LogVerbatim(msgcategory.c_str()) << "......................";
330  edm::LogVerbatim(msgcategory.c_str()) <<"absoluteBXinCycleLtcyAware partition: " << m_partition;
331  if(m_bxcyclerangelat.size()>=1) edm::LogVerbatim(msgcategory.c_str()) << "absoluteBXinCycleLtcyAware lower limit "
332  << m_bxcyclerangelat[0];
333  if(m_bxcyclerangelat.size()>=2) edm::LogVerbatim(msgcategory.c_str()) << "absoluteBXinCycleLtcyAware upper limit "
334  << m_bxcyclerangelat[1];
335  edm::LogVerbatim(msgcategory.c_str()) << "......................";
336  }
337  if(!isCutInactive(m_dbxrange)) {
338  edm::LogVerbatim(msgcategory.c_str()) << "......................";
339  if(m_dbxrange.size()>=1) edm::LogVerbatim(msgcategory.c_str()) << "deltaBX lower limit " << m_dbxrange[0];
340  if(m_dbxrange.size()>=2) edm::LogVerbatim(msgcategory.c_str()) << "deltaBX upper limit " << m_dbxrange[1];
341  edm::LogVerbatim(msgcategory.c_str()) << "......................";
342  }
344  edm::LogVerbatim(msgcategory.c_str()) << "......................";
345  if(m_dbxrangelat.size()>=1) edm::LogVerbatim(msgcategory.c_str()) << "deltaBXLtcyAware lower limit "
346  << m_dbxrangelat[0];
347  if(m_dbxrangelat.size()>=2) edm::LogVerbatim(msgcategory.c_str()) << "deltaBXLtcyAware upper limit "
348  << m_dbxrangelat[1];
349  edm::LogVerbatim(msgcategory.c_str()) << "......................";
350  }
352  edm::LogVerbatim(msgcategory.c_str()) << "......................";
353  edm::LogVerbatim(msgcategory.c_str()) <<"deltaBXinCycle partition: " << m_partition;
354  if(m_dbxcyclerange.size()>=1) edm::LogVerbatim(msgcategory.c_str()) << "deltaBXinCycle lower limit "
355  << m_dbxcyclerange[0];
356  if(m_dbxcyclerange.size()>=2) edm::LogVerbatim(msgcategory.c_str()) << "deltaBXinCycle upper limit "
357  << m_dbxcyclerange[1];
358  edm::LogVerbatim(msgcategory.c_str()) << "......................";
359  }
361  edm::LogVerbatim(msgcategory.c_str()) << "......................";
362  edm::LogVerbatim(msgcategory.c_str()) <<"deltaBXinCycleLtcyAware partition: " << m_partition;
363  if(m_dbxcyclerangelat.size()>=1) edm::LogVerbatim(msgcategory.c_str()) << "deltaBXinCycleLtcyAware lower limit "
364  << m_dbxcyclerangelat[0];
365  if(m_dbxcyclerangelat.size()>=2) edm::LogVerbatim(msgcategory.c_str()) << "deltaBXinCycleLtcyAware upper limit "
366  << m_dbxcyclerangelat[1];
367  edm::LogVerbatim(msgcategory.c_str()) << "......................";
368  }
370  edm::LogVerbatim(msgcategory.c_str()) << "......................";
371  if(m_dbxtrpltrange.size()>=1) edm::LogVerbatim(msgcategory.c_str()) << "TripletIsolation lower limit "
372  << m_dbxtrpltrange[0];
373  if(m_dbxtrpltrange.size()>=2) edm::LogVerbatim(msgcategory.c_str()) << "TripletIsolation upper limit "
374  << m_dbxtrpltrange[1];
375  edm::LogVerbatim(msgcategory.c_str()) << "......................";
376  }
378  edm::LogVerbatim(msgcategory.c_str()) << "......................";
379  edm::LogVerbatim(msgcategory.c_str()) << "Generic DBX computed between n-" << m_dbxgenericfirst << " and n-"<<m_dbxgenericlast << " trigger";
380  if(m_dbxgenericrange.size()>=1) edm::LogVerbatim(msgcategory.c_str()) << "Generic DBX cut lower limit "
381  << m_dbxgenericrange[0];
382  if(m_dbxgenericrange.size()>=2) edm::LogVerbatim(msgcategory.c_str()) << "Generic DBX upper limit "
383  << m_dbxgenericrange[1];
384  edm::LogVerbatim(msgcategory.c_str()) << "......................";
385  }
386  edm::LogVerbatim(msgcategory.c_str()) << "-----------------------";
387  }
388 }
unsigned int depth() const
std::vector< int > m_dbxcyclerange
T getUntrackedParameter(std::string const &, T const &) const
std::vector< int > m_bxcyclerange
long long deltaBX(const unsigned int ev2, const unsigned int ev1) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:464
const bool isAPVPhaseNotNeeded() const
const bool is_selected(const EventWithHistory &he, const edm::EventSetup &iSetup, const std::vector< int > &apvphases) const
long long absoluteBX(const unsigned int ev1) const
long long absoluteBXinCycle(const unsigned int ev1, const int bx0) const
const std::vector< int > getAPVPhase(const edm::Event &iEvent) const
std::vector< int > m_dbxgenericrange
const bool isAPVModeNotNeeded() const
edm::EDGetTokenT< APVCyclePhaseCollection > m_APVPhaseToken
void printConfig(const edm::InputTag &historyTag, const edm::InputTag &apvphaseTag) const
std::vector< int > m_dbxrangelat
void set(const edm::ParameterSet &iConfig, edm::ConsumesCollector &&iC)
int iEvent
Definition: GenABIO.cc:230
const int getAPVMode(const edm::EventSetup &iSetup) const
std::vector< int > m_dbxtrpltrange
edm::EDGetTokenT< EventWithHistory > m_historyToken
const int getAPVLatency(const edm::EventSetup &iSetup) const
const bool selected(const EventWithHistory &he, const edm::EventSetup &iSetup) const
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
const bool isInRange(const long long bx, const std::vector< int > &range, const bool extra) const
std::vector< int > m_bxrangelat
const bool isAPVLatencyNotNeeded() const
std::vector< int > m_bxcyclerangelat
const T & get() const
Definition: EventSetup.h:56
std::vector< int > m_dbxcyclerangelat
long long deltaBXinCycle(const unsigned int ev2, const unsigned int ev1, const int bx0) const
const bool isCutInactive(const std::vector< int > &range) const
std::vector< int > m_apvmodes
std::vector< int > m_dbxrange
std::vector< int > m_bxrange