From b14071de39f8e8d8e2ada285ad428c3816e460c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 22 Sep 2025 12:09:02 +0200 Subject: [PATCH 1/8] Add systematic mapping analysis task --- PWGLF/Tasks/QC/systematicMapping.cxx | 140 +++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 PWGLF/Tasks/QC/systematicMapping.cxx diff --git a/PWGLF/Tasks/QC/systematicMapping.cxx b/PWGLF/Tasks/QC/systematicMapping.cxx new file mode 100644 index 00000000000..291013394e0 --- /dev/null +++ b/PWGLF/Tasks/QC/systematicMapping.cxx @@ -0,0 +1,140 @@ +// 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 "PWGLF/DataModel/LFStrangenessTables.h" + +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/PIDResponse.h" + +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "ReconstructionDataFormats/Track.h" + +using namespace o2; +using namespace o2::framework; + +struct systematicsStudy { + ConfigurableAxis ptBins{"ptBins", {100, 0.f, 10.f}, "Binning for pT (GeV/c)"}; + Configurable cutEta{"cutEta", 0.8f, "Max |eta| for tracks and V0s"}; + Configurable cutTPCClusters{"cutTPCClusters", 70, "Min TPC clusters for tracks"}; + Configurable cutKaonNSigma{"cutKaonNSigma", 3.f, "Max |nSigma| for kaon PID"}; + Configurable cutK0sMassWindow{"cutK0sMassWindow", 0.01f, "K0s mass window (GeV/c^2)"}; + ConfigurableAxis etaBins{"etaBins", {40, -1.0f, 1.0f}, "Binning for #eta"}; + ConfigurableAxis phiBins{"phiBins", {36, 0.f, 2 * M_PI}, "Binning for #phi (rad)"}; + HistogramRegistry registry{"registry"}; + + void init(InitContext const&) + { + const AxisSpec ptAxis{ptBins, "#it{p}_{T} (GeV/c)"}; + const AxisSpec etaAxis{etaBins, "#eta"}; + const AxisSpec phiAxis{phiBins, "#phi (rad)"}; + registry.add("hKaonYieldData", "", HistType::kTH1F, {ptAxis}); + registry.add("hKaonYieldMC", "", HistType::kTH1F, {ptAxis}); + registry.add("hK0sYieldData", "", HistType::kTH1F, {ptAxis}); + registry.add("hK0sYieldMC", "", HistType::kTH1F, {ptAxis}); + registry.add("hKaonYieldMapData", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); + registry.add("hKaonYieldMapMC", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); + registry.add("hK0sYieldMapData", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); + registry.add("hK0sYieldMapMC", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); + } + + void processData(aod::Collisions const& collisions, + aod::Tracks const& tracks, + aod::V0s const& v0s) + { + for (auto& collision : collisions) { + if (!collision.sel8() || std::abs(collision.posZ()) > 10) + continue; // MB selection + if (collision.isMC()) continue; + + // Kaon loop + for (auto& track : tracks) { + if (track.collisionId() != collision.globalIndex()) + continue; + if (std::abs(track.eta()) > cutEta) + continue; + if (track.tpcNClsFound() < cutTPCClusters) + continue; + // PID selection for kaons + if (std::abs(track.tpcNSigmaKa()) < cutKaonNSigma) { + registry.fill(HIST("hKaonYieldData"), track.pt()); + registry.fill(HIST("hKaonYieldMapData"), track.pt(), track.eta(), track.phi()); + } + } + + // K0s loop + for (auto& v0 : v0s) { + if (v0.collisionId() != collision.globalIndex()) + continue; + // Basic selection for K0s + if (std::abs(v0.eta()) > cutEta) + continue; + if (std::abs(v0.mass() - constants::physics::MassK0Short) > cutK0sMassWindow) + continue; + registry.fill(HIST("hK0sYieldData"), v0.pt()); + registry.fill(HIST("hK0sYieldMapData"), v0.pt(), v0.eta(), v0.phi()); + } + } + } + + void processMC(aod::Collisions const& collisions, + aod::Tracks const& tracks, + aod::V0s const& v0s) + { + for (auto& collision : collisions) { + if (!collision.sel8() || std::abs(collision.posZ()) > 10) + continue; // MB selection + if (!collision.isMC()) continue; + + // Kaon loop + for (auto& track : tracks) { + if (track.collisionId() != collision.globalIndex()) + continue; + if (std::abs(track.eta()) > cutEta) + continue; + if (track.tpcNClsFound() < cutTPCClusters) + continue; + // PID selection for kaons + if (std::abs(track.tpcNSigmaKa()) < cutKaonNSigma) { + registry.fill(HIST("hKaonYieldMC"), track.pt()); + registry.fill(HIST("hKaonYieldMapMC"), track.pt(), track.eta(), track.phi()); + } + } + + // K0s loop + for (auto& v0 : v0s) { + if (v0.collisionId() != collision.globalIndex()) + continue; + // Basic selection for K0s + if (std::abs(v0.eta()) > cutEta) + continue; + if (std::abs(v0.mass() - constants::physics::MassK0Short) > cutK0sMassWindow) + continue; + registry.fill(HIST("hK0sYieldMC"), v0.pt()); + registry.fill(HIST("hK0sYieldMapMC"), v0.pt(), v0.eta(), v0.phi()); + } + } + } + + void process(aod::Collisions const& collisions, + aod::Tracks const& tracks, + aod::V0s const& v0s) + { + processData(collisions, tracks, v0s); + processMC(collisions, tracks, v0s); + } +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} From 2ea072f2e64d493eeb3438b95b01ea85ac21e3f2 Mon Sep 17 00:00:00 2001 From: ALICE Builder Date: Mon, 22 Sep 2025 12:09:55 +0200 Subject: [PATCH 2/8] Please consider the following formatting changes to #13075 (#13076) --- PWGLF/Tasks/QC/systematicMapping.cxx | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/PWGLF/Tasks/QC/systematicMapping.cxx b/PWGLF/Tasks/QC/systematicMapping.cxx index 291013394e0..87013bced3f 100644 --- a/PWGLF/Tasks/QC/systematicMapping.cxx +++ b/PWGLF/Tasks/QC/systematicMapping.cxx @@ -34,16 +34,16 @@ struct systematicsStudy { void init(InitContext const&) { const AxisSpec ptAxis{ptBins, "#it{p}_{T} (GeV/c)"}; - const AxisSpec etaAxis{etaBins, "#eta"}; - const AxisSpec phiAxis{phiBins, "#phi (rad)"}; - registry.add("hKaonYieldData", "", HistType::kTH1F, {ptAxis}); - registry.add("hKaonYieldMC", "", HistType::kTH1F, {ptAxis}); - registry.add("hK0sYieldData", "", HistType::kTH1F, {ptAxis}); - registry.add("hK0sYieldMC", "", HistType::kTH1F, {ptAxis}); - registry.add("hKaonYieldMapData", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); - registry.add("hKaonYieldMapMC", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); - registry.add("hK0sYieldMapData", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); - registry.add("hK0sYieldMapMC", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); + const AxisSpec etaAxis{etaBins, "#eta"}; + const AxisSpec phiAxis{phiBins, "#phi (rad)"}; + registry.add("hKaonYieldData", "", HistType::kTH1F, {ptAxis}); + registry.add("hKaonYieldMC", "", HistType::kTH1F, {ptAxis}); + registry.add("hK0sYieldData", "", HistType::kTH1F, {ptAxis}); + registry.add("hK0sYieldMC", "", HistType::kTH1F, {ptAxis}); + registry.add("hKaonYieldMapData", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); + registry.add("hKaonYieldMapMC", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); + registry.add("hK0sYieldMapData", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); + registry.add("hK0sYieldMapMC", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); } void processData(aod::Collisions const& collisions, @@ -53,7 +53,8 @@ struct systematicsStudy { for (auto& collision : collisions) { if (!collision.sel8() || std::abs(collision.posZ()) > 10) continue; // MB selection - if (collision.isMC()) continue; + if (collision.isMC()) + continue; // Kaon loop for (auto& track : tracks) { @@ -92,7 +93,8 @@ struct systematicsStudy { for (auto& collision : collisions) { if (!collision.sel8() || std::abs(collision.posZ()) > 10) continue; // MB selection - if (!collision.isMC()) continue; + if (!collision.isMC()) + continue; // Kaon loop for (auto& track : tracks) { From a6121c491b6c94561ebd0a30131a2e29d143fc7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 22 Sep 2025 14:57:53 +0200 Subject: [PATCH 3/8] Update --- PWGLF/Tasks/QC/systematicMapping.cxx | 178 ++++++++++++++------------- 1 file changed, 93 insertions(+), 85 deletions(-) diff --git a/PWGLF/Tasks/QC/systematicMapping.cxx b/PWGLF/Tasks/QC/systematicMapping.cxx index 87013bced3f..de55f18a528 100644 --- a/PWGLF/Tasks/QC/systematicMapping.cxx +++ b/PWGLF/Tasks/QC/systematicMapping.cxx @@ -8,135 +8,143 @@ // 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 systematicsMapping.cxx +/// \brief Task to perform a systematics study for K0s and charged Kaons +/// \author Nicolò Jacazio, Universita del Piemonte Orientale (IT) +/// \since September 22, 2025 + #include "PWGLF/DataModel/LFStrangenessTables.h" #include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/PIDResponse.h" +#include "Common/DataModel/PIDResponseTPC.h" +#include "Common/DataModel/PIDResponseTOF.h" + +#include +#include +#include +#include +#include -#include "Framework/AnalysisDataModel.h" -#include "Framework/AnalysisTask.h" -#include "Framework/HistogramRegistry.h" -#include "ReconstructionDataFormats/Track.h" +#include using namespace o2; using namespace o2::framework; -struct systematicsStudy { +struct systematicsMapping { + // Returns a unique index for the combination of cuts ConfigurableAxis ptBins{"ptBins", {100, 0.f, 10.f}, "Binning for pT (GeV/c)"}; - Configurable cutEta{"cutEta", 0.8f, "Max |eta| for tracks and V0s"}; - Configurable cutTPCClusters{"cutTPCClusters", 70, "Min TPC clusters for tracks"}; - Configurable cutKaonNSigma{"cutKaonNSigma", 3.f, "Max |nSigma| for kaon PID"}; - Configurable cutK0sMassWindow{"cutK0sMassWindow", 0.01f, "K0s mass window (GeV/c^2)"}; ConfigurableAxis etaBins{"etaBins", {40, -1.0f, 1.0f}, "Binning for #eta"}; ConfigurableAxis phiBins{"phiBins", {36, 0.f, 2 * M_PI}, "Binning for #phi (rad)"}; + // Define the Signal axis + ConfigurableAxis invariantMassBins{"invariantMassBins", {100, -0.1f, 0.1f}, "Binning for the invariant mass (GeV/c^2)"}; + ConfigurableAxis nsigmaBins{"nsigmaBins", {100, -10.f, 10.f}, "Binning for nSigma"}; + // Selection bins + ConfigurableAxis tpcClusterBins{"tpcClusterBins", {5, 70, 100, 120, 135, 150}, "Min TPC clusters for tracks"}; + ConfigurableAxis itsClustersBins{"itsClustersBins", {5, 0, 6}, "Min ITS clusters for tracks"}; + HistogramRegistry registry{"registry"}; + template + bool isCollisionSelected(T const& collision) + { + return collision.sel8() && std::abs(collision.posZ()) <= 10.f; + } + void init(InitContext const&) { const AxisSpec ptAxis{ptBins, "#it{p}_{T} (GeV/c)"}; const AxisSpec etaAxis{etaBins, "#eta"}; const AxisSpec phiAxis{phiBins, "#phi (rad)"}; - registry.add("hKaonYieldData", "", HistType::kTH1F, {ptAxis}); - registry.add("hKaonYieldMC", "", HistType::kTH1F, {ptAxis}); - registry.add("hK0sYieldData", "", HistType::kTH1F, {ptAxis}); - registry.add("hK0sYieldMC", "", HistType::kTH1F, {ptAxis}); - registry.add("hKaonYieldMapData", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); - registry.add("hKaonYieldMapMC", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); - registry.add("hK0sYieldMapData", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); - registry.add("hK0sYieldMapMC", "", HistType::kTH3F, {ptAxis, etaAxis, phiAxis}); + + if (doprocessData) { + + // First we define the histograms on which we are cutting (tpc clusters, its clusters, ..) + registry.add("K/hTPCClusters", "", HistType::kTH1F, {{100, 0, 200}}); + registry.add("K/hITSClusters", "", HistType::kTH1F, {{10, 0, 10}}); + registry.addClone("K/", "K0s/"); + + // Add the signal histograms + registry.add("K/SignalPositive", "", HistType::kTHnSparseF, {ptBins, etaBins, phiBins, nsigmaBins, tpcClusterBins, itsClustersBins}); + registry.add("K/SignalNegative", "", HistType::kTHnSparseF, {ptBins, etaBins, phiBins, nsigmaBins, tpcClusterBins, itsClustersBins}); + registry.add("K0s/Signal", "", HistType::kTHnSparseF, {ptBins, etaBins, phiBins, invariantMassBins, tpcClusterBins, itsClustersBins}); + } + + if (doprocessMc) { + registry.add("K/GeneratedPositive", "", HistType::kTHnSparseF, {ptBins, etaBins, phiBins}); + registry.add("K/GeneratedNegative", "", HistType::kTHnSparseF, {ptBins, etaBins, phiBins}); + registry.add("K0s/Generated", "", HistType::kTHnSparseF, {ptBins, etaBins, phiBins}); + } } - void processData(aod::Collisions const& collisions, - aod::Tracks const& tracks, - aod::V0s const& v0s) + using TrackType = soa::Join; + using CollisionType = soa::Join; + + void processData(CollisionType const& collisions, + TrackType const& tracks, + aod::V0Datas const& v0s) { - for (auto& collision : collisions) { - if (!collision.sel8() || std::abs(collision.posZ()) > 10) + for (const auto& collision : collisions) { + if (isCollisionSelected(collision)) continue; // MB selection - if (collision.isMC()) - continue; // Kaon loop - for (auto& track : tracks) { + for (const auto& track : tracks) { if (track.collisionId() != collision.globalIndex()) continue; - if (std::abs(track.eta()) > cutEta) - continue; - if (track.tpcNClsFound() < cutTPCClusters) - continue; - // PID selection for kaons - if (std::abs(track.tpcNSigmaKa()) < cutKaonNSigma) { - registry.fill(HIST("hKaonYieldData"), track.pt()); - registry.fill(HIST("hKaonYieldMapData"), track.pt(), track.eta(), track.phi()); - } + registry.fill(HIST("hTPCClusters"), track.tpcNClsFound()); + registry.fill(HIST("hITSClusters"), track.itsNCls()); + if (track.sign() > 0) + registry.fill(HIST("K/SignalPositive"), track.pt(), track.eta(), track.phi(), track.tpcNSigmaKa(), track.tpcNClsFound(), track.itsNCls()); + else + registry.fill(HIST("K/SignalNegative"), track.pt(), track.eta(), track.phi(), track.tpcNSigmaKa(), track.tpcNClsFound(), track.itsNCls()); } // K0s loop - for (auto& v0 : v0s) { + for (const auto& v0 : v0s) { if (v0.collisionId() != collision.globalIndex()) continue; - // Basic selection for K0s - if (std::abs(v0.eta()) > cutEta) - continue; - if (std::abs(v0.mass() - constants::physics::MassK0Short) > cutK0sMassWindow) - continue; - registry.fill(HIST("hK0sYieldData"), v0.pt()); - registry.fill(HIST("hK0sYieldMapData"), v0.pt(), v0.eta(), v0.phi()); + const auto& posTrack = v0.posTrack_as(); + const auto& negTrack = v0.negTrack_as(); + registry.fill(HIST("K0s/Signal"), v0.pt(), v0.eta(), v0.phi(), v0.mK0Short() - constants::physics::MassK0Short, std::min(posTrack.tpcNClsFound(), negTrack.tpcNClsFound()), std::min(posTrack.itsNCls(), negTrack.itsNCls())); } } } + PROCESS_SWITCH(systematicsMapping, processData, "Systematics study for K0s and charged Kaons", true); - void processMC(aod::Collisions const& collisions, - aod::Tracks const& tracks, - aod::V0s const& v0s) + void processMc(soa::Join const& collisions, + aod::McParticles const& particles, + aod::McCollisions const&) { - for (auto& collision : collisions) { - if (!collision.sel8() || std::abs(collision.posZ()) > 10) + for (const auto& collision : collisions) { + if (!isCollisionSelected(collision)) continue; // MB selection - if (!collision.isMC()) + if (!collision.has_mcCollision()) continue; + const auto& mcCollision = collision.mcCollision(); - // Kaon loop - for (auto& track : tracks) { - if (track.collisionId() != collision.globalIndex()) - continue; - if (std::abs(track.eta()) > cutEta) + for (const auto& particle : particles) { + if (particle.mcCollisionId() != mcCollision.globalIndex()) continue; - if (track.tpcNClsFound() < cutTPCClusters) + if (!particle.isPhysicalPrimary()) continue; - // PID selection for kaons - if (std::abs(track.tpcNSigmaKa()) < cutKaonNSigma) { - registry.fill(HIST("hKaonYieldMC"), track.pt()); - registry.fill(HIST("hKaonYieldMapMC"), track.pt(), track.eta(), track.phi()); + switch (particle.pdgCode()) { + case 321: // K+ + registry.fill(HIST("K/GeneratedPositive"), particle.pt(), particle.eta(), particle.phi()); + break; + case -321: // K- + registry.fill(HIST("K/GeneratedNegative"), particle.pt(), particle.eta(), particle.phi()); + break; + case 310: // K0s + registry.fill(HIST("K0s/Generated"), particle.pt(), particle.eta(), particle.phi()); + break; + default: + break; } } - - // K0s loop - for (auto& v0 : v0s) { - if (v0.collisionId() != collision.globalIndex()) - continue; - // Basic selection for K0s - if (std::abs(v0.eta()) > cutEta) - continue; - if (std::abs(v0.mass() - constants::physics::MassK0Short) > cutK0sMassWindow) - continue; - registry.fill(HIST("hK0sYieldMC"), v0.pt()); - registry.fill(HIST("hK0sYieldMapMC"), v0.pt(), v0.eta(), v0.phi()); - } } } - - void process(aod::Collisions const& collisions, - aod::Tracks const& tracks, - aod::V0s const& v0s) - { - processData(collisions, tracks, v0s); - processMC(collisions, tracks, v0s); - } + PROCESS_SWITCH(systematicsMapping, processMc, "Systematics study for K0s and charged Kaons on MC", false); }; -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) -{ - return WorkflowSpec{ - adaptAnalysisTask(cfgc)}; -} +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From ae50ac9388cad23a55524a1f91d3fb89e0956f4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 22 Sep 2025 14:58:36 +0200 Subject: [PATCH 4/8] Update CMake --- PWGLF/Tasks/QC/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/PWGLF/Tasks/QC/CMakeLists.txt b/PWGLF/Tasks/QC/CMakeLists.txt index 126ec29b3e5..f1f1417d9cd 100644 --- a/PWGLF/Tasks/QC/CMakeLists.txt +++ b/PWGLF/Tasks/QC/CMakeLists.txt @@ -138,4 +138,9 @@ o2physics_add_dpl_workflow(its-tpc-matching-vzeros o2physics_add_dpl_workflow(v0assoqa SOURCES v0assoqa.cxx PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore O2::DCAFitter KFParticle::KFParticle O2Physics::TPCDriftManager + COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(systematics-mapping + SOURCES systematicsMapping.cxx + PUBLIC_LINK_LIBRARIES O2Physics::AnalysisCore COMPONENT_NAME Analysis) \ No newline at end of file From 7a190b261242da3523736734ea370d9318174c89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 22 Sep 2025 14:58:58 +0200 Subject: [PATCH 5/8] Rename --- PWGLF/Tasks/QC/{systematicMapping.cxx => systematicsMapping.cxx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename PWGLF/Tasks/QC/{systematicMapping.cxx => systematicsMapping.cxx} (100%) diff --git a/PWGLF/Tasks/QC/systematicMapping.cxx b/PWGLF/Tasks/QC/systematicsMapping.cxx similarity index 100% rename from PWGLF/Tasks/QC/systematicMapping.cxx rename to PWGLF/Tasks/QC/systematicsMapping.cxx From 7be7d6d36e35c81791a482b73edf319dc5719ab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 22 Sep 2025 15:04:17 +0200 Subject: [PATCH 6/8] Rename struct systematicsMapping to SystematicsMapping --- PWGLF/Tasks/QC/systematicsMapping.cxx | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/PWGLF/Tasks/QC/systematicsMapping.cxx b/PWGLF/Tasks/QC/systematicsMapping.cxx index de55f18a528..c12317cf66b 100644 --- a/PWGLF/Tasks/QC/systematicsMapping.cxx +++ b/PWGLF/Tasks/QC/systematicsMapping.cxx @@ -17,8 +17,8 @@ #include "PWGLF/DataModel/LFStrangenessTables.h" #include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" #include #include @@ -31,24 +31,26 @@ using namespace o2; using namespace o2::framework; -struct systematicsMapping { +struct SystematicsMapping { // Returns a unique index for the combination of cuts ConfigurableAxis ptBins{"ptBins", {100, 0.f, 10.f}, "Binning for pT (GeV/c)"}; ConfigurableAxis etaBins{"etaBins", {40, -1.0f, 1.0f}, "Binning for #eta"}; - ConfigurableAxis phiBins{"phiBins", {36, 0.f, 2 * M_PI}, "Binning for #phi (rad)"}; + ConfigurableAxis phiBins{"phiBins", {36, 0.f, 2 * o2::constants::math::PI}, "Binning for #phi (rad)"}; // Define the Signal axis ConfigurableAxis invariantMassBins{"invariantMassBins", {100, -0.1f, 0.1f}, "Binning for the invariant mass (GeV/c^2)"}; ConfigurableAxis nsigmaBins{"nsigmaBins", {100, -10.f, 10.f}, "Binning for nSigma"}; // Selection bins ConfigurableAxis tpcClusterBins{"tpcClusterBins", {5, 70, 100, 120, 135, 150}, "Min TPC clusters for tracks"}; ConfigurableAxis itsClustersBins{"itsClustersBins", {5, 0, 6}, "Min ITS clusters for tracks"}; + // Selection configurables + Configurable selectionPosZ{"selectionPosZ", 10.f, "Max |z| of the primary vertex"}; HistogramRegistry registry{"registry"}; template bool isCollisionSelected(T const& collision) { - return collision.sel8() && std::abs(collision.posZ()) <= 10.f; + return collision.sel8() && std::abs(collision.posZ()) <= selectionPosZ; } void init(InitContext const&) @@ -110,7 +112,7 @@ struct systematicsMapping { } } } - PROCESS_SWITCH(systematicsMapping, processData, "Systematics study for K0s and charged Kaons", true); + PROCESS_SWITCH(SystematicsMapping, processData, "Systematics study for K0s and charged Kaons", true); void processMc(soa::Join const& collisions, aod::McParticles const& particles, @@ -144,7 +146,7 @@ struct systematicsMapping { } } } - PROCESS_SWITCH(systematicsMapping, processMc, "Systematics study for K0s and charged Kaons on MC", false); + PROCESS_SWITCH(SystematicsMapping, processMc, "Systematics study for K0s and charged Kaons on MC", false); }; -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{adaptAnalysisTask(cfgc)}; } From 61c4cea45a79b20d10031e4150ae8e05943c9917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 22 Sep 2025 15:10:59 +0200 Subject: [PATCH 7/8] Update phiBins to use TwoPI constant --- PWGLF/Tasks/QC/systematicsMapping.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/QC/systematicsMapping.cxx b/PWGLF/Tasks/QC/systematicsMapping.cxx index c12317cf66b..7c8ada3518b 100644 --- a/PWGLF/Tasks/QC/systematicsMapping.cxx +++ b/PWGLF/Tasks/QC/systematicsMapping.cxx @@ -35,7 +35,7 @@ struct SystematicsMapping { // Returns a unique index for the combination of cuts ConfigurableAxis ptBins{"ptBins", {100, 0.f, 10.f}, "Binning for pT (GeV/c)"}; ConfigurableAxis etaBins{"etaBins", {40, -1.0f, 1.0f}, "Binning for #eta"}; - ConfigurableAxis phiBins{"phiBins", {36, 0.f, 2 * o2::constants::math::PI}, "Binning for #phi (rad)"}; + ConfigurableAxis phiBins{"phiBins", {36, 0.f, 2 * o2::constants::math::TwoPI}, "Binning for #phi (rad)"}; // Define the Signal axis ConfigurableAxis invariantMassBins{"invariantMassBins", {100, -0.1f, 0.1f}, "Binning for the invariant mass (GeV/c^2)"}; ConfigurableAxis nsigmaBins{"nsigmaBins", {100, -10.f, 10.f}, "Binning for nSigma"}; From 2c33529f1cf7ea7b5d25a8a82dd2a1b4f8c77772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Jacazio?= Date: Mon, 22 Sep 2025 15:11:17 +0200 Subject: [PATCH 8/8] Fix phiBins range to use TwoPI constant --- PWGLF/Tasks/QC/systematicsMapping.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGLF/Tasks/QC/systematicsMapping.cxx b/PWGLF/Tasks/QC/systematicsMapping.cxx index 7c8ada3518b..b4e2a3a5a29 100644 --- a/PWGLF/Tasks/QC/systematicsMapping.cxx +++ b/PWGLF/Tasks/QC/systematicsMapping.cxx @@ -35,7 +35,7 @@ struct SystematicsMapping { // Returns a unique index for the combination of cuts ConfigurableAxis ptBins{"ptBins", {100, 0.f, 10.f}, "Binning for pT (GeV/c)"}; ConfigurableAxis etaBins{"etaBins", {40, -1.0f, 1.0f}, "Binning for #eta"}; - ConfigurableAxis phiBins{"phiBins", {36, 0.f, 2 * o2::constants::math::TwoPI}, "Binning for #phi (rad)"}; + ConfigurableAxis phiBins{"phiBins", {36, 0.f, o2::constants::math::TwoPI}, "Binning for #phi (rad)"}; // Define the Signal axis ConfigurableAxis invariantMassBins{"invariantMassBins", {100, -0.1f, 0.1f}, "Binning for the invariant mass (GeV/c^2)"}; ConfigurableAxis nsigmaBins{"nsigmaBins", {100, -10.f, 10.f}, "Binning for nSigma"};