ATLAS Offline Software
TrackParameterKVU.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // TrackParametersKVU.cxx, (c) ATLAS Detector software
8 
12 #include <vector>
13 #include <string>
14 
15 // Constructor
17  const std::string& n,
18  const IInterface* p ) :
19  base_class(t, n, p){}
20 
21 // Athena initialize and finalize
23 {
24 
25  if (m_trackContainerKey.empty() || m_vertexContainerKey.empty()) {
26  ATH_MSG_ERROR("No selection variables for the TrackParametersKVU tool!");
27  return StatusCode::FAILURE;
28  }
29 
30  ATH_CHECK(m_trackContainerKey.initialize());
31  ATH_CHECK(m_vertexContainerKey.initialize());
32 
33  m_KVUphiKey = m_trackContainerKey.key() + m_KVUphiKey.key();
34  m_KVUthetaKey = m_trackContainerKey.key() + m_KVUthetaKey.key();
35  m_KVUd0Key = m_trackContainerKey.key() + m_KVUd0Key.key();
36  m_KVUz0Key = m_trackContainerKey.key() + m_KVUz0Key.key();
37  m_KVUqOverPKey = m_trackContainerKey.key() + m_KVUqOverPKey.key();
38  m_KVUChi2Key = m_trackContainerKey.key() + m_KVUChi2Key.key();
39  m_KVUusedPVKey = m_trackContainerKey.key() + m_KVUusedPVKey.key();
40  m_KVUCovMatKey = m_trackContainerKey.key() + m_KVUCovMatKey.key();
41 
42  ATH_CHECK(m_KVUphiKey.initialize());
43  ATH_CHECK(m_KVUthetaKey.initialize());
44  ATH_CHECK(m_KVUd0Key.initialize());
45  ATH_CHECK(m_KVUz0Key.initialize());
46  ATH_CHECK(m_KVUqOverPKey.initialize());
47  ATH_CHECK(m_KVUChi2Key.initialize());
48  ATH_CHECK(m_KVUusedPVKey.initialize());
49  ATH_CHECK(m_KVUCovMatKey.initialize());
50 
51  ATH_CHECK(m_vertexTrackUpdator.retrieve());
52  ATH_CHECK(m_extrapolator.retrieve());
53  ATH_CHECK(m_LinearizedTrackFactory.retrieve());
54  ATH_CHECK(m_IPEstimator.retrieve());
55 
56  ATH_MSG_DEBUG("initialize() ...");
57  ATH_MSG_DEBUG("Successfully retrieved the TrackParametersKVU tool" );
58  return StatusCode::SUCCESS;
59 }
60 
61 // Augmentation
63 {
64  // --- Get the tracks
65  //const xAOD::TrackParticleContainer* tracks = nullptr;
66  SG::ReadHandle<xAOD::TrackParticleContainer> tracks(m_trackContainerKey,ctx);
67  ATH_CHECK( tracks.isValid() );
68 
69  //-- for each track, update track params with vtx considered as extra measurement (choose the closest vtx)
70  if(tracks->size() !=0) {
71  SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUphi(m_KVUphiKey, ctx);
72  SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUtheta(m_KVUthetaKey, ctx);
73  SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUd0(m_KVUd0Key, ctx);
74  SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUz0(m_KVUz0Key, ctx);
75  SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUqOverP(m_KVUqOverPKey, ctx);
76  SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUChi2(m_KVUChi2Key, ctx);
77  SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUusedPV(m_KVUusedPVKey, ctx);
78  SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> decoratorKVUCovMat(m_KVUCovMatKey, ctx);
79 
80  for (const auto track : *tracks) {
81  if(track){
82  const Trk::TrackParameters *tPerigee = &(track->perigeeParameters());
83  // --- list of new variables that will decorate the track
84  std::unique_ptr<AmgSymMatrix(5)> updateTrackCov = nullptr;
85  float updatephi = -999;
86  float updatetheta = -999;
87  float updated0 = -999;
88  float updatez0 = -999;
89  float updateqOverP = -999;
90  float updateChi2 = -999;
91  bool usedPrimaryVertex = false;
92  std::vector<float> vec;
93 
94  std::unique_ptr<const Trk::TrackParameters> trackParams = nullptr;
95  float minIP = 1000.;
96  //--- retrieve closest vertex to track
97  const xAOD::Vertex* closestVertex = nullptr;
98  int nVtx = 0;
99  SG::ReadHandle<xAOD::VertexContainer> vxContainer(m_vertexContainerKey,ctx);
100  if (vxContainer.isValid()) {
101  for (const xAOD::Vertex* vtx: *vxContainer) {
102  if ( (vtx->vertexType() == xAOD::VxType::PriVtx) ||
103  (vtx->vertexType() == xAOD::VxType::PileUp) ) {
104  Amg::Vector3D vtxPos(vtx->position());
105  auto vtxSurface = std::make_unique<Trk::PerigeeSurface>(vtxPos);
106  trackParams = m_extrapolator->extrapolate(ctx,*tPerigee,*vtxSurface);
107  std::unique_ptr<const Trk::ImpactParametersAndSigma> iPandSigma = nullptr;
108  iPandSigma = m_IPEstimator->estimate(trackParams.get(), vtx);
109  if(sqrt(iPandSigma->IPd0*iPandSigma->IPd0+iPandSigma->IPz0*iPandSigma->IPz0) < minIP){
110  minIP = sqrt(iPandSigma->IPd0*iPandSigma->IPd0+iPandSigma->IPz0*iPandSigma->IPz0);
111  closestVertex = vtx;
112  }
113  ATH_MSG_VERBOSE("n vtx pos(x, y, z) IPd0 IPz0 : " << nVtx << " " << vtx->position().x() << " "<< vtx->position().y() << " "<< vtx->position().z() << " " << iPandSigma->IPd0 << " " << iPandSigma->IPz0);
114  ATH_MSG_VERBOSE(" d0,Delta_z0-TrackParticle:" << track->d0() <<", "<< track->z0() - vtx->z() + track->vz());
115  nVtx++;
116  }
117  }
118  }else{
119  ATH_MSG_ERROR ("Couldn't retrieve vxContainer with key: " << m_vertexContainerKey.key() );
120  return StatusCode::FAILURE;
121  } // --- end retrieve closest vertex to track
122 
123 
124  // update the track params with vtx info after linearization of track around it
125  if(closestVertex){
126  ATH_MSG_VERBOSE("Vertex selected position (x y z): " << closestVertex->position().x()<<" "<<closestVertex->position().y()<<" "<<closestVertex->position().z());
127  ATH_MSG_VERBOSE(" type: " << closestVertex->vertexType());
128  ATH_MSG_VERBOSE(" nParticles: " << closestVertex->nTrackParticles());
129  ATH_MSG_VERBOSE(" quality chi2: " << closestVertex->chiSquared() << " " << closestVertex->numberDoF());
130  Amg::Vector3D globPos(closestVertex->position());
131  auto recVtx = std::make_unique<xAOD::Vertex>();
132  recVtx->makePrivateStore(*closestVertex);
133  auto surface = std::make_unique<const Trk::PerigeeSurface>(globPos);
134  trackParams = m_extrapolator->extrapolate(ctx,*tPerigee,*surface);
135  auto linearTrack = std::make_unique<Trk::VxTrackAtVertex>(0., nullptr, nullptr, trackParams.get(), nullptr);
136  if(linearTrack){
137  ATH_MSG_VERBOSE("Linearizing track");
138  m_LinearizedTrackFactory->linearize(*linearTrack,globPos);
139  ATH_MSG_VERBOSE("Updating linearized track parameters after vertex fit. Track weight = " << linearTrack->weight());
140  m_vertexTrackUpdator->update((*linearTrack), (*recVtx));
141  ATH_MSG_VERBOSE ("track info after vertex track updator !"<<*linearTrack );
142  if(linearTrack->perigeeAtVertex()) {
143  //retrieve & store updated track param qOverP,d0, z0,theta,phi after KVU
144  updateqOverP = linearTrack->perigeeAtVertex()->parameters()[Trk::qOverP];
145  updated0 = linearTrack->perigeeAtVertex()->parameters()[Trk::d0];
146  updatez0 = linearTrack->perigeeAtVertex()->parameters()[Trk::z0];
147  updatephi = linearTrack->perigeeAtVertex()->parameters()[Trk::phi0];
148  updatetheta = linearTrack->perigeeAtVertex()->parameters()[Trk::theta];
149  //retrieve & store updated track cov matrix plus save the KVU Chi2
150  updateTrackCov = std::make_unique<AmgSymMatrix(5)>(*linearTrack->perigeeAtVertex()->covariance());
151  updateChi2 = linearTrack->trackQuality().chiSquared();
152  // store whether this used the PV or not
153  usedPrimaryVertex = closestVertex->vertexType()==xAOD::VxType::PriVtx;
154  }
155  }
156  }// --- end if closest vertex
157 
158  //decorate tracks with new updated track parameters:
159  decoratorKVUqOverP(*track) = updateqOverP;
160  decoratorKVUd0(*track) = updated0;
161  decoratorKVUz0(*track) = updatez0;
162  decoratorKVUphi(*track) = updatephi;
163  decoratorKVUtheta(*track) = updatetheta;
164  decoratorKVUChi2(*track) = updateChi2;
165  decoratorKVUusedPV(*track) = usedPrimaryVertex;
166  if (updateTrackCov){
167  Amg::compress(*updateTrackCov, vec);
168  }else{
169  vec.assign(5, 0.0);
170  }
171  decoratorKVUCovMat(*track) = vec;
172  ATH_MSG_VERBOSE("track updated.");
173  } // --- end if(track)
174  } // --- end loop tracks
175  ATH_MSG_VERBOSE("All tracks updated.");
176  }
177 
178  return StatusCode::SUCCESS;
179 }
DerivationFramework::TrackParametersKVU::initialize
virtual StatusCode initialize() override
Definition: TrackParameterKVU.cxx:22
xAOD::Vertex_v1::nTrackParticles
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
Definition: Vertex_v1.cxx:270
Amg::compress
void compress(const AmgSymMatrix(N) &covMatrix, std::vector< float > &vec)
Definition: EventPrimitivesHelpers.h:56
TrackParametersKVU.h
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
EventPrimitivesHelpers.h
DerivationFramework::TrackParametersKVU::TrackParametersKVU
TrackParametersKVU(const std::string &t, const std::string &n, const IInterface *p)
Constructor with parameters.
Definition: TrackParameterKVU.cxx:16
Trk::z0
@ z0
Definition: ParamDefs.h:64
Trk::ImpactParametersAndSigma::IPd0
double IPd0
Definition: ITrackToVertexIPEstimator.h:34
xAOD::Vertex_v1::position
const Amg::Vector3D & position() const
Returns the 3-pos.
vec
std::vector< size_t > vec
Definition: CombinationsGeneratorTest.cxx:9
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
xAOD::Vertex_v1::vertexType
VxType::VertexType vertexType() const
The type of the vertex.
AmgSymMatrix
#define AmgSymMatrix(dim)
Definition: EventPrimitives.h:50
CxxUtils::vec
typename vecDetail::vec_typedef< T, N >::type vec
Define a nice alias for the vectorized type.
Definition: vec.h:207
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:209
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
beamspotman.n
n
Definition: beamspotman.py:727
Trk::theta
@ theta
Definition: ParamDefs.h:66
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
SG::WriteDecorHandle
Handle class for adding a decoration to an object.
Definition: StoreGate/StoreGate/WriteDecorHandle.h:100
WriteDecorHandle.h
Handle class for adding a decoration to an object.
xAOD::VxType::PriVtx
@ PriVtx
Primary vertex.
Definition: TrackingPrimitives.h:572
Trk::ImpactParametersAndSigma::IPz0
double IPz0
Definition: ITrackToVertexIPEstimator.h:35
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
Trk::ParametersBase
Definition: ParametersBase.h:55
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
xAOD::VxType::PileUp
@ PileUp
Pile-up vertex.
Definition: TrackingPrimitives.h:574
Trk::d0
@ d0
Definition: ParamDefs.h:63
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
xAOD::Vertex_v1::numberDoF
float numberDoF() const
Returns the number of degrees of freedom of the vertex fit as float.
xAOD::Vertex_v1::chiSquared
float chiSquared() const
Returns the of the vertex fit as float.
xAOD::Vertex_v1
Class describing a Vertex.
Definition: Vertex_v1.h:42
DerivationFramework::TrackParametersKVU::addBranches
virtual StatusCode addBranches(const EventContext &ctx) const override
Check that the current event passes this filter.
Definition: TrackParameterKVU.cxx:62
Trk::qOverP
@ qOverP
perigee
Definition: ParamDefs.h:67
xAOD::track
@ track
Definition: TrackingPrimitives.h:513
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
Trk::phi0
@ phi0
Definition: ParamDefs.h:65