From 2892a75f365866c3069f001e865b3ed00613782c Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Sun, 2 Nov 2025 11:54:12 +0100 Subject: [PATCH] Add kT dependent closed-pair deta-dphi* cut --- .../Core/FemtoUniverseDetaDphiStar.h | 63 +++++++++++-------- ...irTaskTrackTrackSpherHarMultKtExtended.cxx | 58 ++++++++++++----- 2 files changed, 81 insertions(+), 40 deletions(-) diff --git a/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h b/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h index 57c7a22d4de..aa57c5b4755 100644 --- a/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h +++ b/PWGCF/FemtoUniverse/Core/FemtoUniverseDetaDphiStar.h @@ -188,18 +188,22 @@ class FemtoUniverseDetaDphiStar } template - void init_kT(HistogramRegistry* registry, t1& ktbins) + void init_kT(HistogramRegistry* registry, t1& ktbins, std::vector ldeltaphistarcutmin, std::vector ldeltaphistarcutmax, std::vector ldeltaetacutmin, std::vector ldeltaetacutmax) { mHistogramRegistry = registry; ktBins = ktbins; + cutDeltaPhiStarMaxVector = ldeltaphistarcutmax; + cutDeltaPhiStarMinVector = ldeltaphistarcutmin; + cutDeltaEtaMaxVector = ldeltaetacutmax; + cutDeltaEtaMinVector = ldeltaetacutmin; + if constexpr (kPartOneType == o2::aod::femtouniverseparticle::ParticleType::kTrack && kPartTwoType == o2::aod::femtouniverseparticle::ParticleType::kTrack) { std::string dirName = static_cast(DirNames[0]); for (int j = 0; j < static_cast(ktBins.size() - 1); j++) { std::string histSuffixkT1 = std::to_string(static_cast(ktBins[j] * 100.0)); std::string histSuffixkT2 = std::to_string(static_cast(ktBins[j + 1] * 100.0)); std::string histFolderkT = "kT_" + histSuffixkT1 + "_" + histSuffixkT2 + "/"; - histdetadphisamebeforekT[j] = mHistogramRegistry->add((dirName + histFolderkT + "detadphidetadphiBeforeSame").c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); histdetadphimixedbeforekT[j] = mHistogramRegistry->add((dirName + histFolderkT + "detadphidetadphiBeforeMixed").c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); histdetadphisameafterkT[j] = mHistogramRegistry->add((dirName + histFolderkT + "detadphidetadphiAfterSame").c_str(), "; #Delta #eta; #Delta #phi", kTH2F, {{100, -0.15, 0.15}, {100, -0.15, 0.15}}); @@ -581,7 +585,6 @@ class FemtoUniverseDetaDphiStar } } - /// Check if pair is close or not template bool isClosePairFrac(Part const& part1, Part const& part2, float lmagfield, uint8_t ChosenEventType, bool IsDphiAvgOrDist, float DistMax, float FracMax, bool CircCut) { @@ -641,16 +644,17 @@ class FemtoUniverseDetaDphiStar } } - /// Templated function to access different kT directory and call addEventPair - /// \param part1 particle 1 - /// \param part2 particle 2 - /// \param ChosenEventType Same or Mixed evet type - /// \param maxl Maximum valie of L component of the spherical harmonics - /// \param multval Multiplicity value - /// \param ktval kT value + /// Check if pair is close or not template - void kTdetadphi(Part const& part1, Part const& part2, uint8_t ChosenEventType, float ktval) + bool isClosePairkT(Part const& part1, Part const& part2, uint8_t ChosenEventType, float ktval, bool CircCut) { + /// Track-Track combination + // check if provided particles are in agreement with the class instantiation + if (part1.partType() != o2::aod::femtouniverseparticle::ParticleType::kTrack || part2.partType() != o2::aod::femtouniverseparticle::ParticleType::kTrack) { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar instantiation! Please provide kTrack,kTrack candidates."; + return false; + } + int ktbinval = -1; if (ktval >= ktBins[0] && ktval < ktBins[1]) { ktbinval = 0; @@ -660,22 +664,8 @@ class FemtoUniverseDetaDphiStar ktbinval = 2; } else if (ktval >= ktBins[3] && ktval < ktBins[4]) { ktbinval = 3; - } else { - return; } - isClosePairkT(part1, part2, ChosenEventType, ktbinval); - } - /// Check if pair is close or not - template - void isClosePairkT(Part const& part1, Part const& part2, uint8_t ChosenEventType, int ktbinval) - { - /// Track-Track combination - // check if provided particles are in agreement with the class instantiation - if (part1.partType() != o2::aod::femtouniverseparticle::ParticleType::kTrack || part2.partType() != o2::aod::femtouniverseparticle::ParticleType::kTrack) { - LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar instantiation! Please provide kTrack,kTrack candidates."; - return; - } auto deta = part1.eta() - part2.eta(); auto dphiAvg = averagePhiStar(part1, part2, 0); if (ChosenEventType == femto_universe_container::EventType::same) { @@ -686,7 +676,7 @@ class FemtoUniverseDetaDphiStar LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; } - if (std::pow(dphiAvg, 2) / std::pow(cutDeltaPhiStarMax, 2) + std::pow(deta, 2) / std::pow(cutDeltaEtaMax, 2) > 1.) { + if (std::pow(dphiAvg, 2) / std::pow(cutDeltaPhiStarMaxVector[ktbinval], 2) + std::pow(deta, 2) / std::pow(cutDeltaEtaMaxVector[ktbinval], 2) > 1.) { if (ChosenEventType == femto_universe_container::EventType::same) { histdetadphisameafterkT[ktbinval]->Fill(deta, dphiAvg); } else if (ChosenEventType == femto_universe_container::EventType::mixed) { @@ -695,6 +685,21 @@ class FemtoUniverseDetaDphiStar LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; } } + + if (CircCut && (std::pow(dphiAvg, 2) / std::pow(cutDeltaPhiStarMaxVector[ktbinval], 2) + std::pow(deta, 2) / std::pow(cutDeltaEtaMaxVector[ktbinval], 2) < 1.)) { + return true; + } else if (!CircCut && (dphiAvg > cutDeltaPhiStarMinVector[ktbinval]) && (dphiAvg < cutDeltaPhiStarMaxVector[ktbinval]) && (deta > cutDeltaEtaMinVector[ktbinval]) && (deta < cutDeltaEtaMaxVector[ktbinval])) { + return true; + } else { + if (ChosenEventType == femto_universe_container::EventType::same) { + histdetadphisameafterkT[ktbinval]->Fill(deta, dphiAvg); + } else if (ChosenEventType == femto_universe_container::EventType::mixed) { + histdetadphimixedafterkT[ktbinval]->Fill(deta, dphiAvg); + } else { + LOG(fatal) << "FemtoUniverseDetaDphiStar: passed arguments don't agree with FemtoUniverseDetaDphiStar's type of events! Please provide same or mixed."; + } + return false; + } } /// Check if pair is close or not @@ -770,6 +775,12 @@ class FemtoUniverseDetaDphiStar float cutDeltaPhiStarMin; float cutDeltaEtaMax; float cutDeltaEtaMin; + + std::vector cutDeltaPhiStarMaxVector; + std::vector cutDeltaPhiStarMinVector; + std::vector cutDeltaEtaMaxVector; + std::vector cutDeltaEtaMinVector; + float magfield; bool plotForEveryRadii = false; float cutPhiInvMassLow; diff --git a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx index 35b8c394693..e79c214a8cf 100644 --- a/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx +++ b/PWGCF/FemtoUniverse/Tasks/femtoUniversePairTaskTrackTrackSpherHarMultKtExtended.cxx @@ -84,9 +84,14 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { Configurable ConfIsCPR{"ConfIsCPR", true, "Close Pair Rejection"}; Configurable ConfCPRPlotPerRadii{"ConfCPRPlotPerRadii", false, "Plot CPR per radii"}; Configurable ConfCPRdeltaPhiCutMax{"ConfCPRdeltaPhiCutMax", 0.0, "Delta Phi max cut for Close Pair Rejection"}; - Configurable ConfCPRdeltaPhiCutMin{"ConfCPRdeltaPhiCutMin", 0.0, "Delta Phi min cut for Close Pair Rejection"}; - Configurable ConfCPRdeltaEtaCutMax{"ConfCPRdeltaEtaCutMax", 0.0, "Delta Eta max cut for Close Pair Rejection"}; - Configurable ConfCPRdeltaEtaCutMin{"ConfCPRdeltaEtaCutMin", 0.0, "Delta Eta min cut for Close Pair Rejection"}; + Configurable ConfCPRdeltaPhiCutMin{"ConfCPRdeltaPhiCutMin", 0., "Delta Phi min cut for Close Pair Rejection"}; + Configurable ConfCPRdeltaEtaCutMax{"ConfCPRdeltaEtaCutMax", 0., "Delta Eta max cut for Close Pair Rejection"}; + Configurable ConfCPRdeltaEtaCutMin{"ConfCPRdeltaEtaCutMin", 0., "Delta Eta min cut for Close Pair Rejection"}; + Configurable> ConfCPRdeltaPhiCutMaxVector{"ConfCPRdeltaPhiCutMaxVector", std::vector{0.0, 0.0, 0.0, 0.0}, "Delta Phi max cut for Close Pair Rejection"}; + Configurable> ConfCPRdeltaPhiCutMinVector{"ConfCPRdeltaPhiCutMinVector", std::vector{0.0, 0.0, 0.0, 0.0}, "Delta Phi min cut for Close Pair Rejection"}; + Configurable> ConfCPRdeltaEtaCutMaxVector{"ConfCPRdeltaEtaCutMaxVector", std::vector{0.0, 0.0, 0.0, 0.0}, "Delta Eta max cut for Close Pair Rejection"}; + Configurable> ConfCPRdeltaEtaCutMinVector{"ConfCPRdeltaEtaCutMinVector", std::vector{0.0, 0.0, 0.0, 0.0}, "Delta Eta min cut for Close Pair Rejection"}; + Configurable confIsCPRkT{"confIsCPRkT", true, "kT dependent deltaEta-deltaPhi cut for Close Pair Rejection"}; Configurable ConfCPRChosenRadii{"ConfCPRChosenRadii", 0.80, "Delta Eta cut for Close Pair Rejection"}; Configurable confUseCCImCut{"confUseCCImCut", false, "Fill SH within specific quadrants of qout-qside"}; Configurable confUse1stand3rd{"confUse1stand3rd", false, "Use first and third quadrants of qout-qside"}; @@ -97,7 +102,7 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { // Filters for selecting particles (both p1 and p2) Filter trackAdditionalfilter = (nabs(aod::femtouniverseparticle::eta) < twotracksconfigs.ConfEtaMax); // example filtering on configurable using FilteredFemtoFullParticles = soa::Filtered; - // using FilteredFemtoFullParticles = FemtoFullParticles; //if no filtering is applied uncomment this option + // using FilteredFemtoFullParticles = FemtoFullParticles; //if no filtering is applied uncomment this optionconfIsCPRkT using FemtoRecoParticles = soa::Join; using FilteredFemtoRecoParticles = soa::Filtered; @@ -454,7 +459,7 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { pairCleaner.init(&qaRegistry); if (twotracksconfigs.ConfIsCPR.value) { pairCloseRejection.init(&resultRegistry, &qaRegistry, twotracksconfigs.ConfCPRdeltaPhiCutMin.value, twotracksconfigs.ConfCPRdeltaPhiCutMax.value, twotracksconfigs.ConfCPRdeltaEtaCutMin.value, twotracksconfigs.ConfCPRdeltaEtaCutMax.value, twotracksconfigs.ConfCPRChosenRadii.value, twotracksconfigs.ConfCPRPlotPerRadii.value); - pairCloseRejection.init_kT(&resultRegistry, ConfKtKstarBins); + pairCloseRejection.init_kT(&resultRegistry, ConfKtKstarBins, twotracksconfigs.ConfCPRdeltaPhiCutMaxVector, twotracksconfigs.ConfCPRdeltaPhiCutMinVector, twotracksconfigs.ConfCPRdeltaEtaCutMaxVector, twotracksconfigs.ConfCPRdeltaEtaCutMinVector); } vPIDPartOne = trackonefilter.ConfPIDPartOne.value; @@ -520,14 +525,24 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { continue; } + float kT = FemtoUniverseMath::getkT(p1, mass1, p2, mass2); + if (kT > ConfKtKstarBins.value.back() || kT < ConfKtKstarBins.value.front()) + continue; + if (twotracksconfigs.ConfIsCPR.value) { if (confCPRIsAtITS.value) { if (pairCloseRejection.isClosePairAtITS(p1, p2, magFieldTesla, femto_universe_container::EventType::same)) { continue; } } else { - if (pairCloseRejection.isClosePairFrac(p1, p2, magFieldTesla, femto_universe_container::EventType::same, confCPRDphiAvgOrDist, confCPRDistMax, confCPRFracMax, confIsCircularCut)) { - continue; + if (twotracksconfigs.confIsCPRkT) { + if (pairCloseRejection.isClosePairkT(p1, p2, femto_universe_container::EventType::same, kT, confIsCircularCut)) { + continue; + } + } else { + if (pairCloseRejection.isClosePairFrac(p1, p2, magFieldTesla, femto_universe_container::EventType::same, confCPRDphiAvgOrDist, confCPRDistMax, confCPRFracMax, confIsCircularCut)) { + continue; + } } } } @@ -536,7 +551,6 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { if (!pairCleaner.isCleanPair(p1, p2, parts)) { continue; } - float kT = FemtoUniverseMath::getkT(p1, mass1, p2, mass2); sameEventMultCont.fillMultNumDen(p1, p2, femto_universe_sh_container::EventType::same, 2, multCol, kT, ConfIsIden); } } else { @@ -551,15 +565,23 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { } float kT = FemtoUniverseMath::getkT(p1, mass1, p2, mass2); + if (kT > ConfKtKstarBins.value.back() || kT < ConfKtKstarBins.value.front()) + continue; + if (twotracksconfigs.ConfIsCPR.value) { - pairCloseRejection.kTdetadphi(p1, p2, femto_universe_container::EventType::same, kT); if (confCPRIsAtITS.value) { if (pairCloseRejection.isClosePairAtITS(p1, p2, magFieldTesla, femto_universe_container::EventType::same)) { continue; } } else { - if (pairCloseRejection.isClosePairFrac(p1, p2, magFieldTesla, femto_universe_container::EventType::same, confCPRDphiAvgOrDist, confCPRDistMax, confCPRFracMax, confIsCircularCut)) { - continue; + if (twotracksconfigs.confIsCPRkT) { + if (pairCloseRejection.isClosePairkT(p1, p2, femto_universe_container::EventType::same, kT, confIsCircularCut)) { + continue; + } + } else { + if (pairCloseRejection.isClosePairFrac(p1, p2, magFieldTesla, femto_universe_container::EventType::same, confCPRDphiAvgOrDist, confCPRDistMax, confCPRFracMax, confIsCircularCut)) { + continue; + } } } } @@ -922,15 +944,23 @@ struct femtoUniversePairTaskTrackTrackSpherHarMultKtExtended { } float kT = FemtoUniverseMath::getkT(p1, mass1, p2, mass2); + if (kT > ConfKtKstarBins.value.back() || kT < ConfKtKstarBins.value.front()) + continue; + if (twotracksconfigs.ConfIsCPR.value) { - pairCloseRejection.kTdetadphi(p1, p2, femto_universe_container::EventType::mixed, kT); if (confCPRIsAtITS.value) { if (pairCloseRejection.isClosePairAtITS(p1, p2, magFieldTesla, femto_universe_container::EventType::mixed)) { continue; } } else { - if (pairCloseRejection.isClosePairFrac(p1, p2, magFieldTesla, femto_universe_container::EventType::mixed, confCPRDphiAvgOrDist, confCPRDistMax, confCPRFracMax, confIsCircularCut)) { - continue; + if (twotracksconfigs.confIsCPRkT) { + if (pairCloseRejection.isClosePairkT(p1, p2, femto_universe_container::EventType::mixed, kT, confIsCircularCut)) { + continue; + } + } else { + if (pairCloseRejection.isClosePairFrac(p1, p2, magFieldTesla, femto_universe_container::EventType::mixed, confCPRDphiAvgOrDist, confCPRDistMax, confCPRFracMax, confIsCircularCut)) { + continue; + } } } }