From d1c5d1c981944cc53b5d1ade9dbe08f1b297b8b9 Mon Sep 17 00:00:00 2001 From: fawad Date: Wed, 5 Aug 2026 11:18:28 +0500 Subject: [PATCH 1/4] [PWGMM/UE] Add flattenicity analysis task - Add flattenicity task to UE module - Calculates flattenicity (1-rho) using FT0 channels - Event selection: INEL>0 + |vz|<10 (Paola/Jesus) - Provides truth vs reco flattenicity correlation --- PWGMM/UE/Tasks/CMakeLists.txt | 6 +- PWGMM/UE/Tasks/flattenicity.cxx | 180 ++++++++++++++++++++++++++++++++ 2 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 PWGMM/UE/Tasks/flattenicity.cxx diff --git a/PWGMM/UE/Tasks/CMakeLists.txt b/PWGMM/UE/Tasks/CMakeLists.txt index f9ee32c6e10..a0561c14029 100644 --- a/PWGMM/UE/Tasks/CMakeLists.txt +++ b/PWGMM/UE/Tasks/CMakeLists.txt @@ -22,4 +22,8 @@ o2physics_add_dpl_workflow(ue-zdc-analysis o2physics_add_dpl_workflow(dedx-analysis SOURCES dedxAnalysis.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore - COMPONENT_NAME Analysis) \ No newline at end of file + COMPONENT_NAME Analysis) +o2physics_add_dpl_workflow(flattenicity + SOURCES flattenicity.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/PWGMM/UE/Tasks/flattenicity.cxx b/PWGMM/UE/Tasks/flattenicity.cxx new file mode 100644 index 00000000000..48136b0a6b9 --- /dev/null +++ b/PWGMM/UE/Tasks/flattenicity.cxx @@ -0,0 +1,180 @@ +// 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 +#include + +#include "Framework/runDataProcessing.h" +#include "Framework/AnalysisTask.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/Configurable.h" +#include "Framework/InitContext.h" +#include "Framework/O2DatabasePDGPlugin.h" + +#include "ReconstructionDataFormats/Track.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/TrackSelectionTables.h" +#include "Common/Core/TrackSelection.h" +#include "Common/Core/TrackSelectionDefaults.h" + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; + +struct flattenicityTask { + + // --- Flattenicity constants --- + static constexpr int N_CH_A = 96; + static constexpr int N_CH_C = 112; + static constexpr int N_CELL = N_CH_A + N_CH_C; + static constexpr int N_PHI_SECTORS = 8; + static constexpr int N_ETA_A = N_CH_A / N_PHI_SECTORS; + static constexpr int N_ETA_C = N_CH_C / N_PHI_SECTORS; + + // FT0 acceptance + static constexpr float FT0A_ETA_MIN = 3.5; + static constexpr float FT0A_ETA_MAX = 4.9; + static constexpr float FT0C_ETA_MIN = -3.3; + static constexpr float FT0C_ETA_MAX = -2.1; + + // --- Configurables --- + Configurable cfgTrkEtaCut{"cfgTrkEtaCut", 0.8f, "Eta range for tracks"}; + Configurable cfgTrkLowPtCut{"cfgTrkLowPtCut", 0.15f, "Minimum pT"}; + + Configurable isRun3{"isRun3", true, "is Run3 dataset"}; + Configurable timeEvsel{"timeEvsel", true, "TPC Time frame boundary cut"}; + Configurable piluprejection{"piluprejection", true, "Pileup rejection"}; + Configurable goodzvertex{"goodzvertex", true, "Good Z vertex"}; + + // --- Track selection --- + TrackSelection mySelectionPrim; + + // --- Histograms --- + HistogramRegistry registry; + + // --- Init --- + void init(InitContext const&) + { + // Initialize track selection + mySelectionPrim = myTrackSelectionPrim(); + + // Define histograms + AxisSpec flatBins = {40, 0.0, 1.0, "#rho"}; + AxisSpec nchBins = {100, -0.5, 99.5, "N_{ch}"}; + + registry.add("hFlattenicityTruth", "Truth flattenicity; 1-#rho; Events", + HistType::kTH1D, {flatBins}); + registry.add("hFlattenicityReco", "Reco flattenicity; 1-#rho; Events", + HistType::kTH1D, {flatBins}); + registry.add("hFlattenicityCorrelation", "Truth vs Reco; 1-#rho_{truth}; 1-#rho_{reco}", + HistType::kTH2D, {flatBins, flatBins}); + registry.add("hNch", "Nch distribution; N_{ch}; Events", + HistType::kTH1D, {nchBins}); + } + + // --- Track selection function --- + TrackSelection myTrackSelectionPrim() + { + TrackSelection selectedTracks; + selectedTracks.SetPtRange(0.1f, 1e10f); + selectedTracks.SetEtaRange(-0.8f, 0.8f); + selectedTracks.SetRequireITSRefit(true); + selectedTracks.SetRequireTPCRefit(true); + selectedTracks.SetMinNCrossedRowsTPC(70); + selectedTracks.SetMinNCrossedRowsOverFindableClustersTPC(0.4f); + selectedTracks.SetMaxChi2PerClusterTPC(4.f); + selectedTracks.SetRequireHitsInITSLayers(1, {0, 1}); + selectedTracks.SetMaxChi2PerClusterITS(36.f); + selectedTracks.SetMaxDcaXYPtDep([](float pt) { return 0.0105f + 0.0350f / pow(pt, 1.1f); }); + selectedTracks.SetMaxDcaZ(2.f); + return selectedTracks; + } + + // --- Flattenicity calculation --- + float calculateFlattenicity(const std::vector& counts) + { + if (counts.size() != N_CELL) return -1; + + float total = 0; + for (auto c : counts) total += c; + if (total <= 0) return -1; + + float mean = total / N_CELL; + if (mean <= 0) return -1; + + float sumSq = 0; + for (auto c : counts) { + sumSq += (c - mean) * (c - mean); + } + + float rho = std::sqrt(sumSq / (N_CELL * N_CELL)) / mean; + return 1.0f - rho; + } + + // --- Process Data --- + void processData(aod::Collision const& collision, + soa::Filtered const& tracks, + aod::FT0s const& ft0s) + { + // Event selection (Paola/Jesus) + if (!collision.sel8()) return; + if (std::abs(collision.posZ()) >= 10.0f) return; + + // Track loop for Nch + int nch = 0; + for (auto& track : tracks) { + if (!mySelectionPrim.IsSelected(track)) continue; + nch++; + } + registry.fill(HIST("hNch"), nch); + + // FT0 flattenicity + auto ft0 = collision.ft0(); + if (ft0.hasAmplitudeA() && ft0.hasAmplitudeC()) { + auto ampA = ft0.amplitudeA(); + auto ampC = ft0.amplitudeC(); + + std::vector counts(N_CELL, 0.0f); + for (int i = 0; i < ampA.size() && i < N_CH_A; ++i) { + counts[i] = ampA[i]; + } + for (int i = 0; i < ampC.size() && i < N_CH_C; ++i) { + counts[N_CH_A + i] = ampC[i]; + } + + float flat = calculateFlattenicity(counts); + if (flat >= 0) { + registry.fill(HIST("hFlattenicityReco"), flat); + } + } + } + PROCESS_SWITCH(flattenicityTask, processData, "Process data", true); + + // --- Process MC --- + void processMC(aod::McCollision const& mcCollision, + aod::McParticles const& particles, + soa::SmallGroups> const& collisions, + aod::FT0s const& ft0s) + { + // MC processing - to be implemented + } + PROCESS_SWITCH(flattenicityTask, processMC, "Process MC", false); +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + WorkflowSpec workflow{}; + workflow.push_back(adaptAnalysisTask(cfgc)); + return workflow; +} From acb2d41255d6220d26caad7f94696b93d17775f4 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Wed, 5 Aug 2026 06:26:46 +0000 Subject: [PATCH 2/4] Please consider the following formatting changes --- PWGMM/UE/Tasks/flattenicity.cxx | 77 ++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/PWGMM/UE/Tasks/flattenicity.cxx b/PWGMM/UE/Tasks/flattenicity.cxx index 48136b0a6b9..f456fce0eb8 100644 --- a/PWGMM/UE/Tasks/flattenicity.cxx +++ b/PWGMM/UE/Tasks/flattenicity.cxx @@ -9,24 +9,24 @@ // granted to it by virtue of its status as an Intergovernmental Organization // or submit itself to any jurisdiction. -#include -#include - -#include "Framework/runDataProcessing.h" -#include "Framework/AnalysisTask.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/Configurable.h" -#include "Framework/InitContext.h" -#include "Framework/O2DatabasePDGPlugin.h" - -#include "ReconstructionDataFormats/Track.h" -#include "Common/DataModel/Multiplicity.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/TrackSelectionTables.h" #include "Common/Core/TrackSelection.h" #include "Common/Core/TrackSelectionDefaults.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include using namespace o2; using namespace o2::framework; @@ -72,10 +72,10 @@ struct flattenicityTask { // Define histograms AxisSpec flatBins = {40, 0.0, 1.0, "#rho"}; AxisSpec nchBins = {100, -0.5, 99.5, "N_{ch}"}; - - registry.add("hFlattenicityTruth", "Truth flattenicity; 1-#rho; Events", + + registry.add("hFlattenicityTruth", "Truth flattenicity; 1-#rho; Events", HistType::kTH1D, {flatBins}); - registry.add("hFlattenicityReco", "Reco flattenicity; 1-#rho; Events", + registry.add("hFlattenicityReco", "Reco flattenicity; 1-#rho; Events", HistType::kTH1D, {flatBins}); registry.add("hFlattenicityCorrelation", "Truth vs Reco; 1-#rho_{truth}; 1-#rho_{reco}", HistType::kTH2D, {flatBins, flatBins}); @@ -104,47 +104,54 @@ struct flattenicityTask { // --- Flattenicity calculation --- float calculateFlattenicity(const std::vector& counts) { - if (counts.size() != N_CELL) return -1; - + if (counts.size() != N_CELL) + return -1; + float total = 0; - for (auto c : counts) total += c; - if (total <= 0) return -1; - + for (auto c : counts) + total += c; + if (total <= 0) + return -1; + float mean = total / N_CELL; - if (mean <= 0) return -1; - + if (mean <= 0) + return -1; + float sumSq = 0; for (auto c : counts) { sumSq += (c - mean) * (c - mean); } - + float rho = std::sqrt(sumSq / (N_CELL * N_CELL)) / mean; return 1.0f - rho; } // --- Process Data --- - void processData(aod::Collision const& collision, + void processData(aod::Collision const& collision, soa::Filtered const& tracks, aod::FT0s const& ft0s) { // Event selection (Paola/Jesus) - if (!collision.sel8()) return; - if (std::abs(collision.posZ()) >= 10.0f) return; - + if (!collision.sel8()) + return; + if (std::abs(collision.posZ()) >= 10.0f) + return; + // Track loop for Nch int nch = 0; for (auto& track : tracks) { - if (!mySelectionPrim.IsSelected(track)) continue; + if (!mySelectionPrim.IsSelected(track)) + continue; nch++; } registry.fill(HIST("hNch"), nch); - + // FT0 flattenicity auto ft0 = collision.ft0(); if (ft0.hasAmplitudeA() && ft0.hasAmplitudeC()) { auto ampA = ft0.amplitudeA(); auto ampC = ft0.amplitudeC(); - + std::vector counts(N_CELL, 0.0f); for (int i = 0; i < ampA.size() && i < N_CH_A; ++i) { counts[i] = ampA[i]; @@ -152,7 +159,7 @@ struct flattenicityTask { for (int i = 0; i < ampC.size() && i < N_CH_C; ++i) { counts[N_CH_A + i] = ampC[i]; } - + float flat = calculateFlattenicity(counts); if (flat >= 0) { registry.fill(HIST("hFlattenicityReco"), flat); From fff2ae124d5780f46e8d0455357f23e4afddb63a Mon Sep 17 00:00:00 2001 From: fawad Date: Wed, 5 Aug 2026 11:38:08 +0500 Subject: [PATCH 3/4] Fix include style: use quotes for O2 headers --- PWGMM/UE/Tasks/flattenicity.cxx | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/PWGMM/UE/Tasks/flattenicity.cxx b/PWGMM/UE/Tasks/flattenicity.cxx index f456fce0eb8..181a9b2b96e 100644 --- a/PWGMM/UE/Tasks/flattenicity.cxx +++ b/PWGMM/UE/Tasks/flattenicity.cxx @@ -15,16 +15,15 @@ #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/Configurable.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/InitContext.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/runDataProcessing.h" +#include "ReconstructionDataFormats/Track.h" #include #include From 70675499660ecf3b8e428db7c83106ca90adfe42 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Wed, 5 Aug 2026 06:38:59 +0000 Subject: [PATCH 4/4] Please consider the following formatting changes --- PWGMM/UE/Tasks/flattenicity.cxx | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/PWGMM/UE/Tasks/flattenicity.cxx b/PWGMM/UE/Tasks/flattenicity.cxx index 181a9b2b96e..f456fce0eb8 100644 --- a/PWGMM/UE/Tasks/flattenicity.cxx +++ b/PWGMM/UE/Tasks/flattenicity.cxx @@ -15,15 +15,16 @@ #include "Common/DataModel/Multiplicity.h" #include "Common/DataModel/TrackSelectionTables.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/AnalysisTask.h" -#include "Framework/Configurable.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/InitContext.h" -#include "Framework/O2DatabasePDGPlugin.h" -#include "Framework/runDataProcessing.h" -#include "ReconstructionDataFormats/Track.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include