diff --git a/Trigger/TrigT1/TrigT1CaloFexSim/TrigT1CaloFexSim/JGTowerMaker.h b/Trigger/TrigT1/TrigT1CaloFexSim/TrigT1CaloFexSim/JGTowerMaker.h
index 8ddbe4f4fa8037b9e7f1546985f216c750818130..9a4ce3a05e137726f93df734706668f322814e61 100644
--- a/Trigger/TrigT1/TrigT1CaloFexSim/TrigT1CaloFexSim/JGTowerMaker.h
+++ b/Trigger/TrigT1/TrigT1CaloFexSim/TrigT1CaloFexSim/JGTowerMaker.h
@@ -58,6 +58,9 @@ class JGTowerMaker: public ::AthAlgorithm {
   bool  m_useAllRun2TT;
   bool  m_EmulateSC; 
   bool  m_TileMapped;
+  float m_minSCETp; 
+  float m_maxSCETm; 
+  float m_minTowerEt; 
   std::string m_scType;
   uint16_t m_scQuality;
   bool  JMatched;
diff --git a/Trigger/TrigT1/TrigT1CaloFexSim/python/L1SimulationControlFlags.py b/Trigger/TrigT1/TrigT1CaloFexSim/python/L1SimulationControlFlags.py
index 3aae303adddffea92e50b88d91fb0ef451f33e02..088beb2057fd26f24cfc39d0818171a2cc414f3e 100644
--- a/Trigger/TrigT1/TrigT1CaloFexSim/python/L1SimulationControlFlags.py
+++ b/Trigger/TrigT1/TrigT1CaloFexSim/python/L1SimulationControlFlags.py
@@ -47,6 +47,41 @@ class QualBitMask(JobProperty):
     StoredValue = 0x200
 _caloflags.append(QualBitMask)
 
+class minTowerET(JobProperty):
+    """
+    If Tower ET < min then set tower ET = 0 
+    """
+    statusOn = True
+    allowedType = ['float']
+    StoredValue = -9e9
+_caloflags.append(minTowerET) 
+
+class minSCETp(JobProperty): 
+    """
+    if ET > 0, ET > minSCETp is required to build towers
+    """
+    statusOn = True 
+    allowedType = ['float']
+    StoredValue = -1
+_caloflags.append(minSCETp)
+
+class maxSCETm(JobProperty):
+    """
+    if ET < 0, ET < maxSCETm is required to build towers 
+    """
+    statusOn = True
+    allowedType = ['float']
+    StoredValue = 1
+_caloflags.append(maxSCETm)
+
+class DataNoPedestal(JobProperty):
+    """
+    Disable pedestal related features for data, since it crashes in some cases 
+    """
+    statusOn = True
+    allowType = ['bool'] 
+    StoredValue = False 
+_caloflags.append(DataNoPedestal) 
 
 class ComputeEFexClusters(JobProperty):
     """ ComputeClusters """
diff --git a/Trigger/TrigT1/TrigT1CaloFexSim/python/L1SimulationSequence.py b/Trigger/TrigT1/TrigT1CaloFexSim/python/L1SimulationSequence.py
index ca95be542a20adaa9656d8fd64d37a32ad2d54e1..0ca39905c746d3f91882d7ed0474624fdcf36169 100644
--- a/Trigger/TrigT1/TrigT1CaloFexSim/python/L1SimulationSequence.py
+++ b/Trigger/TrigT1/TrigT1CaloFexSim/python/L1SimulationSequence.py
@@ -80,7 +80,8 @@ def setupRun3L1CaloSimulationSequence(skipCTPEmulation = False, useAlgSequence =
         include('TrigT1CaloByteStream/ReadLVL1CaloBSRun2_jobOptions.py')
 
     #python options for supercells
-    include('LArROD/LArConfigureCablingSCFolder.py')
+    if(simflags.Calo.DataNoPedestal()==False):
+        include('LArROD/LArConfigureCablingSCFolder.py')
 
     ## CaloCells need to be created from LAr and Tile data when running on raw data
     ## (when running on ESD, CaloCells should be taken from the file)
@@ -122,7 +123,16 @@ def setupRun3L1CaloSimulationSequence(skipCTPEmulation = False, useAlgSequence =
         from TrigT1CaloFexSim.TrigT1CaloFexSimConfig import createSuperCellBCIDAlg
         l1simAlgSeq += createSuperCellBCIDAlg(SCellContainerIn="SCell",SCellContainerOut="SCellBCID")
         SCIn="SCellBCID"
-    elif simflags.Calo.SCellType() == "Emulated":
+    elif simflags.Calo.SCellType() == "Emulated" and simflags.Calo.DataNoPedestal() == True:
+        # If the pedestal correction is broken, then disable the things 
+        from AthenaCommon.AppMgr import ServiceMgr as svcMgr
+        from CaloTools.CaloNoiseToolDefault import CaloNoiseToolDefault
+        theNoiseTool=CaloNoiseToolDefault()
+        svcMgr.ToolSvc += theNoiseTool
+        from LArL1Sim.LArL1SimConf import LArSCSimpleMaker
+        l1simAlgSeq += LArSCSimpleMaker( SCellContainer="SimpleSCell",CaloNoiseTool=theNoiseTool, addBCID = False) 
+        SCIn="SimpleSCell" 
+    elif simflags.Calo.SCellType() == "Emulated" and simflags.Calo.DataNoPedestal() == False:
         # Supercells are reconstructed from the ET sum of the constituent calo cells 
         # This sets simflags.Calo.ApplySCQual to False
         from AthenaCommon.AppMgr import ServiceMgr as svcMgr
@@ -150,7 +160,11 @@ def setupRun3L1CaloSimulationSequence(skipCTPEmulation = False, useAlgSequence =
                                        useAllCalo = simflags.Calo.UseAllCalo(),
                                        SuperCellType = SCIn,
                                        EmulateSuperCellTiming=False,
-                                       SuperCellQuality = simflags.Calo.QualBitMask() )
+                                       SuperCellQuality = simflags.Calo.QualBitMask(), 
+                                       minSCETp = simflags.Calo.minSCETp(), 
+                                       maxSCETm = simflags.Calo.maxSCETm(),
+                                       minTowerET = simflags.Calo.minTowerET()
+                                   )
 
 
     # Schedule fex algorithms
diff --git a/Trigger/TrigT1/TrigT1CaloFexSim/src/JGTowerMaker.cxx b/Trigger/TrigT1/TrigT1CaloFexSim/src/JGTowerMaker.cxx
index c041a41340c007ba2be31aa61f9284695b24c0f7..e9adb1f8ca237cebccbe941fbe0d11ce266c681a 100644
--- a/Trigger/TrigT1/TrigT1CaloFexSim/src/JGTowerMaker.cxx
+++ b/Trigger/TrigT1/TrigT1CaloFexSim/src/JGTowerMaker.cxx
@@ -31,6 +31,9 @@ JGTowerMaker::JGTowerMaker( const std::string& name, ISvcLocator* pSvcLocator )
   declareProperty("SuperCellType",m_scType="SCell");
   declareProperty("SuperCellQuality",m_scQuality=0x200);
   declareProperty("EmulateSuperCellTiming",m_EmulateSC=false); 
+  declareProperty("minSCETp", m_minSCETp=-1);//initialize to -1. To require positive ET > 125 MeV, set to 125 
+  declareProperty("maxSCETm", m_maxSCETm=1);//initialize to 1. To require negative ET < -125 MeV, set to -125 
+  declareProperty("minTowerET",m_minTowerEt=-9e9); 
 }
 
 
@@ -109,6 +112,8 @@ StatusCode JGTowerMaker::FexAlg(const std::vector<std::shared_ptr<JGTower>>& jgT
 	   }
 	   else{
 	     if(m_useSCQuality && !( scell->provenance()  &  m_scQuality ) )  continue;
+	     if(scell_et>0 && scell_et<m_minSCETp)continue;//allows us to implement supercell ET cuts when building towers 
+	     if(scell_et<0 && scell_et>m_maxSCETm)continue; 
 	   }
            jgEt += scell_et; 
            lar_et+=scell_et;
@@ -150,6 +155,7 @@ StatusCode JGTowerMaker::FexAlg(const std::vector<std::shared_ptr<JGTower>>& jgT
           }
    
       }
+      if(jgEt<m_minTowerEt)jgEt=0; 
       xAOD::JGTower* m_trigTower = new xAOD::JGTower();
       jgTContainer->push_back(m_trigTower);
       m_trigTower->initialize(hs,jgt->Eta(),jgt->Phi());
diff --git a/Trigger/TrigT1/TrigT1CaloFexSim/src/JGTowerReader.cxx b/Trigger/TrigT1/TrigT1CaloFexSim/src/JGTowerReader.cxx
index f8adf7dc1d05c8fc83f70ee926a7e86ff99d0cf9..7f0766efd14b97455ce2279cf8eeac63fff7ca6f 100644
--- a/Trigger/TrigT1/TrigT1CaloFexSim/src/JGTowerReader.cxx
+++ b/Trigger/TrigT1/TrigT1CaloFexSim/src/JGTowerReader.cxx
@@ -80,7 +80,6 @@ histSvc("THistSvc",name){
   declareProperty("jJetRound_LargeR_r", m_jJetRound_LargeR_r=0.8);
   declareProperty("jJetRound_LargeR_seed_min_ET_MeV", m_jJetRound_LargeR_seed_min_ET_MeV = 2000.0);
   declareProperty("jJetRound_LargeR_jet_min_ET_MeV",  m_jJetRound_LargeR_jet_min_ET_MeV = 2000.0);
-
   
   declareProperty("makeJetsFromMap", m_makeJetsFromMap = false);
   declareProperty("towerMap", m_towerMap = "");
@@ -108,7 +107,7 @@ histSvc("THistSvc",name){
   declareProperty("gFEX_Rho_useNegTowers",m_gFEX_Rho_useNegTowers=true); 
   declareProperty("gFEX_OnlyPosRho", m_gFEX_OnlyPosRho=false); 
   declareProperty("gFEX_pTcone_cut", m_gFEX_pTcone_cut=25);  //cone threshold for Jets without Jets: declared in GeV
-  
+
   declareProperty("jXERHO_correction_file"  , m_jXERHO_correction_file="Run3L1CaloSimulation/Noise/jTowerCorrection.20200510.r11881.root");  //correction file for jXERHO
   declareProperty("jXERHO_fixed_noise_cut"  , m_jXERHO_fixed_noise_cut=0.0);  
   declareProperty("jXERHO_rho_up_threshold" , m_jXERHO_rho_up_threshold=1000.0);
@@ -383,9 +382,12 @@ StatusCode JGTowerReader::BuildBlocksFromTowers(std::vector<TowerObject::Block>&
   TowerObject::TowerGrid grid = TowerObject::TowerGrid(towers);
 
   for(const xAOD::JGTower* seed: towers){
+    float eta = std::abs(seed->eta()); 
+    int r = blockRows; int c = blockCols; 
+    if(eta>2.9) {r = 1; c = 1;}//The towers beyond eta = 2.9 get much larger and more complicated. Make the blocks a single tower... 
     int seedIndex = std::find(towers.begin(), towers.end(), seed) - towers.begin();
 
-    std::vector<int> neighbors = grid.neighbors(*seed, blockRows, blockCols);
+    std::vector<int> neighbors = grid.neighbors(*seed, r, c);
     float seed_Et = seed->et();
     if(!useNegTowers && seed->et() < 0)continue;
     double block_area(0.0);