From fe7dfc67bdfa6f7aa11a65cec545277c83c20685 Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Tue, 10 Mar 2026 18:10:29 +0800 Subject: [PATCH 01/19] Add files via upload --- PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx index 4f6ef50524e..9f54bbe1980 100644 --- a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx +++ b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx @@ -50,6 +50,7 @@ #include #include #include +#include #include #include @@ -825,6 +826,9 @@ struct AnalysisEnergyCorrelator { continue; } } + if (std::abs(t2_raw.pdgCode()) != PDG_t::kPiPlus && std::abs(t2_raw.pdgCode()) != PDG_t::kKPlus && std::abs(t2_raw.pdgCode()) != PDG_t::kProton && std::abs(t2_raw.pdgCode()) != PDG_t::kElectron && std::abs(t2_raw.pdgCode()) != PDG_t::kMuonMinus) { + continue; + } if (t2_raw.pt() < fConfigDileptonHadronOptions.fConfigMCGenHadronPtMin.value || std::abs(t2_raw.eta()) > fConfigDileptonHadronOptions.fConfigMCGenHadronEtaAbs.value) { continue; } @@ -879,7 +883,6 @@ struct AnalysisEnergyCorrelator { } // loop over two event comibnations for (auto& [event1, event2] : selfCombinations(*fMixingBinning, fConfigEventOptions.fConfigMixingDepth.value, -1, events, events)) { - LOG(info) << "check1"; VarManager::ResetValues(0, VarManager::kNVars); VarManager::FillEvent(event1); if (!fEventCut->IsSelected(VarManager::fgValues)) { From 63d41fe805a4b251c44a341c9a71b683a5d259b2 Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Tue, 10 Mar 2026 21:01:31 +0800 Subject: [PATCH 02/19] Add files via upload --- PWGDQ/Core/VarManager.h | 94 ----------------------------------------- 1 file changed, 94 deletions(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 487383bfc90..14488385846 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -1329,8 +1329,6 @@ class VarManager : public TObject static void FillTrackMC(const U& mcStack, T const& track, float* values = nullptr); template static void FillEnergyCorrelatorsMC(T const& track, T1 const& t1, float* values = nullptr, float Translow = 1. / 3, float Transhigh = 2. / 3); - template - static void FillEnergyCorrelatorsMCUnfolding(T1 const& dilepton, T2 const& hadron, T const& track, T3 const& t1, float* values = nullptr); template static void FillPairPropagateMuon(T1 const& muon1, T2 const& muon2, const C& collision, float* values = nullptr); template @@ -1368,8 +1366,6 @@ class VarManager : public TObject template static void FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, T4 const& track, T5 const& t1, float* values = nullptr); template - static void FillEnergyCorrelator(T1 const& dilepton, T2 const& hadron, float* values = nullptr, float Translow = 1. / 3, float Transhigh = 2. / 3, bool applyFitMass = false, float sidebandMass = 0.0f); - template static void FillDileptonPhoton(T1 const& dilepton, T2 const& photon, float* values = nullptr); template static void FillHadron(T const& hadron, float* values = nullptr, float hadronMass = 0.0f); @@ -3360,35 +3356,6 @@ void VarManager::FillEnergyCorrelatorsMC(T const& track, T1 const& t1, float* va } } -template -void VarManager::FillEnergyCorrelatorsMCUnfolding(T1 const& dilepton, T2 const& hadron, T const& track, T3 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 - float MassHadron; - if constexpr (pairType == kJpsiHadronMass) { - MassHadron = TMath::Sqrt(t1.e() * t1.e() - t1.p() * t1.p()); - } - if constexpr (pairType == kJpsiPionMass) { - MassHadron = o2::constants::physics::MassPionCharged; - } - ROOT::Math::PtEtaPhiMVector v1_gen(track.pt(), track.eta(), track.phi(), o2::constants::physics::MassJPsi); - ROOT::Math::PtEtaPhiMVector v2_gen(t1.pt(), t1.eta(), t1.phi(), MassHadron); - float E_boost_gen = LorentzTransformJpsihadroncosChi("weight_boost", v1_gen, v2_gen); - float CosChi_gen = LorentzTransformJpsihadroncosChi("coschi", v1_gen, v2_gen); - values[kMCCosChi_gen] = CosChi_gen; - 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 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); - values[kMCWeight_rec] = E_boost_rec / v1_rec.M(); - values[kMCdeltaeta_rec] = dilepton.eta() - hadron.eta(); - } -} - template void VarManager::FillPairPropagateMuon(T1 const& muon1, T2 const& muon2, const C& collision, float* values) { @@ -5817,67 +5784,6 @@ void VarManager::FillDileptonHadron(T1 const& dilepton, T2 const& hadron, float* } } -template -void VarManager::FillEnergyCorrelator(T1 const& dilepton, T2 const& hadron, float* values, float Translow, float Transhigh, bool applyFitMass, float sidebandMass) -{ - float dileptonmass = o2::constants::physics::MassJPsi; - if (applyFitMass) { - dileptonmass = dilepton.mass(); - } - if (applyFitMass && sidebandMass > 0) { - dileptonmass = sidebandMass; - } - - if (fgUsedVars[kCosChi] || fgUsedVars[kECWeight] || fgUsedVars[kCosTheta] || fgUsedVars[kEWeight_before] || fgUsedVars[kPtDau] || fgUsedVars[kEtaDau] || fgUsedVars[kPhiDau] || fgUsedVars[kCosChi_randomPhi_trans] || fgUsedVars[kCosChi_randomPhi_toward] || fgUsedVars[kCosChi_randomPhi_away]) { - values[kdileptonmass] = dileptonmass; - ROOT::Math::PtEtaPhiMVector v1(dilepton.pt(), dilepton.eta(), dilepton.phi(), dileptonmass); - ROOT::Math::PtEtaPhiMVector v2(hadron.pt(), hadron.eta(), hadron.phi(), o2::constants::physics::MassPionCharged); - values[kCosChi] = LorentzTransformJpsihadroncosChi("coschi", v1, v2); - float E_boost = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2); - values[kECWeight] = E_boost / v1.M(); - values[kCosTheta] = LorentzTransformJpsihadroncosChi("costheta", v1, v2); - values[kEWeight_before] = v2.Pt() / v1.M(); - values[kPtDau] = v2.pt(); - values[kEtaDau] = v2.eta(); - values[kPhiDau] = RecoDecay::constrainAngle(v2.phi(), -o2::constants::math::PIHalf); - - float deltaphi = RecoDecay::constrainAngle(v1.phi() - v2.phi(), -o2::constants::math::PI); - values[kCosChi_randomPhi_trans] = -999.9f; - values[kCosChi_randomPhi_toward] = -999.9f; - values[kCosChi_randomPhi_away] = -999.9f; - - values[kdeltaphi_randomPhi_trans] = -999.9f; - values[kdeltaphi_randomPhi_toward] = -999.9f; - values[kdeltaphi_randomPhi_away] = -999.9f; - - float randomPhi_trans = -o2::constants::math::PIHalf; - float randomPhi_toward = -o2::constants::math::PIHalf; - float randomPhi_away = -o2::constants::math::PIHalf; - - if ((deltaphi > -Transhigh * TMath::Pi() && deltaphi < -Translow * TMath::Pi()) || (deltaphi > Translow * TMath::Pi() && deltaphi < Transhigh * TMath::Pi())) { - randomPhi_trans = gRandom->Uniform(-o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf); - randomPhi_toward = gRandom->Uniform(-o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf); - randomPhi_away = gRandom->Uniform(-o2::constants::math::PIHalf, 3. * o2::constants::math::PIHalf); - - ROOT::Math::PtEtaPhiMVector v2_randomPhi_trans(v2.pt(), v2.eta(), randomPhi_trans, o2::constants::physics::MassPionCharged); - values[kCosChi_randomPhi_trans] = LorentzTransformJpsihadroncosChi("coschi", v1, v2_randomPhi_trans); - values[kWeight_randomPhi_trans] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_trans) / v1.M(); - - ROOT::Math::PtEtaPhiMVector v2_randomPhi_toward(v2.pt(), v2.eta(), randomPhi_toward, o2::constants::physics::MassPionCharged); - values[kCosChi_randomPhi_toward] = LorentzTransformJpsihadroncosChi("coschi", v1, v2_randomPhi_toward); - values[kWeight_randomPhi_toward] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_toward) / v1.M(); - - ROOT::Math::PtEtaPhiMVector v2_randomPhi_away(v2.pt(), v2.eta(), randomPhi_away, o2::constants::physics::MassPionCharged); - values[kCosChi_randomPhi_away] = LorentzTransformJpsihadroncosChi("coschi", v1, v2_randomPhi_away); - values[kWeight_randomPhi_away] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_away) / v1.M(); - - values[kdeltaphi_randomPhi_trans] = RecoDecay::constrainAngle(v1.phi() - randomPhi_trans, -o2::constants::math::PIHalf); - values[kdeltaphi_randomPhi_toward] = RecoDecay::constrainAngle(v1.phi() - randomPhi_toward, -o2::constants::math::PIHalf); - values[kdeltaphi_randomPhi_away] = RecoDecay::constrainAngle(v1.phi() - randomPhi_away, -o2::constants::math::PIHalf); - } - } -} - template void VarManager::FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, float* values, float Translow, float Transhigh, bool applyFitMass, float sidebandMass) { From cd126162827c83c52ee65646e0c6dff15dc3b081 Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Tue, 10 Mar 2026 21:03:00 +0800 Subject: [PATCH 03/19] Add files via upload --- PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx | 351 +----------------- 1 file changed, 3 insertions(+), 348 deletions(-) diff --git a/PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx b/PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx index 948493f9cf4..4585a894098 100644 --- a/PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx +++ b/PWGDQ/Tasks/dqEfficiency_withAssoc_direct.cxx @@ -19,8 +19,6 @@ #include "PWGDQ/Core/HistogramsLibrary.h" #include "PWGDQ/Core/MCSignal.h" #include "PWGDQ/Core/MCSignalLibrary.h" -#include "PWGDQ/Core/MixingHandler.h" -#include "PWGDQ/Core/MixingLibrary.h" #include "PWGDQ/Core/VarManager.h" #include "PWGDQ/DataModel/ReducedInfoTables.h" @@ -77,7 +75,6 @@ namespace o2::aod { namespace dqanalysisflags { -DECLARE_SOA_COLUMN(MixingHash, mixingHash, int); //! Hash used in event mixing //need to understand DECLARE_SOA_BITMAP_COLUMN(IsEventSelected, isEventSelected, 32); //! Event decision DECLARE_SOA_BITMAP_COLUMN(IsBarrelSelected, isBarrelSelected, 32); //! Barrel track decisions DECLARE_SOA_COLUMN(BarrelAmbiguityInBunch, barrelAmbiguityInBunch, int8_t); //! Barrel track in-bunch ambiguity @@ -186,8 +183,7 @@ DECLARE_SOA_COLUMN(OniaVz, oniaVz, float); DECLARE_SOA_COLUMN(OniaVtxZ, oniaVtxZ, float); } // namespace dqanalysisflags -DECLARE_SOA_TABLE(EventCuts, "AOD", "DQANAEVCUTS", dqanalysisflags::IsEventSelected); //! joinable to ReducedEvents -DECLARE_SOA_TABLE(MixingHashes, "AOD", "DQANAMIXHASHA", dqanalysisflags::MixingHash); //! joinable to ReducedEvents +DECLARE_SOA_TABLE(EventCuts, "AOD", "DQANAEVCUTS", dqanalysisflags::IsEventSelected); //! joinable to ReducedEvents //! joinable to ReducedEvents DECLARE_SOA_TABLE(BarrelTrackCuts, "AOD", "DQANATRKCUTS", dqanalysisflags::IsBarrelSelected); //! joinable to ReducedTracksAssoc DECLARE_SOA_TABLE(BarrelAmbiguities, "AOD", "DQBARRELAMB", dqanalysisflags::BarrelAmbiguityInBunch, dqanalysisflags::BarrelAmbiguityOutOfBunch); //! joinable to ReducedBarrelTracks DECLARE_SOA_TABLE(Prefilter, "AOD", "DQPREFILTER", dqanalysisflags::IsBarrelSelectedPrefilter); //! joinable to ReducedTracksAssoc @@ -246,7 +242,6 @@ using MyMuonTracksWithCovWithAmbiguities = soa::Join; using MyEvents = soa::Join; using MyEventsSelected = soa::Join; -using MyEventsHashSelected = soa::Join; using MyBarrelTracksWithCov = soa::Join eventSel; - Produces hash; OutputObj fOutputList{"output"}; - Configurable fConfigMixingVariables{"cfgMixingVars", "", "Mixing configs separated by a comma, default no mixing"}; Configurable fConfigEventCuts{"cfgEventCuts", "eventStandard", "Event selection"}; Configurable fConfigEventCutsJSON{"cfgEventCutsJSON", "", "Additional event cuts specified in JSON format"}; Configurable fConfigQA{"cfgQA", false, "If true, fill QA histograms"}; @@ -309,7 +302,6 @@ struct AnalysisEventSelection { Configurable fConfigNoLaterThan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "latest acceptable timestamp of creation for the object"}; HistogramManager* fHistMan = nullptr; - MixingHandler* fMixHandler = nullptr; AnalysisCompositeCut* fEventCut; @@ -361,16 +353,6 @@ struct AnalysisEventSelection { fOutputList.setObject(fHistMan->GetMainHistogramList()); } - TString mixVarsString = fConfigMixingVariables.value; - std::unique_ptr objArray(mixVarsString.Tokenize(",")); - if (objArray->GetEntries() > 0) { - fMixHandler = new MixingHandler("mixingHandler", "mixing handler"); - fMixHandler->Init(); - for (int iVar = 0; iVar < objArray->GetEntries(); ++iVar) { - dqmixing::SetUpMixing(fMixHandler, objArray->At(iVar)->GetName()); - } - } - fCurrentRun = -1; fCCDB->setURL(fConfigCcdbUrl.value); fCCDB->setCaching(true); @@ -442,10 +424,6 @@ struct AnalysisEventSelection { auto& evIndices = fBCCollMap[bc.globalBC()]; evIndices.push_back(event.globalIndex()); } - if (fMixHandler != nullptr) { - int hh = fMixHandler->FindEventCategory(VarManager::fgValues); - hash(hh); - } } for (auto& event : mcEvents) { @@ -2143,15 +2121,9 @@ struct AnalysisDileptonTrack { Configurable fConfigUseKFVertexing{"cfgUseKFVertexing", false, "Use KF Particle for secondary vertex reconstruction (DCAFitter is used by default)"}; Configurable fConfigDileptonLowpTCut{"cfgDileptonLowpTCut", 0.0, "Low pT cut for dileptons used in the triplet vertexing"}; Configurable fConfigDileptonHighpTCut{"cfgDileptonHighpTCut", 1E5, "High pT cut for dileptons used in the triplet vertexing"}; - Configurable fConfigDileptonRapCutAbs{"cfgDileptonRapCutAbs", 1.0, "Rap cut for dileptons used in the triplet vertexing"}; Configurable fConfigHistogramSubgroups{"cfgDileptonTrackHistogramsSubgroups", "invmass,vertexing", "Comma separated list of dilepton-track histogram subgroups"}; Configurable fConfigAddJSONHistograms{"cfgAddJSONHistograms", "", "Histograms in JSON format"}; - Configurable fConfigMixingDepth{"cfgMixingDepth", 5, "Event mixing pool depth"}; Configurable fConfigPublishTripletTable{"cfgPublishTripletTable", false, "Publish the triplet tables, BmesonCandidates"}; - Configurable fConfigApplyMassEC{"cfgApplyMassEC", false, "Apply fit mass for sideband for the energy correlator study"}; - Configurable> fConfigSavelessevents{"cfgSavelessevents", std::vector{1, 0}, "Save less events for the energy correlator study"}; - Configurable> fConfigTransRange{"cfgTransRange", std::vector{0.333333, 0.666667}, "Transverse region for the energy correlstor analysis"}; - Configurable fConfigEnergycorrelator{"cfgEnergycorrelator", false, "Add some hist for energy correlator study"}; } fConfigOptions; struct : ConfigurableGroup { @@ -2212,19 +2184,14 @@ struct AnalysisDileptonTrack { MCSignal* fDileptonLegSignal; MCSignal* fHadronSignal; - NoBinningPolicy fHashBin; - void init(o2::framework::InitContext& context) { cout << "AnalysisDileptonTrack::init() called" << endl; bool isBarrel = context.mOptions.get("processBarrel"); - bool isBarrelME = context.mOptions.get("processBarrelMixedEvent"); // bool isBarrelAsymmetric = context.mOptions.get("processDstarToD0Pi"); // bool isMuon = context.mOptions.get("processMuonSkimmed"); bool isMCGen = context.mOptions.get("processMCGen"); bool isDummy = context.mOptions.get("processDummy"); - bool isMCGen_energycorrelators = context.mOptions.get("processMCGenEnergyCorrelators") || context.mOptions.get("processMCGenEnergyCorrelatorsPion"); - bool isMCGen_energycorrelatorsME = context.mOptions.get("processMCGenEnergyCorrelatorsME") || context.mOptions.get("processMCGenEnergyCorrelatorsPionME"); if (isDummy) { if (isBarrel || isMCGen /*|| isBarrelAsymmetric*/ /*|| isMuon*/) { @@ -2469,11 +2436,8 @@ struct AnalysisDileptonTrack { fLegCutNames.push_back(pairLegCutName); // define dilepton histograms - if (!fConfigOptions.fConfigEnergycorrelator) { - DefineHistograms(fHistMan, Form("DileptonsSelected_%s", pairLegCutName.Data()), "barrel,vertexing"); - } else { - DefineHistograms(fHistMan, Form("DileptonsSelected_%s", pairLegCutName.Data()), ""); - } + DefineHistograms(fHistMan, Form("DileptonsSelected_%s", pairLegCutName.Data()), "barrel,vertexing"); + // loop over track cuts and create dilepton - track histogram directories for (int iCutTrack = 0; iCutTrack < fNCuts; iCutTrack++) { @@ -2485,9 +2449,6 @@ struct AnalysisDileptonTrack { DefineHistograms(fHistMan, Form("DileptonTrack_%s_%s", pairLegCutName.Data(), fTrackCutNames[iCutTrack].Data()), fConfigOptions.fConfigHistogramSubgroups.value.data()); for (auto& sig : fRecMCSignals) { DefineHistograms(fHistMan, Form("DileptonTrackMCMatched_%s_%s_%s", pairLegCutName.Data(), fTrackCutNames[iCutTrack].Data(), sig->GetName()), fConfigOptions.fConfigHistogramSubgroups.value.data()); - if (isBarrelME) { - DefineHistograms(fHistMan, Form("DileptonTrackMCMatchedME_%s_%s_%s", pairLegCutName.Data(), fTrackCutNames[iCutTrack].Data(), sig->GetName()), fConfigOptions.fConfigHistogramSubgroups.value.data()); - } } if (!cfgPairing_strCommonTrackCuts.IsNull()) { @@ -2537,18 +2498,6 @@ struct AnalysisDileptonTrack { } } - if (isMCGen_energycorrelators) { - for (auto& sig : fGenMCSignals) { - DefineHistograms(fHistMan, Form("MCTruthEenergyCorrelators_%s", sig->GetName()), ""); - } - } - - if (isMCGen_energycorrelatorsME) { - for (auto& sig : fGenMCSignals) { - DefineHistograms(fHistMan, Form("MCTruthEenergyCorrelatorsME_%s", sig->GetName()), ""); - } - } - TString addHistsStr = fConfigOptions.fConfigAddJSONHistograms.value; if (addHistsStr != "") { dqhistograms::AddHistogramsFromJSON(fHistMan, addHistsStr.Data()); @@ -2616,11 +2565,6 @@ struct AnalysisDileptonTrack { if (dilepton.sign() != 0) { continue; } - // dilepton rap cut - float rap = dilepton.rap(); - if (fConfigMCOptions.fConfigUseMCRapcut && abs(rap) > fConfigOptions.fConfigDileptonRapCutAbs) { - continue; - } VarManager::FillTrack(dilepton, fValuesDilepton); @@ -2679,11 +2623,6 @@ struct AnalysisDileptonTrack { continue; } auto trackMC = track.mcParticle(); - // for the energy correlator analysis - auto motherParticle = lepton1MC.template mothers_first_as(); - std::vector fTransRange = fConfigOptions.fConfigTransRange; - VarManager::FillEnergyCorrelator(dilepton, track, fValuesHadron, fTransRange[0], fTransRange[1], fConfigOptions.fConfigApplyMassEC); - VarManager::FillEnergyCorrelatorsMCUnfolding(dilepton, track, motherParticle, trackMC, fValuesHadron); mcDecision = 0; isig = 0; for (auto sig = fRecMCSignals.begin(); sig != fRecMCSignals.end(); sig++, isig++) { @@ -2885,10 +2824,6 @@ struct AnalysisDileptonTrack { if (!event.isEventSelected_bit(0)) { continue; } - std::vector fSavelessevents = fConfigOptions.fConfigSavelessevents; - if (fSavelessevents[0] > 1 && event.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { - continue; - } auto groupedBarrelAssocs = assocs.sliceBy(trackAssocsPerCollision, event.globalIndex()); // groupedBarrelAssocs.bindInternalIndicesTo(&assocs); auto groupedDielectrons = dileptons.sliceBy(dielectronsPerCollision, event.globalIndex()); @@ -2898,114 +2833,6 @@ struct AnalysisDileptonTrack { cout << "AnalysisDileptonTrack::processBarrel() completed" << endl; } - void processBarrelMixedEvent(soa::Filtered& events, - BCsWithTimestamps const& bcs, - soa::Join const& assocs, - MyBarrelTracksWithCov const& tracks, soa::Filtered const& dileptons, - McCollisions const& /*mcEvents*/, McParticles const& /*mcTracks*/) - { - if (events.size() == 0) { - return; - } - if (fCurrentRun != bcs.begin().runNumber()) { // start: runNumber - initParamsFromCCDB(bcs.begin().timestamp()); - fCurrentRun = bcs.begin().runNumber(); - } // end: runNumber - // loop over two event comibnations - for (auto& [event1, event2] : selfCombinations(fHashBin, fConfigOptions.fConfigMixingDepth.value, -1, events, events)) { - // fill event quantities - if (!event1.isEventSelected_bit(0) || !event2.isEventSelected_bit(0)) { - continue; - } - std::vector fSavelessevents = fConfigOptions.fConfigSavelessevents; - if (fSavelessevents[0] > 1 && event1.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { - continue; - } - // get the dilepton slice for event1 - auto evDileptons = dileptons.sliceBy(dielectronsPerCollision, event1.globalIndex()); - evDileptons.bindExternalIndices(&events); - - // get the track associations slice for event2 - auto evAssocs = assocs.sliceBy(trackAssocsPerCollision, event2.globalIndex()); - evAssocs.bindExternalIndices(&events); - - uint32_t mcDecision = static_cast(0); - size_t isig = 0; - - // loop over dileptons - for (auto dilepton : evDileptons) { - // get full track info of tracks based on the index - auto lepton1 = tracks.rawIteratorAt(dilepton.index0Id()); - auto lepton2 = tracks.rawIteratorAt(dilepton.index1Id()); - if (!lepton1.has_mcParticle() || !lepton2.has_mcParticle()) { - continue; - } - auto lepton1MC = lepton1.mcParticle(); - auto lepton2MC = lepton2.mcParticle(); - // Check that the dilepton has zero charge - if (dilepton.sign() != 0) { - continue; - } - // dilepton rap cut - float rap = dilepton.rap(); - if (fConfigMCOptions.fConfigUseMCRapcut && abs(rap) > fConfigOptions.fConfigDileptonRapCutAbs) { - continue; - } - - // loop over associations - for (auto& assoc : evAssocs) { - - // check that this track fulfills at least one of the specified cuts - uint32_t trackSelection = (assoc.isBarrelSelected_raw() & fTrackCutBitMap); - if (!trackSelection) { - continue; - } - - // get the track from this association - // auto track = assoc.template track_as(); - auto track = tracks.rawIteratorAt(assoc.trackId()); - // check that this track is not included in the current dilepton - if (track.globalIndex() == dilepton.index0Id() || track.globalIndex() == dilepton.index1Id()) { - continue; - } - - if (!track.has_mcParticle()) { - continue; - } - auto trackMC = track.mcParticle(); - // for the energy correlator analysis - auto motherParticle = lepton1MC.template mothers_first_as(); - std::vector fTransRange = fConfigOptions.fConfigTransRange; - VarManager::FillEnergyCorrelator(dilepton, track, VarManager::fgValues, fTransRange[0], fTransRange[1], fConfigOptions.fConfigApplyMassEC); - VarManager::FillEnergyCorrelatorsMCUnfolding(dilepton, track, motherParticle, trackMC, VarManager::fgValues); - mcDecision = 0; - isig = 0; - for (auto sig = fRecMCSignals.begin(); sig != fRecMCSignals.end(); sig++, isig++) { - if ((*sig)->CheckSignal(true, lepton1MC, lepton2MC, trackMC)) { - mcDecision |= (static_cast(1) << isig); - } - } - - // loop over dilepton leg cuts and track cuts and fill histograms separately for each combination - for (int icut = 0; icut < fNCuts; icut++) { - if (!dilepton.filterMap_bit(icut)) { - continue; - } - for (uint32_t iTrackCut = 0; iTrackCut < fTrackCutNames.size(); iTrackCut++) { - if (trackSelection & (static_cast(1) << iTrackCut)) { - for (uint32_t isig = 0; isig < fRecMCSignals.size(); isig++) { - if (mcDecision & (static_cast(1) << isig)) { - fHistMan->FillHistClass(Form("DileptonTrackMCMatchedME_%s_%s_%s", fLegCutNames[icut].Data(), fTrackCutNames[iTrackCut].Data(), fRecMCSignals[isig]->GetName()), VarManager::fgValues); - } - } - } - } - } - } // end for (assocs) - } // end for (dileptons) - } // end event loop - } - /* void processDstarToD0Pi(soa::Filtered const& events, BCsWithTimestamps const& bcs, soa::Filtered> const& assocs, MyBarrelTracksWithCov const& tracks, soa::Filtered const& ditracks, @@ -3144,183 +2971,15 @@ struct AnalysisDileptonTrack { cout << "AnalysisDileptonTrack::processMCGen() completed" << endl; } - template - void runEnergyCorrelators(TEvent const& event, McParticles const& mcTracks) - { - auto groupedMCTracks = mcTracks.sliceBy(perReducedMcEvent, event.mcCollisionId()); - groupedMCTracks.bindInternalIndicesTo(&mcTracks); - for (auto& t1 : groupedMCTracks) { - auto t1_raw = mcTracks.rawIteratorAt(t1.globalIndex()); - // apply kinematic cuts for signal - if ((t1_raw.pt() < fConfigOptions.fConfigDileptonLowpTCut || t1_raw.pt() > fConfigOptions.fConfigDileptonHighpTCut)) - continue; - if (abs(t1_raw.y()) > fConfigOptions.fConfigDileptonRapCutAbs) - continue; - // for the energy correlators - for (auto& t2 : groupedMCTracks) { - auto t2_raw = groupedMCTracks.rawIteratorAt(t2.globalIndex()); - if (!t2_raw.isPhysicalPrimary()) { - continue; - } - - if (t2_raw.has_mothers()) { - auto mother_raw = t2_raw.template mothers_first_as(); - if (mother_raw.globalIndex() == t1_raw.globalIndex()) { - continue; - } - } - - if (t2_raw.pt() < fConfigMCOptions.fConfigMCGenHadronPtMin.value || std::abs(t2_raw.eta()) > fConfigMCOptions.fConfigMCGenHadronEtaAbs.value) { - continue; - } - - std::vector fTransRange = fConfigOptions.fConfigTransRange; - VarManager::FillEnergyCorrelatorsMC(t1_raw, t2_raw, VarManager::fgValues, fTransRange[0], fTransRange[1]); - for (auto& sig : fGenMCSignals) { - if (sig->CheckSignal(true, t1_raw)) { - fHistMan->FillHistClass(Form("MCTruthEenergyCorrelators_%s", sig->GetName()), VarManager::fgValues); - } - } - } - } - } - - void processMCGenEnergyCorrelators(soa::Filtered const& events, - McCollisions const& /*mcEvents*/, McParticles const& mcTracks) - { - if (events.size() == 0) { - LOG(warning) << "No events in this TF, going to the next one ..."; - return; - } - for (auto& event : events) { - if (!event.isEventSelected_bit(0)) { - continue; - } - if (!event.has_mcCollision()) { - continue; - } - std::vector fSavelessevents = fConfigOptions.fConfigSavelessevents; - if (fSavelessevents[0] > 1 && event.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { - continue; - } - runEnergyCorrelators(event, mcTracks); - } - } - - void processMCGenEnergyCorrelatorsPion(soa::Filtered const& events, - McCollisions const& /*mcEvents*/, McParticles const& mcTracks) - { - if (events.size() == 0) { - LOG(warning) << "No events in this TF, going to the next one ..."; - return; - } - for (auto& event : events) { - if (!event.isEventSelected_bit(0)) { - continue; - } - if (!event.has_mcCollision()) { - continue; - } - runEnergyCorrelators(event, mcTracks); - } - } - - template - void runEnergyCorrelatorsMixedEvent(TEvent const& event1, TEvent const& event2, McParticles const& mcTracks) - { - auto groupedMCTracks1 = mcTracks.sliceBy(perReducedMcEvent, event1.mcCollisionId()); - auto groupedMCTracks2 = mcTracks.sliceBy(perReducedMcEvent, event2.mcCollisionId()); - groupedMCTracks1.bindInternalIndicesTo(&mcTracks); - groupedMCTracks2.bindInternalIndicesTo(&mcTracks); - for (auto& t1 : groupedMCTracks1) { - auto t1_raw = mcTracks.rawIteratorAt(t1.globalIndex()); - // apply kinematic cuts for signal - if ((t1_raw.pt() < fConfigOptions.fConfigDileptonLowpTCut || t1_raw.pt() > fConfigOptions.fConfigDileptonHighpTCut)) { - continue; - } - if (abs(t1_raw.y()) > fConfigOptions.fConfigDileptonRapCutAbs) { - continue; - } - // for the energy correlators - for (auto& t2 : groupedMCTracks2) { - auto t2_raw = groupedMCTracks2.rawIteratorAt(t2.globalIndex()); - if (!t2_raw.isPhysicalPrimary()) { - continue; - } - - if (t2_raw.has_mothers()) { - auto mother_raw = t2_raw.template mothers_first_as(); - if (mother_raw.globalIndex() == t1_raw.globalIndex()) { - continue; - } - } - - if (t2_raw.pt() < fConfigMCOptions.fConfigMCGenHadronPtMin.value || std::abs(t2_raw.eta()) > fConfigMCOptions.fConfigMCGenHadronEtaAbs.value) { - continue; - } - - for (auto& sig : fGenMCSignals) { - if (sig->CheckSignal(true, t1_raw)) { - VarManager::FillEnergyCorrelatorsMC(t1_raw, t2_raw, VarManager::fgValues); - fHistMan->FillHistClass(Form("MCTruthEenergyCorrelatorsME_%s", sig->GetName()), VarManager::fgValues); - } - } - } - } - } - - void processMCGenEnergyCorrelatorsME(soa::Filtered const& events, - McCollisions const& /*mcEvents*/, McParticles const& mcTracks) - { - if (events.size() == 0) { - LOG(warning) << "No events in this TF, going to the next one ..."; - return; - } - // loop over two event comibnations - for (auto& [event1, event2] : selfCombinations(fHashBin, fConfigOptions.fConfigMixingDepth.value, -1, events, events)) { - if (!event1.isEventSelected_bit(0) || !event2.isEventSelected_bit(0)) { - continue; - } - if (!event1.has_mcCollision() || !event2.has_mcCollision()) { - continue; - } - runEnergyCorrelatorsMixedEvent(event1, event2, mcTracks); - } - } - - void processMCGenEnergyCorrelatorsPionME(soa::Filtered const& events, - McCollisions const& /*mcEvents*/, McParticles const& mcTracks) - { - if (events.size() == 0) { - LOG(warning) << "No events in this TF, going to the next one ..."; - return; - } - // loop over two event comibnations - for (auto& [event1, event2] : selfCombinations(fHashBin, fConfigOptions.fConfigMixingDepth.value, -1, events, events)) { - if (!event1.isEventSelected_bit(0) || !event2.isEventSelected_bit(0)) { - continue; - } - if (!event1.has_mcCollision() || !event2.has_mcCollision()) { - continue; - } - runEnergyCorrelatorsMixedEvent(event1, event2, mcTracks); - } - } - void processDummy(MyEvents&) { // do nothing } PROCESS_SWITCH(AnalysisDileptonTrack, processBarrel, "Run barrel dilepton-track pairing, using skimmed data", false); - PROCESS_SWITCH(AnalysisDileptonTrack, processBarrelMixedEvent, "Run barrel dilepton-hadron mixed event pairing", false); // PROCESS_SWITCH(AnalysisDileptonTrack, processDstarToD0Pi, "Run barrel pairing of D0 daughters with pion candidate, using skimmed data", false); // PROCESS_SWITCH(AnalysisDileptonTrack, processMuonSkimmed, "Run muon dilepton-track pairing, using skimmed data", false); PROCESS_SWITCH(AnalysisDileptonTrack, processMCGen, "Loop over MC particle stack and fill generator level histograms", false); - PROCESS_SWITCH(AnalysisDileptonTrack, processMCGenEnergyCorrelators, "Loop over MC particle stack and fill generator level histograms(energy correlators)", false); - PROCESS_SWITCH(AnalysisDileptonTrack, processMCGenEnergyCorrelatorsPion, "Loop over MC particle stack and fill generator level histograms(energy correlators)", false); - PROCESS_SWITCH(AnalysisDileptonTrack, processMCGenEnergyCorrelatorsME, "Loop over MC particle stack and fill generator level histograms(energy correlators)", false); - PROCESS_SWITCH(AnalysisDileptonTrack, processMCGenEnergyCorrelatorsPionME, "Loop over MC particle stack and fill generator level histograms(energy correlators)", false); PROCESS_SWITCH(AnalysisDileptonTrack, processDummy, "Dummy function", true); }; @@ -3431,9 +3090,5 @@ void DefineHistograms(HistogramManager* histMan, TString histClasses, const char if (classStr.Contains("DileptonHadronCorrelation")) { dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "dilepton-hadron-correlation"); } - - if (classStr.Contains("MCTruthEenergyCorrelators")) { - dqhistograms::DefineHistograms(histMan, objArray->At(iclass)->GetName(), "energy-correlator-gen"); - } } // end loop over histogram classes } From 285891988e8c9fc6a34c67ce37294f3018509c5e Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Tue, 10 Mar 2026 21:11:52 +0800 Subject: [PATCH 04/19] Add files via upload --- PWGDQ/Tasks/tableReader_withAssoc.cxx | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 2b112f3c15d..4d22ba5eac8 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -3602,7 +3602,7 @@ struct AnalysisDileptonTrack { } // dilepton rap cut float rap = dilepton.rap(); - if (fConfigUseRapcut && abs(rap) > fConfigDileptonRapCutAbs) + if (fConfigUseRapcut && std::abs(rap) > fConfigDileptonRapCutAbs) continue; VarManager::FillTrack(dilepton, fValuesDilepton); @@ -3660,7 +3660,7 @@ struct AnalysisDileptonTrack { // for the energy correlator analysis std::vector fTransRange = fConfigTransRange; - VarManager::FillEnergyCorrelator(dilepton, track, fValuesHadron, fTransRange[0], fTransRange[1], fConfigApplyMassEC, fMassBkg->GetRandom()); + VarManager::FillEnergyCorrelatorTriple(lepton1, lepton2, track, fValuesHadron, fTransRange[0], fTransRange[1], fConfigApplyMassEC, fMassBkg->GetRandom()); // table to be written out for ML analysis BmesonsTable(event.runNumber(), event.globalIndex(), event.timestamp(), fValuesHadron[VarManager::kPairMass], dilepton.mass(), fValuesHadron[VarManager::kDeltaMass], fValuesHadron[VarManager::kPairPt], fValuesHadron[VarManager::kPairEta], fValuesHadron[VarManager::kPairPhi], fValuesHadron[VarManager::kPairRap], @@ -3817,7 +3817,7 @@ struct AnalysisDileptonTrack { void processBarrelMixedEvent(soa::Filtered& events, soa::Filtered> const& assocs, - MyBarrelTracksWithCov const&, soa::Filtered const& dileptons) + MyBarrelTracksWithCov const& tracks, soa::Filtered const& dileptons) { if (events.size() == 0) { return; @@ -3853,10 +3853,16 @@ struct AnalysisDileptonTrack { // loop over dileptons for (auto dilepton : evDileptons) { - + // get full track info of tracks based on the index + auto lepton1 = tracks.rawIteratorAt(dilepton.index0Id()); + auto lepton2 = tracks.rawIteratorAt(dilepton.index1Id()); + // Check that the dilepton has zero charge + if (dilepton.sign() != 0) { + continue; + } // dilepton rap cut float rap = dilepton.rap(); - if (fConfigUseRapcut && abs(rap) > fConfigDileptonRapCutAbs) + if (fConfigUseRapcut && std::abs(rap) > fConfigDileptonRapCutAbs) continue; // compute dilepton - track quantities @@ -3864,7 +3870,7 @@ struct AnalysisDileptonTrack { // for the energy correlator analysis std::vector fTransRange = fConfigTransRange; - VarManager::FillEnergyCorrelator(dilepton, track, VarManager::fgValues, fTransRange[0], fTransRange[1], fConfigApplyMassEC, fMassBkg->GetRandom()); + VarManager::FillEnergyCorrelatorTriple(lepton1, lepton2, track, fValuesHadron, fTransRange[0], fTransRange[1], fConfigApplyMassEC, fMassBkg->GetRandom()); // loop over dilepton leg cuts and track cuts and fill histograms separately for each combination for (int icut = 0; icut < fNCuts; icut++) { From b09ee211b6f8f7cac3eef6c6e52406bbe4450560 Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Thu, 12 Mar 2026 15:39:10 +0800 Subject: [PATCH 05/19] Add files via upload --- PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx | 30 ++++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx index 9f54bbe1980..4e09ebef26f 100644 --- a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx +++ b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx @@ -131,6 +131,7 @@ struct AnalysisEnergyCorrelator { Configurable fConfigMCGenSignalsJSON{"cfgMCGenDileptonHadronSignalsJSON", "", "Comma separated list of MC signals (generated) via JSON"}; Configurable fConfigMCGenHadronEtaAbs{"cfgMCGenHadronEtaAbs", 0.9f, "eta abs range for the hadron"}; Configurable fConfigMCGenHadronPtMin{"cfgMCGenHadronPtMin", 0.1f, "minimum pt for the hadron"}; + Configurable fConfigContainlepton{"cfgContainlepton", false, "If true, require the hadron to contain the lepton in its decay tree for the energy correlator study"}; } fConfigDileptonHadronOptions; // Histogram configurables @@ -397,9 +398,11 @@ struct AnalysisEnergyCorrelator { if (isMCGen_energycorrelators) { DefineHistograms(fHistMan, Form("MCTruthGenSel_%s", sig->GetName()), ""); DefineHistograms(fHistMan, Form("MCTruthEenergyCorrelators_%s", sig->GetName()), ""); + DefineHistograms(fHistMan, Form("MCTruthEenergyCorrelators_Pion_%s", sig->GetName()), ""); } if (isMCGen_energycorrelatorsME) { DefineHistograms(fHistMan, Form("MCTruthEenergyCorrelatorsME_%s", sig->GetName()), ""); + DefineHistograms(fHistMan, Form("MCTruthEenergyCorrelatorsME_Pion_%s", sig->GetName()), ""); } } } @@ -786,7 +789,7 @@ struct AnalysisEnergyCorrelator { } PresliceUnsorted perReducedMcEvent = aod::mcparticle::mcCollisionId; - template + template void runEnergyCorrelators(TEvent const& event1, TEvent const& event2, McParticles const& mcTracks) { auto groupedMCTracks1 = mcTracks.sliceBy(perReducedMcEvent, event1.mcCollisionId()); @@ -801,7 +804,7 @@ struct AnalysisEnergyCorrelator { continue; } VarManager::FillTrackMC(groupedMCTracks1, t1_raw); - if (!MixedEvent) { + if (!MixedEvent && !HadronMass) { fHistMan->FillHistClass(Form("MCTruthGenSel_%s", sig->GetName()), VarManager::fgValues); } } @@ -826,7 +829,10 @@ struct AnalysisEnergyCorrelator { continue; } } - if (std::abs(t2_raw.pdgCode()) != PDG_t::kPiPlus && std::abs(t2_raw.pdgCode()) != PDG_t::kKPlus && std::abs(t2_raw.pdgCode()) != PDG_t::kProton && std::abs(t2_raw.pdgCode()) != PDG_t::kElectron && std::abs(t2_raw.pdgCode()) != PDG_t::kMuonMinus) { + if (fConfigDileptonHadronOptions.fConfigContainlepton && std::abs(t2_raw.pdgCode()) != PDG_t::kPiPlus && std::abs(t2_raw.pdgCode()) != PDG_t::kKPlus && std::abs(t2_raw.pdgCode()) != PDG_t::kProton && std::abs(t2_raw.pdgCode()) != PDG_t::kElectron && std::abs(t2_raw.pdgCode()) != PDG_t::kMuonMinus) { + continue; + } + if (!fConfigDileptonHadronOptions.fConfigContainlepton && std::abs(t2_raw.pdgCode()) != PDG_t::kPiPlus && std::abs(t2_raw.pdgCode()) != PDG_t::kKPlus && std::abs(t2_raw.pdgCode()) != PDG_t::kProton) { continue; } if (t2_raw.pt() < fConfigDileptonHadronOptions.fConfigMCGenHadronPtMin.value || std::abs(t2_raw.eta()) > fConfigDileptonHadronOptions.fConfigMCGenHadronEtaAbs.value) { @@ -836,12 +842,18 @@ struct AnalysisEnergyCorrelator { VarManager::FillEnergyCorrelatorsMC(t1_raw, t2_raw, VarManager::fgValues, fTransRange[0], fTransRange[1]); for (auto& sig : fGenMCSignals) { if (sig->CheckSignal(true, t1_raw)) { - if (!MixedEvent) { + if (!MixedEvent && !HadronMass) { fHistMan->FillHistClass(Form("MCTruthEenergyCorrelators_%s", sig->GetName()), VarManager::fgValues); } - if (MixedEvent) { + if (MixedEvent && !HadronMass) { fHistMan->FillHistClass(Form("MCTruthEenergyCorrelatorsME_%s", sig->GetName()), VarManager::fgValues); } + if (!MixedEvent && HadronMass) { + fHistMan->FillHistClass(Form("MCTruthEenergyCorrelators_Pion_%s", sig->GetName()), VarManager::fgValues); + } + if (MixedEvent && HadronMass) { + fHistMan->FillHistClass(Form("MCTruthEenergyCorrelatorsME_Pion_%s", sig->GetName()), VarManager::fgValues); + } } } } @@ -870,7 +882,7 @@ struct AnalysisEnergyCorrelator { if (fSavelessevents[0] > 1 && event.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { continue; } - runEnergyCorrelators(event, event, mcTracks); + runEnergyCorrelators(event, event, mcTracks); } } @@ -900,7 +912,7 @@ struct AnalysisEnergyCorrelator { if (fSavelessevents[0] > 1 && event1.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { continue; } - runEnergyCorrelators(event1, event2, mcTracks); + runEnergyCorrelators(event1, event2, mcTracks); } } @@ -926,7 +938,7 @@ struct AnalysisEnergyCorrelator { if (fSavelessevents[0] > 1 && event.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { continue; } - runEnergyCorrelators(event, event, mcTracks); + runEnergyCorrelators(event, event, mcTracks); } } @@ -956,7 +968,7 @@ struct AnalysisEnergyCorrelator { if (fSavelessevents[0] > 1 && event1.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { continue; } - runEnergyCorrelators(event1, event2, mcTracks); + runEnergyCorrelators(event1, event2, mcTracks); } } From d3696a1b4224d08cd7a5ec8126ac32e2ac4bcfb9 Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Thu, 12 Mar 2026 15:43:47 +0800 Subject: [PATCH 06/19] Add files via upload --- PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx index 4e09ebef26f..b70af0b51d4 100644 --- a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx +++ b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx @@ -789,7 +789,7 @@ struct AnalysisEnergyCorrelator { } PresliceUnsorted perReducedMcEvent = aod::mcparticle::mcCollisionId; - template + template void runEnergyCorrelators(TEvent const& event1, TEvent const& event2, McParticles const& mcTracks) { auto groupedMCTracks1 = mcTracks.sliceBy(perReducedMcEvent, event1.mcCollisionId()); @@ -804,7 +804,7 @@ struct AnalysisEnergyCorrelator { continue; } VarManager::FillTrackMC(groupedMCTracks1, t1_raw); - if (!MixedEvent && !HadronMass) { + if (!MixedEvent && !PionMass) { fHistMan->FillHistClass(Form("MCTruthGenSel_%s", sig->GetName()), VarManager::fgValues); } } @@ -842,16 +842,16 @@ struct AnalysisEnergyCorrelator { VarManager::FillEnergyCorrelatorsMC(t1_raw, t2_raw, VarManager::fgValues, fTransRange[0], fTransRange[1]); for (auto& sig : fGenMCSignals) { if (sig->CheckSignal(true, t1_raw)) { - if (!MixedEvent && !HadronMass) { + if (!MixedEvent && !PionMass) { fHistMan->FillHistClass(Form("MCTruthEenergyCorrelators_%s", sig->GetName()), VarManager::fgValues); } - if (MixedEvent && !HadronMass) { + if (MixedEvent && !PionMass) { fHistMan->FillHistClass(Form("MCTruthEenergyCorrelatorsME_%s", sig->GetName()), VarManager::fgValues); } - if (!MixedEvent && HadronMass) { + if (!MixedEvent && PionMass) { fHistMan->FillHistClass(Form("MCTruthEenergyCorrelators_Pion_%s", sig->GetName()), VarManager::fgValues); } - if (MixedEvent && HadronMass) { + if (MixedEvent && PionMass) { fHistMan->FillHistClass(Form("MCTruthEenergyCorrelatorsME_Pion_%s", sig->GetName()), VarManager::fgValues); } } From 3322f921c2b15f200bf83aa12910954f7cc6cb43 Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Thu, 19 Mar 2026 16:40:52 +0800 Subject: [PATCH 07/19] Add files via upload --- PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx index b70af0b51d4..54397ab6560 100644 --- a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx +++ b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx @@ -223,6 +223,7 @@ struct AnalysisEnergyCorrelator { for (auto& t : addTrackCuts) { fTrackCuts.push_back(reinterpret_cast(t)); fTrackCutNames.push_back(t->GetName()); + trackCutStr += Form(",%s", t->GetName()); } } @@ -395,6 +396,7 @@ struct AnalysisEnergyCorrelator { for (auto& sig : fGenMCSignals) { if (sig->GetNProngs() == 1) { + LOG(info) << "Signal: " << sig->GetName() << ", nProngs: " << sig->GetNProngs(); if (isMCGen_energycorrelators) { DefineHistograms(fHistMan, Form("MCTruthGenSel_%s", sig->GetName()), ""); DefineHistograms(fHistMan, Form("MCTruthEenergyCorrelators_%s", sig->GetName()), ""); @@ -797,13 +799,13 @@ struct AnalysisEnergyCorrelator { groupedMCTracks1.bindInternalIndicesTo(&mcTracks); groupedMCTracks2.bindInternalIndicesTo(&mcTracks); for (auto& t1 : groupedMCTracks1) { - auto t1_raw = groupedMCTracks1.rawIteratorAt(t1.globalIndex()); + auto t1_raw = mcTracks.rawIteratorAt(t1.globalIndex()); for (auto& sig : fGenMCSignals) { if (sig->CheckSignal(true, t1_raw)) { if (t1.mcCollisionId() != event1.mcCollisionId()) { // check that the mc track belongs to the same mc collision as the reconstructed event continue; } - VarManager::FillTrackMC(groupedMCTracks1, t1_raw); + VarManager::FillTrackMC(mcTracks, t1_raw); if (!MixedEvent && !PionMass) { fHistMan->FillHistClass(Form("MCTruthGenSel_%s", sig->GetName()), VarManager::fgValues); } From 6eed2ddd6f36720bab654981c5bfd76e2a27874e Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Thu, 19 Mar 2026 16:42:27 +0800 Subject: [PATCH 08/19] Add files via upload --- PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx index 54397ab6560..b91e9ef5593 100644 --- a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx +++ b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx @@ -396,7 +396,6 @@ struct AnalysisEnergyCorrelator { for (auto& sig : fGenMCSignals) { if (sig->GetNProngs() == 1) { - LOG(info) << "Signal: " << sig->GetName() << ", nProngs: " << sig->GetNProngs(); if (isMCGen_energycorrelators) { DefineHistograms(fHistMan, Form("MCTruthGenSel_%s", sig->GetName()), ""); DefineHistograms(fHistMan, Form("MCTruthEenergyCorrelators_%s", sig->GetName()), ""); From 14403e999a22b5e2c6d97b723093e7cc012f2bd2 Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Thu, 19 Mar 2026 19:29:54 +0800 Subject: [PATCH 09/19] Add files via upload --- PWGDQ/Core/VarManager.h | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 6402590ef5a..8af94063bbe 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -1364,7 +1364,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 @@ -5858,7 +5858,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 @@ -5870,6 +5870,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()); @@ -5885,7 +5890,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); From 98b8946a0f4cb84a41258c769c287b126220841a Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Fri, 20 Mar 2026 18:20:18 +0800 Subject: [PATCH 10/19] Add files via upload --- PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx index b91e9ef5593..c54392b9bb9 100644 --- a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx +++ b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx @@ -296,6 +296,7 @@ struct AnalysisEnergyCorrelator { for (auto& t : addHadronCuts) { fHadronCuts.push_back(reinterpret_cast(t)); fHadronCutNames.push_back(t->GetName()); + hadronCutStr += Form(",%s", t->GetName()); } } @@ -441,6 +442,7 @@ struct AnalysisEnergyCorrelator { auto lepton2MC = track2.mcParticle(); uint32_t mcDecision = 0; int isig = 0; + for (auto sig = fRecMCTripleSignals.begin(); sig != fRecMCTripleSignals.end(); sig++, isig++) { if ((*sig)->CheckSignal(true, lepton1MC, lepton2MC, hadronMC)) { mcDecision |= (static_cast(1) << isig); @@ -451,7 +453,7 @@ struct AnalysisEnergyCorrelator { // Fill dilepton-hadron variables std::vector fTransRange = fConfigDileptonHadronOptions.fConfigTransRange; VarManager::FillEnergyCorrelatorTriple(track1, track2, hadron, VarManager::fgValues, fTransRange[0], fTransRange[1], fConfigDileptonHadronOptions.fConfigApplyMassEC.value); - VarManager::FillEnergyCorrelatorsUnfoldingTriple(track1, track2, hadron, motherParticle, hadronMC, VarManager::fgValues); + VarManager::FillEnergyCorrelatorsUnfoldingTriple(track1, track2, hadron, motherParticle, hadronMC, VarManager::fgValues, fConfigDileptonHadronOptions.fConfigApplyMassEC.value); int iHadronCut = 0; for (auto hCut = fHadronCuts.begin(); hCut != fHadronCuts.end(); hCut++, iHadronCut++) { From af7ba2e4cd8a692196c00bd9bd5ef530e9f8420c Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Fri, 20 Mar 2026 18:21:54 +0800 Subject: [PATCH 11/19] Add files via upload --- PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx index c54392b9bb9..d506ed3e4f8 100644 --- a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx +++ b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx @@ -442,13 +442,12 @@ struct AnalysisEnergyCorrelator { auto lepton2MC = track2.mcParticle(); uint32_t mcDecision = 0; int isig = 0; - for (auto sig = fRecMCTripleSignals.begin(); sig != fRecMCTripleSignals.end(); sig++, isig++) { if ((*sig)->CheckSignal(true, lepton1MC, lepton2MC, hadronMC)) { mcDecision |= (static_cast(1) << isig); } } - + auto motherParticle = lepton1MC.template mothers_first_as(); // Fill dilepton-hadron variables std::vector fTransRange = fConfigDileptonHadronOptions.fConfigTransRange; From 03aa1ef0564f1ceea1644b44eeafd66c4785128d Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Fri, 20 Mar 2026 18:23:01 +0800 Subject: [PATCH 12/19] Add files via upload --- PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx index d506ed3e4f8..50eef8685c5 100644 --- a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx +++ b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx @@ -447,7 +447,6 @@ struct AnalysisEnergyCorrelator { mcDecision |= (static_cast(1) << isig); } } - auto motherParticle = lepton1MC.template mothers_first_as(); // Fill dilepton-hadron variables std::vector fTransRange = fConfigDileptonHadronOptions.fConfigTransRange; From e0175c3571ab48a620e6025261a8118f50bafdd0 Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Mon, 23 Mar 2026 14:08:59 +0800 Subject: [PATCH 13/19] Add files via upload --- PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx index 50eef8685c5..eae943e6124 100644 --- a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx +++ b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx @@ -132,6 +132,7 @@ struct AnalysisEnergyCorrelator { Configurable fConfigMCGenHadronEtaAbs{"cfgMCGenHadronEtaAbs", 0.9f, "eta abs range for the hadron"}; Configurable fConfigMCGenHadronPtMin{"cfgMCGenHadronPtMin", 0.1f, "minimum pt for the hadron"}; Configurable fConfigContainlepton{"cfgContainlepton", false, "If true, require the hadron to contain the lepton in its decay tree for the energy correlator study"}; + Configurable fConfigUsePionMass{"cfgUsePionMass", false, "If true, use pion mass for the hadron in the energy correlator study"}; } fConfigDileptonHadronOptions; // Histogram configurables @@ -451,7 +452,11 @@ struct AnalysisEnergyCorrelator { // Fill dilepton-hadron variables std::vector fTransRange = fConfigDileptonHadronOptions.fConfigTransRange; VarManager::FillEnergyCorrelatorTriple(track1, track2, hadron, VarManager::fgValues, fTransRange[0], fTransRange[1], fConfigDileptonHadronOptions.fConfigApplyMassEC.value); - VarManager::FillEnergyCorrelatorsUnfoldingTriple(track1, track2, hadron, motherParticle, hadronMC, VarManager::fgValues, fConfigDileptonHadronOptions.fConfigApplyMassEC.value); + if (fConfigDileptonHadronOptions.fConfigUsePionMass.value) { + VarManager::FillEnergyCorrelatorsUnfoldingTriple(track1, track2, hadron, motherParticle, hadronMC, VarManager::fgValues, fConfigDileptonHadronOptions.fConfigApplyMassEC.value); + } else { + VarManager::FillEnergyCorrelatorsUnfoldingTriple(track1, track2, hadron, motherParticle, hadronMC, VarManager::fgValues, fConfigDileptonHadronOptions.fConfigApplyMassEC.value); + } int iHadronCut = 0; for (auto hCut = fHadronCuts.begin(); hCut != fHadronCuts.end(); hCut++, iHadronCut++) { From 63684a996f53a4b3322036d46c175cd952e7a6ca Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Fri, 3 Apr 2026 16:49:43 +0800 Subject: [PATCH 14/19] Add files via upload --- PWGDQ/Core/VarManager.cxx | 2 ++ PWGDQ/Core/VarManager.h | 37 ++++++++++++++++++++----------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/PWGDQ/Core/VarManager.cxx b/PWGDQ/Core/VarManager.cxx index bbe9f08f28b..d39cdc34a0f 100644 --- a/PWGDQ/Core/VarManager.cxx +++ b/PWGDQ/Core/VarManager.cxx @@ -2239,6 +2239,7 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kMCPdgCode"] = kMCPdgCode; fgVarNamesMap["kMCCosTheta"] = kMCCosTheta; fgVarNamesMap["kMCHadronPdgCode"] = kMCHadronPdgCode; + fgVarNamesMap["kMCAccweight"] = kMCAccweight; fgVarNamesMap["kMCCosChi"] = kMCCosChi; fgVarNamesMap["kMCHadronPt"] = kMCHadronPt; fgVarNamesMap["kMCWeight_before"] = kMCWeight_before; @@ -2481,6 +2482,7 @@ void VarManager::SetDefaultVarNames() fgVarNamesMap["kDeltaPhiSym"] = kDeltaPhiSym; fgVarNamesMap["kCosTheta"] = kCosTheta; fgVarNamesMap["kCosChi"] = kCosChi; + fgVarNamesMap["kWeight"] = kWeight; fgVarNamesMap["kECWeight"] = kECWeight; fgVarNamesMap["kEWeight_before"] = kEWeight_before; fgVarNamesMap["kPtDau"] = kPtDau; diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index 594317a5cd4..e043775fe44 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -675,6 +675,7 @@ class VarManager : public TObject kMCHadronPdgCode, kMCCosTheta, kMCJpsiPt, + kMCAccweight, kMCCosChi, kMCdeltaphi, kMCdeltaeta, @@ -930,6 +931,7 @@ class VarManager : public TObject kCosChi, kEtaDau, kPhiDau, + kWeight, kECWeight, kPtDau, kCosTheta, @@ -1335,7 +1337,7 @@ class VarManager : public TObject template static void FillTrackMC(const U& mcStack, T const& track, float* values = nullptr); template - static void FillEnergyCorrelatorsMC(T const& track, T1 const& t1, float* values = nullptr, float Translow = 1. / 3, float Transhigh = 2. / 3); + static void FillEnergyCorrelatorsMC(T const& track, T1 const& t1, float* values = nullptr, float Translow = 1. / 3, float Transhigh = 2. / 3, float Accweight = 1.0f); template static void FillPairPropagateMuon(T1 const& muon1, T2 const& muon2, const C& collision, float* values = nullptr); template @@ -1369,9 +1371,9 @@ class VarManager : public TObject template static void FillDileptonHadron(T1 const& dilepton, T2 const& hadron, float* values = nullptr, float hadronMass = 0.0f); 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); + static void FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, float* values = nullptr, float weight = 1.0, 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, bool applyFitMass = false, float Effweight_rec = 1.f, float Accweight_gen = 1.f); template static void FillDileptonPhoton(T1 const& dilepton, T2 const& photon, float* values = nullptr); template @@ -3302,7 +3304,7 @@ void VarManager::FillTrackCollisionMC(T1 const& track, T2 const& MotherTrack, C } template -void VarManager::FillEnergyCorrelatorsMC(T const& track, T1 const& t1, float* values, float Translow, float Transhigh) +void VarManager::FillEnergyCorrelatorsMC(T const& track, T1 const& t1, float* values, float Translow, float Transhigh, float Accweight) { // energy correlators float MassHadron; @@ -3319,8 +3321,9 @@ void VarManager::FillEnergyCorrelatorsMC(T const& track, T1 const& t1, float* va float E_boost = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2); float CosChi = LorentzTransformJpsihadroncosChi("coschi", v1, v2); float CosTheta = LorentzTransformJpsihadroncosChi("costheta", v1, v2); + values[kMCAccweight] = Accweight; values[kMCCosChi] = CosChi; - values[kMCWeight_before] = t1.pt() / o2::constants::physics::MassJPsi; + values[kMCWeight_before] = t1.pt() / o2::constants::physics::MassJPsi * Accweight; values[kMCCosTheta] = CosTheta; values[kMCdeltaphi] = deltaphi; values[kMCdeltaeta] = deltaeta; @@ -3350,15 +3353,15 @@ void VarManager::FillEnergyCorrelatorsMC(T const& track, T1 const& t1, float* va ROOT::Math::PtEtaPhiMVector v2_randomPhi_trans(v2.pt(), v2.eta(), randomPhi_trans, MassHadron); values[kMCCosChi_randomPhi_trans] = LorentzTransformJpsihadroncosChi("coschi", v1, v2_randomPhi_trans); - values[kMCWeight_randomPhi_trans] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_trans) / v1.M(); + values[kMCWeight_randomPhi_trans] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_trans) / v1.M() * Accweight; ROOT::Math::PtEtaPhiMVector v2_randomPhi_toward(v2.pt(), v2.eta(), randomPhi_toward, MassHadron); values[kMCCosChi_randomPhi_toward] = LorentzTransformJpsihadroncosChi("coschi", v1, v2_randomPhi_toward); - values[kMCWeight_randomPhi_toward] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_toward) / v1.M(); + values[kMCWeight_randomPhi_toward] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_toward) / v1.M() * Accweight; ROOT::Math::PtEtaPhiMVector v2_randomPhi_away(v2.pt(), v2.eta(), randomPhi_away, MassHadron); values[kMCCosChi_randomPhi_away] = LorentzTransformJpsihadroncosChi("coschi", v1, v2_randomPhi_away); - values[kMCWeight_randomPhi_away] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_away) / v1.M(); + values[kMCWeight_randomPhi_away] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_away) / v1.M() * Accweight; values[kMCdeltaphi_randomPhi_trans] = RecoDecay::constrainAngle(v1.phi() - randomPhi_trans, -o2::constants::math::PIHalf); values[kMCdeltaphi_randomPhi_toward] = RecoDecay::constrainAngle(v1.phi() - randomPhi_toward, -o2::constants::math::PIHalf); @@ -5818,9 +5821,10 @@ void VarManager::FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2 ROOT::Math::PtEtaPhiMVector v2(hadron.pt(), hadron.eta(), hadron.phi(), o2::constants::physics::MassPionCharged); values[kCosChi] = LorentzTransformJpsihadroncosChi("coschi", v1, v2); float E_boost = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2); - values[kECWeight] = E_boost / v1.M(); + values[kWeight] = weight; + values[kECWeight] = E_boost / v1.M() * weight; values[kCosTheta] = LorentzTransformJpsihadroncosChi("costheta", v1, v2); - values[kEWeight_before] = v2.Pt() / v1.M(); + values[kEWeight_before] = v2.Pt() / v1.M() * weight; values[kPtDau] = v2.pt(); values[kEtaDau] = v2.eta(); values[kPhiDau] = RecoDecay::constrainAngle(v2.phi(), -o2::constants::math::PIHalf); @@ -5847,15 +5851,14 @@ void VarManager::FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2 ROOT::Math::PtEtaPhiMVector v2_randomPhi_trans(v2.pt(), v2.eta(), randomPhi_trans, o2::constants::physics::MassPionCharged); values[kCosChi_randomPhi_trans] = LorentzTransformJpsihadroncosChi("coschi", v1, v2_randomPhi_trans); - values[kWeight_randomPhi_trans] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_trans) / v1.M(); + values[kWeight_randomPhi_trans] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_trans) / v1.M() * weight; ROOT::Math::PtEtaPhiMVector v2_randomPhi_toward(v2.pt(), v2.eta(), randomPhi_toward, o2::constants::physics::MassPionCharged); values[kCosChi_randomPhi_toward] = LorentzTransformJpsihadroncosChi("coschi", v1, v2_randomPhi_toward); - values[kWeight_randomPhi_toward] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_toward) / v1.M(); - + values[kWeight_randomPhi_toward] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_toward) / v1.M() * weight; ROOT::Math::PtEtaPhiMVector v2_randomPhi_away(v2.pt(), v2.eta(), randomPhi_away, o2::constants::physics::MassPionCharged); values[kCosChi_randomPhi_away] = LorentzTransformJpsihadroncosChi("coschi", v1, v2_randomPhi_away); - values[kWeight_randomPhi_away] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_away) / v1.M(); + values[kWeight_randomPhi_away] = LorentzTransformJpsihadroncosChi("weight_boost", v1, v2_randomPhi_away) / v1.M() * weight; values[kdeltaphi_randomPhi_trans] = RecoDecay::constrainAngle(v1.phi() - randomPhi_trans, -o2::constants::math::PIHalf); values[kdeltaphi_randomPhi_toward] = RecoDecay::constrainAngle(v1.phi() - randomPhi_toward, -o2::constants::math::PIHalf); @@ -5865,7 +5868,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, bool applyFitMass, float Effweight_rec, float Accweight_gen) { if (fgUsedVars[kMCCosChi_gen] || fgUsedVars[kMCWeight_gen] || fgUsedVars[kMCdeltaeta_gen] || fgUsedVars[kMCCosChi_rec] || fgUsedVars[kMCWeight_rec] || fgUsedVars[kMCdeltaeta_rec]) { // energy correlators @@ -5894,14 +5897,14 @@ void VarManager::FillEnergyCorrelatorsUnfoldingTriple(T1 const& lepton1, T2 cons float E_boost_gen = LorentzTransformJpsihadroncosChi("weight_boost", v1_gen, v2_gen); float CosChi_gen = LorentzTransformJpsihadroncosChi("coschi", v1_gen, v2_gen); values[kMCCosChi_gen] = CosChi_gen; - values[kMCWeight_gen] = E_boost_gen / o2::constants::physics::MassJPsi; + values[kMCWeight_gen] = E_boost_gen / o2::constants::physics::MassJPsi * Accweight_gen; values[kMCdeltaeta_gen] = track.eta() - t1.eta(); 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); - values[kMCWeight_rec] = E_boost_rec / v1_rec.M(); + values[kMCWeight_rec] = E_boost_rec / v1_rec.M() * Effweight_rec; values[kMCdeltaeta_rec] = dilepton.eta() - hadron.eta(); } } From ba1cba1d2235ac1017e1403a38397b965d5df93e Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Fri, 3 Apr 2026 16:50:11 +0800 Subject: [PATCH 15/19] Add files via upload --- PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx | 120 ++++++++++++++++------ 1 file changed, 91 insertions(+), 29 deletions(-) diff --git a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx index 8815bfa32d9..feded7f060f 100644 --- a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx +++ b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx @@ -20,44 +20,50 @@ #include "PWGDQ/Core/MCSignal.h" #include "PWGDQ/Core/MCSignalLibrary.h" #include "PWGDQ/Core/MixingHandler.h" +#include "PWGDQ/Core/MixingLibrary.h" #include "PWGDQ/Core/VarManager.h" +#include "PWGDQ/DataModel/ReducedInfoTables.h" +#include "Common/Core/PID/PIDTOFParamService.h" +#include "Common/Core/TableHelper.h" #include "Common/DataModel/CollisionAssociationTables.h" #include "Common/DataModel/EventSelection.h" #include "Common/DataModel/McCollisionExtra.h" #include "Common/DataModel/Multiplicity.h" -#include "Common/DataModel/PIDResponseTOF.h" -#include "Common/DataModel/PIDResponseTPC.h" #include "Common/DataModel/TrackSelectionTables.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - +#include "CCDB/BasicCCDBManager.h" +#include "DataFormatsParameters/GRPMagField.h" +#include "DataFormatsParameters/GRPObject.h" +#include "DetectorsBase/GeometryManager.h" +#include "DetectorsBase/Propagator.h" +#include "Field/MagneticField.h" +#include "Framework/ASoAHelpers.h" +#include "Framework/AnalysisDataModel.h" +#include "Framework/AnalysisHelpers.h" +#include "Framework/AnalysisTask.h" +#include "Framework/runDataProcessing.h" + +#include "TGeoGlobalMagField.h" +#include +#include +#include #include +#include +#include #include #include -#include - -#include -#include -#include -#include -#include +#include +#include #include #include #include #include #include +using std::cout; +using std::endl; using std::string; using namespace o2; @@ -128,6 +134,8 @@ struct AnalysisEnergyCorrelator { Configurable fConfigMCGenHadronPtMin{"cfgMCGenHadronPtMin", 0.1f, "minimum pt for the hadron"}; Configurable fConfigContainlepton{"cfgContainlepton", false, "If true, require the hadron to contain the lepton in its decay tree for the energy correlator study"}; Configurable fConfigUsePionMass{"cfgUsePionMass", false, "If true, use pion mass for the hadron in the energy correlator study"}; + Configurable fConfigApplyEfficiency{"cfgApplyEfficiency", false, "If true, apply efficiency correction for the energy correlator study"}; + Configurable fConfigApplyEfficiencyME{"cfgApplyEfficiencyME", false, "If true, apply efficiency correction for the energy correlator study"}; } fConfigDileptonHadronOptions; // Histogram configurables @@ -136,7 +144,7 @@ struct AnalysisEnergyCorrelator { // CCDB configurables Configurable fConfigCcdbUrl{"ccdb-url", "http://alice-ccdb.cern.ch", "CCDB url"}; Configurable fConfigNoLaterThan{"ccdb-no-later-than", std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(), "CCDB timestamp"}; - + Configurable fConfigAccCCDBPath{"AccCCDBPath", "GLO/Config/GeometryAligned", "Path of the efficiency corrections"}; // Member variables HistogramManager* fHistMan = nullptr; MixingHandler* fMixHandler = nullptr; @@ -166,6 +174,12 @@ struct AnalysisEnergyCorrelator { using MixingBinning = ColumnBinningPolicy; std::unique_ptr fMixingBinning; + TH2F* hAcceptance_rec; + TH2F* hAcceptance_gen; + TH1F* hEfficiency_dilepton; + TH1F* hEfficiency_hadron; + TH1F* hMasswindow; + void init(o2::framework::InitContext& context) { std::vector zBins = fConfigEventOptions.fConfigZBins.value; @@ -416,14 +430,25 @@ struct AnalysisEnergyCorrelator { fCCDB->setCreatedNotAfter(fConfigNoLaterThan.value); } + void initAccFromCCDB(uint64_t timestamp) + { + TList* listAccs = fCCDB->getForTimeStamp(fConfigAccCCDBPath, timestamp); + if (!listAccs) { + LOG(fatal) << "Problem getting TList object with efficiencies!"; + } + hEfficiency_dilepton = static_cast(listAccs->FindObject("hEfficiency_dilepton")); + hEfficiency_hadron = static_cast(listAccs->FindObject("hEfficiency_hadron")); + hAcceptance_rec = static_cast(listAccs->FindObject("hAcceptance_rec")); + hAcceptance_gen = static_cast(listAccs->FindObject("hAcceptance_gen")); + hMasswindow = static_cast(listAccs->FindObject("hMasswindow")); + if (!hAcceptance_rec || !hAcceptance_gen || !hEfficiency_dilepton || !hEfficiency_hadron || !hMasswindow) { + LOG(fatal) << "Problem getting histograms from the TList object with efficiencies!"; + } + } template void runDileptonHadron(TTrack1 const& track1, TTrack2 const& track2, int iEleCut, THadron const& hadron, TEvent const& event, aod::McParticles const& /*mcParticles*/) { - VarManager::ResetValues(0, VarManager::kNVars); // reset variables before filling - VarManager::FillEvent(event); - VarManager::FillTrack(hadron); - VarManager::FillTrackCollision(hadron, event); // Check that hadron is not one of the dilepton legs if (hadron.globalIndex() == track1.globalIndex() || hadron.globalIndex() == track2.globalIndex()) { @@ -444,13 +469,39 @@ struct AnalysisEnergyCorrelator { } } auto motherParticle = lepton1MC.template mothers_first_as(); + + float Effweight_rec = 1.0f; + float Accweight_gen = 1.0f; + if (fConfigDileptonHadronOptions.fConfigApplyEfficiency) { + float dilepton_eta = VarManager::fgValues[VarManager::kEta]; + float dilepton_phi = VarManager::fgValues[VarManager::kPhi]; + float hadron_eta = hadron.eta(); + float hadron_phi = hadron.phi(); + float deltaphi = RecoDecay::constrainAngle(dilepton_phi - hadron_phi, -0.5 * o2::constants::math::PI); + Effweight_rec = hAcceptance_rec->Interpolate(dilepton_eta - hadron_eta, deltaphi); + Accweight_gen = hAcceptance_gen->Interpolate(dilepton_eta - hadron_eta, deltaphi); + float Effdilepton = hEfficiency_dilepton->Interpolate(VarManager::fgValues[VarManager::kPt]); + float Masswindow = hMasswindow->Interpolate(VarManager::fgValues[VarManager::kPt]); + float Effhadron = hEfficiency_hadron->Interpolate(hadron.pt()); + if (fConfigDileptonHadronOptions.fConfigApplyEfficiencyME) { + Effweight_rec = Effdilepton * Effhadron * Masswindow; // for the moment, apply the efficiency correction also for the mixed event pairs, but this can be changed in case we want to apply it only for the same event pairs + } else { + Effweight_rec = Effweight_rec * Effdilepton * Effhadron * Masswindow; // apply acceptance and efficiency correction for the real pairs + } + } + + VarManager::ResetValues(0, VarManager::kNVars); // reset variables before filling + VarManager::FillEvent(event); + VarManager::FillTrack(hadron); + VarManager::FillTrackCollision(hadron, event); + // Fill dilepton-hadron variables std::vector fTransRange = fConfigDileptonHadronOptions.fConfigTransRange; - VarManager::FillEnergyCorrelatorTriple(track1, track2, hadron, VarManager::fgValues, fTransRange[0], fTransRange[1], fConfigDileptonHadronOptions.fConfigApplyMassEC.value); + VarManager::FillEnergyCorrelatorTriple(track1, track2, hadron, VarManager::fgValues, 1. / Effweight_rec, fTransRange[0], fTransRange[1], fConfigDileptonHadronOptions.fConfigApplyMassEC.value); if (fConfigDileptonHadronOptions.fConfigUsePionMass.value) { - VarManager::FillEnergyCorrelatorsUnfoldingTriple(track1, track2, hadron, motherParticle, hadronMC, VarManager::fgValues, fConfigDileptonHadronOptions.fConfigApplyMassEC.value); + VarManager::FillEnergyCorrelatorsUnfoldingTriple(track1, track2, hadron, motherParticle, hadronMC, VarManager::fgValues, fConfigDileptonHadronOptions.fConfigApplyMassEC.value, 1. / Effweight_rec, 1. / Accweight_gen); } else { - VarManager::FillEnergyCorrelatorsUnfoldingTriple(track1, track2, hadron, motherParticle, hadronMC, VarManager::fgValues, fConfigDileptonHadronOptions.fConfigApplyMassEC.value); + VarManager::FillEnergyCorrelatorsUnfoldingTriple(track1, track2, hadron, motherParticle, hadronMC, VarManager::fgValues, fConfigDileptonHadronOptions.fConfigApplyMassEC.value, 1. / Effweight_rec, 1. / Accweight_gen); } int iHadronCut = 0; @@ -538,6 +589,7 @@ struct AnalysisEnergyCorrelator { // CCDB initialization if (fCurrentRun != bcs.begin().runNumber()) { fCurrentRun = bcs.begin().runNumber(); + initAccFromCCDB(bcs.begin().timestamp()); } if (fConfigEventOptions.fConfigEventQA) { @@ -797,6 +849,7 @@ struct AnalysisEnergyCorrelator { auto groupedMCTracks2 = mcTracks.sliceBy(perReducedMcEvent, event2.mcCollisionId()); groupedMCTracks1.bindInternalIndicesTo(&mcTracks); groupedMCTracks2.bindInternalIndicesTo(&mcTracks); + for (auto& t1 : groupedMCTracks1) { auto t1_raw = mcTracks.rawIteratorAt(t1.globalIndex()); for (auto& sig : fGenMCSignals) { @@ -839,8 +892,17 @@ struct AnalysisEnergyCorrelator { if (t2_raw.pt() < fConfigDileptonHadronOptions.fConfigMCGenHadronPtMin.value || std::abs(t2_raw.eta()) > fConfigDileptonHadronOptions.fConfigMCGenHadronEtaAbs.value) { continue; } + float acceptance = 1.0f; + if (fConfigDileptonHadronOptions.fConfigApplyEfficiency) { + float dilepton_eta = t1_raw.eta(); + float dilepton_phi = t1_raw.phi(); + float hadron_eta = t2_raw.eta(); + float hadron_phi = t2_raw.phi(); + float deltaphi = RecoDecay::constrainAngle(dilepton_phi - hadron_phi, -0.5 * o2::constants::math::PI); + acceptance = hAcceptance_gen->Interpolate(dilepton_eta - hadron_eta, deltaphi); + } std::vector fTransRange = fConfigDileptonHadronOptions.fConfigTransRange; - VarManager::FillEnergyCorrelatorsMC(t1_raw, t2_raw, VarManager::fgValues, fTransRange[0], fTransRange[1]); + VarManager::FillEnergyCorrelatorsMC(t1_raw, t2_raw, VarManager::fgValues, fTransRange[0], fTransRange[1], 1. / acceptance); for (auto& sig : fGenMCSignals) { if (sig->CheckSignal(true, t1_raw)) { if (!MixedEvent && !PionMass) { From 09bac328a8b83b9dd6e3b4995c837abda8cafc68 Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Fri, 3 Apr 2026 17:01:36 +0800 Subject: [PATCH 16/19] Add files via upload --- PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx index feded7f060f..b719881c029 100644 --- a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx +++ b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx @@ -733,6 +733,7 @@ struct AnalysisEnergyCorrelator { // CCDB initialization if (fCurrentRun != bcs.begin().runNumber()) { fCurrentRun = bcs.begin().runNumber(); + initAccFromCCDB(bcs.begin().timestamp()); } fSelMap.clear(); @@ -849,7 +850,6 @@ struct AnalysisEnergyCorrelator { auto groupedMCTracks2 = mcTracks.sliceBy(perReducedMcEvent, event2.mcCollisionId()); groupedMCTracks1.bindInternalIndicesTo(&mcTracks); groupedMCTracks2.bindInternalIndicesTo(&mcTracks); - for (auto& t1 : groupedMCTracks1) { auto t1_raw = mcTracks.rawIteratorAt(t1.globalIndex()); for (auto& sig : fGenMCSignals) { @@ -924,7 +924,7 @@ struct AnalysisEnergyCorrelator { } void processMCGenEnergyCorrelators(soa::Filtered& events, - McCollisions const& /*mcEvents*/, McParticles const& mcTracks) + McCollisions const& /*mcEvents*/, McParticles const& mcTracks, BCsWithTimestamps const& bcs) { if (events.size() == 0) { LOG(warning) << "No events in this TF, going to the next one ..."; @@ -945,12 +945,13 @@ struct AnalysisEnergyCorrelator { if (fSavelessevents[0] > 1 && event.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { continue; } + initAccFromCCDB(bcs.begin().timestamp()); runEnergyCorrelators(event, event, mcTracks); } } void processMCGenEnergyCorrelatorsME(soa::Filtered& events, - McCollisions const& /*mcEvents*/, McParticles const& mcTracks) + McCollisions const& /*mcEvents*/, McParticles const& mcTracks, BCsWithTimestamps const& bcs) { if (events.size() == 0) { LOG(warning) << "No events in this TF, going to the next one ..."; @@ -975,12 +976,13 @@ struct AnalysisEnergyCorrelator { if (fSavelessevents[0] > 1 && event1.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { continue; } + initAccFromCCDB(bcs.begin().timestamp()); runEnergyCorrelators(event1, event2, mcTracks); } } void processMCGenEnergyCorrelatorsPion(soa::Filtered& events, - McCollisions const& /*mcEvents*/, McParticles const& mcTracks) + McCollisions const& /*mcEvents*/, McParticles const& mcTracks, BCsWithTimestamps const& bcs) { if (events.size() == 0) { LOG(warning) << "No events in this TF, going to the next one ..."; @@ -1001,12 +1003,13 @@ struct AnalysisEnergyCorrelator { if (fSavelessevents[0] > 1 && event.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { continue; } + initAccFromCCDB(bcs.begin().timestamp()); runEnergyCorrelators(event, event, mcTracks); } } void processMCGenEnergyCorrelatorsPionME(soa::Filtered& events, - McCollisions const& /*mcEvents*/, McParticles const& mcTracks) + McCollisions const& /*mcEvents*/, McParticles const& mcTracks, BCsWithTimestamps const& bcs) { if (events.size() == 0) { LOG(warning) << "No events in this TF, going to the next one ..."; @@ -1031,6 +1034,7 @@ struct AnalysisEnergyCorrelator { if (fSavelessevents[0] > 1 && event1.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { continue; } + initAccFromCCDB(bcs.begin().timestamp()); runEnergyCorrelators(event1, event2, mcTracks); } } From 916095345fc5f24f2902f8de6798c26423e1b2e1 Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Fri, 3 Apr 2026 17:09:00 +0800 Subject: [PATCH 17/19] Add files via upload --- PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx index b719881c029..d5a23de3c96 100644 --- a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx +++ b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx @@ -945,7 +945,10 @@ struct AnalysisEnergyCorrelator { if (fSavelessevents[0] > 1 && event.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { continue; } - initAccFromCCDB(bcs.begin().timestamp()); + if (fCurrentRun != bcs.begin().runNumber()) { + fCurrentRun = bcs.begin().runNumber(); + initAccFromCCDB(bcs.begin().timestamp()); + } runEnergyCorrelators(event, event, mcTracks); } } @@ -976,7 +979,10 @@ struct AnalysisEnergyCorrelator { if (fSavelessevents[0] > 1 && event1.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { continue; } - initAccFromCCDB(bcs.begin().timestamp()); + if (fCurrentRun != bcs.begin().runNumber()) { + fCurrentRun = bcs.begin().runNumber(); + initAccFromCCDB(bcs.begin().timestamp()); + } runEnergyCorrelators(event1, event2, mcTracks); } } @@ -1003,7 +1009,10 @@ struct AnalysisEnergyCorrelator { if (fSavelessevents[0] > 1 && event.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { continue; } - initAccFromCCDB(bcs.begin().timestamp()); + if (fCurrentRun != bcs.begin().runNumber()) { + fCurrentRun = bcs.begin().runNumber(); + initAccFromCCDB(bcs.begin().timestamp()); + } runEnergyCorrelators(event, event, mcTracks); } } @@ -1034,7 +1043,10 @@ struct AnalysisEnergyCorrelator { if (fSavelessevents[0] > 1 && event1.globalIndex() % fSavelessevents[0] == fSavelessevents[1]) { continue; } - initAccFromCCDB(bcs.begin().timestamp()); + if (fCurrentRun != bcs.begin().runNumber()) { + fCurrentRun = bcs.begin().runNumber(); + initAccFromCCDB(bcs.begin().timestamp()); + } runEnergyCorrelators(event1, event2, mcTracks); } } From d2bbf2edaf1c0f0ef00395d19ca870c580452263 Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Fri, 3 Apr 2026 17:26:53 +0800 Subject: [PATCH 18/19] Add files via upload --- PWGDQ/Core/VarManager.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PWGDQ/Core/VarManager.h b/PWGDQ/Core/VarManager.h index e043775fe44..783e3df3881 100644 --- a/PWGDQ/Core/VarManager.h +++ b/PWGDQ/Core/VarManager.h @@ -1371,7 +1371,7 @@ class VarManager : public TObject template static void FillDileptonHadron(T1 const& dilepton, T2 const& hadron, float* values = nullptr, float hadronMass = 0.0f); template - static void FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, float* values = nullptr, float weight = 1.0, float Translow = 1. / 3, float Transhigh = 2. / 3, bool applyFitMass = false, float sidebandMass = 0.0f); + 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, float weight = 1.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, float Effweight_rec = 1.f, float Accweight_gen = 1.f); template @@ -5798,7 +5798,7 @@ void VarManager::FillDileptonHadron(T1 const& dilepton, T2 const& hadron, float* } template -void VarManager::FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, float* values, float Translow, float Transhigh, bool applyFitMass, float sidebandMass) +void VarManager::FillEnergyCorrelatorTriple(T1 const& lepton1, T2 const& lepton2, T3 const& hadron, float* values, float Translow, float Transhigh, bool applyFitMass, float sidebandMass, float weight) { float m1 = o2::constants::physics::MassElectron; float m2 = o2::constants::physics::MassElectron; From 58eff73700303f2a7076931fa9fe9b5eeb3f5e76 Mon Sep 17 00:00:00 2001 From: YazhenLin Date: Fri, 3 Apr 2026 17:27:29 +0800 Subject: [PATCH 19/19] Add files via upload --- PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx index d5a23de3c96..a2be46cc3aa 100644 --- a/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx +++ b/PWGDQ/Tasks/dqEnergyCorrelator_direct.cxx @@ -497,7 +497,7 @@ struct AnalysisEnergyCorrelator { // Fill dilepton-hadron variables std::vector fTransRange = fConfigDileptonHadronOptions.fConfigTransRange; - VarManager::FillEnergyCorrelatorTriple(track1, track2, hadron, VarManager::fgValues, 1. / Effweight_rec, fTransRange[0], fTransRange[1], fConfigDileptonHadronOptions.fConfigApplyMassEC.value); + VarManager::FillEnergyCorrelatorTriple(track1, track2, hadron, VarManager::fgValues, fTransRange[0], fTransRange[1], fConfigDileptonHadronOptions.fConfigApplyMassEC.value, -1, 1. / Effweight_rec); if (fConfigDileptonHadronOptions.fConfigUsePionMass.value) { VarManager::FillEnergyCorrelatorsUnfoldingTriple(track1, track2, hadron, motherParticle, hadronMC, VarManager::fgValues, fConfigDileptonHadronOptions.fConfigApplyMassEC.value, 1. / Effweight_rec, 1. / Accweight_gen); } else {