ATLAS Offline Software
Loading...
Searching...
No Matches
TauVertexVariables.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
9
10//-----------------------------------------------------------------------------
11// Constructor
12//-----------------------------------------------------------------------------
13
15 TauRecToolBase(name) {}
16
17//-----------------------------------------------------------------------------
18// Destructor
19//-----------------------------------------------------------------------------
20
22
23
24//-----------------------------------------------------------------------------
25// Initializer
26//-----------------------------------------------------------------------------
27
29
30 ATH_CHECK( m_fitTool.retrieve() );
31 ATH_CHECK( m_SeedFinder.retrieve() );
32
33 return StatusCode::SUCCESS;
34}
35
36//-----------------------------------------------------------------------------
37// Execution
38//-----------------------------------------------------------------------------
40 const EventContext& ctx,
41 xAOD::VertexContainer& pSecVtxContainer) const {
42
46
47 // try to find secondary vertex if more than 1 track and the tau vertex is available
48 if ( pTau.nTracks() < 2 || pTau.vertex()==nullptr ) {
49 return StatusCode::SUCCESS;
50 }
51
52 // xAOD TrackParticles
53 std::vector<const xAOD::TrackParticle*> xaodTracks;
54 // standard reconstruction uses Trk::Tracks in SeedFinder
55 std::vector<const Trk::Track*> origTracks;
56 // reconstruction from xAOD uses Trk::TrackParameters (Trk::Track not available)
57 std::vector<const Trk::TrackParameters*> origTrackParameters;
58
59 for (const xAOD::TauTrack* track : pTau.tracks()) {
60 xaodTracks.push_back(track->track());
61
62 if(track->track()->track()) {
63 origTracks.push_back(track->track()->track());
64 }
65 else {
66 const Trk::Perigee& perigee = track->track()->perigeeParameters();
67 origTrackParameters.push_back(static_cast<const Trk::TrackParameters*>(&perigee));
68 }
69 }
70
71 // origTrackParameters should be empty in standard reconstruction, origTracks should be empty when re-running from xAOD
72 // cppcheck-suppress invalidLifetime
73 if(!origTracks.empty() && !origTrackParameters.empty()) {
74 ATH_MSG_ERROR("Inconsistent mix of Trk::Track and Trk::TrackParameter");
75 return StatusCode::FAILURE;
76 }
77
78 std::unique_ptr<xAOD::Vertex> xAODvertex;
79
80 if(!origTracks.empty()) {
81 // get the starting point for the fit using Trk::Tracks
82 const Amg::Vector3D& seedPoint = m_SeedFinder->findSeed(origTracks);
83 // fitting the vertex
84 xAODvertex = m_fitTool->fit(ctx, xaodTracks, seedPoint);
85 }
86 else if (!origTrackParameters.empty()) {
87 // get the starting point for the fit using Trk::TrackParameters
88 const Amg::Vector3D& seedPoint = m_SeedFinder->findSeed(origTrackParameters);
89 // fitting the vertex
90 xAODvertex = m_fitTool->fit(ctx, xaodTracks, seedPoint);
91 }
92
93 if (!xAODvertex) {
94 ATH_MSG_WARNING("no secondary vertex found!");
95 return StatusCode::SUCCESS;
96 }
97
98 // get the transverse flight path significance
99 double trFlightPS = trFlightPathSig(pTau, *xAODvertex);
100 pTau.setDetail(xAOD::TauJetParameters::trFlightPathSig, static_cast<float>(trFlightPS));
101 ATH_MSG_VERBOSE("transverse flight path significance="<<trFlightPS);
102
103 // Note, we only attach the 2nd vertex if at offline, otherwise, break the trigger persistency
104 if (!inTrigger()) {
105 ATH_MSG_VERBOSE("secondary vertex recorded! x="<<xAODvertex->position().x()<< ", y="<<xAODvertex->position().y()<<", perp="<<xAODvertex->position().perp());
106 xAODvertex->setVertexType(xAOD::VxType::NotSpecified);
107 pSecVtxContainer.push_back(std::move(xAODvertex));
108 pTau.setSecondaryVertex(&pSecVtxContainer, pSecVtxContainer.back());
109 }
110
111 return StatusCode::SUCCESS;
112}
113
114//-------------------------------------------------------------------------
115// calculate the transverse flight path significance
116//-------------------------------------------------------------------------
117double TauVertexVariables::trFlightPathSig(const xAOD::TauJet& pTau, const xAOD::Vertex& secVertex) const {
118
119 const xAOD::Vertex* pVertex = pTau.vertex();
120 if (pVertex==nullptr) {
121 ATH_MSG_WARNING("No primary vertex information for calculation of transverse flight path significance");
122 return -11111.;
123 }
124
125 double fpt = (secVertex.position() - pVertex->position()).perp();
126
127 if (fpt == 0.) {
128 ATH_MSG_WARNING("delta pt of (secVtx - priVtx) is 0!");
129 return -11111.;
130 }
131
132 double fpx = secVertex.position().x() - pVertex->position().x();
133 double fpy = secVertex.position().y() - pVertex->position().y();
134
135 double sigma_fpt2 = (fpx * fpx * secVertex.covariancePosition()(Trk::x, Trk::x) +
136 fpx * fpy * secVertex.covariancePosition()(Trk::x, Trk::y) +
137 fpy * fpx * secVertex.covariancePosition()(Trk::y, Trk::x) +
138 fpy * fpy * secVertex.covariancePosition()(Trk::y, Trk::y)) / (fpt * fpt);
139
140 if (sigma_fpt2 <= 0.) {
141 ATH_MSG_WARNING("sigma delta pt of (secVtx - priVtx) is 0!");
142 return -11111.;
143 }
144
145 double sign = (fpx * pTau.p4().Px() + fpy * pTau.p4().Py() > 0.) ? 1. : -1.;
146
147 return sign * fpt / std::sqrt(sigma_fpt2);
148}
149
150#endif
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
int sign(int a)
static const Attributes_t empty
const T * back() const
Access the last element in the collection as an rvalue.
value_type push_back(value_type pElem)
Add an element to the end of the collection.
TauRecToolBase(const std::string &name)
bool inTrigger() const
virtual StatusCode executeTool(xAOD::TauJet &pTau, const EventContext &ctx, xAOD::VertexContainer &pVertexContainer) const override
double trFlightPathSig(const xAOD::TauJet &pTau, const xAOD::Vertex &secVertex) const
determines the transverse flight path significance from the primary vertex and the secondary vertex o...
ToolHandle< Trk::IVertexFitter > m_fitTool
TauVertexVariables(const std::string &name)
ToolHandle< Trk::IVertexSeedFinder > m_SeedFinder
virtual StatusCode initialize() override
Tool initializer.
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition TauJet_v3.cxx:96
void setSecondaryVertexLink(const VertexLink_t &vertexLink)
void setDetail(TauJetParameters::Detail detail, int value)
const Vertex * vertex() const
void setSecondaryVertex(const xAOD::VertexContainer *cont, const xAOD::Vertex *vertex)
size_t nTracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
std::vector< const TauTrack * > tracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
Get the v<const pointer> to a given tauTrack collection associated with this tau.
const Amg::Vector3D & position() const
Returns the 3-pos.
Eigen::Matrix< double, 3, 1 > Vector3D
ParametersT< TrackParametersDim, Charged, PerigeeSurface > Perigee
@ x
Definition ParamDefs.h:55
@ y
Definition ParamDefs.h:56
ParametersBase< TrackParametersDim, Charged > TrackParameters
@ NotSpecified
Default value, no explicit type set.
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container 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