From d9c2565c274a27948d113189df2553b6c2f61c9b Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Tue, 14 Jul 2026 18:44:29 +0900 Subject: [PATCH 1/8] adding hadron-lambda correlations --- .../Strangeness/lambdaTwoPartPolarization.cxx | 152 +++++++++++++++++- 1 file changed, 145 insertions(+), 7 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx index 71ba4a84e19..939baaa41c1 100644 --- a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx @@ -14,6 +14,7 @@ #include "PWGLF/DataModel/LFStrangenessTables.h" #include "Common/CCDB/EventSelectionParams.h" +#include "Common/Core/RecoDecay.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/Multiplicity.h" @@ -108,6 +109,11 @@ struct lambdaTwoPartPolarization { Configurable cfgDaughPrPt{"cfgDaughPrPt", 0.5, "minimum daughter proton pt"}; Configurable cfgDaughPiPt{"cfgDaughPiPt", 0.2, "minimum daughter pion pt"}; + Configurable cfgTrackPtMin{"cfgTrackPtMin", 0.2, "minimum primary track pT selection"}; + Configurable cfgTrackPtMax{"cfgTrackPtMax", 3., "minimum primary track pT selection"}; + Configurable cfgTrackEtaMax{"cfgTrackEtaMax", 0.8, "maximum primary track Eta selection"}; + Configurable cfgMinTPCClustersTrack{"cfgMinTPCClustersTrack", 70, "minimum primary tpc track ncluster selection"}; + Configurable cfgHypMassWindow{"cfgHypMassWindow", 0.005, "single lambda mass selection"}; Configurable cfgEffCor{"cfgEffCor", false, "flag to apply efficiency correction"}; @@ -166,6 +172,10 @@ struct lambdaTwoPartPolarization { histos.add("Ana/SignalCos2", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, cosSigAxis}}); histos.add("Ana/Acceptance", "", {HistType::kTHnSparseF, {ptAxis, centAxis, RapAxis, cosAccAxis}}); + histos.add("AnaHL/SignalSin2", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, cosSigAxis}}); + histos.add("AnaHL/SignalCos2", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, cosSigAxis}}); + histos.add("AnaHL/Ref", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis}}); + fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); fMultPVCutLow->SetParameters(2834.66, -87.0127, 0.915126, -0.00330136, 332.513, -12.3476, 0.251663, -0.00272819, 1.12242e-05); fMultPVCutHigh = new TF1("fMultPVCutHigh", "[0]+[1]*x+[2]*x*x+[3]*x*x*x + 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); @@ -218,7 +228,7 @@ struct lambdaTwoPartPolarization { } // event selection template - bool SelectionV0(TCollision const& collision, V0 const& candidate, int LambdaTag) + bool selectionV0(TCollision const& collision, V0 const& candidate, int LambdaTag) { if (candidate.v0radius() < cfgv0radiusMin) return false; @@ -270,6 +280,107 @@ struct lambdaTwoPartPolarization { return true; } + template + bool selectTrack(Track const& track) + { + if (!track.isGlobalTrack()) { + return false; + } + if (track.pt() < cfgTrackPtMin || track.pt() > cfgTrackPtMax) { + return false; + } + if (std::abs(track.eta()) > cfgTrackEtaMax) { + return false; + } + if (track.tpcNClsFound() < cfgMinTPCClustersTrack) { + return false; + } + return true; + } + + template + void FillHistogramsRef(Trk1 const& trks1, Trk2 const& trks2) + { + for (auto& trk1 : trks1) { + if (!selectTrack(trk1)) { + continue; + } + for (auto& trk2 : trks2) { + if (!selectTrack(trk2)) { + continue; + } + + if (trk1.globalIndex() >= trk2.globalIndex()) { + continue; + } + + histos.fill(HIST("AnaHL/Ref"), trk1.pt(), trk2.pt(), trk1.eta() - trk2.eta(), RecoDecay::constrainAngle(trk1.phi() - trk2.phi(), -constants::math::PI * 0.5), centrality); + } + } + } + + template + void FillHistogramsLH(C const& c1, V0 const& v0s, Trk const& trks) + { + for (auto& trk : trks) { + if (!selectTrack(trk)) { + continue; + } + + for (auto& v01 : v0s) { + auto postrack_v01 = v01.template posTrack_as(); + auto negtrack_v01 = v01.template negTrack_as(); + + int LambdaTag = 0; + int aLambdaTag = 0; + + if (isSelectedV0Daughter(postrack_v01, 0) && isSelectedV0Daughter(negtrack_v01, 1)) { + LambdaTag = 1; + } + if (isSelectedV0Daughter(negtrack_v01, 0) && isSelectedV0Daughter(postrack_v01, 1)) { + aLambdaTag = 1; + } + + if (postrack_v01.globalIndex() == trk.globalIndex() || negtrack_v01.globalIndex() == trk.globalIndex()) { + continue; + } + + if (LambdaTag == aLambdaTag) + continue; + + if (!selectionV0(c1, v01, LambdaTag)) + continue; + + if (LambdaTag) { + ProtonVec1 = ROOT::Math::PxPyPzMVector(v01.pxpos(), v01.pypos(), v01.pzpos(), massPr); + PionVec1 = ROOT::Math::PxPyPzMVector(v01.pxneg(), v01.pyneg(), v01.pzneg(), massPi); + V01Tag = 0; + } + if (aLambdaTag) { + ProtonVec1 = ROOT::Math::PxPyPzMVector(v01.pxneg(), v01.pyneg(), v01.pzneg(), massPr); + PionVec1 = ROOT::Math::PxPyPzMVector(v01.pxpos(), v01.pypos(), v01.pzpos(), massPi); + V01Tag = 1; + } + + LambdaVec1 = ProtonVec1 + PionVec1; + LambdaVec1.SetM(massLambda); + + ROOT::Math::Boost boost1{LambdaVec1.BoostToCM()}; + ProtonBoostedVec1 = boost1(ProtonVec1); + + costhetastar1 = ProtonBoostedVec1.Pz() / ProtonBoostedVec1.P(); + dphi = RecoDecay::constrainAngle(v01.phi() - trk.phi(), -constants::math::PI * 0.5); + + weight = 1.0; + weight *= cfgEffCor ? 1.0 / EffMap->GetBinContent(EffMap->GetXaxis()->FindBin(v01.pt()), EffMap->GetYaxis()->FindBin(centrality)) : 1.; + weight *= cfgAccCor ? 1.0 / AccMap->GetBinContent(AccMap->GetXaxis()->FindBin(v01.pt()), AccMap->GetYaxis()->FindBin(v01.yLambda())) : 1.; + + histos.fill(HIST("AnaHL/SignalSin2"), trk.pt(), v01.pt(), v01.yLambda() - trk.eta(), dphi, centrality, costhetastar1 * std::sin(2.0 * dphi) * weight); + histos.fill(HIST("AnaHL/SignalCos2"), trk.pt(), v01.pt(), v01.yLambda() - trk.eta(), dphi, centrality, costhetastar1 * std::cos(2.0 * dphi) * weight); + } + } + } + template void FillHistograms(C1 const& c1, C2 const& c2, V01 const& V01s, V02 const& V02s) { @@ -290,7 +401,7 @@ struct lambdaTwoPartPolarization { if (LambdaTag == aLambdaTag) continue; - if (!SelectionV0(c1, v01, LambdaTag)) + if (!selectionV0(c1, v01, LambdaTag)) continue; if (LambdaTag) { @@ -332,7 +443,7 @@ struct lambdaTwoPartPolarization { if (LambdaTag == aLambdaTag) continue; - if (!SelectionV0(c2, v02, LambdaTag)) + if (!selectionV0(c2, v02, LambdaTag)) continue; if (doprocessDataSame) { @@ -368,10 +479,7 @@ struct lambdaTwoPartPolarization { weight *= -1.0; } - dphi = TVector2::Phi_0_2pi(v01.phi() - v02.phi()); - if (dphi > constants::math::PI * 1.5) { - dphi -= constants::math::PI * 2.0; - } + dphi = RecoDecay::constrainAngle(v01.phi() - v02.phi(), -constants::math::PI * 0.5); histos.fill(HIST("Ana/Signal"), v01.pt(), v02.pt(), v01.yLambda() - v02.yLambda(), dphi, centrality, costhetastar1 * costhetastar2 * weight); histos.fill(HIST("Ana/SignalCos2"), v01.pt(), v02.pt(), v01.yLambda() - v02.yLambda(), dphi, centrality, costhetastar1 * costhetastar2 * std::cos(2.0 * dphi) * weight); @@ -379,6 +487,36 @@ struct lambdaTwoPartPolarization { } } + void processDataSameHadron(EventCandidates::iterator const& collision, + TrackCandidates const& tracks, aod::V0Datas const& V0s, + aod::BCsWithTimestamps const&) + { + if (cfgCentEst == 1) { + centrality = collision.centFT0C(); + } else if (cfgCentEst == 2) { + centrality = collision.centFT0M(); + } + if (!eventSelected(collision) && cfgEvtSel) { + return; + } + + histos.fill(HIST("QA/CentDist"), centrality, 1.0); + histos.fill(HIST("QA/PVzDist"), collision.posZ(), 1.0); + + auto bc = collision.bc_as(); + if (cfgEffCor) { + EffMap = ccdb->getForTimeStamp(cfgEffCorPath.value, bc.timestamp()); + } + if (cfgAccCor) { + AccMap = ccdb->getForTimeStamp(cfgAccCorPath.value, bc.timestamp()); + } + +// FillHistograms(collision, collision, V0s, V0s); + FillHistogramsRef(tracks, tracks); + FillHistogramsLH(collision, V0s, tracks); + } + PROCESS_SWITCH(lambdaTwoPartPolarization, processDataSameHadron, "Process event for same data with hadrons", true); + void processDataSame(EventCandidates::iterator const& collision, TrackCandidates const& /*tracks*/, aod::V0Datas const& V0s, aod::BCsWithTimestamps const&) From 538bbca479aad12ff7f1353824e6d416d834e0cd Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Tue, 14 Jul 2026 20:12:06 +0900 Subject: [PATCH 2/8] fix linter --- .../Strangeness/lambdaTwoPartPolarization.cxx | 115 +++++++++++------- 1 file changed, 73 insertions(+), 42 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx index 939baaa41c1..539535c2d69 100644 --- a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx @@ -42,7 +42,6 @@ #include #include #include -#include #include #include @@ -75,7 +74,7 @@ struct lambdaTwoPartPolarization { std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; } cfgCcdbParam; - Service ccdb; + Service ccdb = nullptr; o2::ccdb::CcdbApi ccdbApi; Configurable cfgCentSel{"cfgCentSel", 100., "Centrality selection"}; @@ -140,9 +139,9 @@ struct lambdaTwoPartPolarization { TF1* fMultPVCutLow = nullptr; TF1* fMultPVCutHigh = nullptr; - float centrality; - float dphi; - float weight; + float centrality = 1.; + float dphi = 1.; + float weight = 1.; TProfile2D* EffMap = nullptr; TProfile2D* AccMap = nullptr; @@ -194,13 +193,13 @@ struct lambdaTwoPartPolarization { ROOT::Math::PxPyPzMVector ProtonVec1, PionVec1, LambdaVec1, ProtonBoostedVec1, PionBoostedVec1; ROOT::Math::PxPyPzMVector ProtonVec2, PionVec2, LambdaVec2, ProtonBoostedVec2, PionBoostedVec2; - int V01Tag; - int V02Tag; - double costhetastar1; - double costhetastar2; + int V01Tag = 1; + int V02Tag = 1; + double costhetastar1 = 0.0; + double costhetastar2 = 0.0; template - bool eventSelected(TCollision collision) + bool eventSelected(TCollision const& collision) { if (!collision.sel8()) { return 0; @@ -230,31 +229,42 @@ struct lambdaTwoPartPolarization { template bool selectionV0(TCollision const& collision, V0 const& candidate, int LambdaTag) { - if (candidate.v0radius() < cfgv0radiusMin) + if (candidate.v0radius() < cfgv0radiusMin) { return false; + } if (LambdaTag) { - if (std::abs(candidate.dcapostopv()) < cfgDCAPrToPVMin) + if (std::abs(candidate.dcapostopv()) < cfgDCAPrToPVMin) { return false; - if (std::abs(candidate.dcanegtopv()) < cfgDCAPiToPVMin) + } + if (std::abs(candidate.dcanegtopv()) < cfgDCAPiToPVMin) { return false; + } } else if (!LambdaTag) { - if (std::abs(candidate.dcapostopv()) < cfgDCAPiToPVMin) + if (std::abs(candidate.dcapostopv()) < cfgDCAPiToPVMin) { return false; - if (std::abs(candidate.dcanegtopv()) < cfgDCAPrToPVMin) + } + if (std::abs(candidate.dcanegtopv()) < cfgDCAPrToPVMin) { return false; + } } - if (candidate.v0cosPA() < cfgv0CosPA) + if (candidate.v0cosPA() < cfgv0CosPA) { return false; - if (std::abs(candidate.dcaV0daughters()) > cfgDCAV0Dau) + } + if (std::abs(candidate.dcaV0daughters()) > cfgDCAV0Dau) { return false; - if (candidate.pt() < cfgV0PtMin) + } + if (candidate.pt() < cfgV0PtMin) { return false; - if (candidate.yLambda() < cfgV0EtaMin) + } + if (candidate.yLambda() < cfgV0EtaMin) { return false; - if (candidate.yLambda() > cfgV0EtaMax) + } + if (candidate.yLambda() > cfgV0EtaMax) { return false; - if (candidate.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * massLambda > cfgV0LifeTime) + } + if (candidate.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * massLambda > cfgV0LifeTime) { return false; + } return true; } @@ -262,20 +272,27 @@ struct lambdaTwoPartPolarization { template bool isSelectedV0Daughter(T const& track, int pid) // pid 0: proton, pid 1: pion { - if (track.tpcNClsFound() < cfgDaughTPCnclsMin) + if (track.tpcNClsFound() < cfgDaughTPCnclsMin) { return false; - if (pid == 0 && std::abs(track.tpcNSigmaPr()) > cfgDaughPIDCutsTPCPr) + } + if (pid == 0 && std::abs(track.tpcNSigmaPr()) > cfgDaughPIDCutsTPCPr) { return false; - if (pid == 1 && std::abs(track.tpcNSigmaPi()) > cfgDaughPIDCutsTPCPi) + } + if (pid == 1 && std::abs(track.tpcNSigmaPi()) > cfgDaughPIDCutsTPCPi) { return false; - if (track.eta() > cfgDaughEtaMax) + } + if (track.eta() > cfgDaughEtaMax) { return false; - if (track.eta() < cfgDaughEtaMin) + } + if (track.eta() < cfgDaughEtaMin) { return false; - if (pid == 0 && track.pt() < cfgDaughPrPt) + } + if (pid == 0 && track.pt() < cfgDaughPrPt) { return false; - if (pid == 1 && track.pt() < cfgDaughPiPt) + } + if (pid == 1 && track.pt() < cfgDaughPiPt) { return false; + } return true; } @@ -345,11 +362,13 @@ struct lambdaTwoPartPolarization { continue; } - if (LambdaTag == aLambdaTag) + if (LambdaTag == aLambdaTag) { continue; + } - if (!selectionV0(c1, v01, LambdaTag)) + if (!selectionV0(c1, v01, LambdaTag)) { continue; + } if (LambdaTag) { ProtonVec1 = ROOT::Math::PxPyPzMVector(v01.pxpos(), v01.pypos(), v01.pzpos(), massPr); @@ -398,11 +417,13 @@ struct lambdaTwoPartPolarization { aLambdaTag = 1; } - if (LambdaTag == aLambdaTag) + if (LambdaTag == aLambdaTag) { continue; + } - if (!selectionV0(c1, v01, LambdaTag)) + if (!selectionV0(c1, v01, LambdaTag)) { continue; + } if (LambdaTag) { ProtonVec1 = ROOT::Math::PxPyPzMVector(v01.pxpos(), v01.pypos(), v01.pzpos(), massPr); @@ -425,8 +446,9 @@ struct lambdaTwoPartPolarization { histos.fill(HIST("Ana/Acceptance"), v01.pt(), centrality, v01.yLambda(), costhetastar1 * costhetastar1); for (auto& v02 : V02s) { - if (v01.v0Id() <= v02.v0Id() && doprocessDataSame) + if (v01.v0Id() <= v02.v0Id() && doprocessDataSame) { continue; + } auto postrack_v02 = v02.template posTrack_as(); auto negtrack_v02 = v02.template negTrack_as(); @@ -440,15 +462,18 @@ struct lambdaTwoPartPolarization { aLambdaTag = 1; } - if (LambdaTag == aLambdaTag) + if (LambdaTag == aLambdaTag) { continue; + } - if (!selectionV0(c2, v02, LambdaTag)) + if (!selectionV0(c2, v02, LambdaTag)) { continue; + } if (doprocessDataSame) { - if (postrack_v01.globalIndex() == postrack_v02.globalIndex() || postrack_v01.globalIndex() == negtrack_v02.globalIndex() || negtrack_v01.globalIndex() == postrack_v02.globalIndex() || negtrack_v01.globalIndex() == negtrack_v02.globalIndex()) + if (postrack_v01.globalIndex() == postrack_v02.globalIndex() || postrack_v01.globalIndex() == negtrack_v02.globalIndex() || negtrack_v01.globalIndex() == postrack_v02.globalIndex() || negtrack_v01.globalIndex() == negtrack_v02.globalIndex()) { continue; // no shared decay products + } } if (LambdaTag) { @@ -556,18 +581,21 @@ struct lambdaTwoPartPolarization { { for (auto& [c1, c2] : selfCombinations(colBinningT0C, cfgNoMixedEvents, -1, collisions, collisions)) { - if (c1.index() == c2.index()) + if (c1.index() == c2.index()) { continue; + } centrality = c1.centFT0C(); if (cfgAccCor) { auto bc = c1.bc_as(); AccMap = ccdb->getForTimeStamp(cfgAccCorPath.value, bc.timestamp()); } - if (!eventSelected(c1)) + if (!eventSelected(c1)) { continue; - if (!eventSelected(c2)) + } + if (!eventSelected(c2)) { continue; + } auto tracks1 = V0s.sliceBy(tracksPerCollisionV0, c1.globalIndex()); auto tracks2 = V0s.sliceBy(tracksPerCollisionV0, c2.globalIndex()); @@ -585,18 +613,21 @@ struct lambdaTwoPartPolarization { { for (auto& [c1, c2] : selfCombinations(colBinningT0M, cfgNoMixedEvents, -1, collisions, collisions)) { - if (c1.index() == c2.index()) + if (c1.index() == c2.index()) { continue; + } centrality = c1.centFT0M(); if (cfgAccCor) { auto bc = c1.bc_as(); AccMap = ccdb->getForTimeStamp(cfgAccCorPath.value, bc.timestamp()); } - if (!eventSelected(c1)) + if (!eventSelected(c1)) { continue; - if (!eventSelected(c2)) + } + if (!eventSelected(c2)) { continue; + } auto tracks1 = V0s.sliceBy(tracksPerCollisionV0, c1.globalIndex()); auto tracks2 = V0s.sliceBy(tracksPerCollisionV0, c2.globalIndex()); From 1754ba6157593578023cd739364662e7772173be Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Tue, 14 Jul 2026 22:45:40 +0900 Subject: [PATCH 3/8] fix linter --- PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx index 539535c2d69..75e66154b59 100644 --- a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx @@ -74,7 +74,7 @@ struct lambdaTwoPartPolarization { std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; } cfgCcdbParam; - Service ccdb = nullptr; + Service ccdb{}; o2::ccdb::CcdbApi ccdbApi; Configurable cfgCentSel{"cfgCentSel", 100., "Centrality selection"}; From b5052b68c9651841a74e50df6659284503bee81f Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Tue, 14 Jul 2026 22:57:26 +0900 Subject: [PATCH 4/8] fix linter --- PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx index 75e66154b59..8501c4ed7c5 100644 --- a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx @@ -239,7 +239,7 @@ struct lambdaTwoPartPolarization { if (std::abs(candidate.dcanegtopv()) < cfgDCAPiToPVMin) { return false; } - } else if (!LambdaTag) { + } else if (LambdaTag == 0) { if (std::abs(candidate.dcapostopv()) < cfgDCAPiToPVMin) { return false; } From 41e8328ef93296013b12fec1807ffb32ca252bd0 Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Wed, 15 Jul 2026 10:56:35 +0900 Subject: [PATCH 5/8] fix o2linter, adding mass axis --- .../Strangeness/lambdaTwoPartPolarization.cxx | 45 +++++++++++++------ 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx index 8501c4ed7c5..c9e3f40798c 100644 --- a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx @@ -58,6 +58,11 @@ using namespace o2::soa; using namespace o2::constants::physics; struct lambdaTwoPartPolarization { + enum centSel { + kFT0C = 0, + kFT0M + }; + using EventCandidates = soa::Join; using TrackCandidates = soa::Join; using V0TrackCandidate = aod::V0Datas; @@ -130,6 +135,7 @@ struct lambdaTwoPartPolarization { ConfigurableAxis RapAxis{"RapAxis", {10, -0.5, 0.5}, "Rapidity axis"}; ConfigurableAxis detaAxis{"dyAxis", {20, -1, 1}, "relative rapidity axis"}; ConfigurableAxis dphiAxis{"dphiAxis", {20, -constants::math::PI * 0.5, constants::math::PI * 1.5}, "relative azimuth axis"}; + ConfigurableAxis massAxis{"massAxis", {30, 1.10, 1.1}, "lambda mass axis"}; ConfigurableAxis cosSigAxis{"cosSigAxis", {110, -1.05, 1.05}, "Signal cosine axis"}; ConfigurableAxis cosAccAxis{"cosAccAxis", {110, -7.05, 7.05}, "Accepatance cosine axis"}; @@ -171,8 +177,10 @@ struct lambdaTwoPartPolarization { histos.add("Ana/SignalCos2", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, cosSigAxis}}); histos.add("Ana/Acceptance", "", {HistType::kTHnSparseF, {ptAxis, centAxis, RapAxis, cosAccAxis}}); - histos.add("AnaHL/SignalSin2", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, cosSigAxis}}); - histos.add("AnaHL/SignalCos2", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, cosSigAxis}}); + histos.add("AnaHL/LambdaSignalSin2", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, massAxis, cosSigAxis}}); + histos.add("AnaHL/LambdaSignalCos2", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, massAxis, cosSigAxis}}); + histos.add("AnaHL/ALambdaSignalSin2", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, massAxis, cosSigAxis}}); + histos.add("AnaHL/ALambdaSignalCos2", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, massAxis, cosSigAxis}}); histos.add("AnaHL/Ref", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis}}); fMultPVCutLow = new TF1("fMultPVCutLow", "[0]+[1]*x+[2]*x*x+[3]*x*x*x - 2.5*([4]+[5]*x+[6]*x*x+[7]*x*x*x+[8]*x*x*x*x)", 0, 100); @@ -197,6 +205,7 @@ struct lambdaTwoPartPolarization { int V02Tag = 1; double costhetastar1 = 0.0; double costhetastar2 = 0.0; + double lambdaRecMass = 1.; template bool eventSelected(TCollision const& collision) @@ -318,11 +327,11 @@ struct lambdaTwoPartPolarization { template void FillHistogramsRef(Trk1 const& trks1, Trk2 const& trks2) { - for (auto& trk1 : trks1) { + for (const auto& trk1 : trks1) { if (!selectTrack(trk1)) { continue; } - for (auto& trk2 : trks2) { + for (const auto& trk2 : trks2) { if (!selectTrack(trk2)) { continue; } @@ -339,12 +348,12 @@ struct lambdaTwoPartPolarization { template void FillHistogramsLH(C const& c1, V0 const& v0s, Trk const& trks) { - for (auto& trk : trks) { + for (const auto& trk : trks) { if (!selectTrack(trk)) { continue; } - for (auto& v01 : v0s) { + for (const auto& v01 : v0s) { auto postrack_v01 = v01.template posTrack_as(); auto negtrack_v01 = v01.template negTrack_as(); @@ -394,8 +403,14 @@ struct lambdaTwoPartPolarization { weight *= cfgEffCor ? 1.0 / EffMap->GetBinContent(EffMap->GetXaxis()->FindBin(v01.pt()), EffMap->GetYaxis()->FindBin(centrality)) : 1.; weight *= cfgAccCor ? 1.0 / AccMap->GetBinContent(AccMap->GetXaxis()->FindBin(v01.pt()), AccMap->GetYaxis()->FindBin(v01.yLambda())) : 1.; - histos.fill(HIST("AnaHL/SignalSin2"), trk.pt(), v01.pt(), v01.yLambda() - trk.eta(), dphi, centrality, costhetastar1 * std::sin(2.0 * dphi) * weight); - histos.fill(HIST("AnaHL/SignalCos2"), trk.pt(), v01.pt(), v01.yLambda() - trk.eta(), dphi, centrality, costhetastar1 * std::cos(2.0 * dphi) * weight); + if (LambdaTag) { + histos.fill(HIST("AnaHL/LambdaSignalSin2"), trk.pt(), v01.pt(), v01.yLambda() - trk.eta(), dphi, centrality, v01.mLambda(), costhetastar1 * std::sin(2.0 * dphi) * weight); + histos.fill(HIST("AnaHL/LambdaSignalCos2"), trk.pt(), v01.pt(), v01.yLambda() - trk.eta(), dphi, centrality, v01.mLambda(), costhetastar1 * std::cos(2.0 * dphi) * weight); + } + if (aLambdaTag) { + histos.fill(HIST("AnaHL/ALambdaSignalSin2"), trk.pt(), v01.pt(), v01.yLambda() - trk.eta(), dphi, centrality, v01.mAntiLambda(), costhetastar1 * std::sin(2.0 * dphi) * weight); + histos.fill(HIST("AnaHL/ALambdaSignalCos2"), trk.pt(), v01.pt(), v01.yLambda() - trk.eta(), dphi, centrality, v01.mAntiLambda(), costhetastar1 * std::cos(2.0 * dphi) * weight); + } } } } @@ -403,7 +418,7 @@ struct lambdaTwoPartPolarization { template void FillHistograms(C1 const& c1, C2 const& c2, V01 const& V01s, V02 const& V02s) { - for (auto& v01 : V01s) { + for (const auto& v01 : V01s) { auto postrack_v01 = v01.template posTrack_as(); auto negtrack_v01 = v01.template negTrack_as(); @@ -445,7 +460,7 @@ struct lambdaTwoPartPolarization { histos.fill(HIST("Ana/Acceptance"), v01.pt(), centrality, v01.yLambda(), costhetastar1 * costhetastar1); - for (auto& v02 : V02s) { + for (const auto& v02 : V02s) { if (v01.v0Id() <= v02.v0Id() && doprocessDataSame) { continue; } @@ -546,9 +561,11 @@ struct lambdaTwoPartPolarization { TrackCandidates const& /*tracks*/, aod::V0Datas const& V0s, aod::BCsWithTimestamps const&) { - if (cfgCentEst == 1) { + if (cfgCentEst == kFT0C) { centrality = collision.centFT0C(); - } else if (cfgCentEst == 2) { + } else if (cfgCentEst == kFT0M) { + centrality = collision.centFT0M(); + } else { centrality = collision.centFT0M(); } if (!eventSelected(collision) && cfgEvtSel) { @@ -579,7 +596,7 @@ struct lambdaTwoPartPolarization { void processDataMixedT0C(EventCandidates const& collisions, TrackCandidates const& /*tracks*/, aod::V0Datas const& V0s, aod::BCsWithTimestamps const&) { - for (auto& [c1, c2] : selfCombinations(colBinningT0C, cfgNoMixedEvents, -1, collisions, collisions)) { + for (const auto& [c1, c2] : selfCombinations(colBinningT0C, cfgNoMixedEvents, -1, collisions, collisions)) { if (c1.index() == c2.index()) { continue; @@ -611,7 +628,7 @@ struct lambdaTwoPartPolarization { void processDataMixedT0M(EventCandidates const& collisions, TrackCandidates const& /*tracks*/, aod::V0Datas const& V0s, aod::BCsWithTimestamps const&) { - for (auto& [c1, c2] : selfCombinations(colBinningT0M, cfgNoMixedEvents, -1, collisions, collisions)) { + for (const auto& [c1, c2] : selfCombinations(colBinningT0M, cfgNoMixedEvents, -1, collisions, collisions)) { if (c1.index() == c2.index()) { continue; From 236af392839f97fbaf2a619414a5c75e0a62c2a4 Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Wed, 15 Jul 2026 11:31:24 +0900 Subject: [PATCH 6/8] fix o2linter --- .../Strangeness/lambdaTwoPartPolarization.cxx | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx index c9e3f40798c..60544cc7157 100644 --- a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx @@ -10,6 +10,8 @@ // or submit itself to any jurisdiction. /// \author Junlee Kim (jikim1290@gmail.com) +/// \brief longitudinal polarization from 2PC +/// \file lambdaTwoPartPolarization.cxx #include "PWGLF/DataModel/LFStrangenessTables.h" @@ -57,7 +59,7 @@ using namespace o2::framework::expressions; using namespace o2::soa; using namespace o2::constants::physics; -struct lambdaTwoPartPolarization { +struct LfLambdaTwoPartPolarization { enum centSel { kFT0C = 0, kFT0M @@ -73,17 +75,14 @@ struct lambdaTwoPartPolarization { OutputObjHandlingPolicy::AnalysisObject}; struct : ConfigurableGroup { - Configurable cfgURL{"cfgURL", - "http://alice-ccdb.cern.ch", "Address of the CCDB to browse"}; - Configurable nolaterthan{"ccdb-no-later-than", - std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), - "Latest acceptable timestamp of creation for the object"}; + Configurable cfgURL{"cfgURL", "http://alice-ccdb.cern.ch", "Address of the CCDB to browse"}; + Configurable nolaterthan{"nolaterthan", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "Latest acceptable timestamp of creation for the object"}; } cfgCcdbParam; Service ccdb{}; o2::ccdb::CcdbApi ccdbApi; Configurable cfgCentSel{"cfgCentSel", 100., "Centrality selection"}; - Configurable cfgCentEst{"cfgCentEst", 2, "Centrality estimator, 1: FT0C, 2: FT0M"}; + Configurable cfgCentEst{"cfgCentEst", 1, "Centrality estimator, 0: FT0C, 1: FT0M"}; Configurable cfgEvtSel{"cfgEvtSel", true, "event selection flag"}; Configurable cfgPVSel{"cfgPVSel", true, "Additional PV selection flag for syst"}; @@ -132,8 +131,8 @@ struct lambdaTwoPartPolarization { ConfigurableAxis ptAxis{"ptAxis", {VARIABLE_WIDTH, 0.2, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0, 6.5, 8.0, 10.0, 100.0}, "Transverse momentum bins"}; ConfigurableAxis centAxis{"centAxis", {VARIABLE_WIDTH, 0, 10, 20, 30, 40, 50, 60, 70, 100}, "Centrality interval"}; - ConfigurableAxis RapAxis{"RapAxis", {10, -0.5, 0.5}, "Rapidity axis"}; - ConfigurableAxis detaAxis{"dyAxis", {20, -1, 1}, "relative rapidity axis"}; + ConfigurableAxis rapAxis{"rapAxis", {10, -0.5, 0.5}, "Rapidity axis"}; + ConfigurableAxis detaAxis{"detaAxis", {20, -1, 1}, "relative rapidity axis"}; ConfigurableAxis dphiAxis{"dphiAxis", {20, -constants::math::PI * 0.5, constants::math::PI * 1.5}, "relative azimuth axis"}; ConfigurableAxis massAxis{"massAxis", {30, 1.10, 1.1}, "lambda mass axis"}; @@ -175,7 +174,7 @@ struct lambdaTwoPartPolarization { histos.add("Ana/Signal", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, cosSigAxis}}); histos.add("Ana/SignalCos2", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, cosSigAxis}}); - histos.add("Ana/Acceptance", "", {HistType::kTHnSparseF, {ptAxis, centAxis, RapAxis, cosAccAxis}}); + histos.add("Ana/Acceptance", "", {HistType::kTHnSparseF, {ptAxis, centAxis, rapAxis, cosAccAxis}}); histos.add("AnaHL/LambdaSignalSin2", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, massAxis, cosSigAxis}}); histos.add("AnaHL/LambdaSignalCos2", "", {HistType::kTHnSparseF, {ptAxis, ptAxis, detaAxis, dphiAxis, centAxis, massAxis, cosSigAxis}}); @@ -531,9 +530,11 @@ struct lambdaTwoPartPolarization { TrackCandidates const& tracks, aod::V0Datas const& V0s, aod::BCsWithTimestamps const&) { - if (cfgCentEst == 1) { + if (cfgCentEst == kFT0C) { centrality = collision.centFT0C(); - } else if (cfgCentEst == 2) { + } else if (cfgCentEst == kFT0M) { + centrality = collision.centFT0M(); + } else { centrality = collision.centFT0M(); } if (!eventSelected(collision) && cfgEvtSel) { @@ -555,7 +556,7 @@ struct lambdaTwoPartPolarization { FillHistogramsRef(tracks, tracks); FillHistogramsLH(collision, V0s, tracks); } - PROCESS_SWITCH(lambdaTwoPartPolarization, processDataSameHadron, "Process event for same data with hadrons", true); + PROCESS_SWITCH(LfLambdaTwoPartPolarization, processDataSameHadron, "Process event for same data with hadrons", true); void processDataSame(EventCandidates::iterator const& collision, TrackCandidates const& /*tracks*/, aod::V0Datas const& V0s, @@ -585,7 +586,7 @@ struct lambdaTwoPartPolarization { FillHistograms(collision, collision, V0s, V0s); } - PROCESS_SWITCH(lambdaTwoPartPolarization, processDataSame, "Process event for same data", true); + PROCESS_SWITCH(LfLambdaTwoPartPolarization, processDataSame, "Process event for same data", true); SliceCache cache; Preslice tracksPerCollisionV0 = aod::v0data::collisionId; @@ -620,7 +621,7 @@ struct lambdaTwoPartPolarization { FillHistograms(c1, c2, tracks1, tracks2); } } - PROCESS_SWITCH(lambdaTwoPartPolarization, processDataMixedT0C, "Process event for mixed data in PbPb", false); + PROCESS_SWITCH(LfLambdaTwoPartPolarization, processDataMixedT0C, "Process event for mixed data in PbPb", false); using BinningTypeT0M = ColumnBinningPolicy; BinningTypeT0M colBinningT0M{{vertexAxis, centAxis}, true}; @@ -652,11 +653,11 @@ struct lambdaTwoPartPolarization { FillHistograms(c1, c2, tracks1, tracks2); } } - PROCESS_SWITCH(lambdaTwoPartPolarization, processDataMixedT0M, "Process event for mixed data in pp", false); + PROCESS_SWITCH(LfLambdaTwoPartPolarization, processDataMixedT0M, "Process event for mixed data in pp", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"lf-lambdaTwoPartPolarization"})}; + adaptAnalysisTask(cfgc, TaskName{"lf-LfLambdaTwoPartPolarization"})}; } From 35a07b55c4cbfd66ca234e33fe78934f26501f0f Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Wed, 15 Jul 2026 11:35:57 +0900 Subject: [PATCH 7/8] fix o2linter --- PWGLF/Tasks/Strangeness/CMakeLists.txt | 2 +- PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/CMakeLists.txt b/PWGLF/Tasks/Strangeness/CMakeLists.txt index d59685bc93d..67a056aab45 100644 --- a/PWGLF/Tasks/Strangeness/CMakeLists.txt +++ b/PWGLF/Tasks/Strangeness/CMakeLists.txt @@ -181,7 +181,7 @@ o2physics_add_dpl_workflow(strangenessderivedbinnedinfo PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::AnalysisCCDB O2Physics::EventFilteringUtils COMPONENT_NAME Analysis) -o2physics_add_dpl_workflow(lambdatwopartpolarization +o2physics_add_dpl_workflow(lambda-two-part-polarization SOURCES lambdaTwoPartPolarization.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx index 60544cc7157..9d9e70254e2 100644 --- a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx @@ -658,6 +658,5 @@ struct LfLambdaTwoPartPolarization { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{ - adaptAnalysisTask(cfgc, TaskName{"lf-LfLambdaTwoPartPolarization"})}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 2a00d297ee70d9b2b960687480403f5df5e6f53a Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Wed, 15 Jul 2026 02:36:36 +0000 Subject: [PATCH 8/8] Please consider the following formatting changes --- PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx index 9d9e70254e2..4887ca64e60 100644 --- a/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx +++ b/PWGLF/Tasks/Strangeness/lambdaTwoPartPolarization.cxx @@ -395,7 +395,7 @@ struct LfLambdaTwoPartPolarization { ROOT::Math::Boost boost1{LambdaVec1.BoostToCM()}; ProtonBoostedVec1 = boost1(ProtonVec1); - costhetastar1 = ProtonBoostedVec1.Pz() / ProtonBoostedVec1.P(); + costhetastar1 = ProtonBoostedVec1.Pz() / ProtonBoostedVec1.P(); dphi = RecoDecay::constrainAngle(v01.phi() - trk.phi(), -constants::math::PI * 0.5); weight = 1.0; @@ -527,8 +527,8 @@ struct LfLambdaTwoPartPolarization { } void processDataSameHadron(EventCandidates::iterator const& collision, - TrackCandidates const& tracks, aod::V0Datas const& V0s, - aod::BCsWithTimestamps const&) + TrackCandidates const& tracks, aod::V0Datas const& V0s, + aod::BCsWithTimestamps const&) { if (cfgCentEst == kFT0C) { centrality = collision.centFT0C(); @@ -552,7 +552,7 @@ struct LfLambdaTwoPartPolarization { AccMap = ccdb->getForTimeStamp(cfgAccCorPath.value, bc.timestamp()); } -// FillHistograms(collision, collision, V0s, V0s); + // FillHistograms(collision, collision, V0s, V0s); FillHistogramsRef(tracks, tracks); FillHistogramsLH(collision, V0s, tracks); }