40 std::vector<WrkVrt>* workVerticesContainer )
51 ATH_CHECK( trackHandle.
record(std::make_unique<xAOD::VertexContainer>(),
52 std::make_unique<xAOD::VertexAuxContainer>()) );
53 twoTrksVertexContainer = trackHandle.
ptr();
60 std::vector<const xAOD::TrackParticle*> baseTracks;
61 std::vector<const xAOD::NeutralParticle*> dummyNeutrals;
68 enum recoStep { kStart, kInitVtxPosition, kImpactParamCheck, kVKalVrtFit, kChi2, kVposCut, kPatternMatch };
70 const double maxR { 563. };
71 double roughD0Cut = 100.;
72 double roughZ0Cut = 50.;
79 std::map<const xAOD::TruthVertex*, bool> matchMap;
80 std::unique_ptr<Trk::IVKalState> state =
m_fitSvc->makeState();
95 m_incomp.emplace_back( itrk_id, jtrk_id );
102 if ( !cont_i || !cont_j ) {
112 ATH_MSG_DEBUG(
" link itrk (" << (*itrk)->index() <<
") or jtrk (" << (*jtrk)->index() <<
") is not valid");
125 baseTracks.emplace_back( *itrk );
126 baseTracks.emplace_back( *jtrk );
133 StatusCode
sc =
m_fitSvc->VKalVrtFitFast( baseTracks, initVertex, *state );
134 if(
sc.isFailure() ) {
135 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": fast crude estimation fails ");
139 if( initVertex.perp() > maxR ) {
147 std::vector<double> impactParameters;
148 std::vector<double> impactParErrors;
153 if( fabs( impactParameters.at(0)) > roughD0Cut || fabs( impactParameters.at(1) ) > roughZ0Cut ) {
160 if( fabs( impactParameters.at(0) ) > roughD0Cut || fabs( impactParameters.at(1) ) > roughZ0Cut ) {
165 m_fitSvc->setApproximateVertex( initVertex.x(), initVertex.y(), initVertex.z(), *state );
176 if(
sc.isFailure() ) {
184 const double vPosMomAngT = ( vDist.x()*wrkvrt.
vertexMom.Px()+vDist.y()*wrkvrt.
vertexMom.Py() ) / vDist.perp() / wrkvrt.
vertexMom.Pt();
187 double dphi1 = TVector2::Phi_mpi_pi(vDist.phi() - (*itrk)->phi());
188 double dphi2 = TVector2::Phi_mpi_pi(vDist.phi() - (*jtrk)->phi());
190 const double dist_fromPV = vDist.norm();
198 m_ntupleVars->get< std::vector<int> > (
"All2TrkVrtCharge" ) .emplace_back(wrkvrt.
Charge);
199 m_ntupleVars->get< std::vector<double> >(
"All2TrkVrtX" ) .emplace_back(wrkvrt.
vertex.x());
200 m_ntupleVars->get< std::vector<double> >(
"All2TrkVrtY" ) .emplace_back(wrkvrt.
vertex.y());
201 m_ntupleVars->get< std::vector<double> >(
"All2TrkVrtZ" ) .emplace_back(wrkvrt.
vertex.z());
202 m_ntupleVars->get< std::vector<double> >(
"All2TrkVrtChiSq" ) .emplace_back(wrkvrt.
Chi2);
213 for(
const auto *trk: baseTracks ) {
219 vertex->addTrackAtVertex( trackElementLink, 1. );
223 vertex->setPosition( wrkvrt.
vertex );
224 vertex->setFitQuality( wrkvrt.
Chi2, 1 );
232 pTAcc(*vertex) = wrkvrt.
vertexMom.Perp();
233 chargeAcc(*vertex) = wrkvrt.
Charge;
234 vPosAcc(*vertex) = vPos;
235 isFakeAcc(*vertex) =
true;
241 uint8_t trkiBLHit,trkjBLHit;
245 if(
m_FillNtuple )
m_ntupleVars->get< std::vector<int> >(
"All2TrkSumBLHits" ).emplace_back( trkiBLHit + trkjBLHit );
251 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": failed to pass chi2 threshold." );
257 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": attempting form vertex from ( " << itrk_id <<
", " << jtrk_id <<
" )." );
258 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": candidate vertex: "
259 <<
" isGood = " << (wrkvrt.
isGood?
"true" :
"false")
264 <<
", (r, z) = (" << wrkvrt.
vertex.perp()
265 <<
", " << wrkvrt.
vertex.z() <<
")" );
268 Amg::Vector3D vTruth( truthVertex->x(), truthVertex->y(), truthVertex->z() );
271 const auto distance = vReco - vTruth;
274 cov.fillSymmetric( 0, 0, wrkvrt.
vertexCov.at(0) );
275 cov.fillSymmetric( 1, 0, wrkvrt.
vertexCov.at(1) );
276 cov.fillSymmetric( 1, 1, wrkvrt.
vertexCov.at(2) );
277 cov.fillSymmetric( 2, 0, wrkvrt.
vertexCov.at(3) );
278 cov.fillSymmetric( 2, 1, wrkvrt.
vertexCov.at(4) );
279 cov.fillSymmetric( 2, 2, wrkvrt.
vertexCov.at(5) );
281 const double s2 = distance.transpose() * cov.inverse() * distance;
283 if( distance.norm() < 2.0 || s2 < 100. ) {
284 ATH_MSG_DEBUG (
" > " << __FUNCTION__ <<
": truth-matched candidate! : signif^2 = " << s2 );
285 matchMap.emplace( truthVertex,
true );
290 dynamic_cast<TH2F*
>(
m_hists[
"vPosDist"] )->Fill( wrkvrt.
vertex.perp(), vPos );
291 dynamic_cast<TH2F*
>(
m_hists[
"vPosMomAngTDist"] )->Fill( wrkvrt.
vertex.perp(), vPosMomAngT );
292 m_hists[
"vPosMomAngT"] ->Fill( vPosMomAngT );
293 m_hists[
"vPosMomAng3D"] ->Fill( vPosMomAng3D );
298 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": failed to pass the 2tr vertex min distance from PV cut." );
303 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": failed to pass the vertex angle cut." );
309 if( cos( dphi1 ) < -0.8 && cos( dphi2 ) < -0.8 ) {
310 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": failed to pass the vPos cut. (both tracks are opposite against the vertex pos)" );
314 ATH_MSG_DEBUG(
" > "<< __FUNCTION__ <<
": failed to pass the tightened vPos cut. (at least one track is opposite against the vertex pos)" );
317 if( vPosMomAngT < -0.8 ) {
318 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": failed to pass the vPos cut. (pos-mom directions are opposite)" );
322 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": failed to pass the vPos cut." );
332 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": failed to pass fake rejection algorithm." );
338 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": passed fake rejection." );
345 m_ntupleVars->get< std::vector<int> > (
"AfFakVrtCharge" ) .emplace_back(wrkvrt.
Charge);
346 m_ntupleVars->get< std::vector<double> >(
"AfFakVrtX" ) .emplace_back(wrkvrt.
vertex.x());
347 m_ntupleVars->get< std::vector<double> >(
"AfFakVrtY" ) .emplace_back(wrkvrt.
vertex.y());
348 m_ntupleVars->get< std::vector<double> >(
"AfFakVrtZ" ) .emplace_back(wrkvrt.
vertex.z());
349 m_ntupleVars->get< std::vector<double> >(
"AfFakVrtChiSq" ) .emplace_back(wrkvrt.
Chi2);
355 isFakeAcc(*vertex) =
false;
365 workVerticesContainer->emplace_back( wrkvrt );
367 msg += Form(
" (%d, %d), ", itrk_id, jtrk_id );
370 m_hists[
"initVertexDispD0"]->Fill( roughD0_itrk, initVertex.perp() );
371 m_hists[
"initVertexDispD0"]->Fill( roughD0_jtrk, initVertex.perp() );
372 m_hists[
"initVertexDispZ0"]->Fill( roughZ0_itrk, initVertex.z() );
373 m_hists[
"initVertexDispZ0"]->Fill( roughZ0_jtrk, initVertex.z() );
380 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": compatible track pairs = " <<
msg );
385 for(
auto& pair: matchMap ) {
386 if( pair.second )
m_hists[
"nMatchedTruths"]->Fill( 1, pair.first->perp() );
390 return StatusCode::SUCCESS;
396 std::vector<WrkVrt> *workVerticesContainer )
401 return StatusCode::SUCCESS;
408 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": compatible track pair size = " << compSize );
414 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": incompatibility graph finder mode" );
417 workVerticesContainer->clear();
424 std::vector<long int> weit;
427 weit.emplace_back( pair.first + 1 );
428 weit.emplace_back( pair.second + 1 );
447 long int solutionSize { 0 };
450 std::vector<const xAOD::TrackParticle*> baseTracks;
451 std::vector<const xAOD::NeutralParticle*> dummyNeutrals;
453 std::unique_ptr<Trk::IVKalState> state =
m_fitSvc->makeState();
454 auto pgraph = std::make_unique<Trk::PGraph>();
455 int iterationLimit(2000);
460 pgraph->pgraphm_( weit.data(), nEdges, nTracks, solution.data(), &solutionSize, nth);
462 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": Trk::pgraphm_() output: solutionSize = " << solutionSize );
463 if (0 == iterationLimit--){
464 ATH_MSG_WARNING(
"Iteration limit (2000) reached in VrtSecInclusive::findNtrackVertices, solution size = "<<solutionSize);
467 if(solutionSize <= 0)
break;
468 if(solutionSize == 1)
continue;
472 std::string
msg =
"solution = [ ";
473 for(
int i=0; i< solutionSize; i++) {
474 msg += Form(
"%ld, ", solution[i]-1 );
487 for(
long int i = 0; i<solutionSize; i++) {
495 StatusCode
sc =
m_fitSvc->VKalVrtFitFast( baseTracks, initVertex, *state );
496 if(
sc.isFailure())
ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": fast crude estimation fails ");
498 m_fitSvc->setApproximateVertex( initVertex.x(), initVertex.y(), initVertex.z(), *state );
500 sc =
m_fitSvc->VKalVrtFit(baseTracks, dummyNeutrals,
510 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": FoundAppVrt=" << solutionSize <<
", (r, z) = " << wrkvrt.
vertex.perp() <<
", " << wrkvrt.
vertex.z() <<
", chi2/ndof = " << wrkvrt.
fitQuality() );
512 if(
sc.isFailure() ) {
515 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": VKalVrtFit failed in 2-trk solution ==> give up.");
519 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": VKalVrtFit failed ==> retry...");
527 if( itrk == jtrk )
continue;
528 if( tmp.isGood )
continue;
530 tmp.selectedTrackIndices.clear();
531 tmp.selectedTrackIndices.emplace_back( itrk );
532 tmp.selectedTrackIndices.emplace_back( jtrk );
541 sc =
m_fitSvc->VKalVrtFitFast( baseTracks, initVertex, *state );
542 if(
sc.isFailure() )
ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": fast crude estimation fails ");
544 m_fitSvc->setApproximateVertex( initVertex.x(), initVertex.y(), initVertex.z(), *state );
546 sc =
m_fitSvc->VKalVrtFit(baseTracks, dummyNeutrals,
556 if(
sc.isFailure() )
continue;
564 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Did not find any viable vertex in all 2-trk combinations. Give up.");
571 if( std::find( tmp.selectedTrackIndices.begin(), tmp.selectedTrackIndices.end(), itrk ) != tmp.selectedTrackIndices.end() )
continue;
575 tmp.selectedTrackIndices.emplace_back( itrk );
577 for(
auto& jtrk : tmp.selectedTrackIndices ) { baseTracks.emplace_back(
m_selectedTracks.at(jtrk) ); }
582 sc =
m_fitSvc->VKalVrtFitFast( baseTracks, initVertex, *state );
583 if(
sc.isFailure())
ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": fast crude estimation fails ");
585 m_fitSvc->setApproximateVertex( initVertex.x(), initVertex.y(), initVertex.z(), *state );
587 sc =
m_fitSvc->VKalVrtFit(baseTracks, dummyNeutrals,
597 if(
sc.isFailure() ) {
605 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": VKalVrtFit succeeded; register the vertex to the list.");
609 workVerticesContainer->emplace_back( wrkvrt );
613 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": VKalVrtFit succeeded; register the vertex to the list.");
617 workVerticesContainer->emplace_back( wrkvrt );
626 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": rapid finder mode" );
630 std::set<long int> tracks;
633 std::vector<struct Cluster> clusters;
635 for(
auto& wrkvrt : *workVerticesContainer ) {
637 bool foundCluster =
false;
639 for(
auto& cluster: clusters ) {
640 if( (wrkvrt.vertex - cluster.position).norm() < 1.0 ) {
641 for(
auto& itrk : wrkvrt.selectedTrackIndices ) {
642 cluster.tracks.insert( itrk );
649 if( !foundCluster ) {
651 c.position = wrkvrt.vertex;
652 for(
auto& itrk : wrkvrt.selectedTrackIndices ) {
653 c.tracks.insert( itrk );
655 clusters.emplace_back( c );
656 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": added a new cluster" );
662 std::vector<const xAOD::TrackParticle*> baseTracks;
663 std::vector<const xAOD::NeutralParticle*> dummyNeutrals;
665 workVerticesContainer->clear();
667 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": found cluster size =" << clusters.size() );
669 std::unique_ptr<Trk::IVKalState> state =
m_fitSvc->makeState();
670 for(
auto& cluster : clusters ) {
680 for(
const auto&
index: cluster.tracks) {
688 StatusCode
sc =
m_fitSvc->VKalVrtFitFast( baseTracks, initVertex, *state );
689 if(
sc.isFailure())
ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": fast crude estimation fails ");
691 m_fitSvc->setApproximateVertex( initVertex.x(), initVertex.y(), initVertex.z(), *state );
693 sc =
m_fitSvc->VKalVrtFit(baseTracks, dummyNeutrals,
703 if(
sc.isFailure() ) {
707 workVerticesContainer->emplace_back( wrkvrt );
723 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": Remove vertices fully contained in other vertices .");
724 while( workVerticesContainer->size() > 1 ) {
725 size_t tmpN = workVerticesContainer->size();
728 for(; iv<tmpN-1; iv++) {
730 for(; jv<tmpN; jv++) {
731 const auto nTCom =
nTrkCommon( workVerticesContainer, {iv, jv} );
733 if( nTCom == workVerticesContainer->at(iv).selectedTrackIndices.size() ) { workVerticesContainer->erase(workVerticesContainer->begin()+iv);
break; }
734 else if( nTCom == workVerticesContainer->at(jv).selectedTrackIndices.size() ) { workVerticesContainer->erase(workVerticesContainer->begin()+jv);
break; }
739 if(iv==tmpN-1)
break;
743 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": Identify remaining 2-track vertices with very bad Chi2 and mass (b-tagging).");
744 for(
auto& wrkvrt : *workVerticesContainer ) {
747 if( wrkvrt.selectedTrackIndices.size() != 2 )
continue;
753 return StatusCode::SUCCESS;
759 std::vector<WrkVrt> *workVerticesContainer )
763 return StatusCode::SUCCESS;
769 std::vector<long int> processedTracks;
771 unsigned mergeCounter { 0 };
772 unsigned brokenCounter { 0 };
773 unsigned removeTrackCounter { 0 };
778 long int maxSharedTrack;
779 long int worstMatchingVertex;
786 std::map<long int, std::vector<long int> > trackToVertexMap;
795 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": no shared tracks are found --> exit the while loop." );
799 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": vertex [" << worstMatchingVertex <<
"]: maximally shared track index = " << maxSharedTrack
800 <<
", multiplicity = " << trackToVertexMap.at( maxSharedTrack ).size()
801 <<
", worst chi2_trk = " << worstChi2 );
809 std::vector< std::pair<unsigned, unsigned> > badPairs;
815 unsigned nShared { 0 };
818 auto& vrtList = trackToVertexMap.at( maxSharedTrack );
820 auto nGood = std::count_if( vrtList.begin(), vrtList.end(), [&](
auto& v ) { return workVerticesContainer->at(v).isGood; } );
821 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": size of good vertices = " << nGood );
823 std::vector< std::tuple< std::pair<unsigned, unsigned>, double,
unsigned> > significanceTuple;
824 enum { kIndexPair, kSignificance, kNshared };
826 for(
auto ivrt = vrtList.begin(); ivrt != vrtList.end(); ++ivrt ) {
827 for(
auto jvrt = std::next( ivrt ); jvrt != vrtList.end(); ++jvrt ) {
828 auto pair = std::pair<unsigned, unsigned>( *ivrt, *jvrt );
830 if( !( workVerticesContainer->at(*ivrt).isGood ) )
continue;
831 if( !( workVerticesContainer->at(*jvrt).isGood ) )
continue;
834 if( std::find( badPairs.begin(), badPairs.end(), pair ) != badPairs.end() )
continue;
838 auto& ivrtTrks = workVerticesContainer->at(*ivrt).selectedTrackIndices;
839 auto& jvrtTrks = workVerticesContainer->at(*jvrt).selectedTrackIndices;
841 auto nSharedTracks = std::count_if( ivrtTrks.begin(), ivrtTrks.end(),
843 return std::find( jvrtTrks.begin(), jvrtTrks.end(), index ) != jvrtTrks.end();
846 significanceTuple.emplace_back( pair, signif, nSharedTracks );
850 if( significanceTuple.empty() ) {
851 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": no vertex pairs are found --> exit the while loop." );
855 auto minSignificanceTuple = std::min_element( significanceTuple.begin(), significanceTuple.end(), [&](
auto& t1,
auto&t2 ) { return std::get<kSignificance>(t1) < std::get<kSignificance>(t2); } );
857 indexPair = std::get<kIndexPair> ( *minSignificanceTuple );
858 minSignificance = std::get<kSignificance> ( *minSignificanceTuple );
859 nShared = std::get<kNshared> ( *minSignificanceTuple );
862 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": minSignificance = " << minSignificance );
864 if( minSignificance < m_VertexMergeCut || nShared >= 2 ) {
866 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": attempt to merge vertices " << indexPair.first <<
" and " << indexPair.second );
868 WrkVrt vertex_backup1 = workVerticesContainer->at( indexPair.first );
869 WrkVrt vertex_backup2 = workVerticesContainer->at( indexPair.second );
871 StatusCode
sc =
mergeVertices( workVerticesContainer->at( indexPair.first ), workVerticesContainer->at( indexPair.second ) );
875 if(
sc.isFailure() ) {
877 workVerticesContainer->at( indexPair.first ) = vertex_backup1;
878 workVerticesContainer->at( indexPair.second ) = vertex_backup2;
879 badPairs.emplace_back( indexPair );
884 workVerticesContainer->at( indexPair.second ).isGood =
false;
891 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Merged vertices " << indexPair.first <<
" and " << indexPair.second <<
". merged vertex multiplicity = " << workVerticesContainer->at( indexPair.first ).selectedTrackIndices.size() );
899 auto& wrkvrt = workVerticesContainer->at( worstMatchingVertex );
901 auto end =
std::remove_if( wrkvrt.selectedTrackIndices.begin(), wrkvrt.selectedTrackIndices.end(), [&](
auto&
index ) { return index == maxSharedTrack; } );
902 wrkvrt.selectedTrackIndices.erase( end, wrkvrt.selectedTrackIndices.end() );
904 removeTrackCounter++;
906 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": removed track " << maxSharedTrack <<
" from vertex " << worstMatchingVertex );
908 if( wrkvrt.selectedTrackIndices.size() < 2 ) {
909 wrkvrt.isGood =
false;
915 if(
sc.isFailure() ) {
916 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": detected vertex fitting failure!" );
929 auto& wrkvrt = workVerticesContainer->at( worstMatchingVertex );
931 auto end =
std::remove_if( wrkvrt.selectedTrackIndices.begin(), wrkvrt.selectedTrackIndices.end(), [&](
auto&
index ) { return index == maxSharedTrack; } );
932 wrkvrt.selectedTrackIndices.erase( end, wrkvrt.selectedTrackIndices.end() );
934 if( wrkvrt.nTracksTotal() >=2 ) {
936 auto wrkvrt_backup = wrkvrt;
938 if(
sc.isFailure() ) {
939 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": detected vertex fitting failure!" );
940 wrkvrt = wrkvrt_backup;
944 wrkvrt.isGood =
false;
948 removeTrackCounter++;
950 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": removed track " << maxSharedTrack <<
" from vertex " << worstMatchingVertex );
958 for(
auto& wrkvrt : *workVerticesContainer ) {
960 if(!wrkvrt.isGood )
continue;
961 if( wrkvrt.selectedTrackIndices.size() < 3 )
continue;
965 if( wrkvrt.fitQuality() > backup.
fitQuality() ) wrkvrt = backup;
967 if( wrkvrt.nTracksTotal() < 2 ) wrkvrt.
isGood =
false;
972 m_ntupleVars->get<
unsigned int>(
"NumRearrSecVrt" )=workVerticesContainer->size();
973 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Size of Solution Set: "<<
m_ntupleVars->get<
unsigned int>(
"NumRearrSecVrt" ));
976 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
"----------------------------------------------" );
977 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Number of merges = " << mergeCounter <<
", Number of track removal = " << removeTrackCounter <<
", broken vertices = " << brokenCounter );
978 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
"----------------------------------------------" );
980 return StatusCode::SUCCESS;
1108 std::vector<WrkVrt>* workVerticesContainer )
1122 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": #verticess = " << workVerticesContainer->size() );
1124 unsigned associateCounter { 0 };
1127 for(
auto& wrkvrt : *workVerticesContainer ) {
1129 if( !wrkvrt.isGood )
continue;
1130 if( wrkvrt.selectedTrackIndices.size() <= 1 )
continue;
1134 wrkvrt.Chi2_core = wrkvrt.Chi2;
1136 auto& vertexPos = wrkvrt.vertex;
1138 std::vector<double> distanceToPVs;
1140 for(
const auto* pv : *pvs ) {
1143 const auto& minDistance = *( std::min_element( distanceToPVs.begin(), distanceToPVs.end() ) );
1148 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": vertex pos = (" << vertexPos.x() <<
", " << vertexPos.y() <<
", " << vertexPos.z() <<
"), "
1149 "#selected = " << wrkvrt.selectedTrackIndices.size() <<
", #assoc = " << wrkvrt.associatedTrackIndices.size() );
1151 std::vector<const xAOD::TrackParticle*> candidates;
1154 for(
auto itr = allTracks->
begin(); itr != allTracks->
end(); ++itr ) {
1155 const auto* trk = *itr;
1159 auto result = std::find_if( workVerticesContainer->begin(), workVerticesContainer->end(),
1161 auto found = std::find_if( wrkvrt.selectedTrackIndices.begin(), wrkvrt.selectedTrackIndices.end(),
1162 [&]( long int index ) {
1164 if (m_doSelectTracksFromElectrons || m_doSelectIDAndGSFTracks) {
1165 const xAOD::TrackParticle *id_tr;
1166 id_tr = xAOD::EgammaHelpers::getOriginalTrackParticleFromGSF(m_selectedTracks.at(index));
1167 return trk == m_selectedTracks.at(index) or trk == id_tr;
1170 return trk == m_selectedTracks.at(index);
1175 if(
result != workVerticesContainer->end() )
continue;
1181 [&] (
const auto* atrk) { return trk == atrk; } );
1198 std::vector<double> impactParameters;
1199 std::vector<double> impactParErrors;
1203 if( std::abs( impactParameters.at(0) ) / sqrt( impactParErrors.at(0) ) >
m_associateMaxD0Signif )
continue;
1204 if( std::abs( impactParameters.at(1) ) / sqrt( impactParErrors.at(1) ) >
m_associateMaxZ0Signif )
continue;
1207 <<
": d0 to vtx = " << impactParameters.at(
k_d0)
1208 <<
", z0 to vtx = " << impactParameters.at(
k_z0)
1209 <<
", distance to vtx = " << hypot( impactParameters.at(
k_d0), impactParameters.at(
k_z0) ) );
1211 candidates.emplace_back( trk );
1215 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": number of candidate tracks = " << candidates.size() );
1217 std::unique_ptr<Trk::IVKalState> state =
m_fitSvc->makeState();
1219 for(
const auto* trk : candidates ) {
1221 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": attempting to associate track = " << trk );
1224 WrkVrt wrkvrt_backup = wrkvrt;
1226 m_fitSvc->setApproximateVertex( vertexPos.x(), vertexPos.y(), vertexPos.z(), *state );
1228 std::vector<const xAOD::TrackParticle*> baseTracks;
1229 std::vector<const xAOD::NeutralParticle*> dummyNeutrals;
1231 wrkvrt.Chi2PerTrk.clear();
1233 for(
const auto&
index : wrkvrt.selectedTrackIndices ) {
1237 for(
const auto&
index : wrkvrt.associatedTrackIndices ) {
1242 baseTracks.emplace_back( trk );
1248 StatusCode
sc =
m_fitSvc->VKalVrtFitFast( baseTracks, initPos, *state );
1250 if(
sc.isFailure() )
ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": fast crude estimation failed.");
1252 const auto& diffPos = initPos - vertexPos;
1254 if( diffPos.norm() > 10. ) {
1256 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": approx vertex as original" );
1257 m_fitSvc->setApproximateVertex( vertexPos.x(), vertexPos.y(), vertexPos.z(), *state );
1261 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": approx vertex set to (" << initPos.x() <<
", " << initPos.y() <<
", " << initPos.z() <<
")" );
1262 m_fitSvc->setApproximateVertex( initPos.x(), initPos.y(), initPos.z(), *state );
1268 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": now vertex fitting..." );
1270 StatusCode
sc =
m_fitSvc->VKalVrtFit(baseTracks, dummyNeutrals,
1280 if(
sc.isFailure() ) {
1281 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": VKalVrtFit failure. Revert to backup");
1282 wrkvrt = wrkvrt_backup;
1292 auto& cov = wrkvrt.vertexCov;
1294 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": succeeded in associating. New vertex pos = (" << vertexPos.perp() <<
", " << vertexPos.z() <<
", " << vertexPos.perp()*vertexPos.phi() <<
")" );
1295 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": New vertex cov = (" << cov.at(0) <<
", " << cov.at(1) <<
", " << cov.at(2) <<
", " << cov.at(3) <<
", " << cov.at(4) <<
", " << cov.at(5) <<
")" );
1302 (*m_decor_isAssociated)( *trk ) =
true;
1308 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
"----------------------------------------------" );
1309 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": total associated number of tracks = " << associateCounter );
1310 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
"----------------------------------------------" );
1312 return StatusCode::SUCCESS;
1525 std::vector<WrkVrt> *workVerticesContainer )
1533 ATH_CHECK( secVtxHandle.
record( std::make_unique<xAOD::VertexContainer>(),
1534 std::make_unique<xAOD::VertexAuxContainer>() ) );
1538 enum { kPt, kEta, kPhi, kD0, kZ0, kErrP, kErrD0, kErrZ0, kChi2SV };
1554 std::map<const WrkVrt*, const xAOD::Vertex*> wrkvrtLinkMap;
1558 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": input #vertices = " << workVerticesContainer->size() );
1561 for(
auto& wrkvrt : *workVerticesContainer ) {
1563 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": candidate vertex: "
1564 <<
" isGood = " << (wrkvrt.isGood?
"true" :
"false")
1565 <<
", #ntrks = " << wrkvrt.nTracksTotal()
1566 <<
", #selectedTracks = " << wrkvrt.selectedTrackIndices.size()
1567 <<
", #associatedTracks = " << wrkvrt.associatedTrackIndices.size()
1569 <<
", (r, z) = (" << wrkvrt.vertex.perp()
1570 <<
", " << wrkvrt.vertex.z() <<
")" );
1578 if( wrkvrt.nTracksTotal() < 2 ) {
1579 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": ntrk < 2 --> rejected." );
1587 if( wrkvrt.vertex.perp() < 31.0 ) {
1590 wrkvrt.selectedTrackIndices.erase(
std::remove_if( wrkvrt.selectedTrackIndices.begin(), wrkvrt.selectedTrackIndices.end(),
1591 [&](
auto&
index ) {
1592 auto* trk = m_selectedTracks.at( index );
1594 return ( nPixelHits < 3 );
1596 wrkvrt.selectedTrackIndices.end() );
1599 wrkvrt.associatedTrackIndices.erase(
std::remove_if( wrkvrt.associatedTrackIndices.begin(), wrkvrt.associatedTrackIndices.end(),
1600 [&](
auto&
index ) {
1601 auto* trk = m_associatedTracks.at( index );
1603 return ( nPixelHits < 3 );
1605 wrkvrt.associatedTrackIndices.end() );
1608 if( statusCode.isFailure() ) {}
1619 if( wrkvrt.fitQuality() > backup.
fitQuality() ) wrkvrt = backup;
1624 if( wrkvrt.nTracksTotal() < 2 )
continue;
1627 if( wrkvrt.selectedTrackIndices.size() < 2 )
continue;
1637 if(
sc.isFailure() ) {
1639 auto indices = wrkvrt.associatedTrackIndices;
1641 wrkvrt.associatedTrackIndices.clear();
1643 if(
sc.isFailure() ) {
1644 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": detected vertex fitting failure!" );
1647 if( wrkvrt.fitQuality() > backup.
fitQuality() ) wrkvrt = backup;
1649 for(
auto&
index : indices ) {
1654 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": detected vertex fitting failure!" );
1661 if( wrkvrt.fitQuality() > backup.
fitQuality() ) wrkvrt = backup;
1672 TLorentzVector sumP4_pion;
1673 TLorentzVector sumP4_electron;
1674 TLorentzVector sumP4_proton;
1677 bool good_flag =
true;
1679 std::map<const std::deque<long int>*,
const std::vector<const xAOD::TrackParticle*>&> indicesSet
1685 for(
auto& pair : indicesSet ) {
1687 const auto* indices = pair.first;
1688 const auto& tracks = pair.second;
1690 for(
const auto& itrk : *indices ) {
1691 const auto* trk = tracks.at( itrk );
1694 ATH_MSG_INFO(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": Failed in obtaining the SV perigee!" );
1702 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": sv perigee could not be obtained --> rejected" );
1709 std::vector<const xAOD::TrackParticle*> tracks;
1710 std::vector< std::pair<const xAOD::TrackParticle*, double> > trackChi2Pairs;
1714 for(
auto& pair : indicesSet ) {
1715 for(
const auto&
index : *pair.first ) tracks.emplace_back( pair.second.at(
index ) );
1718 auto trkitr = tracks.begin();
1719 auto chi2itr = wrkvrt.Chi2PerTrk.begin();
1721 for( ; ( trkitr!=tracks.end() && chi2itr!=wrkvrt.Chi2PerTrk.end() ); ++trkitr, ++chi2itr ) {
1722 trackChi2Pairs.emplace_back( *trkitr, *chi2itr );
1728 TLorentzVector sumP4_selected;
1730 bool badIPflag {
false };
1733 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Track loop: size = " << tracks.size() );
1734 for(
auto& pair : trackChi2Pairs ) {
1736 const auto* trk = pair.first;
1737 const auto& chi2AtSV = pair.second;
1739 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": start." );
1748 double trk_pt = trk->pt();
1749 double trk_eta = trk->eta();
1750 double trk_phi = trk->phi();
1752 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": in vrt chg/pt/phi/eta = "
1753 << trk->charge() <<
","
1760 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": Get the prigee of the track at the vertex." );
1764 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": Failed in obtaining the SV perigee!" );
1769 (*m_decor_is_svtrk_final)( *trk ) =
true;
1773 double qOverP_wrtSV = sv_perigee->parameters() [
Trk::qOverP];
1774 double theta_wrtSV = sv_perigee->parameters() [
Trk::theta];
1775 double p_wrtSV = 1.0 / std::abs( qOverP_wrtSV );
1776 double pt_wrtSV = p_wrtSV * sin( theta_wrtSV );
1777 double eta_wrtSV = -log( tan( theta_wrtSV/2. ) );
1778 double phi_wrtSV = sv_perigee->parameters() [
Trk::phi];
1779 double d0_wrtSV = sv_perigee->parameters() [
Trk::d0];
1780 double z0_wrtSV = sv_perigee->parameters() [
Trk::z0];
1781 double errd0_wrtSV = (*sv_perigee->covariance())(
Trk::d0,
Trk::d0 );
1782 double errz0_wrtSV = (*sv_perigee->covariance())(
Trk::z0,
Trk::z0 );
1796 (*m_decor_is_svtrk_final)( *trk ) =
true;
1798 TLorentzVector p4wrtSV_pion;
1799 TLorentzVector p4wrtSV_electron;
1800 TLorentzVector p4wrtSV_proton;
1808 if( !is_associatedAcc(*trk) ) {
1809 sumP4_selected += p4wrtSV_pion;
1812 sumP4_selected += p4wrtSV_pion;
1815 sumP4_pion += p4wrtSV_pion;
1816 sumP4_electron += p4wrtSV_electron;
1817 sumP4_proton += p4wrtSV_proton;
1819 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": end." );
1824 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Final Sec.Vertex=" << wrkvrt.nTracksTotal() <<
", "
1825 <<wrkvrt.vertex.perp() <<
", "<<wrkvrt.vertex.z() <<
", "
1826 <<wrkvrt.vertex.phi() <<
", mass = "<< sumP4_pion.M() <<
"," << sumP4_electron.M() );
1829 float perigee_x_trk1 = 0.0;
1830 float perigee_y_trk1 = 0.0;
1831 float perigee_z_trk1 = 0.0;
1832 float perigee_x_trk2 = 0.0;
1833 float perigee_y_trk2 = 0.0;
1834 float perigee_z_trk2 = 0.0;
1835 float perigee_px_trk1 = 0.0;
1836 float perigee_py_trk1 = 0.0;
1837 float perigee_pz_trk1 = 0.0;
1838 float perigee_px_trk2 = 0.0;
1839 float perigee_py_trk2 = 0.0;
1840 float perigee_pz_trk2 = 0.0;
1841 float perigee_cov_xx_trk1 = 0.0;
1842 float perigee_cov_xy_trk1 = 0.0;
1843 float perigee_cov_xz_trk1 = 0.0;
1844 float perigee_cov_yy_trk1 = 0.0;
1845 float perigee_cov_yz_trk1 = 0.0;
1846 float perigee_cov_zz_trk1 = 0.0;
1847 float perigee_cov_xx_trk2 = 0.0;
1848 float perigee_cov_xy_trk2 = 0.0;
1849 float perigee_cov_xz_trk2 = 0.0;
1850 float perigee_cov_yy_trk2 = 0.0;
1851 float perigee_cov_yz_trk2 = 0.0;
1852 float perigee_cov_zz_trk2 = 0.0;
1853 float perigee_d0_trk1 = 0.0;
1854 float perigee_d0_trk2 = 0.0;
1855 float perigee_z0_trk1 = 0.0;
1856 float perigee_z0_trk2 = 0.0;
1857 float perigee_qOverP_trk1 = 0.0;
1858 float perigee_qOverP_trk2 = 0.0;
1859 float perigee_theta_trk1 = 0.0;
1860 float perigee_theta_trk2 = 0.0;
1861 float perigee_phi_trk1 = 0.0;
1862 float perigee_phi_trk2 = 0.0;
1863 int perigee_charge_trk1 = 0;
1864 int perigee_charge_trk2 = 0;
1865 float perigee_distance = 9999.0;
1868 float vPos = (vDist.x() * wrkvrt.vertexMom.Px() + vDist.y() * wrkvrt.vertexMom.Py() + vDist.z() * wrkvrt.vertexMom.Pz()) / wrkvrt.vertexMom.Rho();
1869 float vPosMomAngT = (vDist.x() * wrkvrt.vertexMom.Px() + vDist.y() * wrkvrt.vertexMom.Py()) / vDist.perp() / wrkvrt.vertexMom.Pt();
1870 float vPosMomAng3D = (vDist.x() * wrkvrt.vertexMom.Px() + vDist.y() * wrkvrt.vertexMom.Py() + vDist.z() * wrkvrt.vertexMom.Pz()) / (vDist.norm() * wrkvrt.vertexMom.Rho());
1871 float dphi_trk1 = 0.0;
1872 float dphi_trk2 = 0.0;
1876 const auto* track1 = trackChi2Pairs[0].first;
1877 dphi_trk1 = TVector2::Phi_mpi_pi(vDist.phi() - track1->phi());
1880 perigee_x_trk1 = sv_perigee1->position().x();
1881 perigee_y_trk1 = sv_perigee1->position().y();
1882 perigee_z_trk1 = sv_perigee1->position().z();
1883 perigee_px_trk1 = sv_perigee1->momentum().x();
1884 perigee_py_trk1 = sv_perigee1->momentum().y();
1885 perigee_pz_trk1 = sv_perigee1->momentum().z();
1886 perigee_cov_xx_trk1 = (*sv_perigee1->covariance())(0, 0);
1887 perigee_cov_xy_trk1 = (*sv_perigee1->covariance())(0, 1);
1888 perigee_cov_xz_trk1 = (*sv_perigee1->covariance())(0, 2);
1889 perigee_cov_yy_trk1 = (*sv_perigee1->covariance())(1, 1);
1890 perigee_cov_yz_trk1 = (*sv_perigee1->covariance())(1, 2);
1891 perigee_cov_zz_trk1 = (*sv_perigee1->covariance())(2, 2);
1892 perigee_d0_trk1 = sv_perigee1->parameters()[
Trk::d0];
1893 perigee_z0_trk1 = sv_perigee1->parameters()[
Trk::z0];
1894 perigee_qOverP_trk1 = sv_perigee1->parameters()[
Trk::qOverP];
1895 perigee_theta_trk1 = sv_perigee1->parameters()[
Trk::theta];
1896 perigee_phi_trk1 = sv_perigee1->parameters()[
Trk::phi];
1897 perigee_charge_trk1 = sv_perigee1->parameters()[
Trk::qOverP] > 0 ? 1 : -1;
1899 ATH_MSG_DEBUG(
"Failed to obtain perigee for track1 at vertex.");
1903 const auto* track2 = trackChi2Pairs[1].first;
1904 dphi_trk2 = TVector2::Phi_mpi_pi(vDist.phi() - track2->phi());
1907 perigee_x_trk2 = sv_perigee2->position().x();
1908 perigee_y_trk2 = sv_perigee2->position().y();
1909 perigee_z_trk2 = sv_perigee2->position().z();
1910 perigee_px_trk2 = sv_perigee2->momentum().x();
1911 perigee_py_trk2 = sv_perigee2->momentum().y();
1912 perigee_pz_trk2 = sv_perigee2->momentum().z();
1913 perigee_cov_xx_trk2 = (*sv_perigee2->covariance())(0, 0);
1914 perigee_cov_xy_trk2 = (*sv_perigee2->covariance())(0, 1);
1915 perigee_cov_xz_trk2 = (*sv_perigee2->covariance())(0, 2);
1916 perigee_cov_yy_trk2 = (*sv_perigee2->covariance())(1, 1);
1917 perigee_cov_yz_trk2 = (*sv_perigee2->covariance())(1, 2);
1918 perigee_cov_zz_trk2 = (*sv_perigee2->covariance())(2, 2);
1919 perigee_d0_trk2 = sv_perigee2->parameters()[
Trk::d0];
1920 perigee_z0_trk2 = sv_perigee2->parameters()[
Trk::z0];
1921 perigee_qOverP_trk2 = sv_perigee2->parameters()[
Trk::qOverP];
1922 perigee_theta_trk2 = sv_perigee2->parameters()[
Trk::theta];
1923 perigee_phi_trk2 = sv_perigee2->parameters()[
Trk::phi];
1924 perigee_charge_trk2 = sv_perigee2->parameters()[
Trk::qOverP] > 0 ? 1 : -1;
1926 ATH_MSG_DEBUG(
"Failed to obtain perigee for track2 at vertex.");
1929 if(sv_perigee1 && sv_perigee2){
1930 perigee_distance = sqrt(
1931 (perigee_x_trk1 - perigee_x_trk2) * (perigee_x_trk1 - perigee_x_trk2) +
1932 (perigee_y_trk1 - perigee_y_trk2) * (perigee_y_trk1 - perigee_y_trk2) +
1933 (perigee_z_trk1 - perigee_z_trk2) * (perigee_z_trk1 - perigee_z_trk2)
1943 std::vector<double> opAngles;
1945 for(
auto itr1 = tracks.begin(); itr1 != tracks.end(); ++itr1 ) {
1946 for(
auto itr2 = std::next( itr1 ); itr2 != tracks.end(); ++itr2 ) {
1947 const auto& p1 = (*itr1)->p4().Vect();
1948 const auto& p2 = (*itr2)->p4().Vect();
1949 auto cos = p1 * p2 / p1.Mag() / p2.Mag();
1950 opAngles.emplace_back( cos );
1953 minOpAng = *( std::max_element( opAngles.begin(), opAngles.end() ) );
1960 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Bad impact parameter signif wrt SV was flagged." );
1965 bool oneLepMatchTrack =
false;
1966 for (
const auto *trk: tracks) {
1968 oneLepMatchTrack =
true;
1974 if (!oneLepMatchTrack)
continue;
1980 wrkvrt.isGood =
true;
1985 secondaryVertexContainer->emplace_back( vertex );
1988 vertex->setPosition( wrkvrt.vertex );
1995 vertex->setFitQuality( wrkvrt.Chi2_core, wrkvrt.ndof_core() );
1998 std::vector<float> fCov(wrkvrt.vertexCov.cbegin(), wrkvrt.vertexCov.cend());
1999 vertex->setCovariance(fCov);
2020 vtx_pxAcc(*vertex) = wrkvrt.vertexMom.Px();
2021 vtx_pyAcc(*vertex) = wrkvrt.vertexMom.Py();
2022 vtx_pzAcc(*vertex) = wrkvrt.vertexMom.Pz();
2024 vtx_massAcc(*vertex) = wrkvrt.vertexMom.M();
2025 vtx_chargeAcc(*vertex) = wrkvrt.Charge;
2027 chi2_coreAcc(*vertex) = wrkvrt.Chi2_core;
2028 ndof_coreAcc(*vertex) = wrkvrt.ndof_core();
2029 chi2_assocAcc(*vertex) = wrkvrt.Chi2;
2030 ndof_assocAcc(*vertex) = wrkvrt.ndof();
2032 massAcc(*vertex) = sumP4_pion.M();
2033 mass_eAcc(*vertex) = sumP4_electron.M();
2034 mass_selectedTracksAcc(*vertex) = sumP4_selected.M();
2035 minOpAngAcc(*vertex) = minOpAng;
2036 num_trksAcc(*vertex) = wrkvrt.nTracksTotal();
2037 num_selectedTracksAcc(*vertex) = wrkvrt.selectedTrackIndices.size();
2038 num_associatedTracksAcc(*vertex) = wrkvrt.associatedTrackIndices.size();
2039 dCloseVrtAcc(*vertex) = wrkvrt.closestWrkVrtValue;
2084 perigee_x_trk1Acc(*vertex) = perigee_x_trk1;
2085 perigee_y_trk1Acc(*vertex) = perigee_y_trk1;
2086 perigee_z_trk1Acc(*vertex) = perigee_z_trk1;
2087 perigee_x_trk2Acc(*vertex) = perigee_x_trk2;
2088 perigee_y_trk2Acc(*vertex) = perigee_y_trk2;
2089 perigee_z_trk2Acc(*vertex) = perigee_z_trk2;
2090 perigee_px_trk1Acc(*vertex) = perigee_px_trk1;
2091 perigee_py_trk1Acc(*vertex) = perigee_py_trk1;
2092 perigee_pz_trk1Acc(*vertex) = perigee_pz_trk1;
2093 perigee_px_trk2Acc(*vertex) = perigee_px_trk2;
2094 perigee_py_trk2Acc(*vertex) = perigee_py_trk2;
2095 perigee_pz_trk2Acc(*vertex) = perigee_pz_trk2;
2096 perigee_cov_xx_trk1Acc(*vertex) = perigee_cov_xx_trk1;
2097 perigee_cov_xy_trk1Acc(*vertex) = perigee_cov_xy_trk1;
2098 perigee_cov_xz_trk1Acc(*vertex) = perigee_cov_xz_trk1;
2099 perigee_cov_yy_trk1Acc(*vertex) = perigee_cov_yy_trk1;
2100 perigee_cov_yz_trk1Acc(*vertex) = perigee_cov_yz_trk1;
2101 perigee_cov_zz_trk1Acc(*vertex) = perigee_cov_zz_trk1;
2102 perigee_cov_xx_trk2Acc(*vertex) = perigee_cov_xx_trk2;
2103 perigee_cov_xy_trk2Acc(*vertex) = perigee_cov_xy_trk2;
2104 perigee_cov_xz_trk2Acc(*vertex) = perigee_cov_xz_trk2;
2105 perigee_cov_yy_trk2Acc(*vertex) = perigee_cov_yy_trk2;
2106 perigee_cov_yz_trk2Acc(*vertex) = perigee_cov_yz_trk2;
2107 perigee_cov_zz_trk2Acc(*vertex) = perigee_cov_zz_trk2;
2108 perigee_d0_trk1Acc(*vertex) = perigee_d0_trk1;
2109 perigee_d0_trk2Acc(*vertex) = perigee_d0_trk2;
2110 perigee_z0_trk1Acc(*vertex) = perigee_z0_trk1;
2111 perigee_z0_trk2Acc(*vertex) = perigee_z0_trk2;
2112 perigee_qOverP_trk1Acc(*vertex) = perigee_qOverP_trk1;
2113 perigee_qOverP_trk2Acc(*vertex) = perigee_qOverP_trk2;
2114 perigee_theta_trk1Acc(*vertex) = perigee_theta_trk1;
2115 perigee_theta_trk2Acc(*vertex) = perigee_theta_trk2;
2116 perigee_phi_trk1Acc(*vertex) = perigee_phi_trk1;
2117 perigee_phi_trk2Acc(*vertex) = perigee_phi_trk2;
2118 perigee_charge_trk1Acc(*vertex) = perigee_charge_trk1;
2119 perigee_charge_trk2Acc(*vertex) = perigee_charge_trk2;
2120 vPosAcc(*vertex) = vPos;
2121 vPosMomAngTAcc(*vertex) = vPosMomAngT;
2122 vPosMomAng3DAcc(*vertex) = vPosMomAng3D;
2123 dphi_trk1Acc(*vertex) = dphi_trk1;
2124 dphi_trk2Acc(*vertex) = dphi_trk2;
2129 for(
auto trk_id : wrkvrt.selectedTrackIndices ) {
2137 vertex->addTrackAtVertex( link_trk, 1. );
2141 for(
auto trk_id : wrkvrt.associatedTrackIndices ) {
2149 vertex->addTrackAtVertex( link_trk, 1. );
2162 if( mappedVtx.
valid ) {
2164 local_layerIndexAcc(*vertex) = mappedVtx.
layerIndex;
2185 wrkvrtLinkMap[&wrkvrt] = vertex;
2190 if( m_FillNtuple ) {
2191 ATH_CHECK( fillAANT_SecondaryVertices( secondaryVertexContainer ) );
2196 if( m_doAugmentDVimpactParametersToMuons ) {
ATH_CHECK( augmentDVimpactParametersToLeptons<xAOD::Muon> (
"Muons" ) ); }
2197 if( m_doAugmentDVimpactParametersToElectrons ) {
ATH_CHECK( augmentDVimpactParametersToLeptons<xAOD::Electron>(
"Electrons" ) ); }
2199 }
catch (
const std::out_of_range& e) {
2201 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": out of range error is detected: " <<
e.what() );
2203 return StatusCode::SUCCESS;
2207 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": some other error is detected." );
2209 return StatusCode::SUCCESS;
2213 return StatusCode::SUCCESS;