diff --git a/PWGCF/TwoParticleCorrelations/TableProducer/longrangeMaker.cxx b/PWGCF/TwoParticleCorrelations/TableProducer/longrangeMaker.cxx index c3b3550d421..71fbbf5e408 100644 --- a/PWGCF/TwoParticleCorrelations/TableProducer/longrangeMaker.cxx +++ b/PWGCF/TwoParticleCorrelations/TableProducer/longrangeMaker.cxx @@ -78,8 +78,8 @@ 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"}; -static constexpr std::array speciesIds{kPiPlus, kKPlus, kProton, kK0Short, kLambda0}; +static constexpr std::string_view species[] = {"Pi", "Ka", "Pr"}; +static constexpr std::array speciesIds{kPiPlus, kKPlus, kProton}; enum KindOfV0 { kLambda = 0, @@ -178,13 +178,13 @@ struct LongrangeMaker { Configurable> tofNsigmaPidCut{"tofNsigmaPidCut", std::vector{1.5, 1.5, 1.5, -1.5, -1.5, -1.5}, "TOF n-sigma cut for pions_posNsigma, kaons_posNsigma, protons_posNsigma, pions_negNsigma, kaons_negNsigma, protons_negNsigma"}; Configurable cfgTofPidPtCut{"cfgTofPidPtCut", 0.3f, "Minimum pt to use TOF N-sigma"}; Configurable isUseItsPid{"isUseItsPid", false, "Use ITS PID for particle identification"}; - Configurable isUseDataLikeMult{"isUseDataLikeMult", 0, "Data like mult/cent classification"}; + Configurable isUseCentEst{"isUseCentEst", false, "Centrality based classification"}; ConfigurableAxis vtxHistBin{"vtxHistBin", {20, -10, 10}, ""}; ConfigurableAxis multHistBin{"multHistBin", {100, 0, 100}, ""}; ConfigurableAxis etaHistBin{"etaHistBin", {20, -1, 1}, ""}; ConfigurableAxis ptHistBin{"ptHistBin", {10, 0, 10}, ""}; - ConfigurableAxis speciesHistBin{"speciesHistBin", {6, 0.5, 6.5}, ""}; + ConfigurableAxis speciesHistBin{"speciesHistBin", {4, 0.5, 4.5}, ""}; Service ccdb; Service pdg; @@ -252,8 +252,8 @@ struct LongrangeMaker { axisGen->SetBinLabel(i + 1, species[i].data()); axisRec->SetBinLabel(i + 1, species[i].data()); } - axisGen->SetBinLabel(6, "Other"); - axisRec->SetBinLabel(6, "Other"); + axisGen->SetBinLabel(4, "Other"); + axisRec->SetBinLabel(4, "Other"); } myTrackFilter = getGlobalTrackSelectionRun3ITSMatch(TrackSelection::GlobalTrackRun3ITSMatching::Run3ITSibAny, TrackSelection::GlobalTrackRun3DCAxyCut::Default); @@ -735,43 +735,37 @@ struct LongrangeMaker { return; } auto multiplicity = 0; - for (const auto& particle : mcparticles) { - if (!isGenPartSelected(particle) || std::abs(particle.eta()) > cfgtrksel.cfgEtaCut || particle.pt() < cfgtrksel.cfgPtCutMin || particle.pt() > cfgtrksel.cfgPtCutMult) + bool atLeastOne = false; + for (const auto& RecCol : RecCols) { + if (!isEventSelected(RecCol)) continue; - multiplicity++; - } - if (isUseDataLikeMult > 0) { - for (const auto& RecCol : RecCols) { - if (!isEventSelected(RecCol)) { - continue; - } - if (std::abs(RecCol.posZ()) >= cfgevtsel.cfgVtxCut) { - continue; - } - if (cfgevtsel.isApplyBestCollIndex && RecCol.globalIndex() != mcCollision.bestCollisionIndex()) { - continue; - } + if (std::abs(RecCol.posZ()) >= cfgevtsel.cfgVtxCut) + continue; + if (cfgevtsel.isApplyBestCollIndex && RecCol.globalIndex() != mcCollision.bestCollisionIndex()) + continue; + if (isUseCentEst) { multiplicity = selColCent(RecCol); + } else { + auto recTracksPart = RecTracks.sliceBy(perColMidtrack, RecCol.globalIndex()); + multiplicity = countNTracks(recTracksPart); } + atLeastOne = true; } - for (const auto& particle : mcparticles) { - if (!isGenPartSelected(particle) || std::abs(particle.eta()) > cfgtrksel.cfgEtaCut || particle.pt() < cfgtrksel.cfgPtCutMin || particle.pt() > cfgtrksel.cfgPtCutMult) + if (!isGenPartSelected(particle) || std::abs(particle.eta()) > cfgtrksel.cfgEtaCut || particle.pt() < cfgtrksel.cfgPtCutMin || particle.pt() > cfgtrksel.cfgPtCutMax) continue; - auto pos = std::distance(speciesIds.begin(), std::find(speciesIds.begin(), speciesIds.end(), particle.pdgCode())) + 1; - histos.fill(HIST("hGenMCdndpt"), mcCollision.posZ(), multiplicity, particle.eta(), particle.pt(), pos); + if (atLeastOne) { + auto pos = std::distance(speciesIds.begin(), std::find(speciesIds.begin(), speciesIds.end(), particle.pdgCode())) + 1; + histos.fill(HIST("hGenMCdndpt"), mcCollision.posZ(), multiplicity, particle.eta(), particle.pt(), pos); + } } - for (const auto& RecCol : RecCols) { - if (!isEventSelected(RecCol)) { + if (!isEventSelected(RecCol)) continue; - } - if (std::abs(RecCol.posZ()) >= cfgevtsel.cfgVtxCut) { + if (std::abs(RecCol.posZ()) >= cfgevtsel.cfgVtxCut) continue; - } - if (cfgevtsel.isApplyBestCollIndex && RecCol.globalIndex() != mcCollision.bestCollisionIndex()) { + if (cfgevtsel.isApplyBestCollIndex && RecCol.globalIndex() != mcCollision.bestCollisionIndex()) continue; - } auto recTracksPart = RecTracks.sliceBy(perColMidtrack, RecCol.globalIndex()); for (const auto& track : recTracksPart) { if (!track.isGlobalTrack()) @@ -790,50 +784,43 @@ struct LongrangeMaker { } } } - void processMFTtrackEff(ColMCTrueTable::iterator const& mcCollision, ColMCRecTable const& RecCols, - MftTrkMCRecTable const& mfttracks, aod::McParticles const& mcparticles) + TrksMCRecTable const& RecTracks, MftTrkMCRecTable const& mfttracks, + aod::McParticles const& mcparticles) { if (std::abs(mcCollision.posZ()) >= cfgevtsel.cfgVtxCut) { return; } auto multiplicity = 0; - for (const auto& particle : mcparticles) { - if (!isGenPartSelected(particle) || std::abs(particle.eta()) > cfgtrksel.cfgEtaCut || particle.pt() < cfgtrksel.cfgPtCutMin || particle.pt() > cfgtrksel.cfgPtCutMult) + bool atLeastOne = false; + for (const auto& RecCol : RecCols) { + if (!isEventSelected(RecCol)) continue; - multiplicity++; - } - if (isUseDataLikeMult > 0) { - for (const auto& RecCol : RecCols) { - if (!isEventSelected(RecCol)) { - continue; - } - if (std::abs(RecCol.posZ()) >= cfgevtsel.cfgVtxCut) { - continue; - } - if (cfgevtsel.isApplyBestCollIndex && RecCol.globalIndex() != mcCollision.bestCollisionIndex()) { - continue; - } + if (std::abs(RecCol.posZ()) >= cfgevtsel.cfgVtxCut) + continue; + if (cfgevtsel.isApplyBestCollIndex && RecCol.globalIndex() != mcCollision.bestCollisionIndex()) + continue; + if (isUseCentEst) { multiplicity = selColCent(RecCol); + } else { + auto recTracksPart = RecTracks.sliceBy(perColMidtrack, RecCol.globalIndex()); + multiplicity = countNTracks(recTracksPart); } + atLeastOne = true; } - for (const auto& particle : mcparticles) { if (!isGenPartSelected(particle) || particle.eta() > cfgmfttrksel.cfigMftEtaMax || particle.eta() < cfgmfttrksel.cfigMftEtaMin || particle.pt() < cfgmfttrksel.cfgMftPtCutMin || particle.pt() > cfgmfttrksel.cfgMftPtCutMax) continue; - histos.fill(HIST("hGenMCdndpt"), mcCollision.posZ(), multiplicity, particle.eta(), particle.pt(), 1.0); + if (atLeastOne) + histos.fill(HIST("hGenMCdndpt"), mcCollision.posZ(), multiplicity, particle.eta(), particle.pt(), 1.0); } - for (const auto& RecCol : RecCols) { - if (!isEventSelected(RecCol)) { + if (!isEventSelected(RecCol)) continue; - } - if (std::abs(RecCol.posZ()) >= cfgevtsel.cfgVtxCut) { + if (std::abs(RecCol.posZ()) >= cfgevtsel.cfgVtxCut) continue; - } - if (cfgevtsel.isApplyBestCollIndex && RecCol.globalIndex() != mcCollision.bestCollisionIndex()) { + if (cfgevtsel.isApplyBestCollIndex && RecCol.globalIndex() != mcCollision.bestCollisionIndex()) continue; - } auto recTracksPart = mfttracks.sliceBy(perColMfttrack, RecCol.globalIndex()); for (const auto& track : recTracksPart) { if (!isMftTrackSelected(track)) diff --git a/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx b/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx index 80cfa64d1d4..ced66b323bc 100644 --- a/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx +++ b/PWGCF/TwoParticleCorrelations/Tasks/longrangecorrDerived.cxx @@ -68,9 +68,6 @@ struct LongrangecorrDerived { Configurable cfgZdcCut{"cfgZdcCut", 0.1f, "ZDC threshold"}; Configurable cfgGapSideCut{"cfgGapSideCut", 0, "Gap-side A=0, C=1, AC = 2, No Gap = -1, All events = 3"}; - Configurable isApplyAmpCut{"isApplyAmpCut", false, "Enable FT0 amplitude cut"}; - Configurable cfgLowAmpCut{"cfgLowAmpCut", 2.0f, "Low FT0 amplitude cut"}; - ConfigurableAxis axisMultiplicity{"axisMultiplicity", {VARIABLE_WIDTH, 0, 10, 15, 25, 50, 60, 1000}, "multiplicity axis"}; ConfigurableAxis axisPhi{"axisPhi", {96, 0, TwoPI}, "#phi axis"}; ConfigurableAxis axisEtaTrig{"axisEtaTrig", {40, -1., 1.}, "#eta trig axis"}; @@ -165,6 +162,10 @@ struct LongrangecorrDerived { histos.add("Trig_pt", "Trig_pt", kTH1D, {axisPtTrigger}); histos.add("Trig_invMass", "Trig_invMass", kTH1D, {axisInvMassQA}); histos.add("Trig_hist", "Trig_hist", kTHnSparseF, {axisVtxZ, axisMultiplicity, axisPtTrigger, axisInvMass}); + histos.add("Trig_amp", "Trig_amp", kTH1D, {axisAmplitude}); + histos.add("Trig_amp_gaincorrected", "Trig_amp_gaincorrected", kTH1D, {axisAmplitude}); + histos.add("Channel_vs_Trig_amp", "Channel_vs_Trig_amp", kTH2D, {axisChannel, axisAmplitude}); + histos.add("Channel_vs_Trig_amp_gaincorrected", "Channel_vs_Trig_amp_gaincorrected", kTH2D, {axisChannel, axisAmplitude}); histos.add("Assoc_eta", "Assoc_eta", kTH1D, {axisEtaAssoc}); histos.add("Assoc_phi", "Assoc_phi", kTH1D, {axisPhi}); @@ -195,7 +196,14 @@ struct LongrangecorrDerived { histos.fill(HIST("Trig_etavsphi"), track.phi(), track.eta()); histos.fill(HIST("Trig_eta"), track.eta()); histos.fill(HIST("Trig_phi"), track.phi()); - histos.fill(HIST("Trig_pt"), track.pt()); + if constexpr (std::experimental::is_detected::value) { + histos.fill(HIST("Trig_amp"), track.amplitude()); + histos.fill(HIST("Channel_vs_Trig_amp"), track.channelID(), track.amplitude()); + histos.fill(HIST("Trig_amp_gaincorrected"), track.gainAmplitude()); + histos.fill(HIST("Channel_vs_Trig_amp_gaincorrected"), track.channelID(), track.gainAmplitude()); + } else { + histos.fill(HIST("Trig_pt"), track.pt()); + } if constexpr (std::experimental::is_detected::value) { histos.fill(HIST("Trig_invMass"), track.invMass()); } @@ -251,6 +259,7 @@ struct LongrangecorrDerived { template void fillCorrHist(TTarget target, TTriggers const& triggers, TAssocs const& assocs, bool mixing, float vz, float multiplicity, float eventWeight) { + auto trigAmpl = 1.0f; for (auto const& triggerTrack : triggers) { if constexpr (std::experimental::is_detected::value) { if (cfgPidMask != 0 && (cfgPidMask & (1u << static_cast(triggerTrack.trackType()))) == 0u) @@ -259,33 +268,39 @@ struct LongrangecorrDerived { if (cfgV0Mask != 0 && (cfgV0Mask & (1u << static_cast(triggerTrack.v0Type()))) == 0u) continue; } + if constexpr (std::experimental::is_detected::value) { + trigAmpl *= triggerTrack.gainAmplitude(); + } if (!mixing) { fillTrigTrackQA(triggerTrack); - if constexpr (std::experimental::is_detected::value) { - histos.fill(HIST("Trig_hist"), vz, multiplicity, triggerTrack.pt(), triggerTrack.invMass(), eventWeight); + if constexpr (std::experimental::is_detected::value) { + histos.fill(HIST("Trig_hist"), vz, multiplicity, 1.0, 1.0, eventWeight * trigAmpl); + } else if constexpr (std::experimental::is_detected::value) { + histos.fill(HIST("Trig_hist"), vz, multiplicity, triggerTrack.pt(), triggerTrack.invMass(), eventWeight * trigAmpl); } else { - histos.fill(HIST("Trig_hist"), vz, multiplicity, triggerTrack.pt(), 1.0, eventWeight); + histos.fill(HIST("Trig_hist"), vz, multiplicity, triggerTrack.pt(), 1.0, eventWeight * trigAmpl); } } - auto ampl = 1.0f; + auto assoAmpl = 1.0f; for (auto const& assoTrack : assocs) { if constexpr (std::experimental::is_detected::value) { - if (isApplyAmpCut && (assoTrack.amplitude() < cfgLowAmpCut)) - continue; - ampl *= assoTrack.gainAmplitude(); + assoAmpl *= 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, eventWeight * ampl); + histos.fill(HIST("deltaEta_deltaPhi_same"), deltaPhi, deltaEta, eventWeight * trigAmpl * assoAmpl); } else { - histos.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta, eventWeight * ampl); + histos.fill(HIST("deltaEta_deltaPhi_mixed"), deltaPhi, deltaEta, eventWeight * trigAmpl * assoAmpl); } - if constexpr (std::experimental::is_detected::value) { - target->getPairHist()->Fill(step, vz, multiplicity, triggerTrack.pt(), triggerTrack.pt(), deltaPhi, deltaEta, triggerTrack.invMass(), eventWeight * ampl); + + if constexpr (std::experimental::is_detected::value) { + target->getPairHist()->Fill(step, vz, multiplicity, 1.0, 1.0, deltaPhi, deltaEta, 1.0, eventWeight * trigAmpl * assoAmpl); + } else if constexpr (std::experimental::is_detected::value) { + target->getPairHist()->Fill(step, vz, multiplicity, triggerTrack.pt(), triggerTrack.pt(), deltaPhi, deltaEta, triggerTrack.invMass(), eventWeight * trigAmpl * assoAmpl); } else { - target->getPairHist()->Fill(step, vz, multiplicity, triggerTrack.pt(), triggerTrack.pt(), deltaPhi, deltaEta, 1.0, eventWeight * ampl); + target->getPairHist()->Fill(step, vz, multiplicity, triggerTrack.pt(), triggerTrack.pt(), deltaPhi, deltaEta, 1.0, eventWeight * trigAmpl * assoAmpl); } } // associated tracks } // trigger tracks @@ -446,6 +461,11 @@ struct LongrangecorrDerived { processSame(col, tracks, mfts); } + void processFt0aft0cSE(CollsTable::iterator const& col, Ft0aTrksTable const& ft0as, Ft0cTrksTable const& ft0cs) + { + processSame(col, ft0as, ft0cs); + } + void processTpcft0aME(CollsTable const& cols, TrksTable const& tracks, Ft0aTrksTable const& ft0as) { processMixed(cols, tracks, ft0as); @@ -491,6 +511,11 @@ struct LongrangecorrDerived { processMixed(cols, tracks, mfts); } + void processFt0aft0cME(CollsTable const& cols, Ft0aTrksTable const& ft0as, Ft0cTrksTable const& ft0cs) + { + processMixed(cols, ft0as, ft0cs); + } + void processUpcTpcft0aSE(UpcCollsTable::iterator const& col, TrksUpcTable const& tracks, Ft0aTrksUpcTable const& ft0as) { if (!isUpcEventSelected(col)) { @@ -628,6 +653,11 @@ struct LongrangecorrDerived { processMcSame(mccollision, collisions, mfts, ft0as); } + void processMcFt0aft0cSE(McCollsTable::iterator const& mccollision, soa::SmallGroups const& collisions, McFt0aTrksTable const& ft0as, McFt0cTrksTable const& ft0cs) + { + processMcSame(mccollision, collisions, ft0as, ft0cs); + } + void processMcTpcft0aME(McCollsTable const& mccollisions, aod::LRCollisionsWithLabel const& collisions, McTrksTable const& tracks, McFt0aTrksTable const& ft0as) { processMcMixed(mccollisions, collisions, tracks, ft0as); @@ -648,6 +678,11 @@ struct LongrangecorrDerived { processMcMixed(mccollisions, collisions, mfts, ft0as); } + void processMcFt0aft0cME(McCollsTable const& mccollisions, aod::LRCollisionsWithLabel const& collisions, McFt0aTrksTable const& ft0as, McFt0cTrksTable const& ft0cs) + { + processMcMixed(mccollisions, collisions, ft0as, ft0cs); + } + PROCESS_SWITCH(LongrangecorrDerived, processTpcft0aSE, "same event TPC vs FT0A", false); PROCESS_SWITCH(LongrangecorrDerived, processTpcft0aME, "mixed event TPC vs FT0A", false); PROCESS_SWITCH(LongrangecorrDerived, processTpcft0cSE, "same event TPC vs FT0C", false); @@ -666,6 +701,8 @@ struct LongrangecorrDerived { PROCESS_SWITCH(LongrangecorrDerived, processMftbestft0aME, "mixed event best MFT vs FT0A", false); PROCESS_SWITCH(LongrangecorrDerived, processV0mftbestSE, "same event V0 vs best MFT", false); PROCESS_SWITCH(LongrangecorrDerived, processV0mftbestME, "mixed event V0 vs best MFT", false); + PROCESS_SWITCH(LongrangecorrDerived, processFt0aft0cSE, "same event FT0A vs FT0C", false); + PROCESS_SWITCH(LongrangecorrDerived, processFt0aft0cME, "mixed event FT0A vs FT0C", false); PROCESS_SWITCH(LongrangecorrDerived, processUpcTpcft0aSE, "same UPC event TPC vs FT0A", false); PROCESS_SWITCH(LongrangecorrDerived, processUpcTpcft0aME, "mixed UPC event TPC vs FT0A", false); PROCESS_SWITCH(LongrangecorrDerived, processUpcTpcft0cSE, "same UPC event TPC vs FT0C", false); @@ -692,6 +729,8 @@ struct LongrangecorrDerived { PROCESS_SWITCH(LongrangecorrDerived, processMcTpcmftME, "mixed MC event TPC vs MFT", false); PROCESS_SWITCH(LongrangecorrDerived, processMcMftft0aSE, "same MC event MFT vs FT0A", false); PROCESS_SWITCH(LongrangecorrDerived, processMcMftft0aME, "mixed MC event MFT vs FT0A", false); + PROCESS_SWITCH(LongrangecorrDerived, processMcFt0aft0cSE, "same MC event FT0A vs FT0C", false); + PROCESS_SWITCH(LongrangecorrDerived, processMcFt0aft0cME, "mixed MC event FT0A vs FT0C", false); }; WorkflowSpec defineDataProcessing(ConfigContext const& cfgc)