CMS 3D CMS Logo

HBHEIsolatedNoiseAlgos.cc
Go to the documentation of this file.
1 /*
2 Description: Isolation algorithms used to identify anomalous noise in the HB/HE.
3  These algorithms will be used to reflag HB/HE rechits as noise.
4 
5  There are 4 objects implemented here:
6  1) ObjectValidator
7  2) PhysicsTowerOrganizer
8  3) HBHEHitMap
9  4) HBHEHitMapOrganizer
10  See comments below for details.
11 
12 Original Author: John Paul Chou (Brown University)
13  Thursday, September 2, 2010
14 */
15 
17 
20 
29 
36 
38 //
39 // ObjectValidator
40 //
42 
44  HBThreshold_ = iConfig.getParameter<double>("HBThreshold");
45  HESThreshold_ = iConfig.getParameter<double>("HESThreshold");
46  HEDThreshold_ = iConfig.getParameter<double>("HEDThreshold");
47  EBThreshold_ = iConfig.getParameter<double>("EBThreshold");
48  EEThreshold_ = iConfig.getParameter<double>("EEThreshold");
49 
50  HcalAcceptSeverityLevel_ = iConfig.getParameter<uint32_t>("HcalAcceptSeverityLevel");
51  EcalAcceptSeverityLevel_ = iConfig.getParameter<uint32_t>("EcalAcceptSeverityLevel");
52  UseHcalRecoveredHits_ = iConfig.getParameter<bool>("UseHcalRecoveredHits");
53  UseEcalRecoveredHits_ = iConfig.getParameter<bool>("UseEcalRecoveredHits");
54  UseAllCombinedRechits_ = iConfig.getParameter<bool>("UseAllCombinedRechits");
55 
56  MinValidTrackPt_ = iConfig.getParameter<double>("MinValidTrackPt");
57  MinValidTrackPtBarrel_ = iConfig.getParameter<double>("MinValidTrackPtBarrel");
58  MinValidTrackNHits_ = iConfig.getParameter<int>("MinValidTrackNHits");
59 
60  theHcalChStatus_ = nullptr;
61  theEcalChStatus_ = nullptr;
62  theHcalSevLvlComputer_ = nullptr;
63  theEcalSevLvlAlgo_ = nullptr;
64  theEBRecHitCollection_ = nullptr;
65  theEERecHitCollection_ = nullptr;
66 
67  return;
68 }
69 
71 
73  assert(theHcalSevLvlComputer_ != nullptr && theHcalChStatus_ != nullptr);
74 
77  return true;
78 
79  // require the hit to pass a certain energy threshold
80  if (hit.id().subdet() == HcalBarrel && hit.energy() < HBThreshold_)
81  return false;
82  else if (hit.id().subdet() == HcalEndcap && hit.id().ietaAbs() <= 20 && hit.energy() < HESThreshold_)
83  return false;
84  else if (hit.id().subdet() == HcalEndcap && hit.id().ietaAbs() > 20 && hit.energy() < HEDThreshold_)
85  return false;
86 
87  // determine if the hit is good, bad, or recovered
88  const DetId id = hit.detid();
89  const uint32_t recHitFlag = hit.flags();
90  const uint32_t dbStatusFlag = theHcalChStatus_->getValues(id)->getValue();
91  int severityLevel = theHcalSevLvlComputer_->getSeverityLevel(id, recHitFlag, dbStatusFlag);
92  bool isRecovered = theHcalSevLvlComputer_->recoveredRecHit(id, recHitFlag);
93 
94  if (severityLevel == 0)
95  return true;
96  if (isRecovered)
97  return UseHcalRecoveredHits_;
98  if (severityLevel > static_cast<int>(HcalAcceptSeverityLevel_))
99  return false;
100  else
101  return true;
102 }
103 
105  assert(theEcalSevLvlAlgo_ != nullptr && theEcalChStatus_ != nullptr);
106 
107  // require the hit to pass a certain energy threshold
108  const DetId id = hit.detid();
109  if (id.subdetId() == EcalBarrel && hit.energy() < EBThreshold_)
110  return false;
111  else if (id.subdetId() == EcalEndcap && hit.energy() < EEThreshold_)
112  return false;
113 
114  // determine if the hit is good, bad, or recovered
115  int severityLevel = 999;
116  if (id.subdetId() == EcalBarrel && theEBRecHitCollection_ != nullptr)
117  severityLevel = theEcalSevLvlAlgo_->severityLevel(
118  hit); //id, *theEBRecHitCollection_, *theEcalChStatus_, 5., EcalSeverityLevelAlgo::kSwissCross, 0.95, 2., 15., 0.999);
119  else if (id.subdetId() == EcalEndcap && theEERecHitCollection_ != nullptr)
120  severityLevel = theEcalSevLvlAlgo_->severityLevel(
121  hit); //id, *theEERecHitCollection_, *theEcalChStatus_, 5., EcalSeverityLevelAlgo::kSwissCross, 0.95, 2., 15., 0.999);
122  else
123  return false;
124 
125  if (severityLevel == EcalSeverityLevel::kGood)
126  return true;
127  if (severityLevel == EcalSeverityLevel::kRecovered)
128  return UseEcalRecoveredHits_;
129  if (severityLevel > static_cast<int>(EcalAcceptSeverityLevel_))
130  return false;
131  else
132  return true;
133 }
134 
135 bool ObjectValidator::validTrack(const reco::Track& trk) const {
136  if (trk.pt() < MinValidTrackPt_)
137  return false;
138  if (trk.pt() < MinValidTrackPtBarrel_ && std::fabs(trk.momentum().eta()) < 1.479)
139  return false;
141  return false;
142  return true;
143 }
144 
146 //
147 // PhysicsTowerOrganizer
148 //
150 
152  const edm::Event& iEvent,
153  const edm::EventSetup& evSetup,
154  const edm::Handle<HBHERecHitCollection>& hbhehitcoll_h,
155  const edm::Handle<EcalRecHitCollection>& ebhitcoll_h,
156  const edm::Handle<EcalRecHitCollection>& eehitcoll_h,
157  const edm::Handle<std::vector<reco::TrackExtrapolation> >& trackextrapcoll_h,
158  const ObjectValidatorAbs& objectvalidator,
159  const CaloTowerConstituentsMap& ctcm) {
160  // get some geometries
162  evSetup.get<CaloGeometryRecord>().get(pG);
163  const CaloGeometry* geo = pG.product();
166 
167  // do the HCAL hits
168  for (HBHERecHitCollection::const_iterator it = hbhehitcoll_h->begin(); it != hbhehitcoll_h->end(); ++it) {
169  const HBHERecHit* hit = &(*it);
170 
171  // check that the hit is valid
172  if (!objectvalidator.validHit(*hit))
173  continue;
174 
175  // add the hit to the organizer
176  CaloTowerDetId tid = ctcm.towerOf(hit->id());
177  insert_(tid, hit);
178  }
179 
180  // do the EB hits
181  for (EcalRecHitCollection::const_iterator it = ebhitcoll_h->begin(); it != ebhitcoll_h->end(); ++it) {
182  const EcalRecHit* hit = &(*it);
183 
184  if (!objectvalidator.validHit(*hit))
185  continue;
186  CaloTowerDetId tid = ctcm.towerOf(hit->id());
187  insert_(tid, hit);
188  }
189 
190  // do the EE hits
191  for (EcalRecHitCollection::const_iterator it = eehitcoll_h->begin(); it != eehitcoll_h->end(); ++it) {
192  const EcalRecHit* hit = &(*it);
193 
194  if (!objectvalidator.validHit(*hit))
195  continue;
196  CaloTowerDetId tid = ctcm.towerOf(hit->id());
197  insert_(tid, hit);
198  }
199 
200  // do the tracks
201  for (std::vector<reco::TrackExtrapolation>::const_iterator it = trackextrapcoll_h->begin();
202  it != trackextrapcoll_h->end();
203  ++it) {
204  const reco::TrackExtrapolation* extrap = &(*it);
205  const reco::Track* track = &(*(extrap->track()));
206 
207  // validate track
208  if (!objectvalidator.validTrack(*track))
209  continue;
210 
211  // get the point
212  if (extrap->positions().empty())
213  continue;
214  const GlobalPoint point(
215  extrap->positions().front().x(), extrap->positions().front().y(), extrap->positions().front().z());
216 
217  if (std::fabs(point.eta()) < 1.479) {
218  EBDetId cell = gEB->getClosestCell(point);
219  CaloTowerDetId tid = ctcm.towerOf(cell);
220  insert_(tid, track);
221  } else {
222  EEDetId cell = gEE->getClosestCell(point);
223  CaloTowerDetId tid = ctcm.towerOf(cell);
224  insert_(tid, track);
225  }
226  }
227 
228  return;
229 }
230 
232  // create dummy PhysicsTower
234 
235  // correct for the merging of the |ieta|=28-29 towers
236  if (id.ietaAbs() == 29)
237  dummy.id = CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), id.iphi());
238  else
239  dummy.id = id;
240 
241  // search on the dummy
242  std::set<PhysicsTower, towercmp>::iterator it = towers_.find(dummy);
243 
244  if (it == towers_.end())
245  return nullptr;
246 
247  // for whatever reason, I can't get a non-const out of the find method
248  PhysicsTower& twr = const_cast<PhysicsTower&>(*it);
249  return &twr;
250 }
251 
253  // create dummy PhysicsTower
255 
256  // correct for the merging of the |ieta|=28-29 towers
257  if (id.ietaAbs() == 29)
258  dummy.id = CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), id.iphi());
259  else
260  dummy.id = id;
261 
262  // search on the dummy
263  std::set<PhysicsTower, towercmp>::iterator it = towers_.find(dummy);
264 
265  if (it == towers_.end())
266  return nullptr;
267  return &(*it);
268 }
269 
271  CaloTowerDetId tid(ieta, iphi);
272  return findTower(tid);
273 }
274 
276  CaloTowerDetId tid(ieta, iphi);
277  return findTower(tid);
278 }
279 
281  std::set<const PhysicsTower*>& neighbors) const {
282  // correct for the merging of the |ieta|=28-29 towers
283  CaloTowerDetId id(tempid);
284  if (tempid.ietaAbs() == 29)
285  id = CaloTowerDetId((tempid.ietaAbs() - 1) * tempid.zside(), tempid.iphi());
286 
287  std::vector<CaloTowerDetId> ids;
288  // get the neighbor with higher iphi
289  if (id.ietaAbs() <= 20) {
290  if (id.iphi() == 72)
291  ids.push_back(CaloTowerDetId(id.ieta(), 1));
292  else
293  ids.push_back(CaloTowerDetId(id.ieta(), id.iphi() + 1));
294  } else {
295  if (id.iphi() == 71)
296  ids.push_back(CaloTowerDetId(id.ieta(), 1));
297  else
298  ids.push_back(CaloTowerDetId(id.ieta(), id.iphi() + 2));
299  }
300 
301  // get the neighbor with the lower iphi
302  if (id.ietaAbs() <= 20) {
303  if (id.iphi() == 1)
304  ids.push_back(CaloTowerDetId(id.ieta(), 72));
305  else
306  ids.push_back(CaloTowerDetId(id.ieta(), id.iphi() - 1));
307  } else {
308  if (id.iphi() == 1)
309  ids.push_back(CaloTowerDetId(id.ieta(), 71));
310  else
311  ids.push_back(CaloTowerDetId(id.ieta(), id.iphi() - 2));
312  }
313 
314  // get the neighbor with the higher ietaAbs
315  if (id.ietaAbs() == 20 && (id.iphi() % 2) == 0)
316  ids.push_back(CaloTowerDetId((id.ietaAbs() + 1) * id.zside(), id.iphi() - 1));
317  else
318  ids.push_back(CaloTowerDetId((id.ietaAbs() + 1) * id.zside(), id.iphi()));
319 
320  // get the neighbor(s) with the lower ietaAbs
321  if (id.ietaAbs() == 21) {
322  ids.push_back(CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), id.iphi()));
323  ids.push_back(CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), id.iphi() + 1));
324  } else if (id.ietaAbs() == 1) {
325  ids.push_back(CaloTowerDetId(-id.ieta(), id.iphi()));
326  } else {
327  ids.push_back(CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), id.iphi()));
328  }
329 
330  // get the neighbor with higher ieta and higher iphi
331  if (id.ietaAbs() <= 19 || (id.ietaAbs() == 20 && (id.iphi() % 2) == 0)) {
332  if (id.iphi() == 72)
333  ids.push_back(CaloTowerDetId((id.ietaAbs() + 1) * id.zside(), 1));
334  else
335  ids.push_back(CaloTowerDetId((id.ietaAbs() + 1) * id.zside(), id.iphi() + 1));
336  } else if (id.ietaAbs() >= 21) {
337  if (id.iphi() == 71)
338  ids.push_back(CaloTowerDetId((id.ietaAbs() + 1) * id.zside(), 1));
339  else
340  ids.push_back(CaloTowerDetId((id.ietaAbs() + 1) * id.zside(), id.iphi() + 2));
341  }
342 
343  // get the neighbor with higher ieta and lower iphi
344  if (id.ietaAbs() <= 19) {
345  if (id.iphi() == 1)
346  ids.push_back(CaloTowerDetId((id.ietaAbs() + 1) * id.zside(), 72));
347  else
348  ids.push_back(CaloTowerDetId((id.ietaAbs() + 1) * id.zside(), id.iphi() - 1));
349  } else if (id.ietaAbs() >= 21 || (id.ietaAbs() == 20 && (id.iphi() % 2) == 1)) {
350  if (id.iphi() == 1)
351  ids.push_back(CaloTowerDetId((id.ietaAbs() + 1) * id.zside(), 71));
352  else
353  ids.push_back(CaloTowerDetId((id.ietaAbs() + 1) * id.zside(), id.iphi() - 2));
354  }
355 
356  // get the neighbor with lower ieta and higher iphi
357  if (id.ietaAbs() == 1) {
358  if (id.iphi() == 72)
359  ids.push_back(CaloTowerDetId(-id.ieta(), 1));
360  else
361  ids.push_back(CaloTowerDetId(-id.ieta(), id.iphi() + 1));
362  } else if (id.ietaAbs() <= 20) {
363  if (id.iphi() == 72)
364  ids.push_back(CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), 1));
365  else
366  ids.push_back(CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), id.iphi() + 1));
367  } else if (id.ietaAbs() >= 21) {
368  if (id.iphi() == 71)
369  ids.push_back(CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), 1));
370  else
371  ids.push_back(CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), id.iphi() + 2));
372  }
373 
374  // get the neighbor with lower ieta and lower iphi
375  if (id.ietaAbs() == 1) {
376  if (id.iphi() == 1)
377  ids.push_back(CaloTowerDetId(-id.ieta(), 72));
378  else
379  ids.push_back(CaloTowerDetId(-id.ieta(), id.iphi() - 1));
380  } else if (id.ietaAbs() <= 20) {
381  if (id.iphi() == 1)
382  ids.push_back(CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), 72));
383  else
384  ids.push_back(CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), id.iphi() - 1));
385  } else if (id.ietaAbs() >= 22) {
386  if (id.iphi() == 1)
387  ids.push_back(CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), 71));
388  else
389  ids.push_back(CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), id.iphi() - 2));
390  } else if (id.ietaAbs() == 21) {
391  if (id.iphi() == 1)
392  ids.push_back(CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), 72));
393  else
394  ids.push_back(CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), id.iphi() - 1));
395  }
396 
397  // clear neighbors
398  neighbors.clear();
399 
400  // find the neighbors and add them to the eponymous set
401  for (std::vector<CaloTowerDetId>::const_iterator it = ids.begin(); it != ids.end(); ++it) {
402  const PhysicsTower* twr = findTower(*it);
403  if (twr)
404  neighbors.insert(twr);
405  }
406 
407  return;
408 }
409 
410 void PhysicsTowerOrganizer::findNeighbors(const PhysicsTower* twr, std::set<const PhysicsTower*>& neighbors) const {
411  findNeighbors(twr->id, neighbors);
412  return;
413 }
414 
415 void PhysicsTowerOrganizer::findNeighbors(int ieta, int iphi, std::set<const PhysicsTower*>& neighbors) const {
416  findNeighbors(CaloTowerDetId(ieta, iphi), neighbors);
417  return;
418 }
419 
421  PhysicsTower* twr = findTower(id);
422  if (twr == nullptr) {
424  if (id.ietaAbs() == 29)
425  dummy.id = CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), id.iphi());
426  else
427  dummy.id = id;
428  dummy.hcalhits.insert(hit);
429  towers_.insert(dummy);
430  } else {
431  twr->hcalhits.insert(hit);
432  }
433  return;
434 }
435 
437  PhysicsTower* twr = findTower(id);
438  if (twr == nullptr) {
440  if (id.ietaAbs() == 29)
441  dummy.id = CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), id.iphi());
442  else
443  dummy.id = id;
444  dummy.ecalhits.insert(hit);
445  towers_.insert(dummy);
446  } else {
447  twr->ecalhits.insert(hit);
448  }
449  return;
450 }
451 
453  PhysicsTower* twr = findTower(id);
454  if (twr == nullptr) {
456  if (id.ietaAbs() == 29)
457  dummy.id = CaloTowerDetId((id.ietaAbs() - 1) * id.zside(), id.iphi());
458  else
459  dummy.id = id;
460  dummy.tracks.insert(track);
461  towers_.insert(dummy);
462  } else {
463  twr->tracks.insert(track);
464  }
465  return;
466 }
467 
469 //
470 // HBHEHitMap
471 //
473 
475  hitEnergy_ = hitEnergyTrkFid_ = -999.;
476  nHits_ = -999;
477  hcalEnergySameTowers_ = ecalEnergySameTowers_ = trackEnergySameTowers_ = -999.;
478  nHcalHitsSameTowers_ = nEcalHitsSameTowers_ = nTracksSameTowers_ = -999;
479  hcalEnergyNeighborTowers_ = ecalEnergyNeighborTowers_ = trackEnergyNeighborTowers_ = -999.;
480  nHcalHitsNeighborTowers_ = nEcalHitsNeighborTowers_ = nTracksNeighborTowers_ = -999;
481 }
482 
483 double HBHEHitMap::hitEnergy(void) const {
484  if (hitEnergy_ < -900)
485  calcHits_();
486  return hitEnergy_;
487 }
488 
489 int HBHEHitMap::nHits(void) const {
490  if (nHits_ < -900)
491  calcHits_();
492  return nHits_;
493 }
494 
496  if (hitEnergyTrkFid_ < -900)
497  calcHits_();
498  return hitEnergyTrkFid_;
499 }
500 
502  if (hcalEnergySameTowers_ < -900)
503  calcHcalSameTowers_();
504  return hcalEnergySameTowers_;
505 }
506 
508  if (nHcalHitsSameTowers_ < -900)
509  calcHcalSameTowers_();
510  return nHcalHitsSameTowers_;
511 }
512 
514  if (ecalEnergySameTowers_ < -900)
515  calcEcalSameTowers_();
516  return ecalEnergySameTowers_;
517 }
518 
520  if (nEcalHitsSameTowers_ < -900)
521  calcEcalSameTowers_();
522  return nEcalHitsSameTowers_;
523 }
524 
526  if (trackEnergySameTowers_ < -900)
527  calcTracksSameTowers_();
528  return trackEnergySameTowers_;
529 }
530 
532  if (nTracksSameTowers_ < -900)
533  calcTracksSameTowers_();
534  return nTracksSameTowers_;
535 }
536 
537 void HBHEHitMap::hcalHitsSameTowers(std::set<const HBHERecHit*>& v) const {
538  v.clear();
539  for (hitmap_const_iterator it1 = beginHits(); it1 != endHits(); ++it1) {
540  for (std::set<const HBHERecHit*>::const_iterator it2 = it1->second->hcalhits.begin();
541  it2 != it1->second->hcalhits.end();
542  ++it2) {
543  const HBHERecHit* hit = (*it2);
544  // if the hit in the tower is already in the hitmap, don't include it
545  if (findHit(hit) == endHits())
546  v.insert(hit);
547  }
548  }
549  return;
550 }
551 
552 void HBHEHitMap::ecalHitsSameTowers(std::set<const EcalRecHit*>& v) const {
553  v.clear();
554  for (hitmap_const_iterator it1 = beginHits(); it1 != endHits(); ++it1) {
555  v.insert(it1->second->ecalhits.begin(), it1->second->ecalhits.end());
556  }
557  return;
558 }
559 
560 void HBHEHitMap::tracksSameTowers(std::set<const reco::Track*>& v) const {
561  v.clear();
562  for (hitmap_const_iterator it1 = beginHits(); it1 != endHits(); ++it1) {
563  v.insert(it1->second->tracks.begin(), it1->second->tracks.end());
564  }
565  return;
566 }
567 
569  if (hcalEnergyNeighborTowers_ < -900)
570  calcHcalNeighborTowers_();
571  return hcalEnergyNeighborTowers_;
572 }
573 
575  if (nHcalHitsNeighborTowers_ < -900)
576  calcHcalNeighborTowers_();
577  return nHcalHitsNeighborTowers_;
578 }
579 
581  if (ecalEnergyNeighborTowers_ < -900)
582  calcEcalNeighborTowers_();
583  return ecalEnergyNeighborTowers_;
584 }
585 
587  if (nEcalHitsNeighborTowers_ < -900)
588  calcEcalNeighborTowers_();
589  return nEcalHitsNeighborTowers_;
590 }
591 
593  if (trackEnergyNeighborTowers_ < -900)
594  calcTracksNeighborTowers_();
595  return trackEnergyNeighborTowers_;
596 }
597 
599  if (nTracksNeighborTowers_ < -900)
600  calcTracksNeighborTowers_();
601  return nTracksNeighborTowers_;
602 }
603 
604 void HBHEHitMap::hcalHitsNeighborTowers(std::set<const HBHERecHit*>& v) const {
605  v.clear();
606  for (neighbor_const_iterator it1 = beginNeighbors(); it1 != endNeighbors(); ++it1) {
607  const PhysicsTower* twr = (*it1);
608  v.insert(twr->hcalhits.begin(), twr->hcalhits.end());
609  }
610  return;
611 }
612 
613 void HBHEHitMap::ecalHitsNeighborTowers(std::set<const EcalRecHit*>& v) const {
614  v.clear();
615  for (neighbor_const_iterator it1 = beginNeighbors(); it1 != endNeighbors(); ++it1) {
616  const PhysicsTower* twr = (*it1);
617  v.insert(twr->ecalhits.begin(), twr->ecalhits.end());
618  }
619 
620  return;
621 }
622 
623 void HBHEHitMap::tracksNeighborTowers(std::set<const reco::Track*>& v) const {
624  v.clear();
625  for (neighbor_const_iterator it1 = beginNeighbors(); it1 != endNeighbors(); ++it1) {
626  const PhysicsTower* twr = (*it1);
627  v.insert(twr->tracks.begin(), twr->tracks.end());
628  }
629  return;
630 }
631 
632 void HBHEHitMap::byTowers(std::vector<twrinfo>& v) const { assert(false); }
633 
634 void HBHEHitMap::insert(const HBHERecHit* hit, const PhysicsTower* twr, std::set<const PhysicsTower*>& neighbors) {
635  hits_[hit] = twr;
636  neighbors_.insert(neighbors.begin(), neighbors.end());
637 
638  // make sure none of the neighbors are also are part of the hitmap
639  for (hitmap_const_iterator it = beginHits(); it != endHits(); ++it) {
640  const PhysicsTower* t = it->second;
641  neighbor_const_iterator find = findNeighbor(t);
642 
643  // if a hit is also a neighbor, remove the neighbor
644  if (find != endNeighbors())
645  neighbors_.erase(find);
646  }
647  return;
648 }
649 
650 void HBHEHitMap::calcHits_(void) const {
651  hitEnergy_ = 0;
652  nHits_ = 0;
653  hitEnergyTrkFid_ = 0;
654  for (hitmap_const_iterator it = hits_.begin(); it != hits_.end(); ++it) {
655  const HBHERecHit* hit = it->first;
656  if (hit->id().ietaAbs() <= 26)
657  hitEnergyTrkFid_ += hit->energy();
658  hitEnergy_ += hit->energy();
659  ++nHits_;
660  }
661  return;
662 }
663 
665  hcalEnergySameTowers_ = 0;
666  nHcalHitsSameTowers_ = 0;
667  std::set<const HBHERecHit*> v;
668  hcalHitsSameTowers(v);
669  for (std::set<const HBHERecHit*>::const_iterator it = v.begin(); it != v.end(); ++it) {
670  const HBHERecHit* hit = (*it);
671  hcalEnergySameTowers_ += hit->energy();
672  ++nHcalHitsSameTowers_;
673  }
674  return;
675 }
676 
678  ecalEnergySameTowers_ = 0;
679  nEcalHitsSameTowers_ = 0;
680  std::set<const EcalRecHit*> v;
681  ecalHitsSameTowers(v);
682  for (std::set<const EcalRecHit*>::const_iterator it = v.begin(); it != v.end(); ++it) {
683  const EcalRecHit* hit = (*it);
684  ecalEnergySameTowers_ += hit->energy();
685  ++nEcalHitsSameTowers_;
686  }
687  return;
688 }
689 
691  trackEnergySameTowers_ = 0;
692  nTracksSameTowers_ = 0;
693  std::set<const reco::Track*> v;
694  tracksSameTowers(v);
695  for (std::set<const reco::Track*>::const_iterator it = v.begin(); it != v.end(); ++it) {
696  const reco::Track* trk = (*it);
697  trackEnergySameTowers_ += trk->p();
698  ++nTracksSameTowers_;
699  }
700  return;
701 }
702 
704  hcalEnergyNeighborTowers_ = 0;
705  nHcalHitsNeighborTowers_ = 0;
706  std::set<const HBHERecHit*> v;
707  hcalHitsNeighborTowers(v);
708  for (std::set<const HBHERecHit*>::const_iterator it = v.begin(); it != v.end(); ++it) {
709  const HBHERecHit* hit = (*it);
710  hcalEnergyNeighborTowers_ += hit->energy();
711  ++nHcalHitsNeighborTowers_;
712  }
713  return;
714 }
715 
717  ecalEnergyNeighborTowers_ = 0;
718  nEcalHitsNeighborTowers_ = 0;
719  std::set<const EcalRecHit*> v;
720  ecalHitsNeighborTowers(v);
721  for (std::set<const EcalRecHit*>::const_iterator it = v.begin(); it != v.end(); ++it) {
722  const EcalRecHit* hit = (*it);
723  ecalEnergyNeighborTowers_ += hit->energy();
724  ++nEcalHitsNeighborTowers_;
725  }
726  return;
727 }
728 
730  trackEnergyNeighborTowers_ = 0;
731  nTracksNeighborTowers_ = 0;
732  std::set<const reco::Track*> v;
733  tracksNeighborTowers(v);
734  for (std::set<const reco::Track*>::const_iterator it = v.begin(); it != v.end(); ++it) {
735  const reco::Track* trk = (*it);
736  trackEnergyNeighborTowers_ += trk->p();
737  ++nTracksNeighborTowers_;
738  }
739  return;
740 }
741 
743 //
744 // HBHEHitMapOrganizer
745 //
747 
749  const ObjectValidatorAbs& objvalidator,
750  const PhysicsTowerOrganizer& pto,
751  const HcalFrontEndMap* hfemap)
752  : hfemap_(hfemap) {
753  // loop over the hits
754  for (HBHERecHitCollection::const_iterator it = hbhehitcoll_h->begin(); it != hbhehitcoll_h->end(); ++it) {
755  const HBHERecHit* hit = &(*it);
756  if (!objvalidator.validHit(*hit))
757  continue;
758 
759  // get the Physics Tower and the neighbors
760  const PhysicsTower* tower = pto.findTower(hit->id().ieta(), hit->id().iphi());
761 
762  std::set<const PhysicsTower*> neighbors;
763  pto.findNeighbors(hit->id().ieta(), hit->id().iphi(), neighbors);
764 
765  // organize the RBXs
766  int rbxidnum = hfemap_->lookupRBXIndex(hit->id());
767  rbxs_[rbxidnum].insert(hit, tower, neighbors);
768 
769  // organize the HPDs
770  int hpdidnum = hfemap_->lookupRMIndex(hit->id());
771  hpds_[hpdidnum].insert(hit, tower, neighbors);
772 
773  // organize the dihits
774  std::vector<const HBHERecHit*> hpdneighbors;
775  getHPDNeighbors(hit, hpdneighbors, pto);
776 
777  if (hpdneighbors.size() == 1) {
778  std::vector<const HBHERecHit*> hpdneighborsneighbors;
779  getHPDNeighbors(hpdneighbors[0], hpdneighborsneighbors, pto);
780 
781  if (hpdneighborsneighbors.size() == 1 && hpdneighborsneighbors[0] == hit &&
782  hit->energy() > hpdneighbors[0]->energy()) {
783  // we've found two hits who are neighbors in the same HPD, but who have no other
784  // neighbors (in the same HPD) in common. In order not to double-count, we
785  // require that the first hit has more energy
786 
787  const PhysicsTower* tower2 = pto.findTower(hpdneighbors[0]->id().ieta(), hpdneighbors[0]->id().iphi());
788  std::set<const PhysicsTower*> neighbors2;
789  pto.findNeighbors(hpdneighbors[0]->id().ieta(), hpdneighbors[0]->id().iphi(), neighbors2);
790 
791  HBHEHitMap dihit;
792  dihit.insert(hit, tower, neighbors);
793  dihit.insert(hpdneighbors[0], tower2, neighbors2);
794  dihits_.push_back(dihit);
795  }
796  } else if (hpdneighbors.empty()) {
797  // organize the monohits
798  HBHEHitMap monohit;
799  monohit.insert(hit, tower, neighbors);
800  monohits_.push_back(monohit);
801  }
802 
803  } // finished looping over HBHERecHits
804  return;
805 }
806 
807 void HBHEHitMapOrganizer::getRBXs(std::vector<HBHEHitMap>& v, double energy) const {
808  for (std::map<int, HBHEHitMap>::const_iterator it = rbxs_.begin(); it != rbxs_.end(); ++it) {
809  const HBHEHitMap& map = it->second;
810  if (map.hitEnergy() > energy)
811  v.push_back(map);
812  }
813  return;
814 }
815 
816 void HBHEHitMapOrganizer::getHPDs(std::vector<HBHEHitMap>& v, double energy) const {
817  for (std::map<int, HBHEHitMap>::const_iterator it = hpds_.begin(); it != hpds_.end(); ++it) {
818  const HBHEHitMap& map = it->second;
819  if (map.hitEnergy() > energy)
820  v.push_back(map);
821  }
822  return;
823 }
824 
825 void HBHEHitMapOrganizer::getDiHits(std::vector<HBHEHitMap>& v, double energy) const {
826  for (std::vector<HBHEHitMap>::const_iterator it = dihits_.begin(); it != dihits_.end(); ++it) {
827  if (it->hitEnergy() > energy)
828  v.push_back(*it);
829  }
830  return;
831 }
832 
833 void HBHEHitMapOrganizer::getMonoHits(std::vector<HBHEHitMap>& v, double energy) const {
834  for (std::vector<HBHEHitMap>::const_iterator it = monohits_.begin(); it != monohits_.end(); ++it) {
835  if (it->hitEnergy() > energy)
836  v.push_back(*it);
837  }
838  return;
839 }
840 
842  std::vector<const HBHERecHit*>& neighbors,
843  const PhysicsTowerOrganizer& pto) {
844  std::set<const PhysicsTower*> temp;
845  pto.findNeighbors(hit->id().ieta(), hit->id().iphi(), temp);
846 
847  // make sure to include the same tower that the hit is in
848  temp.insert(pto.findTower(hit->id().ieta(), hit->id().iphi()));
849 
850  // loop over the rechits in the temp neighbors
851  for (std::set<const PhysicsTower*>::const_iterator it1 = temp.begin(); it1 != temp.end(); ++it1) {
852  for (std::set<const HBHERecHit*>::const_iterator it2 = (*it1)->hcalhits.begin(); it2 != (*it1)->hcalhits.end();
853  ++it2) {
854  const HBHERecHit* hit2(*it2);
855  if (hit != hit2 && hfemap_->lookupRMIndex(hit->id()) == hfemap_->lookupRMIndex(hit2->id())) {
856  neighbors.push_back(hit2);
857  }
858  }
859  }
860  return;
861 }
constexpr float energy() const
Definition: CaloRecHit.h:29
void getHPDNeighbors(const HBHERecHit *hit, std::vector< const HBHERecHit * > &neighbors, const PhysicsTowerOrganizer &pto)
double p() const
momentum vector magnitude
Definition: TrackBase.h:599
double hcalEnergySameTowers(void) const
std::set< const HBHERecHit * > hcalhits
T getParameter(std::string const &) const
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
Definition: CaloGeometry.cc:34
void tracksNeighborTowers(std::set< const reco::Track * > &v) const
int nHcalHitsSameTowers(void) const
HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:138
EcalSeverityLevel::SeverityLevel severityLevel(const DetId &id) const
Evaluate status from id use channelStatus from DB.
std::vector< typename T::const_iterator > findHit(edm::Handle< T > &hits, DetId thisDet, bool debug=false)
std::map< const HBHERecHit *, const PhysicsTower * >::const_iterator hitmap_const_iterator
int ietaAbs() const
get the absolute value of the tower ieta
std::vector< HBHEHitMap > dihits_
constexpr const DetId & detid() const
Definition: CaloRecHit.h:33
void getHPDs(std::vector< HBHEHitMap > &v, double energy) const
HBHEHitMapOrganizer(const edm::Handle< HBHERecHitCollection > &hbhehitcoll_h, const ObjectValidatorAbs &objvalidator, const PhysicsTowerOrganizer &pto, const HcalFrontEndMap *hfemap)
HcalDetId id() const
get the id
Definition: HBHERecHit.h:39
uint32_t auxPhase1() const
Definition: HBHERecHit.h:54
const int lookupRMIndex(DetId fId) const
const DetId & detid() const
Definition: EcalRecHit.h:72
std::vector< T >::const_iterator const_iterator
virtual bool validTrack(const reco::Track &) const =0
int nEcalHitsNeighborTowers(void) const
const Item * getValues(DetId fId, bool throwOnFail=true) const
int zside(DetId const &)
void getRBXs(std::vector< HBHEHitMap > &v, double energy) const
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:629
ObjectValidator(const edm::ParameterSet &)
void ecalHitsNeighborTowers(std::set< const EcalRecHit * > &v) const
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
void getMonoHits(std::vector< HBHEHitMap > &v, double energy) const
void ecalHitsSameTowers(std::set< const EcalRecHit * > &v) const
PhysicsTowerOrganizer(const edm::Event &iEvent, const edm::EventSetup &evSetup, const edm::Handle< HBHERecHitCollection > &hbhehitcoll_h, const edm::Handle< EcalRecHitCollection > &ebhitcoll_h, const edm::Handle< EcalRecHitCollection > &eehitcoll_h, const edm::Handle< std::vector< reco::TrackExtrapolation > > &trackextrapcoll_h, const ObjectValidatorAbs &objectvalidator, const CaloTowerConstituentsMap &ctcm)
void calcTracksSameTowers_(void) const
double ecalEnergyNeighborTowers(void) const
void insert(const HBHERecHit *hit, const PhysicsTower *twr, std::set< const PhysicsTower * > &neighbors)
const PhysicsTower * findTower(const CaloTowerDetId &id) const
void tracksSameTowers(std::set< const reco::Track * > &v) const
int iEvent
Definition: GenABIO.cc:224
const int lookupRBXIndex(DetId fId) const
int nHcalHitsNeighborTowers(void) const
CaloTowerDetId towerOf(const DetId &id) const
Get the tower id for this det id (or null if not known)
void calcHcalSameTowers_(void) const
std::map< int, HBHEHitMap > rbxs_
double pt() const
track transverse momentum
Definition: TrackBase.h:602
const EcalChannelStatus * theEcalChStatus_
virtual bool validHit(const HBHERecHit &) const =0
bool recoveredRecHit(const DetId &myid, const uint32_t &myflag) const
const EcalRecHitCollection * theEERecHitCollection_
int ieta() const
get the cell ieta
Definition: HcalDetId.h:155
double hcalEnergyNeighborTowers(void) const
int iphi() const
get the tower iphi
double trackEnergySameTowers(void) const
void insert_(CaloTowerDetId &id, const HBHERecHit *hit)
float energy() const
Definition: EcalRecHit.h:68
bool validTrack(const reco::Track &) const override
unsigned short numberOfValidHits() const
number of valid hits found
Definition: TrackBase.h:740
const EcalRecHitCollection * theEBRecHitCollection_
std::set< const PhysicsTower * >::const_iterator neighbor_const_iterator
constexpr bool getBit(const uint32_t u, const unsigned bitnum)
std::map< int, HBHEHitMap > hpds_
int ietaAbs() const
get the absolute value of the cell ieta
Definition: HcalDetId.h:148
const_iterator end() const
virtual DetId getClosestCell(const GlobalPoint &r) const
int iphi() const
get the cell iphi
Definition: HcalDetId.h:157
Definition: DetId.h:17
double hitEnergy(void) const
void calcEcalSameTowers_(void) const
DetId id() const
get the id
Definition: EcalRecHit.h:77
void calcTracksNeighborTowers_(void) const
void calcHcalNeighborTowers_(void) const
int zside() const
get the z-side of the tower (1/-1)
const EcalSeverityLevelAlgo * theEcalSevLvlAlgo_
int getSeverityLevel(const DetId &myid, const uint32_t &myflag, const uint32_t &mystatus) const
std::set< const EcalRecHit * > ecalhits
reco::TrackRef const & track() const
int nHits(void) const
double trackEnergyNeighborTowers(void) const
double hitEnergyTrackFiducial(void) const
T get() const
Definition: EventSetup.h:73
void calcHits_(void) const
std::set< const reco::Track * > tracks
void calcEcalNeighborTowers_(void) const
static const unsigned OFF_COMBINED
std::vector< HBHEHitMap > monohits_
bool validHit(const HBHERecHit &) const override
int nTracksSameTowers(void) const
void getDiHits(std::vector< HBHEHitMap > &v, double energy) const
std::vector< Point > const & positions() const
double ecalEnergySameTowers(void) const
const HcalChannelQuality * theHcalChStatus_
int nEcalHitsSameTowers(void) const
int nTracksNeighborTowers(void) const
uint32_t getValue() const
const HcalFrontEndMap * hfemap_
void hcalHitsSameTowers(std::set< const HBHERecHit * > &v) const
const HcalSeverityLevelComputer * theHcalSevLvlComputer_
T const * product() const
Definition: ESHandle.h:86
constexpr uint32_t flags() const
Definition: CaloRecHit.h:34
void byTowers(std::vector< twrinfo > &v) const
void findNeighbors(const CaloTowerDetId &id, std::set< const PhysicsTower * > &neighbors) const
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
Definition: invegas.h:5
const_iterator begin() const
void hcalHitsNeighborTowers(std::set< const HBHERecHit * > &v) const