@@ -273,9 +273,25 @@ struct ResonanceModuleInitializer {
273273 }
274274 LOGF (info, " Stored collision multiplicity estimator: %d" , EventConfig.cfgMultiplicityEstimator .value );
275275
276+ const int enabledGenProcesses = static_cast <int >(doprocessMCgen) +
277+ static_cast <int >(doprocessMCgenFT0M) +
278+ static_cast <int >(doprocessMCgenFT0C) +
279+ static_cast <int >(doprocessMCgenFV0A) +
280+ static_cast <int >(doprocessMCgenNoCent);
281+ const bool anyGenProcess = enabledGenProcesses > 0 ;
282+ if (enabledGenProcesses > 1 ) {
283+ LOGF (fatal, " Enable only one generator process: processMCgen, processMCgenFT0M, processMCgenFT0C, processMCgenFV0A, or processMCgenNoCent" );
284+ }
285+ if (doprocessMCgenNoCent && GenCuts.cfgGenMultPercentile ) {
286+ LOGF (fatal, " processMCgenNoCent requires cfgGenMultPercentile=false" );
287+ }
288+ if ((doprocessMCgenFT0M || doprocessMCgenFT0C || doprocessMCgenFV0A) && !GenCuts.cfgGenMultPercentile ) {
289+ LOGF (fatal, " The estimator-specific generator processes require cfgGenMultPercentile=true; use processMCgenNoCent otherwise" );
290+ }
291+
276292 // Run 2 and Run 3 callbacks require different event-selection semantics.
277293 const bool anyRun2Process = doprocessRun2 || doprocessRun2MC;
278- const bool anyRun3Process = doprocessRun3 || doprocessRun3MC || doprocessMCgen ;
294+ const bool anyRun3Process = doprocessRun3 || doprocessRun3MC || anyGenProcess ;
279295 if (anyRun2Process && anyRun3Process) {
280296 LOG (fatal) << " Run 2 and Run 3 processes cannot be enabled in the same ResonanceModuleInitializer" ;
281297 }
@@ -290,13 +306,13 @@ struct ResonanceModuleInitializer {
290306 static_cast <int >(GenCuts.cfgGenMultFT0M .value ) +
291307 static_cast <int >(GenCuts.cfgGenMultFT0C .value ) +
292308 static_cast <int >(GenCuts.cfgGenMultFV0A .value );
293- if ((doprocessMCgen || doprocessRun2MC || doprocessRun3MC) && enabledGenMultiplicityEstimators > 1 ) {
309+ if ((anyGenProcess || doprocessRun2MC || doprocessRun3MC) && enabledGenMultiplicityEstimators > 1 ) {
294310 LOG (fatal) << " Only one generator multiplicity estimator can be enabled: cfgGenMult05, cfgGenMult10, cfgGenMultFT0M, cfgGenMultFT0C, or cfgGenMultFV0A" ;
295311 }
296- if (doprocessMCgen ) {
297- if (GenCuts.cfgGenMultPercentile && multEstimator != CentralityFT0M &&
312+ if (anyGenProcess ) {
313+ if (doprocessMCgen && GenCuts.cfgGenMultPercentile && multEstimator != CentralityFT0M &&
298314 multEstimator != CentralityFT0C && multEstimator != CentralityFV0A) {
299- LOGF (fatal, " cfgGenMultPercentile supports cfgMultName=FT0M, FT0C, or FV0A" );
315+ LOGF (fatal, " processMCgen with cfgGenMultPercentile supports cfgMultName=FT0M, FT0C, or FV0A" );
300316 }
301317 if (GenCuts.isZvtxcutGen &&
302318 (!std::isfinite (GenCuts.cutzvertexGen .value ) || GenCuts.cutzvertexGen .value <= 0 .f )) {
@@ -362,7 +378,7 @@ struct ResonanceModuleInitializer {
362378 ccdb->setCreatedNotAfter (now); // TODO must become global parameter from the train creation time
363379 }
364380
365- if (doprocessMCgen ) {
381+ if (anyGenProcess ) {
366382 constexpr std::array<char const *, 5 > MCEventLabels{" All" , " z vertex" , " BC RCT" , " INEL" , " INEL>0" };
367383 AxisSpec centAxisGen = {GenCuts.binsCentGen , " Centrality (%)" };
368384 AxisSpec eventTypeAxis = {2 , 0 .f , 2 .f , " Event type" };
@@ -533,7 +549,14 @@ struct ResonanceModuleInitializer {
533549 fillDetailedCollisionQA (collision, o2::analysis::CollisonCuts::kAllpassed );
534550 }
535551
552+ // Keep the original input for existing processMCgen configurations. The
553+ // dedicated callbacks select the MC percentile independently of cfgMultName
554+ // (reconstructed centrality) and cfgGenMult* (generator multiplicity).
536555 using GenMCCollisions = soa::Join<aod::McCollisions, aod::McCentFT0Ms, aod::McCentFT0Cs, aod::McCentFV0As, aod::MultsExtraMC>;
556+ using GenMCCollisionsFT0M = soa::Join<aod::McCollisions, aod::McCentFT0Ms, aod::MultsExtraMC>;
557+ using GenMCCollisionsFT0C = soa::Join<aod::McCollisions, aod::McCentFT0Cs, aod::MultsExtraMC>;
558+ using GenMCCollisionsFV0A = soa::Join<aod::McCollisions, aod::McCentFV0As, aod::MultsExtraMC>;
559+ using GenMCCollisionsNoCent = soa::Join<aod::McCollisions, aod::MultsExtraMC>;
537560 using Run3MCCollisions = soa::Join<aod::McCollisions, aod::MultsExtraMC>;
538561 using Run2MCCollisions = soa::Join<aod::McCollisions, aod::MultsExtraMC>;
539562 using GenRecoCollisions = soa::Join<aod::ResoCollisionCandidates, aod::MultsExtra, aod::PVMults, aod::McCollisionLabels>;
@@ -846,19 +869,19 @@ struct ResonanceModuleInitializer {
846869 * reduced AOD tables. RCT quality is evaluated through the generator
847870 * collision's associated BC because it is a run-condition property.
848871 */
849- void processMCgen (GenMCCollisions::iterator const & mcCollision,
850- aod::McParticles const & mcParticles,
851- soa::SmallGroups<GenRecoCollisions> const & collisions,
852- BCsWithRCT const &)
872+ template <typename MCCollision>
873+ void processMCgenQA (MCCollision const & mcCollision,
874+ aod::McParticles const & mcParticles,
875+ soa::SmallGroups<GenRecoCollisions> const & collisions,
876+ float generatorCentrality)
853877 {
854- auto bc = mcCollision.bc_as <BCsWithRCT>();
878+ auto bc = mcCollision.template bc_as <BCsWithRCT>();
855879 initCCDB (bc);
856880
857881 const auto getReconstructedCentrality = [&](auto const & collision) {
858882 return centEst (collision);
859883 };
860884
861- const float generatorCentrality = getMCCentrality (mcCollision);
862885 const float impactParameter = mcCollision.impactParameter ();
863886 const float multiplicity = getMCMultiplicity (mcCollision);
864887
@@ -910,7 +933,51 @@ struct ResonanceModuleInitializer {
910933 qaRegistry.fill (HIST (" EventGen/h4MultCent_recMC" ), eventType, reconstructedCentrality, multiplicity, impactParameter);
911934 }
912935 }
913- PROCESS_SWITCH (ResonanceModuleInitializer, processMCgen, " Process generator-level MC QA" , false );
936+
937+ void processMCgen (GenMCCollisions::iterator const & mcCollision,
938+ aod::McParticles const & mcParticles,
939+ soa::SmallGroups<GenRecoCollisions> const & collisions,
940+ BCsWithRCT const &)
941+ {
942+ processMCgenQA (mcCollision, mcParticles, collisions, getMCCentrality (mcCollision));
943+ }
944+ PROCESS_SWITCH (ResonanceModuleInitializer, processMCgen, " Process generator-level MC QA with all MC percentile inputs (legacy)" , false );
945+
946+ void processMCgenFT0M (GenMCCollisionsFT0M::iterator const & mcCollision,
947+ aod::McParticles const & mcParticles,
948+ soa::SmallGroups<GenRecoCollisions> const & collisions,
949+ BCsWithRCT const &)
950+ {
951+ processMCgenQA (mcCollision, mcParticles, collisions, mcCollision.centFT0M ());
952+ }
953+ PROCESS_SWITCH (ResonanceModuleInitializer, processMCgenFT0M, " Process generator-level MC QA with only the FT0M MC percentile input" , false );
954+
955+ void processMCgenFT0C (GenMCCollisionsFT0C::iterator const & mcCollision,
956+ aod::McParticles const & mcParticles,
957+ soa::SmallGroups<GenRecoCollisions> const & collisions,
958+ BCsWithRCT const &)
959+ {
960+ processMCgenQA (mcCollision, mcParticles, collisions, mcCollision.centFT0C ());
961+ }
962+ PROCESS_SWITCH (ResonanceModuleInitializer, processMCgenFT0C, " Process generator-level MC QA with only the FT0C MC percentile input" , false );
963+
964+ void processMCgenFV0A (GenMCCollisionsFV0A::iterator const & mcCollision,
965+ aod::McParticles const & mcParticles,
966+ soa::SmallGroups<GenRecoCollisions> const & collisions,
967+ BCsWithRCT const &)
968+ {
969+ processMCgenQA (mcCollision, mcParticles, collisions, mcCollision.centFV0A ());
970+ }
971+ PROCESS_SWITCH (ResonanceModuleInitializer, processMCgenFV0A, " Process generator-level MC QA with only the FV0A MC percentile input" , false );
972+
973+ void processMCgenNoCent (GenMCCollisionsNoCent::iterator const & mcCollision,
974+ aod::McParticles const & mcParticles,
975+ soa::SmallGroups<GenRecoCollisions> const & collisions,
976+ BCsWithRCT const &)
977+ {
978+ processMCgenQA (mcCollision, mcParticles, collisions, 100 .5f );
979+ }
980+ PROCESS_SWITCH (ResonanceModuleInitializer, processMCgenNoCent, " Process generator-level MC QA using reconstructed centrality without MC percentile inputs" , false );
914981
915982 /* *
916983 * @brief Processes Run3 MC data
0 commit comments