39 std::vector<WrkVrt>* workVerticesContainer )
50 ATH_CHECK( trackHandle.
record(std::make_unique<xAOD::VertexContainer>(),
51 std::make_unique<xAOD::VertexAuxContainer>()) );
52 twoTrksVertexContainer = trackHandle.
ptr();
59 std::vector<const xAOD::TrackParticle*> baseTracks;
60 std::vector<const xAOD::NeutralParticle*> dummyNeutrals;
67 enum recoStep { kStart, kInitVtxPosition, kImpactParamCheck, kVKalVrtFit, kChi2, kVposCut, kPatternMatch };
69 const double maxR { 563. };
70 double roughD0Cut = 100.;
71 double roughZ0Cut = 50.;
78 std::map<const xAOD::TruthVertex*, bool> matchMap;
79 std::unique_ptr<Trk::IVKalState> state =
m_fitSvc->makeState(ctx);
94 m_incomp.emplace_back( itrk_id, jtrk_id );
101 if ( !cont_i || !cont_j ) {
111 ATH_MSG_DEBUG(
" link itrk (" << (*itrk)->index() <<
") or jtrk (" << (*jtrk)->index() <<
") is not valid");
124 baseTracks.emplace_back( *itrk );
125 baseTracks.emplace_back( *jtrk );
132 StatusCode
sc =
m_fitSvc->VKalVrtFitFast( baseTracks, initVertex, *state );
133 if(
sc.isFailure() ) {
134 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": fast crude estimation fails ");
138 if( initVertex.perp() > maxR ) {
146 std::vector<double> impactParameters;
147 std::vector<double> impactParErrors;
152 if( fabs( impactParameters.at(0)) > roughD0Cut || fabs( impactParameters.at(1) ) > roughZ0Cut ) {
159 if( fabs( impactParameters.at(0) ) > roughD0Cut || fabs( impactParameters.at(1) ) > roughZ0Cut ) {
164 m_fitSvc->setApproximateVertex( initVertex.x(), initVertex.y(), initVertex.z(), *state );
175 if(
sc.isFailure() ) {
183 const double vPosMomAngT = ( vDist.x()*wrkvrt.
vertexMom.Px()+vDist.y()*wrkvrt.
vertexMom.Py() ) / vDist.perp() / wrkvrt.
vertexMom.Pt();
186 double dphi1 = TVector2::Phi_mpi_pi(vDist.phi() - (*itrk)->phi());
187 double dphi2 = TVector2::Phi_mpi_pi(vDist.phi() - (*jtrk)->phi());
189 const double dist_fromPV = vDist.norm();
197 m_ntupleVars->get< std::vector<int> > (
"All2TrkVrtCharge" ) .emplace_back(wrkvrt.
Charge);
198 m_ntupleVars->get< std::vector<double> >(
"All2TrkVrtX" ) .emplace_back(wrkvrt.
vertex.x());
199 m_ntupleVars->get< std::vector<double> >(
"All2TrkVrtY" ) .emplace_back(wrkvrt.
vertex.y());
200 m_ntupleVars->get< std::vector<double> >(
"All2TrkVrtZ" ) .emplace_back(wrkvrt.
vertex.z());
201 m_ntupleVars->get< std::vector<double> >(
"All2TrkVrtChiSq" ) .emplace_back(wrkvrt.
Chi2);
212 for(
const auto *trk: baseTracks ) {
218 vertex->addTrackAtVertex( trackElementLink, 1. );
222 vertex->setPosition( wrkvrt.
vertex );
223 vertex->setFitQuality( wrkvrt.
Chi2, 1 );
231 pTAcc(*vertex) = wrkvrt.
vertexMom.Perp();
232 chargeAcc(*vertex) = wrkvrt.
Charge;
233 vPosAcc(*vertex) = vPos;
234 isFakeAcc(*vertex) =
true;
240 uint8_t trkiBLHit,trkjBLHit;
244 if(
m_FillNtuple )
m_ntupleVars->get< std::vector<int> >(
"All2TrkSumBLHits" ).emplace_back( trkiBLHit + trkjBLHit );
250 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": failed to pass chi2 threshold." );
256 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": attempting form vertex from ( " << itrk_id <<
", " << jtrk_id <<
" )." );
257 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": candidate vertex: "
258 <<
" isGood = " << (wrkvrt.
isGood?
"true" :
"false")
263 <<
", (r, z) = (" << wrkvrt.
vertex.perp()
264 <<
", " << wrkvrt.
vertex.z() <<
")" );
267 Amg::Vector3D vTruth( truthVertex->x(), truthVertex->y(), truthVertex->z() );
270 const auto distance = vReco - vTruth;
273 cov.fillSymmetric( 0, 0, wrkvrt.
vertexCov.at(0) );
274 cov.fillSymmetric( 1, 0, wrkvrt.
vertexCov.at(1) );
275 cov.fillSymmetric( 1, 1, wrkvrt.
vertexCov.at(2) );
276 cov.fillSymmetric( 2, 0, wrkvrt.
vertexCov.at(3) );
277 cov.fillSymmetric( 2, 1, wrkvrt.
vertexCov.at(4) );
278 cov.fillSymmetric( 2, 2, wrkvrt.
vertexCov.at(5) );
280 const double s2 = distance.transpose() * cov.inverse() * distance;
282 if( distance.norm() < 2.0 || s2 < 100. ) {
283 ATH_MSG_DEBUG (
" > " << __FUNCTION__ <<
": truth-matched candidate! : signif^2 = " << s2 );
284 matchMap.emplace( truthVertex,
true );
289 static_cast<TH2F*
>(
m_hists[
"vPosDist"] )->Fill( wrkvrt.
vertex.perp(), vPos );
290 static_cast<TH2F*
>(
m_hists[
"vPosMomAngTDist"] )->Fill( wrkvrt.
vertex.perp(), vPosMomAngT );
291 m_hists[
"vPosMomAngT"] ->Fill( vPosMomAngT );
292 m_hists[
"vPosMomAng3D"] ->Fill( vPosMomAng3D );
297 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": failed to pass the 2tr vertex min distance from PV cut." );
302 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": failed to pass the vertex angle cut." );
308 if( cos( dphi1 ) < -0.8 && cos( dphi2 ) < -0.8 ) {
309 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": failed to pass the vPos cut. (both tracks are opposite against the vertex pos)" );
313 ATH_MSG_DEBUG(
" > "<< __FUNCTION__ <<
": failed to pass the tightened vPos cut. (at least one track is opposite against the vertex pos)" );
316 if( vPosMomAngT < -0.8 ) {
317 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": failed to pass the vPos cut. (pos-mom directions are opposite)" );
321 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": failed to pass the vPos cut." );
331 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": failed to pass fake rejection algorithm." );
337 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": passed fake rejection." );
344 m_ntupleVars->get< std::vector<int> > (
"AfFakVrtCharge" ) .emplace_back(wrkvrt.
Charge);
345 m_ntupleVars->get< std::vector<double> >(
"AfFakVrtX" ) .emplace_back(wrkvrt.
vertex.x());
346 m_ntupleVars->get< std::vector<double> >(
"AfFakVrtY" ) .emplace_back(wrkvrt.
vertex.y());
347 m_ntupleVars->get< std::vector<double> >(
"AfFakVrtZ" ) .emplace_back(wrkvrt.
vertex.z());
348 m_ntupleVars->get< std::vector<double> >(
"AfFakVrtChiSq" ) .emplace_back(wrkvrt.
Chi2);
354 isFakeAcc(*vertex) =
false;
364 workVerticesContainer->emplace_back( wrkvrt );
366 msg += Form(
" (%d, %d), ", itrk_id, jtrk_id );
369 m_hists[
"initVertexDispD0"]->Fill( roughD0_itrk, initVertex.perp() );
370 m_hists[
"initVertexDispD0"]->Fill( roughD0_jtrk, initVertex.perp() );
371 m_hists[
"initVertexDispZ0"]->Fill( roughZ0_itrk, initVertex.z() );
372 m_hists[
"initVertexDispZ0"]->Fill( roughZ0_jtrk, initVertex.z() );
379 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": compatible track pairs = " <<
msg );
384 for(
auto& pair: matchMap ) {
385 if( pair.second )
m_hists[
"nMatchedTruths"]->Fill( 1, pair.first->perp() );
389 return StatusCode::SUCCESS;
395 std::vector<WrkVrt> *workVerticesContainer )
400 return StatusCode::SUCCESS;
407 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": compatible track pair size = " << compSize );
413 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": incompatibility graph finder mode" );
416 workVerticesContainer->clear();
423 std::vector<long int> weit;
426 weit.emplace_back( pair.first + 1 );
427 weit.emplace_back( pair.second + 1 );
446 long int solutionSize { 0 };
449 std::vector<const xAOD::TrackParticle*> baseTracks;
450 std::vector<const xAOD::NeutralParticle*> dummyNeutrals;
452 std::unique_ptr<Trk::IVKalState> state =
m_fitSvc->makeState(ctx);
453 auto pgraph = std::make_unique<Trk::PGraph>();
454 int iterationLimit(2000);
459 pgraph->pgraphm_( weit.data(), nEdges, nTracks, solution.data(), &solutionSize, nth);
461 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": Trk::pgraphm_() output: solutionSize = " << solutionSize );
462 if (0 == iterationLimit--){
463 ATH_MSG_WARNING(
"Iteration limit (2000) reached in VrtSecInclusive::findNtrackVertices, solution size = "<<solutionSize);
466 if(solutionSize <= 0)
break;
467 if(solutionSize == 1)
continue;
471 std::string
msg =
"solution = [ ";
472 for(
int i=0; i< solutionSize; i++) {
473 msg += Form(
"%ld, ", solution[i]-1 );
486 for(
long int i = 0; i<solutionSize; i++) {
494 StatusCode
sc =
m_fitSvc->VKalVrtFitFast( baseTracks, initVertex, *state );
495 if(
sc.isFailure())
ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": fast crude estimation fails ");
497 m_fitSvc->setApproximateVertex( initVertex.x(), initVertex.y(), initVertex.z(), *state );
499 sc =
m_fitSvc->VKalVrtFit(baseTracks, dummyNeutrals,
509 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": FoundAppVrt=" << solutionSize <<
", (r, z) = " << wrkvrt.
vertex.perp() <<
", " << wrkvrt.
vertex.z() <<
", chi2/ndof = " << wrkvrt.
fitQuality() );
511 if(
sc.isFailure() ) {
514 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": VKalVrtFit failed in 2-trk solution ==> give up.");
518 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": VKalVrtFit failed ==> retry...");
526 if( itrk == jtrk )
continue;
527 if( tmp.isGood )
continue;
529 tmp.selectedTrackIndices.clear();
530 tmp.selectedTrackIndices.emplace_back( itrk );
531 tmp.selectedTrackIndices.emplace_back( jtrk );
540 sc =
m_fitSvc->VKalVrtFitFast( baseTracks, initVertex, *state );
541 if(
sc.isFailure() )
ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": fast crude estimation fails ");
543 m_fitSvc->setApproximateVertex( initVertex.x(), initVertex.y(), initVertex.z(), *state );
545 sc =
m_fitSvc->VKalVrtFit(baseTracks, dummyNeutrals,
555 if(
sc.isFailure() )
continue;
563 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Did not find any viable vertex in all 2-trk combinations. Give up.");
570 if( std::find( tmp.selectedTrackIndices.begin(), tmp.selectedTrackIndices.end(), itrk ) != tmp.selectedTrackIndices.end() )
continue;
574 tmp.selectedTrackIndices.emplace_back( itrk );
576 for(
auto& jtrk : tmp.selectedTrackIndices ) { baseTracks.emplace_back(
m_selectedTracks.at(jtrk) ); }
581 sc =
m_fitSvc->VKalVrtFitFast( baseTracks, initVertex, *state );
582 if(
sc.isFailure())
ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": fast crude estimation fails ");
584 m_fitSvc->setApproximateVertex( initVertex.x(), initVertex.y(), initVertex.z(), *state );
586 sc =
m_fitSvc->VKalVrtFit(baseTracks, dummyNeutrals,
596 if(
sc.isFailure() ) {
597 tmp = std::move(backup);
603 wrkvrt = std::move(tmp);
604 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": VKalVrtFit succeeded; register the vertex to the list.");
608 workVerticesContainer->emplace_back( wrkvrt );
612 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": VKalVrtFit succeeded; register the vertex to the list.");
616 workVerticesContainer->emplace_back( wrkvrt );
625 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": rapid finder mode" );
629 std::set<long int> tracks;
632 std::vector<struct Cluster> clusters;
634 for(
auto& wrkvrt : *workVerticesContainer ) {
636 bool foundCluster =
false;
638 for(
auto& cluster: clusters ) {
639 if( (wrkvrt.vertex - cluster.position).norm() < 1.0 ) {
640 for(
auto& itrk : wrkvrt.selectedTrackIndices ) {
641 cluster.tracks.insert( itrk );
648 if( !foundCluster ) {
650 c.position = wrkvrt.vertex;
651 for(
auto& itrk : wrkvrt.selectedTrackIndices ) {
652 c.tracks.insert( itrk );
654 clusters.emplace_back( c );
655 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": added a new cluster" );
661 std::vector<const xAOD::TrackParticle*> baseTracks;
662 std::vector<const xAOD::NeutralParticle*> dummyNeutrals;
664 workVerticesContainer->clear();
666 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": found cluster size =" << clusters.size() );
668 std::unique_ptr<Trk::IVKalState> state =
m_fitSvc->makeState(ctx);
669 for(
auto& cluster : clusters ) {
679 for(
const auto&
index: cluster.tracks) {
687 StatusCode
sc =
m_fitSvc->VKalVrtFitFast( baseTracks, initVertex, *state );
688 if(
sc.isFailure())
ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": fast crude estimation fails ");
690 m_fitSvc->setApproximateVertex( initVertex.x(), initVertex.y(), initVertex.z(), *state );
692 sc =
m_fitSvc->VKalVrtFit(baseTracks, dummyNeutrals,
702 if(
sc.isFailure() ) {
706 workVerticesContainer->emplace_back( wrkvrt );
722 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": Remove vertices fully contained in other vertices .");
723 while( workVerticesContainer->size() > 1 ) {
724 size_t tmpN = workVerticesContainer->size();
727 for(; iv<tmpN-1; iv++) {
729 for(; jv<tmpN; jv++) {
730 const auto nTCom =
nTrkCommon( workVerticesContainer, {iv, jv} );
732 if( nTCom == workVerticesContainer->at(iv).selectedTrackIndices.size() ) { workVerticesContainer->erase(workVerticesContainer->begin()+iv);
break; }
733 else if( nTCom == workVerticesContainer->at(jv).selectedTrackIndices.size() ) { workVerticesContainer->erase(workVerticesContainer->begin()+jv);
break; }
738 if(iv==tmpN-1)
break;
742 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": Identify remaining 2-track vertices with very bad Chi2 and mass (b-tagging).");
743 for(
auto& wrkvrt : *workVerticesContainer ) {
746 if( wrkvrt.selectedTrackIndices.size() != 2 )
continue;
752 return StatusCode::SUCCESS;
758 std::vector<WrkVrt> *workVerticesContainer )
762 return StatusCode::SUCCESS;
768 std::vector<long int> processedTracks;
770 unsigned mergeCounter { 0 };
771 unsigned brokenCounter { 0 };
772 unsigned removeTrackCounter { 0 };
777 long int maxSharedTrack;
778 long int worstMatchingVertex;
785 std::map<long int, std::vector<long int> > trackToVertexMap;
794 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": no shared tracks are found --> exit the while loop." );
798 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": vertex [" << worstMatchingVertex <<
"]: maximally shared track index = " << maxSharedTrack
799 <<
", multiplicity = " << trackToVertexMap.at( maxSharedTrack ).size()
800 <<
", worst chi2_trk = " << worstChi2 );
808 std::vector< std::pair<unsigned, unsigned> > badPairs;
814 unsigned nShared { 0 };
817 auto& vrtList = trackToVertexMap.at( maxSharedTrack );
819 auto nGood = std::count_if( vrtList.begin(), vrtList.end(), [&](
auto& v ) { return workVerticesContainer->at(v).isGood; } );
820 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": size of good vertices = " << nGood );
822 std::vector< std::tuple< std::pair<unsigned, unsigned>, double,
unsigned> > significanceTuple;
823 enum { kIndexPair, kSignificance, kNshared };
825 for(
auto ivrt = vrtList.begin(); ivrt != vrtList.end(); ++ivrt ) {
826 for(
auto jvrt = std::next( ivrt ); jvrt != vrtList.end(); ++jvrt ) {
827 auto pair = std::pair<unsigned, unsigned>( *ivrt, *jvrt );
829 if( !( workVerticesContainer->at(*ivrt).isGood ) )
continue;
830 if( !( workVerticesContainer->at(*jvrt).isGood ) )
continue;
833 if( std::find( badPairs.begin(), badPairs.end(), pair ) != badPairs.end() )
continue;
837 auto& ivrtTrks = workVerticesContainer->at(*ivrt).selectedTrackIndices;
838 auto& jvrtTrks = workVerticesContainer->at(*jvrt).selectedTrackIndices;
840 auto nSharedTracks = std::count_if( ivrtTrks.begin(), ivrtTrks.end(),
842 return std::find( jvrtTrks.begin(), jvrtTrks.end(), index ) != jvrtTrks.end();
845 significanceTuple.emplace_back( pair, signif, nSharedTracks );
849 if( significanceTuple.empty() ) {
850 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": no vertex pairs are found --> exit the while loop." );
854 auto minSignificanceTuple = std::min_element( significanceTuple.begin(), significanceTuple.end(), [&](
auto& t1,
auto&t2 ) { return std::get<kSignificance>(t1) < std::get<kSignificance>(t2); } );
856 indexPair = std::get<kIndexPair> ( *minSignificanceTuple );
857 minSignificance = std::get<kSignificance> ( *minSignificanceTuple );
858 nShared = std::get<kNshared> ( *minSignificanceTuple );
861 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": minSignificance = " << minSignificance );
863 if( minSignificance < m_VertexMergeCut || nShared >= 2 ) {
865 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": attempt to merge vertices " << indexPair.first <<
" and " << indexPair.second );
867 WrkVrt vertex_backup1 = workVerticesContainer->at( indexPair.first );
868 WrkVrt vertex_backup2 = workVerticesContainer->at( indexPair.second );
870 StatusCode
sc =
mergeVertices( ctx, workVerticesContainer->at( indexPair.first ), workVerticesContainer->at( indexPair.second ) );
874 if(
sc.isFailure() ) {
876 workVerticesContainer->at( indexPair.first ) = std::move(vertex_backup1);
877 workVerticesContainer->at( indexPair.second ) = std::move(vertex_backup2);
878 badPairs.emplace_back( indexPair );
883 workVerticesContainer->at( indexPair.second ).isGood =
false;
890 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Merged vertices " << indexPair.first <<
" and " << indexPair.second <<
". merged vertex multiplicity = " << workVerticesContainer->at( indexPair.first ).selectedTrackIndices.size() );
898 auto& wrkvrt = workVerticesContainer->at( worstMatchingVertex );
900 auto end =
std::remove_if( wrkvrt.selectedTrackIndices.begin(), wrkvrt.selectedTrackIndices.end(), [&](
auto&
index ) { return index == maxSharedTrack; } );
901 wrkvrt.selectedTrackIndices.erase( end, wrkvrt.selectedTrackIndices.end() );
903 removeTrackCounter++;
905 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": removed track " << maxSharedTrack <<
" from vertex " << worstMatchingVertex );
907 if( wrkvrt.selectedTrackIndices.size() < 2 ) {
908 wrkvrt.isGood =
false;
914 if(
sc.isFailure() ) {
915 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": detected vertex fitting failure!" );
928 auto& wrkvrt = workVerticesContainer->at( worstMatchingVertex );
930 auto end =
std::remove_if( wrkvrt.selectedTrackIndices.begin(), wrkvrt.selectedTrackIndices.end(), [&](
auto&
index ) { return index == maxSharedTrack; } );
931 wrkvrt.selectedTrackIndices.erase( end, wrkvrt.selectedTrackIndices.end() );
933 if( wrkvrt.nTracksTotal() >=2 ) {
935 auto wrkvrt_backup = wrkvrt;
937 if(
sc.isFailure() ) {
938 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": detected vertex fitting failure!" );
939 wrkvrt = std::move(wrkvrt_backup);
943 wrkvrt.isGood =
false;
947 removeTrackCounter++;
949 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": removed track " << maxSharedTrack <<
" from vertex " << worstMatchingVertex );
957 for(
auto& wrkvrt : *workVerticesContainer ) {
959 if(!wrkvrt.isGood )
continue;
960 if( wrkvrt.selectedTrackIndices.size() < 3 )
continue;
964 if( wrkvrt.fitQuality() > backup.
fitQuality() ) wrkvrt = std::move(backup);
966 if( wrkvrt.nTracksTotal() < 2 ) wrkvrt.isGood =
false;
971 m_ntupleVars->get<
unsigned int>(
"NumRearrSecVrt" )=workVerticesContainer->size();
972 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Size of Solution Set: "<<
m_ntupleVars->get<
unsigned int>(
"NumRearrSecVrt" ));
975 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
"----------------------------------------------" );
976 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Number of merges = " << mergeCounter <<
", Number of track removal = " << removeTrackCounter <<
", broken vertices = " << brokenCounter );
977 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
"----------------------------------------------" );
979 return StatusCode::SUCCESS;
1107 std::vector<WrkVrt>* workVerticesContainer )
1121 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": #verticess = " << workVerticesContainer->size() );
1123 unsigned associateCounter { 0 };
1126 for(
auto& wrkvrt : *workVerticesContainer ) {
1128 if( !wrkvrt.isGood )
continue;
1129 if( wrkvrt.selectedTrackIndices.size() <= 1 )
continue;
1133 wrkvrt.Chi2_core = wrkvrt.Chi2;
1135 auto& vertexPos = wrkvrt.vertex;
1137 std::vector<double> distanceToPVs;
1139 for(
const auto* pv : *pvs ) {
1142 const auto& minDistance = *( std::min_element( distanceToPVs.begin(), distanceToPVs.end() ) );
1147 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": vertex pos = (" << vertexPos.x() <<
", " << vertexPos.y() <<
", " << vertexPos.z() <<
"), "
1148 "#selected = " << wrkvrt.selectedTrackIndices.size() <<
", #assoc = " << wrkvrt.associatedTrackIndices.size() );
1150 std::vector<const xAOD::TrackParticle*> candidates;
1153 for(
auto itr = allTracks->
begin(); itr != allTracks->
end(); ++itr ) {
1154 const auto* trk = *itr;
1158 auto result = std::find_if( workVerticesContainer->begin(), workVerticesContainer->end(),
1160 auto found = std::find_if( wrkvrt.selectedTrackIndices.begin(), wrkvrt.selectedTrackIndices.end(),
1161 [&]( long int index ) {
1163 if (m_doSelectTracksFromElectrons || m_doSelectIDAndGSFTracks) {
1164 const xAOD::TrackParticle *id_tr;
1165 id_tr = xAOD::EgammaHelpers::getOriginalTrackParticleFromGSF(m_selectedTracks.at(index));
1166 return trk == m_selectedTracks.at(index) or trk == id_tr;
1169 return trk == m_selectedTracks.at(index);
1174 if( result != workVerticesContainer->end() )
continue;
1180 [&] (
const auto* atrk) { return trk == atrk; } );
1197 std::vector<double> impactParameters;
1198 std::vector<double> impactParErrors;
1202 if( std::abs( impactParameters.at(0) ) / sqrt( impactParErrors.at(0) ) >
m_associateMaxD0Signif )
continue;
1203 if( std::abs( impactParameters.at(1) ) / sqrt( impactParErrors.at(1) ) >
m_associateMaxZ0Signif )
continue;
1206 <<
": d0 to vtx = " << impactParameters.at(
k_d0)
1207 <<
", z0 to vtx = " << impactParameters.at(
k_z0)
1208 <<
", distance to vtx = " << hypot( impactParameters.at(
k_d0), impactParameters.at(
k_z0) ) );
1210 candidates.emplace_back( trk );
1214 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": number of candidate tracks = " << candidates.size() );
1216 std::unique_ptr<Trk::IVKalState> state =
m_fitSvc->makeState(ctx);
1218 for(
const auto* trk : candidates ) {
1220 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": attempting to associate track = " << trk );
1223 WrkVrt wrkvrt_backup = wrkvrt;
1225 m_fitSvc->setApproximateVertex( vertexPos.x(), vertexPos.y(), vertexPos.z(), *state );
1227 std::vector<const xAOD::TrackParticle*> baseTracks;
1228 std::vector<const xAOD::NeutralParticle*> dummyNeutrals;
1230 wrkvrt.Chi2PerTrk.clear();
1232 for(
const auto&
index : wrkvrt.selectedTrackIndices ) {
1236 for(
const auto&
index : wrkvrt.associatedTrackIndices ) {
1241 baseTracks.emplace_back( trk );
1247 StatusCode
sc =
m_fitSvc->VKalVrtFitFast( baseTracks, initPos, *state );
1249 if(
sc.isFailure() )
ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": fast crude estimation failed.");
1251 const auto& diffPos = initPos - vertexPos;
1253 if( diffPos.norm() > 10. ) {
1255 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": approx vertex as original" );
1256 m_fitSvc->setApproximateVertex( vertexPos.x(), vertexPos.y(), vertexPos.z(), *state );
1260 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": approx vertex set to (" << initPos.x() <<
", " << initPos.y() <<
", " << initPos.z() <<
")" );
1261 m_fitSvc->setApproximateVertex( initPos.x(), initPos.y(), initPos.z(), *state );
1267 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": now vertex fitting..." );
1269 StatusCode
sc =
m_fitSvc->VKalVrtFit(baseTracks, dummyNeutrals,
1279 if(
sc.isFailure() ) {
1280 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": VKalVrtFit failure. Revert to backup");
1281 wrkvrt = std::move(wrkvrt_backup);
1291 auto& cov = wrkvrt.vertexCov;
1293 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": succeeded in associating. New vertex pos = (" << vertexPos.perp() <<
", " << vertexPos.z() <<
", " << vertexPos.perp()*vertexPos.phi() <<
")" );
1294 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) <<
")" );
1301 (*m_decor_isAssociated)( *trk ) =
true;
1307 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
"----------------------------------------------" );
1308 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": total associated number of tracks = " << associateCounter );
1309 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
"----------------------------------------------" );
1311 return StatusCode::SUCCESS;
1524 std::vector<WrkVrt> *workVerticesContainer )
1532 ATH_CHECK( secVtxHandle.
record( std::make_unique<xAOD::VertexContainer>(),
1533 std::make_unique<xAOD::VertexAuxContainer>() ) );
1537 enum { kPt, kEta, kPhi, kD0, kZ0, kErrP, kErrD0, kErrZ0, kChi2SV };
1553 std::map<const WrkVrt*, const xAOD::Vertex*> wrkvrtLinkMap;
1557 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": input #vertices = " << workVerticesContainer->size() );
1560 for(
auto& wrkvrt : *workVerticesContainer ) {
1562 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": candidate vertex: "
1563 <<
" isGood = " << (wrkvrt.isGood?
"true" :
"false")
1564 <<
", #ntrks = " << wrkvrt.nTracksTotal()
1565 <<
", #selectedTracks = " << wrkvrt.selectedTrackIndices.size()
1566 <<
", #associatedTracks = " << wrkvrt.associatedTrackIndices.size()
1568 <<
", (r, z) = (" << wrkvrt.vertex.perp()
1569 <<
", " << wrkvrt.vertex.z() <<
")" );
1577 if( wrkvrt.nTracksTotal() < 2 ) {
1578 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": ntrk < 2 --> rejected." );
1586 if( wrkvrt.vertex.perp() < 31.0 ) {
1589 wrkvrt.selectedTrackIndices.erase(
std::remove_if( wrkvrt.selectedTrackIndices.begin(), wrkvrt.selectedTrackIndices.end(),
1590 [&](
auto&
index ) {
1591 auto* trk = m_selectedTracks.at( index );
1593 return ( nPixelHits < 3 );
1595 wrkvrt.selectedTrackIndices.end() );
1598 wrkvrt.associatedTrackIndices.erase(
std::remove_if( wrkvrt.associatedTrackIndices.begin(), wrkvrt.associatedTrackIndices.end(),
1599 [&](
auto&
index ) {
1600 auto* trk = m_associatedTracks.at( index );
1602 return ( nPixelHits < 3 );
1604 wrkvrt.associatedTrackIndices.end() );
1607 if( statusCode.isFailure() ) {}
1618 if( wrkvrt.fitQuality() > backup.
fitQuality() ) wrkvrt = std::move(backup);
1623 if( wrkvrt.nTracksTotal() < 2 )
continue;
1626 if( wrkvrt.selectedTrackIndices.size() < 2 )
continue;
1636 if(
sc.isFailure() ) {
1638 auto indices = wrkvrt.associatedTrackIndices;
1640 wrkvrt.associatedTrackIndices.clear();
1642 if(
sc.isFailure() ) {
1643 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": detected vertex fitting failure!" );
1646 if( wrkvrt.fitQuality() > backup.
fitQuality() ) wrkvrt = backup;
1648 for(
auto&
index : indices ) {
1653 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": detected vertex fitting failure!" );
1660 if( wrkvrt.fitQuality() > backup.
fitQuality() ) wrkvrt = backup;
1671 TLorentzVector sumP4_pion;
1672 TLorentzVector sumP4_electron;
1673 TLorentzVector sumP4_proton;
1676 bool good_flag =
true;
1678 std::map<const std::deque<long int>*,
const std::vector<const xAOD::TrackParticle*>&> indicesSet
1684 for(
auto& pair : indicesSet ) {
1686 const auto* indices = pair.first;
1687 const auto& tracks = pair.second;
1689 for(
const auto& itrk : *indices ) {
1690 const auto* trk = tracks.at( itrk );
1693 ATH_MSG_INFO(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": Failed in obtaining the SV perigee!" );
1701 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": sv perigee could not be obtained --> rejected" );
1708 std::vector<const xAOD::TrackParticle*> tracks;
1709 std::vector< std::pair<const xAOD::TrackParticle*, double> > trackChi2Pairs;
1713 for(
auto& pair : indicesSet ) {
1714 for(
const auto&
index : *pair.first ) tracks.emplace_back( pair.second.at(
index ) );
1717 auto trkitr = tracks.begin();
1718 auto chi2itr = wrkvrt.Chi2PerTrk.begin();
1720 for( ; ( trkitr!=tracks.end() && chi2itr!=wrkvrt.Chi2PerTrk.end() ); ++trkitr, ++chi2itr ) {
1721 trackChi2Pairs.emplace_back( *trkitr, *chi2itr );
1727 TLorentzVector sumP4_selected;
1729 bool badIPflag {
false };
1732 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Track loop: size = " << tracks.size() );
1733 for(
auto& pair : trackChi2Pairs ) {
1735 const auto* trk = pair.first;
1736 const auto& chi2AtSV = pair.second;
1738 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": start." );
1747 double trk_pt = trk->pt();
1748 double trk_eta = trk->eta();
1749 double trk_phi = trk->phi();
1751 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": in vrt chg/pt/phi/eta = "
1752 << trk->charge() <<
","
1759 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": Get the prigee of the track at the vertex." );
1763 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": Failed in obtaining the SV perigee!" );
1768 (*m_decor_is_svtrk_final)( *trk ) =
true;
1772 double qOverP_wrtSV = sv_perigee->parameters() [
Trk::qOverP];
1773 double theta_wrtSV = sv_perigee->parameters() [
Trk::theta];
1774 double p_wrtSV = 1.0 / std::abs( qOverP_wrtSV );
1775 double pt_wrtSV = p_wrtSV * sin( theta_wrtSV );
1776 double eta_wrtSV = -log( tan( theta_wrtSV/2. ) );
1777 double phi_wrtSV = sv_perigee->parameters() [
Trk::phi];
1778 double d0_wrtSV = sv_perigee->parameters() [
Trk::d0];
1779 double z0_wrtSV = sv_perigee->parameters() [
Trk::z0];
1780 double errd0_wrtSV = (*sv_perigee->covariance())(
Trk::d0,
Trk::d0 );
1781 double errz0_wrtSV = (*sv_perigee->covariance())(
Trk::z0,
Trk::z0 );
1795 (*m_decor_is_svtrk_final)( *trk ) =
true;
1797 TLorentzVector p4wrtSV_pion;
1798 TLorentzVector p4wrtSV_electron;
1799 TLorentzVector p4wrtSV_proton;
1807 if( !is_associatedAcc(*trk) ) {
1808 sumP4_selected += p4wrtSV_pion;
1811 sumP4_selected += p4wrtSV_pion;
1814 sumP4_pion += p4wrtSV_pion;
1815 sumP4_electron += p4wrtSV_electron;
1816 sumP4_proton += p4wrtSV_proton;
1818 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": end." );
1823 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Final Sec.Vertex=" << wrkvrt.nTracksTotal() <<
", "
1824 <<wrkvrt.vertex.perp() <<
", "<<wrkvrt.vertex.z() <<
", "
1825 <<wrkvrt.vertex.phi() <<
", mass = "<< sumP4_pion.M() <<
"," << sumP4_electron.M() );
1828 float perigee_x_trk1 = 0.0;
1829 float perigee_y_trk1 = 0.0;
1830 float perigee_z_trk1 = 0.0;
1831 float perigee_x_trk2 = 0.0;
1832 float perigee_y_trk2 = 0.0;
1833 float perigee_z_trk2 = 0.0;
1834 float perigee_px_trk1 = 0.0;
1835 float perigee_py_trk1 = 0.0;
1836 float perigee_pz_trk1 = 0.0;
1837 float perigee_px_trk2 = 0.0;
1838 float perigee_py_trk2 = 0.0;
1839 float perigee_pz_trk2 = 0.0;
1840 float perigee_cov_xx_trk1 = 0.0;
1841 float perigee_cov_xy_trk1 = 0.0;
1842 float perigee_cov_xz_trk1 = 0.0;
1843 float perigee_cov_yy_trk1 = 0.0;
1844 float perigee_cov_yz_trk1 = 0.0;
1845 float perigee_cov_zz_trk1 = 0.0;
1846 float perigee_cov_xx_trk2 = 0.0;
1847 float perigee_cov_xy_trk2 = 0.0;
1848 float perigee_cov_xz_trk2 = 0.0;
1849 float perigee_cov_yy_trk2 = 0.0;
1850 float perigee_cov_yz_trk2 = 0.0;
1851 float perigee_cov_zz_trk2 = 0.0;
1852 float perigee_d0_trk1 = 0.0;
1853 float perigee_d0_trk2 = 0.0;
1854 float perigee_z0_trk1 = 0.0;
1855 float perigee_z0_trk2 = 0.0;
1856 float perigee_qOverP_trk1 = 0.0;
1857 float perigee_qOverP_trk2 = 0.0;
1858 float perigee_theta_trk1 = 0.0;
1859 float perigee_theta_trk2 = 0.0;
1860 float perigee_phi_trk1 = 0.0;
1861 float perigee_phi_trk2 = 0.0;
1862 int perigee_charge_trk1 = 0;
1863 int perigee_charge_trk2 = 0;
1864 float perigee_distance = 9999.0;
1867 float vPos = (vDist.x() * wrkvrt.vertexMom.Px() + vDist.y() * wrkvrt.vertexMom.Py() + vDist.z() * wrkvrt.vertexMom.Pz()) / wrkvrt.vertexMom.Rho();
1868 float vPosMomAngT = (vDist.x() * wrkvrt.vertexMom.Px() + vDist.y() * wrkvrt.vertexMom.Py()) / vDist.perp() / wrkvrt.vertexMom.Pt();
1869 float vPosMomAng3D = (vDist.x() * wrkvrt.vertexMom.Px() + vDist.y() * wrkvrt.vertexMom.Py() + vDist.z() * wrkvrt.vertexMom.Pz()) / (vDist.norm() * wrkvrt.vertexMom.Rho());
1870 float dphi_trk1 = 0.0;
1871 float dphi_trk2 = 0.0;
1875 const auto* track1 = trackChi2Pairs[0].first;
1876 dphi_trk1 = TVector2::Phi_mpi_pi(vDist.phi() - track1->phi());
1879 perigee_x_trk1 = sv_perigee1->position().x();
1880 perigee_y_trk1 = sv_perigee1->position().y();
1881 perigee_z_trk1 = sv_perigee1->position().z();
1882 perigee_px_trk1 = sv_perigee1->momentum().x();
1883 perigee_py_trk1 = sv_perigee1->momentum().y();
1884 perigee_pz_trk1 = sv_perigee1->momentum().z();
1885 perigee_cov_xx_trk1 = (*sv_perigee1->covariance())(0, 0);
1886 perigee_cov_xy_trk1 = (*sv_perigee1->covariance())(0, 1);
1887 perigee_cov_xz_trk1 = (*sv_perigee1->covariance())(0, 2);
1888 perigee_cov_yy_trk1 = (*sv_perigee1->covariance())(1, 1);
1889 perigee_cov_yz_trk1 = (*sv_perigee1->covariance())(1, 2);
1890 perigee_cov_zz_trk1 = (*sv_perigee1->covariance())(2, 2);
1891 perigee_d0_trk1 = sv_perigee1->parameters()[
Trk::d0];
1892 perigee_z0_trk1 = sv_perigee1->parameters()[
Trk::z0];
1893 perigee_qOverP_trk1 = sv_perigee1->parameters()[
Trk::qOverP];
1894 perigee_theta_trk1 = sv_perigee1->parameters()[
Trk::theta];
1895 perigee_phi_trk1 = sv_perigee1->parameters()[
Trk::phi];
1896 perigee_charge_trk1 = sv_perigee1->parameters()[
Trk::qOverP] > 0 ? 1 : -1;
1898 ATH_MSG_DEBUG(
"Failed to obtain perigee for track1 at vertex.");
1902 const auto* track2 = trackChi2Pairs[1].first;
1903 dphi_trk2 = TVector2::Phi_mpi_pi(vDist.phi() - track2->phi());
1906 perigee_x_trk2 = sv_perigee2->position().x();
1907 perigee_y_trk2 = sv_perigee2->position().y();
1908 perigee_z_trk2 = sv_perigee2->position().z();
1909 perigee_px_trk2 = sv_perigee2->momentum().x();
1910 perigee_py_trk2 = sv_perigee2->momentum().y();
1911 perigee_pz_trk2 = sv_perigee2->momentum().z();
1912 perigee_cov_xx_trk2 = (*sv_perigee2->covariance())(0, 0);
1913 perigee_cov_xy_trk2 = (*sv_perigee2->covariance())(0, 1);
1914 perigee_cov_xz_trk2 = (*sv_perigee2->covariance())(0, 2);
1915 perigee_cov_yy_trk2 = (*sv_perigee2->covariance())(1, 1);
1916 perigee_cov_yz_trk2 = (*sv_perigee2->covariance())(1, 2);
1917 perigee_cov_zz_trk2 = (*sv_perigee2->covariance())(2, 2);
1918 perigee_d0_trk2 = sv_perigee2->parameters()[
Trk::d0];
1919 perigee_z0_trk2 = sv_perigee2->parameters()[
Trk::z0];
1920 perigee_qOverP_trk2 = sv_perigee2->parameters()[
Trk::qOverP];
1921 perigee_theta_trk2 = sv_perigee2->parameters()[
Trk::theta];
1922 perigee_phi_trk2 = sv_perigee2->parameters()[
Trk::phi];
1923 perigee_charge_trk2 = sv_perigee2->parameters()[
Trk::qOverP] > 0 ? 1 : -1;
1925 ATH_MSG_DEBUG(
"Failed to obtain perigee for track2 at vertex.");
1928 if(sv_perigee1 && sv_perigee2){
1929 perigee_distance = sqrt(
1930 (perigee_x_trk1 - perigee_x_trk2) * (perigee_x_trk1 - perigee_x_trk2) +
1931 (perigee_y_trk1 - perigee_y_trk2) * (perigee_y_trk1 - perigee_y_trk2) +
1932 (perigee_z_trk1 - perigee_z_trk2) * (perigee_z_trk1 - perigee_z_trk2)
1942 std::vector<double> opAngles;
1944 for(
auto itr1 = tracks.begin(); itr1 != tracks.end(); ++itr1 ) {
1945 for(
auto itr2 = std::next( itr1 ); itr2 != tracks.end(); ++itr2 ) {
1946 const auto& p1 = (*itr1)->p4().Vect();
1947 const auto& p2 = (*itr2)->p4().Vect();
1948 auto cos = p1 * p2 / p1.Mag() / p2.Mag();
1949 opAngles.emplace_back( cos );
1952 minOpAng = *( std::max_element( opAngles.begin(), opAngles.end() ) );
1959 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Bad impact parameter signif wrt SV was flagged." );
1964 bool oneLepMatchTrack =
false;
1965 for (
const auto *trk: tracks) {
1967 oneLepMatchTrack =
true;
1973 if (!oneLepMatchTrack)
continue;
1979 wrkvrt.isGood =
true;
1984 secondaryVertexContainer->emplace_back( vertex );
1987 vertex->setPosition( wrkvrt.vertex );
1994 vertex->setFitQuality( wrkvrt.Chi2_core, wrkvrt.ndof_core() );
1997 std::vector<float> fCov(wrkvrt.vertexCov.cbegin(), wrkvrt.vertexCov.cend());
1998 vertex->setCovariance(fCov);
2019 vtx_pxAcc(*vertex) = wrkvrt.vertexMom.Px();
2020 vtx_pyAcc(*vertex) = wrkvrt.vertexMom.Py();
2021 vtx_pzAcc(*vertex) = wrkvrt.vertexMom.Pz();
2023 vtx_massAcc(*vertex) = wrkvrt.vertexMom.M();
2024 vtx_chargeAcc(*vertex) = wrkvrt.Charge;
2026 chi2_coreAcc(*vertex) = wrkvrt.Chi2_core;
2027 ndof_coreAcc(*vertex) = wrkvrt.ndof_core();
2028 chi2_assocAcc(*vertex) = wrkvrt.Chi2;
2029 ndof_assocAcc(*vertex) = wrkvrt.ndof();
2031 massAcc(*vertex) = sumP4_pion.M();
2032 mass_eAcc(*vertex) = sumP4_electron.M();
2033 mass_selectedTracksAcc(*vertex) = sumP4_selected.M();
2034 minOpAngAcc(*vertex) = minOpAng;
2035 num_trksAcc(*vertex) = wrkvrt.nTracksTotal();
2036 num_selectedTracksAcc(*vertex) = wrkvrt.selectedTrackIndices.size();
2037 num_associatedTracksAcc(*vertex) = wrkvrt.associatedTrackIndices.size();
2038 dCloseVrtAcc(*vertex) = wrkvrt.closestWrkVrtValue;
2083 perigee_x_trk1Acc(*vertex) = perigee_x_trk1;
2084 perigee_y_trk1Acc(*vertex) = perigee_y_trk1;
2085 perigee_z_trk1Acc(*vertex) = perigee_z_trk1;
2086 perigee_x_trk2Acc(*vertex) = perigee_x_trk2;
2087 perigee_y_trk2Acc(*vertex) = perigee_y_trk2;
2088 perigee_z_trk2Acc(*vertex) = perigee_z_trk2;
2089 perigee_px_trk1Acc(*vertex) = perigee_px_trk1;
2090 perigee_py_trk1Acc(*vertex) = perigee_py_trk1;
2091 perigee_pz_trk1Acc(*vertex) = perigee_pz_trk1;
2092 perigee_px_trk2Acc(*vertex) = perigee_px_trk2;
2093 perigee_py_trk2Acc(*vertex) = perigee_py_trk2;
2094 perigee_pz_trk2Acc(*vertex) = perigee_pz_trk2;
2095 perigee_cov_xx_trk1Acc(*vertex) = perigee_cov_xx_trk1;
2096 perigee_cov_xy_trk1Acc(*vertex) = perigee_cov_xy_trk1;
2097 perigee_cov_xz_trk1Acc(*vertex) = perigee_cov_xz_trk1;
2098 perigee_cov_yy_trk1Acc(*vertex) = perigee_cov_yy_trk1;
2099 perigee_cov_yz_trk1Acc(*vertex) = perigee_cov_yz_trk1;
2100 perigee_cov_zz_trk1Acc(*vertex) = perigee_cov_zz_trk1;
2101 perigee_cov_xx_trk2Acc(*vertex) = perigee_cov_xx_trk2;
2102 perigee_cov_xy_trk2Acc(*vertex) = perigee_cov_xy_trk2;
2103 perigee_cov_xz_trk2Acc(*vertex) = perigee_cov_xz_trk2;
2104 perigee_cov_yy_trk2Acc(*vertex) = perigee_cov_yy_trk2;
2105 perigee_cov_yz_trk2Acc(*vertex) = perigee_cov_yz_trk2;
2106 perigee_cov_zz_trk2Acc(*vertex) = perigee_cov_zz_trk2;
2107 perigee_d0_trk1Acc(*vertex) = perigee_d0_trk1;
2108 perigee_d0_trk2Acc(*vertex) = perigee_d0_trk2;
2109 perigee_z0_trk1Acc(*vertex) = perigee_z0_trk1;
2110 perigee_z0_trk2Acc(*vertex) = perigee_z0_trk2;
2111 perigee_qOverP_trk1Acc(*vertex) = perigee_qOverP_trk1;
2112 perigee_qOverP_trk2Acc(*vertex) = perigee_qOverP_trk2;
2113 perigee_theta_trk1Acc(*vertex) = perigee_theta_trk1;
2114 perigee_theta_trk2Acc(*vertex) = perigee_theta_trk2;
2115 perigee_phi_trk1Acc(*vertex) = perigee_phi_trk1;
2116 perigee_phi_trk2Acc(*vertex) = perigee_phi_trk2;
2117 perigee_charge_trk1Acc(*vertex) = perigee_charge_trk1;
2118 perigee_charge_trk2Acc(*vertex) = perigee_charge_trk2;
2119 vPosAcc(*vertex) = vPos;
2120 vPosMomAngTAcc(*vertex) = vPosMomAngT;
2121 vPosMomAng3DAcc(*vertex) = vPosMomAng3D;
2122 dphi_trk1Acc(*vertex) = dphi_trk1;
2123 dphi_trk2Acc(*vertex) = dphi_trk2;
2128 for(
auto trk_id : wrkvrt.selectedTrackIndices ) {
2136 vertex->addTrackAtVertex( link_trk, 1. );
2140 for(
auto trk_id : wrkvrt.associatedTrackIndices ) {
2148 vertex->addTrackAtVertex( link_trk, 1. );
2161 if( mappedVtx.
valid ) {
2163 local_layerIndexAcc(*vertex) = mappedVtx.
layerIndex;
2184 wrkvrtLinkMap[&wrkvrt] = vertex;
2189 if( m_FillNtuple ) {
2190 ATH_CHECK( fillAANT_SecondaryVertices( secondaryVertexContainer ) );
2195 if( m_doAugmentDVimpactParametersToMuons ) {
ATH_CHECK( augmentDVimpactParametersToLeptons<xAOD::Muon> ( ctx,
"Muons" ) ); }
2196 if( m_doAugmentDVimpactParametersToElectrons ) {
ATH_CHECK( augmentDVimpactParametersToLeptons<xAOD::Electron>( ctx,
"Electrons" ) ); }
2198 }
catch (
const std::out_of_range& e) {
2200 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": out of range error is detected: " <<
e.what() );
2202 return StatusCode::SUCCESS;
2206 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": some other error is detected." );
2208 return StatusCode::SUCCESS;
2212 return StatusCode::SUCCESS;