From d0f27cd754f9cf9e7729c2eb1a470975e0c6fba5 Mon Sep 17 00:00:00 2001 From: Ankur Yadav Date: Thu, 26 Mar 2026 11:14:49 +0100 Subject: [PATCH 1/6] Added a new process in dqFlow to also calculate sum of squared amplituted of FT0C. Edited the VarManager to use this value to calculate M11REF for flow calculation using cumulant method at midrapidity --- PWGDQ/Core/VarManager.h | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 3129822100f..33155e926e2 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -486,11 +486,10 @@ class VarManager : public TObject kV2ME_EP, kWV2ME_SP, kWV2ME_EP, - kTwoR2SP1, // Scalar product resolution of event1 for ME technique - kTwoR2SP2, // Scalar product resolution of event2 for ME technique - kTwoR2EP1, // Event plane resolution of event2 for ME technique - kTwoR2EP2, // Event plane resolution of event2 for ME technique - kNPairsPerEvent, // number of pairs per event in same-event or mixed-event pairing + kTwoR2SP1, // Scalar product resolution of event1 for ME technique + kTwoR2SP2, // Scalar product resolution of event2 for ME technique + kTwoR2EP1, // Event plane resolution of event2 for ME technique + kTwoR2EP2, // Event plane resolution of event2 for ME technique // Variables for event mixing with cumulant kV22m, @@ -1373,7 +1372,7 @@ class VarManager : public TObject template static void FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, float* values = nullptr, float Translow = 1. / 3, float Transhigh = 2. / 3, bool applyFitMass = false, float sidebandMass = 0.0f); template - static void FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, T4 const& track, T5 const& t1, float* values = nullptr, bool applyFitMass = false); + static void FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, T4 const& track, T5 const& t1, float* values = nullptr); template static void FillDileptonPhoton(T1 const& dilepton, T2 const& photon, float* values = nullptr); template @@ -5901,7 +5900,7 @@ void VarManager::FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2 } template -void VarManager::FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, T4 const& track, T5 const& t1, float* values, bool applyFitMass) +void VarManager::FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, T4 const& track, T5 const& t1, float* values) { if (fgUsedVars[kMCCosChi_gen] || fgUsedVars[kMCWeight_gen] || fgUsedVars[kMCdeltaeta_gen] || fgUsedVars[kMCCosChi_rec] || fgUsedVars[kMCWeight_rec] || fgUsedVars[kMCdeltaeta_rec]) { // energy correlators @@ -5913,11 +5912,6 @@ void VarManager::FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 cons ROOT::Math::PtEtaPhiMVector v_lepton2(lepton2.pt(), lepton2.eta(), lepton2.phi(), m2); ROOT::Math::PtEtaPhiMVector dilepton = v_lepton1 + v_lepton2; - float dileptonmass = o2::constants::physics::MassJPsi; - if (applyFitMass) { - dileptonmass = dilepton.mass(); - } - float MassHadron; if constexpr (pairType == kJpsiHadronMass) { MassHadron = TMath::Sqrt(t1.e() * t1.e() - t1.p() * t1.p()); @@ -5933,7 +5927,7 @@ void VarManager::FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 cons values[kMCWeight_gen] = E_boost_gen / o2::constants::physics::MassJPsi; values[kMCdeltaeta_gen] = track.eta() - t1.eta(); - ROOT::Math::PtEtaPhiMVector v1_rec(dilepton.pt(), dilepton.eta(), dilepton.phi(), dileptonmass); + ROOT::Math::PtEtaPhiMVector v1_rec(dilepton.pt(), dilepton.eta(), dilepton.phi(), dilepton.mass()); ROOT::Math::PtEtaPhiMVector v2_rec(hadron.pt(), hadron.eta(), hadron.phi(), o2::constants::physics::MassPionCharged); values[kMCCosChi_rec] = LorentzTransformJpsihadroncosChi("coschi", v1_rec, v2_rec); float E_boost_rec = LorentzTransformJpsihadroncosChi("weight_boost", v1_rec, v2_rec); From 7eaaaeaccd889ef4ccaba4719805eca0b4eeaf28 Mon Sep 17 00:00:00 2001 From: Joachim Carlo Kristian Bjerg Hansen <50103987+joachimckh@users.noreply.github.com> Date: Thu, 26 Mar 2026 11:08:08 +0100 Subject: [PATCH 2/6] [PWGJE] tracking efficiency (#15520) --- PWGJE/Tasks/jetSpectraEseTask.cxx | 72 +++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 22 deletions(-) diff --git a/PWGJE/Tasks/jetSpectraEseTask.cxx b/PWGJE/Tasks/jetSpectraEseTask.cxx index e9e445861e0..8029b1aaf03 100644 --- a/PWGJE/Tasks/jetSpectraEseTask.cxx +++ b/PWGJE/Tasks/jetSpectraEseTask.cxx @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -60,6 +61,7 @@ using namespace o2::framework; using namespace o2::framework::expressions; struct JetSpectraEseTask { + Configurable cfgEfficiency{"cfgEfficiency", "", "CCDB path to efficiency"}; Configurable cfgEfficiency{"cfgEfficiency", "", "CCDB path to efficiency"}; Configurable jetPtMin{"jetPtMin", 5.0, "minimum jet pT cut"}; Configurable jetR{"jetR", 0.2, "jet resolution parameter"}; @@ -147,6 +149,12 @@ struct JetSpectraEseTask { bool isLoaded = false; } cfg; + Service ccdb; + struct Efficiency { + TH1D* hEff = nullptr; + bool isLoaded = false; + } cfg; + Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax); Filter jetCuts = aod::jet::pt > jetPtMin&& aod::jet::r == nround(jetR.node() * Scaler) && nabs(aod::jet::eta) < Acceptance - jetR; Filter colFilter = nabs(aod::jcollision::posZ) < vertexZCut; @@ -155,11 +163,13 @@ struct JetSpectraEseTask { Preslice mcdjetsPerJCollision = o2::aod::jet::collisionId; Preslice tracksPerJCollision = o2::aod::jtrack::collisionId; Preslice mcdTracksPerJCollision = o2::aod::jtrack::collisionId; + Preslice particlesPerJMcCollision = o2::aod::jmcparticle::mcCollisionId; SliceCache cache; using BinningType = ColumnBinningPolicy; BinningType corrBinning{{binsZVtx, binsCentrality}, true}; Service pdg; + Service pdg; enum class DetID { FT0C, FT0A, @@ -410,20 +420,19 @@ struct JetSpectraEseTask { } if (doprocessMCGenTrack) { LOGF(info, "JetSpectraEseTask::init() - MCGen track"); - registry.add("mcgen/hTrackPtGen", "", {HistType::kTH1F, {{assocTrackPt}}}); - registry.add("mcgen/hTrackEtaGen", "", {HistType::kTH1F, {{etaAxis}}}); - registry.add("mcgen/hTrackPhiGen", "", {HistType::kTH1F, {{phiAxis}}}); + registry.add("hTrackPtGen", "", {HistType::kTH1F, {{assocTrackPt}}}); + registry.add("hTrackEtaGen", "", {HistType::kTH1F, {{etaAxis}}}); + registry.add("hTrackPhiGen", "", {HistType::kTH1F, {{phiAxis}}}); } if (doprocessMCRecoTrack) { LOGF(info, "JetSpectraEseTask::init() - MCRec track"); - registry.add("mcrec/hTrackPtReco", "", {HistType::kTH1F, {{assocTrackPt}}}); - registry.add("mcrec/hTrackEtaReco", "", {HistType::kTH1F, {{etaAxis}}}); - registry.add("mcrec/hTrackPhiReco", "", {HistType::kTH1F, {{phiAxis}}}); + registry.add("hTrackPtReco", "", {HistType::kTH1F, {{assocTrackPt}}}); + registry.add("hTrackEtaReco", "", {HistType::kTH1F, {{etaAxis}}}); + registry.add("hTrackPhiReco", "", {HistType::kTH1F, {{phiAxis}}}); } } - template - void loadEfficiency(TBC const& bc) + void loadEfficiency(aod::BCsWithTimestamps::iterator const& bc) { uint64_t timestamp = bc.timestamp(); if (cfg.isLoaded) { @@ -525,15 +534,24 @@ struct JetSpectraEseTask { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) continue; double weff = getEfficiency(track); + if (weff < 0) + continue; + double weff = getEfficiency(track); if (weff < 0) continue; auto deta = track.eta() - jet.eta(); auto dphi = RecoDecay::constrainAngle(track.phi() - jet.phi(), -o2::constants::math::PIHalf); registry.fill(HIST("thn_jethad_corr_same"), centrality, vCorrL, track.pt(), deta, dphi, dPhi, qPerc[0], weff); hSameSub[lRndInd]->Fill(centrality, vCorrL, track.pt(), deta, dphi, dPhi, qPerc[0], weff); + registry.fill(HIST("thn_jethad_corr_same"), centrality, vCorrL, track.pt(), deta, dphi, dPhi, qPerc[0], weff); + hSameSub[lRndInd]->Fill(centrality, vCorrL, track.pt(), deta, dphi, dPhi, qPerc[0], weff); } } for (const auto& track : tracks) { + double weff = getEfficiency(track); + if (weff < 0) + continue; + registry.fill(HIST("trackQA/before/hTrackPt"), centrality, track.pt(), weff); double weff = getEfficiency(track); if (weff < 0) continue; @@ -543,6 +561,7 @@ struct JetSpectraEseTask { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) continue; registry.fill(HIST("trackQA/after/hTrackPt"), centrality, track.pt(), weff); + registry.fill(HIST("trackQA/after/hTrackPt"), centrality, track.pt(), weff); registry.fill(HIST("trackQA/after/hTrackEta"), centrality, track.eta()); registry.fill(HIST("trackQA/after/hTrackPhi"), centrality, track.phi()); registry.fill(HIST("h3CenttrPhiPsi2"), centrality, RecoDecay::constrainAngle(track.phi() - psi.psi2, -o2::constants::math::PI), qPerc[0]); @@ -557,8 +576,9 @@ struct JetSpectraEseTask { auto tracksTuple = std::make_tuple(jets, tracks); Pair pairData{corrBinning, numberEventsMixed, -1, collisions, tracksTuple, &cache}; + for (const auto& [c1, jets1, c2, tracks2] : pairData) { - auto bc = c2.template bc_as(); + auto bc = c2.template bc_as(); loadEfficiency(bc); auto c1Tracks = tracks.sliceBy(tracksPerJCollision, c1.globalIndex()); registry.fill(HIST("eventQA/before/hVtxZMixed"), c1.posZ()); @@ -618,20 +638,29 @@ struct JetSpectraEseTask { auto vCorrL = cfgrhoPhi ? corrL(jet) : vCorr; float dPhi{RecoDecay::constrainAngle(jet.phi() - psi.psi2, -o2::constants::math::PI)}; + registry.fill(HIST("hNtrigMixed"), centrality, vCorrL, dPhi, qPerc[0]); registry.fill(HIST("hNtrigMixed"), centrality, vCorrL, dPhi, qPerc[0]); for (const auto& track : tracks2) { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) continue; double weff = getEfficiency(track); + if (weff < 0) + continue; + double weff = getEfficiency(track); if (weff < 0) continue; auto deta = track.eta() - jet.eta(); auto dphi = RecoDecay::constrainAngle(track.phi() - jet.phi(), -o2::constants::math::PIHalf); registry.fill(HIST("thn_jethad_corr_mixed"), centrality, vCorrL, track.pt(), deta, dphi, dPhi, qPerc[0], weff); + registry.fill(HIST("thn_jethad_corr_mixed"), centrality, vCorrL, track.pt(), deta, dphi, dPhi, qPerc[0], weff); } } for (const auto& track : tracks2) { + double weff = getEfficiency(track); + if (weff < 0) + continue; + registry.fill(HIST("trackQA/before/hTrackPtMixed"), centrality, track.pt(), weff); double weff = getEfficiency(track); if (weff < 0) continue; @@ -641,6 +670,7 @@ struct JetSpectraEseTask { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) continue; registry.fill(HIST("trackQA/after/hTrackPtMixed"), centrality, track.pt(), weff); + registry.fill(HIST("trackQA/after/hTrackPtMixed"), centrality, track.pt(), weff); registry.fill(HIST("trackQA/after/hTrackEtaMixed"), centrality, track.eta()); registry.fill(HIST("trackQA/after/hTrackPhiMixed"), centrality, track.phi()); } @@ -649,7 +679,7 @@ struct JetSpectraEseTask { void processESEDataCharged(soa::Join::iterator const& collision, soa::Filtered> const& jets, - aod::JetTracks const& tracks, aod::JBCs const&) + aod::JetTracks const& tracks, aod::BCsWithTimestamps const&) { registry.fill(HIST("eventQA/hEventCounter"), kFilteredInputEv); registry.fill(HIST("eventQA/before/hVtxZ"), collision.posZ()); @@ -661,7 +691,7 @@ struct JetSpectraEseTask { return; registry.fill(HIST("eventQA/hEventCounter"), kOccupancyCut); - auto bc = collision.bc_as(); + auto bc = collision.bc_as(); loadEfficiency(bc); jetSpectra(collision, jets, tracks); } @@ -669,7 +699,7 @@ struct JetSpectraEseTask { void processESEDataChargedMixed(soa::Join const& collisions, soa::Filtered> const& jets, - aod::JetTracks const& tracks, aod::JBCs const&) + aod::JetTracks const& tracks, aod::BCsWithTimestamps const&) { jetMixed(collisions, jets, tracks); } @@ -886,10 +916,8 @@ struct JetSpectraEseTask { return; } - for (const auto& particle : particles) { - if (particle.mcCollisionId() != mcCollision.globalIndex()) { - continue; - } + auto particlesInCollision = particles.sliceBy(particlesPerJMcCollision, mcCollision.globalIndex()); + for (const auto& particle : particlesInCollision) { if (!isChargedParticle(particle.pdgCode())) { continue; } @@ -903,9 +931,9 @@ struct JetSpectraEseTask { continue; } - registry.fill(HIST("mcgen/hTrackPtGen"), particle.pt()); - registry.fill(HIST("mcgen/hTrackEtaGen"), particle.eta()); - registry.fill(HIST("mcgen/hTrackPhiGen"), particle.phi()); + registry.fill(HIST("hTrackPtGen"), particle.pt()); + registry.fill(HIST("hTrackEtaGen"), particle.eta()); + registry.fill(HIST("hTrackPhiGen"), particle.phi()); } } PROCESS_SWITCH(JetSpectraEseTask, processMCGenTrack, "jet MC process: Generated track", false); @@ -968,9 +996,9 @@ struct JetSpectraEseTask { } seenMcParticles.push_back(particle.globalIndex()); - registry.fill(HIST("mcrec/hTrackPtReco"), track.pt()); - registry.fill(HIST("mcrec/hTrackEtaReco"), track.eta()); - registry.fill(HIST("mcrec/hTrackPhiReco"), track.phi()); + registry.fill(HIST("hTrackPtReco"), track.pt()); + registry.fill(HIST("hTrackEtaReco"), track.eta()); + registry.fill(HIST("hTrackPhiReco"), track.phi()); } } } From e3b9775d77456841d6b8238bf01d0466efdab141 Mon Sep 17 00:00:00 2001 From: Ankur Yadav Date: Thu, 26 Mar 2026 13:30:23 +0100 Subject: [PATCH 3/6] Added a new process function to add the sum of squared amplituted of FT0C for flow calculation using 2PC method --- PWGDQ/Core/VarManager.h | 31 ++++++++++++++++++++------ PWGDQ/Tasks/dqFlow.cxx | 49 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 72 insertions(+), 8 deletions(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 33155e926e2..cd1e8bce75e 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -486,10 +486,11 @@ class VarManager : public TObject kV2ME_EP, kWV2ME_SP, kWV2ME_EP, - kTwoR2SP1, // Scalar product resolution of event1 for ME technique - kTwoR2SP2, // Scalar product resolution of event2 for ME technique - kTwoR2EP1, // Event plane resolution of event2 for ME technique - kTwoR2EP2, // Event plane resolution of event2 for ME technique + kTwoR2SP1, // Scalar product resolution of event1 for ME technique + kTwoR2SP2, // Scalar product resolution of event2 for ME technique + kTwoR2EP1, // Event plane resolution of event2 for ME technique + kTwoR2EP2, // Event plane resolution of event2 for ME technique + kNPairsPerEvent, // number of pairs per event in same-event or mixed-event pairing // Variables for event mixing with cumulant kV22m, @@ -805,6 +806,8 @@ class VarManager : public TObject kS12A, kS13A, kS31A, + kS11C, + kS12C, kM11REF, kM11REFetagap, kM01POI, @@ -1372,7 +1375,7 @@ class VarManager : public TObject template static void FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, float* values = nullptr, float Translow = 1. / 3, float Transhigh = 2. / 3, bool applyFitMass = false, float sidebandMass = 0.0f); template - static void FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, T4 const& track, T5 const& t1, float* values = nullptr); + static void FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, T4 const& track, T5 const& t1, float* values = nullptr, bool applyFitMass = false); template static void FillDileptonPhoton(T1 const& dilepton, T2 const& photon, float* values = nullptr); template @@ -5484,6 +5487,15 @@ void VarManager::FillQVectorFromCentralFW(C const& collision, float* values) values[kR2EP_FT0MTPCNEG] = TMath::Cos(2 * getDeltaPsiInRange(epFT0m, epBNegs, 2)); values[kR2EP_FV0ATPCPOS] = TMath::Cos(2 * getDeltaPsiInRange(epFV0a, epBPoss, 2)); values[kR2EP_FV0ATPCNEG] = TMath::Cos(2 * getDeltaPsiInRange(epFV0a, epBNegs, 2)); + + float S21C = values[kS11C] * values[kS11C]; + //complex Q21C(values[kQ2X0C] * values[kS11C], values[kQ2Y0C] * values[kS11C]); + + // Fill necessary quantities for cumulant calculations with weighted Q-vectors + values[kM11REF] = S21C - values[kS12C]; + //values[kCORR2REF] = (norm(Q21C) - values[kS12C]) / values[kM11REF]; + //values[kCORR2REF] = std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) ? 0 : values[kCORR2REF]; + values[kM11REF] = std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) ? 0 : values[kM11REF]; } template @@ -5900,7 +5912,7 @@ void VarManager::FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2 } template -void VarManager::FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, T4 const& track, T5 const& t1, float* values) +void VarManager::FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, T4 const& track, T5 const& t1, float* values, bool applyFitMass) { if (fgUsedVars[kMCCosChi_gen] || fgUsedVars[kMCWeight_gen] || fgUsedVars[kMCdeltaeta_gen] || fgUsedVars[kMCCosChi_rec] || fgUsedVars[kMCWeight_rec] || fgUsedVars[kMCdeltaeta_rec]) { // energy correlators @@ -5912,6 +5924,11 @@ void VarManager::FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 cons ROOT::Math::PtEtaPhiMVector v_lepton2(lepton2.pt(), lepton2.eta(), lepton2.phi(), m2); ROOT::Math::PtEtaPhiMVector dilepton = v_lepton1 + v_lepton2; + float dileptonmass = o2::constants::physics::MassJPsi; + if (applyFitMass) { + dileptonmass = dilepton.mass(); + } + float MassHadron; if constexpr (pairType == kJpsiHadronMass) { MassHadron = TMath::Sqrt(t1.e() * t1.e() - t1.p() * t1.p()); @@ -5927,7 +5944,7 @@ void VarManager::FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 cons values[kMCWeight_gen] = E_boost_gen / o2::constants::physics::MassJPsi; values[kMCdeltaeta_gen] = track.eta() - t1.eta(); - ROOT::Math::PtEtaPhiMVector v1_rec(dilepton.pt(), dilepton.eta(), dilepton.phi(), dilepton.mass()); + ROOT::Math::PtEtaPhiMVector v1_rec(dilepton.pt(), dilepton.eta(), dilepton.phi(), dileptonmass); ROOT::Math::PtEtaPhiMVector v2_rec(hadron.pt(), hadron.eta(), hadron.phi(), o2::constants::physics::MassPionCharged); values[kMCCosChi_rec] = LorentzTransformJpsihadroncosChi("coschi", v1_rec, v2_rec); float E_boost_rec = LorentzTransformJpsihadroncosChi("weight_boost", v1_rec, v2_rec); diff --git a/PWGDQ/Tasks/dqFlow.cxx b/PWGDQ/Tasks/dqFlow.cxx index 547068bab36..71fa3bba7de 100644 --- a/PWGDQ/Tasks/dqFlow.cxx +++ b/PWGDQ/Tasks/dqFlow.cxx @@ -352,6 +352,46 @@ struct DQEventQvector { } } + // Templated function instantianed for all of the process functions + template + void runFillQvectorFromCentralFWWithFT0CCumulants(TEvent const& collision, TFT0s const& /*ft0s*/) + { + VarManager::ResetValues(0, VarManager::kNVars); + VarManager::FillEvent(collision); + + + if (fConfigQA) { + fHistMan->FillHistClass("Event_BeforeCuts_centralFW", VarManager::fgValues); + if (fEventCut->IsSelected(VarManager::fgValues)) { + fHistMan->FillHistClass("Event_AfterCuts_centralFW", VarManager::fgValues); + } + } + + if (fEventCut->IsSelected(VarManager::fgValues)) { + float S11C = collision.sumAmplFT0C(); + float S12C = 0.f; + + if (collision.has_foundFT0()) { + auto ft0 = collision.foundFT0(); + auto const& ampC = ft0.amplitudeC(); + for (auto amp : ampC) { + if (amp > 0.f) { + S12C += amp * amp; + } + } + } + VarManager::fgValues[VarManager::kS11C] = S11C; + VarManager::fgValues[VarManager::kS12C] = S12C; + VarManager::FillQVectorFromCentralFW(collision); + + eventQvectorCentr(collision.qvecFT0ARe(), collision.qvecFT0AIm(), collision.qvecFT0CRe(), collision.qvecFT0CIm(), collision.qvecFT0MRe(), collision.qvecFT0MIm(), collision.qvecFV0ARe(), collision.qvecFV0AIm(), collision.qvecTPCposRe(), collision.qvecTPCposIm(), collision.qvecTPCnegRe(), collision.qvecTPCnegIm(), + collision.sumAmplFT0A(), collision.sumAmplFT0C(), collision.sumAmplFT0M(), collision.sumAmplFV0A(), collision.nTrkTPCpos(), collision.nTrkTPCneg()); + eventQvectorCentrExtra(collision.qvecTPCallRe(), collision.qvecTPCallIm(), collision.nTrkTPCall()); + eventRefFlow(VarManager::fgValues[VarManager::kM11REF], VarManager::fgValues[VarManager::kM11REFetagap], VarManager::fgValues[VarManager::kM1111REF], VarManager::fgValues[VarManager::kCORR2REF], VarManager::fgValues[VarManager::kCORR2REFetagap], VarManager::fgValues[VarManager::kCORR4REF], VarManager::fgValues[VarManager::kCentFT0C]); + eventQvectorExtra(0.f, 0.f, 0.f, 0.f, S11C, S12C, 0.f, 0.f); + } + } + // Templated function instantianed for all of the process functions template void runFillQvector(TEvent const& collision, MyBcs const&, TTracks const& tracks1, aod::Zdcs const&) @@ -574,6 +614,12 @@ struct DQEventQvector { runFillQvectorFromCentralFW(collisions); } + // Process to fill Q vector using barrel tracks in a reduced event table for barrel/muon tracks flow related analyses Run 3 + void processCentralQvectorWithFT0CCumulants(MyEventsWithCentQvectRun3::iterator const& collision, aod::FT0s const& ft0s) + { + runFillQvectorFromCentralFWWithFT0CCumulants(collision, ft0s); + } + // Process to fill Q vector using forward tracks in a reduced event table for barrel/muon tracks flow related analyses Run 3 void processForwardQvector(MyEventsWithCentRun3::iterator const& collisions, MyBcs const& bcs, soa::Filtered const& tracks, aod::Zdcs const& zdcs) { @@ -590,6 +636,7 @@ struct DQEventQvector { PROCESS_SWITCH(DQEventQvector, processBarrelQvector, "Run q-vector task on barrel tracks for Run3", false); PROCESS_SWITCH(DQEventQvector, processAllQvector, "Run q-vector task on barrel tracks for Run3 and using central q-vector", false); PROCESS_SWITCH(DQEventQvector, processCentralQvector, "Run q-vector task using central q-vector", false); + PROCESS_SWITCH(DQEventQvector, processCentralQvectorWithFT0CCumulants, "Run q-vector task using central q-vector with FT0C cumulants", false); PROCESS_SWITCH(DQEventQvector, processForwardQvector, "Run q-vector task on forward tracks for Run3", false); PROCESS_SWITCH(DQEventQvector, processDummy, "Dummy function", false); }; @@ -618,4 +665,4 @@ void DefineHistograms(HistogramManager* histMan, TString histClasses) dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "track", "cent,kine,time,map,its,clssize,tpc"); } } -} +} \ No newline at end of file From 1a2c4374fef45b40aa7394b67ce5e1b3c8e1c34c Mon Sep 17 00:00:00 2001 From: Ankur Yadav Date: Thu, 26 Mar 2026 23:35:35 +0100 Subject: [PATCH 4/6] Added the necessary variable in VarManager to compute M11REF and CORR2REF and add them to the refflow table --- PWGDQ/Core/VarManager.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index cd1e8bce75e..ea4eac1164d 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -5489,12 +5489,12 @@ void VarManager::FillQVectorFromCentralFW(C const& collision, float* values) values[kR2EP_FV0ATPCNEG] = TMath::Cos(2 * getDeltaPsiInRange(epFV0a, epBNegs, 2)); float S21C = values[kS11C] * values[kS11C]; - //complex Q21C(values[kQ2X0C] * values[kS11C], values[kQ2Y0C] * values[kS11C]); + complex Q21C(values[kQ2X0C] * values[kS11C], values[kQ2Y0C] * values[kS11C]); // Fill necessary quantities for cumulant calculations with weighted Q-vectors values[kM11REF] = S21C - values[kS12C]; - //values[kCORR2REF] = (norm(Q21C) - values[kS12C]) / values[kM11REF]; - //values[kCORR2REF] = std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) ? 0 : values[kCORR2REF]; + values[kCORR2REF] = (norm(Q21C) - values[kS12C]) / values[kM11REF]; + values[kCORR2REF] = std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) ? 0 : values[kCORR2REF]; values[kM11REF] = std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) ? 0 : values[kM11REF]; } From 49beb772d79ab323ee7231d063bf449f297a1647 Mon Sep 17 00:00:00 2001 From: Ankur Yadav Date: Tue, 7 Apr 2026 11:13:22 +0200 Subject: [PATCH 5/6] syntax error in VarManager.h --- PWGDQ/Core/VarManager.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index ea4eac1164d..22b9794eb4b 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -5489,7 +5489,7 @@ void VarManager::FillQVectorFromCentralFW(C const& collision, float* values) values[kR2EP_FV0ATPCNEG] = TMath::Cos(2 * getDeltaPsiInRange(epFV0a, epBNegs, 2)); float S21C = values[kS11C] * values[kS11C]; - complex Q21C(values[kQ2X0C] * values[kS11C], values[kQ2Y0C] * values[kS11C]); + std::complex Q21C(values[kQ2X0C] * values[kS11C], values[kQ2Y0C] * values[kS11C]); // Fill necessary quantities for cumulant calculations with weighted Q-vectors values[kM11REF] = S21C - values[kS12C]; From 54b64db38a1503051af42392e12460a60530e647 Mon Sep 17 00:00:00 2001 From: Ankur Yadav Date: Wed, 8 Apr 2026 11:34:29 +0200 Subject: [PATCH 6/6] Now computing M11REF and CORR2REF variables that are required for the 2PC flow aanalysis in dqFlow itself and filling them in the table rather than computing them in VarManager --- PWGDQ/Core/VarManager.h | 11 ----- PWGDQ/Tasks/dqFlow.cxx | 46 +++++++++++--------- PWGJE/Tasks/jetSpectraEseTask.cxx | 72 ++++++++++--------------------- 3 files changed, 48 insertions(+), 81 deletions(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 22b9794eb4b..3129822100f 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -806,8 +806,6 @@ class VarManager : public TObject kS12A, kS13A, kS31A, - kS11C, - kS12C, kM11REF, kM11REFetagap, kM01POI, @@ -5487,15 +5485,6 @@ void VarManager::FillQVectorFromCentralFW(C const& collision, float* values) values[kR2EP_FT0MTPCNEG] = TMath::Cos(2 * getDeltaPsiInRange(epFT0m, epBNegs, 2)); values[kR2EP_FV0ATPCPOS] = TMath::Cos(2 * getDeltaPsiInRange(epFV0a, epBPoss, 2)); values[kR2EP_FV0ATPCNEG] = TMath::Cos(2 * getDeltaPsiInRange(epFV0a, epBNegs, 2)); - - float S21C = values[kS11C] * values[kS11C]; - std::complex Q21C(values[kQ2X0C] * values[kS11C], values[kQ2Y0C] * values[kS11C]); - - // Fill necessary quantities for cumulant calculations with weighted Q-vectors - values[kM11REF] = S21C - values[kS12C]; - values[kCORR2REF] = (norm(Q21C) - values[kS12C]) / values[kM11REF]; - values[kCORR2REF] = std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) ? 0 : values[kCORR2REF]; - values[kM11REF] = std::isnan(values[kM11REF]) || std::isinf(values[kM11REF]) || std::isnan(values[kCORR2REF]) || std::isinf(values[kCORR2REF]) ? 0 : values[kM11REF]; } template diff --git a/PWGDQ/Tasks/dqFlow.cxx b/PWGDQ/Tasks/dqFlow.cxx index 71fa3bba7de..d489028b4d5 100644 --- a/PWGDQ/Tasks/dqFlow.cxx +++ b/PWGDQ/Tasks/dqFlow.cxx @@ -142,7 +142,7 @@ struct DQEventQvector { ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100.1}, "multiplicity / centrality axis for histograms"}; // Define the filter for barrel tracks and forward tracks - Filter trackFilter = (requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t) true); + Filter trackFilter = (requireGlobalTrackInFilter()) || (aod::track::isGlobalTrackSDD == (uint8_t)true); Filter fwdFilter = (aod::fwdtrack::eta < -2.45f) && (aod::fwdtrack::eta > -3.6f); // Histograms used for optionnal efficiency and non-uniform acceptance corrections @@ -359,6 +359,28 @@ struct DQEventQvector { VarManager::ResetValues(0, VarManager::kNVars); VarManager::FillEvent(collision); + float S11C = collision.sumAmplFT0C(); + float S12C = 0.f; + float S21C = S11C * S11C; + + // Compute sum of squares of amplitudes from FT0C for flow analysis + if (collision.has_foundFT0()) { + auto ft0 = collision.foundFT0(); + auto const& ampC = ft0.amplitudeC(); + for (auto amp : ampC) { + if (amp > 0.f) { + S12C += amp * amp; + } + } + } + VarManager::FillQVectorFromCentralFW(collision); + std::complex Q21C(collision.qvecFT0CRe() * S11C, collision.qvecFT0CIm() * S11C); + + // Fill necessary quantities for cumulant calculations with weighted Q-vectors + float M11REF = S21C - S12C; + float CORR2REF = (norm(Q21C) - S12C) / M11REF; + CORR2REF = std::isnan(M11REF) || std::isinf(M11REF) || std::isnan(CORR2REF) || std::isinf(CORR2REF) ? 0 : CORR2REF; + M11REF = std::isnan(M11REF) || std::isinf(M11REF) || std::isnan(CORR2REF) || std::isinf(CORR2REF) ? 0 : M11REF; if (fConfigQA) { fHistMan->FillHistClass("Event_BeforeCuts_centralFW", VarManager::fgValues); @@ -368,27 +390,11 @@ struct DQEventQvector { } if (fEventCut->IsSelected(VarManager::fgValues)) { - float S11C = collision.sumAmplFT0C(); - float S12C = 0.f; - - if (collision.has_foundFT0()) { - auto ft0 = collision.foundFT0(); - auto const& ampC = ft0.amplitudeC(); - for (auto amp : ampC) { - if (amp > 0.f) { - S12C += amp * amp; - } - } - } - VarManager::fgValues[VarManager::kS11C] = S11C; - VarManager::fgValues[VarManager::kS12C] = S12C; - VarManager::FillQVectorFromCentralFW(collision); - eventQvectorCentr(collision.qvecFT0ARe(), collision.qvecFT0AIm(), collision.qvecFT0CRe(), collision.qvecFT0CIm(), collision.qvecFT0MRe(), collision.qvecFT0MIm(), collision.qvecFV0ARe(), collision.qvecFV0AIm(), collision.qvecTPCposRe(), collision.qvecTPCposIm(), collision.qvecTPCnegRe(), collision.qvecTPCnegIm(), collision.sumAmplFT0A(), collision.sumAmplFT0C(), collision.sumAmplFT0M(), collision.sumAmplFV0A(), collision.nTrkTPCpos(), collision.nTrkTPCneg()); eventQvectorCentrExtra(collision.qvecTPCallRe(), collision.qvecTPCallIm(), collision.nTrkTPCall()); - eventRefFlow(VarManager::fgValues[VarManager::kM11REF], VarManager::fgValues[VarManager::kM11REFetagap], VarManager::fgValues[VarManager::kM1111REF], VarManager::fgValues[VarManager::kCORR2REF], VarManager::fgValues[VarManager::kCORR2REFetagap], VarManager::fgValues[VarManager::kCORR4REF], VarManager::fgValues[VarManager::kCentFT0C]); - eventQvectorExtra(0.f, 0.f, 0.f, 0.f, S11C, S12C, 0.f, 0.f); + eventRefFlow(M11REF, -9999, -9999, CORR2REF, -9999, -9999, VarManager::fgValues[VarManager::kCentFT0C]); + eventQvectorExtra(-9999, -9999, -9999, -9999, S11C, S12C, -9999, -9999); } } @@ -665,4 +671,4 @@ void DefineHistograms(HistogramManager* histMan, TString histClasses) dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "track", "cent,kine,time,map,its,clssize,tpc"); } } -} \ No newline at end of file +} diff --git a/PWGJE/Tasks/jetSpectraEseTask.cxx b/PWGJE/Tasks/jetSpectraEseTask.cxx index 8029b1aaf03..e9e445861e0 100644 --- a/PWGJE/Tasks/jetSpectraEseTask.cxx +++ b/PWGJE/Tasks/jetSpectraEseTask.cxx @@ -35,7 +35,6 @@ #include #include #include -#include #include #include @@ -61,7 +60,6 @@ using namespace o2::framework; using namespace o2::framework::expressions; struct JetSpectraEseTask { - Configurable cfgEfficiency{"cfgEfficiency", "", "CCDB path to efficiency"}; Configurable cfgEfficiency{"cfgEfficiency", "", "CCDB path to efficiency"}; Configurable jetPtMin{"jetPtMin", 5.0, "minimum jet pT cut"}; Configurable jetR{"jetR", 0.2, "jet resolution parameter"}; @@ -149,12 +147,6 @@ struct JetSpectraEseTask { bool isLoaded = false; } cfg; - Service ccdb; - struct Efficiency { - TH1D* hEff = nullptr; - bool isLoaded = false; - } cfg; - Filter trackCuts = (aod::jtrack::pt >= trackPtMin && aod::jtrack::pt < trackPtMax && aod::jtrack::eta > trackEtaMin && aod::jtrack::eta < trackEtaMax); Filter jetCuts = aod::jet::pt > jetPtMin&& aod::jet::r == nround(jetR.node() * Scaler) && nabs(aod::jet::eta) < Acceptance - jetR; Filter colFilter = nabs(aod::jcollision::posZ) < vertexZCut; @@ -163,13 +155,11 @@ struct JetSpectraEseTask { Preslice mcdjetsPerJCollision = o2::aod::jet::collisionId; Preslice tracksPerJCollision = o2::aod::jtrack::collisionId; Preslice mcdTracksPerJCollision = o2::aod::jtrack::collisionId; - Preslice particlesPerJMcCollision = o2::aod::jmcparticle::mcCollisionId; SliceCache cache; using BinningType = ColumnBinningPolicy; BinningType corrBinning{{binsZVtx, binsCentrality}, true}; Service pdg; - Service pdg; enum class DetID { FT0C, FT0A, @@ -420,19 +410,20 @@ struct JetSpectraEseTask { } if (doprocessMCGenTrack) { LOGF(info, "JetSpectraEseTask::init() - MCGen track"); - registry.add("hTrackPtGen", "", {HistType::kTH1F, {{assocTrackPt}}}); - registry.add("hTrackEtaGen", "", {HistType::kTH1F, {{etaAxis}}}); - registry.add("hTrackPhiGen", "", {HistType::kTH1F, {{phiAxis}}}); + registry.add("mcgen/hTrackPtGen", "", {HistType::kTH1F, {{assocTrackPt}}}); + registry.add("mcgen/hTrackEtaGen", "", {HistType::kTH1F, {{etaAxis}}}); + registry.add("mcgen/hTrackPhiGen", "", {HistType::kTH1F, {{phiAxis}}}); } if (doprocessMCRecoTrack) { LOGF(info, "JetSpectraEseTask::init() - MCRec track"); - registry.add("hTrackPtReco", "", {HistType::kTH1F, {{assocTrackPt}}}); - registry.add("hTrackEtaReco", "", {HistType::kTH1F, {{etaAxis}}}); - registry.add("hTrackPhiReco", "", {HistType::kTH1F, {{phiAxis}}}); + registry.add("mcrec/hTrackPtReco", "", {HistType::kTH1F, {{assocTrackPt}}}); + registry.add("mcrec/hTrackEtaReco", "", {HistType::kTH1F, {{etaAxis}}}); + registry.add("mcrec/hTrackPhiReco", "", {HistType::kTH1F, {{phiAxis}}}); } } - void loadEfficiency(aod::BCsWithTimestamps::iterator const& bc) + template + void loadEfficiency(TBC const& bc) { uint64_t timestamp = bc.timestamp(); if (cfg.isLoaded) { @@ -534,24 +525,15 @@ struct JetSpectraEseTask { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) continue; double weff = getEfficiency(track); - if (weff < 0) - continue; - double weff = getEfficiency(track); if (weff < 0) continue; auto deta = track.eta() - jet.eta(); auto dphi = RecoDecay::constrainAngle(track.phi() - jet.phi(), -o2::constants::math::PIHalf); registry.fill(HIST("thn_jethad_corr_same"), centrality, vCorrL, track.pt(), deta, dphi, dPhi, qPerc[0], weff); hSameSub[lRndInd]->Fill(centrality, vCorrL, track.pt(), deta, dphi, dPhi, qPerc[0], weff); - registry.fill(HIST("thn_jethad_corr_same"), centrality, vCorrL, track.pt(), deta, dphi, dPhi, qPerc[0], weff); - hSameSub[lRndInd]->Fill(centrality, vCorrL, track.pt(), deta, dphi, dPhi, qPerc[0], weff); } } for (const auto& track : tracks) { - double weff = getEfficiency(track); - if (weff < 0) - continue; - registry.fill(HIST("trackQA/before/hTrackPt"), centrality, track.pt(), weff); double weff = getEfficiency(track); if (weff < 0) continue; @@ -561,7 +543,6 @@ struct JetSpectraEseTask { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) continue; registry.fill(HIST("trackQA/after/hTrackPt"), centrality, track.pt(), weff); - registry.fill(HIST("trackQA/after/hTrackPt"), centrality, track.pt(), weff); registry.fill(HIST("trackQA/after/hTrackEta"), centrality, track.eta()); registry.fill(HIST("trackQA/after/hTrackPhi"), centrality, track.phi()); registry.fill(HIST("h3CenttrPhiPsi2"), centrality, RecoDecay::constrainAngle(track.phi() - psi.psi2, -o2::constants::math::PI), qPerc[0]); @@ -576,9 +557,8 @@ struct JetSpectraEseTask { auto tracksTuple = std::make_tuple(jets, tracks); Pair pairData{corrBinning, numberEventsMixed, -1, collisions, tracksTuple, &cache}; - for (const auto& [c1, jets1, c2, tracks2] : pairData) { - auto bc = c2.template bc_as(); + auto bc = c2.template bc_as(); loadEfficiency(bc); auto c1Tracks = tracks.sliceBy(tracksPerJCollision, c1.globalIndex()); registry.fill(HIST("eventQA/before/hVtxZMixed"), c1.posZ()); @@ -638,29 +618,20 @@ struct JetSpectraEseTask { auto vCorrL = cfgrhoPhi ? corrL(jet) : vCorr; float dPhi{RecoDecay::constrainAngle(jet.phi() - psi.psi2, -o2::constants::math::PI)}; - registry.fill(HIST("hNtrigMixed"), centrality, vCorrL, dPhi, qPerc[0]); registry.fill(HIST("hNtrigMixed"), centrality, vCorrL, dPhi, qPerc[0]); for (const auto& track : tracks2) { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) continue; double weff = getEfficiency(track); - if (weff < 0) - continue; - double weff = getEfficiency(track); if (weff < 0) continue; auto deta = track.eta() - jet.eta(); auto dphi = RecoDecay::constrainAngle(track.phi() - jet.phi(), -o2::constants::math::PIHalf); registry.fill(HIST("thn_jethad_corr_mixed"), centrality, vCorrL, track.pt(), deta, dphi, dPhi, qPerc[0], weff); - registry.fill(HIST("thn_jethad_corr_mixed"), centrality, vCorrL, track.pt(), deta, dphi, dPhi, qPerc[0], weff); } } for (const auto& track : tracks2) { - double weff = getEfficiency(track); - if (weff < 0) - continue; - registry.fill(HIST("trackQA/before/hTrackPtMixed"), centrality, track.pt(), weff); double weff = getEfficiency(track); if (weff < 0) continue; @@ -670,7 +641,6 @@ struct JetSpectraEseTask { if (!jetderiveddatautilities::selectTrack(track, trackSelection)) continue; registry.fill(HIST("trackQA/after/hTrackPtMixed"), centrality, track.pt(), weff); - registry.fill(HIST("trackQA/after/hTrackPtMixed"), centrality, track.pt(), weff); registry.fill(HIST("trackQA/after/hTrackEtaMixed"), centrality, track.eta()); registry.fill(HIST("trackQA/after/hTrackPhiMixed"), centrality, track.phi()); } @@ -679,7 +649,7 @@ struct JetSpectraEseTask { void processESEDataCharged(soa::Join::iterator const& collision, soa::Filtered> const& jets, - aod::JetTracks const& tracks, aod::BCsWithTimestamps const&) + aod::JetTracks const& tracks, aod::JBCs const&) { registry.fill(HIST("eventQA/hEventCounter"), kFilteredInputEv); registry.fill(HIST("eventQA/before/hVtxZ"), collision.posZ()); @@ -691,7 +661,7 @@ struct JetSpectraEseTask { return; registry.fill(HIST("eventQA/hEventCounter"), kOccupancyCut); - auto bc = collision.bc_as(); + auto bc = collision.bc_as(); loadEfficiency(bc); jetSpectra(collision, jets, tracks); } @@ -699,7 +669,7 @@ struct JetSpectraEseTask { void processESEDataChargedMixed(soa::Join const& collisions, soa::Filtered> const& jets, - aod::JetTracks const& tracks, aod::BCsWithTimestamps const&) + aod::JetTracks const& tracks, aod::JBCs const&) { jetMixed(collisions, jets, tracks); } @@ -916,8 +886,10 @@ struct JetSpectraEseTask { return; } - auto particlesInCollision = particles.sliceBy(particlesPerJMcCollision, mcCollision.globalIndex()); - for (const auto& particle : particlesInCollision) { + for (const auto& particle : particles) { + if (particle.mcCollisionId() != mcCollision.globalIndex()) { + continue; + } if (!isChargedParticle(particle.pdgCode())) { continue; } @@ -931,9 +903,9 @@ struct JetSpectraEseTask { continue; } - registry.fill(HIST("hTrackPtGen"), particle.pt()); - registry.fill(HIST("hTrackEtaGen"), particle.eta()); - registry.fill(HIST("hTrackPhiGen"), particle.phi()); + registry.fill(HIST("mcgen/hTrackPtGen"), particle.pt()); + registry.fill(HIST("mcgen/hTrackEtaGen"), particle.eta()); + registry.fill(HIST("mcgen/hTrackPhiGen"), particle.phi()); } } PROCESS_SWITCH(JetSpectraEseTask, processMCGenTrack, "jet MC process: Generated track", false); @@ -996,9 +968,9 @@ struct JetSpectraEseTask { } seenMcParticles.push_back(particle.globalIndex()); - registry.fill(HIST("hTrackPtReco"), track.pt()); - registry.fill(HIST("hTrackEtaReco"), track.eta()); - registry.fill(HIST("hTrackPhiReco"), track.phi()); + registry.fill(HIST("mcrec/hTrackPtReco"), track.pt()); + registry.fill(HIST("mcrec/hTrackEtaReco"), track.eta()); + registry.fill(HIST("mcrec/hTrackPhiReco"), track.phi()); } } }