ATLAS Offline Software
Loading...
Searching...
No Matches
DiTauTrackFinder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6#include "fastjet/PseudoJet.hh"
7
10
11
12
14 const std::string& name,
15 const IInterface * parent) :
16 DiTauToolBase(type, name, parent)
17{
18 declareInterface<DiTauToolBase > (this);
19}
20
21
23
24
26
27 ATH_CHECK( m_TrackSelectorTool.retrieve() );
29
30 return StatusCode::SUCCESS;
31}
32
33
35 const EventContext& ctx) const
36{
37 ATH_MSG_DEBUG("execute DiTauTrackFinder...");
38
39 xAOD::DiTauJet *pDiTau = data->xAODDiTau;
40
41 if (pDiTau == nullptr) {
42 ATH_MSG_ERROR("no di-tau candidate given");
43 return StatusCode::FAILURE;
44 }
45
46 // retrieve track container
48
49 std::vector<const xAOD::TrackParticle*> tauTracks; // good tracks in subjets
50 std::vector<const xAOD::TrackParticle*> isoTracks; // good tracks in isolation region
51 std::vector<const xAOD::TrackParticle*> otherTracks; // tracks failing the track criteria
52
53 // get associated primary vertex
54 const xAOD::Vertex* pVertex = nullptr;
55 if (pDiTau->vertexLink().isValid()) {
56 pVertex = *pDiTau->vertexLink();
57 }
58 else {
59 ATH_MSG_WARNING("could not retieve VertexLink in ditau candidate");
60 }
61
62 // get tracks
63 getTracksFromPV(data, pTrackParticleCont.get(), pVertex, tauTracks, isoTracks, otherTracks);
64
65 // clear track links before association
66 pDiTau->clearTrackLinks();
67 pDiTau->clearIsoTrackLinks();
68 pDiTau->clearOtherTrackLinks();
69
70 // drop subjets without good tracks
71 std::vector<fastjet::PseudoJet> vSubjets = data->subjets;
72 int nTracks;
73 for (auto subjet_itr = vSubjets.begin(); subjet_itr != vSubjets.end(); ) {
74 nTracks = 0;
75
76 TLorentzVector temp_p4;
77 temp_p4.SetPtEtaPhiM(subjet_itr->pt(), subjet_itr->eta(), subjet_itr->phi_std(), subjet_itr->m());
78
79 for (const auto& track : tauTracks) {
80 if ( temp_p4.DeltaR(track->p4()) < m_MaxDrSubjet) nTracks++;
81 }
82
83 ATH_MSG_DEBUG("number of tracks in subjet: "<< nTracks);
84
85 if (nTracks == 0) {
86 ATH_MSG_DEBUG("number of tracks is zero. Drop subjet");
87 subjet_itr = vSubjets.erase(subjet_itr); //point subjet_itr to the next element/end of the vector
88 } else if( m_MaxNTracksSubjet != -1 && nTracks > m_MaxNTracksSubjet){
89 ATH_MSG_DEBUG("number of tracks greater than MaxNTracksSubjet threshold. Drop subjet");
90 subjet_itr = vSubjets.erase(subjet_itr); //point subjet_itr to the next element/end of the vector
91 }
92 else {
93 ++subjet_itr;
94 }
95 }
96
97 // check if ditau candidate has still at least 2 subjets
98 if (vSubjets.size()<=1) {
99 ATH_MSG_DEBUG("Found less than 2 subjets. Reject ditau candidate");
100 return StatusCode::FAILURE;
101 }
102
103 data->subjets = vSubjets;
104 ATH_MSG_DEBUG("number of subjets after track association: " << data->subjets.size());
105 // set subjet p4 in xAODDiTau
106 for (unsigned int i = 0; i < vSubjets.size(); i++) {
107 const fastjet::PseudoJet& subjet = vSubjets.at(i);
108 pDiTau->setSubjetPtEtaPhiE(i, subjet.pt(), subjet.eta(), subjet.phi_std(), subjet.e());
109 ATH_MSG_DEBUG("subjet " << i << " pt: " << subjet.pt() << " eta: " << subjet.eta() << " phi: " << subjet.phi_std() << " e: " << subjet.e());
110 }
111 vSubjets.clear();
112
113
114 // associate tau tracks
115 for (const auto& track : tauTracks ) {
116 ATH_MSG_DEBUG("adding subjet track. eta: " << track->eta() << " phi: " << track->phi());
117 pDiTau->addTrack(pTrackParticleCont.get(), track);
118 }
119
120 // associate isolation tracks
121 for (const auto& track : isoTracks ) {
122 ATH_MSG_DEBUG("adding iso track. eta: " << track->eta() << " phi: " << track->phi());
123 pDiTau->addIsoTrack(pTrackParticleCont.get(), track);
124 }
125
126 // associate other tracks
127 for (const auto& track : otherTracks ) {
128 ATH_MSG_DEBUG("adding other track. eta: " << track->eta() << " phi: " << track->phi());
129 pDiTau->addOtherTrack(pTrackParticleCont.get(), track);
130 }
131
132 return StatusCode::SUCCESS;
133}
134
135
137 const xAOD::TrackParticleContainer* pTrackParticleCont,
138 const xAOD::Vertex* pVertex,
139 std::vector<const xAOD::TrackParticle*> &tauTracks,
140 std::vector<const xAOD::TrackParticle*> &isoTracks,
141 std::vector<const xAOD::TrackParticle*> &otherTracks) const {
142
143 for (const auto *const track : *pTrackParticleCont ) {
144 DiTauTrackType type = diTauTrackType(data, track, pVertex);
145
146 if (type == DiTauSubjetTrack)
147 tauTracks.push_back(track);
148 else if (type == DiTauIsoTrack)
149 isoTracks.push_back(track);
150 else if (type == DiTauOtherTrack)
151 otherTracks.push_back(track);
152 }
153
154 std::sort(tauTracks.begin(), tauTracks.end(), TrackSort());
155 std::sort(isoTracks.begin(), isoTracks.end(), TrackSort());
156 std::sort(otherTracks.begin(), otherTracks.end(), TrackSort());
157}
158
159
161 const xAOD::TrackParticle* track,
162 const xAOD::Vertex* pVertex) const {
163
164 xAOD::DiTauJet *pDiTau = data->xAODDiTau;
165
166 // check if track is outside the jet ditau cone
167 if ( pDiTau->p4().DeltaR(track->p4()) > m_MaxDrJet) return OutsideTrack;
168
169 // check quality criteria
170 bool goodTrack = m_TrackSelectorTool->decision(*track, pVertex);
171 if (!goodTrack) return DiTauOtherTrack;
172
173 // check if track is inside a subjet
174 std::vector<fastjet::PseudoJet> vSubjets = data->subjets;
175 for (const auto &subjet : vSubjets) {
176
177 TLorentzVector temp_p4;
178 temp_p4.SetPtEtaPhiM(subjet.pt(), subjet.eta(), subjet.phi_std(), subjet.m());
179
180 if (temp_p4.DeltaR(track->p4()) < m_MaxDrSubjet)
181 return DiTauSubjetTrack;
182 }
183
184 // track is in isolation region
185 return DiTauIsoTrack;
186}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Handle class for reading from StoreGate.
DiTauToolBase(const std::string &type, const std::string &name, const IInterface *parent)
DiTauTrackFinder(const std::string &type, const std::string &name, const IInterface *parent)
Constructor.
DiTauTrackType diTauTrackType(const DiTauCandidateData *, const xAOD::TrackParticle *, const xAOD::Vertex *) const
void getTracksFromPV(const DiTauCandidateData *, const xAOD::TrackParticleContainer *, const xAOD::Vertex *, std::vector< const xAOD::TrackParticle * > &, std::vector< const xAOD::TrackParticle * > &, std::vector< const xAOD::TrackParticle * > &) const
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_TrackParticleContainerName
ToolHandle< Trk::ITrackSelectorTool > m_TrackSelectorTool
virtual StatusCode execute(DiTauCandidateData *data, const EventContext &ctx) const override
Execute - called for each Ditau candidate.
virtual StatusCode initialize() override
Tool initializer.
virtual ~DiTauTrackFinder()
Destructor.
Gaudi::Property< int > m_MaxNTracksSubjet
Gaudi::Property< float > m_MaxDrJet
Gaudi::Property< float > m_MaxDrSubjet
const_pointer_type get() const
Dereference the pointer, but don't cache anything.
Helper method to sort tracks.
Definition TrackSort.h:24
virtual FourMom_t p4() const
The full 4-momentum of the particle.
const VertexLink_t & vertexLink() const
void setSubjetPtEtaPhiE(unsigned int numSubjet, float pt, float eta, float phi, float e)
void addOtherTrack(const xAOD::TrackParticleContainer *, const xAOD::TrackParticle *)
void addTrack(const xAOD::TrackParticleContainer *, const xAOD::TrackParticle *)
void addIsoTrack(const xAOD::TrackParticleContainer *, const xAOD::TrackParticle *)
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
DiTauJet_v1 DiTauJet
Definition of the current version.
Definition DiTauJet.h:17