From f4a998fe6d0eb8e702d1609937a6a9d3ff49b110 Mon Sep 17 00:00:00 2001 From: Francesca Ercolessi Date: Wed, 8 Apr 2026 14:42:27 +0200 Subject: [PATCH 1/3] fix isClosePair --- .../Tasks/Nuspex/hadronnucleicorrelation.cxx | 66 ++++++++++--------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx index 5aa01f018ab..a65336f5968 100644 --- a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx +++ b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx @@ -1,5 +1,5 @@ // Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// See https://alice-o2.web.cern.ch/copyright for drtails of the copyright holders. // All rights not expressly granted are reserved. // // This software is distributed under the terms of the GNU General Public @@ -73,7 +73,7 @@ enum Modes { kPPbar }; -struct hadronnucleicorrelation { +struct HadronNucleiCorrelation { static constexpr int betahasTOFthr = -100; @@ -91,10 +91,10 @@ struct hadronnucleicorrelation { Configurable fCorrectionPath{"fCorrectionPath", "", "Correction path to file"}; Configurable fCorrectionHisto{"fCorrectionHisto", "", "Correction histogram"}; - Configurable url{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; + Configurable cfgUrl{"ccdb-url", "http://alice-ccdb.cern.ch", "url of the ccdb repository"}; // Event selection - Configurable cutzvertex{"cutzvertex", 10.0, "|vertexZ| value limit"}; + Configurable cutzVertex{"cutzVertex", 10.0, "|vertexZ| value limit"}; // Track selection Configurable par0{"par0", 0.004, "par 0"}; @@ -122,8 +122,8 @@ struct hadronnucleicorrelation { Configurable min_itsNCls{"min_itsNCls", 0, "minimum allowed number of ITS clasters"}; Configurable maxmixcollsGen{"maxmixcollsGen", 100, "maxmixcollsGen"}; Configurable radiusTPC{"radiusTPC", 1.2, "TPC radius to calculate phi_star for"}; - Configurable deta{"deta", 0.01, "minimum allowed defference in eta between two tracks in a pair"}; - Configurable dphi{"dphi", 0.01, "minimum allowed defference in phi_star between two tracks in a pair"}; + Configurable dEta{"dEta", 0.01, "minimum allowed difference in eta between two tracks in a pair"}; + Configurable dPhi{"dPhi", 0.01, "minimum allowed difference in phi_star between two tracks in a pair"}; // Mixing parameters ConfigurableAxis confMultBins{"confMultBins", {VARIABLE_WIDTH, 0.0f, 4.0f, 8.0f, 12.0f, 16.0f, 20.0f, 24.0f, 28.0f, 50.0f, 100.0f, 99999.f}, "Mixing bins - multiplicity"}; @@ -147,12 +147,12 @@ struct hadronnucleicorrelation { HistogramRegistry QA{"QA"}; using trkType = const FilteredTracks::iterator*; - using trkTypeMC = const FilteredTracksMC::iterator*; + // using trkTypeMC = const FilteredTracksMC::iterator*; // typedef std::shared_ptr colType; // typedef std::shared_ptr MCcolType; std::unique_ptr> Pair = std::make_unique>(); - std::unique_ptr> PairMC = std::make_unique>(); + // std::unique_ptr> PairMC = std::make_unique>(); // Data histograms std::vector> hEtaPhi_SE; @@ -173,7 +173,7 @@ struct hadronnucleicorrelation { void init(o2::framework::InitContext&) { - ccdb->setURL(url.value); + ccdb->setURL(cfgUrl.value); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); @@ -207,25 +207,25 @@ struct hadronnucleicorrelation { TString name = "AntiDeAntiPr"; switch (mode) { - case 1: + case kDP: name = "DePr"; break; - case 2: + case kDbarP: name = "AntiDePr"; break; - case 3: + case kDPbar: name = "DeAntiPr"; break; - case 4: + case kPbarP: name = "AntiPrPr"; break; - case 5: + case kPbarPbar: name = "AntiPrAntiPr"; break; - case 6: + case kPP: name = "PrPr"; break; - case 7: + case kPPbar: name = "PrAntiPr"; break; } @@ -283,7 +283,7 @@ struct hadronnucleicorrelation { QA.add("QA/hnSigmaTOFVsPt_De", "n#sigma TOF vs p_{T} for d hypothesis (all tracks); p_{T} (GeV/c); n#sigma TOF", {HistType::kTH2D, {pTAxis, AxisNSigma}}); QA.add("QA/hnSigmaITSVsPt_Pr", "n#sigma ITS vs p_{T} for p hypothesis (all tracks); p_{T} (GeV/c); n#sigma ITS", {HistType::kTH2D, {pTAxis, AxisNSigma}}); QA.add("QA/hnSigmaITSVsPt_De", "n#sigma ITS vs p_{T} for d hypothesis (all tracks); p_{T} (GeV/c); n#sigma ITS", {HistType::kTH2D, {pTAxis, AxisNSigma}}); - QA.add("QA/hdetadphistar", ";dphi*;deta ", {HistType::kTH2D, {{101, -0.2, 0.2, "dphi*"}, {101, -0.2, 0.2, "deta"}}}); + QA.add("QA/hdEtadPhistar", ";dPhi*;dEta ", {HistType::kTH2D, {{101, -0.2, 0.2, "dPhi*"}, {101, -0.2, 0.2, "dEta"}}}); if (!isMC) { QA.add("QA/hEtaPr", Form("#eta ditribution for p"), {HistType::kTH1F, {etaAxis}}); @@ -415,7 +415,7 @@ struct hadronnucleicorrelation { } // Filters - Filter vertexFilter = nabs(o2::aod::singletrackselector::posZ) <= cutzvertex; + Filter vertexFilter = nabs(o2::aod::singletrackselector::posZ) <= cutzVertex; Filter trackFilter = o2::aod::singletrackselector::tpcNClsFound >= min_TPC_nClusters && o2::aod::singletrackselector::unPack(o2::aod::singletrackselector::storedTpcChi2NCl) <= max_chi2_TPC && o2::aod::singletrackselector::unPack(o2::aod::singletrackselector::storedTpcCrossedRowsOverFindableCls) >= min_TPC_nCrossedRowsOverFindableCls && @@ -560,8 +560,8 @@ struct hadronnucleicorrelation { { Pair->SetPair(&part0, &part1); Pair->SetIdentical(isIdentical); - if (isIdentical && Pair->IsClosePair(deta, dphi, radiusTPC)) { - QA.fill(HIST("QA/hdetadphistar"), Pair->GetPhiStarDiff(radiusTPC), Pair->GetEtaDiff()); + if (isIdentical && Pair->IsClosePair(dEta, dPhi, radiusTPC)) { + QA.fill(HIST("QA/hdEtadPhistar"), Pair->GetPhiStarDiff(radiusTPC), Pair->GetEtaDiff()); return; } @@ -684,7 +684,7 @@ struct hadronnucleicorrelation { void processSameEvent(FilteredCollisions::iterator const& collision, FilteredTracks const& tracks) { - if (std::abs(collision.posZ()) > cutzvertex) + if (std::abs(collision.posZ()) > cutzVertex) return; registry.fill(HIST("hNEvents"), 0.5); @@ -757,6 +757,9 @@ struct hadronnucleicorrelation { } } + Pair->SetMagField1(collision.magField()); + Pair->SetMagField2(collision.magField()); + if (mode == kPbarPbar || mode == kPP) { // Identical particle combinations for (const auto& [part0, part1] : combinations(CombinationsStrictlyUpperIndexPolicy(tracks, tracks))) { @@ -853,7 +856,7 @@ struct hadronnucleicorrelation { } } } - PROCESS_SWITCH(hadronnucleicorrelation, processSameEvent, "processSameEvent", true); + PROCESS_SWITCH(HadronNucleiCorrelation, processSameEvent, "processSameEvent", true); void processMixedEvent(FilteredCollisions const& collisions, FilteredTracks const& tracks) { @@ -872,6 +875,9 @@ struct hadronnucleicorrelation { continue; } + Pair->SetMagField1(magFieldTesla1); + Pair->SetMagField2(magFieldTesla2); + for (const auto& [part0, part1] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { if (part0.tpcFractionSharedCls() > max_tpcSharedCls) @@ -946,12 +952,12 @@ struct hadronnucleicorrelation { } } } - PROCESS_SWITCH(hadronnucleicorrelation, processMixedEvent, "processMixedEvent", true); + PROCESS_SWITCH(HadronNucleiCorrelation, processMixedEvent, "processMixedEvent", true); void processMC(FilteredCollisions const&, FilteredTracksMC const& tracks) { for (const auto& track : tracks) { - if (std::abs(track.template singleCollSel_as().posZ()) > cutzvertex) + if (std::abs(track.template singleCollSel_as().posZ()) > cutzVertex) continue; if (track.tpcFractionSharedCls() > max_tpcSharedCls) @@ -1312,12 +1318,12 @@ struct hadronnucleicorrelation { } } // track } - PROCESS_SWITCH(hadronnucleicorrelation, processMC, "processMC", false); + PROCESS_SWITCH(HadronNucleiCorrelation, processMC, "processMC", false); void processSameEventGen(SimCollisions::iterator const& mcCollision, SimParticles const& mcParticles) { - if (std::abs(mcCollision.posZ()) > cutzvertex) + if (std::abs(mcCollision.posZ()) > cutzVertex) return; registry.fill(HIST("Generated/hNEventsMC"), 0.5); @@ -1439,14 +1445,14 @@ struct hadronnucleicorrelation { } } } - PROCESS_SWITCH(hadronnucleicorrelation, processSameEventGen, "processSameEventGen", false); + PROCESS_SWITCH(HadronNucleiCorrelation, processSameEventGen, "processSameEventGen", false); void processMixedEventGen(SimCollisions const& mcCollisions, SimParticles const& mcParticles) { for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningGen, 5, -1, mcCollisions, mcCollisions)) { - // LOGF(info, "Mixed event collisions: (%d, %d) zvtx (%.1f, %.1f) mult (%d, %d)", collision1.globalIndex(), collision2.globalIndex(), collision1.posZ(), collision2.posZ(), collision1.mult(), collision2.mult()); + //LOGF(info, "Mixed event collisions: (%d, %d) zvtx (%.1f, %.1f) mult (%d, %d)", collision1.globalIndex(), collision2.globalIndex(), collision1.posZ(), collision2.posZ(), collision1.multMCNParticlesEta05(), collision2.multMCNParticlesEta05()); auto groupPartsOne = mcParticles.sliceByCached(o2::aod::mcparticle::mcCollisionId, collision1.globalIndex(), cache); auto groupPartsTwo = mcParticles.sliceByCached(o2::aod::mcparticle::mcCollisionId, collision2.globalIndex(), cache); @@ -1506,10 +1512,10 @@ struct hadronnucleicorrelation { } } } - PROCESS_SWITCH(hadronnucleicorrelation, processMixedEventGen, "processMixedEventGen", false); + PROCESS_SWITCH(HadronNucleiCorrelation, processMixedEventGen, "processMixedEventGen", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From b01b3e71898f5cf68db084325cba15dde819de4a Mon Sep 17 00:00:00 2001 From: Francesca Ercolessi Date: Wed, 8 Apr 2026 16:45:23 +0200 Subject: [PATCH 2/3] fix gen mixing --- .../Tasks/Nuspex/hadronnucleicorrelation.cxx | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx index a65336f5968..dc68db1cd16 100644 --- a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx +++ b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx @@ -87,7 +87,7 @@ struct HadronNucleiCorrelation { Configurable isMC{"isMC", false, "is MC"}; Configurable isMCGen{"isMCGen", false, "is isMCGen"}; Configurable isPrim{"isPrim", true, "is isPrim"}; - Configurable docorrection{"docorrection", false, "do efficiency correction"}; + Configurable doCorrection{"doCorrection", false, "do efficiency correction"}; Configurable fCorrectionPath{"fCorrectionPath", "", "Correction path to file"}; Configurable fCorrectionHisto{"fCorrectionHisto", "", "Correction histogram"}; @@ -103,9 +103,9 @@ struct HadronNucleiCorrelation { Configurable min_TPC_nCrossedRowsOverFindableCls{"min_TPC_nCrossedRowsOverFindableCls", 0.8, "n TPC Crossed Rows Over Findable Cls"}; Configurable max_chi2_TPC{"max_chi2_TPC", 4.0f, "maximum TPC chi^2/Ncls"}; Configurable max_chi2_ITS{"max_chi2_ITS", 36.0f, "maximum ITS chi^2/Ncls"}; - Configurable etacut{"etacut", 0.8f, "eta cut"}; - Configurable max_dcaxy{"max_dcaxy", 0.14f, "Maximum DCAxy"}; - Configurable max_dcaz{"max_dcaz", 0.1f, "Maximum DCAz"}; + Configurable etaCut{"etaCut", 0.8f, "eta cut"}; + Configurable max_DCAxy{"max_DCAxy", 0.14f, "Maximum DCAxy"}; + Configurable max_DCAz{"max_DCAz", 0.1f, "Maximum DCAz"}; Configurable nsigmaTPC{"nsigmaTPC", 3.0f, "cut nsigma TPC"}; Configurable nsigmaElPr{"nsigmaElPr", 1.0f, "cut nsigma TPC El for protons"}; Configurable nsigmaElDe{"nsigmaElDe", 3.0f, "cut nsigma TPC El for protons"}; @@ -129,7 +129,7 @@ struct HadronNucleiCorrelation { ConfigurableAxis confMultBins{"confMultBins", {VARIABLE_WIDTH, 0.0f, 4.0f, 8.0f, 12.0f, 16.0f, 20.0f, 24.0f, 28.0f, 50.0f, 100.0f, 99999.f}, "Mixing bins - multiplicity"}; ConfigurableAxis confVtxBins{"confVtxBins", {VARIABLE_WIDTH, -10.0f, -8.f, -6.f, -4.f, -2.f, 0.f, 2.f, 4.f, 6.f, 8.f, 10.f}, "Mixing bins - z-vertex"}; ColumnBinningPolicy colBinning{{confVtxBins, confMultBins}, true}; - ColumnBinningPolicy colBinningGen{{confVtxBins, confMultBins}, true}; + ColumnBinningPolicy colBinningGen{{confVtxBins, confMultBins}, true}; // pT/A bins Configurable> pTBins{"pTBins", {0.6f, 1.0f, 1.2f, 2.f}, "p_{T} bins"}; @@ -179,7 +179,7 @@ struct HadronNucleiCorrelation { ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); ccdb->setFatalWhenNull(false); - if (docorrection) { + if (doCorrection) { GetCorrection(ccdb, TString(fCorrectionPath), TString(fCorrectionHisto)); } else { hEffpTEta_proton = nullptr; @@ -420,9 +420,9 @@ struct HadronNucleiCorrelation { o2::aod::singletrackselector::unPack(o2::aod::singletrackselector::storedTpcChi2NCl) <= max_chi2_TPC && o2::aod::singletrackselector::unPack(o2::aod::singletrackselector::storedTpcCrossedRowsOverFindableCls) >= min_TPC_nCrossedRowsOverFindableCls && o2::aod::singletrackselector::unPack(o2::aod::singletrackselector::storedItsChi2NCl) <= max_chi2_ITS && - nabs(o2::aod::singletrackselector::unPack(o2::aod::singletrackselector::storedDcaXY)) <= max_dcaxy && - nabs(o2::aod::singletrackselector::unPack(o2::aod::singletrackselector::storedDcaXY)) <= max_dcaz && - nabs(o2::aod::singletrackselector::eta) <= etacut; + nabs(o2::aod::singletrackselector::unPack(o2::aod::singletrackselector::storedDcaXY)) <= max_DCAxy && + nabs(o2::aod::singletrackselector::unPack(o2::aod::singletrackselector::storedDcaXY)) <= max_DCAz && + nabs(o2::aod::singletrackselector::eta) <= etaCut; template bool IsProton(Type const& track, int sign) @@ -575,7 +575,7 @@ struct HadronNucleiCorrelation { float corr0 = 1, corr1 = 1; - if (docorrection) { // Apply corrections + if (doCorrection) { // Apply corrections switch (mode) { case 0: corr0 = hEffpTEta_antideuteron->Interpolate(part0.pt(), part0.eta()); @@ -1354,7 +1354,7 @@ struct HadronNucleiCorrelation { registry.fill(HIST("Generated/hAntiDeuteronsVsPt"), particle.pt()); } - if (std::abs(particle.eta()) > etacut) { + if (std::abs(particle.eta()) > etaCut) { continue; } if (particle.pdgCode() == PDG_t::kProton) { @@ -1447,15 +1447,19 @@ struct HadronNucleiCorrelation { } PROCESS_SWITCH(HadronNucleiCorrelation, processSameEventGen, "processSameEventGen", false); + Preslice perMcCollision = o2::aod::mcparticle::mcCollisionId; + void processMixedEventGen(SimCollisions const& mcCollisions, SimParticles const& mcParticles) { for (const auto& [collision1, collision2] : soa::selfCombinations(colBinningGen, 5, -1, mcCollisions, mcCollisions)) { - //LOGF(info, "Mixed event collisions: (%d, %d) zvtx (%.1f, %.1f) mult (%d, %d)", collision1.globalIndex(), collision2.globalIndex(), collision1.posZ(), collision2.posZ(), collision1.multMCNParticlesEta05(), collision2.multMCNParticlesEta05()); + // LOGF(info, "Mixed event collisions: (%d, %d) zvtx (%.1f, %.1f) mult (%d, %d)", collision1.globalIndex(), collision2.globalIndex(), collision1.posZ(), collision2.posZ(), collision1.multMCNParticlesEta10(), collision2.multMCNParticlesEta10()); + + auto groupPartsOne = mcParticles.sliceBy(perMcCollision, collision1.globalIndex()); + auto groupPartsTwo = mcParticles.sliceBy(perMcCollision, collision2.globalIndex()); - auto groupPartsOne = mcParticles.sliceByCached(o2::aod::mcparticle::mcCollisionId, collision1.globalIndex(), cache); - auto groupPartsTwo = mcParticles.sliceByCached(o2::aod::mcparticle::mcCollisionId, collision2.globalIndex(), cache); + registry.fill(HIST("hMult"), collision1.multMCNParticlesEta10()); for (const auto& [part0, part1] : combinations(CombinationsFullIndexPolicy(groupPartsOne, groupPartsTwo))) { From 299e2e62d3d980ca705f3541c4febcbfb81cc034 Mon Sep 17 00:00:00 2001 From: Francesca Ercolessi Date: Wed, 8 Apr 2026 16:49:51 +0200 Subject: [PATCH 3/3] fix workflow name --- PWGLF/Tasks/Nuspex/CMakeLists.txt | 2 +- PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGLF/Tasks/Nuspex/CMakeLists.txt b/PWGLF/Tasks/Nuspex/CMakeLists.txt index 0609b38835e..71a38eb1c9f 100644 --- a/PWGLF/Tasks/Nuspex/CMakeLists.txt +++ b/PWGLF/Tasks/Nuspex/CMakeLists.txt @@ -114,7 +114,7 @@ o2physics_add_dpl_workflow(neutron-skin PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(hadronnucleicorrelation +o2physics_add_dpl_workflow(hadron-nuclei-correlation SOURCES hadronnucleicorrelation.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx index dc68db1cd16..2ae84cca68d 100644 --- a/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx +++ b/PWGLF/Tasks/Nuspex/hadronnucleicorrelation.cxx @@ -1,5 +1,5 @@ // Copyright 2019-2020 CERN and copyright holders of ALICE O2. -// See https://alice-o2.web.cern.ch/copyright for drtails of the copyright holders. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. // All rights not expressly granted are reserved. // // This software is distributed under the terms of the GNU General Public