diff --git a/PWGCF/EbyEFluctuations/Tasks/partNumFluc.cxx b/PWGCF/EbyEFluctuations/Tasks/partNumFluc.cxx index 96608586509..62544deb592 100644 --- a/PWGCF/EbyEFluctuations/Tasks/partNumFluc.cxx +++ b/PWGCF/EbyEFluctuations/Tasks/partNumFluc.cxx @@ -85,11 +85,11 @@ using namespace o2::framework::expressions; namespace o2::aod { -using JoinedCollisions = soa::Join; -using JoinedTracks = soa::Join; -using JoinedCollisionsWithMc = soa::Join; -using JoinedTracksWithMc = soa::Join; -using JoinedMcCollisions = soa::Join; +using JoinedCollisions = soa::Join; +using JoinedTracks = soa::Join; +using JoinedCollisionsWithMc = soa::Join; +using JoinedTracksWithMc = soa::Join; +using JoinedMcCollisions = soa::Join; namespace derived_collision { @@ -695,74 +695,6 @@ inline constexpr bool isEnabled(const Configurable>& cfg) } // namespace struct PartNumFluc { - struct : ConfigurableGroup { - 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", 0, "Latest timestamp in CCDB"}; - } groupCcdb; - - struct : ConfigurableGroup { - Configurable cfgFlagQaRun{"cfgFlagQaRun", false, "Run QA flag"}; - Configurable cfgFlagQaEvent{"cfgFlagQaEvent", false, "Event QA flag"}; - 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 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"}; - } 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 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"}; - Configurable cfgCutMaxAbsVz{"cfgCutMaxAbsVz", 6., "Maximum absolute z-vertex position (cm)"}; - 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"}; - Configurable cfgNSubgroups{"cfgNSubgroups", 20, "Number of subgroups in fluctuation calculation"}; - } groupEvent; - - struct : ConfigurableGroup { - Configurable cfgFlagPvContributor{"cfgFlagPvContributor", true, "Flag of requiring PV contributor"}; - Configurable cfgCutMinItsNCls{"cfgCutMinItsNCls", 5, "Minimum number of clusters ITS"}; - Configurable cfgCutMaxItsChi2NCls{"cfgCutMaxItsChi2NCls", 30., "Maximum chi2 per cluster ITS"}; - Configurable cfgCutMinTpcNCls{"cfgCutMinTpcNCls", 55, "Minimum number of clusters TPC"}; - Configurable cfgCutMaxTpcChi2NCls{"cfgCutMaxTpcChi2NCls", 3.5, "Maximum chi2 per cluster TPC"}; - Configurable cfgCutMaxTpcNClsSharedRatio{"cfgCutMaxTpcNClsSharedRatio", 0.25, "Maximum ratio of shared clusters over clusters TPC"}; - 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 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 cfgFlagRejectionOthers{"cfgFlagRejectionOthers", false, "Other particle species rejection flag"}; - Configurable cfgCutMaxAbsNSigmaPid{"cfgCutMaxAbsNSigmaPid", 2., "Maximum absolute nSigma 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; - - aod::rctsel::RCTFlagsChecker rctFlagsChecker; - - Service pdg; - Service ccdb; - - Produces derivedCollision; - Produces derivedParticle; - Produces derivedTrack; - struct HolderCcdb { static constexpr std::int32_t NDimensionsEfficiency{4}; @@ -840,7 +772,6 @@ struct PartNumFluc { std::int32_t charge{}; double pt{}; double eta{}; - double phi{}; void clear() { *this = {}; } } holderMcParticle; @@ -855,6 +786,7 @@ struct PartNumFluc { double pt{}; double eta{}; double phi{}; + double phiIu{}; std::array> hasPid{}; std::array>, NEs> nSigmaPid{[] { std::array>, NEs> a{}; @@ -879,16 +811,85 @@ 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()); } - std::uint16_t nChargedParticlesAll{}; - std::uint16_t nChargedParticlesIn{}; - std::uint16_t nTracksAll{}; - std::uint16_t nTracksIn{}; + aod::derived_collision::NChargedParticlesAll::type nChargedParticlesAll{}; + aod::derived_collision::NChargedParticlesIn::type nChargedParticlesIn{}; + aod::derived_collision::NTracksAll::type nTracksAll{}; + aod::derived_collision::NTracksIn::type nTracksIn{}; + std::vector signedEfficienciesParticle{[] {std::vector v{}; v.reserve(256); return v; }()}; + std::vector signedEfficienciesTrack{[] {std::vector v{}; v.reserve(256); return v; }()}; - void clear() { *this = {}; } + void clear() + { + nChargedParticlesAll = {}; + nChargedParticlesIn = {}; + nTracksAll = {}; + nTracksIn = {}; + signedEfficienciesParticle.clear(); + signedEfficienciesTrack.clear(); + } } holderDerivedData; std::array, NEs>, NEs> fluctuationCalculatorTrack{}; + struct : ConfigurableGroup { + 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"}; + } groupCcdb; + + struct : ConfigurableGroup { + Configurable cfgFlagQaRun{"cfgFlagQaRun", false, "Run QA flag"}; + Configurable cfgFlagQaEvent{"cfgFlagQaEvent", false, "Event QA flag"}; + 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 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"}; + } 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 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"}; + Configurable cfgCutMaxAbsVz{"cfgCutMaxAbsVz", 6., "Maximum absolute z-vertex position (cm)"}; + 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"}; + Configurable cfgNSubgroups{"cfgNSubgroups", 20, "Number of subgroups in fluctuation calculation"}; + } groupEvent; + + struct : ConfigurableGroup { + Configurable cfgFlagPvContributor{"cfgFlagPvContributor", true, "Flag of requiring PV contributor"}; + Configurable cfgCutMinItsNCls{"cfgCutMinItsNCls", 5, "Minimum number of clusters ITS"}; + Configurable cfgCutMaxItsChi2NCls{"cfgCutMaxItsChi2NCls", 30., "Maximum chi2 per cluster ITS"}; + Configurable cfgCutMinTpcNCls{"cfgCutMinTpcNCls", 55, "Minimum number of clusters TPC"}; + Configurable cfgCutMaxTpcChi2NCls{"cfgCutMaxTpcChi2NCls", 3.5, "Maximum chi2 per cluster TPC"}; + Configurable cfgCutMaxTpcNClsSharedRatio{"cfgCutMaxTpcNClsSharedRatio", 0.25, "Maximum ratio of shared clusters over clusters TPC"}; + 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 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 cfgFlagRejectionOthers{"cfgFlagRejectionOthers", false, "Other particle species rejection flag"}; + Configurable cfgCutMaxAbsNSigmaPid{"cfgCutMaxAbsNSigmaPid", 2., "Maximum absolute nSigma 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; + HistogramRegistry hrCalculationFluctuation{"hrCalculationFluctuation", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry hrCalculationFractionPrimary{"hrCalculationFractionPrimary", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry hrCalculationPurity{"hrCalculationPurity", {}, OutputObjHandlingPolicy::AnalysisObject}; @@ -904,11 +905,20 @@ struct PartNumFluc { HistogramRegistry hrQaRun{"hrQaRun", {}, OutputObjHandlingPolicy::AnalysisObject}; HistogramRegistry hrCounter{"hrCounter", {}, OutputObjHandlingPolicy::AnalysisObject}; + aod::rctsel::RCTFlagsChecker rctFlagsChecker; + + Service pdg; + Service ccdb; + Filter filterCollision = (aod::evsel::sel8 == true); Filter filterTrack = requireQualityTracksInFilter(); Filter filterMcCollision = (aod::mccollisionprop::numRecoCollision > 0); - Preslice presliceTracksPerCollision = aod::track::collisionId; + Preslice presliceTracksPerCollision{aod::track::collisionId}; + + Produces derivedCollision; + Produces derivedParticle; + Produces derivedTrack; void init(InitContext&) { @@ -932,10 +942,9 @@ struct PartNumFluc { ccdb->setLocalObjectValidityChecking(); ccdb->setFatalWhenNull(true); if (groupCcdb.cfgCcdbTimestampLatest.value >= 0) { - ccdb->setCreatedNotAfter(groupCcdb.cfgCcdbTimestampLatest.value > 0 ? groupCcdb.cfgCcdbTimestampLatest.value : std::chrono::time_point_cast(std::chrono::system_clock::now()).time_since_epoch().count()); + ccdb->setCreatedNotAfter(groupCcdb.cfgCcdbTimestampLatest.value); } - - const TList* const ccdbObject{ccdb->getForTimeStamp(groupCcdb.cfgCcdbPath.value, -1)}; + const TList* const ccdbObject{ccdb->get(groupCcdb.cfgCcdbPath.value)}; if (!ccdbObject || ccdbObject->IsA() != TList::Class()) { LOG(fatal) << "Invalid ccdb_object!"; } @@ -1208,21 +1217,10 @@ struct PartNumFluc { 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)"}}); - if (doprocessMc.value) { + for (std::int32_t const& iPidStrategy : std::views::iota(0, NEs)) { for (std::int32_t const& iChargeSpecies : std::views::iota(0, NEs)) { - hrQaPhi.add(Form("QaPhi/hCentralityPtEtaPhiMc_mc%s%s", getName(iParticleSpeciesAll).data(), getName(iChargeSpecies).data()), "", hcsQaPhi); - } - for (std::int32_t const& iPidStrategy : std::views::iota(0, NEs)) { - for (std::int32_t const& iChargeSpecies : std::views::iota(0, NEs)) { - hrQaPhi.add(Form("QaPhi/hCentralityPtEtaPhiMc_mc%s%s%s", getName(iPidStrategy).data(), getName(iParticleSpeciesAll).data(), getName(iChargeSpecies).data()), "", hcsQaPhi); - hrQaPhi.add(Form("QaPhi/hCentralityPtEtaPhi_mc%s%s%s", getName(iPidStrategy).data(), getName(iParticleSpeciesAll).data(), getName(iChargeSpecies).data()), "", hcsQaPhi); - } - } - } else { - for (std::int32_t const& iPidStrategy : std::views::iota(0, NEs)) { - for (std::int32_t const& iChargeSpecies : std::views::iota(0, NEs)) { - hrQaPhi.add(Form("QaPhi/hCentralityPtEtaPhi_%s%s%s", getName(iPidStrategy).data(), getName(iParticleSpeciesAll).data(), getName(iChargeSpecies).data()), "", hcsQaPhi); - } + hrQaPhi.add(Form("QaPhi/hCentralityPtEtaPhi_%s%s%s", doprocessMc.value ? Form("mc%s", getName(iPidStrategy).data()) : getName(iPidStrategy).data(), getName(iParticleSpeciesAll).data(), getName(iChargeSpecies).data()), "", hcsQaPhi); + hrQaPhi.add(Form("QaPhi/hCentralityPtEtaPhiIu_%s%s%s", doprocessMc.value ? Form("mc%s", getName(iPidStrategy).data()) : getName(iPidStrategy).data(), getName(iParticleSpeciesAll).data(), getName(iChargeSpecies).data()), "", hcsQaPhi); } } } @@ -1699,7 +1697,7 @@ struct PartNumFluc { } template - requires IsValid + requires IsValid && (dataMode != DataMode::kMcMcParticle) void fillQaPhiByParticleSpeciesAll() { if (!groupAnalysis.cfgFlagQaPhi.value.get(toI(particleSpeciesAll))) { @@ -1714,29 +1712,24 @@ struct PartNumFluc { const auto fillByChargeSpecies = [&] requires IsValid () { - if constexpr (dataMode == DataMode::kMcMcParticle) { - if (isPid()) { - hrQaPhi.fill(C_CS("QaPhi/hCentralityPtEtaPhiMc_mc") + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderMcParticle.pt, holderMcParticle.eta, holderMcParticle.phi); - } - } else { - const auto fillByPidStrategy = [&] - requires IsValid - () { - if constexpr (dataMode == DataMode::kMcTrack) { - if (isPid() && isPid(pidStrategy), particleSpeciesAll>(false)) { - hrQaPhi.fill(C_CS("QaPhi/hCentralityPtEtaPhiMc_mc") + C_SV(getName(pidStrategy)) + C_SV(getName(particleSpeciesAll)) + C_SV(getName(chargeSpecies)), holderEvent.centrality, holderMcParticle.pt, holderMcParticle.eta, holderMcParticle.phi); - 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); - } - } 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); - } + 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); } - }; // NOLINT(readability/braces) + } 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()(); - } + fillByPidStrategy.template operator()(); + fillByPidStrategy.template operator()(); }; // NOLINT(readability/braces) if (chargeSign > 0) { @@ -1969,11 +1962,11 @@ struct PartNumFluc { ++holderMcEvent.numbersEff[toI(particleNumber)][toI(chargeSpecies)]; fill(); } - derivedParticle(derivedCollision.lastIndex() + 1, HolderDerivedData::convertRound(std::copysign(1., chargeSign) * efficiency * 32767.)); + holderDerivedData.signedEfficienciesParticle.push_back(HolderDerivedData::convertRound(std::copysign(std::numeric_limits::max(), chargeSign) * efficiency)); } else { ++holderEvent.numbers[toI(particleNumber)][toI(chargeSpecies)]; fill(); - derivedTrack(derivedCollision.lastIndex() + 1, HolderDerivedData::convertRound(std::copysign(1., chargeSign) * efficiency * 32767.)); + holderDerivedData.signedEfficienciesTrack.push_back(HolderDerivedData::convertRound(std::copysign(std::numeric_limits::max(), chargeSign) * efficiency)); } }; // NOLINT(readability/braces) @@ -2028,8 +2021,8 @@ struct PartNumFluc { fillByChargeNumber.template operator()(); } - template - bool initTrack(const T& track) + template + bool initTrack(const T& track, const TIs& tracksIu) { holderTrack.clear(); holderTrack.dca[toI(DcaAxis::kXy)] = track.dcaXY(); @@ -2039,6 +2032,19 @@ struct PartNumFluc { holderTrack.pt = track.pt(); 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); + if (track.globalIndex() == trackIu.globalIndex()) { + holderTrack.phiIu = trackIu.phi(); + } else { + LOG(warning) << "Mismatched track " << track.globalIndex() << " and trackIu " << trackIu.globalIndex(); + } + } else { + LOG(warning) << "Invalid trackIu " << track.globalIndex(); + } + } holderTrack.hasPid[toI(Detector::kTpc)] = (track.hasTPC() && track.tpcSignal() > 0.); if (holderTrack.hasPid[toI(Detector::kTpc)]) { holderTrack.nSigmaPid[toI(PidStrategyAll::kTpc)] = {HolderTrack::truncateNSigmaPid(track.tpcNSigmaPi() - getShiftNSigmaPid()), HolderTrack::truncateNSigmaPid(track.tpcNSigmaKa() - getShiftNSigmaPid()), HolderTrack::truncateNSigmaPid(track.tpcNSigmaPr() - getShiftNSigmaPid())}; @@ -2137,7 +2143,6 @@ struct PartNumFluc { } holderMcParticle.pt = mcParticle.pt(); holderMcParticle.eta = mcParticle.eta(); - holderMcParticle.phi = mcParticle.phi(); if (!isGoodMcParticle(mcParticle)) { return false; @@ -2146,8 +2151,8 @@ struct PartNumFluc { return true; } - template - bool initEvent(const C& collision, const Ts& tracks) + template + bool initEvent(const C& collision, const Ts& tracks, const TIs& tracksIu) { holderEvent.clear(); holderEvent.vz = collision.posZ(); @@ -2235,7 +2240,7 @@ struct PartNumFluc { continue; } - initTrack(track); + initTrack(track, tracksIu); } for (std::int32_t const& iChargeSpecies : std::views::iota(0, NEs)) { if (holderEvent.nGlobalTracks[iChargeSpecies] > 0) { @@ -2327,9 +2332,9 @@ struct PartNumFluc { return true; } - void processRaw(const soa::Filtered::iterator& collision, const soa::Filtered& tracks, const aod::BCsWithTimestamps&) + void processRaw(const soa::Filtered::iterator& collision, const soa::Filtered& tracks, const aod::TracksIU& tracksIu, const aod::BCsWithTimestamps&) { - if (!initEvent(collision, tracks) || (!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.cfgFlagQaAcceptance) && !isEnabled(groupAnalysis.cfgFlagQaPhi) && !isEnabled(groupAnalysis.cfgFlagQaPid) && !isEnabled(groupAnalysis.cfgFlagCalculationYield) && !isEnabled(groupAnalysis.cfgFlagCalculationFluctuation))) { return; } @@ -2344,7 +2349,7 @@ struct PartNumFluc { continue; } - const bool isGood{initTrack(track)}; + const bool isGood{initTrack(track, tracksIu)}; if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation) && holderTrack.sign != 0) { ++holderDerivedData.nTracksAll; } @@ -2384,11 +2389,14 @@ struct PartNumFluc { fillCalculationFluctuationByParticleNumber(); fillCalculationFluctuationByParticleNumber(); derivedCollision(HolderDerivedData::convertFloor(holderEvent.vz * 10.), HolderDerivedData::convertFloor(holderEvent.centrality * 500.), holderDerivedData.nChargedParticlesAll, holderDerivedData.nChargedParticlesIn, holderDerivedData.nTracksAll, holderDerivedData.nTracksIn); + for (auto const& signedEfficiency : holderDerivedData.signedEfficienciesTrack) { + derivedTrack(derivedCollision.lastIndex(), signedEfficiency); + } } } PROCESS_SWITCH(PartNumFluc, processRaw, "Process raw data", true); - void processMc(const soa::Filtered::iterator& mcCollision, const aod::McParticles& mcParticles, const soa::SmallGroups& collisions, const soa::Filtered& tracksUngrouped, const aod::BCsWithTimestamps&) + void processMc(const soa::Filtered::iterator& mcCollision, const aod::McParticles& mcParticles, const soa::SmallGroups& collisions, const soa::Filtered& tracksUngrouped, const aod::TracksIU& tracksIuUngrouped, const aod::BCsWithTimestamps&) { if (!initMcEvent(mcCollision)) { return; @@ -2400,8 +2408,9 @@ struct PartNumFluc { } const auto& tracks{tracksUngrouped.sliceBy(presliceTracksPerCollision, collision.globalIndex())}; + const auto& tracksIu{tracksIuUngrouped.sliceBy(presliceTracksPerCollision, collision.globalIndex())}; - if (!initEvent(collision, tracks)) { + if (!initEvent(collision, tracks, tracksIu)) { continue; } @@ -2409,7 +2418,7 @@ struct PartNumFluc { hrQaMc.fill(C_CS("QaMc/hCentralityVzDeltaVz"), holderEvent.centrality, holderEvent.vz, holderEvent.vz - holderMcEvent.vz); } - if (isEnabled(groupAnalysis.cfgFlagQaPhi) || isEnabled(groupAnalysis.cfgFlagCalculationYield) || isEnabled(groupAnalysis.cfgFlagCalculationFluctuation)) { + if (isEnabled(groupAnalysis.cfgFlagCalculationYield) || isEnabled(groupAnalysis.cfgFlagCalculationFluctuation)) { if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation)) { holderEvent.subgroupIndex = gRandom->Integer(groupEvent.cfgNSubgroups.value); initCalculationFluctuation(); @@ -2429,13 +2438,6 @@ struct PartNumFluc { continue; } - if (isEnabled(groupAnalysis.cfgFlagQaPhi)) { - fillQaPhiByParticleSpeciesAll(); - fillQaPhiByParticleSpeciesAll(); - fillQaPhiByParticleSpeciesAll(); - fillQaPhiByParticleSpeciesAll(); - } - if (isEnabled(groupAnalysis.cfgFlagCalculationYield)) { fillCalculationYieldByParticleSpecies(); fillCalculationYieldByParticleSpecies(); @@ -2471,7 +2473,7 @@ struct PartNumFluc { continue; } - const bool isGood{initTrack(track) && initMcParticle(mcParticle)}; + const bool isGood{initTrack(track, tracksIu) && initMcParticle(mcParticle)}; if (isEnabled(groupAnalysis.cfgFlagCalculationFluctuation) && holderTrack.sign != 0) { ++holderDerivedData.nTracksAll; } @@ -2528,6 +2530,12 @@ struct PartNumFluc { fillCalculationFluctuationByParticleNumber(); fillCalculationFluctuationByParticleNumber(); derivedCollision(HolderDerivedData::convertFloor(holderEvent.vz * 10.), HolderDerivedData::convertFloor(holderEvent.centrality * 500.), holderDerivedData.nChargedParticlesAll, holderDerivedData.nChargedParticlesIn, holderDerivedData.nTracksAll, holderDerivedData.nTracksIn); + for (auto const& signedEfficiency : holderDerivedData.signedEfficienciesParticle) { + derivedParticle(derivedCollision.lastIndex(), signedEfficiency); + } + for (auto const& signedEfficiency : holderDerivedData.signedEfficienciesTrack) { + derivedTrack(derivedCollision.lastIndex(), signedEfficiency); + } } }