From d4fec2489880d6d38d380fef40773cbc501c368a Mon Sep 17 00:00:00 2001 From: Gyula Bencedi Date: Thu, 7 Aug 2025 00:36:56 +0200 Subject: [PATCH 1/2] Added QA histos for track selection --- PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx | 91 ++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 30 deletions(-) diff --git a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx index f8e01e36a7e..abd2119941d 100644 --- a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx +++ b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx @@ -66,6 +66,17 @@ AxisSpec phiAxis = {629, 0, TwoPI, "Rad", "#phi"}; AxisSpec etaAxis = {20, -4., -2.}; AxisSpec centAxis{100, 0, 100, "centrality"}; AxisSpec chiSqAxis = {100, 0., 1000.}; +AxisSpec nclsAxis{10, 0.5, 10.5, "# clusters"}; + +enum TrkSel { + trkSelNCls, + trkSelChi2Ncl, + trkSelEta, + trkSelPhiCut, + trkSelPt, + trkSelCA, + nTrkSel +}; struct DndetaMFTPbPb { SliceCache cache; @@ -101,6 +112,7 @@ struct DndetaMFTPbPb { "minimum number of MFT clusters"}; Configurable useChi2Cut{"useChi2Cut", false, "use track chi2 cut"}; Configurable maxChi2NCl{"maxChi2NCl", 1000.f, "maximum chi2 per MFT clusters"}; + Configurable usePtCut{"usePtCut", false, "use track pT cut"}; Configurable minPt{"minPt", 0., "minimum pT of the MFT tracks"}; Configurable requireCA{ "requireCA", false, "Use Cellular Automaton track-finding algorithm"}; @@ -108,7 +120,8 @@ struct DndetaMFTPbPb { } trackCuts; struct : ConfigurableGroup { - Configurable maxZvtx{"maxZvtx", 10.0f, "Cut on z-vtx"}; + Configurable maxZvtx{"maxZvtx", 10.0f, "maximum cut on z-vtx (cm)"}; + Configurable minZvtx{"minZvtx", -10.0f, "minimum cut on z-vtx (cm)"}; Configurable useZDiffCut{"useZDiffCut", false, "use Zvtx reco-mc diff. cut"}; Configurable maxZvtxDiff{ @@ -116,12 +129,12 @@ struct DndetaMFTPbPb { "max allowed Z vtx difference for reconstruced collisions (cm)"}; Configurable requireIsGoodZvtxFT0VsPV{"requireIsGoodZvtxFT0VsPV", true, "require events with PV position along z consistent (within 1 cm) between PV reconstructed using tracks and PV using FT0 A-C time difference"}; Configurable requireRejectSameBunchPileup{"requireRejectSameBunchPileup", true, "reject collisions in case of pileup with another collision in the same foundBC"}; - Configurable requireNoCollInTimeRangeStrict{"requireNoCollInTimeRangeStrict", true, " requireNoCollInTimeRangeStrict"}; - Configurable requireNoCollInRofStrict{"requireNoCollInRofStrict", true, "requireNoCollInRofStrict"}; + Configurable requireNoCollInTimeRangeStrict{"requireNoCollInTimeRangeStrict", false, " requireNoCollInTimeRangeStrict"}; + Configurable requireNoCollInRofStrict{"requireNoCollInRofStrict", false, "requireNoCollInRofStrict"}; Configurable requireNoCollInRofStandard{"requireNoCollInRofStandard", false, "requireNoCollInRofStandard"}; - Configurable requireNoHighMultCollInPrevRof{"requireNoHighMultCollInPrevRof", true, "requireNoHighMultCollInPrevRof"}; + Configurable requireNoHighMultCollInPrevRof{"requireNoHighMultCollInPrevRof", false, "requireNoHighMultCollInPrevRof"}; Configurable requireNoCollInTimeRangeStd{ - "requireNoCollInTimeRangeStd", false, + "requireNoCollInTimeRangeStd", true, "reject collisions corrupted by the cannibalism, with other collisions " "within +/- 10 microseconds"}; Configurable requireNoCollInTimeRangeNarrow{ @@ -234,7 +247,7 @@ struct DndetaMFTPbPb { "be enabled!"); } - auto hev = registry.add("hEvtSel", "hEvtSel", HistType::kTH1F, + auto hev = registry.add("Events/hEvtSel", "hEvtSel", HistType::kTH1F, {{14, -0.5f, +13.5f}}); hev->GetXaxis()->SetBinLabel(1, "All collisions"); hev->GetXaxis()->SetBinLabel(2, "Ev. sel."); @@ -250,6 +263,14 @@ struct DndetaMFTPbPb { hev->GetXaxis()->SetBinLabel(12, "Below min occup."); hev->GetXaxis()->SetBinLabel(13, "Above max occup."); + registry.add("Tracks/hTrkSel", "Number of tracks; Cut; #Tracks Passed Cut", {HistType::kTH1D, {{nTrkSel, 0, nTrkSel}}}); + registry.get(HIST("Tracks/hTrkSel"))->GetXaxis()->SetBinLabel(trkSelNCls + 1, "Ncl cut"); + registry.get(HIST("Tracks/hTrkSel"))->GetXaxis()->SetBinLabel(trkSelChi2Ncl + 1, "#chi^{2}/Ncl cut"); + registry.get(HIST("Tracks/hTrkSel"))->GetXaxis()->SetBinLabel(trkSelEta + 1, "#eta cut"); + registry.get(HIST("Tracks/hTrkSel"))->GetXaxis()->SetBinLabel(trkSelPhiCut + 1, "#varphi cut"); + registry.get(HIST("Tracks/hTrkSel"))->GetXaxis()->SetBinLabel(trkSelPt + 1, "#it{p}_{T} cut"); + registry.get(HIST("Tracks/hTrkSel"))->GetXaxis()->SetBinLabel(trkSelCA + 1, "Tracking algorithm (CA)"); + auto hBcSel = registry.add("hBcSel", "hBcSel", HistType::kTH1F, {{3, -0.5f, +2.5f}}); hBcSel->GetXaxis()->SetBinLabel(1, "Good BCs"); @@ -290,7 +311,7 @@ struct DndetaMFTPbPb { qaregistry.add( {"Tracks/NclustersEta", "; nClusters; #eta; occupancy", - {HistType::kTHnSparseF, {{7, 4, 10}, etaAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, {nclsAxis, etaAxis, occupancyAxis}}}); qaregistry.add({"Tracks/NchSel", "; N_{ch}; occupancy", {HistType::kTH2F, {multAxis, occupancyAxis}}}); @@ -311,7 +332,7 @@ struct DndetaMFTPbPb { qaregistry.add( {"Tracks/NclustersEtaBest", "; nClusters; #eta; occupancy", - {HistType::kTHnSparseF, {{7, 4, 10}, etaAxis, occupancyAxis}}}); + {HistType::kTHnSparseF, {nclsAxis, etaAxis, occupancyAxis}}}); qaregistry.add( {"Tracks/DCAXYPt", "; p_{T} (GeV/c) ; DCA_{XY} (cm); occupancy", @@ -389,7 +410,7 @@ struct DndetaMFTPbPb { qaregistry.add({"Tracks/Centrality/NclustersEta", "; nClusters; #eta; centrality; occupancy", {HistType::kTHnSparseF, - {{7, 4, 10}, etaAxis, centralityAxis, occupancyAxis}}}); + {nclsAxis, etaAxis, centralityAxis, occupancyAxis}}}); if (doprocessDatawBestTracksCentFT0C || doprocessDatawBestTracksCentFT0CVariant1 || @@ -412,7 +433,7 @@ struct DndetaMFTPbPb { {"Tracks/Centrality/NclustersEtaBest", "; nClusters; #eta; centrality; occupancy", {HistType::kTHnSparseF, - {{7, 4, 10}, etaAxis, centralityAxis, occupancyAxis}}}); + {nclsAxis, etaAxis, centralityAxis, occupancyAxis}}}); qaregistry.add({"Tracks/Centrality/TrackAmbDegree", "; N_{coll}^{comp}; centrality; occupancy", {HistType::kTHnSparseF, @@ -744,20 +765,21 @@ struct DndetaMFTPbPb { template bool isTrackSelected(const T& track) { - if (track.eta() < trackCuts.minEta || track.eta() > trackCuts.maxEta) + if (track.nClusters() < trackCuts.minNclusterMft) { return false; + } + registry.fill(HIST("Tracks/hTrkSel"), trkSelNCls); if (trackCuts.useChi2Cut) { float nclMft = std::max(2.0f * track.nClusters() - 5.0f, 1.0f); float mftChi2NCl = track.chi2() / nclMft; if (mftChi2NCl > trackCuts.maxChi2NCl) return false; } - if (trackCuts.requireCA && !track.isCA()) - return false; - if (track.nClusters() < trackCuts.minNclusterMft) - return false; - if (track.pt() < trackCuts.minPt) + registry.fill(HIST("Tracks/hTrkSel"), trkSelChi2Ncl); + if (track.eta() < trackCuts.minEta || track.eta() > trackCuts.maxEta) { return false; + } + registry.fill(HIST("Tracks/hTrkSel"), trkSelEta); if (trackCuts.usephiCut) { float phi = track.phi(); o2::math_utils::bringTo02Pi(phi); @@ -771,6 +793,15 @@ struct DndetaMFTPbPb { (phi < ((PIHalf - 0.1) * PI) + trackCuts.phiCut))) return false; } + registry.fill(HIST("Tracks/hTrkSel"), trkSelPhiCut); + if (trackCuts.usePtCut && track.pt() < trackCuts.minPt) { + return false; + } + registry.fill(HIST("Tracks/hTrkSel"), trkSelPt); + if (trackCuts.requireCA && !track.isCA()) { + return false; + } + registry.fill(HIST("Tracks/hTrkSel"), trkSelCA); return true; } @@ -938,69 +969,69 @@ struct DndetaMFTPbPb { bool isGoodEvent(C const& collision) { if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 0); + registry.fill(HIST("Events/hEvtSel"), 0); } if (!collision.sel8()) { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 1); + registry.fill(HIST("Events/hEvtSel"), 1); } if (eventCuts.requireIsGoodZvtxFT0VsPV && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 2); + registry.fill(HIST("Events/hEvtSel"), 2); } if (eventCuts.requireRejectSameBunchPileup && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 3); + registry.fill(HIST("Events/hEvtSel"), 3); } - if (std::abs(collision.posZ()) >= eventCuts.maxZvtx) { + if (collision.posZ() < eventCuts.minZvtx || collision.posZ() > eventCuts.maxZvtx) { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 4); + registry.fill(HIST("Events/hEvtSel"), 4); } if (eventCuts.requireNoCollInTimeRangeStd && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 5); + registry.fill(HIST("Events/hEvtSel"), 5); } if (eventCuts.requireNoCollInTimeRangeNarrow && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeNarrow)) { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 6); + registry.fill(HIST("Events/hEvtSel"), 6); } if (eventCuts.requireNoCollInTimeRangeStrict && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStrict)) { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 7); + registry.fill(HIST("Events/hEvtSel"), 7); } if (eventCuts.requireNoCollInRofStrict && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStrict)) { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 8); + registry.fill(HIST("Events/hEvtSel"), 8); } if (eventCuts.requireNoCollInRofStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInRofStandard)) { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 9); + registry.fill(HIST("Events/hEvtSel"), 9); } if (eventCuts.requireNoHighMultCollInPrevRof && !collision.selection_bit(o2::aod::evsel::kNoHighMultCollInPrevRof)) { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 10); + registry.fill(HIST("Events/hEvtSel"), 10); } if (eventCuts.minOccupancy >= 0 && getOccupancy(collision, eventCuts.occupancyEstimator) < @@ -1008,7 +1039,7 @@ struct DndetaMFTPbPb { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 11); + registry.fill(HIST("Events/hEvtSel"), 11); } if (eventCuts.maxOccupancy >= 0 && getOccupancy(collision, eventCuts.occupancyEstimator) > @@ -1016,7 +1047,7 @@ struct DndetaMFTPbPb { return false; } if constexpr (fillHis) { - registry.fill(HIST("hEvtSel"), 12); + registry.fill(HIST("Events/hEvtSel"), 12); } return true; } From 00f5ba350d7e8e962660cd84d45fdc8d8f8f10e4 Mon Sep 17 00:00:00 2001 From: Gyula Bencedi Date: Thu, 7 Aug 2025 01:11:24 +0200 Subject: [PATCH 2/2] Update dndetaMFTPbPb.cxx collision.posZ(): change of "less than" to "less than or equal to" --- PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx index abd2119941d..ed386e6a6fd 100644 --- a/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx +++ b/PWGMM/Mult/Tasks/dndetaMFTPbPb.cxx @@ -989,7 +989,7 @@ struct DndetaMFTPbPb { if constexpr (fillHis) { registry.fill(HIST("Events/hEvtSel"), 3); } - if (collision.posZ() < eventCuts.minZvtx || collision.posZ() > eventCuts.maxZvtx) { + if (collision.posZ() <= eventCuts.minZvtx || collision.posZ() >= eventCuts.maxZvtx) { return false; } if constexpr (fillHis) {