CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
HcalNoiseInfoProducer.cc
Go to the documentation of this file.
2 
3 //
4 // HcalNoiseInfoProducer.cc
5 //
6 // description: Implementation of the producer for the HCAL noise information
7 //
8 // author: J.P. Chou, Brown
9 //
10 //
11 
23 
24 using namespace reco;
25 
26 //
27 // constructors and destructor
28 //
29 
31 {
32  // set the parameters
33  fillDigis_ = iConfig.getParameter<bool>("fillDigis");
34  fillRecHits_ = iConfig.getParameter<bool>("fillRecHits");
35  fillCaloTowers_ = iConfig.getParameter<bool>("fillCaloTowers");
36  fillTracks_ = iConfig.getParameter<bool>("fillTracks");
37 
38  maxProblemRBXs_ = iConfig.getParameter<int>("maxProblemRBXs");
39 
40  maxCaloTowerIEta_ = iConfig.getParameter<int>("maxCaloTowerIEta");
41  maxTrackEta_ = iConfig.getParameter<double>("maxTrackEta");
42  minTrackPt_ = iConfig.getParameter<double>("minTrackPt");
43 
44  digiCollName_ = iConfig.getParameter<std::string>("digiCollName");
45  recHitCollName_ = iConfig.getParameter<std::string>("recHitCollName");
46  caloTowerCollName_ = iConfig.getParameter<std::string>("caloTowerCollName");
47  trackCollName_ = iConfig.getParameter<std::string>("trackCollName");
48 
49  minRecHitE_ = iConfig.getParameter<double>("minRecHitE");
50  minLowHitE_ = iConfig.getParameter<double>("minLowHitE");
51  minHighHitE_ = iConfig.getParameter<double>("minHighHitE");
52  if(iConfig.existsAs<double>("minR45HitE"))
53  minR45HitE_ = iConfig.getParameter<double>("minR45HitE");
54 
55  HcalAcceptSeverityLevel_ = iConfig.getParameter<uint32_t>("HcalAcceptSeverityLevel");
56  if (iConfig.exists("HcalRecHitFlagsToBeExcluded"))
57  HcalRecHitFlagsToBeExcluded_ = iConfig.getParameter<std::vector<int> >("HcalRecHitFlagsToBeExcluded");
58  else{
59  edm::LogWarning("MisConfiguration")<<"the module is missing the parameter HcalAcceptSeverityLevel. created empty.";
61  }
62 
63  // Digi threshold and time slices to use for HBHE and HF calibration digis
64  useCalibDigi_ = true;
65  if(iConfig.existsAs<double>("calibdigiHBHEthreshold") == false) useCalibDigi_ = false;
66  if(iConfig.existsAs<double>("calibdigiHFthreshold") == false) useCalibDigi_ = false;
67  if(iConfig.existsAs<std::vector<int> >("calibdigiHBHEtimeslices") == false) useCalibDigi_ = false;
68  if(iConfig.existsAs<std::vector<int> >("calibdigiHFtimeslices") == false) useCalibDigi_ = false;
69 
70  if(useCalibDigi_ == true)
71  {
72  calibdigiHBHEthreshold_ = iConfig.getParameter<double>("calibdigiHBHEthreshold");
73  calibdigiHBHEtimeslices_ = iConfig.getParameter<std::vector<int> >("calibdigiHBHEtimeslices");
74  calibdigiHFthreshold_ = iConfig.getParameter<double>("calibdigiHFthreshold");
75  calibdigiHFtimeslices_ = iConfig.getParameter<std::vector<int> >("calibdigiHFtimeslices");
76  }
77  else
78  {
80  calibdigiHBHEtimeslices_ = std::vector<int>();
82  calibdigiHFtimeslices_ = std::vector<int>();
83  }
84 
85  TS4TS5EnergyThreshold_ = iConfig.getParameter<double>("TS4TS5EnergyThreshold");
86 
87  std::vector<double> TS4TS5UpperThresholdTemp = iConfig.getParameter<std::vector<double> >("TS4TS5UpperThreshold");
88  std::vector<double> TS4TS5UpperCutTemp = iConfig.getParameter<std::vector<double> >("TS4TS5UpperCut");
89  std::vector<double> TS4TS5LowerThresholdTemp = iConfig.getParameter<std::vector<double> >("TS4TS5LowerThreshold");
90  std::vector<double> TS4TS5LowerCutTemp = iConfig.getParameter<std::vector<double> >("TS4TS5LowerCut");
91 
92  for(int i = 0; i < (int)TS4TS5UpperThresholdTemp.size() && i < (int)TS4TS5UpperCutTemp.size(); i++)
93  TS4TS5UpperCut_.push_back(std::pair<double, double>(TS4TS5UpperThresholdTemp[i], TS4TS5UpperCutTemp[i]));
94  sort(TS4TS5UpperCut_.begin(), TS4TS5UpperCut_.end());
95 
96  for(int i = 0; i < (int)TS4TS5LowerThresholdTemp.size() && i < (int)TS4TS5LowerCutTemp.size(); i++)
97  TS4TS5LowerCut_.push_back(std::pair<double, double>(TS4TS5LowerThresholdTemp[i], TS4TS5LowerCutTemp[i]));
98  sort(TS4TS5LowerCut_.begin(), TS4TS5LowerCut_.end());
99 
100  // if digis are filled, then rechits must also be filled
101  if(fillDigis_ && !fillRecHits_) {
102  fillRecHits_=true;
103  edm::LogWarning("HCalNoiseInfoProducer") << " forcing fillRecHits to be true if fillDigis is true.\n";
104  }
105 
106  const float adc2fCTemp[128]={-0.5,0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,
107  13.5,15.,17.,19.,21.,23.,25.,27.,29.5,32.5,35.5,38.5,42.,46.,50.,54.5,59.5,
108  64.5,59.5,64.5,69.5,74.5,79.5,84.5,89.5,94.5,99.5,104.5,109.5,114.5,119.5,
109  124.5,129.5,137.,147.,157.,167.,177.,187.,197.,209.5,224.5,239.5,254.5,272.,
110  292.,312.,334.5,359.5,384.5,359.5,384.5,409.5,434.5,459.5,484.5,509.5,534.5,
111  559.5,584.5,609.5,634.5,659.5,684.5,709.5,747.,797.,847.,897.,947.,997.,
112  1047.,1109.5,1184.5,1259.5,1334.5,1422.,1522.,1622.,1734.5,1859.5,1984.5,
113  1859.5,1984.5,2109.5,2234.5,2359.5,2484.5,2609.5,2734.5,2859.5,2984.5,
114  3109.5,3234.5,3359.5,3484.5,3609.5,3797.,4047.,4297.,4547.,4797.,5047.,
115  5297.,5609.5,5984.5,6359.5,6734.5,7172.,7672.,8172.,8734.5,9359.5,9984.5};
116  for(int i = 0; i < 128; i++)
117  adc2fC[i] = adc2fCTemp[i];
118 
119  hbhedigi_token_ = consumes<HBHEDigiCollection>(edm::InputTag(digiCollName_));
120  hcalcalibdigi_token_ = consumes<HcalCalibDigiCollection>(edm::InputTag("hcalDigis"));
121  hbherechit_token_ = consumes<HBHERecHitCollection>(edm::InputTag(recHitCollName_));
122  calotower_token_ = consumes<CaloTowerCollection>(edm::InputTag(caloTowerCollName_));
123  track_token_ = consumes<reco::TrackCollection>(edm::InputTag(trackCollName_));
124 
125  // we produce a vector of HcalNoiseRBXs
126  produces<HcalNoiseRBXCollection>();
127  // we also produce a noise summary
128  produces<HcalNoiseSummary>();
129 }
130 
131 
133 {
134 }
135 
136 
137 //
138 // member functions
139 //
140 
141 // ------------ method called to produce the data ------------
142 void
144 {
145  // this is what we're going to actually write to the EDM
146  std::auto_ptr<HcalNoiseRBXCollection> result1(new HcalNoiseRBXCollection);
147  std::auto_ptr<HcalNoiseSummary> result2(new HcalNoiseSummary);
148 
149  // define an empty HcalNoiseRBXArray that we're going to fill
150  HcalNoiseRBXArray rbxarray;
151  HcalNoiseSummary &summary=*result2;
152 
153  // fill them with the various components
154  // digi assumes that rechit information is available
155  if(fillRecHits_) fillrechits(iEvent, iSetup, rbxarray, summary);
156  if(fillDigis_) filldigis(iEvent, iSetup, rbxarray, summary);
157  if(fillCaloTowers_) fillcalotwrs(iEvent, iSetup, rbxarray, summary);
158  if(fillTracks_) filltracks(iEvent, iSetup, summary);
159 
160  // Why is this here? Shouldn't it have been in the filldigis method? Any reason for TotalCalibCharge to be defined outside filldigis(...) ?-- Jeff, 7/2/12
161  //if(fillDigis_) summary.calibCharge_ = TotalCalibCharge;
162 
163  // select those RBXs which are interesting
164  // also look for the highest energy RBX
165  HcalNoiseRBXArray::iterator maxit=rbxarray.begin();
166  double maxenergy=-999;
167  bool maxwritten=false;
168  for(HcalNoiseRBXArray::iterator rit = rbxarray.begin(); rit!=rbxarray.end(); ++rit) {
169  HcalNoiseRBX &rbx=(*rit);
172 
173  // find the highest energy rbx
174  if(data.energy()>maxenergy) {
175  maxenergy=data.energy();
176  maxit=rit;
177  maxwritten=false;
178  }
179 
180  // find out if the rbx is problematic/noisy/etc.
181  bool writerbx = algo_.isProblematic(data) || !algo_.passLooseNoiseFilter(data) ||
183 
184  // fill variables in the summary object not filled elsewhere
185  fillOtherSummaryVariables(summary, data);
186 
187  if(writerbx) {
188  summary.nproblemRBXs_++;
189  if(summary.nproblemRBXs_<=maxProblemRBXs_) {
190  result1->push_back(rbx);
191  if(maxit==rit) maxwritten=true;
192  }
193  }
194  } // end loop over rbxs
195 
196  // if we still haven't written the maximum energy rbx, write it now
197  if(!maxwritten) {
198  HcalNoiseRBX &rbx=(*maxit);
199 
200  // add the RBX to the event
201  result1->push_back(rbx);
202  }
203 
204  // put the rbxcollection and summary into the EDM
205  iEvent.put(result1);
206  iEvent.put(result2);
207 
208  return;
209 }
210 
211 
212 // ------------ here we fill specific variables in the summary object not already accounted for earlier
213 void
215 {
216  // charge ratio
217  if(algo_.passRatioThreshold(data) && data.validRatio()) {
218  if(data.ratio()<summary.minE2Over10TS()) {
219  summary.mine2ts_ = data.e2ts();
220  summary.mine10ts_ = data.e10ts(); }
221  if(data.ratio()>summary.maxE2Over10TS()) {
222  summary.maxe2ts_ = data.e2ts();
223  summary.maxe10ts_ = data.e10ts();
224  }
225  }
226 
227  // ADC zeros
228  if(algo_.passZerosThreshold(data)) {
229  if(data.numZeros()>summary.maxZeros()) {
230  summary.maxzeros_ = data.numZeros();
231  }
232  }
233 
234  // hits count
235  if(data.numHPDHits() > summary.maxHPDHits()) {
236  summary.maxhpdhits_ = data.numHPDHits();
237  }
238  if(data.numRBXHits() > summary.maxRBXHits()) {
239  summary.maxrbxhits_ = data.numRBXHits();
240  }
241  if(data.numHPDNoOtherHits() > summary.maxHPDNoOtherHits()) {
242  summary.maxhpdhitsnoother_ = data.numHPDNoOtherHits();
243  }
244 
245  // TS4TS5
246  if(data.PassTS4TS5() == false)
247  summary.hasBadRBXTS4TS5_ = true;
248 
249  if(algo_.passLooseRBXRechitR45(data) == false)
250  summary.hasBadRBXRechitR45Loose_ = true;
251  if(algo_.passTightRBXRechitR45(data) == false)
252  summary.hasBadRBXRechitR45Tight_ = true;
253 
254  // hit timing
255  if(data.minLowEHitTime()<summary.min10GeVHitTime()) {
256  summary.min10_ = data.minLowEHitTime();
257  }
258  if(data.maxLowEHitTime()>summary.max10GeVHitTime()) {
259  summary.max10_ = data.maxLowEHitTime();
260  }
261  summary.rms10_ += data.lowEHitTimeSqrd();
262  summary.cnthit10_ += data.numLowEHits();
263  if(data.minHighEHitTime()<summary.min25GeVHitTime()) {
264  summary.min25_ = data.minHighEHitTime();
265  }
266  if(data.maxHighEHitTime()>summary.max25GeVHitTime()) {
267  summary.max25_ = data.maxHighEHitTime();
268  }
269  summary.rms25_ += data.highEHitTimeSqrd();
270  summary.cnthit25_ += data.numHighEHits();
271 
272  // EMF
273  if(algo_.passEMFThreshold(data)) {
274  if(summary.minHPDEMF() > data.HPDEMF()) {
275  summary.minhpdemf_ = data.HPDEMF();
276  }
277  if(summary.minRBXEMF() > data.RBXEMF()) {
278  summary.minrbxemf_ = data.RBXEMF();
279  }
280  }
281 
282  // summary flag
283  if(!algo_.passLooseRatio(data)) summary.filterstatus_ |= 0x1;
284  if(!algo_.passLooseHits(data)) summary.filterstatus_ |= 0x2;
285  if(!algo_.passLooseZeros(data)) summary.filterstatus_ |= 0x4;
286  if(!algo_.passLooseTiming(data)) summary.filterstatus_ |= 0x8;
287 
288  if(!algo_.passTightRatio(data)) summary.filterstatus_ |= 0x100;
289  if(!algo_.passTightHits(data)) summary.filterstatus_ |= 0x200;
290  if(!algo_.passTightZeros(data)) summary.filterstatus_ |= 0x400;
291  if(!algo_.passTightTiming(data)) summary.filterstatus_ |= 0x800;
292 
293  if(!algo_.passHighLevelNoiseFilter(data)) summary.filterstatus_ |= 0x10000;
294 
295  // summary refvectors
297  if(!algo_.passLooseNoiseFilter(data))
298  join(summary.loosenoisetwrs_, data.rbxTowers());
299  if(!algo_.passTightNoiseFilter(data))
300  join(summary.tightnoisetwrs_, data.rbxTowers());
302  join(summary.hlnoisetwrs_, data.rbxTowers());
303 
304  return;
305 }
306 
307 
308 // ------------ fill the array with digi information
309 void
311 {
312  // Some initialization
313  TotalCalibCharge = 0;
314 
315  // Starting with this version (updated by Jeff Temple on Dec. 6, 2012), the "TS45" names in the variables are mis-nomers. The actual time slices used are determined from the digiTimeSlices_ variable, which may not be limited to only time slices 4 and 5. For now, "TS45" name kept, because that is what is used in HcalNoiseSummary object (in GetCalibCountTS45, etc.). Likewise, the charge value in 'gt15' is now configurable, though the name remains the same. For HBHE, we track both the number of calibration channels (NcalibTS45) and the number of calibration channels above threshold (NcalibTS45gt15). For HF, we track only the number of channels above the given threshold in the given time window (NcalibHFgtX). Default for HF in 2012 is to use the full time sample with effectively no threshold (threshold=-999)
316  int NcalibTS45=0;
317  int NcalibTS45gt15=0;
318  int NcalibHFgtX=0;
319 
320  double chargecalibTS45=0;
321  double chargecalibgt15TS45=0;
322 
323  // get the conditions and channel quality
324  edm::ESHandle<HcalDbService> conditions;
325  iSetup.get<HcalDbRecord>().get(conditions);
327  iSetup.get<HcalChannelQualityRcd>().get("withTopo",qualhandle);
328  const HcalChannelQuality* myqual = qualhandle.product();
330  iSetup.get<HcalSeverityLevelComputerRcd>().get(mycomputer);
331  const HcalSeverityLevelComputer* mySeverity = mycomputer.product();
332 
333  // get the digis
335  // iEvent.getByLabel(digiCollName_, handle);
336  iEvent.getByToken(hbhedigi_token_, handle);
337 
338  if(!handle.isValid()) {
339  throw edm::Exception(edm::errors::ProductNotFound) << " could not find HBHEDigiCollection named " << digiCollName_ << "\n.";
340  return;
341  }
342 
343  // loop over all of the digi information
344  for(HBHEDigiCollection::const_iterator it=handle->begin(); it!=handle->end(); ++it) {
345  const HBHEDataFrame &digi=(*it);
346  HcalDetId cell = digi.id();
347  DetId detcell=(DetId)cell;
348 
349  // check on cells to be ignored and dropped
350  const HcalChannelStatus* mydigistatus=myqual->getValues(detcell.rawId());
351  if(mySeverity->dropChannel(mydigistatus->getValue())) continue;
352  if(digi.zsMarkAndPass()) continue;
353  // Drop if exclude bit set
354  if ((mydigistatus->getValue() & (1 <<HcalChannelStatus::HcalCellExcludeFromHBHENoiseSummary))==1) continue;
355 
356  // get the calibrations and coder
357  const HcalCalibrations& calibrations=conditions->getHcalCalibrations(cell);
358  const HcalQIECoder* channelCoder = conditions->getHcalCoder (cell);
359  const HcalQIEShape* shape = conditions->getHcalShape(channelCoder);
360  HcalCoderDb coder (*channelCoder, *shape);
361 
362  // match the digi to an rbx and hpd
363  HcalNoiseRBX &rbx=(*array.findRBX(digi));
364  HcalNoiseHPD &hpd=(*array.findHPD(digi));
365 
366  // determine if the digi is one the highest energy hits in the HPD
367  // this works because the rechits are sorted by energy (see fillrechits() below)
368  bool isBig=false, isBig5=false, isRBX=false;
369  int counter=0;
372  rit!=rechits.end(); ++rit, ++counter) {
373  if((*rit)->id() == digi.id()) {
374  if(counter==0) isBig=isBig5=true; // digi is also the highest energy rechit
375  if(counter<5) isBig5=true; // digi is one of 5 highest energy rechits
376  isRBX=true;
377  }
378  }
379 
380  // loop over each of the digi's time slices
381  int totalzeros=0;
382  CaloSamples tool;
383  coder.adc2fC(digi,tool);
384  for(int ts=0; ts<tool.size(); ++ts) {
385 
386  // count zero's
387  if(digi[ts].adc()==0) {
388  ++hpd.totalZeros_;
389  ++totalzeros;
390  }
391 
392  // get the fC's
393  double corrfc = tool[ts]-calibrations.pedestal(digi[ts].capid());
394 
395  // fill the relevant digi arrays
396  if(isBig) hpd.bigCharge_[ts]+=corrfc;
397  if(isBig5) hpd.big5Charge_[ts]+=corrfc;
398  if(isRBX) rbx.allCharge_[ts]+=corrfc;
399  }
400 
401  // record the maximum number of zero's found
402  if(totalzeros>hpd.maxZeros_)
403  hpd.maxZeros_=totalzeros;
404  }
405 
406  // get the calibration digis
408  // iEvent.getByLabel("hcalDigis", hCalib);
409  iEvent.getByToken(hcalcalibdigi_token_, hCalib);
410 
411  // get total charge in calibration channels
412  if(hCalib.isValid() == true)
413  {
414  for(HcalCalibDigiCollection::const_iterator digi = hCalib->begin(); digi != hCalib->end(); digi++)
415  {
416  if(digi->id().hcalSubdet() == 0)
417  continue;
418 
419  /*
420  HcalCalibDetId cell = digi->id();
421  DetId detcell = (DetId)cell;
422 
423  const HcalChannelStatus* mydigistatus=myqual->getValues(detcell.rawId());
424 
425  if(mySeverity->dropChannel(mydigistatus->getValue()))
426  continue;
427  if(digi->zsMarkAndPass())
428  continue;
429 
430  const HcalQIECoder *channelCoder = conditions->getHcalCoder(cell);
431  const HcalQIEShape* shape = conditions->getHcalShape(channelCoder);
432  HcalCoderDb coder(*channelCoder, *shape);
433 
434  CaloSamples tool;
435  coder.adc2fC(*digi, tool);
436 
437  for(int i = 0; i < (int)digi->size(); i++)
438  TotalCalibCharge = TotalCalibCharge + tool[i];
439  */
440 
441  // Original code computes total calib charge over all digis. While I think it would be more useful to skip
442  // zs mark-and-pass channels, I keep this computation as is. Individual HBHE and HF variables do skip
443  // the m-p channels. -- Jeff Temple, 6 December 2012
444 
445  for(int i = 0; i < (int)digi->size(); i++)
446  TotalCalibCharge = TotalCalibCharge + adc2fC[digi->sample(i).adc()&0xff];
447 
448 
449  HcalCalibDetId myid=(HcalCalibDetId)digi->id();
451  continue; // ignore HOCrosstalk channels
452  if(digi->zsMarkAndPass()) continue; // skip "mark-and-pass" channels when computing charge in calib channels
453 
454 
455  if (digi->id().hcalSubdet()==HcalForward) // check HF
456  {
457  double sumChargeHF=0;
458  for (unsigned int i=0;i<calibdigiHFtimeslices_.size();++i)
459  {
460  // skip unphysical time slices
461  if (calibdigiHFtimeslices_[i]<0 || calibdigiHFtimeslices_[i]>digi->size())
462  continue;
463  sumChargeHF+=adc2fC[digi->sample(calibdigiHFtimeslices_[i]).adc()&0xff];
464  }
465  if (sumChargeHF>calibdigiHFthreshold_) ++NcalibHFgtX;
466  } // end of HF check
467  else if (digi->id().hcalSubdet()==HcalBarrel || digi->id().hcalSubdet()==HcalEndcap) // now check HBHE
468  {
469  double sumChargeHBHE=0;
470  for (unsigned int i=0;i<calibdigiHBHEtimeslices_.size();++i)
471  {
472  // skip unphysical time slices
473  if (calibdigiHBHEtimeslices_[i]<0 || calibdigiHBHEtimeslices_[i]>digi->size())
474  continue;
475  sumChargeHBHE+=adc2fC[digi->sample(calibdigiHBHEtimeslices_[i]).adc()&0xff];
476  }
477  ++NcalibTS45;
478  chargecalibTS45+=sumChargeHBHE;
479  if (sumChargeHBHE>calibdigiHBHEthreshold_)
480  {
481  ++NcalibTS45gt15;
482  chargecalibgt15TS45+=sumChargeHBHE;
483  }
484  } // end of HBHE check
485  } // loop on HcalCalibDigiCollection
486  } // if (hCalib.isValid()==true)
487 
488  summary.calibCharge_ = TotalCalibCharge;
489  summary.calibCountTS45_=NcalibTS45;
490  summary.calibCountgt15TS45_=NcalibTS45gt15;
491  summary.calibChargeTS45_=chargecalibTS45;
492  summary.calibChargegt15TS45_=chargecalibgt15TS45;
493  summary.calibCountHF_=NcalibHFgtX;
494 
495  return;
496 }
497 
498 // ------------ fill the array with rec hit information
499 void
501 {
502  // get the HCAL channel status map
504  iSetup.get<HcalChannelQualityRcd>().get( "withTopo", hcalChStatus );
505  const HcalChannelQuality* dbHcalChStatus = hcalChStatus.product();
506 
507  // get the severity level computer
508  edm::ESHandle<HcalSeverityLevelComputer> hcalSevLvlComputerHndl;
509  iSetup.get<HcalSeverityLevelComputerRcd>().get(hcalSevLvlComputerHndl);
510  const HcalSeverityLevelComputer* hcalSevLvlComputer = hcalSevLvlComputerHndl.product();
511 
512  // get the calo geometry
514  iSetup.get<CaloGeometryRecord>().get(pG);
515  const CaloGeometry* geo = pG.product();
516 
517  // get the rechits
519  // iEvent.getByLabel(recHitCollName_, handle);
520  iEvent.getByToken(hbherechit_token_, handle);
521 
522  if(!handle.isValid()) {
524  << " could not find HBHERecHitCollection named " << recHitCollName_ << "\n.";
525  return;
526  }
527 
528  summary.rechitCount_ = 0;
529  summary.rechitCount15_ = 0;
530  summary.rechitEnergy_ = 0;
531  summary.rechitEnergy15_ = 0;
532 
533  summary.hitsInLaserRegion_=0;
534  summary.hitsInNonLaserRegion_=0;
535  summary.energyInLaserRegion_=0;
536  summary.energyInNonLaserRegion_=0;
537 
538 
539 
540  // loop over all of the rechit information
541  for(HBHERecHitCollection::const_iterator it=handle->begin(); it!=handle->end(); ++it) {
542  const HBHERecHit &rechit=(*it);
543 
544  // skip bad rechits (other than those flagged by the isolated noise, triangle, flat, and spike algorithms)
545  const DetId id = rechit.detid();
546  uint32_t recHitFlag = rechit.flags();
547  uint32_t isolbitset = (1 << HcalCaloFlagLabels::HBHEIsolatedNoise);
548  uint32_t flatbitset = (1 << HcalCaloFlagLabels::HBHEFlatNoise);
549  uint32_t spikebitset = (1 << HcalCaloFlagLabels::HBHESpikeNoise);
550  uint32_t trianglebitset = (1 << HcalCaloFlagLabels::HBHETriangleNoise);
551  uint32_t ts4ts5bitset = (1 << HcalCaloFlagLabels::HBHETS4TS5Noise);
552  uint32_t negativebitset = (1 << HcalCaloFlagLabels::HBHENegativeNoise);
553  for(unsigned int i=0; i<HcalRecHitFlagsToBeExcluded_.size(); i++) {
554  uint32_t bitset = (1 << HcalRecHitFlagsToBeExcluded_[i]);
555  recHitFlag = (recHitFlag & bitset) ? recHitFlag-bitset : recHitFlag;
556  }
557  const uint32_t dbStatusFlag = dbHcalChStatus->getValues(id)->getValue();
558 
559  // Ignore rechit if exclude bit set, regardless of severity of other bits
560  if ((dbStatusFlag & (1 <<HcalChannelStatus::HcalCellExcludeFromHBHENoiseSummary))==1) continue;
561 
562  int severityLevel = hcalSevLvlComputer->getSeverityLevel(id, recHitFlag, dbStatusFlag);
563  bool isRecovered = hcalSevLvlComputer->recoveredRecHit(id, recHitFlag);
564  if(severityLevel!=0 && !isRecovered && severityLevel>static_cast<int>(HcalAcceptSeverityLevel_)) continue;
565 
566  // do some rechit counting and energies
567  summary.rechitCount_ = summary.rechitCount_ + 1;
568  summary.rechitEnergy_ = summary.rechitEnergy_ + rechit.energy();
569  if ((dbStatusFlag & (1 <<HcalChannelStatus::HcalBadLaserSignal))==1) // hit comes from a region where no laser calibration pulse is normally seen
570  {
571  ++summary.hitsInNonLaserRegion_;
572  summary.energyInNonLaserRegion_+=rechit.energy();
573  }
574  else // hit comes from region where laser calibration pulse is seen
575  {
576  ++summary.hitsInLaserRegion_;
577  summary.energyInLaserRegion_+=rechit.energy();
578  }
579 
580  if(rechit.energy() > 1.5)
581  {
582  summary.rechitCount15_ = summary.rechitCount15_ + 1;
583  summary.rechitEnergy15_ = summary.rechitEnergy15_ + rechit.energy();
584  }
585 
586  // if it was ID'd as isolated noise, update the summary object
587  if(rechit.flags() & isolbitset) {
588  summary.nisolnoise_++;
589  summary.isolnoisee_ += rechit.energy();
590  GlobalPoint gp = geo->getPosition(rechit.id());
591  double et = rechit.energy()*gp.perp()/gp.mag();
592  summary.isolnoiseet_ += et;
593  }
594 
595  if(rechit.flags() & flatbitset) {
596  summary.nflatnoise_++;
597  summary.flatnoisee_ += rechit.energy();
598  GlobalPoint gp = geo->getPosition(rechit.id());
599  double et = rechit.energy()*gp.perp()/gp.mag();
600  summary.flatnoiseet_ += et;
601  }
602 
603  if(rechit.flags() & spikebitset) {
604  summary.nspikenoise_++;
605  summary.spikenoisee_ += rechit.energy();
606  GlobalPoint gp = geo->getPosition(rechit.id());
607  double et = rechit.energy()*gp.perp()/gp.mag();
608  summary.spikenoiseet_ += et;
609  }
610 
611  if(rechit.flags() & trianglebitset) {
612  summary.ntrianglenoise_++;
613  summary.trianglenoisee_ += rechit.energy();
614  GlobalPoint gp = geo->getPosition(rechit.id());
615  double et = rechit.energy()*gp.perp()/gp.mag();
616  summary.trianglenoiseet_ += et;
617  }
618 
619  if(rechit.flags() & ts4ts5bitset) {
620  if ((dbStatusFlag & (1 <<HcalChannelStatus::HcalCellExcludeFromHBHENoiseSummaryR45))==0) // only add to TS4TS5 if the bit is not marked as "HcalCellExcludeFromHBHENoiseSummaryR45"
621  {
622  summary.nts4ts5noise_++;
623  summary.ts4ts5noisee_ += rechit.energy();
624  GlobalPoint gp = geo->getPosition(rechit.id());
625  double et = rechit.energy()*gp.perp()/gp.mag();
626  summary.ts4ts5noiseet_ += et;
627  }
628  }
629 
630  if(rechit.flags() & negativebitset) {
631  summary.nnegativenoise_++;
632  summary.negativenoisee_ += rechit.energy();
633  GlobalPoint gp = geo->getPosition(rechit.id());
634  double et = rechit.energy()*gp.perp()/gp.mag();
635  summary.negativenoiseet_ += et;
636  }
637 
638  // find the hpd that the rechit is in
639  HcalNoiseHPD& hpd=(*array.findHPD(rechit));
640 
641  // create a persistent reference to the rechit
642  edm::Ref<HBHERecHitCollection> myRef(handle, it-handle->begin());
643 
644  // store it in a place so that it remains sorted by energy
645  hpd.refrechitset_.insert(myRef);
646 
647  } // end loop over rechits
648 
649  // loop over all HPDs and transfer the information from refrechitset_ to rechits_;
650  for(HcalNoiseRBXArray::iterator rbxit=array.begin(); rbxit!=array.end(); ++rbxit) {
651  for(std::vector<HcalNoiseHPD>::iterator hpdit=rbxit->hpds_.begin(); hpdit!=rbxit->hpds_.end(); ++hpdit) {
652 
653  // loop over all of the entries in the set and add them to rechits_
655  it=hpdit->refrechitset_.begin(); it!=hpdit->refrechitset_.end(); ++it) {
656  hpdit->rechits_.push_back(*it);
657  }
658  }
659  }
660  // now the rechits in all the HPDs are sorted by energy!
661 
662  return;
663 }
664 
665 // ------------ fill the array with calo tower information
666 void
668 {
669  // get the calotowers
671  // iEvent.getByLabel(caloTowerCollName_, handle);
672  iEvent.getByToken(calotower_token_, handle);
673 
674  if(!handle.isValid()) {
676  << " could not find CaloTowerCollection named " << caloTowerCollName_ << "\n.";
677  return;
678  }
679 
680  summary.emenergy_ = summary.hadenergy_ = 0.0;
681 
682  // loop over all of the calotower information
683  for(CaloTowerCollection::const_iterator it = handle->begin(); it!=handle->end(); ++it) {
684  const CaloTower& twr=(*it);
685 
686  // create a persistent reference to the tower
687  edm::Ref<CaloTowerCollection> myRef(handle, it-handle->begin());
688 
689  // get all of the hpd's that are pointed to by the calotower
690  std::vector<std::vector<HcalNoiseHPD>::iterator> hpditervec;
691  array.findHPD(twr, hpditervec);
692 
693  // loop over the hpd's and add the reference to the RefVectors
694  for(std::vector<std::vector<HcalNoiseHPD>::iterator>::iterator it=hpditervec.begin();
695  it!=hpditervec.end(); ++it)
696  (*it)->calotowers_.push_back(myRef);
697 
698  // skip over anything with |ieta|>maxCaloTowerIEta
699  if(twr.ietaAbs()>maxCaloTowerIEta_) {
700  summary.emenergy_ += twr.emEnergy();
701  summary.hadenergy_ += twr.hadEnergy();
702  }
703  }
704 
705  return;
706 }
707 
708 // ------------ fill the summary with track information
709 void
711 {
713  // iEvent.getByLabel(trackCollName_, handle);
714  iEvent.getByToken(track_token_, handle);
715 
716  // don't throw exception, just return quietly
717  if(!handle.isValid()) {
718  // throw edm::Exception(edm::errors::ProductNotFound)
719  // << " could not find trackCollection named " << trackCollName_ << "\n.";
720  return;
721  }
722 
723  summary.trackenergy_=0.0;
724  for(reco::TrackCollection::const_iterator iTrack = handle->begin(); iTrack!=handle->end(); ++iTrack) {
725  reco::Track trk=*iTrack;
726  if(trk.pt()<minTrackPt_ || fabs(trk.eta())>maxTrackEta_) continue;
727 
728  summary.trackenergy_ += trk.p();
729  }
730 
731  return;
732 }
733 
734 //define this as a plug-in
int adc(sample_type sample)
get the ADC sample (12 bits)
double e10ts(void) const
Definition: HcalNoiseAlgo.h:23
double HPDEMF(void) const
Definition: HcalNoiseAlgo.h:38
double e2ts(void) const
Definition: HcalNoiseAlgo.h:22
double p() const
momentum vector magnitude
Definition: TrackBase.h:663
T getParameter(std::string const &) const
edm::RefVector< CaloTowerCollection > hlnoisetwrs_
int i
Definition: DBlmapReader.cc:9
double lowEHitTimeSqrd(void) const
Definition: HcalNoiseAlgo.h:31
std::vector< int > calibdigiHFtimeslices_
std::vector< HcalNoiseRBX > HcalNoiseRBXCollection
Definition: HcalNoiseRBX.h:26
std::vector< int > HcalRecHitFlagsToBeExcluded_
bool isProblematic(const CommonHcalNoiseRBXData &) const
algo_(conf.existsAs< bool >("Correct")?conf.getParameter< bool >("Correct"):true, conf.getParameter< double >("e9e25Cut"), conf.getParameter< double >("intercept2DCut"), conf.existsAs< bool >("intercept2DSlope")?conf.getParameter< double >("intercept2DSlope"):defaultSlope2D_, conf.getParameter< std::vector< double > >("e1e9Cut"), conf.getParameter< std::vector< double > >("eCOREe9Cut"), conf.getParameter< std::vector< double > >("eSeLCut"), hfvars_)
bool passTightRatio(const CommonHcalNoiseRBXData &) const
bool zsMarkAndPass() const
was ZS MarkAndPass?
Definition: HBHEDataFrame.h:30
double minLowEHitTime(void) const
Definition: HcalNoiseAlgo.h:29
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:184
bool passLooseRatio(const CommonHcalNoiseRBXData &) const
CalibDetType calibFlavor() const
get the flavor of this calibration detid
void fillrechits(edm::Event &, const edm::EventSetup &, HcalNoiseRBXArray &, HcalNoiseSummary &) const
bool passTightRBXRechitR45(const CommonHcalNoiseRBXData &) const
const DetId & detid() const
Definition: CaloRecHit.h:20
double maxHighEHitTime(void) const
Definition: HcalNoiseAlgo.h:34
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:446
bool passTightTiming(const CommonHcalNoiseRBXData &) const
double maxLowEHitTime(void) const
Definition: HcalNoiseAlgo.h:30
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
int numLowEHits(void) const
Definition: HcalNoiseAlgo.h:32
virtual void produce(edm::Event &, const edm::EventSetup &) override
double ratio(void) const
Definition: HcalNoiseAlgo.h:21
std::vector< std::pair< double, double > > TS4TS5LowerCut_
HcalDetId id() const
get the id
Definition: HBHERecHit.h:23
std::set< edm::Ref< HBHERecHitCollection >, RefHBHERecHitEnergyComparison > refrechitset_
Definition: HcalNoiseHPD.h:145
std::vector< HBHEDataFrame >::const_iterator const_iterator
std::vector< float > bigCharge_
Definition: HcalNoiseHPD.h:137
float maxE2Over10TS(void) const
edm::RefVector< CaloTowerCollection > loosenoisetwrs_
bool exists(std::string const &parameterName) const
checks if a parameter exists
void fillcalotwrs(edm::Event &, const edm::EventSetup &, HcalNoiseRBXArray &, HcalNoiseSummary &) const
std::vector< float > big5Charge_
Definition: HcalNoiseHPD.h:138
double pedestal(int fCapId) const
get pedestal for capid=0..3
const Item * getValues(DetId fId, bool throwOnFail=true) const
bool passLooseRBXRechitR45(const CommonHcalNoiseRBXData &) const
const_iterator end() const
Termination of iteration.
Definition: RefVector.h:249
float min25GeVHitTime(void) const
bool passHighLevelNoiseFilter(const CommonHcalNoiseRBXData &) const
const_iterator begin() const
Initialize an iterator over the RefVector.
Definition: RefVector.h:244
double RBXEMF(void) const
Definition: HcalNoiseAlgo.h:37
edm::RefVector< HBHERecHitCollection > rechits_
Definition: HcalNoiseHPD.h:141
int numRBXHits(void) const
Definition: HcalNoiseAlgo.h:26
uint32_t rawId() const
get the raw id
Definition: DetId.h:43
float min10GeVHitTime(void) const
HcalNoiseRBXArray::iterator findRBX(int rbxindex)
double highEHitTimeSqrd(void) const
Definition: HcalNoiseAlgo.h:35
int iEvent
Definition: GenABIO.cc:230
float minE2Over10TS(void) const
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:699
bool passLooseZeros(const CommonHcalNoiseRBXData &) const
double emEnergy() const
Definition: CaloTower.h:94
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:113
int maxRBXHits(void) const
float energy() const
Definition: CaloRecHit.h:17
virtual void adc2fC(const HBHEDataFrame &df, CaloSamples &lf) const
Definition: HcalCoderDb.cc:44
bool passTightZeros(const CommonHcalNoiseRBXData &) const
double pt() const
track transverse momentum
Definition: TrackBase.h:669
bool recoveredRecHit(const DetId &myid, const uint32_t &myflag) const
uint32_t flags() const
Definition: CaloRecHit.h:21
int numHighEHits(void) const
Definition: HcalNoiseAlgo.h:36
edm::EDGetTokenT< HcalCalibDigiCollection > hcalcalibdigi_token_
tuple handle
Definition: patZpeak.py:22
bool passRatioThreshold(const CommonHcalNoiseRBXData &) const
std::vector< HcalNoiseHPD >::iterator findHPD(int hpdindex)
bool dropChannel(const uint32_t &mystatus) const
const GlobalPoint & getPosition(const DetId &id) const
Get the position of a given detector id.
Definition: CaloGeometry.cc:68
int numHPDNoOtherHits(void) const
Definition: HcalNoiseAlgo.h:27
int numZeros(void) const
Definition: HcalNoiseAlgo.h:28
edm::EDGetTokenT< HBHEDigiCollection > hbhedigi_token_
bool isValid() const
Definition: HandleBase.h:76
bool passZerosThreshold(const CommonHcalNoiseRBXData &) const
std::vector< std::pair< double, double > > TS4TS5UpperCut_
float minHPDEMF(void) const
bool passLooseNoiseFilter(const CommonHcalNoiseRBXData &) const
edm::RefVector< CaloTowerCollection > rbxTowers(void) const
Definition: HcalNoiseAlgo.h:40
double hadEnergy() const
Definition: CaloTower.h:95
std::vector< float > allCharge_
Definition: HcalNoiseRBX.h:115
edm::EDGetTokenT< reco::TrackCollection > track_token_
Definition: DetId.h:18
bool passLooseHits(const CommonHcalNoiseRBXData &) const
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
edm::EDGetTokenT< HBHERecHitCollection > hbherechit_token_
int size() const
get the size
Definition: CaloSamples.h:24
void filldigis(edm::Event &, const edm::EventSetup &, HcalNoiseRBXArray &, HcalNoiseSummary &)
int maxZeros(void) const
const T & get() const
Definition: EventSetup.h:55
T const * product() const
Definition: ESHandle.h:86
edm::RefVector< CaloTowerCollection > tightnoisetwrs_
int getSeverityLevel(const DetId &myid, const uint32_t &myflag, const uint32_t &mystatus) const
double energy(void) const
Definition: HcalNoiseAlgo.h:20
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< float >, ROOT::Math::GlobalCoordinateSystemTag > GlobalPoint
point in global coordinate system
Definition: Point3D.h:17
int ietaAbs() const
Definition: CaloTower.h:170
bool passLooseTiming(const CommonHcalNoiseRBXData &) const
bool passTightNoiseFilter(const CommonHcalNoiseRBXData &) const
int maxHPDNoOtherHits(void) const
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
double minHighEHitTime(void) const
Definition: HcalNoiseAlgo.h:33
static std::atomic< unsigned int > counter
double energyInNonLaserRegion_
float minRBXEMF(void) const
std::vector< int > calibdigiHBHEtimeslices_
const HcalDetId & id() const
Definition: HBHEDataFrame.h:22
bool PassTS4TS5(void) const
Definition: HcalNoiseAlgo.h:39
uint32_t getValue() const
bool passEMFThreshold(const CommonHcalNoiseRBXData &) const
void filltracks(edm::Event &, const edm::EventSetup &, HcalNoiseSummary &) const
HcalNoiseInfoProducer(const edm::ParameterSet &)
void fillOtherSummaryVariables(HcalNoiseSummary &summary, const CommonHcalNoiseRBXData &data) const
int maxHPDHits(void) const
int numHPDHits(void) const
Definition: HcalNoiseAlgo.h:25
float max25GeVHitTime(void) const
float max10GeVHitTime(void) const
bool validRatio(void) const
Definition: HcalNoiseAlgo.h:24
bool passTightHits(const CommonHcalNoiseRBXData &) const
edm::EDGetTokenT< CaloTowerCollection > calotower_token_