18 const IInterface*
p ) :
25 if (m_trackContainerKey.empty() || m_vertexContainerKey.empty()) {
26 ATH_MSG_ERROR(
"No selection variables for the TrackParametersKVU tool!");
27 return StatusCode::FAILURE;
30 ATH_CHECK(m_trackContainerKey.initialize());
31 ATH_CHECK(m_vertexContainerKey.initialize());
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();
51 ATH_CHECK(m_vertexTrackUpdator.retrieve());
53 ATH_CHECK(m_LinearizedTrackFactory.retrieve());
57 ATH_MSG_DEBUG(
"Successfully retrieved the TrackParametersKVU tool" );
58 return StatusCode::SUCCESS;
70 if(tracks->
size() !=0) {
80 for (
const auto track : *tracks) {
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;
94 std::unique_ptr<const Trk::TrackParameters> trackParams =
nullptr;
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);
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);
119 ATH_MSG_ERROR (
"Couldn't retrieve vxContainer with key: " << m_vertexContainerKey.key() );
120 return StatusCode::FAILURE;
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);
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()) {
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];
150 updateTrackCov = std::make_unique<AmgSymMatrix(5)>(*linearTrack->perigeeAtVertex()->covariance());
151 updateChi2 = linearTrack->trackQuality().chiSquared();
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;
178 return StatusCode::SUCCESS;