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