From ffb30be033ca6e8f547e24f3e8c3e823fab706fc Mon Sep 17 00:00:00 2001 From: cnkoster Date: Wed, 12 Nov 2025 16:25:45 +0100 Subject: [PATCH 01/10] Tutorial task for spectator plane CF --- Tutorials/PWGCF/EventPlane/src/CMakeLists.txt | 5 + .../EventPlane/src/SpectatorPlaneTutorial.cxx | 240 ++++++++++++++++++ 2 files changed, 245 insertions(+) create mode 100644 Tutorials/PWGCF/EventPlane/src/SpectatorPlaneTutorial.cxx diff --git a/Tutorials/PWGCF/EventPlane/src/CMakeLists.txt b/Tutorials/PWGCF/EventPlane/src/CMakeLists.txt index 86e39d138cf..1d700ab5d3f 100644 --- a/Tutorials/PWGCF/EventPlane/src/CMakeLists.txt +++ b/Tutorials/PWGCF/EventPlane/src/CMakeLists.txt @@ -13,3 +13,8 @@ o2physics_add_dpl_workflow(qvectors-tutorial SOURCES qVectorstutorial.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) + +o2physics_add_dpl_workflow(spectator-plane-tutorial + SOURCES SpectatorPlaneTutorial.cxx + PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore + COMPONENT_NAME Analysis) diff --git a/Tutorials/PWGCF/EventPlane/src/SpectatorPlaneTutorial.cxx b/Tutorials/PWGCF/EventPlane/src/SpectatorPlaneTutorial.cxx new file mode 100644 index 00000000000..a804351d293 --- /dev/null +++ b/Tutorials/PWGCF/EventPlane/src/SpectatorPlaneTutorial.cxx @@ -0,0 +1,240 @@ +// Copyright 2019-2020 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \file SpectatorPlaneTutorial.cxx +/// \author Noor Koster +/// \since 11/2025 +/// \brief This is a tutorial task to show how to use the ZDC q-vectors and the spectator plane resolution. + + +#include "PWGCF/DataModel/SPTableZDC.h" + +#include "Common/Core/EventPlaneHelper.h" +#include "Common/Core/RecoDecay.h" +#include "Common/Core/TrackSelection.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/Qvectors.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include "CCDB/BasicCCDBManager.h" +#include "DataFormatsParameters/GRPLHCIFData.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/runDataProcessing.h" + +#include "TF1.h" +#include "TPDGCode.h" + +#include +#include +#include +#include +#include +#include +#include + +using namespace o2; +using namespace o2::framework; +using namespace o2::framework::expressions; +using namespace o2::aod::rctsel; +// using namespace o2::analysis; + +#define O2_DEFINE_CONFIGURABLE(NAME, TYPE, DEFAULT, HELP) Configurable NAME{#NAME, DEFAULT, HELP}; + +struct SpectatorPlaneTutorial { + RCTFlagsChecker rctChecker; + + struct : ConfigurableGroup { + O2_DEFINE_CONFIGURABLE(cfgEvtUseRCTFlagChecker, bool, false, "Evt sel: use RCT flag checker"); + O2_DEFINE_CONFIGURABLE(cfgEvtRCTFlagCheckerLabel, std::string, "CBT_hadronPID", "Evt sel: RCT flag checker label (CBT, CBT_hadronPID)"); // all Labels can be found in Common/CCDB/RCTSelectionFlags.h + O2_DEFINE_CONFIGURABLE(cfgEvtRCTFlagCheckerZDCCheck, bool, false, "Evt sel: RCT flag checker ZDC check"); + O2_DEFINE_CONFIGURABLE(cfgEvtRCTFlagCheckerLimitAcceptAsBad, bool, false, "Evt sel: RCT flag checker treat Limited Acceptance As Bad"); + } rctFlags; + + // settings for CCDB data + O2_DEFINE_CONFIGURABLE(cfgCCDBdir_QQ, std::string, "Users/c/ckoster/ZDC/LHC23_PbPb_pass5/meanQQ/Default", "ccdb dir for average QQ values in 1% centrality bins"); + O2_DEFINE_CONFIGURABLE(cfgCCDBdir_SP, std::string, "Users/c/ckoster/ZDC/LHC23_zzh_pass4/SPPlaneRes", "ccdb dir for average event plane resolution in 1% centrality bins"); + // Confogirable axis + ConfigurableAxis axisCentrality{"axisCentrality", {20, 0, 100}, "Centrality bins for vn "}; + + // Configurables containing vector + + Filter collisionFilter = nabs(aod::collision::posZ) < 10.0f; + Filter trackFilter = nabs(aod::track::eta) < 0.8f && aod::track::pt > 0.2f && aod::track::pt < 10.0f && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < 0.2f && nabs(aod::track::dcaZ) < 2.0f; + using GeneralCollisions = soa::Join; + using UnfilteredTracks = soa::Join; + + using UsedTracks = soa::Filtered; + using ZDCCollisions = soa::Filtered>; // IMPORTANT: ZDCCollisions must be used to get access to ZDC q-vectors --> PWGCF/DataModel/SPTableZDC.h & PWGCF/Flow/TableProducer/zdcQVectors.cxx + + // Connect to ccdb + Service ccdb; + + HistogramRegistry registry{"registry"}; + + void init(InitContext const&) + { + ccdb->setURL("http://alice-ccdb.cern.ch"); + ccdb->setCaching(true); + ccdb->setLocalObjectValidityChecking(); + + int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + ccdb->setCreatedNotAfter(now); + + + AxisSpec axisPhi = {60, 0, M_PI * 2, "#varphi"}; + AxisSpec axisEta = {64, -1.6, 1.6, "#eta"}; + AxisSpec axisEtaVn = {8, -.8, .8, "#eta"}; + AxisSpec axisVx = {40, -0.01, 0.01, "v_{x}"}; + AxisSpec axisVy = {40, -0.01, 0.01, "v_{y}"}; + AxisSpec axisVz = {40, -10, 10, "v_{z}"}; + AxisSpec axisCent = {90, 0, 90, "Centrality(%)"}; + AxisSpec axisPhiPlane = {100, -M_PI, M_PI, "#Psi"}; + AxisSpec axisQx = {100, -0.2, 0.2, "Q_{X}"}; + AxisSpec axisQy = {100, -0.2, 0.2, "Q_{Y}"}; + AxisSpec axisQQ = {100, -0.2, 0.2, "#LT Q_{X}^{A}Q_{Y}^{C} #GT"}; + + std::vector ptbinning = {0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}; + AxisSpec axisPt = {ptbinning, "#it{p}_{T} GeV/#it{c}"}; + + int ptbins = ptbinning.size() - 1; + + rctChecker.init(rctFlags.cfgEvtRCTFlagCheckerLabel, rctFlags.cfgEvtRCTFlagCheckerZDCCheck, rctFlags.cfgEvtRCTFlagCheckerLimitAcceptAsBad); + + registry.add("hCentrality", "Centrality; #Events; Centrality (%)", {HistType::kTH1D, {axisCent}}); + registry.add("hSPplaneA", "Spectator Plane Angle A; #Events; #Psi_{A}", {HistType::kTH1D, {axisPhiPlane}}); + registry.add("qAqCXY", "Qx ZDCA x Qy ZDCC vs cent ; #ltQ_{X}^{A}Q_{Y}^{C}#GT; Centrality (%)", {HistType::kTH2D, {axisCent, axisQQ}}); + // Add here the histograms for the spectator plane angle C + // registry.add(.........) + registry.add("hSPplaneAvsC", "Spectator Plane Angle A vs C; #Events; #Psi_{A}; #Psi_{C}", {HistType::kTH2D, {axisPhiPlane, axisPhiPlane}}); + registry.add("hSPplaneFull", "Spectator Plane Angle Full; #Events; #Psi_{Full}", {HistType::kTH1D, {axisPhiPlane}}); + + // Note: we will fill these with data from the CCDB, just to take a look! + registry.add("CalibHistos/hQQx", "QQx; #Events; QQx", {HistType::kTProfile, {axisCent}}); + registry.add("CalibHistos/hQQy", "QQy; #Events; QQy", {HistType::kTProfile, {axisCent}}); + registry.add("CalibHistos/hQQ", "QQ; #Events; QQx + QQy", {HistType::kTProfile, {axisCent}}); + // Add here the histograms for the cross-terms of the Q-vectors from the ZDC + + registry.add("CalibHistos/hEvPlaneRes", "Event Plane Resolution; #Events; Event Plane Resolution", {HistType::kTProfile, {axisCent}}); + + // Flow Histograms + registry.add("flow/v1A", "", {HistType::kTProfile, {axisPt}}); + registry.add("flow/v1C", "", {HistType::kTProfile, {axisPt}}); + + registry.add("flow/vnAxCxUx_MH", "", {HistType::kTProfile, {axisCent}}); + registry.add("flow/vnAyCyUx_MH", "", {HistType::kTProfile, {axisCent}}); + registry.add("flow/vnAxCyUy_MH", "", {HistType::kTProfile, {axisCent}}); + registry.add("flow/vnAyCxUy_MH", "", {HistType::kTProfile, {axisCent}}); + } + + + void process(ZDCCollisions::iterator const& collision, aod::BCsWithTimestamps const&, UsedTracks const& tracks) + { + + auto bc = collision.bc_as(); + + float centrality = collision.centFT0C(); + registry.fill(HIST("hCentrality"), centrality); + + if (centrality > 80 || centrality < 0) + return; + + if (collision.isSelected() == false) + return; + + // Get the ZDC q-vectors + double qxA = collision.qxA(); + double qyA = collision.qyA(); + double qxC = collision.qxC(); + double qyC = collision.qyC(); + + // Calculate the spectator plane angles + double psiA = 1.0 * std::atan2(qyA, qxA); + registry.fill(HIST("hSPplaneA"), psiA); + + // Add the PsiA vs PsiC as a TH2D + + double psiC = 1.0 * std::atan2(qyC, qxC); + double psiFull = 1.0 * std::atan2(qyA + qyC, qxA + qxC); + registry.fill(HIST("hSPplaneFull"), psiFull); + + registry.fill(HIST("hSPplaneAvsC"), psiA, psiC); + + // Fill the q-vector correlations + registry.fill(HIST("qAqCXY"), centrality, qxA * qxC + qyA * qyC); + + double QQx = 1; + double QQy = 1; + double QQ = 1; + double evPlaneRes = 1; + + // Get QQ-correlations from CCDB + if(cfgCCDBdir_QQ.value.empty() == false) { + TList* list = ccdb->getForTimeStamp(cfgCCDBdir_QQ.value, bc.timestamp()); + TProfile* qAqCX = reinterpret_cast(list->FindObject("qAqCX")); + TProfile* qAqCY = reinterpret_cast(list->FindObject("qAqCY")); + TProfile* qAqCXY = reinterpret_cast(list->FindObject("qAqCXY")); + // The sum is qAqCXY + QQx = qAqCX->GetBinContent(centrality); + QQy = qAqCY->GetBinContent(centrality); + QQ = qAqCXY->GetBinContent(centrality); + registry.fill(HIST("CalibHistos/hQQx"), centrality, QQx); + registry.fill(HIST("CalibHistos/hQQy"), centrality, QQy); + registry.fill(HIST("CalibHistos/hQQ"), centrality, QQ); + } + // Get event plane resolution from CCDB + if(cfgCCDBdir_SP.value.empty() == false) { + evPlaneRes = ccdb->getForTimeStamp(cfgCCDBdir_SP.value, bc.timestamp())->GetBinContent(centrality); + registry.fill(HIST("CalibHistos/hEvPlaneRes"), centrality, evPlaneRes); + } + + for (const auto& track : tracks) { + + // constrain angle to 0 -> [0,0+2pi] + auto phi = RecoDecay::constrainAngle(track.phi(), 0); + + double ux = std::cos(phi); + double uy = std::sin(phi); + + double uxMH = std::cos(2 * phi); + double uyMH = std::sin(2 * phi); + + double v1A = (uy * qyA + ux * qxA) / std::sqrt(std::fabs(QQ)); + double v1C = (uy * qyC + ux * qxC) / std::sqrt(std::fabs(QQ)); + + double v2AxCxUx_MH = (uxMH * qxA * qxC) / QQx; + double v2AyCyUx_MH = (uxMH * qyA * qyC) / QQy; + double v2AxCyUy_MH = (uyMH * qxA * qyC) / QQx; + double v2AyCxUy_MH = (uyMH * qyA * qxC) / QQy; + + registry.fill(HIST("flow/v1A"), track.eta(), v1A); + registry.fill(HIST("flow/v1C"), track.eta(), v1C); + + registry.fill(HIST("flow/v2AxCxUx_MH"), centrality, v2AxCxUx_MH); + registry.fill(HIST("flow/v2AyCyUx_MH"), centrality, v2AyCyUx_MH); + registry.fill(HIST("flow/v2AxCyUy_MH"), centrality, v2AxCyUy_MH); + registry.fill(HIST("flow/v2AyCxUy_MH"), centrality, v2AyCxUy_MH); + + } +} + +}; + +WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +{ + return WorkflowSpec{ + adaptAnalysisTask(cfgc)}; +} From ee8ce71edfb54af4dd9b13fb7798eef8701cac50 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Wed, 12 Nov 2025 15:27:19 +0000 Subject: [PATCH 02/10] Please consider the following formatting changes --- .../EventPlane/src/SpectatorPlaneTutorial.cxx | 61 +++++++++---------- 1 file changed, 28 insertions(+), 33 deletions(-) diff --git a/Tutorials/PWGCF/EventPlane/src/SpectatorPlaneTutorial.cxx b/Tutorials/PWGCF/EventPlane/src/SpectatorPlaneTutorial.cxx index a804351d293..0007484ffaa 100644 --- a/Tutorials/PWGCF/EventPlane/src/SpectatorPlaneTutorial.cxx +++ b/Tutorials/PWGCF/EventPlane/src/SpectatorPlaneTutorial.cxx @@ -14,7 +14,6 @@ /// \since 11/2025 /// \brief This is a tutorial task to show how to use the ZDC q-vectors and the spectator plane resolution. - #include "PWGCF/DataModel/SPTableZDC.h" #include "Common/Core/EventPlaneHelper.h" @@ -94,7 +93,6 @@ struct SpectatorPlaneTutorial { int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); ccdb->setCreatedNotAfter(now); - AxisSpec axisPhi = {60, 0, M_PI * 2, "#varphi"}; AxisSpec axisEta = {64, -1.6, 1.6, "#eta"}; AxisSpec axisEtaVn = {8, -.8, .8, "#eta"}; @@ -122,7 +120,7 @@ struct SpectatorPlaneTutorial { registry.add("hSPplaneAvsC", "Spectator Plane Angle A vs C; #Events; #Psi_{A}; #Psi_{C}", {HistType::kTH2D, {axisPhiPlane, axisPhiPlane}}); registry.add("hSPplaneFull", "Spectator Plane Angle Full; #Events; #Psi_{Full}", {HistType::kTH1D, {axisPhiPlane}}); - // Note: we will fill these with data from the CCDB, just to take a look! + // Note: we will fill these with data from the CCDB, just to take a look! registry.add("CalibHistos/hQQx", "QQx; #Events; QQx", {HistType::kTProfile, {axisCent}}); registry.add("CalibHistos/hQQy", "QQy; #Events; QQy", {HistType::kTProfile, {axisCent}}); registry.add("CalibHistos/hQQ", "QQ; #Events; QQx + QQy", {HistType::kTProfile, {axisCent}}); @@ -130,7 +128,7 @@ struct SpectatorPlaneTutorial { registry.add("CalibHistos/hEvPlaneRes", "Event Plane Resolution; #Events; Event Plane Resolution", {HistType::kTProfile, {axisCent}}); - // Flow Histograms + // Flow Histograms registry.add("flow/v1A", "", {HistType::kTProfile, {axisPt}}); registry.add("flow/v1C", "", {HistType::kTProfile, {axisPt}}); @@ -140,7 +138,6 @@ struct SpectatorPlaneTutorial { registry.add("flow/vnAyCxUy_MH", "", {HistType::kTProfile, {axisCent}}); } - void process(ZDCCollisions::iterator const& collision, aod::BCsWithTimestamps const&, UsedTracks const& tracks) { @@ -150,7 +147,7 @@ struct SpectatorPlaneTutorial { registry.fill(HIST("hCentrality"), centrality); if (centrality > 80 || centrality < 0) - return; + return; if (collision.isSelected() == false) return; @@ -165,7 +162,7 @@ struct SpectatorPlaneTutorial { double psiA = 1.0 * std::atan2(qyA, qxA); registry.fill(HIST("hSPplaneA"), psiA); - // Add the PsiA vs PsiC as a TH2D + // Add the PsiA vs PsiC as a TH2D double psiC = 1.0 * std::atan2(qyC, qxC); double psiFull = 1.0 * std::atan2(qyA + qyC, qxA + qxC); @@ -178,11 +175,11 @@ struct SpectatorPlaneTutorial { double QQx = 1; double QQy = 1; - double QQ = 1; + double QQ = 1; double evPlaneRes = 1; // Get QQ-correlations from CCDB - if(cfgCCDBdir_QQ.value.empty() == false) { + if (cfgCCDBdir_QQ.value.empty() == false) { TList* list = ccdb->getForTimeStamp(cfgCCDBdir_QQ.value, bc.timestamp()); TProfile* qAqCX = reinterpret_cast(list->FindObject("qAqCX")); TProfile* qAqCY = reinterpret_cast(list->FindObject("qAqCY")); @@ -195,42 +192,40 @@ struct SpectatorPlaneTutorial { registry.fill(HIST("CalibHistos/hQQy"), centrality, QQy); registry.fill(HIST("CalibHistos/hQQ"), centrality, QQ); } - // Get event plane resolution from CCDB - if(cfgCCDBdir_SP.value.empty() == false) { + // Get event plane resolution from CCDB + if (cfgCCDBdir_SP.value.empty() == false) { evPlaneRes = ccdb->getForTimeStamp(cfgCCDBdir_SP.value, bc.timestamp())->GetBinContent(centrality); registry.fill(HIST("CalibHistos/hEvPlaneRes"), centrality, evPlaneRes); } - for (const auto& track : tracks) { + for (const auto& track : tracks) { - // constrain angle to 0 -> [0,0+2pi] - auto phi = RecoDecay::constrainAngle(track.phi(), 0); + // constrain angle to 0 -> [0,0+2pi] + auto phi = RecoDecay::constrainAngle(track.phi(), 0); - double ux = std::cos(phi); - double uy = std::sin(phi); + double ux = std::cos(phi); + double uy = std::sin(phi); - double uxMH = std::cos(2 * phi); - double uyMH = std::sin(2 * phi); + double uxMH = std::cos(2 * phi); + double uyMH = std::sin(2 * phi); - double v1A = (uy * qyA + ux * qxA) / std::sqrt(std::fabs(QQ)); - double v1C = (uy * qyC + ux * qxC) / std::sqrt(std::fabs(QQ)); + double v1A = (uy * qyA + ux * qxA) / std::sqrt(std::fabs(QQ)); + double v1C = (uy * qyC + ux * qxC) / std::sqrt(std::fabs(QQ)); - double v2AxCxUx_MH = (uxMH * qxA * qxC) / QQx; - double v2AyCyUx_MH = (uxMH * qyA * qyC) / QQy; - double v2AxCyUy_MH = (uyMH * qxA * qyC) / QQx; - double v2AyCxUy_MH = (uyMH * qyA * qxC) / QQy; + double v2AxCxUx_MH = (uxMH * qxA * qxC) / QQx; + double v2AyCyUx_MH = (uxMH * qyA * qyC) / QQy; + double v2AxCyUy_MH = (uyMH * qxA * qyC) / QQx; + double v2AyCxUy_MH = (uyMH * qyA * qxC) / QQy; - registry.fill(HIST("flow/v1A"), track.eta(), v1A); - registry.fill(HIST("flow/v1C"), track.eta(), v1C); - - registry.fill(HIST("flow/v2AxCxUx_MH"), centrality, v2AxCxUx_MH); - registry.fill(HIST("flow/v2AyCyUx_MH"), centrality, v2AyCyUx_MH); - registry.fill(HIST("flow/v2AxCyUy_MH"), centrality, v2AxCyUy_MH); - registry.fill(HIST("flow/v2AyCxUy_MH"), centrality, v2AyCxUy_MH); + registry.fill(HIST("flow/v1A"), track.eta(), v1A); + registry.fill(HIST("flow/v1C"), track.eta(), v1C); + registry.fill(HIST("flow/v2AxCxUx_MH"), centrality, v2AxCxUx_MH); + registry.fill(HIST("flow/v2AyCyUx_MH"), centrality, v2AyCyUx_MH); + registry.fill(HIST("flow/v2AxCyUy_MH"), centrality, v2AxCyUy_MH); + registry.fill(HIST("flow/v2AyCxUy_MH"), centrality, v2AyCxUy_MH); + } } -} - }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) From 55165d28c228da97c05be6b71a2ab2cc357ba6b5 Mon Sep 17 00:00:00 2001 From: cnkoster Date: Wed, 12 Nov 2025 17:25:07 +0100 Subject: [PATCH 03/10] Changed filename SpectatorPlaneTutorial.cxx to spectatorPlaneTutorial.cxx --- .../{SpectatorPlaneTutorial.cxx => spectatorPlaneTutorial.cxx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Tutorials/PWGCF/EventPlane/src/{SpectatorPlaneTutorial.cxx => spectatorPlaneTutorial.cxx} (100%) diff --git a/Tutorials/PWGCF/EventPlane/src/SpectatorPlaneTutorial.cxx b/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx similarity index 100% rename from Tutorials/PWGCF/EventPlane/src/SpectatorPlaneTutorial.cxx rename to Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx From 3d8cf10d000836eac828c53e2a3c4df95760999c Mon Sep 17 00:00:00 2001 From: cnkoster Date: Wed, 12 Nov 2025 17:29:48 +0100 Subject: [PATCH 04/10] fixed linter issues --- .../EventPlane/src/spectatorPlaneTutorial.cxx | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx b/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx index 0007484ffaa..33e5a962907 100644 --- a/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx +++ b/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx @@ -70,9 +70,15 @@ struct SpectatorPlaneTutorial { ConfigurableAxis axisCentrality{"axisCentrality", {20, 0, 100}, "Centrality bins for vn "}; // Configurables containing vector - - Filter collisionFilter = nabs(aod::collision::posZ) < 10.0f; - Filter trackFilter = nabs(aod::track::eta) < 0.8f && aod::track::pt > 0.2f && aod::track::pt < 10.0f && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < 0.2f && nabs(aod::track::dcaZ) < 2.0f; + float vtxZ = 10.0; + float etaMax = 0.8; + float ptMin = 0.2; + float ptMax = 10.0; + float dcaXYMax = 0.2; + float dcaZMax = 2.0; + + Filter collisionFilter = nabs(aod::collision::posZ) < vtxZ; + Filter trackFilter = nabs(aod::track::eta) < etaMax && aod::track::pt > ptMin && aod::track::pt < ptMax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < dcaXYMax && nabs(aod::track::dcaZ) < dcaZMax; using GeneralCollisions = soa::Join; using UnfilteredTracks = soa::Join; @@ -93,14 +99,14 @@ struct SpectatorPlaneTutorial { int64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); ccdb->setCreatedNotAfter(now); - AxisSpec axisPhi = {60, 0, M_PI * 2, "#varphi"}; + AxisSpec axisPhi = {60, 0, constants::math::TwoPI, "#varphi"}; AxisSpec axisEta = {64, -1.6, 1.6, "#eta"}; AxisSpec axisEtaVn = {8, -.8, .8, "#eta"}; AxisSpec axisVx = {40, -0.01, 0.01, "v_{x}"}; AxisSpec axisVy = {40, -0.01, 0.01, "v_{y}"}; AxisSpec axisVz = {40, -10, 10, "v_{z}"}; AxisSpec axisCent = {90, 0, 90, "Centrality(%)"}; - AxisSpec axisPhiPlane = {100, -M_PI, M_PI, "#Psi"}; + AxisSpec axisPhiPlane = {100, -constants::math::PI, constants::math::PI, "#Psi"}; AxisSpec axisQx = {100, -0.2, 0.2, "Q_{X}"}; AxisSpec axisQy = {100, -0.2, 0.2, "Q_{Y}"}; AxisSpec axisQQ = {100, -0.2, 0.2, "#LT Q_{X}^{A}Q_{Y}^{C} #GT"}; From 9db6d76eea32dc4a709e063bbc226242a139d463 Mon Sep 17 00:00:00 2001 From: cnkoster Date: Wed, 12 Nov 2025 17:32:21 +0100 Subject: [PATCH 05/10] Remoce magic numbers --- Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx b/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx index 33e5a962907..231ae463531 100644 --- a/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx +++ b/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx @@ -152,7 +152,10 @@ struct SpectatorPlaneTutorial { float centrality = collision.centFT0C(); registry.fill(HIST("hCentrality"), centrality); - if (centrality > 80 || centrality < 0) + float centMin = 0; + float centMax = 80; + + if (centrality > centMax || centrality < centMin) return; if (collision.isSelected() == false) From ccfe81362c3b234b8f52cfef522f70049bf05548 Mon Sep 17 00:00:00 2001 From: cnkoster Date: Wed, 12 Nov 2025 17:34:39 +0100 Subject: [PATCH 06/10] change filename --- Tutorials/PWGCF/EventPlane/src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tutorials/PWGCF/EventPlane/src/CMakeLists.txt b/Tutorials/PWGCF/EventPlane/src/CMakeLists.txt index 1d700ab5d3f..bf15a1a13c9 100644 --- a/Tutorials/PWGCF/EventPlane/src/CMakeLists.txt +++ b/Tutorials/PWGCF/EventPlane/src/CMakeLists.txt @@ -15,6 +15,6 @@ o2physics_add_dpl_workflow(qvectors-tutorial COMPONENT_NAME Analysis) o2physics_add_dpl_workflow(spectator-plane-tutorial - SOURCES SpectatorPlaneTutorial.cxx + SOURCES spectatorPlaneTutorial.cxx PUBLIC_LINK_LIBRARIES O2::Framework O2Physics::AnalysisCore COMPONENT_NAME Analysis) From 90bead4059a14a8a27b8c45dafa70e7796e70a3e Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Wed, 12 Nov 2025 16:35:18 +0000 Subject: [PATCH 07/10] Please consider the following formatting changes --- Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx b/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx index 231ae463531..18034f9e0ae 100644 --- a/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx +++ b/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx @@ -78,7 +78,7 @@ struct SpectatorPlaneTutorial { float dcaZMax = 2.0; Filter collisionFilter = nabs(aod::collision::posZ) < vtxZ; - Filter trackFilter = nabs(aod::track::eta) < etaMax && aod::track::pt > ptMin && aod::track::pt < ptMax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < dcaXYMax && nabs(aod::track::dcaZ) < dcaZMax; + Filter trackFilter = nabs(aod::track::eta) < etaMax && aod::track::pt > ptMin&& aod::track::pt < ptMax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < dcaXYMax&& nabs(aod::track::dcaZ) < dcaZMax; using GeneralCollisions = soa::Join; using UnfilteredTracks = soa::Join; @@ -152,8 +152,8 @@ struct SpectatorPlaneTutorial { float centrality = collision.centFT0C(); registry.fill(HIST("hCentrality"), centrality); - float centMin = 0; - float centMax = 80; + float centMin = 0; + float centMax = 80; if (centrality > centMax || centrality < centMin) return; From 3c244a16f1fb44270fa116903e7772973f082227 Mon Sep 17 00:00:00 2001 From: cnkoster Date: Wed, 12 Nov 2025 17:38:15 +0100 Subject: [PATCH 08/10] Change variable names --- .../EventPlane/src/spectatorPlaneTutorial.cxx | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx b/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx index 231ae463531..40c5c47b9d0 100644 --- a/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx +++ b/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx @@ -138,10 +138,10 @@ struct SpectatorPlaneTutorial { registry.add("flow/v1A", "", {HistType::kTProfile, {axisPt}}); registry.add("flow/v1C", "", {HistType::kTProfile, {axisPt}}); - registry.add("flow/vnAxCxUx_MH", "", {HistType::kTProfile, {axisCent}}); - registry.add("flow/vnAyCyUx_MH", "", {HistType::kTProfile, {axisCent}}); - registry.add("flow/vnAxCyUy_MH", "", {HistType::kTProfile, {axisCent}}); - registry.add("flow/vnAyCxUy_MH", "", {HistType::kTProfile, {axisCent}}); + registry.add("flow/vnAxCxUxMH", "", {HistType::kTProfile, {axisCent}}); + registry.add("flow/vnAyCyUxMH", "", {HistType::kTProfile, {axisCent}}); + registry.add("flow/vnAxCyUyMH", "", {HistType::kTProfile, {axisCent}}); + registry.add("flow/vnAyCxUyMH", "", {HistType::kTProfile, {axisCent}}); } void process(ZDCCollisions::iterator const& collision, aod::BCsWithTimestamps const&, UsedTracks const& tracks) @@ -182,9 +182,9 @@ struct SpectatorPlaneTutorial { // Fill the q-vector correlations registry.fill(HIST("qAqCXY"), centrality, qxA * qxC + qyA * qyC); - double QQx = 1; - double QQy = 1; - double QQ = 1; + double corrQQx = 1; + double corrQQy = 1; + double corrQQ = 1; double evPlaneRes = 1; // Get QQ-correlations from CCDB @@ -194,12 +194,12 @@ struct SpectatorPlaneTutorial { TProfile* qAqCY = reinterpret_cast(list->FindObject("qAqCY")); TProfile* qAqCXY = reinterpret_cast(list->FindObject("qAqCXY")); // The sum is qAqCXY - QQx = qAqCX->GetBinContent(centrality); - QQy = qAqCY->GetBinContent(centrality); - QQ = qAqCXY->GetBinContent(centrality); - registry.fill(HIST("CalibHistos/hQQx"), centrality, QQx); - registry.fill(HIST("CalibHistos/hQQy"), centrality, QQy); - registry.fill(HIST("CalibHistos/hQQ"), centrality, QQ); + corrQQx = qAqCX->GetBinContent(centrality); + corrQQy = qAqCY->GetBinContent(centrality); + corrQQ = qAqCXY->GetBinContent(centrality); + registry.fill(HIST("CalibHistos/hQQx"), centrality, corrQQx); + registry.fill(HIST("CalibHistos/hQQy"), centrality, corrQQy); + registry.fill(HIST("CalibHistos/hQQ"), centrality, corrQQ); } // Get event plane resolution from CCDB if (cfgCCDBdir_SP.value.empty() == false) { @@ -218,21 +218,21 @@ struct SpectatorPlaneTutorial { double uxMH = std::cos(2 * phi); double uyMH = std::sin(2 * phi); - double v1A = (uy * qyA + ux * qxA) / std::sqrt(std::fabs(QQ)); - double v1C = (uy * qyC + ux * qxC) / std::sqrt(std::fabs(QQ)); + double v1A = (uy * qyA + ux * qxA) / std::sqrt(std::fabs(corrQQ)); + double v1C = (uy * qyC + ux * qxC) / std::sqrt(std::fabs(corrQQ)); - double v2AxCxUx_MH = (uxMH * qxA * qxC) / QQx; - double v2AyCyUx_MH = (uxMH * qyA * qyC) / QQy; - double v2AxCyUy_MH = (uyMH * qxA * qyC) / QQx; - double v2AyCxUy_MH = (uyMH * qyA * qxC) / QQy; + double v2AxCxUxMH = (uxMH * qxA * qxC) / corrQQx; + double v2AyCyUxMH = (uxMH * qyA * qyC) / corrQQy; + double v2AxCyUyMH = (uyMH * qxA * qyC) / corrQQx; + double v2AyCxUyMH = (uyMH * qyA * qxC) / corrQQy; registry.fill(HIST("flow/v1A"), track.eta(), v1A); registry.fill(HIST("flow/v1C"), track.eta(), v1C); - registry.fill(HIST("flow/v2AxCxUx_MH"), centrality, v2AxCxUx_MH); - registry.fill(HIST("flow/v2AyCyUx_MH"), centrality, v2AyCyUx_MH); - registry.fill(HIST("flow/v2AxCyUy_MH"), centrality, v2AxCyUy_MH); - registry.fill(HIST("flow/v2AyCxUy_MH"), centrality, v2AyCxUy_MH); + registry.fill(HIST("flow/v2AxCxUxMH"), centrality, v2AxCxUxMH); + registry.fill(HIST("flow/v2AyCyUxMH"), centrality, v2AyCyUxMH); + registry.fill(HIST("flow/v2AxCyUyMH"), centrality, v2AxCyUyMH); + registry.fill(HIST("flow/v2AyCxUyMH"), centrality, v2AyCxUyMH); } } }; From 27b9500e808818c7760e98ebcb0cba49d7a7b229 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Wed, 12 Nov 2025 16:38:51 +0000 Subject: [PATCH 09/10] Please consider the following formatting changes --- Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx b/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx index 40c5c47b9d0..0c611c2db7c 100644 --- a/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx +++ b/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx @@ -78,7 +78,7 @@ struct SpectatorPlaneTutorial { float dcaZMax = 2.0; Filter collisionFilter = nabs(aod::collision::posZ) < vtxZ; - Filter trackFilter = nabs(aod::track::eta) < etaMax && aod::track::pt > ptMin && aod::track::pt < ptMax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < dcaXYMax && nabs(aod::track::dcaZ) < dcaZMax; + Filter trackFilter = nabs(aod::track::eta) < etaMax && aod::track::pt > ptMin&& aod::track::pt < ptMax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && nabs(aod::track::dcaXY) < dcaXYMax&& nabs(aod::track::dcaZ) < dcaZMax; using GeneralCollisions = soa::Join; using UnfilteredTracks = soa::Join; @@ -152,8 +152,8 @@ struct SpectatorPlaneTutorial { float centrality = collision.centFT0C(); registry.fill(HIST("hCentrality"), centrality); - float centMin = 0; - float centMax = 80; + float centMin = 0; + float centMax = 80; if (centrality > centMax || centrality < centMin) return; From 7e484fb38f3b8ca261f90392d56adecd7bf3655f Mon Sep 17 00:00:00 2001 From: cnkoster Date: Thu, 13 Nov 2025 07:43:48 +0100 Subject: [PATCH 10/10] remove unused variables --- Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx b/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx index 0c611c2db7c..6790dd30ae5 100644 --- a/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx +++ b/Tutorials/PWGCF/EventPlane/src/spectatorPlaneTutorial.cxx @@ -102,20 +102,13 @@ struct SpectatorPlaneTutorial { AxisSpec axisPhi = {60, 0, constants::math::TwoPI, "#varphi"}; AxisSpec axisEta = {64, -1.6, 1.6, "#eta"}; AxisSpec axisEtaVn = {8, -.8, .8, "#eta"}; - AxisSpec axisVx = {40, -0.01, 0.01, "v_{x}"}; - AxisSpec axisVy = {40, -0.01, 0.01, "v_{y}"}; - AxisSpec axisVz = {40, -10, 10, "v_{z}"}; AxisSpec axisCent = {90, 0, 90, "Centrality(%)"}; AxisSpec axisPhiPlane = {100, -constants::math::PI, constants::math::PI, "#Psi"}; - AxisSpec axisQx = {100, -0.2, 0.2, "Q_{X}"}; - AxisSpec axisQy = {100, -0.2, 0.2, "Q_{Y}"}; AxisSpec axisQQ = {100, -0.2, 0.2, "#LT Q_{X}^{A}Q_{Y}^{C} #GT"}; std::vector ptbinning = {0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.2, 2.4, 2.6, 2.8, 3, 3.5, 4, 5, 6, 8, 10}; AxisSpec axisPt = {ptbinning, "#it{p}_{T} GeV/#it{c}"}; - int ptbins = ptbinning.size() - 1; - rctChecker.init(rctFlags.cfgEvtRCTFlagCheckerLabel, rctFlags.cfgEvtRCTFlagCheckerZDCCheck, rctFlags.cfgEvtRCTFlagCheckerLimitAcceptAsBad); registry.add("hCentrality", "Centrality; #Events; Centrality (%)", {HistType::kTH1D, {axisCent}});