From 6a2be6d54bc39d7fb800abf9ac07fd2258173724 Mon Sep 17 00:00:00 2001 From: josue-MiniPC-Ubuntu Date: Wed, 29 Oct 2025 14:43:29 -0600 Subject: [PATCH 01/11] taking off the NUA correction and adding new histos for correlation --- PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx | 1 + 1 file changed, 1 insertion(+) diff --git a/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx b/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx index cf170a30465..b2be8a0488d 100644 --- a/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx +++ b/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx @@ -317,6 +317,7 @@ struct UpcPhotonuclearAnalysisJMG { // mixedGapSideA.setObject(new CorrelationContainer("mixedEventGapSideA", "mixedEventGapSideA", corrAxis, effAxis, {})); // sameGapSideC.setObject(new CorrelationContainer("sameEventGapSideC", "sameEventGapSideC", corrAxis, effAxis, {})); // mixedGapSideC.setObject(new CorrelationContainer("mixedEventGapSideC", "mixedEventGapSideC", corrAxis, effAxis, {})); + } std::vector vtxBinsEdges{VARIABLE_WIDTH, -10.0f, -7.0f, -5.0f, -2.5f, 0.0f, 2.5f, 5.0f, 7.0f, 10.0f}; From b07bc6c365be91dee190f5c68719e49429e2f037 Mon Sep 17 00:00:00 2001 From: josue-MiniPC-Ubuntu Date: Wed, 29 Oct 2025 14:48:49 -0600 Subject: [PATCH 02/11] taking off the NUA correction and adding new histos for correlation --- PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx b/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx index b2be8a0488d..cf170a30465 100644 --- a/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx +++ b/PWGUD/Tasks/upcPhotonuclearAnalysisJMG.cxx @@ -317,7 +317,6 @@ struct UpcPhotonuclearAnalysisJMG { // mixedGapSideA.setObject(new CorrelationContainer("mixedEventGapSideA", "mixedEventGapSideA", corrAxis, effAxis, {})); // sameGapSideC.setObject(new CorrelationContainer("sameEventGapSideC", "sameEventGapSideC", corrAxis, effAxis, {})); // mixedGapSideC.setObject(new CorrelationContainer("mixedEventGapSideC", "mixedEventGapSideC", corrAxis, effAxis, {})); - } std::vector vtxBinsEdges{VARIABLE_WIDTH, -10.0f, -7.0f, -5.0f, -2.5f, 0.0f, 2.5f, 5.0f, 7.0f, 10.0f}; From 60963c4225170092336bd412533b417083a2c84e Mon Sep 17 00:00:00 2001 From: Josue Martinez Garcia Date: Fri, 7 Nov 2025 00:11:56 -0600 Subject: [PATCH 03/11] adding a basis task for two particle correlation for pp --- .../Tasks/CMakeLists.txt | 4 + .../Tasks/twoParticleCorrelationpp.cxx | 245 ++++++++++++++++++ 2 files changed, 249 insertions(+) create mode 100644 PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx diff --git a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt index 21bb0bade8e..33f5e257cde 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt +++ b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt @@ -73,3 +73,7 @@ o2physics_add_dpl_workflow(long-range-dihadron-cor PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore O2Physics::PWGCFCore O2Physics::AnalysisCCDB O2Physics::GFWCore COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(two-particle-correlation-pp + SOURCES twoParticleCorrelationpp.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGCFCore + COMPONENT_NAME Analysis) \ No newline at end of file diff --git a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx new file mode 100644 index 00000000000..1cbfa243dea --- /dev/null +++ b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx @@ -0,0 +1,245 @@ +// 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. + +#include "PWGCF/Core/CorrelationContainer.h" +#include "PWGCF/Core/PairCuts.h" + +#include "CommonConstants/MathConstants.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/RecoDecay.h" + +#include "CommonConstants/MathConstants.h" +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/RunningWorkflowInfo.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +static constexpr float cfgPairCutDefaults[1][5] = {{-1, -1, -1, -1, -1}}; +constexpr float kThreeHalfPi = 1.5f * PI; + +struct TwoParticleCorrelations { + + // Declare configurables on events/collisions + Configurable minMultiplicity{"minMultiplicity", 2, {"Range on multiplicity"}}; + Configurable range1Max{"range1Max", 10, {"Range on multiplicity"}}; + Configurable range2Min{"range2Min", 11, {"Range on multiplicity"}}; + Configurable range2Max{"range2Max", 20, {"Range on multiplicity"}}; + Configurable range3Min{"range3Min", 21, {"Range on multiplicity"}}; + Configurable range3Max{"range3Max", 30, {"Range on multiplicity"}}; + Configurable range4Min{"range4Min", 31, {"Range on multiplicity"}}; + Configurable range4Max{"range4Max", 40, {"Range on multiplicity"}}; + Configurable range5Min{"range5Min", 41, {"Range on multiplicity"}}; + Configurable range5Max{"range5Max", 50, {"Range on multiplicity"}}; + // Declare configurables for correlations + Configurable cfgZVtxCut = {"zvtxcut", 10.0, "Vertex z cut. Default 10 cm"}; + Configurable cfgPtCutMin = {"minpt", 0.2, "Minimum accepted track pT. Default 0.2 GeV"}; + Configurable cfgPtCutMax = {"maxpt", 3.0, "Maximum accepted track pT. Default 3.0 GeV"}; + Configurable cfgEtaCut = {"etacut", 0.8, "Eta cut. Default 0.8"}; + Configurable> cfgPairCut{"cfgPairCut", + {cfgPairCutDefaults[0], + 5, + {"Photon", "K0", "Lambda", "Phi", "Rho"}}, + "Pair cuts on various particles"}; + //Configurable cfgTwoTrackCut{"cfgTwoTrackCut", -1, {"Two track cut"}}; + ConfigurableAxis axisVertex{"axisVertex", {7, -7, 7}, "vertex axis for histograms"}; + ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {32, -constants::math::PIHalf, constants::math::PIHalf * 3}, "delta phi axis for histograms"}; + ConfigurableAxis axisDeltaEta{"axisDeltaEta", {32, -1.6, 1.6}, "delta eta axis for histograms"}; + ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; + ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0}, "pt associated axis for histograms"}; + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100.1},"multiplicity / centrality axis for histograms"}; + ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; + ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25,2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; + + // Output definitions + OutputObj same{"sameEvent"}; + OutputObj mixed{"mixedEvent"}; + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + PairCuts mPairCuts; + bool doPairCuts = false; + + void init(InitContext&) + { + LOGF(info, "Starting init"); + + histos.add("yields", "multiplicity/centrality vs pT vs eta", {HistType::kTH3F, {{100, 0, 100, "/multiplicity/centrality"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); + histos.add("etaphi", "multiplicity/centrality vs eta vs phi", {HistType::kTH3F, {{100, 0, 100, "multiplicity/centrality"}, {100, -2, 2, "#eta"}, {200, 0, 2 * M_PI, "#varphi"}}}); + histos.add("sameEvent2D", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); + histos.add("sameEvent_2_10", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); + histos.add("sameEvent_11_20", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); + histos.add("sameEvent_21_30", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); + histos.add("sameEvent_31_40", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); + histos.add("sameEvent_41_50", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); + histos.add("mixedEvent2D", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); + histos.add("mixedEvent_2_10", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); + histos.add("mixedEvent_11_20", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); + histos.add("mixedEvent_21_30", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); + histos.add("mixedEvent_31_40", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); + histos.add("mixedEvent_41_50", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); + + const int maxMixBin = axisMultiplicity->size() * axisVertex->size(); + histos.add("eventcount", "bin", {HistType::kTH1F, {{maxMixBin + 2, -2.5, -0.5 + maxMixBin, "bin"}}}); + mPairCuts.SetHistogramRegistry(&histos); + if (cfgPairCut->get("Photon") > 0 || cfgPairCut->get("K0") > 0 || cfgPairCut->get("Lambda") > 0 || + cfgPairCut->get("Phi") > 0 || cfgPairCut->get("Rho") > 0) { + mPairCuts.SetPairCut(PairCuts::Photon, cfgPairCut->get("Photon")); + mPairCuts.SetPairCut(PairCuts::K0, cfgPairCut->get("K0")); + mPairCuts.SetPairCut(PairCuts::Lambda, cfgPairCut->get("Lambda")); + mPairCuts.SetPairCut(PairCuts::Phi, cfgPairCut->get("Phi")); + mPairCuts.SetPairCut(PairCuts::Rho, cfgPairCut->get("Rho")); + doPairCuts = true; + } + + std::vector corrAxis = {{axisDeltaEta, "#Delta#eta"}, + {axisPtAssoc, "p_{T} (GeV/c)"}, + {axisPtTrigger, "p_{T} (GeV/c)"}, + {axisMultiplicity, "multiplicity / centrality"}, + {axisDeltaPhi, "#Delta#varphi (rad)"}, + {axisVertex, "z-vtx (cm)"}}; + std::vector effAxis = {{axisEtaEfficiency, "#eta"}, + {axisEtaEfficiency, "#eta"}, + {axisPtEfficiency, "p_{T} (GeV/c)"}, + {axisVertexEfficiency, "z-vtx (cm)"}}; + same.setObject(new CorrelationContainer("sameEvent", "sameEvent", corrAxis, effAxis, {})); + mixed.setObject(new CorrelationContainer("mixedEvent", "mixedEvent", corrAxis, effAxis, {})); + + LOGF(info, "Finishing init"); + } + + Filter collisionZVtxFilter = nabs(aod::collision::posZ) < cfgZVtxCut; + Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && (requireGlobalTrackInFilter() || (aod::track::isGlobalTrackSDD == (uint8_t) true)); + + struct SameEventTag { + }; + struct MixedEventTag { + }; + + template + void fillQA(TTracks tracks, float multiplicity) + { + for (auto& track: tracks) { + histos.fill(HIST("yields"), multiplicity, track.pt(), track.eta()); + histos.fill(HIST("etaphi"), multiplicity, track.eta(), track.phi()); + } + } + + template + bool fillCollision(TTarget target, TCollision collision, float multiplicity) + { + target->fillEvent(multiplicity, CorrelationContainer::kCFStepAll); + if (!collision.alias_bit(kINT7) || !collision.sel7()){ + return false; + } + target->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); + return true; + } + + template + void fillCorrelations(TTarget target, TTracks tracks1, TTracks tracks2, float multiplicity, float posZ) + { + for (const auto& track1 : tracks1) { + if (isTrackCut(track1) == false) { + return; + } + float phi1 = phi(track1.px(), track1.py()); + phi1 = RecoDecay::constrainAngle(phi1, 0.f); + float eta1 = eta(track1.px(), track1.py(), track1.pz()); + target->getTriggerHist()->Fill(CorrelationContainer::kCFStepReconstructed, track1.pt(), multiplicity, posZ, 1.0); + for (const auto& track2 : tracks2) { + if (track1 == track2) { + continue; + } + if (isTrackCut(track2) == false) { + return; + } + float phi2 = phi(track2.px(), track2.py()); + phi2 = RecoDecay::constrainAngle(phi2, 0.f); + float eta2 = eta(track2.px(), track2.py(), track2.pz()); + if (doPairCuts && mPairCuts.conversionCuts(track1, track2)) { + continue; + } + float deltaPhi = phi1 - phi2; + float deltaEta = eta1 - eta2; + deltaPhi = RecoDecay::constrainAngle(deltaPhi, -PIHalf); + target->getPairHist()->Fill(CorrelationContainer::kCFStepReconstructed, + deltaEta, + track2.pt(), track1.pt(), + multiplicity, + deltaPhi, + posZ); + if constexpr (std::is_same_v) { + if (minMultiplicity <= multiplicity) { + histos.fill(HIST("sameEvent2D"), deltaEta, deltaPhi); + } + if (minMultiplicity <= multiplicity && multiplicity <= range1Max) { + histos.fill(HIST("sameEvent_2_10"), deltaEta, deltaPhi); + } + if (range2Min <= multiplicity && multiplicity <= range2Max) { + histos.fill(HIST("sameEvent_11_20"), deltaEta, deltaPhi); + } + if (range3Min <= multiplicity && multiplicity <= range3Max) { + histos.fill(HIST("sameEvent_21_30"), deltaEta, deltaPhi); + } + if (range4Min <= multiplicity && multiplicity <= range4Max) { + histos.fill(HIST("sameEvent_31_40"), deltaEta, deltaPhi); + } + if (range5Min <= multiplicity && multiplicity <= range5Max) { + histos.fill(HIST("sameEvent_41_50"), deltaEta, deltaPhi); + } + } else if constexpr (std::is_same_v) { + if (minMultiplicity <= multiplicity) { + histos.fill(HIST("mixedEvent2D"), deltaEta, deltaPhi); + } + if (minMultiplicity <= multiplicity && multiplicity <= range1Max) { + histos.fill(HIST("mixedEvent_2_10"), deltaEta, deltaPhi); + } + if (range2Min <= multiplicity && multiplicity <= range2Max) { + histos.fill(HIST("mixedEvent_11_20"), deltaEta, deltaPhi); + } + if (range3Min <= multiplicity && multiplicity <= range3Max) { + histos.fill(HIST("mixedEvent_21_30"), deltaEta, deltaPhi); + } + if (range4Min <= multiplicity && multiplicity <= range4Max) { + histos.fill(HIST("mixedEvent_31_40"), deltaEta, deltaPhi); + } + if (range5Min <= multiplicity && multiplicity <= range5Max) { + histos.fill(HIST("mixedEvent_41_50"), deltaEta, deltaPhi); + } + } + } + } + } + + void processSame() + { + } + + void processMixed() + { + } + void process(aod::Collision const&, aod::Tracks const&) + { + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc), + }; +} \ No newline at end of file From 76ffe43eb5568f0d02f072dc3d6a6ef505dc9251 Mon Sep 17 00:00:00 2001 From: Josue Martinez Garcia Date: Tue, 11 Nov 2025 00:26:59 -0600 Subject: [PATCH 04/11] adding selection criteria --- .../Tasks/twoParticleCorrelationpp.cxx | 615 +++++++++++++----- 1 file changed, 469 insertions(+), 146 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx index 1cbfa243dea..3f9c3b7b54a 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx @@ -12,18 +12,17 @@ #include "PWGCF/Core/CorrelationContainer.h" #include "PWGCF/Core/PairCuts.h" -#include "CommonConstants/MathConstants.h" +#include "Common/Core/RecoDecay.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/TrackSelectionTables.h" -#include "Common/Core/RecoDecay.h" #include "CommonConstants/MathConstants.h" -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" #include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" #include "Framework/HistogramRegistry.h" #include "Framework/RunningWorkflowInfo.h" +#include "Framework/runDataProcessing.h" using namespace o2; using namespace o2::framework; @@ -32,51 +31,77 @@ using namespace o2::framework::expressions; static constexpr float cfgPairCutDefaults[1][5] = {{-1, -1, -1, -1, -1}}; constexpr float kThreeHalfPi = 1.5f * PI; -struct TwoParticleCorrelations { - - // Declare configurables on events/collisions - Configurable minMultiplicity{"minMultiplicity", 2, {"Range on multiplicity"}}; - Configurable range1Max{"range1Max", 10, {"Range on multiplicity"}}; - Configurable range2Min{"range2Min", 11, {"Range on multiplicity"}}; - Configurable range2Max{"range2Max", 20, {"Range on multiplicity"}}; - Configurable range3Min{"range3Min", 21, {"Range on multiplicity"}}; - Configurable range3Max{"range3Max", 30, {"Range on multiplicity"}}; - Configurable range4Min{"range4Min", 31, {"Range on multiplicity"}}; - Configurable range4Max{"range4Max", 40, {"Range on multiplicity"}}; - Configurable range5Min{"range5Min", 41, {"Range on multiplicity"}}; - Configurable range5Max{"range5Max", 50, {"Range on multiplicity"}}; - // Declare configurables for correlations - Configurable cfgZVtxCut = {"zvtxcut", 10.0, "Vertex z cut. Default 10 cm"}; - Configurable cfgPtCutMin = {"minpt", 0.2, "Minimum accepted track pT. Default 0.2 GeV"}; - Configurable cfgPtCutMax = {"maxpt", 3.0, "Maximum accepted track pT. Default 3.0 GeV"}; - Configurable cfgEtaCut = {"etacut", 0.8, "Eta cut. Default 0.8"}; - Configurable> cfgPairCut{"cfgPairCut", - {cfgPairCutDefaults[0], - 5, - {"Photon", "K0", "Lambda", "Phi", "Rho"}}, - "Pair cuts on various particles"}; - //Configurable cfgTwoTrackCut{"cfgTwoTrackCut", -1, {"Two track cut"}}; - ConfigurableAxis axisVertex{"axisVertex", {7, -7, 7}, "vertex axis for histograms"}; - ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {32, -constants::math::PIHalf, constants::math::PIHalf * 3}, "delta phi axis for histograms"}; - ConfigurableAxis axisDeltaEta{"axisDeltaEta", {32, -1.6, 1.6}, "delta eta axis for histograms"}; - ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; - ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0}, "pt associated axis for histograms"}; - ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100.1},"multiplicity / centrality axis for histograms"}; - ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; - ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; - ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25,2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; - - // Output definitions - OutputObj same{"sameEvent"}; - OutputObj mixed{"mixedEvent"}; - HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; - PairCuts mPairCuts; - bool doPairCuts = false; +struct TwoParticleCorrelationpp { + + // Declare configurables on events/collisions + Configurable minMultiplicity{"minMultiplicity", 2, {"Range on multiplicity"}}; + Configurable range1Max{"range1Max", 10, {"Range on multiplicity"}}; + Configurable range2Min{"range2Min", 11, {"Range on multiplicity"}}; + Configurable range2Max{"range2Max", 20, {"Range on multiplicity"}}; + Configurable range3Min{"range3Min", 21, {"Range on multiplicity"}}; + Configurable range3Max{"range3Max", 30, {"Range on multiplicity"}}; + Configurable range4Min{"range4Min", 31, {"Range on multiplicity"}}; + Configurable range4Max{"range4Max", 40, {"Range on multiplicity"}}; + Configurable range5Min{"range5Min", 41, {"Range on multiplicity"}}; + Configurable range5Max{"range5Max", 50, {"Range on multiplicity"}}; + Configurable nEventsMixed{"nEventsMixed", 5, {"Events to be Mixed"}}; + Configurable EvSel8{"EvSel8", true, {"rejects collisions using sel8()"}}; + Configurable cfgZVtxCut = {"zvtxcut", 10.0, "Vertex z cut. Default 10 cm"}; + Configurable EvSelkNoSameBunchPileup{"EvSelkNoSameBunchPileup", true, {"rejects collisions which are associated with the same found-by-T0 bunch crossing"}}; + Configurable EvSelkNoITSROFrameBorder{"EvSelkNoITSROFrameBorder", true, {"reject events at ITS ROF border"}}; + Configurable EvSelkNoTimeFrameBorder{"EvSelkNoTimeFrameBorder", true, {"reject events at TF border"}}; + Configurable EvSelkIsGoodZvtxFT0vsPV{"EvSelkIsGoodZvtxFT0vsPV", true, {"removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference, use this cut at low multiplicities with caution"}}; + Configurable EvSelkNoCollInTimeRangeStandard{"EvSelkNoCollInTimeRangeStandard", true, {"no collisions in specified time range"}}; + // Declare configurables on tracks + Configurable cutMyptMin{"cutMyptMin", 0.2, {"My Track cut"}}; + Configurable cutMyptMax{"cutMyptMax", 3., {"My Track cut"}}; + Configurable cutMyetaMin{"cutMyetaMin", -0.8, {"My Track cut"}}; + Configurable cutMyetaMax{"cutMyetaMax", 0.8, {"My Track cut"}}; + Configurable cutMydcaZmax{"cutMydcaZmax", 2.f, {"My Track cut"}}; + Configurable cutMydcaXYmax{"cutMydcaXYmax", 1e0f, {"My Track cut"}}; + Configurable cutMydcaXYusePt{"cutMydcaXYusePt", false, {"My Track cut"}}; + Configurable cutMyHasITS{"cutMyHasITS", true, {"My Track cut"}}; + Configurable cutMyITSNClsMin{"cutMyITSNClsMin", 1, {"My Track cut"}}; + Configurable cutMyITSChi2NClMax{"cutMyITSChi2NClMax", 36.f, {"My Track cut"}}; + Configurable cutMyHasTPC{"cutMyHasTPC", true, {"MyGlobalTrack cut"}}; + Configurable cutMyTPCNClsCrossedRowsMin{"cutMyTPCNClsCrossedRowsMin", 70, {"My Track cut"}}; + Configurable cutMyTPCNClsFindableMin{"cutMyTPCNClsFindableMin", 50, {"My Track cut"}}; + Configurable cutMyTPCNClsMin{"cutMyTPCNClsMin", 1, {"My Track cut"}}; + Configurable cutMyTPCNClsCrossedRowsOverNClsFindableMin{"cutMyTPCNClsCrossedRowsOverNClsFindableMin", 0.8f, {"My Track cut"}}; + Configurable cutMyTPCNClsOverFindableNClsMin{"cutMyTPCNClsOverFindableNClsMin", 0.5f, {"My Track cut"}}; + Configurable cutMyTPCChi2NclMax{"cutMyTPCChi2NclMax", 4.f, {"My Track cut"}}; + // Declare configurables for correlations + + Configurable> cfgPairCut{"cfgPairCut", + {cfgPairCutDefaults[0], + 5, + {"Photon", "K0", "Lambda", "Phi", "Rho"}}, + "Pair cuts on various particles"}; + // Configurable cfgTwoTrackCut{"cfgTwoTrackCut", -1, {"Two track cut"}}; + ConfigurableAxis axisVertex{"axisVertex", {7, -7, 7}, "vertex axis for histograms"}; + ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {32, -constants::math::PIHalf, constants::math::PIHalf * 3}, "delta phi axis for histograms"}; + ConfigurableAxis axisDeltaEta{"axisDeltaEta", {32, -1.6, 1.6}, "delta eta axis for histograms"}; + ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; + ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0}, "pt associated axis for histograms"}; + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100.1}, "multiplicity / centrality axis for histograms"}; + ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; + ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; + + // Output definitions + OutputObj same{"sameEvent"}; + OutputObj mixed{"mixedEvent"}; + HistogramRegistry histos{"histos", {}, OutputObjHandlingPolicy::AnalysisObject}; + PairCuts mPairCuts; + bool doPairCuts = false; void init(InitContext&) { LOGF(info, "Starting init"); + const AxisSpec axisCountTracks{17, -0.5, 16.5}; + const AxisSpec axisCountEvents{8, -0.5, 7.5}; + histos.add("yields", "multiplicity/centrality vs pT vs eta", {HistType::kTH3F, {{100, 0, 100, "/multiplicity/centrality"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); histos.add("etaphi", "multiplicity/centrality vs eta vs phi", {HistType::kTH3F, {{100, 0, 100, "multiplicity/centrality"}, {100, -2, 2, "#eta"}, {200, 0, 2 * M_PI, "#varphi"}}}); histos.add("sameEvent2D", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); @@ -91,155 +116,453 @@ struct TwoParticleCorrelations { histos.add("mixedEvent_21_30", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); histos.add("mixedEvent_31_40", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); histos.add("mixedEvent_41_50", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); + histos.add("Tracks/hTracksAfterCuts", " ; ; counts", kTH1F, {axisCountTracks}); + histos.add("Events/hEventsAfterCuts", " ; ; counts", kTH1F, {axisCountEvents}); const int maxMixBin = axisMultiplicity->size() * axisVertex->size(); histos.add("eventcount", "bin", {HistType::kTH1F, {{maxMixBin + 2, -2.5, -0.5 + maxMixBin, "bin"}}}); mPairCuts.SetHistogramRegistry(&histos); if (cfgPairCut->get("Photon") > 0 || cfgPairCut->get("K0") > 0 || cfgPairCut->get("Lambda") > 0 || - cfgPairCut->get("Phi") > 0 || cfgPairCut->get("Rho") > 0) { - mPairCuts.SetPairCut(PairCuts::Photon, cfgPairCut->get("Photon")); - mPairCuts.SetPairCut(PairCuts::K0, cfgPairCut->get("K0")); - mPairCuts.SetPairCut(PairCuts::Lambda, cfgPairCut->get("Lambda")); - mPairCuts.SetPairCut(PairCuts::Phi, cfgPairCut->get("Phi")); - mPairCuts.SetPairCut(PairCuts::Rho, cfgPairCut->get("Rho")); - doPairCuts = true; + cfgPairCut->get("Phi") > 0 || cfgPairCut->get("Rho") > 0) { + mPairCuts.SetPairCut(PairCuts::Photon, cfgPairCut->get("Photon")); + mPairCuts.SetPairCut(PairCuts::K0, cfgPairCut->get("K0")); + mPairCuts.SetPairCut(PairCuts::Lambda, cfgPairCut->get("Lambda")); + mPairCuts.SetPairCut(PairCuts::Phi, cfgPairCut->get("Phi")); + mPairCuts.SetPairCut(PairCuts::Rho, cfgPairCut->get("Rho")); + doPairCuts = true; } std::vector corrAxis = {{axisDeltaEta, "#Delta#eta"}, - {axisPtAssoc, "p_{T} (GeV/c)"}, - {axisPtTrigger, "p_{T} (GeV/c)"}, - {axisMultiplicity, "multiplicity / centrality"}, - {axisDeltaPhi, "#Delta#varphi (rad)"}, - {axisVertex, "z-vtx (cm)"}}; + {axisPtAssoc, "p_{T} (GeV/c)"}, + {axisPtTrigger, "p_{T} (GeV/c)"}, + {axisMultiplicity, "multiplicity / centrality"}, + {axisDeltaPhi, "#Delta#varphi (rad)"}, + {axisVertex, "z-vtx (cm)"}}; std::vector effAxis = {{axisEtaEfficiency, "#eta"}, - {axisEtaEfficiency, "#eta"}, - {axisPtEfficiency, "p_{T} (GeV/c)"}, - {axisVertexEfficiency, "z-vtx (cm)"}}; + {axisEtaEfficiency, "#eta"}, + {axisPtEfficiency, "p_{T} (GeV/c)"}, + {axisVertexEfficiency, "z-vtx (cm)"}}; same.setObject(new CorrelationContainer("sameEvent", "sameEvent", corrAxis, effAxis, {})); mixed.setObject(new CorrelationContainer("mixedEvent", "mixedEvent", corrAxis, effAxis, {})); LOGF(info, "Finishing init"); } - Filter collisionZVtxFilter = nabs(aod::collision::posZ) < cfgZVtxCut; - Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && (requireGlobalTrackInFilter() || (aod::track::isGlobalTrackSDD == (uint8_t) true)); + // Filter collisionZVtxFilter = nabs(aod::collision::posZ) < cfgZVtxCut; + // Filter trackFilter = (nabs(aod::track::eta) < cfgEtaCut) && (aod::track::pt > cfgPtCutMin) && (aod::track::pt < cfgPtCutMax) && (requireGlobalTrackInFilter() || (aod::track::isGlobalTrackSDD == (uint8_t) true)); + + using FullCollisions = soa::Join; + using FullTracks = soa::Join; struct SameEventTag { }; struct MixedEventTag { }; + SliceCache cache; + std::vector vtxBinsEdges{VARIABLE_WIDTH, -10.0f, -7.0f, -5.0f, -2.5f, 0.0f, 2.5f, 5.0f, 7.0f, 10.0f}; + using BinningType = ColumnBinningPolicy; + + template + bool isEventSelected(TCollision collision) + { + if (EvSel8 && !collision.sel8()) { + return false; + } + if (collision.posZ() < -cfgZVtxCut || cfgZVtxCut < collision.posZ()) { + return false; + } + if (EvSelkNoSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + return false; + } + if (EvSelkNoITSROFrameBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + return false; + } + if (EvSelkNoTimeFrameBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + return false; + } + if (EvSelkIsGoodZvtxFT0vsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + return false; + } + if (EvSelkNoCollInTimeRangeStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + return false; + } + return true; + } + + template + bool isTrackCut(T const& track) + { + if (track.sign() != 1 && track.sign() != -1) { + return false; + } + if (track.pt() < cutMyptMin || track.pt() > cutMyptMax) { + return false; + } + if (track.eta() < cutMyetaMin || track.eta() > cutMyetaMax) { + return false; + } + if (std::abs(track.dcaZ()) > cutMydcaZmax) { + return false; + } + if (cutMydcaXYusePt) { + float maxDCA = 0.0105f + 0.0350f / std::pow(track.pt(), 1.1f); + if (std::abs(track.dcaXY()) > maxDCA) { + return false; + } + } else { + if (std::abs(track.dcaXY()) > cutMydcaXYmax) { + return false; + } + } + if (track.isPVContributor() == false) { + return false; + } + // Quality Track + // ITS + if (cutMyHasITS && !track.hasITS()) { + return false; // ITS refit + } + if (track.itsNCls() < cutMyITSNClsMin) { + return false; + } + if (track.itsChi2NCl() > cutMyITSChi2NClMax) { + return false; + } + // TPC + if (cutMyHasTPC && !track.hasTPC()) { + return false; // TPC refit + } + if (track.tpcNClsCrossedRows() < cutMyTPCNClsCrossedRowsMin) { + return false; + } + if ((track.tpcNClsFindable() - track.tpcNClsFindableMinusFound()) < cutMyTPCNClsMin) { + return false; // tpcNClsFound() + } + if (track.tpcNClsFindable() < cutMyTPCNClsFindableMin) { + return false; + } + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < cutMyTPCNClsCrossedRowsOverNClsFindableMin) { + return false; // + } + if ((static_cast(track.tpcNClsFindable() - track.tpcNClsFindableMinusFound()) / static_cast(track.tpcNClsFindable())) < cutMyTPCNClsCrossedRowsOverNClsFindableMin) { + return false; // + } + if (track.tpcChi2NCl() > cutMyTPCChi2NclMax) { + return false; // TPC chi2 + } + return true; + } + template void fillQA(TTracks tracks, float multiplicity) { - for (auto& track: tracks) { - histos.fill(HIST("yields"), multiplicity, track.pt(), track.eta()); - histos.fill(HIST("etaphi"), multiplicity, track.eta(), track.phi()); - } + for (auto& track : tracks) { + histos.fill(HIST("yields"), multiplicity, track.pt(), track.eta()); + histos.fill(HIST("etaphi"), multiplicity, track.eta(), track.phi()); + } } template bool fillCollision(TTarget target, TCollision collision, float multiplicity) { target->fillEvent(multiplicity, CorrelationContainer::kCFStepAll); - if (!collision.alias_bit(kINT7) || !collision.sel7()){ - return false; - } target->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); return true; } template - void fillCorrelations(TTarget target, TTracks tracks1, TTracks tracks2, float multiplicity, float posZ) + void fillCorrelations(TTarget target, TTracks tracks1, TTracks tracks2, float multiplicity, float posZ, TTag) { - for (const auto& track1 : tracks1) { - if (isTrackCut(track1) == false) { - return; - } - float phi1 = phi(track1.px(), track1.py()); - phi1 = RecoDecay::constrainAngle(phi1, 0.f); - float eta1 = eta(track1.px(), track1.py(), track1.pz()); - target->getTriggerHist()->Fill(CorrelationContainer::kCFStepReconstructed, track1.pt(), multiplicity, posZ, 1.0); - for (const auto& track2 : tracks2) { - if (track1 == track2) { - continue; - } - if (isTrackCut(track2) == false) { - return; - } - float phi2 = phi(track2.px(), track2.py()); - phi2 = RecoDecay::constrainAngle(phi2, 0.f); - float eta2 = eta(track2.px(), track2.py(), track2.pz()); - if (doPairCuts && mPairCuts.conversionCuts(track1, track2)) { - continue; - } - float deltaPhi = phi1 - phi2; - float deltaEta = eta1 - eta2; - deltaPhi = RecoDecay::constrainAngle(deltaPhi, -PIHalf); - target->getPairHist()->Fill(CorrelationContainer::kCFStepReconstructed, - deltaEta, - track2.pt(), track1.pt(), - multiplicity, - deltaPhi, - posZ); - if constexpr (std::is_same_v) { - if (minMultiplicity <= multiplicity) { - histos.fill(HIST("sameEvent2D"), deltaEta, deltaPhi); - } - if (minMultiplicity <= multiplicity && multiplicity <= range1Max) { - histos.fill(HIST("sameEvent_2_10"), deltaEta, deltaPhi); - } - if (range2Min <= multiplicity && multiplicity <= range2Max) { - histos.fill(HIST("sameEvent_11_20"), deltaEta, deltaPhi); - } - if (range3Min <= multiplicity && multiplicity <= range3Max) { - histos.fill(HIST("sameEvent_21_30"), deltaEta, deltaPhi); - } - if (range4Min <= multiplicity && multiplicity <= range4Max) { - histos.fill(HIST("sameEvent_31_40"), deltaEta, deltaPhi); - } - if (range5Min <= multiplicity && multiplicity <= range5Max) { - histos.fill(HIST("sameEvent_41_50"), deltaEta, deltaPhi); - } - } else if constexpr (std::is_same_v) { - if (minMultiplicity <= multiplicity) { - histos.fill(HIST("mixedEvent2D"), deltaEta, deltaPhi); - } - if (minMultiplicity <= multiplicity && multiplicity <= range1Max) { - histos.fill(HIST("mixedEvent_2_10"), deltaEta, deltaPhi); - } - if (range2Min <= multiplicity && multiplicity <= range2Max) { - histos.fill(HIST("mixedEvent_11_20"), deltaEta, deltaPhi); - } - if (range3Min <= multiplicity && multiplicity <= range3Max) { - histos.fill(HIST("mixedEvent_21_30"), deltaEta, deltaPhi); - } - if (range4Min <= multiplicity && multiplicity <= range4Max) { - histos.fill(HIST("mixedEvent_31_40"), deltaEta, deltaPhi); - } - if (range5Min <= multiplicity && multiplicity <= range5Max) { - histos.fill(HIST("mixedEvent_41_50"), deltaEta, deltaPhi); - } - } - } - } + for (const auto& track1 : tracks1) { + if (isTrackCut(track1) == false) { + return; + } + float phi1 = track1.phi(); + phi1 = RecoDecay::constrainAngle(phi1, 0.f); + float eta1 = track1.eta(); + target->getTriggerHist()->Fill(CorrelationContainer::kCFStepReconstructed, track1.pt(), multiplicity, posZ, 1.0); + for (const auto& track2 : tracks2) { + if (track1 == track2) { + continue; + } + if (isTrackCut(track2) == false) { + return; + } + float phi2 = track2.phi(); + phi2 = RecoDecay::constrainAngle(phi2, 0.f); + float eta2 = track2.eta(); + /*if (doPairCuts && mPairCuts.conversionCuts(track1, track2)) { + continue; + }*/ + float deltaPhi = phi1 - phi2; + float deltaEta = eta1 - eta2; + deltaPhi = RecoDecay::constrainAngle(deltaPhi, -PIHalf); + target->getPairHist()->Fill(CorrelationContainer::kCFStepReconstructed, + deltaEta, + track2.pt(), track1.pt(), + multiplicity, + deltaPhi, + posZ); + if constexpr (std::is_same_v) { + if (minMultiplicity <= multiplicity) { + histos.fill(HIST("sameEvent2D"), deltaEta, deltaPhi); + } + if (minMultiplicity <= multiplicity && multiplicity <= range1Max) { + histos.fill(HIST("sameEvent_2_10"), deltaEta, deltaPhi); + } + if (range2Min <= multiplicity && multiplicity <= range2Max) { + histos.fill(HIST("sameEvent_11_20"), deltaEta, deltaPhi); + } + if (range3Min <= multiplicity && multiplicity <= range3Max) { + histos.fill(HIST("sameEvent_21_30"), deltaEta, deltaPhi); + } + if (range4Min <= multiplicity && multiplicity <= range4Max) { + histos.fill(HIST("sameEvent_31_40"), deltaEta, deltaPhi); + } + if (range5Min <= multiplicity && multiplicity <= range5Max) { + histos.fill(HIST("sameEvent_41_50"), deltaEta, deltaPhi); + } + } else if constexpr (std::is_same_v) { + if (minMultiplicity <= multiplicity) { + histos.fill(HIST("mixedEvent2D"), deltaEta, deltaPhi); + } + if (minMultiplicity <= multiplicity && multiplicity <= range1Max) { + histos.fill(HIST("mixedEvent_2_10"), deltaEta, deltaPhi); + } + if (range2Min <= multiplicity && multiplicity <= range2Max) { + histos.fill(HIST("mixedEvent_11_20"), deltaEta, deltaPhi); + } + if (range3Min <= multiplicity && multiplicity <= range3Max) { + histos.fill(HIST("mixedEvent_21_30"), deltaEta, deltaPhi); + } + if (range4Min <= multiplicity && multiplicity <= range4Max) { + histos.fill(HIST("mixedEvent_31_40"), deltaEta, deltaPhi); + } + if (range5Min <= multiplicity && multiplicity <= range5Max) { + histos.fill(HIST("mixedEvent_41_50"), deltaEta, deltaPhi); + } + } + } + } } - void processSame() + void processMixed(FullCollisions const& collisions, FullTracks const& tracks) { + BinningType bindingOnVtx{{vtxBinsEdges}, true}; + auto tracksTuple = std::make_tuple(tracks); + SameKindPair + pairs{bindingOnVtx, nEventsMixed, -1, collisions, tracksTuple, &cache}; + + for (const auto& [collision1, tracks1, collision2, tracks2] : pairs) { + if (collision1.size() == 0 || collision2.size() == 0) { + continue; + } + + if (isEventSelected(collision1) == false || isEventSelected(collision2) == false) { + continue; + } + + float multiplicity = 0; + for (const auto& track : tracks1) { + if (isTrackCut(track) == false) { + continue; + } + ++multiplicity; + } + if (fillCollision(mixed, collision1, multiplicity) == false) { + return; + } + histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ()})); + fillCorrelations(mixed, tracks1, tracks2, multiplicity, collision1.posZ(), MixedEventTag{}); + } } - void processMixed() + PROCESS_SWITCH(TwoParticleCorrelationpp, processMixed, "Process mixed events", true); + + void processSame(FullCollisions::iterator const& collision, FullTracks const& tracks) { + float multiplicity = 0; + + if (isEventSelected(collision) == false) { + return; + } + + for (const auto& track : tracks) { + if (isTrackCut(track) == false) { + continue; + } + ++multiplicity; + } + // LOGF(debug, "Filling same events"); + if (fillCollision(same, collision, multiplicity) == false) { + return; + } + histos.fill(HIST("eventcount"), -2); + fillQA(tracks, multiplicity); + fillCorrelations(same, tracks, tracks, multiplicity, collision.posZ(), SameEventTag{}); } - void process(aod::Collision const&, aod::Tracks const&) + + PROCESS_SWITCH(TwoParticleCorrelationpp, processSame, "Process same events", true); + + void process(FullCollisions::iterator const& collision, FullTracks const& tracks) { + + float multiplicity = 0; + + // Configure events flow histogram labels + auto hFlowEvents = histos.get(HIST("Events/hEventsAfterCuts")); + hFlowEvents->GetXaxis()->SetBinLabel(1, "All tracks"); + hFlowEvents->GetXaxis()->SetBinLabel(2, "sel8"); + hFlowEvents->GetXaxis()->SetBinLabel(3, "Z vertex"); + hFlowEvents->GetXaxis()->SetBinLabel(4, "kNoSameBunchPileup"); + hFlowEvents->GetXaxis()->SetBinLabel(5, "kNoITSROFrameBorder"); + hFlowEvents->GetXaxis()->SetBinLabel(6, "kNoTimeFrameBorder"); + hFlowEvents->GetXaxis()->SetBinLabel(7, "kIsGoodZvtxFT0vsPV"); + hFlowEvents->GetXaxis()->SetBinLabel(8, "kNoCollInTimeRangeStandard"); + + histos.fill(HIST("Events/hEventsAfterCuts"), 0); + if (EvSel8 && !collision.sel8()) { + return; + } + histos.fill(HIST("Events/hEventsAfterCuts"), 1); + if (collision.posZ() < -cfgZVtxCut || cfgZVtxCut < collision.posZ()) { + return; + } + histos.fill(HIST("Events/hEventsAfterCuts"), 2); + if (EvSelkNoSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + return; + } + histos.fill(HIST("Events/hEventsAfterCuts"), 3); + if (EvSelkNoITSROFrameBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + return; + } + histos.fill(HIST("Events/hEventsAfterCuts"), 4); + if (EvSelkNoTimeFrameBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + return; + } + histos.fill(HIST("Events/hEventsAfterCuts"), 5); + if (EvSelkIsGoodZvtxFT0vsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + return; + } + histos.fill(HIST("Events/hEventsAfterCuts"), 6); + if (EvSelkNoCollInTimeRangeStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + return; + } + histos.fill(HIST("Events/hEventsAfterCuts"), 7); + + // Configure track flow histogram labels + auto hFlowTracks = histos.get(HIST("Tracks/hTracksAfterCuts")); + hFlowTracks->GetXaxis()->SetBinLabel(1, "All tracks"); + hFlowTracks->GetXaxis()->SetBinLabel(2, "Track sign"); + hFlowTracks->GetXaxis()->SetBinLabel(3, "p_{T} range"); + hFlowTracks->GetXaxis()->SetBinLabel(4, "#eta range"); + hFlowTracks->GetXaxis()->SetBinLabel(5, "dcaZ"); + hFlowTracks->GetXaxis()->SetBinLabel(6, "dcaXY"); + hFlowTracks->GetXaxis()->SetBinLabel(7, "PV contrib cut"); + hFlowTracks->GetXaxis()->SetBinLabel(8, "has ITS cut"); + hFlowTracks->GetXaxis()->SetBinLabel(9, "N clusters ITS cut"); + hFlowTracks->GetXaxis()->SetBinLabel(10, "#chi^{2} N cluster ITS cut"); + hFlowTracks->GetXaxis()->SetBinLabel(11, "has TPC cut"); + hFlowTracks->GetXaxis()->SetBinLabel(12, "N clusters crossed row TPC cut"); + hFlowTracks->GetXaxis()->SetBinLabel(13, "(N cluster findable - N cluster minus findable) TPC cut"); + hFlowTracks->GetXaxis()->SetBinLabel(14, "N cluster findable TPC cut"); + hFlowTracks->GetXaxis()->SetBinLabel(15, "(N cluster crossed row / N cluster findable) TPC cut"); + hFlowTracks->GetXaxis()->SetBinLabel(16, "(N cluster findable - N cluster minus findable) / N cluster findable cut"); + hFlowTracks->GetXaxis()->SetBinLabel(17, "#chi^{2} N cluster TPC cut"); + + for (const auto& track : tracks) { + histos.fill(HIST("Tracks/hTracksAfterCuts"), 0); + if (track.sign() != 1 && track.sign() != -1) { + continue; + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 1); + if (track.pt() < cutMyptMin || track.pt() > cutMyptMax) { + continue; + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 2); + if (track.eta() < cutMyetaMin || track.eta() > cutMyetaMax) { + continue; + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 3); + if (std::abs(track.dcaZ()) > cutMydcaZmax) { + continue; + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 4); + if (cutMydcaXYusePt) { + float maxDCA = 0.0105f + 0.0350f / std::pow(track.pt(), 1.1f); + if (std::abs(track.dcaXY()) > maxDCA) { + continue; + } + } else { + if (std::abs(track.dcaXY()) > cutMydcaXYmax) { + continue; + } + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 5); + if (track.isPVContributor() == false) { + continue; + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 6); + // Quality Track + // ITS + if (cutMyHasITS && !track.hasITS()) { + continue; // ITS refit + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 7); + if (track.itsNCls() < cutMyITSNClsMin) { + continue; + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 8); + if (track.itsChi2NCl() > cutMyITSChi2NClMax) { + continue; + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 9); + // TPC + if (cutMyHasTPC && !track.hasTPC()) { + continue; // TPC refit + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 10); + if (track.tpcNClsCrossedRows() < cutMyTPCNClsCrossedRowsMin) { + continue; + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 11); + if ((track.tpcNClsFindable() - track.tpcNClsFindableMinusFound()) < cutMyTPCNClsMin) { + continue; // tpcNClsFound() + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 12); + if (track.tpcNClsFindable() < cutMyTPCNClsFindableMin) { + continue; + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 13); + if ((static_cast(track.tpcNClsCrossedRows()) / static_cast(track.tpcNClsFindable())) < cutMyTPCNClsCrossedRowsOverNClsFindableMin) { + continue; // + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 14); + if ((static_cast(track.tpcNClsFindable() - track.tpcNClsFindableMinusFound()) / static_cast(track.tpcNClsFindable())) < cutMyTPCNClsCrossedRowsOverNClsFindableMin) { + continue; // + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 15); + if (track.tpcChi2NCl() > cutMyTPCChi2NclMax) { + continue; // TPC chi2 + } + histos.fill(HIST("Tracks/hTracksAfterCuts"), 16); + + if (isTrackCut(track) == false) { + continue; + } + ++multiplicity; + } } + + PROCESS_SWITCH(TwoParticleCorrelationpp, process, "Process mixed events", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc), }; -} \ No newline at end of file +} From 45797a83f1e68352ab5bd099de335eda7a8003a4 Mon Sep 17 00:00:00 2001 From: Josue Martinez Garcia Date: Tue, 11 Nov 2025 01:01:22 -0600 Subject: [PATCH 05/11] resolving o2 linter issues --- .../Tasks/twoParticleCorrelationpp.cxx | 68 ++++++++++--------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx index 3f9c3b7b54a..eb46ec68951 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx @@ -9,6 +9,10 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. +/// \file twoParticleCorrelationpp.cxx +/// \brief Task for two particle correlation in pp in order to calculate a baseline in a template fit for the flow coefficients +/// \author Josué Martínez García + #include "PWGCF/Core/CorrelationContainer.h" #include "PWGCF/Core/PairCuts.h" @@ -45,13 +49,13 @@ struct TwoParticleCorrelationpp { Configurable range5Min{"range5Min", 41, {"Range on multiplicity"}}; Configurable range5Max{"range5Max", 50, {"Range on multiplicity"}}; Configurable nEventsMixed{"nEventsMixed", 5, {"Events to be Mixed"}}; - Configurable EvSel8{"EvSel8", true, {"rejects collisions using sel8()"}}; - Configurable cfgZVtxCut = {"zvtxcut", 10.0, "Vertex z cut. Default 10 cm"}; - Configurable EvSelkNoSameBunchPileup{"EvSelkNoSameBunchPileup", true, {"rejects collisions which are associated with the same found-by-T0 bunch crossing"}}; - Configurable EvSelkNoITSROFrameBorder{"EvSelkNoITSROFrameBorder", true, {"reject events at ITS ROF border"}}; - Configurable EvSelkNoTimeFrameBorder{"EvSelkNoTimeFrameBorder", true, {"reject events at TF border"}}; - Configurable EvSelkIsGoodZvtxFT0vsPV{"EvSelkIsGoodZvtxFT0vsPV", true, {"removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference, use this cut at low multiplicities with caution"}}; - Configurable EvSelkNoCollInTimeRangeStandard{"EvSelkNoCollInTimeRangeStandard", true, {"no collisions in specified time range"}}; + Configurable evSel8{"evSel8", true, {"rejects collisions using sel8()"}}; + Configurable cfgZVtxCut = {"cfgZVtxCut", 10.0, "Vertex z cut. Default 10 cm"}; + Configurable evSelkNoSameBunchPileup{"evSelkNoSameBunchPileup", true, {"rejects collisions which are associated with the same found-by-T0 bunch crossing"}}; + Configurable evSelkNoITSROFrameBorder{"evSelkNoITSROFrameBorder", true, {"reject events at ITS ROF border"}}; + Configurable evSelkNoTimeFrameBorder{"evSelkNoTimeFrameBorder", true, {"reject events at TF border"}}; + Configurable evSelkIsGoodZvtxFT0vsPV{"evSelkIsGoodZvtxFT0vsPV", true, {"removes collisions with large differences between z of PV by tracks and z of PV from FT0 A-C time difference, use this cut at low multiplicities with caution"}}; + Configurable evSelkNoCollInTimeRangeStandard{"evSelkNoCollInTimeRangeStandard", true, {"no collisions in specified time range"}}; // Declare configurables on tracks Configurable cutMyptMin{"cutMyptMin", 0.2, {"My Track cut"}}; Configurable cutMyptMax{"cutMyptMax", 3., {"My Track cut"}}; @@ -78,15 +82,15 @@ struct TwoParticleCorrelationpp { {"Photon", "K0", "Lambda", "Phi", "Rho"}}, "Pair cuts on various particles"}; // Configurable cfgTwoTrackCut{"cfgTwoTrackCut", -1, {"Two track cut"}}; - ConfigurableAxis axisVertex{"axisVertex", {7, -7, 7}, "vertex axis for histograms"}; - ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {32, -constants::math::PIHalf, constants::math::PIHalf * 3}, "delta phi axis for histograms"}; - ConfigurableAxis axisDeltaEta{"axisDeltaEta", {32, -1.6, 1.6}, "delta eta axis for histograms"}; - ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; - ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0}, "pt associated axis for histograms"}; - ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 100.1}, "multiplicity / centrality axis for histograms"}; - ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; - ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; - ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; + ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; + ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {32, -PIHalf, kThreeHalfPi}, "delta phi axis for histograms"}; + ConfigurableAxis axisDeltaEta{"axisDeltaEta", {32, -1.6, 1.6}, "delta eta axis for histograms"}; + ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; + ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0}, "pt associated axis for histograms"}; + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100, 110.1}, "multiplicity / multiplicity axis for histograms"}; + ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; + ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; // Output definitions OutputObj same{"sameEvent"}; @@ -102,8 +106,8 @@ struct TwoParticleCorrelationpp { const AxisSpec axisCountTracks{17, -0.5, 16.5}; const AxisSpec axisCountEvents{8, -0.5, 7.5}; - histos.add("yields", "multiplicity/centrality vs pT vs eta", {HistType::kTH3F, {{100, 0, 100, "/multiplicity/centrality"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); - histos.add("etaphi", "multiplicity/centrality vs eta vs phi", {HistType::kTH3F, {{100, 0, 100, "multiplicity/centrality"}, {100, -2, 2, "#eta"}, {200, 0, 2 * M_PI, "#varphi"}}}); + histos.add("yields", "multiplicity vs pT vs eta", {HistType::kTH3F, {{100, 0, 100, "multiplicity"}, {40, 0, 20, "p_{T}"}, {100, -2, 2, "#eta"}}}); + histos.add("etaphi", "multiplicity vs eta vs phi", {HistType::kTH3F, {{100, 0, 100, "multiplicity"}, {100, -2, 2, "#eta"}, {64, 0., TwoPI, "#varphi"}}}); histos.add("sameEvent2D", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); histos.add("sameEvent_2_10", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); histos.add("sameEvent_11_20", "#Delta #eta vs #Delta #phi", {HistType::kTH2F, {axisDeltaEta, axisDeltaPhi}}); @@ -166,25 +170,25 @@ struct TwoParticleCorrelationpp { template bool isEventSelected(TCollision collision) { - if (EvSel8 && !collision.sel8()) { + if (evSel8 && !collision.sel8()) { return false; } if (collision.posZ() < -cfgZVtxCut || cfgZVtxCut < collision.posZ()) { return false; } - if (EvSelkNoSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + if (evSelkNoSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { return false; } - if (EvSelkNoITSROFrameBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + if (evSelkNoITSROFrameBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { return false; } - if (EvSelkNoTimeFrameBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + if (evSelkNoTimeFrameBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { return false; } - if (EvSelkIsGoodZvtxFT0vsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + if (evSelkIsGoodZvtxFT0vsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { return false; } - if (EvSelkNoCollInTimeRangeStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + if (evSelkNoCollInTimeRangeStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return false; } return true; @@ -257,7 +261,7 @@ struct TwoParticleCorrelationpp { template void fillQA(TTracks tracks, float multiplicity) { - for (auto& track : tracks) { + for (const auto& track : tracks) { histos.fill(HIST("yields"), multiplicity, track.pt(), track.eta()); histos.fill(HIST("etaphi"), multiplicity, track.eta(), track.phi()); } @@ -424,7 +428,7 @@ struct TwoParticleCorrelationpp { hFlowEvents->GetXaxis()->SetBinLabel(8, "kNoCollInTimeRangeStandard"); histos.fill(HIST("Events/hEventsAfterCuts"), 0); - if (EvSel8 && !collision.sel8()) { + if (evSel8 && !collision.sel8()) { return; } histos.fill(HIST("Events/hEventsAfterCuts"), 1); @@ -432,23 +436,23 @@ struct TwoParticleCorrelationpp { return; } histos.fill(HIST("Events/hEventsAfterCuts"), 2); - if (EvSelkNoSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { + if (evSelkNoSameBunchPileup && !collision.selection_bit(o2::aod::evsel::kNoSameBunchPileup)) { return; } histos.fill(HIST("Events/hEventsAfterCuts"), 3); - if (EvSelkNoITSROFrameBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { + if (evSelkNoITSROFrameBorder && !collision.selection_bit(o2::aod::evsel::kNoITSROFrameBorder)) { return; } histos.fill(HIST("Events/hEventsAfterCuts"), 4); - if (EvSelkNoTimeFrameBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { + if (evSelkNoTimeFrameBorder && !collision.selection_bit(o2::aod::evsel::kNoTimeFrameBorder)) { return; } histos.fill(HIST("Events/hEventsAfterCuts"), 5); - if (EvSelkIsGoodZvtxFT0vsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { + if (evSelkIsGoodZvtxFT0vsPV && !collision.selection_bit(o2::aod::evsel::kIsGoodZvtxFT0vsPV)) { return; } histos.fill(HIST("Events/hEventsAfterCuts"), 6); - if (EvSelkNoCollInTimeRangeStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { + if (evSelkNoCollInTimeRangeStandard && !collision.selection_bit(o2::aod::evsel::kNoCollInTimeRangeStandard)) { return; } histos.fill(HIST("Events/hEventsAfterCuts"), 7); @@ -563,6 +567,6 @@ struct TwoParticleCorrelationpp { WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc, "two-particle-correlation-pp"), }; } From e62c3c76c6fb46e3716b54e391376362eb337f53 Mon Sep 17 00:00:00 2001 From: Josue Martinez Garcia Date: Tue, 11 Nov 2025 01:11:51 -0600 Subject: [PATCH 06/11] resolving o2 linter issues --- ...tionpp.cxx => twoParticleCorrelationPp.cxx} | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) rename PWGCF/TwoParticleCorrelations/Tasks/{twoParticleCorrelationpp.cxx => twoParticleCorrelationPp.cxx} (95%) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx similarity index 95% rename from PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx rename to PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx index eb46ec68951..61bf04153c8 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationpp.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx @@ -28,6 +28,8 @@ #include "Framework/RunningWorkflowInfo.h" #include "Framework/runDataProcessing.h" +#include + using namespace o2; using namespace o2::framework; using namespace o2::framework::expressions; @@ -83,14 +85,14 @@ struct TwoParticleCorrelationpp { "Pair cuts on various particles"}; // Configurable cfgTwoTrackCut{"cfgTwoTrackCut", -1, {"Two track cut"}}; ConfigurableAxis axisVertex{"axisVertex", {20, -10, 10}, "vertex axis for histograms"}; - ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {32, -PIHalf, kThreeHalfPi}, "delta phi axis for histograms"}; - ConfigurableAxis axisDeltaEta{"axisDeltaEta", {32, -1.6, 1.6}, "delta eta axis for histograms"}; - ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; - ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0}, "pt associated axis for histograms"}; - ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100, 110.1}, "multiplicity / multiplicity axis for histograms"}; - ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; - ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; - ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; + ConfigurableAxis axisDeltaPhi{"axisDeltaPhi", {32, -PIHalf, kThreeHalfPi}, "delta phi axis for histograms"}; + ConfigurableAxis axisDeltaEta{"axisDeltaEta", {32, -1.6, 1.6}, "delta eta axis for histograms"}; + ConfigurableAxis axisPtTrigger{"axisPtTrigger", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, 10.0}, "pt trigger axis for histograms"}; + ConfigurableAxis axisPtAssoc{"axisPtAssoc", {VARIABLE_WIDTH, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0}, "pt associated axis for histograms"}; + ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 60, 70, 80, 90, 100, 110.1}, "multiplicity / multiplicity axis for histograms"}; + ConfigurableAxis axisVertexEfficiency{"axisVertexEfficiency", {10, -10, 10}, "vertex axis for efficiency histograms"}; + ConfigurableAxis axisEtaEfficiency{"axisEtaEfficiency", {20, -1.0, 1.0}, "eta axis for efficiency histograms"}; + ConfigurableAxis axisPtEfficiency{"axisPtEfficiency", {VARIABLE_WIDTH, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5, 2.75, 3.0, 3.25, 3.5, 3.75, 4.0, 4.5, 5.0, 6.0, 7.0, 8.0}, "pt axis for efficiency histograms"}; // Output definitions OutputObj same{"sameEvent"}; From af22b7ae09ef4a82620cb9c1d214b39fb8ca01f6 Mon Sep 17 00:00:00 2001 From: Josue Martinez Garcia Date: Tue, 11 Nov 2025 01:15:12 -0600 Subject: [PATCH 07/11] resolving o2 linter issues --- .../Tasks/twoParticleCorrelationPp.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx index 61bf04153c8..83831845708 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx @@ -9,7 +9,7 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -/// \file twoParticleCorrelationpp.cxx +/// \file twoParticleCorrelationPp.cxx /// \brief Task for two particle correlation in pp in order to calculate a baseline in a template fit for the flow coefficients /// \author Josué Martínez García @@ -37,7 +37,7 @@ using namespace o2::framework::expressions; static constexpr float cfgPairCutDefaults[1][5] = {{-1, -1, -1, -1, -1}}; constexpr float kThreeHalfPi = 1.5f * PI; -struct TwoParticleCorrelationpp { +struct TwoParticleCorrelationPp { // Declare configurables on events/collisions Configurable minMultiplicity{"minMultiplicity", 2, {"Range on multiplicity"}}; @@ -386,7 +386,7 @@ struct TwoParticleCorrelationpp { } } - PROCESS_SWITCH(TwoParticleCorrelationpp, processMixed, "Process mixed events", true); + PROCESS_SWITCH(TwoParticleCorrelationPp, processMixed, "Process mixed events", true); void processSame(FullCollisions::iterator const& collision, FullTracks const& tracks) { @@ -411,7 +411,7 @@ struct TwoParticleCorrelationpp { fillCorrelations(same, tracks, tracks, multiplicity, collision.posZ(), SameEventTag{}); } - PROCESS_SWITCH(TwoParticleCorrelationpp, processSame, "Process same events", true); + PROCESS_SWITCH(TwoParticleCorrelationPp, processSame, "Process same events", true); void process(FullCollisions::iterator const& collision, FullTracks const& tracks) { @@ -563,12 +563,12 @@ struct TwoParticleCorrelationpp { } } - PROCESS_SWITCH(TwoParticleCorrelationpp, process, "Process mixed events", true); + PROCESS_SWITCH(TwoParticleCorrelationPp, process, "Process mixed events", true); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ - adaptAnalysisTask(cfgc, "two-particle-correlation-pp"), + adaptAnalysisTask(cfgc), }; } From dacf271e4780bfb4e88ba54de6565036921a8038 Mon Sep 17 00:00:00 2001 From: Josue Martinez Garcia Date: Tue, 11 Nov 2025 01:23:00 -0600 Subject: [PATCH 08/11] resolving o2 linter issues --- PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt index 33f5e257cde..9d19b73cbbb 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt +++ b/PWGCF/TwoParticleCorrelations/Tasks/CMakeLists.txt @@ -74,6 +74,6 @@ o2physics_add_dpl_workflow(long-range-dihadron-cor COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(two-particle-correlation-pp - SOURCES twoParticleCorrelationpp.cxx + SOURCES twoParticleCorrelationPp.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2Physics::PWGCFCore COMPONENT_NAME Analysis) \ No newline at end of file From c4bfe7cd7e5ae1dd114313aa8304948bff8b5205 Mon Sep 17 00:00:00 2001 From: Josue Martinez Garcia Date: Tue, 11 Nov 2025 22:01:03 -0600 Subject: [PATCH 09/11] fixing compiler issues --- .../Tasks/twoParticleCorrelationPp.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx index 83831845708..9d5a994f3fb 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx @@ -269,8 +269,8 @@ struct TwoParticleCorrelationPp { } } - template - bool fillCollision(TTarget target, TCollision collision, float multiplicity) + template + bool fillCollision(TTarget target, float multiplicity) { target->fillEvent(multiplicity, CorrelationContainer::kCFStepAll); target->fillEvent(multiplicity, CorrelationContainer::kCFStepReconstructed); @@ -378,7 +378,7 @@ struct TwoParticleCorrelationPp { } ++multiplicity; } - if (fillCollision(mixed, collision1, multiplicity) == false) { + if (fillCollision(mixed, multiplicity) == false) { return; } histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ()})); @@ -403,7 +403,7 @@ struct TwoParticleCorrelationPp { ++multiplicity; } // LOGF(debug, "Filling same events"); - if (fillCollision(same, collision, multiplicity) == false) { + if (fillCollision(same, multiplicity) == false) { return; } histos.fill(HIST("eventcount"), -2); From fc14fe083ee93d463707213d9676bfea5b67b72e Mon Sep 17 00:00:00 2001 From: Josue Martinez Garcia Date: Thu, 13 Nov 2025 15:29:24 -0600 Subject: [PATCH 10/11] fixing compiler issues, attending comments from review and adding code for event count by multiplicity range --- .../Tasks/twoParticleCorrelationPp.cxx | 68 +++++++++---------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx index 9d5a994f3fb..d299ebe065a 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx @@ -160,9 +160,9 @@ struct TwoParticleCorrelationPp { using FullCollisions = soa::Join; using FullTracks = soa::Join; - struct SameEventTag { - }; - struct MixedEventTag { + enum EventType { + SameEvent = 1, + MixedEvent = 2 }; SliceCache cache; @@ -277,8 +277,8 @@ struct TwoParticleCorrelationPp { return true; } - template - void fillCorrelations(TTarget target, TTracks tracks1, TTracks tracks2, float multiplicity, float posZ, TTag) + template + void fillCorrelations(TTarget target, TTracks tracks1, TTracks tracks2, float multiplicity, float posZ, int system) { for (const auto& track1 : tracks1) { if (isTrackCut(track1) == false) { @@ -310,43 +310,40 @@ struct TwoParticleCorrelationPp { multiplicity, deltaPhi, posZ); - if constexpr (std::is_same_v) { + + if (system == SameEvent) { if (minMultiplicity <= multiplicity) { histos.fill(HIST("sameEvent2D"), deltaEta, deltaPhi); } if (minMultiplicity <= multiplicity && multiplicity <= range1Max) { histos.fill(HIST("sameEvent_2_10"), deltaEta, deltaPhi); - } - if (range2Min <= multiplicity && multiplicity <= range2Max) { + } else if (range2Min <= multiplicity && multiplicity <= range2Max) { histos.fill(HIST("sameEvent_11_20"), deltaEta, deltaPhi); - } - if (range3Min <= multiplicity && multiplicity <= range3Max) { + } else if (range3Min <= multiplicity && multiplicity <= range3Max) { histos.fill(HIST("sameEvent_21_30"), deltaEta, deltaPhi); - } - if (range4Min <= multiplicity && multiplicity <= range4Max) { + } else if (range4Min <= multiplicity && multiplicity <= range4Max) { histos.fill(HIST("sameEvent_31_40"), deltaEta, deltaPhi); - } - if (range5Min <= multiplicity && multiplicity <= range5Max) { + } else if (range5Min <= multiplicity && multiplicity <= range5Max) { histos.fill(HIST("sameEvent_41_50"), deltaEta, deltaPhi); + } else { + continue; } - } else if constexpr (std::is_same_v) { + } else if (system == MixedEvent) { if (minMultiplicity <= multiplicity) { histos.fill(HIST("mixedEvent2D"), deltaEta, deltaPhi); } if (minMultiplicity <= multiplicity && multiplicity <= range1Max) { histos.fill(HIST("mixedEvent_2_10"), deltaEta, deltaPhi); - } - if (range2Min <= multiplicity && multiplicity <= range2Max) { + } else if (range2Min <= multiplicity && multiplicity <= range2Max) { histos.fill(HIST("mixedEvent_11_20"), deltaEta, deltaPhi); - } - if (range3Min <= multiplicity && multiplicity <= range3Max) { + } else if (range3Min <= multiplicity && multiplicity <= range3Max) { histos.fill(HIST("mixedEvent_21_30"), deltaEta, deltaPhi); - } - if (range4Min <= multiplicity && multiplicity <= range4Max) { + } else if (range4Min <= multiplicity && multiplicity <= range4Max) { histos.fill(HIST("mixedEvent_31_40"), deltaEta, deltaPhi); - } - if (range5Min <= multiplicity && multiplicity <= range5Max) { + } else if (range5Min <= multiplicity && multiplicity <= range5Max) { histos.fill(HIST("mixedEvent_41_50"), deltaEta, deltaPhi); + } else { + continue; } } } @@ -381,8 +378,8 @@ struct TwoParticleCorrelationPp { if (fillCollision(mixed, multiplicity) == false) { return; } - histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ()})); - fillCorrelations(mixed, tracks1, tracks2, multiplicity, collision1.posZ(), MixedEventTag{}); + //histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ()})); + fillCorrelations(mixed, tracks1, tracks2, multiplicity, collision1.posZ(), MixedEvent); } } @@ -407,17 +404,25 @@ struct TwoParticleCorrelationPp { return; } histos.fill(HIST("eventcount"), -2); + if (minMultiplicity <= multiplicity && multiplicity <= range1Max) { + histos.fill(HIST("eventcount"), 1); + } else if (range2Min <= multiplicity && multiplicity <= range2Max) { + histos.fill(HIST("eventcount"), 2); + } else if (range3Min <= multiplicity && multiplicity <= range3Max) { + histos.fill(HIST("eventcount"), 3); + } else if (range4Min <= multiplicity && multiplicity <= range4Max) { + histos.fill(HIST("eventcount"), 4); + } else if (range5Min <= multiplicity && multiplicity <= range5Max) { + histos.fill(HIST("eventcount"), 5); + } fillQA(tracks, multiplicity); - fillCorrelations(same, tracks, tracks, multiplicity, collision.posZ(), SameEventTag{}); + fillCorrelations(same, tracks, tracks, multiplicity, collision.posZ(), SameEvent); } PROCESS_SWITCH(TwoParticleCorrelationPp, processSame, "Process same events", true); void process(FullCollisions::iterator const& collision, FullTracks const& tracks) { - - float multiplicity = 0; - // Configure events flow histogram labels auto hFlowEvents = histos.get(HIST("Events/hEventsAfterCuts")); hFlowEvents->GetXaxis()->SetBinLabel(1, "All tracks"); @@ -555,11 +560,6 @@ struct TwoParticleCorrelationPp { continue; // TPC chi2 } histos.fill(HIST("Tracks/hTracksAfterCuts"), 16); - - if (isTrackCut(track) == false) { - continue; - } - ++multiplicity; } } From 91f9317749715c91f7a7e19f1cac4d2dbaa28b0d Mon Sep 17 00:00:00 2001 From: Josue Martinez Garcia Date: Thu, 13 Nov 2025 15:34:31 -0600 Subject: [PATCH 11/11] fixing formating issue --- .../TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx index d299ebe065a..24cfc066838 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/twoParticleCorrelationPp.cxx @@ -378,7 +378,7 @@ struct TwoParticleCorrelationPp { if (fillCollision(mixed, multiplicity) == false) { return; } - //histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ()})); + // histos.fill(HIST("eventcount"), bindingOnVtx.getBin({collision1.posZ()})); fillCorrelations(mixed, tracks1, tracks2, multiplicity, collision1.posZ(), MixedEvent); } }