ATLAS Offline Software
TauPi0ClusterCreator.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #ifndef XAOD_ANALYSIS
6 
7 #include "TauPi0ClusterCreator.h"
9 
11 #include "FourMomUtils/P4Helpers.h"
12 #include "xAODJet/Jet.h"
13 
14 
17 }
18 
19 
20 
22  xAOD::PFOContainer& neutralPFOContainer,
23  xAOD::PFOContainer& hadronicPFOContainer,
24  const xAOD::CaloClusterContainer& pi0ClusterContainer) const {
25  // Any tau needs to have PFO vectors. Set empty vectors before nTrack cut
26  std::vector<ElementLink<xAOD::PFOContainer>> empty;
29 
30  // only need pi0s and shots for 0-5 prong taus
31  if (!tauRecTools::doPi0andShots(tau)) {
32  return StatusCode::SUCCESS;
33  }
34 
35  // Retrieve Ecal1 shots and match them to clusters
36  std::vector<const xAOD::PFO*> shotPFOs;
37 
38  unsigned nShots = tau.nShotPFOs();
39  for (unsigned index=0; index<nShots; ++index) {
40  const xAOD::PFO* shotPFO = tau.shotPFO(index);
41  shotPFOs.push_back(shotPFO);
42  }
43 
44  // Map shot to the pi0 cluster
45  std::map<unsigned, const xAOD::CaloCluster*> shotToClusterMap = getShotToClusterMap(shotPFOs, pi0ClusterContainer, tau);
46 
47  // We will always perform the vertex correction
48  const xAOD::Vertex* vertex = tau.vertex();
49 
50  // Tau custom PFO reconstruction is only used in offline reconstrution
51  TLorentzVector tauAxis = tauRecTools::getTauAxis(tau);
52 
53  // Loop over custom pi0 clusters, and create neutral PFOs
54  for (const xAOD::CaloCluster* cluster: pi0ClusterContainer) {
55  // correct pi0 clusters w.r.t. the tau vertex
56  TLorentzVector clusterP4;
57  if (vertex) {
58  xAOD::CaloVertexedTopoCluster vertexedCluster(*cluster, vertex->position());
59  clusterP4 = vertexedCluster.p4();
60  }
61  else {
62  clusterP4 = cluster->p4();
63  }
64 
65  // Clusters must have enough energy, and within 0.4 cone of the tau candidate
66  if (clusterP4.Pt() < m_clusterEtCut) continue;
67  if (clusterP4.DeltaR(tauAxis) > 0.4) continue;
68 
69  // Create the neutral PFOs
70  xAOD::PFO* neutralPFO = new xAOD::PFO();
71  neutralPFOContainer.push_back(neutralPFO);
72 
73  // -- Set the PFO four momentum corrected w.r.t. the tau vertex
74  neutralPFO->setP4(clusterP4.Pt(), clusterP4.Eta(), clusterP4.Phi(), 0.);
75 
76  // Add the link to the tau candidate
77  ElementLink<xAOD::PFOContainer> PFOElementLink;
78  PFOElementLink.toContainedElement(neutralPFOContainer, neutralPFO);
79  tau.addProtoNeutralPFOLink(PFOElementLink);
80 
81  ATH_CHECK(configureNeutralPFO(*cluster, pi0ClusterContainer, tau, shotPFOs, shotToClusterMap, *neutralPFO));
82  }
83 
84  // Loop over clusters from jet seed, and create hadronic PFOs
85  std::vector<xAOD::CaloVertexedTopoCluster> vertexedClusterList = tau.vertexedClusters();
86  for (const xAOD::CaloVertexedTopoCluster& vertexedCluster : vertexedClusterList){
87  TLorentzVector clusterP4 = vertexedCluster.p4();
88 
89  // Clusters must have positive energy, and within 0.2 cone of the tau candidate
90  if(clusterP4.E()<=0.) continue;
91  if(clusterP4.DeltaR(tauAxis) > 0.2) continue;
92 
93  double clusterEnergyHad = 0.;
94 
95  const xAOD::CaloCluster& cluster = vertexedCluster.clust();
96  const CaloClusterCellLink* cellLinks = cluster.getCellLinks();
97  if (!cellLinks) {
98  ATH_MSG_WARNING("The cell links of the tau cluster is unavailable.");
99  continue;
100  }
101  CaloClusterCellLink::const_iterator cellLink = cellLinks->begin();
102  for (; cellLink != cellLinks->end(); ++cellLink) {
103  const CaloCell* cell = static_cast<const CaloCell*>(*cellLink);
104 
105  int sampling = cell->caloDDE()->getSampling();
106  if (sampling < 8) continue;
107 
108  // TODO: what is the weight for EMTopo
109  double cellEnergy = cell->e() * cellLink.weight();
110  clusterEnergyHad += cellEnergy;
111  }
112 
113  // Energy in Had Calorimeter must be positive
114  if(clusterEnergyHad <= 0.) continue;
115 
116  // Create the hadrnic PFO
117  xAOD::PFO* hadronicPFO = new xAOD::PFO();
118  hadronicPFOContainer.push_back(hadronicPFO);
119 
120  // Add element link from tau to hadronic PFO
121  ElementLink<xAOD::PFOContainer> PFOElementLink;
122  PFOElementLink.toContainedElement( hadronicPFOContainer, hadronicPFO );
123  tau.addHadronicPFOLink( PFOElementLink );
124 
125  ATH_CHECK(configureHadronicPFO(cluster, clusterEnergyHad, *hadronicPFO));
126  }
127 
128  return StatusCode::SUCCESS;
129 }
130 
131 
132 
133 std::map<unsigned, const xAOD::CaloCluster*> TauPi0ClusterCreator::getShotToClusterMap(const std::vector<const xAOD::PFO*>& shotPFOs,
134  const xAOD::CaloClusterContainer& pi0ClusterContainer,
135  const xAOD::TauJet &tau) const {
136  std::map<unsigned, const xAOD::CaloCluster*> shotToClusterMap;
137  for (unsigned index = 0; index < shotPFOs.size(); ++index) {
138  const xAOD::PFO* shotPFO = shotPFOs.at(index);
139 
140  int seedHashInt = -1;
142  ATH_MSG_WARNING("Couldn't find seed hash. Set it to -1, no cluster will be associated to shot.");
143  }
144  const IdentifierHash seedHash = static_cast<const IdentifierHash>(seedHashInt);
145 
146  // We will always perform the vertex correction
147  const xAOD::Vertex* vertex = tau.vertex();
148 
149  // Tau custom PFO reconstruction is only used in offline reconstrution
150  TLorentzVector tauAxis = tauRecTools::getTauAxis(tau);
151 
152  float weightInCluster = -1.;
153  float weightInPreviousCluster = -1;
154 
155  // Loop over custom pi0 clusters, and map shot to the cluster
156  for (const xAOD::CaloCluster* cluster: pi0ClusterContainer) {
157  // custom clusters could be correctd directly using the tau vertex
158  TLorentzVector clusterP4;
159  if (vertex) {
160  xAOD::CaloVertexedTopoCluster vertexedCluster(*cluster, vertex->position());
161  clusterP4 = vertexedCluster.p4();
162  }
163  else {
164  clusterP4 = cluster->p4();
165  }
166 
167  weightInCluster = -1.;
168  if (clusterP4.Et() < m_clusterEtCut) continue;
169  if (clusterP4.DeltaR(tauAxis) > 0.4) continue;
170 
171  const CaloClusterCellLink* cellLinks = cluster->getCellLinks();
172  CaloClusterCellLink::const_iterator cellLink = cellLinks->begin();
173  for (; cellLink != cellLinks->end(); ++cellLink) {
174  const CaloCell* cell = static_cast<const CaloCell*>(*cellLink);
175 
176  // Check if seed cell is in cluster.
177  if (cell->caloDDE()->calo_hash() != seedHash) continue;
178 
179  weightInCluster = cellLink.weight();
180  // found cell, no need to loop over other cells
181  break;
182  }
183 
184  if (weightInCluster < 0) continue;
185 
186  // Check if cell was already found in a previous cluster
187  if (weightInPreviousCluster < 0) {
188  // Cell not found in a previous cluster.
189  // Have to check whether cell is shared with other cluster
190  shotToClusterMap[index] = cluster;
191  weightInPreviousCluster = weightInCluster;
192  }
193  else {
194  // Cell has been found in a previous cluster
195  // assign shot to this cluster if it has larger weight for the cell
196  // otherwise the shots keeps assigned to the previous cluster
197  if (weightInCluster > weightInPreviousCluster) {
198  shotToClusterMap[index] = cluster;
199  }
200  // FIXME: why break here ? Should loop all the cluster, and find the largest weight
201  break;
202  }
203  }
204  }
205 
206  return shotToClusterMap;
207 }
208 
209 
210 
211 std::vector<unsigned> TauPi0ClusterCreator::getShotsMatchedToCluster(const std::vector<const xAOD::PFO*>& shotPFOs,
212  const std::map<unsigned, const xAOD::CaloCluster*>& shotToClusterMap,
213  const xAOD::CaloCluster& pi0Cluster) const {
214  std::vector<unsigned> shotsMatchedToCluster;
215 
216  // Loop over the shots, and select those matched to the cluster
217  for (unsigned index = 0; index < shotPFOs.size(); ++index) {
218  auto iterator = shotToClusterMap.find(index);
219  if (iterator == shotToClusterMap.end()) continue;
220  if (iterator->second != &pi0Cluster) continue;
221 
222  shotsMatchedToCluster.push_back(index);
223  }
224 
225  return shotsMatchedToCluster;
226 }
227 
228 
229 
230 int TauPi0ClusterCreator::getNPhotons(const std::vector<const xAOD::PFO*>& shotPFOs,
231  const std::vector<unsigned>& shotsInCluster) const {
232  int totalPhotons = 0;
233 
234  for (unsigned index = 0; index < shotsInCluster.size(); ++index) {
235  int nPhotons = 0;
236  const xAOD::PFO* shotPFO = shotPFOs.at(shotsInCluster.at(index));
238  ATH_MSG_WARNING("Can't find NHitsInEM1. Set it to 0.");
239  }
240  totalPhotons += nPhotons;
241  }
242 
243  return totalPhotons;
244 }
245 
246 
247 
248 std::vector<int> TauPi0ClusterCreator::getNPosECells(const xAOD::CaloCluster& cluster) const {
249  std::vector<int> nPosECells(3, 0);
250 
251  const CaloClusterCellLink* cellLinks = cluster.getCellLinks();
252  CaloClusterCellLink::const_iterator cellLink = cellLinks->begin();
253  for (; cellLink != cellLinks->end(); ++cellLink) {
254  const CaloCell* cell = static_cast<const CaloCell*>(*cellLink);
255  int sampling = cell->caloDDE()->getSampling();
256 
257  // layer0: PS, layer1: EM1, layer2: EM2
258  int layer = sampling%4;
259  if (layer < 3 && cell->e() > 0) {
260  ++nPosECells[layer];
261  }
262  }
263 
264  return nPosECells;
265 }
266 
267 
268 
270  float coreEnergyEM1 = 0.;
271  float totalEnergyEM1 = 0.;
272 
273  const CaloClusterCellLink* cellLinks = cluster.getCellLinks();
274  CaloClusterCellLink::const_iterator cellLink = cellLinks->begin();
275  for (; cellLink != cellLinks->end(); ++cellLink) {
276  const CaloCell* cell = static_cast<const CaloCell*>(*cellLink);
277 
278  // Only consider EM1
279  int sampling = cell->caloDDE()->getSampling();
280  if (sampling != 1 && sampling != 5) continue;
281 
282  // Only consider positive cells
283  // FIXME: is the weight needed ?
284  float cellEnergy = cell->e() * cellLink.weight();
285  if (cellEnergy <= 0) continue;
286 
287  totalEnergyEM1 += cellEnergy;
288 
289  float deltaEta = cell->eta() - cluster.eta();
290  float deltaPhi = P4Helpers::deltaPhi(cell->phi(), cluster.phi());
291 
292  // Core region: [0.05, 0.05/8]
293  if(std::abs(deltaPhi) > 0.05 || std::abs(deltaEta) > 2 * 0.025/8.) continue;
294 
295  coreEnergyEM1 += cellEnergy;
296  }
297 
298  if (totalEnergyEM1 <= 0.) return 0.;
299  return coreEnergyEM1/totalEnergyEM1;
300 }
301 
302 
303 
304 std::vector<float> TauPi0ClusterCreator::get1stEtaMomWRTCluster(const xAOD::CaloCluster& cluster) const {
305  std::vector<float> deltaEtaFirstMom (3, 0.);
306  std::vector<float> totalEnergy (3, 0.);
307 
308  const CaloClusterCellLink* cellLinks = cluster.getCellLinks();
309  CaloClusterCellLink::const_iterator cellLink = cellLinks->begin();
310  for (; cellLink != cellLinks->end(); ++cellLink) {
311  const CaloCell* cell = static_cast<const CaloCell*>(*cellLink);
312 
313  // Only consider PS, EM1, and EM2
314  int sampling = cell->caloDDE()->getSampling();
315  int layer = sampling%4;
316  if (layer >= 3) continue;
317 
318  // Only consider positive cells
319  float cellEnergy = cell->e();
320  if (cellEnergy <= 0) continue;
321 
322  float deltaEta = cell->eta() - cluster.eta();
323  deltaEtaFirstMom[layer] += deltaEta * cellEnergy;
324  totalEnergy[layer] += cellEnergy;
325  }
326 
327  for (int layer=0; layer < 3; ++layer) {
328  if (totalEnergy[layer] != 0.) {
329  deltaEtaFirstMom[layer]/=std::abs(totalEnergy[layer]);
330  }
331  else {
332  deltaEtaFirstMom[layer]=0.;
333  }
334  }
335 
336  return deltaEtaFirstMom;
337 }
338 
339 
340 
341 std::vector<float> TauPi0ClusterCreator::get2ndEtaMomWRTCluster(const xAOD::CaloCluster& cluster) const {
342  std::vector<float> deltaEtaSecondMom (3, 0.);
343  std::vector<float> totalEnergy (3, 0.);
344 
345  const CaloClusterCellLink* cellLinks = cluster.getCellLinks();
346  CaloClusterCellLink::const_iterator cellLink = cellLinks->begin();
347  for (; cellLink != cellLinks->end(); ++cellLink) {
348  const CaloCell* cell = static_cast<const CaloCell*>(*cellLink);
349 
350  // Only consider PS, EM1, and EM2
351  int sampling = cell->caloDDE()->getSampling();
352  int layer = sampling%4;
353  if (layer >= 3) continue;
354 
355  // Only consider positive cells
356  float cellEnergy=cell->e();
357  if (cellEnergy <= 0) continue;
358 
359  float deltaEta = cell->eta() - cluster.eta();
360  deltaEtaSecondMom[layer] += deltaEta * deltaEta * cellEnergy;
361  totalEnergy[layer] += cellEnergy;
362  }
363 
364  for (int layer=0; layer < 3; ++layer) {
365  if (totalEnergy[layer] != 0.) {
366  deltaEtaSecondMom[layer]/=std::abs(totalEnergy[layer]);
367  }
368  else {
369  deltaEtaSecondMom[layer]=0.;
370  }
371  }
372 
373  return deltaEtaSecondMom;
374 }
375 
376 
377 
379  const xAOD::CaloClusterContainer& pi0ClusterContainer,
380  const xAOD::TauJet& tau,
381  const std::vector<const xAOD::PFO*>& shotPFOs,
382  const std::map<unsigned, const xAOD::CaloCluster*>& shotToClusterMap,
383  xAOD::PFO& neutralPFO) const {
384  // Set the properties of the PFO
385  // -- Default value
386  neutralPFO.setBDTPi0Score(-9999.);
387  neutralPFO.setCharge(0);
389 
390  // -- CENTER_MAG
391  double CENTER_MAG = 0.0;
393  ATH_MSG_WARNING("Couldn't retrieve CENTER_MAG moment. Set it to 0.");
394  }
395  neutralPFO.setCenterMag( (float) CENTER_MAG);
396 
397  // -- Number of photons
398  std::vector<unsigned> shotsInCluster = getShotsMatchedToCluster(shotPFOs, shotToClusterMap, cluster);
399  int NHitsInEM1 = getNPhotons(shotPFOs, shotsInCluster);
401 
402  // -- Energy at each layer
403  float eEM1 = cluster.eSample(CaloSampling::EMB1) + cluster.eSample(CaloSampling::EME1);
405 
406  float eEM2 = cluster.eSample(CaloSampling::EMB2) + cluster.eSample(CaloSampling::EME2);
408 
409  // -- Number of positive cells in each layer
410  std::vector<int> nPosECells = getNPosECells(cluster);
414 
415  // -- Core Fraction of the energy in EM1
416  float EM1CoreFrac = getEM1CoreFrac(cluster);
418 
419  // -- First moment of deltaEta(cluster, cell) in EM1 and EM2
420  std::vector<float> deltaEtaFirstMom = get1stEtaMomWRTCluster(cluster);
423 
424  // -- Second moment of deltaEta(cluster, cell) in EM1 and EM2
425  std::vector<float> secondEtaWRTClusterPositionInLayer = get2ndEtaMomWRTCluster(cluster);
426  neutralPFO.setAttribute<float>(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM1, secondEtaWRTClusterPositionInLayer.at(1));
427  neutralPFO.setAttribute<float>(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM2, secondEtaWRTClusterPositionInLayer.at(2));
428 
429  // -- Retrieve cluster moments
430  using Moment = xAOD::CaloCluster::MomentType;
431  using Attribute = xAOD::PFODetails::PFOAttributes;
432  const std::array< std::pair<Moment, Attribute>, 12> momentAttributePairs {{
433  {Moment::FIRST_ETA, Attribute::cellBased_FIRST_ETA},
436  {Moment::DELTA_PHI, Attribute::cellBased_DELTA_PHI},
437  {Moment::DELTA_THETA, Attribute::cellBased_DELTA_THETA},
439  {Moment::LATERAL, Attribute::cellBased_LATERAL},
440  {Moment::LONGITUDINAL, Attribute::cellBased_LONGITUDINAL},
441  {Moment::ENG_FRAC_EM, Attribute::cellBased_ENG_FRAC_EM},
442  {Moment::ENG_FRAC_MAX, Attribute::cellBased_ENG_FRAC_MAX},
443  {Moment::ENG_FRAC_CORE, Attribute::cellBased_ENG_FRAC_CORE},
444  {Moment::SECOND_ENG_DENS, Attribute::cellBased_SECOND_ENG_DENS}
445  }};
446 
447  for (const auto& [moment, attribute] : momentAttributePairs) {
448  double value = 0.0;
449  if (! cluster.retrieveMoment(moment, value)) {
450  ATH_MSG_WARNING("Cound not retrieve " << moment);
451  }
452  neutralPFO.setAttribute(attribute, static_cast<float>(value));
453  }
454 
455  // -- Element link to the cluster
457  clusElementLink.toContainedElement(pi0ClusterContainer, &cluster);
458  neutralPFO.setClusterLink( clusElementLink );
459 
460  // -- Element link to the shots
461  std::vector<ElementLink<xAOD::IParticleContainer>> shotlinks;
462  for (unsigned index = 0; index < shotsInCluster.size(); ++index) {
463  auto& shotPFOElementLink = tau.shotPFOLinks().at(shotsInCluster.at(index));
464  ElementLink<xAOD::IParticleContainer> shotElementLink( shotPFOElementLink.dataID(), shotPFOElementLink.index() );
465  if (!shotElementLink.isValid()) {
466  ATH_MSG_WARNING("Created an invalid element link to xAOD::PFO");
467  }
468  shotlinks.push_back(shotElementLink);
469  }
470  if(!neutralPFO.setAssociatedParticleLinks( xAOD::PFODetails::TauShot,shotlinks)) {
471  ATH_MSG_WARNING("Couldn't add shot links to neutral PFO!");
472  }
473 
474  return StatusCode::SUCCESS;
475 }
476 
477 
478 
480  double clusterEnergyHad,
481  xAOD::PFO& hadronicPFO) const {
482  double clusterPtHad = clusterEnergyHad/std::cosh(cluster.eta());
483  hadronicPFO.setP4(clusterPtHad, cluster.eta(), cluster.phi(), 0.);
484 
485  return StatusCode::SUCCESS;
486 }
487 
488 #endif
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
xAOD::CaloCluster_v1::phi
virtual double phi() const
The azimuthal angle ( ) of the particle.
Definition: CaloCluster_v1.cxx:256
TauGNNUtils::Variables::Cluster::CENTER_LAMBDA
bool CENTER_LAMBDA(const xAOD::TauJet &, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
Definition: TauGNNUtils.cxx:826
Jet.h
xAOD::PFODetails::cellBased_firstEtaWRTClusterPosition_EM2
@ cellBased_firstEtaWRTClusterPosition_EM2
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:137
xAOD::CaloVertexedClusterBase::p4
virtual FourMom_t p4() const final
The full 4-momentum of the particle.
Definition: Event/xAOD/xAODCaloEvent/xAODCaloEvent/CaloVertexedClusterBase.h:88
xAOD::PFODetails::cellBased_NPosECells_EM1
@ cellBased_NPosECells_EM1
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:134
TauPi0ClusterCreator::get2ndEtaMomWRTCluster
std::vector< float > get2ndEtaMomWRTCluster(const xAOD::CaloCluster &cluster) const
second eta moment in PS, EM1 and EM2 w.r.t cluster eta
Definition: TauPi0ClusterCreator.cxx:341
constants.EMB1
int EMB1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:53
ReadCellNoiseFromCool.cell
cell
Definition: ReadCellNoiseFromCool.py:53
xAOD::PFODetails::cellBased_SECOND_R
@ cellBased_SECOND_R
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:119
xAOD::TauJet_v3::setProtoNeutralPFOLinks
void setProtoNeutralPFOLinks(const PFOLinks_t &protoNeutralPFOs)
xAOD::PFODetails::TauShot
@ TauShot
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:171
xAOD::PFODetails::PFOAttributes
PFOAttributes
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:28
TauPi0ClusterCreator::m_clusterEtCut
Gaudi::Property< double > m_clusterEtCut
Definition: TauPi0ClusterCreator.h:82
index
Definition: index.py:1
tauRecTools::getTauAxis
TLorentzVector getTauAxis(const xAOD::TauJet &tau, bool doVertexCorrection=true)
Return the four momentum of the tau axis The tau axis is widely used to select clusters and cells in ...
Definition: Reconstruction/tauRecTools/Root/HelperFunctions.cxx:33
xAOD::deltaPhi
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setInterceptInner setEtaMap setEtaBin setIsTgcFailure setDeltaPt deltaPhi
Definition: L2StandAloneMuon_v1.cxx:160
xAOD::PFO_v1::attribute
bool attribute(PFODetails::PFOAttributes AttributeType, T &anAttribute) const
get a PFO Variable via enum
xAOD::PFODetails::cellBased_NPosECells_PS
@ cellBased_NPosECells_PS
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:133
TauRecToolBase
The base class for all tau tools.
Definition: TauRecToolBase.h:21
xAOD::PFODetails::cellBased_NHitsInEM1
@ cellBased_NHitsInEM1
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:132
athena.value
value
Definition: athena.py:122
xAOD::PFO_v1::setAssociatedParticleLinks
bool setAssociatedParticleLinks(PFODetails::PFOParticleType ParticleType, const std::vector< ElementLink< IParticleContainer > > &theParticles)
Set a vector of PFO constituent particle types via enum - overwrite is allowed.
Definition: PFO_v1.cxx:600
xAOD::TauJet_v3::addProtoNeutralPFOLink
void addProtoNeutralPFOLink(const ElementLink< PFOContainer > &pfo)
add a cellbased_neutral PFO to the tau
Definition: TauJet_v3.cxx:948
xAOD::PFODetails::cellBased_secondEtaWRTClusterPosition_EM1
@ cellBased_secondEtaWRTClusterPosition_EM1
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:138
empty
bool empty(TH1 *h)
Definition: computils.cxx:294
xAOD::PFODetails::cellBased_DELTA_THETA
@ cellBased_DELTA_THETA
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:122
xAOD::PFODetails::cellBased_ENG_FRAC_MAX
@ cellBased_ENG_FRAC_MAX
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:127
xAOD::PFODetails::cellBased_firstEtaWRTClusterPosition_EM1
@ cellBased_firstEtaWRTClusterPosition_EM1
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:136
xAOD::PFODetails::tauShots_nPhotons
@ tauShots_nPhotons
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:162
xAOD::CaloCluster_v1::MomentType
MomentType
Enums to identify different moments.
Definition: CaloCluster_v1.h:120
xAOD::PFO_v1::setClusterLink
bool setClusterLink(const ElementLink< xAOD::CaloClusterContainer > &theCluster)
Set a cluster constituent - does NOT append to existing container
Definition: PFO_v1.cxx:549
xAOD::PFODetails::cellBased_SECOND_LAMBDA
@ cellBased_SECOND_LAMBDA
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:120
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:59
P4Helpers::deltaPhi
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
Definition: P4Helpers.h:29
constants.EMB2
int EMB2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:54
P4Helpers::deltaEta
double deltaEta(const I4Momentum &p1, const I4Momentum &p2)
Computes efficiently .
Definition: P4Helpers.h:53
xAOD::CaloCluster_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
Definition: CaloCluster_v1.cxx:251
TauPi0ClusterCreator::TauPi0ClusterCreator
TauPi0ClusterCreator(const std::string &name)
Definition: TauPi0ClusterCreator.cxx:15
xAOD::PFO
PFO_v1 PFO
Definition of the current "pfo version".
Definition: PFO.h:17
xAOD::TauJet_v3::shotPFOLinks
const PFOLinks_t & shotPFOLinks() const
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
xAOD::PFODetails::cellBased_secondEtaWRTClusterPosition_EM2
@ cellBased_secondEtaWRTClusterPosition_EM2
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:139
tauRecTools::doPi0andShots
bool doPi0andShots(const xAOD::TauJet &tau)
Determines whether pi0s and shots should be built for a tau candidate.
Definition: Reconstruction/tauRecTools/Root/HelperFunctions.cxx:93
xAOD::TauJet_v3
Class describing a tau jet.
Definition: TauJet_v3.h:41
xAOD::TauJet_v3::addHadronicPFOLink
void addHadronicPFOLink(const ElementLink< PFOContainer > &pfo)
add a hadronic PFO to the tau
Definition: TauJet_v3.cxx:763
xAOD::PFODetails::tauShots_seedHash
@ tauShots_seedHash
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:163
TauPi0ClusterCreator.h
constants.EME1
int EME1
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:55
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
xAOD::CaloCluster_v1::retrieveMoment
bool retrieveMoment(MomentType type, double &value) const
Retrieve individual moment.
Definition: CaloCluster_v1.cxx:738
xAOD::PFODetails::cellBased_FIRST_ETA
@ cellBased_FIRST_ETA
These variables belong to the cell-based particle flow algorithm.
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:118
TauGNNUtils::Variables::Cluster::SECOND_LAMBDA
bool SECOND_LAMBDA(const xAOD::TauJet &, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
Definition: TauGNNUtils.cxx:821
xAOD::PFO_v1::setBDTPi0Score
void setBDTPi0Score(float BDTPi0Score)
set BDT Score used to classify clusters as Pi0 like or not
xAOD::TauJet_v3::setHadronicPFOLinks
void setHadronicPFOLinks(const PFOLinks_t &hadronicPFOs)
TauPi0ClusterCreator::executePi0ClusterCreator
virtual StatusCode executePi0ClusterCreator(xAOD::TauJet &pTau, xAOD::PFOContainer &neutralPFOContainer, xAOD::PFOContainer &hadronicClusterPFOContainer, const xAOD::CaloClusterContainer &pi0CaloClusContainer) const override
Definition: TauPi0ClusterCreator.cxx:21
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
TauPi0ClusterCreator::configureHadronicPFO
StatusCode configureHadronicPFO(const xAOD::CaloCluster &cluster, double clusterEnergyHad, xAOD::PFO &hadronicPFO) const
Configure the haronic PFO.
Definition: TauPi0ClusterCreator.cxx:479
xAOD::CaloCluster_v1::getCellLinks
const CaloClusterCellLink * getCellLinks() const
Get a pointer to the CaloClusterCellLink object (const version)
Definition: CaloCluster_v1.cxx:905
P4Helpers.h
xAOD::PFODetails::cellBased_energy_EM2
@ cellBased_energy_EM2
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:141
xAOD::PFODetails::cellBased_energy_EM1
@ cellBased_energy_EM1
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:140
xAOD::PFO_v1
Class describing a particle flow object.
Definition: PFO_v1.h:35
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
TauGNNUtils::Variables::Cluster::SECOND_R
bool SECOND_R(const xAOD::TauJet &, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
Definition: TauGNNUtils.cxx:816
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
xAOD::TauJet_v3::vertexedClusters
std::vector< xAOD::CaloVertexedTopoCluster > vertexedClusters() const
Definition: TauJet_v3.cxx:626
xAOD::PFODetails::nPi0Proto
@ nPi0Proto
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:31
xAOD::PFODetails::cellBased_DELTA_PHI
@ cellBased_DELTA_PHI
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:121
xAOD::PFODetails::cellBased_ENG_FRAC_CORE
@ cellBased_ENG_FRAC_CORE
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:128
xAOD::PFODetails::cellBased_EM1CoreFrac
@ cellBased_EM1CoreFrac
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:130
CaloClusterStoreHelper.h
TauGNNUtils::Variables::Cluster::CENTER_MAG
bool CENTER_MAG(const xAOD::TauJet &, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
Definition: TauGNNUtils.cxx:902
xAOD::PFO_v1::setP4
void setP4(const FourMom_t &vec)
set the 4-vec
Definition: PFO_v1.cxx:107
xAOD::PFO_v1::setCharge
void setCharge(float charge)
set charge of PFO
Trk::vertex
@ vertex
Definition: MeasurementType.h:21
DeMoScan.index
string index
Definition: DeMoScan.py:362
xAOD::PFODetails::cellBased_SECOND_ENG_DENS
@ cellBased_SECOND_ENG_DENS
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:129
xAOD::PFODetails::cellBased_NPosECells_EM2
@ cellBased_NPosECells_EM2
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:135
xAOD::CaloCluster_v1::eSample
float eSample(const CaloSample sampling) const
Definition: CaloCluster_v1.cxx:521
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
CaloCell
Data object for each calorimeter readout cell.
Definition: CaloCell.h:57
xAOD::TauJet_v3::vertex
const Vertex * vertex() const
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
xAOD::PFODetails::cellBased_CENTER_LAMBDA
@ cellBased_CENTER_LAMBDA
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:123
TauPi0ClusterCreator::configureNeutralPFO
StatusCode configureNeutralPFO(const xAOD::CaloCluster &cluster, const xAOD::CaloClusterContainer &pi0ClusterContainer, const xAOD::TauJet &tau, const std::vector< const xAOD::PFO * > &shotPFOs, const std::map< unsigned, const xAOD::CaloCluster * > &shotsInCluster, xAOD::PFO &neutralPFO) const
Configure the neutral PFO.
Definition: TauPi0ClusterCreator.cxx:378
xAOD::PFODetails::cellBased_LONGITUDINAL
@ cellBased_LONGITUDINAL
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:125
TauPi0ClusterCreator::getShotToClusterMap
std::map< unsigned, const xAOD::CaloCluster * > getShotToClusterMap(const std::vector< const xAOD::PFO * > &shotVector, const xAOD::CaloClusterContainer &pi0ClusterContainer, const xAOD::TauJet &pTau) const
Definition: TauPi0ClusterCreator.cxx:133
HelperFunctions.h
xAOD::PFODetails::cellBased_LATERAL
@ cellBased_LATERAL
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:124
TauPi0ClusterCreator::getNPhotons
int getNPhotons(const std::vector< const xAOD::PFO * > &shotVector, const std::vector< unsigned > &shotsInCluster) const
Definition: TauPi0ClusterCreator.cxx:230
xAOD::PFODetails::cellBased_ENG_FRAC_EM
@ cellBased_ENG_FRAC_EM
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:126
TauPi0ClusterCreator::get1stEtaMomWRTCluster
std::vector< float > get1stEtaMomWRTCluster(const xAOD::CaloCluster &cluster) const
first eta moment in PS, EM1 and EM2 w.r.t cluster eta
Definition: TauPi0ClusterCreator.cxx:304
xAOD::CaloVertexedTopoCluster
Evaluate cluster kinematics with a different vertex / signal state.
Definition: Event/xAOD/xAODCaloEvent/xAODCaloEvent/CaloVertexedTopoCluster.h:38
IdentifierHash
Definition: IdentifierHash.h:38
xAOD::TauJet_v3::shotPFO
const PFO * shotPFO(size_t i) const
Get the pointer to a given shot PFO associated with this tau.
TauPi0ClusterCreator::getEM1CoreFrac
float getEM1CoreFrac(const xAOD::CaloCluster &cluster) const
fraction of cluster enegry in central EM1 cells
Definition: TauPi0ClusterCreator.cxx:269
xAOD::PFO_v1::setAttribute
void setAttribute(PFODetails::PFOAttributes AttributeType, const T &anAttribute)
Set a PFO Variable via enum - overwrite is allowed.
TauPi0ClusterCreator::getNPosECells
std::vector< int > getNPosECells(const xAOD::CaloCluster &cluster) const
number of cells from cluster with positive energy in PS, EM1 and EM2
Definition: TauPi0ClusterCreator.cxx:248
constants.EME2
int EME2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:56
TauPi0ClusterCreator::getShotsMatchedToCluster
std::vector< unsigned > getShotsMatchedToCluster(const std::vector< const xAOD::PFO * > &shotVector, const std::map< unsigned, const xAOD::CaloCluster * > &clusterToShotMap, const xAOD::CaloCluster &pi0Cluster) const
Definition: TauPi0ClusterCreator.cxx:211
xAOD::TauJet_v3::nShotPFOs
size_t nShotPFOs() const
Get the number of shot PFO particles associated with this tau.
Definition: TauJet_v3.cxx:788
xAOD::PFO_v1::setCenterMag
void setCenterMag(float CenterMag)
set CenterMag moment needed for vertex correction