225 const EventContext& ctx,
226 const std::vector<Trk::ITrackLink*>& trackVector)
const
234 std::vector<Trk::ITrackLink*> origTracks = trackVector;
235 std::vector<Trk::ITrackLink*> seedTracks = trackVector;
238 std::vector<xAODVertex_pair> myxAODVertices;
243 theVertexContainer->setStore(theVertexAuxContainer);
251 <<
"), skipping vertexing and returning only dummy...");
256 dummyxAODVertex->
setPosition(beamSpot->beamVtx().position());
258 beamSpot->beamVtx().covariancePosition());
259 dummyxAODVertex->
vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
261 return std::make_pair(theVertexContainer, theVertexAuxContainer);
265 unsigned int seedtracknumber = seedTracks.size();
271 std::vector<Trk::ITrackLink*>::iterator seedBegin;
272 std::vector<Trk::ITrackLink*>::iterator seedEnd;
276 seedBegin = seedTracks.begin();
277 seedEnd = seedTracks.end();
279 if (seedtracknumber == 0) {
280 ATH_MSG_DEBUG(
" New iteration. No tracks available after track selection "
281 "for seeding. No finding done.");
289 std::vector<const Trk::TrackParameters*> perigeeList;
290 for (std::vector<Trk::ITrackLink*>::iterator seedtrkAtVtxIter = seedBegin;
291 seedtrkAtVtxIter != seedEnd;
292 ++seedtrkAtVtxIter) {
293 perigeeList.push_back((*seedtrkAtVtxIter)->parameters());
300 theconstraint.
setPosition(beamSpot->beamVtx().position());
302 beamSpot->beamVtx().covariancePosition());
304 beamSpot->beamVtx().fitQuality().chiSquared(),
305 beamSpot->beamVtx().fitQuality().doubleNumberDoF());
306 actualVertex =
m_SeedFinder->findSeed(perigeeList, &theconstraint);
310 looseConstraintCovariance.setIdentity();
311 looseConstraintCovariance = looseConstraintCovariance * 1e+8;
319 msg(MSG::DEBUG) <<
" seed at x: " << actualVertex.x()
320 <<
" at y: " << actualVertex.y()
321 <<
" at z: " << actualVertex.z() <<
endmsg;
324 if (actualVertex.z() == 0.) {
329 std::vector<const Trk::TrackParameters*> perigeesToFit;
330 std::vector<const Trk::TrackParameters*> perigeesToFitSplitVertex;
332 int numberOfTracks(perigeeList.size());
334 std::vector<const Trk::TrackParameters*>::const_iterator perigeeListBegin =
336 std::vector<const Trk::TrackParameters*>::const_iterator perigeeListEnd =
341 for (std::vector<const Trk::TrackParameters*>::const_iterator
342 perigeeListIter = perigeeListBegin;
343 perigeeListIter != perigeeListEnd;
345 if (numberOfTracks <= 2) {
346 perigeesToFit.push_back(*perigeeListIter);
349 perigeesToFit.push_back(*perigeeListIter);
355 perigeesToFit.push_back(*perigeeListIter);
358 perigeesToFitSplitVertex.push_back(*perigeeListIter);
362 double distance = 0.;
364 std::unique_ptr<Trk::PlaneSurface> mySurface =
366 *perigeeListIter, &actualVertex, distance);
368 msg(MSG::WARNING) <<
" ImpactPoint3dEstimator failed to find minimum "
369 "distance between track and vertex seed: "
375 <<
" Distance between track and seed vtx is negative: " << distance
384 if (myPerigee && myPerigee->covariance()) {
390 msg(MSG::ERROR) <<
" Error is zero! " << distance <<
endmsg;
397 perigeesToFit.push_back(*perigeeListIter);
400 perigeesToFitSplitVertex.push_back(*perigeeListIter);
407 if (perigeesToFit.empty()) {
408 ATH_MSG_DEBUG(
" No good seed found. Exiting search for vertices...");
417 std::unique_ptr<xAOD::Vertex> myxAODVertex;
418 std::unique_ptr<xAOD::Vertex> myxAODSplitVertex;
421 myxAODVertex =
m_iVertexFitter->fit(ctx, perigeesToFit, theconstraint);
426 myxAODSplitVertex =
m_iVertexFitter->fit(ctx, perigeesToFitSplitVertex);
433 double ndfSplitVertex = 0.;
434 int ntracksSplitVertex = 0;
437 bool goodVertex = myxAODVertex !=
nullptr &&
442 msg(MSG::DEBUG) <<
" xAOD::Vertex is pointer: " << myxAODVertex
443 <<
" ndf = " << ndf <<
" ntracks (with weight>0.01) "
444 << ntracks <<
" beam constraint "
455 int numberOfAddedTracks = 0;
466 std::vector<Trk::VxTrackAtVertex>* myVxTracksAtVtx =
467 (&(*vxIter)->vxTrackAtVertex());
469 if (!myVxTracksAtVtx)
472 std::vector<Trk::VxTrackAtVertex>::iterator tracksBegin =
473 myVxTracksAtVtx->begin();
474 std::vector<Trk::VxTrackAtVertex>::iterator tracksEnd =
475 myVxTracksAtVtx->end();
477 for (std::vector<Trk::VxTrackAtVertex>::iterator tracksIter =
479 tracksIter != tracksEnd;) {
482 if ((*tracksIter).weight() > 0.01) {
488 (*tracksIter).initialPerigee();
490 if (trackPerigee ==
nullptr) {
492 return std::make_pair(theVertexContainer, theVertexAuxContainer);
495 double chi2_newvtx =
compatibility(*trackPerigee, *myxAODVertex);
496 double chi2_oldvtx =
compatibility(*trackPerigee, *(*vxIter));
500 if (chi2_newvtx < chi2_oldvtx) {
503 <<
") more compatible to new one (chi2= "
504 << chi2_newvtx <<
")");
506 perigeesToFit.push_back(trackPerigee);
509 bool isFound =
false;
511 std::vector<Trk::ITrackLink*>::iterator origBegin =
513 std::vector<Trk::ITrackLink*>::iterator origEnd =
516 for (std::vector<Trk::ITrackLink*>::iterator origIter = origBegin;
519 if ((*origIter)->parameters() == trackPerigee) {
521 seedTracks.push_back(*origIter);
530 numberOfAddedTracks += 1;
538 tracksIter = myVxTracksAtVtx->erase(tracksIter);
539 tracksBegin = myVxTracksAtVtx->begin();
540 tracksEnd = myVxTracksAtVtx->end();
550 if (numberOfAddedTracks > 0) {
552 myxAODVertex =
m_iVertexFitter->fit(ctx, perigeesToFit, theconstraint);
561 goodVertex = myxAODVertex !=
nullptr &&
566 << myxAODVertex <<
" ndf = " << ndf
567 <<
" ntracks (with weight>0.01) " << ntracks
568 <<
" beam constraint "
573 ATH_MSG_DEBUG(
" Adding tracks resulted in an invalid vertex. "
585 bool goodSplitVertex =
false;
588 goodSplitVertex = myxAODSplitVertex !=
nullptr && ndfSplitVertex > 0 &&
589 ntracksSplitVertex >= 2;
592 << myxAODSplitVertex <<
" ndf = " << ndfSplitVertex
593 <<
" ntracks (with weight>0.01) " << ntracksSplitVertex);
595 if (!goodSplitVertex) {
599 myxAODSplitVertex.get(), perigeesToFitSplitVertex, seedTracks);
606 theVertexContainer->
push_back(std::move(myxAODVertex));
612 theVertexContainer->
push_back(std::move(myxAODVertex));
618 dummyxAODVertex->
setPosition(beamSpot->beamVtx().position());
620 beamSpot->beamVtx().covariancePosition());
622 std::vector<Trk::VxTrackAtVertex>();
625 if (goodSplitVertex) {
628 theVertexContainer->
push_back(std::move(myxAODSplitVertex));
634 dummyxAODVertex->
setPosition(beamSpot->beamVtx().position());
636 beamSpot->beamVtx().covariancePosition());
638 std::vector<Trk::VxTrackAtVertex>();
644 }
while (seedTracks.size() > 1 && iterations <
m_maxVertices);
647 ATH_MSG_DEBUG(
"Reached maximum iterations, have "<<iterations<<
" vertices");
658 if (!theVertexContainer->
empty()) {
668 primaryVtx->covariancePosition());
670 std::vector<Trk::VxTrackAtVertex>();
678 else if (theVertexContainer->
empty()) {
683 dummyxAODVertex->
setPosition(beamSpot->beamVtx().position());
685 beamSpot->beamVtx().covariancePosition());
686 dummyxAODVertex->
vxTrackAtVertex() = std::vector<Trk::VxTrackAtVertex>();
691 for (
unsigned int i = 0; i < theVertexContainer->
size() - 1; i++) {
694 " Vtx: " << i <<
" x= " << (*theVertexContainer)[i]->position().
x()
695 <<
" y= " << (*theVertexContainer)[i]->position().
y() <<
" z= "
696 << (*theVertexContainer)[i]->position().
z() <<
" ntracks= "
697 << (*theVertexContainer)[i]->vxTrackAtVertex().
size()
698 <<
" chi2= " << (*theVertexContainer)[i]->chiSquared()
699 <<
" ndf = " << (*theVertexContainer)[i]->numberDoF());
710 std::vector<Trk::ITrackLink*>::iterator origtrkbegin = origTracks.begin();
711 std::vector<Trk::ITrackLink*>::iterator origtrkend = origTracks.end();
715 std::vector<Trk::VxTrackAtVertex>* myVxTracksAtVtx =
716 &((*vxIter)->vxTrackAtVertex());
718 if (!myVxTracksAtVtx)
721 std::vector<Trk::VxTrackAtVertex>::iterator tracksBegin =
722 myVxTracksAtVtx->begin();
723 std::vector<Trk::VxTrackAtVertex>::iterator tracksEnd =
724 myVxTracksAtVtx->end();
728 for (std::vector<Trk::VxTrackAtVertex>::iterator tracksIter = tracksBegin;
729 tracksIter != tracksEnd;
733 for (std::vector<Trk::ITrackLink*>::iterator origtrkiter = origtrkbegin;
734 origtrkiter != origtrkend;
736 if ((*origtrkiter)->parameters() == (*tracksIter).initialPerigee()) {
741 (*tracksIter).setOrigTrack(*origtrkiter);
752 (*vxIter)->addTrackAtVertex(*linkToXAODTP, (*tracksIter).weight());
755 origTracks.erase(origtrkiter);
756 origtrkbegin = origTracks.begin();
757 origtrkend = origTracks.end();
762 ATH_MSG_ERROR(
" Cannot find vector element to fix links (step 4)! ");
767 for (std::vector<Trk::ITrackLink*>::iterator origtrkiter = origtrkbegin;
768 origtrkiter != origtrkend;
770 if ((*origtrkiter) != 0) {
776 return std::make_pair(theVertexContainer, theVertexAuxContainer);
893 std::vector<const Trk::TrackParameters*>& perigeesToFit,
894 std::vector<Trk::ITrackLink*>& seedTracks)
const
899 std::vector<Trk::VxTrackAtVertex>* tracksAtVertex =
902 std::vector<Trk::VxTrackAtVertex>::const_iterator tracksAtVertexBegin =
903 tracksAtVertex->begin();
904 std::vector<Trk::VxTrackAtVertex>::const_iterator tracksAtVertexEnd =
905 tracksAtVertex->end();
907 std::vector<Trk::ITrackLink*>::iterator seedBegin = seedTracks.begin();
908 std::vector<Trk::ITrackLink*>::iterator seedEnd = seedTracks.end();
910 std::vector<const Trk::TrackParameters*>::iterator perigeesToFitBegin =
911 perigeesToFit.begin();
912 std::vector<const Trk::TrackParameters*>::iterator perigeesToFitEnd =
915 for (std::vector<Trk::VxTrackAtVertex>::const_iterator tracksAtVertexIter =
917 tracksAtVertexIter != tracksAtVertexEnd;
918 ++tracksAtVertexIter) {
922 for (std::vector<Trk::ITrackLink*>::iterator seedIter = seedBegin;
925 if ((*seedIter)->parameters() == (*tracksAtVertexIter).initialPerigee()) {
927 if ((*tracksAtVertexIter).weight() > 0.01) {
928 seedTracks.erase(seedIter);
929 seedBegin = seedTracks.begin();
930 seedEnd = seedTracks.end();
937 ATH_MSG_ERROR(
" Cannot find vector element to delete (step 1)! ");
941 for (std::vector<const Trk::TrackParameters*>::iterator perigeesToFitIter =
943 perigeesToFitIter != perigeesToFitEnd;
944 ++perigeesToFitIter) {
945 if (*perigeesToFitIter == (*tracksAtVertexIter).initialPerigee()) {
947 if ((*tracksAtVertexIter).weight() > 0.01) {
948 perigeesToFit.erase(perigeesToFitIter);
949 perigeesToFitBegin = perigeesToFit.begin();
950 perigeesToFitEnd = perigeesToFit.end();
957 ATH_MSG_ERROR(
" Cannot find vector element to delete (step 2)! ");
961 std::vector<Trk::VxTrackAtVertex>* myVxTracksAtVertex =
964 std::vector<Trk::VxTrackAtVertex>::iterator tracksBegin =
965 myVxTracksAtVertex->begin();
966 std::vector<Trk::VxTrackAtVertex>::iterator tracksEnd =
967 myVxTracksAtVertex->end();
969 for (std::vector<const Trk::TrackParameters*>::iterator perigeesToFitIter =
971 perigeesToFitIter != perigeesToFitEnd;
972 ++perigeesToFitIter) {
980 if (myPerigee ==
nullptr) {
990 for (std::vector<Trk::ITrackLink*>::iterator seedIter =
994 if ((*seedIter)->parameters() == *perigeesToFitIter) {
996 seedTracks.erase(seedIter);
997 seedBegin = seedTracks.begin();
998 seedEnd = seedTracks.end();
1004 ATH_MSG_ERROR(
" Cannot find vector element to delete (step 3)! ");
1009 for (std::vector<Trk::VxTrackAtVertex>::iterator tracksIter = tracksBegin;
1010 tracksIter != tracksEnd;
1012 if ((*tracksIter).initialPerigee() == *perigeesToFitIter) {
1016 myVxTracksAtVertex->erase(tracksIter);
1017 tracksBegin = myVxTracksAtVertex->begin();
1018 tracksEnd = myVxTracksAtVertex->end();