Check that the current event passes this filter.
44{
45
48
49
50 if(tracks->size() !=0) {
51 SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUphi(
m_KVUphiKey, ctx);
52 SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUtheta(
m_KVUthetaKey, ctx);
53 SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUd0(
m_KVUd0Key, ctx);
54 SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUz0(
m_KVUz0Key, ctx);
55 SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUqOverP(
m_KVUqOverPKey, ctx);
56 SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUChi2(
m_KVUChi2Key, ctx);
57 SG::WriteDecorHandle<xAOD::TrackParticleContainer, float> decoratorKVUusedPV(
m_KVUusedPVKey, ctx);
58 SG::WriteDecorHandle<xAOD::TrackParticleContainer, std::vector<float>> decoratorKVUCovMat(
m_KVUCovMatKey, ctx);
59
60 for (const auto track : *tracks) {
61 if(track){
63
64 std::unique_ptr<
AmgSymMatrix(5)> updateTrackCov =
nullptr;
65 float updatephi = -999;
66 float updatetheta = -999;
67 float updated0 = -999;
68 float updatez0 = -999;
69 float updateqOverP = -999;
70 float updateChi2 = -999;
71 bool usedPrimaryVertex = false;
72 std::vector<float>
vec;
73
74 std::unique_ptr<const Trk::TrackParameters> trackParams = nullptr;
75 float minIP = 1000.;
76
78 int nVtx = 0;
80 if (vxContainer.isValid()) {
85 auto vtxSurface = std::make_unique<Trk::PerigeeSurface>(vtxPos);
86 trackParams =
m_extrapolator->extrapolate(ctx,*tPerigee,*vtxSurface);
87 std::unique_ptr<const Trk::ImpactParametersAndSigma> iPandSigma = nullptr;
89 if(sqrt(iPandSigma->IPd0*iPandSigma->IPd0+iPandSigma->IPz0*iPandSigma->IPz0) < minIP){
90 minIP = sqrt(iPandSigma->IPd0*iPandSigma->IPd0+iPandSigma->IPz0*iPandSigma->IPz0);
91 closestVertex = vtx;
92 }
93 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);
95 nVtx++;
96 }
97 }
98 }else{
100 return StatusCode::FAILURE;
101 }
102
103
104
105 if(closestVertex){
111 auto recVtx = std::make_unique<xAOD::Vertex>();
112 recVtx->makePrivateStore(*closestVertex);
113 auto surface = std::make_unique<const Trk::PerigeeSurface>(globPos);
114 trackParams =
m_extrapolator->extrapolate(ctx,*tPerigee,*surface);
115 auto linearTrack = std::make_unique<Trk::VxTrackAtVertex>(0., nullptr, nullptr, trackParams.get(), nullptr);
116 if(linearTrack){
119 ATH_MSG_VERBOSE(
"Updating linearized track parameters after vertex fit. Track weight = " << linearTrack->weight());
121 ATH_MSG_VERBOSE (
"track info after vertex track updator !"<<*linearTrack );
122 if(linearTrack->perigeeAtVertex()) {
123
124 updateqOverP = linearTrack->perigeeAtVertex()->parameters()[
Trk::qOverP];
125 updated0 = linearTrack->perigeeAtVertex()->parameters()[
Trk::d0];
126 updatez0 = linearTrack->perigeeAtVertex()->parameters()[
Trk::z0];
127 updatephi = linearTrack->perigeeAtVertex()->parameters()[
Trk::phi0];
128 updatetheta = linearTrack->perigeeAtVertex()->parameters()[
Trk::theta];
129
130 updateTrackCov = std::make_unique<AmgSymMatrix(5)>(*linearTrack->perigeeAtVertex()->covariance());
131 updateChi2 = linearTrack->trackQuality().chiSquared();
132
134 }
135 }
136 }
137
138
139 decoratorKVUqOverP(*track) = updateqOverP;
140 decoratorKVUd0(*track) = updated0;
141 decoratorKVUz0(*track) = updatez0;
142 decoratorKVUphi(*track) = updatephi;
143 decoratorKVUtheta(*track) = updatetheta;
144 decoratorKVUChi2(*track) = updateChi2;
145 decoratorKVUusedPV(*track) = usedPrimaryVertex;
146 if (updateTrackCov){
148 }else{
150 }
151 decoratorKVUCovMat(*track) =
vec;
153 }
154 }
156 }
157
158 return StatusCode::SUCCESS;
159}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
std::vector< size_t > vec
#define AmgSymMatrix(dim)
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_KVUCovMatKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_KVUd0Key
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_KVUChi2Key
ToolHandle< Trk::IVertexLinearizedTrackFactory > m_LinearizedTrackFactory
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_KVUz0Key
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_KVUqOverPKey
ToolHandle< Trk::IVertexTrackUpdator > m_vertexTrackUpdator
SG::ReadHandleKey< xAOD::VertexContainer > m_vertexContainerKey
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackContainerKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_KVUphiKey
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_KVUusedPVKey
ToolHandle< Trk::ITrackToVertexIPEstimator > m_IPEstimator
ToolHandle< Trk::IExtrapolator > m_extrapolator
SG::WriteDecorHandleKey< xAOD::TrackParticleContainer > m_KVUthetaKey
size_t nTrackParticles() const
Get the number of tracks associated with this vertex.
float numberDoF() const
Returns the number of degrees of freedom of the vertex fit as float.
VxType::VertexType vertexType() const
The type of the vertex.
float chiSquared() const
Returns the of the vertex fit as float.
const Amg::Vector3D & position() const
Returns the 3-pos.
void compress(const AmgSymMatrix(N) &covMatrix, std::vector< float > &vec)
Eigen::Matrix< double, 3, 1 > Vector3D
ParametersBase< TrackParametersDim, Charged > TrackParameters
Vertex_v1 Vertex
Define the latest version of the vertex class.