From e26b24956f37d13497c20c12e8e9ad48e63919a5 Mon Sep 17 00:00:00 2001 From: Marcello Di Costanzo Date: Wed, 11 Nov 2026 16:08:55 +0100 Subject: [PATCH 1/8] Had-Had v2 with charm-hadron tables --- .../correlatorFlowCharmHadronsReduced.cxx | 357 ++++++++++++++---- .../Tasks/taskCorrelationsEfficiencies.cxx | 14 +- 2 files changed, 296 insertions(+), 75 deletions(-) diff --git a/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx b/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx index 9740b182ae1..fb22762c5d2 100644 --- a/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx +++ b/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx @@ -55,6 +55,70 @@ using namespace o2::framework::expressions; using BinningCentPosZ = ColumnBinningPolicy; using BinningMultPosZ = ColumnBinningPolicy; +// Mimic the HfcRedSEHadHads table structure to be used in the correlator +// task so that the had-had workflow can be run from the derived data used +// for the charm-hadron correlations +struct HadHadPairFromCharmTables { + float fPtTrig; + float fPtAssoc; + float fEtaTrig; + float fEtaAssoc; + float fDeltaEta; + float fPhiTrig; + float fPhiAssoc; + float fDeltaPhi; + int fNTpcCrossedRowsTrig; + int fItsClsMapTrig; + int fItsNClsTrig; + float fDcaXYTrig; + float fDcaZTrig; + int fNTpcCrossedRowsAssoc; + int fItsClsMapAssoc; + int fItsNClsAssoc; + float fDcaXYAssoc; + float fDcaZAssoc; + + // Setters + void setPtTrig(float val) { fPtTrig = val; } + void setPtAssoc(float val) { fPtAssoc = val; } + void setEtaTrig(float val) { fEtaTrig = val; } + void setEtaAssoc(float val) { fEtaAssoc = val; } + void setDeltaEta(float val) { fDeltaEta = val; } + void setPhiTrig(float val) { fPhiTrig = val; } + void setPhiAssoc(float val) { fPhiAssoc = val; } + void setDeltaPhi(float val) { fDeltaPhi = val; } + void setNTpcCrossedRowsTrig(int val) { fNTpcCrossedRowsTrig = val; } + void setItsClsMapTrig(int val) { fItsClsMapTrig = val; } + void setItsNClsTrig(int val) { fItsNClsTrig = val; } + void setDcaXYTrig(float val) { fDcaXYTrig = val; } + void setDcaZTrig(float val) { fDcaZTrig = val; } + void setNTpcCrossedRowsAssoc(int val) { fNTpcCrossedRowsAssoc = val; } + void setItsClsMapAssoc(int val) { fItsClsMapAssoc = val; } + void setItsNClsAssoc(int val) { fItsNClsAssoc = val; } + void setDcaXYAssoc(float val) { fDcaXYAssoc = val; } + void setDcaZAssoc(float val) { fDcaZAssoc = val; } + + // Access methods to mimic the HfcRedSEHadHads table structure + float ptTrig() const { return fPtTrig; } + float ptAssoc() const { return fPtAssoc; } + float etaTrig() const { return fEtaTrig; } + float etaAssoc() const { return fEtaAssoc; } + float deltaEta() const { return fDeltaEta; } + float phiTrig() const { return fPhiTrig; } + float phiAssoc() const { return fPhiAssoc; } + float deltaPhi() const { return fDeltaPhi; } + int nTpcCrossedRowsTrig() const { return fNTpcCrossedRowsTrig; } + int itsClsMapTrig() const { return fItsClsMapTrig; } + int itsNClsTrig() const { return fItsNClsTrig; } + float dcaXYTrig() const { return fDcaXYTrig; } + float dcaZTrig() const { return fDcaZTrig; } + int nTpcCrossedRowsAssoc() const { return fNTpcCrossedRowsAssoc; } + int itsClsMapAssoc() const { return fItsClsMapAssoc; } + int itsNClsAssoc() const { return fItsNClsAssoc; } + float dcaXYAssoc() const { return fDcaXYAssoc; } + float dcaZAssoc() const { return fDcaZAssoc; } +}; + /// Get charm candidate or hadron track pT /// \param track is the candidate template @@ -138,11 +202,13 @@ struct HfCorrelatorFlowCharmHadronsReduced { int poolBins{0}; std::vector mPtEdgesTrig; - using SameEvtPairsChHadWEffInfo = soa::Filtered>; using SameEvtPairsChHad = soa::Filtered>; + using SameEvtPairsChHadWEffInfo = soa::Filtered>; using SameEvtPairsHadHad = soa::Filtered>; + using SameEvtPairsHadHadWEffInfo = soa::Filtered>; using AssocTracks = soa::Filtered>; using TrigCharmCands = soa::Join; + using TrigTracks = soa::Join; Filter filterAssocTracks = (nabs(aod::hf_correl_charm_had_reduced::dcaXYAssoc) < dcaXYTrackMax) && (nabs(aod::hf_correl_charm_had_reduced::dcaZAssoc) < dcaZTrackMax) && (aod::hf_correl_charm_had_reduced::nTpcCrossedRowsAssoc > tpcCrossedRowsMin) && (aod::hf_correl_charm_had_reduced::itsNClsAssoc > itsNClsMin); Filter filterTrigTracks = (nabs(aod::hf_correl_charm_had_reduced::dcaXYTrig) < dcaXYTrackMax) && (nabs(aod::hf_correl_charm_had_reduced::dcaZTrig) < dcaZTrackMax) && (aod::hf_correl_charm_had_reduced::nTpcCrossedRowsTrig > tpcCrossedRowsMin) && (aod::hf_correl_charm_had_reduced::itsNClsTrig > itsNClsMin); @@ -197,6 +263,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { void init(InitContext&) { + // Event selection config if (selCentrality && selMultiplicity) { LOGP(fatal, "You cannot select events based on both centrality and multiplicity! Please check your configuration!"); } @@ -204,28 +271,56 @@ struct HfCorrelatorFlowCharmHadronsReduced { LOGP(fatal, "You must select events based on either centrality or multiplicity! Please check your configuration!"); } - if ((doprocessSECharmHadWCentMix && doprocessMECharmHadWMultMix) || - (doprocessSECharmHadWMultMix && doprocessMECharmHadWCentMix) || - (doprocessSEHadHadWCentMix && doprocessMEHadHadWMultMix) || - (doprocessSEHadHadWMultMix && doprocessMEHadHadWCentMix)) { - LOGP(fatal, "You cannot mix centrality and multiplicity mixing in the same processing! Please check your configuration!"); + // Check process functions consistency + // Same-event + const bool seCharmHadCent = doprocessSECharmHadWCentMix || doprocessSECharmHadWCentMixWEffInfo; + const bool seCharmHadMult = doprocessSECharmHadWMultMix || doprocessSECharmHadWMultMixWEffInfo; + const bool seHadHadCent = doprocessSEHadHadWCentMix || doprocessSEHadHadWCentMixWEffInfo || + doprocessSEHadHadWCentMixFromCharmTables || doprocessSEHadHadWCentMixFromCharmTablesWEffInfo; + const bool seHadHadMult = doprocessSEHadHadWMultMix || doprocessSEHadHadWMultMixWEffInfo || + doprocessSEHadHadWMultMixFromCharmTables || doprocessSEHadHadWMultMixFromCharmTablesWEffInfo; + // Mixed-event + const bool meCharmHadCent = doprocessMECharmHadWCentMix || doprocessMECharmHadWCentMixWEffInfo; + const bool meCharmHadMult = doprocessMECharmHadWMultMix || doprocessMECharmHadWMultMixWEffInfo; + const bool meHadHadCent = doprocessMEHadHadWCentMix; + const bool meHadHadMult = doprocessMEHadHadWMultMix; + + // Aggregates + const bool anySE = seCharmHadCent || seCharmHadMult || seHadHadCent || seHadHadMult; + const bool anyME = meCharmHadCent || meCharmHadMult || meHadHadCent || meHadHadMult; + const bool anyCent = seCharmHadCent || seHadHadCent || meCharmHadCent || meHadHadCent; + const bool anyMult = seCharmHadMult || seHadHadMult || meCharmHadMult || meHadHadMult; + const bool anySEHadHad = seHadHadCent || seHadHadMult; + const bool anyMEHadHad = meHadHadCent || meHadHadMult; + const bool anySECharmHad = seCharmHadCent || seCharmHadMult; + const bool anyMECharmHad = meCharmHadCent || meCharmHadMult; + const bool anyCharmTriggers = doprocessCharmTriggers || doprocessCharmTriggersWEffInfo; + + // Consistency checks + if (anyCent && anyMult) { + LOGP(fatal, "You cannot mix centrality and multiplicity pools in the same processing! Please check your configuration!"); + } + if (anySEHadHad && anySECharmHad) { + LOGP(fatal, "Same-event Had-Had and Charm-Had cannot run in the same job! Please check your configuration!"); + } + if (anyMEHadHad && anyMECharmHad) { + LOGP(fatal, "Mixed-event Had-Had and Charm-Had cannot run in the same job! Please check your configuration!"); } mPtEdgesTrig.assign(binsPtTrig.value.begin() + 1, binsPtTrig.value.end()); if ((mPtEdgesTrig.size() != (bdtScore0PtMaxs.value.size() + 1) || - mPtEdgesTrig.size() != (bdtScore1PtMins.value.size() + 1))) { + mPtEdgesTrig.size() != (bdtScore1PtMins.value.size() + 1))) { LOG(info) << "mPtEdgesTrig.size(): " << mPtEdgesTrig.size(); LOG(info) << "bdtScore0PtMaxs.value.size(): " << bdtScore0PtMaxs.value.size(); LOG(info) << "bdtScore1PtMins.value.size(): " << bdtScore1PtMins.value.size(); LOGP(fatal, "The size of bdtScore0PtMaxs and bdtScore1PtMins must be the one of binsPtTrig minus one!"); } - if (doprocessSECharmHadWCentMix || doprocessSEHadHadWCentMix || doprocessMECharmHadWCentMix || doprocessMEHadHadWCentMix) { - poolBins = (binsCentPool->size() - 2) * (binsZPool->size() - 2); - } else { - poolBins = (binsMultPool->size() - 2) * (binsZPool->size() - 2); - } + // Pool bins + poolBins = anyCent ? (binsCentPool->size() - 2) * (binsZPool->size() - 2) + : (binsMultPool->size() - 2) * (binsZPool->size() - 2); + // Axes const AxisSpec axisInvMass{binsInvMass, "Inv. mass (GeV/#it{c}^{2})"}; const AxisSpec axisCent = {binsCent, "Centrality"}; const AxisSpec axisMultFT0M = {binsMultFT0M, "MultiplicityFT0M"}; @@ -238,16 +333,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { const AxisSpec axisMlOne{binsMlOne, "bdtScore0"}; const AxisSpec axisMlTwo{binsMlTwo, "bdtScore1"}; - // Histograms for data analysis - if (doprocessSECharmHadWCentMix || doprocessSECharmHadWCentMixWEffInfo || doprocessSEHadHadWCentMix) { - registry.add("hCentPoolBinSE", "Centrality SE", {HistType::kTH2F, {{axisCent}, {axisPoolBin}}}); - } else if (doprocessSECharmHadWMultMix || doprocessSECharmHadWMultMixWEffInfo || doprocessSEHadHadWMultMix) { - registry.add("hMultFT0MPoolBinSE", "Multiplicity FT0M SE", {HistType::kTH2F, {{axisMultFT0M}, {axisPoolBin}}}); - } else if (doprocessMECharmHadWCentMix || doprocessMECharmHadWCentMixWEffInfo || doprocessMEHadHadWCentMix) { - registry.add("hCentPoolBinME", "Centrality ME", {HistType::kTH2F, {{axisCent}, {axisPoolBin}}}); - } else if (doprocessMECharmHadWMultMix || doprocessMECharmHadWMultMixWEffInfo || doprocessMEHadHadWMultMix) { - registry.add("hMultFT0MPoolBinME", "Multiplicity FT0M ME", {HistType::kTH2F, {{axisMultFT0M}, {axisPoolBin}}}); - } + // Event / pool histograms registry.add("hZVtxPoolBinSE", "z vertex SE", {HistType::kTH2F, {{axisPosZ}, {axisPoolBin}}}); registry.add("hZVtxPoolBinME", "z vertex ME", {HistType::kTH2F, {{axisPosZ}, {axisPoolBin}}}); registry.add("hCollisionsCentMultAll", "Collision centrality vs multiplicity", {HistType::kTH2F, {{axisCent}, {axisMultFT0M}}}); @@ -257,47 +343,64 @@ struct HfCorrelatorFlowCharmHadronsReduced { registry.add("hPoolBinAssocSE", "Associated particles pool bin SE", {HistType::kTH1F, {axisPoolBin}}); registry.add("hPoolBinAssocME", "Associated particles pool bin ME", {HistType::kTH1F, {axisPoolBin}}); - std::vector axesTrigger = {axisInvMass, axisPtTrig, axisMlOne, axisMlTwo}; - std::vector axes = {axisPoolBin, axisPtTrig, axisPtAssoc, axisDeltaEta, axisDeltaPhi}; - if (doprocessSEHadHadWCentMix || doprocessSEHadHadWMultMix) { - registry.add("hSparseCorrelationsSEHadHad", "THn for SE Had-Had correlations", HistType::kTHnSparseF, axes); + if (anySE && anyCent) { + registry.add("hCentPoolBinSE", "Centrality SE", {HistType::kTH2F, {{axisCent}, {axisPoolBin}}}); + } + if (anySE && anyMult) { + registry.add("hMultFT0MPoolBinSE", "Multiplicity FT0M SE", {HistType::kTH2F, {{axisMultFT0M}, {axisPoolBin}}}); + } + if (anyME && anyCent) { + registry.add("hCentPoolBinME", "Centrality ME", {HistType::kTH2F, {{axisCent}, {axisPoolBin}}}); + } + if (anyME && anyMult) { + registry.add("hMultFT0MPoolBinME", "Multiplicity FT0M ME", {HistType::kTH2F, {{axisMultFT0M}, {axisPoolBin}}}); + } + + // Correlation / trigger THnSparse + const std::vector axesTrigger = {axisInvMass, axisPtTrig, axisMlOne, axisMlTwo}; + const std::vector axesHadHad = {axisPoolBin, axisPtTrig, axisPtAssoc, axisDeltaEta, axisDeltaPhi}; + const std::vector axesCharmHad = {axisPoolBin, axisPtTrig, axisPtAssoc, axisDeltaEta, axisDeltaPhi, axisInvMass, axisMlOne, axisMlTwo}; + + if (anySEHadHad) { + registry.add("hSparseCorrelationsSEHadHad", "THn for SE Had-Had correlations", HistType::kTHnSparseF, axesHadHad); if (doEfficiencyCorrection) { registry.get(HIST("hSparseCorrelationsSEHadHad"))->Sumw2(); } - } else if (doprocessMEHadHadWCentMix || doprocessMEHadHadWMultMix) { - registry.add("hSparseCorrelationsMEHadHad", "THn for ME Had-Had correlations", HistType::kTHnSparseF, axes); + } + if (anyMEHadHad) { + registry.add("hSparseCorrelationsMEHadHad", "THn for ME Had-Had correlations", HistType::kTHnSparseF, axesHadHad); if (doEfficiencyCorrection) { registry.get(HIST("hSparseCorrelationsMEHadHad"))->Sumw2(); } - } else { - axes.insert(axes.end(), {axisInvMass, axisMlOne, axisMlTwo}); - if (doprocessSECharmHadWCentMix || doprocessSECharmHadWCentMixWEffInfo || doprocessSECharmHadWMultMix || doprocessSECharmHadWMultMixWEffInfo) { - registry.add("hSparseCorrelationsSECharmHad", "THn for SE Charm-Had correlations", HistType::kTHnSparseF, axes); - if (doEfficiencyCorrection) { - registry.get(HIST("hSparseCorrelationsSECharmHad"))->Sumw2(); - } - } else if (doprocessMECharmHadWCentMix || doprocessMECharmHadWMultMixWEffInfo || doprocessMECharmHadWMultMix || doprocessMECharmHadWCentMixWEffInfo) { - registry.add("hSparseCorrelationsMECharmHad", "THn for ME Charm-Had correlations", HistType::kTHnSparseF, axes); - if (doEfficiencyCorrection) { - registry.get(HIST("hSparseCorrelationsMECharmHad"))->Sumw2(); - } + } + if (anySECharmHad) { + registry.add("hSparseCorrelationsSECharmHad", "THn for SE Charm-Had correlations", HistType::kTHnSparseF, axesCharmHad); + if (doEfficiencyCorrection) { + registry.get(HIST("hSparseCorrelationsSECharmHad"))->Sumw2(); } - if (doprocessCharmTriggers || doprocessCharmTriggersWEffInfo) { - registry.add("hSparseTrigCandsCharm", "THn for Charm trigger candidates", HistType::kTHnSparseF, axesTrigger); - if (doEfficiencyCorrection) { - registry.get(HIST("hSparseTrigCandsCharm"))->Sumw2(); - } + } + if (anyMECharmHad) { + registry.add("hSparseCorrelationsMECharmHad", "THn for ME Charm-Had correlations", HistType::kTHnSparseF, axesCharmHad); + if (doEfficiencyCorrection) { + registry.get(HIST("hSparseCorrelationsMECharmHad"))->Sumw2(); + } + } + if (anyCharmTriggers) { + registry.add("hSparseTrigCandsCharm", "THn for Charm trigger candidates", HistType::kTHnSparseF, axesTrigger); + if (doEfficiencyCorrection) { + registry.get(HIST("hSparseTrigCandsCharm"))->Sumw2(); } } + // Efficiencies if (doEfficiencyCorrection) { hEffPrompt = loadEfficiencyHistogram(promptEffCcdbPath, effHistTypeCharm); hEffAssoc = loadEfficiencyHistogram(assocEffCcdbPath, effHistTypeAssoc); } } - template - double getEfficiency(TObject* hist, int histoType, const TCand& cand) //, const std::vector& values) + template + double getEfficiency(TObject* hist, int histoType, const TCand& cand, float collPosZ) { if (!hist) { LOG(debug) << "Candidate does not have required efficiency histogram."; @@ -306,12 +409,21 @@ struct HfCorrelatorFlowCharmHadronsReduced { std::vector kineFeatures{}; - // Charm triggers - if constexpr (IsCharm) { - kineFeatures = {cand.ptTrig(), cand.bdtScore0Trig(), cand.bdtScore1Trig(), cand.etaTrig(), cand.phiTrig()}; + // 3 cases: charm triggers, track triggers and associated particles + if constexpr (IsTrigger) { + if constexpr (IsCharm) { + kineFeatures = {cand.ptTrig(), cand.bdtScore0Trig(), cand.bdtScore1Trig(), cand.etaTrig(), cand.phiTrig()}; + } else { + // Track trigger from SameEvtPairsHadHadWEffInfo + if constexpr (requires { cand.ptTrig(); }) { + kineFeatures = {cand.ptTrig(), cand.etaTrig(), cand.phiTrig(), collPosZ}; + } else { + // Track trigger from AssocTracks (charm-hadron tables) + kineFeatures = {cand.ptAssoc(), cand.etaAssoc(), cand.phiAssoc(), collPosZ}; + } + } } else { - auto collision = cand.template hfcRedCorrColl_as(); - kineFeatures = {cand.ptAssoc(), cand.etaAssoc(), cand.phiAssoc(), collision.posZ()}; + kineFeatures = {cand.ptAssoc(), cand.etaAssoc(), cand.phiAssoc(), collPosZ}; } switch (histoType) { @@ -431,14 +543,14 @@ struct HfCorrelatorFlowCharmHadronsReduced { TTrigCand const& trigCand, const TBinningType& binPolicy) { - auto collision = pair.template hfcRedCorrColl_as(); + auto collision = trigCand.template hfcRedCorrColl_as(); registry.fill(HIST("hCollisionsCentMultAll"), collision.centrality(), collision.multiplicity()); if (!isSelCollision(collision)) { return; } registry.fill(HIST("hCollisionsCentMultSel"), collision.centrality(), collision.multiplicity()); - double const ptTrig = trigCand.ptTrig(); + double const ptTrig = getPt(trigCand); if constexpr (requires { trigCand.bdtScore0Trig(); }) { // ML selection on bkg score for Charm-Had case if (!isSelBdtScoreCut(trigCand, ptTrig)) { return; @@ -458,7 +570,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { double effAssoc{1.f}; if constexpr (CorrectEff) { if (doEfficiencyCorrection) { - effAssoc = getEfficiency(hEffAssoc.get(), effHistTypeAssoc.value, pair); + effAssoc = getEfficiency(hEffAssoc.get(), effHistTypeAssoc.value, pair, collision.posZ()); if (!isValidEfficiency(effAssoc)) { LOGF(warn, "Invalid efficiency value for associated track: effAssoc = %f", effAssoc); return; @@ -471,7 +583,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { double effTrig{1.f}; if constexpr (CorrectEff) { if (doEfficiencyCorrection) { - effTrig = getEfficiency(hEffPrompt.get(), effHistTypeCharm.value, trigCand); + effTrig = getEfficiency(hEffPrompt.get(), effHistTypeCharm.value, trigCand, collision.posZ()); if (!isValidEfficiency(effTrig)) { LOGF(warn, "Invalid efficiency value for trigger candidate: effTrig = %f", effTrig); return; @@ -489,7 +601,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { double effTrig{1.f}; if constexpr (CorrectEff) { if (doEfficiencyCorrection) { - effTrig = getEfficiency(hEffAssoc.get(), effHistTypeAssoc.value, trigCand); + effTrig = getEfficiency(hEffAssoc.get(), effHistTypeAssoc.value, trigCand, collision.posZ()); if (!isValidEfficiency(effTrig)) { LOGF(warn, "Invalid efficiency value for trigger candidate: effTrig = %f", effTrig); return; @@ -559,7 +671,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { double effAssoc{1.f}; if (doEfficiencyCorrection) { - effAssoc = getEfficiency(hEffAssoc.get(), effHistTypeAssoc.value, assocTrack); + effAssoc = getEfficiency(hEffAssoc.get(), effHistTypeAssoc.value, assocTrack, assocColl.posZ()); if (!isValidEfficiency(effAssoc)) { LOGF(warn, "Invalid efficiency value for associated track: effAssoc = %f", effAssoc); continue; @@ -570,7 +682,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { double effTrig{1.f}; if (doEfficiencyCorrection) { - effTrig = getEfficiency(hEffPrompt.get(), effHistTypeCharm.value, trigCand); + effTrig = getEfficiency(hEffPrompt.get(), effHistTypeCharm.value, trigCand, trigColl.posZ()); if (!isValidEfficiency(effTrig)) { LOGF(warn, "Invalid efficiency value for trigger candidate: effTrig = %f", effTrig); continue; @@ -585,7 +697,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { double effTrig{1.f}; if (doEfficiencyCorrection) { - effTrig = getEfficiency(hEffAssoc.get(), effHistTypeAssoc.value, trigCand); + effTrig = getEfficiency(hEffAssoc.get(), effHistTypeAssoc.value, trigCand, trigColl.posZ()); if (!isValidEfficiency(effTrig)) { LOGF(warn, "Invalid efficiency value for trigger candidate: effTrig = %f", effTrig); continue; @@ -621,16 +733,6 @@ struct HfCorrelatorFlowCharmHadronsReduced { } PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processSECharmHadWMultMixWEffInfo, "Process Same Event for Charm-Had with multiplicity pools", false); - void processSEHadHadWMultMix(SameEvtPairsHadHad::iterator const& pair, - aod::HfcRedTrigTracks const&, - aod::HfcRedCorrColls const&) - { - BinningMultPosZ binPolicyPosZMult{{binsZPool, binsMultPool}}; - auto trigCand = pair.template hfcRedTrigTrack_as(); - fillSameEvent(pair, trigCand, binPolicyPosZMult); - } - PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processSEHadHadWMultMix, "Process Same Event for Had-Had with multiplicity pools", false); - void processSECharmHadWCentMix(SameEvtPairsChHad::iterator const& pair, aod::HfcRedTrigCharms const&, aod::HfcRedCorrColls const&) @@ -651,6 +753,26 @@ struct HfCorrelatorFlowCharmHadronsReduced { } PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processSECharmHadWCentMixWEffInfo, "Process Same Event for Charm-Had with centrality pools", false); + void processSEHadHadWMultMix(SameEvtPairsHadHad::iterator const& pair, + aod::HfcRedTrigTracks const&, + aod::HfcRedCorrColls const&) + { + BinningMultPosZ binPolicyPosZMult{{binsZPool, binsMultPool}}; + auto trigCand = pair.template hfcRedTrigTrack_as(); + fillSameEvent(pair, trigCand, binPolicyPosZMult); + } + PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processSEHadHadWMultMix, "Process Same Event for Had-Had with multiplicity pools", false); + + void processSEHadHadWMultMixWEffInfo(SameEvtPairsHadHadWEffInfo::iterator const& pair, + TrigTracks const&, + aod::HfcRedCorrColls const&) + { + BinningMultPosZ binPolicyPosZMult{{binsZPool, binsMultPool}}; + auto trigCand = pair.template hfcRedTrigTrack_as(); + fillSameEvent(pair, trigCand, binPolicyPosZMult); + } + PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processSEHadHadWMultMixWEffInfo, "Process Same Event for Had-Had with multiplicity pools with efficiency information", false); + void processSEHadHadWCentMix(SameEvtPairsHadHad::iterator const& pair, aod::HfcRedTrigTracks const&, aod::HfcRedCorrColls const&) @@ -661,6 +783,99 @@ struct HfCorrelatorFlowCharmHadronsReduced { } PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processSEHadHadWCentMix, "Process Same Event for Had-Had with centrality pools", false); + void processSEHadHadWCentMixWEffInfo(SameEvtPairsHadHadWEffInfo::iterator const& pair, + TrigTracks const&, + aod::HfcRedCorrColls const&) + { + BinningCentPosZ binPolicyPosZCent{{binsZPool, binsCentPool}}; + auto trigCand = pair.template hfcRedTrigTrack_as(); + fillSameEvent(pair, trigCand, binPolicyPosZCent); + } + PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processSEHadHadWCentMixWEffInfo, "Process Same Event for Had-Had with centrality pools with efficiency information", false); + + template + HadHadPairFromCharmTables buildHadHadPair(TAssTrk const& trigger, + TAssTrk const& assoc) + { + HadHadPairFromCharmTables pair; + + pair.setPtTrig(trigger.ptAssoc()); + pair.setPtAssoc(assoc.ptAssoc()); + pair.setEtaTrig(trigger.etaAssoc()); + pair.setEtaAssoc(assoc.etaAssoc()); + float deltaEta = assoc.etaAssoc() - trigger.etaAssoc(); + pair.setDeltaEta(deltaEta); + pair.setPhiTrig(trigger.phiAssoc()); + pair.setPhiAssoc(assoc.phiAssoc()); + float deltaPhi = RecoDecay::constrainAngle(assoc.phiAssoc() - trigger.phiAssoc(), -o2::constants::math::PIHalf); + pair.setDeltaPhi(deltaPhi); + pair.setNTpcCrossedRowsTrig(trigger.nTpcCrossedRowsAssoc()); + pair.setItsClsMapTrig(trigger.itsClsMapAssoc()); + pair.setItsNClsTrig(trigger.itsNClsAssoc()); + pair.setDcaXYTrig(trigger.dcaXYAssoc()); + pair.setDcaZTrig(trigger.dcaZAssoc()); + pair.setNTpcCrossedRowsAssoc(assoc.nTpcCrossedRowsAssoc()); + pair.setItsClsMapAssoc(assoc.itsClsMapAssoc()); + pair.setItsNClsAssoc(assoc.itsNClsAssoc()); + pair.setDcaXYAssoc(assoc.dcaXYAssoc()); + pair.setDcaZAssoc(assoc.dcaZAssoc()); + + return pair; + } + + template + void runSEHadHadFromCharmTables(aod::HfcRedCorrColls const& collisions, + AssocTracks const& tracks, + const TBinning& binPolicy) + { + for (const auto& collision : collisions) { + auto tracksInColl = tracks.sliceBy(assocTracksPerCol, collision.globalIndex()); + for (const auto& [trigTrk, assocTrk] : o2::soa::combinations(o2::soa::CombinationsStrictlyUpperIndexPolicy(tracksInColl, tracksInColl))) { + auto pair = buildHadHadPair(trigTrk, assocTrk); + if (std::abs(pair.deltaEta()) < deltaEtaAbsMin || std::abs(pair.deltaEta()) > deltaEtaAbsMax) { + continue; + } + fillSameEvent(pair, trigTrk, binPolicy); + } + } + } + + void processSEHadHadWMultMixFromCharmTables(aod::HfcRedCorrColls const& collisions, + AssocTracks const& tracks, + aod::HfcRedCorrColls const&) + { + BinningMultPosZ binPolicyPosZMult{{binsZPool, binsMultPool}}; + runSEHadHadFromCharmTables(collisions, tracks, binPolicyPosZMult); + } + PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processSEHadHadWMultMixFromCharmTables, "Process Same Event for Had-Had with multiplicity pools from Charm Tables", false); + + void processSEHadHadWCentMixFromCharmTables(aod::HfcRedCorrColls const& collisions, + AssocTracks const& tracks, + aod::HfcRedCorrColls const&) + { + BinningCentPosZ binPolicyPosZCent{{binsZPool, binsCentPool}}; + runSEHadHadFromCharmTables(collisions, tracks, binPolicyPosZCent); + } + PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processSEHadHadWCentMixFromCharmTables, "Process Same Event for Had-Had with centrality pools from Charm Tables", false); + + void processSEHadHadWMultMixFromCharmTablesWEffInfo(aod::HfcRedCorrColls const& collisions, + AssocTracks const& tracks, + aod::HfcRedCorrColls const&) + { + BinningMultPosZ binPolicyPosZMult{{binsZPool, binsMultPool}}; + runSEHadHadFromCharmTables(collisions, tracks, binPolicyPosZMult); + } + PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processSEHadHadWMultMixFromCharmTablesWEffInfo, "Process Same Event for Had-Had with multiplicity pools with efficiency information from Charm Tables", false); + + void processSEHadHadWCentMixFromCharmTablesWEffInfo(aod::HfcRedCorrColls const& collisions, + AssocTracks const& tracks, + aod::HfcRedCorrColls const&) + { + BinningCentPosZ binPolicyPosZCent{{binsZPool, binsCentPool}}; + runSEHadHadFromCharmTables(collisions, tracks, binPolicyPosZCent); + } + PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processSEHadHadWCentMixFromCharmTablesWEffInfo, "Process Same Event for Had-Had with centrality pools with efficiency information from Charm Tables", false); + void processMECharmHadWCentMix(aod::HfcRedCorrColls const& collisions, TrigCharmCands const& candidates, AssocTracks const& tracks) @@ -757,7 +972,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { continue; } - double effTrig = doEfficiencyCorrection ? getEfficiency(hEffPrompt.get(), effHistTypeCharm.value, trigCand) : 1.; + double effTrig = doEfficiencyCorrection ? getEfficiency(hEffPrompt.get(), effHistTypeCharm.value, trigCand, collision.posZ()) : 1.; if (doEfficiencyCorrection && !isValidEfficiency(effTrig)) { LOGF(warn, "Invalid efficiency value for trigger candidate: effTrig = %f", effTrig); continue; diff --git a/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx b/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx index 365920f243b..bdf2e1ef879 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx @@ -122,6 +122,7 @@ struct HfTaskCorrelationsEfficiencies { Configurable usePtDiffDcaXYCut{"usePtDiffDcaXYCut", false, "Use pt-differential DCAxy cut for associated tracks"}; Configurable dcaXYTrkNSigmaMax{"dcaXYTrkNSigmaMax", 7, "Cut on number of sigma deviations from expected DCA in the transverse direction"}; Configurable dcaXYPtPrimTrkFunc{"dcaXYPtPrimTrkFunc", "(0.0026+0.005/(x^1.01))", "Functional form of pt-dependent DCAxy cut"}; + Configurable rejNonRecoCollisions{"rejNonRecoCollisions", false, "Reject generated collisions that are not reconstructed"}; // Configurables for tree filling Configurable fillRecoTrees{"fillRecoTrees", false, "Fill trees of reconstructed charmed hadrons and associated tracks"}; @@ -316,15 +317,15 @@ struct HfTaskCorrelationsEfficiencies { aod::McCollisions const&) { for (const auto& coll : recoCollisions) { - auto candsInColl = candsDplus.sliceBy(candsDplusPerColl, coll.globalIndex()); - if (candsInColl.size() < 1) { - continue; - } float cent{-1.}, mult{-1.}; CentralityEstimator centDetector = CentralityEstimator::None; if (!hfcFlowHelper.selectRecoCollision(hfEvSel, ccdb, registry, coll, centDetector, cent, mult)) { continue; } + auto candsInColl = candsDplus.sliceBy(candsDplusPerColl, coll.globalIndex()); + if (candsInColl.size() < 1) { + continue; + } fillCharmEfficiencies(candsInColl, coll.numContrib()); } @@ -443,6 +444,11 @@ struct HfTaskCorrelationsEfficiencies { if (!hfcFlowHelper.selectGenCollision(hfEvSelMc, mcColl, recoColls, centDetector, cent, mult)) { continue; } + // If rejNonRecoCollisions==false, the pure tracking efficiency + // is convoluted with the event reconstruction efficiency + if (rejNonRecoCollisions && recoColls.size() < 1) { // Skipping MC events that have no reconstructed collisions + continue; + } const auto groupedMcParticles = genParticles.sliceBy(mcPartsPerMcCollision, mcColl.globalIndex()); for (const auto& genTrk : groupedMcParticles) { From b85d5056862bd73646978619c42d0e60e03cddb3 Mon Sep 17 00:00:00 2001 From: Marcello Di Costanzo Date: Wed, 11 Nov 2026 17:47:05 +0100 Subject: [PATCH 2/8] Dummy commit --- PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx b/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx index bdf2e1ef879..0364b4c08f2 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx @@ -315,7 +315,7 @@ struct HfTaskCorrelationsEfficiencies { McCandsDplus const& candsDplus, soa::Join const& genParticles, aod::McCollisions const&) - { + { for (const auto& coll : recoCollisions) { float cent{-1.}, mult{-1.}; CentralityEstimator centDetector = CentralityEstimator::None; From 59933bbcb7cc08b90100ccc209ec32db17000201 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Wed, 11 Nov 2026 16:54:13 +0000 Subject: [PATCH 3/8] Please consider the following formatting changes --- PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx | 2 +- PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx b/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx index fb22762c5d2..8f2825dc70e 100644 --- a/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx +++ b/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx @@ -309,7 +309,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { mPtEdgesTrig.assign(binsPtTrig.value.begin() + 1, binsPtTrig.value.end()); if ((mPtEdgesTrig.size() != (bdtScore0PtMaxs.value.size() + 1) || - mPtEdgesTrig.size() != (bdtScore1PtMins.value.size() + 1))) { + mPtEdgesTrig.size() != (bdtScore1PtMins.value.size() + 1))) { LOG(info) << "mPtEdgesTrig.size(): " << mPtEdgesTrig.size(); LOG(info) << "bdtScore0PtMaxs.value.size(): " << bdtScore0PtMaxs.value.size(); LOG(info) << "bdtScore1PtMins.value.size(): " << bdtScore1PtMins.value.size(); diff --git a/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx b/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx index 0364b4c08f2..bdf2e1ef879 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx @@ -315,7 +315,7 @@ struct HfTaskCorrelationsEfficiencies { McCandsDplus const& candsDplus, soa::Join const& genParticles, aod::McCollisions const&) - { + { for (const auto& coll : recoCollisions) { float cent{-1.}, mult{-1.}; CentralityEstimator centDetector = CentralityEstimator::None; From fb3de57f77b6a9c56610dd033857a449a0964182 Mon Sep 17 00:00:00 2001 From: Marcello Di Costanzo Date: Wed, 11 Nov 2026 18:00:02 +0100 Subject: [PATCH 4/8] Fix arguments ordering --- PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx b/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx index fb22762c5d2..c046083a545 100644 --- a/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx +++ b/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx @@ -412,7 +412,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { // 3 cases: charm triggers, track triggers and associated particles if constexpr (IsTrigger) { if constexpr (IsCharm) { - kineFeatures = {cand.ptTrig(), cand.bdtScore0Trig(), cand.bdtScore1Trig(), cand.etaTrig(), cand.phiTrig()}; + kineFeatures = {cand.ptTrig(), cand.etaTrig(), cand.phiTrig(), cand.bdtScore0Trig(), cand.bdtScore1Trig()}; } else { // Track trigger from SameEvtPairsHadHadWEffInfo if constexpr (requires { cand.ptTrig(); }) { From 274d34b874f1955bc10e1821e3afc950ed05b960 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Wed, 11 Nov 2026 17:00:50 +0000 Subject: [PATCH 5/8] Please consider the following formatting changes --- PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx | 2 +- PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx b/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx index c046083a545..bf82d218057 100644 --- a/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx +++ b/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx @@ -309,7 +309,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { mPtEdgesTrig.assign(binsPtTrig.value.begin() + 1, binsPtTrig.value.end()); if ((mPtEdgesTrig.size() != (bdtScore0PtMaxs.value.size() + 1) || - mPtEdgesTrig.size() != (bdtScore1PtMins.value.size() + 1))) { + mPtEdgesTrig.size() != (bdtScore1PtMins.value.size() + 1))) { LOG(info) << "mPtEdgesTrig.size(): " << mPtEdgesTrig.size(); LOG(info) << "bdtScore0PtMaxs.value.size(): " << bdtScore0PtMaxs.value.size(); LOG(info) << "bdtScore1PtMins.value.size(): " << bdtScore1PtMins.value.size(); diff --git a/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx b/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx index 0364b4c08f2..bdf2e1ef879 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx @@ -315,7 +315,7 @@ struct HfTaskCorrelationsEfficiencies { McCandsDplus const& candsDplus, soa::Join const& genParticles, aod::McCollisions const&) - { + { for (const auto& coll : recoCollisions) { float cent{-1.}, mult{-1.}; CentralityEstimator centDetector = CentralityEstimator::None; From 378a28a18d30eaf6bd4a0e74373964c86218697a Mon Sep 17 00:00:00 2001 From: Marcello Di Costanzo Date: Wed, 11 Nov 2026 19:14:23 +0100 Subject: [PATCH 6/8] Change axes sparse order --- PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx b/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx index bdf2e1ef879..cf6c6364833 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationsEfficiencies.cxx @@ -221,7 +221,7 @@ struct HfTaskCorrelationsEfficiencies { const AxisSpec axisPhiTrig = {binsPhi, "#it{#varphi}"}; const AxisSpec axisMlScore0 = {binsMlOne, "ML score 0"}; const AxisSpec axisMlScore1 = {binsMlTwo, "ML score 1"}; - std::vector axesCharmReco = {axisPtTrig, axisPvContrib, axisEtaTrig, axisPhiTrig, axisMlScore0, axisMlScore1}; + std::vector axesCharmReco = {axisPtTrig, axisEtaTrig, axisPhiTrig, axisPvContrib, axisMlScore0, axisMlScore1}; registry.add("hCharmPromptGen", "Generated prompt charm-hadron candidates;;", HistType::kTHnSparseF, {{axisPtTrig}, {axisEtaTrig}, {axisPhiTrig}}); registry.add("hCharmFdGen", "Generated non-prompt charm-hadron candidates;;", HistType::kTHnSparseF, {{axisPtTrig}, {axisEtaTrig}, {axisPhiTrig}}); @@ -291,10 +291,10 @@ struct HfTaskCorrelationsEfficiencies { // Fill the sparse std::array outputMl = hfcFlowHelper.getCandMlScores(cand); if (cand.originMcRec() == RecoDecay::OriginType::Prompt) { - registry.fill(HIST("hCharmPromptReco"), cand.pt(), numContrib, cand.eta(), cand.phi(), outputMl[0], outputMl[1]); + registry.fill(HIST("hCharmPromptReco"), cand.pt(), cand.eta(), cand.phi(), numContrib, outputMl[0], outputMl[1]); } if (cand.originMcRec() == RecoDecay::OriginType::NonPrompt) { - registry.fill(HIST("hCharmFdReco"), cand.pt(), numContrib, cand.eta(), cand.phi(), outputMl[0], outputMl[1]); + registry.fill(HIST("hCharmFdReco"), cand.pt(), cand.eta(), cand.phi(), numContrib, outputMl[0], outputMl[1]); } if (fillRecoTrees) { From 878e46fca27b6f334393916ae738d766a6971fc0 Mon Sep 17 00:00:00 2001 From: Marcello Di Costanzo Date: Thu, 12 Nov 2026 09:28:41 +0100 Subject: [PATCH 7/8] Fix code-check --- .../correlatorFlowCharmHadronsReduced.cxx | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx b/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx index bf82d218057..000838ef3ec 100644 --- a/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx +++ b/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -34,13 +35,16 @@ #include #include -#include -#include -#include +#include +#include +#include +#include #include #include +#include #include +#include #include #include #include @@ -99,24 +103,24 @@ struct HadHadPairFromCharmTables { void setDcaZAssoc(float val) { fDcaZAssoc = val; } // Access methods to mimic the HfcRedSEHadHads table structure - float ptTrig() const { return fPtTrig; } - float ptAssoc() const { return fPtAssoc; } - float etaTrig() const { return fEtaTrig; } - float etaAssoc() const { return fEtaAssoc; } - float deltaEta() const { return fDeltaEta; } - float phiTrig() const { return fPhiTrig; } - float phiAssoc() const { return fPhiAssoc; } - float deltaPhi() const { return fDeltaPhi; } - int nTpcCrossedRowsTrig() const { return fNTpcCrossedRowsTrig; } - int itsClsMapTrig() const { return fItsClsMapTrig; } - int itsNClsTrig() const { return fItsNClsTrig; } - float dcaXYTrig() const { return fDcaXYTrig; } - float dcaZTrig() const { return fDcaZTrig; } - int nTpcCrossedRowsAssoc() const { return fNTpcCrossedRowsAssoc; } - int itsClsMapAssoc() const { return fItsClsMapAssoc; } - int itsNClsAssoc() const { return fItsNClsAssoc; } - float dcaXYAssoc() const { return fDcaXYAssoc; } - float dcaZAssoc() const { return fDcaZAssoc; } + [[nodiscard]] float ptTrig() const { return fPtTrig; } + [[nodiscard]] float ptAssoc() const { return fPtAssoc; } + [[nodiscard]] float etaTrig() const { return fEtaTrig; } + [[nodiscard]] float etaAssoc() const { return fEtaAssoc; } + [[nodiscard]] float deltaEta() const { return fDeltaEta; } + [[nodiscard]] float phiTrig() const { return fPhiTrig; } + [[nodiscard]] float phiAssoc() const { return fPhiAssoc; } + [[nodiscard]] float deltaPhi() const { return fDeltaPhi; } + [[nodiscard]] int nTpcCrossedRowsTrig() const { return fNTpcCrossedRowsTrig; } + [[nodiscard]] int itsClsMapTrig() const { return fItsClsMapTrig; } + [[nodiscard]] int itsNClsTrig() const { return fItsNClsTrig; } + [[nodiscard]] float dcaXYTrig() const { return fDcaXYTrig; } + [[nodiscard]] float dcaZTrig() const { return fDcaZTrig; } + [[nodiscard]] int nTpcCrossedRowsAssoc() const { return fNTpcCrossedRowsAssoc; } + [[nodiscard]] int itsClsMapAssoc() const { return fItsClsMapAssoc; } + [[nodiscard]] int itsNClsAssoc() const { return fItsNClsAssoc; } + [[nodiscard]] float dcaXYAssoc() const { return fDcaXYAssoc; } + [[nodiscard]] float dcaZAssoc() const { return fDcaZAssoc; } }; /// Get charm candidate or hadron track pT @@ -430,7 +434,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { case kTH1: { auto* h = dynamic_cast(hist); - if (!h || kineFeatures.size() < 1) { + if (!h || kineFeatures.empty()) { return 0.; } return h->GetBinContent(h->FindBin(kineFeatures[0])); @@ -797,7 +801,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { HadHadPairFromCharmTables buildHadHadPair(TAssTrk const& trigger, TAssTrk const& assoc) { - HadHadPairFromCharmTables pair; + HadHadPairFromCharmTables pair{}; pair.setPtTrig(trigger.ptAssoc()); pair.setPtAssoc(assoc.ptAssoc()); @@ -985,7 +989,7 @@ struct HfCorrelatorFlowCharmHadronsReduced { PROCESS_SWITCH(HfCorrelatorFlowCharmHadronsReduced, processCharmTriggersWEffInfo, "Process charm trigger info with efficiency", false); }; -WorkflowSpec defineDataProcessing(ConfigContext const& cfgc) +WorkflowSpec defineDataProcessing(ConfigContext const& context) { - return WorkflowSpec{adaptAnalysisTask(cfgc)}; + return WorkflowSpec{adaptAnalysisTask(context)}; } From c4de1581fb0dcd95c438d00c16fc59d49066d091 Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Thu, 12 Nov 2026 08:29:54 +0000 Subject: [PATCH 8/8] Please consider the following formatting changes --- .../HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx b/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx index 000838ef3ec..07db185bd39 100644 --- a/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx +++ b/PWGHF/HFC/TableProducer/correlatorFlowCharmHadronsReduced.cxx @@ -35,7 +35,6 @@ #include #include -#include #include #include #include @@ -43,8 +42,10 @@ #include #include -#include +#include + #include +#include #include #include #include