ATLAS Offline Software
Loading...
Searching...
No Matches
TauAxisSetter.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 "TauAxisSetter.h"
9
10TauAxisSetter::TauAxisSetter(const std::string& name) :
11TauRecToolBase(name) {}
12
13StatusCode TauAxisSetter::execute(xAOD::TauJet& tau) const {
14
15 if (tau.jet() == nullptr) {
16 ATH_MSG_ERROR("Tau jet link is invalid.");
17 return StatusCode::FAILURE;
18 }
19
20 const xAOD::Jet* jetSeed = tau.jet();
21
22 // store all jet constituents p4 in a vector
23 std::vector<TLorentzVector> jet_const_vec;
24 // Barycenter is the sum of cluster p4 in the seed jet
25 TLorentzVector baryCenter;
26
27 xAOD::JetConstituentVector constituents = jetSeed->getConstituents();
28 for (TLorentzVector const_p4; const xAOD::JetConstituent* constituent : constituents) {
29 const_p4 = tauRecTools::GetConstituentP4(*constituent);
30 baryCenter += const_p4;
31 jet_const_vec.push_back(const_p4);
32 }
33
34 ATH_MSG_DEBUG("barycenter (eta, phi): " << baryCenter.Eta() << " " << baryCenter.Phi());
35
36 // Detector axis is the total p4 of clusters within m_clusterCone core of the barycenter
37 TLorentzVector tauDetectorAxis;
38
39 for (const auto& constituentP4 : jet_const_vec) {
40 if (baryCenter.DeltaR(constituentP4) > m_clusterCone) continue;
41 tauDetectorAxis += constituentP4;
42 }
43
44 if (tauDetectorAxis.Pt() == 0. && !m_doVertexCorrection) {
45 ATH_MSG_DEBUG("this tau candidate does not have any constituent clusters!");
46 return StatusCode::FAILURE;
47 }
48
49 ATH_MSG_DEBUG("detector axis:" << tauDetectorAxis.Pt()<< " " << tauDetectorAxis.Eta() << " " << tauDetectorAxis.Phi() << " " << tauDetectorAxis.E());
50 tau.setP4(tauDetectorAxis.Pt(), tauDetectorAxis.Eta(), tauDetectorAxis.Phi(), tau.m());
51 tau.setP4(xAOD::TauJetParameters::DetectorAxis, tauDetectorAxis.Pt(), tauDetectorAxis.Eta(), tauDetectorAxis.Phi(), tauDetectorAxis.M());
52
53
55 // Tau intermediate axis (corrected for tau vertex)
56 TLorentzVector tauInterAxis;
57
58 const xAOD::Vertex* jetVertex = tauRecTools::getJetVertex(*jetSeed);
59
60 // Redo the vertex correction when tau vertex is different from jet vertex
61 if (jetVertex != tau.vertex()) {
62
63 // If seed jet has a vertex, then tau must have one
64 if (tau.vertex() == nullptr) {
65 ATH_MSG_WARNING("The seed jet has a vertex, while the tau candidate does not. It should not happen.");
66 return StatusCode::FAILURE;
67 }
68
69 const xAOD::Vertex* tauVertex = tau.vertex();
70
71 // Relative position of the tau vertex and jet vertex
72 Amg::Vector3D position = tauVertex->position();
73 if (jetVertex != nullptr) {
74 position -= jetVertex->position();
75 }
76
77 // store all jet constituents p4 in a vector to avoid doing vertex correction twice
78 std::vector<TLorentzVector> jet_const_vec_vtxcorr;
79 // Barycenter at the tau vertex
80 TLorentzVector baryCenterTauVertex;
81
82 // Loop over the jet constituents, and calculate the barycenter using the four momentum
83 // corrected to point at tau vertex
84 for (TLorentzVector const_vtxcorr_p4; const xAOD::JetConstituent* constituent : constituents) {
85 const_vtxcorr_p4 = getVertexCorrectedP4(*constituent, position);
86 baryCenterTauVertex += const_vtxcorr_p4;
87 jet_const_vec_vtxcorr.push_back(const_vtxcorr_p4);
88 }
89 ATH_MSG_DEBUG("barycenter (eta, phi) at tau vertex: " << baryCenterTauVertex.Eta() << " " << baryCenterTauVertex.Phi());
90
91 // Tau intermediate axis is the four momentum (corrected to point at tau vertex) of clusters
92 // within m_clusterCone of the barycenter
93 for (const auto& constituent_vtxcorr_P4 : jet_const_vec_vtxcorr) {
94 if (baryCenterTauVertex.DeltaR(constituent_vtxcorr_P4) > m_clusterCone) continue;
95 tauInterAxis += constituent_vtxcorr_P4;
96 }
97 }
98 else {
99 tauInterAxis = tauDetectorAxis;
100 }
101
102 if (tauInterAxis.Pt() == 0.) {
103 ATH_MSG_DEBUG("this tau candidate does not have any constituent clusters!");
104 return StatusCode::FAILURE;
105 }
106
107 ATH_MSG_DEBUG("tau axis:" << tauInterAxis.Pt()<< " " << tauInterAxis.Eta() << " " << tauInterAxis.Phi() << " " << tauInterAxis.E() );
108 tau.setP4(tauInterAxis.Pt(), tauInterAxis.Eta(), tauInterAxis.Phi(), tau.m());
109 tau.setP4(xAOD::TauJetParameters::IntermediateAxis, tauInterAxis.Pt(), tauInterAxis.Eta(), tauInterAxis.Phi(), tauInterAxis.M());
110 } // End of m_doVertexCorrection
111
112 return StatusCode::SUCCESS;
113}
114
115
116
118 const Amg::Vector3D& position) const {
119 TLorentzVector vertexCorrectedP4;
120
121 if (constituent.type() == xAOD::Type::CaloCluster) {
122 const xAOD::CaloCluster* cluster = static_cast<const xAOD::CaloCluster*>(constituent.rawConstituent());
123 vertexCorrectedP4 = xAOD::CaloVertexedTopoCluster(*cluster, position).p4();;
124 }
125 else if ( constituent->type() == xAOD::Type::FlowElement ) {
126 const xAOD::FlowElement* fe = static_cast<const xAOD::FlowElement*>( constituent->rawConstituent() );
127 vertexCorrectedP4 = getVertexCorrectedP4(*fe, position);
128 }
129 else {
130 ATH_MSG_WARNING("Seed jet constituent type not supported, will not do vertex correction !");
131 vertexCorrectedP4 = tauRecTools::GetConstituentP4(constituent);
132 }
133
134 return vertexCorrectedP4;
135}
136
138 const Amg::Vector3D& position) const {
139
140 TLorentzVector vertexCorrectedP4;
141 // Only perfrom vertex corretion for neutral FlowElement
142 if (!fe.isCharged()) {
143 TVector3 pos(position.x(), position.y(), position.z());
144 vertexCorrectedP4 = FEHelpers::getVertexCorrectedFourVec(fe,pos);
145 }
146 else {
147 vertexCorrectedP4 = fe.p4();
148 }
149
150 ATH_MSG_DEBUG("Original fe four momentum, pt: " << fe.pt() <<
151 " eta: " << fe.eta() << " phi: " << fe.phi() << " e: " << fe.e());
152 ATH_MSG_DEBUG("Vertex corrected four momentum, pt: " << vertexCorrectedP4.Pt() <<
153 " eta: " << vertexCorrectedP4.Eta() << " phi: " << vertexCorrectedP4.Phi() << " e: " << vertexCorrectedP4.E());
154
155 return vertexCorrectedP4;
156
157}
158
159#endif
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
TLorentzVector getVertexCorrectedP4(const xAOD::JetConstituent &constituent, const Amg::Vector3D &position) const
Get the vertex corrected four momentum.
Gaudi::Property< bool > m_doVertexCorrection
virtual StatusCode execute(xAOD::TauJet &tau) const override
Execution of this tool.
TauAxisSetter(const std::string &name)
Constructor.
Gaudi::Property< double > m_clusterCone
TauRecToolBase(const std::string &name)
virtual FourMom_t p4() const final
The full 4-momentum of the particle.
Evaluate cluster kinematics with a different vertex / signal state.
virtual double pt() const override
virtual double phi() const override
The azimuthal angle ( ) of the particle.
virtual double eta() const override
The pseudorapidity ( ) of the particle.
virtual double e() const override
The total energy of the particle.
virtual FourMom_t p4() const override
The full 4-momentum of the particle.
A vector of jet constituents at the scale used during jet finding.
4-vector of jet constituent at the scale used during jet finding.
Type::ObjectType type() const
The full 4-momentum of the particle.
const IParticle * rawConstituent() const
Access the real underlying IParticle.
JetConstituentVector getConstituents() const
Return a vector of consituents. The object behaves like vector<const IParticle*>. See JetConstituentV...
Definition Jet_v1.cxx:149
const Vertex * vertex() const
void setP4(double pt, double eta, double phi, double m)
Set methods for IParticle values.
virtual double m() const
The invariant mass of the particle.
const Jet * jet() const
const Amg::Vector3D & position() const
Returns the 3-pos.
Eigen::Matrix< double, 3, 1 > Vector3D
TLorentzVector getVertexCorrectedFourVec(const xAOD::FlowElement &fe, const xAOD::Vertex &vertexToCorrectTo)
Definition FEHelpers.cxx:13
const xAOD::Vertex * getJetVertex(const xAOD::Jet &jet)
Return the vertex of jet candidate.
TLorentzVector GetConstituentP4(const xAOD::JetConstituent &constituent)
@ FlowElement
The object is a track-calo-cluster.
Definition ObjectType.h:52
@ CaloCluster
The object is a calorimeter cluster.
Definition ObjectType.h:39
Jet_v1 Jet
Definition of the current "jet version".
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
FlowElement_v1 FlowElement
Definition of the current "pfo version".
Definition FlowElement.h:16
Vertex_v1 Vertex
Define the latest version of the vertex class.
TauJet_v3 TauJet
Definition of the current "tau version".