From b2132e09b91053030619eb2aac0bd417db2da9b4 Mon Sep 17 00:00:00 2001 From: rspijkers Date: Thu, 18 Dec 2025 23:10:17 +0100 Subject: [PATCH 1/3] Fix const ref in loops Done by making dedicated function where we can swap the order of the cascades without swapping the tables themselves --- .../Tasks/Strangeness/cascadecorrelations.cxx | 318 +++++++++--------- 1 file changed, 163 insertions(+), 155 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx index e3201972259..0c3e610463e 100644 --- a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx +++ b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx @@ -625,6 +625,7 @@ struct CascadeCorrelations { Configurable doTFBorderCut{"doTFBorderCut", true, "Switch to apply TimeframeBorderCut event selection"}; Configurable doSel8{"doSel8", true, "Switch to apply sel8 event selection"}; Configurable INEL{"INEL", 0, "Number of charged tracks within |eta| < 1 has to be greater than value"}; // used in MC closure + Configurable etaGenCascades{"etaGenCascades", 0.8, "min/max of eta for generated cascades"}; ConfigurableAxis radiusAxis = {"radiusAxis", {100, 0.0f, 50.0f}, "cm"}; ConfigurableAxis cpaAxis = {"cpaAxis", {100, 0.95f, 1.0f}, "CPA"}; @@ -687,8 +688,8 @@ struct CascadeCorrelations { bool autoCorrelation(std::array triggerTracks, std::array assocTracks) { // function that loops over 2 arrays of track indices, checking for common elements - for (const int triggerTrack : triggerTracks) { - for (const int assocTrack : assocTracks) { + for (const int& triggerTrack : triggerTracks) { + for (const int& assocTrack : assocTracks) { if (triggerTrack == assocTrack) return true; } @@ -696,6 +697,147 @@ struct CascadeCorrelations { return false; } + template + void doSameEventCorrelation(const TCascade& trigger, const TCascade& assoc, const TCollision& collision){ + // autocorrelation check + std::array triggerTracks = {trigger.posTrackId(), trigger.negTrackId(), trigger.bachelorId()}; + std::array assocTracks = {assoc.posTrackId(), assoc.negTrackId(), assoc.bachelorId()}; + if (autoCorrelation(triggerTracks, assocTracks)) + return; + + // calculate angular correlations + double dphi = RecoDecay::constrainAngle(trigger.phi() - assoc.phi(), -PIHalf); + + double invMassXiTrigg = trigger.mXi(); + double invMassOmTrigg = trigger.mOmega(); + double invMassXiAssoc = assoc.mXi(); + double invMassOmAssoc = assoc.mOmega(); + + double weightTrigg = 1.; + double weightAssoc = 1.; + + if (trigger.isSelected() <= 2 && std::abs(trigger.yXi()) < maxRapidity) { // trigger Xi + if (doEfficiencyCorrection) + weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffXiMin, trigger.pt(), trigger.eta()) : getEfficiency(hEffXiPlus, trigger.pt(), trigger.eta()); + if (assoc.isSelected() <= 2 && std::abs(assoc.yXi()) < maxRapidity) { // assoc Xi + if (doEfficiencyCorrection) + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffXiPlus, assoc.pt(), assoc.eta()); + registry.fill(HIST("hXiXi"), dphi, trigger.yXi() - assoc.yXi(), trigger.sign(), assoc.sign(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, collision.posZ(), collision.centFT0M(), weightTrigg * weightAssoc); + } + if (assoc.isSelected() >= 2 && std::abs(assoc.yOmega()) < maxRapidity) { // assoc Omega + if (doEfficiencyCorrection) + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffOmegaPlus, assoc.pt(), assoc.eta()); + registry.fill(HIST("hXiOm"), dphi, trigger.yXi() - assoc.yOmega(), trigger.sign(), assoc.sign(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, collision.posZ(), collision.centFT0M(), weightTrigg * weightAssoc); + } + } + if (trigger.isSelected() >= 2 && std::abs(trigger.yOmega()) < maxRapidity) { // trigger Omega + if (doEfficiencyCorrection) + weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffOmegaMin, trigger.pt(), trigger.eta()) : getEfficiency(hEffOmegaPlus, trigger.pt(), trigger.eta()); + if (assoc.isSelected() <= 2 && std::abs(assoc.yXi()) < maxRapidity) { // assoc Xi + if (doEfficiencyCorrection) + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffXiPlus, assoc.pt(), assoc.eta()); + // if Omega-Xi, fill the Xi-Omega histogram (flip the trigger/assoc and dphy,dy signs) + registry.fill(HIST("hXiOm"), RecoDecay::constrainAngle(assoc.phi() - trigger.phi(), -PIHalf), -(trigger.yOmega() - assoc.yXi()), assoc.sign(), trigger.sign(), assoc.pt(), trigger.pt(), invMassXiAssoc, invMassOmTrigg, collision.posZ(), collision.centFT0M(), weightTrigg * weightAssoc); + } + if (assoc.isSelected() >= 2 && std::abs(assoc.yOmega()) < maxRapidity) { // assoc Omega + if (doEfficiencyCorrection) + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffOmegaPlus, assoc.pt(), assoc.eta()); + registry.fill(HIST("hOmOm"), dphi, trigger.yOmega() - assoc.yOmega(), trigger.sign(), assoc.sign(), trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, collision.posZ(), collision.centFT0M(), weightTrigg * weightAssoc); + } + } + + // QA plots + if (trigger.sign() * assoc.sign() < 0) { + registry.fill(HIST("hDeltaPhiOS"), dphi); + } else { + registry.fill(HIST("hDeltaPhiSS"), dphi); + } + } + + template + void doMixedEventCorrelation(const TCascade& trigger, const TCascade& assoc, const TCollision& col1){ + if (trigger.collisionId() == assoc.collisionId()) { + registry.fill(HIST("hMEQA"), 1.5); + return; + } + + std::array triggerTracks = {trigger.posTrackId(), trigger.negTrackId(), trigger.bachelorId()}; + std::array assocTracks = {assoc.posTrackId(), assoc.negTrackId(), assoc.bachelorId()}; + if (autoCorrelation(triggerTracks, assocTracks)) + return; + + double dphi = RecoDecay::constrainAngle(trigger.phi() - assoc.phi(), -PIHalf); + + double invMassXiTrigg = trigger.mXi(); + double invMassOmTrigg = trigger.mOmega(); + double invMassXiAssoc = assoc.mXi(); + double invMassOmAssoc = assoc.mOmega(); + + double weightTrigg = 1.; + double weightAssoc = 1.; + + if (trigger.isSelected() <= 2 && std::abs(trigger.yXi()) < maxRapidity) { // trigger Xi + if (doEfficiencyCorrection) + weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffXiMin, trigger.pt(), trigger.eta()) : getEfficiency(hEffXiPlus, trigger.pt(), trigger.eta()); + if (assoc.isSelected() <= 2 && std::abs(assoc.yXi()) < maxRapidity) { // assoc Xi + if (doEfficiencyCorrection) + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffXiPlus, assoc.pt(), assoc.eta()); + registry.fill(HIST("MixedEvents/hMEXiXi"), dphi, trigger.yXi() - assoc.yXi(), trigger.sign(), assoc.sign(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, col1.posZ(), col1.centFT0M(), weightTrigg * weightAssoc); + } + if (assoc.isSelected() >= 2 && std::abs(assoc.yOmega()) < maxRapidity) { // assoc Omega + if (doEfficiencyCorrection) + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffOmegaPlus, assoc.pt(), assoc.eta()); + registry.fill(HIST("MixedEvents/hMEXiOm"), dphi, trigger.yXi() - assoc.yOmega(), trigger.sign(), assoc.sign(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, col1.posZ(), col1.centFT0M(), weightTrigg * weightAssoc); + } + } + if (trigger.isSelected() >= 2 && std::abs(trigger.yOmega()) < maxRapidity) { // trigger Omega + if (doEfficiencyCorrection) + weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffOmegaMin, trigger.pt(), trigger.eta()) : getEfficiency(hEffOmegaPlus, trigger.pt(), trigger.eta()); + if (assoc.isSelected() <= 2 && std::abs(assoc.yXi()) < maxRapidity) { // assoc Xi + if (doEfficiencyCorrection) + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffXiPlus, assoc.pt(), assoc.eta()); + // if Omega-Xi, fill the Xi-Omega histogram (flip the trigger/assoc and dphy,dy signs) + registry.fill(HIST("MixedEvents/hMEXiOm"), RecoDecay::constrainAngle(assoc.phi() - trigger.phi(), -PIHalf), -(trigger.yOmega() - assoc.yXi()), assoc.sign(), trigger.sign(), assoc.pt(), trigger.pt(), invMassXiAssoc, invMassOmTrigg, col1.posZ(), col1.centFT0M(), weightTrigg * weightAssoc); + } + if (assoc.isSelected() >= 2 && std::abs(assoc.yOmega()) < maxRapidity) { // assoc Omega + if (doEfficiencyCorrection) + weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffOmegaPlus, assoc.pt(), assoc.eta()); + registry.fill(HIST("MixedEvents/hMEOmOm"), dphi, trigger.yOmega() - assoc.yOmega(), trigger.sign(), assoc.sign(), trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, col1.posZ(), col1.centFT0M(), weightTrigg * weightAssoc); + } + } + + // QA plots + if (trigger.sign() * assoc.sign() < 0) { + registry.fill(HIST("MixedEvents/hMEDeltaPhiOS"), dphi); + } else { + registry.fill(HIST("MixedEvents/hMEDeltaPhiSS"), dphi); + } + } + + template + void doMCCorrelation(const TCascade& trigger, const TCascade& assoc, double vtxz, int FT0mult){ + if (!trigger.isPhysicalPrimary() || !assoc.isPhysicalPrimary()) + return; // require the cascades to be primaries + if (std::abs(trigger.eta()) > etaGenCascades) + return; // only apply eta cut to trigger - trigger normalization still valid without introducing 2-particle-acceptance effects + + double dphi = RecoDecay::constrainAngle(trigger.phi() - assoc.phi(), -PIHalf); + + if (trigger.pdgCode() < 0) { // anti-trigg --> Plus + if (assoc.pdgCode() < 0) { // anti-assoc --> Plus + registry.fill(HIST("MC/hMCPlusPlus"), dphi, trigger.y() - assoc.y(), trigger.pt(), assoc.pt(), vtxz, FT0mult); + } else { // assoc --> Minus + registry.fill(HIST("MC/hMCPlusMinus"), dphi, trigger.y() - assoc.y(), trigger.pt(), assoc.pt(), vtxz, FT0mult); + } + } else { // trig --> Minus + if (assoc.pdgCode() < 0) { // anti-assoc --> Plus + registry.fill(HIST("MC/hMCMinusPlus"), dphi, trigger.y() - assoc.y(), trigger.pt(), assoc.pt(), vtxz, FT0mult); + } else { + registry.fill(HIST("MC/hMCMinusMinus"), dphi, trigger.y() - assoc.y(), trigger.pt(), assoc.pt(), vtxz, FT0mult); + } + } + } + HistogramRegistry registry{ "registry", { @@ -851,68 +993,13 @@ struct CascadeCorrelations { registry.fill(HIST("hEta"), casc.eta()); } // casc loop - for (auto& [c0, c1] : combinations(Cascades, Cascades)) { // combinations automatically applies strictly upper in case of 2 identical tables - // Define the trigger as the particle with the highest pT. As we can't swap the cascade tables themselves, we swap the addresses and later dereference them - auto* triggerAddress = &c0; - auto* assocAddress = &c1; - if (assocAddress->pt() > triggerAddress->pt()) { - std::swap(triggerAddress, assocAddress); - } - auto trigger = *triggerAddress; - auto assoc = *assocAddress; - - // autocorrelation check - std::array triggerTracks = {trigger.posTrackId(), trigger.negTrackId(), trigger.bachelorId()}; - std::array assocTracks = {assoc.posTrackId(), assoc.negTrackId(), assoc.bachelorId()}; - if (autoCorrelation(triggerTracks, assocTracks)) - continue; - - // calculate angular correlations - double dphi = RecoDecay::constrainAngle(trigger.phi() - assoc.phi(), -PIHalf); - - double invMassXiTrigg = trigger.mXi(); - double invMassOmTrigg = trigger.mOmega(); - double invMassXiAssoc = assoc.mXi(); - double invMassOmAssoc = assoc.mOmega(); - - double weightTrigg = 1.; - double weightAssoc = 1.; - - if (trigger.isSelected() <= 2 && std::abs(trigger.yXi()) < maxRapidity) { // trigger Xi - if (doEfficiencyCorrection) - weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffXiMin, trigger.pt(), trigger.eta()) : getEfficiency(hEffXiPlus, trigger.pt(), trigger.eta()); - if (assoc.isSelected() <= 2 && std::abs(assoc.yXi()) < maxRapidity) { // assoc Xi - if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffXiPlus, assoc.pt(), assoc.eta()); - registry.fill(HIST("hXiXi"), dphi, trigger.yXi() - assoc.yXi(), trigger.sign(), assoc.sign(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, collision.posZ(), collision.centFT0M(), weightTrigg * weightAssoc); - } - if (assoc.isSelected() >= 2 && std::abs(assoc.yOmega()) < maxRapidity) { // assoc Omega - if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffOmegaPlus, assoc.pt(), assoc.eta()); - registry.fill(HIST("hXiOm"), dphi, trigger.yXi() - assoc.yOmega(), trigger.sign(), assoc.sign(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, collision.posZ(), collision.centFT0M(), weightTrigg * weightAssoc); - } - } - if (trigger.isSelected() >= 2 && std::abs(trigger.yOmega()) < maxRapidity) { // trigger Omega - if (doEfficiencyCorrection) - weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffOmegaMin, trigger.pt(), trigger.eta()) : getEfficiency(hEffOmegaPlus, trigger.pt(), trigger.eta()); - if (assoc.isSelected() <= 2 && std::abs(assoc.yXi()) < maxRapidity) { // assoc Xi - if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffXiPlus, assoc.pt(), assoc.eta()); - // if Omega-Xi, fill the Xi-Omega histogram (flip the trigger/assoc and dphy,dy signs) - registry.fill(HIST("hXiOm"), RecoDecay::constrainAngle(assoc.phi() - trigger.phi(), -PIHalf), -(trigger.yOmega() - assoc.yXi()), assoc.sign(), trigger.sign(), assoc.pt(), trigger.pt(), invMassXiAssoc, invMassOmTrigg, collision.posZ(), collision.centFT0M(), weightTrigg * weightAssoc); - } - if (assoc.isSelected() >= 2 && std::abs(assoc.yOmega()) < maxRapidity) { // assoc Omega - if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffOmegaPlus, assoc.pt(), assoc.eta()); - registry.fill(HIST("hOmOm"), dphi, trigger.yOmega() - assoc.yOmega(), trigger.sign(), assoc.sign(), trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, collision.posZ(), collision.centFT0M(), weightTrigg * weightAssoc); - } - } - - // QA plots - if (trigger.sign() * assoc.sign() < 0) { - registry.fill(HIST("hDeltaPhiOS"), dphi); + for (const auto& [c0, c1] : combinations(Cascades, Cascades)) { // combinations automatically applies strictly upper in case of 2 identical tables + // Define the trigger as the particle with the highest pT. + // As we can't swap the cascade tables themselves, we have created a function that we can call with the correct order. + if (c0.pt() >= c1.pt()) { + doSameEventCorrelation(c0, c1, collision); } else { - registry.fill(HIST("hDeltaPhiSS"), dphi); + doSameEventCorrelation(c1, c0, collision); } } // correlations } // process same event @@ -934,77 +1021,20 @@ struct CascadeCorrelations { registry.fill(HIST("MixedEvents/hMEVz1"), col1.posZ()); registry.fill(HIST("MixedEvents/hMEVz2"), col2.posZ()); - for (auto& [casc1, casc2] : combinations(CombinationsFullIndexPolicy(cascades1, cascades2))) { + for (const auto& [casc1, casc2] : combinations(CombinationsFullIndexPolicy(cascades1, cascades2))) { // specify FullIndexPolicy since the cascades are from different collisions - auto* triggerAddress = &casc1; - auto* assocAddress = &casc2; - if (assocAddress->pt() > triggerAddress->pt()) { - std::swap(triggerAddress, assocAddress); - } - auto trigger = *triggerAddress; - auto assoc = *assocAddress; - - if (trigger.collisionId() == assoc.collisionId()) { - registry.fill(HIST("hMEQA"), 1.5); - continue; - } - - std::array triggerTracks = {trigger.posTrackId(), trigger.negTrackId(), trigger.bachelorId()}; - std::array assocTracks = {assoc.posTrackId(), assoc.negTrackId(), assoc.bachelorId()}; - if (autoCorrelation(triggerTracks, assocTracks)) - continue; - - double dphi = RecoDecay::constrainAngle(trigger.phi() - assoc.phi(), -PIHalf); - - double invMassXiTrigg = trigger.mXi(); - double invMassOmTrigg = trigger.mOmega(); - double invMassXiAssoc = assoc.mXi(); - double invMassOmAssoc = assoc.mOmega(); - double weightTrigg = 1.; - double weightAssoc = 1.; - - if (trigger.isSelected() <= 2 && std::abs(trigger.yXi()) < maxRapidity) { // trigger Xi - if (doEfficiencyCorrection) - weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffXiMin, trigger.pt(), trigger.eta()) : getEfficiency(hEffXiPlus, trigger.pt(), trigger.eta()); - if (assoc.isSelected() <= 2 && std::abs(assoc.yXi()) < maxRapidity) { // assoc Xi - if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffXiPlus, assoc.pt(), assoc.eta()); - registry.fill(HIST("MixedEvents/hMEXiXi"), dphi, trigger.yXi() - assoc.yXi(), trigger.sign(), assoc.sign(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassXiAssoc, col1.posZ(), col1.centFT0M(), weightTrigg * weightAssoc); - } - if (assoc.isSelected() >= 2 && std::abs(assoc.yOmega()) < maxRapidity) { // assoc Omega - if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffOmegaPlus, assoc.pt(), assoc.eta()); - registry.fill(HIST("MixedEvents/hMEXiOm"), dphi, trigger.yXi() - assoc.yOmega(), trigger.sign(), assoc.sign(), trigger.pt(), assoc.pt(), invMassXiTrigg, invMassOmAssoc, col1.posZ(), col1.centFT0M(), weightTrigg * weightAssoc); - } - } - if (trigger.isSelected() >= 2 && std::abs(trigger.yOmega()) < maxRapidity) { // trigger Omega - if (doEfficiencyCorrection) - weightTrigg = trigger.sign() < 0 ? getEfficiency(hEffOmegaMin, trigger.pt(), trigger.eta()) : getEfficiency(hEffOmegaPlus, trigger.pt(), trigger.eta()); - if (assoc.isSelected() <= 2 && std::abs(assoc.yXi()) < maxRapidity) { // assoc Xi - if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffXiMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffXiPlus, assoc.pt(), assoc.eta()); - // if Omega-Xi, fill the Xi-Omega histogram (flip the trigger/assoc and dphy,dy signs) - registry.fill(HIST("MixedEvents/hMEXiOm"), RecoDecay::constrainAngle(assoc.phi() - trigger.phi(), -PIHalf), -(trigger.yOmega() - assoc.yXi()), assoc.sign(), trigger.sign(), assoc.pt(), trigger.pt(), invMassXiAssoc, invMassOmTrigg, col1.posZ(), col1.centFT0M(), weightTrigg * weightAssoc); - } - if (assoc.isSelected() >= 2 && std::abs(assoc.yOmega()) < maxRapidity) { // assoc Omega - if (doEfficiencyCorrection) - weightAssoc = assoc.sign() < 0 ? getEfficiency(hEffOmegaMin, assoc.pt(), assoc.eta()) : getEfficiency(hEffOmegaPlus, assoc.pt(), assoc.eta()); - registry.fill(HIST("MixedEvents/hMEOmOm"), dphi, trigger.yOmega() - assoc.yOmega(), trigger.sign(), assoc.sign(), trigger.pt(), assoc.pt(), invMassOmTrigg, invMassOmAssoc, col1.posZ(), col1.centFT0M(), weightTrigg * weightAssoc); - } - } - - // QA plots - if (trigger.sign() * assoc.sign() < 0) { - registry.fill(HIST("MixedEvents/hMEDeltaPhiOS"), dphi); + // Define the trigger as the particle with the highest pT. + // As we can't swap the cascade tables themselves, we have created a function that we can call with the correct order. + if(casc1.pt() >= casc2.pt()) { + doMixedEventCorrelation(casc1, casc2, col1); } else { - registry.fill(HIST("MixedEvents/hMEDeltaPhiSS"), dphi); + doMixedEventCorrelation(casc2, casc1, col2); } } // correlations } // collisions } // process mixed events - Configurable etaGenCascades{"etaGenCascades", 0.8, "min/max of eta for generated cascades"}; Filter genCascadesFilter = nabs(aod::mcparticle::pdgCode) == static_cast(kXiMinus); void processMC(aod::McCollision const& mcCollision, soa::SmallGroups> const& collisions, soa::Filtered const& genCascades, aod::McParticles const& mcParticles) @@ -1040,35 +1070,13 @@ struct CascadeCorrelations { registry.fill(HIST("MC/hRapidity"), casc.y()); } - for (auto& [c0, c1] : combinations(genCascades, genCascades)) { // combinations automatically applies strictly upper in case of 2 identical tables - // Define the trigger as the particle with the highest pT. As we can't swap the cascade tables themselves, we swap the addresses and later dereference them - auto* triggerAddress = &c0; - auto* assocAddress = &c1; - if (assocAddress->pt() > triggerAddress->pt()) { - std::swap(triggerAddress, assocAddress); - } - auto trigger = *triggerAddress; - auto assoc = *assocAddress; - - if (!trigger.isPhysicalPrimary() || !assoc.isPhysicalPrimary()) - continue; // require the cascades to be primaries - if (std::abs(trigger.eta()) > etaGenCascades) - continue; // only apply eta cut to trigger - trigger normalization still valid without introducing 2-particle-acceptance effects - - double dphi = RecoDecay::constrainAngle(trigger.phi() - assoc.phi(), -PIHalf); - - if (trigger.pdgCode() < 0) { // anti-trigg --> Plus - if (assoc.pdgCode() < 0) { // anti-assoc --> Plus - registry.fill(HIST("MC/hMCPlusPlus"), dphi, trigger.y() - assoc.y(), trigger.pt(), assoc.pt(), vtxz, FT0mult); - } else { // assoc --> Minus - registry.fill(HIST("MC/hMCPlusMinus"), dphi, trigger.y() - assoc.y(), trigger.pt(), assoc.pt(), vtxz, FT0mult); - } - } else { // trig --> Minus - if (assoc.pdgCode() < 0) { // anti-assoc --> Plus - registry.fill(HIST("MC/hMCMinusPlus"), dphi, trigger.y() - assoc.y(), trigger.pt(), assoc.pt(), vtxz, FT0mult); - } else { - registry.fill(HIST("MC/hMCMinusMinus"), dphi, trigger.y() - assoc.y(), trigger.pt(), assoc.pt(), vtxz, FT0mult); - } + for (const auto& [c0, c1] : combinations(genCascades, genCascades)) { // combinations automatically applies strictly upper in case of 2 identical tables + // Define the trigger as the particle with the highest pT. + // As we can't swap the cascade tables themselves, we have created a function that we can call with the correct order. + if (c0.pt() >= c1.pt()) { + doMCCorrelation(c0, c1, vtxz, FT0mult); + } else { + doMCCorrelation(c1, c0, vtxz, FT0mult); } } } From be2cb42969dc613c2ccb5f27f44072c4903798ab Mon Sep 17 00:00:00 2001 From: ALICE Builder Date: Thu, 18 Dec 2025 23:12:22 +0100 Subject: [PATCH 2/3] Please consider the following formatting changes (#19) --- PWGLF/Tasks/Strangeness/cascadecorrelations.cxx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx index 0c3e610463e..f37860281b7 100644 --- a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx +++ b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx @@ -698,7 +698,8 @@ struct CascadeCorrelations { } template - void doSameEventCorrelation(const TCascade& trigger, const TCascade& assoc, const TCollision& collision){ + void doSameEventCorrelation(const TCascade& trigger, const TCascade& assoc, const TCollision& collision) + { // autocorrelation check std::array triggerTracks = {trigger.posTrackId(), trigger.negTrackId(), trigger.bachelorId()}; std::array assocTracks = {assoc.posTrackId(), assoc.negTrackId(), assoc.bachelorId()}; @@ -755,7 +756,8 @@ struct CascadeCorrelations { } template - void doMixedEventCorrelation(const TCascade& trigger, const TCascade& assoc, const TCollision& col1){ + void doMixedEventCorrelation(const TCascade& trigger, const TCascade& assoc, const TCollision& col1) + { if (trigger.collisionId() == assoc.collisionId()) { registry.fill(HIST("hMEQA"), 1.5); return; @@ -815,7 +817,8 @@ struct CascadeCorrelations { } template - void doMCCorrelation(const TCascade& trigger, const TCascade& assoc, double vtxz, int FT0mult){ + void doMCCorrelation(const TCascade& trigger, const TCascade& assoc, double vtxz, int FT0mult) + { if (!trigger.isPhysicalPrimary() || !assoc.isPhysicalPrimary()) return; // require the cascades to be primaries if (std::abs(trigger.eta()) > etaGenCascades) @@ -994,7 +997,7 @@ struct CascadeCorrelations { } // casc loop for (const auto& [c0, c1] : combinations(Cascades, Cascades)) { // combinations automatically applies strictly upper in case of 2 identical tables - // Define the trigger as the particle with the highest pT. + // Define the trigger as the particle with the highest pT. // As we can't swap the cascade tables themselves, we have created a function that we can call with the correct order. if (c0.pt() >= c1.pt()) { doSameEventCorrelation(c0, c1, collision); @@ -1026,7 +1029,7 @@ struct CascadeCorrelations { // Define the trigger as the particle with the highest pT. // As we can't swap the cascade tables themselves, we have created a function that we can call with the correct order. - if(casc1.pt() >= casc2.pt()) { + if (casc1.pt() >= casc2.pt()) { doMixedEventCorrelation(casc1, casc2, col1); } else { doMixedEventCorrelation(casc2, casc1, col2); From 1e7b463638b8c75eb80da6f5bd646ce366074941 Mon Sep 17 00:00:00 2001 From: rspijkers Date: Fri, 19 Dec 2025 12:59:04 +0100 Subject: [PATCH 3/3] remove some unnecessary headers --- PWGLF/Tasks/Strangeness/cascadecorrelations.cxx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx index 0c3e610463e..06f38873361 100644 --- a/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx +++ b/PWGLF/Tasks/Strangeness/cascadecorrelations.cxx @@ -18,8 +18,6 @@ #include "PWGLF/DataModel/LFStrangenessTables.h" #include "PWGLF/Utils/inelGt.h" -#include "Common/Core/RecoDecay.h" -#include "Common/Core/TrackSelection.h" #include "Common/Core/Zorro.h" #include "Common/Core/trackUtilities.h" #include "Common/DataModel/Centrality.h" @@ -36,11 +34,9 @@ #include "Framework/runDataProcessing.h" #include "ReconstructionDataFormats/Track.h" -#include #include #include #include -#include #include #include @@ -49,7 +45,6 @@ #include #include #include -// #include using namespace o2; using namespace o2::soa;