ATLAS Offline Software
TauVertexVariables.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #ifndef XAOD_ANALYSIS
6 
9 
12 
13 #include "TauVertexVariables.h"
14 #include <memory>
15 
16 //-----------------------------------------------------------------------------
17 // Constructor
18 //-----------------------------------------------------------------------------
19 
22 }
23 
24 //-----------------------------------------------------------------------------
25 // Destructor
26 //-----------------------------------------------------------------------------
27 
29 
30 
31 //-----------------------------------------------------------------------------
32 // Initializer
33 //-----------------------------------------------------------------------------
34 
36 
37  ATH_CHECK( m_fitTool.retrieve() );
38  ATH_CHECK( m_SeedFinder.retrieve() );
39 
40  return StatusCode::SUCCESS;
41 }
42 
43 //-----------------------------------------------------------------------------
44 // Execution
45 //-----------------------------------------------------------------------------
47 
49  pTau.setSecondaryVertexLink(empty);
51 
52  // try to find secondary vertex if more than 1 track and the tau vertex is available
53  if ( pTau.nTracks() < 2 || pTau.vertex()==nullptr ) {
54  return StatusCode::SUCCESS;
55  }
56 
57  // xAOD TrackParticles
58  std::vector<const xAOD::TrackParticle*> xaodTracks;
59  // standard reconstruction uses Trk::Tracks in SeedFinder
60  std::vector<const Trk::Track*> origTracks;
61  // reconstruction from xAOD uses Trk::TrackParameters (Trk::Track not available)
62  std::vector<const Trk::TrackParameters*> origTrackParameters;
63 
64  for (const xAOD::TauTrack* track : pTau.tracks()) {
65  xaodTracks.push_back(track->track());
66 
67  if(track->track()->track()) {
68  origTracks.push_back(track->track()->track());
69  }
70  else {
71  const Trk::Perigee& perigee = track->track()->perigeeParameters();
72  origTrackParameters.push_back(static_cast<const Trk::TrackParameters*>(&perigee));
73  }
74  }
75 
76  // origTrackParameters should be empty in standard reconstruction, origTracks should be empty when re-running from xAOD
77  // cppcheck-suppress invalidLifetime
78  if(!origTracks.empty() && !origTrackParameters.empty()) {
79  ATH_MSG_ERROR("Inconsistent mix of Trk::Track and Trk::TrackParameter");
80  return StatusCode::FAILURE;
81  }
82 
83  xAOD::Vertex* xAODvertex = nullptr;
84 
85  if(!origTracks.empty()) {
86  // get the starting point for the fit using Trk::Tracks
87  const Amg::Vector3D& seedPoint = m_SeedFinder->findSeed(origTracks);
88  // fitting the vertex
89  xAODvertex = m_fitTool->fit(xaodTracks, seedPoint);
90  }
91  else if (!origTrackParameters.empty()) {
92  // get the starting point for the fit using Trk::TrackParameters
93  const Amg::Vector3D& seedPoint = m_SeedFinder->findSeed(origTrackParameters);
94  // fitting the vertex
95  xAODvertex = m_fitTool->fit(xaodTracks, seedPoint);
96  }
97 
98  if (!xAODvertex) {
99  ATH_MSG_WARNING("no secondary vertex found!");
100  return StatusCode::SUCCESS;
101  }
102 
103  // get the transverse flight path significance
104  double trFlightPS = trFlightPathSig(pTau, *xAODvertex);
105  pTau.setDetail(xAOD::TauJetParameters::trFlightPathSig, static_cast<float>(trFlightPS));
106  ATH_MSG_VERBOSE("transverse flight path significance="<<trFlightPS);
107 
108  // Note, we only attach the 2nd vertex if at offline, otherwise, break the trigger persistency
109  if (!inTrigger()) {
110  ATH_MSG_VERBOSE("secondary vertex recorded! x="<<xAODvertex->position().x()<< ", y="<<xAODvertex->position().y()<<", perp="<<xAODvertex->position().perp());
111  pSecVtxContainer.push_back(xAODvertex);
113  pTau.setSecondaryVertex(&pSecVtxContainer, xAODvertex);
114  }
115  else {
116  delete xAODvertex; // delete the vertex when in trigger mode, because we can not save it
117  }
118 
119  return StatusCode::SUCCESS;
120 }
121 
122 //-------------------------------------------------------------------------
123 // calculate the transverse flight path significance
124 //-------------------------------------------------------------------------
125 double TauVertexVariables::trFlightPathSig(const xAOD::TauJet& pTau, const xAOD::Vertex& secVertex) const {
126 
127  const xAOD::Vertex* pVertex = pTau.vertex();
128  if (pVertex==nullptr) {
129  ATH_MSG_WARNING("No primary vertex information for calculation of transverse flight path significance");
130  return -11111.;
131  }
132 
133  double fpt = (secVertex.position() - pVertex->position()).perp();
134 
135  if (fpt == 0.) {
136  ATH_MSG_WARNING("delta pt of (secVtx - priVtx) is 0!");
137  return -11111.;
138  }
139 
140  double fpx = secVertex.position().x() - pVertex->position().x();
141  double fpy = secVertex.position().y() - pVertex->position().y();
142 
143  double sigma_fpt2 = (fpx * fpx * secVertex.covariancePosition()(Trk::x, Trk::x) +
144  fpx * fpy * secVertex.covariancePosition()(Trk::x, Trk::y) +
145  fpy * fpx * secVertex.covariancePosition()(Trk::y, Trk::x) +
146  fpy * fpy * secVertex.covariancePosition()(Trk::y, Trk::y)) / (fpt * fpt);
147 
148  if (sigma_fpt2 <= 0.) {
149  ATH_MSG_WARNING("sigma delta pt of (secVtx - priVtx) is 0!");
150  return -11111.;
151  }
152 
153  double sign = (fpx * pTau.p4().Px() + fpy * pTau.p4().Py() > 0.) ? 1. : -1.;
154 
155  return sign * fpt / std::sqrt(sigma_fpt2);
156 }
157 
158 #endif
Trk::y
@ y
Definition: ParamDefs.h:56
TauVertexVariables::trFlightPathSig
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...
Definition: TauVertexVariables.cxx:125
TauVertexVariables::TauVertexVariables
TauVertexVariables(const std::string &name)
Definition: TauVertexVariables.cxx:20
xAOD::TauJetParameters::trFlightPathSig
@ trFlightPathSig
Definition: TauDefs.h:163
TauVertexVariables::initialize
virtual StatusCode initialize() override
Tool initializer.
Definition: TauVertexVariables.cxx:35
perp
Scalar perp() const
perp method - perpenticular length
Definition: AmgMatrixBasePlugin.h:44
Trk::ParametersT
Dummy class used to allow special convertors to be called for surfaces owned by a detector element.
Definition: EMErrorDetail.h:25
xAOD::TauJet_v3::nTracks
size_t nTracks(TauJetParameters::TauTrackFlag flag=TauJetParameters::TauTrackFlag::classifiedCharged) const
Definition: TauJet_v3.cxx:488
TauRecToolBase
The base class for all tau tools.
Definition: TauRecToolBase.h:21
xAOD::Vertex_v1::position
const Amg::Vector3D & position() const
Returns the 3-pos.
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
TauRecToolBase::inTrigger
bool inTrigger() const
Definition: TauRecToolBase.h:87
xAOD::Vertex_v1::setVertexType
void setVertexType(VxType::VertexType vType)
Set the type of the vertex.
TauVertexVariables::m_SeedFinder
ToolHandle< Trk::IVertexSeedFinder > m_SeedFinder
Definition: TauVertexVariables.h:43
TauVertexVariables::~TauVertexVariables
~TauVertexVariables()
Definition: TauVertexVariables.cxx:28
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
LinkToXAODTrackParticle.h
xAOD::TauJet_v3::setSecondaryVertex
void setSecondaryVertex(const xAOD::VertexContainer *cont, const xAOD::Vertex *vertex)
Definition: TauJet_v3.cxx:695
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
xAOD::TauJet_v3::setSecondaryVertexLink
void setSecondaryVertexLink(const VertexLink_t &vertexLink)
xAOD::TauJet_v3
Class describing a tau jet.
Definition: TauJet_v3.h:41
sign
int sign(int a)
Definition: TRT_StrawNeighbourSvc.h:108
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
hist_file_dump.f
f
Definition: hist_file_dump.py:140
Trk::ParametersBase
Definition: ParametersBase.h:55
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
TauVertexVariables.h
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
TauVertexVariables::m_fitTool
ToolHandle< Trk::IVertexFitter > m_fitTool
Definition: TauVertexVariables.h:42
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
xAOD::TauJet_v3::vertex
const Vertex * vertex() const
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
xAOD::TauTrack_v1
Definition: TauTrack_v1.h:27
xAOD::TauJet_v3::p4
virtual FourMom_t p4() const
The full 4-momentum of the particle.
Definition: TauJet_v3.cxx:96
xAOD::TauJet_v3::setDetail
void setDetail(TauJetParameters::Detail detail, int value)
Definition: TauJet_v3.cxx:309
xAOD::track
@ track
Definition: TrackingPrimitives.h:513
Trk::x
@ x
Definition: ParamDefs.h:55
AdaptiveVertexFitter.h
xAOD::VxType::NotSpecified
@ NotSpecified
Default value, no explicit type set.
Definition: TrackingPrimitives.h:578
xAOD::TauJet_v3::tracks
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.
Definition: TauJet_v3.cxx:461
TrackParticleContainer.h
TauVertexVariables::executeVertexVariables
virtual StatusCode executeVertexVariables(xAOD::TauJet &pTau, xAOD::VertexContainer &pVertexContainer) const override
Definition: TauVertexVariables.cxx:46
TrackParticleContainer.h