CMS 3D CMS Logo

EcalClusterLazyTools.cc
Go to the documentation of this file.
2 
5 
8 
16 
20 
24 
26 
27  ebRHToken_ = token1;
28  eeRHToken_ = token2;
29 
30  getGeometry( es , false );
31  getTopology( es );
32  getEBRecHits( ev );
33  getEERecHits( ev );
35  getADCToGeV ( es );
36  getLaserDbService ( es );
37 }
38 
40 
41  ebRHToken_ = token1;
42  eeRHToken_ = token2;
43  esRHToken_ = token3;
44 
45  getGeometry( es );
46  getTopology( es );
47  getEBRecHits( ev );
48  getEERecHits( ev );
49  getESRecHits( ev );
51  getADCToGeV ( es );
52  getLaserDbService ( es );
53 }
54 
56 {}
57 
60  es.get<CaloGeometryRecord>().get(pGeometry);
61  geometry_ = pGeometry.product();
62 
63  if(doES){
65  if (geometryES) {
67  } else {
68  ecalPS_topology_.reset();
69  edm::LogInfo("subdetector geometry not available") << "EcalPreshower geometry is missing" << std::endl;
70  }
71  }
72  else {
73  ecalPS_topology_.reset();
74  }
75 }
76 
79  es.get<CaloTopologyRecord>().get(pTopology);
80  topology_ = pTopology.product();
81 }
82 
85  ev.getByToken( ebRHToken_, pEBRecHits );
86  ebRecHits_ = pEBRecHits.product();
87 }
88 
91  ev.getByToken( eeRHToken_, pEERecHits );
92  eeRecHits_ = pEERecHits.product();
93 }
94 
97  ev.getByToken( esRHToken_, pESRecHits );
98  esRecHits_ = pESRecHits.product();
99  // make the map of rechits
100  rechits_map_.clear();
101  if (pESRecHits.isValid()) {
103  for (it = pESRecHits->begin(); it != pESRecHits->end(); ++it) {
104  // remove bad ES rechits
105  std::vector<int> badf = {
106  EcalRecHit::ESFlags::kESDead, // 1
107  EcalRecHit::ESFlags::kESTwoGoodRatios,
108  EcalRecHit::ESFlags::kESBadRatioFor12, // 5
109  EcalRecHit::ESFlags::kESBadRatioFor23Upper,
110  EcalRecHit::ESFlags::kESBadRatioFor23Lower,
111  EcalRecHit::ESFlags::kESTS1Largest,
112  EcalRecHit::ESFlags::kESTS3Largest,
113  EcalRecHit::ESFlags::kESTS3Negative, // 10
114  EcalRecHit::ESFlags::kESTS13Sigmas, // 14
115  };
116 
117  if (it->checkFlags(badf)) continue;
118 
119  //Make the map of DetID, EcalRecHit pairs
120  rechits_map_.insert(std::make_pair(it->id(), *it));
121  }
122  }
123 }
124 
125 
126 
128 {
129  // get IC's
131  icalMap = &ical->getMap();
132 }
133 
134 
135 
137 {
138  // get ADCtoGeV
139  es.get<EcalADCToGeVConstantRcd>().get(agc);
140 }
141 
142 
143 
145  // transp corrections
146  es.get<EcalLaserDbRecord>().get(laser);
147 }
148 
149 
151 {
152  if ( cluster.size() == 0 ) {
153  throw cms::Exception("InvalidCluster") << "The cluster has no crystals!";
154  }
155  DetId id = (cluster.hitsAndFractions()[0]).first; // size is by definition > 0 -- FIXME??
156  const EcalRecHitCollection *recHits = nullptr;
157  if ( id.subdetId() == EcalBarrel ) {
158  recHits = ebRecHits_;
159  } else if ( id.subdetId() == EcalEndcap ) {
160  recHits = eeRecHits_;
161  } else {
162  throw cms::Exception("InvalidSubdetector") << "The subdetId() " << id.subdetId() << " does not correspond to EcalBarrel neither EcalEndcap";
163  }
164  return recHits;
165 }
166 
167 
168 // get time of basic cluster seed crystal
170 {
171 
172  const EcalRecHitCollection *recHits = getEcalRecHitCollection( cluster );
173 
174  DetId id = cluster.seed();
175  EcalRecHitCollection::const_iterator theSeedHit = recHits->find (id);
176  // std::cout << "the seed of the BC has time: "
177  //<< (*theSeedHit).time()
178  //<< "and energy: " << (*theSeedHit).energy() << " collection size: " << recHits->size()
179  //<< "\n" <<std::endl; // GF debug
180 
181  return (*theSeedHit).time();
182 }
183 
184 
185 // error-weighted average of time from constituents of basic cluster
187 {
188 
189  std::vector<std::pair<DetId, float> > clusterComponents = (cluster).hitsAndFractions() ;
190  //std::cout << "BC has this many components: " << clusterComponents.size() << std::endl; // GF debug
191 
192  const EcalRecHitCollection *recHits = getEcalRecHitCollection( cluster );
193  //std::cout << "BasicClusterClusterTime - rechits are this many: " << recHits->size() << std::endl; // GF debug
194 
195 
196  float weightedTsum = 0;
197  float sumOfWeights = 0;
198 
199  for (std::vector<std::pair<DetId, float> >::const_iterator detitr = clusterComponents.begin(); detitr != clusterComponents.end(); detitr++ )
200  {
201  // EcalRecHitCollection::const_iterator theSeedHit = recHits->find (id); // trash this
202  EcalRecHitCollection::const_iterator oneHit = recHits->find( (detitr -> first) ) ;
203 
204  // in order to get back the ADC counts from the recHit energy, three ingredients are necessary:
205  // 1) get laser correction coefficient
206  float lasercalib = 1.;
207  lasercalib = laser->getLaserCorrection( detitr->first, ev.time());
208  // 2) get intercalibration
209  EcalIntercalibConstantMap::const_iterator icalit = icalMap->find(detitr->first);
210  EcalIntercalibConstant icalconst = 1.;
211  if( icalit!=icalMap->end() ) {
212  icalconst = (*icalit);
213  // std::cout << "icalconst set to: " << icalconst << std::endl;
214  } else {
215  edm::LogError("EcalClusterLazyTools") << "No intercalib const found for xtal " << (detitr->first).rawId() << "bailing out";
216  assert(false);
217  }
218  // 3) get adc2GeV
219  float adcToGeV = 1.;
220  if ( (detitr -> first).subdetId() == EcalBarrel ) adcToGeV = float(agc->getEBValue());
221  else if ( (detitr -> first).subdetId() == EcalEndcap ) adcToGeV = float(agc->getEEValue());
222  float adc = 2.;
223  if (icalconst>0 && lasercalib>0 && adcToGeV>0) adc= (*oneHit).energy()/(icalconst*lasercalib*adcToGeV);
224 
225  // don't consider recHits with too little amplitude; take sigma_noise_total into account
226  if( (detitr -> first).subdetId() == EcalBarrel && adc< (1.1*20) ) continue;
227  if( (detitr -> first).subdetId() == EcalEndcap && adc< (2.2*20) ) continue;
228 
229  // count only on rechits whose error is trusted by the method (ratio)
230  if(! (*oneHit).isTimeErrorValid()) continue;
231 
232  float timeError = (*oneHit).timeError();
233  // the constant used to build timeError is largely over-estimated ; remove in quadrature 0.6 and add 0.15 back.
234  // could be prettier if value of constant term was changed at recHit production level
235  if (timeError>0.6) timeError = sqrt( timeError*timeError - 0.6*0.6 + 0.15*0.15);
236  else timeError = sqrt( timeError*timeError + 0.15*0.15);
237 
238  // do the error weighting
239  weightedTsum += (*oneHit).time() / (timeError*timeError);
240  sumOfWeights += 1. / (timeError*timeError);
241 
242  }
243 
244  // what if no crytal is available for weighted average?
245  if ( sumOfWeights ==0 ) return -999;
246  else return ( weightedTsum / sumOfWeights);
247 
248 }
249 
250 
251 // get BasicClusterSeedTime of the seed basic cluser of the supercluster
253 
254  return BasicClusterSeedTime ( (*cluster.seed()) );
255 
256 }
257 
258 
259 // get BasicClusterTime of the seed basic cluser of the supercluster
261 
262  return BasicClusterTime ( (*cluster.seed()) , ev);
263 
264 }
265 
266 
267 // get Preshower effective sigmaIRIR
269 {
270  if (!(fabs(cluster.eta()) > 1.6 && fabs(cluster.eta()) < 3.)) return 0.;
271 
272  if (!ecalPS_topology_) return 0.;
273 
274  std::vector<float> phoESHitsIXIX = getESHits(cluster.x(), cluster.y(), cluster.z(), rechits_map_, geometry_, ecalPS_topology_.get(), 0, 1);
275  std::vector<float> phoESHitsIYIY = getESHits(cluster.x(), cluster.y(), cluster.z(), rechits_map_, geometry_, ecalPS_topology_.get(), 0, 2);
276  float phoESShapeIXIX = getESShape(phoESHitsIXIX);
277  float phoESShapeIYIY = getESShape(phoESHitsIYIY);
278 
279  return sqrt(phoESShapeIXIX*phoESShapeIXIX + phoESShapeIYIY*phoESShapeIYIY);
280 }
281 
282 // get Preshower effective sigmaIXIX
284 {
285  if (!(fabs(cluster.eta()) > 1.6 && fabs(cluster.eta()) < 3.)) return 0.;
286 
287  if (!ecalPS_topology_) return 0.;
288 
289  std::vector<float> phoESHitsIXIX = getESHits(cluster.x(), cluster.y(), cluster.z(), rechits_map_, geometry_, ecalPS_topology_.get(), 0, 1);
290  float phoESShapeIXIX = getESShape(phoESHitsIXIX);
291 
292  return phoESShapeIXIX;
293 }
294 
295 // get Preshower effective sigmaIYIY
297 {
298  if (!(fabs(cluster.eta()) > 1.6 && fabs(cluster.eta()) < 3.)) return 0.;
299 
300  if (!ecalPS_topology_) return 0.;
301 
302  std::vector<float> phoESHitsIYIY = getESHits(cluster.x(), cluster.y(), cluster.z(), rechits_map_, geometry_, ecalPS_topology_.get(), 0, 2);
303  float phoESShapeIYIY = getESShape(phoESHitsIYIY);
304 
305  return phoESShapeIYIY;
306 }
307 
308 // get Preshower Rechits
309 std::vector<float> EcalClusterLazyToolsBase::getESHits(double X, double Y, double Z, const std::map<DetId, EcalRecHit>& _rechits_map, const CaloGeometry* geometry, CaloSubdetectorTopology const *topology_p, int row, int plane)
310 {
311  std::map<DetId, EcalRecHit> rechits_map = _rechits_map;
312  std::vector<float> esHits;
313 
314  const GlobalPoint point(X,Y,Z);
315 
317 
318  DetId esId = (dynamic_cast<const EcalPreshowerGeometry*>(geometry_p))->getClosestCellInPlane(point, plane);
319  ESDetId esDetId = (esId == DetId(0)) ? ESDetId(0) : ESDetId(esId);
320 
321  std::map<DetId, EcalRecHit>::iterator it;
322  ESDetId next;
323  ESDetId strip;
324  strip = esDetId;
325 
326  EcalPreshowerNavigator theESNav(strip, topology_p);
327  theESNav.setHome(strip);
328 
329  if (row == 1) {
330  if (plane==1 && strip != ESDetId(0)) strip = theESNav.north();
331  if (plane==2 && strip != ESDetId(0)) strip = theESNav.east();
332  } else if (row == -1) {
333  if (plane==1 && strip != ESDetId(0)) strip = theESNav.south();
334  if (plane==2 && strip != ESDetId(0)) strip = theESNav.west();
335  }
336 
337 
338  if (strip == ESDetId(0)) {
339  for (int i=0; i<31; ++i) esHits.push_back(0);
340  } else {
341  it = rechits_map.find(strip);
342  if (it != rechits_map.end() && it->second.energy() > 1.0e-10) esHits.push_back(it->second.energy());
343  else esHits.push_back(0);
344  //cout<<"center : "<<strip<<" "<<it->second.energy()<<endl;
345 
346  // Front Plane
347  if (plane==1) {
348  // east road
349  for (int i=0; i<15; ++i) {
350  next = theESNav.east();
351  if (next != ESDetId(0)) {
352  it = rechits_map.find(next);
353  if (it != rechits_map.end() && it->second.energy() > 1.0e-10) esHits.push_back(it->second.energy());
354  else esHits.push_back(0);
355  //cout<<"east "<<i<<" : "<<next<<" "<<it->second.energy()<<endl;
356  } else {
357  for (int j=i; j<15; j++) esHits.push_back(0);
358  break;
359  //cout<<"east "<<i<<" : "<<next<<" "<<0<<endl;
360  }
361  }
362 
363  // west road
364  theESNav.setHome(strip);
365  theESNav.home();
366  for (int i=0; i<15; ++i) {
367  next = theESNav.west();
368  if (next != ESDetId(0)) {
369  it = rechits_map.find(next);
370  if (it != rechits_map.end() && it->second.energy() > 1.0e-10) esHits.push_back(it->second.energy());
371  else esHits.push_back(0);
372  //cout<<"west "<<i<<" : "<<next<<" "<<it->second.energy()<<endl;
373  } else {
374  for (int j=i; j<15; j++) esHits.push_back(0);
375  break;
376  //cout<<"west "<<i<<" : "<<next<<" "<<0<<endl;
377  }
378  }
379  } // End of Front Plane
380 
381  // Rear Plane
382  if (plane==2) {
383  // north road
384  for (int i=0; i<15; ++i) {
385  next = theESNav.north();
386  if (next != ESDetId(0)) {
387  it = rechits_map.find(next);
388  if (it != rechits_map.end() && it->second.energy() > 1.0e-10) esHits.push_back(it->second.energy());
389  else esHits.push_back(0);
390  //cout<<"north "<<i<<" : "<<next<<" "<<it->second.energy()<<endl;
391  } else {
392  for (int j=i; j<15; j++) esHits.push_back(0);
393  break;
394  //cout<<"north "<<i<<" : "<<next<<" "<<0<<endl;
395  }
396  }
397 
398  // south road
399  theESNav.setHome(strip);
400  theESNav.home();
401  for (int i=0; i<15; ++i) {
402  next = theESNav.south();
403  if (next != ESDetId(0)) {
404  it = rechits_map.find(next);
405  if (it != rechits_map.end() && it->second.energy() > 1.0e-10) esHits.push_back(it->second.energy());
406  else esHits.push_back(0);
407  //cout<<"south "<<i<<" : "<<next<<" "<<it->second.energy()<<endl;
408  } else {
409  for (int j=i; j<15; j++) esHits.push_back(0);
410  break;
411  //cout<<"south "<<i<<" : "<<next<<" "<<0<<endl;
412  }
413  }
414  } // End of Rear Plane
415  } // Fill ES RecHits
416 
417  return esHits;
418 }
419 
420 
421 // get Preshower hit shape
422 float EcalClusterLazyToolsBase::getESShape(const std::vector<float>& ESHits0)
423 {
424  const int nBIN = 21;
425  float esRH[nBIN];
426  for (int idx=0; idx<nBIN; idx++) {
427  esRH[idx] = 0.;
428  }
429 
430  for(int ibin=0; ibin<((nBIN+1)/2); ibin++) {
431  if (ibin==0) {
432  esRH[(nBIN-1)/2] = ESHits0[ibin];
433  } else {
434  esRH[(nBIN-1)/2+ibin] = ESHits0[ibin];
435  esRH[(nBIN-1)/2-ibin] = ESHits0[ibin+15];
436  }
437  }
438 
439  // ---- Effective Energy Deposit Width ---- //
440  double EffWidthSigmaISIS = 0.;
441  double totalEnergyISIS = 0.;
442  double EffStatsISIS = 0.;
443  for (int id_X=0; id_X<21; id_X++) {
444  totalEnergyISIS += esRH[id_X];
445  EffStatsISIS += esRH[id_X]*(id_X-10)*(id_X-10);
446  }
447  EffWidthSigmaISIS = (totalEnergyISIS>0.) ? sqrt(fabs(EffStatsISIS / totalEnergyISIS)) : 0.;
448 
449  return EffWidthSigmaISIS;
450 }
int adc(sample_type sample)
get the ADC sample (12 bits)
edm::ESHandle< EcalIntercalibConstants > ical
const CaloSubdetectorGeometry * getSubdetectorGeometry(const DetId &id) const
access the subdetector geometry for the given subdetector directly
Definition: CaloGeometry.cc:49
const CaloGeometry * geometry_
const EcalRecHitCollection * esRecHits_
edm::EDGetTokenT< EcalRecHitCollection > eeRHToken_
std::vector< float > getESHits(double X, double Y, double Z, const std::map< DetId, EcalRecHit > &rechits_map, const CaloGeometry *geometry, CaloSubdetectorTopology const *topology_p, int row=0, int plane=1)
float SuperClusterSeedTime(const reco::SuperCluster &cluster)
float BasicClusterTime(const reco::BasicCluster &cluster, const edm::Event &ev)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:579
float SuperClusterTime(const reco::SuperCluster &cluster, const edm::Event &ev)
const EcalRecHitCollection * getEcalRecHitCollection(const reco::BasicCluster &cluster)
float getESShape(const std::vector< float > &ESHits0)
float getLaserCorrection(DetId const &xid, edm::Timestamp const &iTime) const
std::vector< EcalRecHit >::const_iterator const_iterator
const EcalIntercalibConstantMap * icalMap
#define X(str)
Definition: MuonsGrabber.cc:48
void getADCToGeV(const edm::EventSetup &es)
bool ev
const EcalRecHitCollection * ebRecHits_
float eseffsixix(const reco::SuperCluster &cluster)
void getIntercalibConstants(const edm::EventSetup &es)
double z() const
z coordinate of cluster centroid
Definition: CaloCluster.h:163
double eta() const
pseudorapidity of cluster centroid
Definition: CaloCluster.h:166
void setHome(const T &startingPoint)
set the starting position
edm::ESHandle< EcalADCToGeVConstant > agc
T west() const
move the navigator west
Definition: CaloNavigator.h:59
T sqrt(T t)
Definition: SSEVec.h:18
EcalClusterLazyToolsBase(const edm::Event &ev, const edm::EventSetup &es, edm::EDGetTokenT< EcalRecHitCollection > token1, edm::EDGetTokenT< EcalRecHitCollection > token2)
double x() const
x coordinate of cluster centroid
Definition: CaloCluster.h:157
T south() const
move the navigator south
Definition: CaloNavigator.h:45
void getESRecHits(const edm::Event &ev)
bool isValid() const
Definition: HandleBase.h:74
edm::EDGetTokenT< EcalRecHitCollection > esRHToken_
const_iterator end() const
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
float eseffsiyiy(const reco::SuperCluster &cluster)
std::shared_ptr< CaloSubdetectorTopology const > ecalPS_topology_
T const * product() const
Definition: Handle.h:81
void getTopology(const edm::EventSetup &es)
std::vector< Item >::const_iterator const_iterator
void getEBRecHits(const edm::Event &ev)
edm::EDGetTokenT< EcalRecHitCollection > ebRHToken_
iterator find(key_type k)
void getLaserDbService(const edm::EventSetup &es)
T get() const
Definition: EventSetup.h:63
const EcalRecHitCollection * eeRecHits_
const_iterator find(uint32_t rawId) const
T north() const
move the navigator north
Definition: CaloNavigator.h:38
const_iterator end() const
const CaloClusterPtr & seed() const
seed BasicCluster
Definition: SuperCluster.h:66
double y() const
y coordinate of cluster centroid
Definition: CaloCluster.h:160
void getEERecHits(const edm::Event &ev)
std::map< DetId, EcalRecHit > rechits_map_
void getGeometry(const edm::EventSetup &es, bool doES=true)
T const * product() const
Definition: ESHandle.h:86
edm::ESHandle< EcalLaserDbService > laser
edm::Timestamp time() const
Definition: EventBase.h:61
float BasicClusterSeedTime(const reco::BasicCluster &cluster)
*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
const CaloTopology * topology_
float EcalIntercalibConstant
float eseffsirir(const reco::SuperCluster &cluster)