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; 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; } } diff --git a/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx b/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx index d3152e7ee47..80cfa64d1d4 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx @@ -83,6 +83,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 +171,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 +209,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 +267,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