@@ -90,7 +90,7 @@ struct UpcCandProducerGlobalMuon {
9090 Configurable<int > fBcWindowMCH {" fBcWindowMCH" , 20 , " Time window for MCH-MID to MCH-only matching for Muon candidates" };
9191 Configurable<float > fMaxFV0Amp {" fMaxFV0Amp" , 100 .f , " Max FV0 amplitude in the same BC" };
9292
93- // NEW: MFT/Global track support configurables
93+ // MFT/Global track support configurables
9494 Configurable<bool > fEnableMFT {" fEnableMFT" , true , " Enable MFT/global track processing" };
9595 Configurable<bool > fSaveMFTClusters {" fSaveMFTClusters" , true , " Save MFT cluster information" };
9696
@@ -369,6 +369,7 @@ struct UpcCandProducerGlobalMuon {
369369 scrollBackForth (inGbc, maxDbc, mapBcs, fillAmps);
370370 }
371371
372+ // Propagate MCH track to z = 0
372373 auto propagateToZero (ForwardTracks::iterator const & muon)
373374 {
374375 using SMatrix55 = ROOT ::Math::SMatrix<double , 5 , 5 , ROOT ::Math::MatRepSym<double , 5 >>;
@@ -392,6 +393,45 @@ struct UpcCandProducerGlobalMuon {
392393 return propmuon;
393394 }
394395
396+ // Propagate MCH track to target z point (set MFT z)
397+ auto propagateMCHtoZ (ForwardTracks::iterator const & muon, double targetZ)
398+ {
399+ using SMatrix55 = ROOT ::Math::SMatrix<double , 5 , 5 , ROOT ::Math::MatRepSym<double , 5 >>;
400+ using SMatrix5 = ROOT ::Math::SVector<double , 5 >;
401+ SMatrix5 tpars (muon.x (), muon.y (), muon.phi (), muon.tgl (), muon.signed1Pt ());
402+ std::vector<double > v1{muon.cXX (), muon.cXY (), muon.cYY (), muon.cPhiX (), muon.cPhiY (),
403+ muon.cPhiPhi (), muon.cTglX (), muon.cTglY (), muon.cTglPhi (), muon.cTglTgl (),
404+ muon.c1PtX (), muon.c1PtY (), muon.c1PtPhi (), muon.c1PtTgl (), muon.c1Pt21Pt2 ()};
405+ SMatrix55 tcovs (v1.begin (), v1.end ());
406+ o2::dataformats::GlobalFwdTrack propmuon;
407+ o2::dataformats::GlobalFwdTrack track;
408+ track.setParameters (tpars);
409+ track.setZ (muon.z ());
410+ track.setCovariances (tcovs);
411+ auto mchTrack = fMatching .FwdtoMCH (track);
412+ // Here is different point with propagateToZero
413+ o2::mch::TrackExtrap::extrapToVertex (mchTrack, 0 ., 0 ., targetZ, 0 ., 0 .);
414+ auto proptrack = fMatching .MCHtoFwd (mchTrack);
415+ o2::dataformats::GlobalFwdTrack propMuonAtZ;
416+ propMuonAtZ.setParameters (proptrack.getParameters ());
417+ propMuonAtZ.setZ (proptrack.getZ ());
418+ propMuonAtZ.setCovariances (proptrack.getCovariances ());
419+ return propMuonAtZ;
420+ }
421+
422+ // Propagate Global track to z = 0
423+ auto propagateGlobalFwdToZero (const o2::dataformats::GlobalFwdTrack& globalTrack)
424+ {
425+ auto mchTrack = fMatching .FwdtoMCH (globalTrack);
426+ o2::mch::TrackExtrap::extrapToZCov (mchTrack, 0 .);
427+ auto proptrack = fMatching .MCHtoFwd (mchTrack);
428+ o2::dataformats::GlobalFwdTrack propMuonAtZero;
429+ propMuonAtZero.setParameters (proptrack.getParameters ());
430+ propMuonAtZero.setZ (proptrack.getZ ());
431+ propMuonAtZero.setCovariances (proptrack.getCovariances ());
432+ return propMuonAtZero;
433+ }
434+
395435 bool addToFwdTable (int64_t candId, int64_t trackId, uint64_t gbc, float trackTime,
396436 ForwardTracks const & fwdTracks, o2::aod::MFTTracks const & /* mftTracks*/ ,
397437 const o2::aod::McFwdTrackLabels* mcFwdTrackLabels)
@@ -414,14 +454,19 @@ struct UpcCandProducerGlobalMuon {
414454 if (isGlobal && fEnableMFT ) {
415455 // Refit global muon: propagate MCH component to vertex, combine with MFT spatial info
416456 auto mchTrack = track.matchMCHTrack_as <ForwardTracks>();
417- auto propMuon = propagateToZero (mchTrack);
457+ // Propgate to Z of MFT -> z =0
418458 auto mfttrack = track.matchMFTTrack_as <o2::aod::MFTTracks>();
459+ double zMFT = mfttrack.z ();
460+
461+ auto propMuonAtMFT = propagateMCHtoZ (mchTrack, zMFT);
419462 using SMatrix5 = ROOT ::Math::SVector<double , 5 >;
420463 using SMatrix55 = ROOT ::Math::SMatrix<double , 5 , 5 , ROOT ::Math::MatRepSym<double , 5 >>;
421464 SMatrix5 tpars (mfttrack.x (), mfttrack.y (), mfttrack.phi (), mfttrack.tgl (), mfttrack.signed1Pt ());
422465 SMatrix55 tcovs{};
423466 o2::track::TrackParCovFwd mft{mfttrack.z (), tpars, tcovs, mfttrack.chi2 ()};
424- pft = o2::aod::fwdtrackutils::refitGlobalMuonCov (propMuon, mft);
467+ auto refitAtMFT = o2::aod::fwdtrackutils::refitGlobalMuonCov (propMuonAtMFT, mft);
468+ // To z = 0
469+ pft = propagateGlobalFwdToZero (refitAtMFT);
425470 } else {
426471 pft = propagateToZero (track);
427472 }
0 commit comments