ATLAS Offline Software
JetCaloEnergies.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
9 
11 #include "PFlowUtils/FEHelpers.h"
12 
14 #include "xAODPFlow/PFO.h"
15 #include "xAODPFlow/FlowElement.h"
16 
17 #include <memory>
18 #include <vector>
19 
20 //**********************************************************************
21 
23 : AsgTool(name) { }
24 
25 //**********************************************************************
26 
27 bool JetCaloEnergies::isInVector(const std::string& key, const std::vector<std::string>& calculations) {
28  // Split key to get back the actual handle key
29  std::vector<std::string> split;
30  std::string sub_string;
31  std::istringstream tokenStream(key);
32 
33  while (std::getline(tokenStream, sub_string, '.'))
34  {
35  split.push_back(sub_string);
36  }
37 
38  // Return true if handle key in list of calculations
39  return std::find(calculations.begin(), calculations.end(), split[1]) != calculations.end();
40 }
41 
43  ATH_MSG_INFO("Initializing JetCaloEnergies " << name());
44 
45  if(m_jetContainerName.empty()){
46  ATH_MSG_ERROR("JetCaloEnergies needs to have its input jet container configured!");
47  return StatusCode::FAILURE;
48  }
49 
59 
70  }
71 
72  // Init calo based variables if necessary
80 
82 
85 
86  // Init standard variables if necessary
87  ATH_CHECK(m_ePerSamplingKey.initialize());
88  ATH_CHECK(m_emFracKey.initialize());
89  ATH_CHECK(m_hecFracKey.initialize());
90  ATH_CHECK(m_psFracKey.initialize());
96 
97  return StatusCode::SUCCESS;
98 }
99 
100 //**********************************************************************
101 
103  ATH_MSG_VERBOSE("Begin decorating jets.");
104  for(const xAOD::Jet* jet : jets) {
106  size_t numConstit = jet->numConstituents();
107  ePerSamplingHandle(*jet) = std::vector<float>(CaloSampling::Unknown, 0.);
108  std::vector<float>& ePerSampling = ePerSamplingHandle(*jet);
109  for ( float& e : ePerSampling ) e = 0.0; // re-initialize
110 
111  if ( numConstit == 0 ) {
112  ATH_MSG_VERBOSE("Jet has no constituents.");
113  continue;
114  }
115 
116  // should find a more robust solution than using 1st constit type.
117  xAOD::Type::ObjectType ctype = jet->rawConstituent( 0 )->type();
118  if ( ctype == xAOD::Type::CaloCluster ) {
119  ATH_MSG_VERBOSE(" Constituents are calo clusters.");
120  fillEperSamplingCluster(*jet, ePerSampling);
121 
122  } else if (ctype == xAOD::Type::ParticleFlow) {
123  ATH_MSG_VERBOSE(" Constituents are pflow objects.");
124  fillEperSamplingPFO(*jet, ePerSampling);
125 
126  } else if (ctype == xAOD::Type::FlowElement) {
127  ATH_MSG_VERBOSE(" Constituents are FlowElements.");
128  fillEperSamplingFE(*jet, ePerSampling);
129 
130  // In addition, calculate variables using the underlying cluster rather than
131  // the energy-subtracted FlowElements (improved implementation)
133  ATH_MSG_VERBOSE(" Constituents are FlowElements - Additional calculation");
134 
136  ePerSamplingClusterHandle(*jet) = std::vector<float>(CaloSampling::Unknown, 0.);
137  std::vector<float>& ePerSamplingCluster = ePerSamplingClusterHandle(*jet);
138  for ( float& e : ePerSamplingCluster ) e = 0.0; // re-initialize
139 
140  fillEperSamplingFEClusterBased(*jet, ePerSamplingCluster);
141  }
142 
143  }else {
144  ATH_MSG_VERBOSE("Constituents are not CaloClusters, PFOs, or FlowElements.");
145  }
146 
147  }
148  return StatusCode::SUCCESS;
149 }
150 
151 void JetCaloEnergies::fillEperSamplingCluster(const xAOD::Jet& jet, std::vector<float> & ePerSampling ) const {
152  // loop over raw constituents
153  size_t numConstit = jet.numConstituents();
154  for ( size_t i=0; i<numConstit; i++ ) {
155  if(jet.rawConstituent(i)->type()!=xAOD::Type::CaloCluster) {
156  ATH_MSG_WARNING("Tried to call fillEperSamplingCluster with a jet constituent that is not a cluster!");
157  continue;
158  }
159  const xAOD::CaloCluster* constit = static_cast<const xAOD::CaloCluster*>(jet.rawConstituent(i));
160  for ( size_t s= CaloSampling::PreSamplerB; s< CaloSampling::Unknown; s++ ) {
161  ePerSampling[s] += constit->eSample( (xAOD::CaloCluster::CaloSample) s );
162  }
163  }
164 
165  double fracSamplingMax = -999999999.;
166  int fracSamplingMaxIndex = -1;
167  double sumE_samplings = 0.0;
168 
170  for(unsigned int i = 0; i < ePerSampling.size(); ++i){
171  double e = ePerSampling[i];
172  sumE_samplings += e;
173  if (e>fracSamplingMax){
174  fracSamplingMax=e;
175  fracSamplingMaxIndex = i;
176  }
177  }
178  }
179 
183 
184  emFracHandle(jet) = jet::JetCaloQualityUtils::emFraction( ePerSampling );
185  hecFracHandle(jet) = jet::JetCaloQualityUtils::hecF( &jet );
187 
190  fracSamplingMaxHandle(jet) = sumE_samplings != 0. ? fracSamplingMax/sumE_samplings : 0.;
192  fracSamplingMaxIndexHandle(jet) = fracSamplingMaxIndex;
193  }
194 }
195 
196 #define FillESamplingPFO( LAYERNAME ) \
197  float E_##LAYERNAME = 0.0; \
198  if (constit->attribute(xAOD::PFODetails::eflowRec_LAYERENERGY_##LAYERNAME, E_##LAYERNAME)) { \
199  ePerSampling[CaloSampling::LAYERNAME] += E_##LAYERNAME; \
200  }
201 
202 void JetCaloEnergies::fillEperSamplingPFO(const xAOD::Jet & jet, std::vector<float> & ePerSampling ) const {
203 
204  float emTot=0;
205  float hecTot=0;
206  float eTot =0;
207  size_t numConstit = jet.numConstituents();
208 
209  for ( size_t i=0; i<numConstit; i++ ) {
210  if (jet.rawConstituent(i)->type()==xAOD::Type::ParticleFlow){
211  const xAOD::PFO* constit = static_cast<const xAOD::PFO*>(jet.rawConstituent(i));
212  if ( fabs(constit->charge())>FLT_MIN ){
213  eTot += constit->track(0)->e();
214  } else {
215  eTot += constit->e();
220 
225 
230 
234 
238 
242 
246 
247  FillESamplingPFO(MINIFCAL0);
248  FillESamplingPFO(MINIFCAL1);
249  FillESamplingPFO(MINIFCAL2);
250  FillESamplingPFO(MINIFCAL3);
251 
252  emTot += ( E_PreSamplerB+E_EMB1+E_EMB2+E_EMB3+
253  E_PreSamplerE+E_EME1+E_EME2+E_EME3+
254  E_FCAL0 );
255  hecTot += ( E_HEC0+E_HEC1+E_HEC2+E_HEC3 );
256 
257  }//only consider neutral PFO
258  } else {
259  ATH_MSG_WARNING("Tried to call fillEperSamplingPFlow with a jet constituent that is not a PFO!");
260  }
261  }
262 
264  if(eTot != 0.0){
265  emFracHandle(jet) = emTot/eTot;
266  /*
267  * Ratio of EM layer calorimeter energy of neutrals to sum of all constituents
268  * at EM scale (note charged PFO have an EM scale at track scale, and charged weights are ignored)
269  * */
270  }
271  else {
272  emFracHandle(jet) = 0.;
273  }
274 
276  if (eTot != 0.0){
277  hecFracHandle(jet) = hecTot/eTot;
278  }
279  else{
280  hecFracHandle(jet) = 0.;
281  }
282 
283 }
284 
285 // R21 way of calculating energy-per-layer using directly the FE decorations
286 // In R21, the link from PFOs to clusters was broken and thus energy after charged subtraction was used
287 void JetCaloEnergies::fillEperSamplingFE(const xAOD::Jet& jet, std::vector<float> & ePerSampling ) const {
288  float emTot = 0.;
289  float em3Tot = 0.;
290  float hecTot = 0.;
291  float psTot = 0.;
292  float tile0Tot = 0.;
293  float eTot = 0.;
294  float e2Tot = 0.;
295  size_t numConstit = jet.numConstituents();
296 
297  std::vector<int> indicesNeutralFE;
298  std::vector<int> indicesChargedFE;
299 
300  for ( size_t i=0; i<numConstit; i++ ) {
301  if(jet.rawConstituent(i)->type()!=xAOD::Type::FlowElement) {
302  ATH_MSG_WARNING("Tried to call fillEperSamplingFE with a jet constituent that is not a FlowElement!");
303  continue;
304  }
305  const xAOD::FlowElement* constit = static_cast<const xAOD::FlowElement*>(jet.rawConstituent(i));
306 
307  // Need to distinguish two cases:
308  // (1) Jet is a PFlow jet (constituents are charged or neutral FEs) or
309  // (2) Jet is a UFO jet (need to get the underlying charged and neutral FEs first)
310 
311  //For PFlow jets, we can directly get the information from the constituent
312  if(constit->signalType() & xAOD::FlowElement::PFlow){
313 
314  //Charged FlowElements:
315  if(constit->isCharged()){
316  eTot += constit->chargedObject(0)->e();
317  e2Tot += constit->chargedObject(0)->e()*constit->chargedObject(0)->e();
318  }
319  //Neutral FlowElements
320  else{
321  eTot += constit->e();
322  e2Tot += constit->e()*constit->e();
323  //Get the energy-per-layer information from the FE, not the underlying cluster (i.e. after subtraction)
324  std::vector<float> constitEPerSampling = FEHelpers::getEnergiesPerSampling(*constit);
325  for ( size_t s = CaloSampling::PreSamplerB; s < CaloSampling::Unknown; s++ ) {
326  ePerSampling[s] += constitEPerSampling[s];
327  }
328  emTot += (constitEPerSampling[CaloSampling::PreSamplerB] + constitEPerSampling[CaloSampling::EMB1]
329  + constitEPerSampling[CaloSampling::EMB2] + constitEPerSampling[CaloSampling::EMB3]
330  + constitEPerSampling[CaloSampling::PreSamplerE] + constitEPerSampling[CaloSampling::EME1]
331  + constitEPerSampling[CaloSampling::EME2] + constitEPerSampling[CaloSampling::EME3]
332  + constitEPerSampling[CaloSampling::FCAL0]);
333 
334  hecTot += (constitEPerSampling[CaloSampling::HEC0] + constitEPerSampling[CaloSampling::HEC1]
335  + constitEPerSampling[CaloSampling::HEC2] + constitEPerSampling[CaloSampling::HEC3]);
336 
337  psTot += (constitEPerSampling[CaloSampling::PreSamplerB] + constitEPerSampling[CaloSampling::PreSamplerE]);
338 
339  em3Tot += (constitEPerSampling[CaloSampling::EMB3] + constitEPerSampling[CaloSampling::EME3]);
340 
341  tile0Tot += (constitEPerSampling[CaloSampling::TileBar0] + constitEPerSampling[CaloSampling::TileExt0]);
342  }
343  }
344  else{
345  //For UFO jets, we first need to get the charged and neutral FE + corresponding energy from combined UFOs
346 
347  // UFO is simply a charged FlowElement
348  if(constit->signalType() == xAOD::FlowElement::Charged){
349  eTot += constit->chargedObject(0)->e();
350  e2Tot += constit->chargedObject(0)->e()*constit->chargedObject(0)->e();
351  }
352  //UFO is simply a neutral Flowelement
353  else if(constit->signalType() == xAOD::FlowElement::Neutral){
354  // For neutral UFOs, there is only one "other object" stored which is the neutral FE
355  // Protection in case there is something wrong with this FE
356  if(constit->otherObjects().size() != 1 || !constit->otherObject(0)){
357  continue;
358  }
359 
360  // Cast other object as FlowElement
361  const xAOD::FlowElement* nFE = static_cast<const xAOD::FlowElement*>(constit->otherObject(0));
362 
363  eTot += nFE->e();
364  e2Tot += nFE->e()*nFE->e();
365 
366  std::vector<float> neutralEPerSampling = FEHelpers::getEnergiesPerSampling(*nFE);
367  for ( size_t s = CaloSampling::PreSamplerB; s < CaloSampling::Unknown; s++ ) {
368  ePerSampling[s] += neutralEPerSampling[s];
369  }
370  emTot += (neutralEPerSampling[CaloSampling::PreSamplerB] + neutralEPerSampling[CaloSampling::EMB1]
371  + neutralEPerSampling[CaloSampling::EMB2] + neutralEPerSampling[CaloSampling::EMB3]
372  + neutralEPerSampling[CaloSampling::PreSamplerE] + neutralEPerSampling[CaloSampling::EME1]
373  + neutralEPerSampling[CaloSampling::EME2] + neutralEPerSampling[CaloSampling::EME3]
374  + neutralEPerSampling[CaloSampling::FCAL0]);
375 
376  hecTot += (neutralEPerSampling[CaloSampling::HEC0] + neutralEPerSampling[CaloSampling::HEC1]
377  + neutralEPerSampling[CaloSampling::HEC2] + neutralEPerSampling[CaloSampling::HEC3]);
378 
379  psTot += (neutralEPerSampling[CaloSampling::PreSamplerB] + neutralEPerSampling[CaloSampling::PreSamplerE]);
380 
381  em3Tot += (neutralEPerSampling[CaloSampling::EMB3] + neutralEPerSampling[CaloSampling::EME3]);
382 
383  tile0Tot += (neutralEPerSampling[CaloSampling::TileBar0] + neutralEPerSampling[CaloSampling::TileExt0]);
384  }
385  else if(constit->signalType() == xAOD::FlowElement::Combined){
386  // For the combined UFOs, otherObjects are neutral or charged FEs
387  // matched to this tracks (via track-to-cluster extrapolation)
388  for (size_t n = 0; n < constit->otherObjects().size(); ++n) {
389  if(! constit->otherObject(n)) continue;
390  const xAOD::FlowElement* FE_from_combined = static_cast<const xAOD::FlowElement*>(constit->otherObject(n));
391 
392  //Charged FE (add energy to total energy only)
393  if(FE_from_combined->isCharged()){
394  if(std::find(indicesChargedFE.begin(), indicesChargedFE.end(), FE_from_combined->index()) == indicesChargedFE.end()){
395  eTot += FE_from_combined->e();
396  e2Tot += FE_from_combined->e()*FE_from_combined->e();
397  indicesChargedFE.push_back(FE_from_combined->index());
398  }
399  continue;
400  }
401  //Neutral FE:
402  //One neutral FE can be matched to various tracks and therefore be used for several UFOs
403  //We do not want to double count the energy and only add it once
404  if(std::find(indicesNeutralFE.begin(), indicesNeutralFE.end(), FE_from_combined->index()) == indicesNeutralFE.end()){
405  eTot += FE_from_combined->e();
406  e2Tot += FE_from_combined->e()*FE_from_combined->e();
407  std::vector<float> neutralFromCombEPerSampling = FEHelpers::getEnergiesPerSampling(*FE_from_combined);
408  for ( size_t s = CaloSampling::PreSamplerB; s < CaloSampling::Unknown; s++ ) {
409  ePerSampling[s] += neutralFromCombEPerSampling[s];
410  }
411  emTot += (neutralFromCombEPerSampling[CaloSampling::PreSamplerB] + neutralFromCombEPerSampling[CaloSampling::EMB1]
412  + neutralFromCombEPerSampling[CaloSampling::EMB2] + neutralFromCombEPerSampling[CaloSampling::EMB3]
413  + neutralFromCombEPerSampling[CaloSampling::PreSamplerE] + neutralFromCombEPerSampling[CaloSampling::EME1]
414  + neutralFromCombEPerSampling[CaloSampling::EME2] + neutralFromCombEPerSampling[CaloSampling::EME3]
415  + neutralFromCombEPerSampling[CaloSampling::FCAL0]);
416 
417  hecTot += (neutralFromCombEPerSampling[CaloSampling::HEC0] + neutralFromCombEPerSampling[CaloSampling::HEC1]
418  + neutralFromCombEPerSampling[CaloSampling::HEC2] + neutralFromCombEPerSampling[CaloSampling::HEC3]);
419 
420  psTot += (neutralFromCombEPerSampling[CaloSampling::PreSamplerB] + neutralFromCombEPerSampling[CaloSampling::PreSamplerE]);
421 
422  em3Tot += (neutralFromCombEPerSampling[CaloSampling::EMB3] + neutralFromCombEPerSampling[CaloSampling::EME3]);
423 
424  tile0Tot += (neutralFromCombEPerSampling[CaloSampling::TileBar0] + neutralFromCombEPerSampling[CaloSampling::TileExt0]);
425 
426  indicesNeutralFE.push_back(FE_from_combined->index());
427  }
428  }
429  }
430  }
431  }
432 
433  double fracSamplingMax = -999999999.;
434  int fracSamplingMaxIndex = -1;
435  double sumE_samplings = 0.0;
436 
438  for(unsigned int i = 0; i < ePerSampling.size(); ++i){
439  double e = ePerSampling[i];
440  sumE_samplings += e;
441  if (e>fracSamplingMax){
442  fracSamplingMax=e;
443  fracSamplingMaxIndex = i;
444  }
445  }
446  }
447 
448  for( const std::string & calcN : m_calculationNames){
449  if ( calcN == "EMFrac" ) {
451  emFracHandle(jet) = eTot != 0. ? emTot/eTot : 0.;
452  } else if ( calcN == "HECFrac" ) {
454  hecFracHandle(jet) = eTot != 0. ? hecTot/eTot : 0.;
455  } else if ( calcN == "PSFrac" ) {
457  psFracHandle(jet) = eTot != 0. ? psTot/eTot : 0.;
458  } else if ( calcN == "EM3Frac" ) {
460  em3FracHandle(jet) = eTot != 0. ? em3Tot/eTot : 0.;
461  } else if ( calcN == "Tile0Frac" ) {
463  tile0FracHandle(jet) = eTot != 0. ? tile0Tot/eTot : 0.;
464  } else if ( calcN == "EffNClusts" ) {
466  effNClustsFracHandle(jet) = eTot != 0. ? std::sqrt(eTot*eTot/e2Tot) : 0.;
467  } else if ( calcN == "FracSamplingMax" ){
469  fracSamplingMaxHandle(jet) = sumE_samplings != 0. ? fracSamplingMax/sumE_samplings : 0.;
471  fracSamplingMaxIndexHandle(jet) = fracSamplingMaxIndex;
472  }
473  }
474 }
475 
476 
477 // New way of calculating energy per layer for FE-based jets
478 // The underlying cluster is used to calculate the variables rather than the energy-subtracted FE
479 void JetCaloEnergies::fillEperSamplingFEClusterBased(const xAOD::Jet& jet, std::vector<float> & ePerSampling ) const {
480  float emTot = 0.;
481  float em3Tot = 0.;
482  float hecTot = 0.;
483  float psTot = 0.;
484  float tile0Tot = 0.;
485  float eTot = 0.;
486  float e2Tot = 0.;
487  size_t numConstit = jet.numConstituents();
488  std::unique_ptr<std::vector<const xAOD::CaloCluster*> > constitV_tot = std::make_unique<std::vector<const xAOD::CaloCluster*>>();
489 
490  for ( size_t i=0; i<numConstit; i++ ) {
491  if(jet.rawConstituent(i)->type()!=xAOD::Type::FlowElement) {
492  ATH_MSG_WARNING("Tried to call fillEperSamplingFE with a jet constituent that is not a FlowElement!");
493  continue;
494  }
495  const xAOD::FlowElement* constit = static_cast<const xAOD::FlowElement*>(jet.rawConstituent(i));
496 
497  for (size_t n = 0; n < constit->otherObjects().size(); ++n) {
498  if(! constit->otherObject(n)) continue;
499  int index_pfo = constit->otherObject(n)->index();
500  if(index_pfo<0) continue;
501 
502  const auto* fe = (constit->otherObject(n));
503  const xAOD::CaloCluster* cluster = nullptr;
504 
505  //If we have a cluster, we can directly access the calorimeter information
506  if(fe->type() == xAOD::Type::CaloCluster){
507  cluster = dynamic_cast<const xAOD::CaloCluster*> (fe);
508  }
509  //If we have a PFO, we should still get the associated cluster first
510  else {
511  const xAOD::FlowElement* pfo = dynamic_cast<const xAOD::FlowElement*>(fe);
512  if(!pfo->otherObjects().empty() && pfo->otherObject(0) && pfo->otherObject(0)->type() == xAOD::Type::CaloCluster){
513  cluster = dynamic_cast<const xAOD::CaloCluster*> (pfo->otherObject(0));
514  }
515  }
516  if(!cluster) continue;
517 
518  if(std::find(constitV_tot->begin(), constitV_tot->end(), cluster) == constitV_tot->end()){
519  for ( size_t s= CaloSampling::PreSamplerB; s< CaloSampling::Unknown; s++ ) {
520  ePerSampling[s] += cluster->eSample( (xAOD::CaloCluster::CaloSample) s );
521  }
522  eTot += cluster->rawE();
523  e2Tot += cluster->rawE()*cluster->rawE();
524 
525  emTot += (cluster->eSample( CaloSampling::PreSamplerB) + cluster->eSample( CaloSampling::EMB1)
526  + cluster->eSample( CaloSampling::EMB2) + cluster->eSample( CaloSampling::EMB3)
528  + cluster->eSample( CaloSampling::EME2) + cluster->eSample( CaloSampling::EME3)
529  + cluster->eSample( CaloSampling::FCAL0));
530 
531  hecTot += (cluster->eSample( CaloSampling::HEC0) + cluster->eSample( CaloSampling::HEC1)
532  + cluster->eSample( CaloSampling::HEC2) + cluster->eSample( CaloSampling::HEC3));
533 
534  psTot += (cluster->eSample( CaloSampling::PreSamplerB) + cluster->eSample( CaloSampling::PreSamplerE));
535 
536  em3Tot += (cluster->eSample( CaloSampling::EMB3) + cluster->eSample( CaloSampling::EME3));
537 
538  tile0Tot += (cluster->eSample( CaloSampling::TileBar0) + cluster->eSample( CaloSampling::TileExt0));
539 
540  constitV_tot->push_back(cluster);
541  }
542  }
543  }
544 
545  float fracSamplingMax = -999999999.;
546  int fracSamplingMaxIndex = -1;
547  float sumE_samplings = 0.0;
548 
550  for(unsigned int i = 0; i < ePerSampling.size(); ++i){
551  float e = ePerSampling[i];
552  sumE_samplings += e;
553  if (e>fracSamplingMax){
554  fracSamplingMax=e;
555  fracSamplingMaxIndex = i;
556  }
557  }
558  }
559 
560  for( const std::string & calcN : m_calculationNames){
561  if ( calcN == "EMFrac" ) {
563  emFracClusterHandle(jet) = eTot != 0. ? emTot/eTot : 0.;
564  } else if ( calcN == "HECFrac" ) {
566  hecFracClusterHandle(jet) = eTot != 0. ? hecTot/eTot : 0.;
567  } else if ( calcN == "PSFrac" ) {
569  psFracClusterHandle(jet) = eTot != 0. ? psTot/eTot : 0.;
570  } else if ( calcN == "EM3Frac" ) {
572  em3FracClusterHandle(jet) = eTot != 0. ? em3Tot/eTot : 0.;
573  } else if ( calcN == "Tile0Frac" ) {
575  tile0FracClusterHandle(jet) = eTot != 0. ? tile0Tot/eTot : 0.;
576  } else if ( calcN == "EffNClusts" ) {
578  effNClustsFracClusterHandle(jet) = eTot != 0. ? std::sqrt(eTot*eTot/e2Tot) : 0.;
579  } else if ( calcN == "FracSamplingMax" ){
581  fracSamplingMaxClusterHandle(jet) = sumE_samplings != 0. ? fracSamplingMax/sumE_samplings : 0.;
583  fracSamplingMaxIndexClusterHandle(jet) = fracSamplingMaxIndex;
584  }
585  }
586 
587 }
JetCaloEnergies::m_fracSamplingMaxClusterKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_fracSamplingMaxClusterKey
Definition: JetCaloEnergies.h:58
JetCaloEnergies::isInVector
bool isInVector(const std::string &key, const std::vector< std::string > &calculations)
Definition: JetCaloEnergies.cxx:27
xAOD::CaloCluster_v1::rawE
flt_t rawE() const
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
GetLCDefs::Unknown
@ Unknown
Definition: GetLCDefs.h:21
FEHelpers.h
JetCaloEnergies::m_effNClustsFracKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_effNClustsFracKey
Definition: JetCaloEnergies.h:46
xAOD::FlowElement_v1::Neutral
@ Neutral
Definition: FlowElement_v1.h:37
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
CaloCell_ID_FCS::TileExt2
@ TileExt2
Definition: FastCaloSim_CaloCell_ID.h:39
constants.EMB1
int EMB1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:53
JetCaloEnergies::m_jetContainerName
Gaudi::Property< std::string > m_jetContainerName
Definition: JetCaloEnergies.h:37
JetCaloEnergies::fillEperSamplingPFO
void fillEperSamplingPFO(const xAOD::Jet &jet, std::vector< float > &ePerSampling) const
Definition: JetCaloEnergies.cxx:202
xAOD::FlowElement_v1::Charged
@ Charged
Definition: FlowElement_v1.h:38
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
ObjectType
ObjectType
Definition: BaseObject.h:11
CaloCell_ID_FCS::TileExt0
@ TileExt0
Definition: FastCaloSim_CaloCell_ID.h:37
xAOD::PFO_v1::track
const TrackParticle * track(unsigned int index) const
Retrieve a const pointer to a Rec::TrackParticle.
Definition: PFO_v1.cxx:691
CaloCell_ID_FCS::TileBar1
@ TileBar1
Definition: FastCaloSim_CaloCell_ID.h:32
JetCaloEnergies::m_em3FracClusterKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_em3FracClusterKey
Definition: JetCaloEnergies.h:55
JetCaloEnergies::JetCaloEnergies
JetCaloEnergies(const std::string &t)
Definition: JetCaloEnergies.cxx:22
JetCaloEnergies::initialize
virtual StatusCode initialize() override
Dummy implementation of the initialisation function.
Definition: JetCaloEnergies.cxx:42
JetCaloEnergies::m_doFracSamplingMax
bool m_doFracSamplingMax
Definition: JetCaloEnergies.h:33
CaloCell_ID_FCS::FCAL1
@ FCAL1
Definition: FastCaloSim_CaloCell_ID.h:41
JetCaloEnergies::m_fracSamplingMaxIndexKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_fracSamplingMaxIndexKey
Definition: JetCaloEnergies.h:48
xAOD::IParticle::type
virtual Type::ObjectType type() const =0
The type of the object as a simple enumeration.
JetCaloEnergies::fillEperSamplingFE
void fillEperSamplingFE(const xAOD::Jet &jet, std::vector< float > &ePerSampling) const
Definition: JetCaloEnergies.cxx:287
CaloCell_ID_FCS::HEC2
@ HEC2
Definition: FastCaloSim_CaloCell_ID.h:29
IDTPM::eTot
float eTot(const U &p)
Accessor utility function for getting the value of Energy.
Definition: TrackParametersHelper.h:116
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
JetCaloEnergies::decorate
virtual StatusCode decorate(const xAOD::JetContainer &jets) const override
Decorate a jet collection without otherwise modifying it.
Definition: JetCaloEnergies.cxx:102
FEHelpers::getEnergiesPerSampling
std::vector< float > getEnergiesPerSampling(const xAOD::FlowElement &fe)
Definition: FEHelpers.cxx:78
CaloCell_ID_FCS::TileGap3
@ TileGap3
Definition: FastCaloSim_CaloCell_ID.h:36
JetCaloEnergies::m_tile0FracKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_tile0FracKey
Definition: JetCaloEnergies.h:45
JetAccessorMap.h
xAOD::CaloCluster
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Definition: Event/xAOD/xAODCaloEvent/xAODCaloEvent/CaloCluster.h:19
JetCaloEnergies::m_ePerSamplingKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_ePerSamplingKey
Definition: JetCaloEnergies.h:40
JetCaloEnergies::m_psFracClusterKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_psFracClusterKey
Definition: JetCaloEnergies.h:54
JetCaloEnergies::m_ePerSamplingClusterKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_ePerSamplingClusterKey
Definition: JetCaloEnergies.h:51
xAOD::FlowElement_v1::PFlow
@ PFlow
Definition: FlowElement_v1.h:45
xAOD::PFO_v1::e
virtual double e() const
The total energy of the particle.
Definition: PFO_v1.cxx:81
xAOD::FlowElement_v1::isCharged
bool isCharged() const
Definition: FlowElement_v1.cxx:56
PFO.h
JetCaloEnergies::m_hecFracClusterKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_hecFracClusterKey
Definition: JetCaloEnergies.h:53
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:59
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
CaloCell_ID_FCS::HEC1
@ HEC1
Definition: FastCaloSim_CaloCell_ID.h:28
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
constants.EMB2
int EMB2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:54
FlowElement.h
lumiFormat.i
int i
Definition: lumiFormat.py:85
CaloSampling::CaloSample
CaloSample
Definition: Calorimeter/CaloGeoHelpers/CaloGeoHelpers/CaloSampling.h:22
CaloCluster.h
CaloCell_ID_FCS::TileBar0
@ TileBar0
Definition: FastCaloSim_CaloCell_ID.h:31
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
CaloCell_ID_FCS::TileGap2
@ TileGap2
Definition: FastCaloSim_CaloCell_ID.h:35
xAOD::FlowElement
FlowElement_v1 FlowElement
Definition of the current "pfo version".
Definition: FlowElement.h:16
JetCaloEnergies::m_fracSamplingMaxKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_fracSamplingMaxKey
Definition: JetCaloEnergies.h:47
SG::WriteDecorHandle
Handle class for adding a decoration to an object.
Definition: StoreGate/StoreGate/WriteDecorHandle.h:100
xAOD::PFO_v1::charge
float charge() const
get charge of PFO
xAOD::FlowElement_v1::signalType
signal_t signalType() const
JetCaloEnergies::m_fracSamplingMaxIndexClusterKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_fracSamplingMaxIndexClusterKey
Definition: JetCaloEnergies.h:59
constants.EME1
int EME1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:55
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAODType::ParticleFlow
@ ParticleFlow
The object is a particle-flow object.
Definition: ObjectType.h:41
SG::AuxElement::index
size_t index() const
Return the index of this element within its container.
JetCaloEnergies::m_tile0FracClusterKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_tile0FracClusterKey
Definition: JetCaloEnergies.h:56
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
CaloCell_ID_FCS::TileGap1
@ TileGap1
Definition: FastCaloSim_CaloCell_ID.h:34
WriteDecorHandle.h
Handle class for adding a decoration to an object.
FillESamplingPFO
#define FillESamplingPFO(LAYERNAME)
Definition: JetCaloEnergies.cxx:196
xAOD::FlowElement_v1::chargedObject
const xAOD::IParticle * chargedObject(std::size_t i) const
Definition: FlowElement_v1.cxx:127
xAOD::PFO_v1
Class describing a particle flow object.
Definition: PFO_v1.h:35
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:221
CaloCell_ID_FCS::TileExt1
@ TileExt1
Definition: FastCaloSim_CaloCell_ID.h:38
CaloCell_ID_FCS::EME3
@ EME3
Definition: FastCaloSim_CaloCell_ID.h:26
xAOD::FlowElement_v1::e
virtual double e() const override
The total energy of the particle.
Definition: FlowElement_v1.cxx:25
JetCaloEnergies::m_effNClustsFracClusterKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_effNClustsFracClusterKey
Definition: JetCaloEnergies.h:57
xAOD::TrackParticle_v1::e
virtual double e() const override final
The total energy of the particle.
Definition: TrackParticle_v1.cxx:109
JetCaloEnergies::m_calculationNames
Gaudi::Property< std::vector< std::string > > m_calculationNames
Definition: JetCaloEnergies.h:36
xAOD::FlowElement_v1::Combined
@ Combined
Definition: FlowElement_v1.h:39
CaloCell_ID_FCS::HEC0
@ HEC0
Definition: FastCaloSim_CaloCell_ID.h:27
JetCaloEnergies::m_emFracKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_emFracKey
Definition: JetCaloEnergies.h:41
JetCaloEnergies::m_emFracClusterKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_emFracClusterKey
Definition: JetCaloEnergies.h:52
JetCaloEnergies::m_calcClusterBasedVars
Gaudi::Property< bool > m_calcClusterBasedVars
Definition: JetCaloEnergies.h:38
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
jet::JetCaloQualityUtils::hecF
static double hecF(const Jet *jet)
Definition: JetCaloQualityUtils.cxx:67
JetCaloEnergies.h
xAOD::CaloCluster_v1::eSample
float eSample(const CaloSample sampling) const
Definition: CaloCluster_v1.cxx:521
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CaloCell_ID_FCS::PreSamplerE
@ PreSamplerE
Definition: FastCaloSim_CaloCell_ID.h:23
CaloCell_ID_FCS::PreSamplerB
@ PreSamplerB
Definition: FastCaloSim_CaloCell_ID.h:19
xAOD::FlowElement_v1::otherObject
const xAOD::IParticle * otherObject(std::size_t i) const
Definition: FlowElement_v1.cxx:196
JetCaloEnergies::m_em3FracKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_em3FracKey
Definition: JetCaloEnergies.h:44
JetCaloEnergies::m_psFracKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_psFracKey
Definition: JetCaloEnergies.h:43
jet::JetCaloQualityUtils::emFraction
static double emFraction(const std::vector< float > &ePerSampling)
Definition: JetCaloQualityUtils.cxx:56
JetCaloEnergies::fillEperSamplingFEClusterBased
void fillEperSamplingFEClusterBased(const xAOD::Jet &jet, std::vector< float > &ePerSampling) const
Definition: JetCaloEnergies.cxx:479
JetCaloEnergies::m_hecFracKey
SG::WriteDecorHandleKey< xAOD::JetContainer > m_hecFracKey
Definition: JetCaloEnergies.h:42
CaloCell_ID_FCS::FCAL2
@ FCAL2
Definition: FastCaloSim_CaloCell_ID.h:42
defineDB.jets
list jets
Definition: JetTagCalibration/share/defineDB.py:24
JetCaloQualityUtils.h
JetCaloEnergies::fillEperSamplingCluster
void fillEperSamplingCluster(const xAOD::Jet &jet, std::vector< float > &ePerSampling) const
Definition: JetCaloEnergies.cxx:151
CaloCell_ID_FCS::HEC3
@ HEC3
Definition: FastCaloSim_CaloCell_ID.h:30
CaloCell_ID_FCS::FCAL0
@ FCAL0
Definition: FastCaloSim_CaloCell_ID.h:40
CaloCell_ID_FCS::EMB3
@ EMB3
Definition: FastCaloSim_CaloCell_ID.h:22
CaloCell_ID_FCS::TileBar2
@ TileBar2
Definition: FastCaloSim_CaloCell_ID.h:33
jet::JetCaloQualityUtils::presamplerFraction
static double presamplerFraction(const Jet *jet)
Definition: JetCaloQualityUtils.cxx:83
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
constants.EME2
int EME2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:56
xAOD::IParticle::e
virtual double e() const =0
The total energy of the particle.
xAOD::FlowElement_v1::otherObjects
std::vector< const xAOD::IParticle * > otherObjects() const
Definition: FlowElement_v1.cxx:163
xAOD::FlowElement_v1
A detector object made of other lower level object(s)
Definition: FlowElement_v1.h:25
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37