From 0c21ac4a93f0a0e9512375a68c63c9b925e7f517 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Wed, 22 Apr 2026 21:55:11 +0200 Subject: [PATCH 1/2] [PWGEM/Dilepton] update treeCreatorMuonML.cxx --- .../TableProducer/treeCreatorMuonML.cxx | 44 ++++++++++++------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx index 6baf82a8c35..1ea59dde6ec 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx @@ -88,6 +88,8 @@ struct TreeCreatorMuonML { Configurable cfgZShiftPath{"cfgZShiftPath", "Users/m/mcoquet/ZShift", "CCDB path for z shift to apply to forward tracks"}; Configurable cfgManualZShift{"cfgManualZShift", 0, "manual z-shift for propagation of global muon to PV"}; Configurable cfgDownSampling{"cfgDownSampling", 1.1, "down sampling for fake matches"}; + Configurable matchingZ{"matchingZ", -77.5, "z position where matching is performed"}; + Configurable maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 100.f, "max. chi2 for MCH-MFT matching"}; struct : ConfigurableGroup { std::string prefix = "eventCutGroup"; @@ -107,14 +109,18 @@ struct TreeCreatorMuonML { struct : ConfigurableGroup { std::string prefix = "glMuonCutGroup"; - Configurable minEta{"minEta", -3.6, "min. eta acceptance for MFT-MCH-MID"}; - Configurable maxEta{"maxEta", -2.5, "max. eta acceptance for MFT-MCH-MID"}; - Configurable maxMatchingChi2MCHMFT{"maxMatchingChi2MCHMFT", 100.f, "max. chi2 for MCH-MFT matching"}; - Configurable maxChi2{"maxChi2", 20.f, "max. chi2 for global muon"}; + // Configurable minEta{"minEta", -3.6, "min. eta acceptance for MFT-MCH-MID"}; + // Configurable maxEta{"maxEta", -2.5, "max. eta acceptance for MFT-MCH-MID"}; + // Configurable maxChi2{"maxChi2", 1e+10, "max. chi2 for global muon"}; Configurable refitGlobalMuon{"refitGlobalMuon", true, "flag to refit global muon"}; - Configurable matchingZ{"matchingZ", -77.5, "z position where matching is performed"}; } glMuonCutGroup; + struct : ConfigurableGroup { + std::string prefix = "MFTCutGroup"; + Configurable minEta{"minEta", -5.0f, "min. eta acceptance for MFTsa to reject crazy tracks"}; + Configurable maxEta{"maxEta", -1.5f, "max. eta acceptance for MFTsa to reject crazy tracks"}; + } MFTCutGroup; + o2::ccdb::CcdbApi ccdbApi; Service ccdb; std::mt19937 engine; @@ -284,6 +290,10 @@ struct TreeCreatorMuonML { float chi2 = fwdtrack.chi2() / (2.f * (mchtrack.nClusters() + mfttrack.nClusters()) - 5.f); float chi2mft = mfttrack.chi2() / (2.f * mfttrack.nClusters() - 5.f); + if (mfttrack.eta() < MFTCutGroup.minEta || MFTCutGroup.maxEta < mfttrack.eta()) { + return false; + } + // auto mcParticle_MFTMCHMID = fwdtrack.template mcParticle_as(); // this is identical to mcParticle_MCHMID auto mcParticle_MCHMID = mchtrack.template mcParticle_as(); // this is identical to mcParticle_MFTMCHMID auto mcParticle_MFT = mfttrack.template mcParticle_as(); @@ -299,33 +309,33 @@ struct TreeCreatorMuonML { if (fwdtrack.chi2MatchMCHMID() < 0.f) { // this should never happen. only for protection. return false; } - if (fwdtrack.chi2MatchMCHMFT() < 0.f || glMuonCutGroup.maxMatchingChi2MCHMFT < fwdtrack.chi2MatchMCHMFT()) { // this should never happen. only for protection. - return false; - } - if (fwdtrack.chi2() < 0.f || glMuonCutGroup.maxChi2 < chi2) { // this should never happen. only for protection. + if (fwdtrack.chi2MatchMCHMFT() < 0.f || maxMatchingChi2MCHMFT < fwdtrack.chi2MatchMCHMFT()) { return false; } + // if (fwdtrack.chi2() < 0.f || glMuonCutGroup.maxChi2 < chi2) { + // return false; + // } if (mfttrack.chi2() < 0.f) { // this should never happen. only for protection. return false; } - o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, fwdtrack, collision, propagationPoint::kToVertex, glMuonCutGroup.matchingZ, mBz, mZShift); + o2::dataformats::GlobalFwdTrack propmuonAtPV = propagateMuon(fwdtrack, fwdtrack, collision, propagationPoint::kToVertex, matchingZ, mBz, mZShift); float pt = propmuonAtPV.getPt(); float eta = propmuonAtPV.getEta(); float phi = propmuonAtPV.getPhi(); // o2::math_utils::bringTo02Pi(phi); phi = RecoDecay::constrainAngle(phi, 0, 1U); - if (eta < glMuonCutGroup.minEta || glMuonCutGroup.maxEta < eta) { - return false; - } + // if (eta < glMuonCutGroup.minEta || glMuonCutGroup.maxEta < eta) { + // return false; + // } float dcaX = propmuonAtPV.getX() - collision.posX(); float dcaY = propmuonAtPV.getY() - collision.posY(); // float dcaZ = propmuonAtPV.getZ() - collision.posZ(); float dcaXY = std::sqrt(dcaX * dcaX + dcaY * dcaY); - o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToVertex, glMuonCutGroup.matchingZ, mBz, mZShift); + o2::dataformats::GlobalFwdTrack propmuonAtPV_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToVertex, matchingZ, mBz, mZShift); // float ptMatchedMCHMID = propmuonAtPV_Matched.getPt(); float etaMatchedMCHMID = propmuonAtPV_Matched.getEta(); float phiMatchedMCHMID = propmuonAtPV_Matched.getPhi(); @@ -335,7 +345,7 @@ struct TreeCreatorMuonML { pt = propmuonAtPV_Matched.getP() * std::sin(2.f * std::atan(std::exp(-eta))); } - o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToDCA, glMuonCutGroup.matchingZ, mBz, mZShift); + o2::dataformats::GlobalFwdTrack propmuonAtDCA_Matched = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToDCA, matchingZ, mBz, mZShift); float dcaX_Matched = propmuonAtDCA_Matched.getX() - collision.posX(); float dcaY_Matched = propmuonAtDCA_Matched.getY() - collision.posY(); float dcaXY_Matched = std::sqrt(dcaX_Matched * dcaX_Matched + dcaY_Matched * dcaY_Matched); @@ -356,7 +366,7 @@ struct TreeCreatorMuonML { if constexpr (withMFTCov) { auto mfttrackcov = mftCovs.rawIteratorAt(map_mfttrackcovs[mfttrack.globalIndex()]); o2::track::TrackParCovFwd mftsaAtMP = getTrackParCovFwdShift(mfttrack, mZShift, mfttrackcov); // values at innermost update - mftsaAtMP.propagateToZhelix(glMuonCutGroup.matchingZ, mBz); // propagated to matching plane + mftsaAtMP.propagateToZhelix(matchingZ, mBz); // propagated to matching plane xMFTatMP = mftsaAtMP.getX(); yMFTatMP = mftsaAtMP.getY(); xErrMFTatMP = std::sqrt(mftsaAtMP.getSigma2X()); @@ -369,7 +379,7 @@ struct TreeCreatorMuonML { tglErrMFTatMP = std::sqrt(mftsaAtMP.getSigma2Tanl()); phiErrMFTatMP = std::sqrt(mftsaAtMP.getSigma2Phi()); - auto muonAtMP = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToMatchingPlane, glMuonCutGroup.matchingZ, mBz, mZShift); // propagated to matching plane + auto muonAtMP = propagateMuon(mchtrack, mchtrack, collision, propagationPoint::kToMatchingPlane, matchingZ, mBz, mZShift); // propagated to matching plane xMCHMIDatMP = muonAtMP.getX(); yMCHMIDatMP = muonAtMP.getY(); xErrMCHMIDatMP = std::sqrt(muonAtMP.getSigma2X()); From 24a81c733c97ac031f8184271c141f6dee6f6946 Mon Sep 17 00:00:00 2001 From: Daiki Sekihata Date: Wed, 22 Apr 2026 22:14:31 +0200 Subject: [PATCH 2/2] Update MFTCutGroup parameters for track rejection --- PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx b/PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx index 1ea59dde6ec..df7c48875de 100644 --- a/PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx +++ b/PWGEM/Dilepton/TableProducer/treeCreatorMuonML.cxx @@ -117,8 +117,9 @@ struct TreeCreatorMuonML { struct : ConfigurableGroup { std::string prefix = "MFTCutGroup"; - Configurable minEta{"minEta", -5.0f, "min. eta acceptance for MFTsa to reject crazy tracks"}; - Configurable maxEta{"maxEta", -1.5f, "max. eta acceptance for MFTsa to reject crazy tracks"}; + Configurable minPt{"minPt", 0.04f, "min. pT for MFTsa to reject crazy tracks"}; + Configurable minEta{"minEta", -4.1f, "min. eta acceptance for MFTsa to reject crazy tracks"}; + Configurable maxEta{"maxEta", -2.0f, "max. eta acceptance for MFTsa to reject crazy tracks"}; } MFTCutGroup; o2::ccdb::CcdbApi ccdbApi; @@ -290,7 +291,7 @@ struct TreeCreatorMuonML { float chi2 = fwdtrack.chi2() / (2.f * (mchtrack.nClusters() + mfttrack.nClusters()) - 5.f); float chi2mft = mfttrack.chi2() / (2.f * mfttrack.nClusters() - 5.f); - if (mfttrack.eta() < MFTCutGroup.minEta || MFTCutGroup.maxEta < mfttrack.eta()) { + if (mfttrack.eta() < MFTCutGroup.minEta || MFTCutGroup.maxEta < mfttrack.eta() || mfttrack.pt() < MFTCutGroup.minPt) { return false; }