From 08cc67c296f57bf288223de24fbcad3ff8a6cf0a Mon Sep 17 00:00:00 2001 From: scattaru Date: Wed, 3 Sep 2025 14:58:57 +0200 Subject: [PATCH 1/8] Adding multi dim eff histograms --- PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx | 204 ++++++++++++++++--- 1 file changed, 175 insertions(+), 29 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx index 51a56e5a766..5cf73e7594d 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx @@ -81,7 +81,10 @@ struct HfTaskCorrelationDsHadrons { Configurable removeCollWSplitVtx{"removeCollWSplitVtx", false, "Flag for rejecting the splitted collisions"}; Configurable loadAccXEffFromCCDB{"loadAccXEffFromCCDB", false, "Flag for loading efficiency distributions from CCDB"}; Configurable separateTrackOrigins{"separateTrackOrigins", false, "Flag to enable separation of track origins (from c or b)"}; - Configurable useHighDimHistoForEff{"useHighDimHistoForEff", false, "Flag to create higher dimension histograms in the efficiency processes"}; + Configurable useHighDimHistoForEff{"useHighDimHistoForEff", false, "Flag to create/use higher dimension histograms in the efficiency processes/correction"}; + Configurable applyDeltaPhiCorrEff{"applyDeltaPhiCorrEff", false, "Flag to use higher dimension histograms with delta phi correction in the efficiency correction"}; + Configurable doLSpair{"doLSpair", false, "Flag to evaluate correlations for like-sign pairs"}; + Configurable doULSpair{"doULSpair", false, "Flag to evaluate correlations for unlike-sign pairs"}; // Configurable doMcCollisionCheck{"doMcCollisionCheck", false, "Flag for applying the collision check and selection based on MC collision info"}; Configurable selectionFlagDs{"selectionFlagDs", 7, "Selection Flag for Ds (avoid the case of flag = 0, no outputMlScore)"}; Configurable nTpcCrossedRaws{"nTpcCrossedRaws", 70, "Number of crossed TPC Rows"}; @@ -123,6 +126,10 @@ struct HfTaskCorrelationDsHadrons { std::shared_ptr hEfficiencyD = nullptr; std::shared_ptr hEfficiencyAssociated = nullptr; + std::shared_ptr hEfficiencyDMult = nullptr; + std::shared_ptr hEfficiencyAssociatedMult = nullptr; + std::shared_ptr hEfficiencyAssociatedDeltaPhiCorr = nullptr; + const float epsilon = 1.e-8; HfHelper hfHelper; @@ -285,17 +292,39 @@ struct HfTaskCorrelationDsHadrons { ccdb->setLocalObjectValidityChecking(); ccdb->setCreatedNotAfter(std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count()); - hEfficiencyD = std::shared_ptr(ccdb->getForTimeStamp(promptEffCcdbPath, timestampCcdb)); - if (hEfficiencyD == nullptr) { - LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", promptEffCcdbPath.value.c_str()); - } - LOGF(info, "Loaded trigger efficiency (prompt D) histogram from %s", promptEffCcdbPath.value.c_str()); + if (useHighDimHistoForEff) { + hEfficiencyDMult = std::shared_ptr(ccdb->getForTimeStamp(promptEffCcdbPath, timestampCcdb)); + if (hEfficiencyDMult == nullptr) { + LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", promptEffCcdbPath.value.c_str()); + } + LOGF(info, "Loaded trigger efficiency (prompt D) histogram from %s", promptEffCcdbPath.value.c_str()); + + if (applyDeltaPhiCorrEff) { + hEfficiencyAssociatedDeltaPhiCorr = std::shared_ptr(ccdb->getForTimeStamp(associatedEffCcdbPath, timestampCcdb)); + if (hEfficiencyAssociatedDeltaPhiCorr == nullptr) { + LOGF(fatal, "Could not load efficiency histogram for associated particles from %s", associatedEffCcdbPath.value.c_str()); + } + LOGF(info, "Loaded associated efficiency histogram from %s", associatedEffCcdbPath.value.c_str()); + } else { + hEfficiencyAssociatedMult = std::shared_ptr(ccdb->getForTimeStamp(associatedEffCcdbPath, timestampCcdb)); + if (hEfficiencyAssociatedMult == nullptr) { + LOGF(fatal, "Could not load efficiency histogram for associated particles from %s", associatedEffCcdbPath.value.c_str()); + } + LOGF(info, "Loaded associated efficiency histogram from %s", associatedEffCcdbPath.value.c_str()); + } + } else { + hEfficiencyD = std::shared_ptr(ccdb->getForTimeStamp(promptEffCcdbPath, timestampCcdb)); + if (hEfficiencyD == nullptr) { + LOGF(fatal, "Could not load efficiency histogram for trigger particles from %s", promptEffCcdbPath.value.c_str()); + } + LOGF(info, "Loaded trigger efficiency (prompt D) histogram from %s", promptEffCcdbPath.value.c_str()); - hEfficiencyAssociated = std::shared_ptr(ccdb->getForTimeStamp(associatedEffCcdbPath, timestampCcdb)); - if (hEfficiencyAssociated == nullptr) { - LOGF(fatal, "Could not load efficiency histogram for associated particles from %s", associatedEffCcdbPath.value.c_str()); + hEfficiencyAssociated = std::shared_ptr(ccdb->getForTimeStamp(associatedEffCcdbPath, timestampCcdb)); + if (hEfficiencyAssociated == nullptr) { + LOGF(fatal, "Could not load efficiency histogram for associated particles from %s", associatedEffCcdbPath.value.c_str()); + } + LOGF(info, "Loaded associated efficiency histogram from %s", associatedEffCcdbPath.value.c_str()); } - LOGF(info, "Loaded associated efficiency histogram from %s", associatedEffCcdbPath.value.c_str()); } } @@ -321,10 +350,17 @@ struct HfTaskCorrelationDsHadrons { switch (mode) { case EfficiencyMode::DsOnly: if (loadAccXEffFromCCDB) { - if (hEfficiencyD->GetBinContent(hEfficiencyD->FindBin(ptD)) <= epsilon) { - LOG(fatal) << "A bin content in Ds-meson efficiency histogram is zero!"; + if (useHighDimHistoForEff) { + if (hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, multPvContrib)) <= epsilon) { + LOG(fatal) << "A bin content in Ds-meson efficiency histogram is zero!"; + } + weight = 1. / hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, multPvContrib)); + } else { + if (hEfficiencyD->GetBinContent(hEfficiencyD->FindBin(ptD)) <= epsilon) { + LOG(fatal) << "A bin content in Ds-meson efficiency histogram is zero!"; + } + weight = 1. / hEfficiencyD->GetBinContent(hEfficiencyD->FindBin(ptD)); } - weight = 1. / hEfficiencyD->GetBinContent(hEfficiencyD->FindBin(ptD)); } else { if (efficiencyD->at(o2::analysis::findBin(binsPtEfficiencyD, ptD)) <= epsilon) { LOG(fatal) << "A bin content in Ds-meson efficiency vector is zero!"; @@ -335,10 +371,24 @@ struct HfTaskCorrelationDsHadrons { case EfficiencyMode::DsHadronPair: if (loadAccXEffFromCCDB) { if (ptAssoc && hEfficiencyAssociated) { - if (hEfficiencyAssociated->GetBinContent(hEfficiencyAssociated->FindBin(*ptAssoc)) <= epsilon) { - LOG(fatal) << "A bin content in associated particle efficiency histogram is zero!"; + if (useHighDimHistoForEff) { + if (applyDeltaPhiCorrEff) { + if (hEfficiencyAssociatedDeltaPhiCorr->GetBinContent(hEfficiencyAssociatedDeltaPhiCorr->FindBin(*ptAssoc, ptD, deltaPhi)) <= epsilon) { + LOG(fatal) << "A bin content in associated particle efficiency histogram is zero!"; + } + weight = 1. / (hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, multPvContrib)) * hEfficiencyAssociatedDeltaPhiCorr->GetBinContent(hEfficiencyAssociatedDeltaPhiCorr->FindBin(*ptAssoc, ptD, deltaPhi))); + } else { + if (hEfficiencyAssociatedMult->GetBinContent(hEfficiencyAssociatedMult->FindBin(*ptAssoc, multPvContrib)) <= epsilon) { + LOG(fatal) << "A bin content in associated particle efficiency histogram is zero!"; + } + weight = 1. / (hEfficiencyDMult->GetBinContent(hEfficiencyD->FindBin(ptD, multPvContrib)) * hEfficiencyAssociatedMult->GetBinContent(hEfficiencyAssociatedMult->FindBin(*ptAssoc, multPvContrib))); + } + } else { + if (hEfficiencyAssociated->GetBinContent(hEfficiencyAssociated->FindBin(*ptAssoc)) <= epsilon) { + LOG(fatal) << "A bin content in associated particle efficiency histogram is zero!"; + } + weight = 1. / (hEfficiencyD->GetBinContent(hEfficiencyD->FindBin(ptD)) * hEfficiencyAssociated->GetBinContent(hEfficiencyAssociated->FindBin(*ptAssoc))); } - weight = 1. / (hEfficiencyD->GetBinContent(hEfficiencyD->FindBin(ptD)) * hEfficiencyAssociated->GetBinContent(hEfficiencyAssociated->FindBin(*ptAssoc))); } } else { if (ptAssoc) { @@ -365,13 +415,13 @@ struct HfTaskCorrelationDsHadrons { float ptD = candidate.ptD(); float bdtScorePrompt = candidate.mlScorePrompt(); float bdtScoreBkg = candidate.mlScoreBkg(); - int ptBinD = o2::analysis::findBin(binsPtD, ptD); + int ptBinD = o2::analysis::findBin(binsPtD, std::abs(ptD)); if (!isSelectedCandidate(ptBinD, bdtScorePrompt, bdtScoreBkg)) { continue; } - double efficiencyWeightD = getEfficiencyWeight(ptD); + double efficiencyWeightD = getEfficiencyWeight(std::abs(ptD)); registry.fill(HIST("hMassDsVsPt"), massD, ptD, efficiencyWeightD); registry.fill(HIST("hBdtScorePrompt"), bdtScorePrompt); @@ -605,27 +655,123 @@ struct HfTaskCorrelationDsHadrons { float ptHadron = pairEntry.ptHadron(); float massD = pairEntry.mD(); int poolBin = pairEntry.poolBin(); - int ptBinD = o2::analysis::findBin(binsPtD, ptD); + int ptBinD = o2::analysis::findBin(binsPtD, std::abs(ptD)); - double efficiencyWeight = getEfficiencyWeight(ptD, ptHadron, EfficiencyMode::DsHadronPair); + double efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); // in signal region if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) { - registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); - registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); - registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi, efficiencyWeight); + if (doLSpair && ((ptD > 0. && ptHadron > 0.) || (ptD < 0. && ptHadron < 0.))) { // like-sign pairs + registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi, efficiencyWeight); + } else if (doULSpair && ((ptD > 0. && ptHadron < 0.) || (ptD < 0. && ptHadron > 0.))) { // unlike-sign pairs + registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi, efficiencyWeight); + } else { // default case + registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi, efficiencyWeight); + } } // in sideband left region if (massD > sidebandLeftOuter->at(ptBinD) && massD < sidebandLeftInner->at(ptBinD)) { - registry.fill(HIST("hCorrel2DVsPtSidebandLeft"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); - registry.fill(HIST("hDeltaEtaPtIntSidebandLeft"), deltaEta, efficiencyWeight); - registry.fill(HIST("hDeltaPhiPtIntSidebandLeft"), deltaPhi, efficiencyWeight); + if (doLSpair && ((ptD > 0. && ptHadron > 0.) || (ptD < 0. && ptHadron < 0.))) { // like-sign pairs + registry.fill(HIST("hCorrel2DVsPtSidebandLeft"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandLeft"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandLeft"), deltaPhi, efficiencyWeight); + } else if (doULSpair && ((ptD > 0. && ptHadron < 0.) || (ptD < 0. && ptHadron > 0.))) { // unlike-sign pairs + registry.fill(HIST("hCorrel2DVsPtSidebandLeft"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandLeft"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandLeft"), deltaPhi, efficiencyWeight); + } else { // default case + registry.fill(HIST("hCorrel2DVsPtSidebandLeft"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandLeft"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandLeft"), deltaPhi, efficiencyWeight); + } } // in sideband right region if (massD > sidebandRightInner->at(ptBinD) && massD < sidebandRightOuter->at(ptBinD)) { - registry.fill(HIST("hCorrel2DVsPtSidebandRight"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); - registry.fill(HIST("hDeltaEtaPtIntSidebandRight"), deltaEta, efficiencyWeight); - registry.fill(HIST("hDeltaPhiPtIntSidebandRight"), deltaPhi, efficiencyWeight); + if (doLSpair && ((ptD > 0. && ptHadron > 0.) || (ptD < 0. && ptHadron < 0.))) { // like-sign pairs + registry.fill(HIST("hCorrel2DVsPtSidebandRight"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandRight"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandRight"), deltaPhi, efficiencyWeight); + } else if (doULSpair && ((ptD > 0. && ptHadron < 0.) || (ptD < 0. && ptHadron > 0.))) { // unlike-sign pairs + registry.fill(HIST("hCorrel2DVsPtSidebandRight"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandRight"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandRight"), deltaPhi, efficiencyWeight); + } else { // default case + registry.fill(HIST("hCorrel2DVsPtSidebandRight"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandRight"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandRight"), deltaPhi, efficiencyWeight); + } + } + } + } + PROCESS_SWITCH(HfTaskCorrelationDsHadrons, processDataME, "Process data ME", false); + + void processDerivedDataME(DsHadronPair const& pairEntries) + { + for (const auto& pairEntry : pairEntries) { + // define variables for widely used quantities + float deltaPhi = pairEntry.deltaPhi(); + float deltaEta = pairEntry.deltaEta(); + float ptD = pairEntry.ptD(); + float ptHadron = pairEntry.ptHadron(); + float massD = pairEntry.mD(); + int poolBin = pairEntry.poolBin(); + int ptBinD = o2::analysis::findBin(binsPtD, std::abs(ptD)); + + double efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); + + // in signal region + if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) { + if (doLSpair && ((ptD > 0. && ptHadron > 0.) || (ptD < 0. && ptHadron < 0.))) { // like-sign pairs + registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi, efficiencyWeight); + } else if (doULSpair && ((ptD > 0. && ptHadron < 0.) || (ptD < 0. && ptHadron > 0.))) { // unlike-sign pairs + registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi, efficiencyWeight); + } else { // default case + registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi, efficiencyWeight); + } + } + // in sideband left region + if (massD > sidebandLeftOuter->at(ptBinD) && massD < sidebandLeftInner->at(ptBinD)) { + if (doLSpair && ((ptD > 0. && ptHadron > 0.) || (ptD < 0. && ptHadron < 0.))) { // like-sign pairs + registry.fill(HIST("hCorrel2DVsPtSidebandLeft"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandLeft"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandLeft"), deltaPhi, efficiencyWeight); + } else if (doULSpair && ((ptD > 0. && ptHadron < 0.) || (ptD < 0. && ptHadron > 0.))) { // unlike-sign pairs + registry.fill(HIST("hCorrel2DVsPtSidebandLeft"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandLeft"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandLeft"), deltaPhi, efficiencyWeight); + } else { // default case + registry.fill(HIST("hCorrel2DVsPtSidebandLeft"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandLeft"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandLeft"), deltaPhi, efficiencyWeight); + } + } + // in sideband right region + if (massD > sidebandRightInner->at(ptBinD) && massD < sidebandRightOuter->at(ptBinD)) { + if (doLSpair && ((ptD > 0. && ptHadron > 0.) || (ptD < 0. && ptHadron < 0.))) { // like-sign pairs + registry.fill(HIST("hCorrel2DVsPtSidebandRight"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandRight"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandRight"), deltaPhi, efficiencyWeight); + } else if (doULSpair && ((ptD > 0. && ptHadron < 0.) || (ptD < 0. && ptHadron > 0.))) { // unlike-sign pairs + registry.fill(HIST("hCorrel2DVsPtSidebandRight"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandRight"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandRight"), deltaPhi, efficiencyWeight); + } else { // default case + registry.fill(HIST("hCorrel2DVsPtSidebandRight"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandRight"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandRight"), deltaPhi, efficiencyWeight); + } } } } From 36283dd240e6c6d31563245d6b9d5586f53b3641 Mon Sep 17 00:00:00 2001 From: scattaru Date: Wed, 10 Sep 2025 13:56:34 +0200 Subject: [PATCH 2/8] Added particle multiplicity in the efficiency correction and fixed PID processes --- PWGHF/HFC/DataModel/CorrelationTables.h | 7 +- .../HFC/TableProducer/correlatorDsHadrons.cxx | 48 +++-- .../correlatorDsHadronsReduced.cxx | 8 +- PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx | 190 +++++++++++------- 4 files changed, 152 insertions(+), 101 deletions(-) diff --git a/PWGHF/HFC/DataModel/CorrelationTables.h b/PWGHF/HFC/DataModel/CorrelationTables.h index d453d894978..3f819fd0926 100644 --- a/PWGHF/HFC/DataModel/CorrelationTables.h +++ b/PWGHF/HFC/DataModel/CorrelationTables.h @@ -240,6 +240,7 @@ DECLARE_SOA_COLUMN(MlScorePrompt, mlScorePrompt, float); //! M DECLARE_SOA_COLUMN(TrackDcaXY, trackDcaXY, float); //! DCA xy of the track DECLARE_SOA_COLUMN(TrackDcaZ, trackDcaZ, float); //! DCA z of the track DECLARE_SOA_COLUMN(PoolBin, poolBin, int); //! Pool Bin for the MixedEvent +DECLARE_SOA_COLUMN(NumPvContrib, numPvContrib, int); //! number PV contributors DECLARE_SOA_COLUMN(TrackTPCNClsCrossedRows, trackTPCNClsCrossedRows, int); //! Number of crossed TPC Rows DECLARE_SOA_COLUMN(TrackOrigin, trackOrigin, int); //! Number of crossed TPC Rows DECLARE_SOA_COLUMN(IsSignal, isSignal, bool); //! Used in MC-Rec, Ds Signal @@ -253,7 +254,8 @@ DECLARE_SOA_TABLE(DsHadronPair, "AOD", "DSHPAIR", //! Ds-Hadrons pairs Informati aod::hf_correlation_ds_hadron::DeltaEta, aod::hf_correlation_ds_hadron::PtD, aod::hf_correlation_ds_hadron::PtHadron, - aod::hf_correlation_ds_hadron::PoolBin); + aod::hf_correlation_ds_hadron::PoolBin, + aod::hf_correlation_ds_hadron::NumPvContrib); DECLARE_SOA_TABLE(DsHadronRecoInfo, "AOD", "DSHRECOINFO", //! Ds-Hadrons pairs Reconstructed Information aod::hf_correlation_ds_hadron::MD, @@ -273,7 +275,8 @@ DECLARE_SOA_TABLE(DsCandRecoInfo, "AOD", "DSCANDRECOINFO", //! Ds candidates Rec aod::hf_correlation_ds_hadron::MD, aod::hf_correlation_ds_hadron::PtD, aod::hf_correlation_ds_hadron::MlScorePrompt, - aod::hf_correlation_ds_hadron::MlScoreBkg); + aod::hf_correlation_ds_hadron::MlScoreBkg, + aod::hf_correlation_ds_hadron::NumPvContrib); DECLARE_SOA_TABLE(DsCandGenInfo, "AOD", "DSCANDGENOINFO", //! Ds candidates Generated Information aod::hf_correlation_ds_hadron::IsPrompt); diff --git a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx index c788f35dd92..95a8e003906 100644 --- a/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDsHadrons.cxx @@ -216,11 +216,11 @@ struct HfCorrelatorDsHadrons { using SelCollisionsWithDs = soa::Filtered>; // collisionFilter applied // using SelCollisionsWithDsWithMc = soa::Filtered>; // collisionFilter applied using SelCollisionsMc = soa::Join; - using CandDsData = soa::Filtered>; // flagDsFilter applied - using CandDsMcReco = soa::Filtered>; // flagDsFilter applied - using CandDsMcGen = soa::Join; // flagDsFilter applied - using MyTracksData = soa::Filtered>; // trackFilter applied - using TracksWithMc = soa::Filtered>; // trackFilter applied + using CandDsData = soa::Filtered>; // flagDsFilter applied + using CandDsMcReco = soa::Filtered>; // flagDsFilter applied + using CandDsMcGen = soa::Join; // flagDsFilter applied + using MyTracksData = soa::Filtered>; // trackFilter applied + using TracksWithMc = soa::Filtered>; // trackFilter applied Filter collisionFilter = aod::hf_selection_dmeson_collision::dmesonSel == true; Filter flagDsFilter = ((o2::aod::hf_track_index::hfflag & static_cast(1 << aod::hf_cand_3prong::DecayType::DsToKKPi)) != static_cast(0)) && (aod::hf_sel_candidate_ds::isSelDsToKKPi >= selectionFlagDs || aod::hf_sel_candidate_ds::isSelDsToPiKK >= selectionFlagDs); @@ -430,13 +430,13 @@ struct HfCorrelatorDsHadrons { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { outputMl[iclass] = candidate.mlProbDsToKKPi()[classMl->at(iclass)]; } - entryDsCandRecoInfo(hfHelper.invMassDsToKKPi(candidate), candidate.pt(), outputMl[0], outputMl[2]); + entryDsCandRecoInfo(hfHelper.invMassDsToKKPi(candidate), candidate.pt(), outputMl[0], outputMl[2], collision.numContrib()); } else if (candidate.isSelDsToPiKK() >= selectionFlagDs) { fillHistoPiKK(candidate, efficiencyWeightD); for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { outputMl[iclass] = candidate.mlProbDsToPiKK()[classMl->at(iclass)]; } - entryDsCandRecoInfo(hfHelper.invMassDsToPiKK(candidate), candidate.pt(), outputMl[0], outputMl[2]); + entryDsCandRecoInfo(hfHelper.invMassDsToPiKK(candidate), candidate.pt(), outputMl[0], outputMl[2], collision.numContrib()); } if (candidate.isSelDsToKKPi() >= selectionFlagDs && candidate.isSelDsToPiKK() >= selectionFlagDs) { registry.fill(HIST("hCountSelectionStatusDsToKKPiAndToPiKK"), 0.); @@ -459,7 +459,8 @@ struct HfCorrelatorDsHadrons { track.eta() - candidate.eta(), candidate.pt(), track.pt(), - poolBin); + poolBin, + collision.numContrib()); entryDsHadronRecoInfo(hfHelper.invMassDsToKKPi(candidate), false, false); // entryDsHadronGenInfo(false, false, 0); entryDsHadronMlInfo(outputMl[0], outputMl[2]); @@ -469,7 +470,8 @@ struct HfCorrelatorDsHadrons { track.eta() - candidate.eta(), candidate.pt(), track.pt(), - poolBin); + poolBin, + collision.numContrib()); entryDsHadronRecoInfo(hfHelper.invMassDsToPiKK(candidate), false, false); // entryDsHadronGenInfo(false, false, 0); entryDsHadronMlInfo(outputMl[0], outputMl[2]); @@ -530,7 +532,7 @@ struct HfCorrelatorDsHadrons { registry.fill(HIST("hMassDsMcRecSig"), hfHelper.invMassDsToKKPi(candidate), candidate.pt(), efficiencyWeightD); registry.fill(HIST("hMassDsVsPtMcRec"), hfHelper.invMassDsToKKPi(candidate), candidate.pt(), efficiencyWeightD); registry.fill(HIST("hSelectionStatusDsToKKPiMcRec"), candidate.isSelDsToKKPi()); - entryDsCandRecoInfo(hfHelper.invMassDsToKKPi(candidate), candidate.pt(), outputMl[0], outputMl[2]); + entryDsCandRecoInfo(hfHelper.invMassDsToKKPi(candidate), candidate.pt(), outputMl[0], outputMl[2], collision.numContrib()); entryDsCandGenInfo(isDsPrompt); } else if (candidate.isSelDsToPiKK() >= selectionFlagDs) { for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { @@ -540,7 +542,7 @@ struct HfCorrelatorDsHadrons { registry.fill(HIST("hMassDsMcRecSig"), hfHelper.invMassDsToPiKK(candidate), candidate.pt(), efficiencyWeightD); registry.fill(HIST("hMassDsVsPtMcRec"), hfHelper.invMassDsToPiKK(candidate), candidate.pt(), efficiencyWeightD); registry.fill(HIST("hSelectionStatusDsToPiKKMcRec"), candidate.isSelDsToPiKK()); - entryDsCandRecoInfo(hfHelper.invMassDsToPiKK(candidate), candidate.pt(), outputMl[0], outputMl[2]); + entryDsCandRecoInfo(hfHelper.invMassDsToPiKK(candidate), candidate.pt(), outputMl[0], outputMl[2], collision.numContrib()); entryDsCandGenInfo(isDsPrompt); } } else { @@ -582,7 +584,8 @@ struct HfCorrelatorDsHadrons { track.eta() - candidate.eta(), candidate.pt(), track.pt(), - poolBin); + poolBin, + collision.numContrib()); entryDsHadronRecoInfo(hfHelper.invMassDsToKKPi(candidate), isDsSignal, isDecayChan); entryDsHadronMlInfo(outputMl[0], outputMl[2]); if (track.has_mcParticle()) { @@ -607,7 +610,8 @@ struct HfCorrelatorDsHadrons { track.eta() - candidate.eta(), candidate.pt(), track.pt(), - poolBin); + poolBin, + collision.numContrib()); entryDsHadronRecoInfo(hfHelper.invMassDsToPiKK(candidate), isDsSignal, isDecayChan); entryDsHadronMlInfo(outputMl[0], outputMl[2]); if (track.has_mcParticle()) { @@ -743,7 +747,8 @@ struct HfCorrelatorDsHadrons { particleAssoc.eta() - particle.eta(), particle.pt(), particleAssoc.pt(), - poolBin); + poolBin, + 0); entryDsHadronRecoInfo(MassDS, true, isDecayChan); entryDsHadronGenInfo(isDsPrompt, particleAssoc.isPhysicalPrimary(), trackOrigin); } @@ -847,7 +852,8 @@ struct HfCorrelatorDsHadrons { pAssoc.eta() - cand.eta(), cand.pt(), pAssoc.pt(), - poolBin); + poolBin, + c1.numContrib()); entryDsHadronRecoInfo(hfHelper.invMassDsToKKPi(cand), false, false); // entryDsHadronGenInfo(false, false, 0); for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { @@ -861,7 +867,8 @@ struct HfCorrelatorDsHadrons { pAssoc.eta() - cand.eta(), cand.pt(), pAssoc.pt(), - poolBin); + poolBin, + c1.numContrib()); entryDsHadronRecoInfo(hfHelper.invMassDsToPiKK(cand), false, false); // entryDsHadronGenInfo(false, false, 0); for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { @@ -937,7 +944,8 @@ struct HfCorrelatorDsHadrons { pAssoc.eta() - candidate.eta(), candidate.pt(), pAssoc.pt(), - poolBin); + poolBin, + c1.numContrib()); entryDsHadronRecoInfo(hfHelper.invMassDsToKKPi(candidate), isDsSignal, isDecayChan); entryDsHadronGenInfo(isDsPrompt, isPhysicalPrimary, trackOrigin); for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { @@ -950,7 +958,8 @@ struct HfCorrelatorDsHadrons { pAssoc.eta() - candidate.eta(), candidate.pt(), pAssoc.pt(), - poolBin); + poolBin, + c1.numContrib()); entryDsHadronRecoInfo(hfHelper.invMassDsToPiKK(candidate), isDsSignal, isDecayChan); entryDsHadronGenInfo(isDsPrompt, isPhysicalPrimary, trackOrigin); for (unsigned int iclass = 0; iclass < classMl->size(); iclass++) { @@ -993,7 +1002,8 @@ struct HfCorrelatorDsHadrons { particleAssoc.eta() - candidate.eta(), candidate.pt(), particleAssoc.pt(), - poolBin); + poolBin, + 0); entryDsHadronRecoInfo(MassDS, true, true); entryDsHadronGenInfo(isDsPrompt, particleAssoc.isPhysicalPrimary(), trackOrigin); } diff --git a/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx b/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx index 5684619dd3f..8549afaf266 100644 --- a/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx @@ -126,7 +126,7 @@ struct HfCorrelatorDsHadronsReduced { registry.fill(HIST("hDsPoolBin"), poolBin); registry.fill(HIST("hPhiVsPtCand"), RecoDecay::constrainAngle(candidate.phiCand(), -PIHalf), candidate.ptCand()); registry.fill(HIST("hEtaVsPtCand"), candidate.etaCand(), candidate.ptCand()); - entryDsCandRecoInfo(candidate.invMassDs(), candidate.ptCand(), candidate.bdtScorePrompt(), candidate.bdtScoreBkg()); + entryDsCandRecoInfo(candidate.invMassDs(), candidate.ptCand(), candidate.bdtScorePrompt(), candidate.bdtScoreBkg(), collision.numPvContrib()); for (const auto& track : tracksThisColl) { // Removing Ds daughters by checking track indices if ((candidate.prong0Id() == track.originTrackId()) || (candidate.prong1Id() == track.originTrackId()) || (candidate.prong2Id() == track.originTrackId())) { @@ -140,7 +140,8 @@ struct HfCorrelatorDsHadronsReduced { track.etaAssocTrack() - candidate.etaCand(), candidate.ptCand(), track.ptAssocTrack(), - poolBin); + poolBin + collision.numPvContrib()); entryDsHadronRecoInfo(candidate.invMassDs(), false, false); entryDsHadronMlInfo(candidate.bdtScorePrompt(), candidate.bdtScoreBkg()); entryTrackRecoInfo(track.dcaXY(), track.dcaZ(), track.nTpcCrossedRows()); @@ -202,7 +203,8 @@ struct HfCorrelatorDsHadronsReduced { pAssoc.etaAssocTrack() - cand.etaCand(), cand.ptCand(), pAssoc.ptAssocTrack(), - poolBin); + poolBin + c1.numPvContrib()); entryDsHadronRecoInfo(cand.invMassDs(), false, false); // entryDsHadronGenInfo(false, false, 0); } diff --git a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx index 5cf73e7594d..4e4aa979e88 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx @@ -339,7 +339,7 @@ struct HfTaskCorrelationDsHadrons { return (ptBinD != -1 && bdtScorePrompt >= mlOutputPromptMin->at(ptBinD) && bdtScorePrompt <= mlOutputPromptMax->at(ptBinD) && bdtScoreBkg <= mlOutputBkg->at(ptBinD)); } - double getEfficiencyWeight(float ptD, std::optional ptAssoc = std::nullopt, EfficiencyMode mode = EfficiencyMode::DsOnly) + double getEfficiencyWeight(float ptD, std::optional multPvContrib = std::nullopt, std::optional ptAssoc = std::nullopt, std::optional deltaPhi = std::nullopt, EfficiencyMode mode = EfficiencyMode::DsOnly) { if (!applyEfficiency) { return 1.; @@ -415,15 +415,21 @@ struct HfTaskCorrelationDsHadrons { float ptD = candidate.ptD(); float bdtScorePrompt = candidate.mlScorePrompt(); float bdtScoreBkg = candidate.mlScoreBkg(); + int multPvContrib = candidate.numPvContrib(); int ptBinD = o2::analysis::findBin(binsPtD, std::abs(ptD)); if (!isSelectedCandidate(ptBinD, bdtScorePrompt, bdtScoreBkg)) { continue; } - double efficiencyWeightD = getEfficiencyWeight(std::abs(ptD)); + double efficiencyWeightD = 1.; + if (useHighDimHistoForEff) { + efficiencyWeightD = getEfficiencyWeight(std::abs(ptD), multPvContrib); + } else { + efficiencyWeightD = getEfficiencyWeight(std::abs(ptD)); + } - registry.fill(HIST("hMassDsVsPt"), massD, ptD, efficiencyWeightD); + registry.fill(HIST("hMassDsVsPt"), massD, std::abs(ptD), efficiencyWeightD); registry.fill(HIST("hBdtScorePrompt"), bdtScorePrompt); registry.fill(HIST("hBdtScoreBkg"), bdtScoreBkg); } @@ -439,9 +445,10 @@ struct HfTaskCorrelationDsHadrons { float bdtScoreBkg = pairEntry.mlScoreBkg(); float trackDcaXY = pairEntry.trackDcaXY(); float trackDcaZ = pairEntry.trackDcaZ(); + int multPvContrib = pairEntry.numPvContrib(); int trackTpcCrossedRows = pairEntry.trackTPCNClsCrossedRows(); int poolBin = pairEntry.poolBin(); - int ptBinD = o2::analysis::findBin(binsPtD, ptD); + int ptBinD = o2::analysis::findBin(binsPtD, std::abs(ptD)); if (!isSelectedCandidate(ptBinD, bdtScorePrompt, bdtScoreBkg)) { continue; @@ -451,25 +458,60 @@ struct HfTaskCorrelationDsHadrons { continue; } - double efficiencyWeight = getEfficiencyWeight(ptD, ptHadron, EfficiencyMode::DsHadronPair); + double efficiencyWeight = 1.; + if (useHighDimHistoForEff) { + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), multPvContrib, std::abs(ptHadron), deltaPhi, EfficiencyMode::DsHadronPair); + } else { + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); + } // in signal region if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) { - registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); - registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); - registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi, efficiencyWeight); + if (doLSpair && ((ptD > 0. && ptHadron > 0.) || (ptD < 0. && ptHadron < 0.))) { // like-sign pairs + registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi, efficiencyWeight); + } else if (doULSpair && ((ptD > 0. && ptHadron < 0.) || (ptD < 0. && ptHadron > 0.))) { // unlike-sign pairs + registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi, efficiencyWeight); + } else { // default case + registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi, efficiencyWeight); + } } // in sideband left region if (massD > sidebandLeftOuter->at(ptBinD) && massD < sidebandLeftInner->at(ptBinD)) { - registry.fill(HIST("hCorrel2DVsPtSidebandLeft"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); - registry.fill(HIST("hDeltaEtaPtIntSidebandLeft"), deltaEta, efficiencyWeight); - registry.fill(HIST("hDeltaPhiPtIntSidebandLeft"), deltaPhi, efficiencyWeight); + if (doLSpair && ((ptD > 0. && ptHadron > 0.) || (ptD < 0. && ptHadron < 0.))) { // like-sign pairs + registry.fill(HIST("hCorrel2DVsPtSidebandLeft"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandLeft"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandLeft"), deltaPhi, efficiencyWeight); + } else if (doULSpair && ((ptD > 0. && ptHadron < 0.) || (ptD < 0. && ptHadron > 0.))) { // unlike-sign pairs + registry.fill(HIST("hCorrel2DVsPtSidebandLeft"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandLeft"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandLeft"), deltaPhi, efficiencyWeight); + } else { // default case + registry.fill(HIST("hCorrel2DVsPtSidebandLeft"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandLeft"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandLeft"), deltaPhi, efficiencyWeight); + } } // in sideband right region if (massD > sidebandRightInner->at(ptBinD) && massD < sidebandRightOuter->at(ptBinD)) { - registry.fill(HIST("hCorrel2DVsPtSidebandRight"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); - registry.fill(HIST("hDeltaEtaPtIntSidebandRight"), deltaEta, efficiencyWeight); - registry.fill(HIST("hDeltaPhiPtIntSidebandRight"), deltaPhi, efficiencyWeight); + if (doLSpair && ((ptD > 0. && ptHadron > 0.) || (ptD < 0. && ptHadron < 0.))) { // like-sign pairs + registry.fill(HIST("hCorrel2DVsPtSidebandRight"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandRight"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandRight"), deltaPhi, efficiencyWeight); + } else if (doULSpair && ((ptD > 0. && ptHadron < 0.) || (ptD < 0. && ptHadron > 0.))) { // unlike-sign pairs + registry.fill(HIST("hCorrel2DVsPtSidebandRight"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandRight"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandRight"), deltaPhi, efficiencyWeight); + } else { // default case + registry.fill(HIST("hCorrel2DVsPtSidebandRight"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); + registry.fill(HIST("hDeltaEtaPtIntSidebandRight"), deltaEta, efficiencyWeight); + registry.fill(HIST("hDeltaPhiPtIntSidebandRight"), deltaPhi, efficiencyWeight); + } } } } @@ -484,21 +526,27 @@ struct HfTaskCorrelationDsHadrons { float ptD = candidate.ptD(); float bdtScorePrompt = candidate.mlScorePrompt(); float bdtScoreBkg = candidate.mlScoreBkg(); - int ptBinD = o2::analysis::findBin(binsPtD, ptD); + int ptBinD = o2::analysis::findBin(binsPtD, std::abs(ptD)); + int multPvContrib = candidate.numPvContrib(); bool isDsPrompt = candidate.isPrompt(); if (!isSelectedCandidate(ptBinD, bdtScorePrompt, bdtScoreBkg)) { continue; } - double efficiencyWeightD = getEfficiencyWeight(ptD); + double efficiencyWeightD = 1.; + if (useHighDimHistoForEff) { + efficiencyWeightD = getEfficiencyWeight(std::abs(ptD), multPvContrib); + } else { + efficiencyWeightD = getEfficiencyWeight(std::abs(ptD)); + } if (isDsPrompt) { - registry.fill(HIST("hMassPromptDsVsPt"), massD, ptD, efficiencyWeightD); + registry.fill(HIST("hMassPromptDsVsPt"), massD, std::abs(ptD), efficiencyWeightD); registry.fill(HIST("hBdtScorePrompt"), bdtScorePrompt); registry.fill(HIST("hBdtScoreBkg"), bdtScoreBkg); } else { - registry.fill(HIST("hMassNonPromptDsVsPt"), massD, ptD, efficiencyWeightD); + registry.fill(HIST("hMassNonPromptDsVsPt"), massD, std::abs(ptD), efficiencyWeightD); registry.fill(HIST("hBdtScorePrompt"), bdtScorePrompt); registry.fill(HIST("hBdtScoreBkg"), bdtScoreBkg); } @@ -515,11 +563,12 @@ struct HfTaskCorrelationDsHadrons { float bdtScoreBkg = pairEntry.mlScoreBkg(); float trackDcaXY = pairEntry.trackDcaXY(); float trackDcaZ = pairEntry.trackDcaZ(); + int multPvContrib = pairEntry.numPvContrib(); int trackTpcCrossedRows = pairEntry.trackTPCNClsCrossedRows(); int poolBin = pairEntry.poolBin(); int statusDsPrompt = static_cast(pairEntry.isPrompt()); int statusPromptHadron = pairEntry.trackOrigin(); - int ptBinD = o2::analysis::findBin(binsPtD, ptD); + int ptBinD = o2::analysis::findBin(binsPtD, std::abs(ptD)); bool isPhysicalPrimary = pairEntry.isPhysicalPrimary(); if (!isSelectedCandidate(ptBinD, bdtScorePrompt, bdtScoreBkg)) { @@ -530,7 +579,12 @@ struct HfTaskCorrelationDsHadrons { continue; } - double efficiencyWeight = getEfficiencyWeight(ptD, ptHadron, EfficiencyMode::DsHadronPair); + double efficiencyWeight = 1.; + if (useHighDimHistoForEff) { + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), multPvContrib, std::abs(ptHadron), deltaPhi, EfficiencyMode::DsHadronPair); + } else { + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); + } // in signal region if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) { @@ -538,26 +592,26 @@ struct HfTaskCorrelationDsHadrons { if (pairEntry.isSignal() && pairEntry.isDecayChan()) { registry.fill(HIST("hDeltaEtaPtIntSignalRegionMcRec"), deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaPhiPtIntSignalRegionMcRec"), deltaPhi, efficiencyWeight); - registry.fill(HIST("hCorrel2DVsPtSignalRegionMcRec"), deltaPhi, deltaEta, ptD, ptHadron, statusDsPrompt, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSignalRegionMcRec"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), statusDsPrompt, poolBin, efficiencyWeight); if (isPhysicalPrimary) { - registry.fill(HIST("hCorrel2DVsPtPhysicalPrimaryMcRec"), deltaPhi, deltaEta, ptD, ptHadron, statusDsPrompt, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtPhysicalPrimaryMcRec"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), statusDsPrompt, poolBin, efficiencyWeight); if (statusDsPrompt == 1 && statusPromptHadron == RecoDecay::OriginType::Prompt) { - registry.fill(HIST("hCorrel2DVsPtSignalRegionPromptDsPromptHadronMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSignalRegionPromptDsPromptHadronMcRec"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); } else if (statusDsPrompt == 0 && statusPromptHadron == RecoDecay::OriginType::NonPrompt) { - registry.fill(HIST("hCorrel2DVsPtSignalRegionNonPromptDsNonPromptHadronMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSignalRegionNonPromptDsNonPromptHadronMcRec"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); } } } } // in sideband left region if (massD > sidebandLeftOuter->at(ptBinD) && massD < sidebandLeftInner->at(ptBinD)) { - registry.fill(HIST("hCorrel2DVsPtSidebandLeftMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSidebandLeftMcRec"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); registry.fill(HIST("hDeltaEtaPtIntSidebandLeftMcRec"), deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaPhiPtIntSidebandLeftMcRec"), deltaPhi, efficiencyWeight); } // in sideband right region if (massD > sidebandRightInner->at(ptBinD) && massD < sidebandRightOuter->at(ptBinD)) { - registry.fill(HIST("hCorrel2DVsPtSidebandRightMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSidebandRightMcRec"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); registry.fill(HIST("hDeltaEtaPtIntSidebandRightMcRec"), deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaPhiPtIntSidebandRightMcRec"), deltaPhi, efficiencyWeight); } @@ -578,18 +632,18 @@ struct HfTaskCorrelationDsHadrons { int statusPromptHadron = pairEntry.trackOrigin(); bool isDsPrompt = pairEntry.isPrompt(); - registry.fill(HIST("hCorrel2DVsPtMcGen"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); + registry.fill(HIST("hCorrel2DVsPtMcGen"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin); registry.fill(HIST("hDeltaEtaPtIntMcGen"), deltaEta); registry.fill(HIST("hDeltaPhiPtIntMcGen"), deltaPhi); if (isDsPrompt) { - registry.fill(HIST("hCorrel2DVsPtMcGenPrompt"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); + registry.fill(HIST("hCorrel2DVsPtMcGenPrompt"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin); if (statusPromptHadron == RecoDecay::OriginType::Prompt) { - registry.fill(HIST("hCorrel2DVsPtMcGenPromptDsPromptHadron"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); + registry.fill(HIST("hCorrel2DVsPtMcGenPromptDsPromptHadron"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin); } } else { - registry.fill(HIST("hCorrel2DVsPtMcGenNonPrompt"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); + registry.fill(HIST("hCorrel2DVsPtMcGenNonPrompt"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin); if (statusPromptHadron == RecoDecay::OriginType::NonPrompt) { - registry.fill(HIST("hCorrel2DVsPtMcGenNonPromptDsNonPromptHadron"), deltaPhi, deltaEta, ptD, ptHadron, poolBin); + registry.fill(HIST("hCorrel2DVsPtMcGenNonPromptDsNonPromptHadron"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin); } } } @@ -609,9 +663,10 @@ struct HfTaskCorrelationDsHadrons { float bdtScoreBkg = pairEntry.mlScoreBkg(); float trackDcaXY = pairEntry.trackDcaXY(); float trackDcaZ = pairEntry.trackDcaZ(); + int multPvContrib = pairEntry.numPvContrib(); int trackTpcCrossedRows = pairEntry.trackTPCNClsCrossedRows(); int poolBin = pairEntry.poolBin(); - int ptBinD = o2::analysis::findBin(binsPtD, ptD); + int ptBinD = o2::analysis::findBin(binsPtD, std::abs(ptD)); if (!isSelectedCandidate(ptBinD, bdtScorePrompt, bdtScoreBkg)) { continue; @@ -621,43 +676,12 @@ struct HfTaskCorrelationDsHadrons { continue; } - double efficiencyWeight = getEfficiencyWeight(ptD, ptHadron, EfficiencyMode::DsHadronPair); - - // in signal region - if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) { - registry.fill(HIST("hCorrel2DVsPtSignalRegion"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); - registry.fill(HIST("hDeltaEtaPtIntSignalRegion"), deltaEta, efficiencyWeight); - registry.fill(HIST("hDeltaPhiPtIntSignalRegion"), deltaPhi, efficiencyWeight); - } - // in sideband left region - if (massD > sidebandLeftOuter->at(ptBinD) && massD < sidebandLeftInner->at(ptBinD)) { - registry.fill(HIST("hCorrel2DVsPtSidebandLeft"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); - registry.fill(HIST("hDeltaEtaPtIntSidebandLeft"), deltaEta, efficiencyWeight); - registry.fill(HIST("hDeltaPhiPtIntSidebandLeft"), deltaPhi, efficiencyWeight); - } - // in sideband right region - if (massD > sidebandRightInner->at(ptBinD) && massD < sidebandRightOuter->at(ptBinD)) { - registry.fill(HIST("hCorrel2DVsPtSidebandRight"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); - registry.fill(HIST("hDeltaEtaPtIntSidebandRight"), deltaEta, efficiencyWeight); - registry.fill(HIST("hDeltaPhiPtIntSidebandRight"), deltaPhi, efficiencyWeight); + double efficiencyWeight = 1.; + if (useHighDimHistoForEff) { + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), multPvContrib, std::abs(ptHadron), deltaPhi, EfficiencyMode::DsHadronPair); + } else { + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); } - } - } - PROCESS_SWITCH(HfTaskCorrelationDsHadrons, processDataME, "Process data ME", false); - - void processDerivedDataME(DsHadronPair const& pairEntries) - { - for (const auto& pairEntry : pairEntries) { - // define variables for widely used quantities - float deltaPhi = pairEntry.deltaPhi(); - float deltaEta = pairEntry.deltaEta(); - float ptD = pairEntry.ptD(); - float ptHadron = pairEntry.ptHadron(); - float massD = pairEntry.mD(); - int poolBin = pairEntry.poolBin(); - int ptBinD = o2::analysis::findBin(binsPtD, std::abs(ptD)); - - double efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); // in signal region if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) { @@ -720,10 +744,16 @@ struct HfTaskCorrelationDsHadrons { float ptD = pairEntry.ptD(); float ptHadron = pairEntry.ptHadron(); float massD = pairEntry.mD(); + int multPvContrib = pairEntry.numPvContrib(); int poolBin = pairEntry.poolBin(); int ptBinD = o2::analysis::findBin(binsPtD, std::abs(ptD)); - double efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); + double efficiencyWeight = 1.; + if (useHighDimHistoForEff) { + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), multPvContrib, std::abs(ptHadron), deltaPhi, EfficiencyMode::DsHadronPair); + } else { + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); + } // in signal region if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) { @@ -791,11 +821,12 @@ struct HfTaskCorrelationDsHadrons { float bdtScoreBkg = pairEntry.mlScoreBkg(); float trackDcaXY = pairEntry.trackDcaXY(); float trackDcaZ = pairEntry.trackDcaZ(); + int multPvContrib = pairEntry.numPvContrib(); int trackTpcCrossedRows = pairEntry.trackTPCNClsCrossedRows(); int poolBin = pairEntry.poolBin(); int statusDsPrompt = static_cast(pairEntry.isPrompt()); int statusPromptHadron = pairEntry.trackOrigin(); - int ptBinD = o2::analysis::findBin(binsPtD, ptD); + int ptBinD = o2::analysis::findBin(binsPtD, std::abs(ptD)); bool isPhysicalPrimary = pairEntry.isPhysicalPrimary(); if (!isSelectedCandidate(ptBinD, bdtScorePrompt, bdtScoreBkg)) { @@ -806,7 +837,12 @@ struct HfTaskCorrelationDsHadrons { continue; } - double efficiencyWeight = getEfficiencyWeight(ptD, ptHadron, EfficiencyMode::DsHadronPair); + double efficiencyWeight = 1.; + if (useHighDimHistoForEff) { + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), multPvContrib, std::abs(ptHadron), deltaPhi, EfficiencyMode::DsHadronPair); + } else { + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); + } // in signal region if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) { @@ -814,26 +850,26 @@ struct HfTaskCorrelationDsHadrons { if (pairEntry.isSignal() && pairEntry.isDecayChan()) { registry.fill(HIST("hDeltaEtaPtIntSignalRegionMcRec"), deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaPhiPtIntSignalRegionMcRec"), deltaPhi, efficiencyWeight); - registry.fill(HIST("hCorrel2DVsPtSignalRegionMcRec"), deltaPhi, deltaEta, ptD, ptHadron, statusDsPrompt, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSignalRegionMcRec"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), statusDsPrompt, poolBin, efficiencyWeight); if (isPhysicalPrimary) { - registry.fill(HIST("hCorrel2DVsPtPhysicalPrimaryMcRec"), deltaPhi, deltaEta, ptD, ptHadron, statusDsPrompt, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtPhysicalPrimaryMcRec"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), statusDsPrompt, poolBin, efficiencyWeight); if (statusDsPrompt == 1 && statusPromptHadron == RecoDecay::OriginType::Prompt) { - registry.fill(HIST("hCorrel2DVsPtSignalRegionPromptDsPromptHadronMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSignalRegionPromptDsPromptHadronMcRec"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); } else if (statusDsPrompt == 0 && statusPromptHadron == RecoDecay::OriginType::NonPrompt) { - registry.fill(HIST("hCorrel2DVsPtSignalRegionNonPromptDsNonPromptHadronMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSignalRegionNonPromptDsNonPromptHadronMcRec"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); } } } } // in sideband left region if (massD > sidebandLeftOuter->at(ptBinD) && massD < sidebandLeftInner->at(ptBinD)) { - registry.fill(HIST("hCorrel2DVsPtSidebandLeftMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSidebandLeftMcRec"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); registry.fill(HIST("hDeltaEtaPtIntSidebandLeftMcRec"), deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaPhiPtIntSidebandLeftMcRec"), deltaPhi, efficiencyWeight); } // in sideband right region if (massD > sidebandRightInner->at(ptBinD) && massD < sidebandRightOuter->at(ptBinD)) { - registry.fill(HIST("hCorrel2DVsPtSidebandRightMcRec"), deltaPhi, deltaEta, ptD, ptHadron, poolBin, efficiencyWeight); + registry.fill(HIST("hCorrel2DVsPtSidebandRightMcRec"), deltaPhi, deltaEta, std::abs(ptD), std::abs(ptHadron), poolBin, efficiencyWeight); registry.fill(HIST("hDeltaEtaPtIntSidebandRightMcRec"), deltaEta, efficiencyWeight); registry.fill(HIST("hDeltaPhiPtIntSidebandRightMcRec"), deltaPhi, efficiencyWeight); } From 1ca8b2c8a7821baf87159e6c21678ded9c445c5d Mon Sep 17 00:00:00 2001 From: Samuele Cattaruzzi <124249902+scattaru@users.noreply.github.com> Date: Wed, 10 Sep 2025 14:31:51 +0200 Subject: [PATCH 3/8] Update CorrelationTables.h --- PWGHF/HFC/DataModel/CorrelationTables.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/HFC/DataModel/CorrelationTables.h b/PWGHF/HFC/DataModel/CorrelationTables.h index 3f819fd0926..1e2c52dc439 100644 --- a/PWGHF/HFC/DataModel/CorrelationTables.h +++ b/PWGHF/HFC/DataModel/CorrelationTables.h @@ -240,7 +240,7 @@ DECLARE_SOA_COLUMN(MlScorePrompt, mlScorePrompt, float); //! M DECLARE_SOA_COLUMN(TrackDcaXY, trackDcaXY, float); //! DCA xy of the track DECLARE_SOA_COLUMN(TrackDcaZ, trackDcaZ, float); //! DCA z of the track DECLARE_SOA_COLUMN(PoolBin, poolBin, int); //! Pool Bin for the MixedEvent -DECLARE_SOA_COLUMN(NumPvContrib, numPvContrib, int); //! number PV contributors +DECLARE_SOA_COLUMN(NumPvContrib, numPvContrib, uint16_t); //! number PV contributors DECLARE_SOA_COLUMN(TrackTPCNClsCrossedRows, trackTPCNClsCrossedRows, int); //! Number of crossed TPC Rows DECLARE_SOA_COLUMN(TrackOrigin, trackOrigin, int); //! Number of crossed TPC Rows DECLARE_SOA_COLUMN(IsSignal, isSignal, bool); //! Used in MC-Rec, Ds Signal From 96d3ef2e687ef248d3051d806505cc0f3c32867f Mon Sep 17 00:00:00 2001 From: Samuele Cattaruzzi <124249902+scattaru@users.noreply.github.com> Date: Thu, 11 Sep 2025 11:23:16 +0200 Subject: [PATCH 4/8] Fixed compiling issues in correlatorDsHadronsReduced.cxx --- PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx b/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx index 8549afaf266..ece87ee21ad 100644 --- a/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx +++ b/PWGHF/HFC/TableProducer/correlatorDsHadronsReduced.cxx @@ -140,8 +140,8 @@ struct HfCorrelatorDsHadronsReduced { track.etaAssocTrack() - candidate.etaCand(), candidate.ptCand(), track.ptAssocTrack(), - poolBin - collision.numPvContrib()); + poolBin, + collision.numPvContrib()); entryDsHadronRecoInfo(candidate.invMassDs(), false, false); entryDsHadronMlInfo(candidate.bdtScorePrompt(), candidate.bdtScoreBkg()); entryTrackRecoInfo(track.dcaXY(), track.dcaZ(), track.nTpcCrossedRows()); @@ -203,8 +203,8 @@ struct HfCorrelatorDsHadronsReduced { pAssoc.etaAssocTrack() - cand.etaCand(), cand.ptCand(), pAssoc.ptAssocTrack(), - poolBin - c1.numPvContrib()); + poolBin, + c1.numPvContrib()); entryDsHadronRecoInfo(cand.invMassDs(), false, false); // entryDsHadronGenInfo(false, false, 0); } From db37d78fec9cbb414851d6807d843200b635cd4f Mon Sep 17 00:00:00 2001 From: Samuele Cattaruzzi <124249902+scattaru@users.noreply.github.com> Date: Thu, 11 Sep 2025 11:55:10 +0200 Subject: [PATCH 5/8] Fix compilation issues in taskCorrelationDsHadrons.cxx --- PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx | 22 ++++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx index 4e4aa979e88..e0a53fa4f65 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx @@ -351,10 +351,10 @@ struct HfTaskCorrelationDsHadrons { case EfficiencyMode::DsOnly: if (loadAccXEffFromCCDB) { if (useHighDimHistoForEff) { - if (hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, multPvContrib)) <= epsilon) { + if (hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, static_cast(multPvContrib))) <= epsilon) { LOG(fatal) << "A bin content in Ds-meson efficiency histogram is zero!"; } - weight = 1. / hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, multPvContrib)); + weight = 1. / hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, static_cast(multPvContrib))); } else { if (hEfficiencyD->GetBinContent(hEfficiencyD->FindBin(ptD)) <= epsilon) { LOG(fatal) << "A bin content in Ds-meson efficiency histogram is zero!"; @@ -376,12 +376,12 @@ struct HfTaskCorrelationDsHadrons { if (hEfficiencyAssociatedDeltaPhiCorr->GetBinContent(hEfficiencyAssociatedDeltaPhiCorr->FindBin(*ptAssoc, ptD, deltaPhi)) <= epsilon) { LOG(fatal) << "A bin content in associated particle efficiency histogram is zero!"; } - weight = 1. / (hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, multPvContrib)) * hEfficiencyAssociatedDeltaPhiCorr->GetBinContent(hEfficiencyAssociatedDeltaPhiCorr->FindBin(*ptAssoc, ptD, deltaPhi))); + weight = 1. / (hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, static_cast(multPvContrib))) * hEfficiencyAssociatedDeltaPhiCorr->GetBinContent(hEfficiencyAssociatedDeltaPhiCorr->FindBin(*ptAssoc, ptD, deltaPhi))); } else { - if (hEfficiencyAssociatedMult->GetBinContent(hEfficiencyAssociatedMult->FindBin(*ptAssoc, multPvContrib)) <= epsilon) { + if (hEfficiencyAssociatedMult->GetBinContent(hEfficiencyAssociatedMult->FindBin(*ptAssoc, static_cast(multPvContrib))) <= epsilon) { LOG(fatal) << "A bin content in associated particle efficiency histogram is zero!"; } - weight = 1. / (hEfficiencyDMult->GetBinContent(hEfficiencyD->FindBin(ptD, multPvContrib)) * hEfficiencyAssociatedMult->GetBinContent(hEfficiencyAssociatedMult->FindBin(*ptAssoc, multPvContrib))); + weight = 1. / (hEfficiencyDMult->GetBinContent(hEfficiencyD->FindBin(ptD, static_cast(multPvContrib))) * hEfficiencyAssociatedMult->GetBinContent(hEfficiencyAssociatedMult->FindBin(*ptAssoc, static_cast(multPvContrib)))); } } else { if (hEfficiencyAssociated->GetBinContent(hEfficiencyAssociated->FindBin(*ptAssoc)) <= epsilon) { @@ -462,7 +462,7 @@ struct HfTaskCorrelationDsHadrons { if (useHighDimHistoForEff) { efficiencyWeight = getEfficiencyWeight(std::abs(ptD), multPvContrib, std::abs(ptHadron), deltaPhi, EfficiencyMode::DsHadronPair); } else { - efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::nullopt, std::abs(ptHadron), std::nullopt, EfficiencyMode::DsHadronPair); } // in signal region @@ -583,9 +583,9 @@ struct HfTaskCorrelationDsHadrons { if (useHighDimHistoForEff) { efficiencyWeight = getEfficiencyWeight(std::abs(ptD), multPvContrib, std::abs(ptHadron), deltaPhi, EfficiencyMode::DsHadronPair); } else { - efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::nullopt, std::abs(ptHadron), std::nullopt, EfficiencyMode::DsHadronPair); } - + // in signal region if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) { // prompt and non-prompt division @@ -680,7 +680,7 @@ struct HfTaskCorrelationDsHadrons { if (useHighDimHistoForEff) { efficiencyWeight = getEfficiencyWeight(std::abs(ptD), multPvContrib, std::abs(ptHadron), deltaPhi, EfficiencyMode::DsHadronPair); } else { - efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::nullopt, std::abs(ptHadron), std::nullopt, EfficiencyMode::DsHadronPair); } // in signal region @@ -752,7 +752,7 @@ struct HfTaskCorrelationDsHadrons { if (useHighDimHistoForEff) { efficiencyWeight = getEfficiencyWeight(std::abs(ptD), multPvContrib, std::abs(ptHadron), deltaPhi, EfficiencyMode::DsHadronPair); } else { - efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::nullopt, std::abs(ptHadron), std::nullopt, EfficiencyMode::DsHadronPair); } // in signal region @@ -841,7 +841,7 @@ struct HfTaskCorrelationDsHadrons { if (useHighDimHistoForEff) { efficiencyWeight = getEfficiencyWeight(std::abs(ptD), multPvContrib, std::abs(ptHadron), deltaPhi, EfficiencyMode::DsHadronPair); } else { - efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::abs(ptHadron), EfficiencyMode::DsHadronPair); + efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::nullopt, std::abs(ptHadron), std::nullopt, EfficiencyMode::DsHadronPair); } // in signal region From 5324cfa374fce98294ca47b67906993ee2ca6c5d Mon Sep 17 00:00:00 2001 From: ALICE Action Bot Date: Thu, 11 Sep 2025 09:55:42 +0000 Subject: [PATCH 6/8] Please consider the following formatting changes --- PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx index e0a53fa4f65..4f18a789d2c 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx @@ -585,7 +585,7 @@ struct HfTaskCorrelationDsHadrons { } else { efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::nullopt, std::abs(ptHadron), std::nullopt, EfficiencyMode::DsHadronPair); } - + // in signal region if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) { // prompt and non-prompt division From 8b1ddb9043a0d0ba5f835aad58ce2abfd318e0ad Mon Sep 17 00:00:00 2001 From: scattaru Date: Tue, 23 Sep 2025 16:46:41 +0200 Subject: [PATCH 7/8] Changed pt getter for correlator tables --- PWGHF/HFC/DataModel/CorrelationTables.h | 10 ++--- PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx | 45 +++++++++++--------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/PWGHF/HFC/DataModel/CorrelationTables.h b/PWGHF/HFC/DataModel/CorrelationTables.h index 1e2c52dc439..a8d729c8ee9 100644 --- a/PWGHF/HFC/DataModel/CorrelationTables.h +++ b/PWGHF/HFC/DataModel/CorrelationTables.h @@ -232,8 +232,8 @@ namespace hf_correlation_ds_hadron { DECLARE_SOA_COLUMN(DeltaPhi, deltaPhi, float); //! DeltaPhi between Ds and Hadrons DECLARE_SOA_COLUMN(DeltaEta, deltaEta, float); //! DeltaEta between Ds and Hadrons -DECLARE_SOA_COLUMN(PtD, ptD, float); //! Transverse momentum of Ds -DECLARE_SOA_COLUMN(PtHadron, ptHadron, float); //! Transverse momentum of Hadron +DECLARE_SOA_COLUMN(SignedPtD, signedPtD, float); //! Transverse momentum of Ds +DECLARE_SOA_COLUMN(SignedPtHadron, signedPtHadron, float); //! Transverse momentum of Hadron DECLARE_SOA_COLUMN(MD, mD, float); //! Invariant mass of Ds DECLARE_SOA_COLUMN(MlScoreBkg, mlScoreBkg, float); //! ML background score for Ds selection DECLARE_SOA_COLUMN(MlScorePrompt, mlScorePrompt, float); //! ML prompt score for Ds selection @@ -252,8 +252,8 @@ DECLARE_SOA_COLUMN(IsPhysicalPrimary, isPhysicalPrimary, bool); //! U DECLARE_SOA_TABLE(DsHadronPair, "AOD", "DSHPAIR", //! Ds-Hadrons pairs Information aod::hf_correlation_ds_hadron::DeltaPhi, aod::hf_correlation_ds_hadron::DeltaEta, - aod::hf_correlation_ds_hadron::PtD, - aod::hf_correlation_ds_hadron::PtHadron, + aod::hf_correlation_ds_hadron::SignedPtD, + aod::hf_correlation_ds_hadron::SignedPtHadron, aod::hf_correlation_ds_hadron::PoolBin, aod::hf_correlation_ds_hadron::NumPvContrib); @@ -273,7 +273,7 @@ DECLARE_SOA_TABLE(DsHadronMlInfo, "AOD", "DSHMLINFO", //! Ds-Hadrons pairs Machi DECLARE_SOA_TABLE(DsCandRecoInfo, "AOD", "DSCANDRECOINFO", //! Ds candidates Reconstructed Information aod::hf_correlation_ds_hadron::MD, - aod::hf_correlation_ds_hadron::PtD, + aod::hf_correlation_ds_hadron::SignedPtD, aod::hf_correlation_ds_hadron::MlScorePrompt, aod::hf_correlation_ds_hadron::MlScoreBkg, aod::hf_correlation_ds_hadron::NumPvContrib); diff --git a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx index 4f18a789d2c..4c7c5a59afa 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx @@ -351,10 +351,11 @@ struct HfTaskCorrelationDsHadrons { case EfficiencyMode::DsOnly: if (loadAccXEffFromCCDB) { if (useHighDimHistoForEff) { - if (hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, static_cast(multPvContrib))) <= epsilon) { + if (hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, static_cast(*multPvContrib))) <= epsilon) { + LOG(info) << "Mult: " << *multPvContrib << " PtD: " << ptD; LOG(fatal) << "A bin content in Ds-meson efficiency histogram is zero!"; } - weight = 1. / hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, static_cast(multPvContrib))); + weight = 1. / hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, static_cast(*multPvContrib))); } else { if (hEfficiencyD->GetBinContent(hEfficiencyD->FindBin(ptD)) <= epsilon) { LOG(fatal) << "A bin content in Ds-meson efficiency histogram is zero!"; @@ -370,18 +371,18 @@ struct HfTaskCorrelationDsHadrons { break; case EfficiencyMode::DsHadronPair: if (loadAccXEffFromCCDB) { - if (ptAssoc && hEfficiencyAssociated) { + if (ptAssoc && (hEfficiencyAssociated || hEfficiencyAssociatedMult || hEfficiencyAssociatedDeltaPhiCorr)) { if (useHighDimHistoForEff) { if (applyDeltaPhiCorrEff) { - if (hEfficiencyAssociatedDeltaPhiCorr->GetBinContent(hEfficiencyAssociatedDeltaPhiCorr->FindBin(*ptAssoc, ptD, deltaPhi)) <= epsilon) { + if (hEfficiencyAssociatedDeltaPhiCorr->GetBinContent(hEfficiencyAssociatedDeltaPhiCorr->FindBin(*ptAssoc, ptD, static_cast(*deltaPhi))) <= epsilon) { LOG(fatal) << "A bin content in associated particle efficiency histogram is zero!"; } - weight = 1. / (hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, static_cast(multPvContrib))) * hEfficiencyAssociatedDeltaPhiCorr->GetBinContent(hEfficiencyAssociatedDeltaPhiCorr->FindBin(*ptAssoc, ptD, deltaPhi))); + weight = 1. / (hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, static_cast(*multPvContrib))) * hEfficiencyAssociatedDeltaPhiCorr->GetBinContent(hEfficiencyAssociatedDeltaPhiCorr->FindBin(*ptAssoc, ptD, static_cast(*deltaPhi)))); } else { - if (hEfficiencyAssociatedMult->GetBinContent(hEfficiencyAssociatedMult->FindBin(*ptAssoc, static_cast(multPvContrib))) <= epsilon) { + if (hEfficiencyAssociatedMult->GetBinContent(hEfficiencyAssociatedMult->FindBin(*ptAssoc, static_cast(*multPvContrib))) <= epsilon) { LOG(fatal) << "A bin content in associated particle efficiency histogram is zero!"; } - weight = 1. / (hEfficiencyDMult->GetBinContent(hEfficiencyD->FindBin(ptD, static_cast(multPvContrib))) * hEfficiencyAssociatedMult->GetBinContent(hEfficiencyAssociatedMult->FindBin(*ptAssoc, static_cast(multPvContrib)))); + weight = 1. / (hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, static_cast(*multPvContrib))) * hEfficiencyAssociatedMult->GetBinContent(hEfficiencyAssociatedMult->FindBin(*ptAssoc, static_cast(*multPvContrib)))); } } else { if (hEfficiencyAssociated->GetBinContent(hEfficiencyAssociated->FindBin(*ptAssoc)) <= epsilon) { @@ -412,7 +413,7 @@ struct HfTaskCorrelationDsHadrons { { for (const auto& candidate : candidates) { float massD = candidate.mD(); - float ptD = candidate.ptD(); + float ptD = candidate.signedPtD(); float bdtScorePrompt = candidate.mlScorePrompt(); float bdtScoreBkg = candidate.mlScoreBkg(); int multPvContrib = candidate.numPvContrib(); @@ -438,8 +439,8 @@ struct HfTaskCorrelationDsHadrons { // define variables for widely used quantities float deltaPhi = pairEntry.deltaPhi(); float deltaEta = pairEntry.deltaEta(); - float ptD = pairEntry.ptD(); - float ptHadron = pairEntry.ptHadron(); + float ptD = pairEntry.signedPtD(); + float ptHadron = pairEntry.signedPtHadron(); float massD = pairEntry.mD(); float bdtScorePrompt = pairEntry.mlScorePrompt(); float bdtScoreBkg = pairEntry.mlScoreBkg(); @@ -465,6 +466,8 @@ struct HfTaskCorrelationDsHadrons { efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::nullopt, std::abs(ptHadron), std::nullopt, EfficiencyMode::DsHadronPair); } + LOG(info) << "Efficiency weight = " << efficiencyWeight; + // in signal region if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) { if (doLSpair && ((ptD > 0. && ptHadron > 0.) || (ptD < 0. && ptHadron < 0.))) { // like-sign pairs @@ -523,7 +526,7 @@ struct HfTaskCorrelationDsHadrons { { for (const auto& candidate : candidates) { float massD = candidate.mD(); - float ptD = candidate.ptD(); + float ptD = candidate.signedPtD(); float bdtScorePrompt = candidate.mlScorePrompt(); float bdtScoreBkg = candidate.mlScoreBkg(); int ptBinD = o2::analysis::findBin(binsPtD, std::abs(ptD)); @@ -556,8 +559,8 @@ struct HfTaskCorrelationDsHadrons { // define variables for widely used quantities float deltaPhi = pairEntry.deltaPhi(); float deltaEta = pairEntry.deltaEta(); - float ptD = pairEntry.ptD(); - float ptHadron = pairEntry.ptHadron(); + float ptD = pairEntry.signedPtD(); + float ptHadron = pairEntry.signedPtHadron(); float massD = pairEntry.mD(); float bdtScorePrompt = pairEntry.mlScorePrompt(); float bdtScoreBkg = pairEntry.mlScoreBkg(); @@ -626,8 +629,8 @@ struct HfTaskCorrelationDsHadrons { // define variables for widely used quantities float deltaPhi = pairEntry.deltaPhi(); float deltaEta = pairEntry.deltaEta(); - float ptD = pairEntry.ptD(); - float ptHadron = pairEntry.ptHadron(); + float ptD = pairEntry.signedPtD(); + float ptHadron = pairEntry.signedPtHadron(); int poolBin = pairEntry.poolBin(); int statusPromptHadron = pairEntry.trackOrigin(); bool isDsPrompt = pairEntry.isPrompt(); @@ -656,8 +659,8 @@ struct HfTaskCorrelationDsHadrons { // define variables for widely used quantities float deltaPhi = pairEntry.deltaPhi(); float deltaEta = pairEntry.deltaEta(); - float ptD = pairEntry.ptD(); - float ptHadron = pairEntry.ptHadron(); + float ptD = pairEntry.signedPtD(); + float ptHadron = pairEntry.signedPtHadron(); float massD = pairEntry.mD(); float bdtScorePrompt = pairEntry.mlScorePrompt(); float bdtScoreBkg = pairEntry.mlScoreBkg(); @@ -741,8 +744,8 @@ struct HfTaskCorrelationDsHadrons { // define variables for widely used quantities float deltaPhi = pairEntry.deltaPhi(); float deltaEta = pairEntry.deltaEta(); - float ptD = pairEntry.ptD(); - float ptHadron = pairEntry.ptHadron(); + float ptD = pairEntry.signedPtD(); + float ptHadron = pairEntry.signedPtHadron(); float massD = pairEntry.mD(); int multPvContrib = pairEntry.numPvContrib(); int poolBin = pairEntry.poolBin(); @@ -814,8 +817,8 @@ struct HfTaskCorrelationDsHadrons { // define variables for widely used quantities float deltaPhi = pairEntry.deltaPhi(); float deltaEta = pairEntry.deltaEta(); - float ptD = pairEntry.ptD(); - float ptHadron = pairEntry.ptHadron(); + float ptD = pairEntry.signedPtD(); + float ptHadron = pairEntry.signedPtHadron(); float massD = pairEntry.mD(); float bdtScorePrompt = pairEntry.mlScorePrompt(); float bdtScoreBkg = pairEntry.mlScoreBkg(); From d0113fcb995a8090ff603ae896456b23ac12df31 Mon Sep 17 00:00:00 2001 From: Samuele Cattaruzzi <124249902+scattaru@users.noreply.github.com> Date: Tue, 23 Sep 2025 16:57:53 +0200 Subject: [PATCH 8/8] Update taskCorrelationDsHadrons.cxx --- PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx | 3 --- 1 file changed, 3 deletions(-) diff --git a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx index 4c7c5a59afa..1536814e5f8 100644 --- a/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx +++ b/PWGHF/HFC/Tasks/taskCorrelationDsHadrons.cxx @@ -352,7 +352,6 @@ struct HfTaskCorrelationDsHadrons { if (loadAccXEffFromCCDB) { if (useHighDimHistoForEff) { if (hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, static_cast(*multPvContrib))) <= epsilon) { - LOG(info) << "Mult: " << *multPvContrib << " PtD: " << ptD; LOG(fatal) << "A bin content in Ds-meson efficiency histogram is zero!"; } weight = 1. / hEfficiencyDMult->GetBinContent(hEfficiencyDMult->FindBin(ptD, static_cast(*multPvContrib))); @@ -466,8 +465,6 @@ struct HfTaskCorrelationDsHadrons { efficiencyWeight = getEfficiencyWeight(std::abs(ptD), std::nullopt, std::abs(ptHadron), std::nullopt, EfficiencyMode::DsHadronPair); } - LOG(info) << "Efficiency weight = " << efficiencyWeight; - // in signal region if (massD > signalRegionInner->at(ptBinD) && massD < signalRegionOuter->at(ptBinD)) { if (doLSpair && ((ptD > 0. && ptHadron > 0.) || (ptD < 0. && ptHadron < 0.))) { // like-sign pairs