From 7b7a42b770d513a2ed37b2edf127067e677f3361 Mon Sep 17 00:00:00 2001 From: Emil Gorm Nielsen Date: Wed, 18 Mar 2026 14:59:42 +0100 Subject: [PATCH] containers and output for pid radial flow --- .../Tasks/flowGenericFramework.cxx | 237 ++++++++++++------ 1 file changed, 163 insertions(+), 74 deletions(-) diff --git a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx index 7f27550ef6c..de8731f61ca 100644 --- a/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx +++ b/PWGCF/GenericFramework/Tasks/flowGenericFramework.cxx @@ -77,6 +77,7 @@ std::vector centbinning(90); int nBootstrap = 10; GFWRegions regions; GFWCorrConfigs configs; +GFWCorrConfigs configsradial; std::vector multGlobalCorrCutPars; std::vector multPVCorrCutPars; std::vector multGlobalPVCorrCutPars; @@ -94,7 +95,7 @@ struct FlowGenericFramework { O2_DEFINE_CONFIGURABLE(cfgFillWeights, bool, false, "Fill NUA weights") O2_DEFINE_CONFIGURABLE(cfgRunByRun, bool, false, "Fill histograms on a run-by-run basis") O2_DEFINE_CONFIGURABLE(cfgFillQA, bool, false, "Fill QA histograms") - O2_DEFINE_CONFIGURABLE(cfgMultCut, bool, true, "Use additional event cut on mult correlations"); + O2_DEFINE_CONFIGURABLE(cfgMultCut, bool, false, "Use additional event cut on mult correlations"); O2_DEFINE_CONFIGURABLE(cfgUseCentralMoments, bool, true, "Use central moments in vn-pt calculations") O2_DEFINE_CONFIGURABLE(cfgUsePID, bool, true, "Enable PID information") O2_DEFINE_CONFIGURABLE(cfgUseGapMethod, bool, false, "Use gap method in vn-pt calculations") @@ -108,7 +109,7 @@ struct FlowGenericFramework { struct : ConfigurableGroup { O2_DEFINE_CONFIGURABLE(cfgDCAxyNSigma, float, 7, "Cut on number of sigma deviations from expected DCA in the transverse direction"); O2_DEFINE_CONFIGURABLE(cfgDCAz, float, 2, "Cut on DCA in the longitudinal direction (cm)"); - O2_DEFINE_CONFIGURABLE(cfgNTPCCls, float, 70, "Cut on number of TPC clusters found"); + O2_DEFINE_CONFIGURABLE(cfgNTPCCls, float, 50, "Cut on number of TPC clusters found"); O2_DEFINE_CONFIGURABLE(cfgNTPCXrows, float, 70, "Cut on number of TPC crossed rows"); O2_DEFINE_CONFIGURABLE(cfgMinNITSCls, float, 5, "Cut on minimum number of ITS clusters found"); O2_DEFINE_CONFIGURABLE(cfgChi2PrITSCls, float, 36, "Cut on chi^2 per ITS clusters found"); @@ -130,7 +131,6 @@ struct FlowGenericFramework { O2_DEFINE_CONFIGURABLE(cfgOccupancySelection, int, 2000, "Max occupancy selection, -999 to disable"); O2_DEFINE_CONFIGURABLE(cfgDoOccupancySel, bool, true, "Bool for event selection on detector occupancy"); O2_DEFINE_CONFIGURABLE(cfgMagField, float, 99999, "Configurable magnetic field; default CCDB will be queried"); - O2_DEFINE_CONFIGURABLE(cfgTofPtCut, float, 0.5, "pt cut on TOF for PID"); O2_DEFINE_CONFIGURABLE(cfgUseDensityDependentCorrection, bool, false, "Use density dependent efficiency correction based on Run 2 measurements"); Configurable> cfgTrackDensityP0{"cfgTrackDensityP0", std::vector{0.7217476707, 0.7384792571, 0.7542625668, 0.7640680200, 0.7701951667, 0.7755299053, 0.7805901710, 0.7849446786, 0.7957356586, 0.8113039262, 0.8211968966, 0.8280558878, 0.8329342135}, "parameter 0 for track density efficiency correction"}; Configurable> cfgTrackDensityP1{"cfgTrackDensityP1", std::vector{-2.169488e-05, -2.191913e-05, -2.295484e-05, -2.556538e-05, -2.754463e-05, -2.816832e-05, -2.846502e-05, -2.843857e-05, -2.705974e-05, -2.477018e-05, -2.321730e-05, -2.203315e-05, -2.109474e-05}, "parameter 1 for track density efficiency correction"}; @@ -151,11 +151,16 @@ struct FlowGenericFramework { O2_DEFINE_CONFIGURABLE(cfgGlobalT0ALowSigma, float, -3., "Number of sigma deviations below expected value in global vs T0A correlation"); O2_DEFINE_CONFIGURABLE(cfgGlobalT0AHighSigma, float, 4, "Number of sigma deviations above expected value in global vs T0A correlation"); } cfgGlobalAsideCorrCuts; + struct ConfigurableGroup { + O2_DEFINE_CONFIGURABLE(cfgUseStrictPID, bool, true, "Use strict PID cuts for TPC") + O2_DEFINE_CONFIGURABLE(cfgTofPtCut, float, 0.5, "pt cut on TOF for PID"); + } cfgPIDCuts; Configurable cfgGFWBinning{"cfgGFWBinning", {40, 16, 72, 300, 0, 3000, 0.2, 10.0, 0.2, 3.0, {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4, 4.5, 5, 5.5, 6, 7, 8, 9, 10}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90}}, "Configuration for binning"}; Configurable cfgRegions{"cfgRegions", {{"refN", "refP", "refFull"}, {-0.8, 0.4, -0.8}, {-0.4, 0.8, 0.8}, {0, 0, 0}, {1, 1, 1}}, "Configurations for GFW regions"}; Configurable cfgCorrConfig{"cfgCorrConfig", {{"refP {2} refN {-2}", "refP {3} refN {-3}", "refP {4} refN {-4}", "refFull {2 -2}", "refFull {2 2 -2 -2}"}, {"ChGap22", "ChGap32", "ChGap42", "ChFull22", "ChFull24"}, {0, 0, 0, 0, 0}, {15, 1, 1, 0, 0}}, "Configurations for each correlation to calculate"}; + Configurable cfgCorrConfigRadial{"cfgCorrConfigRadial", {{"refP {2} refN {-2}", "refP {3} refN {-3}", "refP {4} refN {-4}"}, {"ChGap22", "ChGap32", "ChGap42"}, {1, 1, 1}, {0, 0, 0}}, "Configurations for each radial flow correlation to calculate"}; // #include "PWGCF/TwoParticleCorrelations/TableProducer/Productions/skimmingconf_20221115.cxx" // NOLINT // Connect to ccdb @@ -169,10 +174,15 @@ struct FlowGenericFramework { // Define output OutputObj fFC{FlowContainer("FlowContainer")}; - OutputObj fFCpt{FlowPtContainer("FlowPtContainer")}; + OutputObj fFCpt_ch{FlowPtContainer("FlowPtContainer_ch")}; + OutputObj fFCpt_pi{FlowPtContainer("FlowPtContainer_pi")}; + OutputObj fFCpt_ka{FlowPtContainer("FlowPtContainer_ka")}; + OutputObj fFCpt_pr{FlowPtContainer("FlowPtContainer_pr")}; OutputObj fFCgen{FlowContainer("FlowContainer_gen")}; HistogramRegistry registry{"registry"}; + std::vector fFCpts = {&(*fFCpt_ch), &(*fFCpt_pi), &(*fFCpt_ka), &(*fFCpt_pr)}; + // QA outputs std::map>> th1sList; std::map>> th3sList; @@ -245,11 +255,12 @@ struct FlowGenericFramework { GFW* fGFW = new GFW(); std::vector corrconfigs; + std::vector corrconfigsradial; + TRandom3* fRndm = new TRandom3(0); TAxis* fPtAxis; int lastRun = -1; std::vector runNumbers; - TH1D* event_pt_spectrum; // Density dependent eff correction std::vector funcEff; @@ -285,7 +296,7 @@ struct FlowGenericFramework { void init(InitContext const&) { - LOGF(info, "flowGenericFramework::init()"); + LOGF(info, "FlowGenericFramework::init()"); o2::analysis::gfw::regions.SetNames(cfgRegions->GetNames()); o2::analysis::gfw::regions.SetEtaMin(cfgRegions->GetEtaMin()); o2::analysis::gfw::regions.SetEtaMax(cfgRegions->GetEtaMax()); @@ -297,6 +308,11 @@ struct FlowGenericFramework { o2::analysis::gfw::configs.SetpTCorrMasks(cfgCorrConfig->GetpTCorrMasks()); o2::analysis::gfw::regions.Print(); o2::analysis::gfw::configs.Print(); + o2::analysis::gfw::configsradial.SetCorrs(cfgCorrConfigRadial->GetCorrs()); + o2::analysis::gfw::configsradial.SetHeads(cfgCorrConfigRadial->GetHeads()); + o2::analysis::gfw::configsradial.SetpTDifs(cfgCorrConfigRadial->GetpTDifs()); + o2::analysis::gfw::configsradial.SetpTCorrMasks(cfgCorrConfigRadial->GetpTCorrMasks()); + o2::analysis::gfw::configsradial.Print(); o2::analysis::gfw::ptbinning = cfgGFWBinning->GetPtBinning(); o2::analysis::gfw::ptpoilow = cfgGFWBinning->GetPtPOImin(); o2::analysis::gfw::ptpoiup = cfgGFWBinning->GetPtPOImax(); @@ -398,6 +414,11 @@ struct FlowGenericFramework { registry.get(HIST("eventQA/eventSel"))->GetXaxis()->SetBinLabel(10, "after Mult cuts"); registry.get(HIST("eventQA/eventSel"))->GetXaxis()->SetBinLabel(11, "has track + within cent"); + registry.add("npt_ch", "; #it{p}_{T} (GeV/#it{c}; ; centrality (%); fraction)", {HistType::kTH2D, {ptAxis, centAxis}}); + registry.add("npt_pi", "; #it{p}_{T} (GeV/#it{c}; ; centrality (%); fraction)", {HistType::kTH2D, {ptAxis, centAxis}}); + registry.add("npt_ka", "; #it{p}_{T} (GeV/#it{c}; ; centrality (%); fraction)", {HistType::kTH2D, {ptAxis, centAxis}}); + registry.add("npt_pr", "; #it{p}_{T} (GeV/#it{c}; ; centrality (%); fraction)", {HistType::kTH2D, {ptAxis, centAxis}}); + if (!cfgRunByRun) { if (cfgUsePID) { registry.add("phi_eta_vtxz_ref", "", {HistType::kTH3D, {phiAxis, etaAxis, vtxAxis}}); @@ -410,14 +431,6 @@ struct FlowGenericFramework { } } - // v0 - const TArrayD* bins = fPtAxis->GetXbins(); - if (bins->fN > 0) { - event_pt_spectrum = new TH1D("event_pt_spectrum", "event_pt_spectrum", bins->fN - 1, bins->fArray); - } - registry.add("meanNpt", "", {HistType::kTProfile2D, {ptAxis, multAxis}}); - registry.add("meanpt", "", {HistType::kTProfile, {multAxis}}); - registry.add("Npt_pt", "", {HistType::kTProfile2D, {ptAxis, multAxis}}); registry.add("trackQA/after/Nch_corrected", "", {HistType::kTH1D, {nchAxis}}); registry.add("trackQA/after/Nch_uncorrected", "", {HistType::kTH1D, {nchAxis}}); } @@ -432,9 +445,19 @@ struct FlowGenericFramework { } if (corrconfigs.empty()) LOGF(error, "Configuration contains vectors of different size - check the GFWCorrConfig configurable"); + + // Radial flow configs + for (auto i = 0; i < o2::analysis::gfw::configsradial.GetSize(); ++i) { + corrconfigsradial.push_back(fGFW->GetCorrelatorConfig(o2::analysis::gfw::configsradial.GetCorrs()[i], o2::analysis::gfw::configsradial.GetHeads()[i], o2::analysis::gfw::configsradial.GetpTDifs()[i])); + } + if (corrconfigsradial.empty()) + LOGF(error, "Radial configuration contains vectors of different size - check the GFWCorrConfig configurable"); + fGFW->CreateRegions(); TObjArray* oba = new TObjArray(); addConfigObjectsToObjArray(oba, corrconfigs); + addConfigObjectsToObjArray(oba, corrconfigsradial); + if (doprocessData || doprocessRun2 || doprocessMCReco) { fFC->SetName("FlowContainer"); fFC->SetXAxis(fPtAxis); @@ -446,9 +469,11 @@ struct FlowGenericFramework { fFCgen->Initialize(oba, multAxis, cfgNbootstrap); } delete oba; - fFCpt->setUseCentralMoments(cfgUseCentralMoments); - fFCpt->setUseGapMethod(cfgUseGapMethod); - fFCpt->initialise(multAxis, cfgMpar, o2::analysis::gfw::configs, cfgNbootstrap); + for (auto& container : fFCpts) { + container->setUseCentralMoments(cfgUseCentralMoments); + container->setUseGapMethod(cfgUseGapMethod); + container->initialise(multAxis, cfgMpar, o2::analysis::gfw::configs, cfgNbootstrap); + } // Multiplicity correlation cuts if (cfgMultCut) { @@ -617,18 +642,25 @@ struct FlowGenericFramework { float nsigma = 3.0; // Choose which nSigma to use - std::array nSigmaToUse = (track.pt() > cfgTofPtCut && track.hasTOF()) ? nSigmaCombined : nSigmaTPC; - if (track.pt() >= cfgTofPtCut && !track.hasTOF()) - return -1; + std::array nSigmaToUse = (track.pt() > cfgPIDCuts.cfgTofPtCut && track.hasTOF()) ? nSigmaCombined : nSigmaTPC; + if (track.pt() > cfgPIDCuts.cfgTofPtCut && !track.hasTOF()) + return 0; + const int numSpecies = 3; + int pidCount = 0; // Select particle with the lowest nsigma - const int nspecies = 3; - for (int i = 0; i < nspecies; ++i) { + for (int i = 0; i < numSpecies; ++i) { if (std::abs(nSigmaToUse[i]) < nsigma) { + if (pidCount > 0 && cfgPIDCuts.cfgUseStrictPID) + return 0; // more than one particle with low nsigma + + pidCount++; pid = i; - nsigma = std::abs(nSigmaToUse[i]); + if (!cfgPIDCuts.cfgUseStrictPID) + nsigma = std::abs(nSigmaToUse[i]); } } + return pid + 1; // shift the pid by 1, 1 = pion, 2 = kaon, 3 = proton } @@ -745,7 +777,7 @@ struct FlowGenericFramework { { if (std::fabs(track.dcaXY()) > (0.0105f + 0.0035f / track.pt())) return false; - return ((track.tpcNClsCrossedRows() >= 70) && (track.tpcNClsFound() >= 70) && (track.itsNCls() >= 5)); + return ((track.tpcNClsCrossedRows() >= 70) && (track.tpcNClsFound() >= 50) && (track.itsNCls() >= 5)); } enum DataType { @@ -838,14 +870,35 @@ struct FlowGenericFramework { return; } + struct AcceptedTracks { + explicit AcceptedTracks(std::size_t nptbins) + : nch(nptbins, 0.f), + npi(nptbins, 0.f), + nka(nptbins, 0.f), + npr(nptbins, 0.f) + { + } + + float total = 0; + unsigned int total_uncorr = 0; + + std::vector nch; + std::vector npi; + std::vector nka; + std::vector npr; + }; + template - void fillOutputContainers(const float& centmult, const double& rndm) + void fillOutputContainers(const float& centmult, const double& rndm, AcceptedTracks acceptedtracks) { - fFCpt->calculateCorrelations(); - fFCpt->fillPtProfiles(centmult, rndm); - fFCpt->fillCMProfiles(centmult, rndm); - if (!cfgUseGapMethod) - fFCpt->fillVnPtStdProfiles(centmult, rndm); + for (auto container : fFCpts) { + container->calculateCorrelations(); + container->fillPtProfiles(centmult, rndm); + container->fillCMProfiles(centmult, rndm); + if (!cfgUseGapMethod) + container->fillVnPtStdProfiles(centmult, rndm); + } + for (uint l_ind = 0; l_ind < corrconfigs.size(); ++l_ind) { if (!corrconfigs.at(l_ind).pTDif) { auto dnx = fGFW->Calculate(corrconfigs.at(l_ind), 0, kTRUE).real(); @@ -854,8 +907,11 @@ struct FlowGenericFramework { auto val = fGFW->Calculate(corrconfigs.at(l_ind), 0, kFALSE).real() / dnx; if (std::abs(val) < 1) { (dt == kGen) ? fFCgen->FillProfile(corrconfigs.at(l_ind).Head.c_str(), centmult, val, dnx, rndm) : fFC->FillProfile(corrconfigs.at(l_ind).Head.c_str(), centmult, val, dnx, rndm); - if (cfgUseGapMethod) - fFCpt->fillVnPtProfiles(centmult, val, dnx, rndm, o2::analysis::gfw::configs.GetpTCorrMasks()[l_ind]); + if (cfgUseGapMethod) { + for (auto container : fFCpts) { + container->fillVnPtProfiles(centmult, val, dnx, rndm, o2::analysis::gfw::configs.GetpTCorrMasks()[l_ind]); + } + } } continue; } @@ -869,13 +925,41 @@ struct FlowGenericFramework { } } - // Only consider events where mean pt can be calculated - if (fFCpt->corrDen[1] != 0) { - double mean_pt = fFCpt->corrNum[1] / fFCpt->corrDen[1]; - registry.fill(HIST("meanpt"), centmult, mean_pt); - for (int bin = 1; bin <= event_pt_spectrum->GetNbinsX(); ++bin) { - registry.fill(HIST("meanNpt"), event_pt_spectrum->GetXaxis()->GetBinCenter(bin), centmult, event_pt_spectrum->GetBinContent(bin)); - registry.fill(HIST("Npt_pt"), event_pt_spectrum->GetXaxis()->GetBinCenter(bin), centmult, event_pt_spectrum->GetBinContent(bin) * mean_pt); + int total = (cfgUseNchCorrection) ? acceptedtracks.total : acceptedtracks.total_uncorr; + + if (total == 0) + return; + + for (std::size_t i = 0; i < acceptedtracks.nch.size(); ++i) + registry.fill(HIST("npt_ch"), fPtAxis->GetBinCenter(i + 1), centmult, acceptedtracks.nch[i] / total); + for (std::size_t i = 0; i < acceptedtracks.npi.size(); ++i) + registry.fill(HIST("npt_pi"), fPtAxis->GetBinCenter(i + 1), centmult, acceptedtracks.npi[i] / total); + for (std::size_t i = 0; i < acceptedtracks.nka.size(); ++i) + registry.fill(HIST("npt_ka"), fPtAxis->GetBinCenter(i + 1), centmult, acceptedtracks.nka[i] / total); + for (std::size_t i = 0; i < acceptedtracks.npr.size(); ++i) + registry.fill(HIST("npt_pr"), fPtAxis->GetBinCenter(i + 1), centmult, acceptedtracks.npr[i] / total); + + std::vector> inputs = {acceptedtracks.nch, acceptedtracks.npi, acceptedtracks.nka, acceptedtracks.npr}; + std::vector> fractions; + fractions.reserve(inputs.size()); + + for (const auto& vec : inputs) { + fractions.emplace_back(); + fractions.back().reserve(vec.size()); + + std::transform(vec.begin(), vec.end(), + std::back_inserter(fractions.back()), + [&](double x) { return x / total; }); + } + + for (uint l_ind = 0; l_ind < corrconfigsradial.size(); ++l_ind) { + for (int i = 1; i <= fPtAxis->GetNbins(); i++) { + auto dnx = fGFW->Calculate(corrconfigsradial.at(l_ind), i - 1, kTRUE).real(); + if (dnx == 0) + continue; + auto val = fGFW->Calculate(corrconfigsradial.at(l_ind), i - 1, kFALSE).real() / dnx; + if (std::abs(val) < 1) + (dt == kGen) ? fFCgen->FillProfile(Form("%s_pt_%i", corrconfigsradial.at(l_ind).Head.c_str(), i), centmult, val * fractions[l_ind][i - 1], dnx, rndm) : fFC->FillProfile(Form("%s_pt_%i", corrconfigsradial.at(l_ind).Head.c_str(), i), centmult, val * fractions[l_ind][i - 1], dnx, rndm); } } @@ -901,8 +985,9 @@ struct FlowGenericFramework { th1sList[run][hCent]->Fill(centrality); } fGFW->Clear(); - fFCpt->clearVector(); - event_pt_spectrum->Reset(); + for (auto& container : fFCpts) + container->clearVector(); + float lRandom = fRndm->Rndm(); // be cautious, this only works for Pb-Pb @@ -940,13 +1025,13 @@ struct FlowGenericFramework { densitycorrections.density = tracks.size(); } - AcceptedTracks acceptedTracks; + AcceptedTracks acceptedTracks(o2::analysis::gfw::ptbinning.size() - 1); for (const auto& track : tracks) { processTrack(track, vtxz, field, run, densitycorrections, acceptedTracks); } - registry.fill(HIST("trackQA/after/Nch_corrected"), acceptedTracks.corrected); - registry.fill(HIST("trackQA/after/Nch_uncorrected"), acceptedTracks.uncorrected); + registry.fill(HIST("trackQA/after/Nch_corrected"), acceptedTracks.total); + registry.fill(HIST("trackQA/after/Nch_uncorrected"), acceptedTracks.total_uncorr); int multiplicity = 0; switch (cfgUseNchCorrection) { @@ -954,10 +1039,10 @@ struct FlowGenericFramework { multiplicity = tracks.size(); break; case 1: - multiplicity = acceptedTracks.corrected; + multiplicity = acceptedTracks.total; break; case 2: - multiplicity = acceptedTracks.uncorrected; + multiplicity = acceptedTracks.total_uncorr; break; default: multiplicity = tracks.size(); @@ -965,14 +1050,9 @@ struct FlowGenericFramework { } if (!cfgFillWeights) - fillOutputContainers
((cfgUseNch) ? multiplicity : centrality, lRandom); + fillOutputContainers
((cfgUseNch) ? multiplicity : centrality, lRandom, acceptedTracks); } - struct AcceptedTracks { - float corrected = 0; - unsigned int uncorrected = 0; - }; - template inline void processTrack(TTrack const& track, const float& vtxz, const int field, const int run, DensityCorr densitycorrections, AcceptedTracks& acceptedTracks) { @@ -993,8 +1073,8 @@ struct FlowGenericFramework { if (!nchSelected(track)) return; - acceptedTracks.corrected += getEfficiency(track); - ++acceptedTracks.uncorrected; + acceptedTracks.total += getEfficiency(track); + ++acceptedTracks.total_uncorr; if (!trackSelected(track, field)) return; @@ -1012,7 +1092,7 @@ struct FlowGenericFramework { if (cfgFillWeights) { fillWeights(mcParticle, vtxz, 0, run); } else { - fillPtSums(track, vtxz); + fillPtSums(track, vtxz, pidIndex); fillGFW(mcParticle, vtxz, pidIndex, densitycorrections); } @@ -1042,9 +1122,9 @@ struct FlowGenericFramework { if (std::abs(track.pdgCode()) == kProton) pidIndex = 3; } - ++acceptedTracks.corrected; - ++acceptedTracks.uncorrected; - fillPtSums(track, vtxz); + ++acceptedTracks.total; + ++acceptedTracks.total_uncorr; + fillPtSums(track, vtxz, pidIndex); fillGFW(track, vtxz, pidIndex, densitycorrections); if (cfgFillQA) @@ -1052,27 +1132,34 @@ struct FlowGenericFramework { } else { if (cfgFillQA) fillTrackQA(track, vtxz); - // Select tracks with nominal cuts always if (!nchSelected(track)) return; - - acceptedTracks.corrected += getEfficiency(track); - ++acceptedTracks.uncorrected; + acceptedTracks.total += getEfficiency(track); + ++acceptedTracks.total_uncorr; if (!trackSelected(track, field)) return; - - int pidIndex = 0; - if (cfgUsePID) - pidIndex = getNsigmaPID(track); + // int pidIndex = 0; + // if (cfgUsePID) Need PID for v02 + int pidIndex = getNsigmaPID(track); + + std::size_t ptBinIndex = fPtAxis->FindBin(track.pt()) - 1; + if (!(ptBinIndex > o2::analysis::gfw::ptbinning.size())) { + acceptedTracks.nch[ptBinIndex] += (cfgUseNchCorrection) ? getEfficiency(track) : 1.0; + if (pidIndex == 1) + acceptedTracks.npi[ptBinIndex] += (cfgUseNchCorrection) ? getEfficiency(track) : 1.0; + if (pidIndex == 2) + acceptedTracks.nka[ptBinIndex] += (cfgUseNchCorrection) ? getEfficiency(track) : 1.0; + if (pidIndex == 3) + acceptedTracks.npr[ptBinIndex] += (cfgUseNchCorrection) ? getEfficiency(track) : 1.0; + } if (cfgFillWeights) { fillWeights(track, vtxz, pidIndex, run); } else { - fillPtSums(track, vtxz); + fillPtSums(track, vtxz, pidIndex); fillGFW(track, vtxz, pidIndex, densitycorrections); - event_pt_spectrum->Fill(track.pt(), (cfgUseNchCorrection == 1) ? getEfficiency(track) : 1.); } if (cfgFillQA) { fillTrackQA(track, vtxz); @@ -1085,20 +1172,22 @@ struct FlowGenericFramework { } template - inline void fillPtSums(TTrack track, const double& vtxz) + inline void fillPtSums(TTrack track, const double& vtxz, const int pidIndex) { double wacc = (dt == kGen) ? 1. : getAcceptance(track, vtxz, 0); double weff = (dt == kGen) ? 1. : getEfficiency(track); if (weff < 0) return; if (std::abs(track.eta()) < cfgEtaPtPt) { - fFCpt->fill(weff, track.pt()); + fFCpt_ch->fill(weff, track.pt()); + if (pidIndex) + fFCpts[pidIndex]->fill(weff, track.pt()); } if (!cfgUseGapMethod) { std::complex q2p = {weff * wacc * std::cos(2 * track.phi()), weff * wacc * std::sin(2 * track.phi())}; std::complex q2n = {weff * wacc * std::cos(-2 * track.phi()), weff * wacc * std::sin(-2 * track.phi())}; - fFCpt->fillArray(q2p, q2n, weff * track.pt(), weff); - fFCpt->fillArray(weff * wacc, weff * wacc, weff, weff); + fFCpt_ch->fillArray(q2p, q2n, weff * track.pt(), weff); + fFCpt_ch->fillArray(weff * wacc, weff * wacc, weff, weff); } } @@ -1222,8 +1311,8 @@ struct FlowGenericFramework { o2::framework::expressions::Filter collisionFilter = nabs(aod::collision::posZ) < cfgVtxZ; o2::framework::expressions::Filter trackFilter = nabs(aod::track::eta) < cfgEta && aod::track::pt > cfgPtmin&& aod::track::pt < cfgPtmax && ((requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true)) && (aod::track::itsChi2NCl < cfgTrackCuts.cfgChi2PrITSCls) && (aod::track::tpcChi2NCl < cfgTrackCuts.cfgChi2PrTPCCls) && nabs(aod::track::dcaZ) < cfgTrackCuts.cfgDCAz; - using GFWTracks = soa::Filtered>; - // using GFWTracks = soa::Filtered>; + // using GFWTracks = soa::Filtered>; + using GFWTracks = soa::Filtered>; void processData(soa::Filtered>::iterator const& collision, aod::BCsWithTimestamps const&, GFWTracks const& tracks) {