test
CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
27 
34 
36 //
37 // ObjectValidator
38 //
40 
42 {
43  HBThreshold_ = iConfig.getParameter<double>("HBThreshold");
44  HESThreshold_ = iConfig.getParameter<double>("HESThreshold");
45  HEDThreshold_ = iConfig.getParameter<double>("HEDThreshold");
46  EBThreshold_ = iConfig.getParameter<double>("EBThreshold");
47  EEThreshold_ = iConfig.getParameter<double>("EEThreshold");
48 
49  HcalAcceptSeverityLevel_ = iConfig.getParameter<uint32_t>("HcalAcceptSeverityLevel");
50  EcalAcceptSeverityLevel_ = iConfig.getParameter<uint32_t>("EcalAcceptSeverityLevel");
51  UseHcalRecoveredHits_ = iConfig.getParameter<bool>("UseHcalRecoveredHits");
52  UseEcalRecoveredHits_ = iConfig.getParameter<bool>("UseEcalRecoveredHits");
53 
54  MinValidTrackPt_ = iConfig.getParameter<double>("MinValidTrackPt");
55  MinValidTrackPtBarrel_ = iConfig.getParameter<double>("MinValidTrackPtBarrel");
56  MinValidTrackNHits_ = iConfig.getParameter<int>("MinValidTrackNHits");
57 
64 
65  return;
66 }
67 
69 {
70 }
71 
73 {
75 
76  // require the hit to pass a certain energy threshold
77  if(hit.id().subdet()==HcalBarrel && hit.energy()<HBThreshold_) return false;
78  else if(hit.id().subdet()==HcalEndcap && hit.id().ietaAbs()<=20 && hit.energy()<HESThreshold_) return false;
79  else if(hit.id().subdet()==HcalEndcap && hit.id().ietaAbs()>20 && hit.energy()<HEDThreshold_) return false;
80 
81  // determine if the hit is good, bad, or recovered
82  const DetId id = hit.detid();
83  const uint32_t recHitFlag = hit.flags();
84  const uint32_t dbStatusFlag = theHcalChStatus_->getValues(id)->getValue();
85  int severityLevel = theHcalSevLvlComputer_->getSeverityLevel(id, recHitFlag, dbStatusFlag);
86  bool isRecovered = theHcalSevLvlComputer_->recoveredRecHit(id, recHitFlag);
87 
88  if(severityLevel==0) return true;
89  if(isRecovered) return UseHcalRecoveredHits_;
90  if(severityLevel>static_cast<int>(HcalAcceptSeverityLevel_)) return false;
91  else return true;
92 }
93 
95 {
97 
98  // require the hit to pass a certain energy threshold
99  const DetId id = hit.detid();
100  if(id.subdetId()==EcalBarrel && hit.energy()<EBThreshold_) return false;
101  else if(id.subdetId()==EcalEndcap && hit.energy()<EEThreshold_) return false;
102 
103  // determine if the hit is good, bad, or recovered
104  int severityLevel = 999;
105  if (id.subdetId() == EcalBarrel && theEBRecHitCollection_!=0) severityLevel = theEcalSevLvlAlgo_->severityLevel(hit);//id, *theEBRecHitCollection_, *theEcalChStatus_, 5., EcalSeverityLevelAlgo::kSwissCross, 0.95, 2., 15., 0.999);
106  else if(id.subdetId() == EcalEndcap && theEERecHitCollection_!=0) severityLevel = theEcalSevLvlAlgo_->severityLevel(hit);//id, *theEERecHitCollection_, *theEcalChStatus_, 5., EcalSeverityLevelAlgo::kSwissCross, 0.95, 2., 15., 0.999);
107  else return false;
108 
109  if(severityLevel == EcalSeverityLevel::kGood) return true;
110  if(severityLevel == EcalSeverityLevel::kRecovered) return UseEcalRecoveredHits_;
111  if(severityLevel > static_cast<int>(EcalAcceptSeverityLevel_)) return false;
112  else return true;
113 }
114 
116 {
117  if(trk.pt()<MinValidTrackPt_) return false;
118  if(trk.pt()<MinValidTrackPtBarrel_ && std::fabs(trk.momentum().eta())<1.479) return false;
119  if(trk.numberOfValidHits()<MinValidTrackNHits_) return false;
120  return true;
121 }
122 
124 //
125 // PhysicsTowerOrganizer
126 //
128 
130  const edm::EventSetup& evSetup,
131  const edm::Handle<HBHERecHitCollection>& hbhehitcoll_h,
132  const edm::Handle<EcalRecHitCollection>& ebhitcoll_h,
133  const edm::Handle<EcalRecHitCollection>& eehitcoll_h,
134  const edm::Handle<std::vector<reco::TrackExtrapolation> >& trackextrapcoll_h,
135  const ObjectValidatorAbs& objectvalidator,
136  const CaloTowerConstituentsMap& ctcm)
137 {
138  // get some geometries
140  evSetup.get<CaloGeometryRecord>().get(pG);
141  const CaloGeometry* geo = pG.product();
144 
145  // do the HCAL hits
146  for(HBHERecHitCollection::const_iterator it=hbhehitcoll_h->begin(); it!=hbhehitcoll_h->end(); ++it) {
147  const HBHERecHit* hit=&(*it);
148 
149  // check that the hit is valid
150  if(!objectvalidator.validHit(*hit)) continue;
151 
152  // add the hit to the organizer
153  CaloTowerDetId tid = ctcm.towerOf(hit->id());
154  insert_(tid, hit);
155  }
156 
157  // do the EB hits
158  for(EcalRecHitCollection::const_iterator it=ebhitcoll_h->begin(); it!=ebhitcoll_h->end(); ++it) {
159  const EcalRecHit* hit=&(*it);
160 
161  if(!objectvalidator.validHit(*hit)) continue;
162  CaloTowerDetId tid = ctcm.towerOf(hit->id());
163  insert_(tid, hit);
164  }
165 
166  // do the EE hits
167  for(EcalRecHitCollection::const_iterator it=eehitcoll_h->begin(); it!=eehitcoll_h->end(); ++it) {
168  const EcalRecHit* hit=&(*it);
169 
170  if(!objectvalidator.validHit(*hit)) continue;
171  CaloTowerDetId tid = ctcm.towerOf(hit->id());
172  insert_(tid, hit);
173  }
174 
175  // do the tracks
176  for(std::vector<reco::TrackExtrapolation>::const_iterator it=trackextrapcoll_h->begin(); it!=trackextrapcoll_h->end(); ++it) {
177  const reco::TrackExtrapolation* extrap=&(*it);
178  const reco::Track* track = &(*(extrap->track()));
179 
180  // validate track
181  if(!objectvalidator.validTrack(*track)) continue;
182 
183  // get the point
184  if ( extrap->positions().size()==0 ) continue;
185  const GlobalPoint point(extrap->positions().front().x(),
186  extrap->positions().front().y(),
187  extrap->positions().front().z());
188 
189 
190  if(std::fabs(point.eta())<1.479) {
191  EBDetId cell = gEB->getClosestCell(point);
192  CaloTowerDetId tid = ctcm.towerOf(cell);
193  insert_(tid, track);
194  } else {
195  EEDetId cell = gEE->getClosestCell(point);
196  CaloTowerDetId tid = ctcm.towerOf(cell);
197  insert_(tid, track);
198  }
199  }
200 
201  return;
202 }
203 
205 {
206  // create dummy PhysicsTower
207  PhysicsTower dummy;
208 
209  // correct for the merging of the |ieta|=28-29 towers
210  if(id.ietaAbs()==29) dummy.id = CaloTowerDetId((id.ietaAbs()-1)*id.zside(), id.iphi());
211  else dummy.id=id;
212 
213  // search on the dummy
214  std::set<PhysicsTower, towercmp>::iterator it=towers_.find(dummy);
215 
216  if(it==towers_.end()) return 0;
217 
218  // for whatever reason, I can't get a non-const out of the find method
219  PhysicsTower &twr = const_cast<PhysicsTower&>(*it);
220  return &twr;
221 }
222 
224 {
225  // create dummy PhysicsTower
226  PhysicsTower dummy;
227 
228  // correct for the merging of the |ieta|=28-29 towers
229  if(id.ietaAbs()==29) dummy.id = CaloTowerDetId((id.ietaAbs()-1)*id.zside(), id.iphi());
230  else dummy.id=id;
231 
232  // search on the dummy
233  std::set<PhysicsTower, towercmp>::iterator it=towers_.find(dummy);
234 
235  if(it==towers_.end()) return 0;
236  return &(*it);
237 }
238 
239 const PhysicsTower* PhysicsTowerOrganizer::findTower(int ieta, int iphi) const
240 {
241  CaloTowerDetId tid(ieta, iphi);
242  return findTower(tid);
243 }
244 
246 {
247  CaloTowerDetId tid(ieta, iphi);
248  return findTower(tid);
249 }
250 
251 void PhysicsTowerOrganizer::findNeighbors(const CaloTowerDetId& tempid, std::set<const PhysicsTower*>& neighbors) const
252 {
253  // correct for the merging of the |ieta|=28-29 towers
254  CaloTowerDetId id(tempid);
255  if(tempid.ietaAbs()==29) id = CaloTowerDetId((tempid.ietaAbs()-1)*tempid.zside(), tempid.iphi());
256 
257  std::vector<CaloTowerDetId> ids;
258  // get the neighbor with higher iphi
259  if(id.ietaAbs()<=20) {
260  if(id.iphi()==72) ids.push_back(CaloTowerDetId(id.ieta(), 1));
261  else ids.push_back(CaloTowerDetId(id.ieta(), id.iphi()+1));
262  } else {
263  if(id.iphi()==71) ids.push_back(CaloTowerDetId(id.ieta(), 1));
264  else ids.push_back(CaloTowerDetId(id.ieta(), id.iphi()+2));
265  }
266 
267  // get the neighbor with the lower iphi
268  if(id.ietaAbs()<=20) {
269  if(id.iphi()==1) ids.push_back(CaloTowerDetId(id.ieta(), 72));
270  else ids.push_back(CaloTowerDetId(id.ieta(), id.iphi()-1));
271  } else {
272  if(id.iphi()==1) ids.push_back(CaloTowerDetId(id.ieta(), 71));
273  else ids.push_back(CaloTowerDetId(id.ieta(), id.iphi()-2));
274  }
275 
276  // get the neighbor with the higher ietaAbs
277  if(id.ietaAbs()==20 && (id.iphi()%2)==0)
278  ids.push_back(CaloTowerDetId((id.ietaAbs()+1)*id.zside(), id.iphi()-1));
279  else
280  ids.push_back(CaloTowerDetId((id.ietaAbs()+1)*id.zside(), id.iphi()));
281 
282  // get the neighbor(s) with the lower ietaAbs
283  if(id.ietaAbs()==21) {
284  ids.push_back(CaloTowerDetId((id.ietaAbs()-1)*id.zside(), id.iphi()));
285  ids.push_back(CaloTowerDetId((id.ietaAbs()-1)*id.zside(), id.iphi()+1));
286  } else if(id.ietaAbs()==1) {
287  ids.push_back(CaloTowerDetId(-id.ieta(), id.iphi()));
288  } else {
289  ids.push_back(CaloTowerDetId((id.ietaAbs()-1)*id.zside(), id.iphi()));
290  }
291 
292  // get the neighbor with higher ieta and higher iphi
293  if(id.ietaAbs()<=19 || (id.ietaAbs()==20 && (id.iphi()%2)==0)) {
294  if(id.iphi()==72) ids.push_back(CaloTowerDetId((id.ietaAbs()+1)*id.zside(), 1));
295  else ids.push_back(CaloTowerDetId((id.ietaAbs()+1)*id.zside(), id.iphi()+1));
296  } else if(id.ietaAbs()>=21) {
297  if(id.iphi()==71) ids.push_back(CaloTowerDetId((id.ietaAbs()+1)*id.zside(), 1));
298  else ids.push_back(CaloTowerDetId((id.ietaAbs()+1)*id.zside(), id.iphi()+2));
299  }
300 
301  // get the neighbor with higher ieta and lower iphi
302  if(id.ietaAbs()<=19) {
303  if(id.iphi()==1) ids.push_back(CaloTowerDetId((id.ietaAbs()+1)*id.zside(), 72));
304  else ids.push_back(CaloTowerDetId((id.ietaAbs()+1)*id.zside(), id.iphi()-1));
305  } else if(id.ietaAbs()>=21 || (id.ietaAbs()==20 && (id.iphi()%2)==1)) {
306  if(id.iphi()==1) ids.push_back(CaloTowerDetId((id.ietaAbs()+1)*id.zside(), 71));
307  else ids.push_back(CaloTowerDetId((id.ietaAbs()+1)*id.zside(), id.iphi()-2));
308  }
309 
310  // get the neighbor with lower ieta and higher iphi
311  if(id.ietaAbs()==1) {
312  if(id.iphi()==72) ids.push_back(CaloTowerDetId(-id.ieta(), 1));
313  else ids.push_back(CaloTowerDetId(-id.ieta(), id.iphi()+1));
314  } else if(id.ietaAbs()<=20) {
315  if(id.iphi()==72) ids.push_back(CaloTowerDetId((id.ietaAbs()-1)*id.zside(), 1));
316  else ids.push_back(CaloTowerDetId((id.ietaAbs()-1)*id.zside(), id.iphi()+1));
317  } else if(id.ietaAbs()>=21) {
318  if(id.iphi()==71) ids.push_back(CaloTowerDetId((id.ietaAbs()-1)*id.zside(), 1));
319  else ids.push_back(CaloTowerDetId((id.ietaAbs()-1)*id.zside(), id.iphi()+2));
320  }
321 
322  // get the neighbor with lower ieta and lower iphi
323  if(id.ietaAbs()==1) {
324  if(id.iphi()==1) ids.push_back(CaloTowerDetId(-id.ieta(), 72));
325  else ids.push_back(CaloTowerDetId(-id.ieta(), id.iphi()-1));
326  } else if(id.ietaAbs()<=20) {
327  if(id.iphi()==1) ids.push_back(CaloTowerDetId((id.ietaAbs()-1)*id.zside(), 72));
328  else ids.push_back(CaloTowerDetId((id.ietaAbs()-1)*id.zside(), id.iphi()-1));
329  } else if(id.ietaAbs()>=22) {
330  if(id.iphi()==1) ids.push_back(CaloTowerDetId((id.ietaAbs()-1)*id.zside(), 71));
331  else ids.push_back(CaloTowerDetId((id.ietaAbs()-1)*id.zside(), id.iphi()-2));
332  } else if(id.ietaAbs()==21) {
333  if(id.iphi()==1) ids.push_back(CaloTowerDetId((id.ietaAbs()-1)*id.zside(), 72));
334  else ids.push_back(CaloTowerDetId((id.ietaAbs()-1)*id.zside(), id.iphi()-1));
335  }
336 
337  // clear neighbors
338  neighbors.clear();
339 
340  // find the neighbors and add them to the eponymous set
341  for(std::vector<CaloTowerDetId>::const_iterator it=ids.begin(); it!=ids.end(); ++it) {
342  const PhysicsTower* twr=findTower(*it);
343  if(twr) neighbors.insert(twr);
344  }
345 
346  return;
347 }
348 
349 void PhysicsTowerOrganizer::findNeighbors(const PhysicsTower* twr, std::set<const PhysicsTower*>& neighbors) const
350 {
351  findNeighbors(twr->id, neighbors);
352  return;
353 }
354 
355 void PhysicsTowerOrganizer::findNeighbors(int ieta, int iphi, std::set<const PhysicsTower*>& neighbors) const
356 {
357  findNeighbors(CaloTowerDetId(ieta, iphi), neighbors);
358  return;
359 }
360 
362 {
363  PhysicsTower* twr=findTower(id);
364  if(twr==0) {
365  PhysicsTower dummy;
366  if(id.ietaAbs()==29)
367  dummy.id = CaloTowerDetId((id.ietaAbs()-1)*id.zside(), id.iphi());
368  else
369  dummy.id = id;
370  dummy.hcalhits.insert(hit);
371  towers_.insert(dummy);
372  } else {
373  twr->hcalhits.insert(hit);
374  }
375  return;
376 }
377 
379 {
380  PhysicsTower* twr=findTower(id);
381  if(twr==0) {
382  PhysicsTower dummy;
383  if(id.ietaAbs()==29)
384  dummy.id = CaloTowerDetId((id.ietaAbs()-1)*id.zside(), id.iphi());
385  else
386  dummy.id = id;
387  dummy.ecalhits.insert(hit);
388  towers_.insert(dummy);
389  } else {
390  twr->ecalhits.insert(hit);
391  }
392  return;
393 }
394 
396 {
397  PhysicsTower* twr=findTower(id);
398  if(twr==0) {
399  PhysicsTower dummy;
400  if(id.ietaAbs()==29)
401  dummy.id = CaloTowerDetId((id.ietaAbs()-1)*id.zside(), id.iphi());
402  else
403  dummy.id = id;
404  dummy.tracks.insert(track);
405  towers_.insert(dummy);
406  } else {
407  twr->tracks.insert(track);
408  }
409  return;
410 }
411 
412 
414 //
415 // HBHEHitMap
416 //
418 
420 {
422  nHits_=-999;
427 
428 }
429 
430 double HBHEHitMap::hitEnergy(void) const
431 {
432  if(hitEnergy_<-900) calcHits_();
433  return hitEnergy_;
434 }
435 
436 int HBHEHitMap::nHits(void) const
437 {
438  if(nHits_<-900) calcHits_();
439  return nHits_;
440 }
441 
443 {
444  if(hitEnergyTrkFid_<-900) calcHits_();
445  return hitEnergyTrkFid_;
446 }
447 
448 
450 {
452  return hcalEnergySameTowers_;
453 }
454 
456 {
458  return nHcalHitsSameTowers_;
459 }
460 
462 {
464  return ecalEnergySameTowers_;
465 }
466 
468 {
470  return nEcalHitsSameTowers_;
471 }
472 
474 {
476  return trackEnergySameTowers_;
477 }
478 
480 {
482  return nTracksSameTowers_;
483 }
484 
485 void HBHEHitMap::hcalHitsSameTowers(std::set<const HBHERecHit*>& v) const
486 {
487  v.clear();
488  for(hitmap_const_iterator it1=beginHits(); it1!=endHits(); ++it1) {
489  for(std::set<const HBHERecHit*>::const_iterator it2=it1->second->hcalhits.begin(); it2!=it1->second->hcalhits.end(); ++it2) {
490  const HBHERecHit* hit=(*it2);
491  // if the hit in the tower is already in the hitmap, don't include it
492  if(findHit(hit)==endHits()) v.insert(hit);
493  }
494  }
495  return;
496 }
497 
498 void HBHEHitMap::ecalHitsSameTowers(std::set<const EcalRecHit*>& v) const
499 {
500  v.clear();
501  for(hitmap_const_iterator it1=beginHits(); it1!=endHits(); ++it1) {
502  v.insert(it1->second->ecalhits.begin(), it1->second->ecalhits.end());
503  }
504  return;
505 }
506 
507 void HBHEHitMap::tracksSameTowers(std::set<const reco::Track*>& v) const
508 {
509  v.clear();
510  for(hitmap_const_iterator it1=beginHits(); it1!=endHits(); ++it1) {
511  v.insert(it1->second->tracks.begin(), it1->second->tracks.end());
512  }
513  return;
514 }
515 
517 {
520 }
521 
523 {
526 }
527 
529 {
532 }
533 
535 {
538 }
539 
541 {
544 }
545 
547 {
549  return nTracksNeighborTowers_;
550 }
551 
552 void HBHEHitMap::hcalHitsNeighborTowers(std::set<const HBHERecHit*>& v) const
553 {
554  v.clear();
555  for(neighbor_const_iterator it1=beginNeighbors(); it1!=endNeighbors(); ++it1) {
556  const PhysicsTower* twr=(*it1);
557  v.insert(twr->hcalhits.begin(), twr->hcalhits.end());
558  }
559  return;
560 }
561 
562 void HBHEHitMap::ecalHitsNeighborTowers(std::set<const EcalRecHit*>& v) const
563 {
564  v.clear();
565  for(neighbor_const_iterator it1=beginNeighbors(); it1!=endNeighbors(); ++it1) {
566  const PhysicsTower* twr=(*it1);
567  v.insert(twr->ecalhits.begin(), twr->ecalhits.end());
568  }
569 
570  return;
571 }
572 
573 void HBHEHitMap::tracksNeighborTowers(std::set<const reco::Track*>& v) const
574 {
575  v.clear();
576  for(neighbor_const_iterator it1=beginNeighbors(); it1!=endNeighbors(); ++it1) {
577  const PhysicsTower* twr=(*it1);
578  v.insert(twr->tracks.begin(), twr->tracks.end());
579  }
580  return;
581 }
582 
583 void HBHEHitMap::byTowers(std::vector<twrinfo>& v) const
584 {
585  assert(0);
586 }
587 
588 void HBHEHitMap::insert(const HBHERecHit* hit, const PhysicsTower* twr, std::set<const PhysicsTower*>& neighbors)
589 {
590  hits_[hit]=twr;
591  neighbors_.insert(neighbors.begin(), neighbors.end());
592 
593  // make sure none of the neighbors are also are part of the hitmap
594  for(hitmap_const_iterator it=beginHits(); it!=endHits(); ++it) {
595  const PhysicsTower* t=it->second;
597 
598  // if a hit is also a neighbor, remove the neighbor
599  if(find!=endNeighbors()) neighbors_.erase(find);
600  }
601  return;
602 }
603 
604 
605 void HBHEHitMap::calcHits_(void) const
606 {
607  hitEnergy_=0;
608  nHits_=0;
610  for(hitmap_const_iterator it=hits_.begin(); it!=hits_.end(); ++it) {
611  const HBHERecHit* hit=it->first;
612  if(hit->id().ietaAbs()<=26) hitEnergyTrkFid_+=hit->energy();
613  hitEnergy_+=hit->energy();
614  ++nHits_;
615  }
616  return;
617 }
618 
620 {
623  std::set<const HBHERecHit*> v;
625  for(std::set<const HBHERecHit*>::const_iterator it=v.begin(); it!=v.end(); ++it) {
626  const HBHERecHit* hit=(*it);
629  }
630  return;
631 }
632 
634 {
637  std::set<const EcalRecHit*> v;
639  for(std::set<const EcalRecHit*>::const_iterator it=v.begin(); it!=v.end(); ++it) {
640  const EcalRecHit* hit=(*it);
643  }
644  return;
645 }
646 
648 {
651  std::set<const reco::Track*> v;
652  tracksSameTowers(v);
653  for(std::set<const reco::Track*>::const_iterator it=v.begin(); it!=v.end(); ++it) {
654  const reco::Track* trk=(*it);
655  trackEnergySameTowers_+=trk->p();
657  }
658  return;
659 }
660 
662 {
665  std::set<const HBHERecHit*> v;
667  for(std::set<const HBHERecHit*>::const_iterator it=v.begin(); it!=v.end(); ++it) {
668  const HBHERecHit* hit=(*it);
671  }
672  return;
673 }
674 
676 {
679  std::set<const EcalRecHit*> v;
681  for(std::set<const EcalRecHit*>::const_iterator it=v.begin(); it!=v.end(); ++it) {
682  const EcalRecHit* hit=(*it);
685  }
686  return;
687 }
688 
690 {
693  std::set<const reco::Track*> v;
695  for(std::set<const reco::Track*>::const_iterator it=v.begin(); it!=v.end(); ++it) {
696  const reco::Track* trk=(*it);
699  }
700  return;
701 }
702 
704 //
705 // HBHEHitMapOrganizer
706 //
708 
709 
711  const ObjectValidatorAbs& objvalidator,
712  const PhysicsTowerOrganizer& pto,
713  const HcalFrontEndMap* hfemap)
714  : hfemap_(hfemap)
715 {
716  // loop over the hits
717  for(HBHERecHitCollection::const_iterator it=hbhehitcoll_h->begin(); it!=hbhehitcoll_h->end(); ++it) {
718  const HBHERecHit *hit=&(*it);
719  if(!objvalidator.validHit(*hit)) continue;
720 
721  // get the Physics Tower and the neighbors
722  const PhysicsTower* tower=pto.findTower(hit->id().ieta(), hit->id().iphi());
723 
724  std::set<const PhysicsTower*> neighbors;
725  pto.findNeighbors(hit->id().ieta(), hit->id().iphi(), neighbors);
726 
727  // organize the RBXs
728  int rbxidnum = hfemap_->lookupRBXIndex(hit->id());
729  rbxs_[rbxidnum].insert(hit, tower, neighbors);
730 
731  // organize the HPDs
732  int hpdidnum = hfemap_->lookupRMIndex(hit->id());
733  hpds_[hpdidnum].insert(hit, tower, neighbors);
734 
735 
736  // organize the dihits
737  std::vector<const HBHERecHit*> hpdneighbors;
738  getHPDNeighbors(hit, hpdneighbors, pto);
739 
740  if(hpdneighbors.size()==1) {
741  std::vector<const HBHERecHit*> hpdneighborsneighbors;
742  getHPDNeighbors(hpdneighbors[0], hpdneighborsneighbors, pto);
743 
744  if(hpdneighborsneighbors.size()==1 && hpdneighborsneighbors[0]==hit && hit->energy()>hpdneighbors[0]->energy()) {
745  // we've found two hits who are neighbors in the same HPD, but who have no other
746  // neighbors (in the same HPD) in common. In order not to double-count, we
747  // require that the first hit has more energy
748 
749  const PhysicsTower* tower2=pto.findTower(hpdneighbors[0]->id().ieta(), hpdneighbors[0]->id().iphi());
750  std::set<const PhysicsTower*> neighbors2;
751  pto.findNeighbors(hpdneighbors[0]->id().ieta(), hpdneighbors[0]->id().iphi(), neighbors2);
752 
753  HBHEHitMap dihit;
754  dihit.insert(hit, tower, neighbors);
755  dihit.insert(hpdneighbors[0], tower2, neighbors2);
756  dihits_.push_back(dihit);
757  }
758  } else if(hpdneighbors.size()==0) {
759 
760  // organize the monohits
761  HBHEHitMap monohit;
762  monohit.insert(hit, tower, neighbors);
763  monohits_.push_back(monohit);
764  }
765 
766  } // finished looping over HBHERecHits
767  return;
768 }
769 
770 void HBHEHitMapOrganizer::getRBXs(std::vector<HBHEHitMap>& v, double energy) const
771 {
772  for(std::map<int, HBHEHitMap>::const_iterator it=rbxs_.begin(); it!=rbxs_.end(); ++it) {
773  const HBHEHitMap &map=it->second;
774  if(map.hitEnergy()>energy) v.push_back(map);
775  }
776  return;
777 }
778 
779 void HBHEHitMapOrganizer::getHPDs(std::vector<HBHEHitMap>& v, double energy) const
780 {
781  for(std::map<int, HBHEHitMap>::const_iterator it=hpds_.begin(); it!=hpds_.end(); ++it) {
782  const HBHEHitMap &map=it->second;
783  if(map.hitEnergy()>energy) v.push_back(map);
784  }
785  return;
786 }
787 
788 void HBHEHitMapOrganizer::getDiHits(std::vector<HBHEHitMap>& v, double energy) const
789 {
790  for(std::vector<HBHEHitMap>::const_iterator it=dihits_.begin(); it!=dihits_.end(); ++it) {
791  if(it->hitEnergy()>energy) v.push_back(*it);
792  }
793  return;
794 }
795 
796 void HBHEHitMapOrganizer::getMonoHits(std::vector<HBHEHitMap>& v, double energy) const
797 {
798  for(std::vector<HBHEHitMap>::const_iterator it=monohits_.begin(); it!=monohits_.end(); ++it) {
799  if(it->hitEnergy()>energy) v.push_back(*it);
800  }
801  return;
802 }
803 
804 
805 
806 void HBHEHitMapOrganizer::getHPDNeighbors(const HBHERecHit* hit, std::vector<const HBHERecHit*>& neighbors, const PhysicsTowerOrganizer& pto)
807 {
808  std::set<const PhysicsTower*> temp;
809  pto.findNeighbors(hit->id().ieta(), hit->id().iphi(), temp);
810 
811  // make sure to include the same tower that the hit is in
812  temp.insert(pto.findTower(hit->id().ieta(), hit->id().iphi()));
813 
814  // loop over the rechits in the temp neighbors
815  for(std::set<const PhysicsTower*>::const_iterator it1=temp.begin(); it1!=temp.end(); ++it1) {
816  for(std::set<const HBHERecHit*>::const_iterator it2=(*it1)->hcalhits.begin(); it2!=(*it1)->hcalhits.end(); ++it2) {
817  const HBHERecHit* hit2(*it2);
818  if(hit!=hit2 && hfemap_->lookupRMIndex(hit->id())==hfemap_->lookupRMIndex(hit2->id())) {
819  neighbors.push_back(hit2);
820  }
821  }
822  }
823  return;
824 }
825 
826 
827 
void getHPDNeighbors(const HBHERecHit *hit, std::vector< const HBHERecHit * > &neighbors, const PhysicsTowerOrganizer &pto)
double p() const
momentum vector magnitude
Definition: TrackBase.h:610
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:45
void tracksNeighborTowers(std::set< const reco::Track * > &v) const
int nHcalHitsSameTowers(void) const
HcalSubdetector subdet() const
get the subdetector
Definition: HcalDetId.h:49
EcalSeverityLevel::SeverityLevel severityLevel(const DetId &id) const
Evaluate status from id use channelStatus from DB.
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_
hitmap_const_iterator findHit(const HBHERecHit *hit) const
const DetId & detid() const
Definition: CaloRecHit.h:21
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:23
assert(m_qm.get())
neighbor_const_iterator findNeighbor(const PhysicsTower *twr) const
const int lookupRMIndex(DetId fId) const
const DetId & detid() const
Definition: EcalRecHit.h:72
std::vector< HBHERecHit >::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
bool validTrack(const reco::Track &) const
neighbor_const_iterator beginNeighbors(void) const
int zside(DetId const &)
double hcalEnergyNeighborTowers_
void getRBXs(std::vector< HBHEHitMap > &v, double energy) const
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:670
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:7
hitmap_const_iterator endHits(void) const
std::map< const HBHERecHit *, const PhysicsTower * > hits_
void getMonoHits(std::vector< HBHEHitMap > &v, double energy) const
void ecalHitsSameTowers(std::set< const EcalRecHit * > &v) const
double trackEnergyNeighborTowers_
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
std::set< const PhysicsTower * > neighbors_
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:230
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_
float energy() const
Definition: CaloRecHit.h:17
double pt() const
track transverse momentum
Definition: TrackBase.h:616
const EcalChannelStatus * theEcalChStatus_
bool recoveredRecHit(const DetId &myid, const uint32_t &myflag) const
const EcalRecHitCollection * theEERecHitCollection_
uint32_t flags() const
Definition: CaloRecHit.h:22
int ieta() const
get the cell ieta
Definition: HcalDetId.h:56
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
unsigned short numberOfValidHits() const
number of valid hits found
Definition: TrackBase.h:815
const EcalRecHitCollection * theEBRecHitCollection_
std::set< const PhysicsTower * >::const_iterator neighbor_const_iterator
std::map< int, HBHEHitMap > hpds_
int ietaAbs() const
get the absolute value of the cell ieta
Definition: HcalDetId.cc:98
virtual DetId getClosestCell(const GlobalPoint &r) const
std::set< PhysicsTower, towercmp > towers_
int iphi() const
get the cell iphi
Definition: HcalDetId.cc:103
Definition: DetId.h:18
double hitEnergy(void) const
void calcEcalSameTowers_(void) const
DetId id() const
get the id
Definition: EcalRecHit.h:77
virtual bool validHit(const HBHERecHit &) const =0
double ecalEnergyNeighborTowers_
void calcTracksNeighborTowers_(void) const
void calcHcalNeighborTowers_(void) const
const T & get() const
Definition: EventSetup.h:56
T const * product() const
Definition: ESHandle.h:86
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
void calcHits_(void) const
std::set< const reco::Track * > tracks
void calcEcalNeighborTowers_(void) const
std::vector< HBHEHitMap > monohits_
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
bool validHit(const HBHERecHit &) const
const HcalSeverityLevelComputer * theHcalSevLvlComputer_
void byTowers(std::vector< twrinfo > &v) const
neighbor_const_iterator endNeighbors(void) 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
hitmap_const_iterator beginHits(void) const
void hcalHitsNeighborTowers(std::set< const HBHERecHit * > &v) const