From 3f69b8260a3328380ee4b744888d53cc26b065a7 Mon Sep 17 00:00:00 2001
From: Stewart Martin-Haugh <stewart.martin-haugh@cern.ch>
Date: Tue, 23 Nov 2021 12:22:27 +0100
Subject: [PATCH] Supercell emulation in newJO

---
 .../python/TileCablingSvcConfig.py            | 49 ++++++++++++-------
 .../python/TileConfigFlags.py                 |  7 +++
 .../TrigCaloRec/python/TrigCaloRecConfig.py   | 17 +++++++
 .../L1CaloFEXSim/python/L1CaloFEXSimCfg.py    | 27 +++++-----
 .../python/EmulationConfig.py                 | 29 +++++++++++
 .../python/Lvl1SimulationConfig.py            |  8 +--
 6 files changed, 103 insertions(+), 34 deletions(-)

diff --git a/TileCalorimeter/TileConditions/python/TileCablingSvcConfig.py b/TileCalorimeter/TileConditions/python/TileCablingSvcConfig.py
index 66ab034a086..c3994d4dc37 100644
--- a/TileCalorimeter/TileConditions/python/TileCablingSvcConfig.py
+++ b/TileCalorimeter/TileConditions/python/TileCablingSvcConfig.py
@@ -25,26 +25,37 @@ def TileCablingSvcCfg(flags):
     tileCablingSvc = CompFactory.TileCablingSvc()
 
     geometry = flags.GeoModel.AtlasVersion
-    runNumber = flags.Input.RunNumber[0]
     run = flags.GeoModel.Run
-    if run == 'RUN1':
-        if runNumber > 219651: 
-            # Choose RUN2 cabling for old geometry tags starting from 26-MAR-2013
-            tileCablingSvc.CablingType = 4
-            msg.warning("Forcing RUN2 cabling for run %s with geometry %s", runNumber, geometry)
-
-    elif run == 'RUN2':
-        if (flags.Input.isMC and runNumber >= 310000) or runNumber >= 343000 or runNumber < 1:
-            # Choose RUN2a cabling for R2 geometry tags starting from 31-Jan-2018
-            tileCablingSvc.CablingType = 5
-            msg.info("Forcing RUN2a (2018) cabling for run %s with geometry %s", runNumber, geometry)
-
-        else:
-            tileCablingSvc.CablingType = 4
-            msg.info("Forcing RUN2 (2014-2017) cabling for run %s with geometry %s", runNumber, geometry)
-    elif run == 'RUN3':
-        tileCablingSvc.CablingType = 6
-        msg.info("Forcing RUN3 cabling for run %s with geometry %s", run, geometry)
+
+    if not flags.Common.isOnline:
+      runNumber = flags.Input.RunNumber[0]
+      if run == 'RUN1':
+          if runNumber > 219651:
+              # Choose RUN2 cabling for old geometry tags starting from 26-MAR-2013
+              tileCablingSvc.CablingType = 4
+              msg.warning("Forcing RUN2 cabling for run %s with geometry %s", runNumber, geometry)
+
+      elif run == 'RUN2':
+          if (flags.Input.isMC and runNumber >= 310000) or runNumber >= 343000 or runNumber < 1:
+              # Choose RUN2a cabling for R2 geometry tags starting from 31-Jan-2018
+              tileCablingSvc.CablingType = 5
+              msg.info("Forcing RUN2a (2018) cabling for run %s with geometry %s", runNumber, geometry)
+
+          else:
+              tileCablingSvc.CablingType = 4
+              msg.info("Forcing RUN2 (2014-2017) cabling for run %s with geometry %s", runNumber, geometry)
+      elif run == 'RUN3':
+          tileCablingSvc.CablingType = 6
+          msg.info("Forcing RUN3 cabling for run %s with geometry %s", run, geometry)
+    else: #Running online or simulating running online: either way, do not access run number
+      if run == 'RUN2':
+          tileCablingSvc.CablingType = 5
+          msg.info("Forcing RUN2a (2018) cabling for online run with geometry %s", geometry)
+      elif run == 'RUN3':
+          tileCablingSvc.CablingType = 6
+          msg.info("Forcing RUN3 cabling for online run with geometry %s", geometry)
+      else:
+          log.error("CablingType only defined for Run 2 and Run 3 geometries")
 
     acc.addService(tileCablingSvc, primary = True)
 
diff --git a/TileCalorimeter/TileConfiguration/python/TileConfigFlags.py b/TileCalorimeter/TileConfiguration/python/TileConfigFlags.py
index 07368f70b3b..46865d9d5d7 100644
--- a/TileCalorimeter/TileConfiguration/python/TileConfigFlags.py
+++ b/TileCalorimeter/TileConfiguration/python/TileConfigFlags.py
@@ -39,6 +39,13 @@ def createTileConfigFlags():
 
 
 def _doOpt2ByDefault(prevFlags):
+      #For online operation don't check run number
+     if prevFlags.Common.isOnline:
+          if 'collisions' in prevFlags.Beam.Type:
+               return False  # Use OF without iterations for collisions
+          else:
+               return True
+
      runNumber = prevFlags.Input.RunNumber[0]
      # Run Optimal Filter with iterations (Opt2) by default,
      # both for cosmics and collisions data before 2011
diff --git a/Trigger/TrigAlgorithms/TrigCaloRec/python/TrigCaloRecConfig.py b/Trigger/TrigAlgorithms/TrigCaloRec/python/TrigCaloRecConfig.py
index 886c27a3c64..39a03868cfe 100755
--- a/Trigger/TrigAlgorithms/TrigCaloRec/python/TrigCaloRecConfig.py
+++ b/Trigger/TrigAlgorithms/TrigCaloRec/python/TrigCaloRecConfig.py
@@ -707,6 +707,23 @@ def hltCaloCellMakerCfg(flags, name=None, roisKey='UNSPECIFIED'):
     acc.addEventAlgo(cellMaker, primary=True)
     return acc
 
+def hltCaloCellSeedlessMakerCfg(flags, roisKey='UNSPECIFIED'):
+    acc = ComponentAccumulator()
+    from TrigT2CaloCommon.TrigCaloDataAccessConfig import trigCaloDataAccessSvcCfg, CaloDataAccessSvcDependencies
+    acc.merge(trigCaloDataAccessSvcCfg(flags))
+
+    hltCaloCellSeedLessMaker = CompFactory.HLTCaloCellMaker("CaloCellSeedLessFS", ExtraInputs = CaloDataAccessSvcDependencies,
+                                                            RoIs = roisKey,
+                                                            CellsName ="SeedLessFS")
+
+    acc.addEventAlgo(hltCaloCellSeedLessMaker, primary=True)
+
+    from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
+    acc.merge(CaloNoiseCondAlgCfg(flags, noisetype="electronicNoise"))
+    acc.addCondAlgo(CompFactory.CaloNoiseSigmaDiffCondAlg())
+
+    return acc
+
 def hltTopoClusterMakerCfg(flags, name, clustersKey, cellsKey="CaloCells"):
     acc = ComponentAccumulator()
     from CaloRec.CaloTopoClusterConfig import (
diff --git a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/python/L1CaloFEXSimCfg.py b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/python/L1CaloFEXSimCfg.py
index feeb56db43d..b0baeff31ae 100644
--- a/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/python/L1CaloFEXSimCfg.py
+++ b/Trigger/TrigT1/L1CaloFEX/L1CaloFEXSim/python/L1CaloFEXSimCfg.py
@@ -6,28 +6,31 @@ def L1CaloFEXSimCfg(flags):
     from AthenaConfiguration.ComponentFactory import CompFactory
     acc = ComponentAccumulator()
 
-    from TrigT1CaloFexPerf.L1PerfControlFlags import L1Phase1PerfFlags as simflags
     if flags.Input.isMC:
-      SCellType = "SCell"
+      sCellType = "SCell"
     else:
-      SCellType = simflags.Calo.SCellType()
+      sCellType = "EmulatedSCell"
+      from TrigT1CaloFexPerf.EmulationConfig import emulateSC_Cfg
+      acc.merge(emulateSC_Cfg(flags,SCOut=sCellType))
+
+
     eFEX = CompFactory.LVL1.eFEXDriver('eFEXDriver',
-        SCell=SCellType )
-    eFEX.eSuperCellTowerMapperTool.SCell=SCellType
-    eFEX.eFEXSysSimTool.SCell=SCellType
+        SCell=sCellType )
+    eFEX.eSuperCellTowerMapperTool = CompFactory.LVL1.eSuperCellTowerMapper('eSuperCellTowerMapper', SCell=sCellType)
+    eFEX.eFEXSysSimTool = CompFactory.LVL1.eFEXSysSim('eFEXSysSimTool', SCell=sCellType)
     acc.addEventAlgo(eFEX)
 
     # jFEX part
     jFEX = CompFactory.LVL1.jFEXDriver('jFEXDriver',
-        SCell=SCellType )
-    jFEX.jSuperCellTowerMapperTool.SCell=SCellType
-    jFEX.jFEXSysSimTool.SCell=SCellType
+        SCell=sCellType )
+    jFEX.jSuperCellTowerMapperTool = CompFactory.LVL1.jSuperCellTowerMapper('jSuperCellTowerMapper', SCell=sCellType)
+    jFEX.jFEXSysSimTool = CompFactory.LVL1.jFEXSysSim('jFEXSysSimTool', SCell=sCellType)
     acc.addEventAlgo(jFEX)
 
     gFEX = CompFactory.LVL1.gFEXDriver('gFEXDriver',
-        SCell=SCellType )
-    gFEX.gSuperCellTowerMapperTool.SCell=SCellType
-    gFEX.gFEXSysSimTool.SCell=SCellType
+        SCell=sCellType )
+    gFEX.gSuperCellTowerMapperTool = CompFactory.LVL1.gSuperCellTowerMapper('gSuperCellTowerMapper', SCell=sCellType)
+    gFEX.gFEXSysSimTool = CompFactory.LVL1.gFEXSysSim('gFEXSysSimTool', SCell=sCellType)
     acc.addEventAlgo(gFEX)
 
     return acc
diff --git a/Trigger/TrigT1/TrigT1CaloFexPerf/python/EmulationConfig.py b/Trigger/TrigT1/TrigT1CaloFexPerf/python/EmulationConfig.py
index c486bbabc8f..6e2dfb28ec0 100644
--- a/Trigger/TrigT1/TrigT1CaloFexPerf/python/EmulationConfig.py
+++ b/Trigger/TrigT1/TrigT1CaloFexPerf/python/EmulationConfig.py
@@ -56,3 +56,32 @@ def emulateSC(sCell_sequence, CellsIn="SeedLessFS", SCOut="EmulatedSCell"):
     if(perfFlags.Calo.ApplyEmulatedPedestal()):
         #Apply the pedestal correction. There may be cases we do not want this. 
         sCell_sequence+=larscbea
+
+def emulateSC_Cfg(flags, CellsIn="SeedLessFS", SCOut="EmulatedSCell"):
+
+    from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
+    from AthenaConfiguration.ComponentFactory import CompFactory
+    acc = ComponentAccumulator()
+    if flags.Input.isMC: 
+        from LArCabling.LArCablingConfig import LArFebRodMappingCfg
+        acc.merge(LArFebRodMappingCfg(flags))
+
+    from TrigCaloRec.TrigCaloRecConfig import hltCaloCellSeedlessMakerCfg
+    acc.merge(hltCaloCellSeedlessMakerCfg(flags, roisKey = ""))
+
+
+    #Use SCEmulation tool that randomly samples time histograms to estimate time for low energy and negative cells forming a supercell 
+    acc.addEventAlgo(CompFactory.LVL1.SCEmulation(InputCells=CellsIn, OutputSuperCells = "EmulatedSCellNoBCID"))
+    
+    from LArROD.LArSCSimpleMakerConfig import LArSuperCellBCIDEmAlgCfg
+
+    larSCargs = {}
+    larSCargs["SCellContainerIn"] = "EmulatedSCellNoBCID"
+    larSCargs["SCellContainerOut"] = SCOut
+
+    if(perfFlags.Calo.ApplyEmulatedPedestal()):
+        #Apply the pedestal correction. There may be cases we do not want this. 
+    #The default input to LARSuperCellBCIDEmAlg (which applies the BCID correction) is the same: SCellContainer
+        acc.merge(LArSuperCellBCIDEmAlgCfg(flags, **larSCargs))
+
+    return acc
diff --git a/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1SimulationConfig.py b/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1SimulationConfig.py
index e113c6211e2..8e8aa612b3e 100644
--- a/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1SimulationConfig.py
+++ b/Trigger/TriggerCommon/TriggerJobOpts/python/Lvl1SimulationConfig.py
@@ -205,9 +205,11 @@ def Lvl1SimulationCfg(flags, seqName = None):
     from TrigT1CaloSim.TrigT1CaloSimRun2Config import L1CaloLegacySimCfg
     acc.merge(L1CaloLegacySimCfg(flags), sequenceName='L1CaloLegacySimSeq')
 
-    #acc.addSequence(seqAND('L1CaloSimSeq'), parentName='L1SimSeq')
-    #from TrigT1CaloSim.TrigT1CaloSimRun2Config import L1CaloSimCfg
-    #acc.merge(L1CaloSimCfg(flags), sequenceName='L1CaloSimSeq')
+    acc.addSequence(seqAND('L1CaloSimSeq'), parentName='L1SimSeq')
+
+    if flags.Trigger.enableL1CaloPhase1:
+        from L1CaloFEXSim.L1CaloFEXSimCfg import L1CaloFEXSimCfg
+        acc.merge(L1CaloFEXSimCfg(flags), sequenceName = 'L1CaloSimSeq')
 
     acc.addSequence(seqAND('L1MuonSimSeq'), parentName='L1SimSeq')
     from TriggerJobOpts.Lvl1MuonSimulationConfig import Lvl1MuonSimulationCfg
-- 
GitLab