diff --git a/PWGUD/TableProducer/upcCandProducerGlobalMuon.cxx b/PWGUD/TableProducer/upcCandProducerGlobalMuon.cxx index 58a6654d4fe..c418fd7c9c1 100644 --- a/PWGUD/TableProducer/upcCandProducerGlobalMuon.cxx +++ b/PWGUD/TableProducer/upcCandProducerGlobalMuon.cxx @@ -90,7 +90,7 @@ struct UpcCandProducerGlobalMuon { Configurable fBcWindowMCH{"fBcWindowMCH", 20, "Time window for MCH-MID to MCH-only matching for Muon candidates"}; Configurable fMaxFV0Amp{"fMaxFV0Amp", 100.f, "Max FV0 amplitude in the same BC"}; - // NEW: MFT/Global track support configurables + // MFT/Global track support configurables Configurable fEnableMFT{"fEnableMFT", true, "Enable MFT/global track processing"}; Configurable fSaveMFTClusters{"fSaveMFTClusters", true, "Save MFT cluster information"}; @@ -369,6 +369,7 @@ struct UpcCandProducerGlobalMuon { scrollBackForth(inGbc, maxDbc, mapBcs, fillAmps); } + // Propagate MCH track to z = 0 auto propagateToZero(ForwardTracks::iterator const& muon) { using SMatrix55 = ROOT::Math::SMatrix>; @@ -392,6 +393,45 @@ struct UpcCandProducerGlobalMuon { return propmuon; } + // Propagate MCH track to target z point (set MFT z) + auto propagateMCHtoZ(ForwardTracks::iterator const& muon, double targetZ) + { + using SMatrix55 = ROOT::Math::SMatrix>; + using SMatrix5 = ROOT::Math::SVector; + SMatrix5 tpars(muon.x(), muon.y(), muon.phi(), muon.tgl(), muon.signed1Pt()); + std::vector v1{muon.cXX(), muon.cXY(), muon.cYY(), muon.cPhiX(), muon.cPhiY(), + muon.cPhiPhi(), muon.cTglX(), muon.cTglY(), muon.cTglPhi(), muon.cTglTgl(), + muon.c1PtX(), muon.c1PtY(), muon.c1PtPhi(), muon.c1PtTgl(), muon.c1Pt21Pt2()}; + SMatrix55 tcovs(v1.begin(), v1.end()); + o2::dataformats::GlobalFwdTrack propmuon; + o2::dataformats::GlobalFwdTrack track; + track.setParameters(tpars); + track.setZ(muon.z()); + track.setCovariances(tcovs); + auto mchTrack = fMatching.FwdtoMCH(track); + // Here is different point with propagateToZero + o2::mch::TrackExtrap::extrapToVertex(mchTrack, 0., 0., targetZ, 0., 0.); + auto proptrack = fMatching.MCHtoFwd(mchTrack); + o2::dataformats::GlobalFwdTrack propMuonAtZ; + propMuonAtZ.setParameters(proptrack.getParameters()); + propMuonAtZ.setZ(proptrack.getZ()); + propMuonAtZ.setCovariances(proptrack.getCovariances()); + return propMuonAtZ; + } + + // Propagate Global track to z = 0 + auto propagateGlobalFwdToZero(const o2::dataformats::GlobalFwdTrack& globalTrack) + { + auto mchTrack = fMatching.FwdtoMCH(globalTrack); + o2::mch::TrackExtrap::extrapToZCov(mchTrack, 0.); + auto proptrack = fMatching.MCHtoFwd(mchTrack); + o2::dataformats::GlobalFwdTrack propMuonAtZero; + propMuonAtZero.setParameters(proptrack.getParameters()); + propMuonAtZero.setZ(proptrack.getZ()); + propMuonAtZero.setCovariances(proptrack.getCovariances()); + return propMuonAtZero; + } + bool addToFwdTable(int64_t candId, int64_t trackId, uint64_t gbc, float trackTime, ForwardTracks const& fwdTracks, o2::aod::MFTTracks const& /*mftTracks*/, const o2::aod::McFwdTrackLabels* mcFwdTrackLabels) @@ -414,14 +454,19 @@ struct UpcCandProducerGlobalMuon { if (isGlobal && fEnableMFT) { // Refit global muon: propagate MCH component to vertex, combine with MFT spatial info auto mchTrack = track.matchMCHTrack_as(); - auto propMuon = propagateToZero(mchTrack); + // Propgate to Z of MFT -> z =0 auto mfttrack = track.matchMFTTrack_as(); + double zMFT = mfttrack.z(); + + auto propMuonAtMFT = propagateMCHtoZ(mchTrack, zMFT); using SMatrix5 = ROOT::Math::SVector; using SMatrix55 = ROOT::Math::SMatrix>; SMatrix5 tpars(mfttrack.x(), mfttrack.y(), mfttrack.phi(), mfttrack.tgl(), mfttrack.signed1Pt()); SMatrix55 tcovs{}; o2::track::TrackParCovFwd mft{mfttrack.z(), tpars, tcovs, mfttrack.chi2()}; - pft = o2::aod::fwdtrackutils::refitGlobalMuonCov(propMuon, mft); + auto refitAtMFT = o2::aod::fwdtrackutils::refitGlobalMuonCov(propMuonAtMFT, mft); + // To z = 0 + pft = propagateGlobalFwdToZero(refitAtMFT); } else { pft = propagateToZero(track); }