diff --git a/PWGDQ/Core/MixingHandler.h b/PWGDQ/Core/MixingHandler.h index 2a396ab7d35..d7a16ef122d 100644 --- a/PWGDQ/Core/MixingHandler.h +++ b/PWGDQ/Core/MixingHandler.h @@ -24,6 +24,7 @@ #include +#include #include #include #include @@ -39,8 +40,8 @@ class MixingHandler : public TNamed float eta; float phi; uint32_t filteringFlags; - // flip a bit to zero (needed when a track was already used in mixing for that bit for the required pool depth) - void FlipBit(int64_t mask) { filteringFlags ^= mask; } + // Clear a bit once the track was used in mixing for that bit for the required pool depth. + void ClearBit(uint32_t mask) { filteringFlags &= ~mask; } void Print() const { std::cout << "pt: " << pt << ", eta: " << eta << ", phi: " << phi << ", filteringFlags: " << filteringFlags << std::endl; @@ -68,32 +69,40 @@ class MixingHandler : public TNamed tracks2.push_back(track); filteringMask |= track.filteringFlags; } - // flip bits in the filtering mask - void FlipFilteringMask(int64_t mask) { filteringMask ^= mask; } + // Clear bits in the filtering mask. + void ClearFilteringMask(uint32_t mask) { filteringMask &= ~mask; } // 1) increment the counters for a given track cut bit mask and if the counters reached the pool depth, - // 2) flip the corresponding bit in the tracks filtering flags to exclude them from further mixing + // 2) clear the corresponding bit in the tracks filtering flags to exclude them from further mixing // 3) for each track, if there are no more active bits in the filtering mask, then remove the track from the event void IncrementCounters(uint32_t mask, short poolDepth) { for (int i = 0; i < 32; i++) { - if (mask & (1ULL << i)) { + uint32_t bitMask = (static_cast(1) << i); + if (mask & bitMask) { counters[i]++; if (counters[i] >= poolDepth) { for (auto& track : tracks1) { - track.FlipBit(1ULL << i); - if (track.filteringFlags == 0) { - track = tracks1.back(); - tracks1.pop_back(); + track.ClearBit(bitMask); + } + for (auto track = tracks1.begin(); track != tracks1.end();) { + if (track->filteringFlags == 0) { + track = tracks1.erase(track); + } else { + ++track; } } + for (auto& track : tracks2) { - track.FlipBit(1ULL << i); - if (track.filteringFlags == 0) { - track = tracks2.back(); - tracks2.pop_back(); + track.ClearBit(bitMask); + } + for (auto track = tracks2.begin(); track != tracks2.end();) { + if (track->filteringFlags == 0) { + track = tracks2.erase(track); + } else { + ++track; } } - FlipFilteringMask(1ULL << i); + ClearFilteringMask(bitMask); } } } @@ -131,9 +140,13 @@ class MixingHandler : public TNamed // check which events in the pool are empty (i.e. no active tracks for mixing) and remove them from the pool void CleanPool() { - events.erase(std::remove_if(events.begin(), events.end(), - [](const MixingEvent& event) { return event.tracks1.empty() && event.tracks2.empty(); }), - events.end()); + for (auto event = events.begin(); event != events.end();) { + if (event->tracks1.empty() && event->tracks2.empty()) { + event = events.erase(event); + } else { + ++event; + } + } } // The function that performs the mixing is called outside this class, but the pool provides the events and tracks to be mixed and takes care of updating the events after mixing // (e.g. incrementing the counters and removing the tracks that reached the pool depth for a given cut) diff --git a/PWGDQ/DataModel/ReducedInfoTables.h b/PWGDQ/DataModel/ReducedInfoTables.h index be60adab101..781942d5fe7 100644 --- a/PWGDQ/DataModel/ReducedInfoTables.h +++ b/PWGDQ/DataModel/ReducedInfoTables.h @@ -826,6 +826,9 @@ DECLARE_SOA_COLUMN(PairDCAxyz, pairDCAxyz, float); DECLARE_SOA_COLUMN(PairDCAxy, pairDCAxy, float); //! Pair DCAxy to PV from KFParticle DECLARE_SOA_COLUMN(DeviationPairKF, deviationPairKF, float); //! Pair chi2 deviation to PV from KFParticle DECLARE_SOA_COLUMN(DeviationxyPairKF, deviationxyPairKF, float); //! Pair chi2 deviation to PV in XY from KFParticle +DECLARE_SOA_COLUMN(BdtBackground, bdtBackground, float); //! BDT output score for the background class +DECLARE_SOA_COLUMN(BdtPrompt, bdtPrompt, float); //! BDT output score for the prompt class +DECLARE_SOA_COLUMN(BdtNonprompt, bdtNonprompt, float); //! BDT output score for the nonprompt class // DECLARE_SOA_INDEX_COLUMN(ReducedMuon, reducedmuon2); //! DECLARE_SOA_COLUMN(CosThetaHE, costhetaHE, float); //! Cosine in the helicity frame DECLARE_SOA_COLUMN(PhiHE, phiHe, float); //! Phi in the helicity frame @@ -936,6 +939,12 @@ DECLARE_SOA_TABLE_STAGED(DielectronsAll, "RTDIELECTRONALL", //! reducedpair::Lz, reducedpair::Lxy); +DECLARE_SOA_TABLE_STAGED(DielectronsMls, "RTDIELECTRONML", //! + reducedpair::CentFT0C, + reducedpair::BdtBackground, + reducedpair::BdtPrompt, + reducedpair::BdtNonprompt); + DECLARE_SOA_TABLE(DimuonsAll, "AOD", "RTDIMUONALL", //! collision::PosX, collision::PosY, collision::PosZ, collision::NumContrib, evsel::Selection, reducedpair::EventSelection, @@ -1010,6 +1019,7 @@ using DimuonExtra = DimuonsExtra::iterator; using DileptonFlow = DileptonsFlow::iterator; using DileptonInfo = DileptonsInfo::iterator; using DielectronAll = DielectronsAll::iterator; +using DielectronMl = DielectronsMls::iterator; using DimuonAll = DimuonsAll::iterator; using DileptonMiniTree = DileptonsMiniTree::iterator; using DileptonMiniTreeGen = DileptonsMiniTreeGen::iterator; diff --git a/PWGDQ/Tasks/tableReader.cxx b/PWGDQ/Tasks/tableReader.cxx index 741ac75cc79..f028d8d2d50 100644 --- a/PWGDQ/Tasks/tableReader.cxx +++ b/PWGDQ/Tasks/tableReader.cxx @@ -1026,6 +1026,7 @@ struct AnalysisSameEventPairing { Produces dielectronInfoList; Produces dimuonExtraList; Produces dielectronAllList; + Produces dielectronMlList; Produces dimuonAllList; Produces dileptonFlowList; Produces dileptonInfoList; @@ -1380,6 +1381,7 @@ struct AnalysisSameEventPairing { dileptonFlowList.reserve(1); if (fConfigFlatTables.value) { dielectronAllList.reserve(1); + dielectronMlList.reserve(1); dimuonAllList.reserve(1); } if (useMiniTree.fConfigMiniTree) { @@ -1466,6 +1468,8 @@ struct AnalysisSameEventPairing { } } if constexpr ((TPairType == pairTypeEE) && (TTrackFillMap & VarManager::ObjTypes::ReducedTrackBarrelPID) > 0) { + isSelectedBDT = false; + fOutputMlPsi2ee.clear(); if (applyBDT) { std::vector dqInputFeatures = fDQMlResponse.getInputFeatures(t1, t2, VarManager::fgValues); @@ -1497,7 +1501,7 @@ struct AnalysisSameEventPairing { LOG(debug) << "Model index: " << modelIndex << ", pT: " << VarManager::fgValues[VarManager::kPt] << ", centrality (kCentFT0C): " << VarManager::fgValues[VarManager::kCentFT0C]; isSelectedBDT = fDQMlResponse.isSelectedMl(dqInputFeatures, modelIndex, fOutputMlPsi2ee); - VarManager::FillBdtScore(fOutputMlPsi2ee); // TODO: check if this is needed or not + VarManager::FillBdtScore(fOutputMlPsi2ee); } if (applyBDT && !isSelectedBDT) @@ -1512,6 +1516,10 @@ struct AnalysisSameEventPairing { VarManager::fgValues[VarManager::kKFMass], VarManager::fgValues[VarManager::kKFChi2OverNDFGeo], VarManager::fgValues[VarManager::kVertexingLxyz], VarManager::fgValues[VarManager::kVertexingLxyzOverErr], VarManager::fgValues[VarManager::kVertexingLxy], VarManager::fgValues[VarManager::kVertexingLxyOverErr], VarManager::fgValues[VarManager::kVertexingTauxy], VarManager::fgValues[VarManager::kVertexingTauxyErr], VarManager::fgValues[VarManager::kKFCosPA], VarManager::fgValues[VarManager::kKFJpsiDCAxyz], VarManager::fgValues[VarManager::kKFJpsiDCAxy], VarManager::fgValues[VarManager::kKFPairDeviationFromPV], VarManager::fgValues[VarManager::kKFPairDeviationxyFromPV], VarManager::fgValues[VarManager::kKFMassGeoTop], VarManager::fgValues[VarManager::kKFChi2OverNDFGeoTop], VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingLzProjected], VarManager::fgValues[VarManager::kVertexingLxyProjected]); + dielectronMlList(VarManager::fgValues[VarManager::kCentFT0C], + (applyBDT && fOutputMlPsi2ee.size() > 0) ? VarManager::fgValues[VarManager::kBdtBackground] : -999.f, + (applyBDT && fOutputMlPsi2ee.size() > 1) ? VarManager::fgValues[VarManager::kBdtPrompt] : -999.f, + (applyBDT && fOutputMlPsi2ee.size() > 2) ? VarManager::fgValues[VarManager::kBdtNonprompt] : -999.f); } } if constexpr (TPairType == pairTypeMuMu) { diff --git a/PWGDQ/Tasks/tableReader_withAssoc.cxx b/PWGDQ/Tasks/tableReader_withAssoc.cxx index 9e61737c6dc..5c5a222fc4d 100644 --- a/PWGDQ/Tasks/tableReader_withAssoc.cxx +++ b/PWGDQ/Tasks/tableReader_withAssoc.cxx @@ -1293,6 +1293,7 @@ struct AnalysisSameEventPairing { Produces dielectronInfoList; Produces dimuonsExtraList; Produces dielectronAllList; + Produces dielectronMlList; Produces dimuonAllList; Produces dileptonFlowList; Produces dileptonInfoList; @@ -1382,19 +1383,19 @@ struct AnalysisSameEventPairing { std::vector fMuonCuts; std::map, uint32_t> fAmbiguousPairs; - uint32_t fTrackFilterMask; // mask for the track cuts required in this task to be applied on the barrel cuts produced upstream - uint32_t fMuonFilterMask; // mask for the muon cuts required in this task to be applied on the muon cuts produced upstream - int fNCutsBarrel; - int fNCutsMuon; - int fNPairCuts; - int fNPairPerEvent; + uint32_t fTrackFilterMask = 0; // mask for the track cuts required in this task to be applied on the barrel cuts produced upstream + uint32_t fMuonFilterMask = 0; // mask for the muon cuts required in this task to be applied on the muon cuts produced upstream + int fNCutsBarrel = 0; + int fNCutsMuon = 0; + int fNPairCuts = 0; + int fNPairPerEvent = 0; - bool fEnableBarrelMixingHistos; - bool fEnableBarrelHistos; - bool fEnableMuonHistos; - bool fEnableMuonMixingHistos; - bool fEnableBarrelMuonHistos; - bool fEnableBarrelMuonMixingHistos; + bool fEnableBarrelMixingHistos = false; + bool fEnableBarrelHistos = false; + bool fEnableMuonHistos = false; + bool fEnableMuonMixingHistos = false; + bool fEnableBarrelMuonHistos = false; + bool fEnableBarrelMuonMixingHistos = false; NoBinningPolicy hashBin; @@ -1423,8 +1424,18 @@ struct AnalysisSameEventPairing { // Keep track of all the histogram class names to avoid composing strings in the pairing loop TString histNames = ""; std::vector names; + fTrackHistNames.clear(); + fMuonHistNames.clear(); + fTrackMuonHistNames.clear(); + fPairCuts.clear(); fTrackCuts.clear(); fMuonCuts.clear(); + fTrackFilterMask = 0; + fMuonFilterMask = 0; + fNCutsBarrel = 0; + fNCutsMuon = 0; + fNPairCuts = 0; + fNPairPerEvent = 0; // NOTE: Pair cuts are only applied on the histogram output. The produced pair tables do not have these cuts applied TString cutNamesStr = fConfigCuts.pair.value; @@ -1869,6 +1880,7 @@ struct AnalysisSameEventPairing { dileptonFlowList.reserve(reserveSize); if (fConfigOptions.flatTables.value) { dielectronAllList.reserve(reserveSize); + dielectronMlList.reserve(reserveSize); dimuonAllList.reserve(reserveSize); } if (fConfigOptions.polarTables.value) { @@ -1967,55 +1979,61 @@ struct AnalysisSameEventPairing { } if constexpr (trackHasCov && TTwoProngFitter) { dielectronsExtraList(t1.globalIndex(), t2.globalIndex(), VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingLzProjected], VarManager::fgValues[VarManager::kVertexingLxyProjected]); - if constexpr ((TTrackFillMap & VarManager::ObjTypes::ReducedTrackBarrelPID) > 0) { - if (fConfigML.applyBDT) { - std::vector dqInputFeatures = fDQMlResponse.getInputFeatures(t1, t2, VarManager::fgValues); - - if (dqInputFeatures.empty()) { - LOG(fatal) << "Input features for ML selection are empty! Please check your configuration."; - return; - } - - int modelIndex = -1; - const auto& binsCent = fDQMlResponse.getBinsCent(); - const auto& binsPt = fDQMlResponse.getBinsPt(); - const std::string& centType = fDQMlResponse.getCentType(); - - if ("kCentFT0C" == centType) { - modelIndex = o2::aod::dqmlcuts::getMlBinIndex(VarManager::fgValues[VarManager::kCentFT0C], VarManager::fgValues[VarManager::kPt], binsCent, binsPt); - } else if ("kCentFT0A" == centType) { - modelIndex = o2::aod::dqmlcuts::getMlBinIndex(VarManager::fgValues[VarManager::kCentFT0A], VarManager::fgValues[VarManager::kPt], binsCent, binsPt); - } else if ("kCentFT0M" == centType) { - modelIndex = o2::aod::dqmlcuts::getMlBinIndex(VarManager::fgValues[VarManager::kCentFT0M], VarManager::fgValues[VarManager::kPt], binsCent, binsPt); - } else { - LOG(fatal) << "Unknown centrality estimation type: " << centType; - return; - } - - if (modelIndex < 0) { - LOG(info) << "Ml index is negative! This means that the centrality/pt is not in the range of the model bins."; - continue; - } + } + if constexpr ((TTrackFillMap & VarManager::ObjTypes::ReducedTrackBarrelPID) > 0) { + isSelectedBDT = false; + fOutputMlPsi2ee.clear(); + if (fConfigML.applyBDT) { + std::vector dqInputFeatures = fDQMlResponse.getInputFeatures(t1, t2, VarManager::fgValues); + + if (dqInputFeatures.empty()) { + LOG(fatal) << "Input features for ML selection are empty! Please check your configuration."; + return; + } - LOG(debug) << "Model index: " << modelIndex << ", pT: " << VarManager::fgValues[VarManager::kPt] << ", centrality (kCentFT0C): " << VarManager::fgValues[VarManager::kCentFT0C]; - isSelectedBDT = fDQMlResponse.isSelectedMl(dqInputFeatures, modelIndex, fOutputMlPsi2ee); - VarManager::FillBdtScore(fOutputMlPsi2ee); // TODO: check if this is needed or not + int modelIndex = -1; + const auto& binsCent = fDQMlResponse.getBinsCent(); + const auto& binsPt = fDQMlResponse.getBinsPt(); + const std::string& centType = fDQMlResponse.getCentType(); + + if ("kCentFT0C" == centType) { + modelIndex = o2::aod::dqmlcuts::getMlBinIndex(VarManager::fgValues[VarManager::kCentFT0C], VarManager::fgValues[VarManager::kPt], binsCent, binsPt); + } else if ("kCentFT0A" == centType) { + modelIndex = o2::aod::dqmlcuts::getMlBinIndex(VarManager::fgValues[VarManager::kCentFT0A], VarManager::fgValues[VarManager::kPt], binsCent, binsPt); + } else if ("kCentFT0M" == centType) { + modelIndex = o2::aod::dqmlcuts::getMlBinIndex(VarManager::fgValues[VarManager::kCentFT0M], VarManager::fgValues[VarManager::kPt], binsCent, binsPt); + } else { + LOG(fatal) << "Unknown centrality estimation type: " << centType; + return; } - if (fConfigML.applyBDT && !isSelectedBDT) + if (modelIndex < 0) { + LOG(debug) << "Ml index is negative! This means that the centrality/pt is not in the range of the model bins."; continue; - - if (fConfigOptions.flatTables.value) { - dielectronAllList(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], t1.sign() + t2.sign(), twoTrackFilter, dileptonMcDecision, - t1.pt(), t1.eta(), t1.phi(), t1.itsClusterMap(), t1.itsChi2NCl(), t1.tpcNClsCrossedRows(), t1.tpcNClsFound(), t1.tpcChi2NCl(), t1.dcaXY(), t1.dcaZ(), t1.tpcSignal(), t1.tpcNSigmaEl(), t1.tpcNSigmaPi(), t1.tpcNSigmaPr(), t1.beta(), t1.tofNSigmaEl(), t1.tofNSigmaPi(), t1.tofNSigmaPr(), - t2.pt(), t2.eta(), t2.phi(), t2.itsClusterMap(), t2.itsChi2NCl(), t2.tpcNClsCrossedRows(), t2.tpcNClsFound(), t2.tpcChi2NCl(), t2.dcaXY(), t2.dcaZ(), t2.tpcSignal(), t2.tpcNSigmaEl(), t2.tpcNSigmaPi(), t2.tpcNSigmaPr(), t2.beta(), t2.tofNSigmaEl(), t2.tofNSigmaPi(), t2.tofNSigmaPr(), - VarManager::fgValues[VarManager::kKFTrack0DCAxyz], VarManager::fgValues[VarManager::kKFTrack1DCAxyz], VarManager::fgValues[VarManager::kKFDCAxyzBetweenProngs], VarManager::fgValues[VarManager::kKFTrack0DCAxy], VarManager::fgValues[VarManager::kKFTrack1DCAxy], VarManager::fgValues[VarManager::kKFDCAxyBetweenProngs], - VarManager::fgValues[VarManager::kKFTrack0DeviationFromPV], VarManager::fgValues[VarManager::kKFTrack1DeviationFromPV], VarManager::fgValues[VarManager::kKFTrack0DeviationxyFromPV], VarManager::fgValues[VarManager::kKFTrack1DeviationxyFromPV], - VarManager::fgValues[VarManager::kKFMass], VarManager::fgValues[VarManager::kKFChi2OverNDFGeo], VarManager::fgValues[VarManager::kVertexingLxyz], VarManager::fgValues[VarManager::kVertexingLxyzOverErr], VarManager::fgValues[VarManager::kVertexingLxy], VarManager::fgValues[VarManager::kVertexingLxyOverErr], VarManager::fgValues[VarManager::kVertexingTauxy], VarManager::fgValues[VarManager::kVertexingTauxyErr], VarManager::fgValues[VarManager::kKFCosPA], VarManager::fgValues[VarManager::kKFJpsiDCAxyz], VarManager::fgValues[VarManager::kKFJpsiDCAxy], - VarManager::fgValues[VarManager::kKFPairDeviationFromPV], VarManager::fgValues[VarManager::kKFPairDeviationxyFromPV], - VarManager::fgValues[VarManager::kKFMassGeoTop], - VarManager::fgValues[VarManager::kKFChi2OverNDFGeoTop], VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingLzProjected], VarManager::fgValues[VarManager::kVertexingLxyProjected]); } + + LOG(debug) << "Model index: " << modelIndex << ", pT: " << VarManager::fgValues[VarManager::kPt] << ", centrality (kCentFT0C): " << VarManager::fgValues[VarManager::kCentFT0C]; + isSelectedBDT = fDQMlResponse.isSelectedMl(dqInputFeatures, modelIndex, fOutputMlPsi2ee); + VarManager::FillBdtScore(fOutputMlPsi2ee); + } + + if (fConfigML.applyBDT && !isSelectedBDT) + continue; + + if (fConfigOptions.flatTables.value) { + dielectronAllList(VarManager::fgValues[VarManager::kMass], VarManager::fgValues[VarManager::kPt], VarManager::fgValues[VarManager::kEta], VarManager::fgValues[VarManager::kPhi], t1.sign() + t2.sign(), twoTrackFilter, dileptonMcDecision, + t1.pt(), t1.eta(), t1.phi(), t1.itsClusterMap(), t1.itsChi2NCl(), t1.tpcNClsCrossedRows(), t1.tpcNClsFound(), t1.tpcChi2NCl(), t1.dcaXY(), t1.dcaZ(), t1.tpcSignal(), t1.tpcNSigmaEl(), t1.tpcNSigmaPi(), t1.tpcNSigmaPr(), t1.beta(), t1.tofNSigmaEl(), t1.tofNSigmaPi(), t1.tofNSigmaPr(), + t2.pt(), t2.eta(), t2.phi(), t2.itsClusterMap(), t2.itsChi2NCl(), t2.tpcNClsCrossedRows(), t2.tpcNClsFound(), t2.tpcChi2NCl(), t2.dcaXY(), t2.dcaZ(), t2.tpcSignal(), t2.tpcNSigmaEl(), t2.tpcNSigmaPi(), t2.tpcNSigmaPr(), t2.beta(), t2.tofNSigmaEl(), t2.tofNSigmaPi(), t2.tofNSigmaPr(), + VarManager::fgValues[VarManager::kKFTrack0DCAxyz], VarManager::fgValues[VarManager::kKFTrack1DCAxyz], VarManager::fgValues[VarManager::kKFDCAxyzBetweenProngs], VarManager::fgValues[VarManager::kKFTrack0DCAxy], VarManager::fgValues[VarManager::kKFTrack1DCAxy], VarManager::fgValues[VarManager::kKFDCAxyBetweenProngs], + VarManager::fgValues[VarManager::kKFTrack0DeviationFromPV], VarManager::fgValues[VarManager::kKFTrack1DeviationFromPV], VarManager::fgValues[VarManager::kKFTrack0DeviationxyFromPV], VarManager::fgValues[VarManager::kKFTrack1DeviationxyFromPV], + VarManager::fgValues[VarManager::kKFMass], VarManager::fgValues[VarManager::kKFChi2OverNDFGeo], VarManager::fgValues[VarManager::kVertexingLxyz], VarManager::fgValues[VarManager::kVertexingLxyzOverErr], VarManager::fgValues[VarManager::kVertexingLxy], VarManager::fgValues[VarManager::kVertexingLxyOverErr], VarManager::fgValues[VarManager::kVertexingTauxy], VarManager::fgValues[VarManager::kVertexingTauxyErr], VarManager::fgValues[VarManager::kKFCosPA], VarManager::fgValues[VarManager::kKFJpsiDCAxyz], VarManager::fgValues[VarManager::kKFJpsiDCAxy], + VarManager::fgValues[VarManager::kKFPairDeviationFromPV], VarManager::fgValues[VarManager::kKFPairDeviationxyFromPV], + VarManager::fgValues[VarManager::kKFMassGeoTop], + VarManager::fgValues[VarManager::kKFChi2OverNDFGeoTop], VarManager::fgValues[VarManager::kVertexingTauzProjected], VarManager::fgValues[VarManager::kVertexingTauxyProjected], VarManager::fgValues[VarManager::kVertexingLzProjected], VarManager::fgValues[VarManager::kVertexingLxyProjected]); + dielectronMlList(VarManager::fgValues[VarManager::kCentFT0C], + (fConfigML.applyBDT && fOutputMlPsi2ee.size() > 0) ? VarManager::fgValues[VarManager::kBdtBackground] : -999.f, + (fConfigML.applyBDT && fOutputMlPsi2ee.size() > 1) ? VarManager::fgValues[VarManager::kBdtPrompt] : -999.f, + (fConfigML.applyBDT && fOutputMlPsi2ee.size() > 2) ? VarManager::fgValues[VarManager::kBdtNonprompt] : -999.f); } } }