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