ATLAS Offline Software
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 
7 #include "StoreGate/ReadHandle.h"
8 
9 
10 
12  const std::string& name,
13  const IInterface * 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 ) {
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 }
DiTauTrackFinder::m_MaxDrJet
Gaudi::Property< float > m_MaxDrJet
Definition: DiTauTrackFinder.h:63
DiTauTrackFinder::execute
virtual StatusCode execute(DiTauCandidateData *data, const EventContext &ctx) const override
Execute - called for each Ditau candidate.
Definition: DiTauTrackFinder.cxx:32
data
char data[hepevt_bytes_allocation_ATLAS]
Definition: HepEvt.cxx:11
xAOD::DiTauJet_v1::vertexLink
const VertexLink_t & vertexLink() const
DiTauTrackFinder::OutsideTrack
@ OutsideTrack
Definition: DiTauTrackFinder.h:44
xAOD::DiTauJet_v1::p4
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition: DiTauJet_v1.cxx:29
FlavorTagDiscriminants::hbb_key::subjet
const std::string subjet
Definition: HbbConstants.h:18
xAOD::DiTauJet_v1::clearTrackLinks
void clearTrackLinks()
Definition: DiTauJet_v1.cxx:238
DiTauTrackFinder::DiTauTrackFinder
DiTauTrackFinder(const std::string &type, const std::string &name, const IInterface *parent)
Constructor.
Definition: DiTauTrackFinder.cxx:11
xAOD::DiTauJet_v1::clearIsoTrackLinks
void clearIsoTrackLinks()
Definition: DiTauJet_v1.cxx:270
xAOD::DiTauJet_v1::addOtherTrack
void addOtherTrack(const xAOD::TrackParticleContainer *, const xAOD::TrackParticle *)
Definition: DiTauJet_v1.cxx:292
DiTauTrackFinder::getTracksFromPV
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
Definition: DiTauTrackFinder.cxx:134
DiTauTrackFinder::m_TrackSelectorTool
ToolHandle< Trk::ITrackSelectorTool > m_TrackSelectorTool
Definition: DiTauTrackFinder.h:70
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
DiTauTrackFinder::DiTauOtherTrack
@ DiTauOtherTrack
Definition: DiTauTrackFinder.h:43
TrackSort
Helper method to sort tracks.
Definition: TrackSort.h:24
TrackSort.h
DiTauTrackFinder::~DiTauTrackFinder
virtual ~DiTauTrackFinder()
Destructor.
xAOD::DiTauJet_v1::clearOtherTrackLinks
void clearOtherTrackLinks()
Definition: DiTauJet_v1.cxx:302
DiTauTrackFinder::DiTauIsoTrack
@ DiTauIsoTrack
Definition: DiTauTrackFinder.h:42
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
xAOD::DiTauJet_v1::addTrack
void addTrack(const xAOD::TrackParticleContainer *, const xAOD::TrackParticle *)
Definition: DiTauJet_v1.cxx:228
xAOD::DiTauJet_v1::addIsoTrack
void addIsoTrack(const xAOD::TrackParticleContainer *, const xAOD::TrackParticle *)
Definition: DiTauJet_v1.cxx:260
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:85
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
SG::ReadHandle::get
const_pointer_type get() const
Dereference the pointer, but don't cache anything.
DiTauTrackFinder::m_MaxNTracksSubjet
Gaudi::Property< int > m_MaxNTracksSubjet
Definition: DiTauTrackFinder.h:65
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
test_pyathena.parent
parent
Definition: test_pyathena.py:15
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
DiTauTrackFinder.h
xAOD::DiTauJet_v1::setSubjetPtEtaPhiE
void setSubjetPtEtaPhiE(unsigned int numSubjet, float pt, float eta, float phi, float e)
Definition: DiTauJet_v1.cxx:138
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
DiTauToolBase
The base class for all tau tools.
Definition: DiTauToolBase.h:20
DiTauTrackFinder::DiTauSubjetTrack
@ DiTauSubjetTrack
Definition: DiTauTrackFinder.h:41
DiTauTrackFinder::diTauTrackType
DiTauTrackType diTauTrackType(const DiTauCandidateData *, const xAOD::TrackParticle *, const xAOD::Vertex *) const
Definition: DiTauTrackFinder.cxx:158
DiTauTrackFinder::DiTauTrackType
DiTauTrackType
Definition: DiTauTrackFinder.h:40
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
DiTauTrackFinder::m_TrackParticleContainerName
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_TrackParticleContainerName
Definition: DiTauTrackFinder.h:68
xAOD::DiTauJet_v1
Definition: DiTauJet_v1.h:31
DiTauCandidateData
Definition: DiTauCandidateData.h:15
xAOD::track
@ track
Definition: TrackingPrimitives.h:513
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
ReadHandle.h
Handle class for reading from StoreGate.
DiTauTrackFinder::initialize
virtual StatusCode initialize() override
Tool initializer.
Definition: DiTauTrackFinder.cxx:23
DiTauTrackFinder::m_MaxDrSubjet
Gaudi::Property< float > m_MaxDrSubjet
Definition: DiTauTrackFinder.h:64