CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
L1RCTProducer.cc
Go to the documentation of this file.
2 
3 // RunInfo stuff
7 
8 #include <vector>
9 using std::vector;
10 #include <iostream>
11 
12 
13 
14 using std::cout;
15 using std::endl;
16 const int L1RCTProducer::crateFED[18][6]=
17  {{613, 614, 603, 702, 718, 1118},
18  {611, 612, 602, 700, 718, 1118},
19  {627, 610, 601, 716, 722, 1122},
20  {625, 626, 609, 714, 722, 1122},
21  {623, 624, 608, 712, 722, 1122},
22  {621, 622, 607, 710, 720, 1120},
23  {619, 620, 606, 708, 720, 1120},
24  {617, 618, 605, 706, 720, 1120},
25  {615, 616, 604, 704, 718, 1118},
26  {631, 632, 648, 703, 719, 1118},
27  {629, 630, 647, 701, 719, 1118},
28  {645, 628, 646, 717, 723, 1122},
29  {643, 644, 654, 715, 723, 1122},
30  {641, 642, 653, 713, 723, 1122},
31  {639, 640, 652, 711, 721, 1120},
32  {637, 638, 651, 709, 721, 1120},
33  {635, 636, 650, 707, 721, 1120},
34  {633, 634, 649, 705, 719, 1118}};
35 
37  rctLookupTables(new L1RCTLookupTables),
38  rct(new L1RCT(rctLookupTables)),
39  useEcal(conf.getParameter<bool>("useEcal")),
40  useHcal(conf.getParameter<bool>("useHcal")),
41  ecalDigis(conf.getParameter<std::vector<edm::InputTag> >("ecalDigis")),
42  hcalDigis(conf.getParameter<std::vector<edm::InputTag> >("hcalDigis")),
43  bunchCrossings(conf.getParameter<std::vector<int> >("BunchCrossings")),
44  getFedsFromOmds(conf.getParameter<bool>("getFedsFromOmds")),
45  queryDelayInLS(conf.getParameter<unsigned int>("queryDelayInLS")),
46  queryIntervalInLS(conf.getParameter<unsigned int>("queryIntervalInLS")),
47  conditionsLabel(conf.getParameter<std::string>("conditionsLabel")),
48  fedUpdatedMask(0)
49 {
50  produces<L1CaloEmCollection>();
51  produces<L1CaloRegionCollection>();
52 
53  for(unsigned int ihc=0;ihc<hcalDigis.size();ihc++){
54  consumes<edm::SortedCollection<HcalTriggerPrimitiveDigi,edm::StrictWeakOrdering<HcalTriggerPrimitiveDigi> > >(hcalDigis[ihc]);
55  }
56 
57  for(unsigned int iec=0;iec<ecalDigis.size();iec++){
58  consumes<edm::SortedCollection<EcalTriggerPrimitiveDigi,edm::StrictWeakOrdering<EcalTriggerPrimitiveDigi> > >(ecalDigis[iec]);
59  }
60 }
61 
63 {
64  if(rct != 0) delete rct;
65  if(rctLookupTables != 0) delete rctLookupTables;
66  if(fedUpdatedMask != 0) delete fedUpdatedMask;
67 }
68 
69 
70 void L1RCTProducer::beginRun(edm::Run const& run, const edm::EventSetup& eventSetup)
71 {
72  // std::cout << "getFedsFromOmds is " << getFedsFromOmds << std::endl;
73 
74  updateConfiguration(eventSetup);
75 
76  int runNumber = run.run();
77  updateFedVector(eventSetup,false,runNumber); // RUNINFO ONLY at beginning of run
78 
79 }
80 
81 
83 {
84  // check LS number every LS, if the checkOMDS flag is set AND it's the right LS, update the FED vector from OMDS
85  // can pass the flag as the bool?? but only check LS number if flag is true anyhow
86  if (getFedsFromOmds)
87  {
88  unsigned int nLumi = lumiSeg.luminosityBlock(); // doesn't even need the (unsigned int) cast because LuminosityBlockNumber_t is already an unsigned int
89  // LS count starts at 1, want to be able to delay 0 LS's intuitively
90  if ( ( (nLumi - 1) == queryDelayInLS)
91  || (queryIntervalInLS > 0 && nLumi % queryIntervalInLS == 0 ) ) // to guard against problems if online DQM crashes; every 100 LS is ~20-30 minutes, not too big a load, hopefully not too long between
92  {
93  int runNumber = lumiSeg.run();
94  // std::cout << "Lumi section for this FED vector update is " << nLumi << std::endl;
95  updateFedVector(context,true,runNumber); // OMDS
96  }
97  else if (queryIntervalInLS <= 0)
98  {
99  // don't do interval checking... cout message??
100  }
101  }
102 }
103 
104 
105 
107 {
108  // Refresh configuration information every event
109  // Hopefully, this does not take too much time
110  // There should be a call back function in future to
111  // handle changes in configuration
112  // parameters to configure RCT (thresholds, etc)
113  edm::ESHandle<L1RCTParameters> rctParameters;
114  eventSetup.get<L1RCTParametersRcd>().get(conditionsLabel, rctParameters);
115  const L1RCTParameters* r = rctParameters.product();
116 
117  //SCALES
118 
119  // energy scale to convert eGamma output
121  eventSetup.get<L1EmEtScaleRcd>().get(conditionsLabel, emScale);
122  const L1CaloEtScale* s = emScale.product();
123 
124  // get energy scale to convert input from ECAL
126  eventSetup.get<L1CaloEcalScaleRcd>().get(conditionsLabel, ecalScale);
127  const L1CaloEcalScale* e = ecalScale.product();
128 
129  // get energy scale to convert input from HCAL
131  eventSetup.get<L1CaloHcalScaleRcd>().get(conditionsLabel, hcalScale);
132  const L1CaloHcalScale* h = hcalScale.product();
133 
134  // set scales
137 
140 }
141 
142 
143 void L1RCTProducer::updateFedVector(const edm::EventSetup& eventSetup, bool getFromOmds, int runNumber) // eventSetup apparently doesn't include run number: http://cmslxr.fnal.gov/lxr/source/FWCore/Framework/interface/EventSetup.h
144 {
145  // list of RCT channels to mask
147  eventSetup.get<L1RCTChannelMaskRcd>().get(channelMask);
148  const L1RCTChannelMask* cEs = channelMask.product();
149 
150 
151  // list of Noisy RCT channels to mask
153  eventSetup.get<L1RCTNoisyChannelMaskRcd>().get(hotChannelMask);
154  const L1RCTNoisyChannelMask* cEsNoise = hotChannelMask.product();
156 
157 
158 
159  //Update the channel mask according to the FED VECTOR
160  //This is the beginning of run. We delete the old
161  //create the new and set it in the LUTs
162 
163  if(fedUpdatedMask!=0) delete fedUpdatedMask;
164 
166  // copy a constant object
167  for (int i = 0; i < 18; i++)
168  {
169  for (int j = 0; j < 2; j++)
170  {
171  for (int k = 0; k < 28; k++)
172  {
173  fedUpdatedMask->ecalMask[i][j][k] = cEs->ecalMask[i][j][k];
174  fedUpdatedMask->hcalMask[i][j][k] = cEs->hcalMask[i][j][k] ;
175  }
176  for (int k = 0; k < 4; k++)
177  {
178  fedUpdatedMask->hfMask[i][j][k] = cEs->hfMask[i][j][k];
179  }
180  }
181  }
182 
183 
184 // // adding fed mask into channel mask
185 
186  const std::vector<int> Feds = getFromOmds ? getFedVectorFromOmds(eventSetup) : getFedVectorFromRunInfo(eventSetup);
187  // so can create/initialize/assign const quantity in one line accounting for if statement
188  // wikipedia says this is exactly what it's for: http://en.wikipedia.org/wiki/%3F:#C.2B.2B
189 
190 // std::cout << "Contents of ";
191 // std::cout << (getFromOmds ? "OMDS RunInfo" : "standard RunInfo");
192 // std::cout << " FED vector" << std::endl;
193 // printFedVector(Feds);
194 
195  bool useUpgradedHF=false;
196 
197  std::vector<int> caloFeds; // pare down the feds to the interesting ones
198  // is this unneccesary?
199  // Mike B : This will decrease the find speed so better do it
200  for(std::vector<int>::const_iterator cf = Feds.begin(); cf != Feds.end(); ++cf)
201  {
202  int fedNum = *cf;
203  if((fedNum > 600 && fedNum <724) || fedNum==1118 || fedNum == 1120 || fedNum == 1122)
204  caloFeds.push_back(fedNum);
205 
206  if(fedNum==1118 || fedNum == 1120 || fedNum == 1122) useUpgradedHF=true;
207 
208  }
209 
210  for(int cr = 0; cr < 18; ++cr)
211  {
212 
213  for(crateSection cs = c_min; cs <= c_max; cs = crateSection(cs +1))
214  {
215  bool fedFound = false;
216 
217  //Try to find the FED
218  std::vector<int>::iterator fv= std::find(caloFeds.begin(),caloFeds.end(),crateFED[cr][cs]);
219  if(fv!=caloFeds.end())
220  fedFound = true;
221 
222 
223 
224  if(!fedFound) {
225  int eta_min=0;
226  int eta_max=0;
227  bool phi_even[2] = {false};//, phi_odd = false;
228  bool ecal=false;
229 
230  switch (cs) {
231  case ebEvenFed :
232  eta_min = minBarrel;
233  eta_max = maxBarrel;
234  phi_even[0] = true;
235  ecal = true;
236  break;
237 
238  case ebOddFed:
239  eta_min = minBarrel;
240  eta_max = maxBarrel;
241  phi_even[1] = true;
242  ecal = true;
243  break;
244 
245  case eeFed:
246  eta_min = minEndcap;
247  eta_max = maxEndcap;
248  phi_even[0] = true;
249  phi_even[1] = true;
250  ecal = true;
251  break;
252 
253  case hbheFed:
254  eta_min = minBarrel;
255  eta_max = maxEndcap;
256  phi_even[0] = true;
257  phi_even[1] = true;
258  ecal = false;
259  break;
260 
261  case hfFed:
262  if(useUpgradedHF) break;
263 
264  eta_min = minHF;
265  eta_max = maxHF;
266 
267  phi_even[0] = true;
268  phi_even[1] = true;
269  ecal = false;
270  break;
271 
272  case hfFedUp:
273  if(!useUpgradedHF) break;
274 
275  eta_min = minHF;
276  eta_max = maxHF;
277 
278  phi_even[0] = true;
279  phi_even[1] = true;
280  ecal = false;
281  break;
282 
283 
284  default:
285  break;
286 
287  }
288  for(int ieta = eta_min; ieta <= eta_max; ++ieta)
289  {
290  if(ieta<=28) // barrel and endcap
291  for(int even = 0; even<=1 ; even++)
292  {
293  if(phi_even[even])
294  {
295  if(ecal)
296  fedUpdatedMask->ecalMask[cr][even][ieta-1] = true;
297  else
298  fedUpdatedMask->hcalMask[cr][even][ieta-1] = true;
299  }
300  }
301  else
302  for(int even = 0; even<=1 ; even++)
303  if(phi_even[even])
304  fedUpdatedMask->hfMask[cr][even][ieta-29] = true;
305 
306  }
307  }
308  }
309  }
310 
312 
313 }
314 
315 const std::vector<int> L1RCTProducer::getFedVectorFromRunInfo(const edm::EventSetup& eventSetup)
316 {
317  // std::cout << "Getting FED vector from standard RunInfo object" << std::endl;
318  // get FULL FED vector from RUNINFO
320  eventSetup.get<RunInfoRcd>().get(sum);
321  const RunInfo* summary=sum.product();
322  const std::vector<int> fedvector = summary->m_fed_in;
323 
324  return fedvector;
325 }
326 
327 
328 const std::vector<int> L1RCTProducer::getFedVectorFromOmds(const edm::EventSetup& eventSetup)
329 {
330 
331  // std::cout << "Getting FED vector from my specific ES RunInfo object" << std::endl;
332 
333  // get FULL FED vector from RunInfo object specifically created to have OMDS fed vector
335  eventSetup.get<RunInfoRcd>().get("OmdsFedVector",sum); // using label to get my specific instance of RunInfo
336  if (sum.isValid())
337  {
338  const RunInfo* summary=sum.product();
339  const std::vector<int> fedvector = summary->m_fed_in;
340 
341  return fedvector;
342  }
343  else
344  {
345  return getFedVectorFromRunInfo(eventSetup);
346  }
347 
348 }
349 
350 
351 
353 {
354 
355 
356  std::auto_ptr<L1CaloEmCollection> rctEmCands (new L1CaloEmCollection);
357  std::auto_ptr<L1CaloRegionCollection> rctRegions (new L1CaloRegionCollection);
358 
359 
360  if(!(ecalDigis.size()==hcalDigis.size()&&hcalDigis.size()==bunchCrossings.size()))
361  throw cms::Exception("BadInput")
362  << "From what I see the number of your your ECAL input digi collections.\n"
363  <<"is different from the size of your HCAL digi input collections\n"
364  <<"or the size of your BX factor collection"
365  <<"They must be the same to correspond to the same Bxs\n"
366  << "It does not matter if one of them is empty\n";
367 
368 
369 
370 
371  // loop through and process each bx
372  for (unsigned short sample = 0; sample < bunchCrossings.size(); sample++)
373  {
376 
379 
380 
381  if(useHcal&&event.getByLabel(hcalDigis[sample], hcal))
382  hcalIn = *hcal;
383 
384  if(useEcal&&event.getByLabel(ecalDigis[sample],ecal))
385  ecalIn = *ecal;
386 
387  rct->digiInput(ecalIn,hcalIn);
388  rct->processEvent();
389 
390  // Stuff to create
391  for (int j = 0; j<18; j++)
392  {
393  L1CaloEmCollection isolatedEGObjects = rct->getIsolatedEGObjects(j);
394  L1CaloEmCollection nonisolatedEGObjects = rct->getNonisolatedEGObjects(j);
395  for (int i = 0; i<4; i++)
396  {
397  isolatedEGObjects.at(i).setBx(bunchCrossings[sample]);
398  nonisolatedEGObjects.at(i).setBx(bunchCrossings[sample]);
399  rctEmCands->push_back(isolatedEGObjects.at(i));
400  rctEmCands->push_back(nonisolatedEGObjects.at(i));
401  }
402  }
403 
404 
405  for (int i = 0; i < 18; i++)
406  {
407  std::vector<L1CaloRegion> regions = rct->getRegions(i);
408  for (int j = 0; j < 22; j++)
409  {
410  regions.at(j).setBx(bunchCrossings[sample]);
411  rctRegions->push_back(regions.at(j));
412  }
413  }
414 
415  }
416 
417 
418  //putting stuff back into event
419  event.put(rctEmCands);
420  event.put(rctRegions);
421 
422 }
423 
424 // print contents of (FULL) FED vector
425 void L1RCTProducer::printFedVector(const std::vector<int>& fedVector)
426 {
427  std::cout << "Contents of given fedVector: ";
428  std::copy(fedVector.begin(), fedVector.end(), std::ostream_iterator<int>(std::cout, ", "));
429  std::cout << std::endl;
430 }
431 
432 // print contents of RCT channel mask fedUpdatedMask
434 {
435  if (fedUpdatedMask != 0)
436  {
438  }
439  else
440  {
441  std::cout << "Trying to print contents of fedUpdatedMask, but it doesn't exist!" << std::endl;
442  }
443 }
444 
445 // print contents of RCT channel mask fedUpdatedMask
447 {
448  if (fedUpdatedMask != 0)
449  {
450  // print contents of fedvector
451  std::cout << "Contents of fedUpdatedMask: ";
452 // std::copy(fedUpdatedMask.begin(), fedUpdatedMask.end(), std::ostream_iterator<int>(std::cout, ", "));
453  std::cout << "--> ECAL mask: " << std::endl;
454  for (int i = 0; i < 18; i++)
455  {
456  for (int j = 0; j < 2; j++)
457  {
458  for (int k = 0; k < 28; k++)
459  {
460  std::cout << fedUpdatedMask->ecalMask[i][j][k] << ", ";
461  }
462  }
463  }
464  std::cout << "--> HCAL mask: " << std::endl;
465  for (int i = 0; i < 18; i++)
466  {
467  for (int j = 0; j < 2; j++)
468  {
469  for (int k = 0; k < 28; k++)
470  {
471  std::cout << fedUpdatedMask->hcalMask[i][j][k] << ", ";
472  }
473  }
474  }
475  std::cout << "--> HF mask: " << std::endl;
476  for (int i = 0; i < 18; i++)
477  {
478  for (int j = 0; j < 2; j++)
479  {
480  for (int k = 0; k < 4; k++)
481  {
482  std::cout << fedUpdatedMask->hfMask[i][j][k] << ", ";
483  }
484  }
485  }
486 
487  std::cout << std::endl;
488  }
489  else
490  {
491  //print error message
492  std::cout << "Trying to print contents of fedUpdatedMask, but it doesn't exist!" << std::endl;
493  }
494 }
int i
Definition: DBlmapReader.cc:9
static const int minHF
std::vector< L1CaloEmCand > L1CaloEmCollection
auto_ptr< ClusterSequence > cs
std::string conditionsLabel
Definition: L1RCTProducer.h:78
RunNumber_t run() const
Definition: RunBase.h:40
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
const std::vector< int > getFedVectorFromRunInfo(const edm::EventSetup &)
void updateConfiguration(const edm::EventSetup &)
L1RCTLookupTables * rctLookupTables
Definition: L1RCTProducer.h:68
std::vector< L1CaloRegion > getRegions(unsigned crate)
Definition: L1RCT.cc:366
void printFedVector(const std::vector< int > &)
virtual ~L1RCTProducer()
bool ecalMask[18][2][28]
void printUpdatedFedMaskVerbose()
L1RCTProducer(const edm::ParameterSet &ps)
unsigned int queryDelayInLS
Definition: L1RCTProducer.h:76
virtual void beginLuminosityBlock(edm::LuminosityBlock const &lumiSeg, const edm::EventSetup &context) overridefinal
L1CaloEmCollection getNonisolatedEGObjects(unsigned crate)
Definition: L1RCT.cc:352
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:7
bool getFedsFromOmds
Definition: L1RCTProducer.h:75
std::vector< edm::InputTag > hcalDigis
Definition: L1RCTProducer.h:73
void print(std::ostream &s) const
LuminosityBlockNumber_t luminosityBlock() const
static const int maxHF
void setHcalScale(const L1CaloHcalScale *hcalScale)
const std::vector< int > getFedVectorFromOmds(const edm::EventSetup &)
std::vector< edm::InputTag > ecalDigis
Definition: L1RCTProducer.h:72
std::vector< int > bunchCrossings
Definition: L1RCTProducer.h:74
virtual void produce(edm::Event &e, const edm::EventSetup &c) overridefinal
std::vector< int > m_fed_in
Definition: RunInfo.h:26
L1CaloEmCollection getIsolatedEGObjects(unsigned crate)
Definition: L1RCT.cc:335
void printUpdatedFedMask()
int j
Definition: DBlmapReader.cc:9
RunNumber_t run() const
void updateFedVector(const edm::EventSetup &, bool getFromOmds, int)
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
void setL1CaloEtScale(const L1CaloEtScale *etScale)
static const int minBarrel
Definition: L1RCTProducer.h:97
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:418
static const int minEndcap
Definition: L1RCTProducer.h:99
L1RCTChannelMask * fedUpdatedMask
Definition: L1RCTProducer.h:81
const T & get() const
Definition: EventSetup.h:56
static const int maxBarrel
Definition: L1RCTProducer.h:98
T const * product() const
Definition: ESHandle.h:86
void setEcalScale(const L1CaloEcalScale *ecalScale)
void processEvent()
Definition: L1RCT.cc:36
unsigned int queryIntervalInLS
Definition: L1RCTProducer.h:77
virtual void beginRun(edm::Run const &r, const edm::EventSetup &c) overridefinal
void setRCTParameters(const L1RCTParameters *rctParameters)
static const int maxEndcap
void digiInput(const EcalTrigPrimDigiCollection &ecalCollection, const HcalTrigPrimDigiCollection &hcalCollection)
Definition: L1RCT.cc:116
void setNoisyChannelMask(const L1RCTNoisyChannelMask *channelMask)
bool hcalMask[18][2][28]
tuple cout
Definition: gather_cfg.py:145
static const int crateFED[18][6]
Definition: L1RCTProducer.h:95
std::vector< L1CaloRegion > L1CaloRegionCollection
Definition: L1RCT.h:20
bool isValid() const
Definition: ESHandle.h:47
tuple bunchCrossings
bool hfMask[18][2][4]
void setChannelMask(const L1RCTChannelMask *channelMask)
Definition: Run.h:43