From f2629f03a42e0a38eea23ce6b84fde057148f22a Mon Sep 17 00:00:00 2001 From: Barbara Chytla Date: Sun, 5 Apr 2026 21:17:30 +0200 Subject: [PATCH 1/2] Fixing cascade QA plots to match true selection --- ...toUniversePairTaskTrackCascadeExtended.cxx | 125 +++++++++++------- 1 file changed, 78 insertions(+), 47 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index 715a3c1380a..90fbaaccfc5 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -148,7 +148,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { FemtoUniverseDetaDphiStar pairCloseRejection; FemtoUniverseDetaDphiStar pairCloseRejectionCasc; - HistogramRegistry rXiQA{"xi", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; + HistogramRegistry CascQAExtra{"CascQAExtra", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; HistogramRegistry qaRegistry{"TrackQA", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry resultRegistry{"Correlations", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry registryMCgen{"MCgenHistos", {}, OutputObjHandlingPolicy::AnalysisObject, false, true}; @@ -259,23 +259,23 @@ struct femtoUniversePairTaskTrackCascadeExtended { AxisSpec multAxis = {multBinning, "Multiplicity"}; // Histograms - rXiQA.add("hMassXi", "hMassXi", {HistType::kTH1F, {aXiMassAxis}}); - rXiQA.add("hMassXiSelected", "hMassXiSelected", {HistType::kTH1F, {aXiMassAxis}}); - rXiQA.add("hPtXi", "hPtXi", {HistType::kTH1F, {{ptAxis}}}); - rXiQA.add("hEtaXi", "hEtaXi", {HistType::kTH1F, {{etaAxis}}}); - rXiQA.add("hPhiXi", "hPhiXi", {HistType::kTH1F, {{phiAxis}}}); - rXiQA.add("hDCAV0Daughters", "hDCAV0Daughters", {HistType::kTH1F, {aDCADaughAxis}}); - rXiQA.add("hV0CosPA", "hV0CosPA", {HistType::kTH1F, {aCPAAxis}}); - rXiQA.add("hV0TranRad", "hV0TranRad", {HistType::kTH1F, {tranRadAxis}}); - rXiQA.add("hDCACascDaughters", "hDCACascDaughters", {HistType::kTH1F, {aDCADaughAxis}}); - rXiQA.add("hCascCosPA", "hCascCosPA", {HistType::kTH1F, {aCPAAxis}}); - rXiQA.add("hCascTranRad", "hCascTranRad", {HistType::kTH1F, {tranRadAxis}}); - rXiQA.add("hDcaPostoPV", "hDcaPostoPV", {HistType::kTH1F, {aDCAToPVAxis}}); - rXiQA.add("hDcaNegtoPV", "hDcaNegtoPV", {HistType::kTH1F, {aDCAToPVAxis}}); - rXiQA.add("hDcaBachtoPV", "hDcaBachtoPV", {HistType::kTH1F, {aDCAToPVAxis}}); - rXiQA.add("hDcaV0toPV", "hDcaV0toPV", {HistType::kTH1F, {aDCAToPVAxis}}); - rXiQA.add("hInvMpT", "hInvMpT", kTH2F, {{ptAxis}, {aXiMassAxis}}); - rXiQA.add("hInvMpTmult", "hInvMpTmult", kTH3F, {{ptAxis}, {aXiMassAxis}, {multAxis}}); + CascQAExtra.add("hMassXi", "hMassXi", {HistType::kTH1F, {aXiMassAxis}}); + CascQAExtra.add("hMassXiSelected", "hMassXiSelected", {HistType::kTH1F, {aXiMassAxis}}); + CascQAExtra.add("hPtXi", "hPtXi", {HistType::kTH1F, {{ptAxis}}}); + CascQAExtra.add("hEtaXi", "hEtaXi", {HistType::kTH1F, {{etaAxis}}}); + CascQAExtra.add("hPhiXi", "hPhiXi", {HistType::kTH1F, {{phiAxis}}}); + CascQAExtra.add("hDCAV0Daughters", "hDCAV0Daughters", {HistType::kTH1F, {aDCADaughAxis}}); + CascQAExtra.add("hV0CosPA", "hV0CosPA", {HistType::kTH1F, {aCPAAxis}}); + CascQAExtra.add("hV0TranRad", "hV0TranRad", {HistType::kTH1F, {tranRadAxis}}); + CascQAExtra.add("hDCACascDaughters", "hDCACascDaughters", {HistType::kTH1F, {aDCADaughAxis}}); + CascQAExtra.add("hCascCosPA", "hCascCosPA", {HistType::kTH1F, {aCPAAxis}}); + CascQAExtra.add("hCascTranRad", "hCascTranRad", {HistType::kTH1F, {tranRadAxis}}); + CascQAExtra.add("hDcaPostoPV", "hDcaPostoPV", {HistType::kTH1F, {aDCAToPVAxis}}); + CascQAExtra.add("hDcaNegtoPV", "hDcaNegtoPV", {HistType::kTH1F, {aDCAToPVAxis}}); + CascQAExtra.add("hDcaBachtoPV", "hDcaBachtoPV", {HistType::kTH1F, {aDCAToPVAxis}}); + CascQAExtra.add("hDcaV0toPV", "hDcaV0toPV", {HistType::kTH1F, {aDCAToPVAxis}}); + CascQAExtra.add("hInvMpT", "hInvMpT", kTH2F, {{ptAxis}, {aXiMassAxis}}); + CascQAExtra.add("hInvMpTmult", "hInvMpTmult", kTH3F, {{ptAxis}, {aXiMassAxis}, {multAxis}}); eventHisto.init(&qaRegistry); /// nSigma debug histograms for the selected particle species only i.e. not sigmas of all particles mixed together @@ -371,44 +371,69 @@ struct femtoUniversePairTaskTrackCascadeExtended { } } - void processCascadeQA([[maybe_unused]] const FilteredFDCollision& col, const FemtoFullParticles& parts, const aod::FDCascParticles& fdcascs) + template + using hasSigma = decltype(std::declval().tpcNSigmaStorePr()); + + // Additional cascade QA plots + template + void doCascadeQA([[maybe_unused]] const FilteredFDCollision& col, const TableType& parts, PartitionType& partsTwo, const aod::FDCascParticles& fdcascs) { - for (const auto& casc : fdcascs) { - const auto& part = casc.fdParticle_as(); - rXiQA.fill(HIST("hMassXi"), part.mLambda()); + auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); + + // Basic particle loop + for (const auto& part : groupPartsTwo) { + CascQAExtra.fill(HIST("hMassXi"), part.mLambda()); const auto& posChild = parts.iteratorAt(part.globalIndex() - 3 - parts.begin().globalIndex()); const auto& negChild = parts.iteratorAt(part.globalIndex() - 2 - parts.begin().globalIndex()); const auto& bachelor = parts.iteratorAt(part.globalIndex() - 1 - parts.begin().globalIndex()); - float posChildTPC, negChildTPC, bachelorTPC, posChildTOF, negChildTOF, bachelorTOF; - if (!isParticleTPC(posChild, CascChildTable[confCascType1][0], &posChildTPC) || !isParticleTPC(negChild, CascChildTable[confCascType1][1], &negChildTPC) || !isParticleTPC(bachelor, CascChildTable[confCascType1][2], &bachelorTPC)) - continue; + if constexpr (std::experimental::is_detected::value) { + float posChildTPC, negChildTPC, bachelorTPC, posChildTOF, negChildTOF, bachelorTOF; + if (!isParticleTPC(posChild, CascChildTable[confCascType1][0], &posChildTPC) || !isParticleTPC(negChild, CascChildTable[confCascType1][1], &negChildTPC) || !isParticleTPC(bachelor, CascChildTable[confCascType1][2], &bachelorTPC)) + continue; - if (!isParticleTOF(posChild, CascChildTable[confCascType1][0], &posChildTOF) || !isParticleTOF(negChild, CascChildTable[confCascType1][1], &negChildTOF) || !isParticleTOF(bachelor, CascChildTable[confCascType1][2], &bachelorTOF)) - continue; + if (!isParticleTOF(posChild, CascChildTable[confCascType1][0], &posChildTOF) || !isParticleTOF(negChild, CascChildTable[confCascType1][1], &negChildTOF) || !isParticleTOF(bachelor, CascChildTable[confCascType1][2], &bachelorTOF)) + continue; - rXiQA.fill(HIST("hPtXi"), part.pt()); - rXiQA.fill(HIST("hEtaXi"), part.eta()); - rXiQA.fill(HIST("hPhiXi"), part.phi()); - rXiQA.fill(HIST("hMassXiSelected"), part.mLambda()); - rXiQA.fill(HIST("hDCAV0Daughters"), casc.dcaV0daughters()); - rXiQA.fill(HIST("hV0CosPA"), casc.cpav0()); - rXiQA.fill(HIST("hV0TranRad"), casc.v0radius()); - rXiQA.fill(HIST("hCascCosPA"), casc.cpaCasc()); - rXiQA.fill(HIST("hDCACascDaughters"), casc.dcacascdaughters()); - rXiQA.fill(HIST("hCascTranRad"), casc.cascradius()); - rXiQA.fill(HIST("hDcaPostoPV"), casc.dcapostopv()); - rXiQA.fill(HIST("hDcaNegtoPV"), casc.dcanegtopv()); - rXiQA.fill(HIST("hDcaBachtoPV"), casc.dcabachtopv()); - rXiQA.fill(HIST("hDcaV0toPV"), casc.dcav0topv()); - rXiQA.fill(HIST("hInvMpT"), part.pt(), part.mLambda()); + CascQAExtra.fill(HIST("hPtXi"), part.pt()); + CascQAExtra.fill(HIST("hEtaXi"), part.eta()); + CascQAExtra.fill(HIST("hPhiXi"), part.phi()); + CascQAExtra.fill(HIST("hMassXiSelected"), part.mLambda()); + CascQAExtra.fill(HIST("hInvMpT"), part.pt(), part.mLambda()); + } } - } - PROCESS_SWITCH(femtoUniversePairTaskTrackCascadeExtended, processCascadeQA, "Enable processing cascades", false); - template - using hasSigma = decltype(std::declval().tpcNSigmaStorePr()); + // Cascade extended table loop + for (const auto& casc : fdcascs) { + const auto& part = casc.fdParticle_as(); + + const auto& posChildExt = parts.iteratorAt(part.globalIndex() - 3 - parts.begin().globalIndex()); + const auto& negChildExt = parts.iteratorAt(part.globalIndex() - 2 - parts.begin().globalIndex()); + const auto& bachelorExt = parts.iteratorAt(part.globalIndex() - 1 - parts.begin().globalIndex()); + + if constexpr (std::experimental::is_detected::value) { + float posChildTPCExt, negChildTPCExt, bachelorTPCExt, posChildTOFExt, negChildTOFExt, bachelorTOFExt; + if (!isParticleTPC(posChildExt, CascChildTable[confCascType1][0], &posChildTPCExt) || !isParticleTPC(negChildExt, CascChildTable[confCascType1][1], &negChildTPCExt) || !isParticleTPC(bachelorExt, CascChildTable[confCascType1][2], &bachelorTPCExt)) + continue; + + if (!isParticleTOF(posChildExt, CascChildTable[confCascType1][0], &posChildTOFExt) || !isParticleTOF(negChildExt, CascChildTable[confCascType1][1], &negChildTOFExt) || !isParticleTOF(bachelorExt, CascChildTable[confCascType1][2], &bachelorTOFExt)) + continue; + + CascQAExtra.fill(HIST("hDCAV0Daughters"), casc.dcaV0daughters()); + CascQAExtra.fill(HIST("hV0CosPA"), casc.cpav0()); + CascQAExtra.fill(HIST("hV0TranRad"), casc.v0radius()); + CascQAExtra.fill(HIST("hCascCosPA"), casc.cpaCasc()); + CascQAExtra.fill(HIST("hDCACascDaughters"), casc.dcacascdaughters()); + CascQAExtra.fill(HIST("hCascTranRad"), casc.cascradius()); + CascQAExtra.fill(HIST("hDcaPostoPV"), casc.dcapostopv()); + CascQAExtra.fill(HIST("hDcaNegtoPV"), casc.dcanegtopv()); + CascQAExtra.fill(HIST("hDcaBachtoPV"), casc.dcabachtopv()); + CascQAExtra.fill(HIST("hDcaV0toPV"), casc.dcav0topv()); + } + } + + } /// track - cascade correlations template @@ -469,7 +494,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { bachHistos.fillQABase(bachelor, HIST("hBachelor")); cascQAHistos.fillQA(part); } - rXiQA.fill(HIST("hInvMpTmult"), part.pt(), part.mLambda(), multCol); + CascQAExtra.fill(HIST("hInvMpTmult"), part.pt(), part.mLambda(), multCol); } for (const auto& part : groupPartsOne) { @@ -552,6 +577,12 @@ struct femtoUniversePairTaskTrackCascadeExtended { } } + void processCascadeQA([[maybe_unused]] const FilteredFDCollision& col, const FemtoFullParticles& parts, const aod::FDCascParticles& fdcascs) + { + doCascadeQA(col, parts, partsTwoFull, fdcascs); + } + PROCESS_SWITCH(femtoUniversePairTaskTrackCascadeExtended, processCascadeQA, "Enable additional QA for cascades", false); + void processSameEvent(const FilteredFDCollision& col, const FemtoFullParticles& parts) { doSameEvent(col, parts, partsOneFull, partsTwoFull); From 10ee966ca45188b40c6394c84f9b3c5c7d5d9be0 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Sun, 5 Apr 2026 19:22:57 +0000 Subject: [PATCH 2/2] Please consider the following formatting changes --- .../Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx index 90fbaaccfc5..44d0b5d637e 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackCascadeExtended.cxx @@ -379,7 +379,7 @@ struct femtoUniversePairTaskTrackCascadeExtended { void doCascadeQA([[maybe_unused]] const FilteredFDCollision& col, const TableType& parts, PartitionType& partsTwo, const aod::FDCascParticles& fdcascs) { auto groupPartsTwo = partsTwo->sliceByCached(aod::femtouniverseparticle::fdCollisionId, col.globalIndex(), cache); - + // Basic particle loop for (const auto& part : groupPartsTwo) { CascQAExtra.fill(HIST("hMassXi"), part.mLambda()); @@ -432,7 +432,6 @@ struct femtoUniversePairTaskTrackCascadeExtended { CascQAExtra.fill(HIST("hDcaV0toPV"), casc.dcav0topv()); } } - } /// track - cascade correlations