@@ -64,6 +64,13 @@ struct FilterCF {
6464 kPIDProton = BIT (1 )
6565 };
6666
67+ enum MultiplicityEstimators : uint8_t {
68+ kCentFT0C = BIT (0 ),
69+ kMultFV0A = BIT (1 ),
70+ kMultNTracksPV = BIT (2 ),
71+ kMultNTracksGlobal = BIT (3 ),
72+ };
73+
6774 // Configuration
6875 O2_DEFINE_CONFIGURABLE (cfgCutVertex, float , 7 .0f , " Accepted z-vertex range" )
6976 O2_DEFINE_CONFIGURABLE (cfgCutPt, float , 0 .5f , " Minimal pT for tracks" )
@@ -90,6 +97,7 @@ struct FilterCF {
9097 O2_DEFINE_CONFIGURABLE (tpcnclusters, int , 50 , " minimum number of TPC clusters found" )
9198 O2_DEFINE_CONFIGURABLE (chi2pertpccluster, float , 2.5 , " maximum Chi2 / cluster for the TPC track segment" )
9299 O2_DEFINE_CONFIGURABLE (chi2peritscluster, float , 36 , " maximum Chi2 / cluster for the ITS track segment" )
100+ O2_DEFINE_CONFIGURABLE (cfgEstimatorBitMask, uint16_t , 0 , " BitMask for multiplicity estimators to be included in the CFMultiplicitySet tables." );
93101
94102 // Filters and input definitions
95103 Filter collisionZVtxFilter = nabs(aod::collision::posZ) < cfgCutVertex;
@@ -117,6 +125,9 @@ struct FilterCF {
117125 Produces<aod::CFTrackRefs> outputTrackRefs;
118126 Produces<aod::CFMcParticleRefs> outputMcParticleRefs;
119127
128+ Produces<aod::CFMultiplicitySets> outputMultSets;
129+ std::vector<float > multiplicities{};
130+
120131 // persistent caches
121132 std::vector<bool > mcReconstructedCache;
122133 std::vector<int > mcParticleLabelsCache;
@@ -238,6 +249,9 @@ struct FilterCF {
238249 return 0 ;
239250 }
240251
252+ template <class T >
253+ using HasMultTables = decltype (std::declval<T&>().multNTracksPV());
254+
241255 // / \brief Templetized process data for a given collision and its associated tracks
242256 // / \param collision The collision object containing information about the collision
243257 // / \param tracks The collection of tracks associated with the collision
@@ -255,6 +269,19 @@ struct FilterCF {
255269 auto bc = collision.template bc_as <aod::BCsWithTimestamps>();
256270 outputCollisions (bc.runNumber (), collision.posZ (), collision.multiplicity (), bc.timestamp ());
257271
272+ if constexpr (std::experimental::is_detected<HasMultTables, typename T1::iterator>::value) {
273+ multiplicities.clear ();
274+ if (cfgEstimatorBitMask & kCentFT0C )
275+ multiplicities.push_back (collision.centFT0C ());
276+ if (cfgEstimatorBitMask & kMultFV0A )
277+ multiplicities.push_back (collision.multFV0A ());
278+ if (cfgEstimatorBitMask & kMultNTracksPV )
279+ multiplicities.push_back (collision.multNTracksPV ());
280+ if (cfgEstimatorBitMask & kMultNTracksGlobal )
281+ multiplicities.push_back (collision.multNTracksGlobal ());
282+ outputMultSets (multiplicities);
283+ }
284+
258285 if (cfgTransientTables)
259286 outputCollRefs (collision.globalIndex ());
260287 for (auto & track : tracks) {
@@ -283,6 +310,12 @@ struct FilterCF {
283310 }
284311 PROCESS_SWITCH (FilterCF, processDataPid, " Process data with PID" , false );
285312
313+ void processDataMults (soa::Filtered<soa::Join<aod::Collisions, aod::EvSels, aod::CFMultiplicities, aod::CentFT0Cs, aod::PVMults, aod::FV0Mults, aod::MultsGlobal>>::iterator const & collision, aod::BCsWithTimestamps const &, soa::Filtered<soa::Join<aod::Tracks, aod::TracksExtra, aod::TrackSelection, aod::TracksDCA>> const & tracks)
314+ {
315+ processDataT (collision, tracks);
316+ }
317+ PROCESS_SWITCH (FilterCF, processDataMults, " Process data with multiplicity sets" , false );
318+
286319 // / \brief Process MC data for a given set of MC collisions and associated particles and tracks
287320 // / \param mcCollisions The collection of MC collisions
288321 // / \param allParticles The collection of all MC particles
0 commit comments