From e6387b2ddd593427f5da6e2948064a1067cb1c77 Mon Sep 17 00:00:00 2001 From: gbencedi Date: Wed, 26 Aug 2026 21:43:30 +0200 Subject: [PATCH] Add FT0C estimator + replace midrapidity MC gen estimator --- .../GlobalEventProperties/flattenictyPikp.cxx | 120 ++++++++++++------ 1 file changed, 80 insertions(+), 40 deletions(-) diff --git a/PWGLF/Tasks/GlobalEventProperties/flattenictyPikp.cxx b/PWGLF/Tasks/GlobalEventProperties/flattenictyPikp.cxx index c81c941d864..8d897e6eae7 100644 --- a/PWGLF/Tasks/GlobalEventProperties/flattenictyPikp.cxx +++ b/PWGLF/Tasks/GlobalEventProperties/flattenictyPikp.cxx @@ -88,7 +88,6 @@ auto static constexpr CminCharge = 3.f; static constexpr int CnullInt = 0; static constexpr float Cnull = 0.0f; static constexpr int ConeInt = 1; -static constexpr int CtwoInt = 2; static constexpr float Cone = 1.0f; // FV0 specific constants @@ -221,10 +220,20 @@ enum EvtSel { struct MultE { static constexpr int CnoMult = 0; - static constexpr int CmultFT0M = 1; - static constexpr int CmultTPC = 2; + static constexpr int CmultFT0C = 1; + static constexpr int CmultFT0M = 2; + static constexpr int CmultTPC = 3; }; - +/* +template +concept hasFT0C = requires(C::iterator const& c) { + c.centFT0C(); +}; +template +concept hasFT0M = requires(C::iterator const& c) { + c.centFT0M(); +}; +*/ struct FlattenictyPikp { HistogramRegistry registryData{"registryData", {}, OutputObjHandlingPolicy::AnalysisObject, true, true}; @@ -241,7 +250,7 @@ struct FlattenictyPikp { o2::parameters::GRPMagField* grpmag = nullptr; struct : ConfigurableGroup { - Configurable multEst{"multEst", 1, "0: without multiplicity; 1: MultFT0M; 2: MultTPC"}; + Configurable multEst{"multEst", 1, "0: without multiplicity; 1: MultFT0C; 2: MultFT0M; 3: MultTPC"}; Configurable applyCalibGainFromCCDB{"applyCalibGainFromCCDB", false, "equalize detector amplitudes"}; Configurable applyCalibVtxFromCCDB{"applyCalibVtxFromCCDB", false, "equalize Amp vs vtx"}; Configurable applyCalibDeDx{"applyCalibDeDx", false, "calibration of dedx signal"}; @@ -283,13 +292,14 @@ struct FlattenictyPikp { Configurable cutVtxZ{"cutVtxZ", 10.0f, "Accepted z-vertex range"}; Configurable zVtxCutMC{"zVtxCutMC", true, "use Zvtx cut in MC"}; Configurable useINELCutMC{"useINELCutMC", true, "use INEL>0 cut in MC"}; - Configurable removeNoSameBunchPileup{"removeNoSameBunchPileup", true, "Reject collisions in case of pileup with another collision in the same foundBC"}; - Configurable requireIsGoodZvtxFT0vsPV{"requireIsGoodZvtxFT0vsPV", true, "Small difference between z-vertex from PV and from FT0"}; + Configurable removeNoSameBunchPileup{"removeNoSameBunchPileup", false, "Reject collisions in case of pileup with another collision in the same foundBC"}; + Configurable requireIsGoodZvtxFT0vsPV{"requireIsGoodZvtxFT0vsPV", false, "Small difference between z-vertex from PV and from FT0"}; Configurable requireIsVertexITSTPC{"requireIsVertexITSTPC", false, "At least one ITS-TPC track (reject vertices built from ITS-only tracks)"}; Configurable requirekIsVertexTOFmatched{"requirekIsVertexTOFmatched", false, "Require kIsVertexTOFmatched: at least one of vertex contributors is matched to TOF"}; Configurable useMultMCmidrap{"useMultMCmidrap", true, "use generated Nch in ∣eta∣ < 0.8"}; Configurable useInelgt0wTVX{"useInelgt0wTVX", true, "Use INEL > 0 condition with TVX trigger, i.e. FT0A and FT0C acceptance"}; Configurable removeSplitVertex{"removeSplitVertex", true, "Remove split vertices"}; + // Configurable customGenCent{"customGenCent", false, "Use custom generated MC centrality estimation"}; } evtSelOpt; struct : ConfigurableGroup { @@ -484,8 +494,9 @@ struct FlattenictyPikp { using MyCollisions = soa::Join; using Colls = soa::Join; using CollsGen = soa::Join; - using MCColls = soa::Join; - using CollsMCExtraMult = soa::Join; + using MCColls = soa::Join; + using CollsMCExtraMult = soa::Join; + // using CollsMCExtraMultPercentile = soa::Join; using CollsGenSgn = soa::SmallGroups>; using MyPIDTracks = soa::Join; using MyLabeledTracks = soa::Join; @@ -591,9 +602,12 @@ struct FlattenictyPikp { AxisSpec multAxis{binOpt.axisMultPerc, "multiplicity estimator"}; - switch (defOpt.multEst) { + switch (defOpt.multEst.value) { case MultE::CnoMult: break; + case MultE::CmultFT0C: + multAxis.name = "multFT0C"; + break; case MultE::CmultFT0M: multAxis.name = "multFT0M"; break; @@ -601,7 +615,7 @@ struct FlattenictyPikp { multAxis.name = "multTPC"; break; default: - LOG(fatal) << "No valid option for mult estimator " << defOpt.multEst; + LOGF(fatal, "No valid option for mult estimator %d", defOpt.multEst.value); } if (trkSelOpt.rejectTrkAtTPCSector || v0SelOpt.rejectV0sAtTPCSector) { @@ -791,6 +805,8 @@ struct FlattenictyPikp { registryMC.get(HIST("Events/hEvtMcGen"))->GetXaxis()->SetBinLabel(3, "INELgt0"); registryMC.get(HIST("Events/hEvtMcGen"))->GetXaxis()->SetBinLabel(4, "INELgt0TVX"); // + registryMC.add("Events/hNchGen", "Gen Nch; Gen Nch (|#eta|<0.8)", {kTH1F, {nChAxis}}); + registryMC.add("Events/hNchGenCent", "Gen cent; mult", {kTH1F, {multAxis}}); registryMC.add("Events/hNchGenVsCent", "Gen Nch vs Cent; mult; Gen Nch (|#eta|<0.8)", {kTH2F, {nChAxis, multAxis}}); registryMC.add("Events/hVtxZRec", "MC Rec vertex z position", kTH1F, {vtxzAxis}); registryMC.add("Events/hVtxZGen", "Generated vertex z position", kTH1F, {vtxzAxis}); @@ -1337,25 +1353,6 @@ struct FlattenictyPikp { return std::abs(charge) >= CminCharge; } - template - int countPart(P const& particles) - { - auto nCharged = 0; - for (auto const& particle : particles) { - if (!isChrgParticle(particle.pdgCode())) { - continue; - } - if (!particle.isPhysicalPrimary()) { - continue; - } - if (std::abs(particle.eta()) > trkSelOpt.trkEtaMax) { - continue; - } - nCharged++; - } - return nCharged; - } - template bool isInelGt0wTVX(P const& particles) { @@ -1933,13 +1930,36 @@ struct FlattenictyPikp { return iRing; } + template + float getGenCent(C const& collision) + { + float val = -999.0; + switch (defOpt.multEst.value) { + case MultE::CnoMult: + return val; + case MultE::CmultFT0C: + return collision.centFT0C(); + case MultE::CmultFT0M: + return collision.centFT0M(); + default: + LOGF(fatal, "No valid centrality estimator: %s", defOpt.multEst.value); + return val; + } + } + template float getMult(C const& collision) { float val = -999.0; - switch (defOpt.multEst) { + switch (defOpt.multEst.value) { case MultE::CnoMult: return val; + case MultE::CmultFT0C: + if constexpr (!isMC) { + return collision.centFT0C(); + } else { + return collision.multMCFT0C(); + } break; case MultE::CmultFT0M: if constexpr (!isMC) { @@ -1952,13 +1972,12 @@ struct FlattenictyPikp { if constexpr (!isMC) { return collision.multTPC(); } else { - LOG(fatal) << "No valid multiplicity estimator: " << defOpt.multEst; - return val; + return collision.multMCNParticlesEta08(); } break; default: - return collision.centFT0M(); - break; + LOGF(fatal, "No valid multiplicity estimator: %s", defOpt.multEst.value); + return val; } } @@ -2400,11 +2419,32 @@ struct FlattenictyPikp { { LOGP(debug, "MC col {} has {} reco cols", mcCollision.globalIndex(), collisions.size()); auto multMC = -1.; - if (evtSelOpt.useMultMCmidrap || defOpt.multEst == CtwoInt) { // use generated Nch in ∣eta∣ < 0.8 - multMC = countPart(particles); + if (evtSelOpt.useMultMCmidrap) { + multMC = mcCollision.multMCNParticlesEta08(); } else { - multMC = getMultMC(mcCollision); // using McCentFT0Ms - } + multMC = getMultMC(mcCollision); + } + /* + cauto centMcGen = -1.; + if (evtSelOpt.customGenCent) { + if constexpr (hasFT0C) { + centMcGen = mcCollision.mcpercft0c(); + } else if (hasFT0M) { + centMcGen = mcCollision.mcpercft0m(); + } + } else { + if (defOpt.multEst == MultE::CmultFT0C) { + centMcGen = mcCollision.centFT0C(); + } else if (defOpt.multEst == MultE::CmultFT0M) { + centMcGen = mcCollision.centFT0M(); + } else { + centMcGen = -1.; + } + } + */ + registryMC.fill(HIST("Events/hNchGen"), multMC); + registryMC.fill(HIST("Events/hNchGenCent"), getGenCent(mcCollision)); + const float flatMC = fillFlatMC(particles); registryMC.fill(HIST("Events/hFlatMCGen"), flatMC); @@ -2444,7 +2484,7 @@ struct FlattenictyPikp { fillMCGenRecEvt(particle, multMC, flatMC); }); } - if (!isGoodEvent(collision)) { + if (!isGoodEvent(collision)) { continue; } const float multRecGt1 = getMult(collision);