ATLAS Offline Software
Loading...
Searching...
No Matches
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
9
12#include "xAODJet/Jet.h"
13
14
16 TauRecToolBase(name) {
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
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
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
131std::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;
139 if (!shotPFO->attribute(xAOD::PFODetails::PFOAttributes::tauShots_seedHash, seedHashInt)) {
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
208std::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
227int 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));
234 if (! shotPFO->attribute(xAOD::PFODetails::PFOAttributes::tauShots_nPhotons, nPhotons)) {
235 ATH_MSG_WARNING("Can't find NHitsInEM1. Set it to 0.");
236 }
237 totalPhotons += nPhotons;
238 }
239
240 return totalPhotons;
241}
242
244 std::vector<int> &nPosECells,
245 float &coreEnergyEM1,
246 std::vector<float> &deltaEtaFirstMom,
247 std::vector<float> &deltaEtaSecondMom) const {
248
249 float totalEnergyEM1 = 0.;
250 std::vector<float> totalEnergy (3, 0.);
251
252 const CaloClusterCellLink* cellLinks = cluster.getCellLinks();
253 CaloClusterCellLink::const_iterator cellLink = cellLinks->begin();
254 for (; cellLink != cellLinks->end(); ++cellLink) {
255 const CaloCell* cell = static_cast<const CaloCell*>(*cellLink);
256
257 // Only consider PS, EM1, and EM2
258 int sampling = cell->caloDDE()->getSampling();
259 int layer = sampling%4;
260 if (layer >= 3) continue;
261
262 // Only consider positive cells
263 float cellEnergy = cell->e();
264 float cellEnergy_weighted = cellEnergy * cellLink.weight();
265 if (cellEnergy <= 0 && cellEnergy_weighted <= 0) continue;
266
267 float deltaEta = cell->eta() - cluster.eta();
268
269 if (cellEnergy > 0){
270 ++nPosECells[layer];
271
272 deltaEtaFirstMom[layer] += deltaEta * cellEnergy;
273 deltaEtaSecondMom[layer] += deltaEta * deltaEta * cellEnergy;
274 totalEnergy[layer] += cellEnergy;
275 }
276
277 // calculate coreEnergyEM1
278 if (sampling != 1 && sampling != 5) continue;
279
280 if( cellEnergy_weighted > 0){
281
282 totalEnergyEM1 += cellEnergy_weighted;
283 float deltaPhi = P4Helpers::deltaPhi(cell->phi(), cluster.phi());
284
285 // Core region: [0.05, 0.05/8]
286 if(std::abs(deltaPhi) > 0.05 || std::abs(deltaEta) > 2 * 0.025/8.) continue;
287 coreEnergyEM1 += cellEnergy_weighted;
288 }
289 }
290
291 for (int layer=0; layer < 3; ++layer) {
292 if (totalEnergy[layer] != 0.) {
293 deltaEtaFirstMom[layer]/=std::abs(totalEnergy[layer]);
294 deltaEtaSecondMom[layer]/=std::abs(totalEnergy[layer]);
295 }
296 else {
297 deltaEtaFirstMom[layer]=0.;
298 deltaEtaSecondMom[layer]=0.;
299 }
300 }
301
302 coreEnergyEM1 = (totalEnergyEM1 > 0.) ? coreEnergyEM1/totalEnergyEM1 : 0.;
303
304}
305
307 const xAOD::CaloClusterContainer& pi0ClusterContainer,
308 const xAOD::TauJet& tau,
309 const std::vector<const xAOD::PFO*>& shotPFOs,
310 const std::map<unsigned, const xAOD::CaloCluster*>& shotToClusterMap,
311 xAOD::PFO& neutralPFO) const {
312 // Set the properties of the PFO
313 // -- Default value
314 neutralPFO.setBDTPi0Score(-9999.);
315 neutralPFO.setCharge(0);
316 neutralPFO.setAttribute<int>(xAOD::PFODetails::PFOAttributes::nPi0Proto, -1);
317
318 // -- CENTER_MAG
319 double CENTER_MAG = 0.0;
321 ATH_MSG_WARNING("Couldn't retrieve CENTER_MAG moment. Set it to 0.");
322 }
323 neutralPFO.setCenterMag( static_cast<float>(CENTER_MAG));
324
325 // -- Number of photons
326 std::vector<unsigned> shotsInCluster = getShotsMatchedToCluster(shotPFOs, shotToClusterMap, cluster);
327 int NHitsInEM1 = getNPhotons(shotPFOs, shotsInCluster);
328 neutralPFO.setAttribute<int>(xAOD::PFODetails::PFOAttributes::cellBased_NHitsInEM1, NHitsInEM1);
329
330 // -- Energy at each layer
331 float eEM1 = cluster.eSample(CaloSampling::EMB1) + cluster.eSample(CaloSampling::EME1);
332 neutralPFO.setAttribute<float>(xAOD::PFODetails::PFOAttributes::cellBased_energy_EM1, eEM1);
333
334 float eEM2 = cluster.eSample(CaloSampling::EMB2) + cluster.eSample(CaloSampling::EME2);
335 neutralPFO.setAttribute<float>(xAOD::PFODetails::PFOAttributes::cellBased_energy_EM2, eEM2);
336
337 //-- Get variables
338 std::vector<float> deltaEtaFirstMom (3, 0.);
339 std::vector<float> deltaEtaSecondMom (3, 0.);
340 std::vector<int> nPosECells(3, 0);
341 float EM1CoreFrac = 0.;
342
343 getClusterVariables(cluster, nPosECells, EM1CoreFrac, deltaEtaFirstMom, deltaEtaSecondMom);
344
345 // -- Number of positive cells in each layer
346 neutralPFO.setAttribute<int>(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_PS, nPosECells.at(0));
347 neutralPFO.setAttribute<int>(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_EM1, nPosECells.at(1));
348 neutralPFO.setAttribute<int>(xAOD::PFODetails::PFOAttributes::cellBased_NPosECells_EM2, nPosECells.at(2));
349
350 // -- Core Fraction of the energy in EM1
351 neutralPFO.setAttribute<float>(xAOD::PFODetails::PFOAttributes::cellBased_EM1CoreFrac, EM1CoreFrac);
352
353 // -- First moment of deltaEta(cluster, cell) in EM1 and EM2
354 neutralPFO.setAttribute<float>(xAOD::PFODetails::PFOAttributes::cellBased_firstEtaWRTClusterPosition_EM1, deltaEtaFirstMom.at(1));
355 neutralPFO.setAttribute<float>(xAOD::PFODetails::PFOAttributes::cellBased_firstEtaWRTClusterPosition_EM2, deltaEtaFirstMom.at(2));
356
357 // -- Second moment of deltaEta(cluster, cell) in EM1 and EM2
358 neutralPFO.setAttribute<float>(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM1, deltaEtaSecondMom.at(1));
359 neutralPFO.setAttribute<float>(xAOD::PFODetails::PFOAttributes::cellBased_secondEtaWRTClusterPosition_EM2, deltaEtaSecondMom.at(2));
360
361 // -- Retrieve cluster moments
362 using Moment = xAOD::CaloCluster::MomentType;
363 using Attribute = xAOD::PFODetails::PFOAttributes;
364 const std::array< std::pair<Moment, Attribute>, 12> momentAttributePairs {{
365 {Moment::FIRST_ETA, Attribute::cellBased_FIRST_ETA},
366 {Moment::SECOND_R, Attribute::cellBased_SECOND_R},
367 {Moment::SECOND_LAMBDA, Attribute::cellBased_SECOND_LAMBDA},
368 {Moment::DELTA_PHI, Attribute::cellBased_DELTA_PHI},
369 {Moment::DELTA_THETA, Attribute::cellBased_DELTA_THETA},
370 {Moment::CENTER_LAMBDA, Attribute::cellBased_CENTER_LAMBDA},
371 {Moment::LATERAL, Attribute::cellBased_LATERAL},
372 {Moment::LONGITUDINAL, Attribute::cellBased_LONGITUDINAL},
373 {Moment::ENG_FRAC_EM, Attribute::cellBased_ENG_FRAC_EM},
374 {Moment::ENG_FRAC_MAX, Attribute::cellBased_ENG_FRAC_MAX},
375 {Moment::ENG_FRAC_CORE, Attribute::cellBased_ENG_FRAC_CORE},
376 {Moment::SECOND_ENG_DENS, Attribute::cellBased_SECOND_ENG_DENS}
377 }};
378
379 for (const auto& [moment, attribute] : momentAttributePairs) {
380 double value = 0.0;
381 if (! cluster.retrieveMoment(moment, value)) {
382 ATH_MSG_WARNING("Cound not retrieve " << moment);
383 }
384 neutralPFO.setAttribute(attribute, static_cast<float>(value));
385 }
386
387 // -- Element link to the cluster
389 clusElementLink.toContainedElement(pi0ClusterContainer, &cluster);
390 neutralPFO.setClusterLink( clusElementLink );
391
392 // -- Element link to the shots
393 std::vector<ElementLink<xAOD::IParticleContainer>> shotlinks;
394 for (unsigned index = 0; index < shotsInCluster.size(); ++index) {
395 auto& shotPFOElementLink = tau.shotPFOLinks().at(shotsInCluster.at(index));
396 ElementLink<xAOD::IParticleContainer> shotElementLink( shotPFOElementLink.dataID(), shotPFOElementLink.index() );
397 if (!shotElementLink.isValid()) {
398 ATH_MSG_WARNING("Created an invalid element link to xAOD::PFO");
399 }
400 shotlinks.push_back(shotElementLink);
401 }
402 if(!neutralPFO.setAssociatedParticleLinks( xAOD::PFODetails::TauShot,shotlinks)) {
403 ATH_MSG_WARNING("Couldn't add shot links to neutral PFO!");
404 }
405
406 return StatusCode::SUCCESS;
407}
408
409
410
412 double clusterEnergyHad,
413 xAOD::PFO& hadronicPFO) const {
414 double clusterPtHad = clusterEnergyHad/std::cosh(cluster.eta());
415 hadronicPFO.setP4(clusterPtHad, cluster.eta(), cluster.phi(), 0.);
416
417 return StatusCode::SUCCESS;
418}
419
420#endif
Scalar deltaPhi(const MatrixBase< Derived > &vec) const
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
static const Attributes_t empty
Data object for each calorimeter readout cell.
Definition CaloCell.h:57
value_type push_back(value_type pElem)
Add an element to the end of the collection.
This is a "hash" representation of an Identifier.
Gaudi::Property< double > m_maxDeltaRJetClust
void getClusterVariables(const xAOD::CaloCluster &cluster, std::vector< int > &nPosECells, float &coreEnergyEM1, std::vector< float > &deltaEtaFirstMom, std::vector< float > &secondEtaWRTClusterPositionInLayer) const
eta moment in PS, EM1 and EM2 w.r.t cluster eta
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.
Gaudi::Property< double > m_clusterEtCut
virtual StatusCode executePi0ClusterCreator(xAOD::TauJet &pTau, xAOD::PFOContainer &neutralPFOContainer, xAOD::PFOContainer &hadronicClusterPFOContainer, const xAOD::CaloClusterContainer &pi0CaloClusContainer) const override
StatusCode configureHadronicPFO(const xAOD::CaloVertexedTopoCluster &cluster, double clusterEnergyHad, xAOD::PFO &hadronicPFO) const
Configure the haronic PFO.
Gaudi::Property< double > m_maxDeltaRNeutral
std::map< unsigned, const xAOD::CaloCluster * > getShotToClusterMap(const std::vector< const xAOD::PFO * > &shotVector, const xAOD::CaloClusterContainer &pi0ClusterContainer, const xAOD::TauJet &pTau) const
std::vector< unsigned > getShotsMatchedToCluster(const std::vector< const xAOD::PFO * > &shotVector, const std::map< unsigned, const xAOD::CaloCluster * > &clusterToShotMap, const xAOD::CaloCluster &pi0Cluster) const
int getNPhotons(const std::vector< const xAOD::PFO * > &shotVector, const std::vector< unsigned > &shotsInCluster) const
TauPi0ClusterCreator(const std::string &name)
TauRecToolBase(const std::string &name)
bool retrieveMoment(MomentType type, double &value) const
Retrieve individual moment.
const CaloClusterCellLink * getCellLinks() const
Get a pointer to the CaloClusterCellLink object (const version)
virtual double eta() const
The pseudorapidity ( ) of the particle.
float eSample(const CaloSample sampling) const
virtual double phi() const
The azimuthal angle ( ) of the particle.
MomentType
Enums to identify different moments.
@ CENTER_MAG
Cluster Centroid ( )
virtual FourMom_t p4() const final
The full 4-momentum of the particle.
virtual double phi() const final
The azimuthal angle ( ) of the particle.
virtual double eta() const final
The pseudorapidity ( ) of the particle.
Evaluate cluster kinematics with a different vertex / signal state.
bool attribute(PFODetails::PFOAttributes AttributeType, T &anAttribute) const
get a PFO Variable via enum
void setAttribute(PFODetails::PFOAttributes AttributeType, const T &anAttribute)
Set a PFO Variable via enum - overwrite is allowed.
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
bool setClusterLink(const ElementLink< xAOD::CaloClusterContainer > &theCluster)
Set a cluster constituent - does NOT append to existing container.
Definition PFO_v1.cxx:549
void setCenterMag(float CenterMag)
set CenterMag moment needed for vertex correction
void setP4(const FourMom_t &vec)
set the 4-vec
Definition PFO_v1.cxx:107
void setBDTPi0Score(float BDTPi0Score)
set BDT Score used to classify clusters as Pi0 like or not
void setCharge(float charge)
set charge of PFO
std::vector< xAOD::CaloVertexedTopoCluster > vertexedClusters() const
void setHadronicPFOLinks(const PFOLinks_t &hadronicPFOs)
size_t nShotPFOs() const
Get the number of shot PFO particles associated with this tau.
const PFO * shotPFO(size_t i) const
Get the pointer to a given shot PFO associated with this tau.
const PFOLinks_t & shotPFOLinks() const
const Vertex * vertex() const
void setProtoNeutralPFOLinks(const PFOLinks_t &protoNeutralPFOs)
void addHadronicPFOLink(const ElementLink< PFOContainer > &pfo)
add a hadronic PFO to the tau
void addProtoNeutralPFOLink(const ElementLink< PFOContainer > &pfo)
add a cellbased_neutral PFO to the tau
double deltaPhi(double phiA, double phiB)
delta Phi in range [-pi,pi[
Definition P4Helpers.h:34
Definition index.py:1
bool doPi0andShots(const xAOD::TauJet &tau)
Determines whether pi0s and shots should be built for a tau candidate.
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 ...
PFO_v1 PFO
Definition of the current "pfo version".
Definition PFO.h:17
PFOContainer_v1 PFOContainer
Definition of the current "pfo container version".
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
Vertex_v1 Vertex
Define the latest version of the vertex class.
TauJet_v3 TauJet
Definition of the current "tau version".
CaloClusterContainer_v1 CaloClusterContainer
Define the latest version of the calorimeter cluster container.