164 #include "TVector3.h"
166 #include "boost/format.hpp"
177 const std::string& Bname,
178 const std::string& Prefix) :
179 name(std::move(
Name)), bname(std::move(Bname)),
prefix(std::move(Prefix)) {
186 const std::string& Bname,
187 const std::string& Prefix) {
189 bname = std::move(Bname);
190 prefix = std::move(Prefix);
194 prefix = std::move(Prefix);
202 const std::string&
suffix)
const {
205 % (bname.length() > 0 ? bname+
"_" :
"")
206 % (qualifier.length() > 0 ? qualifier+
"_" :
"")
223 :
name(std::move(
Name)), m_parent(Parent) {
230 const std::string &
prefix,
231 const std::string &
suffix,
236 % m_parent.m_useTrackTypes[rtype]
239 addToCounter(
f.str(), atype, counts);
246 NameCountMap_t::const_iterator
it = m_cnts.find(
name);
248 if (
it != m_cnts.end() ) {
249 m_cnts[
name].first += counts;
251 m_cnts[
name] = std::make_pair(counts, atype);
260 std::string
str =
f.str();
263 for (NameCountMap_t::const_iterator
it = m_cnts.begin();
264 it != m_cnts.end(); ++
it) {
265 lmax =
std::max(lmax, (
int)(
it->first).length());
268 for (NameCountMap_t::const_iterator
it = m_cnts.begin();
269 it != m_cnts.end(); ++
it) {
274 % std::bitset<33>((
it->second).second).
to_string();
275 str +=
f.str() +
"\n";
278 str.erase(
str.length()-1);
287 {
"ASSOCPV",
"PVTYPE0",
"PVTYPE1",
"PVTYPE2",
"PVTYPE3",
"NONE",
"NULLVP",
288 "CAPVRFN3U0",
"CAPVNRN3U0",
"CAPVRF3DU0",
"CAPVNR3DU0",
289 "CAPVRFN3U1",
"CAPVNRN3U1",
"CAPVRF3DU1",
"CAPVNR3DU1",
290 "CAPVRFN3U2",
"CAPVNRN3U2",
"CAPVRF3DU2",
"CAPVNR3DU2",
291 "CAPVRFNNU3",
"CAPVNRNNU3",
"CAPVRFNNU4",
"CAPVNRNNU4",
292 "CAPVRFNNU5",
"CAPVNRNNU5",
"CAPVRFNNU6",
"CAPVNRNNU6",
293 "CAPVRFNNU7",
"CAPVNRNNU7",
"CAPVRFNNU8",
"CAPVNRNNU8",
294 "CAPVRFNNU9",
"CAPVNRNNU9"};
296 {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40,
297 0x80, 0x100, 0x200, 0x400,
298 0x800, 0x1000, 0x2000, 0x4000,
299 0x8000, 0x10000, 0x20000, 0x40000,
300 0x80000, 0x100000, 0x200000, 0x400000,
301 0x800000, 0x1000000, 0x2000000, 0x4000000,
302 0x8000000, 0x10000000, 0x20000000, 0x40000000,
303 0x80000000, 0x100000000};
333 for (
size_t i=0;
i<vtypes.size(); ++
i) {
343 if (
track !=
nullptr) {
345 "d:(%10.5f,%10.5f,%10.5f,%10.5f,%10.6f)");
358 const std::string&
prefix) {
364 if ( !ostr.empty() ) ostr +=
"\n";
372 const std::string&
n,
375 m_tvaTool(
"CP::TrackVertexAssociationTool"),
381 declareInterface<DerivationFramework::IAugmentationTool>(
this);
408 ATH_MSG_DEBUG(
"BPhysVertexTrackBase::initialize() -- begin");
425 <<
") and RefPVContainerNames ("
432 <<
") and BranchPrefixes ("
448 const std::string tvaWp =
460 m_mttc = std::make_unique<TrackTypeCounter>(*
this,
name());
483 ATH_MSG_DEBUG(
"BPhysVertexTrackBase::addBranches() -- begin");
547 svtxContainer->
begin(); vtxItr!=svtxContainer->
end();
566 return StatusCode::SUCCESS;
573 return StatusCode::SUCCESS;
580 return StatusCode::SUCCESS;
589 ATH_MSG_DEBUG(
"addBranchesVCSetupHook: Vertex container index " << ivc
593 return StatusCode::SUCCESS;
604 return StatusCode::SUCCESS;
612 const unsigned int ipv,
613 const unsigned int its,
614 const unsigned int itt)
const {
617 ATH_MSG_DEBUG(
"calcIsolationOpti: vtx: " << vtx <<
", ipv: " << ipv
618 <<
", its: " << its <<
", itt: " << itt);
620 return StatusCode::SUCCESS;
627 const int ipv)
const {
630 ATH_MSG_DEBUG(
"fastIsoFill: vtx: " << vtx <<
", ipv: " << ipv);
644 ATH_MSG_DEBUG(
"BPhysVertexTrackBase::calculateValues -- begin");
653 for (
unsigned int ipv = 0; ipv < nPvAssocs; ++ipv) {
655 for (
unsigned int its = 0; its < nTrackSels; ++its) {
656 for (
unsigned int itt = 0; itt < nTrackTypes; ++itt) {
658 <<
", its: " << its <<
", itt: " << itt);
666 <<
" -- cached ipv: " << ipv);
670 return StatusCode::SUCCESS;
677 const int ipv)
const {
730 int chi2DefToUse)
const {
732 std::vector<double>
res = {-999., -99., -999., -99., -100., -100., -1.,
736 const AmgSymMatrix(3) poscov = vtx->covariancePosition();
737 auto ctx = Gaudi::Hive::currentContext();
738 if (
track != NULL ) {
739 if ( chi2DefToUse < 2 || (chi2DefToUse > 5 && chi2DefToUse < 8) ) {
741 std::unique_ptr<const Trk::Perigee>
743 if ( trkPerigee != NULL ) {
746 const AmgSymMatrix(5)* locError = trkPerigee->covariance();
747 if ( locError != NULL ) {
751 if ( chi2DefToUse == 1 ) {
753 Amg::Vector3D perppt(trkPerigee->momentum().y()/trkPerigee->pT(),
754 -trkPerigee->momentum().x()/trkPerigee->pT(),
756 double vtxD0Err2 = perppt.transpose()*poscov*perppt;
757 res[1] = sqrt(
pow(
res[1], 2.) + vtxD0Err2 );
758 res[3] = sqrt(
pow(
res[3], 2.) + poscov(2,2) );
760 if ( chi2DefToUse < 2 ) {
761 if ( fabs(
res[1]) > 0. && fabs(
res[3]) > 0. ) {
767 <<
" d0 = " <<
res[0] <<
", d0Err = "
768 <<
res[1] <<
", z0 = " <<
res[2]
769 <<
", z0Err = " <<
res[3]);
773 if ( chi2DefToUse > 5 && chi2DefToUse < 8 ) {
778 if ( chi2DefToUse == 6 ) {
785 AmgSymMatrix(3) mCovTrk3D = dmat.transpose()*(*locError)*dmat;
790 res[4] =
log( dvec.transpose() * (poscov+mCovTrk3D).inverse()
792 res[7] = duvec.transpose()*poscov*duvec;
793 res[8] = duvec.transpose()*mCovTrk3D*duvec;
796 if ( chi2DefToUse == 7 ) {
804 AmgSymMatrix(2) mCovVtx2D = dmat.transpose()*poscov*dmat;
813 res[4] =
log( dvec.transpose()*(mCovVtx2D+mCovTrk2D).inverse()
815 res[7] = duvec.transpose()*mCovVtx2D*duvec;
816 res[8] = duvec.transpose()*mCovTrk2D*duvec;
829 " locError pointer is NULL!");
833 " trkPerigee pointer is NULL!");
836 }
else if ( chi2DefToUse == 2
837 || (chi2DefToUse > 7 && chi2DefToUse < 10 )) {
842 TVector3 SV_def(vtx->
x(), vtx->
y(), vtx->
z());
846 double px = (
track->p4() ).Px();
850 double d0Err2 =
track->definingParametersCovMatrixVec()[0];
852 double z0Err2 =
track->definingParametersCovMatrixVec()[2];
854 double d0z0Cov =
track->definingParametersCovMatrixVec()[1];
858 TVector3 SV = SV_def - trk_origin;
863 double d0toSV =
d0 + (SV[0]*upx + SV[1]*upy);
864 double d0toSVErr2 = upx*SV_cov(0, 0)*upx + 2*upx*SV_cov(1, 0)*upy
865 + upy*SV_cov(1, 1)*upy + d0Err2;
870 double z0corr = (SV[0]*upx + SV[1]*upy)*cot_theta;
871 double z0toSV =
z0 + z0corr - SV[2];
872 double z0toSVErr2 = SV_cov(2, 2) + z0Err2;
874 double docaSV = sqrt(
pow(d0toSV, 2) +
pow(z0toSV, 2) );
876 double chi2testSV(999.);
877 if ( chi2DefToUse == 2 ) {
878 if (d0toSVErr2 !=0 && z0toSVErr2 != 0)
879 chi2testSV =
log(
pow( d0toSV, 2)/d0toSVErr2
880 +
pow( z0toSV, 2)/z0toSVErr2);
882 res = {d0toSV, sqrt(d0toSVErr2), z0toSV, sqrt(z0toSVErr2),
883 chi2testSV, (doDCAin3D ? docaSV : d0toSV), 4,
886 if ( chi2DefToUse > 7 && chi2DefToUse < 10 ) {
888 if ( chi2DefToUse == 8 ) {
893 dmat(2,0) = -d0toSV*
cos(
phi);
894 dmat(2,1) = -d0toSV*
sin(
phi);
896 track->definingParametersCovMatrix();
897 AmgSymMatrix(3) mCovTrk3D = dmat.transpose()*mCovTrk5D*dmat;
902 double chi2testSV =
log( dvec.transpose()
903 * (poscov+mCovTrk3D).inverse()
905 double vtx3DErr2 = duvec.transpose()*poscov*duvec;
906 double trk3DErr2 = duvec.transpose()*mCovTrk3D*duvec;
908 res = {d0toSV, sqrt(d0Err2), z0toSV, sqrt(z0Err2),
909 chi2testSV, (doDCAin3D ? docaSV : d0toSV), 5,
910 vtx3DErr2, trk3DErr2,
phi};
912 if ( chi2DefToUse == 9 ) {
920 AmgSymMatrix(2) mCovVtx2D = dmat.transpose()*SV_cov*dmat;
922 mCovTrk2D(0,0) = d0Err2;
923 mCovTrk2D(0,1) = d0z0Cov;
924 mCovTrk2D(1,0) = d0z0Cov;
925 mCovTrk2D(1,1) = z0Err2;
929 chi2testSV =
log( dvec.transpose()*(mCovVtx2D+mCovTrk2D).inverse()
931 double vtx2DErr2 = duvec.transpose()*mCovVtx2D*duvec;
932 double trk2DErr2 = duvec.transpose()*mCovTrk2D*duvec;
934 if ( vtx2DErr2 < 0. || trk2DErr2 < 0. ) {
936 "getTrackLogChi2DCA(): "
937 <<
"vtx2DErr2 = " << vtx2DErr2
938 <<
" trk2DErr2 = " << trk2DErr2
939 <<
" chi2testSV = " << chi2testSV);
949 <<
" z0toSV = " << z0toSV
951 <<
" docaSV = " << docaSV);
955 res = {d0toSV, sqrt(d0Err2), z0toSV, sqrt(z0Err2),
956 chi2testSV, (doDCAin3D ? docaSV : d0toSV), 6,
957 vtx2DErr2, trk2DErr2,
phi};
961 <<
" docaSV == 0 !");
965 }
else if ( chi2DefToUse > 2 && chi2DefToUse < 5 ) {
971 if (chi2DefToUse == 4) {
984 double z0toPV =
track->z0() +
track->vz() - vtx->
z();
985 double z0Err2 =
track->definingParametersCovMatrixVec()[2];
986 if (chi2DefToUse == 4) z0Err2+= vtx->covariancePosition()(2,2);
987 double z0sign = z0toPV / sqrt( z0Err2 );
990 res = {-999., -99., z0toPV, sqrt(z0Err2),
chi2, -100., 4, -99., -99.,
996 " track pointer is NULL!");
1012 ATH_MSG_ERROR(
"BPhysVertexTrackBase::detTrackTypes must be adjusted due to changes in TrackParticle");
1015 if ( candPV != NULL ) {
1028 bool useRefittedPvs = (
i%2 == 1 );
1029 bool doDCAin3D = ( (
i-7)%4 > 1 );
1030 int chi2DefToUse = (
i-7)/4;
1034 chi2DefToUse = (
i-13)/2;
1037 if ( chi2DefToUse == 5 ) {
1045 doDCAin3D, chi2DefToUse).first;
1047 if ( candPV == minChi2PV
1048 || (candRefPV !=
nullptr && candRefPV == minChi2PV) ) {
1080 for (
unsigned int i=0;
i < vtx.
vtx()->nTrackParticles(); ++
i) {
1082 if (
std::find(tracks.begin(),tracks.end(),
track) == tracks.end() ) {
1083 tracks.push_back(
track);
1117 if (
std::find(muons.begin(),muons.end(),vtx.
muon(
i)) == muons.end() ) {
1118 muons.push_back(vtx.
muon(
i));
1142 for (MuonBag::const_iterator muItr = muons.begin(); muItr != muons.end();
1145 (*muItr)->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
1146 tracks.push_back(
track);
1156 std::vector<TVector3>
1160 std::vector<TVector3> refMuTracks;
1164 muons = vtx.
muons();
1165 for (
auto refMuTrack : vtx.
refTrks() ) {
1166 refMuTracks.push_back(refMuTrack);
1174 if ( otp != NULL ) {
1175 if (
std::find(muonIdTracks.begin(), muonIdTracks.end(), otp)
1176 != muonIdTracks.end() ) {
1177 refMuTracks.push_back(vtx.
refTrk(
i));
1181 " refTrkOrigin == NULL for refTrk # "
1187 " size mismatch #refTrks = " << vtx.
nRefTrks()
1195 std::vector<TVector3> precRefMuTracks =
1198 for (
auto precRefMuTrack : precRefMuTracks ) {
1199 if (
std::find(refMuTracks.begin(), refMuTracks.end(),
1200 precRefMuTrack) == refMuTracks.end() ) {
1201 refMuTracks.push_back(precRefMuTrack);
1210 ATH_MSG_DEBUG(
"BPhysVertexTrackBase::findMuonRefTrackMomenta():"
1211 <<
" #muons: " << muons.size()
1212 <<
" #refMuTrks: " << refMuTracks.size());
1213 TString
str = Form(
">> refMuTracks(%d):\n", (
int)refMuTracks.size());
1214 for (
unsigned int i=0;
i < refMuTracks.size(); ++
i) {
1215 str += Form(
"(%10.4f,%10.4f,%10.4f) ",
1216 refMuTracks[
i].
x(), refMuTracks[
i].
y(),
1217 refMuTracks[
i].
z());
1234 const unsigned int ipv,
1235 const unsigned int its,
1236 const unsigned int itt)
const {
1251 const unsigned int ipv,
1252 const unsigned int its,
1253 const unsigned int itt)
const {
1259 <<
" " << exclTracks
1260 <<
" for decay candidate " << cand.
vtx()
1261 <<
"; candPV: " << candPV <<
" candRefPV: " << candRefPV);
1268 inpTracks->
begin(); trkItr != inpTracks->
end(); ++trkItr) {
1274 m_mttc->addToCounter(trackTypesForTrack, itt, bname,
"all");
1280 m_mttc->addToCounter(trackTypesForTrack, itt, bname,
"ats");
1288 if ( trackTypesForTrack == 0x0 ) {
1297 m_mttc->addToCounter(trackTypesForTrack, itt, bname,
"att");
1301 != exclTracks.end() )
continue;
1304 m_mttc->addToCounter(trackTypesForTrack, itt, bname,
"fin");
1307 tracks.push_back(
track);
1319 const std::string& preSuffix)
1322 ATH_MSG_DEBUG(
"BPhysVertexTrackBase::buildBranchBaseName -- begin");
1328 std::size_t ipos = tsName.find_last_of(
"_");
1329 if ( ipos != std::string::npos ) tsName = tsName.substr(ipos+1);
1334 f % (preSuffix.length() > 0 ?
"_"+preSuffix :
"");
1337 ATH_MSG_DEBUG(
"BPhysVertexBaseTrackBase::buildBranchBaseName: " <<
f.str());
1364 std::pair<const xAOD::Vertex*, double>
1368 const std::vector<uint64_t>& pvtypes,
1369 const int minNTracksInPV,
1370 const bool useRefittedPvs,
1371 const bool doDCAin3D,
1372 const int chi2DefToUse)
const {
1378 if ( pvtx !=
nullptr ) {
1379 if (
std::find(pvtypes.begin(),pvtypes.end(),pvtx->vertexType())
1380 != pvtypes.end() ) {
1383 if ( useRefittedPvs && pvtx == candPV ) {
1384 if ( candRefPV !=
nullptr ) {
1388 <<
" candRefPV == NULL!");
1395 if (
chi2 < minChi2 ) {
1404 return std::make_pair(minChi2PV, minChi2);
1420 const std::vector<uint64_t>& pvtypes,
1421 const int minNTracksInPV,
1422 const bool useRefittedPvs)
const {
1425 std::vector<const xAOD::Vertex*> vpvtx;
1427 if ( pvtx !=
nullptr ) {
1428 if (
std::find(pvtypes.begin(),pvtypes.end(),pvtx->vertexType())
1429 != pvtypes.end() ) {
1432 if ( useRefittedPvs && pvtx == candPV ) {
1433 if ( candRefPV !=
nullptr ) {
1437 <<
" candRefPV == NULL!");
1442 vpvtx.push_back(cvtx);
1457 assocPV = candRefPV;
1462 if ( assocPV ==
nullptr ) {
1468 if ( assocPV ==
nullptr ) {
1470 <<
" assocPV == NULL for track!"
1471 <<
" len(vpvtx) = " << vpvtx.size()
1472 <<
" useRefittedPvs = " << useRefittedPvs
1473 <<
" minNTracksInPV = " << minNTracksInPV);