From 5d78278daa87cba9d0c79b7ac7c484c7a0c16053 Mon Sep 17 00:00:00 2001 From: jparkkil Date: Mon, 4 Aug 2025 19:29:43 +0200 Subject: [PATCH 1/2] Add CFMultiplicitySet to support multiple auxilary multiplicities/centralities --- PWGCF/DataModel/CorrelationsDerived.h | 9 ++++++ PWGCF/TableProducer/filterCorrelations.cxx | 36 +++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/PWGCF/DataModel/CorrelationsDerived.h b/PWGCF/DataModel/CorrelationsDerived.h index 62bcf8716bc..59db2ee6f2c 100644 --- a/PWGCF/DataModel/CorrelationsDerived.h +++ b/PWGCF/DataModel/CorrelationsDerived.h @@ -86,6 +86,15 @@ using CFTrackWithLabel = CFTracksWithLabel::iterator; //------transient CF-filter to CF-2prong-filter DECLARE_SOA_TABLE(CFCollRefs, "AOD", "CFCOLLREF", o2::soa::Index<>, track::CollisionId); //! Transient cf collision index table +//------multiplicity set +namespace cfmultiplicityset +{ +DECLARE_SOA_COLUMN(Multiplicities, multiplicities, std::vector); //! List of auxiliary multiplicities +} +DECLARE_SOA_TABLE(CFMultiplicitySets, "AOD", "CFMULTSET", cfmultiplicityset::Multiplicities); //! Auxilary multiplicity set table + +using CFMultiplicitySet = CFMultiplicitySets::iterator; + // Reco using CFCollRef = CFCollRefs::iterator; diff --git a/PWGCF/TableProducer/filterCorrelations.cxx b/PWGCF/TableProducer/filterCorrelations.cxx index 95fd3ae951f..46f6b90dd1b 100644 --- a/PWGCF/TableProducer/filterCorrelations.cxx +++ b/PWGCF/TableProducer/filterCorrelations.cxx @@ -548,9 +548,43 @@ struct MultiplicitySelector { PROCESS_SWITCH(MultiplicitySelector, processMCGen, "Select MC particle count as multiplicity", false); }; +struct MultiplicitySetBuilder { + Produces output; + std::vector multiplicities{}; + + enum MultiplicityEstimators : uint8_t { + kCentFT0C = BIT(0), + kMultFV0A = BIT(1), + kMultNTracksPV = BIT(2), + kMultNTracksGlobal = BIT(3), + }; + + O2_DEFINE_CONFIGURABLE(cfgEstimatorBitMask, uint16_t, 0, "BitMask for multiplicity estimators to be included in the CFMultiplicitySet tables."); + + using CollisionWithCents = soa::Join; + void processEstimators([[maybe_unused]] CollisionWithCents const& cents, aod::CFCollRefs const& cfcollisions) + { + for (const auto& cfcollision : cfcollisions) { + const auto& collision = cfcollision.collision_as(); + multiplicities.clear(); + if (cfgEstimatorBitMask & kCentFT0C) + multiplicities.push_back(collision.centFT0C()); + if (cfgEstimatorBitMask & kMultFV0A) + multiplicities.push_back(collision.multFV0A()); + if (cfgEstimatorBitMask & kMultNTracksPV) + multiplicities.push_back(collision.multNTracksPV()); + if (cfgEstimatorBitMask & kMultNTracksGlobal) + multiplicities.push_back(collision.multNTracksGlobal()); + output(multiplicities); + } + } + PROCESS_SWITCH(MultiplicitySetBuilder, processEstimators, "Process auxiliary multiplicity/centrality estimators", false); +}; + WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc), + adaptAnalysisTask(cfgc)}; } From 77738749465497a4e53176b57e5456685b372c79 Mon Sep 17 00:00:00 2001 From: jparkkil Date: Tue, 5 Aug 2025 13:11:46 +0200 Subject: [PATCH 2/2] Multiplicity set output from FilterCF --- PWGCF/DataModel/CorrelationsDerived.h | 2 +- PWGCF/TableProducer/filterCorrelations.cxx | 69 +++++++++++----------- 2 files changed, 35 insertions(+), 36 deletions(-) diff --git a/PWGCF/DataModel/CorrelationsDerived.h b/PWGCF/DataModel/CorrelationsDerived.h index 59db2ee6f2c..df44dde6d33 100644 --- a/PWGCF/DataModel/CorrelationsDerived.h +++ b/PWGCF/DataModel/CorrelationsDerived.h @@ -91,7 +91,7 @@ namespace cfmultiplicityset { DECLARE_SOA_COLUMN(Multiplicities, multiplicities, std::vector); //! List of auxiliary multiplicities } -DECLARE_SOA_TABLE(CFMultiplicitySets, "AOD", "CFMULTSET", cfmultiplicityset::Multiplicities); //! Auxilary multiplicity set table +DECLARE_SOA_TABLE(CFMultiplicitySets, "AOD", "CFMULTIPLICITYSET", cfmultiplicityset::Multiplicities); //! Auxilary multiplicity set table using CFMultiplicitySet = CFMultiplicitySets::iterator; diff --git a/PWGCF/TableProducer/filterCorrelations.cxx b/PWGCF/TableProducer/filterCorrelations.cxx index 46f6b90dd1b..ff499bc4178 100644 --- a/PWGCF/TableProducer/filterCorrelations.cxx +++ b/PWGCF/TableProducer/filterCorrelations.cxx @@ -64,6 +64,13 @@ struct FilterCF { kPIDProton = BIT(1) }; + enum MultiplicityEstimators : uint8_t { + kCentFT0C = BIT(0), + kMultFV0A = BIT(1), + kMultNTracksPV = BIT(2), + kMultNTracksGlobal = BIT(3), + }; + // Configuration O2_DEFINE_CONFIGURABLE(cfgCutVertex, float, 7.0f, "Accepted z-vertex range") O2_DEFINE_CONFIGURABLE(cfgCutPt, float, 0.5f, "Minimal pT for tracks") @@ -90,6 +97,7 @@ struct FilterCF { O2_DEFINE_CONFIGURABLE(tpcnclusters, int, 50, "minimum number of TPC clusters found") O2_DEFINE_CONFIGURABLE(chi2pertpccluster, float, 2.5, "maximum Chi2 / cluster for the TPC track segment") O2_DEFINE_CONFIGURABLE(chi2peritscluster, float, 36, "maximum Chi2 / cluster for the ITS track segment") + O2_DEFINE_CONFIGURABLE(cfgEstimatorBitMask, uint16_t, 0, "BitMask for multiplicity estimators to be included in the CFMultiplicitySet tables."); // Filters and input definitions Filter collisionZVtxFilter = nabs(aod::collision::posZ) < cfgCutVertex; @@ -117,6 +125,9 @@ struct FilterCF { Produces outputTrackRefs; Produces outputMcParticleRefs; + Produces outputMultSets; + std::vector multiplicities{}; + // persistent caches std::vector mcReconstructedCache; std::vector mcParticleLabelsCache; @@ -238,6 +249,9 @@ struct FilterCF { return 0; } + template + using HasMultTables = decltype(std::declval().multNTracksPV()); + /// \brief Templetized process data for a given collision and its associated tracks /// \param collision The collision object containing information about the collision /// \param tracks The collection of tracks associated with the collision @@ -255,6 +269,19 @@ struct FilterCF { auto bc = collision.template bc_as(); outputCollisions(bc.runNumber(), collision.posZ(), collision.multiplicity(), bc.timestamp()); + if constexpr (std::experimental::is_detected::value) { + multiplicities.clear(); + if (cfgEstimatorBitMask & kCentFT0C) + multiplicities.push_back(collision.centFT0C()); + if (cfgEstimatorBitMask & kMultFV0A) + multiplicities.push_back(collision.multFV0A()); + if (cfgEstimatorBitMask & kMultNTracksPV) + multiplicities.push_back(collision.multNTracksPV()); + if (cfgEstimatorBitMask & kMultNTracksGlobal) + multiplicities.push_back(collision.multNTracksGlobal()); + outputMultSets(multiplicities); + } + if (cfgTransientTables) outputCollRefs(collision.globalIndex()); for (auto& track : tracks) { @@ -283,6 +310,12 @@ struct FilterCF { } PROCESS_SWITCH(FilterCF, processDataPid, "Process data with PID", false); + void processDataMults(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, soa::Filtered> const& tracks) + { + processDataT(collision, tracks); + } + PROCESS_SWITCH(FilterCF, processDataMults, "Process data with multiplicity sets", false); + /// \brief Process MC data for a given set of MC collisions and associated particles and tracks /// \param mcCollisions The collection of MC collisions /// \param allParticles The collection of all MC particles @@ -548,43 +581,9 @@ struct MultiplicitySelector { PROCESS_SWITCH(MultiplicitySelector, processMCGen, "Select MC particle count as multiplicity", false); }; -struct MultiplicitySetBuilder { - Produces output; - std::vector multiplicities{}; - - enum MultiplicityEstimators : uint8_t { - kCentFT0C = BIT(0), - kMultFV0A = BIT(1), - kMultNTracksPV = BIT(2), - kMultNTracksGlobal = BIT(3), - }; - - O2_DEFINE_CONFIGURABLE(cfgEstimatorBitMask, uint16_t, 0, "BitMask for multiplicity estimators to be included in the CFMultiplicitySet tables."); - - using CollisionWithCents = soa::Join; - void processEstimators([[maybe_unused]] CollisionWithCents const& cents, aod::CFCollRefs const& cfcollisions) - { - for (const auto& cfcollision : cfcollisions) { - const auto& collision = cfcollision.collision_as(); - multiplicities.clear(); - if (cfgEstimatorBitMask & kCentFT0C) - multiplicities.push_back(collision.centFT0C()); - if (cfgEstimatorBitMask & kMultFV0A) - multiplicities.push_back(collision.multFV0A()); - if (cfgEstimatorBitMask & kMultNTracksPV) - multiplicities.push_back(collision.multNTracksPV()); - if (cfgEstimatorBitMask & kMultNTracksGlobal) - multiplicities.push_back(collision.multNTracksGlobal()); - output(multiplicities); - } - } - PROCESS_SWITCH(MultiplicitySetBuilder, processEstimators, "Process auxiliary multiplicity/centrality estimators", false); -}; - WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) { return WorkflowSpec{ adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc), - adaptAnalysisTask(cfgc)}; + adaptAnalysisTask(cfgc)}; }