From 3f97017cc617fe08f23eec5e70c485e3c225ceb5 Mon Sep 17 00:00:00 2001 From: oussama3030 Date: Tue, 6 Oct 2026 10:13:10 +0200 Subject: [PATCH] added two new variables for ML use --- .../Tasks/Resonances/k892hadronphotonBkg.cxx | 26 +++++++++++-------- PWGLF/Tasks/Strangeness/sigmaanalysis.cxx | 6 ++++- PWGLF/Utils/ResonanceMlResponse.h | 18 ++++++++++--- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/PWGLF/Tasks/Resonances/k892hadronphotonBkg.cxx b/PWGLF/Tasks/Resonances/k892hadronphotonBkg.cxx index 0a3ab731da2..2dbfcfce7be 100644 --- a/PWGLF/Tasks/Resonances/k892hadronphotonBkg.cxx +++ b/PWGLF/Tasks/Resonances/k892hadronphotonBkg.cxx @@ -341,6 +341,8 @@ struct k892hadronphotonBkg { histos.add("BDT/h2dPhotonQt", "h2dPhotonQt", kTH2D, {axisConfig.mlProb, axisConfig.axisV0APQt}); histos.add("BDT/h2dPhotonRadius", "h2dPhotonRadius", kTH2D, {axisConfig.mlProb, axisConfig.axisV0Radius}); histos.add("BDT/h2dOPAngle", "h2dOPAngle", kTH2D, {axisConfig.mlProb, axisConfig.axisOPAngle}); + histos.add("BDT/h2dAPAlpha", "h2dAPAlpha", kTH2D, {axisConfig.mlProb, axisConfig.axisAPAlpha}); + histos.add("BDT/h2dAPQt", "h2dAPQt", kTH2D, {axisConfig.mlProb, axisConfig.axisAPQt}); } histos.add("hEventCentrality", "hEventCentrality", kTH1D, {axisConfig.axisCentrality}); @@ -894,7 +896,7 @@ struct k892hadronphotonBkg { //_______________________________________________ // Fill BDT performance QA template - void fillBDTPerformance(TV0Object const& lambda, TV0Object const& photon, float openAngle, float score, float pt, float mass) + void fillBDTPerformance(TV0Object const& lambda, TV0Object const& photon, float openAngle, float apAlpha, float apQt, float score, float pt, float mass) { float bkgScore = 1.0f - score; @@ -924,24 +926,26 @@ struct k892hadronphotonBkg { histos.fill(HIST("BDT/h2dPhotonQt"), score, photon.qtarm()); histos.fill(HIST("BDT/h2dPhotonRadius"), score, photon.v0radius()); histos.fill(HIST("BDT/h2dOPAngle"), score, openAngle); + histos.fill(HIST("BDT/h2dAPAlpha"), score, apAlpha); + histos.fill(HIST("BDT/h2dAPQt"), score, apQt); } //_______________________________________________ // BDT selection of a Lambda + photon pair template bool selectML(TV0Object const& lambda, TV0Object const& photon, - float openAngle, float pt, float mass) + float openAngle, float apAlpha, float apQt, float pt, float mass) { // No model outside the bdt.ptBinEdges range if (pt < bdt.ptBinEdges.value.front() || pt >= bdt.ptBinEdges.value.back()) return false; // Features in the order of bdt.namesInputFeatures - auto inputFeatures = mlResponse.getInputFeatures(lambda, photon, openAngle); + auto inputFeatures = mlResponse.getInputFeatures(lambda, photon, openAngle, apAlpha, apQt); std::vector outputMl; const bool isSelected = mlResponse.isSelectedMl(inputFeatures, pt, outputMl); // model and cut of the pT bin - fillBDTPerformance(lambda, photon, openAngle, outputMl[1], pt, mass); + fillBDTPerformance(lambda, photon, openAngle, apAlpha, apQt, outputMl[1], pt, mass); return isSelected; } @@ -1103,20 +1107,20 @@ struct k892hadronphotonBkg { if (std::abs(rapidity) > maxRap) continue; + // Armenteros-Podolanski of the mixed pair + const std::array gammaMom{photon.px(), photon.py(), photon.pz()}; + const std::array hadronMom{hadron.px(), hadron.py(), hadron.pz()}; + const float apAlpha = armenterosAlpha(gammaMom, hadronMom); + const float apQt = armenterosQt(gammaMom, hadronMom); + // BDT selection (Lambda(1520) only) if constexpr (resonance == kResoLambdaStar) { if (bdt.enableML) { - if (!selectML(hadron, photon, openAngle, pt, mass)) + if (!selectML(hadron, photon, openAngle, apAlpha, apQt, pt, mass)) continue; } } - // Armenteros-Podolanski of the mixed pair - const std::array gammaMom{photon.px(), photon.py(), photon.pz()}; - const std::array hadronMom{hadron.px(), hadron.py(), hadron.pz()}; - const float apAlpha = armenterosAlpha(gammaMom, hadronMom); - const float apQt = armenterosQt(gammaMom, hadronMom); - if constexpr (resonance == kResoKStar) { histos.fill(HIST("KStarBkg/h2dMixedKStarMassVsPt"), mass, pt); histos.fill(HIST("KStarBkg/h3dMixedKStarMassVsPt"), centrality, pt, mass); diff --git a/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx b/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx index 1e94d5e785c..b7205446f78 100644 --- a/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx +++ b/PWGLF/Tasks/Strangeness/sigmaanalysis.cxx @@ -398,6 +398,8 @@ struct sigmaanalysis { histos.add("BDT/h2dPhotonQt", "h2dPhotonQt", kTH2D, {mlProb, axisAPQt}); histos.add("BDT/h2dPhotonRadius", "h2dPhotonRadius", kTH2D, {mlProb, axisV0Radius}); histos.add("BDT/h2dOPAngle", "h2dOPAngle", kTH2D, {mlProb, axisOPAngle}); + histos.add("BDT/h2dAPAlpha", "h2dAPAlpha", kTH2D, {mlProb, axisAPAlpha}); + histos.add("BDT/h2dAPQt", "h2dAPQt", kTH2D, {mlProb, axisAPQt}); // MC-truth-based score if (doprocessMonteCarlo) { @@ -1773,6 +1775,8 @@ struct sigmaanalysis { histos.fill(HIST("BDT/h2dPhotonQt"), score, cand.photonQt()); histos.fill(HIST("BDT/h2dPhotonRadius"), score, cand.photonRadius()); histos.fill(HIST("BDT/h2dOPAngle"), score, cand.opAngle()); + histos.fill(HIST("BDT/h2dAPAlpha"), score, cand.lStarAlpha()); + histos.fill(HIST("BDT/h2dAPQt"), score, cand.lStarQtarm()); // MC-truth-based separation (signal = particle + antiparticle) if constexpr (requires { cand.isSigma0(); cand.isLambdaStar(); }) { @@ -1796,7 +1800,7 @@ struct sigmaanalysis { return false; // Features in the order of bdt.namesInputFeatures - auto inputFeatures = mlResponse.getInputFeatures(cand, cand, cand.opAngle()); + auto inputFeatures = mlResponse.getInputFeatures(cand, cand, cand.opAngle(), cand.lStarAlpha(), cand.lStarQtarm()); std::vector outputMl; // [background, signal] const bool isSelected = mlResponse.isSelectedMl(inputFeatures, pt, outputMl); // model and cut of the pT bin diff --git a/PWGLF/Utils/ResonanceMlResponse.h b/PWGLF/Utils/ResonanceMlResponse.h index 8a7932bc42f..e3051ef81c6 100644 --- a/PWGLF/Utils/ResonanceMlResponse.h +++ b/PWGLF/Utils/ResonanceMlResponse.h @@ -60,7 +60,9 @@ enum class InputFeaturesResonance : uint8_t { photonPosTPCNSigmaEl, photonNegTPCNSigmaEl, // Photon-Lambda pair - opAngle + opAngle, + apAlpha, + apQt }; template @@ -72,7 +74,7 @@ class ResonanceMlResponse : public MlResponse /// Input features of a photon-Lambda pair template , typename TLambda, typename TPhoton> - std::vector getInputFeatures(TLambda const& lambda, TPhoton const& photon, float opAngle) + std::vector getInputFeatures(TLambda const& lambda, TPhoton const& photon, float opAngle, float apAlpha, float apQt) { // sigma0builder candidates carry prefixed columns (lambdaQt(), photonQt(), ...), derived V0s the plain V0 getters constexpr bool LambdaFromSigma0 = requires(TLambda const& cand) { cand.lambdaQt(); }; @@ -271,6 +273,14 @@ class ResonanceMlResponse : public MlResponse case InputFeaturesResonance::opAngle: inputFeatures.emplace_back(opAngle); break; + + case InputFeaturesResonance::apAlpha: + inputFeatures.emplace_back(apAlpha); + break; + + case InputFeaturesResonance::apQt: + inputFeatures.emplace_back(apQt); + break; } } return inputFeatures; @@ -307,7 +317,9 @@ class ResonanceMlResponse : public MlResponse {"photonNegEta", static_cast(InputFeaturesResonance::photonNegEta)}, {"photonPosTPCNSigmaEl", static_cast(InputFeaturesResonance::photonPosTPCNSigmaEl)}, {"photonNegTPCNSigmaEl", static_cast(InputFeaturesResonance::photonNegTPCNSigmaEl)}, - {"opAngle", static_cast(InputFeaturesResonance::opAngle)}}; + {"opAngle", static_cast(InputFeaturesResonance::opAngle)}, + {"apAlpha", static_cast(InputFeaturesResonance::apAlpha)}, + {"apQt", static_cast(InputFeaturesResonance::apQt)}}; } };