1515 {
1516
1517
1518
1519
1520
1521 try {
1522
1525
1528
1529 enum { kPt,
kEta,
kPhi, kD0, kZ0, kErrP, kErrD0, kErrZ0, kChi2SV };
1531 m_trkDecors.emplace( kPt, SG::AuxElement::Decorator<float>(
"pt_wrtSV" +
m_jp.augVerString) );
1532 m_trkDecors.emplace( kEta, SG::AuxElement::Decorator<float>(
"eta_wrtSV" +
m_jp.augVerString) );
1533 m_trkDecors.emplace( kPhi, SG::AuxElement::Decorator<float>(
"phi_wrtSV" +
m_jp.augVerString) );
1534 m_trkDecors.emplace( kD0, SG::AuxElement::Decorator<float>(
"d0_wrtSV" +
m_jp.augVerString) );
1535 m_trkDecors.emplace( kZ0, SG::AuxElement::Decorator<float>(
"z0_wrtSV" +
m_jp.augVerString) );
1536 m_trkDecors.emplace( kErrP, SG::AuxElement::Decorator<float>(
"errP_wrtSV" +
m_jp.augVerString) );
1537 m_trkDecors.emplace( kErrD0, SG::AuxElement::Decorator<float>(
"errd0_wrtSV" +
m_jp.augVerString) );
1538 m_trkDecors.emplace( kErrZ0, SG::AuxElement::Decorator<float>(
"errz0_wrtSV" +
m_jp.augVerString) );
1539 m_trkDecors.emplace( kChi2SV, SG::AuxElement::Decorator<float>(
"chi2_toSV" +
m_jp.augVerString) );
1540 }
1543 }
1544
1545 std::map<const WrkVrt*, const xAOD::Vertex*> wrkvrtLinkMap;
1546
1547
1548 const auto& ctx = Gaudi::Hive::currentContext();
1549
1550 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": input #vertices = " << workVerticesContainer->size() );
1551
1552
1553 for( auto& wrkvrt : *workVerticesContainer ) {
1554
1555 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": candidate vertex: "
1556 << " isGood = " << (wrkvrt.isGood? "true" : "false")
1557 << ", #ntrks = " << wrkvrt.nTracksTotal()
1558 << ", #selectedTracks = " << wrkvrt.selectedTrackIndices.size()
1559 << ", #associatedTracks = " << wrkvrt.associatedTrackIndices.size()
1561 << ", (r, z) = (" << wrkvrt.vertex.perp()
1562 <<", " << wrkvrt.vertex.z() << ")" );
1563
1564 if(
m_jp.FillHist )
m_hists[
"finalCutMonitor"]->Fill( 0 );
1565
1566 if(
m_jp.removeFakeVrt &&
m_jp.removeFakeVrtLate ) {
1568 }
1569
1570 if( wrkvrt.nTracksTotal() < 2 ) {
1571 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": ntrk < 2 --> rejected." );
1572 continue;
1573 }
1574
1575 if(
m_jp.FillHist )
m_hists[
"finalCutMonitor"]->Fill( 1 );
1576
1577
1578
1579 if( wrkvrt.vertex.perp() < 31.0 ) {
1580
1581
1582 wrkvrt.selectedTrackIndices.erase(
std::remove_if( wrkvrt.selectedTrackIndices.begin(), wrkvrt.selectedTrackIndices.end(),
1583 [&]( auto& index ) {
1584 auto* trk = m_selectedTracks.at( index );
1586 return ( nPixelHits < 3 );
1587 } ),
1588 wrkvrt.selectedTrackIndices.end() );
1589
1590
1591 wrkvrt.associatedTrackIndices.erase(
std::remove_if( wrkvrt.associatedTrackIndices.begin(), wrkvrt.associatedTrackIndices.end(),
1592 [&]( auto& index ) {
1593 auto* trk = m_associatedTracks.at( index );
1595 return ( nPixelHits < 3 );
1596 } ),
1597 wrkvrt.associatedTrackIndices.end() );
1598
1601
1602 }
1603
1604
1605 if(
m_jp.doFinalImproveChi2 ) {
1606
1608
1610
1611 if( wrkvrt.fitQuality() > backup.fitQuality() ) wrkvrt = backup;
1612
1613 }
1614
1615
1616 if( wrkvrt.nTracksTotal() < 2 ) continue;
1617
1618
1619 if( wrkvrt.selectedTrackIndices.size() < 2 ) continue;
1620
1621
1622 if(
m_jp.FillHist )
m_hists[
"finalCutMonitor"]->Fill( 2 );
1623
1624
1625 {
1627
1629 if(
sc.isFailure() ) {
1630
1631 auto indices = wrkvrt.associatedTrackIndices;
1632
1633 wrkvrt.associatedTrackIndices.clear();
1635 if(
sc.isFailure() ) {
1636 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": detected vertex fitting failure!" );
1637 wrkvrt = backup;
1638 }
1639 if( wrkvrt.fitQuality() > backup.fitQuality() ) wrkvrt = backup;
1640
1641 for( auto& index : indices ) {
1642 backup = wrkvrt;
1643 wrkvrt.associatedTrackIndices.emplace_back( index );
1645 if(
sc.isFailure() || TMath::Prob( wrkvrt.Chi2, wrkvrt.ndof() ) <
m_jp.improveChi2ProbThreshold ) {
1646 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": detected vertex fitting failure!" );
1647 wrkvrt = backup;
1648 continue;
1649 }
1650 }
1651
1652 } else {
1653 if( wrkvrt.fitQuality() > backup.fitQuality() ) wrkvrt = backup;
1654 }
1655 }
1656
1657 if(
m_jp.FillHist )
m_hists[
"finalCutMonitor"]->Fill( 3 );
1658
1659
1660
1661
1663
1664 TLorentzVector sumP4_pion;
1665 TLorentzVector sumP4_electron;
1666 TLorentzVector sumP4_proton;
1667
1668
1669 bool good_flag = true;
1670
1671 std::map<const std::deque<long int>*, const std::vector<const xAOD::TrackParticle*>&> indicesSet
1672 = {
1675 };
1676
1677 for( auto& pair : indicesSet ) {
1678
1679 const auto*
indices = pair.first;
1680 const auto& tracks = pair.second;
1681
1682 for( const auto& itrk : *indices ) {
1683 const auto* trk = tracks.at( itrk );
1685 if( !sv_perigee ) {
1686 ATH_MSG_INFO(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": Failed in obtaining the SV perigee!" );
1687 good_flag = false;
1688 }
1689 }
1690
1691 }
1692
1693 if( !good_flag ) {
1694 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": sv perigee could not be obtained --> rejected" );
1695 continue;
1696 }
1697
1698 if(
m_jp.FillHist )
m_hists[
"finalCutMonitor"]->Fill( 4 );
1699
1700
1701 std::vector<const xAOD::TrackParticle*> tracks;
1702 std::vector< std::pair<const xAOD::TrackParticle*, double> > trackChi2Pairs;
1703
1704 {
1705
1706 for( auto& pair : indicesSet ) {
1707 for( const auto& index : *pair.first ) tracks.emplace_back( pair.second.at( index ) );
1708 }
1709
1710 auto trkitr = tracks.begin();
1711 auto chi2itr = wrkvrt.Chi2PerTrk.begin();
1712
1713 for( ; ( trkitr!=tracks.end() && chi2itr!=wrkvrt.Chi2PerTrk.end() ); ++trkitr, ++chi2itr ) {
1714 trackChi2Pairs.emplace_back( *trkitr, *chi2itr );
1715 }
1716
1717 }
1718
1719
1720 TLorentzVector sumP4_selected;
1721
1722 bool badIPflag { false };
1723
1724
1725 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Track loop: size = " << tracks.size() );
1726 for( auto& pair : trackChi2Pairs ) {
1727
1728 const auto* trk = pair.first;
1729 const auto& chi2AtSV = pair.second;
1730
1731 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": start." );
1732
1735
1736
1737
1738
1739
1740 double trk_pt = trk->pt();
1741 double trk_eta = trk->eta();
1742 double trk_phi = trk->phi();
1743
1744 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": in vrt chg/pt/phi/eta = "
1745 << trk->charge() <<","
1746 <<trk_pt<<","
1747 <<trk_phi<<","
1748 <<trk_eta);
1749
1751
1752 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": Get the prigee of the track at the vertex." );
1753
1755 if( !sv_perigee ) {
1756 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": Failed in obtaining the SV perigee!" );
1757
1760 }
1761 (*m_decor_is_svtrk_final)( *trk ) = true;
1762 continue;
1763 }
1764
1765 double qOverP_wrtSV = sv_perigee->parameters() [
Trk::qOverP];
1766 double theta_wrtSV = sv_perigee->parameters() [
Trk::theta];
1767 double p_wrtSV = 1.0 / std::abs( qOverP_wrtSV );
1768 double pt_wrtSV = p_wrtSV *
sin( theta_wrtSV );
1769 double eta_wrtSV = -
log(
tan( theta_wrtSV/2. ) );
1770 double phi_wrtSV = sv_perigee->parameters() [
Trk::phi];
1771 double d0_wrtSV = sv_perigee->parameters() [
Trk::d0];
1772 double z0_wrtSV = sv_perigee->parameters() [
Trk::z0];
1773 double errd0_wrtSV = (*sv_perigee->covariance())(
Trk::d0,
Trk::d0 );
1774 double errz0_wrtSV = (*sv_perigee->covariance())(
Trk::z0,
Trk::z0 );
1776
1777
1787
1788 (*m_decor_is_svtrk_final)( *trk ) = true;
1789
1790 TLorentzVector p4wrtSV_pion;
1791 TLorentzVector p4wrtSV_electron;
1792 TLorentzVector p4wrtSV_proton;
1793
1796
1797
1798 static const SG::ConstAccessor<char> is_associatedAcc(
"is_associated" +
m_jp.augVerString);
1799 if( is_associatedAcc.isAvailable(*trk) ) {
1800 if( !is_associatedAcc(*trk) ) {
1801 sumP4_selected += p4wrtSV_pion;
1802 }
1803 } else {
1804 sumP4_selected += p4wrtSV_pion;
1805 }
1806
1807 sumP4_pion += p4wrtSV_pion;
1808 sumP4_electron += p4wrtSV_electron;
1809 sumP4_proton += p4wrtSV_proton;
1810
1811 ATH_MSG_VERBOSE(
" > " << __FUNCTION__ <<
": > Track index " << trk->index() <<
": end." );
1812 }
1813
1815
1816 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Final Sec.Vertex=" << wrkvrt.nTracksTotal() <<
", "
1817 <<wrkvrt.vertex.perp() <<", "<<wrkvrt.vertex.z() <<", "
1818 <<wrkvrt.vertex.phi() <<", mass = "<< sumP4_pion.M() << "," << sumP4_electron.M() );
1819
1820
1821 float perigee_x_trk1 = 0.0;
1822 float perigee_y_trk1 = 0.0;
1823 float perigee_z_trk1 = 0.0;
1824 float perigee_x_trk2 = 0.0;
1825 float perigee_y_trk2 = 0.0;
1826 float perigee_z_trk2 = 0.0;
1827 float perigee_px_trk1 = 0.0;
1828 float perigee_py_trk1 = 0.0;
1829 float perigee_pz_trk1 = 0.0;
1830 float perigee_px_trk2 = 0.0;
1831 float perigee_py_trk2 = 0.0;
1832 float perigee_pz_trk2 = 0.0;
1833 float perigee_cov_xx_trk1 = 0.0;
1834 float perigee_cov_xy_trk1 = 0.0;
1835 float perigee_cov_xz_trk1 = 0.0;
1836 float perigee_cov_yy_trk1 = 0.0;
1837 float perigee_cov_yz_trk1 = 0.0;
1838 float perigee_cov_zz_trk1 = 0.0;
1839 float perigee_cov_xx_trk2 = 0.0;
1840 float perigee_cov_xy_trk2 = 0.0;
1841 float perigee_cov_xz_trk2 = 0.0;
1842 float perigee_cov_yy_trk2 = 0.0;
1843 float perigee_cov_yz_trk2 = 0.0;
1844 float perigee_cov_zz_trk2 = 0.0;
1845 float perigee_d0_trk1 = 0.0;
1846 float perigee_d0_trk2 = 0.0;
1847 float perigee_z0_trk1 = 0.0;
1848 float perigee_z0_trk2 = 0.0;
1849 float perigee_qOverP_trk1 = 0.0;
1850 float perigee_qOverP_trk2 = 0.0;
1851 float perigee_theta_trk1 = 0.0;
1852 float perigee_theta_trk2 = 0.0;
1853 float perigee_phi_trk1 = 0.0;
1854 float perigee_phi_trk2 = 0.0;
1855 int perigee_charge_trk1 = 0;
1856 int perigee_charge_trk2 = 0;
1857 float perigee_distance = 9999.0;
1858
1860 float vPos = (vDist.x() * wrkvrt.vertexMom.Px() + vDist.y() * wrkvrt.vertexMom.Py() + vDist.z() * wrkvrt.vertexMom.Pz()) / wrkvrt.vertexMom.Rho();
1861 float vPosMomAngT = (vDist.x() * wrkvrt.vertexMom.Px() + vDist.y() * wrkvrt.vertexMom.Py()) / vDist.perp() / wrkvrt.vertexMom.Pt();
1862 float vPosMomAng3D = (vDist.x() * wrkvrt.vertexMom.Px() + vDist.y() * wrkvrt.vertexMom.Py() + vDist.z() * wrkvrt.vertexMom.Pz()) / (vDist.norm() * wrkvrt.vertexMom.Rho());
1863 float dphi_trk1 = 0.0;
1864 float dphi_trk2 = 0.0;
1865
1866 if (
m_jp.doDisappearingTrackVertexing){
1867
1868 const auto* track1 = trackChi2Pairs[0].first;
1869 dphi_trk1 = TVector2::Phi_mpi_pi(vDist.phi() - track1->phi());
1871 if (sv_perigee1) {
1872 perigee_x_trk1 = sv_perigee1->position().x();
1873 perigee_y_trk1 = sv_perigee1->position().y();
1874 perigee_z_trk1 = sv_perigee1->position().z();
1875 perigee_px_trk1 = sv_perigee1->momentum().x();
1876 perigee_py_trk1 = sv_perigee1->momentum().y();
1877 perigee_pz_trk1 = sv_perigee1->momentum().z();
1878 perigee_cov_xx_trk1 = (*sv_perigee1->covariance())(0, 0);
1879 perigee_cov_xy_trk1 = (*sv_perigee1->covariance())(0, 1);
1880 perigee_cov_xz_trk1 = (*sv_perigee1->covariance())(0, 2);
1881 perigee_cov_yy_trk1 = (*sv_perigee1->covariance())(1, 1);
1882 perigee_cov_yz_trk1 = (*sv_perigee1->covariance())(1, 2);
1883 perigee_cov_zz_trk1 = (*sv_perigee1->covariance())(2, 2);
1884 perigee_d0_trk1 = sv_perigee1->parameters()[
Trk::d0];
1885 perigee_z0_trk1 = sv_perigee1->parameters()[
Trk::z0];
1886 perigee_qOverP_trk1 = sv_perigee1->parameters()[
Trk::qOverP];
1887 perigee_theta_trk1 = sv_perigee1->parameters()[
Trk::theta];
1888 perigee_phi_trk1 = sv_perigee1->parameters()[
Trk::phi];
1889 perigee_charge_trk1 = sv_perigee1->parameters()[
Trk::qOverP] > 0 ? 1 : -1;
1890 }else{
1891 ATH_MSG_DEBUG(
"Failed to obtain perigee for track1 at vertex.");
1892 }
1893
1894
1895 const auto* track2 = trackChi2Pairs[1].first;
1896 dphi_trk2 = TVector2::Phi_mpi_pi(vDist.phi() - track2->phi());
1898 if (sv_perigee2) {
1899 perigee_x_trk2 = sv_perigee2->position().x();
1900 perigee_y_trk2 = sv_perigee2->position().y();
1901 perigee_z_trk2 = sv_perigee2->position().z();
1902 perigee_px_trk2 = sv_perigee2->momentum().x();
1903 perigee_py_trk2 = sv_perigee2->momentum().y();
1904 perigee_pz_trk2 = sv_perigee2->momentum().z();
1905 perigee_cov_xx_trk2 = (*sv_perigee2->covariance())(0, 0);
1906 perigee_cov_xy_trk2 = (*sv_perigee2->covariance())(0, 1);
1907 perigee_cov_xz_trk2 = (*sv_perigee2->covariance())(0, 2);
1908 perigee_cov_yy_trk2 = (*sv_perigee2->covariance())(1, 1);
1909 perigee_cov_yz_trk2 = (*sv_perigee2->covariance())(1, 2);
1910 perigee_cov_zz_trk2 = (*sv_perigee2->covariance())(2, 2);
1911 perigee_d0_trk2 = sv_perigee2->parameters()[
Trk::d0];
1912 perigee_z0_trk2 = sv_perigee2->parameters()[
Trk::z0];
1913 perigee_qOverP_trk2 = sv_perigee2->parameters()[
Trk::qOverP];
1914 perigee_theta_trk2 = sv_perigee2->parameters()[
Trk::theta];
1915 perigee_phi_trk2 = sv_perigee2->parameters()[
Trk::phi];
1916 perigee_charge_trk2 = sv_perigee2->parameters()[
Trk::qOverP] > 0 ? 1 : -1;
1917 }else{
1918 ATH_MSG_DEBUG(
"Failed to obtain perigee for track2 at vertex.");
1919 }
1920
1921 if(sv_perigee1 && sv_perigee2){
1922 perigee_distance = sqrt(
1923 (perigee_x_trk1 - perigee_x_trk2) * (perigee_x_trk1 - perigee_x_trk2) +
1924 (perigee_y_trk1 - perigee_y_trk2) * (perigee_y_trk1 - perigee_y_trk2) +
1925 (perigee_z_trk1 - perigee_z_trk2) * (perigee_z_trk1 - perigee_z_trk2)
1926 );
1927 }
1928 if(perigee_distance >
m_jp.twoTrVrtMaxPerigeeDist)
continue;
1929 }
1930
1931
1932
1933
1935 std::vector<double> opAngles;
1936
1937 for( auto itr1 = tracks.begin(); itr1 != tracks.end(); ++itr1 ) {
1938 for( auto itr2 = std::next( itr1 ); itr2 != tracks.end(); ++itr2 ) {
1939 const auto&
p1 = (*itr1)->p4().Vect();
1940 const auto&
p2 = (*itr2)->p4().Vect();
1942 opAngles.emplace_back( cos );
1943 }
1944 }
1945 minOpAng = *( std::max_element( opAngles.begin(), opAngles.end() ) );
1946 if(
m_jp.FillNtuple )
m_ntupleVars->get< vector<double> >(
"SecVtx_MinOpAng" ).emplace_back(minOpAng);
1947
1948
1949 if(
m_jp.FillHist )
m_hists[
"finalCutMonitor"]->Fill( 5 );
1950
1951 if( badIPflag ) {
1952 ATH_MSG_DEBUG(
" > " << __FUNCTION__ <<
": Bad impact parameter signif wrt SV was flagged." );
1953 }
1954
1955 if (
m_jp.doRemoveNonLeptonVertices) {
1956
1957 bool oneLepMatchTrack = false;
1958 for (const auto *trk: tracks) {
1960 oneLepMatchTrack = true;
1961 break;
1962 }
1963 }
1964
1965
1966 if (!oneLepMatchTrack) continue;
1967 }
1968
1970
1971
1972 wrkvrt.isGood = true;
1973
1974
1975
1977 secondaryVertexContainer->emplace_back( vertex );
1978
1979
1980 vertex->setPosition( wrkvrt.vertex );
1981
1982
1984
1985
1986
1987 vertex->setFitQuality( wrkvrt.Chi2_core, wrkvrt.ndof_core() );
1988
1989
1990 std::vector<float> fCov(wrkvrt.vertexCov.cbegin(), wrkvrt.vertexCov.cend());
1991 vertex->setCovariance(fCov);
1992
1993
1994 static const SG::Accessor<float> vtx_pxAcc("vtx_px");
1995 static const SG::Accessor<float> vtx_pyAcc("vtx_py");
1996 static const SG::Accessor<float> vtx_pzAcc("vtx_pz");
1997 static const SG::Accessor<float> vtx_massAcc("vtx_mass");
1998 static const SG::Accessor<float> vtx_chargeAcc("vtx_charge");
1999 static const SG::Accessor<float> chi2_coreAcc("chi2_core");
2000 static const SG::Accessor<float> ndof_coreAcc("ndof_core");
2001 static const SG::Accessor<float> chi2_assocAcc("chi2_assoc");
2002 static const SG::Accessor<float> ndof_assocAcc("ndof_assoc");
2003 static const SG::Accessor<float> massAcc("mass");
2004 static const SG::Accessor<float> mass_eAcc("mass_e");
2005 static const SG::Accessor<float> mass_selectedTracksAcc("mass_selectedTracks");
2006 static const SG::Accessor<float> minOpAngAcc("minOpAng");
2007 static const SG::Accessor<int> num_trksAcc("num_trks");
2008 static const SG::Accessor<int> num_selectedTracksAcc("num_selectedTracks");
2009 static const SG::Accessor<int> num_associatedTracksAcc("num_associatedTracks");
2010 static const SG::Accessor<float> dCloseVrtAcc("dCloseVrt");
2011
2012 vtx_pxAcc(*vertex) = wrkvrt.vertexMom.Px();
2013 vtx_pyAcc(*vertex) = wrkvrt.vertexMom.Py();
2014 vtx_pzAcc(*vertex) = wrkvrt.vertexMom.Pz();
2015
2016 vtx_massAcc(*vertex) = wrkvrt.vertexMom.M();
2017 vtx_chargeAcc(*vertex) = wrkvrt.Charge;
2018
2019 chi2_coreAcc(*vertex) = wrkvrt.Chi2_core;
2020 ndof_coreAcc(*vertex) = wrkvrt.ndof_core();
2021 chi2_assocAcc(*vertex) = wrkvrt.Chi2;
2022 ndof_assocAcc(*vertex) = wrkvrt.ndof();
2023
2024 massAcc(*vertex) = sumP4_pion.M();
2025 mass_eAcc(*vertex) = sumP4_electron.M();
2026 mass_selectedTracksAcc(*vertex) = sumP4_selected.M();
2027 minOpAngAcc(*vertex) = minOpAng;
2028 num_trksAcc(*vertex) = wrkvrt.nTracksTotal();
2029 num_selectedTracksAcc(*vertex) = wrkvrt.selectedTrackIndices.size();
2030 num_associatedTracksAcc(*vertex) = wrkvrt.associatedTrackIndices.size();
2031 dCloseVrtAcc(*vertex) = wrkvrt.closestWrkVrtValue;
2032
2033
2034 if (
m_jp.doDisappearingTrackVertexing){
2035 static const SG::Accessor<float> perigee_x_trk1Acc("perigee_x_trk1");
2036 static const SG::Accessor<float> perigee_y_trk1Acc("perigee_y_trk1");
2037 static const SG::Accessor<float> perigee_z_trk1Acc("perigee_z_trk1");
2038 static const SG::Accessor<float> perigee_x_trk2Acc("perigee_x_trk2");
2039 static const SG::Accessor<float> perigee_y_trk2Acc("perigee_y_trk2");
2040 static const SG::Accessor<float> perigee_z_trk2Acc("perigee_z_trk2");
2041 static const SG::Accessor<float> perigee_px_trk1Acc("perigee_px_trk1");
2042 static const SG::Accessor<float> perigee_py_trk1Acc("perigee_py_trk1");
2043 static const SG::Accessor<float> perigee_pz_trk1Acc("perigee_pz_trk1");
2044 static const SG::Accessor<float> perigee_px_trk2Acc("perigee_px_trk2");
2045 static const SG::Accessor<float> perigee_py_trk2Acc("perigee_py_trk2");
2046 static const SG::Accessor<float> perigee_pz_trk2Acc("perigee_pz_trk2");
2047 static const SG::Accessor<float> perigee_cov_xx_trk1Acc("perigee_cov_xx_trk1");
2048 static const SG::Accessor<float> perigee_cov_xy_trk1Acc("perigee_cov_xy_trk1");
2049 static const SG::Accessor<float> perigee_cov_xz_trk1Acc("perigee_cov_xz_trk1");
2050 static const SG::Accessor<float> perigee_cov_yy_trk1Acc("perigee_cov_yy_trk1");
2051 static const SG::Accessor<float> perigee_cov_yz_trk1Acc("perigee_cov_yz_trk1");
2052 static const SG::Accessor<float> perigee_cov_zz_trk1Acc("perigee_cov_zz_trk1");
2053 static const SG::Accessor<float> perigee_cov_xx_trk2Acc("perigee_cov_xx_trk2");
2054 static const SG::Accessor<float> perigee_cov_xy_trk2Acc("perigee_cov_xy_trk2");
2055 static const SG::Accessor<float> perigee_cov_xz_trk2Acc("perigee_cov_xz_trk2");
2056 static const SG::Accessor<float> perigee_cov_yy_trk2Acc("perigee_cov_yy_trk2");
2057 static const SG::Accessor<float> perigee_cov_yz_trk2Acc("perigee_cov_yz_trk2");
2058 static const SG::Accessor<float> perigee_cov_zz_trk2Acc("perigee_cov_zz_trk2");
2059 static const SG::Accessor<float> perigee_d0_trk1Acc("perigee_d0_trk1");
2060 static const SG::Accessor<float> perigee_d0_trk2Acc("perigee_d0_trk2");
2061 static const SG::Accessor<float> perigee_z0_trk1Acc("perigee_z0_trk1");
2062 static const SG::Accessor<float> perigee_z0_trk2Acc("perigee_z0_trk2");
2063 static const SG::Accessor<float> perigee_qOverP_trk1Acc("perigee_qOverP_trk1");
2064 static const SG::Accessor<float> perigee_qOverP_trk2Acc("perigee_qOverP_trk2");
2065 static const SG::Accessor<float> perigee_theta_trk1Acc("perigee_theta_trk1");
2066 static const SG::Accessor<float> perigee_theta_trk2Acc("perigee_theta_trk2");
2067 static const SG::Accessor<float> perigee_phi_trk1Acc("perigee_phi_trk1");
2068 static const SG::Accessor<float> perigee_phi_trk2Acc("perigee_phi_trk2");
2069 static const SG::Accessor<int> perigee_charge_trk1Acc("perigee_charge_trk1");
2070 static const SG::Accessor<int> perigee_charge_trk2Acc("perigee_charge_trk2");
2071 static const SG::Accessor<float> vPosAcc("vPos");
2072 static const SG::Accessor<float> vPosMomAngTAcc("vPosMomAngT");
2073 static const SG::Accessor<float> vPosMomAng3DAcc("vPosMomAng3D");
2074 static const SG::Accessor<float> dphi_trk1Acc("dphi_trk1");
2075 static const SG::Accessor<float> dphi_trk2Acc("dphi_trk2");
2076 perigee_x_trk1Acc(*vertex) = perigee_x_trk1;
2077 perigee_y_trk1Acc(*vertex) = perigee_y_trk1;
2078 perigee_z_trk1Acc(*vertex) = perigee_z_trk1;
2079 perigee_x_trk2Acc(*vertex) = perigee_x_trk2;
2080 perigee_y_trk2Acc(*vertex) = perigee_y_trk2;
2081 perigee_z_trk2Acc(*vertex) = perigee_z_trk2;
2082 perigee_px_trk1Acc(*vertex) = perigee_px_trk1;
2083 perigee_py_trk1Acc(*vertex) = perigee_py_trk1;
2084 perigee_pz_trk1Acc(*vertex) = perigee_pz_trk1;
2085 perigee_px_trk2Acc(*vertex) = perigee_px_trk2;
2086 perigee_py_trk2Acc(*vertex) = perigee_py_trk2;
2087 perigee_pz_trk2Acc(*vertex) = perigee_pz_trk2;
2088 perigee_cov_xx_trk1Acc(*vertex) = perigee_cov_xx_trk1;
2089 perigee_cov_xy_trk1Acc(*vertex) = perigee_cov_xy_trk1;
2090 perigee_cov_xz_trk1Acc(*vertex) = perigee_cov_xz_trk1;
2091 perigee_cov_yy_trk1Acc(*vertex) = perigee_cov_yy_trk1;
2092 perigee_cov_yz_trk1Acc(*vertex) = perigee_cov_yz_trk1;
2093 perigee_cov_zz_trk1Acc(*vertex) = perigee_cov_zz_trk1;
2094 perigee_cov_xx_trk2Acc(*vertex) = perigee_cov_xx_trk2;
2095 perigee_cov_xy_trk2Acc(*vertex) = perigee_cov_xy_trk2;
2096 perigee_cov_xz_trk2Acc(*vertex) = perigee_cov_xz_trk2;
2097 perigee_cov_yy_trk2Acc(*vertex) = perigee_cov_yy_trk2;
2098 perigee_cov_yz_trk2Acc(*vertex) = perigee_cov_yz_trk2;
2099 perigee_cov_zz_trk2Acc(*vertex) = perigee_cov_zz_trk2;
2100 perigee_d0_trk1Acc(*vertex) = perigee_d0_trk1;
2101 perigee_d0_trk2Acc(*vertex) = perigee_d0_trk2;
2102 perigee_z0_trk1Acc(*vertex) = perigee_z0_trk1;
2103 perigee_z0_trk2Acc(*vertex) = perigee_z0_trk2;
2104 perigee_qOverP_trk1Acc(*vertex) = perigee_qOverP_trk1;
2105 perigee_qOverP_trk2Acc(*vertex) = perigee_qOverP_trk2;
2106 perigee_theta_trk1Acc(*vertex) = perigee_theta_trk1;
2107 perigee_theta_trk2Acc(*vertex) = perigee_theta_trk2;
2108 perigee_phi_trk1Acc(*vertex) = perigee_phi_trk1;
2109 perigee_phi_trk2Acc(*vertex) = perigee_phi_trk2;
2110 perigee_charge_trk1Acc(*vertex) = perigee_charge_trk1;
2111 perigee_charge_trk2Acc(*vertex) = perigee_charge_trk2;
2112 vPosAcc(*vertex) = vPos;
2113 vPosMomAngTAcc(*vertex) = vPosMomAngT;
2114 vPosMomAng3DAcc(*vertex) = vPosMomAng3D;
2115 dphi_trk1Acc(*vertex) = dphi_trk1;
2116 dphi_trk2Acc(*vertex) = dphi_trk2;
2117 }
2118
2119
2120
2121 for( auto trk_id : wrkvrt.selectedTrackIndices ) {
2122
2124
2125
2127
2128
2129 vertex->addTrackAtVertex( link_trk, 1. );
2130
2131 }
2132
2133 for( auto trk_id : wrkvrt.associatedTrackIndices ) {
2134
2136
2137
2139
2140
2141 vertex->addTrackAtVertex( link_trk, 1. );
2142
2143 }
2144
2145
2146 if(
m_jp.doMapToLocal ) {
2147
2148 Trk::MappedVertex mappedVtx =
m_vertexMapper->mapToLocal( wrkvrt.vertex );
2149 static const SG::Accessor<int> local_identifierHashAcc("local_identifierHash");
2150 static const SG::Accessor<int> local_layerIndexAcc("local_layerIndex");
2151 static const SG::Accessor<float> local_posXAcc("local_posX");
2152 static const SG::Accessor<float> local_posYAcc("local_posY");
2153 static const SG::Accessor<float> local_posZAcc("local_posZ");
2154 if( mappedVtx.
valid ) {
2156 local_layerIndexAcc(*vertex) = mappedVtx.
layerIndex;
2160 } else {
2166 }
2167 }
2168
2169
2170
2171
2172 if(
m_jp.doTruth ) {
2174 }
2175
2176
2177 wrkvrtLinkMap[&wrkvrt] =
vertex;
2178
2179
2180 }
2181
2182 if(
m_jp.FillNtuple ) {
2184 }
2185
2186
2187
2190
2191 } catch (const std::out_of_range& e) {
2192
2193 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": out of range error is detected: " <<
e.what() );
2194
2195 return StatusCode::SUCCESS;
2196
2197 } catch( ... ) {
2198
2199 ATH_MSG_WARNING(
" > " << __FUNCTION__ <<
": some other error is detected." );
2200
2201 return StatusCode::SUCCESS;
2202
2203 }
2204
2205 return StatusCode::SUCCESS;
2206 }
StatusCode categorizeVertexTruthTopology(xAOD::Vertex *vertex)
void removeInconsistentTracks(WrkVrt &)
Remove inconsistent tracks from vertices.
StatusCode augmentDVimpactParametersToLeptons(const std::string &containerName)
StatusCode fillAANT_SecondaryVertices(xAOD::VertexContainer *)
constexpr double mass_chargedPion
constexpr double mass_electron
Amg::Vector3D localPosition