ATLAS Offline Software
Loading...
Searching...
No Matches
TauTrackFinder.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#ifndef XAOD_ANALYSIS
6
8
9#include "TauTrackFinder.h"
11
12
13TauTrackFinder::TauTrackFinder(const std::string& name) :
14 TauRecToolBase(name)
15{}
16
18
19// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
21
22 // retrieve tools
24
25 if(!m_trackToVertexTool.empty()){
26 ATH_CHECK( m_trackToVertexTool.retrieve() );
27 m_applyZ0cut = true;
28 }
29
31
32 // initialize ReadHandleKey
34 // allow empty for LRT
36
38 if(inTrigger()) {
39 ATH_MSG_ERROR ("Ghost matching is not a valid tau-track association scheme for trigger, use cone association. Aborting.");
40 return StatusCode::FAILURE;
41 }
42 ATH_MSG_INFO ("Using ghost matching for tau-track association" << m_ghostTrackDR );
43 // allow empty for trigger
45 }
46
47 ATH_CHECK( m_beamSpotKey.initialize(inTrigger()) );
48
49 return StatusCode::SUCCESS;
50}
51
52// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
54 const EventContext& ctx,
55 xAOD::TauTrackContainer& tauTrackCon) const {
56
57 std::vector<const xAOD::TrackParticle*> tauTracks;
58 std::vector<const xAOD::TrackParticle*> wideTracks;
59 std::vector<const xAOD::TrackParticle*> otherTracks;
60
61 //Retrieve standard track container
62 const xAOD::TrackParticleContainer* trackParticleCont = nullptr;
63
65 if (!trackPartInHandle.isValid()) {
66 ATH_MSG_ERROR ("Could not retrieve HiveDataObj with key " << trackPartInHandle.key());
67 return StatusCode::FAILURE;
68 }
69 trackParticleCont = trackPartInHandle.cptr();
70
71 //Retrieve LRT container
72 const xAOD::TrackParticleContainer* largeD0TracksParticleCont = nullptr;
73 std::vector<const xAOD::TrackParticle*> vecTrksLargeD0;
74 if (! m_largeD0TracksInputContainer.empty()) {
76 if (!trackPartInHandle.isValid()) {
77 ATH_MSG_VERBOSE ("Could not retrieve HiveDataObj with key " << trackPartInHandle.key());
78 ATH_MSG_VERBOSE ("LRT container " << trackPartInHandle.key()<<" is not being used for tau tracks");
79 }
80 else {
81 largeD0TracksParticleCont = trackPartInHandle.cptr();
82 vecTrksLargeD0 = std::vector<const xAOD::TrackParticle*>(largeD0TracksParticleCont->begin(), largeD0TracksParticleCont->end());
83 }
84 }
85
86
87
88 // retrieve the seed jet container when using ghost-matching
89 const xAOD::JetContainer* jetContainer = nullptr;
90 if (! m_jetContainer.empty()) {
92 if (!jetContHandle.isValid()) {
93 ATH_MSG_ERROR ("Could not retrieve HiveDataObj with key " << jetContHandle.key());
94 return StatusCode::FAILURE;
95 }
96 jetContainer = jetContHandle.cptr();
97 }
98 // in EleRM reco, we need the original track particles
99 std::vector<const xAOD::TrackParticle*> vecTrks;
100 vecTrks.reserve( trackParticleCont->size() );
101 for (auto trk : *trackParticleCont){
102 if (!inEleRM()) { vecTrks.push_back(trk); }
103 else{
104 static const SG::ConstAccessor<ElementLink<xAOD::TrackParticleContainer>> acc_originalObject("ERMOriginalTrack");
105 auto original_id_track_link = acc_originalObject(*trk);
106 if (!original_id_track_link.isValid()) {
107 ATH_MSG_ERROR("Original track link is not valid");
108 continue;
109 }
110 vecTrks.push_back(*original_id_track_link);
111 }
112 }
113
114 // get the primary vertex
115 const xAOD::Vertex* pVertex = pTau.vertex();
116
117 // retrieve tracks wrt a vertex
118 // as a vertex is used: tau origin / PV / beamspot / 0,0,0 (in this order, depending on availability)
119
120 getTauTracksFromPV(pTau, vecTrks, pVertex, m_useGhostTracks, jetContainer, tauTracks, wideTracks, otherTracks);
121
122 bool foundLRTCont = bool (largeD0TracksParticleCont != nullptr);
123 // additional LRT with vertex association added to tracks
124 if (foundLRTCont){
125 // for now, use cone association for LRTs, not ghost association
126 getTauTracksFromPV(pTau, vecTrksLargeD0, pVertex, false, nullptr, tauTracks, wideTracks, otherTracks);
127 }
128
129 // remove core and wide tracks outside a maximal delta z0 wrt lead core track
130 if (m_applyZ0cut) {
131 this->removeOffsideTracksWrtLeadTrk(ctx, tauTracks, wideTracks, otherTracks, pVertex, m_z0maxDelta);
132 }
133
135 bool alreadyUsed = false;
136 for (std::vector<const xAOD::TrackParticle*>::iterator track_it = tauTracks.begin(); track_it != tauTracks.end() ;)
137 {
138 alreadyUsed = false;
139 //loop over all up-to-now core tracks
140 for( const xAOD::TauTrack* tau_trk : tauTrackCon ) {
141 //originally it was coreTrack&passTrkSelector
143 if( (*track_it) == tau_trk->track()) alreadyUsed = true;
144 }
145 //if this track has already been used by another tau, don't associate it to this new one
146 if(alreadyUsed) {
147 ATH_MSG_INFO( "Found Already Used track new, now removing: " << *track_it );
148 track_it = tauTracks.erase(track_it);
149 } else ++track_it;
150 }
151 }
152
153 // associate track to tau candidate and calculate charge
154 float charge = 0.;
155 for (unsigned int i = 0; i < tauTracks.size(); ++i) {
156 const xAOD::TrackParticle* trackParticle = tauTracks.at(i);
157
158 ATH_MSG_VERBOSE(name() << " adding core track nr: " << i
159 << " eta " << trackParticle->eta()
160 << " phi " << trackParticle->phi());
161
162 charge += trackParticle->charge();
163
164 xAOD::TauTrack* track = new xAOD::TauTrack();
165 tauTrackCon.push_back(track);
166
168 linkToTrackParticle.toContainedElement(*static_cast<const xAOD::TrackParticleContainer*>(trackParticle->container()), trackParticle);
169 if (foundLRTCont && isLargeD0Track(trackParticle)){//Check LRT track and link to container
171 }
172 else {
174 }
175 track->addTrackLink(linkToTrackParticle);
176
177 track->setP4(trackParticle->pt(), trackParticle->eta(), trackParticle->phi(), trackParticle->m());
180 // in case TrackClassifier is not run, still get sensible results
183
185 linkToTauTrack.toContainedElement(tauTrackCon, track);
186 pTau.addTauTrackLink(linkToTauTrack);
187
188 ATH_MSG_VERBOSE(name() << " added core track nr: " << i
189 << " eta " << pTau.track(i)->eta()
190 << " phi " << pTau.track(i)->phi());
191 }
192 // set the charge, which is defined by the core tau tracks only
193 pTau.setCharge(charge);
194
195 for (unsigned int i = 0; i < wideTracks.size(); ++i) {
196 const xAOD::TrackParticle* trackParticle = wideTracks.at(i);
197
198 ATH_MSG_VERBOSE(name() << " adding wide track nr: " << i
199 << " eta " << trackParticle->eta()
200 << " phi " << trackParticle->phi());
201
202 xAOD::TauTrack* track = new xAOD::TauTrack();
203 tauTrackCon.push_back(track);
204
206 linkToTrackParticle.toContainedElement(*static_cast<const xAOD::TrackParticleContainer*>(trackParticle->container()), trackParticle);
207 if (foundLRTCont && isLargeD0Track(trackParticle)){//Check LRT track and link to container
209 }
210 else {
212 }
213 track->addTrackLink(linkToTrackParticle);
214
215 track->setP4(trackParticle->pt(), trackParticle->eta(), trackParticle->phi(), trackParticle->m());
218 // in case TrackClassifier is not run, still get sensible results
219 track->setFlag(xAOD::TauJetParameters::TauTrackFlag::classifiedIsolation, true); // for sake of trigger, reset in TauTrackClassifier
220 track->setFlag(xAOD::TauJetParameters::TauTrackFlag::modifiedIsolationTrack, true); // for sake of trigger, reset in TauTrackClassifier
222
224 linkToTauTrack.toContainedElement(tauTrackCon, track);
225 pTau.addTauTrackLink(linkToTauTrack);
226 }
227
228 //These are set again in TauTrackClassifier
229 pTau.setDetail(xAOD::TauJetParameters::nChargedTracks, static_cast<int>(pTau.nTracks()));
231
232 for (unsigned int i = 0; i < otherTracks.size(); ++i) {
233 const xAOD::TrackParticle* trackParticle = otherTracks.at(i);
234
235 ATH_MSG_VERBOSE(name() << " adding other track nr: " << i
236 << " eta " << trackParticle->eta()
237 << " phi " << trackParticle->phi());
238
239 xAOD::TauTrack* track = new xAOD::TauTrack();
240 tauTrackCon.push_back(track);
241
243 if (foundLRTCont && isLargeD0Track(trackParticle)){//Check LRT track and link to container
244 linkToTrackParticle.toContainedElement(*static_cast<const xAOD::TrackParticleContainer*>(trackParticle->container()), trackParticle);
246 }
247 else {
248 linkToTrackParticle.toContainedElement(*static_cast<const xAOD::TrackParticleContainer*>(trackParticle->container()), trackParticle);
250 }
251 track->addTrackLink(linkToTrackParticle);
252
253 track->setP4(trackParticle->pt(), trackParticle->eta(), trackParticle->phi(), trackParticle->m());
254 float dR = track->p4().DeltaR(pTau.p4());
256 else track->setFlag(xAOD::TauJetParameters::TauTrackFlag::wideTrack, true);
258
260 linkToTauTrack.toContainedElement(tauTrackCon, track);
261 pTau.addTauTrackLink(linkToTauTrack);
262 }
263
265 // keep track of total number of associated tracks, in case of tau track thinning
266 pTau.setDetail(xAOD::TauJetParameters::nAllTracks, static_cast<int>(pTau.nAllTracks()));
267
268 ATH_MSG_DEBUG("numTrack: " << "/" << pTau.nTracks());
269 ATH_MSG_DEBUG("charge: " << "/" << pTau.charge());
270
271 // impact parameter variables w.r.t. tau vertex
272 const xAOD::Vertex* vxcand = nullptr;
273
274 xAOD::Vertex vxbkp;
275 vxbkp.makePrivateStore();
276
277 // FIXME: don't we want to use the beamspot in the offline reconstruction too, when there is no reconstructed primary vertex?
278 if (pTau.vertex()!=nullptr && pTau.vertex()->vertexType() != xAOD::VxType::NoVtx) {
279 vxcand = pTau.vertex();
280 }
281 else if (inTrigger()) { // online: use vertex with x-y coordinates from the beamspot and the z from the leading track
282 vxbkp.setX(0); vxbkp.setY(0); vxbkp.setZ(0);
283
285 if(beamSpotHandle.isValid()) {
286 vxbkp.setPosition(beamSpotHandle->beamPos());
287 const auto& cov = beamSpotHandle->beamVtx().covariancePosition();
288 vxbkp.setCovariancePosition(cov);
289
290 if(!tauTracks.empty()) {
291 vxbkp.setZ(tauTracks.at(0)->z0());
292 }
293 }
294 else {
295 ATH_MSG_DEBUG("No Beamspot object in tau candidate");
296 }
297 vxcand = & vxbkp;
298 }
299
300
301 // this could be replaced with TauTrack::setDetail
302 static const SG::Accessor<float> dec_d0TJVA("d0TJVA");
303 static const SG::Accessor<float> dec_z0sinthetaTJVA("z0sinthetaTJVA");
304 static const SG::Accessor<float> dec_d0SigTJVA("d0SigTJVA");
305 static const SG::Accessor<float> dec_z0sinthetaSigTJVA("z0sinthetaSigTJVA");
306
307 for(const ElementLink<xAOD::TauTrackContainer>& trackLink : pTau.allTauTrackLinks())
308 {
309 assert (trackLink.getStorableObjectPointer() == &tauTrackCon);
310 xAOD::TauTrack* track = tauTrackCon[trackLink.index()];
311 dec_d0TJVA(*track) = track->track()->d0();
312 dec_z0sinthetaTJVA(*track) = track->z0sinThetaTJVA(pTau);
313 dec_d0SigTJVA(*track) = -999.;
314 dec_z0sinthetaSigTJVA(*track) = -999.;
315
316 // in the trigger, z0sintheta and corresponding significance are meaningless if we use the beamspot
317 if(vxcand) {
318 std::unique_ptr<const Trk::ImpactParametersAndSigma> myIPandSigma
319 = std::unique_ptr<const Trk::ImpactParametersAndSigma>(m_trackToVertexIPEstimator->estimate(ctx, track->track(), vxcand));
320
321 if(myIPandSigma) {
322 dec_d0TJVA(*track) = myIPandSigma->IPd0;
323 dec_z0sinthetaTJVA(*track) = myIPandSigma->IPz0SinTheta;
324 dec_d0SigTJVA(*track) = (myIPandSigma->sigmad0 != 0.) ? static_cast<float>( myIPandSigma->IPd0 / myIPandSigma->sigmad0 ) : -999.f;
325 dec_z0sinthetaSigTJVA(*track) = (myIPandSigma->sigmaz0SinTheta != 0.) ? static_cast<float>( myIPandSigma->IPz0SinTheta / myIPandSigma->sigmaz0SinTheta ) : -999.f;
326 }
327 }
328 }
329
330 return StatusCode::SUCCESS;
331}
332
333
334// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
336 const xAOD::TrackParticle& trackParticle,
337 const xAOD::Vertex* primaryVertex) const
338{
339 double dR = pTau.p4().DeltaR(trackParticle.p4());
340
341 if (dR > m_maxJetDr_wide) return NotTauTrack;
342
343 bool goodTrack = m_trackSelectorTool_tau->decision(trackParticle, primaryVertex);
344
345 if (goodTrack) {
346 if (dR > m_maxJetDr_tau)
347 return TauTrackWide;
348 else
349 return TauTrackCore;
350 } else
351 return TauTrackOther;
352}
353
354// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
356 const std::vector<const xAOD::TrackParticle*>& vecTrackParticles,
357 const xAOD::Vertex* primaryVertex,
358 const bool& useGhostTracks,
359 const xAOD::JetContainer* jetContainer,
360 std::vector<const xAOD::TrackParticle*> &tauTracks,
361 std::vector<const xAOD::TrackParticle*> &wideTracks,
362 std::vector<const xAOD::TrackParticle*> &otherTracks) const
363{
364 std::vector<const xAOD::TrackParticle*> ghostTracks;
365 if(useGhostTracks) {
366 const xAOD::Jet* seedJet = pTau.jet();
367 if(seedJet) {
368 if(!seedJet->getAssociatedObjects("GhostTrack", ghostTracks)) {
369 ATH_MSG_WARNING("Could not retrieve GhostTrack from seed jet.");
370 }
371 }
372 }
373 // in EleRM reco, we need the original track particles
374 if (inEleRM()){
375 static const SG::ConstAccessor<ElementLink<xAOD::TrackParticleContainer>> acc_originalTrack("ERMOriginalTrack");
376 for (uint i = 0; i < ghostTracks.size(); i++){
377 auto original_id_track_link = acc_originalTrack(*(ghostTracks[i]));
378 if (!original_id_track_link.isValid()) {
379 ATH_MSG_ERROR("Original track link is not valid");
380 continue;
381 }
382 ghostTracks[i] = *original_id_track_link;
383 }
384 }
385
386 for (const xAOD::TrackParticle *trackParticle : vecTrackParticles) {
387 TauTrackType type = tauTrackType(pTau, *trackParticle, primaryVertex);
388 if(type == NotTauTrack) continue;
389
390 if(useGhostTracks) {
391 // require that tracks are ghost-matched with the seed jet at large dR(tau,track), to avoid using tracks from another tau
392 double dR = pTau.p4().DeltaR(trackParticle->p4());
393 if (dR > m_ghostTrackDR) {
394 if (std::find(ghostTracks.begin(), ghostTracks.end(), trackParticle) == ghostTracks.end()) {
395 // check whether the jet closest to the track is the current seed jet
396 // if so, recover the track even if not ghost-matched, to improve tau-track association efficiency at low pt (esp. for 3p)
397 double dRmin = 999.;
398 bool isSeedClosest = false;
399 for (const xAOD::Jet* jet : *jetContainer) {
401 TLorentzVector jetLV;
402 jetLV.SetPtEtaPhiM(jetP4.Pt(), jetP4.Eta(), jetP4.Phi(), jetP4.M());
403 double dRjet = trackParticle->p4().DeltaR(jetLV);
404 if(dRjet < dRmin) {
405 dRmin = dRjet;
406 isSeedClosest = (jet == pTau.jet());
407 }
408 }
409 if(!isSeedClosest) continue;
410 }
411 }
412 }
413
414 if (type == TauTrackCore)
415 tauTracks.push_back(trackParticle);
416 else if (type == TauTrackWide)
417 wideTracks.push_back(trackParticle);
418 else if (type == TauTrackOther)
419 otherTracks.push_back(trackParticle);
420 }
421 std::sort(tauTracks.begin(), tauTracks.end(), TrackSort());
422 std::sort(wideTracks.begin(), wideTracks.end(), TrackSort());
423 std::sort(otherTracks.begin(), otherTracks.end(), TrackSort());
424}
425
426// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
428 std::vector<const xAOD::TrackParticle*> &tauTracks,
429 std::vector<const xAOD::TrackParticle*> &wideTracks,
430 std::vector<const xAOD::TrackParticle*> &otherTracks,
431 const xAOD::Vertex* tauOrigin,
432 double maxDeltaZ0) const
433{
434 float MAX=1e5;
435
436 // need at least one core track to have a leading trk to compare with
437 if (tauTracks.empty()) return;
438
439 // get lead trk parameters
440 const xAOD::TrackParticle *leadTrack = tauTracks.at(0);
441 float z0_leadTrk = getZ0(ctx, leadTrack, tauOrigin);
442
443 if (z0_leadTrk > MAX-1) return; // bad lead trk -> do nothing
444
445 ATH_MSG_VERBOSE("before z0 cut: #coreTracks=" << tauTracks.size() << ", #wideTracks=" << wideTracks.size() << ", #otherTracks=" << otherTracks.size());
446
447 std::vector<const xAOD::TrackParticle*>::iterator itr;
448
449 // skip leading track, because it is the reference
450 itr = tauTracks.begin()+1;
451 while (itr!=tauTracks.end()) {
452 float z0 = getZ0(ctx, *itr, tauOrigin);
453 float deltaZ0=z0 - z0_leadTrk;
454 ATH_MSG_VERBOSE("core Trks: deltaZ0= " << deltaZ0);
455
456 if ( std::abs(deltaZ0) < maxDeltaZ0 ) {++itr;}
457 else {
458 otherTracks.push_back(*itr);
459 itr = tauTracks.erase(itr); //remove from core track collection
460 }
461 }
462
463 // check wide tracks
464 itr = wideTracks.begin();
465 while (itr!=wideTracks.end()) {
466 float z0 = getZ0(ctx, *itr, tauOrigin);
467 float deltaZ0=z0 - z0_leadTrk;
468 ATH_MSG_VERBOSE("wide Trks: deltaZ0= " << deltaZ0);
469
470 if ( std::abs(deltaZ0) < maxDeltaZ0 ) { ++itr; }
471 else {
472 otherTracks.push_back(*itr);
473 itr = wideTracks.erase(itr); //remove from wide track collection
474 }
475 }
476
477 ATH_MSG_VERBOSE("after z0 cut: #coreTracks=" << tauTracks.size() << ", #wideTracks=" << wideTracks.size() << ", #otherTracks=" << otherTracks.size());
478
479 // sort again
480 std::sort(tauTracks.begin(), tauTracks.end(), TrackSort());
481 std::sort(wideTracks.begin(), wideTracks.end(), TrackSort());
482 std::sort(otherTracks.begin(), otherTracks.end(), TrackSort());
483}
484
485// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
486float TauTrackFinder::getZ0(const EventContext& ctx, const xAOD::TrackParticle* track, const xAOD::Vertex* vertex) const
487{
488 float MAX=1e5;
489
490 if (!track) return MAX;
491
492 std::unique_ptr<Trk::Perigee> perigee;
493 if (vertex) perigee = m_trackToVertexTool->perigeeAtVertex(ctx, *track, vertex->position());
494 else perigee = m_trackToVertexTool->perigeeAtVertex(ctx, *track); //will use beamspot or 0,0,0 instead
495
496 if (!perigee) {
497 ATH_MSG_WARNING("Bad track; can't find perigee at vertex.");
498 return MAX;
499 }
500
501 return static_cast<float>(perigee->parameters()[Trk::z0]);
502}
503
505{
506 const std::bitset<xAOD::NumberOfTrackRecoInfo> patternReco = track->patternRecoInfo();
508 ATH_MSG_DEBUG("LargeD0Track found");
509 return true;
510 }
511
512 return false;
513}
514#endif
#define MAX(x, y)
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
double charge(const T &p)
Definition AtlasPID.h:1008
unsigned int uint
value_type push_back(value_type pElem)
Add an element to the end of the collection.
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
size_type size() const noexcept
Returns the number of elements in the collection.
Helper class to provide type-safe access to aux data.
Helper class to provide constant type-safe access to aux data.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
virtual const std::string & key() const override final
Return the StoreGate ID for the referenced object.
TauRecToolBase(const std::string &name)
bool inEleRM() const
bool inTrigger() const
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackPartInputContainer
TauTrackType tauTrackType(const xAOD::TauJet &tauJet, const xAOD::TrackParticle &trackParticle, const xAOD::Vertex *primaryVertex) const
Gaudi::Property< double > m_ghostTrackDR
virtual StatusCode initialize() override
Algorithm functions.
void getTauTracksFromPV(const xAOD::TauJet &tauJet, const std::vector< const xAOD::TrackParticle * > &vecTrackParticles, const xAOD::Vertex *primaryVertex, const bool &useGhostTracks, const xAOD::JetContainer *jetContainer, std::vector< const xAOD::TrackParticle * > &tauTracks, std::vector< const xAOD::TrackParticle * > &wideTracks, std::vector< const xAOD::TrackParticle * > &otherTracks) const
ToolHandle< Trk::ITrackToVertexIPEstimator > m_trackToVertexIPEstimator
SG::ReadHandleKey< xAOD::JetContainer > m_jetContainer
TauTrackType
Enumerator defining type of tau track.
ToolHandle< Trk::ITrackSelectorTool > m_trackSelectorTool_tau
tools
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_largeD0TracksInputContainer
Gaudi::Property< double > m_maxJetDr_wide
Gaudi::Property< float > m_z0maxDelta
virtual StatusCode executeTool(xAOD::TauJet &pTau, const EventContext &ctx, xAOD::TauTrackContainer &tauTrackCon) const override
Gaudi::Property< double > m_maxJetDr_tau
Gaudi::Property< bool > m_useGhostTracks
void removeOffsideTracksWrtLeadTrk(const EventContext &ctx, std::vector< const xAOD::TrackParticle * > &tauTracks, std::vector< const xAOD::TrackParticle * > &wideTracks, std::vector< const xAOD::TrackParticle * > &otherTracks, const xAOD::Vertex *tauOrigin, double maxDeltaZ0) const
TauTrackFinder(const std::string &name)
Constructor and Destructor.
float getZ0(const EventContext &ctx, const xAOD::TrackParticle *track, const xAOD::Vertex *vertex) const
Some internally used functions.
Gaudi::Property< bool > m_removeDuplicateCoreTracks
bool isLargeD0Track(const xAOD::TrackParticle *track) const
ToolHandle< Reco::ITrackToVertex > m_trackToVertexTool
Helper method to sort tracks.
Definition TrackSort.h:20
std::vector< const T * > getAssociatedObjects(const std::string &name) const
get associated objects as a vector<object> this compact form throws an exception if the object is not...
float charge() const
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition TauJet_v3.cxx:96
void setCharge(float)
const TauTrack * track(size_t i, TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged, int *container_index=0) const
Get the pointer to a given tauTrack associated with this tau /*container index needed by trackNonCons...
void setDetail(TauJetParameters::Detail detail, int value)
const Vertex * vertex() const
size_t nAllTracks() const
const Jet * jet() const
const TauTrackLinks_t & allTauTrackLinks() const
void addTauTrackLink(const ElementLink< TauTrackContainer > &tr)
add a TauTrack to the tau
size_t nTracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
virtual double m() const override final
The invariant mass of the particle..
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .).
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
float charge() const
Returns the charge.
void setCovariancePosition(const AmgSymMatrix(3)&covariancePosition)
Sets the vertex covariance matrix.
void setZ(float value)
Sets the z position.
void setX(float value)
Sets the x position.
void setY(float value)
Sets the y position.
void setPosition(const Amg::Vector3D &position)
Sets the 3-position.
VxType::VertexType vertexType() const
The type of the vertex.
@ z0
Definition ParamDefs.h:64
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
@ NoVtx
Dummy vertex. TrackParticle was not used in vertex fit.
Jet_v1 Jet
Definition of the current "jet version".
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Vertex_v1 Vertex
Define the latest version of the vertex class.
TauTrack_v1 TauTrack
Definition of the current version.
Definition TauTrack.h:16
TauJet_v3 TauJet
Definition of the current "tau version".
Definition TauJet.h:17
@ JetConstitScaleMomentum
Definition JetTypes.h:29
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
TauTrackContainer_v1 TauTrackContainer
Definition of the current TauTrack container version.
JetContainer_v1 JetContainer
Definition of the current "jet container version".
@ SiSpacePointsSeedMaker_LargeD0
ROOT::Math::LorentzVector< ROOT::Math::PtEtaPhiM4D< double > > JetFourMom_t
Base 4 Momentum type for Jet.
Definition JetTypes.h:17