CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
CosmicClusterAlgo.cc
Go to the documentation of this file.
1 
3 
4 #include <vector> //TEMP JHAUPT 4-27
5 
6 // Geometry
12 
14 
15 
16 // Return a vector of clusters from a collection of EcalRecHits:
17 //
18 std::vector<reco::BasicCluster> CosmicClusterAlgo::makeClusters(
19  const EcalRecHitCollection* hits,
20  const EcalUncalibratedRecHitCollection *uncalibhits,
21  const CaloSubdetectorGeometry *geometry_p,
22  const CaloSubdetectorTopology *topology_p,
23  const CaloSubdetectorGeometry *geometryES_p,
24  EcalPart ecalPart,
25  bool regional,
26  const std::vector<EcalEtaPhiRegion>& regions)
27 {
28  seeds.clear();
29  used_s.clear();
30  canSeed_s.clear();
31  clusters_v.clear();
32 
33  recHits_ = hits;
34  uncalibRecHits_ = uncalibhits;
35 
36  inEB = true;
37  double threshold = 0;
38  std::string ecalPart_string;
39  if (ecalPart == endcap)
40  {
41  threshold = ecalEndcapSeedThreshold;
42  ecalPart_string = "EndCap";
43  inEB = false;
44  }
45  if (ecalPart == barrel)
46  {
47  threshold = ecalBarrelSeedThreshold;
48  ecalPart_string = "Barrel";
49  inEB = true;
50  }
51 
52  if (verbosity < pINFO)
53  {
54  std::cout << "-------------------------------------------------------------" << std::endl;
55  std::cout << "Island algorithm invoked for ECAL" << ecalPart_string << std::endl;
56  std::cout << "Looking for seeds, threshold used = " << threshold << " ADC" <<std::endl;
57  }
58 
59  int nregions=0;
60  if(regional) nregions=regions.size();
61 
62  if(!regional || nregions) {
63 
65  for(it = recHits_->begin(); it != recHits_->end(); it++)
66  {
67 
68  if (!uncalibRecHits_){
69  if (verbosity < pINFO)
70  {
71  std::cout << "-------------------------------------------------------------" << std::endl;
72  std::cout << "No Uncalibrated RecHits no Uncalibrated rec hit collection available" << std::endl;
73  }
74  continue;
75  }
76 
77  // if rechit affected by features other than these, do not allow if seeding
78  // features are hard coded, for now; add severity?
79  uint32_t rhFlag = (*it).recoFlag();
80  if (!(
81  rhFlag == EcalRecHit::kGood ||
82  rhFlag == EcalRecHit::kOutOfTime ||
83  rhFlag == EcalRecHit::kPoorCalib
84  )
85  ) continue;
86 
88 
89  if (itt == uncalibRecHits_->end()){
90  if (verbosity < pINFO)
91  {
92  std::cout << "-------------------------------------------------------------" << std::endl;
93  std::cout << "No Uncalibrated RecHit associated with the RecHit Probably no Uncalibrated rec hit collection available" << std::endl;
94  }
95  continue;
96  }
97 
98  EcalUncalibratedRecHit uhit_p = *itt;
99 
100  // looking for cluster seeds
101  if (uhit_p.amplitude() < (inEB ? ecalBarrelSeedThreshold : ecalEndcapSeedThreshold) ) continue; //
102 
103  const CaloCellGeometry & thisCell = *geometry_p->getGeometry(it->id());
104 
105  // Require that RecHit is within clustering region in case
106  // of regional reconstruction
107  bool withinRegion = false;
108  if (regional) {
109  std::vector<EcalEtaPhiRegion>::const_iterator region;
110  for (region=regions.begin(); region!=regions.end(); region++) {
111  if (region->inRegion(thisCell.etaPos(),thisCell.phiPos())) {
112  withinRegion = true;
113  break;
114  }
115  }
116  }
117 
118  if (!regional || withinRegion) {
119  seeds.push_back(*it); // JHaupt 4-27-2008 Et -> energy, most likely not needed as there is already a threshold requirement.
120  }
121  }
122 
123  }
124 
125  sort(seeds.begin(), seeds.end(), EcalRecHitLess());
126 
127  if (verbosity < pINFO)
128  {
129  std::cout << "JH Total number of seeds found in event = " << seeds.size() << std::endl;
130  for (EcalRecHitCollection::const_iterator ji = seeds.begin(); ji != seeds.end(); ++ji)
131  {
132  //std::cout << "JH Seed Energy " << ji->energy() << " hashed " << ((EBDetId)ji->id()).hashedIndex() << std::endl;
133 
134  }
135  }
136 
137  mainSearch(geometry_p,topology_p,geometryES_p,ecalPart );
138  sort(clusters_v.rbegin(), clusters_v.rend(),ClusterEtLess());
139 
140  if (verbosity < pINFO)
141  {
142  std::cout << "---------- end of main search. clusters have been sorted ----" << std::endl;
143  }
144 
145  return clusters_v;
146 
147 }
148 
149 // Search for clusters
150 //
152  const CaloSubdetectorTopology *topology_p,
153  const CaloSubdetectorGeometry *geometryES_p,
154  EcalPart ecalPart )
155 {
156 
157  if (verbosity < pINFO)
158  {
159  std::cout << "Building clusters............" << std::endl;
160  }
161 
162  // Loop over seeds:
163  std::vector<EcalRecHit>::iterator it;
164  for (it = seeds.begin(); it != seeds.end(); it++)
165  {
166 
167  // check if this crystal is able to seed
168  // (event though it is already used)
169  bool usedButCanSeed = false;
170  if (canSeed_s.find(it->id()) != canSeed_s.end()) usedButCanSeed = true;
171 
172  // make sure the current seed does not belong to a cluster already.
173  if ((used_s.find(it->id()) != used_s.end()) && (usedButCanSeed == false))
174  {
175  if (it == seeds.begin())
176  {
177  if (verbosity < pINFO)
178  {
179  std::cout << "##############################################################" << std::endl;
180  std::cout << "DEBUG ALERT: Highest energy seed already belongs to a cluster!" << std::endl;
181  std::cout << "##############################################################" << std::endl;
182  }
183  }
184 
185  // seed crystal is used or is used and cannot seed a cluster
186  // so continue to the next seed crystal...
187  continue;
188  }
189 
190  // clear the vector of hits in current clusterconst EcalRecHitCollection* hits,
191  current_v9.clear();
192  current_v25.clear();
193  current_v25Sup.clear();
194 
195  // Create a navigator at the seed
196  CaloNavigator<DetId> navigator(it->id(), topology_p);
197  DetId seedId = navigator.pos();
198  navigator.setHome(seedId);
199 
200  // Is the seed a local maximum?
201  bool localMaxima = checkMaxima(navigator);
202 
203  if (localMaxima)
204  {
205  // build the 5x5 taking care over which crystals //JHaupt 4-27-08 3x3 is a good option...
206  // can seed new clusters and which can't
207  prepareCluster(navigator, geometry_p);
208  }
209 
210  // If some crystals in the current vector then
211  // make them into a cluster
212  if (current_v25.size() > 0)
213  {
214  makeCluster(geometry_p, geometryES_p, seedId);
215  }
216 
217  } // End loop on seed crystals
218 
219 }
220 
223  const CaloSubdetectorGeometry *geometryES,
224  DetId seedId)
225 {
226 
227  double energy = 0;
228  double energySecond = 0.;//JHaupt 4-27-08 Added for the second crystal stream
229  double energyMax = 0.;//JHaupt 4-27-08 Added for the max crystal stream
230  double chi2 = 0;
231  DetId detFir;
232  DetId detSec;
233  //bool goodCluster = false; //JHaupt 4-27-08 Added so that some can be earased.. used another day Might not be needed as seeds are energy ordered...
234 
235 
236  std::vector<DetId>::iterator it;
237  for (it = current_v9.begin(); it != current_v9.end(); it++)
238  {
239  // Martina - check recoFlag for crystals sorrounding the good one
241  // double-check that iterator can be dereferenced
242  if(itt==recHits_->end()) continue;
243  // if rechit affected by features other than these, do not allow 2 crystal seeding either
244  // features are hard coded, for now; add severity?
245  uint32_t rhFlag = (*itt).recoFlag();
246  if (!(
247  rhFlag == EcalRecHit::kGood ||
248  rhFlag == EcalRecHit::kOutOfTime ||
249  rhFlag == EcalRecHit::kPoorCalib
250  )
251  ) continue;
252 
254 
256  EcalUncalibratedRecHit uhit_p = *ittu;
257 
258  if (uhit_p.amplitude() > energySecond ) {energySecond = uhit_p.amplitude(); detSec = uhit_p.id();}
259  if (energySecond > energyMax ) {std::swap(energySecond,energyMax); std::swap(detFir,detSec);}
260  }
261 
262  //if ((detFir.det() == DetId::Ecal) && (detFir.subdetId() == EcalEndcap)) inEB = false;
263  //We ignore the possiblity that the cluster may span into the EE
264 
265  if ((energyMax < (inEB ? ecalBarrelSingleThreshold : ecalEndcapSingleThreshold)) && (energySecond < (inEB ? ecalBarrelSecondThreshold : ecalEndcapSecondThreshold) )) return;
266 
267  for (it = current_v25.begin(); it != current_v25.end(); it++)
268  {
270  EcalRecHit hit_p = *itt;
271 
273  EcalUncalibratedRecHit uhit_p = *ittu;
274 
276  {
277  // energy fraction = 1
278  current_v25Sup.push_back( std::pair<DetId, float>( hit_p.id(), 1.) );
279  energy += hit_p.energy(); //Keep the fully corrected energy
280  chi2 += 0;
281  }
282  }
283 
284  Point position;
285  position = posCalculator_.Calculate_Location(current_v25Sup,recHits_, geometry, geometryES);
286 
287  //don't write empty clusters
288  if (energy == 0 && position == Point(0,0,0)) return;
289 
290  chi2 /= energy;
291  if (verbosity < pINFO)
292  {
293  std::cout << "JH******** NEW CLUSTER ********" << std::endl;
294  std::cout << "JHNo. of crystals = " << current_v25Sup.size() << std::endl;
295  std::cout << "JH Energy = " << energy << std::endl;
296  std::cout << "JH Phi = " << position.phi() << std::endl;
297  std::cout << "JH Eta = " << position.eta() << std::endl;
298  std::cout << "JH*****************************" << std::endl;
299  // specialize this
300 // std::cout << "JH****Emax**** "<<energyMax << " ieta " <<detFir.ieta() <<" iphi "<<detFir.ieta() << std::endl;
301 // std::cout << "JH****Esec**** "<<energySecond << " ieta " <<detSec.ieta() <<" iphi "<<detSec.ieta() << std::endl;
302  }
303  clusters_v.push_back(reco::BasicCluster(energy, position, reco::CaloID(), current_v25Sup, reco::CaloCluster::multi5x5, seedId));
304 }
305 
307 {
308 
309  bool maxima = true;
311  EcalRecHitCollection::const_iterator seedHit = recHits_->find(navigator.pos());
312  double thisEnergy = 0.;
313  double seedEnergy = seedHit->energy();
314 
315  std::vector<DetId> swissCrossVec;
316  swissCrossVec.clear();
317 
318  swissCrossVec.push_back(navigator.west());
319  navigator.home();
320  swissCrossVec.push_back(navigator.east());
321  navigator.home();
322  swissCrossVec.push_back(navigator.north());
323  navigator.home();
324  swissCrossVec.push_back(navigator.south());
325  navigator.home();
326 
327  std::vector<DetId>::const_iterator detItr;
328  for (unsigned int i = 0; i < swissCrossVec.size(); ++i)
329  {
330  thisHit = recHits_->find(swissCrossVec[i]);
331  if ((swissCrossVec[i] == DetId(0)) || thisHit == recHits_->end()) thisEnergy = 0.0;
332  else thisEnergy = thisHit->energy();
333  if (thisEnergy > seedEnergy)
334  {
335  maxima = false;
336  break;
337  }
338  }
339 
340  return maxima;
341 
342 }
343 
346 {
347 
348  DetId thisDet;
349  std::set<DetId>::iterator setItr;
350 
351  // now add the 5x5 taking care to mark the edges
352  // as able to seed and where overlapping in the central
353  // region with crystals that were previously able to seed
354  // change their status so they are not able to seed
355  //std::cout << std::endl;
356  for (int dx = -2; dx < 3; ++dx) //for (int dx = -2; dx < 3; ++dx)
357  {
358  for (int dy = -2; dy < 3; ++ dy) //for (int dy = -2; dy < 3; ++ dy)
359  {
360 
361  // navigate in free steps forming
362  // a full 5x5
363  thisDet = navigator.offsetBy(dx, dy);
364  navigator.home();
365 
366  // add the current crystal
367  //std::cout << "adding " << dx << ", " << dy << std::endl;
368 
369 
370 
371  // now consider if we are in an edge (outer 16)
372  // or central (inner 9) region
373  if ((abs(dx) > 1) || (abs(dy) > 1))
374  {
375  // this is an "edge" so should be allowed to seed
376  // provided it is not already used
377  //std::cout << " setting can seed" << std::endl;
378  addCrystal(thisDet,false); //These are in the V25
379  canSeed_s.insert(thisDet);
380  } // end if "edge"
381  else
382  {
383  // or else we are in the central 3x3
384  // and must remove any of these crystals from the canSeed set
385  setItr = canSeed_s.find(thisDet);
386  addCrystal(thisDet,true); //These are in the V9
387  if (setItr != canSeed_s.end())
388  {
389  //std::cout << " unsetting can seed" << std::endl;
390  canSeed_s.erase(setItr);
391  }
392  } // end if "centre"
393 
394 
395  } // end loop on dy
396 
397  } // end loop on dx
398 
399  //std::cout << "*** " << std::endl;
400  //std::cout << " current_v contains " << current_v.size() << std::endl;
401  //std::cout << "*** " << std::endl;
402 }
403 
404 
405 void CosmicClusterAlgo::addCrystal(const DetId &det, const bool in9)
406 {
407 
409  if ((thisIt != recHits_->end()) && (thisIt->id() != DetId(0)))
410  {
411  if ((used_s.find(thisIt->id()) == used_s.end()))
412  {
414  used_s.insert(det);
415  if ((thisIt->energy() >= -1.) && !(thisItu->chi2() < -1.))
416  {
417  if (in9) current_v9.push_back(det);
418  current_v25.push_back(det);
419  }
420 
421  }
422  }
423 
424 }
const EcalUncalibratedRecHitCollection * uncalibRecHits_
int i
Definition: DBlmapReader.cc:9
double ecalBarrelSingleThreshold
float phiPos() const
std::vector< EcalRecHit >::const_iterator const_iterator
std::vector< DetId > current_v9
std::vector< reco::BasicCluster > clusters_v
void mainSearch(const CaloSubdetectorGeometry *geometry_p, const CaloSubdetectorTopology *topology_p, const CaloSubdetectorGeometry *geometryES_p, EcalPart ecalPart)
virtual const CaloCellGeometry * getGeometry(const DetId &id) const
Get the cell geometry of a given detector id. Should return false if not found.
double ecalEndcapSingleThreshold
T offsetBy(int deltaX, int deltaY) const
Free movement of arbitray steps.
Definition: CaloNavigator.h:80
std::vector< reco::BasicCluster > makeClusters(const EcalRecHitCollection *hits, const EcalUncalibratedRecHitCollection *uncalibhits, const CaloSubdetectorGeometry *geometry, const CaloSubdetectorTopology *topology_p, const CaloSubdetectorGeometry *geometryES_p, EcalPart ecalPart, bool regional=false, const std::vector< EcalEtaPhiRegion > &regions=std::vector< EcalEtaPhiRegion >())
std::vector< std::pair< DetId, float > > current_v25Sup
T west() const
move the navigator west
Definition: CaloNavigator.h:59
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
double ecalBarrelSecondThreshold
const EcalRecHitCollection * recHits_
void prepareCluster(CaloNavigator< DetId > &navigator, const CaloSubdetectorGeometry *geometry)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
float energy() const
Definition: EcalRecHit.h:68
T south() const
move the navigator south
Definition: CaloNavigator.h:45
T pos() const
get the current position
Definition: CaloNavigator.h:32
const_iterator end() const
std::vector< EcalRecHit > seeds
T east() const
move the navigator east
Definition: CaloNavigator.h:52
void home() const
move the navigator back to the starting point
Definition: DetId.h:18
double ecalEndcapSecondThreshold
DetId id() const
get the id
Definition: EcalRecHit.h:76
void makeCluster(const CaloSubdetectorGeometry *geometry_p, const CaloSubdetectorGeometry *geometryES_p, DetId seedId)
std::vector< DetId > current_v25
VerbosityLevel verbosity
std::set< DetId > canSeed_s
ESHandle< TrackerGeometry > geometry
void addCrystal(const DetId &det, const bool in9)
iterator find(key_type k)
math::XYZPoint Calculate_Location(const HitsAndFractions &iDetIds, const edm::SortedCollection< HitType > *iRecHits, const CaloSubdetectorGeometry *iSubGeom, const CaloSubdetectorGeometry *iESGeom=0)
Definition: PositionCalc.h:68
static int position[264][3]
Definition: ReadPGInfo.cc:509
float etaPos() const
T north() const
move the navigator north
Definition: CaloNavigator.h:38
tuple cout
Definition: gather_cfg.py:145
math::XYZPoint Point
point in the space
bool checkMaxima(CaloNavigator< DetId > &navigator)
PositionCalc posCalculator_
std::set< DetId > used_s
const_iterator begin() const