From 22e3f7bab9302ce134d5428b201fc28e646067e9 Mon Sep 17 00:00:00 2001 From: Meiyi Chen Date: Thu, 6 Aug 2026 16:20:51 +0800 Subject: [PATCH 1/5] Update HadNucleiFemto.cxx --- .../TableProducer/HadNucleiFemto.cxx | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx b/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx index a9d400bd3af..f47f86ae02f 100644 --- a/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx +++ b/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx @@ -594,7 +594,7 @@ struct HadNucleiFemto { // ================================================================================================================== template - bool passesCollisionSelection(const Tcollision& collision) + bool passesEventSelection(const Tcollision& collision) { // CPR uses phi* and therefore needs the magnetic field for MC as well. auto bc = collision.template bc_as(); @@ -608,32 +608,53 @@ struct HadNucleiFemto { if (!collision.sel8() || std::abs(collision.posZ()) > eventMixing.settingCutVertex) { return false; } - if (zorro.settingSkimmedProcessing) { - if (!mZorro.isSelected(bc.globalBC())) { - return false; - } - } } return true; } + template + bool passesZorroSelection(const Tcollision& collision) + { + if (!zorro.settingSkimmedProcessing) { + return true; + } + auto bc = collision.template bc_as(); + return mZorro.isSelected(bc.globalBC()); + } + + template + bool passesCollisionSelection(const Tcollision& collision) + { + if (!passesEventSelection(collision)) { + return false; + } + if constexpr (!isMC) { + return passesZorroSelection(collision); + } + return true; + } + template bool selectCollision(const Tcollision& collision, const aod::BCsWithTimestamps&) { mQaRegistry.fill(HIST("hEvents"), 0); - if (!passesCollisionSelection(collision)) { + if (!passesEventSelection(collision)) { return false; } + mQaRegistry.fill(HIST("hEvents"), 1); + if constexpr (!isMC) { if (zorro.settingSkimmedProcessing) { + if (!passesZorroSelection(collision)) { + return false; + } mQaRegistry.fill(HIST("hEvents"), 2); } } - mQaRegistry.fill(HIST("hEvents"), 1); mQaRegistry.fill(HIST("hNcontributor"), collision.numContrib()); mQaRegistry.fill(HIST("hVtxZ"), collision.posZ()); return true; From ea51da87057bc2cf88a7c7e08bfdf0ccf389458a Mon Sep 17 00:00:00 2001 From: Meiyi Chen Date: Fri, 7 Aug 2026 16:15:38 +0800 Subject: [PATCH 2/5] Update HadNucleiFemto.cxx --- .../TableProducer/HadNucleiFemto.cxx | 45 ++++++++++++------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx b/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx index f47f86ae02f..c914f6311b1 100644 --- a/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx +++ b/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx @@ -357,9 +357,9 @@ struct HadNucleiFemto { ConfigurableAxis axisVertex{"axisVertex", {30, -10, 10}, "Binning for vtxz"}; ConfigurableAxis axisCentrality{"axisCentrality", {40, 0, 100}, "Binning for centrality"}; using BinningType = ColumnBinningPolicy; + using SelectedCollisions = soa::Filtered; BinningType binningPolicy{{axisVertex, axisCentrality}, true}; SliceCache cache; - SameKindPair mPair{binningPolicy, eventMixing.settingNoMixedEvents, -1, &cache}; // Pair hyperPair{binningPolicy, eventMixing.settingNoMixedEvents, -1, &cache}; std::array mBBparamsNucleus{}; @@ -383,6 +383,7 @@ struct HadNucleiFemto { {"hCentrality", "Centrality", {HistType::kTH1F, {{100, 0.0f, 100.0f}}}}, {"hSkipReasons", "Why storedEvent skipped;Reason;Counts", {HistType::kTH1F, {{5, -0.5, 4.5}}}}, {"hEvents", "; Events;", {HistType::kTH1F, {{3, -0.5, 2.5}}}}, + {"hMixedEventSelections", "Mixed-event collision selection;Step;Counts", {HistType::kTH1F, {{4, -0.5, 3.5}}}}, // Candidate topology and kinematics {"hTrackSel", "Accepted hadron tracks", {HistType::kTH1F, {{Selections::kAll, -0.5, static_cast(Selections::kAll) - 0.5}}}}, @@ -535,6 +536,11 @@ struct HadNucleiFemto { for (int i = 0; i < Selections::kAll; i++) { mQaRegistry.get(HIST("hEvents"))->GetXaxis()->SetBinLabel(i + 1, eventsLabels[i].c_str()); } + + const std::array mixedEventLabels = {"All collisions", "Event selection", "Mixing pool", "Mixed combinations"}; + for (size_t i = 0; i < mixedEventLabels.size(); i++) { + mQaRegistry.get(HIST("hMixedEventSelections"))->GetXaxis()->SetBinLabel(i + 1, mixedEventLabels[i].c_str()); + } } template @@ -623,18 +629,6 @@ struct HadNucleiFemto { return mZorro.isSelected(bc.globalBC()); } - template - bool passesCollisionSelection(const Tcollision& collision) - { - if (!passesEventSelection(collision)) { - return false; - } - if constexpr (!isMC) { - return passesZorroSelection(collision); - } - return true; - } - template bool selectCollision(const Tcollision& collision, const aod::BCsWithTimestamps&) { @@ -2216,10 +2210,31 @@ struct HadNucleiFemto { { LOG(debug) << "Processing mixed event"; - for (const auto& [c1, tracks1, c2, tracks2] : mPair) { - if (!passesCollisionSelection(c1) || !passesCollisionSelection(c2)) { + // Zorro is a runtime selection, so build its filtered collision table before applying the mixing depth. + soa::SelectionVector selectedCollisionRows; + int64_t rowIndex = 0; + for (const auto& collision : collisions) { + mQaRegistry.fill(HIST("hMixedEventSelections"), 0); + if (!passesEventSelection(collision)) { + ++rowIndex; continue; } + mQaRegistry.fill(HIST("hMixedEventSelections"), 1); + if (!passesZorroSelection(collision)) { + ++rowIndex; + continue; + } + selectedCollisionRows.push_back(rowIndex++); + mQaRegistry.fill(HIST("hMixedEventSelections"), 2); + } + + SelectedCollisions selectedCollisions{{collisions.asArrowTableRef()}, std::move(selectedCollisionRows)}; + collisions.copyIndexBindings(selectedCollisions); + auto tracksTuple = std::make_tuple(tracks); + SameKindPair selectedPairs{binningPolicy, eventMixing.settingNoMixedEvents, -1, selectedCollisions, tracksTuple, &cache}; + + for (const auto& [c1, tracks1, c2, tracks2] : selectedPairs) { + mQaRegistry.fill(HIST("hMixedEventSelections"), 3); mQaRegistry.fill(HIST("hNcontributor"), c1.numContrib()); mQaRegistry.fill(HIST("hVtxZ"), c1.posZ()); From 164159688cdeeeb608321ee353272863db040528 Mon Sep 17 00:00:00 2001 From: Meiyi Chen Date: Fri, 7 Aug 2026 16:28:33 +0800 Subject: [PATCH 3/5] Update HadNucleiFemto.cxx --- PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx b/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx index c914f6311b1..146aae79d92 100644 --- a/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx +++ b/PWGCF/Femto/FemtoNuclei/TableProducer/HadNucleiFemto.cxx @@ -67,6 +67,7 @@ #include #include #include +#include #include using namespace o2; From 9025dab646b34dc4113cb201a976a90ad0a0b3cb Mon Sep 17 00:00:00 2001 From: Meiyi Chen Date: Fri, 7 Aug 2026 16:42:37 +0800 Subject: [PATCH 4/5] Update piDeFemtoSystematics.cxx --- PWGCF/Femto/FemtoNuclei/Tasks/piDeFemtoSystematics.cxx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PWGCF/Femto/FemtoNuclei/Tasks/piDeFemtoSystematics.cxx b/PWGCF/Femto/FemtoNuclei/Tasks/piDeFemtoSystematics.cxx index c12af02d7d2..c9aa9d54638 100644 --- a/PWGCF/Femto/FemtoNuclei/Tasks/piDeFemtoSystematics.cxx +++ b/PWGCF/Femto/FemtoNuclei/Tasks/piDeFemtoSystematics.cxx @@ -358,7 +358,9 @@ struct PiDeFemtoSystematics { {"deuteronSharedTPCFractionMax", deuteronCuts.sharedTPCFractionMax.value}, {"deuteronTPCInnerParamMin", deuteronCuts.tpcInnerParamMin.value}, {"deuteronTOFMomentumMin", deuteronCuts.tofMomentumMin.value}, - {"deuteronNsigmaMax", deuteronCuts.nsigmaMax.value}, + {"deuteronCombNsigmaMax", deuteronCuts.nsigmaMax.value}, + {"deuteronTPCNsigmaMax", deuteronCuts.nsigmaMax.value}, + {"deuteronITSNsigmaMax", deuteronCuts.nsigmaMax.value}, {"requireIndividualNsigma", deuteronCuts.requireIndividualNsigma.value}, {"deuteronDCAxyOffset", deuteronCuts.dcaXYOffset.value}, {"deuteronDCAxyPtCoefficient", deuteronCuts.dcaXYPtCoefficient.value}, From ee4943d39e050146dcf03ad5f32058a11e7c9ed2 Mon Sep 17 00:00:00 2001 From: Meiyi Chen Date: Fri, 7 Aug 2026 16:46:35 +0800 Subject: [PATCH 5/5] Update piDeFemtoSystematics.cxx --- PWGCF/Femto/FemtoNuclei/Tasks/piDeFemtoSystematics.cxx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/PWGCF/Femto/FemtoNuclei/Tasks/piDeFemtoSystematics.cxx b/PWGCF/Femto/FemtoNuclei/Tasks/piDeFemtoSystematics.cxx index c9aa9d54638..c12af02d7d2 100644 --- a/PWGCF/Femto/FemtoNuclei/Tasks/piDeFemtoSystematics.cxx +++ b/PWGCF/Femto/FemtoNuclei/Tasks/piDeFemtoSystematics.cxx @@ -358,9 +358,7 @@ struct PiDeFemtoSystematics { {"deuteronSharedTPCFractionMax", deuteronCuts.sharedTPCFractionMax.value}, {"deuteronTPCInnerParamMin", deuteronCuts.tpcInnerParamMin.value}, {"deuteronTOFMomentumMin", deuteronCuts.tofMomentumMin.value}, - {"deuteronCombNsigmaMax", deuteronCuts.nsigmaMax.value}, - {"deuteronTPCNsigmaMax", deuteronCuts.nsigmaMax.value}, - {"deuteronITSNsigmaMax", deuteronCuts.nsigmaMax.value}, + {"deuteronNsigmaMax", deuteronCuts.nsigmaMax.value}, {"requireIndividualNsigma", deuteronCuts.requireIndividualNsigma.value}, {"deuteronDCAxyOffset", deuteronCuts.dcaXYOffset.value}, {"deuteronDCAxyPtCoefficient", deuteronCuts.dcaXYPtCoefficient.value},