From bbb58360bdddb11937f9af8accd36b51d8695a82 Mon Sep 17 00:00:00 2001
From: Alan Watson <Alan.Watson@cern.ch>
Date: Tue, 5 Jun 2018 01:11:34 +0200
Subject: [PATCH] Change simulation tools and algorithms to reflect updates to
 setting of restricted eta XE and TE ranges from trigger menu. The hardware
 configuration now uses the menu to define certain types of triggers which had
 previously been managed via a different procedure, and these changes bring
 the offline code into line with this.

Should fix errors seen in monitoring in last week, arising from simulation not replicating online,
as well as produce correct behaviour in monte carlo.

These change were implemented relative to the 21.0 branch. As code in master differs in other respects
will need a second implementation for that.


Former-commit-id: 04b94ff100ab425dcd18a7823fa4694aaad81519
---
 .../TrigT1/TrigT1CaloSim/src/EnergyCMX.cxx    | 33 ++++++++----
 .../TrigT1CaloToolInterfaces/IL1EtTools.h     | 12 ++---
 .../TrigT1CaloTools/L1EnergyCMXTools.h        |  8 +--
 .../TrigT1CaloTools/L1EtTools.h               | 12 ++---
 .../TrigT1CaloTools/src/L1EnergyCMXTools.cxx  | 52 +++++++++++--------
 .../TrigT1/TrigT1CaloTools/src/L1EtTools.cxx  | 24 ++++-----
 .../TrigT1CaloUtils/CrateEnergy.h             |  4 +-
 .../TrigT1CaloUtils/src/CrateEnergy.cxx       | 45 +++-------------
 8 files changed, 91 insertions(+), 99 deletions(-)

diff --git a/Trigger/TrigT1/TrigT1CaloSim/src/EnergyCMX.cxx b/Trigger/TrigT1/TrigT1CaloSim/src/EnergyCMX.cxx
index a1bedefd7e6..108db40ef50 100755
--- a/Trigger/TrigT1/TrigT1CaloSim/src/EnergyCMX.cxx
+++ b/Trigger/TrigT1/TrigT1CaloSim/src/EnergyCMX.cxx
@@ -131,10 +131,13 @@ StatusCode EnergyCMX::execute( )
   m_resultsFull = &resultsFull;
   
   /** Find restructed eta range.
-   *  This will use the min/max values for any threshold in the range 9-16 to define the ranges
+   *  This will use the min/max values for the first valid threshold in the range 9-16 to define the ranges
    */
-  float etaTruncXE =  4.9;
-  float etaTruncTE =  4.9;
+  uint32_t maskXE =  0;
+  uint32_t maskTE =  0;
+  bool maskXESet = false;
+  bool maskTESet = false;
+  const float moduleEta[8] = {-4.,-2.,-1.2,-0.4,0.4,1.2,2.,4.};
   
   L1DataDef def;
   std::vector<TriggerThreshold*> thresholds = m_configSvc->ctpConfig()->menu().thresholdVector();
@@ -144,14 +147,24 @@ StatusCode EnergyCMX::execute( )
     if ( ( (*it)->type() == def.xeType() || (*it)->type() == def.teType()) && (*it)->thresholdNumber() > 7 ) {
       std::vector<TriggerThresholdValue*> ttvs = (*it)->thresholdValueVector();
       std::vector<TriggerThresholdValue*>::const_iterator itv;
+      // Make sure only set masks from the first valid threshold in the range (for each type)       
+      if (maskXE > 0) maskXESet = true;
+      if (maskTE > 0) maskTESet = true;
       for (itv = ttvs.begin(); itv != ttvs.end(); ++itv) {
-        if ( (*it)->type() == def.xeType() ) {
-          if ( abs((*itv)->etamin())*0.1 < etaTruncXE ) etaTruncXE = abs((*itv)->etamin())*0.1;
-          if ( abs((*itv)->etamax())*0.1 < etaTruncXE ) etaTruncXE = abs((*itv)->etamax())*0.1;
+        // Bits are set false by default, so ignore thresholds that are just doing that
+        if ((*itv)->thresholdValueCount() >= 0x7fff) continue;
+        // Set bits true if module centre between etaMin and etaMax
+        if ( (*it)->type() == def.xeType()  && !maskXESet ) {
+          for (unsigned int bin = 0; bin < 8; ++bin) {
+            if (moduleEta[bin] > (*itv)->etamin()*0.1 && moduleEta[bin] < (*itv)->etamax()*0.1)
+                maskXE |= (1<<bin);
+          }
         }
-        else if ( (*it)->type() == def.teType() ) {
-          if ( abs((*itv)->etamin())*0.1 < etaTruncTE ) etaTruncTE = abs((*itv)->etamin())*0.1;
-          if ( abs((*itv)->etamax())*0.1 < etaTruncTE ) etaTruncTE = abs((*itv)->etamax())*0.1;
+        else if ( (*it)->type() == def.teType()  && !maskTESet ) {
+          for (unsigned int bin = 0; bin < 8; ++bin) {
+            if (moduleEta[bin] > (*itv)->etamin()*0.1 && moduleEta[bin] < (*itv)->etamax()*0.1)
+                maskTE |= (1<<bin);
+          }
         }
       }  // loop over TTV
     } // Is this XE or TE threshold?
@@ -159,7 +172,7 @@ StatusCode EnergyCMX::execute( )
   
   // form crate sums (restricted eta range). Explicitly set restricted eta flag regardless of eta range
   DataVector<CrateEnergy>* cratesTrunc  = new DataVector<CrateEnergy>;
-  m_EtTool->crateSums(jemContainer, cratesTrunc, etaTruncXE, etaTruncTE, true);
+  m_EtTool->crateSums(jemContainer, cratesTrunc, maskXE, maskTE, true);
   // system summation and threshold tests
   SystemEnergy resultsTrunc = m_EtTool->systemSums(cratesTrunc);
   m_resultsTrunc = &resultsTrunc;
diff --git a/Trigger/TrigT1/TrigT1CaloToolInterfaces/TrigT1CaloToolInterfaces/IL1EtTools.h b/Trigger/TrigT1/TrigT1CaloToolInterfaces/TrigT1CaloToolInterfaces/IL1EtTools.h
index ca9a5cd9112..134f6a74efc 100755
--- a/Trigger/TrigT1/TrigT1CaloToolInterfaces/TrigT1CaloToolInterfaces/IL1EtTools.h
+++ b/Trigger/TrigT1/TrigT1CaloToolInterfaces/TrigT1CaloToolInterfaces/IL1EtTools.h
@@ -38,16 +38,16 @@ Interface definition for L1EtTools
     virtual void moduleSums(const std::map<int, xAOD::JetElement*>* jemap,
                             DataVector<ModuleEnergy>* modules, int slice = -1) = 0;
     virtual void crateSums(const DataVector<ModuleEnergy>* modules,
-                            DataVector<CrateEnergy>* crates, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false) = 0 ;
+                            DataVector<CrateEnergy>* crates, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false) = 0 ;
     virtual void crateSums(const DataVector<EnergyCMXData>* modules,
-                            DataVector<CrateEnergy>* crates, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false) = 0 ;
+                            DataVector<CrateEnergy>* crates, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false) = 0 ;
     virtual void crateSums(const xAOD::JetElementContainer* jetelements,
-                           DataVector<CrateEnergy>* crates, int slice = -1, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false) = 0;
+                           DataVector<CrateEnergy>* crates, int slice = -1, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false) = 0;
     virtual void crateSums(const std::map<int, xAOD::JetElement*>* jemap,
-                           DataVector<CrateEnergy>* crates, int slice = -1, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false) = 0;
+                           DataVector<CrateEnergy>* crates, int slice = -1, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false) = 0;
     virtual SystemEnergy systemSums(const DataVector<CrateEnergy>* crates)  = 0;
-    virtual SystemEnergy systemSums(const xAOD::JetElementContainer* jetelements, int slice = -1, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false) = 0;
-    virtual SystemEnergy systemSums(const std::map<int, xAOD::JetElement*>* jemap, int slice = -1, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false) = 0;
+    virtual SystemEnergy systemSums(const xAOD::JetElementContainer* jetelements, int slice = -1, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false) = 0;
+    virtual SystemEnergy systemSums(const std::map<int, xAOD::JetElement*>* jemap, int slice = -1, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false) = 0;
   
   };
 
diff --git a/Trigger/TrigT1/TrigT1CaloTools/TrigT1CaloTools/L1EnergyCMXTools.h b/Trigger/TrigT1/TrigT1CaloTools/TrigT1CaloTools/L1EnergyCMXTools.h
index 95f74963276..f22d2a6f69f 100644
--- a/Trigger/TrigT1/TrigT1CaloTools/TrigT1CaloTools/L1EnergyCMXTools.h
+++ b/Trigger/TrigT1/TrigT1CaloTools/TrigT1CaloTools/L1EnergyCMXTools.h
@@ -115,7 +115,7 @@ class L1EnergyCMXTools : virtual public IL1EnergyCMXTools, public AthAlgTool
     /** Convert maps from internal SystemEnergy objects to CMXEtSums objects */
     void etMapsToEtSums(const MultiSliceSystemEnergy &systemVec,
                         xAOD::CMXEtSumsContainer *cmxEtSumsVec, int peak) const;
-    void findRestrictedEta(float &etaTruncXE, float &etaTruncTE) const;
+    void findRestrictedEta(uint32_t &maskXE, uint32_t &maskTE) const;
 
     void dumpCrateEnergies(const std::string& msg, const MultiSliceCrateEnergy& crates) const;
     /** trigger configuration service */
@@ -127,10 +127,10 @@ class L1EnergyCMXTools : virtual public IL1EnergyCMXTools, public AthAlgTool
     /** Debug flag */
     bool m_debug;
     /** Find restructed eta range.
-     *  This will use the min/max values for any threshold in the range 9-16 to define the ranges
+     *  This will use the min/max values for the first valid threshold in the range 9-16 to define the ranges
      */
-    float m_etaTruncXE;
-    float m_etaTruncTE;
+    uint32_t m_maskXE;
+    uint32_t m_maskTE;
 };
 
 } // end of namespace
diff --git a/Trigger/TrigT1/TrigT1CaloTools/TrigT1CaloTools/L1EtTools.h b/Trigger/TrigT1/TrigT1CaloTools/TrigT1CaloTools/L1EtTools.h
index 8fe8074044c..3a6058f2d58 100755
--- a/Trigger/TrigT1/TrigT1CaloTools/TrigT1CaloTools/L1EtTools.h
+++ b/Trigger/TrigT1/TrigT1CaloTools/TrigT1CaloTools/L1EtTools.h
@@ -77,19 +77,19 @@ namespace LVL1
                               DataVector<ModuleEnergy>* modules, int slice = -1) ;
       /** Returns a vector of LVL1::CrateEnergy objects */
       virtual void crateSums(const DataVector<ModuleEnergy>* modules,
-                             DataVector<CrateEnergy>* crates, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false) ;
+                             DataVector<CrateEnergy>* crates, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false) ;
       virtual void crateSums(const DataVector<EnergyCMXData>* modules,
-                             DataVector<CrateEnergy>* crates, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false) ;
+                             DataVector<CrateEnergy>* crates, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false) ;
       /** Directly obtain LVL1::CrateEnergy objects */
       virtual void crateSums(const xAOD::JetElementContainer* jetelements,
-                             DataVector<CrateEnergy>* crates, int slice = -1, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false) ;
+                             DataVector<CrateEnergy>* crates, int slice = -1, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false) ;
       virtual void crateSums(const std::map<int, xAOD::JetElement*>* jemap,
-                             DataVector<CrateEnergy>* crates, int slice = -1, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false) ;
+                             DataVector<CrateEnergy>* crates, int slice = -1, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false) ;
       /** Returns a LVL1::SystemEnergy object */
       virtual SystemEnergy systemSums(const DataVector<CrateEnergy>* crates) ;
       /** Directly obtain a LVL1::SystemEnergy object */
-      virtual SystemEnergy systemSums(const xAOD::JetElementContainer* jetelements, int slice = -1, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false) ;
-      virtual SystemEnergy systemSums(const std::map<int, xAOD::JetElement*>* jemap, int slice = -1, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false) ;
+      virtual SystemEnergy systemSums(const xAOD::JetElementContainer* jetelements, int slice = -1, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false) ;
+      virtual SystemEnergy systemSums(const std::map<int, xAOD::JetElement*>* jemap, int slice = -1, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false) ;
             
     private:
 
diff --git a/Trigger/TrigT1/TrigT1CaloTools/src/L1EnergyCMXTools.cxx b/Trigger/TrigT1/TrigT1CaloTools/src/L1EnergyCMXTools.cxx
index 31141eba78b..1ee14027ef9 100644
--- a/Trigger/TrigT1/TrigT1CaloTools/src/L1EnergyCMXTools.cxx
+++ b/Trigger/TrigT1/TrigT1CaloTools/src/L1EnergyCMXTools.cxx
@@ -77,10 +77,10 @@ StatusCode L1EnergyCMXTools::initialize()
         return sc;
     }
 
-    findRestrictedEta(m_etaTruncXE, m_etaTruncTE);
-    ATH_MSG_DEBUG("Restricted eta ranges etaTruncXE=" << m_etaTruncXE << " etaTruncTE=" << m_etaTruncTE);
+    findRestrictedEta(m_maskXE, m_maskTE);
+    ATH_MSG_DEBUG("Restricted eta masks: XE=" << MSG::hex << m_maskXE << ", TE=" << m_maskTE << MSG::dec);
 
-    ATH_MSG_INFO("Initialization completed");
+    ATH_MSG_DEBUG("Initialization completed");
 
     return sc;
 }
@@ -202,10 +202,13 @@ void L1EnergyCMXTools::formCMXEtSumsModule(
 }
 
 /** form partial CMXEtSums (crate) from module CMXEtSums */
-void L1EnergyCMXTools::findRestrictedEta(float &etaTruncXE, float &etaTruncTE) const
+void L1EnergyCMXTools::findRestrictedEta(uint32_t &maskXE, uint32_t &maskTE) const
 {
-    etaTruncXE = 4.9;
-    etaTruncTE = 4.9;
+    const float moduleEta[8] = {-4.,-2.,-1.2,-0.4,0.4,1.2,2.,4.};
+    maskXE =  0;
+    maskTE =  0;
+    bool maskXESet = false;
+    bool maskTESet = false;
 
     TrigConf::L1DataDef def;
 
@@ -213,21 +216,26 @@ void L1EnergyCMXTools::findRestrictedEta(float &etaTruncXE, float &etaTruncTE) c
     {
         if ((it->type() == def.xeType() || it->type() == def.teType()) && it->thresholdNumber() > 7)
         {
+            if (maskXE > 0) maskXESet = true;
+            if (maskTE > 0) maskTESet = true;
             for (auto itv : it->thresholdValueVector())
             {
-                if (it->type() == def.xeType())
+                // Already initialised mask to zero, so only need to check where threshold is active
+                if (itv->thresholdValueCount() >= 0x7fff) continue;
+                // Set bits for modules within the range of any restricted eta threshold
+                if (it->type() == def.xeType() && !maskXESet)
                 {
-                    if (abs(itv->etamin()) * 0.1 < etaTruncXE)
-                        etaTruncXE = abs(itv->etamin()) * 0.1;
-                    if (abs(itv->etamax()) * 0.1 < etaTruncXE)
-                        etaTruncXE = abs(itv->etamax()) * 0.1;
+                    for (unsigned int bin = 0; bin < 8; ++bin) {
+                       if (moduleEta[bin] > itv->etamin()*0.1 && moduleEta[bin] < itv->etamax()*0.1)
+                          maskXE |= (1<<bin);
+                    }
                 }
-                else if (it->type() == def.teType())
+                else if (it->type() == def.teType() && !maskTESet)
                 {
-                    if (abs(itv->etamin()) * 0.1 < etaTruncTE)
-                        etaTruncTE = abs(itv->etamin()) * 0.1;
-                    if (abs(itv->etamax()) * 0.1 < etaTruncTE)
-                        etaTruncTE = abs(itv->etamax()) * 0.1;
+                    for (unsigned int bin = 0; bin < 8; ++bin) {
+                       if (moduleEta[bin] > itv->etamin()*0.1 && moduleEta[bin] < itv->etamax()*0.1)
+                          maskTE |= (1<<bin);
+                    }
                 }
             } // loop over TTV
         }     // Is this XE or TE threshold?
@@ -237,9 +245,9 @@ void L1EnergyCMXTools::formCMXEtSumsCrate(
     const xAOD::CMXEtSumsContainer *cmxEtSumsMod,
     xAOD::CMXEtSumsContainer *cmxEtSumsCrate) const
 {
-    float etaTruncXE, etaTruncTE;
-    findRestrictedEta(etaTruncXE, etaTruncTE);
-    ATH_MSG_DEBUG("Restricted eta ranges etaTruncXE=" << etaTruncXE << " etaTruncTE=" << etaTruncTE);
+    uint32_t maskXE, maskTE;
+    findRestrictedEta(maskXE, maskTE);
+    ATH_MSG_DEBUG("Restricted eta masks: XE=" << MSG::hex << maskXE << ", TE=" << maskTE << MSG::dec);
     // Convert to internal containers
     int peak = 0;
     MultiSliceModuleEnergy modulesVec;
@@ -255,7 +263,7 @@ void L1EnergyCMXTools::formCMXEtSumsCrate(
         cratesVecFull.push_back(cratesFull);
         cratesVecRestricted.push_back(cratesRestricted);
         m_etTool->crateSums(modules, cratesFull);
-        m_etTool->crateSums(modules, cratesRestricted, etaTruncXE, etaTruncTE, true);
+        m_etTool->crateSums(modules, cratesRestricted, maskXE, maskTE, true);
         delete modules;
     }
 
@@ -852,7 +860,7 @@ void L1EnergyCMXTools::etMapsToEtSums(
         }else{
             nslicesFull++;
         }
-        // ATH_MSG_INFO("isRestriced=" << isRestricted << " slice=" << (isRestricted? nslicesRestricted: nslicesFull) 
+        // ATH_MSG_DEBUG("isRestriced=" << isRestricted << " slice=" << (isRestricted? nslicesRestricted: nslicesFull) 
         //  <<  " et=" << systemVec[i]->et() << " etSumHits=" << systemVec[i]->etSumHits());
     }
 
@@ -915,7 +923,7 @@ void L1EnergyCMXTools::etMapsToEtSums(
             (*sumEt)->addEy(etVec, *error);
             (*sumEt)->addEt(etVec, *error);
 
-            // ATH_MSG_INFO("slice=" << slice << " restricted=" << restricted << " etVec=" << (*sumEt)->etVec() << " etSumHits=" << etSumHits);
+            // ATH_MSG_DEBUG("slice=" << slice << " restricted=" << restricted << " etVec=" << (*sumEt)->etVec() << " etSumHits=" << etSumHits);
         }
         unsigned int etMissHits = energy->etMissHits();
         if (etMissHits)
diff --git a/Trigger/TrigT1/TrigT1CaloTools/src/L1EtTools.cxx b/Trigger/TrigT1/TrigT1CaloTools/src/L1EtTools.cxx
index 092aa05201c..7ffe481c639 100755
--- a/Trigger/TrigT1/TrigT1CaloTools/src/L1EtTools.cxx
+++ b/Trigger/TrigT1/TrigT1CaloTools/src/L1EtTools.cxx
@@ -170,12 +170,12 @@ void L1EtTools::moduleSums(const std::map<int, xAOD::JetElement*>* jemap,
 
 //=====================Form JE Crate ET sums ====================
 
-void L1EtTools::crateSums(const DataVector<ModuleEnergy>* modules, DataVector<CrateEnergy>* crates, float etaMaxXE, float etaMaxTE, bool restricted) {
+void L1EtTools::crateSums(const DataVector<ModuleEnergy>* modules, DataVector<CrateEnergy>* crates, uint32_t maskXE, uint32_t maskTE, bool restricted) {
 
   crates->clear();
   // Loop over crates and create set of CrateEnergy objects
   for (int crate = 0; crate < 2; ++crate) {
-    crates->push_back( new CrateEnergy(crate, modules, etaMaxXE, etaMaxTE, restricted) );
+    crates->push_back( new CrateEnergy(crate, modules, maskXE, maskTE, restricted) );
   }
   
   return;
@@ -183,12 +183,12 @@ void L1EtTools::crateSums(const DataVector<ModuleEnergy>* modules, DataVector<Cr
 
 //=====================Form JE Crate ET sums ====================
 
-void L1EtTools::crateSums(const DataVector<EnergyCMXData>* modules, DataVector<CrateEnergy>* crates, float etaMaxXE, float etaMaxTE, bool restricted) {
+void L1EtTools::crateSums(const DataVector<EnergyCMXData>* modules, DataVector<CrateEnergy>* crates, uint32_t maskXE, uint32_t maskTE, bool restricted) {
 
   crates->clear();
   // Loop over crates and create set of CrateEnergy objects
   for (int crate = 0; crate < 2; ++crate) {
-    crates->push_back( new CrateEnergy(crate, modules, etaMaxXE, etaMaxTE, restricted) );
+    crates->push_back( new CrateEnergy(crate, modules, maskXE, maskTE, restricted) );
   }
   
   return;
@@ -207,7 +207,7 @@ SystemEnergy L1EtTools::systemSums(const DataVector<CrateEnergy>* crates) {
 //=====================Return JE Crate ET sums directly =============
 
 void L1EtTools::crateSums(const xAOD::JetElementContainer* jetelements,
-                          DataVector<CrateEnergy>* crates, int slice, float etaMaxXE, float etaMaxTE, bool restricted) {
+                          DataVector<CrateEnergy>* crates, int slice, uint32_t maskXE, uint32_t maskTE, bool restricted) {
 
   crates->clear();
   
@@ -218,7 +218,7 @@ void L1EtTools::crateSums(const xAOD::JetElementContainer* jetelements,
   
   // Loop over crates and create set of CrateEnergy objects
    for (int crate = 0; crate < 2; ++crate) {
-     crates->push_back( new CrateEnergy(crate, modules, etaMaxXE, etaMaxTE, restricted) );
+     crates->push_back( new CrateEnergy(crate, modules, maskXE, maskTE, restricted) );
    }
 
   delete modules;
@@ -229,7 +229,7 @@ void L1EtTools::crateSums(const xAOD::JetElementContainer* jetelements,
 //=====================Return JE Crate ET sums directly =============
 
 void L1EtTools::crateSums(const std::map<int, xAOD::JetElement*>* jemap,
-                          DataVector<CrateEnergy>* crates, int slice, float etaMaxXE, float etaMaxTE, bool restricted) {
+                          DataVector<CrateEnergy>* crates, int slice, uint32_t maskXE, uint32_t maskTE, bool restricted) {
 
   crates->clear();
   
@@ -240,7 +240,7 @@ void L1EtTools::crateSums(const std::map<int, xAOD::JetElement*>* jemap,
   
   // Loop over crates and create set of CrateEnergy objects
    for (int crate = 0; crate < 2; ++crate) {
-     crates->push_back( new CrateEnergy(crate, modules, etaMaxXE, etaMaxTE, restricted) );
+     crates->push_back( new CrateEnergy(crate, modules, maskXE, maskTE, restricted) );
    }
 
   delete modules;
@@ -250,12 +250,12 @@ void L1EtTools::crateSums(const std::map<int, xAOD::JetElement*>* jemap,
 
 //=====================Return final System ET sums directly =============
 
-SystemEnergy L1EtTools::systemSums(const xAOD::JetElementContainer* jetelements, int slice, float etaMaxXE, float etaMaxTE, bool restricted) {
+SystemEnergy L1EtTools::systemSums(const xAOD::JetElementContainer* jetelements, int slice, uint32_t maskXE, uint32_t maskTE, bool restricted) {
 
   // First need to form modules and crates
   DataVector<CrateEnergy>* crates = new DataVector<CrateEnergy>;
 
-  crateSums(jetelements, crates, slice, etaMaxXE, etaMaxTE, restricted);
+  crateSums(jetelements, crates, slice, maskXE, maskTE, restricted);
 
   // Then do the final summing, thresholding etc
   SystemEnergy result(crates, m_configSvc);
@@ -266,12 +266,12 @@ SystemEnergy L1EtTools::systemSums(const xAOD::JetElementContainer* jetelements,
 
 //=====================Return final System ET sums directly =============
 
-SystemEnergy L1EtTools::systemSums(const std::map<int, xAOD::JetElement*>* jemap, int slice, float etaMaxXE, float etaMaxTE, bool restricted) {
+SystemEnergy L1EtTools::systemSums(const std::map<int, xAOD::JetElement*>* jemap, int slice, uint32_t maskXE, uint32_t maskTE, bool restricted) {
 
   // First need to form modules and crates
   DataVector<CrateEnergy>* crates = new DataVector<CrateEnergy>;
 
-  crateSums(jemap, crates, slice, etaMaxXE, etaMaxTE, restricted);
+  crateSums(jemap, crates, slice, maskXE, maskTE, restricted);
 
   // Then do the final summing, thresholding etc
   SystemEnergy result(crates, m_configSvc);
diff --git a/Trigger/TrigT1/TrigT1CaloUtils/TrigT1CaloUtils/CrateEnergy.h b/Trigger/TrigT1/TrigT1CaloUtils/TrigT1CaloUtils/CrateEnergy.h
index ded753dcd34..c084c79cbdf 100755
--- a/Trigger/TrigT1/TrigT1CaloUtils/TrigT1CaloUtils/CrateEnergy.h
+++ b/Trigger/TrigT1/TrigT1CaloUtils/TrigT1CaloUtils/CrateEnergy.h
@@ -35,8 +35,8 @@ System CMM logic is done in EnergyTrigger*/
 class CrateEnergy {
 
 public:
-  CrateEnergy(unsigned int crate, const DataVector<ModuleEnergy>* modules, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false);
-  CrateEnergy(unsigned int crate, const DataVector<EnergyCMXData>* modules, float etaMaxXE = 5., float etaMaxTE = 5., bool restricted = false);
+  CrateEnergy(unsigned int crate, const DataVector<ModuleEnergy>* modules, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false);
+  CrateEnergy(unsigned int crate, const DataVector<EnergyCMXData>* modules, uint32_t maskXE = 0xff, uint32_t maskTE = 0xff, bool restricted = false);
   CrateEnergy(unsigned int crate, unsigned int et, unsigned int exTC,
               unsigned int eyTC, unsigned int overflowT, unsigned int overflowX,
 	      unsigned int overflowY, bool restricted = false);
diff --git a/Trigger/TrigT1/TrigT1CaloUtils/src/CrateEnergy.cxx b/Trigger/TrigT1/TrigT1CaloUtils/src/CrateEnergy.cxx
index 1abf6aa91ba..1ae7b1c5eb7 100755
--- a/Trigger/TrigT1/TrigT1CaloUtils/src/CrateEnergy.cxx
+++ b/Trigger/TrigT1/TrigT1CaloUtils/src/CrateEnergy.cxx
@@ -19,7 +19,7 @@
 
 namespace LVL1 {
 
-CrateEnergy::CrateEnergy(unsigned int crate, const DataVector<ModuleEnergy>* JEMs, float etaMaxXE, float etaMaxTE, bool restricted):
+CrateEnergy::CrateEnergy(unsigned int crate, const DataVector<ModuleEnergy>* JEMs, uint32_t maskXE, uint32_t maskTE, bool restricted):
   m_crate(crate),
   m_crateEt(0),
   m_crateEx(0),
@@ -34,19 +34,7 @@ CrateEnergy::CrateEnergy(unsigned int crate, const DataVector<ModuleEnergy>* JEM
   if (m_crate > 1) return;
 
   /** Added for restricted eta triggers in Run 2 */
-  int moduleMinXE = 0;
-  if (etaMaxXE <= 2.41) moduleMinXE = 1;
-  if (etaMaxXE <= 1.61) moduleMinXE = 2;
-  if (etaMaxXE <= 0.81) moduleMinXE = 3;
-  int moduleMaxXE = 7 - moduleMinXE;
-
-  int moduleMinTE = 0;
-  if (etaMaxTE <= 2.41) moduleMinTE = 1;
-  if (etaMaxTE <= 1.61) moduleMinTE = 2;
-  if (etaMaxTE <= 0.81) moduleMinTE = 3;
-  int moduleMaxTE = 7 - moduleMinTE;
-
-  if (moduleMinXE > 0 || moduleMinTE > 0) m_restricted = true;
+  if ((maskXE&0xff) != 0xff || (maskTE&0xff) != 0xff) m_restricted = true;
 
   /** Summing within a crate proceeds as follows: <br>
          unsigned 14 bit Ex, Ey, Et sums are formed for each half crate<br>
@@ -63,20 +51,15 @@ CrateEnergy::CrateEnergy(unsigned int crate, const DataVector<ModuleEnergy>* JEM
     int moduleInQuad = (*it)->module() % 8;
     if ((*it)->crate() == m_crate) {
       int quad = ( (*it)->module() < 8 ? 0 : 1 );
-      
-      if (moduleInQuad >= moduleMinTE && moduleInQuad <= moduleMaxTE) {
+      if ((maskTE>>moduleInQuad)&1) {
         eT[quad] += (*it)->et();
         if ( (*it)->et() >= m_jemEtSaturation ) m_overflowT = 1;
       }
-      
- 
-      if (moduleInQuad >= moduleMinXE && moduleInQuad <= moduleMaxXE) {
+      if ((maskXE>>moduleInQuad)&1) {
         eX[quad] += (*it)->ex();
         eY[quad] += (*it)->ey();
- 
         if ( (*it)->ex() >= m_jemEtSaturation ) m_overflowX = 1;
         if ( (*it)->ey() >= m_jemEtSaturation ) m_overflowY = 1;
- 
       } 
     }  // Right crate?
   }   // Loop over JEMs
@@ -115,7 +98,7 @@ CrateEnergy::CrateEnergy(unsigned int crate, const DataVector<ModuleEnergy>* JEM
   
 }
 
-CrateEnergy::CrateEnergy(unsigned int crate, const DataVector<EnergyCMXData>* JEMs, float etaMaxXE, float etaMaxTE, bool restricted):
+CrateEnergy::CrateEnergy(unsigned int crate, const DataVector<EnergyCMXData>* JEMs, uint32_t maskXE, uint32_t maskTE, bool restricted):
   m_crate(crate),
   m_crateEt(0),
   m_crateEx(0),
@@ -130,19 +113,7 @@ CrateEnergy::CrateEnergy(unsigned int crate, const DataVector<EnergyCMXData>* JE
   if (m_crate > 1) return;
 
   /** Added for restricted eta triggers in Run 2 */
-  int moduleMinXE = 0;
-  if (etaMaxXE <= 2.41) moduleMinXE = 1;
-  if (etaMaxXE <= 1.61) moduleMinXE = 2;
-  if (etaMaxXE <= 0.81) moduleMinXE = 3;
-  int moduleMaxXE = 7 - moduleMinXE;
-
-  int moduleMinTE = 0;
-  if (etaMaxTE <= 2.41) moduleMinTE = 1;
-  if (etaMaxTE <= 1.61) moduleMinTE = 2;
-  if (etaMaxTE <= 0.81) moduleMinTE = 3;
-  int moduleMaxTE = 7 - moduleMinTE;
-
-  if (moduleMinXE > 0 || moduleMinTE > 0) m_restricted = true;
+  if ((maskXE&0xff) != 0xff || (maskTE&0xff) != 0xff) m_restricted = true;
 
   /** Summing within a crate proceeds as follows: <br>
          unsigned 14 bit Ex, Ey, Et sums are formed for each half crate<br>
@@ -160,11 +131,11 @@ CrateEnergy::CrateEnergy(unsigned int crate, const DataVector<EnergyCMXData>* JE
     if ((unsigned int)(*it)->crate() == m_crate) {
       int quad = ( (*it)->module() < 8 ? 0 : 1 );
 
-      if (moduleInQuad >= moduleMinTE && moduleInQuad <= moduleMaxTE) {
+      if ((maskTE>>moduleInQuad)&1) {
         eT[quad] += (*it)->Et();
         if ( (*it)->Et() >= m_jemEtSaturation ) m_overflowT = 1;
       }
-      if (moduleInQuad >= moduleMinXE && moduleInQuad <= moduleMaxXE) {
+      if ((maskXE>>moduleInQuad)&1) {
         eX[quad] += (*it)->Ex();
         eY[quad] += (*it)->Ey();
         if ( (*it)->Ex() >= m_jemEtSaturation ) m_overflowX = 1;
-- 
GitLab