@@ -548,9 +548,43 @@ struct MultiplicitySelector {
548548 PROCESS_SWITCH (MultiplicitySelector, processMCGen, " Select MC particle count as multiplicity" , false );
549549};
550550
551+ struct MultiplicitySetBuilder {
552+ Produces<aod::CFMultiplicitySets> output;
553+ std::vector<float > multiplicities{};
554+
555+ enum MultiplicityEstimators : uint8_t {
556+ kCentFT0C = BIT (0 ),
557+ kMultFV0A = BIT (1 ),
558+ kMultNTracksPV = BIT (2 ),
559+ kMultNTracksGlobal = BIT (3 ),
560+ };
561+
562+ O2_DEFINE_CONFIGURABLE (cfgEstimatorBitMask, uint16_t , 0 , " BitMask for multiplicity estimators to be included in the CFMultiplicitySet tables." );
563+
564+ using CollisionWithCents = soa::Join<aod::Collisions, aod::CentFT0Cs, aod::PVMults, aod::FV0Mults, aod::MultsGlobal>;
565+ void processEstimators ([[maybe_unused]] CollisionWithCents const & cents, aod::CFCollRefs const & cfcollisions)
566+ {
567+ for (const auto & cfcollision : cfcollisions) {
568+ const auto & collision = cfcollision.collision_as <CollisionWithCents>();
569+ multiplicities.clear ();
570+ if (cfgEstimatorBitMask & kCentFT0C )
571+ multiplicities.push_back (collision.centFT0C ());
572+ if (cfgEstimatorBitMask & kMultFV0A )
573+ multiplicities.push_back (collision.multFV0A ());
574+ if (cfgEstimatorBitMask & kMultNTracksPV )
575+ multiplicities.push_back (collision.multNTracksPV ());
576+ if (cfgEstimatorBitMask & kMultNTracksGlobal )
577+ multiplicities.push_back (collision.multNTracksGlobal ());
578+ output (multiplicities);
579+ }
580+ }
581+ PROCESS_SWITCH (MultiplicitySetBuilder, processEstimators, " Process auxiliary multiplicity/centrality estimators" , false );
582+ };
583+
551584WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
552585{
553586 return WorkflowSpec{
554587 adaptAnalysisTask<FilterCF>(cfgc),
555- adaptAnalysisTask<MultiplicitySelector>(cfgc)};
588+ adaptAnalysisTask<MultiplicitySelector>(cfgc),
589+ adaptAnalysisTask<MultiplicitySetBuilder>(cfgc)};
556590}
0 commit comments