ATLAS Offline Software
TauPi0ClusterCreator.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 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;
27  tau.setProtoNeutralPFOLinks(empty);
28  tau.setHadronicPFOLinks(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) || (clusterP4.DeltaR(tauAxis) > m_maxDeltaRJetClust)) continue;
67 
68  // Create the neutral PFOs
69  xAOD::PFO* neutralPFO = new xAOD::PFO();
70  neutralPFOContainer.push_back(neutralPFO);
71 
72  // -- Set the PFO four momentum corrected w.r.t. the tau vertex
73  neutralPFO->setP4(clusterP4.Pt(), clusterP4.Eta(), clusterP4.Phi(), 0.);
74 
75  // Add the link to the tau candidate
76  ElementLink<xAOD::PFOContainer> PFOElementLink;
77  PFOElementLink.toContainedElement(neutralPFOContainer, neutralPFO);
78  tau.addProtoNeutralPFOLink(PFOElementLink);
79 
80  ATH_CHECK(configureNeutralPFO(*cluster, pi0ClusterContainer, tau, shotPFOs, shotToClusterMap, *neutralPFO));
81  }
82 
83  // Loop over clusters from jet seed, and create hadronic PFOs
84  std::vector<xAOD::CaloVertexedTopoCluster> vertexedClusterList = tau.vertexedClusters();
85  for (const xAOD::CaloVertexedTopoCluster& vertexedCluster : vertexedClusterList){
86  TLorentzVector clusterP4 = vertexedCluster.p4();
87 
88  // Clusters must have positive energy, and within 0.2 cone of the tau candidate
89  if((clusterP4.E()<=0.) || (clusterP4.DeltaR(tauAxis) > m_maxDeltaRNeutral) ) continue;
90 
91  double clusterEnergyHad = 0.;
92 
93  const xAOD::CaloCluster& cluster = vertexedCluster.clust();
94  const CaloClusterCellLink* cellLinks = cluster.getCellLinks();
95  if (!cellLinks) {
96  ATH_MSG_WARNING("The cell links of the tau cluster is unavailable.");
97  continue;
98  }
99  CaloClusterCellLink::const_iterator cellLink = cellLinks->begin();
100  for (; cellLink != cellLinks->end(); ++cellLink) {
101  const CaloCell* cell = static_cast<const CaloCell*>(*cellLink);
102 
103  int sampling = cell->caloDDE()->getSampling();
104  if (sampling < 8) continue;
105 
106  // TODO: what is the weight for EMTopo
107  double cellEnergy = cell->e() * cellLink.weight();
108  clusterEnergyHad += cellEnergy;
109  }
110 
111  // Energy in Had Calorimeter must be positive
112  if(clusterEnergyHad <= 0.) continue;
113 
114  // Create the hadrnic PFO
115  xAOD::PFO* hadronicPFO = new xAOD::PFO();
116  hadronicPFOContainer.push_back(hadronicPFO);
117 
118  // Add element link from tau to hadronic PFO
119  ElementLink<xAOD::PFOContainer> PFOElementLink;
120  PFOElementLink.toContainedElement( hadronicPFOContainer, hadronicPFO );
121  tau.addHadronicPFOLink( PFOElementLink );
122 
123  ATH_CHECK(configureHadronicPFO(vertexedCluster, clusterEnergyHad, *hadronicPFO));
124  }
125 
126  return StatusCode::SUCCESS;
127 }
128 
129 
130 
131 std::map<unsigned, const xAOD::CaloCluster*> TauPi0ClusterCreator::getShotToClusterMap(const std::vector<const xAOD::PFO*>& shotPFOs,
132  const xAOD::CaloClusterContainer& pi0ClusterContainer,
133  const xAOD::TauJet &tau) const {
134  std::map<unsigned, const xAOD::CaloCluster*> shotToClusterMap;
135  for (unsigned index = 0; index < shotPFOs.size(); ++index) {
136  const xAOD::PFO* shotPFO = shotPFOs.at(index);
137 
138  int seedHashInt = -1;
140  ATH_MSG_WARNING("Couldn't find seed hash. Set it to -1, no cluster will be associated to shot.");
141  }
142  const IdentifierHash seedHash = static_cast<const IdentifierHash>(seedHashInt);
143 
144  // We will always perform the vertex correction
145  const xAOD::Vertex* vertex = tau.vertex();
146 
147  // Tau custom PFO reconstruction is only used in offline reconstrution
148  TLorentzVector tauAxis = tauRecTools::getTauAxis(tau);
149 
150  float weightInCluster = -1.;
151  float weightInPreviousCluster = -1;
152 
153  // Loop over custom pi0 clusters, and map shot to the cluster
154  for (const xAOD::CaloCluster* cluster: pi0ClusterContainer) {
155  // custom clusters could be correctd directly using the tau vertex
156  TLorentzVector clusterP4;
157  if (vertex) {
158  xAOD::CaloVertexedTopoCluster vertexedCluster(*cluster, vertex->position());
159  clusterP4 = vertexedCluster.p4();
160  }
161  else {
162  clusterP4 = cluster->p4();
163  }
164 
165  weightInCluster = -1.;
166  if ((clusterP4.Et() < m_clusterEtCut) || (clusterP4.DeltaR(tauAxis) > m_maxDeltaRJetClust)) continue;
167 
168  const CaloClusterCellLink* cellLinks = cluster->getCellLinks();
169  CaloClusterCellLink::const_iterator cellLink = cellLinks->begin();
170  for (; cellLink != cellLinks->end(); ++cellLink) {
171  const CaloCell* cell = static_cast<const CaloCell*>(*cellLink);
172 
173  // Check if seed cell is in cluster.
174  if (cell->caloDDE()->calo_hash() != seedHash) continue;
175 
176  weightInCluster = cellLink.weight();
177  // found cell, no need to loop over other cells
178  break;
179  }
180 
181  if (weightInCluster < 0) continue;
182 
183  // Check if cell was already found in a previous cluster
184  if (weightInPreviousCluster < 0) {
185  // Cell not found in a previous cluster.
186  // Have to check whether cell is shared with other cluster
187  shotToClusterMap[index] = cluster;
188  weightInPreviousCluster = weightInCluster;
189  }
190  else {
191  // Cell has been found in a previous cluster
192  // assign shot to this cluster if it has larger weight for the cell
193  // otherwise the shots keeps assigned to the previous cluster
194  if (weightInCluster > weightInPreviousCluster) {
195  shotToClusterMap[index] = cluster;
196  }
197  // FIXME: why break here ? Should loop all the cluster, and find the largest weight
198  break;
199  }
200  }
201  }
202 
203  return shotToClusterMap;
204 }
205 
206 
207 
208 std::vector<unsigned> TauPi0ClusterCreator::getShotsMatchedToCluster(const std::vector<const xAOD::PFO*>& shotPFOs,
209  const std::map<unsigned, const xAOD::CaloCluster*>& shotToClusterMap,
210  const xAOD::CaloCluster& pi0Cluster) const {
211  std::vector<unsigned> shotsMatchedToCluster;
212 
213  // Loop over the shots, and select those matched to the cluster
214  for (unsigned index = 0; index < shotPFOs.size(); ++index) {
215  auto iterator = shotToClusterMap.find(index);
216  if (iterator == shotToClusterMap.end()) continue;
217  if (iterator->second != &pi0Cluster) continue;
218 
219  shotsMatchedToCluster.push_back(index);
220  }
221 
222  return shotsMatchedToCluster;
223 }
224 
225 
226 
227 int TauPi0ClusterCreator::getNPhotons(const std::vector<const xAOD::PFO*>& shotPFOs,
228  const std::vector<unsigned>& shotsInCluster) const {
229  int totalPhotons = 0;
230 
231  for (unsigned index = 0; index < shotsInCluster.size(); ++index) {
232  int nPhotons = 0;
233  const xAOD::PFO* shotPFO = shotPFOs.at(shotsInCluster.at(index));
235  ATH_MSG_WARNING("Can't find NHitsInEM1. Set it to 0.");
236  }
237  totalPhotons += nPhotons;
238  }
239 
240  return totalPhotons;
241 }
242 
243 
244 
245 std::vector<int> TauPi0ClusterCreator::getNPosECells(const xAOD::CaloCluster& cluster) const {
246  std::vector<int> nPosECells(3, 0);
247 
248  const CaloClusterCellLink* cellLinks = cluster.getCellLinks();
249  CaloClusterCellLink::const_iterator cellLink = cellLinks->begin();
250  for (; cellLink != cellLinks->end(); ++cellLink) {
251  const CaloCell* cell = static_cast<const CaloCell*>(*cellLink);
252  int sampling = cell->caloDDE()->getSampling();
253 
254  // layer0: PS, layer1: EM1, layer2: EM2
255  int layer = sampling%4;
256  if (layer < 3 && cell->e() > 0) {
257  ++nPosECells[layer];
258  }
259  }
260 
261  return nPosECells;
262 }
263 
264 
265 
267  float coreEnergyEM1 = 0.;
268  float totalEnergyEM1 = 0.;
269 
270  const CaloClusterCellLink* cellLinks = cluster.getCellLinks();
271  CaloClusterCellLink::const_iterator cellLink = cellLinks->begin();
272  for (; cellLink != cellLinks->end(); ++cellLink) {
273  const CaloCell* cell = static_cast<const CaloCell*>(*cellLink);
274 
275  // Only consider EM1
276  int sampling = cell->caloDDE()->getSampling();
277  if (sampling != 1 && sampling != 5) continue;
278 
279  // Only consider positive cells
280  // FIXME: is the weight needed ?
281  float cellEnergy = cell->e() * cellLink.weight();
282  if (cellEnergy <= 0) continue;
283 
284  totalEnergyEM1 += cellEnergy;
285 
286  float deltaEta = cell->eta() - cluster.eta();
287  float deltaPhi = P4Helpers::deltaPhi(cell->phi(), cluster.phi());
288 
289  // Core region: [0.05, 0.05/8]
290  if(std::abs(deltaPhi) > 0.05 || std::abs(deltaEta) > 2 * 0.025/8.) continue;
291 
292  coreEnergyEM1 += cellEnergy;
293  }
294 
295  if (totalEnergyEM1 <= 0.) return 0.;
296  return coreEnergyEM1/totalEnergyEM1;
297 }
298 
299 
300 
301 std::vector<float> TauPi0ClusterCreator::get1stEtaMomWRTCluster(const xAOD::CaloCluster& cluster) const {
302  std::vector<float> deltaEtaFirstMom (3, 0.);
303  std::vector<float> totalEnergy (3, 0.);
304 
305  const CaloClusterCellLink* cellLinks = cluster.getCellLinks();
306  CaloClusterCellLink::const_iterator cellLink = cellLinks->begin();
307  for (; cellLink != cellLinks->end(); ++cellLink) {
308  const CaloCell* cell = static_cast<const CaloCell*>(*cellLink);
309 
310  // Only consider PS, EM1, and EM2
311  int sampling = cell->caloDDE()->getSampling();
312  int layer = sampling%4;
313  if (layer >= 3) continue;
314 
315  // Only consider positive cells
316  float cellEnergy = cell->e();
317  if (cellEnergy <= 0) continue;
318 
319  float deltaEta = cell->eta() - cluster.eta();
320  deltaEtaFirstMom[layer] += deltaEta * cellEnergy;
321  totalEnergy[layer] += cellEnergy;
322  }
323 
324  for (int layer=0; layer < 3; ++layer) {
325  if (totalEnergy[layer] != 0.) {
326  deltaEtaFirstMom[layer]/=std::abs(totalEnergy[layer]);
327  }
328  else {
329  deltaEtaFirstMom[layer]=0.;
330  }
331  }
332 
333  return deltaEtaFirstMom;
334 }
335 
336 
337 
338 std::vector<float> TauPi0ClusterCreator::get2ndEtaMomWRTCluster(const xAOD::CaloCluster& cluster) const {
339  std::vector<float> deltaEtaSecondMom (3, 0.);
340  std::vector<float> totalEnergy (3, 0.);
341 
342  const CaloClusterCellLink* cellLinks = cluster.getCellLinks();
343  CaloClusterCellLink::const_iterator cellLink = cellLinks->begin();
344  for (; cellLink != cellLinks->end(); ++cellLink) {
345  const CaloCell* cell = static_cast<const CaloCell*>(*cellLink);
346 
347  // Only consider PS, EM1, and EM2
348  int sampling = cell->caloDDE()->getSampling();
349  int layer = sampling%4;
350  if (layer >= 3) continue;
351 
352  // Only consider positive cells
353  float cellEnergy=cell->e();
354  if (cellEnergy <= 0) continue;
355 
356  float deltaEta = cell->eta() - cluster.eta();
357  deltaEtaSecondMom[layer] += deltaEta * deltaEta * cellEnergy;
358  totalEnergy[layer] += cellEnergy;
359  }
360 
361  for (int layer=0; layer < 3; ++layer) {
362  if (totalEnergy[layer] != 0.) {
363  deltaEtaSecondMom[layer]/=std::abs(totalEnergy[layer]);
364  }
365  else {
366  deltaEtaSecondMom[layer]=0.;
367  }
368  }
369 
370  return deltaEtaSecondMom;
371 }
372 
373 
374 
376  const xAOD::CaloClusterContainer& pi0ClusterContainer,
377  const xAOD::TauJet& tau,
378  const std::vector<const xAOD::PFO*>& shotPFOs,
379  const std::map<unsigned, const xAOD::CaloCluster*>& shotToClusterMap,
380  xAOD::PFO& neutralPFO) const {
381  // Set the properties of the PFO
382  // -- Default value
383  neutralPFO.setBDTPi0Score(-9999.);
384  neutralPFO.setCharge(0);
386 
387  // -- CENTER_MAG
388  double CENTER_MAG = 0.0;
390  ATH_MSG_WARNING("Couldn't retrieve CENTER_MAG moment. Set it to 0.");
391  }
392  neutralPFO.setCenterMag( static_cast<float>(CENTER_MAG));
393 
394  // -- Number of photons
395  std::vector<unsigned> shotsInCluster = getShotsMatchedToCluster(shotPFOs, shotToClusterMap, cluster);
396  int NHitsInEM1 = getNPhotons(shotPFOs, shotsInCluster);
398 
399  // -- Energy at each layer
400  float eEM1 = cluster.eSample(CaloSampling::EMB1) + cluster.eSample(CaloSampling::EME1);
402 
403  float eEM2 = cluster.eSample(CaloSampling::EMB2) + cluster.eSample(CaloSampling::EME2);
405 
406  // -- Number of positive cells in each layer
407  std::vector<int> nPosECells = getNPosECells(cluster);
411 
412  // -- Core Fraction of the energy in EM1
413  float EM1CoreFrac = getEM1CoreFrac(cluster);
415 
416  // -- First moment of deltaEta(cluster, cell) in EM1 and EM2
417  std::vector<float> deltaEtaFirstMom = get1stEtaMomWRTCluster(cluster);
420 
421  // -- Second moment of deltaEta(cluster, cell) in EM1 and EM2
422  std::vector<float> secondEtaWRTClusterPositionInLayer = get2ndEtaMomWRTCluster(cluster);
423  neutralPFO.setAttribute<float>(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM1, secondEtaWRTClusterPositionInLayer.at(1));
424  neutralPFO.setAttribute<float>(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM2, secondEtaWRTClusterPositionInLayer.at(2));
425 
426  // -- Retrieve cluster moments
427  using Moment = xAOD::CaloCluster::MomentType;
428  using Attribute = xAOD::PFODetails::PFOAttributes;
429  const std::array< std::pair<Moment, Attribute>, 12> momentAttributePairs {{
430  {Moment::FIRST_ETA, Attribute::cellBased_FIRST_ETA},
433  {Moment::DELTA_PHI, Attribute::cellBased_DELTA_PHI},
434  {Moment::DELTA_THETA, Attribute::cellBased_DELTA_THETA},
436  {Moment::LATERAL, Attribute::cellBased_LATERAL},
437  {Moment::LONGITUDINAL, Attribute::cellBased_LONGITUDINAL},
438  {Moment::ENG_FRAC_EM, Attribute::cellBased_ENG_FRAC_EM},
439  {Moment::ENG_FRAC_MAX, Attribute::cellBased_ENG_FRAC_MAX},
440  {Moment::ENG_FRAC_CORE, Attribute::cellBased_ENG_FRAC_CORE},
441  {Moment::SECOND_ENG_DENS, Attribute::cellBased_SECOND_ENG_DENS}
442  }};
443 
444  for (const auto& [moment, attribute] : momentAttributePairs) {
445  double value = 0.0;
446  if (! cluster.retrieveMoment(moment, value)) {
447  ATH_MSG_WARNING("Cound not retrieve " << moment);
448  }
449  neutralPFO.setAttribute(attribute, static_cast<float>(value));
450  }
451 
452  // -- Element link to the cluster
454  clusElementLink.toContainedElement(pi0ClusterContainer, &cluster);
455  neutralPFO.setClusterLink( clusElementLink );
456 
457  // -- Element link to the shots
458  std::vector<ElementLink<xAOD::IParticleContainer>> shotlinks;
459  for (unsigned index = 0; index < shotsInCluster.size(); ++index) {
460  auto& shotPFOElementLink = tau.shotPFOLinks().at(shotsInCluster.at(index));
461  ElementLink<xAOD::IParticleContainer> shotElementLink( shotPFOElementLink.dataID(), shotPFOElementLink.index() );
462  if (!shotElementLink.isValid()) {
463  ATH_MSG_WARNING("Created an invalid element link to xAOD::PFO");
464  }
465  shotlinks.push_back(shotElementLink);
466  }
467  if(!neutralPFO.setAssociatedParticleLinks( xAOD::PFODetails::TauShot,shotlinks)) {
468  ATH_MSG_WARNING("Couldn't add shot links to neutral PFO!");
469  }
470 
471  return StatusCode::SUCCESS;
472 }
473 
474 
475 
477  double clusterEnergyHad,
478  xAOD::PFO& hadronicPFO) const {
479  double clusterPtHad = clusterEnergyHad/std::cosh(cluster.eta());
480  hadronicPFO.setP4(clusterPtHad, cluster.eta(), cluster.phi(), 0.);
481 
482  return StatusCode::SUCCESS;
483 }
484 
485 #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
AllowedVariables::e
e
Definition: AsgElectronSelectorTool.cxx:37
TauGNNUtils::Variables::Cluster::CENTER_LAMBDA
bool CENTER_LAMBDA(const xAOD::TauJet &, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
Definition: TauGNNUtils.cxx:851
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
TauPi0ClusterCreator::m_maxDeltaRNeutral
Gaudi::Property< double > m_maxDeltaRNeutral
Definition: TauPi0ClusterCreator.h:83
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:338
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)
TauPi0ClusterCreator::configureHadronicPFO
StatusCode configureHadronicPFO(const xAOD::CaloVertexedTopoCluster &cluster, double clusterEnergyHad, xAOD::PFO &hadronicPFO) const
Configure the haronic PFO.
Definition: TauPi0ClusterCreator.cxx:476
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:161
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:124
xAOD::CaloVertexedClusterBase::phi
virtual double phi() const final
The azimuthal angle ( ) of the particle.
Definition: Event/xAOD/xAODCaloEvent/xAODCaloEvent/CaloVertexedClusterBase.h:79
xAOD::CaloVertexedClusterBase::eta
virtual double eta() const final
The pseudorapidity ( ) of the particle.
Definition: Event/xAOD/xAODCaloEvent/xAODCaloEvent/CaloVertexedClusterBase.h:77
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:908
xAOD::PFODetails::cellBased_secondEtaWRTClusterPosition_EM1
@ cellBased_secondEtaWRTClusterPosition_EM1
Definition: Event/xAOD/xAODPFlow/xAODPFlow/PFODefs.h:138
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:123
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:62
P4Helpers::deltaPhi
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
Definition: P4Helpers.h:34
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:66
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:723
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:692
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:846
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:794
xAOD::CaloCluster_v1::getCellLinks
const CaloClusterCellLink * getCellLinks() const
Get a pointer to the CaloClusterCellLink object (const version)
Definition: CaloCluster_v1.cxx:859
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:240
TauGNNUtils::Variables::Cluster::SECOND_R
bool SECOND_R(const xAOD::TauJet &, const xAOD::CaloVertexedTopoCluster &cluster, double &out)
Definition: TauGNNUtils.cxx:841
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:586
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:927
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:514
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:375
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:131
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:227
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:301
xAOD::CaloVertexedTopoCluster
Evaluate cluster kinematics with a different vertex / signal state.
Definition: Event/xAOD/xAODCaloEvent/xAODCaloEvent/CaloVertexedTopoCluster.h:38
IdentifierHash
This is a "hash" representation of an Identifier. This encodes a 32 bit index which can be used to lo...
Definition: IdentifierHash.h:25
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:266
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:245
constants.EME2
int EME2
Definition: Calorimeter/CaloClusterCorrection/python/constants.py:56
TauPi0ClusterCreator::m_maxDeltaRJetClust
Gaudi::Property< double > m_maxDeltaRJetClust
Definition: TauPi0ClusterCreator.h:84
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:208
xAOD::TauJet_v3::nShotPFOs
size_t nShotPFOs() const
Get the number of shot PFO particles associated with this tau.
Definition: TauJet_v3.cxx:748
xAOD::PFO_v1::setCenterMag
void setCenterMag(float CenterMag)
set CenterMag moment needed for vertex correction