@@ -891,7 +891,8 @@ class VarManager : public TObject
891891 // Index used to set different options for Muon propagation
892892 kToVertex = 0 , // propagtion to vertex by default
893893 kToDCA ,
894- kToRabs
894+ kToRabs ,
895+ kToMatching
895896 };
896897
897898 static TString fgVariableNames[kNVars ]; // variable names
@@ -938,6 +939,18 @@ class VarManager : public TObject
938939 fgMagField = magField;
939940 }
940941
942+ // Setup plane position for MFT-MCH matching
943+ static void SetMatchingPlane (float z)
944+ {
945+ fgzMatching = z;
946+ }
947+
948+ static float GetMatchingPlane ()
949+ {
950+ return fgzMatching;
951+ }
952+
953+
941954 // Setup the 2 prong KFParticle
942955 static void SetupTwoProngKFParticle (float magField)
943956 {
@@ -1047,8 +1060,12 @@ class VarManager : public TObject
10471060 return deltaPsi;
10481061 }
10491062
1063+ template <typename T, typename C>
1064+ static o2::track::TrackParCovFwd FwdToTrackPar (const T& track, const C& cov);
10501065 template <typename T, typename C>
10511066 static o2::dataformats::GlobalFwdTrack PropagateMuon (const T& muon, const C& collision, int endPoint = kToVertex );
1067+ template <typename T, typename C>
1068+ static o2::track::TrackParCovFwd PropagateFwd (const T& track, const C& cov, float z);
10521069 template <uint32_t fillMap, typename T, typename C>
10531070 static void FillMuonPDca (const T& muon, const C& collision, float * values = nullptr );
10541071 template <uint32_t fillMap, typename T, typename C>
@@ -1208,6 +1225,7 @@ class VarManager : public TObject
12081225 static void SetVariableDependencies (); // toggle those variables on which other used variables might depend
12091226
12101227 static float fgMagField;
1228+ static float fgzMatching;
12111229 static float fgCenterOfMassEnergy; // collision energy
12121230 static float fgMassofCollidingParticle; // mass of the colliding particle
12131231 static float fgTPCInterSectorBoundary; // TPC inter-sector border size at the TPC outer radius, in cm
@@ -1252,6 +1270,19 @@ class VarManager : public TObject
12521270 ClassDef (VarManager, 4 );
12531271};
12541272
1273+ template <typename T, typename C>
1274+ o2::track::TrackParCovFwd VarManager::FwdToTrackPar (const T& track, const C& cov)
1275+ {
1276+ double chi2 = track.chi2 ();
1277+ SMatrix5 tpars (track.x (), track.y (), track.phi (), track.tgl (), track.signed1Pt ());
1278+ std::vector<double > v1{cov.cXX (), cov.cXY (), cov.cYY (), cov.cPhiX (), cov.cPhiY (),
1279+ cov.cPhiPhi (), cov.cTglX (), cov.cTglY (), cov.cTglPhi (), cov.cTglTgl (),
1280+ cov.c1PtX (), cov.c1PtY (), cov.c1PtPhi (), cov.c1PtTgl (), cov.c1Pt21Pt2 ()};
1281+ SMatrix55 tcovs (v1.begin (), v1.end ());
1282+ o2::track::TrackParCovFwd trackparCov{track.z (), tpars, tcovs, chi2};
1283+ return trackparCov;
1284+ }
1285+
12551286template <typename T, typename U, typename V>
12561287auto VarManager::getRotatedCovMatrixXX (const T& matrix, U phi, V theta)
12571288{
@@ -1300,13 +1331,7 @@ KFPTrack VarManager::createKFPTrackFromTrack(const T& track)
13001331template <typename T>
13011332KFPTrack VarManager::createKFPFwdTrackFromFwdTrack (const T& muon)
13021333{
1303- double chi2 = muon.chi2 ();
1304- SMatrix5 tpars (muon.x (), muon.y (), muon.phi (), muon.tgl (), muon.signed1Pt ());
1305- std::vector<double > v1{muon.cXX (), muon.cXY (), muon.cYY (), muon.cPhiX (), muon.cPhiY (),
1306- muon.cPhiPhi (), muon.cTglX (), muon.cTglY (), muon.cTglPhi (), muon.cTglTgl (),
1307- muon.c1PtX (), muon.c1PtY (), muon.c1PtPhi (), muon.c1PtTgl (), muon.c1Pt21Pt2 ()};
1308- SMatrix55 tcovs (v1.begin (), v1.end ());
1309- o2::track::TrackParCovFwd trackparCov{muon.z (), tpars, tcovs, chi2};
1334+ o2::track::TrackParCovFwd trackparCov = FwdToTrackPar (muon, muon);
13101335
13111336 std::array<float , 21 > trk_cov;
13121337 trackparCov.getCovXYZPxPyPzGlo (trk_cov);
@@ -1321,7 +1346,7 @@ KFPTrack VarManager::createKFPFwdTrackFromFwdTrack(const T& muon)
13211346 kfpTrack.SetCovarianceMatrix (trkcov_KF);
13221347 kfpTrack.SetCharge (muon.sign ());
13231348 kfpTrack.SetNDF (muon.nClusters () - 5 );
1324- kfpTrack.SetChi2 (chi2);
1349+ kfpTrack.SetChi2 (muon. chi2 () );
13251350 return kfpTrack;
13261351}
13271352
@@ -1340,19 +1365,13 @@ KFPVertex VarManager::createKFPVertexFromCollision(const T& collision)
13401365template <typename T, typename C>
13411366o2::dataformats::GlobalFwdTrack VarManager::PropagateMuon (const T& muon, const C& collision, const int endPoint)
13421367{
1343- double chi2 = muon.chi2 ();
1344- SMatrix5 tpars (muon.x (), muon.y (), muon.phi (), muon.tgl (), muon.signed1Pt ());
1345- std::vector<double > v1{muon.cXX (), muon.cXY (), muon.cYY (), muon.cPhiX (), muon.cPhiY (),
1346- muon.cPhiPhi (), muon.cTglX (), muon.cTglY (), muon.cTglPhi (), muon.cTglTgl (),
1347- muon.c1PtX (), muon.c1PtY (), muon.c1PtPhi (), muon.c1PtTgl (), muon.c1Pt21Pt2 ()};
1348- SMatrix55 tcovs (v1.begin (), v1.end ());
1349- o2::track::TrackParCovFwd fwdtrack{muon.z (), tpars, tcovs, chi2};
1368+ o2::track::TrackParCovFwd fwdtrack = FwdToTrackPar (muon, muon);
13501369 o2::dataformats::GlobalFwdTrack propmuon;
13511370 if (static_cast <int >(muon.trackType ()) > 2 ) {
13521371 o2::dataformats::GlobalFwdTrack track;
1353- track.setParameters (tpars );
1372+ track.setParameters (fwdtrack. getParameters () );
13541373 track.setZ (fwdtrack.getZ ());
1355- track.setCovariances (tcovs );
1374+ track.setCovariances (fwdtrack. getCovariances () );
13561375 auto mchTrack = mMatching .FwdtoMCH (track);
13571376
13581377 if (endPoint == kToVertex ) {
@@ -1364,6 +1383,9 @@ o2::dataformats::GlobalFwdTrack VarManager::PropagateMuon(const T& muon, const C
13641383 if (endPoint == kToRabs ) {
13651384 o2::mch::TrackExtrap::extrapToZ (mchTrack, -505 .);
13661385 }
1386+ if (endPoint == kToMatching ) {
1387+ o2::mch::TrackExtrap::extrapToVertexWithoutBranson (mchTrack, fgzMatching);
1388+ }
13671389
13681390 auto proptrack = mMatching .MCHtoFwd (mchTrack);
13691391 propmuon.setParameters (proptrack.getParameters ());
@@ -1384,6 +1406,15 @@ o2::dataformats::GlobalFwdTrack VarManager::PropagateMuon(const T& muon, const C
13841406 return propmuon;
13851407}
13861408
1409+ template <typename T, typename C>
1410+ o2::track::TrackParCovFwd VarManager::PropagateFwd (const T& track, const C& cov, float z)
1411+ {
1412+ o2::track::TrackParCovFwd fwdtrack = FwdToTrackPar (track, cov);
1413+ fwdtrack.propagateToZhelix (z, fgMagField);
1414+ return fwdtrack;
1415+
1416+ }
1417+
13871418template <uint32_t fillMap, typename T, typename C>
13881419void VarManager::FillMuonPDca (const T& muon, const C& collision, float * values)
13891420{
@@ -1480,7 +1511,6 @@ void VarManager::FillGlobalMuonRefit(T1 const& muontrack, T2 const& mfttrack, co
14801511 values[kEta ] = mfttrack.eta ();
14811512 values[kPhi ] = mfttrack.phi ();
14821513 }
1483- }
14841514
14851515template <uint32_t MuonfillMap, uint32_t MFTfillMap, typename T1, typename T2, typename C, typename C2>
14861516void VarManager::FillGlobalMuonRefitCov (T1 const & muontrack, T2 const & mfttrack, const C& collision, C2 const & mftcov, float * values)
@@ -1491,12 +1521,7 @@ void VarManager::FillGlobalMuonRefitCov(T1 const& muontrack, T2 const& mfttrack,
14911521 if constexpr ((MuonfillMap & MuonCov) > 0 ) {
14921522 if constexpr ((MFTfillMap & MFTCov) > 0 ) {
14931523 o2::dataformats::GlobalFwdTrack propmuon = PropagateMuon (muontrack, collision);
1494- SMatrix5 tpars (mfttrack.x (), mfttrack.y (), mfttrack.phi (), mfttrack.tgl (), mfttrack.signed1Pt ());
1495- std::vector<double > v1{mftcov.cXX (), mftcov.cXY (), mftcov.cYY (), mftcov.cPhiX (), mftcov.cPhiY (),
1496- mftcov.cPhiPhi (), mftcov.cTglX (), mftcov.cTglY (), mftcov.cTglPhi (), mftcov.cTglTgl (),
1497- mftcov.c1PtX (), mftcov.c1PtY (), mftcov.c1PtPhi (), mftcov.c1PtTgl (), mftcov.c1Pt21Pt2 ()};
1498- SMatrix55 tcovs (v1.begin (), v1.end ());
1499- o2::track::TrackParCovFwd mft{mfttrack.z (), tpars, tcovs, mfttrack.chi2 ()};
1524+ o2::track::TrackParCovFwd mft = FwdToTrackPar (mfttrack, mftcov);
15001525
15011526 o2::dataformats::GlobalFwdTrack globalRefit = o2::aod::fwdtrackutils::refitGlobalMuonCov (propmuon, mft);
15021527 values[kX ] = globalRefit.getX ();
@@ -3685,20 +3710,8 @@ void VarManager::FillPairVertexing(C const& collision, T const& t1, T const& t2,
36853710 procCode = fgFitterTwoProngBarrel.process (pars1, pars2);
36863711 } else if constexpr ((pairType == kDecayToMuMu ) && muonHasCov) {
36873712 // Initialize track parameters for forward
3688- double chi21 = t1.chi2 ();
3689- double chi22 = t2.chi2 ();
3690- SMatrix5 t1pars (t1.x (), t1.y (), t1.phi (), t1.tgl (), t1.signed1Pt ());
3691- std::vector<double > v1{t1.cXX (), t1.cXY (), t1.cYY (), t1.cPhiX (), t1.cPhiY (),
3692- t1.cPhiPhi (), t1.cTglX (), t1.cTglY (), t1.cTglPhi (), t1.cTglTgl (),
3693- t1.c1PtX (), t1.c1PtY (), t1.c1PtPhi (), t1.c1PtTgl (), t1.c1Pt21Pt2 ()};
3694- SMatrix55 t1covs (v1.begin (), v1.end ());
3695- o2::track::TrackParCovFwd pars1{t1.z (), t1pars, t1covs, chi21};
3696- SMatrix5 t2pars (t2.x (), t2.y (), t2.phi (), t2.tgl (), t2.signed1Pt ());
3697- std::vector<double > v2{t2.cXX (), t2.cXY (), t2.cYY (), t2.cPhiX (), t2.cPhiY (),
3698- t2.cPhiPhi (), t2.cTglX (), t2.cTglY (), t2.cTglPhi (), t2.cTglTgl (),
3699- t2.c1PtX (), t2.c1PtY (), t2.c1PtPhi (), t2.c1PtTgl (), t2.c1Pt21Pt2 ()};
3700- SMatrix55 t2covs (v2.begin (), v2.end ());
3701- o2::track::TrackParCovFwd pars2{t2.z (), t2pars, t2covs, chi22};
3713+ o2::track::TrackParCovFwd pars1 = FwdToTrackPar (t1, t1);
3714+ o2::track::TrackParCovFwd pars2 = FwdToTrackPar (t2, t2);
37023715 procCode = fgFitterTwoProngFwd.process (pars1, pars2);
37033716 } else {
37043717 return ;
@@ -3960,20 +3973,8 @@ void VarManager::FillPairVertexing(C const& collision, T const& t1, T const& t2,
39603973 }
39613974 if (propToSV) {
39623975 if constexpr ((pairType == kDecayToMuMu ) && muonHasCov) {
3963- double chi21 = t1.chi2 ();
3964- double chi22 = t2.chi2 ();
3965- SMatrix5 t1pars (t1.x (), t1.y (), t1.phi (), t1.tgl (), t1.signed1Pt ());
3966- std::vector<double > c1{t1.cXX (), t1.cXY (), t1.cYY (), t1.cPhiX (), t1.cPhiY (),
3967- t1.cPhiPhi (), t1.cTglX (), t1.cTglY (), t1.cTglPhi (), t1.cTglTgl (),
3968- t1.c1PtX (), t1.c1PtY (), t1.c1PtPhi (), t1.c1PtTgl (), t1.c1Pt21Pt2 ()};
3969- SMatrix55 t1covs (c1.begin (), c1.end ());
3970- o2::track::TrackParCovFwd pars1{t1.z (), t1pars, t1covs, chi21};
3971- SMatrix5 t2pars (t2.x (), t2.y (), t2.phi (), t2.tgl (), t2.signed1Pt ());
3972- std::vector<double > c2{t2.cXX (), t2.cXY (), t2.cYY (), t2.cPhiX (), t2.cPhiY (),
3973- t2.cPhiPhi (), t2.cTglX (), t2.cTglY (), t2.cTglPhi (), t2.cTglTgl (),
3974- t2.c1PtX (), t2.c1PtY (), t2.c1PtPhi (), t2.c1PtTgl (), t2.c1Pt21Pt2 ()};
3975- SMatrix55 t2covs (c2.begin (), c2.end ());
3976- o2::track::TrackParCovFwd pars2{t2.z (), t2pars, t2covs, chi22};
3976+ o2::track::TrackParCovFwd pars1 = FwdToTrackPar (t1, t1);
3977+ o2::track::TrackParCovFwd pars2 = FwdToTrackPar (t2, t2);
39773978
39783979 auto geoMan1 = o2::base::GeometryManager::meanMaterialBudget (t1.x (), t1.y (), t1.z (), KFGeoTwoProng.GetX (), KFGeoTwoProng.GetY (), KFGeoTwoProng.GetZ ());
39793980 auto geoMan2 = o2::base::GeometryManager::meanMaterialBudget (t2.x (), t2.y (), t2.z (), KFGeoTwoProng.GetX (), KFGeoTwoProng.GetY (), KFGeoTwoProng.GetZ ());
@@ -4282,29 +4283,10 @@ void VarManager::FillDileptonTrackVertexing(C const& collision, T1 const& lepton
42824283 mlepton2 = o2::constants::physics::MassMuon;
42834284 mtrack = o2::constants::physics::MassMuon;
42844285
4285- double chi21 = lepton1.chi2 ();
4286- double chi22 = lepton2.chi2 ();
4287- double chi23 = track.chi2 ();
4288- SMatrix5 t1pars (lepton1.x (), lepton1.y (), lepton1.phi (), lepton1.tgl (), lepton1.signed1Pt ());
4289- std::vector<double > v1{lepton1.cXX (), lepton1.cXY (), lepton1.cYY (), lepton1.cPhiX (), lepton1.cPhiY (),
4290- lepton1.cPhiPhi (), lepton1.cTglX (), lepton1.cTglY (), lepton1.cTglPhi (), lepton1.cTglTgl (),
4291- lepton1.c1PtX (), lepton1.c1PtY (), lepton1.c1PtPhi (), lepton1.c1PtTgl (), lepton1.c1Pt21Pt2 ()};
4292- SMatrix55 t1covs (v1.begin (), v1.end ());
4293- o2::track::TrackParCovFwd pars1{lepton1.z (), t1pars, t1covs, chi21};
4294-
4295- SMatrix5 t2pars (lepton2.x (), lepton2.y (), lepton2.phi (), lepton2.tgl (), lepton2.signed1Pt ());
4296- std::vector<double > v2{lepton2.cXX (), lepton2.cXY (), lepton2.cYY (), lepton2.cPhiX (), lepton2.cPhiY (),
4297- lepton2.cPhiPhi (), lepton2.cTglX (), lepton2.cTglY (), lepton2.cTglPhi (), lepton2.cTglTgl (),
4298- lepton2.c1PtX (), lepton2.c1PtY (), lepton2.c1PtPhi (), lepton2.c1PtTgl (), lepton2.c1Pt21Pt2 ()};
4299- SMatrix55 t2covs (v2.begin (), v2.end ());
4300- o2::track::TrackParCovFwd pars2{lepton2.z (), t2pars, t2covs, chi22};
4301-
4302- SMatrix5 t3pars (track.x (), track.y (), track.phi (), track.tgl (), track.signed1Pt ());
4303- std::vector<double > v3{track.cXX (), track.cXY (), track.cYY (), track.cPhiX (), track.cPhiY (),
4304- track.cPhiPhi (), track.cTglX (), track.cTglY (), track.cTglPhi (), track.cTglTgl (),
4305- track.c1PtX (), track.c1PtY (), track.c1PtPhi (), track.c1PtTgl (), track.c1Pt21Pt2 ()};
4306- SMatrix55 t3covs (v3.begin (), v3.end ());
4307- o2::track::TrackParCovFwd pars3{track.z (), t3pars, t3covs, chi23};
4286+ o2::track::TrackParCovFwd pars1 = FwdToTrackPar (lepton1, lepton1);
4287+ o2::track::TrackParCovFwd pars2 = FwdToTrackPar (lepton2, lepton2);
4288+ o2::track::TrackParCovFwd pars3 = FwdToTrackPar (track, track);
4289+
43084290 procCode = VarManager::fgFitterThreeProngFwd.process (pars1, pars2, pars3);
43094291 procCodeJpsi = VarManager::fgFitterTwoProngFwd.process (pars1, pars2);
43104292 } else if constexpr ((candidateType == kBtoJpsiEEK || candidateType == kDstarToD0KPiPi ) && trackHasCov) {
0 commit comments