ATLAS Offline Software
Loading...
Searching...
No Matches
DiTauTrackFinder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
8
9
10
12 const std::string& name,
13 const IInterface * parent) :
14 DiTauToolBase(type, name, parent)
15{
16 declareInterface<DiTauToolBase > (this);
17}
18
19
21
22
24
25 ATH_CHECK( m_TrackSelectorTool.retrieve() );
27
28 return StatusCode::SUCCESS;
29}
30
31
33 const EventContext& ctx) const
34{
35 ATH_MSG_DEBUG("execute DiTauTrackFinder...");
36
37 xAOD::DiTauJet *pDiTau = data->xAODDiTau;
38
39 if (pDiTau == nullptr) {
40 ATH_MSG_ERROR("no di-tau candidate given");
41 return StatusCode::FAILURE;
42 }
43
44 // retrieve track container
46
47 std::vector<const xAOD::TrackParticle*> tauTracks; // good tracks in subjets
48 std::vector<const xAOD::TrackParticle*> isoTracks; // good tracks in isolation region
49 std::vector<const xAOD::TrackParticle*> otherTracks; // tracks failing the track criteria
50
51 // get associated primary vertex
52 const xAOD::Vertex* pVertex = nullptr;
53 if (pDiTau->vertexLink().isValid()) {
54 pVertex = *pDiTau->vertexLink();
55 }
56 else {
57 ATH_MSG_WARNING("could not retieve VertexLink in ditau candidate");
58 }
59
60 // get tracks
61 getTracksFromPV(data, pTrackParticleCont.get(), pVertex, tauTracks, isoTracks, otherTracks);
62
63 // clear track links before association
64 pDiTau->clearTrackLinks();
65 pDiTau->clearIsoTrackLinks();
66 pDiTau->clearOtherTrackLinks();
67
68 // drop subjets without good tracks
69 std::vector<fastjet::PseudoJet> vSubjets = data->subjets;
70 int nTracks;
71 for (auto subjet_itr = vSubjets.begin(); subjet_itr != vSubjets.end(); ) {
72 nTracks = 0;
73
74 TLorentzVector temp_p4;
75 temp_p4.SetPtEtaPhiM(subjet_itr->pt(), subjet_itr->eta(), subjet_itr->phi_std(), subjet_itr->m());
76
77 for (const auto& track : tauTracks) {
78 if ( temp_p4.DeltaR(track->p4()) < m_MaxDrSubjet) nTracks++;
79 }
80
81 ATH_MSG_DEBUG("number of tracks in subjet: "<< nTracks);
82
83 if (nTracks == 0) {
84 ATH_MSG_DEBUG("number of tracks is zero. Drop subjet");
85 subjet_itr = vSubjets.erase(subjet_itr); //point subjet_itr to the next element/end of the vector
86 } else if( m_MaxNTracksSubjet != -1 && nTracks > m_MaxNTracksSubjet){
87 ATH_MSG_DEBUG("number of tracks greater than MaxNTracksSubjet threshold. Drop subjet");
88 subjet_itr = vSubjets.erase(subjet_itr); //point subjet_itr to the next element/end of the vector
89 }
90 else {
91 ++subjet_itr;
92 }
93 }
94
95 // check if ditau candidate has still at least 2 subjets
96 if (vSubjets.size()<=1) {
97 ATH_MSG_DEBUG("Found less than 2 subjets. Reject ditau candidate");
98 return StatusCode::FAILURE;
99 }
100
101 data->subjets = vSubjets;
102 ATH_MSG_DEBUG("number of subjets after track association: " << data->subjets.size());
103 // set subjet p4 in xAODDiTau
104 for (unsigned int i = 0; i < vSubjets.size(); i++) {
105 const fastjet::PseudoJet& subjet = vSubjets.at(i);
106 pDiTau->setSubjetPtEtaPhiE(i, subjet.pt(), subjet.eta(), subjet.phi_std(), subjet.e());
107 ATH_MSG_DEBUG("subjet " << i << " pt: " << subjet.pt() << " eta: " << subjet.eta() << " phi: " << subjet.phi_std() << " e: " << subjet.e());
108 }
109 vSubjets.clear();
110
111
112 // associate tau tracks
113 for (const auto& track : tauTracks ) {
114 ATH_MSG_DEBUG("adding subjet track. eta: " << track->eta() << " phi: " << track->phi());
115 pDiTau->addTrack(pTrackParticleCont.get(), track);
116 }
117
118 // associate isolation tracks
119 for (const auto& track : isoTracks ) {
120 ATH_MSG_DEBUG("adding iso track. eta: " << track->eta() << " phi: " << track->phi());
121 pDiTau->addIsoTrack(pTrackParticleCont.get(), track);
122 }
123
124 // associate other tracks
125 for (const auto& track : otherTracks ) {
126 ATH_MSG_DEBUG("adding other track. eta: " << track->eta() << " phi: " << track->phi());
127 pDiTau->addOtherTrack(pTrackParticleCont.get(), track);
128 }
129
130 return StatusCode::SUCCESS;
131}
132
133
135 const xAOD::TrackParticleContainer* pTrackParticleCont,
136 const xAOD::Vertex* pVertex,
137 std::vector<const xAOD::TrackParticle*> &tauTracks,
138 std::vector<const xAOD::TrackParticle*> &isoTracks,
139 std::vector<const xAOD::TrackParticle*> &otherTracks) const {
140
141 for (const auto *const track : *pTrackParticleCont ) {
142 DiTauTrackType type = diTauTrackType(data, track, pVertex);
143
144 if (type == DiTauSubjetTrack)
145 tauTracks.push_back(track);
146 else if (type == DiTauIsoTrack)
147 isoTracks.push_back(track);
148 else if (type == DiTauOtherTrack)
149 otherTracks.push_back(track);
150 }
151
152 std::sort(tauTracks.begin(), tauTracks.end(), TrackSort());
153 std::sort(isoTracks.begin(), isoTracks.end(), TrackSort());
154 std::sort(otherTracks.begin(), otherTracks.end(), TrackSort());
155}
156
157
159 const xAOD::TrackParticle* track,
160 const xAOD::Vertex* pVertex) const {
161
162 xAOD::DiTauJet *pDiTau = data->xAODDiTau;
163
164 // check if track is outside the jet ditau cone
165 if ( pDiTau->p4().DeltaR(track->p4()) > m_MaxDrJet) return OutsideTrack;
166
167 // check quality criteria
168 bool goodTrack = m_TrackSelectorTool->decision(*track, pVertex);
169 if (!goodTrack) return DiTauOtherTrack;
170
171 // check if track is inside a subjet
172 std::vector<fastjet::PseudoJet> vSubjets = data->subjets;
173 for (const auto &subjet : vSubjets) {
174
175 TLorentzVector temp_p4;
176 temp_p4.SetPtEtaPhiM(subjet.pt(), subjet.eta(), subjet.phi_std(), subjet.m());
177
178 if (temp_p4.DeltaR(track->p4()) < m_MaxDrSubjet)
179 return DiTauSubjetTrack;
180 }
181
182 // track is in isolation region
183 return DiTauIsoTrack;
184}
#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)
char data[hepevt_bytes_allocation_ATLAS]
Definition HepEvt.cxx:11
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