From fd445cb2b0cc8095745d3960da951f4e1d6c4bcf Mon Sep 17 00:00:00 2001
From: Tatiana Ovsiannikova <tatiana.ovsiannikova@cern.ch>
Date: Wed, 29 May 2024 14:03:20 +0200
Subject: [PATCH] separate pileup removal algo from calratiovar
 ATR-28412,ATR-22696

separate pileup removal algo from calratiovar ATR-28412,ATR-22696
---
 .../python/ConditionDefaults.py               |   2 +
 .../python/FastReductionAlgToolFactory.py     |   1 +
 .../TrigHLTJetHypo/python/scenario_simple.py  |  13 ++-
 .../src/PileupRemovalCondition.cxx            | 110 ++++++++++++++++++
 .../src/PileupRemovalCondition.h              |  47 ++++++++
 .../TrigHLTJetHypo/src/TrigJetCRHypoTool.cxx  |   2 +-
 .../src/TrigJetCRVARHypoTool.cxx              |   2 +-
 .../src/TrigJetConditionConfig_pileuprm.cxx   |  43 +++++++
 .../src/TrigJetConditionConfig_pileuprm.h     |  35 ++++++
 .../src/components/TrigHLTJetHypo_entries.cxx |   2 +
 .../share/ref_RDOtoRDOTrig_v1Dev_build.ref    |   6 +
 .../share/ref_v1Dev_decodeBS_build.ref        |   2 +
 .../python/HLT/Menu/Dev_pp_run3_v1.py         |   4 +-
 .../python/HLT/Menu/SignatureDicts.py         |   5 +-
 14 files changed, 266 insertions(+), 8 deletions(-)
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/PileupRemovalCondition.cxx
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/PileupRemovalCondition.h
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_pileuprm.cxx
 create mode 100644 Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_pileuprm.h

diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionDefaults.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionDefaults.py
index 2449df970403..a1a0dc8e1296 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionDefaults.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ConditionDefaults.py
@@ -37,6 +37,7 @@ class ConditionDefaults:
             'bsel': {'min': '-inf', 'max': 'inf'},
             'tausel': {'min': '-inf', 'max': 'inf'},
             'clrsel': {'min': '-inf', 'max': 'inf'},
+            'pileuprm': {'min': '-inf', 'max': 'inf'},
             'momCuts': {'min': '-inf', 'max': 'inf'},
             'timing': {'min': '0', 'max': 'inf'},
             'timeSig': {'min': '0', 'max': 'inf'},       
@@ -61,6 +62,7 @@ class ConditionDefaults:
             'smc': 1000.,
             'jvt': 0.01,
             'clrsel': 0.01,
+            'pileuprm': 0.01,
             'momCuts': 0.01,
             'timing': 1.0,
             'timeSig': 1.0,
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/FastReductionAlgToolFactory.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/FastReductionAlgToolFactory.py
index 76c486d244b7..b7c287d22f00 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/FastReductionAlgToolFactory.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/FastReductionAlgToolFactory.py
@@ -55,6 +55,7 @@ class FastReductionAlgToolFactory:
             'bsel': [CompFactory.TrigJetConditionConfig_bdips, 0],
             'tausel': [CompFactory.TrigJetConditionConfig_gntau, 0],
             'clrsel': [CompFactory.TrigJetConditionConfig_emf, 0],
+            'pileuprm': [CompFactory.TrigJetConditionConfig_pileuprm, 0],
             'clean': [CompFactory.TrigJetConditionConfig_clean, 0],
             'all': [CompFactory.TrigJetConditionConfig_acceptAll, 0],
             'timing': [CompFactory.TrigJetConditionConfig_timing, 0],
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/scenario_simple.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/scenario_simple.py
index a3b7bb3a8440..c54a114e8a0d 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/scenario_simple.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/scenario_simple.py
@@ -9,7 +9,7 @@ from TrigHLTJetHypo.make_treevec import make_treevec
 # make a list of all possible cut items for the simple scenario
 all_elemental_keys = ('etaRange', 'jvt', 'smc',
                       'threshold', 'momCuts', 'bsel', 'tausel',
-                      'clrsel', 'timing', 'timeSig')
+                      'clrsel','pileuprm', 'timing', 'timeSig')
 
 # Extract moment cuts
 def _cuts_from_momCuts(momCuts):
@@ -83,7 +83,6 @@ def get_condition_args_from_chainpart(cp):
             lo   = values[0]
             vals = defaults(key, lo=lo)
             condargs.append((key, vals))
-
         if k == 'bsel':
             if 'bgnone' in v:
                 key = 'bgnone'
@@ -260,7 +259,15 @@ def get_condition_args_from_chainpart(cp):
                         vals   = defaults(k, lo=lo, hi=hi)
                         vals["moment"] = jetMoments[moment]
                         condargs.append((key, vals))
-
+        if k =='pileuprm':
+            key    = 'pileuprm'
+            values = v.split(key)
+            if "n" in values[0]:
+                 lo=values[0].replace("n","-",1)
+            if "n" in values[1]:
+                 hi=values[1].replace("n","-",1) 
+            vals =  defaults(key, lo=lo, hi=hi)
+            condargs.append((key, vals))
     return condargs
 
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/PileupRemovalCondition.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/PileupRemovalCondition.cxx
new file mode 100644
index 000000000000..0591ed12961c
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/PileupRemovalCondition.cxx
@@ -0,0 +1,110 @@
+/*
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+*/
+#
+#include "./PileupRemovalCondition.h"
+#include "./ITrigJetHypoInfoCollector.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJet.h"
+#include "xAODCaloEvent/CaloCluster.h"
+#include "CaloEvent/CaloClusterContainer.h"
+#include <sstream>
+#include <cmath>
+#include <TLorentzVector.h>
+#include "CxxUtils/fpcompare.h"
+#include "CxxUtils/phihelper.h"
+#include "FourMomUtils/xAODP4Helpers.h"
+
+PileupRemovalCondition::PileupRemovalCondition(double mMin,double mMax) :
+m_min(mMin), m_max(mMax)  {
+}
+
+bool PileupRemovalCondition::isSatisfied(const pHypoJet& ip,
+				const std::unique_ptr<ITrigJetHypoInfoCollector>& collector) const {
+  float jetEMF = -999;
+  double LR=-1;
+  ip->getAttribute("EMFrac",jetEMF);
+  if (CxxUtils::fpcompare::less_equal (double(jetEMF),0))LR=-999; 
+  if(CxxUtils::fpcompare::greater_equal(double(jetEMF),1.)) LR=-999;
+  else  LR= log10(double(1./jetEMF - 1.));
+  bool pass = LR > m_max;
+  // Recalculating the LR only if it's not satisfied the LR>m_max criteria
+  if (!pass){
+     auto jetPhi= ip->phi();
+     auto jetEta= ip->eta();
+     // Recaulculate LR removing pileup clusters contribution if LR passes the m_min cut
+     if(  LR > m_min  ) {
+        size_t nClusters =  (*ip->xAODJet())->numConstituents();
+        double clusterPU_sumEEM = 0; double clusterPU_sumE = 0;
+        for (size_t clust = 0; clust < nClusters; clust++) {
+           const xAOD::CaloCluster * aCluster = dynamic_cast<const xAOD::CaloCluster*> ((*ip->xAODJet())->rawConstituent(clust));
+           double clusEEM = 0;
+           clusEEM+=(aCluster)->eSample(CaloSampling::EMB1);
+           clusEEM+=(aCluster)->eSample(CaloSampling::EMB2);
+           clusEEM+=(aCluster)->eSample(CaloSampling::EMB3);
+           clusEEM+=(aCluster)->eSample(CaloSampling::EME1);
+           clusEEM+=(aCluster)->eSample(CaloSampling::EME2);
+           clusEEM+=(aCluster)->eSample(CaloSampling::EME3);
+           clusEEM+=(aCluster)->eSample(CaloSampling::FCAL1);
+           double lambda = aCluster->getMomentValue(xAOD::CaloCluster::CENTER_LAMBDA);
+
+           if (lambda > 500) continue;
+           double d_eta = aCluster->rawEta() - jetEta;
+           double d_phi = xAOD::P4Helpers::deltaPhi(aCluster->rawPhi(),jetPhi);
+           double d_R2 = d_eta*d_eta + d_phi*d_phi;
+
+           if (d_R2 < 0.15*0.15) continue;
+           clusterPU_sumEEM+=clusEEM/1000.;
+           clusterPU_sumE+=aCluster->rawE()/1000.;
+         }
+         double jetEEM_EMscale = 0; double jetE_EMscale = 0;  //Working on EM scale because calE() doesn't always return correct EEM and cluster moment EMF not accessable during testing
+         std::vector<double> samplingEnergy =  (*ip->xAODJet())->getAttribute<std::vector<double> >("EnergyPerSampling");  
+
+         for(size_t s=0; s<samplingEnergy.size(); s++) {
+           double samplingE = 0.001*(samplingEnergy.at(s));
+           if ( s < 8 || (s > 20 && s < 28) ) jetEEM_EMscale+=samplingE; // EM layers 0-7 and 21-27
+           jetE_EMscale+=samplingE; 
+         }
+         jetEMF = (jetEEM_EMscale - clusterPU_sumEEM)/(jetE_EMscale - clusterPU_sumE);
+         if (CxxUtils::fpcompare::less_equal (double(jetEMF),0)) LR = -999.;
+         if(CxxUtils::fpcompare::greater_equal(double(jetEMF),1.0)) LR = -999.;
+         else LR = log10(double(1./jetEMF - 1.));
+         pass=LR>m_max;
+    }
+  }
+  if(collector){
+    const void* address = static_cast<const void*>(this);
+
+    std::stringstream ss0;
+    ss0 << "PileupRemovalCondition: (" << address << ") " 
+        << " LR desired cut, LR necessary cut to start pileup removal algo " <<m_max<<","<<m_min
+        << " pass: "  << std::boolalpha << pass << '\n';
+
+    auto j_addr = static_cast<const void*>(ip.get());
+    std::stringstream ss1;
+    ss1 <<  "     jet : ("<< j_addr << ")"
+        " LR desired cut, LR necessary cut to start pileup removal algo " <<m_max<<","<<m_min<< '\n';
+    
+    collector->collect(ss0.str(), ss1.str());
+
+  }
+  return pass;
+}
+
+
+bool 
+PileupRemovalCondition::isSatisfied(const HypoJetVector& ips,
+			   const std::unique_ptr<ITrigJetHypoInfoCollector>& c) const {
+  auto result =  isSatisfied(ips[0], c);
+  return result;
+}
+
+
+std::string PileupRemovalCondition::toString() const {
+  std::stringstream ss;
+  ss << "PileupRemovalCondition (" << this << ") "
+     << " LR thresh, LRcorr thresh "
+     <<m_max<<","<<m_min
+     <<'\n';
+
+  return ss.str();
+}
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/PileupRemovalCondition.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/PileupRemovalCondition.h
new file mode 100644
index 000000000000..ed597c401ce6
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/PileupRemovalCondition.h
@@ -0,0 +1,47 @@
+/*
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGHLTJETHYPO_PILEUPREMOVALCONDITION_H
+#define TRIGHLTJETHYPO_PILEUPREMOVALCONDITION_H
+
+/********************************************************************
+ *
+ * NAME:     PileupRemovalCondition.h
+ * PACKAGE:  Trigger/TrigHypothesis/TrigHLTJetHypo
+ *
+ * AUTHOR:    Rachel Christine Rosten
+ *********************************************************************/
+
+#include <string>
+#include "./ICondition.h"
+
+namespace HypoJet{
+  class IJet;
+}
+
+class ITrigJetHypoInfoCollector;
+
+class PileupRemovalCondition: public ICondition{
+ public:
+  PileupRemovalCondition(double mMin, double mMax);
+  
+  bool isSatisfied(const HypoJetVector&,
+                   const std::unique_ptr<ITrigJetHypoInfoCollector>&) const override;
+
+  virtual unsigned int capacity() const override{return s_capacity;}
+
+
+  std::string toString() const override;
+ private:
+  
+  double m_min;
+  double m_max;
+  bool isSatisfied(const pHypoJet&,
+                   const std::unique_ptr<ITrigJetHypoInfoCollector>&) const;
+  
+  const static  unsigned int s_capacity{1};
+  
+};
+
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetCRHypoTool.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetCRHypoTool.cxx
index cc023715c4b4..e4aab4f51de0 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetCRHypoTool.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetCRHypoTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetCRVARHypoTool.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetCRVARHypoTool.cxx
index ce87865b6a76..58590aa100a2 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetCRVARHypoTool.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetCRVARHypoTool.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_pileuprm.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_pileuprm.cxx
new file mode 100644
index 000000000000..c9261a776e85
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_pileuprm.cxx
@@ -0,0 +1,43 @@
+/*
+  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
+*/
+
+/*
+  Instantiator for PT Condition
+ */
+#include "TrigJetConditionConfig_pileuprm.h"
+#include "GaudiKernel/StatusCode.h"
+#include "./PileupRemovalCondition.h"
+#include "./ArgStrToDouble.h"
+
+
+TrigJetConditionConfig_pileuprm::TrigJetConditionConfig_pileuprm(const std::string& type,
+						     const std::string& name,
+						     const IInterface* parent) :
+  base_class(type, name, parent){
+  
+}
+
+
+StatusCode TrigJetConditionConfig_pileuprm::initialize() {
+  return StatusCode::SUCCESS;
+}
+
+
+Condition TrigJetConditionConfig_pileuprm::getCondition() const {
+  auto a2d = ArgStrToDouble();
+ 
+  return std::make_unique<PileupRemovalCondition>(a2d(m_min),
+               a2d(m_max));
+}
+				     
+
+StatusCode TrigJetConditionConfig_pileuprm::checkVals() const {
+  auto a2d = ArgStrToDouble();
+  if (a2d(m_min) > a2d(m_max)){
+    ATH_MSG_ERROR(" min LogR cut >  max LogR cut");
+    return StatusCode::FAILURE;
+  }
+
+  return StatusCode::SUCCESS;
+}
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_pileuprm.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_pileuprm.h
new file mode 100644
index 000000000000..2941680da063
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetConditionConfig_pileuprm.h
@@ -0,0 +1,35 @@
+/*
+  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGJETCONDITIONCONFIG_PILEUPRM_H
+#define TRIGJETCONDITIONCONFIG_PILEUPRM_H
+
+#include "ITrigJetConditionConfig.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "./ConditionsDefs.h"
+
+class TrigJetConditionConfig_pileuprm:
+public extends<AthAlgTool, ITrigJetConditionConfig> {
+
+ public:
+  
+  TrigJetConditionConfig_pileuprm(const std::string& type,
+                          const std::string& name,
+                          const IInterface* parent);
+
+  virtual StatusCode initialize() override;
+  virtual Condition getCondition() const override;
+
+ private:
+  
+  Gaudi::Property<std::string>
+    m_min{this, "min", {}, "single jet max EMF"};
+  
+  Gaudi::Property<std::string>
+    m_max{this, "max", {}, "single jet max EMF before pileupremoval"};
+  
+  StatusCode checkVals()  const;
+ 
+};
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx
index cf79a979436f..0b03896a1b3e 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx
@@ -31,6 +31,7 @@
 #include "../TrigJetConditionConfig_repeated.h"
 #include "../TrigJetConditionConfig_timing.h"
 #include "../TrigJetConditionConfig_timesig.h"
+#include "../TrigJetConditionConfig_pileuprm.h"
 
 //
 #include "../TrigJetHypoTool.h"
@@ -72,6 +73,7 @@ DECLARE_COMPONENT(TrigJetConditionConfig_acceptAll)
 DECLARE_COMPONENT(TrigJetConditionConfig_moment)
 DECLARE_COMPONENT(TrigJetConditionConfig_repeated)
 DECLARE_COMPONENT(TrigJetConditionConfig_qjet_mass)
+DECLARE_COMPONENT(TrigJetConditionConfig_pileuprm)
 
 DECLARE_COMPONENT(TrigJetHypoAlg)
 DECLARE_COMPONENT(TrigJetHypoTool)
diff --git a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
index eb6012597e40..3fbd03f5ecff 100644
--- a/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
+++ b/Trigger/TrigValidation/TrigAnalysisTest/share/ref_RDOtoRDOTrig_v1Dev_build.ref
@@ -14888,6 +14888,12 @@ HLT_j20_calratiovar_roiftf_preselj20emf24_L1LLPDPHI-jXE40-jJ40:
   stepFeatures:
     0: 3
     1: 21
+HLT_j20_n041pileuprmn015_j70_j50a_j0_DJMASS900j50dphi260x200deta_L1MJJ-500-NFF:
+  eventCount: 1
+  stepCounts:
+    0: 1
+  stepFeatures:
+    0: 24
 HLT_j20_pf_ftf_presel4j85_PhysicsTLA_L13J50:
   eventCount: 1
   stepCounts:
diff --git a/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref b/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref
index 6b166b450ea5..3e6a52f6cf8e 100644
--- a/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref
+++ b/Trigger/TrigValidation/TrigP1Test/share/ref_v1Dev_decodeBS_build.ref
@@ -8885,6 +8885,8 @@ HLT_j20_calratiovar_j70_j50a_j0_DJMASS900j50dphi260x200deta_roiftf_preselj20emf7
   eventCount: 0
 HLT_j20_calratiovar_roiftf_preselj20emf24_L1LLPDPHI-jXE40-jJ40:
   eventCount: 0
+HLT_j20_n041pileuprmn015_j70_j50a_j0_DJMASS900j50dphi260x200deta_L1MJJ-500-NFF:
+  eventCount: 0
 HLT_j20_pf_ftf_presel4j85_PhysicsTLA_L13J50:
   eventCount: 0
 HLT_j20_pf_ftf_presel5j50_PhysicsTLA_L14J15:
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py
index 7efb131f69c9..6f5032e17dba 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/Dev_pp_run3_v1.py
@@ -268,12 +268,12 @@ def getDevSignatures():
         ChainProp(name='HLT_j70_j50a_j0_DJMASS900j50x200deta_L1MJJ-500-NFF', l1SeedThresholds=['FSNOSEED']*3,stream=['VBFDelayed'],groups=PrimaryLegGroup+MultiJetGroup+LegacyTopoGroup), # previously HLT_j70_j50_0eta490_invm1000j70_deta20_L1MJJ-500-NFF
         ChainProp(name='HLT_j50_j30a_j0_DJMASS1000j30dphi260x200deta_L1MJJ-500-NFF', l1SeedThresholds=['FSNOSEED']*3,stream=['VBFDelayed'],groups=PrimaryLegGroup+MultiJetGroup+LegacyTopoGroup), # previously HLT_j50_j30_0eta490_invm1000j70_dphi26_deta20_L1MJJ-500-NFF
         ChainProp(name='HLT_j50_j30a_j0_DJMASS900j30dphi260x200deta_L1MJJ-500-NFF', l1SeedThresholds=['FSNOSEED']*3,stream=['VBFDelayed'],groups=PrimaryLegGroup+MultiJetGroup+LegacyTopoGroup), # previously HLT_j50_j30_0eta490_invm1000j70_dphi26_deta20_L1MJJ-500-NFF       
-
+ 
         # ATR-28412 test caloratio with VBF
         ChainProp(name='HLT_j20_calratiovar_j70_j50a_j0_DJMASS900j50dphi260x200deta_roiftf_preselj20emf48_L1MJJ-500-NFF', l1SeedThresholds=['FSNOSEED']*4,stream=['VBFDelayed'],groups=PrimaryLegGroup+MultiJetGroup+LegacyTopoGroup),
         ChainProp(name='HLT_j20_calratiovar82_j70_j50a_j0_DJMASS900j50dphi260x200deta_roiftf_preselj20emf60_L1MJJ-500-NFF', l1SeedThresholds=['FSNOSEED']*4,stream=['VBFDelayed'],groups=PrimaryLegGroup+MultiJetGroup+LegacyTopoGroup),
         ChainProp(name='HLT_j20_calratiovar103_j70_j50a_j0_DJMASS900j50dphi260x200deta_roiftf_preselj20emf48_L1MJJ-500-NFF', l1SeedThresholds=['FSNOSEED']*4,stream=['VBFDelayed'],groups=PrimaryLegGroup+MultiJetGroup+LegacyTopoGroup),
-
+        ChainProp(name='HLT_j20_n041pileuprmn015_j70_j50a_j0_DJMASS900j50dphi260x200deta_L1MJJ-500-NFF', l1SeedThresholds=['FSNOSEED']*4,stream=['VBFDelayed'],groups=PrimaryLegGroup+MultiJetGroup+LegacyTopoGroup),
         ChainProp(name='HLT_j20_calratiovar_j70_j50a_j0_DJMASS900j50dphi260x200deta_roiftf_preselj20emf72_L1MJJ-500-NFF', l1SeedThresholds=['FSNOSEED']*4,stream=['VBFDelayed'],groups=PrimaryLegGroup+MultiJetGroup+LegacyTopoGroup),
         ChainProp(name='HLT_j20_calratiovar59_j70_j50a_j0_DJMASS900j50dphi260x200deta_roiftf_preselj20emf72_L1MJJ-500-NFF', l1SeedThresholds=['FSNOSEED']*4,stream=['VBFDelayed'],groups=PrimaryLegGroup+MultiJetGroup+LegacyTopoGroup),
         ChainProp(name='HLT_j0_DJMASS900j50dphi260x200deta_calratiovar59_roiftf_preselj20emf72_L1MJJ-500-NFF',l1SeedThresholds=['FSNOSEED'],stream=['Main'],groups=PrimaryLegGroup+MultiJetGroup+LegacyTopoGroup),
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
index 4a4e2f311f26..db02a2968039 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLT/Menu/SignatureDicts.py
@@ -418,6 +418,8 @@ JetChainParts = {
 
     # beamspot
     'beamspotChain'     : ['beamspotVtx'],
+    'pileuprm'       : # scedule pileup removal algo for  single jet, the m_min LogR value is minimul criteria to for jet LogR to start removal algorithm, the m_max LogR is the desired logR cut to pass for jetschedule pileup removal algo for single jet, the m_min LogR value is minimal criteria for jet LogR to start the removal algorithm, the n_max LogR is the desired logR cut to pass for jet
+       ['n041pileuprmn015' ],# left value is min LogR,right is max LogR, n stands for negative (for example n041 means -0.41 ) 
 }
 
 # ---- Jet Dictionary of default Values ----
@@ -465,7 +467,8 @@ JetChainParts_Default = {
     'tboundary'     : '',
 
     'beamspotChain' : '',
-}
+    'pileuprm'     : '',
+    }
 
 # ---- bJet Dictionary of default Values that are different to the ones for normal jet chains ----
 bJetChainParts_Default = {
-- 
GitLab