Skip to content

Commit de83e7e

Browse files
committed
PWGLF: split resonance generator MC centrality inputs
Add FT0M, FT0C, FV0A and no-MC-percentile generator processes so each configuration requests only the MC centrality tables it needs. Keep the legacy all-estimator process for existing configurations and share QA logic. Allow the dedicated MC percentile choice, reconstructed centrality and raw generator multiplicity to be selected independently for estimator correlations. Keep generator mode and raw-multiplicity single-selection validation.
1 parent 915acae commit de83e7e

1 file changed

Lines changed: 80 additions & 13 deletions

File tree

‎PWGLF/TableProducer/Resonances/resonanceModuleInitializer.cxx‎

Lines changed: 80 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)