From 4d5fd0a61753fc6171c309b4f5160f0cf48e7217 Mon Sep 17 00:00:00 2001 From: David Kirchmeier <david.kirchmeier@cern.ch> Date: Tue, 8 Jan 2019 11:36:31 +0100 Subject: [PATCH] add support for RNN based tau ID --- .../TauAnalysisTools/Root/SelectionCuts.cxx | 53 +++++++++++++++++-- .../Root/TauEfficiencyCorrectionsTool.cxx | 21 +++++++- .../Root/TauSelectionTool.cxx | 44 +++++++++++++++ .../TauAnalysisTools/TauAnalysisTools/Enums.h | 6 ++- .../TauAnalysisTools/SelectionCuts.h | 10 ++++ .../TauAnalysisTools/TauSelectionTool.h | 11 +++- .../doc/README-TauSelectionTool.rst | 31 +++++++++++ 7 files changed, 169 insertions(+), 7 deletions(-) diff --git a/PhysicsAnalysis/TauID/TauAnalysisTools/Root/SelectionCuts.cxx b/PhysicsAnalysis/TauID/TauAnalysisTools/Root/SelectionCuts.cxx index 06f9fd9bebc1..33a3708f3b8a 100644 --- a/PhysicsAnalysis/TauID/TauAnalysisTools/Root/SelectionCuts.cxx +++ b/PhysicsAnalysis/TauID/TauAnalysisTools/Root/SelectionCuts.cxx @@ -303,6 +303,39 @@ bool SelectionCutBDTJetScoreSigTrans::accept(const xAOD::TauJet& xTau) return false; } +//___________________________SelectionCutRNNJetScoreSigTrans____________________________ +//______________________________________________________________________________ +SelectionCutRNNJetScoreSigTrans::SelectionCutRNNJetScoreSigTrans(TauSelectionTool* tTST) + : SelectionCut("CutJetRNNScoreSigTrans", tTST) +{ + m_hHistCutPre = CreateControlPlot("hJetRNNSigTrans_pre","JetRNNSigTrans_pre;RNNJetSigTransScore; events",100,0,1); + m_hHistCut = CreateControlPlot("hJetRNNSigTrans_cut","JetRNNSigTrans_cut;RNNJetSigTransScore; events",100,0,1); +} +//______________________________________________________________________________ +void SelectionCutRNNJetScoreSigTrans::fillHistogram(const xAOD::TauJet& xTau, TH1F& hHist) +{ + hHist.Fill(xTau.discriminant(xAOD::TauJetParameters::RNNJetScoreSigTrans)); +} +//______________________________________________________________________________ +bool SelectionCutRNNJetScoreSigTrans::accept(const xAOD::TauJet& xTau) +{ + // check JetRNNscore, if tau has a JetRNN score in one of the regions requiered then return true; false otherwise + m_tTST->m_aAccept.addCut( "JetRNNScoreSigTrans", + "Selection of taus according to their JetRNNScoreSigTrans" ); + double dJetRNNScoreSigTrans = xTau.discriminant(xAOD::TauJetParameters::RNNJetScoreSigTrans); + unsigned int iNumJetRNNSigTransRegion = m_tTST->m_vJetRNNSigTransRegion.size()/2; + for( unsigned int iJetRNNSigTransRegion = 0; iJetRNNSigTransRegion < iNumJetRNNSigTransRegion; iJetRNNSigTransRegion++ ) + { + if ( dJetRNNScoreSigTrans >= m_tTST->m_vJetRNNSigTransRegion.at(iJetRNNSigTransRegion*2) and dJetRNNScoreSigTrans <= m_tTST->m_vJetRNNSigTransRegion.at(iJetRNNSigTransRegion*2+1)) + { + m_tTST->m_aAccept.setCutResult( "JetRNNScoreSigTrans", true ); + return true; + } + } + m_tTST->msg() << MSG::VERBOSE << "Tau failed JetRNNScore requirement, tau JetRNNScore: " << dJetRNNScoreSigTrans << endmsg; + return false; +} + //_____________________________SelectionCutJetIDWP______________________________ //______________________________________________________________________________ SelectionCutJetIDWP::SelectionCutJetIDWP(TauSelectionTool* tTST) @@ -371,9 +404,6 @@ bool SelectionCutJetIDWP::accept(const xAOD::TauJet& xTau) case JETIDBDTNOTLOOSE: if (!xTau.isTau(xAOD::TauJetParameters::JetBDTSigLoose)) bPass = true; break; - default: - m_tTST->msg() << MSG::WARNING << "The jet ID working point with the enum "<<m_tTST->m_iJetIDWP<<" is not available" << endmsg; - break; case JETIDBDTVERYLOOSE: if (xTau.isTau(xAOD::TauJetParameters::JetBDTSigVeryLoose)) bPass = true; break; @@ -386,13 +416,28 @@ bool SelectionCutJetIDWP::accept(const xAOD::TauJet& xTau) case JETBDTBKGTIGHT: if (xTau.isTau(xAOD::TauJetParameters::JetBDTBkgTight)) bPass = true; break; + case JETIDRNNVERYLOOSE: + if (xTau.isTau(xAOD::TauJetParameters::JetRNNSigVeryLoose)) bPass = true; + break; + case JETIDRNNLOOSE: + if (xTau.isTau(xAOD::TauJetParameters::JetRNNSigLoose)) bPass = true; + break; + case JETIDRNNMEDIUM: + if (xTau.isTau(xAOD::TauJetParameters::JetRNNSigMedium)) bPass = true; + break; + case JETIDRNNTIGHT: + if (xTau.isTau(xAOD::TauJetParameters::JetRNNSigTight)) bPass = true; + break; + default: + m_tTST->msg() << MSG::WARNING << "The jet ID working point with the enum "<<m_tTST->m_iJetIDWP<<" is not available" << endmsg; + break; } if (bPass) { m_tTST->m_aAccept.setCutResult( "JetIDWP", true ); return true; } - m_tTST->msg() << MSG::VERBOSE << "Tau failed JetBDTWP requirement, tau JetBDTScore: " << xTau.discriminant(xAOD::TauJetParameters::BDTJetScore) << endmsg; + m_tTST->msg() << MSG::VERBOSE << "Tau failed JetBDTWP requirement, tau transformed BDT score: " << xTau.discriminant(xAOD::TauJetParameters::BDTJetScoreSigTrans) << endmsg; return false; } diff --git a/PhysicsAnalysis/TauID/TauAnalysisTools/Root/TauEfficiencyCorrectionsTool.cxx b/PhysicsAnalysis/TauID/TauAnalysisTools/Root/TauEfficiencyCorrectionsTool.cxx index 2953c3a86aa9..360511a6e9e8 100644 --- a/PhysicsAnalysis/TauID/TauAnalysisTools/Root/TauEfficiencyCorrectionsTool.cxx +++ b/PhysicsAnalysis/TauID/TauAnalysisTools/Root/TauEfficiencyCorrectionsTool.cxx @@ -491,12 +491,19 @@ StatusCode TauEfficiencyCorrectionsTool::initializeTools_2018_summer() if (m_sInputFilePathJetIDHadTau.empty()) m_sInputFilePathJetIDHadTau = sDirectory+"JetID_TrueHadTau_2018-summer.root"; if (m_sVarNameJetIDHadTau.length() == 0) m_sVarNameJetIDHadTau = "TauScaleFactorJetIDHadTau"; + std::string sJetIDWP = ConvertJetIDToString(m_iIDLevel); + if (sJetIDWP.empty()) + { + ATH_MSG_WARNING("Could not find valid ID working point. Skip ID efficiency corrections."); + continue; + } + asg::AnaToolHandle<ITauEfficiencyCorrectionsTool>* tTool = new asg::AnaToolHandle<ITauEfficiencyCorrectionsTool>("TauAnalysisTools::CommonEfficiencyTool/JetIDHadTauTool", this); m_vCommonEfficiencyTools.push_back(tTool); ATH_CHECK(tTool->setProperty("InputFilePath", m_sInputFilePathJetIDHadTau)); ATH_CHECK(tTool->setProperty("VarName", m_sVarNameJetIDHadTau)); ATH_CHECK(tTool->setProperty("SkipTruthMatchCheck", m_bSkipTruthMatchCheck)); - ATH_CHECK(tTool->setProperty("WP", ConvertJetIDToString(m_iIDLevel))); + ATH_CHECK(tTool->setProperty("WP", sJetIDWP)); } else if (iEfficiencyCorrectionType == SFEleOLRHadTau) { @@ -1606,6 +1613,18 @@ std::string TauEfficiencyCorrectionsTool::ConvertJetIDToString(const int& iLevel case JETIDBDTFAIL: return "jetbdtsig"; break; + case JETIDRNNVERYLOOSE: + ATH_MSG_WARNING("Very loose RNN working point passed. Efficiency corrections for RNN ID are not available yet."); + return ""; + case JETIDRNNLOOSE: + ATH_MSG_WARNING("Loose RNN working point passed. Efficiency corrections for RNN ID are not available yet."); + return ""; + case JETIDRNNMEDIUM: + ATH_MSG_WARNING("Medium RNN working point passed. Efficiency corrections for RNN ID are not available yet."); + return ""; + case JETIDRNNTIGHT: + ATH_MSG_WARNING("Tight RNN working point passed. Efficiency corrections for RNN ID are not available yet."); + return ""; default: assert(false && "No valid ID level passed. Breaking up ..."); break; diff --git a/PhysicsAnalysis/TauID/TauAnalysisTools/Root/TauSelectionTool.cxx b/PhysicsAnalysis/TauID/TauAnalysisTools/Root/TauSelectionTool.cxx index 91b9c42d4cb4..88d6fd8c78c8 100644 --- a/PhysicsAnalysis/TauID/TauAnalysisTools/Root/TauSelectionTool.cxx +++ b/PhysicsAnalysis/TauID/TauAnalysisTools/Root/TauSelectionTool.cxx @@ -55,6 +55,9 @@ TauSelectionTool::TauSelectionTool( const std::string& name ) declareProperty( "JetBDTSigTransRegion", m_vJetBDTSigTransRegion = {}); declareProperty( "JetBDTSigTransMin", m_dJetBDTSigTransMin = NAN); declareProperty( "JetBDTSigTransMax", m_dJetBDTSigTransMax = NAN); + declareProperty( "JetRNNSigTransRegion", m_vJetRNNSigTransRegion = {}); + declareProperty( "JetRNNSigTransMin", m_dJetRNNSigTransMin = NAN); + declareProperty( "JetRNNSigTransMax", m_dJetRNNSigTransMax = NAN); declareProperty( "JetIDWP", m_iJetIDWP = 0); declareProperty( "EleBDTRegion", m_vEleBDTRegion = {}); declareProperty( "EleBDTMin", m_dEleBDTMin = NAN); @@ -105,6 +108,9 @@ StatusCode TauSelectionTool::initialize() if (!bConfigViaProperties and !m_vJetBDTSigTransRegion.empty()) bConfigViaProperties = true; if (!bConfigViaProperties and m_dJetBDTSigTransMin == m_dJetBDTSigTransMin) bConfigViaProperties = true; if (!bConfigViaProperties and m_dJetBDTSigTransMax == m_dJetBDTSigTransMax) bConfigViaProperties = true; + if (!bConfigViaProperties and !m_vJetRNNSigTransRegion.empty()) bConfigViaProperties = true; + if (!bConfigViaProperties and m_dJetRNNSigTransMin == m_dJetRNNSigTransMin) bConfigViaProperties = true; + if (!bConfigViaProperties and m_dJetRNNSigTransMax == m_dJetRNNSigTransMax) bConfigViaProperties = true; if (!bConfigViaProperties and m_iJetIDWP != 0) bConfigViaProperties = true; if (!bConfigViaProperties and !m_vEleBDTRegion.empty()) bConfigViaProperties = true; if (!bConfigViaProperties and m_dEleBDTMin == m_dEleBDTMin) bConfigViaProperties = true; @@ -252,6 +258,24 @@ StatusCode TauSelectionTool::initialize() if (m_dJetBDTSigTransMax != m_dJetBDTSigTransMax) m_dJetBDTSigTransMax = rEnv.GetValue("JetBDTSigTransMax",NAN); } + else if (sCut == "JetRNNSigTransRegion") + { + iSelectionCuts = iSelectionCuts | CutJetRNNScoreSigTrans; + if (m_vJetRNNSigTransRegion.size() == 0) + TauAnalysisTools::split(rEnv,"JetRNNSigTransRegion", ';', m_vJetRNNSigTransRegion); + } + else if (sCut == "JetRNNSigTransMin") + { + iSelectionCuts = iSelectionCuts | CutJetRNNScoreSigTrans; + if (m_dJetRNNSigTransMin != m_dJetRNNSigTransMin) + m_dJetRNNSigTransMin = rEnv.GetValue("JetRNNSigTransMin",NAN); + } + else if (sCut == "JetRNNSigTransMax") + { + iSelectionCuts = iSelectionCuts | CutJetRNNScoreSigTrans; + if (m_dJetRNNSigTransMax != m_dJetRNNSigTransMax) + m_dJetRNNSigTransMax = rEnv.GetValue("JetRNNSigTransMax",NAN); + } else if (sCut == "EleBDTRegion") { iSelectionCuts = iSelectionCuts | CutEleBDTScore; @@ -316,6 +340,7 @@ StatusCode TauSelectionTool::initialize() {CutNTrack, new TauAnalysisTools::SelectionCutNTracks(this)}, {CutJetBDTScore, new TauAnalysisTools::SelectionCutBDTJetScore(this)}, {CutJetBDTScoreSigTrans, new TauAnalysisTools::SelectionCutBDTJetScoreSigTrans(this)}, + {CutJetRNNScoreSigTrans, new TauAnalysisTools::SelectionCutRNNJetScoreSigTrans(this)}, {CutJetIDWP, new TauAnalysisTools::SelectionCutJetIDWP(this)}, {CutEleBDTScore, new TauAnalysisTools::SelectionCutBDTEleScore(this)}, {CutEleBDTWP, new TauAnalysisTools::SelectionCutEleBDTWP(this)}, @@ -329,6 +354,7 @@ StatusCode TauSelectionTool::initialize() FillRegionVector(m_vAbsEtaRegion, m_dAbsEtaMin, m_dAbsEtaMax); FillRegionVector(m_vJetBDTRegion, m_dJetBDTMin, m_dJetBDTMax ); FillRegionVector(m_vJetBDTSigTransRegion, m_dJetBDTSigTransMin, m_dJetBDTSigTransMax ); + FillRegionVector(m_vJetRNNSigTransRegion, m_dJetRNNSigTransMin, m_dJetRNNSigTransMax ); FillRegionVector(m_vEleBDTRegion, m_dEleBDTMin, m_dEleBDTMax ); FillValueVector(m_vAbsCharges, m_iAbsCharge ); FillValueVector(m_vNTracks, m_iNTrack ); @@ -342,6 +368,7 @@ StatusCode TauSelectionTool::initialize() PrintConfigValue ("NTrack", m_vNTracks); PrintConfigRegion ("BDTJetScore", m_vJetBDTRegion); PrintConfigRegion ("BDTJetScoreSigTrans", m_vJetBDTSigTransRegion); + PrintConfigRegion ("RNNJetScoreSigTrans", m_vJetRNNSigTransRegion); PrintConfigRegion ("BDTEleScore", m_vEleBDTRegion); PrintConfigValue ("JetIDWP", m_sJetIDWP); PrintConfigValue ("JetIDWP ENUM",m_iJetIDWP); @@ -363,6 +390,7 @@ StatusCode TauSelectionTool::initialize() ATH_MSG_WARNING("https://gitlab.cern.ch/atlas/athena/blob/21.2/PhysicsAnalysis/TauID/TauAnalysisTools/doc/README-TauSelectionTool.rst"); } if (m_iSelectionCuts & CutJetBDTScoreSigTrans) sCuts+= "JetBDTScoreSigTrans "; + if (m_iSelectionCuts & CutJetRNNScoreSigTrans) sCuts+= "JetRNNScoreSigTrans "; if (m_iSelectionCuts & CutJetIDWP) sCuts+= "JetIDWP "; if (m_iSelectionCuts & CutEleBDTScore) sCuts+= "EleBDTScore "; if (m_iSelectionCuts & CutEleBDTWP) sCuts+= "EleBDTWP "; @@ -594,6 +622,10 @@ int TauSelectionTool::convertStrToJetIDWP(std::string sJetIDWP) else if (sJetIDWP == "JETBDTBKGLOOSE") return int(JETBDTBKGLOOSE); // new in rel21 else if (sJetIDWP == "JETBDTBKGMEDIUM") return int(JETBDTBKGMEDIUM); // new in rel21 else if (sJetIDWP == "JETBDTBKGTIGHT") return int(JETBDTBKGTIGHT); // new in rel21 + else if (sJetIDWP == "JETIDRNNVERYLOOSE") return int(JETIDRNNVERYLOOSE); + else if (sJetIDWP == "JETIDRNNLOOSE") return int(JETIDRNNLOOSE); + else if (sJetIDWP == "JETIDRNNMEDIUM") return int(JETIDRNNMEDIUM); + else if (sJetIDWP == "JETIDRNNTIGHT") return int(JETIDRNNTIGHT); ATH_MSG_ERROR( "jet ID working point "<<sJetIDWP<<" is unknown, the cut JETIDWP will not accept any tau!" ); return -1; @@ -655,6 +687,18 @@ std::string TauSelectionTool::convertJetIDWPToStr(int iJetIDWP) case JETBDTBKGTIGHT: return "JETBDTBKGTIGHT"; break; + case JETIDRNNVERYLOOSE: + return "JETIDRNNVERYLOOSE"; + break; + case JETIDRNNLOOSE: + return "JETIDRNNLOOSE"; + break; + case JETIDRNNMEDIUM: + return "JETIDRNNMEDIUM"; + break; + case JETIDRNNTIGHT: + return "JETIDRNNTIGHT"; + break; default: ATH_MSG_ERROR( "jet ID working point with enum "<<iJetIDWP<<" is unknown, the cut JETIDWP will not accept any tau!" ); break; diff --git a/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h b/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h index aca2f3603df9..a8d852ad5d26 100644 --- a/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h +++ b/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/Enums.h @@ -37,7 +37,11 @@ typedef enum e_JETID JETIDBDTVERYLOOSE = 15, JETBDTBKGLOOSE = 16, JETBDTBKGMEDIUM = 17, - JETBDTBKGTIGHT = 18 + JETBDTBKGTIGHT = 18, + JETIDRNNVERYLOOSE = 19, + JETIDRNNLOOSE = 20, + JETIDRNNMEDIUM = 21, + JETIDRNNTIGHT = 22 } JETID; typedef enum e_ELEID diff --git a/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/SelectionCuts.h b/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/SelectionCuts.h index b11072afc359..79bec2324351 100644 --- a/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/SelectionCuts.h +++ b/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/SelectionCuts.h @@ -128,6 +128,16 @@ private: void fillHistogram(const xAOD::TauJet& xTau, TH1F& hHist); }; +class SelectionCutRNNJetScoreSigTrans + : public SelectionCut +{ +public: + SelectionCutRNNJetScoreSigTrans(TauSelectionTool* tTST); + bool accept(const xAOD::TauJet& xTau); +private: + void fillHistogram(const xAOD::TauJet& xTau, TH1F& hHist); +}; + class SelectionCutJetIDWP : public SelectionCut { diff --git a/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/TauSelectionTool.h b/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/TauSelectionTool.h index 6140a380a775..bcb3c77228a4 100644 --- a/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/TauSelectionTool.h +++ b/PhysicsAnalysis/TauID/TauAnalysisTools/TauAnalysisTools/TauSelectionTool.h @@ -40,7 +40,9 @@ class SelectionCutAbsEta; class SelectionCutAbsCharge; class SelectionCutNTracks; class SelectionCutBDTJetScore; +class SelectionCutBDTJetScoreSigTrans; class SelectionCutJetIDWP; +class SelectionCutRNNJetScoreSigTrans; class SelectionCutBDTEleScore; class SelectionCutEleBDTWP; class SelectionCutEleOLR; @@ -62,7 +64,8 @@ enum SelectionCuts CutMuonVeto = 1<<9, // 001000000000 CutEleOLR = 1<<10, // 010000000000 CutMuonOLR = 1<<11, // 100000000000 - CutJetBDTScoreSigTrans = 1<<12 // 1000000000000 + CutJetBDTScoreSigTrans = 1<<12, // 1000000000000 + CutJetRNNScoreSigTrans = 1<<13 // 10000000000000 }; class TauSelectionTool : public virtual IAsgSelectionTool, @@ -78,7 +81,9 @@ class TauSelectionTool : public virtual IAsgSelectionTool, friend class SelectionCutNTracks; friend class SelectionCutBDTJetScore; friend class SelectionCutBDTJetScoreSigTrans; + friend class SelectionCutRNNJetScoreSigTrans; friend class SelectionCutJetIDWP; + friend class SelectionCutRNNJetScoreSigTrans; friend class SelectionCutBDTEleScore; friend class SelectionCutEleBDTWP; friend class SelectionCutEleOLR; @@ -150,6 +155,8 @@ private: std::vector<float> m_vJetBDTRegion; // vector of JetBDTSigTrans cut regions std::vector<float> m_vJetBDTSigTransRegion; + // vector of JetRNNSigTrans cut regions + std::vector<float> m_vJetRNNSigTransRegion; // JetID working point std::string m_sJetIDWP; int m_iJetIDWP; @@ -178,6 +185,8 @@ private: float m_dJetBDTMax; float m_dJetBDTSigTransMin; float m_dJetBDTSigTransMax; + float m_dJetRNNSigTransMin; + float m_dJetRNNSigTransMax; float m_dEleBDTMin; float m_dEleBDTMax; diff --git a/PhysicsAnalysis/TauID/TauAnalysisTools/doc/README-TauSelectionTool.rst b/PhysicsAnalysis/TauID/TauAnalysisTools/doc/README-TauSelectionTool.rst index 2785dcfb8d2c..3cec7fa8b1a4 100644 --- a/PhysicsAnalysis/TauID/TauAnalysisTools/doc/README-TauSelectionTool.rst +++ b/PhysicsAnalysis/TauID/TauAnalysisTools/doc/README-TauSelectionTool.rst @@ -144,6 +144,24 @@ setup: - accepting taus with a jet BDT score below an upper bound - if ``JetBDTMax`` is configured, ``JetBDTRegion`` configuration wont be considered. ``JetBDTSigTrans`` is a transformed BDT score and provides flat ID efficiencies with respect to pT and pile-up. + * - ``CutJetRNNScoreSigTrans`` + - ``JetRNNSigTransRegion`` + - ``std::vector<double>`` + - accepting taus within jet RNN score regions, each `odd` in the vector is a lower bound, each `even` is an upper bound + - ``JetRNNSigTrans`` is a transformed RNN score and provides flat ID efficiencies with respect to pT and pile-up. + + * - + - ``JetRNNSigTransMin`` + - ``double`` + - accepting taus with a jet RNN score above a lower bound + - if ``JetRNNMin`` is configured, ``JetRNNRegion`` configuration wont be considered. ``JetRNNSigTrans`` is a transformed RNN score and provides flat ID efficiencies with respect to pT and pile-up. + + * - + - ``JetRNNSigTransMax`` + - ``double`` + - accepting taus with a jet RNN score below an upper bound + - if ``JetRNNMax`` is configured, ``JetRNNRegion`` configuration wont be considered. ``JetRNNSigTrans`` is a transformed RNN score and provides flat ID efficiencies with respect to pT and pile-up. + * - ``CutJetIDWP`` - ``JetIDWP`` - ``int`` @@ -236,6 +254,19 @@ Currently implemented working points for ``CutJetIDWP`` are: * - JETBDTBKGTIGHT - tight background working point + * - JETIDRNNVERYLOOSE + - passing RNN very loose working point, ID efficiency 95% + + * - JETIDRNNLOOSE + - passing RNN loose working point, ID efficiency 85% (75%) for 1-prong (3-prong) + + * - JETIDRNNMEDIUM + - passing RNN medium working point, ID efficiency 75% (60%) for 1-prong (3-prong) + + * - JETIDRNNTIGHT + - passing RNN tight working point, ID efficiency 60% (45%) for 1-prong (3-prong) + + and for ``CutEleBDTWP``: .. list-table:: -- GitLab