From 3283b9a00314b9609a168a5757349af3e4be0401 Mon Sep 17 00:00:00 2001 From: Anton Riedel Date: Mon, 10 Aug 2026 10:05:00 +0200 Subject: [PATCH 1/4] Feat: add new process function --- PWGCF/Femto/Core/collisionBuilder.h | 6 +----- PWGCF/Femto/Core/v0HistManager.h | 2 +- PWGCF/Femto/TableProducer/femtoProducer.cxx | 23 ++++++++++++++++++++- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/PWGCF/Femto/Core/collisionBuilder.h b/PWGCF/Femto/Core/collisionBuilder.h index e65714f754a..b0a4812b01b 100644 --- a/PWGCF/Femto/Core/collisionBuilder.h +++ b/PWGCF/Femto/Core/collisionBuilder.h @@ -34,10 +34,6 @@ #include #include -#include - -#include - #include #include #include @@ -373,7 +369,7 @@ class CollisionSelection : public baseselection::BaseSelection void setEventPlane(T const& col) { - float harmonic = static_cast(mQvecHarmonic); + auto harmonic = static_cast(mQvecHarmonic); switch (mQvecDetector) { case modes::QvecDetector::kFT0C: mEventPlane = RecoDecay::constrainAngle((std::atan2(col.qvecFT0CImVec()[0], col.qvecFT0CReVec()[0])) / harmonic, 0, harmonic); // constrain between 0 and 2pi/harmonic diff --git a/PWGCF/Femto/Core/v0HistManager.h b/PWGCF/Femto/Core/v0HistManager.h index 598d2766d6f..4741255622f 100644 --- a/PWGCF/Femto/Core/v0HistManager.h +++ b/PWGCF/Femto/Core/v0HistManager.h @@ -165,7 +165,7 @@ constexpr std::array, kV0HistLast> HistTable = { {kCosPa, o2::framework::HistType::kTH1F, "hCosPa", "Cosine of pointing angle; cos(#alpha); Entries"}, {kDecayDauDca, o2::framework::HistType::kTH1F, "hDauDca", "Daughter DCA at decay vertex ; DCA_{Decay vertex} (cm); Entries"}, {kStrangeTofPosDau, o2::framework::HistType::kTH1F, "hStrangeTofPosDau", "Strange TOF of positive Daughter ; n#sigma_{TOF, strange}; Entries"}, - {kStrangeTofNegDau, o2::framework::HistType::kTH1F, "hStrangeTofNegDau", "Strange TOF of negative Daughter ; n#sigma+{TOF, strange}; Entries"}, + {kStrangeTofNegDau, o2::framework::HistType::kTH1F, "hStrangeTofNegDau", "Strange TOF of negative Daughter ; n#sigma_{TOF, strange}; Entries"}, {kDecayVtxX, o2::framework::HistType::kTH1F, "hDecayVtxX", "X coordinate of decay vertex ; DV_{X} (cm); Entries"}, {kDecayVtxY, o2::framework::HistType::kTH1F, "hDecayVtxY", "Y coordinate of decay vertex ; DV_{Y} (cm); Entries"}, {kDecayVtxZ, o2::framework::HistType::kTH1F, "hDecayVtxZ", "Z coordinate of decay vertex ; DV_{Z} (cm); Entries"}, diff --git a/PWGCF/Femto/TableProducer/femtoProducer.cxx b/PWGCF/Femto/TableProducer/femtoProducer.cxx index e28b6ea656a..f318720d782 100644 --- a/PWGCF/Femto/TableProducer/femtoProducer.cxx +++ b/PWGCF/Femto/TableProducer/femtoProducer.cxx @@ -34,6 +34,7 @@ #include "Common/DataModel/PIDResponseITS.h" #include "Common/DataModel/PIDResponseTOF.h" #include "Common/DataModel/PIDResponseTPC.h" +#include "Common/DataModel/Qvectors.h" #include "Common/DataModel/TrackSelectionTables.h" #include @@ -77,7 +78,7 @@ using Run3FullPidTracks = o2::aod::pidTOFbeta, o2::aod::pidTOFmass>; using Run3McRecoTracks = soa::Join; -using Run3Vzeros = o2::soa::Join; +using Run3Vzeros = o2::soa::Join; using Run3RecoVzeros = o2::soa::Join; using Run3D0s = soa::Join; @@ -204,6 +205,7 @@ struct FemtoProducer { // ---- guard: enabled tables vs. enabled process function ------------------ if ((xiBuilder.fillAnyTable() || omegaBuilder.fillAnyTable()) && (!doprocessTracksV0sCascadesRun3pp && !doprocessTracksV0sCascadesRun3PbPb && + !doprocessTracksV0sCascadesRun3PbPbWithEventShape && !doprocessTracksV0sCascadesKinksRun3pp && !doprocessTracksV0sCascadesRun3ppMc && !doprocessTracksV0sCascadesRun3PbPbMc)) { LOG(fatal) << "At least one cascade table is enabled, but wrong process function is enabled. Breaking..."; @@ -211,6 +213,7 @@ struct FemtoProducer { if ((lambdaBuilder.fillAnyTable() || antilambdaBuilder.fillAnyTable() || k0shortBuilder.fillAnyTable()) && (!doprocessTracksV0sCascadesRun3pp && !doprocessTracksV0sCascadesRun3PbPb && !doprocessTracksV0sRun3pp && !doprocessTracksV0sCascadesKinksRun3pp && + !doprocessTracksV0sCascadesRun3PbPbWithEventShape && !doprocessTracksV0sRun3ppMc && !doprocessTracksV0sRun3PbPb && !doprocessTracksV0sRun3PbPbMc && !doprocessTracksV0sCascadesRun3ppMc && !doprocessTracksV0sCascadesRun3PbPbMc && !doprocessTracksV0sKinksRun3ppMc)) { @@ -285,6 +288,7 @@ struct FemtoProducer { static_cast(doprocessTracksV0sRun3PbPb) + static_cast(doprocessTracksV0sCascadesRun3pp) + static_cast(doprocessTracksV0sCascadesRun3PbPb) + + static_cast(doprocessTracksV0sCascadesRun3PbPbWithEventShape) + static_cast(doprocessTracksKinksRun3pp) + static_cast(doprocessTracksV0sCascadesKinksRun3pp) + static_cast(doprocessTracksD0sRun3pp) + @@ -531,6 +535,23 @@ struct FemtoProducer { } PROCESS_SWITCH(FemtoProducer, processTracksV0sCascadesRun3PbPb, "Provide tracks, v0s and cascades in PbPb collisions", false); + void processTracksV0sCascadesRun3PbPbWithEventShape(rawinputs::Run3PbPbCollisionsWithEventShape::iterator const& col, + o2::aod::BCsWithTimestamps const& bcs, + rawinputs::Run3FullPidTracks const& tracks, + rawinputs::Run3Vzeros const& v0s, + rawinputs::Run3Cascades const& cascades) + { + if (!processCollisions(col, bcs, tracks)) { + return; + } + auto tracksWithItsPid = o2::soa::Attach(tracks); + processTracks(col, tracksWithItsPid); + processV0s(col, tracks, v0s); + processCascades(col, tracks, cascades); + } + PROCESS_SWITCH(FemtoProducer, processTracksV0sCascadesRun3PbPbWithEventShape, "Provide tracks, v0s and cascades in PbPb collisions with event shape information", false); + void processTracksKinksRun3pp(rawinputs::Run3PpCollisions::iterator const& col, o2::aod::BCsWithTimestamps const& bcs, rawinputs::Run3FullPidTracks const& tracks, From db53d056df22c6e0c32cd2ab4cb109fb895b4121 Mon Sep 17 00:00:00 2001 From: Anton Riedel Date: Mon, 10 Aug 2026 13:03:59 +0200 Subject: [PATCH 2/4] Fix: fix index access --- PWGCF/Femto/Core/collisionBuilder.h | 10 +++++++--- PWGCF/Femto/Core/modes.h | 1 - 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/PWGCF/Femto/Core/collisionBuilder.h b/PWGCF/Femto/Core/collisionBuilder.h index b0a4812b01b..15d39aa572e 100644 --- a/PWGCF/Femto/Core/collisionBuilder.h +++ b/PWGCF/Femto/Core/collisionBuilder.h @@ -82,7 +82,7 @@ struct ConfCollisionBits : o2::framework::ConfigurableGroup { o2::framework::Configurable> sphericityMax{"sphericityMax", {}, "Maximum sphericity"}; o2::framework::Configurable> triggers{"triggers", {}, "List of all triggers to be used"}; o2::framework::Configurable qvecDetector{"qvecDetector", 0, "Detector used to estimate the Q-vector: 0 -> FT0C, 1 -> FT0A"}; - o2::framework::Configurable qvecHarmonic{"qvecHarmonic", 2, "Harmonic n of the Q-vector and event plane angle Psi_n: 1 -> direct, 2 -> elliptic, 3 -> triangular"}; + o2::framework::Configurable qvecHarmonic{"qvecHarmonic", 2, "Harmonic n of the Q-vector and event plane angle Psi_n: 2 -> elliptic, 3 -> triangular"}; }; struct ConfCcdb : o2::framework::ConfigurableGroup { @@ -370,12 +370,16 @@ class CollisionSelection : public baseselection::BaseSelection(mQvecHarmonic); + int index = static_cast(mQvecHarmonic) - 2; // get index in the qvector vector + if (index >= 2) { + LOG(fatal) << "At the moment harmonics up to 3 are supported!"; + } switch (mQvecDetector) { case modes::QvecDetector::kFT0C: - mEventPlane = RecoDecay::constrainAngle((std::atan2(col.qvecFT0CImVec()[0], col.qvecFT0CReVec()[0])) / harmonic, 0, harmonic); // constrain between 0 and 2pi/harmonic + mEventPlane = RecoDecay::constrainAngle((std::atan2(col.qvecFT0CImVec()[index], col.qvecFT0CReVec()[index])) / harmonic, 0, harmonic); // constrain between 0 and 2pi/harmonic break; case modes::QvecDetector::kFT0A: - mEventPlane = RecoDecay::constrainAngle((std::atan2(col.qvecFT0AImVec()[0], col.qvecFT0AReVec()[0])) / harmonic, 0, harmonic); // constrain between 0 and 2pi/harmonic + mEventPlane = RecoDecay::constrainAngle((std::atan2(col.qvecFT0AImVec()[index], col.qvecFT0AReVec()[index])) / harmonic, 0, harmonic); // constrain between 0 and 2pi/harmonic break; } } diff --git a/PWGCF/Femto/Core/modes.h b/PWGCF/Femto/Core/modes.h index 8398aa56488..add9098618a 100644 --- a/PWGCF/Femto/Core/modes.h +++ b/PWGCF/Femto/Core/modes.h @@ -184,7 +184,6 @@ enum class QvecDetector : o2::analysis::femto::datatypes::QvecDetectorType { }; enum class QvecHarmonic : o2::analysis::femto::datatypes::QvecHarmonicType { - kN1 = 1, kN2 = 2, kN3 = 3 }; From feeb4013787255a947648ca711b1424892c5f9e6 Mon Sep 17 00:00:00 2001 From: Anton Riedel Date: Mon, 10 Aug 2026 13:22:06 +0200 Subject: [PATCH 3/4] Feat: add protection against bad user input --- PWGCF/Femto/Core/collisionBuilder.h | 9 ++++++--- PWGCF/Femto/Core/modes.h | 6 ++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/PWGCF/Femto/Core/collisionBuilder.h b/PWGCF/Femto/Core/collisionBuilder.h index 15d39aa572e..1e1bdcc3a1b 100644 --- a/PWGCF/Femto/Core/collisionBuilder.h +++ b/PWGCF/Femto/Core/collisionBuilder.h @@ -245,7 +245,13 @@ class CollisionSelection : public baseselection::BaseSelection(config.qvecDetector.value); + if (mQvecDetector >= modes::QvecDetector::kQvecDetectorLast) { + LOG(fatal) << "Qvector Detector is not supported"; + } mQvecHarmonic = static_cast(config.qvecHarmonic.value); + if (mQvecHarmonic < modes::QvecHarmonic::kN2 || mQvecHarmonic >= modes::QvecHarmonic::kQvecHarmonicLast) { + LOG(fatal) << "Qvector Harmonic is not supported"; + } this->addSelection(kSel8, collisionSelectionNames.at(kSel8), config.sel8.value); this->addSelection(kNoSameBunchPileUp, collisionSelectionNames.at(kNoSameBunchPileUp), config.noSameBunchPileup.value); @@ -371,9 +377,6 @@ class CollisionSelection : public baseselection::BaseSelection(mQvecHarmonic); int index = static_cast(mQvecHarmonic) - 2; // get index in the qvector vector - if (index >= 2) { - LOG(fatal) << "At the moment harmonics up to 3 are supported!"; - } switch (mQvecDetector) { case modes::QvecDetector::kFT0C: mEventPlane = RecoDecay::constrainAngle((std::atan2(col.qvecFT0CImVec()[index], col.qvecFT0CReVec()[index])) / harmonic, 0, harmonic); // constrain between 0 and 2pi/harmonic diff --git a/PWGCF/Femto/Core/modes.h b/PWGCF/Femto/Core/modes.h index add9098618a..5f41ff42788 100644 --- a/PWGCF/Femto/Core/modes.h +++ b/PWGCF/Femto/Core/modes.h @@ -180,12 +180,14 @@ enum class CharmHadron : o2::analysis::femto::datatypes::CharmHadronType { enum class QvecDetector : o2::analysis::femto::datatypes::QvecDetectorType { kFT0C = 0, - kFT0A = 1 + kFT0A = 1, + kQvecDetectorLast = 2 }; enum class QvecHarmonic : o2::analysis::femto::datatypes::QvecHarmonicType { kN2 = 2, - kN3 = 3 + kN3 = 3, + kQvecHarmonicLast = 4 }; }; // namespace o2::analysis::femto::modes From bb1e814c94e0efa85f5b332b0b378a43907cfa0b Mon Sep 17 00:00:00 2001 From: Anton Riedel Date: Mon, 10 Aug 2026 13:40:24 +0200 Subject: [PATCH 4/4] Feat: fix code-check errors --- PWGCF/Femto/Core/collisionBuilder.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/PWGCF/Femto/Core/collisionBuilder.h b/PWGCF/Femto/Core/collisionBuilder.h index 1e1bdcc3a1b..ab8d5e311d6 100644 --- a/PWGCF/Femto/Core/collisionBuilder.h +++ b/PWGCF/Femto/Core/collisionBuilder.h @@ -368,6 +368,12 @@ class CollisionSelection : public baseselection::BaseSelection