From b827f0411b74d6901ca9b8e0c1dff0de2077d541 Mon Sep 17 00:00:00 2001 From: fsii Date: Tue, 15 Sep 2026 16:30:52 +0200 Subject: [PATCH] [PWGCF] Add QA histograms --- PWGCF/EbyEFluctuations/Tasks/partNumFluc.cxx | 294 ++++++++++--------- 1 file changed, 155 insertions(+), 139 deletions(-) diff --git a/PWGCF/EbyEFluctuations/Tasks/partNumFluc.cxx b/PWGCF/EbyEFluctuations/Tasks/partNumFluc.cxx index d459822b071..7226779f377 100644 --- a/PWGCF/EbyEFluctuations/Tasks/partNumFluc.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/partNumFluc.cxx @@ -51,7 +51,6 @@ #include #include -#include #include #include #include @@ -628,7 +627,9 @@ struct ConfigSelection { std::array>, NEs> maxAbsNSigmaPid{}; }; -std::optional encode(const ConfigSelection& configSelection, const bool isPvContributor, const double itsNCls, const double itsChi2NCls, const double tpcNCls, const double tpcChi2NCls, const double tpcNCrossedRows, const double tpcNClsSharedRatio, const std::array>& absNSigmaDca, const double pt, const double eta, const std::int32_t sign, const ParticleSpeciesAll particleSpeciesAll, const double absNSigmaPid) noexcept +template + requires IsValidEnumValue +std::optional encode(const ConfigSelection& configSelection, const bool isPvContributor, const double itsNCls, const double itsChi2NCls, const double tpcNCls, const double tpcChi2NCls, const double tpcNCrossedRows, const double tpcNClsSharedRatio, const std::array>& absNSigmaDca, const double pt, const double eta, const std::int32_t sign, const double absNSigmaPid) noexcept { if (!std::isfinite(pt) || !std::isfinite(eta) || pt < RangePt[toI(RangeEdge::Min)] || RangePt[toI(RangeEdge::Max)] <= pt || eta < RangeEta[toI(RangeEdge::Min)] || RangeEta[toI(RangeEdge::Max)] <= eta) { return std::nullopt; @@ -687,12 +688,12 @@ std::optional encode(const ConfigSelection& configS codeSpan *= NBinsEta; code += (sign > 0 ? toI(ChargeSpecies::Plus) : toI(ChargeSpecies::Minus)) * codeSpan; codeSpan *= NEs; - code += toI(particleSpeciesAll) * codeSpan; + code += toI(ParticleSpeciesAllValue) * codeSpan; codeSpan *= NEs; - if (particleSpeciesAll != ParticleSpeciesAll::All) { + if constexpr (ParticleSpeciesAllValue != ParticleSpeciesAll::All) { // clang-format v20.1.3 // clang-format off - const std::int32_t statePid{GetState.template operator()(absNSigmaPid, configSelection.maxAbsNSigmaPid[toI(getValue(particleSpeciesAll))])}; + const std::int32_t statePid{GetState.template operator()(absNSigmaPid, configSelection.maxAbsNSigmaPid[toI(getValue(ParticleSpeciesAllValue))])}; // clang-format on if (statePid < 0) { return std::nullopt; @@ -707,7 +708,9 @@ namespace mini_mc_particle_codec { static_assert(static_cast(mini_track_codec::NBinsPt) * mini_track_codec::NBinsEta * NEs * NEs <= static_cast(std::numeric_limits::max()) + 1); -std::optional encode(const double pt, const double eta, const std::int32_t sign, const ParticleSpecies particleSpecies) noexcept +template + requires IsValidEnumValue +std::optional encode(const double pt, const double eta, const std::int32_t sign) noexcept { if (!std::isfinite(pt) || !std::isfinite(eta) || pt < mini_track_codec::RangePt[toI(RangeEdge::Min)] || mini_track_codec::RangePt[toI(RangeEdge::Max)] <= pt || eta < mini_track_codec::RangeEta[toI(RangeEdge::Min)] || mini_track_codec::RangeEta[toI(RangeEdge::Max)] <= eta) { return std::nullopt; @@ -729,7 +732,7 @@ std::optional encode(const double pt, const d codeSpan *= mini_track_codec::NBinsEta; code += (sign > 0 ? toI(ChargeSpecies::Plus) : toI(ChargeSpecies::Minus)) * codeSpan; codeSpan *= NEs; - code += toI(particleSpecies) * codeSpan; + code += toI(ParticleSpeciesValue) * codeSpan; return code; } } // namespace mini_mc_particle_codec @@ -919,9 +922,9 @@ struct PartNumFluc { struct : ConfigurableGroup { std::string prefix{"cgCcdb"}; - Configurable cfgCcdbUrl{"cfgCcdbUrl", "http://ccdb-test.cern.ch:8080", "Url of CCDB"}; - Configurable cfgCcdbPath{"cfgCcdbPath", "Users/f/fasi/test", "Path in CCDB"}; - Configurable cfgCcdbTimestampLatest{"cfgCcdbTimestampLatest", std::chrono::time_point_cast(std::chrono::system_clock::now()).time_since_epoch().count(), "Latest timestamp in CCDB"}; + Configurable cfgUrl{"cfgUrl", "http://ccdb-test.cern.ch:8080", "Url of CCDB"}; + Configurable cfgPath{"cfgPath", "Users/f/fasi/test", "Path in CCDB"}; + Configurable cfgTimestampLatest{"cfgTimestampLatest", -1, "Latest timestamp in CCDB"}; } cgCcdb{}; struct : ConfigurableGroup { @@ -948,12 +951,12 @@ struct PartNumFluc { Configurable cfgFlagRejectionRunBadMc{"cfgFlagRejectionRunBadMc", false, "MC bad run rejection flag"}; Configurable cfgLabelFlagsRct{"cfgLabelFlagsRct", "CBT_hadronPID", "RCT flags label"}; Configurable> cfgFlagsRct{"cfgFlagsRct", {std::array{0, 1, 1}.data(), 3, {"ZDC", "Acceptance", "Table"}}, "RCT flags"}; - Configurable cfgBitsSelectionEvent{"cfgBitsSelectionEvent", std::uint64_t{0b00000000000001000000000000000000000000000000000000}, "Event selection bits"}; - Configurable cfgFlagInelEvent{"cfgFlagInelEvent", true, "Flag of requiring inelastic event"}; - Configurable cfgFlagInelEventMc{"cfgFlagInelEventMc", false, "Flag of requiring inelastic MC event"}; + Configurable cfgBitsSelection{"cfgBitsSelection", std::uint64_t{0b00000000000001000000000000000000000000000000000000}, "Event selection bits"}; + Configurable cfgFlagInel{"cfgFlagInel", true, "Flag of requiring INEL > 0"}; + Configurable cfgFlagInelMc{"cfgFlagInelMc", true, "Flag of requiring MC INEL > 0"}; Configurable cfgCutMaxAbsVz{"cfgCutMaxAbsVz", 8., "Maximum absolute z-vertex position (cm)"}; Configurable cfgCutMaxAbsVzMc{"cfgCutMaxAbsVzMc", 8., "Maximum absolute MC z-vertex position (cm)"}; - Configurable cfgCutMaxOccupancy{"cfgCutMaxOccupancy", 0, "Maximum occupancy"}; + Configurable cfgCutMaxOccupancy{"cfgCutMaxOccupancy", -1, "Maximum occupancy"}; Configurable cfgCutMinDeviationNPvContributors{"cfgCutMinDeviationNPvContributors", -4, "Minimum nPvContributors deviation from nGlobalTracks"}; Configurable cfgIndexDefinitionCentrality{"cfgIndexDefinitionCentrality", 2, "Centrality definition index"}; Configurable cfgFlagDefinitionCentralitySameQa{"cfgFlagDefinitionCentralitySameQa", false, "Flag of using the same centrality definition for QA"}; @@ -963,7 +966,7 @@ struct PartNumFluc { Configurable cfgNSubgroups{"cfgNSubgroups", 20, "Number of subgroups in fluctuation calculation"}; Configurable cfgFactorStorageMiniTable{"cfgFactorStorageMiniTable", 1., "Mini table storage inverse probability factor"}; Configurable cfgFlagSingleCollisionMc{"cfgFlagSingleCollisionMc", false, "Flag of requiring exactly single collision of MC collision"}; - Configurable cfgFlagMcCollisionVz{"cfgFlagMcCollisionVz", false, "Flag of using z-vertex position of MC collision"}; + Configurable cfgFlagMcCollisionVz{"cfgFlagMcCollisionVz", true, "Flag of using z-vertex position of MC collision"}; } cgEvent{}; struct : ConfigurableGroup { @@ -1138,12 +1141,12 @@ struct PartNumFluc { rctFlagsChecker.init(cgEvent.cfgLabelFlagsRct.value, static_cast(cgEvent.cfgFlagsRct.value.get("ZDC")), static_cast(cgEvent.cfgFlagsRct.value.get("Acceptance")), static_cast(cgEvent.cfgFlagsRct.value.get("Table"))); - ccdb->setURL(cgCcdb.cfgCcdbUrl.value); + ccdb->setURL(cgCcdb.cfgUrl.value); ccdb->setCaching(true); ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(true); - if (cgCcdb.cfgCcdbTimestampLatest.value >= 0) { - ccdb->setCreatedNotAfter(cgCcdb.cfgCcdbTimestampLatest.value); + if (cgCcdb.cfgTimestampLatest.value >= 0) { + ccdb->setCreatedNotAfter(cgCcdb.cfgTimestampLatest.value); } readCcdb(); @@ -1188,11 +1191,11 @@ struct PartNumFluc { LOG(info) << "Enabling RCT flag: table"; } - if ((cgEvent.cfgBitsSelectionEvent.value & ((std::uint64_t{1} << aod::evsel::EventSelectionFlags::kNsel) - 1)) == 0) { + if ((cgEvent.cfgBitsSelection.value & ((std::uint64_t{1} << aod::evsel::EventSelectionFlags::kNsel) - 1)) == 0) { LOG(info) << "No event selection bit enabled."; } else { for (std::int32_t const& iBit : std::views::iota(0, aod::evsel::EventSelectionFlags::kNsel)) { - if (static_cast((cgEvent.cfgBitsSelectionEvent.value >> iBit) & 1)) { + if (static_cast((cgEvent.cfgBitsSelection.value >> iBit) & 1)) { LOG(info) << "Enabling event selection bit: " << aod::evsel::selectionLabels[iBit]; } } @@ -1212,7 +1215,7 @@ struct PartNumFluc { hrCounter.add("hNEvents", ";;No. of Events", {HistType::kTH1D, {{NEs + aod::evsel::EventSelectionFlags::kNsel, -0.5, static_cast(NEs + aod::evsel::EventSelectionFlags::kNsel) - 0.5, "Selection"}}}); if (doProcessMc.value) { - hrCounter.add("hNMcEvents", ";;No. of MC Events", {HistType::kTH1D, {{NEs, -0.5, static_cast(NEs) - 0.5, "Selection"}}}); + hrCounter.add("hNEventsMc", ";;No. of MC Events", {HistType::kTH1D, {{NEs, -0.5, static_cast(NEs) - 0.5, "Selection"}}}); } if (cgAnalysis.cfgFlagQaRun.value) { @@ -1397,6 +1400,8 @@ struct PartNumFluc { const double maxAbsVz{std::ceil(cgEvent.cfgFlagMcCollisionVz.value ? cgEvent.cfgCutMaxAbsVzMc.value : cgEvent.cfgCutMaxAbsVz.value)}; const AxisSpec asCentrality{20, 0., 100., "Centrality (%)"}; + hrQaMc.add("hNCollisionsPerMcCollision", "", {HistType::kTH1D, {{20, -0.5, 19.5, "No. of collisions per MC collision"}}}); + hrQaMc.add("hCentralityNTracksPerMcParticle", "", {HistType::kTHnSparseF, {asCentrality, {20, -0.5, 19.5, "No. of tracks per MC particle"}}}); hrQaMc.add("hCentralityVzMcDeltaVz", "", {HistType::kTHnSparseF, {asCentrality, {static_cast(maxAbsVz) * 20, -maxAbsVz, maxAbsVz, "#it{V}_{#it{z}}^{Gen} (cm)"}, {200, -0.2, 0.2, "#it{V}_{#it{z}}^{Rec}#minus#it{V}_{#it{z}}^{Gen} (cm)"}}}); hrQaMc.add("hCentralityPtMcEtaMcDeltaPt", "", {HistType::kTHnSparseF, {asCentrality, {200, 0., 2., "#it{p}_{T}^{Gen} (GeV/#it{c})"}, {24, -1.2, 1.2, "#it{#eta}_{Gen}"}, {320, -0.8, 0.8, "#it{p}_{T}^{Rec}#minus#it{p}_{T}^{Gen} (GeV/#it{c})"}}}); hrQaMc.add("hCentralityPtMcEtaMcDeltaEta", "", {HistType::kTHnSparseF, {asCentrality, {20, 0., 2., "#it{p}_{T}^{Gen} (GeV/#it{c})"}, {240, -1.2, 1.2, "#it{#eta}_{Gen}"}, {160, -0.4, 0.4, "#it{#eta}_{Rec}#minus#it{#eta}_{Gen}"}}}); @@ -1507,7 +1512,7 @@ struct PartNumFluc { void readCcdb() { if constexpr (DoInit) { - holderCcdb.lCcdb = ccdb->get(cgCcdb.cfgCcdbPath.value); + holderCcdb.lCcdb = ccdb->get(cgCcdb.cfgPath.value); if (!holderCcdb.lCcdb || holderCcdb.lCcdb->IsA() != TList::Class()) { LOG(fatal) << "Invalid CCDB object!"; } @@ -1602,7 +1607,7 @@ struct PartNumFluc { for (std::int32_t const& iPidStrategy : std::views::iota(0, NEs)) { for (std::int32_t const& iChargeSpecies : std::views::iota(0, NEs)) { - const std::string name{std::format("hsVzCentralityPtEtaEfficiency{}{}{}_runGroup{}", getName(iPidStrategy), getName(iParticleSpecies), getName(iChargeSpecies), runGroupIndex)}; + const std::string name{std::format("hVzCentralityPtEtaEfficiency{}{}{}_runGroup{}", getName(iPidStrategy), getName(iParticleSpecies), getName(iChargeSpecies), runGroupIndex)}; const THnBase*& histogram{holderCcdb.hsVzCentralityPtEtaEfficiency[iPidStrategy][iParticleSpecies][iChargeSpecies]}; histogram = dynamic_cast(lRunGroup->FindObject(name.c_str())); if (!histogram || histogram->GetNdimensions() != HolderCcdb::NDimensionsEfficiency) { @@ -2010,11 +2015,6 @@ struct PartNumFluc { return signTrack; } }(holderMcParticle.charge, holderTrack.sign)}; - if constexpr (DataModeValue == DataMode::McMcParticle) { - if (chargeSign == 0) { - return; - } - } const auto fillByChargeSpecies{ [this] @@ -2149,11 +2149,6 @@ struct PartNumFluc { return signTrack; } }(holderMcParticle.charge, holderTrack.sign)}; - if constexpr (DataModeValue == DataMode::McMcParticle) { - if (chargeSign == 0) { - return; - } - } const bool doUseMcParticleMomentum{[](const bool flagMcParticleMomentum) constexpr -> bool { if constexpr (DataModeValue == DataMode::McMcParticle) { @@ -2311,6 +2306,103 @@ struct PartNumFluc { return true; } + template + bool initMcParticle(const MP& mcParticle) + { + holderMcParticle.clear(); + holderMcParticle.pdgCode = mcParticle.pdgCode(); + const TParticlePDG* const particlePdg{pdg->GetParticle(mcParticle.pdgCode())}; + if (particlePdg) { + holderMcParticle.charge = static_cast(std::rint(particlePdg->Charge())); + } else { + switch (std::abs(holderMcParticle.pdgCode) / 100000000) { + case 10: + holderMcParticle.charge = holderMcParticle.pdgCode / 10000 % 1000; + break; + default: + break; + } + } + + if (holderMcParticle.charge == 0) { + return false; + } + + holderMcParticle.pt = mcParticle.pt(); + holderMcParticle.eta = mcParticle.eta(); + + return true; + } + + template + bool initTrack(const T& track) + { + if (!setTrack(track)) { + return false; + } + + if constexpr (DoInitEvent) { + if (track.isPrimaryTrack()) { + const std::int32_t chargeSpeciesIndex{toI(holderTrack.sign > 0 ? ChargeSpecies::Plus : ChargeSpecies::Minus)}; + ++holderEvent.nGlobalTracks[chargeSpeciesIndex]; + if (track.isPVContributor()) { + ++holderEvent.nPvContributors[chargeSpeciesIndex]; + } + for (std::int32_t const& iDcaAxis : std::views::iota(0, NEs)) { + holderEvent.measureDca[toI(DcaMeasure::Mean)][iDcaAxis][chargeSpeciesIndex] += holderTrack.dca[iDcaAxis]; + holderEvent.measureDca[toI(DcaMeasure::Sigma)][iDcaAxis][chargeSpeciesIndex] += std::pow(holderTrack.dca[iDcaAxis], 2.); + } + if (holderTrack.hasPid[toI(Detector::Tof)]) { + ++holderEvent.nTofBeta[chargeSpeciesIndex]; + } + } + + if (cgAnalysis.cfgFlagQaRun.value && track.isPrimaryTrack()) { + if (holderTrack.sign > 0) { + fillQaRunByTrackByChargeSpecies(track); + } else { + fillQaRunByTrackByChargeSpecies(track); + } + } + } else { + if (cgAnalysis.cfgFlagQaTrack.value && track.isPrimaryTrack()) { + if (holderTrack.sign > 0) { + fillQaTrackByChargeSpecies(track); + } else { + fillQaTrackByChargeSpecies(track); + } + } + + if (!isGoodTrack(track)) { + return false; + } + + if (cgAnalysis.cfgFlagQaDca.value) { + if (holderTrack.sign > 0) { + fillQaDcaByChargeSpecies(); + } else { + fillQaDcaByChargeSpecies(); + } + } + + if (!isGoodDca()) { + return false; + } + + if (doQaAcceptance) { + const double vz{doProcessMc.value && cgEvent.cfgFlagMcCollisionVz.value ? holderMcEvent.vz : holderEvent.vz}; + if (holderTrack.eta * vz > 0. && std::abs(vz) > (doProcessMc.value && cgEvent.cfgFlagMcCollisionVz.value ? cgEvent.cfgCutMaxAbsVzMc.value : cgEvent.cfgCutMaxAbsVz.value) - 1.) { + fillQaAcceptanceByParticleSpeciesAll(track); + fillQaAcceptanceByParticleSpeciesAll(track); + fillQaAcceptanceByParticleSpeciesAll(track); + fillQaAcceptanceByParticleSpeciesAll(track); + } + } + } + + return true; + } + template requires IsValidEnumValue void fillMiniTableMc(const MPs& mcParticles, const Ts& tracks, const bool isGoodNPvContributors) @@ -2327,7 +2419,9 @@ struct PartNumFluc { miniCollision(*codeCollision); for (const auto& mcParticle : mcParticles) { - initMcParticle(mcParticle); + if (!initMcParticle(mcParticle)) { + continue; + } if (mcParticle.isPhysicalPrimary()) { const auto fillByParticleSpecies{ @@ -2338,7 +2432,7 @@ struct PartNumFluc { return false; } - const std::optional codeMcParticle{mini_mc_particle_codec::encode(holderMcParticle.pt, holderMcParticle.eta, holderMcParticle.charge, ParticleSpeciesValue)}; + const std::optional codeMcParticle{mini_mc_particle_codec::encode(holderMcParticle.pt, holderMcParticle.eta, holderMcParticle.charge)}; if (codeMcParticle.has_value()) { miniMcParticle(miniCollision.lastIndex(), *codeMcParticle); } @@ -2377,7 +2471,7 @@ struct PartNumFluc { return false; } - const std::optional codeTrack{mini_track_codec::encode(*configSelection, track.isPVContributor(), track.itsNCls(), track.itsChi2NCl(), track.tpcNClsFound(), track.tpcChi2NCl(), track.tpcNClsCrossedRows(), track.tpcFractionSharedCls(), {getAbsNSigmaDca(), getAbsNSigmaDca()}, pt, doUseMcParticleMomentum ? holderMcParticle.eta : holderTrack.eta, holderTrack.sign, ParticleSpeciesAllValue, doUseTofPid ? std::abs(holderTrack.getNSigmaPidCombined(ParticleSpeciesIndex)) : std::abs(holderTrack.nSigmaPid[toI(Detector::Tpc)][ParticleSpeciesIndex]))}; + const std::optional codeTrack{mini_track_codec::encode(*configSelection, track.isPVContributor(), track.itsNCls(), track.itsChi2NCl(), track.tpcNClsFound(), track.tpcChi2NCl(), track.tpcNClsCrossedRows(), track.tpcFractionSharedCls(), {getAbsNSigmaDca(), getAbsNSigmaDca()}, pt, doUseMcParticleMomentum ? holderMcParticle.eta : holderTrack.eta, holderTrack.sign, doUseTofPid ? std::abs(holderTrack.getNSigmaPidCombined(ParticleSpeciesIndex)) : std::abs(holderTrack.nSigmaPid[toI(Detector::Tpc)][ParticleSpeciesIndex]))}; if (codeTrack.has_value()) { miniTrack(miniCollision.lastIndex(), *codeTrack); } @@ -2417,8 +2511,10 @@ struct PartNumFluc { } const auto fill{ - [this, &track](const ParticleSpeciesAll particleSpeciesAll, const double absNSigmaPid) -> void { - const std::optional codeTrack{mini_track_codec::encode(*configSelection, track.isPVContributor(), track.itsNCls(), track.itsChi2NCl(), track.tpcNClsFound(), track.tpcChi2NCl(), track.tpcNClsCrossedRows(), track.tpcFractionSharedCls(), {getAbsNSigmaDca(), getAbsNSigmaDca()}, holderTrack.pt, holderTrack.eta, holderTrack.sign, particleSpeciesAll, absNSigmaPid)}; + [this, &track] + requires IsValidEnumValue + (const double absNSigmaPid) -> void { + const std::optional codeTrack{mini_track_codec::encode(*configSelection, track.isPVContributor(), track.itsNCls(), track.itsChi2NCl(), track.tpcNClsFound(), track.tpcChi2NCl(), track.tpcNClsCrossedRows(), track.tpcFractionSharedCls(), {getAbsNSigmaDca(), getAbsNSigmaDca()}, holderTrack.pt, holderTrack.eta, holderTrack.sign, absNSigmaPid)}; if (codeTrack.has_value()) { miniTrack(miniCollision.lastIndex(), *codeTrack); } @@ -2432,7 +2528,7 @@ struct PartNumFluc { return false; } - fill(ParticleSpeciesAll::All, 0.); + fill.template operator()(0.); } else { if (!isGoodMomentum(false)) { return false; @@ -2444,7 +2540,7 @@ struct PartNumFluc { return false; } - fill(ParticleSpeciesAllValue, doUseTofPid ? std::abs(holderTrack.getNSigmaPidCombined(ParticleSpeciesIndex)) : std::abs(holderTrack.nSigmaPid[toI(Detector::Tpc)][ParticleSpeciesIndex])); + fill.template operator()(doUseTofPid ? std::abs(holderTrack.getNSigmaPidCombined(ParticleSpeciesIndex)) : std::abs(holderTrack.nSigmaPid[toI(Detector::Tpc)][ParticleSpeciesIndex])); } return true; }}; @@ -2461,96 +2557,6 @@ struct PartNumFluc { } } - template - void initMcParticle(const MP& mcParticle) - { - holderMcParticle.clear(); - holderMcParticle.pdgCode = mcParticle.pdgCode(); - const TParticlePDG* const particlePdg{pdg->GetParticle(mcParticle.pdgCode())}; - if (particlePdg) { - holderMcParticle.charge = static_cast(std::rint(particlePdg->Charge())); - } else { - switch (std::abs(holderMcParticle.pdgCode) / 100000000) { - case 10: - holderMcParticle.charge = holderMcParticle.pdgCode / 10000 % 1000; - break; - default: - break; - } - } - holderMcParticle.pt = mcParticle.pt(); - holderMcParticle.eta = mcParticle.eta(); - } - - template - bool initTrack(const T& track) - { - if (!setTrack(track)) { - return false; - } - - if constexpr (DoInitEvent) { - if (track.isPrimaryTrack()) { - const std::int32_t chargeSpeciesIndex{toI(holderTrack.sign > 0 ? ChargeSpecies::Plus : ChargeSpecies::Minus)}; - ++holderEvent.nGlobalTracks[chargeSpeciesIndex]; - if (track.isPVContributor()) { - ++holderEvent.nPvContributors[chargeSpeciesIndex]; - } - for (std::int32_t const& iDcaAxis : std::views::iota(0, NEs)) { - holderEvent.measureDca[toI(DcaMeasure::Mean)][iDcaAxis][chargeSpeciesIndex] += holderTrack.dca[iDcaAxis]; - holderEvent.measureDca[toI(DcaMeasure::Sigma)][iDcaAxis][chargeSpeciesIndex] += std::pow(holderTrack.dca[iDcaAxis], 2.); - } - if (holderTrack.hasPid[toI(Detector::Tof)]) { - ++holderEvent.nTofBeta[chargeSpeciesIndex]; - } - } - - if (cgAnalysis.cfgFlagQaRun.value && track.isPrimaryTrack()) { - if (holderTrack.sign > 0) { - fillQaRunByTrackByChargeSpecies(track); - } else { - fillQaRunByTrackByChargeSpecies(track); - } - } - } else { - if (cgAnalysis.cfgFlagQaTrack.value && track.isPrimaryTrack()) { - if (holderTrack.sign > 0) { - fillQaTrackByChargeSpecies(track); - } else { - fillQaTrackByChargeSpecies(track); - } - } - - if (!isGoodTrack(track)) { - return false; - } - - if (cgAnalysis.cfgFlagQaDca.value) { - if (holderTrack.sign > 0) { - fillQaDcaByChargeSpecies(); - } else { - fillQaDcaByChargeSpecies(); - } - } - - if (!isGoodDca()) { - return false; - } - - if (doQaAcceptance) { - const double vz{doProcessMc.value && cgEvent.cfgFlagMcCollisionVz.value ? holderMcEvent.vz : holderEvent.vz}; - if (holderTrack.eta * vz > 0. && std::abs(vz) > (doProcessMc.value && cgEvent.cfgFlagMcCollisionVz.value ? cgEvent.cfgCutMaxAbsVzMc.value : cgEvent.cfgCutMaxAbsVz.value) - 1.) { - fillQaAcceptanceByParticleSpeciesAll(track); - fillQaAcceptanceByParticleSpeciesAll(track); - fillQaAcceptanceByParticleSpeciesAll(track); - fillQaAcceptanceByParticleSpeciesAll(track); - } - } - } - - return true; - } - template McEventSelection initMcEvent(const MC& mcCollision) { @@ -2559,13 +2565,13 @@ struct PartNumFluc { const auto fillMcEventSelection{ [this](const McEventSelection selection) -> McEventSelection { - hrCounter.fill(C_CS("hNMcEvents"), toI(selection)); + hrCounter.fill(C_CS("hNEventsMc"), toI(selection)); return selection; }}; fillMcEventSelection(McEventSelection::All); - if (cgEvent.cfgFlagInelEventMc.value && !mcCollision.isInelGt0()) { + if (cgEvent.cfgFlagInelMc.value && !mcCollision.isInelGt0()) { return fillMcEventSelection(McEventSelection::Inel); } @@ -2573,6 +2579,10 @@ struct PartNumFluc { return fillMcEventSelection(McEventSelection::Vz); } + if (cgAnalysis.cfgFlagQaMc.value) { + hrQaMc.fill(C_CS("hNCollisionsPerMcCollision"), mcCollision.numRecoCollision()); + } + if (cgEvent.cfgFlagSingleCollisionMc.value && mcCollision.numRecoCollision() != 1) { return fillMcEventSelection(McEventSelection::NRecoCollisions); } @@ -2636,12 +2646,12 @@ struct PartNumFluc { return fillEventSelection(EventSelection::Rct); } - if (cgEvent.cfgFlagInelEvent.value && !collision.isInelGt0()) { + if (cgEvent.cfgFlagInel.value && !collision.isInelGt0()) { return fillEventSelection(EventSelection::Inel); } for (std::int32_t const& iBit : std::views::iota(0, aod::evsel::EventSelectionFlags::kNsel)) { - if (((cgEvent.cfgBitsSelectionEvent.value >> iBit) & 1) && !collision.selection_bit(iBit)) { + if (((cgEvent.cfgBitsSelection.value >> iBit) & 1) && !collision.selection_bit(iBit)) { return fillEventSelection(EventSelection::Bits, NEs + iBit); } } @@ -2659,7 +2669,7 @@ struct PartNumFluc { return fillEventSelection(EventSelection::Vz); } - if (cgEvent.cfgCutMaxOccupancy.value > 0) { + if (cgEvent.cfgCutMaxOccupancy.value >= 0) { const std::int32_t occupancy{collision.trackOccupancyInTimeRange()}; if (occupancy < 0 || occupancy >= cgEvent.cfgCutMaxOccupancy.value) { return fillEventSelection(EventSelection::Occupancy); @@ -2735,8 +2745,7 @@ struct PartNumFluc { void processMc(const soa::Filtered::iterator& mcCollision, const aod::McParticles& mcParticles, const soa::SmallGroups& collisions, const soa::Filtered& tracksUngrouped, const aod::BCsWithTimestamps&) { - const McEventSelection mcEventSelection{initMcEvent(mcCollision)}; - if (mcEventSelection != McEventSelection::Good) { + if (initMcEvent(mcCollision) != McEventSelection::Good) { return; } @@ -2771,7 +2780,15 @@ struct PartNumFluc { } for (const auto& mcParticle : mcParticles) { - initMcParticle(mcParticle); + if (!initMcParticle(mcParticle)) { + continue; + } + + const auto& tracksMatched{tracks.sliceBy(presliceTracksPerMcParticle, mcParticle.globalIndex())}; + + if (cgAnalysis.cfgFlagQaMc.value && (!cgTrack.cfgFlagMcParticlePhysicalPrimary.value || mcParticle.isPhysicalPrimary())) { + hrQaMc.fill(C_CS("hCentralityNTracksPerMcParticle"), holderEvent.centralityCalibration, tracksMatched.size()); + } if (mcParticle.isPhysicalPrimary()) { if (doCalculationYield) { @@ -2787,7 +2804,6 @@ struct PartNumFluc { } } - const auto& tracksMatched{tracks.sliceBy(presliceTracksPerMcParticle, mcParticle.globalIndex())}; for (const auto& track : tracksMatched) { if (!initTrack(track)) { continue;