From 98f380a1ea078cc4007100277ccc0c1b811e97a7 Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Mon, 3 Aug 2026 13:43:58 +0900 Subject: [PATCH 1/8] add angular selection for two leading tracks --- PWGCF/JCorran/Tasks/jEPFlowAnalysis.cxx | 63 +++++++++++++++++++------ 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/PWGCF/JCorran/Tasks/jEPFlowAnalysis.cxx b/PWGCF/JCorran/Tasks/jEPFlowAnalysis.cxx index 19e6527b5b1..14f3bf6fa98 100644 --- a/PWGCF/JCorran/Tasks/jEPFlowAnalysis.cxx +++ b/PWGCF/JCorran/Tasks/jEPFlowAnalysis.cxx @@ -154,6 +154,8 @@ struct JEPFlowAnalysis { Configurable cfgSelEvtTwoHP{"cfgSelEvtTwoHP", false, "event selection with two high pT"}; Configurable cfgHighPtSel{"cfgHighPtSel", 5.0, "pT threshold with cfgSelEvtTwoHP"}; + Configurable cfgTwoLPAngle{"cfgTwoLPAngle", 0.5, "azimuthal difference between two LP"}; + Configurable cfgEtaBalancing{"cfgEtaBalancing", 0.5, "pseudorapidity difference between two LP"}; Configurable cfgDetName{"cfgDetName", "FT0C", "The name of detector to be analyzed"}; Configurable cfgRefAName{"cfgRefAName", "TPCPos", "The name of detector for reference A"}; @@ -193,8 +195,14 @@ struct JEPFlowAnalysis { float activity = -1.; float qOvecM = -1.; - float highestPt = -1.; - float hPtPhi = -999.; + + float leadingPt = -1.; + float leadingPhi = -999.; + float leadingEta = -999.; + + float subleadingPt = -1.; + float subleadingPhi = -999.; + float subleadingEta = -999.; std::vector shiftprofile{}; std::string fullCCDBShiftCorrPath; @@ -423,20 +431,49 @@ struct JEPFlowAnalysis { q2selLow = q2Map->GetBinContent(q2Map->GetXaxis()->FindBin(i + 2), q2Map->GetYaxis()->FindBin(cent), q2Map->GetZaxis()->FindBin(1. - cfgQ2SelFrac)); } + if (cfgSelEvtTwoHP && i == 0) { + leadingPt = 0.0; + leadingPhi = 0.0; + leadingEta = 0.0; + + subleadingPt = 0.0; + subleadingPhi = 0.0; + subleadingEta = 0.0; + nHighPt = 0; for (const auto& track : tracks) { if (cfgTrkSelFlag && trackSel(track)) continue; - if (track.pt() > cfgHighPtSel) - nHighPt++; + if (leadingPt < track.pt()) { + subleadingPt = leadingPt; + subleadingPhi = leadingPhi; + subleadingEta = leadingEta; + + leadingPt = track.pt(); + leadingPhi = track.phi(); + leadingEta = track.eta(); + } else if (track.pt() > subleadingPt) { + subleadingPt = track.pt(); + subleadingPhi = track.phi(); + subleadingEta = track.eta(); + } + + if (track.pt() > cfgHighPtSel) + nHighPt++; } } if (cfgSelEvtTwoHP && nHighPt < minnHighPt) continue; + if (std::abs(RecoDecay::constrainAngle(leadingPhi - subleadingPhi, 0) - constants::math::PI) > cfgTwoLPAngle) + continue; + + if (std::abs(leadingEta + subleadingEta) > cfgEtaBalancing) + continue; + epFlowHistograms.fill(HIST("EpDet"), i + 2, cent, eps[0]); epFlowHistograms.fill(HIST("EpRefA"), i + 2, cent, eps[1]); epFlowHistograms.fill(HIST("EpRefB"), i + 2, cent, eps[2]); @@ -486,17 +523,13 @@ struct JEPFlowAnalysis { continue; } - highestPt = 0.0; - hPtPhi = 0.0; + leadingPt = 0.0; + leadingPhi = 0.0; + leadingEta = 0.0; for (const auto& track : tracks) { if (cfgTrkSelFlag && trackSel(track)) continue; - if (highestPt < track.pt()) { - highestPt = track.pt(); - hPtPhi = track.phi(); - } - if (cfgEffCor) { weight = getEfficiencyCorrection(effMap, track.eta(), track.pt(), cent, coll.posZ()); } @@ -525,14 +558,14 @@ struct JEPFlowAnalysis { } } if (i == 0) { // second harmonic only - epFlowHistograms.fill(HIST("hQoverM"), cent, highestPt, qOvecM); - epFlowHistograms.fill(HIST("hActivity"), cent, highestPt, activity); + epFlowHistograms.fill(HIST("hQoverM"), cent, leadingPt, qOvecM); + epFlowHistograms.fill(HIST("hActivity"), cent, leadingPt, activity); epFlowHistograms.fill(HIST("hQoverM2M"), cent, coll.qvecAmp()[detId], qOvecM); epFlowHistograms.fill(HIST("hQoverM2Q2"), cent, q2Mag, qOvecM); - epFlowHistograms.fill(HIST("hQoverMdphi"), cent, RecoDecay::constrainAngle(hPtPhi - eps[0], -constants::math::PI), qOvecM); - epFlowHistograms.fill(HIST("hActivitydphi"), cent, RecoDecay::constrainAngle(hPtPhi - eps[0], -constants::math::PI), highestPt, activity); + epFlowHistograms.fill(HIST("hQoverMdphi"), cent, RecoDecay::constrainAngle(leadingPhi - eps[0], -constants::math::PI), qOvecM); + epFlowHistograms.fill(HIST("hActivitydphi"), cent, RecoDecay::constrainAngle(leadingPhi - eps[0], -constants::math::PI), leadingPt, activity); } } } From 3363bcdacf5fc7146398fe18f2f9af780a3186c2 Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Mon, 3 Aug 2026 15:30:46 +0900 Subject: [PATCH 2/8] initial commit on charged ao 1710 --- PWGLF/Tasks/Resonances/CMakeLists.txt | 5 + PWGLF/Tasks/Resonances/cha01710analysis.cxx | 393 ++++++++++++++++++++ 2 files changed, 398 insertions(+) create mode 100644 PWGLF/Tasks/Resonances/cha01710analysis.cxx diff --git a/PWGLF/Tasks/Resonances/CMakeLists.txt b/PWGLF/Tasks/Resonances/CMakeLists.txt index eddc93d741b..dd59bcb8ef2 100644 --- a/PWGLF/Tasks/Resonances/CMakeLists.txt +++ b/PWGLF/Tasks/Resonances/CMakeLists.txt @@ -328,3 +328,8 @@ o2physics_add_dpl_workflow(lambda1520-analysis-po SOURCES lambda1520analysispo.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::AnalysisCCDB COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(cha01710analysis + SOURCES cha01710analysis.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGLF/Tasks/Resonances/cha01710analysis.cxx b/PWGLF/Tasks/Resonances/cha01710analysis.cxx new file mode 100644 index 00000000000..0b82130abcd --- /dev/null +++ b/PWGLF/Tasks/Resonances/cha01710analysis.cxx @@ -0,0 +1,393 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// 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 +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file cha01710analysis.cxx +/// \brief charged a01710 resonance analysis +/// \author Junlee Kim (jikim1290@gmail.com) + +#include "PWGLF/DataModel/LFStrangenessPIDTables.h" +#include "PWGLF/DataModel/LFStrangenessTables.h" + +#include "Common/CCDB/EventSelectionParams.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" +#include "Common/DataModel/Qvectors.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct cha01710analysis { + enum centSel { + kFT0C = 0, + kFT0M + }; + + enum v0MassRegion { + kReject = 0, + kSignal, + kSideband + }; + + TRandom* rn = new TRandom(); + + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + + struct : ConfigurableGroup { + Configurable cfgCentEst{"cfgCentEst", 1, "0: FT0C, 1: FT0M"}; + Configurable cfgZVertexMax{"cfgZVertexMax", 10.f, "maximum |zPV| (cm)"}; + Configurable cfgRequireSel8{"cfgRequireSel8", true, "require sel8"}; + Configurable cfgRequireGoodZvtx{"cfgRequireGoodZvtx", true, "require kIsGoodZvtxFT0vsPV"}; + Configurable cfgRequireNoSameBunchPileup{"cfgRequireNoSameBunchPileup", true, "require kNoSameBunchPileup"}; + } eventCuts; + + struct : ConfigurableGroup { + Configurable cfgPtMin{"cfgV0PtMin", 0.f, "minimum K0S pT"}; + Configurable cfgPtMax{"cfgV0PtMax", 100.f, "maximum K0S pT"}; + Configurable cfgRapidityMax{"cfgV0RapidityMax", 0.5f, "maximum |y(K0S)|"}; + Configurable cfgDcaDaughtersMax{"cfgV0DcaDaughtersMax", 1.f, "maximum daughter DCA"}; + Configurable cfgCosPAMin{"cfgV0CosPAMin", 0.97f, "minimum V0 cosine pointing angle"}; + Configurable cfgRadiusMin{"cfgV0RadiusMin", 0.5f, "minimum V0 radius (cm)"}; + Configurable cfgCtauMax{"cfgV0CtauMax", 15.f, "maximum K0S c tau (cm)"}; + Configurable cfgDaughterDcaPVMin{"cfgV0DaughterDcaPVMin", 0.06f, "minimum daughter |DCA to PV|"}; + Configurable cfgDaughterEtaMax{"cfgV0DaughterEtaMax", 0.8f, "maximum daughter |eta|"}; + Configurable cfgDaughterPtMin{"cfgV0DaughterPtMin", 0.1f, "minimum daughter pT"}; + Configurable cfgDaughterTPCNClsMin{"cfgV0DaughterTPCNClsMin", 70, "minimum daughter TPC clusters"}; + Configurable cfgDaughterTPCNSigmaPiMax{"cfgV0DaughterTPCNSigmaPiMax", 5.f, "maximum daughter |TPC nSigma(pi)|"}; + Configurable cfgDaughterTOFNSigmaPiMax{"cfgV0DaughterTOFNSigmaPiMax", 5.f, "maximum daughter |TOF nSigma(pi)|"}; + Configurable cfgKsMassWindow{"cfgKsMassWindow", 0.01, "K short mass window"}; + Configurable cfgRejectLambda{"cfgRejectLambda", true, "reject Lambda/anti-Lambda competitors"}; + Configurable cfgLambdaMassWindow{"cfgLambdaMassWindow", 0.005f, "Lambda rejection window (GeV/c2)"}; + } v0Cuts; + + struct : ConfigurableGroup { + Configurable cfgPtMin{"cfgKaonPtMin", 0.2f, "minimum charged-kaon pT"}; + Configurable cfgEtaMax{"cfgKaonEtaMax", 0.8f, "maximum charged-kaon |eta|"}; + Configurable cfgTPCCrossedRowsMin{"cfgKaonTPCCrossedRowsMin", 70, "minimum crossed TPC rows"}; + Configurable cfgCrossedRowsRatioMin{"cfgKaonCrossedRowsRatioMin", 0.8f, "minimum crossed/findable ratio"}; + Configurable cfgTPCChi2Max{"cfgKaonTPCChi2Max", 4.f, "maximum TPC chi2/cluster"}; + Configurable cfgITSChi2Max{"cfgKaonITSChi2Max", 36.f, "maximum ITS chi2/cluster"}; + Configurable cfgDcaXYMax{"cfgKaonDcaXYMax", 0.5f, "maximum |DCAxy| (cm)"}; + Configurable cfgDcaZMax{"cfgKaonDcaZMax", 2.f, "maximum |DCAz| (cm)"}; + Configurable cfgTPCNSigmaMax{"cfgKaonTPCNSigmaMax", 3.f, "maximum |TPC nSigma(K)| without TOF"}; + Configurable cfgCombinedNSigmaMax{"cfgKaonCombinedNSigmaMax", 3.f, "maximum combined TPC-TOF nSigma(K)"}; + } kaonCuts; + + struct : ConfigurableGroup { + Configurable cfgRequireQVector{"cfgRequireQVector", true, "reject events with an invalid Q-vector"}; + Configurable cfgQvecHarmonic{"cfgQvecHarmonic", 2, "event-plane harmonic"}; + Configurable cfgQvecNumDetectors{"cfgQvecNumDetectors", 7, "number of detectors in the Q-vector table"}; + Configurable cfgQvecDetName{"cfgQvecDetName", "FT0M", "detector used for the event plane"}; + Configurable cfgQvecRefAName{"cfgQvecRefAName", "TPCpos", "event-plane reference A"}; + Configurable cfgQvecRefBName{"cfgQvecRefBName", "TPCneg", "event-plane reference B"}; + Configurable cfgQvecAmplitudeMin{"cfgQvecAmplitudeMin", 1.e-4f, "minimum accepted Q-vector amplitude"}; + } epConfig; + + Configurable cfgMotherRapidityMax{"cfgMotherRapidityMax", 0.5f, "maximum |y(K0S K)|"}; + Configurable cfgNRotations{"cfgNRotations", 3, "number of deterministic rotations per candidate"}; + + ConfigurableAxis cfgAxisMass{"cfgAxisMass", {300, 1.0, 2.5}, "M(K^{0}_{S}K^{#pm}) (GeV/c^{2})"}; + ConfigurableAxis cfgAxisPt{"cfgAxisPt", {200, 0., 20.}, "pT(K^{0}_{S}K^{#pm}) (GeV/c)"}; + ConfigurableAxis cfgAxisCent{"cfgAxisCent", {VARIABLE_WIDTH, 0., 5., 10., 20., 30., 40., 50., 60., 70., 80., 100.}, "FT0M centrality (%)"}; + ConfigurableAxis cfgAxisEP{"cfgAxisEP", {6, 0., constants::math::TwoPI}, "n#Delta#varphi = n(#varphi-#Psi_{n})"}; + + Filter collisionFilter = nabs(aod::collision::posZ) < eventCuts.cfgZVertexMax; + Filter trackFilter = nabs(aod::track::eta) < kaonCuts.cfgEtaMax && aod::track::pt > kaonCuts.cfgPtMin; + + using Collisions = soa::Filtered>; + using Tracks = soa::Filtered>; + using V0s = soa::Join; + + int detId = 0; + int refAId = 4; + int refBId = 5; + + float centrality = -1.; + + template + int getDetId(T const& name) + { + if (name.value == "FT0C") { + return 0; + } + if (name.value == "FT0A") { + return 1; + } + if (name.value == "FT0M") { + return 2; + } + if (name.value == "FV0A") { + return 3; + } + if (name.value == "TPCpos") { + return 4; + } + if (name.value == "TPCneg") { + return 5; + } + LOGF(warning, "Unknown Q-vector detector %s; using FT0C", name.value.c_str()); + return 0; + } + + void init(InitContext const&) + { + histos.add("Event/hCutFlow", "event cut flow", HistType::kTH1F, {{6, -0.5, 5.5}}); + histos.add("Event/hCentDist", "", HistType::kTH1F, {{120, 0, 120}}); + histos.add("Event/hPVzDist", "", HistType::kTH1F, {{200, -12, 12}}); + + histos.add("EventPlane/hPsiDet", "event plane, detector", HistType::kTH2F, {cfgAxisCent, {180, -constants::math::PI, constants::math::PI}}); + histos.add("EventPlane/hPsiRefA", "event plane, reference A", HistType::kTH2F, {cfgAxisCent, {180, -constants::math::PI, constants::math::PI}}); + histos.add("EventPlane/hPsiRefB", "event plane, reference B", HistType::kTH2F, {cfgAxisCent, {180, -constants::math::PI, constants::math::PI}}); + histos.add("EventPlane/hResolutionDetRefA", "cos[n(PsiDet-PsiRefA)]", HistType::kTH2F, {cfgAxisCent, {102, -1.02, 1.02}}); + histos.add("EventPlane/hResolutionDetRefB", "cos[n(PsiDet-PsiRefB)]", HistType::kTH2F, {cfgAxisCent, {102, -1.02, 1.02}}); + histos.add("EventPlane/hResolutionRefARefB", "cos[n(PsiRefA-PsiRefB)]", HistType::kTH2F, {cfgAxisCent, {102, -1.02, 1.02}}); + + histos.add("V0/hMassBefore", "K0S mass before selection", HistType::kTH2F, {{200, 0.45, 0.55}, cfgAxisPt}); + histos.add("V0/hMassSelected", "selected K0S signal", HistType::kTH2F, {{200, 0.45, 0.55}, cfgAxisPt}); + + histos.add("Kaon/hTPCNSigma", "charged kaon TPC PID", HistType::kTH2F, {cfgAxisPt, {120, -6., 6.}}); + histos.add("Kaon/hTOFNSigma", "charged kaon TOF PID", HistType::kTH2F, {cfgAxisPt, {120, -6., 6.}}); + + histos.add("Pair/hSignalPlus", "K0S K+ same-event versus EP", HistType::kTHnSparseF, {cfgAxisMass, cfgAxisPt, cfgAxisCent, cfgAxisEP}); + histos.add("Pair/hSignalMinus", "K0S K- same-event versus EP", HistType::kTHnSparseF, {cfgAxisMass, cfgAxisPt, cfgAxisCent, cfgAxisEP}); + histos.add("Pair/hSidebandPlus", "K0S-sideband K+ versus EP", HistType::kTHnSparseF, {cfgAxisMass, cfgAxisPt, cfgAxisCent, cfgAxisEP}); + histos.add("Pair/hSidebandMinus", "K0S-sideband K- versus EP", HistType::kTHnSparseF, {cfgAxisMass, cfgAxisPt, cfgAxisCent, cfgAxisEP}); + histos.add("Pair/hRotatedPlus", "rotated K+ background versus EP", HistType::kTH3F, {cfgAxisMass, cfgAxisPt, cfgAxisCent}); + histos.add("Pair/hRotatedMinus", "rotated K- background versus EP", HistType::kTH3F, {cfgAxisMass, cfgAxisPt, cfgAxisCent}); + histos.add("Pair/hMassVsK0SMass", "pair mass versus reconstructed K0S mass", HistType::kTH2F, {cfgAxisMass, {200, 0.43, 0.57}}); + + detId = getDetId(epConfig.cfgQvecDetName); + refAId = getDetId(epConfig.cfgQvecRefAName); + refBId = getDetId(epConfig.cfgQvecRefBName); + if (detId == refAId || detId == refBId || refAId == refBId) { + LOGF(warning, "Q-vector detector names are not distinct; falling back to FT0M, TPCpos, TPCneg"); + detId = 0; + refAId = 4; + refBId = 5; + } + if (epConfig.cfgQvecHarmonic < 2) { + LOGF(fatal, "cfgQvecHarmonic must be >= 2"); + } + } + + template + bool selectEvent(C const& collision) + { + histos.fill(HIST("Event/hCutFlow"), 0.); + if (eventCuts.cfgRequireSel8 && !collision.sel8()) { + return false; + } + histos.fill(HIST("Event/hCutFlow"), 1.); + if (eventCuts.cfgRequireGoodZvtx && !collision.selection_bit(aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + histos.fill(HIST("Event/hCutFlow"), 2.); + if (eventCuts.cfgRequireNoSameBunchPileup && !collision.selection_bit(aod::evsel::kNoSameBunchPileup)) { + return false; + } + histos.fill(HIST("Event/hCutFlow"), 3.); + + if (epConfig.cfgRequireQVector && + (collision.qvecAmp()[detId] < epConfig.cfgQvecAmplitudeMin || + collision.qvecAmp()[refAId] < epConfig.cfgQvecAmplitudeMin || + collision.qvecAmp()[refBId] < epConfig.cfgQvecAmplitudeMin)) { + return false; + } + histos.fill(HIST("Event/hCutFlow"), 4.); + return true; + } + + template + bool selectKaon(T const& track) + { + if (!track.isPVContributor() || !track.isGlobalTrackWoDCA() || !track.isPrimaryTrack()) { + return false; + } + if (track.tpcNClsCrossedRows() < kaonCuts.cfgTPCCrossedRowsMin || + track.tpcCrossedRowsOverFindableCls() < kaonCuts.cfgCrossedRowsRatioMin || + track.tpcChi2NCl() > kaonCuts.cfgTPCChi2Max || track.itsChi2NCl() > kaonCuts.cfgITSChi2Max || + std::abs(track.dcaXY()) > kaonCuts.cfgDcaXYMax || std::abs(track.dcaZ()) > kaonCuts.cfgDcaZMax) { + return false; + } + histos.fill(HIST("Kaon/hTPCNSigma"), track.pt(), track.tpcNSigmaKa()); + if (track.hasTOF()) { + histos.fill(HIST("Kaon/hTOFNSigma"), track.pt(), track.tofNSigmaKa()); + return std::hypot(track.tpcNSigmaKa(), track.tofNSigmaKa()) < kaonCuts.cfgCombinedNSigmaMax; + } + return std::abs(track.tpcNSigmaKa()) < kaonCuts.cfgTPCNSigmaMax; + } + + template + bool selectPionDaughter(T const& track) + { + if (!track.hasTPC() || track.tpcNClsFound() < v0Cuts.cfgDaughterTPCNClsMin || + track.pt() < v0Cuts.cfgDaughterPtMin || std::abs(track.eta()) > v0Cuts.cfgDaughterEtaMax || + std::abs(track.tpcNSigmaPi()) > v0Cuts.cfgDaughterTPCNSigmaPiMax) { + return false; + } + return true; + } + + template + v0MassRegion selectV0(C const& collision, V const& v0) + { + histos.fill(HIST("V0/hMassBefore"), v0.mK0Short(), v0.pt()); + float ctau = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; + if (v0.pt() < v0Cuts.cfgPtMin || v0.pt() > v0Cuts.cfgPtMax || + v0.dcaV0daughters() > v0Cuts.cfgDcaDaughtersMax || v0.v0cosPA() < v0Cuts.cfgCosPAMin || + v0.v0radius() < v0Cuts.cfgRadiusMin || std::abs(ctau) > v0Cuts.cfgCtauMax) { + return v0MassRegion::kReject; + } + if (v0Cuts.cfgRejectLambda && + (std::abs(v0.mLambda() - constants::physics::MassLambda0) < v0Cuts.cfgLambdaMassWindow || + std::abs(v0.mAntiLambda() - constants::physics::MassLambda0) < v0Cuts.cfgLambdaMassWindow)) { + return v0MassRegion::kReject; + } + auto pos = v0.template posTrack_as(); + auto neg = v0.template negTrack_as(); + if (!selectPionDaughter(pos) || !selectPionDaughter(neg)) { + return v0MassRegion::kReject; + } + ROOT::Math::PxPyPzMVector k0(v0.px(), v0.py(), v0.pz(), constants::physics::MassK0Short); + if (std::abs(k0.Rapidity()) > v0Cuts.cfgRapidityMax) { + return v0MassRegion::kReject; + } + float dm = std::abs(v0.mK0Short() - constants::physics::MassK0Short); + if (dm < v0Cuts.cfgKsMassWindow) { + histos.fill(HIST("V0/hMassSelected"), v0.mK0Short(), v0.pt()); + return v0MassRegion::kSignal; + } + if (dm > v0Cuts.cfgKsMassWindow) { + histos.fill(HIST("V0/hMassSelected"), v0.mK0Short(), v0.pt()); + return v0MassRegion::kSideband; + } + return v0MassRegion::kReject; + } + + template + void fillHistograms(CollisionType const& collision, TracksType const& dTracks, V0Type const& v0s) + { + int harmonic = epConfig.cfgQvecHarmonic; + int qVecDetInd = detId * 4 + 3 + (harmonic - 2) * epConfig.cfgQvecNumDetectors * 4; + int qVecRefAInd = refAId * 4 + 3 + (harmonic - 2) * epConfig.cfgQvecNumDetectors * 4; + int qVecRefBInd = refBId * 4 + 3 + (harmonic - 2) * epConfig.cfgQvecNumDetectors * 4; + + float eventPlaneDet = std::atan2(collision.qvecIm()[qVecDetInd], collision.qvecRe()[qVecDetInd]) / static_cast(harmonic); + float eventPlaneRefA = std::atan2(collision.qvecIm()[qVecRefAInd], collision.qvecRe()[qVecRefAInd]) / static_cast(harmonic); + float eventPlaneRefB = std::atan2(collision.qvecIm()[qVecRefBInd], collision.qvecRe()[qVecRefBInd]) / static_cast(harmonic); + + histos.fill(HIST("EventPlane/hPsiDet"), centrality, eventPlaneDet); + histos.fill(HIST("EventPlane/hPsiRefA"), centrality, eventPlaneRefA); + histos.fill(HIST("EventPlane/hPsiRefB"), centrality, eventPlaneRefB); + histos.fill(HIST("EventPlane/hResolutionDetRefA"), centrality, std::cos(harmonic * (eventPlaneDet - eventPlaneRefA))); + histos.fill(HIST("EventPlane/hResolutionDetRefB"), centrality, std::cos(harmonic * (eventPlaneDet - eventPlaneRefB))); + histos.fill(HIST("EventPlane/hResolutionRefARefB"), centrality, std::cos(harmonic * (eventPlaneRefA - eventPlaneRefB))); + + for (const auto& v0 : v0s) { + auto region = selectV0(collision, v0); + if (region == v0MassRegion::kReject) { + continue; + } + auto pos = v0.template posTrack_as(); + auto neg = v0.template negTrack_as(); + + ROOT::Math::PxPyPzMVector k0(v0.px(), v0.py(), v0.pz(), constants::physics::MassK0Short); + + for (const auto& track : dTracks) { + if (track.globalIndex() == pos.globalIndex() || track.globalIndex() == neg.globalIndex() || !selectKaon(track)) { + continue; + } + ROOT::Math::PxPyPzMVector kaon(track.px(), track.py(), track.pz(), constants::physics::MassKaonCharged); + auto mother = k0 + kaon; + if (std::abs(mother.Rapidity()) > cfgMotherRapidityMax) { + continue; + } + + float relPhi = TVector2::Phi_0_2pi((mother.Phi() - eventPlaneDet) * harmonic); + histos.fill(HIST("Pair/hMassVsK0SMass"), mother.M(), v0.mK0Short()); + if (region == v0MassRegion::kSignal) { + if (track.sign() > 0) { + histos.fill(HIST("Pair/hSignalPlus"), mother.M(), mother.Pt(), centrality, relPhi); + } else if (track.sign() < 0) { + histos.fill(HIST("Pair/hSignalMinus"), mother.M(), mother.Pt(), centrality, relPhi); + } + for (int i = 0; i < cfgNRotations; ++i) { + auto randomPhi = rn->Uniform(o2::constants::math::PI * 5.0 / 6.0, o2::constants::math::PI * 7.0 / 6.0); + randomPhi += kaon.Phi(); + auto kaonRot = ROOT::Math::PxPyPzMVector(kaon.Pt() * std::cos(randomPhi), kaon.Pt() * std::sin(randomPhi), track.pz(), o2::constants::physics::MassKaonCharged); + auto motherRot = k0 + kaonRot; + if (std::abs(motherRot.Rapidity()) < cfgMotherRapidityMax) { + if (track.sign() > 0) { + histos.fill(HIST("Pair/hRotatedPlus"), motherRot.M(), motherRot.Pt(), centrality); + } else if (track.sign() < 0) { + histos.fill(HIST("Pair/hRotatedMinus"), motherRot.M(), motherRot.Pt(), centrality); + } + } + } + } + } + } + } + + void processDataSame(Collisions::iterator const& collision, Tracks const& tracks, V0s const& v0s) + { + if (!selectEvent(collision)) { + return; + } + if (eventCuts.cfgCentEst == kFT0M) { + centrality = collision.centFT0M(); + } else if(eventCuts.cfgCentEst == kFT0C) { + centrality = collision.centFT0C(); + } else { + centrality = collision.centFT0M(); + } + + histos.fill(HIST("Event/hCentDist"), centrality); + histos.fill(HIST("Event/hPVzDist"), collision.posZ()); + + fillHistograms(collision, tracks, v0s); + }; + PROCESS_SWITCH(cha01710analysis, processDataSame, "Process Event for data", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{adaptAnalysisTask(cfgc)}; +} From 0075ba78bed5e7cad8cdff748fb786062b94d9ee Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Mon, 3 Aug 2026 15:46:54 +0900 Subject: [PATCH 3/8] Restore irrelevant file --- PWGCF/JCorran/Tasks/jEPFlowAnalysis.cxx | 63 ++++++------------------- 1 file changed, 15 insertions(+), 48 deletions(-) diff --git a/PWGCF/JCorran/Tasks/jEPFlowAnalysis.cxx b/PWGCF/JCorran/Tasks/jEPFlowAnalysis.cxx index 14f3bf6fa98..19e6527b5b1 100644 --- a/PWGCF/JCorran/Tasks/jEPFlowAnalysis.cxx +++ b/PWGCF/JCorran/Tasks/jEPFlowAnalysis.cxx @@ -154,8 +154,6 @@ struct JEPFlowAnalysis { Configurable cfgSelEvtTwoHP{"cfgSelEvtTwoHP", false, "event selection with two high pT"}; Configurable cfgHighPtSel{"cfgHighPtSel", 5.0, "pT threshold with cfgSelEvtTwoHP"}; - Configurable cfgTwoLPAngle{"cfgTwoLPAngle", 0.5, "azimuthal difference between two LP"}; - Configurable cfgEtaBalancing{"cfgEtaBalancing", 0.5, "pseudorapidity difference between two LP"}; Configurable cfgDetName{"cfgDetName", "FT0C", "The name of detector to be analyzed"}; Configurable cfgRefAName{"cfgRefAName", "TPCPos", "The name of detector for reference A"}; @@ -195,14 +193,8 @@ struct JEPFlowAnalysis { float activity = -1.; float qOvecM = -1.; - - float leadingPt = -1.; - float leadingPhi = -999.; - float leadingEta = -999.; - - float subleadingPt = -1.; - float subleadingPhi = -999.; - float subleadingEta = -999.; + float highestPt = -1.; + float hPtPhi = -999.; std::vector shiftprofile{}; std::string fullCCDBShiftCorrPath; @@ -431,49 +423,20 @@ struct JEPFlowAnalysis { q2selLow = q2Map->GetBinContent(q2Map->GetXaxis()->FindBin(i + 2), q2Map->GetYaxis()->FindBin(cent), q2Map->GetZaxis()->FindBin(1. - cfgQ2SelFrac)); } - if (cfgSelEvtTwoHP && i == 0) { - leadingPt = 0.0; - leadingPhi = 0.0; - leadingEta = 0.0; - - subleadingPt = 0.0; - subleadingPhi = 0.0; - subleadingEta = 0.0; - nHighPt = 0; for (const auto& track : tracks) { if (cfgTrkSelFlag && trackSel(track)) continue; - if (leadingPt < track.pt()) { - subleadingPt = leadingPt; - subleadingPhi = leadingPhi; - subleadingEta = leadingEta; - - leadingPt = track.pt(); - leadingPhi = track.phi(); - leadingEta = track.eta(); - } else if (track.pt() > subleadingPt) { - subleadingPt = track.pt(); - subleadingPhi = track.phi(); - subleadingEta = track.eta(); - } - - if (track.pt() > cfgHighPtSel) - nHighPt++; + if (track.pt() > cfgHighPtSel) + nHighPt++; } } if (cfgSelEvtTwoHP && nHighPt < minnHighPt) continue; - if (std::abs(RecoDecay::constrainAngle(leadingPhi - subleadingPhi, 0) - constants::math::PI) > cfgTwoLPAngle) - continue; - - if (std::abs(leadingEta + subleadingEta) > cfgEtaBalancing) - continue; - epFlowHistograms.fill(HIST("EpDet"), i + 2, cent, eps[0]); epFlowHistograms.fill(HIST("EpRefA"), i + 2, cent, eps[1]); epFlowHistograms.fill(HIST("EpRefB"), i + 2, cent, eps[2]); @@ -523,13 +486,17 @@ struct JEPFlowAnalysis { continue; } - leadingPt = 0.0; - leadingPhi = 0.0; - leadingEta = 0.0; + highestPt = 0.0; + hPtPhi = 0.0; for (const auto& track : tracks) { if (cfgTrkSelFlag && trackSel(track)) continue; + if (highestPt < track.pt()) { + highestPt = track.pt(); + hPtPhi = track.phi(); + } + if (cfgEffCor) { weight = getEfficiencyCorrection(effMap, track.eta(), track.pt(), cent, coll.posZ()); } @@ -558,14 +525,14 @@ struct JEPFlowAnalysis { } } if (i == 0) { // second harmonic only - epFlowHistograms.fill(HIST("hQoverM"), cent, leadingPt, qOvecM); - epFlowHistograms.fill(HIST("hActivity"), cent, leadingPt, activity); + epFlowHistograms.fill(HIST("hQoverM"), cent, highestPt, qOvecM); + epFlowHistograms.fill(HIST("hActivity"), cent, highestPt, activity); epFlowHistograms.fill(HIST("hQoverM2M"), cent, coll.qvecAmp()[detId], qOvecM); epFlowHistograms.fill(HIST("hQoverM2Q2"), cent, q2Mag, qOvecM); - epFlowHistograms.fill(HIST("hQoverMdphi"), cent, RecoDecay::constrainAngle(leadingPhi - eps[0], -constants::math::PI), qOvecM); - epFlowHistograms.fill(HIST("hActivitydphi"), cent, RecoDecay::constrainAngle(leadingPhi - eps[0], -constants::math::PI), leadingPt, activity); + epFlowHistograms.fill(HIST("hQoverMdphi"), cent, RecoDecay::constrainAngle(hPtPhi - eps[0], -constants::math::PI), qOvecM); + epFlowHistograms.fill(HIST("hActivitydphi"), cent, RecoDecay::constrainAngle(hPtPhi - eps[0], -constants::math::PI), highestPt, activity); } } } From 912f9bfa138b48d15a85b22e96c6b5f482d80d8d Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Mon, 3 Aug 2026 22:25:37 +0900 Subject: [PATCH 4/8] fix o2-linter --- PWGLF/Tasks/Resonances/cha01710analysis.cxx | 90 ++++++++++----------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/PWGLF/Tasks/Resonances/cha01710analysis.cxx b/PWGLF/Tasks/Resonances/cha01710analysis.cxx index 0b82130abcd..bc22457b405 100644 --- a/PWGLF/Tasks/Resonances/cha01710analysis.cxx +++ b/PWGLF/Tasks/Resonances/cha01710analysis.cxx @@ -52,13 +52,13 @@ using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; -struct cha01710analysis { - enum centSel { +struct Cha01710analysis { + enum CentSel { kFT0C = 0, kFT0M }; - enum v0MassRegion { + enum V0MassRegion { kReject = 0, kSignal, kSideband @@ -77,35 +77,35 @@ struct cha01710analysis { } eventCuts; struct : ConfigurableGroup { - Configurable cfgPtMin{"cfgV0PtMin", 0.f, "minimum K0S pT"}; - Configurable cfgPtMax{"cfgV0PtMax", 100.f, "maximum K0S pT"}; - Configurable cfgRapidityMax{"cfgV0RapidityMax", 0.5f, "maximum |y(K0S)|"}; - Configurable cfgDcaDaughtersMax{"cfgV0DcaDaughtersMax", 1.f, "maximum daughter DCA"}; - Configurable cfgCosPAMin{"cfgV0CosPAMin", 0.97f, "minimum V0 cosine pointing angle"}; - Configurable cfgRadiusMin{"cfgV0RadiusMin", 0.5f, "minimum V0 radius (cm)"}; - Configurable cfgCtauMax{"cfgV0CtauMax", 15.f, "maximum K0S c tau (cm)"}; - Configurable cfgDaughterDcaPVMin{"cfgV0DaughterDcaPVMin", 0.06f, "minimum daughter |DCA to PV|"}; - Configurable cfgDaughterEtaMax{"cfgV0DaughterEtaMax", 0.8f, "maximum daughter |eta|"}; - Configurable cfgDaughterPtMin{"cfgV0DaughterPtMin", 0.1f, "minimum daughter pT"}; - Configurable cfgDaughterTPCNClsMin{"cfgV0DaughterTPCNClsMin", 70, "minimum daughter TPC clusters"}; - Configurable cfgDaughterTPCNSigmaPiMax{"cfgV0DaughterTPCNSigmaPiMax", 5.f, "maximum daughter |TPC nSigma(pi)|"}; - Configurable cfgDaughterTOFNSigmaPiMax{"cfgV0DaughterTOFNSigmaPiMax", 5.f, "maximum daughter |TOF nSigma(pi)|"}; + Configurable cfgV0PtMin{"cfgV0PtMin", 0.f, "minimum K0S pT"}; + Configurable cfgV0PtMax{"cfgV0PtMax", 100.f, "maximum K0S pT"}; + Configurable cfgV0RapidityMax{"cfgV0RapidityMax", 0.5f, "maximum |y(K0S)|"}; + Configurable cfgV0DcaDaughtersMax{"cfgV0DcaDaughtersMax", 1.f, "maximum daughter DCA"}; + Configurable cfgV0CosPAMin{"cfgV0CosPAMin", 0.97f, "minimum V0 cosine pointing angle"}; + Configurable cfgV0RadiusMin{"cfgV0RadiusMin", 0.5f, "minimum V0 radius (cm)"}; + Configurable cfgV0CtauMax{"cfgV0CtauMax", 15.f, "maximum K0S c tau (cm)"}; + Configurable cfgV0DaughterDcaPVMin{"cfgV0DaughterDcaPVMin", 0.06f, "minimum daughter |DCA to PV|"}; + Configurable cfgV0DaughterEtaMax{"cfgV0DaughterEtaMax", 0.8f, "maximum daughter |eta|"}; + Configurable cfgV0DaughterPtMin{"cfgV0DaughterPtMin", 0.1f, "minimum daughter pT"}; + Configurable cfgV0DaughterTPCNClsMin{"cfgV0DaughterTPCNClsMin", 70, "minimum daughter TPC clusters"}; + Configurable cfgV0DaughterTPCNSigmaPiMax{"cfgV0DaughterTPCNSigmaPiMax", 5.f, "maximum daughter |TPC nSigma(pi)|"}; + Configurable cfgV0DaughterTOFNSigmaPiMax{"cfgV0DaughterTOFNSigmaPiMax", 5.f, "maximum daughter |TOF nSigma(pi)|"}; Configurable cfgKsMassWindow{"cfgKsMassWindow", 0.01, "K short mass window"}; Configurable cfgRejectLambda{"cfgRejectLambda", true, "reject Lambda/anti-Lambda competitors"}; Configurable cfgLambdaMassWindow{"cfgLambdaMassWindow", 0.005f, "Lambda rejection window (GeV/c2)"}; } v0Cuts; struct : ConfigurableGroup { - Configurable cfgPtMin{"cfgKaonPtMin", 0.2f, "minimum charged-kaon pT"}; - Configurable cfgEtaMax{"cfgKaonEtaMax", 0.8f, "maximum charged-kaon |eta|"}; - Configurable cfgTPCCrossedRowsMin{"cfgKaonTPCCrossedRowsMin", 70, "minimum crossed TPC rows"}; - Configurable cfgCrossedRowsRatioMin{"cfgKaonCrossedRowsRatioMin", 0.8f, "minimum crossed/findable ratio"}; - Configurable cfgTPCChi2Max{"cfgKaonTPCChi2Max", 4.f, "maximum TPC chi2/cluster"}; - Configurable cfgITSChi2Max{"cfgKaonITSChi2Max", 36.f, "maximum ITS chi2/cluster"}; - Configurable cfgDcaXYMax{"cfgKaonDcaXYMax", 0.5f, "maximum |DCAxy| (cm)"}; - Configurable cfgDcaZMax{"cfgKaonDcaZMax", 2.f, "maximum |DCAz| (cm)"}; - Configurable cfgTPCNSigmaMax{"cfgKaonTPCNSigmaMax", 3.f, "maximum |TPC nSigma(K)| without TOF"}; - Configurable cfgCombinedNSigmaMax{"cfgKaonCombinedNSigmaMax", 3.f, "maximum combined TPC-TOF nSigma(K)"}; + Configurable cfgPtMin{"cfgPtMin", 0.2f, "minimum charged-kaon pT"}; + Configurable cfgEtaMax{"cfgEtaMax", 0.8f, "maximum charged-kaon |eta|"}; + Configurable cfgTPCCrossedRowsMin{"cfgTPCCrossedRowsMin", 70, "minimum crossed TPC rows"}; + Configurable cfgCrossedRowsRatioMin{"cfgCrossedRowsRatioMin", 0.8f, "minimum crossed/findable ratio"}; + Configurable cfgTPCChi2Max{"cfgTPCChi2Max", 4.f, "maximum TPC chi2/cluster"}; + Configurable cfgITSChi2Max{"cfgITSChi2Max", 36.f, "maximum ITS chi2/cluster"}; + Configurable cfgDcaXYMax{"cfgDcaXYMax", 0.5f, "maximum |DCAxy| (cm)"}; + Configurable cfgDcaZMax{"cfgDcaZMax", 2.f, "maximum |DCAz| (cm)"}; + Configurable cfgTPCNSigmaMax{"cfgTPCNSigmaMax", 3.f, "maximum |TPC nSigma(K)| without TOF"}; + Configurable cfgCombinedNSigmaMax{"cfgCombinedNSigmaMax", 3.f, "maximum combined TPC-TOF nSigma(K)"}; } kaonCuts; struct : ConfigurableGroup { @@ -257,48 +257,48 @@ struct cha01710analysis { template bool selectPionDaughter(T const& track) { - if (!track.hasTPC() || track.tpcNClsFound() < v0Cuts.cfgDaughterTPCNClsMin || - track.pt() < v0Cuts.cfgDaughterPtMin || std::abs(track.eta()) > v0Cuts.cfgDaughterEtaMax || - std::abs(track.tpcNSigmaPi()) > v0Cuts.cfgDaughterTPCNSigmaPiMax) { + if (!track.hasTPC() || track.tpcNClsFound() < v0Cuts.cfgV0DaughterTPCNClsMin || + track.pt() < v0Cuts.cfgV0DaughterPtMin || std::abs(track.eta()) > v0Cuts.cfgV0DaughterEtaMax || + std::abs(track.tpcNSigmaPi()) > v0Cuts.cfgV0DaughterTPCNSigmaPiMax) { return false; } return true; } template - v0MassRegion selectV0(C const& collision, V const& v0) + V0MassRegion selectV0(C const& collision, V const& v0) { histos.fill(HIST("V0/hMassBefore"), v0.mK0Short(), v0.pt()); float ctau = v0.distovertotmom(collision.posX(), collision.posY(), collision.posZ()) * constants::physics::MassK0Short; - if (v0.pt() < v0Cuts.cfgPtMin || v0.pt() > v0Cuts.cfgPtMax || - v0.dcaV0daughters() > v0Cuts.cfgDcaDaughtersMax || v0.v0cosPA() < v0Cuts.cfgCosPAMin || - v0.v0radius() < v0Cuts.cfgRadiusMin || std::abs(ctau) > v0Cuts.cfgCtauMax) { - return v0MassRegion::kReject; + if (v0.pt() < v0Cuts.cfgV0PtMin || v0.pt() > v0Cuts.cfgV0PtMax || + v0.dcaV0daughters() > v0Cuts.cfgV0DcaDaughtersMax || v0.v0cosPA() < v0Cuts.cfgV0CosPAMin || + v0.v0radius() < v0Cuts.cfgV0RadiusMin || std::abs(ctau) > v0Cuts.cfgV0CtauMax) { + return V0MassRegion::kReject; } if (v0Cuts.cfgRejectLambda && (std::abs(v0.mLambda() - constants::physics::MassLambda0) < v0Cuts.cfgLambdaMassWindow || std::abs(v0.mAntiLambda() - constants::physics::MassLambda0) < v0Cuts.cfgLambdaMassWindow)) { - return v0MassRegion::kReject; + return V0MassRegion::kReject; } auto pos = v0.template posTrack_as(); auto neg = v0.template negTrack_as(); if (!selectPionDaughter(pos) || !selectPionDaughter(neg)) { - return v0MassRegion::kReject; + return V0MassRegion::kReject; } ROOT::Math::PxPyPzMVector k0(v0.px(), v0.py(), v0.pz(), constants::physics::MassK0Short); - if (std::abs(k0.Rapidity()) > v0Cuts.cfgRapidityMax) { - return v0MassRegion::kReject; + if (std::abs(k0.Rapidity()) > v0Cuts.cfgV0RapidityMax) { + return V0MassRegion::kReject; } float dm = std::abs(v0.mK0Short() - constants::physics::MassK0Short); if (dm < v0Cuts.cfgKsMassWindow) { histos.fill(HIST("V0/hMassSelected"), v0.mK0Short(), v0.pt()); - return v0MassRegion::kSignal; + return V0MassRegion::kSignal; } if (dm > v0Cuts.cfgKsMassWindow) { histos.fill(HIST("V0/hMassSelected"), v0.mK0Short(), v0.pt()); - return v0MassRegion::kSideband; + return V0MassRegion::kSideband; } - return v0MassRegion::kReject; + return V0MassRegion::kReject; } template @@ -322,7 +322,7 @@ struct cha01710analysis { for (const auto& v0 : v0s) { auto region = selectV0(collision, v0); - if (region == v0MassRegion::kReject) { + if (region == kReject) { continue; } auto pos = v0.template posTrack_as(); @@ -342,7 +342,7 @@ struct cha01710analysis { float relPhi = TVector2::Phi_0_2pi((mother.Phi() - eventPlaneDet) * harmonic); histos.fill(HIST("Pair/hMassVsK0SMass"), mother.M(), v0.mK0Short()); - if (region == v0MassRegion::kSignal) { + if (region == kSignal) { if (track.sign() > 0) { histos.fill(HIST("Pair/hSignalPlus"), mother.M(), mother.Pt(), centrality, relPhi); } else if (track.sign() < 0) { @@ -384,10 +384,10 @@ struct cha01710analysis { fillHistograms(collision, tracks, v0s); }; - PROCESS_SWITCH(cha01710analysis, processDataSame, "Process Event for data", false); + PROCESS_SWITCH(Cha01710analysis, processDataSame, "Process Event for data", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 4580a7cf3975a85c2f0075705f73996975ba6f62 Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Mon, 3 Aug 2026 22:30:54 +0900 Subject: [PATCH 5/8] fix o2-linter --- PWGLF/Tasks/Resonances/cha01710analysis.cxx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Resonances/cha01710analysis.cxx b/PWGLF/Tasks/Resonances/cha01710analysis.cxx index bc22457b405..abd74722ae8 100644 --- a/PWGLF/Tasks/Resonances/cha01710analysis.cxx +++ b/PWGLF/Tasks/Resonances/cha01710analysis.cxx @@ -140,6 +140,8 @@ struct Cha01710analysis { int refBId = 5; float centrality = -1.; + float rotmin = 5.0 / 6.0; + float rotmax = 7.0 / 6.0; template int getDetId(T const& name) @@ -349,7 +351,7 @@ struct Cha01710analysis { histos.fill(HIST("Pair/hSignalMinus"), mother.M(), mother.Pt(), centrality, relPhi); } for (int i = 0; i < cfgNRotations; ++i) { - auto randomPhi = rn->Uniform(o2::constants::math::PI * 5.0 / 6.0, o2::constants::math::PI * 7.0 / 6.0); + auto randomPhi = rn->Uniform(o2::constants::math::PI * rotmin, o2::constants::math::PI * rotmax); randomPhi += kaon.Phi(); auto kaonRot = ROOT::Math::PxPyPzMVector(kaon.Pt() * std::cos(randomPhi), kaon.Pt() * std::sin(randomPhi), track.pz(), o2::constants::physics::MassKaonCharged); auto motherRot = k0 + kaonRot; From 490d02ef39d631f61657bd48bff603320c31b754 Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Mon, 3 Aug 2026 22:53:49 +0900 Subject: [PATCH 6/8] fix o2-linter --- PWGLF/Tasks/Resonances/cha01710analysis.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PWGLF/Tasks/Resonances/cha01710analysis.cxx b/PWGLF/Tasks/Resonances/cha01710analysis.cxx index abd74722ae8..0e2047b2135 100644 --- a/PWGLF/Tasks/Resonances/cha01710analysis.cxx +++ b/PWGLF/Tasks/Resonances/cha01710analysis.cxx @@ -138,6 +138,7 @@ struct Cha01710analysis { int detId = 0; int refAId = 4; int refBId = 5; + int minHarm = 2; float centrality = -1.; float rotmin = 5.0 / 6.0; @@ -204,7 +205,7 @@ struct Cha01710analysis { refAId = 4; refBId = 5; } - if (epConfig.cfgQvecHarmonic < 2) { + if (epConfig.cfgQvecHarmonic < minHarm) { LOGF(fatal, "cfgQvecHarmonic must be >= 2"); } } From 28e9f01488fd04ea150eacc939432f622ba9379a Mon Sep 17 00:00:00 2001 From: jikim1290 Date: Tue, 4 Aug 2026 15:03:34 +0900 Subject: [PATCH 7/8] fix codecheck --- PWGLF/Tasks/Resonances/cha01710analysis.cxx | 49 ++++++++++++--------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/PWGLF/Tasks/Resonances/cha01710analysis.cxx b/PWGLF/Tasks/Resonances/cha01710analysis.cxx index 0e2047b2135..e508357e4b6 100644 --- a/PWGLF/Tasks/Resonances/cha01710analysis.cxx +++ b/PWGLF/Tasks/Resonances/cha01710analysis.cxx @@ -19,32 +19,29 @@ #include "Common/CCDB/EventSelectionParams.h" #include "Common/DataModel/Centrality.h" #include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/PIDResponseTOF.h" #include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/Qvectors.h" #include "Common/DataModel/TrackSelectionTables.h" #include -#include #include #include #include -#include #include #include #include +#include #include #include #include #include -#include #include #include +#include #include -#include #include #include @@ -68,6 +65,10 @@ struct Cha01710analysis { HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + Service ccdb; + + Configurable cfgUrl{"cfgUrl", "http://alice-ccdb.cern.ch", "CCDB URL"}; + struct : ConfigurableGroup { Configurable cfgCentEst{"cfgCentEst", 1, "0: FT0C, 1: FT0M"}; Configurable cfgZVertexMax{"cfgZVertexMax", 10.f, "maximum |zPV| (cm)"}; @@ -208,6 +209,11 @@ struct Cha01710analysis { if (epConfig.cfgQvecHarmonic < minHarm) { LOGF(fatal, "cfgQvecHarmonic must be >= 2"); } + + ccdb->setURL(cfgUrl.value); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); } template @@ -345,24 +351,25 @@ struct Cha01710analysis { float relPhi = TVector2::Phi_0_2pi((mother.Phi() - eventPlaneDet) * harmonic); histos.fill(HIST("Pair/hMassVsK0SMass"), mother.M(), v0.mK0Short()); - if (region == kSignal) { + if (region != kSignal) + continue; + if (track.sign() > 0) { + histos.fill(HIST("Pair/hSignalPlus"), mother.M(), mother.Pt(), centrality, relPhi); + } else if (track.sign() < 0) { + histos.fill(HIST("Pair/hSignalMinus"), mother.M(), mother.Pt(), centrality, relPhi); + } + for (int i = 0; i < cfgNRotations; ++i) { + auto randomPhi = rn->Uniform(o2::constants::math::PI * rotmin, o2::constants::math::PI * rotmax); + randomPhi += kaon.Phi(); + auto kaonRot = ROOT::Math::PxPyPzMVector(kaon.Pt() * std::cos(randomPhi), kaon.Pt() * std::sin(randomPhi), track.pz(), o2::constants::physics::MassKaonCharged); + auto motherRot = k0 + kaonRot; + if (std::abs(motherRot.Rapidity()) > cfgMotherRapidityMax) + continue; + if (track.sign() > 0) { - histos.fill(HIST("Pair/hSignalPlus"), mother.M(), mother.Pt(), centrality, relPhi); + histos.fill(HIST("Pair/hRotatedPlus"), motherRot.M(), motherRot.Pt(), centrality); } else if (track.sign() < 0) { - histos.fill(HIST("Pair/hSignalMinus"), mother.M(), mother.Pt(), centrality, relPhi); - } - for (int i = 0; i < cfgNRotations; ++i) { - auto randomPhi = rn->Uniform(o2::constants::math::PI * rotmin, o2::constants::math::PI * rotmax); - randomPhi += kaon.Phi(); - auto kaonRot = ROOT::Math::PxPyPzMVector(kaon.Pt() * std::cos(randomPhi), kaon.Pt() * std::sin(randomPhi), track.pz(), o2::constants::physics::MassKaonCharged); - auto motherRot = k0 + kaonRot; - if (std::abs(motherRot.Rapidity()) < cfgMotherRapidityMax) { - if (track.sign() > 0) { - histos.fill(HIST("Pair/hRotatedPlus"), motherRot.M(), motherRot.Pt(), centrality); - } else if (track.sign() < 0) { - histos.fill(HIST("Pair/hRotatedMinus"), motherRot.M(), motherRot.Pt(), centrality); - } - } + histos.fill(HIST("Pair/hRotatedMinus"), motherRot.M(), motherRot.Pt(), centrality); } } } From be9b6fe7f6af8aae7bb0a6b5aa8cd9ed457756bc Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Tue, 4 Aug 2026 06:04:41 +0000 Subject: [PATCH 8/8] Please consider the following formatting changes --- PWGLF/Tasks/Resonances/cha01710analysis.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PWGLF/Tasks/Resonances/cha01710analysis.cxx b/PWGLF/Tasks/Resonances/cha01710analysis.cxx index e508357e4b6..fc64756ec85 100644 --- a/PWGLF/Tasks/Resonances/cha01710analysis.cxx +++ b/PWGLF/Tasks/Resonances/cha01710analysis.cxx @@ -33,13 +33,13 @@ #include #include #include -#include #include +#include #include -#include -#include #include +#include +#include #include #include @@ -132,8 +132,8 @@ struct Cha01710analysis { using Collisions = soa::Filtered>; using Tracks = soa::Filtered>; + aod::pidTPCFullPi, aod::pidTOFFullPi, + aod::pidTPCFullKa, aod::pidTOFFullKa>>; using V0s = soa::Join; int detId = 0; @@ -383,7 +383,7 @@ struct Cha01710analysis { } if (eventCuts.cfgCentEst == kFT0M) { centrality = collision.centFT0M(); - } else if(eventCuts.cfgCentEst == kFT0C) { + } else if (eventCuts.cfgCentEst == kFT0C) { centrality = collision.centFT0C(); } else { centrality = collision.centFT0M();