From 232479968d96013abb8ee138a084f579a365a60e Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Mon, 20 Apr 2026 23:03:37 +0200 Subject: [PATCH 1/5] Add Ft0 gain information --- .../DataModel/LongRangeDerived.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/DataModel/LongRangeDerived.h b/PWGCF/TwoParticleCorrelations/DataModel/LongRangeDerived.h index 5189279aae7..69b4f8c1b5d 100644 --- a/PWGCF/TwoParticleCorrelations/DataModel/LongRangeDerived.h +++ b/PWGCF/TwoParticleCorrelations/DataModel/LongRangeDerived.h @@ -20,8 +20,10 @@ #include "Common/DataModel/Multiplicity.h" -#include "Framework/ASoA.h" -#include "Framework/AnalysisDataModel.h" +#include +#include + +#include namespace o2::aod { @@ -143,6 +145,7 @@ DECLARE_SOA_COLUMN(Eta, eta, float); DECLARE_SOA_COLUMN(Phi, phi, float); DECLARE_SOA_COLUMN(ChannelID, channelID, int); DECLARE_SOA_COLUMN(Amplitude, amplitude, float); +DECLARE_SOA_COLUMN(GainAmplitude, gainAmplitude, float); DECLARE_SOA_COLUMN(InvMass, invMass, float); DECLARE_SOA_COLUMN(IdPos, idPos, int64_t); DECLARE_SOA_COLUMN(IdNeg, idNeg, int64_t); @@ -176,6 +179,7 @@ DECLARE_SOA_TABLE(LRFt0aTracks, "AOD", "LRFT0ATRACK", lrcorrtrktable::LRCollisionId, lrcorrtrktable::ChannelID, lrcorrtrktable::Amplitude, + lrcorrtrktable::GainAmplitude, lrcorrtrktable::Eta, lrcorrtrktable::Phi); using LRFt0aTrack = LRFt0aTracks::iterator; @@ -185,6 +189,7 @@ DECLARE_SOA_TABLE(LRFt0cTracks, "AOD", "LRFT0CTRACK", lrcorrtrktable::LRCollisionId, lrcorrtrktable::ChannelID, lrcorrtrktable::Amplitude, + lrcorrtrktable::GainAmplitude, lrcorrtrktable::Eta, lrcorrtrktable::Phi); using LRFt0cTrack = LRFt0cTracks::iterator; @@ -231,6 +236,7 @@ DECLARE_SOA_TABLE(UpcLRFt0aTracks, "AOD", "UPCLRFT0ATRACK", lrcorrtrktable::UpcLRCollisionId, lrcorrtrktable::ChannelID, lrcorrtrktable::Amplitude, + lrcorrtrktable::GainAmplitude, lrcorrtrktable::Eta, lrcorrtrktable::Phi); using UpcLRFt0aTrack = UpcLRFt0aTracks::iterator; @@ -240,6 +246,7 @@ DECLARE_SOA_TABLE(UpcLRFt0cTracks, "AOD", "UPCLRFT0CTRACK", lrcorrtrktable::UpcLRCollisionId, lrcorrtrktable::ChannelID, lrcorrtrktable::Amplitude, + lrcorrtrktable::GainAmplitude, lrcorrtrktable::Eta, lrcorrtrktable::Phi); using UpcLRFt0cTrack = UpcLRFt0cTracks::iterator; From 646fe1f4ba76ffa3a9b574b421cfd78283de1d63 Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Mon, 20 Apr 2026 23:05:54 +0200 Subject: [PATCH 2/5] Update longrangeMaker.cxx --- .../TableProducer/longrangeMaker.cxx | 60 ++++++++++++++++--- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/longrangeMaker.cxx b/PWGCF/TwoParticleCorrelations/TableProducer/longrangeMaker.cxx index fcc5cfa15a9..c3b3550d421 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/longrangeMaker.cxx +++ b/PWGCF/TwoParticleCorrelations/TableProducer/longrangeMaker.cxx @@ -75,6 +75,7 @@ using namespace o2::constants::math; auto static constexpr CintZero = 0; auto static constexpr KminFt0cCell = 96; +auto static constexpr TotFt0Channels = 208; AxisSpec axisEvent{15, 0.5, 15.5, "#Event", "EventAxis"}; auto static constexpr KminCharge = 3.0f; static constexpr std::string_view species[] = {"Pi", "Ka", "Pr", "K0s", "L0s"}; @@ -141,6 +142,8 @@ struct LongrangeMaker { Configurable cfigFt0aEtaMin{"cfigFt0aEtaMin", 3.5f, "Minimum FT0A eta cut"}; Configurable cfigFt0cEtaMax{"cfigFt0cEtaMax", -2.1f, "Maximum FT0C eta cut"}; Configurable cfigFt0cEtaMin{"cfigFt0cEtaMin", -3.3f, "Minimum FT0C eta cut"}; + Configurable useGainCallib{"useGainCallib", true, "use gain calibration"}; + Configurable ConfGainPath{"ConfGainPath", "Analysis/EventPlane/GainEq/FT0", "Path to gain calibration"}; } cfgfittrksel; struct : ConfigurableGroup { @@ -303,6 +306,9 @@ struct LongrangeMaker { using MftTrkTable = aod::MFTTracks; using BCs = soa::Join; + int currentRunNumber = -999; + int lastRunNumber = -999; + std::vector ft0gainvalues{}; void processData(CollTable::iterator const& col, TrksTable const& tracks, aod::FT0s const&, MftTrkTable const& mfttracks, soa::SmallGroups const& besttracks, @@ -311,11 +317,20 @@ struct LongrangeMaker { if (!isEventSelected(col)) { return; } - auto multiplicity = countNTracks(tracks); auto centrality = selColCent(col); auto bc = col.bc_as(); - + currentRunNumber = bc.runNumber(); + if (cfgfittrksel.useGainCallib && (currentRunNumber != lastRunNumber)) { + const auto ft0GainObj = ccdb->getForTimeStamp>(cfgfittrksel.ConfGainPath.value, bc.timestamp()); + if (!ft0GainObj) { + for (auto i{0u}; i < TotFt0Channels; i++) { + ft0gainvalues.push_back(1.); + } + } else { + ft0gainvalues = *(ft0GainObj); + } + } lrcollision(bc.runNumber(), col.posZ(), multiplicity, centrality, bc.timestamp()); // track loop @@ -339,14 +354,22 @@ struct LongrangeMaker { float ampl = ft0.amplitudeA()[iCh]; auto phi = getPhiFT0(chanelid, 0); auto eta = getEtaFT0(chanelid, 0); - lrft0atracks(lrcollision.lastIndex(), chanelid, ampl, eta, phi); + auto gainampl = 1.0; + if (cfgfittrksel.useGainCallib) { + gainampl = ampl / ft0gainvalues[chanelid]; + } + lrft0atracks(lrcollision.lastIndex(), chanelid, ampl, gainampl, eta, phi); } for (std::size_t iCh = 0; iCh < ft0.channelC().size(); iCh++) { auto chanelid = ft0.channelC()[iCh] + KminFt0cCell; float ampl = ft0.amplitudeC()[iCh]; auto phi = getPhiFT0(chanelid, 1); auto eta = getEtaFT0(chanelid, 1); - lrft0ctracks(lrcollision.lastIndex(), chanelid, ampl, eta, phi); + auto gainampl = 1.0; + if (cfgfittrksel.useGainCallib) { + gainampl = ampl / ft0gainvalues[chanelid]; + } + lrft0ctracks(lrcollision.lastIndex(), chanelid, ampl, gainampl, eta, phi); } } @@ -404,6 +427,7 @@ struct LongrangeMaker { v0.pt(), v0.eta(), v0.phi(), massV0, aod::lrcorrtrktable::kSpALambda); } // end of Lambda and Anti-Lambda processing } + lastRunNumber = currentRunNumber; } // process function void processUpc(CollTable::iterator const& col, BCs const& bcs, @@ -468,14 +492,14 @@ struct LongrangeMaker { float ampl = ft0.amplitudeA()[iCh]; auto phi = getPhiFT0(chanelid, 0); auto eta = getEtaFT0(chanelid, 0); - upclrft0atracks(upclrcollision.lastIndex(), chanelid, ampl, eta, phi); + upclrft0atracks(upclrcollision.lastIndex(), chanelid, ampl, ampl, eta, phi); } for (std::size_t iCh = 0; iCh < ft0.channelC().size(); iCh++) { auto chanelid = ft0.channelC()[iCh] + KminFt0cCell; float ampl = ft0.amplitudeC()[iCh]; auto phi = getPhiFT0(chanelid, 1); auto eta = getEtaFT0(chanelid, 1); - upclrft0ctracks(upclrcollision.lastIndex(), chanelid, ampl, eta, phi); + upclrft0ctracks(upclrcollision.lastIndex(), chanelid, ampl, ampl, eta, phi); } } @@ -567,6 +591,17 @@ struct LongrangeMaker { auto multiplicity = countNTracks(recTracksPart); auto centrality = selColCent(RecCol); auto bc = RecCol.bc_as(); + currentRunNumber = bc.runNumber(); + if (cfgfittrksel.useGainCallib && (currentRunNumber != lastRunNumber)) { + const auto ft0GainObj = ccdb->getForTimeStamp>(cfgfittrksel.ConfGainPath.value, bc.timestamp()); + if (!ft0GainObj) { + for (auto i{0u}; i < TotFt0Channels; i++) { + ft0gainvalues.push_back(1.); + } + } else { + ft0gainvalues = *(ft0GainObj); + } + } lrcollision(bc.runNumber(), RecCol.posZ(), multiplicity, centrality, bc.timestamp()); lrcollisionMcLabel(RecCol.mcCollisionId()); @@ -596,14 +631,22 @@ struct LongrangeMaker { float ampl = ft0.amplitudeA()[iCh]; auto phi = getPhiFT0(chanelid, 0); auto eta = getEtaFT0(chanelid, 0); - lrft0atracks(lrcollision.lastIndex(), chanelid, ampl, eta, phi); + auto gainampl = 1.0; + if (cfgfittrksel.useGainCallib) { + gainampl = ampl / ft0gainvalues[chanelid]; + } + lrft0atracks(lrcollision.lastIndex(), chanelid, ampl, gainampl, eta, phi); } for (std::size_t iCh = 0; iCh < ft0.channelC().size(); iCh++) { auto chanelid = ft0.channelC()[iCh] + KminFt0cCell; float ampl = ft0.amplitudeC()[iCh]; auto phi = getPhiFT0(chanelid, 1); auto eta = getEtaFT0(chanelid, 1); - lrft0ctracks(lrcollision.lastIndex(), chanelid, ampl, eta, phi); + auto gainampl = 1.0; + if (cfgfittrksel.useGainCallib) { + gainampl = ampl / ft0gainvalues[chanelid]; + } + lrft0ctracks(lrcollision.lastIndex(), chanelid, ampl, gainampl, eta, phi); } } @@ -653,6 +696,7 @@ struct LongrangeMaker { if (cfgmfttrksel.cfigMftEtaMin < particle.eta() && particle.eta() < cfgmfttrksel.cfigMftEtaMax) lrmftmctracks(lrmccollision.lastIndex(), particle.pt(), particle.eta(), particle.phi()); } + lastRunNumber = currentRunNumber; } } From 946875cdaf88a95f9a520ab77078cd66b409abfd Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Mon, 20 Apr 2026 23:07:39 +0200 Subject: [PATCH 3/5] Update longrangecorrDerived.cxx --- .../Tasks/longrangecorrDerived.cxx | 73 ++++++++++++++----- 1 file changed, 54 insertions(+), 19 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx b/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx index d3152e7ee47..90323ea9bab 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx @@ -16,27 +16,52 @@ /// \since November 05, 2025 #include "PWGCF/Core/CorrelationContainer.h" +#include "PWGCF/Core/PairCuts.h" +#include "PWGCF/DataModel/CorrelationsDerived.h" #include "PWGCF/TwoParticleCorrelations/DataModel/LongRangeDerived.h" +#include "PWGMM/Mult/DataModel/bestCollisionTable.h" #include "PWGUD/Core/SGSelector.h" #include "Common/Core/RecoDecay.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include +#include "Common/Core/TrackSelection.h" +#include "Common/Core/trackUtilities.h" +#include "Common/DataModel/Centrality.h" +#include "Common/DataModel/CollisionAssociationTables.h" +#include "Common/DataModel/EventSelection.h" +#include "Common/DataModel/FT0Corrected.h" +#include "Common/DataModel/Multiplicity.h" +#include "Common/DataModel/PIDResponseITS.h" +#include "Common/DataModel/PIDResponseTOF.h" +#include "Common/DataModel/PIDResponseTPC.h" +#include "Common/DataModel/TrackSelectionTables.h" + +#include "CCDB/BasicCCDBManager.h" +#include "CCDB/CcdbApi.h" +#include "CommonConstants/MathConstants.h" +#include "CommonConstants/PhysicsConstants.h" +#include "DetectorsCommonDataFormats/AlignParam.h" +#include "FT0Base/Geometry.h" +#include "FV0Base/Geometry.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisTask.h" +#include "Framework/HistogramRegistry.h" +#include "Framework/O2DatabasePDGPlugin.h" +#include "Framework/RunningWorkflowInfo.h" +#include "Framework/StepTHn.h" +#include "Framework/runDataProcessing.h" +#include "ReconstructionDataFormats/PID.h" +#include "ReconstructionDataFormats/Track.h" + +#include +#include +#include +#include + +#include #include #include +#include #include #include #include @@ -83,6 +108,7 @@ struct LongrangecorrDerived { ConfigurableAxis axisInvMass{"axisInvMass", {VARIABLE_WIDTH, 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2.0}, "invariant mass axis"}; ConfigurableAxis axisInvMassQA{"axisInvMassQA", {20, 0.45, 0.55}, "invariant mass axis for QA"}; ConfigurableAxis axisAmplitude{"axisAmplitude", {5000, 0, 10000}, "FT0 amplitude"}; + ConfigurableAxis axisChannel{"axisChannel", {208, 0, 208}, "FT0 channel"}; ConfigurableAxis axisMultME{"axisMultME", {VARIABLE_WIDTH, 0, 5, 10, 20, 30, 40, 50, 1000}, "Mixing bins - multiplicity"}; ConfigurableAxis axisVtxZME{"axisVtxZME", {VARIABLE_WIDTH, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10}, "Mixing bins - z-vertex"}; @@ -170,6 +196,9 @@ struct LongrangecorrDerived { histos.add("Assoc_etavsphi", "Assoc_etavsphi", kTH2D, {axisPhi, axisEtaAssoc}); histos.add("Assoc_pt", "Assoc_pt", kTH1D, {axisPtAssoc}); histos.add("Assoc_amp", "Assoc_amp", kTH1D, {axisAmplitude}); + histos.add("Assoc_amp_gaincorrected", "Assoc_amp_gaincorrected", kTH1D, {axisAmplitude}); + histos.add("Channel_vs_Assoc_amp", "Channel_vs_Assoc_amp", kTH2D, {axisChannel, axisAmplitude}); + histos.add("Channel_vs_Assoc_amp_gaincorrected", "Channel_vs_Assoc_amp_gaincorrected", kTH2D, {axisChannel, axisAmplitude}); histos.add("deltaEta_deltaPhi_same", "", kTH2D, {axisDeltaPhi, axisDeltaEta}); histos.add("deltaEta_deltaPhi_mixed", "", kTH2D, {axisDeltaPhi, axisDeltaEta}); @@ -205,6 +234,9 @@ struct LongrangecorrDerived { histos.fill(HIST("Assoc_phi"), track.phi()); if constexpr (std::experimental::is_detected::value) { histos.fill(HIST("Assoc_amp"), track.amplitude()); + histos.fill(HIST("Channel_vs_Assoc_amp"), track.channelID(), track.amplitude()); + histos.fill(HIST("Assoc_amp_gaincorrected"), track.gainAmplitude()); + histos.fill(HIST("Channel_vs_Assoc_amp_gaincorrected"), track.channelID(), track.gainAmplitude()); } else { histos.fill(HIST("Assoc_pt"), track.pt()); } @@ -260,23 +292,25 @@ struct LongrangecorrDerived { histos.fill(HIST("Trig_hist"), vz, multiplicity, triggerTrack.pt(), 1.0, eventWeight); } } + auto ampl = 1.0f; for (auto const& assoTrack : assocs) { if constexpr (std::experimental::is_detected::value) { if (isApplyAmpCut && (assoTrack.amplitude() < cfgLowAmpCut)) continue; + ampl *= assoTrack.gainAmplitude(); } float deltaPhi = RecoDecay::constrainAngle(triggerTrack.phi() - assoTrack.phi(), -PIHalf); float deltaEta = triggerTrack.eta() - assoTrack.eta(); if (!mixing) { fillAssocTrackQA(assoTrack); - histos.fill(HIST("deltaEta_deltaPhi_same"), deltaPhi, deltaEta); + histos.fill(HIST("deltaEta_deltaPhi_same"), deltaPhi, deltaEta, eventWeight * ampl); } else { - histos.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta); + histos.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta, eventWeight * ampl); } if constexpr (std::experimental::is_detected::value) { - target->getPairHist()->Fill(step, vz, multiplicity, triggerTrack.pt(), triggerTrack.pt(), deltaPhi, deltaEta, triggerTrack.invMass(), eventWeight); + target->getPairHist()->Fill(step, vz, multiplicity, triggerTrack.pt(), triggerTrack.pt(), deltaPhi, deltaEta, triggerTrack.invMass(), eventWeight * ampl); } else { - target->getPairHist()->Fill(step, vz, multiplicity, triggerTrack.pt(), triggerTrack.pt(), deltaPhi, deltaEta, 1.0, eventWeight); + target->getPairHist()->Fill(step, vz, multiplicity, triggerTrack.pt(), triggerTrack.pt(), deltaPhi, deltaEta, 1.0, eventWeight * ampl); } } // associated tracks } // trigger tracks @@ -361,6 +395,7 @@ struct LongrangecorrDerived { fillCorrHist(same, triggers, assocs, false, mccollision.posZ(), multiplicity, 1.0); } // process MC same + // PresliceUnsorted collPerMCColl = aod::lrcorrcolltable::lrMcCollisionId; template void processMcMixed(McCollsTable const& mccollisions, aod::LRCollisionsWithLabel const& collisions, TrackTypes&&... tracks) { From 2a3fdf9fbd88e2ed8be11687d64f6082f500769d Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Mon, 20 Apr 2026 23:09:48 +0200 Subject: [PATCH 4/5] Fix includes --- .../Tasks/longrangecorrDerived.cxx | 55 +++++-------------- 1 file changed, 15 insertions(+), 40 deletions(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx b/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx index 90323ea9bab..3000f129587 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx @@ -16,52 +16,27 @@ /// \since November 05, 2025 #include "PWGCF/Core/CorrelationContainer.h" -#include "PWGCF/Core/PairCuts.h" -#include "PWGCF/DataModel/CorrelationsDerived.h" #include "PWGCF/TwoParticleCorrelations/DataModel/LongRangeDerived.h" -#include "PWGMM/Mult/DataModel/bestCollisionTable.h" #include "PWGUD/Core/SGSelector.h" #include "Common/Core/RecoDecay.h" -#include "Common/Core/TrackSelection.h" -#include "Common/Core/trackUtilities.h" -#include "Common/DataModel/Centrality.h" -#include "Common/DataModel/CollisionAssociationTables.h" -#include "Common/DataModel/EventSelection.h" -#include "Common/DataModel/FT0Corrected.h" -#include "Common/DataModel/Multiplicity.h" -#include "Common/DataModel/PIDResponseITS.h" -#include "Common/DataModel/PIDResponseTOF.h" -#include "Common/DataModel/PIDResponseTPC.h" -#include "Common/DataModel/TrackSelectionTables.h" - -#include "CCDB/BasicCCDBManager.h" -#include "CCDB/CcdbApi.h" -#include "CommonConstants/MathConstants.h" -#include "CommonConstants/PhysicsConstants.h" -#include "DetectorsCommonDataFormats/AlignParam.h" -#include "FT0Base/Geometry.h" -#include "FV0Base/Geometry.h" -#include "Framework/ASoAHelpers.h" -#include "Framework/AnalysisDataModel.h" -#include "Framework/AnalysisTask.h" -#include "Framework/HistogramRegistry.h" -#include "Framework/O2DatabasePDGPlugin.h" -#include "Framework/RunningWorkflowInfo.h" -#include "Framework/StepTHn.h" -#include "Framework/runDataProcessing.h" -#include "ReconstructionDataFormats/PID.h" -#include "ReconstructionDataFormats/Track.h" - -#include -#include -#include -#include - -#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include #include #include -#include #include #include #include From 8d3cc1f0f33fcfcb57e2218cfc5cb7bce035cb80 Mon Sep 17 00:00:00 2001 From: abmodak <67369858+abmodak@users.noreply.github.com> Date: Mon, 20 Apr 2026 23:13:48 +0200 Subject: [PATCH 5/5] remove commented lines --- PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx b/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx index 3000f129587..80cfa64d1d4 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx @@ -370,7 +370,6 @@ struct LongrangecorrDerived { fillCorrHist(same, triggers, assocs, false, mccollision.posZ(), multiplicity, 1.0); } // process MC same - // PresliceUnsorted collPerMCColl = aod::lrcorrcolltable::lrMcCollisionId; template void processMcMixed(McCollsTable const& mccollisions, aod::LRCollisionsWithLabel const& collisions, TrackTypes&&... tracks) {