diff --git a/PWGCF/EbyEFluctuations/Tasks/partNumFluc.cxx b/PWGCF/EbyEFluctuations/Tasks/partNumFluc.cxx index 2f2dc18d5bb..5705c659277 100644 --- a/PWGCF/EbyEFluctuations/Tasks/partNumFluc.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/partNumFluc.cxx @@ -70,10 +70,11 @@ #include #include -#define C_CS(cs) \ - [](std::index_sequence) { \ - static_assert(std::is_array_v>); \ - return ConstStr<(cs)[indices]...>{}; \ +#define C_CS(cs) \ + [](std::index_sequence) { \ + static_assert(std::is_array_v> && \ + std::same_as>, char>); \ + return ConstStr<(cs)[indices]...>{}; \ }(std::make_index_sequence{}) #define C_SV(sv) \ [](std::index_sequence) { \ @@ -95,22 +96,22 @@ using JoinedMcCollisions = soa::Join; namespace mini_mc_collision { -DECLARE_SOA_COLUMN(NMcParticlesChargedAll, nMcParticlesChargedAll, std::uint16_t); -DECLARE_SOA_COLUMN(NMcParticlesChargedIn, nMcParticlesChargedIn, std::uint16_t); +DECLARE_SOA_COLUMN(NMcParticlesP, nMcParticlesP, std::uint16_t); +DECLARE_SOA_COLUMN(NMcParticlesM, nMcParticlesM, std::uint16_t); } // namespace mini_mc_collision -DECLARE_SOA_TABLE(MiniMcCollisions, "AOD", "MINIMCCOLLISION", soa::Index<>, mini_mc_collision::NMcParticlesChargedAll, mini_mc_collision::NMcParticlesChargedIn); +DECLARE_SOA_TABLE(MiniMcCollisions, "AOD", "MINIMCCOLLISION", soa::Index<>, mini_mc_collision::NMcParticlesP, mini_mc_collision::NMcParticlesM); using MiniMcCollision = MiniMcCollisions::iterator; namespace mini_collision { DECLARE_SOA_COLUMN(Vz, vz, std::int8_t); DECLARE_SOA_COLUMN(Centrality, centrality, std::uint16_t); -DECLARE_SOA_COLUMN(NTracksAll, nTracksAll, std::uint16_t); -DECLARE_SOA_COLUMN(NTracksIn, nTracksIn, std::uint16_t); +DECLARE_SOA_COLUMN(NTracksP, nTracksP, std::uint16_t); +DECLARE_SOA_COLUMN(NTracksM, nTracksM, std::uint16_t); } // namespace mini_collision -DECLARE_SOA_TABLE(MiniCollisions, "AOD", "MINICOLLISION", soa::Index<>, mini_collision::Vz, mini_collision::Centrality, mini_collision::NTracksAll, mini_collision::NTracksIn); +DECLARE_SOA_TABLE(MiniCollisions, "AOD", "MINICOLLISION", soa::Index<>, mini_collision::Vz, mini_collision::Centrality, mini_collision::NTracksP, mini_collision::NTracksM); using MiniCollision = MiniCollisions::iterator; namespace mini_mc_particle @@ -141,16 +142,15 @@ inline constexpr std::int32_t NExponentKeys{MaxOrder * (MaxOrder + 1) / 2}; inline constexpr std::array, NExponentKeys> ExponentKeys{[] { std::array, NExponentKeys> result{}; std::int32_t index{}; - for (std::int8_t const& iExponent : std::views::iota(1, MaxOrder + 1)) { - for (std::int8_t const& jExponent : std::views::iota(1, iExponent + 1)) { - result[index++] = {iExponent, jExponent}; + for (std::int32_t const& iExponent : std::views::iota(1, MaxOrder + 1)) { + for (std::int32_t const& jExponent : std::views::iota(1, iExponent + 1)) { + result[index++] = {static_cast(iExponent), static_cast(jExponent)}; } } return result; }()}; inline constexpr std::int32_t NOrderKeys{[] { - std::array counts{}; - counts[0] = 1; + std::array counts{1}; for (std::array const& exponentKey /*o2-linter: disable=const-ref-in-for-loop*/ : ExponentKeys) { const std::int32_t weight{exponentKey[0]}; for (std::int32_t const& sum : std::views::iota(weight, MaxOrder + 1)) { @@ -176,7 +176,7 @@ inline constexpr std::array, NOrderKeys> } const std::int32_t weight{ExponentKeys[position][0]}; - for (std::int8_t power{}; sum + power * weight <= target; ++power) { + for (std::int32_t power{}; sum + power * weight <= target; ++power) { current[position] = power; self(self, position + 1, sum + power * weight, target); } @@ -236,11 +236,13 @@ template requires IsValidEnum struct EnumInfo; -enum class NameKind { kDefault = 0, - kLower, - kDisplay, - kDisplayLower, - kN }; +enum class NameKind { + kDefault = 0, + kLower, + kDisplay, + kDisplayLower, + kN +}; template requires IsValidEnum inline constexpr std::string_view getName(const std::int32_t index) @@ -548,19 +550,15 @@ struct PartNumFluc { return std::numeric_limits::min() <= value && value <= std::numeric_limits::max() ? std::round(value) : (std::is_signed_v ? std::numeric_limits::min() : std::numeric_limits::max()); } - aod::mini_mc_collision::NMcParticlesChargedAll::type nMcParticlesChargedAll{}; - aod::mini_mc_collision::NMcParticlesChargedIn::type nMcParticlesChargedIn{}; - aod::mini_collision::NTracksAll::type nTracksAll{}; - aod::mini_collision::NTracksIn::type nTracksIn{}; + std::array> nMcParticles{}; + std::array> nTracks{}; std::vector signedEfficienciesMcParticle{[] {std::vector v{}; v.reserve(256); return v; }()}; std::vector signedEfficienciesTrack{[] {std::vector v{}; v.reserve(256); return v; }()}; void clear() { - nMcParticlesChargedAll = {}; - nMcParticlesChargedIn = {}; - nTracksAll = {}; - nTracksIn = {}; + nMcParticles = {}; + nTracks = {}; signedEfficienciesMcParticle.clear(); signedEfficienciesTrack.clear(); } @@ -580,20 +578,21 @@ struct PartNumFluc { Configurable cfgFlagQaCentrality{"cfgFlagQaCentrality", false, "Centrality QA flag"}; Configurable cfgFlagQaTrack{"cfgFlagQaTrack", false, "Track QA flag"}; Configurable cfgFlagQaDca{"cfgFlagQaDca", false, "DCA QA flag"}; - Configurable> cfgFlagQaAcceptance{"cfgFlagQaAcceptance", {std::array>{false, false, false, false}.data(), NEs, getDisplayNames()}, "Acceptance QA flag"}; - Configurable> cfgFlagQaPhi{"cfgFlagQaPhi", {std::array>{false, false, false, false}.data(), NEs, getDisplayNames()}, "Phi QA flag"}; - Configurable> cfgFlagQaPid{"cfgFlagQaPid", {std::array>{false, false, false, false}.data(), NEs, getDisplayNames()}, "PID QA flag"}; + Configurable> cfgFlagsQaAcceptance{"cfgFlagsQaAcceptance", {std::array>{false, false, false, false}.data(), NEs, getDisplayNames()}, "Acceptance QA flags"}; + Configurable> cfgFlagsQaPhi{"cfgFlagsQaPhi", {std::array>{false, false, false, false}.data(), NEs, getDisplayNames()}, "Phi QA flags"}; + Configurable> cfgFlagsQaPid{"cfgFlagsQaPid", {std::array>{false, false, false, false}.data(), NEs, getDisplayNames()}, "PID QA flags"}; Configurable cfgFlagQaMc{"cfgFlagQaMc", false, "MC QA flag"}; - Configurable> cfgFlagCalculationYield{"cfgFlagCalculationYield", {std::array>{false, false, false}.data(), NEs, getDisplayNames()}, "Yield calculation flag"}; - Configurable> cfgFlagCalculationPurity{"cfgFlagCalculationPurity", {std::array>{false, false, false}.data(), NEs, getDisplayNames()}, "Purity calculation flag"}; - Configurable> cfgFlagCalculationFractionPrimary{"cfgFlagCalculationFractionPrimary", {std::array>{false, false, false}.data(), NEs, getDisplayNames()}, "Primary fraction calculation flag"}; - Configurable> cfgFlagCalculationFluctuation{"cfgFlagCalculationFluctuation", {std::array>{false, false, false}.data(), NEs, getDisplayNames()}, "Fluctuation calculation flag"}; + Configurable> cfgFlagsCalculationYield{"cfgFlagsCalculationYield", {std::array>{false, false, false}.data(), NEs, getDisplayNames()}, "Yield calculation flags"}; + Configurable> cfgFlagsCalculationPurity{"cfgFlagsCalculationPurity", {std::array>{false, false, false}.data(), NEs, getDisplayNames()}, "Purity calculation flags"}; + Configurable> cfgFlagsCalculationFractionPrimary{"cfgFlagsCalculationFractionPrimary", {std::array>{false, false, false}.data(), NEs, getDisplayNames()}, "Primary fraction calculation flags"}; + Configurable> cfgFlagsCalculationFluctuation{"cfgFlagsCalculationFluctuation", {std::array>{false, false, false}.data(), NEs, getDisplayNames()}, "Fluctuation calculation flags"}; } groupAnalysis; struct : ConfigurableGroup { Configurable cfgFlagRejectionRunBad{"cfgFlagRejectionRunBad", false, "Bad run rejection flag"}; Configurable cfgFlagRejectionRunBadMc{"cfgFlagRejectionRunBadMc", false, "MC bad run rejection flag"}; Configurable cfgLabelFlagsRct{"cfgLabelFlagsRct", "CBT_hadronPID", "RCT flags label"}; + Configurable> cfgFlagsRct{"cfgFlagsRct", {std::array{false, true, true}.data(), 3, {"ZDC", "Acceptance", "Table"}}, "RCT flags"}; Configurable cfgBitsSelectionEvent{"cfgBitsSelectionEvent", std::uint64_t{0b10000000001101000000000000000000000000000000000000}, "Event selection bits"}; Configurable cfgFlagInelEvent{"cfgFlagInelEvent", true, "Flag of requiring inelastic event"}; Configurable cfgFlagInelEventMc{"cfgFlagInelEventMc", false, "Flag of requiring inelastic MC event"}; @@ -601,7 +600,7 @@ struct PartNumFluc { Configurable cfgFlagCutVzMc{"cfgFlagCutVzMc", false, "Flag of requiring MC z-vertex cut"}; Configurable cfgCutMinDeviationNPvContributors{"cfgCutMinDeviationNPvContributors", -4, "Minimum nPvContributors deviation from nGlobalTracks"}; Configurable cfgIndexDefinitionCentrality{"cfgIndexDefinitionCentrality", 2, "Centrality definition index"}; - ConfigurableAxis cfgAxisCentrality{"cfgAxisCentrality", {VARIABLE_WIDTH, 0., 5., 10., 15., 20., 25., 30., 35., 40., 45., 50., 55., 60., 65., 70., 75., 80., 85., 90.}, "Centrality axis in fluctuation calculation"}; + ConfigurableAxis cfgAxisCentrality{"cfgAxisCentrality", {18, 0., 90.}, "Centrality axis in fluctuation calculation"}; Configurable cfgNSubgroups{"cfgNSubgroups", 20, "Number of subgroups in fluctuation calculation"}; } groupEvent; @@ -615,14 +614,14 @@ struct PartNumFluc { Configurable cfgCutMinTpcNCrossedRows{"cfgCutMinTpcNCrossedRows", 75, "Minimum number of crossed rows TPC"}; Configurable cfgCutMinTpcNCrossedRowsRatio{"cfgCutMinTpcNCrossedRowsRatio", 0.8, "Minimum ratio of crossed rows over findable clusters TPC"}; Configurable cfgFlagRecalibrationDca{"cfgFlagRecalibrationDca", false, "DCA recalibration flag"}; - Configurable> cfgCutMaxAbsNSigmaDca{"cfgCutMaxAbsNSigmaDca", {std::array>{2.5, 2.5}.data(), NEs, getDisplayNames()}, "Maximum absolute nSigma of DCA (cm)"}; + Configurable> cfgCutsMaxAbsNSigmaDca{"cfgCutsMaxAbsNSigmaDca", {std::array>{2.5, 2.5}.data(), NEs, getDisplayNames()}, "Maximum absolute nSigma values of DCA (cm)"}; Configurable cfgCutMinPt{"cfgCutMinPt", 0.4, "Minimum pT (GeV/c)"}; Configurable cfgCutMaxPt{"cfgCutMaxPt", 2., "Maximum pT (GeV/c)"}; Configurable cfgCutMaxAbsEta{"cfgCutMaxAbsEta", 0.8, "Maximum absolute eta"}; - Configurable> cfgThresholdPtTofPid{"cfgThresholdPtTofPid", {std::array>{0.5, 0.5, 0.8}.data(), NEs, getDisplayNames()}, "pT (GeV/c) threshold for TOF PID"}; - Configurable> cfgFlagRecalibrationNSigmaPid{"cfgFlagRecalibrationNSigmaPid", {std::array>{false, false, false}.data(), NEs, getDisplayNames()}, "nSigma PID recalibration flag"}; + Configurable> cfgThresholdsPtTofPid{"cfgThresholdsPtTofPid", {std::array>{0.5, 0.5, 0.8}.data(), NEs, getDisplayNames()}, "pT (GeV/c) thresholds for TOF PID"}; + Configurable> cfgFlagsRecalibrationNSigmaPid{"cfgFlagsRecalibrationNSigmaPid", {std::array>{false, false, false}.data(), NEs, getDisplayNames()}, "nSigma PID recalibration flags"}; Configurable cfgFlagRejectionOthers{"cfgFlagRejectionOthers", false, "Other particle species rejection flag"}; - Configurable cfgCutMaxAbsNSigmaPid{"cfgCutMaxAbsNSigmaPid", 2., "Maximum absolute nSigma for PID"}; + Configurable> cfgCutsMaxAbsNSigmaPid{"cfgCutsMaxAbsNSigmaPid", {std::array>{2., 2., 2.}.data(), NEs, getDisplayNames()}, "Maximum absolute nSigma values for PID"}; Configurable cfgFlagMcParticlePhysicalPrimary{"cfgFlagMcParticlePhysicalPrimary", true, "Flag of requiring physical primary MC particle"}; Configurable cfgFlagMcParticleMomentum{"cfgFlagMcParticleMomentum", true, "Flag of using momentum of MC particle"}; } groupTrack; @@ -648,7 +647,7 @@ struct PartNumFluc { Service ccdb; Filter filterCollision = (aod::evsel::sel8 == true); - Filter filterTrack = requireQualityTracksInFilter(); + Filter filterTrack = (requireQualityTracksInFilter() && requireTrackCutInFilter(TrackSelectionFlags::kGoldenChi2)); Filter filterMcCollision = (aod::mccollisionprop::numRecoCollision > 0); Preslice presliceTracksPerCollision{aod::track::collisionId}; @@ -672,7 +671,7 @@ struct PartNumFluc { } if (!groupEvent.cfgLabelFlagsRct.value.empty()) { - rctFlagsChecker.init(groupEvent.cfgLabelFlagsRct.value, false, true, true); + rctFlagsChecker.init(groupEvent.cfgLabelFlagsRct.value, groupEvent.cfgFlagsRct.value.get("ZDC"), groupEvent.cfgFlagsRct.value.get("Acceptance"), groupEvent.cfgFlagsRct.value.get("Table")); } ccdb->setURL(groupCcdb.cfgCcdbUrl.value); @@ -684,7 +683,7 @@ struct PartNumFluc { } const TList* const ccdbObject{ccdb->get(groupCcdb.cfgCcdbPath.value)}; if (!ccdbObject || ccdbObject->IsA() != TList::Class()) { - LOG(fatal) << "Invalid ccdb_object!"; + LOG(fatal) << "Invalid CCDB object!"; } holderCcdb.clear(); @@ -739,10 +738,19 @@ struct PartNumFluc { } if (groupEvent.cfgLabelFlagsRct.value.empty()) { - LOG(info) << "No RCT flags enabled."; + LOG(info) << "No RCT flags label enabled."; } else { LOG(info) << "Enabling RCT flags label: " << groupEvent.cfgLabelFlagsRct.value; } + if (groupEvent.cfgFlagsRct.value.get("ZDC")) { + LOG(info) << "Enabling RCT flag: ZDC"; + } + if (!groupEvent.cfgLabelFlagsRct.value.empty() && groupEvent.cfgFlagsRct.value.get("Acceptance")) { + LOG(info) << "Enabling RCT flag: acceptance"; + } + if (groupEvent.cfgFlagsRct.value.get("Table")) { + LOG(info) << "Enabling RCT flag: table"; + } if ((groupEvent.cfgBitsSelectionEvent.value & ((std::uint64_t{1} << aod::evsel::EventSelectionFlags::kNsel) - 1)) == 0) { LOG(info) << "No event selection bit enabled."; @@ -766,14 +774,14 @@ struct PartNumFluc { break; } - const auto readListRunGroup = [&](const std::int32_t runGroupIndex) -> const TList* { + const auto readListRunGroup{[&](const std::int32_t runGroupIndex) -> const TList* { const char* const name{Form("lRunGroup_%d", runGroupIndex)}; const TList* const lRunGroup{dynamic_cast(ccdbObject->FindObject(name))}; if (!lRunGroup) { LOG(fatal) << "Invalid " << name << "!"; } return lRunGroup; - }; + }}; if (groupTrack.cfgFlagRecalibrationDca.value) { LOG(info) << "Enabling DCA recalibration."; @@ -797,7 +805,7 @@ struct PartNumFluc { } for (std::int32_t const& iParticleSpecies : std::views::iota(0, NEs)) { - if (!groupTrack.cfgFlagRecalibrationNSigmaPid.value.get(iParticleSpecies)) { + if (!groupTrack.cfgFlagsRecalibrationNSigmaPid.value.get(iParticleSpecies)) { continue; } @@ -894,11 +902,8 @@ struct PartNumFluc { if (groupAnalysis.cfgFlagQaCentrality.value) { LOG(info) << "Enabling centrality QA."; - const AxisSpec asCentrality(20, 0., 100., "Centrality (%)"); - - hrQaCentrality.add("QaCentrality/hCentralityFt0a", "", {HistType::kTHnSparseF, {asCentrality, {12000, 0., 12000., "FT0A Multiplicity"}}}); - hrQaCentrality.add("QaCentrality/hCentralityFt0c", "", {HistType::kTHnSparseF, {asCentrality, {3000, 0., 3000., "FT0C Multiplicity"}}}); - hrQaCentrality.add("QaCentrality/hCentralityFt0m", "", {HistType::kTHnSparseF, {asCentrality, {15000, 0., 15000., "FT0M Multiplicity"}}}); + hrQaCentrality.add("QaCentrality/hCentralitySelection", "", {HistType::kTHnSparseD, {{100, 0., 100., "Centrality (%)"}, {10 + aod::evsel::EventSelectionFlags::kNsel, -0.5, 9.5 + static_cast(aod::evsel::EventSelectionFlags::kNsel), "Selection"}}}); + hrQaCentrality.add("QaCentrality/hCentralityMultiplicity", "", {HistType::kTHnSparseD, {{100, 0., 100., "Centrality (%)"}, {200, -0.5, 199.5, "Multiplicity"}}}); } if (groupAnalysis.cfgFlagQaTrack.value) { @@ -919,13 +924,14 @@ struct PartNumFluc { if (groupAnalysis.cfgFlagQaDca.value) { LOG(info) << "Enabling DCA QA."; - const AxisSpec asPt(200, 0., 2., "#it{p}_{T} (GeV/#it{c})"); + const AxisSpec asPt(40, 0., 2., "#it{p}_{T} (GeV/#it{c})"); + const HistogramConfigSpec hcsQaDcaProfile(HistType::kTProfile3D, {asPt, {24, -1.2, 1.2, "#it{#eta}"}, {constants::math::NSectors, 0., constants::math::TwoPI, "#it{#varphi} (rad)"}}); for (const auto& [name, title, configSpec] : std::to_array>( - {{"hPtDcaXy", "", {HistType::kTHnSparseD, {asPt, {500, -0.5, 0.5, "DCA_{#it{xy}} (cm)"}}}}, - {"pPtDcaXy", ";;#LTDCA_{#it{xy}}#GT (cm)", {HistType::kTProfile, {asPt}}}, - {"hPtDcaZ", "", {HistType::kTHnSparseD, {asPt, {500, -1., 1., "DCA_{#it{z}} (cm)"}}}}, - {"pPtDcaZ", ";;#LTDCA_{#it{z}}#GT (cm)", {HistType::kTProfile, {asPt}}}})) { + {{"hPtDcaXy", "", {HistType::kTHnSparseD, {asPt, {250, -0.25, 0.25, "DCA_{#it{xy}} (cm)"}}}}, + {"pPtEtaPhiIuDcaXy", ";;#LTDCA_{#it{xy}}#GT (cm)", hcsQaDcaProfile}, + {"hPtDcaZ", "", {HistType::kTHnSparseD, {asPt, {250, -0.5, 0.5, "DCA_{#it{z}} (cm)"}}}}, + {"pPtEtaPhiIuDcaZ", ";;#LTDCA_{#it{z}}#GT (cm)", hcsQaDcaProfile}})) { for (std::int32_t const& iChargeSpecies : std::views::iota(0, NEs)) { hrQaDca.add(Form("QaDca/%s_%s", name.data(), getName(iChargeSpecies).data()), title.data(), configSpec); } @@ -933,7 +939,7 @@ struct PartNumFluc { } for (std::int32_t const& iParticleSpeciesAll : std::views::iota(0, NEs)) { - if (!groupAnalysis.cfgFlagQaAcceptance.value.get(iParticleSpeciesAll)) { + if (!groupAnalysis.cfgFlagsQaAcceptance.value.get(iParticleSpeciesAll)) { continue; } @@ -947,13 +953,13 @@ struct PartNumFluc { } for (std::int32_t const& iParticleSpeciesAll : std::views::iota(0, NEs)) { - if (!groupAnalysis.cfgFlagQaPhi.value.get(iParticleSpeciesAll)) { + if (!groupAnalysis.cfgFlagsQaPhi.value.get(iParticleSpeciesAll)) { continue; } LOG(info) << "Enabling " << getName(iParticleSpeciesAll) << " phi QA."; - const HistogramConfigSpec hcsQaPhi(HistType::kTHnSparseF, {{{0., 5., 10., 20., 30., 40., 50., 60., 70., 80., 90.}, "Centrality (%)"}, {20, 0., 2., "#it{p}_{T} (GeV/#it{c})"}, {16, -0.8, 0.8, "#it{#eta}"}, {360, 0., constants::math::TwoPI, "#it{#varphi} (rad)"}}); + const HistogramConfigSpec hcsQaPhi(HistType::kTHnSparseF, {{{0., 5., 10., 20., 30., 40., 50., 60., 70., 80., 90.}, "Centrality (%)"}, {20, 0., 2., "#it{p}_{T} (GeV/#it{c})"}, {24, -1.2, 1.2, "#it{#eta}"}, {360, 0., constants::math::TwoPI, "#it{#varphi} (rad)"}}); for (std::int32_t const& iPidStrategy : std::views::iota(0, NEs)) { for (std::int32_t const& iChargeSpecies : std::views::iota(0, NEs)) { @@ -964,7 +970,7 @@ struct PartNumFluc { } for (std::int32_t const& iParticleSpeciesAll : std::views::iota(0, NEs)) { - if (!groupAnalysis.cfgFlagQaPid.value.get(iParticleSpeciesAll)) { + if (!groupAnalysis.cfgFlagsQaPid.value.get(iParticleSpeciesAll)) { continue; } @@ -1011,14 +1017,14 @@ struct PartNumFluc { const AxisSpec asCentrality(20, 0., 100., "Centrality (%)"); - hrQaMc.add("QaMc/hCentralityVzDeltaVz", "", {HistType::kTHnSparseF, {asCentrality, {static_cast(std::llrint(std::ceil(groupEvent.cfgCutMaxAbsVz.value))) * 20, -std::ceil(groupEvent.cfgCutMaxAbsVz.value), std::ceil(groupEvent.cfgCutMaxAbsVz.value), "#it{V}_{#it{z}}^{Rec} (cm)"}, {200, -0.2, 0.2, "#it{V}_{#it{z}}^{Rec}#minus#it{V}_{#it{z}}^{Gen} (cm)"}}}); - hrQaMc.add("QaMc/hCentralityPtEtaDeltaPt", "", {HistType::kTHnSparseF, {asCentrality, {200, 0., 2., "#it{p}_{T}^{Rec} (GeV/#it{c})"}, {24, -1.2, 1.2, "#it{#eta}_{Rec}"}, {320, -0.8, 0.8, "#it{p}_{T}^{Rec}#minus#it{p}_{T}^{Gen} (GeV/#it{c})"}}}); - hrQaMc.add("QaMc/hCentralityPtEtaDeltaEta", "", {HistType::kTHnSparseF, {asCentrality, {20, 0., 2., "#it{p}_{T}^{Rec} (GeV/#it{c})"}, {240, -1.2, 1.2, "#it{#eta}_{Rec}"}, {160, -0.4, 0.4, "#it{#eta}_{Rec}#minus#it{#eta}_{Gen}"}}}); + hrQaMc.add("QaMc/hCentralityVzMcDeltaVz", "", {HistType::kTHnSparseF, {asCentrality, {static_cast(std::llrint(std::ceil(groupEvent.cfgCutMaxAbsVz.value))) * 20, -std::ceil(groupEvent.cfgCutMaxAbsVz.value), std::ceil(groupEvent.cfgCutMaxAbsVz.value), "#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("QaMc/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("QaMc/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}"}}}); } } for (std::int32_t const& iParticleSpecies : std::views::iota(0, NEs)) { - if (!groupAnalysis.cfgFlagCalculationYield.value.get(iParticleSpecies)) { + if (!groupAnalysis.cfgFlagsCalculationYield.value.get(iParticleSpecies)) { continue; } LOG(info) << "Enabling " << getName(iParticleSpecies) << " yield calculation."; @@ -1027,12 +1033,15 @@ struct PartNumFluc { if (doprocessMc.value) { for (std::int32_t const& iChargeSpecies : std::views::iota(0, NEs)) { - hrCalculationYield.add(Form("CalculationYield/hVzCentralityPtEtaMc_mc%s%s", getName(iParticleSpecies).data(), getName(iChargeSpecies).data()), "", hcsCalculationYield); + hrCalculationYield.add(Form("CalculationYield/hVzCentralityPtMcEtaMc_mc%s%s", getName(iParticleSpecies).data(), getName(iChargeSpecies).data()), "", hcsCalculationYield); } for (std::int32_t const& iPidStrategy : std::views::iota(0, NEs)) { for (std::int32_t const& iChargeSpecies : std::views::iota(0, NEs)) { - hrCalculationYield.add(Form("CalculationYield/hVzCentralityPtEtaMc_mc%s%s%s", getName(iPidStrategy).data(), getName(iParticleSpecies).data(), getName(iChargeSpecies).data()), "", hcsCalculationYield); - hrCalculationYield.add(Form("CalculationYield/hVzCentralityPtEta_mc%s%s%s", getName(iPidStrategy).data(), getName(iParticleSpecies).data(), getName(iChargeSpecies).data()), "", hcsCalculationYield); + if (groupTrack.cfgFlagMcParticleMomentum.value) { + hrCalculationYield.add(Form("CalculationYield/hVzCentralityPtMcEtaMc_mc%s%s%s", getName(iPidStrategy).data(), getName(iParticleSpecies).data(), getName(iChargeSpecies).data()), "", hcsCalculationYield); + } else { + hrCalculationYield.add(Form("CalculationYield/hVzCentralityPtEta_mc%s%s%s", getName(iPidStrategy).data(), getName(iParticleSpecies).data(), getName(iChargeSpecies).data()), "", hcsCalculationYield); + } } } } else { @@ -1046,7 +1055,7 @@ struct PartNumFluc { if (doprocessMc.value) { for (std::int32_t const& iParticleSpecies : std::views::iota(0, NEs)) { - if (!groupAnalysis.cfgFlagCalculationPurity.value.get(iParticleSpecies)) { + if (!groupAnalysis.cfgFlagsCalculationPurity.value.get(iParticleSpecies)) { continue; } @@ -1064,7 +1073,7 @@ struct PartNumFluc { if (doprocessMc.value) { for (std::int32_t const& iParticleSpecies : std::views::iota(0, NEs)) { - if (!groupAnalysis.cfgFlagCalculationFractionPrimary.value.get(iParticleSpecies)) { + if (!groupAnalysis.cfgFlagsCalculationFractionPrimary.value.get(iParticleSpecies)) { continue; } @@ -1080,14 +1089,14 @@ struct PartNumFluc { } } - if (nEnabled(groupAnalysis.cfgFlagCalculationFluctuation) > 1) { - LOG(fatal) << "Invalid " << groupAnalysis.cfgFlagCalculationFluctuation.name << "!"; + if (nEnabled(groupAnalysis.cfgFlagsCalculationFluctuation) > 1) { + LOG(fatal) << "Invalid " << groupAnalysis.cfgFlagsCalculationFluctuation.name << "!"; } - if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation) && groupEvent.cfgNSubgroups.value <= 0) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationFluctuation) && groupEvent.cfgNSubgroups.value <= 0) { LOG(fatal) << "Invalid " << groupEvent.cfgNSubgroups.name << "!"; } for (std::int32_t const& iParticleNumber : std::views::iota(0, NEs)) { - if (!groupAnalysis.cfgFlagCalculationFluctuation.value.get(iParticleNumber)) { + if (!groupAnalysis.cfgFlagsCalculationFluctuation.value.get(iParticleNumber)) { continue; } @@ -1117,7 +1126,7 @@ struct PartNumFluc { } for (std::int32_t const& iParticleSpecies : std::views::iota(0, NEs)) { - if (!groupAnalysis.cfgFlagCalculationFluctuation.value.get(toI(ParticleNumber::kCharge)) && !(iParticleSpecies == toI(ParticleSpecies::kKaon) && groupAnalysis.cfgFlagCalculationFluctuation.value.get(toI(ParticleNumber::kKaon))) && !(iParticleSpecies == toI(ParticleSpecies::kProton) && groupAnalysis.cfgFlagCalculationFluctuation.value.get(toI(ParticleNumber::kProton)))) { + if (!groupAnalysis.cfgFlagsCalculationFluctuation.value.get(toI(ParticleNumber::kCharge)) && !(iParticleSpecies == toI(ParticleSpecies::kKaon) && groupAnalysis.cfgFlagsCalculationFluctuation.value.get(toI(ParticleNumber::kKaon))) && !(iParticleSpecies == toI(ParticleSpecies::kProton) && groupAnalysis.cfgFlagsCalculationFluctuation.value.get(toI(ParticleNumber::kProton)))) { continue; } @@ -1150,15 +1159,15 @@ struct PartNumFluc { requires IsValid double getShiftNSigmaPid() { - if (!groupTrack.cfgFlagRecalibrationNSigmaPid.value.get(toI(particleSpecies))) { + if (!groupTrack.cfgFlagsRecalibrationNSigmaPid.value.get(toI(particleSpecies))) { return 0.; } - static const auto clampInAxis = [](const double value, const TAxis* const axis) { + static const auto clampInAxis{[](const double value, const TAxis* const axis) { const std::int32_t first{std::clamp(axis->GetFirst(), 1, axis->GetNbins())}; const std::int32_t last{std::clamp(axis->GetLast(), 1, axis->GetNbins())}; return first == last ? axis->GetBinCenter(first) : std::clamp(value, std::nextafter(axis->GetBinCenter(first), std::numeric_limits::infinity()), std::nextafter(axis->GetBinCenter(last), -std::numeric_limits::infinity())); - }; + }}; if (holderTrack.sign == 0) { return 0.; @@ -1188,17 +1197,17 @@ struct PartNumFluc { } else { constexpr std::int32_t ParticleSpeciesIndex{toI(getValue(particleSpeciesAll))}; if constexpr (pidStrategyAll == PidStrategyAll::kTpcTofSeparated) { - if (!(std::abs(holderTrack.nSigmaPid[toI(PidStrategyAll::kTpc)][ParticleSpeciesIndex]) < groupTrack.cfgCutMaxAbsNSigmaPid.value)) { + if (!(std::abs(holderTrack.nSigmaPid[toI(PidStrategyAll::kTpc)][ParticleSpeciesIndex]) < groupTrack.cfgCutsMaxAbsNSigmaPid.value.get(ParticleSpeciesIndex))) { return false; } - if (!(std::abs(holderTrack.nSigmaPid[toI(PidStrategyAll::kTof)][ParticleSpeciesIndex]) < groupTrack.cfgCutMaxAbsNSigmaPid.value)) { + if (!(std::abs(holderTrack.nSigmaPid[toI(PidStrategyAll::kTof)][ParticleSpeciesIndex]) < groupTrack.cfgCutsMaxAbsNSigmaPid.value.get(ParticleSpeciesIndex))) { return false; } if (doRejectingOthers && !(std::abs(holderTrack.nSigmaPid[toI(PidStrategyAll::kTof)][ParticleSpeciesIndex]) < std::min(std::abs(holderTrack.nSigmaPid[toI(PidStrategyAll::kTof)][(ParticleSpeciesIndex + 1) % NEs]), std::abs(holderTrack.nSigmaPid[toI(PidStrategyAll::kTof)][(ParticleSpeciesIndex + 2) % NEs])))) { return false; } } else { - if (!(std::abs(holderTrack.nSigmaPid[toI(pidStrategyAll)][ParticleSpeciesIndex]) < groupTrack.cfgCutMaxAbsNSigmaPid.value)) { + if (!(std::abs(holderTrack.nSigmaPid[toI(pidStrategyAll)][ParticleSpeciesIndex]) < groupTrack.cfgCutsMaxAbsNSigmaPid.value.get(ParticleSpeciesIndex))) { return false; } if (doRejectingOthers && !(std::abs(holderTrack.nSigmaPid[toI(pidStrategyAll)][ParticleSpeciesIndex]) < std::min(std::abs(holderTrack.nSigmaPid[toI(pidStrategyAll)][(ParticleSpeciesIndex + 1) % NEs]), std::abs(holderTrack.nSigmaPid[toI(pidStrategyAll)][(ParticleSpeciesIndex + 2) % NEs])))) { @@ -1245,7 +1254,7 @@ struct PartNumFluc { { if (!groupTrack.cfgFlagRecalibrationDca.value) { for (std::int32_t const& iDcaAxis : std::views::iota(0, NEs)) { - if (!(std::abs(holderTrack.dca[iDcaAxis]) < groupTrack.cfgCutMaxAbsNSigmaDca.value.get(iDcaAxis))) { + if (!(std::abs(holderTrack.dca[iDcaAxis]) < groupTrack.cfgCutsMaxAbsNSigmaDca.value.get(iDcaAxis))) { return false; } } @@ -1256,7 +1265,7 @@ struct PartNumFluc { const std::int32_t chargeSpeciesIndex{holderTrack.sign > 0 ? toI(ChargeSpecies::kPlus) : toI(ChargeSpecies::kMinus)}; const std::array>, NEs>, NEs>& fPtDcaGroup{holderCcdb.fPtDca.at(std::abs(holderEvent.runGroupIndex) - 1)}; for (std::int32_t const& iDcaAxis : std::views::iota(0, NEs)) { - if (!fPtDcaGroup[toI(DcaKind::kMean)][iDcaAxis][chargeSpeciesIndex] || !fPtDcaGroup[toI(DcaKind::kSigma)][iDcaAxis][chargeSpeciesIndex] || !(std::abs(holderTrack.dca[iDcaAxis] - fPtDcaGroup[toI(DcaKind::kMean)][iDcaAxis][chargeSpeciesIndex]->Eval(holderTrack.pt)) < groupTrack.cfgCutMaxAbsNSigmaDca.value.get(iDcaAxis) * fPtDcaGroup[toI(DcaKind::kSigma)][iDcaAxis][chargeSpeciesIndex]->Eval(holderTrack.pt))) { + if (!fPtDcaGroup[toI(DcaKind::kMean)][iDcaAxis][chargeSpeciesIndex] || !fPtDcaGroup[toI(DcaKind::kSigma)][iDcaAxis][chargeSpeciesIndex] || !(std::abs(holderTrack.dca[iDcaAxis] - fPtDcaGroup[toI(DcaKind::kMean)][iDcaAxis][chargeSpeciesIndex]->Eval(holderTrack.pt)) < groupTrack.cfgCutsMaxAbsNSigmaDca.value.get(iDcaAxis) * fPtDcaGroup[toI(DcaKind::kSigma)][iDcaAxis][chargeSpeciesIndex]->Eval(holderTrack.pt))) { return false; } } @@ -1309,17 +1318,18 @@ struct PartNumFluc { requires IsValid void fillQaRunByTrackByChargeSpecies(const T& track) { - const auto fill = [&](const auto& name, const auto value) { + const auto fill{[&](const auto& name, const auto value) { hrQaRun.fill(C_CS("QaRun/pRunIndex") + name + C_CS("_") + C_SV(getName(chargeSpecies)), holderEvent.runIndex, value); - }; - const auto fillNSigmaPidByDetectorParticleSpecies = [&] - requires IsValid(detector), particleSpecies> - () { - const double nSigmaPid{holderTrack.nSigmaPid[toI(getValue(detector))][toI(particleSpecies)]}; - if (std::abs(nSigmaPid) < HolderTrack::TruncationAbsNSigmaPid) { - fill(C_SV(getName(detector)) + C_CS("NSigma") + C_SV(getName(particleSpecies)), nSigmaPid); - } - }; // NOLINT(readability/braces) + }}; + const auto fillNSigmaPidByDetectorParticleSpecies{ + [&] + requires IsValid(detector), particleSpecies> + () { + const double nSigmaPid{holderTrack.nSigmaPid[toI(getValue(detector))][toI(particleSpecies)]}; + if (std::abs(nSigmaPid) < HolderTrack::TruncationAbsNSigmaPid) { + fill(C_SV(getName(detector)) + C_CS("NSigma") + C_SV(getName(particleSpecies)), nSigmaPid); + } + }}; // NOLINT(readability/braces) fill(C_CS("ItsNCls"), track.itsNCls()); fill(C_CS("ItsChi2NCls"), track.itsChi2NCl()); @@ -1351,9 +1361,9 @@ struct PartNumFluc { requires IsValid void fillQaRunByEventByChargeSpecies() { - const auto fill = [&](const auto& name, const auto value) { + const auto fill{[&](const auto& name, const auto value) { hrQaRun.fill(C_CS("QaRun/pRunIndex") + name + C_CS("_") + C_SV(getName(chargeSpecies)), holderEvent.runIndex, value); - }; + }}; fill(C_CS("NGlobalTracks"), holderEvent.nGlobalTracks[toI(chargeSpecies)]); fill(C_CS("NPvContributors"), holderEvent.nPvContributors[toI(chargeSpecies)]); @@ -1370,9 +1380,9 @@ struct PartNumFluc { requires IsValid void fillQaTrackByChargeSpecies(const T& track) { - const auto fill = [&](const auto& name, const auto... positionAndWeight) { + const auto fill{[&](const auto& name, const auto... positionAndWeight) { hrQaTrack.fill(C_CS("QaTrack/h") + name + C_CS("_") + C_SV(getName(chargeSpecies)), positionAndWeight...); - }; + }}; fill(C_CS("ItsNCls"), track.itsNCls()); fill(C_CS("ItsChi2NCls"), track.itsChi2NCl()); @@ -1385,12 +1395,13 @@ struct PartNumFluc { requires IsValid void fillQaDcaByChargeSpecies() { - const auto fillByDcaAxis = [&] - requires IsValid - () { - hrQaDca.fill(C_CS("QaDca/hPtDca") + C_SV(getName(dcaAxis)) + C_CS("_") + C_SV(getName(chargeSpecies)), holderTrack.pt, holderTrack.dca[toI(dcaAxis)]); - hrQaDca.fill(C_CS("QaDca/pPtDca") + C_SV(getName(dcaAxis)) + C_CS("_") + C_SV(getName(chargeSpecies)), holderTrack.pt, holderTrack.dca[toI(dcaAxis)]); - }; // NOLINT(readability/braces) + const auto fillByDcaAxis{ + [&] + requires IsValid + () { + hrQaDca.fill(C_CS("QaDca/hPtDca") + C_SV(getName(dcaAxis)) + C_CS("_") + C_SV(getName(chargeSpecies)), holderTrack.pt, holderTrack.dca[toI(dcaAxis)]); + hrQaDca.fill(C_CS("QaDca/pPtEtaPhiIuDca") + C_SV(getName(dcaAxis)) + C_CS("_") + C_SV(getName(chargeSpecies)), holderTrack.pt, holderTrack.eta, holderTrack.phiIu, holderTrack.dca[toI(dcaAxis)]); + }}; // NOLINT(readability/braces) fillByDcaAxis.template operator()(); fillByDcaAxis.template operator()(); @@ -1400,24 +1411,26 @@ struct PartNumFluc { requires IsValid void fillQaAcceptancebyParticleSpeciesAll(const T& track) { - if (!groupAnalysis.cfgFlagQaAcceptance.value.get(toI(particleSpeciesAll)) || holderTrack.sign == 0) { + if (!groupAnalysis.cfgFlagsQaAcceptance.value.get(toI(particleSpeciesAll)) || holderTrack.sign == 0) { return; } - const auto fillByChargeSpecies = [&] - requires IsValid - (const auto& name, const auto value) { - const auto fillByPidStrategy = [&] - requires IsValid - () { - if (isPid(pidStrategy), particleSpeciesAll>(false)) { - hrQaAcceptance.fill(C_CS("QaAcceptance/h") + name + C_CS("Pt_") + C_SV(getName(pidStrategy)) + C_CS("Edge") + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), value, holderTrack.pt); - } - }; // NOLINT(readability/braces) + const auto fillByChargeSpecies{ + [&] + requires IsValid + (const auto& name, const auto value) { + const auto fillByPidStrategy{ + [&] + requires IsValid + () { + if (isPid(pidStrategy), particleSpeciesAll>(false)) { + hrQaAcceptance.fill(C_CS("QaAcceptance/h") + name + C_CS("Pt_") + C_SV(getName(pidStrategy)) + C_CS("Edge") + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), value, holderTrack.pt); + } + }}; // NOLINT(readability/braces) - fillByPidStrategy.template operator()(); - fillByPidStrategy.template operator()(); - }; // NOLINT(readability/braces) + fillByPidStrategy.template operator()(); + fillByPidStrategy.template operator()(); + }}; // NOLINT(readability/braces) if constexpr (particleSpeciesAll == ParticleSpeciesAll::kAll) { if (holderTrack.sign > 0) { @@ -1438,7 +1451,7 @@ struct PartNumFluc { requires IsValid && (dataMode != DataMode::kMcMcParticle) void fillQaPhiByParticleSpeciesAll() { - if (!groupAnalysis.cfgFlagQaPhi.value.get(toI(particleSpeciesAll))) { + if (!groupAnalysis.cfgFlagsQaPhi.value.get(toI(particleSpeciesAll))) { return; } @@ -1447,28 +1460,30 @@ struct PartNumFluc { return; } - const auto fillByChargeSpecies = [&] - requires IsValid - () { - const auto fillByPidStrategy = [&] - requires IsValid + const auto fillByChargeSpecies{ + [&] + requires IsValid () { - if constexpr (dataMode == DataMode::kMcTrack) { - if (isPid() && isPid(pidStrategy), particleSpeciesAll>(false)) { - hrQaPhi.fill(C_CS("QaPhi/hCentralityPtEtaPhi_mc") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.phi); - hrQaPhi.fill(C_CS("QaPhi/hCentralityPtEtaPhiIu_mc") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.phiIu); - } - } else { // dataMode == DataMode::kRawTrack - if (isPid(pidStrategy), particleSpeciesAll>(false)) { - hrQaPhi.fill(C_CS("QaPhi/hCentralityPtEtaPhi_") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.phi); - hrQaPhi.fill(C_CS("QaPhi/hCentralityPtEtaPhiIu_") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.phiIu); - } - } - }; // NOLINT(readability/braces) + const auto fillByPidStrategy{ + [&] + requires IsValid + () { + if constexpr (dataMode == DataMode::kMcTrack) { + if (isPid() && isPid(pidStrategy), particleSpeciesAll>(false)) { + hrQaPhi.fill(C_CS("QaPhi/hCentralityPtEtaPhi_mc") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.phi); + hrQaPhi.fill(C_CS("QaPhi/hCentralityPtEtaPhiIu_mc") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.phiIu); + } + } else { // dataMode == DataMode::kRawTrack + if (isPid(pidStrategy), particleSpeciesAll>(false)) { + hrQaPhi.fill(C_CS("QaPhi/hCentralityPtEtaPhi_") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.phi); + hrQaPhi.fill(C_CS("QaPhi/hCentralityPtEtaPhiIu_") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.phiIu); + } + } + }}; // NOLINT(readability/braces) - fillByPidStrategy.template operator()(); - fillByPidStrategy.template operator()(); - }; // NOLINT(readability/braces) + fillByPidStrategy.template operator()(); + fillByPidStrategy.template operator()(); + }}; // NOLINT(readability/braces) if (chargeSign > 0) { fillByChargeSpecies.template operator()(); @@ -1481,7 +1496,7 @@ struct PartNumFluc { requires IsValid && (dataMode != DataMode::kMcMcParticle) void fillQaPidByParticleSpeciesAll(const T& track) { - if (!groupAnalysis.cfgFlagQaPid.value.get(toI(particleSpeciesAll)) || holderTrack.sign == 0) { + if (!groupAnalysis.cfgFlagsQaPid.value.get(toI(particleSpeciesAll)) || holderTrack.sign == 0) { return; } @@ -1493,25 +1508,26 @@ struct PartNumFluc { hrQaPid.fill(C_CS("QaPid/hCentralityPOverQEtaTofInverseBeta"), holderEvent.centrality, holderTrack.p / holderTrack.sign, holderTrack.eta, 1. / track.beta()); } } else { - const auto fillByChargeSpecies = [&] - requires IsValid - () { - if constexpr (dataMode == DataMode::kMcTrack) { - if (isPid()) { - hrQaPid.fill(C_CS("QaPid/hCentralityPtEta") + C_SV(getName(Detector::kTpc)) + C_CS("NSigma") + C_SV(getName(particleSpeciesAll)) + C_CS("_mc") + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.nSigmaPid[toI(PidStrategyAll::kTpc)][toI(particleSpeciesAll)]); - hrQaPid.fill(C_CS("QaPid/hCentralityPtEta") + C_SV(getName(Detector::kTof)) + C_CS("NSigma") + C_SV(getName(particleSpeciesAll)) + C_CS("_mc") + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.nSigmaPid[toI(PidStrategyAll::kTof)][toI(particleSpeciesAll)]); - } - } else { // dataMode == DataMode::kRawTrack - hrQaPid.fill(C_CS("QaPid/hCentralityPtEta") + C_SV(getName(Detector::kTpc)) + C_CS("NSigma") + C_SV(getName(particleSpeciesAll)) + C_CS("_") + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.nSigmaPid[toI(PidStrategyAll::kTpc)][toI(particleSpeciesAll)]); - if (isPid(false)) { - hrQaPid.fill(C_CS("QaPid/hCentralityPtEta") + C_SV(getName(Detector::kTpc)) + C_CS("NSigma") + C_SV(getName(particleSpeciesAll)) + C_CS("_") + C_SV(getName(Detector::kTof)) + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.nSigmaPid[toI(PidStrategyAll::kTpc)][toI(particleSpeciesAll)]); - } - if (isPid(false)) { - hrQaPid.fill(C_CS("QaPid/hCentralityPtEta") + C_SV(getName(Detector::kTof)) + C_CS("NSigma") + C_SV(getName(particleSpeciesAll)) + C_CS("_") + C_SV(getName(Detector::kTpc)) + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.nSigmaPid[toI(PidStrategyAll::kTof)][toI(particleSpeciesAll)]); + const auto fillByChargeSpecies{ + [&] + requires IsValid + () { + if constexpr (dataMode == DataMode::kMcTrack) { + if (isPid()) { + hrQaPid.fill(C_CS("QaPid/hCentralityPtEta") + C_SV(getName(Detector::kTpc)) + C_CS("NSigma") + C_SV(getName(particleSpeciesAll)) + C_CS("_mc") + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.nSigmaPid[toI(PidStrategyAll::kTpc)][toI(particleSpeciesAll)]); + hrQaPid.fill(C_CS("QaPid/hCentralityPtEta") + C_SV(getName(Detector::kTof)) + C_CS("NSigma") + C_SV(getName(particleSpeciesAll)) + C_CS("_mc") + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.nSigmaPid[toI(PidStrategyAll::kTof)][toI(particleSpeciesAll)]); + } + } else { // dataMode == DataMode::kRawTrack + hrQaPid.fill(C_CS("QaPid/hCentralityPtEta") + C_SV(getName(Detector::kTpc)) + C_CS("NSigma") + C_SV(getName(particleSpeciesAll)) + C_CS("_") + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.nSigmaPid[toI(PidStrategyAll::kTpc)][toI(particleSpeciesAll)]); + if (isPid(false)) { + hrQaPid.fill(C_CS("QaPid/hCentralityPtEta") + C_SV(getName(Detector::kTpc)) + C_CS("NSigma") + C_SV(getName(particleSpeciesAll)) + C_CS("_") + C_SV(getName(Detector::kTof)) + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.nSigmaPid[toI(PidStrategyAll::kTpc)][toI(particleSpeciesAll)]); + } + if (isPid(false)) { + hrQaPid.fill(C_CS("QaPid/hCentralityPtEta") + C_SV(getName(Detector::kTof)) + C_CS("NSigma") + C_SV(getName(particleSpeciesAll)) + C_CS("_") + C_SV(getName(Detector::kTpc)) + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.nSigmaPid[toI(PidStrategyAll::kTof)][toI(particleSpeciesAll)]); + } + hrQaPid.fill(C_CS("QaPid/hCentralityPtEta") + C_SV(getName(PidStrategy::kTpcTof)) + C_CS("NSigma") + C_SV(getName(particleSpeciesAll)) + C_CS("_") + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.nSigmaPid[toI(PidStrategyAll::kTpcTofCombined)][toI(particleSpeciesAll)]); } - hrQaPid.fill(C_CS("QaPid/hCentralityPtEta") + C_SV(getName(PidStrategy::kTpcTof)) + C_CS("NSigma") + C_SV(getName(particleSpeciesAll)) + C_CS("_") + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.nSigmaPid[toI(PidStrategyAll::kTpcTofCombined)][toI(particleSpeciesAll)]); - } - }; // NOLINT(readability/braces) + }}; // NOLINT(readability/braces) if (holderTrack.sign > 0) { fillByChargeSpecies.template operator()(); @@ -1525,7 +1541,7 @@ struct PartNumFluc { requires IsValid void fillCalculationYieldByParticleSpecies() { - if (!groupAnalysis.cfgFlagCalculationYield.value.get(toI(particleSpecies))) { + if (!groupAnalysis.cfgFlagsCalculationYield.value.get(toI(particleSpecies))) { return; } @@ -1534,33 +1550,38 @@ struct PartNumFluc { return; } - const auto fillByChargeSpecies = [&] - requires IsValid - () { - if constexpr (dataMode == DataMode::kMcMcParticle) { - if (isPid(particleSpecies), chargeSpecies>()) { - hrCalculationYield.fill(C_CS("CalculationYield/hVzCentralityPtEtaMc_mc") + C_SV(getName(particleSpecies)) + C_SV(getName(chargeSpecies)), holderEvent.vz, holderEvent.centrality, holderMcParticle.pt, holderMcParticle.eta); - } - } else { - const auto fillByPidStrategy = [&] - requires IsValid - () { - if constexpr (dataMode == DataMode::kMcTrack) { - if (isPid(particleSpecies), chargeSpecies>() && isPid(pidStrategy), getValue(particleSpecies)>(groupTrack.cfgFlagRejectionOthers.value)) { - hrCalculationYield.fill(C_CS("CalculationYield/hVzCentralityPtEtaMc_mc") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpecies)) + C_SV(getName(chargeSpecies)), holderEvent.vz, holderEvent.centrality, holderMcParticle.pt, holderMcParticle.eta); - hrCalculationYield.fill(C_CS("CalculationYield/hVzCentralityPtEta_mc") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpecies)) + C_SV(getName(chargeSpecies)), holderEvent.vz, holderEvent.centrality, holderTrack.pt, holderTrack.eta); - } - } else { // dataMode == DataMode::kRawTrack - if (isPid(pidStrategy), getValue(particleSpecies)>(groupTrack.cfgFlagRejectionOthers.value)) { - hrCalculationYield.fill(C_CS("CalculationYield/hVzCentralityPtEta_") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpecies)) + C_SV(getName(chargeSpecies)), holderEvent.vz, holderEvent.centrality, holderTrack.pt, holderTrack.eta); - } + const auto fillByChargeSpecies{ + [&] + requires IsValid + () { + if constexpr (dataMode == DataMode::kMcMcParticle) { + if (isPid(particleSpecies), chargeSpecies>()) { + hrCalculationYield.fill(C_CS("CalculationYield/hVzCentralityPtMcEtaMc_mc") + C_SV(getName(particleSpecies)) + C_SV(getName(chargeSpecies)), holderEvent.vz, holderEvent.centrality, holderMcParticle.pt, holderMcParticle.eta); } - }; // NOLINT(readability/braces) + } else { + const auto fillByPidStrategy{ + [&] + requires IsValid + () { + if constexpr (dataMode == DataMode::kMcTrack) { + if (isPid(particleSpecies), chargeSpecies>() && isPid(pidStrategy), getValue(particleSpecies)>(groupTrack.cfgFlagRejectionOthers.value)) { + if (groupTrack.cfgFlagMcParticleMomentum.value) { + hrCalculationYield.fill(C_CS("CalculationYield/hVzCentralityPtMcEtaMc_mc") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpecies)) + C_SV(getName(chargeSpecies)), holderEvent.vz, holderEvent.centrality, holderMcParticle.pt, holderMcParticle.eta); + } else { + hrCalculationYield.fill(C_CS("CalculationYield/hVzCentralityPtEta_mc") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpecies)) + C_SV(getName(chargeSpecies)), holderEvent.vz, holderEvent.centrality, holderTrack.pt, holderTrack.eta); + } + } + } else { // dataMode == DataMode::kRawTrack + if (isPid(pidStrategy), getValue(particleSpecies)>(groupTrack.cfgFlagRejectionOthers.value)) { + hrCalculationYield.fill(C_CS("CalculationYield/hVzCentralityPtEta_") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpecies)) + C_SV(getName(chargeSpecies)), holderEvent.vz, holderEvent.centrality, holderTrack.pt, holderTrack.eta); + } + } + }}; // NOLINT(readability/braces) - fillByPidStrategy.template operator()(); - fillByPidStrategy.template operator()(); - } - }; // NOLINT(readability/braces) + fillByPidStrategy.template operator()(); + fillByPidStrategy.template operator()(); + } + }}; // NOLINT(readability/braces) if (chargeSign > 0) { fillByChargeSpecies.template operator()(); @@ -1573,24 +1594,26 @@ struct PartNumFluc { requires IsValid void fillCalculationPurityByParticleSpecies() { - if (!groupAnalysis.cfgFlagCalculationPurity.value.get(toI(particleSpecies)) || holderTrack.sign == 0) { + if (!groupAnalysis.cfgFlagsCalculationPurity.value.get(toI(particleSpecies)) || holderTrack.sign == 0) { return; } - const auto fillByChargeSpecies = [&] - requires IsValid - () { - const auto fillByPidStrategy = [&] - requires IsValid + const auto fillByChargeSpecies{ + [&] + requires IsValid () { - if (isPid(pidStrategy), getValue(particleSpecies)>(groupTrack.cfgFlagRejectionOthers.value)) { - hrCalculationPurity.fill(C_CS("CalculationPurity/pCentralityPtEtaPurity") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpecies)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, isPid(particleSpecies), chargeSpecies>() ? 1. : 0.); - } - }; // NOLINT(readability/braces) + const auto fillByPidStrategy{ + [&] + requires IsValid + () { + if (isPid(pidStrategy), getValue(particleSpecies)>(groupTrack.cfgFlagRejectionOthers.value)) { + hrCalculationPurity.fill(C_CS("CalculationPurity/pCentralityPtEtaPurity") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpecies)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, isPid(particleSpecies), chargeSpecies>() ? 1. : 0.); + } + }}; // NOLINT(readability/braces) - fillByPidStrategy.template operator()(); - fillByPidStrategy.template operator()(); - }; // NOLINT(readability/braces) + fillByPidStrategy.template operator()(); + fillByPidStrategy.template operator()(); + }}; // NOLINT(readability/braces) if (holderTrack.sign > 0) { fillByChargeSpecies.template operator()(); @@ -1603,24 +1626,26 @@ struct PartNumFluc { requires IsValid void fillCalculationFractionPrimaryByParticleSpecies(const MP& mcParticle) { - if (!groupAnalysis.cfgFlagCalculationFractionPrimary.value.get(toI(particleSpecies)) || holderTrack.sign == 0) { + if (!groupAnalysis.cfgFlagsCalculationFractionPrimary.value.get(toI(particleSpecies)) || holderTrack.sign == 0) { return; } - const auto fillByChargeSpecies = [&] - requires IsValid - () { - const auto fillByPidStrategy = [&] - requires IsValid + const auto fillByChargeSpecies{ + [&] + requires IsValid () { - if (isPid(particleSpecies), chargeSpecies>() && isPid(pidStrategy), getValue(particleSpecies)>(groupTrack.cfgFlagRejectionOthers.value)) { - hrCalculationFractionPrimary.fill(C_CS("CalculationFractionPrimary/pCentralityPtEtaFractionPrimary") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpecies)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, mcParticle.isPhysicalPrimary() ? 1. : 0.); - } - }; // NOLINT(readability/braces) + const auto fillByPidStrategy{ + [&] + requires IsValid + () { + if (isPid(particleSpecies), chargeSpecies>() && isPid(pidStrategy), getValue(particleSpecies)>(groupTrack.cfgFlagRejectionOthers.value)) { + hrCalculationFractionPrimary.fill(C_CS("CalculationFractionPrimary/pCentralityPtEtaFractionPrimary") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpecies)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderTrack.pt, holderTrack.eta, mcParticle.isPhysicalPrimary() ? 1. : 0.); + } + }}; // NOLINT(readability/braces) - fillByPidStrategy.template operator()(); - fillByPidStrategy.template operator()(); - }; // NOLINT(readability/braces) + fillByPidStrategy.template operator()(); + fillByPidStrategy.template operator()(); + }}; // NOLINT(readability/braces) if (holderTrack.sign > 0) { fillByChargeSpecies.template operator()(); @@ -1632,7 +1657,7 @@ struct PartNumFluc { void initCalculationFluctuation() { for (std::int32_t const& iParticleNumber : std::views::iota(0, NEs)) { - if (groupAnalysis.cfgFlagCalculationFluctuation.value.get(iParticleNumber)) { + if (groupAnalysis.cfgFlagsCalculationFluctuation.value.get(iParticleNumber)) { for (std::int32_t const& iChargeNumber : std::views::iota(0, NEs)) { fluctuationCalculatorTrack[iParticleNumber][iChargeNumber]->init(); } @@ -1644,7 +1669,7 @@ struct PartNumFluc { requires IsValid void calculateFluctuationByParticleNumber() { - if (!groupAnalysis.cfgFlagCalculationFluctuation.value.get(toI(particleNumber))) { + if (!groupAnalysis.cfgFlagsCalculationFluctuation.value.get(toI(particleNumber))) { return; } @@ -1659,61 +1684,64 @@ struct PartNumFluc { } if constexpr (dataMode == DataMode::kMcMcParticle) { - ++holderDerivedData.nMcParticlesChargedIn; + ++holderDerivedData.nMcParticles[toI(chargeSign > 0 ? ChargeSpecies::kPlus : ChargeSpecies::kMinus)]; } else { - ++holderDerivedData.nTracksIn; + ++holderDerivedData.nTracks[toI(chargeSign > 0 ? ChargeSpecies::kPlus : ChargeSpecies::kMinus)]; } - const auto calculateByParticleSpecies = [&] - requires IsValid && (particleNumber == ParticleNumber::kCharge || (particleNumber == ParticleNumber::kKaon && particleSpecies == ParticleSpecies::kKaon) || (particleNumber == ParticleNumber::kProton && particleSpecies == ParticleSpecies::kProton)) - () { - const auto calculateByChargeSpecies = [&] - requires IsValid + const auto calculateByParticleSpecies{ + [&] + requires IsValid && (particleNumber == ParticleNumber::kCharge || (particleNumber == ParticleNumber::kKaon && particleSpecies == ParticleSpecies::kKaon) || (particleNumber == ParticleNumber::kProton && particleSpecies == ParticleSpecies::kProton)) () { - if constexpr (dataMode != DataMode::kRawTrack) { - if (!isPid(particleSpecies), chargeSpecies>()) { - return; - } - } + const auto calculateByChargeSpecies{ + [&] + requires IsValid + () { + if constexpr (dataMode != DataMode::kRawTrack) { + if (!isPid(particleSpecies), chargeSpecies>()) { + return; + } + } - const bool doUsingTofPid{(doUsingMcParticleMomentum ? holderMcParticle.pt : holderTrack.pt) >= groupTrack.cfgThresholdPtTofPid.value.get(toI(particleSpecies))}; - if constexpr (dataMode != DataMode::kMcMcParticle) { - if (!(doUsingTofPid ? isPid(PidStrategy::kTpcTof), getValue(particleSpecies)>(groupTrack.cfgFlagRejectionOthers.value) : isPid(PidStrategy::kTpc), getValue(particleSpecies)>(groupTrack.cfgFlagRejectionOthers.value))) { - return; - } - } + const bool doUsingTofPid{(doUsingMcParticleMomentum ? holderMcParticle.pt : holderTrack.pt) >= groupTrack.cfgThresholdsPtTofPid.value.get(toI(particleSpecies))}; + if constexpr (dataMode != DataMode::kMcMcParticle) { + if (!(doUsingTofPid ? isPid(PidStrategy::kTpcTof), getValue(particleSpecies)>(groupTrack.cfgFlagRejectionOthers.value) : isPid(PidStrategy::kTpc), getValue(particleSpecies)>(groupTrack.cfgFlagRejectionOthers.value))) { + return; + } + } - const double efficiency{doUsingTofPid ? getEfficiency(doUsingMcParticleMomentum) : getEfficiency(doUsingMcParticleMomentum)}; - const auto fill = [&] { - if constexpr (chargeSpecies == ChargeSpecies::kPlus) { - fluctuationCalculatorTrack[toI(particleNumber)][toI(ChargeNumber::kPlus)]->fill(1., efficiency); - fluctuationCalculatorTrack[toI(particleNumber)][toI(ChargeNumber::kNet)]->fill(1., efficiency); - } else { - fluctuationCalculatorTrack[toI(particleNumber)][toI(ChargeNumber::kMinus)]->fill(1., efficiency); - fluctuationCalculatorTrack[toI(particleNumber)][toI(ChargeNumber::kNet)]->fill(-1., efficiency); - } - fluctuationCalculatorTrack[toI(particleNumber)][toI(ChargeNumber::kTotal)]->fill(1., efficiency); - }; - if constexpr (dataMode == DataMode::kMcMcParticle) { - ++holderMcEvent.numbers[toI(particleNumber)][toI(chargeSpecies)]; - if (gRandom->Rndm() < efficiency) { - ++holderMcEvent.numbersEff[toI(particleNumber)][toI(chargeSpecies)]; - fill(); - } - holderDerivedData.signedEfficienciesMcParticle.push_back(HolderDerivedData::convertRound(std::copysign(std::numeric_limits::max(), chargeSign) * efficiency)); + const double efficiency{doUsingTofPid ? getEfficiency(doUsingMcParticleMomentum) : getEfficiency(doUsingMcParticleMomentum)}; + const auto fill{ + [&] { + if constexpr (chargeSpecies == ChargeSpecies::kPlus) { + fluctuationCalculatorTrack[toI(particleNumber)][toI(ChargeNumber::kPlus)]->fill(1., efficiency); + fluctuationCalculatorTrack[toI(particleNumber)][toI(ChargeNumber::kNet)]->fill(1., efficiency); + } else { + fluctuationCalculatorTrack[toI(particleNumber)][toI(ChargeNumber::kMinus)]->fill(1., efficiency); + fluctuationCalculatorTrack[toI(particleNumber)][toI(ChargeNumber::kNet)]->fill(-1., efficiency); + } + fluctuationCalculatorTrack[toI(particleNumber)][toI(ChargeNumber::kTotal)]->fill(1., efficiency); + }}; + if constexpr (dataMode == DataMode::kMcMcParticle) { + ++holderMcEvent.numbers[toI(particleNumber)][toI(chargeSpecies)]; + if (gRandom->Rndm() < efficiency) { + ++holderMcEvent.numbersEff[toI(particleNumber)][toI(chargeSpecies)]; + fill(); + } + holderDerivedData.signedEfficienciesMcParticle.push_back(HolderDerivedData::convertRound(std::copysign(std::numeric_limits::max(), chargeSign) * efficiency)); + } else { + ++holderEvent.numbers[toI(particleNumber)][toI(chargeSpecies)]; + fill(); + holderDerivedData.signedEfficienciesTrack.push_back(HolderDerivedData::convertRound(std::copysign(std::numeric_limits::max(), chargeSign) * efficiency)); + } + }}; // NOLINT(readability/braces) + + if (chargeSign > 0) { + calculateByChargeSpecies.template operator()(); } else { - ++holderEvent.numbers[toI(particleNumber)][toI(chargeSpecies)]; - fill(); - holderDerivedData.signedEfficienciesTrack.push_back(HolderDerivedData::convertRound(std::copysign(std::numeric_limits::max(), chargeSign) * efficiency)); + calculateByChargeSpecies.template operator()(); } - }; // NOLINT(readability/braces) - - if (chargeSign > 0) { - calculateByChargeSpecies.template operator()(); - } else { - calculateByChargeSpecies.template operator()(); - } - }; // NOLINT(readability/braces) + }}; // NOLINT(readability/braces) if constexpr (particleNumber == ParticleNumber::kKaon) { calculateByParticleSpecies.template operator()(); @@ -1730,7 +1758,7 @@ struct PartNumFluc { requires IsValid void fillCalculationFluctuationByParticleNumber() { - if (!groupAnalysis.cfgFlagCalculationFluctuation.value.get(toI(particleNumber))) { + if (!groupAnalysis.cfgFlagsCalculationFluctuation.value.get(toI(particleNumber))) { return; } @@ -1741,17 +1769,18 @@ struct PartNumFluc { hrCalculationFluctuation.fill(C_CS("CalculationFluctuation/hCentralityN") + C_SV(getName(particleNumber)) + C_SV(getName(ChargeSpecies::kPlus)) + C_CS("N") + C_SV(getName(particleNumber)) + C_SV(getName(ChargeSpecies::kMinus)), holderEvent.centrality, holderEvent.numbers[toI(particleNumber)][toI(ChargeSpecies::kPlus)], holderEvent.numbers[toI(particleNumber)][toI(ChargeSpecies::kMinus)]); } - const auto fillByChargeNumber = [&] - requires IsValid - () { - for (std::int32_t const& iOrderKey : std::views::iota(0, fluctuation_calculator_base::NOrderKeys)) { - if constexpr (dataMode == DataMode::kMcMcParticle) { - hrCalculationFluctuation.fill(C_CS("CalculationFluctuation/hFluctuationCalculator") + C_SV(getName(particleNumber)) + C_SV(getName(chargeNumber)) + C_CS("_mc"), holderEvent.centrality, holderEvent.subgroupIndex, iOrderKey, fluctuationCalculatorTrack[toI(particleNumber)][toI(chargeNumber)]->getProduct(iOrderKey)); - } else { - hrCalculationFluctuation.fill(C_CS("CalculationFluctuation/hFluctuationCalculator") + C_SV(getName(particleNumber)) + C_SV(getName(chargeNumber)), holderEvent.centrality, holderEvent.subgroupIndex, iOrderKey, fluctuationCalculatorTrack[toI(particleNumber)][toI(chargeNumber)]->getProduct(iOrderKey)); + const auto fillByChargeNumber{ + [&] + requires IsValid + () { + for (std::int32_t const& iOrderKey : std::views::iota(0, fluctuation_calculator_base::NOrderKeys)) { + if constexpr (dataMode == DataMode::kMcMcParticle) { + hrCalculationFluctuation.fill(C_CS("CalculationFluctuation/hFluctuationCalculator") + C_SV(getName(particleNumber)) + C_SV(getName(chargeNumber)) + C_CS("_mc"), holderEvent.centrality, holderEvent.subgroupIndex, iOrderKey, fluctuationCalculatorTrack[toI(particleNumber)][toI(chargeNumber)]->getProduct(iOrderKey)); + } else { + hrCalculationFluctuation.fill(C_CS("CalculationFluctuation/hFluctuationCalculator") + C_SV(getName(particleNumber)) + C_SV(getName(chargeNumber)), holderEvent.centrality, holderEvent.subgroupIndex, iOrderKey, fluctuationCalculatorTrack[toI(particleNumber)][toI(chargeNumber)]->getProduct(iOrderKey)); + } } - } - }; // NOLINT(readability/braces) + }}; // NOLINT(readability/braces) fillByChargeNumber.template operator()(); fillByChargeNumber.template operator()(); @@ -1771,9 +1800,9 @@ struct PartNumFluc { holderTrack.eta = track.eta(); holderTrack.phi = track.phi(); { - const std::int64_t localIndexTrackIu = track.globalIndex() - tracksIu.offset(); - if (0 <= localIndexTrackIu && localIndexTrackIu < static_cast(tracksIu.size())) { - const auto& trackIu = tracksIu.iteratorAt(localIndexTrackIu); + const std::int64_t localIndexTrackIu{track.globalIndex() - static_cast(tracksIu.offset())}; + if (0 <= localIndexTrackIu && localIndexTrackIu < tracksIu.size()) { + const auto& trackIu{tracksIu.iteratorAt(localIndexTrackIu)}; if (track.globalIndex() == trackIu.globalIndex()) { holderTrack.phiIu = trackIu.phi(); } else { @@ -1853,7 +1882,7 @@ struct PartNumFluc { } if constexpr (!doInitingEvent) { - if (isEnabled(groupAnalysis.cfgFlagQaAcceptance) && (holderTrack.eta * holderEvent.vz > 0. && std::abs(holderEvent.vz) > groupEvent.cfgCutMaxAbsVz.value - 1.)) { + if (isEnabled(groupAnalysis.cfgFlagsQaAcceptance) && (holderTrack.eta * holderEvent.vz > 0. && std::abs(holderEvent.vz) > groupEvent.cfgCutMaxAbsVz.value - 1.)) { fillQaAcceptancebyParticleSpeciesAll(track); fillQaAcceptancebyParticleSpeciesAll(track); fillQaAcceptancebyParticleSpeciesAll(track); @@ -1907,9 +1936,15 @@ struct PartNumFluc { } hrCounter.fill(C_CS("hNEvents"), 0.); + if (groupAnalysis.cfgFlagQaCentrality.value) { + hrQaCentrality.fill(C_CS("QaCentrality/hCentralitySelection"), holderEvent.centrality, 0.); + } if (!collision.has_foundBC()) { hrCounter.fill(C_CS("hNEvents"), 2.); + if (groupAnalysis.cfgFlagQaCentrality.value) { + hrQaCentrality.fill(C_CS("QaCentrality/hCentralitySelection"), holderEvent.centrality, 2.); + } return false; } @@ -1918,6 +1953,9 @@ struct PartNumFluc { if (holderCcdb.runNumbersIndicesGroupIndices.find(holderEvent.runNumber) == holderCcdb.runNumbersIndicesGroupIndices.end()) { hrCounter.fill(C_CS("hNEvents"), 2.); + if (groupAnalysis.cfgFlagQaCentrality.value) { + hrQaCentrality.fill(C_CS("QaCentrality/hCentralitySelection"), holderEvent.centrality, 2.); + } return false; } @@ -1925,11 +1963,17 @@ struct PartNumFluc { if (holderEvent.runGroupIndex == 0 || (groupEvent.cfgFlagRejectionRunBad.value && holderEvent.runGroupIndex < 0)) { hrCounter.fill(C_CS("hNEvents"), 2.); + if (groupAnalysis.cfgFlagQaCentrality.value) { + hrQaCentrality.fill(C_CS("QaCentrality/hCentralitySelection"), holderEvent.centrality, 2.); + } return false; } if (!groupEvent.cfgLabelFlagsRct.value.empty() && !rctFlagsChecker.checkTable(collision)) { hrCounter.fill(C_CS("hNEvents"), 3.); + if (groupAnalysis.cfgFlagQaCentrality.value) { + hrQaCentrality.fill(C_CS("QaCentrality/hCentralitySelection"), holderEvent.centrality, 3.); + } return false; } @@ -1937,12 +1981,19 @@ struct PartNumFluc { if (((groupEvent.cfgBitsSelectionEvent.value >> iEvSel) & 1) && !collision.selection_bit(iEvSel)) { hrCounter.fill(C_CS("hNEvents"), 4.); hrCounter.fill(C_CS("hNEvents"), 10. + iEvSel); + if (groupAnalysis.cfgFlagQaCentrality.value) { + hrQaCentrality.fill(C_CS("QaCentrality/hCentralitySelection"), holderEvent.centrality, 4.); + hrQaCentrality.fill(C_CS("QaCentrality/hCentralitySelection"), holderEvent.centrality, 10. + iEvSel); + } return false; } } if (groupEvent.cfgFlagInelEvent.value && !collision.isInelGt0()) { hrCounter.fill(C_CS("hNEvents"), 5.); + if (groupAnalysis.cfgFlagQaCentrality.value) { + hrQaCentrality.fill(C_CS("QaCentrality/hCentralitySelection"), holderEvent.centrality, 5.); + } return false; } @@ -1953,6 +2004,9 @@ struct PartNumFluc { if (!(std::abs(holderEvent.vz) < groupEvent.cfgCutMaxAbsVz.value)) { hrCounter.fill(C_CS("hNEvents"), 6.); + if (groupAnalysis.cfgFlagQaCentrality.value) { + hrQaCentrality.fill(C_CS("QaCentrality/hCentralitySelection"), holderEvent.centrality, 6.); + } return false; } @@ -2005,10 +2059,16 @@ struct PartNumFluc { if (!(holderEvent.getNPvContributors() - holderEvent.getNGlobalTracks() > groupEvent.cfgCutMinDeviationNPvContributors.value)) { hrCounter.fill(C_CS("hNEvents"), 7.); + if (groupAnalysis.cfgFlagQaCentrality.value) { + hrQaCentrality.fill(C_CS("QaCentrality/hCentralitySelection"), holderEvent.centrality, 7.); + } return false; } hrCounter.fill(C_CS("hNEvents"), 1.); + if (groupAnalysis.cfgFlagQaCentrality.value) { + hrQaCentrality.fill(C_CS("QaCentrality/hCentralitySelection"), holderEvent.centrality, 1.); + } if (groupAnalysis.cfgFlagQaEvent.value) { if (holderEvent.getNGlobalTracks() > 0) { @@ -2019,9 +2079,7 @@ struct PartNumFluc { } if (groupAnalysis.cfgFlagQaCentrality.value) { - hrQaCentrality.fill(C_CS("QaCentrality/hCentralityFt0a"), collision.centFT0A(), collision.multZeqFT0A()); - hrQaCentrality.fill(C_CS("QaCentrality/hCentralityFt0c"), collision.centFT0C(), collision.multZeqFT0C()); - hrQaCentrality.fill(C_CS("QaCentrality/hCentralityFt0m"), collision.centFT0M(), collision.multZeqFT0A() + collision.multZeqFT0C()); + hrQaCentrality.fill(C_CS("QaCentrality/hCentralityMultiplicity"), holderEvent.centrality, collision.multNTracksPVeta1()); } return true; @@ -2072,11 +2130,11 @@ struct PartNumFluc { void processRaw(const soa::Filtered::iterator& collision, const soa::Filtered& tracks, const aod::TracksIU& tracksIu, const aod::BCsWithTimestamps&) { - if (!initEvent(collision, tracks, tracksIu) || (!groupAnalysis.cfgFlagQaTrack.value && !groupAnalysis.cfgFlagQaDca.value && !isEnabled(groupAnalysis.cfgFlagQaAcceptance) && !isEnabled(groupAnalysis.cfgFlagQaPhi) && !isEnabled(groupAnalysis.cfgFlagQaPid) && !isEnabled(groupAnalysis.cfgFlagCalculationYield) && !isEnabled(groupAnalysis.cfgFlagCalculationFluctuation))) { + if (!initEvent(collision, tracks, tracksIu) || (!groupAnalysis.cfgFlagQaTrack.value && !groupAnalysis.cfgFlagQaDca.value && !isEnabled(groupAnalysis.cfgFlagsQaAcceptance) && !isEnabled(groupAnalysis.cfgFlagsQaPhi) && !isEnabled(groupAnalysis.cfgFlagsQaPid) && !isEnabled(groupAnalysis.cfgFlagsCalculationYield) && !isEnabled(groupAnalysis.cfgFlagsCalculationFluctuation))) { return; } - if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation)) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationFluctuation)) { holderEvent.subgroupIndex = gRandom->Integer(groupEvent.cfgNSubgroups.value); initCalculationFluctuation(); holderDerivedData.clear(); @@ -2087,46 +2145,42 @@ struct PartNumFluc { continue; } - const bool isGood{initTrack(track, tracksIu)}; - if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation) && holderTrack.sign != 0) { - ++holderDerivedData.nTracksAll; - } - if (!isGood) { + if (!initTrack(track, tracksIu)) { continue; } - if (isEnabled(groupAnalysis.cfgFlagQaPhi)) { + if (isEnabled(groupAnalysis.cfgFlagsQaPhi)) { fillQaPhiByParticleSpeciesAll(); fillQaPhiByParticleSpeciesAll(); fillQaPhiByParticleSpeciesAll(); fillQaPhiByParticleSpeciesAll(); } - if (isEnabled(groupAnalysis.cfgFlagQaPid)) { + if (isEnabled(groupAnalysis.cfgFlagsQaPid)) { fillQaPidByParticleSpeciesAll(track); fillQaPidByParticleSpeciesAll(track); fillQaPidByParticleSpeciesAll(track); fillQaPidByParticleSpeciesAll(track); } - if (isEnabled(groupAnalysis.cfgFlagCalculationYield)) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationYield)) { fillCalculationYieldByParticleSpecies(); fillCalculationYieldByParticleSpecies(); fillCalculationYieldByParticleSpecies(); } - if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation)) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationFluctuation)) { calculateFluctuationByParticleNumber(); calculateFluctuationByParticleNumber(); calculateFluctuationByParticleNumber(); } } - if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation)) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationFluctuation)) { fillCalculationFluctuationByParticleNumber(); fillCalculationFluctuationByParticleNumber(); fillCalculationFluctuationByParticleNumber(); - miniCollision(HolderDerivedData::convertFloor(holderEvent.vz * 10.), HolderDerivedData::convertFloor(holderEvent.centrality * 500.), holderDerivedData.nTracksAll, holderDerivedData.nTracksIn); + miniCollision(HolderDerivedData::convertFloor(holderEvent.vz * 10.), HolderDerivedData::convertFloor(holderEvent.centrality * 500.), holderDerivedData.nTracks[toI(ChargeSpecies::kPlus)], holderDerivedData.nTracks[toI(ChargeSpecies::kMinus)]); for (auto const& signedEfficiency : holderDerivedData.signedEfficienciesTrack) { miniTrack(miniCollision.lastIndex(), signedEfficiency); } @@ -2153,11 +2207,11 @@ struct PartNumFluc { } if (groupAnalysis.cfgFlagQaMc.value) { - hrQaMc.fill(C_CS("QaMc/hCentralityVzDeltaVz"), holderEvent.centrality, holderEvent.vz, holderEvent.vz - holderMcEvent.vz); + hrQaMc.fill(C_CS("QaMc/hCentralityVzMcDeltaVz"), holderEvent.centrality, holderMcEvent.vz, holderEvent.vz - holderMcEvent.vz); } - if (isEnabled(groupAnalysis.cfgFlagCalculationYield) || isEnabled(groupAnalysis.cfgFlagCalculationFluctuation)) { - if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation)) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationYield) || isEnabled(groupAnalysis.cfgFlagsCalculationFluctuation)) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationFluctuation)) { holderEvent.subgroupIndex = gRandom->Integer(groupEvent.cfgNSubgroups.value); initCalculationFluctuation(); holderDerivedData.clear(); @@ -2168,36 +2222,32 @@ struct PartNumFluc { continue; } - const bool isGood{initMcParticle(mcParticle)}; - if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation) && holderMcParticle.charge != 0) { - ++holderDerivedData.nMcParticlesChargedAll; - } - if (!isGood) { + if (!initMcParticle(mcParticle)) { continue; } - if (isEnabled(groupAnalysis.cfgFlagCalculationYield)) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationYield)) { fillCalculationYieldByParticleSpecies(); fillCalculationYieldByParticleSpecies(); fillCalculationYieldByParticleSpecies(); } - if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation)) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationFluctuation)) { calculateFluctuationByParticleNumber(); calculateFluctuationByParticleNumber(); calculateFluctuationByParticleNumber(); } } - if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation)) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationFluctuation)) { fillCalculationFluctuationByParticleNumber(); fillCalculationFluctuationByParticleNumber(); fillCalculationFluctuationByParticleNumber(); } } - if (groupAnalysis.cfgFlagQaTrack.value || groupAnalysis.cfgFlagQaDca.value || isEnabled(groupAnalysis.cfgFlagQaAcceptance) || isEnabled(groupAnalysis.cfgFlagQaPhi) || isEnabled(groupAnalysis.cfgFlagQaPid) || isEnabled(groupAnalysis.cfgFlagCalculationYield) || isEnabled(groupAnalysis.cfgFlagCalculationPurity) || isEnabled(groupAnalysis.cfgFlagCalculationFractionPrimary) || isEnabled(groupAnalysis.cfgFlagCalculationFluctuation)) { - if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation)) { + if (groupAnalysis.cfgFlagQaTrack.value || groupAnalysis.cfgFlagQaDca.value || isEnabled(groupAnalysis.cfgFlagsQaAcceptance) || isEnabled(groupAnalysis.cfgFlagsQaPhi) || isEnabled(groupAnalysis.cfgFlagsQaPid) || isEnabled(groupAnalysis.cfgFlagsCalculationYield) || isEnabled(groupAnalysis.cfgFlagsCalculationPurity) || isEnabled(groupAnalysis.cfgFlagsCalculationFractionPrimary) || isEnabled(groupAnalysis.cfgFlagsCalculationFluctuation)) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationFluctuation)) { initCalculationFluctuation(); } @@ -2211,22 +2261,18 @@ struct PartNumFluc { continue; } - const bool isGood{initTrack(track, tracksIu) && initMcParticle(mcParticle)}; - if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation) && holderTrack.sign != 0) { - ++holderDerivedData.nTracksAll; - } - if (!isGood) { + if (!initTrack(track, tracksIu) || !initMcParticle(mcParticle)) { continue; } - if (isEnabled(groupAnalysis.cfgFlagQaPhi)) { + if (isEnabled(groupAnalysis.cfgFlagsQaPhi)) { fillQaPhiByParticleSpeciesAll(); fillQaPhiByParticleSpeciesAll(); fillQaPhiByParticleSpeciesAll(); fillQaPhiByParticleSpeciesAll(); } - if (isEnabled(groupAnalysis.cfgFlagQaPid)) { + if (isEnabled(groupAnalysis.cfgFlagsQaPid)) { fillQaPidByParticleSpeciesAll(track); fillQaPidByParticleSpeciesAll(track); fillQaPidByParticleSpeciesAll(track); @@ -2234,41 +2280,41 @@ struct PartNumFluc { } if (groupAnalysis.cfgFlagQaMc.value && (!groupTrack.cfgFlagMcParticlePhysicalPrimary.value || mcParticle.isPhysicalPrimary())) { - hrQaMc.fill(C_CS("QaMc/hCentralityPtEtaDeltaPt"), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.pt - holderMcParticle.pt); - hrQaMc.fill(C_CS("QaMc/hCentralityPtEtaDeltaEta"), holderEvent.centrality, holderTrack.pt, holderTrack.eta, holderTrack.eta - holderMcParticle.eta); + hrQaMc.fill(C_CS("QaMc/hCentralityPtMcEtaMcDeltaPt"), holderEvent.centrality, holderMcParticle.pt, holderMcParticle.eta, holderTrack.pt - holderMcParticle.pt); + hrQaMc.fill(C_CS("QaMc/hCentralityPtMcEtaMcDeltaEta"), holderEvent.centrality, holderMcParticle.pt, holderMcParticle.eta, holderTrack.eta - holderMcParticle.eta); } - if (isEnabled(groupAnalysis.cfgFlagCalculationYield) && (!groupTrack.cfgFlagMcParticlePhysicalPrimary.value || mcParticle.isPhysicalPrimary())) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationYield) && (!groupTrack.cfgFlagMcParticlePhysicalPrimary.value || mcParticle.isPhysicalPrimary())) { fillCalculationYieldByParticleSpecies(); fillCalculationYieldByParticleSpecies(); fillCalculationYieldByParticleSpecies(); } - if (isEnabled(groupAnalysis.cfgFlagCalculationPurity) && (!groupTrack.cfgFlagMcParticlePhysicalPrimary.value || mcParticle.isPhysicalPrimary())) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationPurity) && (!groupTrack.cfgFlagMcParticlePhysicalPrimary.value || mcParticle.isPhysicalPrimary())) { fillCalculationPurityByParticleSpecies(); fillCalculationPurityByParticleSpecies(); fillCalculationPurityByParticleSpecies(); } - if (isEnabled(groupAnalysis.cfgFlagCalculationFractionPrimary)) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationFractionPrimary)) { fillCalculationFractionPrimaryByParticleSpecies(mcParticle); fillCalculationFractionPrimaryByParticleSpecies(mcParticle); fillCalculationFractionPrimaryByParticleSpecies(mcParticle); } - if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation) && (!groupTrack.cfgFlagMcParticlePhysicalPrimary.value || mcParticle.isPhysicalPrimary())) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationFluctuation) && (!groupTrack.cfgFlagMcParticlePhysicalPrimary.value || mcParticle.isPhysicalPrimary())) { calculateFluctuationByParticleNumber(); calculateFluctuationByParticleNumber(); calculateFluctuationByParticleNumber(); } } - if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation)) { + if (isEnabled(groupAnalysis.cfgFlagsCalculationFluctuation)) { fillCalculationFluctuationByParticleNumber(); fillCalculationFluctuationByParticleNumber(); fillCalculationFluctuationByParticleNumber(); - miniMcCollision(holderDerivedData.nMcParticlesChargedAll, holderDerivedData.nMcParticlesChargedIn); - miniCollision(HolderDerivedData::convertFloor(holderEvent.vz * 10.), HolderDerivedData::convertFloor(holderEvent.centrality * 500.), holderDerivedData.nTracksAll, holderDerivedData.nTracksIn); + miniMcCollision(holderDerivedData.nMcParticles[toI(ChargeSpecies::kPlus)], holderDerivedData.nMcParticles[toI(ChargeSpecies::kMinus)]); + miniCollision(HolderDerivedData::convertFloor(holderEvent.vz * 10.), HolderDerivedData::convertFloor(holderEvent.centrality * 500.), holderDerivedData.nTracks[toI(ChargeSpecies::kPlus)], holderDerivedData.nTracks[toI(ChargeSpecies::kMinus)]); for (auto const& signedEfficiency : holderDerivedData.signedEfficienciesMcParticle) { miniMcParticle(miniMcCollision.lastIndex(), signedEfficiency); }