115 const std::vector<const Trk::TrackParameters*> & originalPerigees,
118 if ( originalPerigees.empty() )
125 double chi2 = 2000000000000.;
126 unsigned int nRP = originalPerigees.size();
127 int ndf = nRP * ( 5-3 ) - 3;
128 if ( ndf == -1 ) ndf = 1;
131 bool constraint =
false;
132 if ( firstStartingPoint.covariancePosition().trace() != 0. )
137 ATH_MSG_VERBOSE(firstStartingPoint.covariancePosition().inverse().eval());
140 double chi2New=0.;
double chi2Old=0.;
144 auto fittedVertex = std::make_unique<xAOD::Vertex>();
145 fittedVertex->makePrivateStore();
147 std::vector<VxTrackAtVertex> tracksAtVertex;
148 std::vector<BilloirTrack> billoirTracks;
158 billoirTracks.clear();
168 BilloirVertex billoirVertex;
170 for (
const auto *originalPerigee : originalPerigees)
173 if ( linTrack==
nullptr )
175 ATH_MSG_DEBUG(
"Could not linearize track! Skipping this track!");
181 locXpVec[0] = locXpVec[0] - linPoint[0];
182 locXpVec[1] = locXpVec[1] - linPoint[1];
183 locXpVec[2] = locXpVec[2] - linPoint[2];
193 AmgMatrix(2,2) billoirCovMat = linTrack->expectedCovarianceAtPCA().block<2,2>(0,0);
196 AmgMatrix(2,2) billoirWeightMat = billoirCovMat.inverse().eval();
200 D = linTrack->positionJacobian().block<2,3>(0,0);
205 BilloirTrack locBilloirTrack;
206 locBilloirTrack.xpVec = locXpVec;
207 locBilloirTrack.DtWD = (D.transpose())*billoirWeightMat*D;
208 locBilloirTrack.chi2 = -1.0;
209 billoirVertex.DtWD_Sum += locBilloirTrack.DtWD;
210 locBilloirTrack.DtWDx = ((D.transpose())*billoirWeightMat*D)*locXpVec;
211 billoirVertex.DtWDx_Sum += locBilloirTrack.DtWDx;
212 locBilloirTrack.originalPerigee = originalPerigee;
213 billoirTracks.push_back ( locBilloirTrack );
215 delete linTrack; linTrack=
nullptr;
217 if ( billoirTracks.empty() )
219 ATH_MSG_DEBUG(
"No linearized tracks left after linearization! Should not happen!");
226 constraintPosInBilloirFrame.setZero();
228 constraintPosInBilloirFrame[0] = firstStartingPoint.
position() [0]-linPoint [0];
229 constraintPosInBilloirFrame[1] = firstStartingPoint.
position() [1]-linPoint [1];
230 constraintPosInBilloirFrame[2] = firstStartingPoint.
position() [2]-linPoint [2];
231 billoirVertex.DtWDx_Sum += firstStartingPoint.covariancePosition().inverse().eval() *constraintPosInBilloirFrame;
232 billoirVertex.DtWD_Sum += firstStartingPoint.covariancePosition().inverse().eval();
235 AmgMatrix(3,3) cov_delta_V_mat = billoirVertex.DtWD_Sum.inverse( ) ;
237 Amg::Vector3D delta_V = cov_delta_V_mat * billoirVertex.DtWDx_Sum;
239 std::vector<BilloirTrack>::iterator BTIter;
240 for ( BTIter = billoirTracks.begin(); BTIter != billoirTracks.end() ; ++BTIter )
245 diff[0] = ( *BTIter ).xpVec[0] - delta_V[0];
246 diff[1] = ( *BTIter ).xpVec[1] - delta_V[1];
247 diff[2] = ( *BTIter ).xpVec[2] - delta_V[2];
248 ( *BTIter ).chi2 =
diff.dot(( *BTIter ).DtWD*
diff );
249 if ( ( *BTIter ).chi2 < 0 )
251 std::cout <<
"VxFastFit::calculate: error in chi2_per_track: "<<( *BTIter ).chi2<<
"\n";
254 chi2New += ( *BTIter ).chi2;
263 deltaTrk[0] = delta_V[0] - ( firstStartingPoint.
position() [0] - linPoint [0] );
264 deltaTrk[1] = delta_V[1] - ( firstStartingPoint.
position() [1] - linPoint [1] );
265 deltaTrk[2] = delta_V[2] - ( firstStartingPoint.
position() [2] - linPoint [2] );
266 chi2New +=
Amg::chi2(firstStartingPoint.covariancePosition().inverse().eval(), deltaTrk);
271 tmpPos[0] += delta_V[0]; tmpPos[1] += delta_V[1]; tmpPos[2] += delta_V[2];
278 if ( chi2New <
chi2 )
287 fittedVertex->setPosition( linPoint );
288 fittedVertex->setCovariancePosition( cov_delta_V_mat );
289 fittedVertex->setFitQuality(
chi2, ndf );
300 tracksAtVertex.clear();
302 Amg::Vector3D pointToExtrapolateTo ( linPoint [0], linPoint [1], linPoint [2] );
304 for ( BTIter = billoirTracks.begin(); BTIter != billoirTracks.end() ; ++BTIter )
309 auto extrapolatedPerigee = std::unique_ptr<const Trk::TrackParameters> (
m_extrapolator->extrapolate (
311 * ( *BTIter ).originalPerigee,
313 if ( extrapolatedPerigee==
nullptr )
315 extrapolatedPerigee = std::unique_ptr<const Trk::TrackParameters>(((*BTIter).originalPerigee)->clone());
316 ATH_MSG_DEBUG(
"Could not extrapolate these track parameters to final vertex position! Storing original position as final one ...");
320 ( *BTIter ).originalPerigee ) ;
321 tracksAtVertex.push_back ( *tmpVxTrkAtVtx );
323 delete tmpVxTrkAtVtx;
332 fittedVertex->vxTrackAtVertex() = tracksAtVertex;
359 if(vectorTrk.empty())
361 msg(MSG::INFO)<<
"Empty vector of tracks passed"<<
endmsg;
366 std::vector<const Trk::TrackParameters*> measuredPerigees;
368 for(
const auto *i : vectorTrk)
372 if(tmpMeasPer!=
nullptr) measuredPerigees.push_back(tmpMeasPer);
373 else msg(MSG::INFO)<<
"Failed to dynamic_cast this track parameters to perigee"<<
endmsg;
377 std::unique_ptr<xAOD::Vertex> fittedVertex =
fit( ctx, measuredPerigees, constraint );
379 if (fittedVertex ==
nullptr){
385 if( fittedVertex->vxTrackAtVertexAvailable() )
388 if(!fittedVertex->vxTrackAtVertex().empty())
390 for(
unsigned int i = 0; i <vectorTrk.size(); ++i)
394 linkTT->setElement(vectorTrk[i]);
397 ( fittedVertex->vxTrackAtVertex() )[i].setOrigTrack(linkTT);
404 unsigned int VTAVsize = fittedVertex->vxTrackAtVertex().size();
405 for (
unsigned int i = 0 ; i < VTAVsize ; ++i)
410 ATH_MSG_WARNING (
" Trying to set link to xAOD::TrackParticle. The VxTrackAtVertex is not found");
422 fittedVertex->addTrackAtVertex(*linkToXAODTP, VTAV->
weight());
425 ATH_MSG_WARNING (
"Skipping track. Trying to set link to something else than xAOD::TrackParticle. Neutrals not supported.");