ATLAS Offline Software
Loading...
Searching...
No Matches
L1CaloFEXSimCfg.py
Go to the documentation of this file.
2# Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3#
4from AthenaConfiguration.ComponentAccumulator import ComponentAccumulator
5from AthenaConfiguration.ComponentFactory import CompFactory
6from AthenaCommon.Logging import logging
7
8def ReadSCellFromPoolFileCfg(flags, key='SCell'):
9 '''Configure reading SCell container from a Pool file like RDO or ESD'''
10 acc = ComponentAccumulator()
11
12 # Ensure SCell container is in the input file
13 # TODO this needs to be uncommented once all MC files used in tests contain SCells
14 # e.g. test_trig_mc_v1DevHI_build.py
15 # assert key in flags.Input.Collections or not flags.Input.Collections, 'MC input file is required to contain SCell container'
16
17 # Need geometry and conditions for the SCell converter from POOL
18 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
19 acc.merge(LArGMCfg(flags))
20
21 return acc
22
23
24def ReadSCellFromByteStreamCfg(flags, key='SCell', SCmask=True):
25 acc=ComponentAccumulator()
26
27 # Geometry, conditions and cabling setup
28 from TileGeoModel.TileGMConfig import TileGMCfg
29 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
30 from LArCabling.LArCablingConfig import LArLATOMEMappingCfg
31 from LArCabling.LArCablingConfig import LArOnOffIdMappingSCCfg
32 from LArCellRec.LArRAWtoSuperCellConfig import LArRAWtoSuperCellCfg
33 acc.merge(TileGMCfg(flags))
34 acc.merge(LArGMCfg(flags))
35 acc.merge(LArLATOMEMappingCfg(flags))
36 acc.merge(LArOnOffIdMappingSCCfg(flags))
37
38 # Conversion from ByteStream to LArRawSCContainer
39 decoderTool = CompFactory.LArLATOMEDecoder('LArLATOMEDecoder', ProtectSourceId = True)
40 decoderAlg = CompFactory.LArRawSCDataReadingAlg('LArRawSCDataReadingAlg', LATOMEDecoder=decoderTool)
41 acc.addEventAlgo(decoderAlg)
42
43 acc.merge(LArRAWtoSuperCellCfg(flags,mask=SCmask, SCellContainerOut=key) )
44
45 return acc
46
48 """
49 Configure the eFEX TOB Et Tool which recalculates isolation variables
50 The tool requires eTowers as inputs (add eTowerMaker algorithm)
51 """
52 acc = ComponentAccumulator()
53
54 # had to comment this out for now, because it causes a clash with the eTowerMakerFromEfexTowers algorithm
55 # if that gets scheduled
56 #eTowerMakerAlg = CompFactory.LVL1.eTowerMakerFromSuperCells('eTowerMakerFromSuperCells')
57 #acc.addEventAlgo(eTowerMakerAlg)
58
59 eFEXTOBEtTool = CompFactory.LVL1.eFEXTOBEtTool
60 acc.setPrivateTools(eFEXTOBEtTool())
61
62 return acc
63
65 '''Configuration to provide TriggerTowers as input to the Fex simulation'''
66 from AthenaConfiguration.Enums import Format
67 if flags.Input.Format is Format.POOL:
68 # For POOL files produce TT with R2TTMaker
69 from TrigT1CaloSim.TrigT1CaloSimRun2Config import Run2TriggerTowerMakerCfg
70 return Run2TriggerTowerMakerCfg(flags)
71 else:
72 # For RAW decode TT from ByteStream
73 from TrigT1CaloByteStream.LVL1CaloRun2ByteStreamConfig import LVL1CaloRun2ReadBSCfg
74 return LVL1CaloRun2ReadBSCfg(flags)
75
76def L1CaloFEXSimCfg(flags, eFexTowerInputs = ["L1_eFexDataTowers","L1_eFexEmulatedTowers"],deadMaterialCorrections=True, outputSuffix="", simulateAltTau=False):
77 from AthenaConfiguration.Enums import Format
78
79 if not simulateAltTau and flags.DQ.Environment == "tier0":
80 simulateAltTau = True # require alt RoI at tier0 while validating new BDT alg against heuristic
81
82 acc = ComponentAccumulator()
83
84 log = logging.getLogger('L1CaloFEXSimCfg')
85
86
87 # Configure SCell inputs
88 sCellType = flags.Trigger.L1.L1CaloSuperCellContainerName
89 if flags.Input.Format is Format.POOL:
90 # Read SCell directly from input RDO file unless not necessary
91 if 'L1_eFexEmulatedTowers' in eFexTowerInputs and "L1_eFexEmulatedTowers" not in flags.Input.Collections:
92 acc.merge(ReadSCellFromPoolFileCfg(flags,sCellType))
93 if flags.Input.isMC:
94 # wont have eFexDataTowers available so remove that if it appears in input list
95 eFexTowerInputs = [l for l in eFexTowerInputs if l != "L1_eFexDataTowers"]
96 else:
97 from AthenaConfiguration.Enums import LHCPeriod
98 if flags.GeoModel.Run is LHCPeriod.Run2:
99 # Run-2 data inputs, emulate SCells
100 from TrigT1CaloFexPerf.EmulationConfig import emulateSC_Cfg
101 acc.merge(emulateSC_Cfg(flags))
102 else:
103 # Run-3+ data inputs, decode SCells from ByteStream if needed
104 if 'L1_eFexEmulatedTowers' in eFexTowerInputs and "L1_eFexEmulatedTowers" not in flags.Input.Collections:
105 acc.merge(ReadSCellFromByteStreamCfg(flags,key=sCellType))
106
107 # Need also TriggerTowers as input .. so reconstruct if not in input collections already
108 if "xAODTriggerTowers" not in flags.Input.Collections:
109 acc.merge(TriggerTowersInputCfg(flags))
110
111 doV6Mapping=False # latome fex input mapping if different between v5 and v6 ... for now only switching to v6 in data
112 if not flags.Input.isMC and len(flags.Input.RunNumbers)>0: # in HLT reprocessing jobs, the runNumbers list will be empty ... have to default to v5 for now for these jobs
113 from LArConditionsCommon.LArRunFormat import getLArDTInfoForRun
114 runinfo = getLArDTInfoForRun(flags.Input.RunNumbers[0], connstring="COOLONL_LAR/CONDBR2")
115 doV6Mapping = (runinfo.FWversion()==6)
116
117 if doV6Mapping and len(flags.Input.RunNumbers)>0:
118 # add required dbOverride (don't do in athena HLT where we will rely on LAr/LATOME to have set it to the right thing)
119 from IOVDbSvc.IOVDbSvcConfig import addOverride
120 acc.merge( addOverride(flags,folder="/LAR/Identifier/LatomeMapping",tag="LARIdentifierLatomeMapping-fw6") )
121
122
123 if flags.Trigger.L1.doeFex:
124 if 'L1_eFexEmulatedTowers' in eFexTowerInputs and "L1_eFexEmulatedTowers" not in flags.Input.Collections:
125 builderAlg = CompFactory.LVL1.eFexTowerBuilder("L1_eFexEmulatedTowers",UseLATOMEv6Mapping=doV6Mapping,
126 CaloCellContainerReadKey=sCellType,ApplyMasking=not flags.Input.isMC) # builds the emulated towers to use as secondary input to eTowerMaker - name has to match what it gets called in other places to avoid conflict
127 if flags.Input.isMC: builderAlg.LArLatomeHeaderKey=""
128 elif doV6Mapping or len(flags.Input.RunNumbers)==0:
129 builderAlg.MappingFile='' # need to regenerate mapping on-the-fly for v6 or in athena hlt jobs
130 # if regenerating mapping file and this is data, we will need the LATOME headers, otherwise don't use them
131 from LArByteStream.LArRawSCDataReadingConfig import LArRawSCDataReadingCfg
132 acc.merge(LArRawSCDataReadingCfg(flags))
133
134 acc.addEventAlgo( builderAlg )
135
136 if eFexTowerInputs==[]:
137 # no input specified, so use the old eTowerMaker
138 eFEXInputs = CompFactory.LVL1.eTowerMakerFromSuperCells('eTowerMakerFromSuperCells',
139 eSuperCellTowerMapperTool = CompFactory.LVL1.eSuperCellTowerMapper('eSuperCellTowerMapper', SCell=sCellType))
140 else:
141 # if primary is DataTowers, check that caloInputs are enabled (if data towers not already available). If it isn't then skip this
142 if (not flags.Trigger.L1.doCaloInputs) and eFexTowerInputs[0] == "L1_eFexDataTowers" and ("L1_eFexDataTowers" not in flags.Input.Collections):
143 if len(eFexTowerInputs)==1:
144 log.fatal("Requested L1_eFexDataTowers but Trigger.L1.doCaloInputs is False, but not secondary collection given")
145 import sys
146 sys.exit(1)
147 log.warning("Requested L1_eFexDataTowers but Trigger.L1.doCaloInputs is False, falling back to secondary")
148 eFexTowerInputs[0] = eFexTowerInputs[1]
149 eFexTowerInputs[1] = ""
150 eFEXInputs = CompFactory.LVL1.eTowerMakerFromEfexTowers('eTowerMakerFromEfexTowers')
151 eFEXInputs.InputTowers = eFexTowerInputs[0]
152 eFEXInputs.SecondaryInputTowers = eFexTowerInputs[1] if len(eFexTowerInputs) > 1 else ""
153
154 eFEX = CompFactory.LVL1.eFEXDriver('eFEXDriver')
155 eFEX.eFEXSysSimTool = CompFactory.LVL1.eFEXSysSim('eFEXSysSimTool')
156 eFEX.eFEXSysSimTool.eFEXSimTool = CompFactory.LVL1.eFEXSim('eFEXSimTool')
157 eFEX.eFEXSysSimTool.eFEXSimTool.eFEXFPGATool = CompFactory.LVL1.eFEXFPGA('eFEXFPGATool')
158
159 # read algoVersions from menu and configure the algo tools
160 from TrigConfigSvc.TriggerConfigAccess import getL1MenuAccess
161 L1_menu = getL1MenuAccess(flags)
162
163 em_algoVersion = L1_menu.thresholdExtraInfo("eEM").get("algoVersion", 0)
164 tau_algoVersion = L1_menu.thresholdExtraInfo("eTAU").get("algoVersion", 0)
165
166 from PathResolver import PathResolver
167 bdtConfigJsonPath = PathResolver.FindCalibFile("Run3L1CaloSimulation/L1CaloFEXSim/eTAU/" + ("bdt_config_v17.json" if tau_algoVersion==2 else "bdt_config_v16.json"))
168
169 eFEX.eFEXSysSimTool.eFEXSimTool.eFEXFPGATool.eFEXegAlgoTool = CompFactory.LVL1.eFEXegAlgo('eFEXegAlgoTool',algoVersion=em_algoVersion,dmCorr=deadMaterialCorrections) # only dmCorrections in data for now
170 eFEX.eFEXSysSimTool.eFEXSimTool.eFEXFPGATool.eFEXtauAlgoTool = CompFactory.LVL1.eFEXtauAlgo("eFEXtauAlgo") # heuristic algorithm
171 eFEX.eFEXSysSimTool.eFEXSimTool.eFEXFPGATool.eFEXtauBDTAlgoTool = CompFactory.LVL1.eFEXtauBDTAlgo("eFEXtauBDTAlgo", BDTJsonConfigPath=bdtConfigJsonPath)
172 # To dump supercells as a decorator to the tau TOB, set
173 # eFEX.eFEXSysSimTool.eFEXSimTool.eFEXFPGATool.eFEXtauAlgoTool.DumpSuperCells = True
174 # and/or
175 # eFEX.eFEXSysSimTool.eFEXSimTool.eFEXFPGATool.eFEXtauBDTAlgoTool.DumpSuperCells = True
176
177
178
179
180 # load noise cuts and dm corrections when running on data
181 from IOVDbSvc.IOVDbSvcConfig import addFolders#, addFoldersSplitOnline
182
183 acc.merge(addFolders(flags,"/TRIGGER/L1Calo/V1/Calibration/EfexNoiseCuts","TRIGGER_OFL" if flags.Input.isMC else "TRIGGER_ONL",className="CondAttrListCollection"))
184 eFEXInputs.NoiseCutsKey = "/TRIGGER/L1Calo/V1/Calibration/EfexNoiseCuts"
185 acc.merge(addFolders(flags,"/TRIGGER/L1Calo/V1/Calibration/EfexEnergyCalib","TRIGGER_OFL" if flags.Input.isMC else "TRIGGER_ONL",className="CondAttrListCollection")) # dmCorr from DB!
186 eFEX.eFEXSysSimTool.eFEXSimTool.eFEXFPGATool.eFEXegAlgoTool.DMCorrectionsKey = "/TRIGGER/L1Calo/V1/Calibration/EfexEnergyCalib"
187
188 acc.addEventAlgo(eFEXInputs)
189 acc.addEventAlgo(eFEX)
190
191 if simulateAltTau:
192 eFEX.eFEXSysSimTool.Key_eFexAltTauOutputContainer="L1_eTauRoIAlt"
193 eFEX.eFEXSysSimTool.Key_eFexAltTauxTOBOutputContainer="L1_eTauxRoIAlt"
194
195
196 if flags.Trigger.L1.dojFex:
197
198 if flags.Input.Format is not Format.POOL:
199 from L1CaloFEXByteStream.L1CaloFEXByteStreamConfig import jFexInputByteStreamToolCfg
200 inputjFexTool = acc.popToolsAndMerge(jFexInputByteStreamToolCfg(flags, 'jFexInputBSDecoderTool'))
201
202 maybeMissingRobs = []
203 decoderTools = []
204
205 for module_id in inputjFexTool.ROBIDs:
206 maybeMissingRobs.append(module_id)
207
208 decoderTools += [inputjFexTool]
209 decoderAlg = CompFactory.L1TriggerByteStreamDecoderAlg(name="L1TriggerByteStreamDecoder", DecoderTools=[inputjFexTool], MaybeMissingROBs=maybeMissingRobs)
210 acc.addEventAlgo(decoderAlg)
211
212 if "L1_jFexEmulatedTowers" not in flags.Input.Collections:
213 from L1CaloFEXAlgos.FexEmulatedTowersConfig import jFexEmulatedTowersCfg
214 acc.merge(jFexEmulatedTowersCfg(flags))
215
216 from L1CaloFEXCond.L1CaloFEXCondConfig import jFexDBConfig
217 acc.merge(jFexDBConfig(flags))
218
219 jFEXInputs = CompFactory.LVL1.jTowerMakerFromJfexTowers('jTowerMakerFromJfexTowers')
220 jFEXInputs.IsMC = flags.Input.isMC
221 jFEXInputs.jSuperCellTowerMapperTool = CompFactory.LVL1.jSuperCellTowerMapper('jSuperCellTowerMapper', SCell=sCellType)
222 jFEXInputs.jSuperCellTowerMapperTool.SCellMasking = not flags.Input.isMC
223 # need to set an IsMC property on a tool deep inside the toolstack:
224 jFEX = CompFactory.LVL1.jFEXDriver('jFEXDriver',jFEXSysSimTool=CompFactory.LVL1.jFEXSysSim(
225 'jFEXSysSimTool',jFEXSimTool=CompFactory.LVL1.jFEXSim(
226 'LVL1::jFEXSim',jFEXFPGATool=CompFactory.LVL1.jFEXFPGA(
227 'LVL1::jFEXFPGA',jFEXLargeRJetAlgoTool="", # disables jLJ algorithm - will produce empty container
228 IjFEXFormTOBsTool=CompFactory.LVL1.jFEXFormTOBs(
229 'LVL1::jFEXFormTOBs',IsMC=flags.Input.isMC)))))
230 acc.addEventAlgo(jFEXInputs)
231 acc.addEventAlgo(jFEX)
232
233
234 if flags.Trigger.L1.dogFex:
235
236 if flags.Input.Format is not Format.POOL:
237 from L1CaloFEXByteStream.L1CaloFEXByteStreamConfig import gFexInputByteStreamToolCfg
238 inputgFexTool = acc.popToolsAndMerge(gFexInputByteStreamToolCfg(flags, 'gFexInputBSDecoderTool'))
239
240 maybeMissingRobs = []
241 decoderTools = []
242
243 for module_id in inputgFexTool.ROBIDs:
244 maybeMissingRobs.append(module_id)
245
246 decoderTools += [inputgFexTool]
247 decoderAlg = CompFactory.L1TriggerByteStreamDecoderAlg(name="L1TriggerByteStreamDecoder", DecoderTools=[inputgFexTool], MaybeMissingROBs=maybeMissingRobs)
248 acc.addEventAlgo(decoderAlg)
249
250 # only create emulated towers if not a POOL file or not EmulatedTowers collection
251 if not Format.POOL or "L1_gFexEmulatedTowers" not in flags.Input.Collections:
252 from L1CaloFEXAlgos.FexEmulatedTowersConfig import gFexEmulatedTowersCfg
253 acc.merge(gFexEmulatedTowersCfg(flags,name="L1_gFexEmulatedTowers"))
254
255 gFEXTowerSummer = CompFactory.LVL1.gFexTowerSummer('gFexTowerSummer')
256 gFEXTowerSummer.gFexDataTowers = "L1_gFexEmulatedTowers" if flags.Input.isMC else "L1_gFexDataTowers"
257 gFEXTowerSummer.gTowers200WriteKey = "L1_gFexEmulatedTowers200" if flags.Input.isMC else "L1_gFexDataTowers200"
258 gFEXTowerSummer.gTowers50WriteKey = "L1_gFexEmulatedTowers50" if flags.Input.isMC else "L1_gFexDataTowers50"
259 gFEXTowerSummer.gTowersEMWriteKey = ""
260 gFEXTowerSummer.gTowersHADWriteKey = ""
261 acc.addEventAlgo(gFEXTowerSummer)
262
263 gFEXInputs = CompFactory.LVL1.gTowerMakerFromGfexTowers('gTowerMakerFromGfexTowers')
264 gFEXInputs.InputDataTowers = "L1_gFexEmulatedTowers200" if flags.Input.isMC else "L1_gFexDataTowers200"
265 gFEXInputs.MyGTowers = "gTowerContainer"
266
267 gFEXInputs50 = CompFactory.LVL1.gTowerMakerFromGfexTowers('gTowerMakerFromGfexTowers50')
268 gFEXInputs50.InputDataTowers = "L1_gFexEmulatedTowers50" if flags.Input.isMC else "L1_gFexDataTowers50"
269 gFEXInputs50.MyGTowers = "gTower50Container"
270
271 from L1CaloFEXCond.L1CaloFEXCondConfig import gFexDBConfig
272 acc.merge(gFexDBConfig(flags))
273
274 gFEX = CompFactory.LVL1.gFEXDriver('gFEXDriver')
275 gFEX.gFEXSysSimTool = CompFactory.LVL1.gFEXSysSim('gFEXSysSimTool')
276 acc.addEventAlgo(gFEXInputs)
277 acc.addEventAlgo(gFEXInputs50)
278 acc.addEventAlgo(gFEX)
279
280 if flags.Trigger.doHLT:
281 # This will be the case when the offline simulation is actually being run as part of MC
282 # as opposed to running another pass of the simulation on either an MC or data file (e.g in DAOD)
283 # Check the RoI EDM containers are registered in HLT outputs
284 from TrigEDMConfig.TriggerEDM import recordable
285 def check(key):
286 assert key==recordable(key), f'recordable() check failed for {key}'
287 if flags.Trigger.L1.doeFex:
288 check(eFEX.eFEXSysSimTool.Key_eFexEMOutputContainer)
289 check(eFEX.eFEXSysSimTool.Key_eFexTauOutputContainer)
290 if (simulateAltTau):
291 check(eFEX.eFEXSysSimTool.Key_eFexAltTauOutputContainer)
292 if flags.Trigger.L1.dojFex:
293 check(jFEX.jFEXSysSimTool.Key_jFexSRJetOutputContainer)
294 check(jFEX.jFEXSysSimTool.Key_jFexLRJetOutputContainer)
295 check(jFEX.jFEXSysSimTool.Key_jFexTauOutputContainer)
296 check(jFEX.jFEXSysSimTool.Key_jFexSumETOutputContainer)
297 check(jFEX.jFEXSysSimTool.Key_jFexMETOutputContainer)
298 check(jFEX.jFEXSysSimTool.Key_jFexFwdElOutputContainer)
299 if flags.Trigger.L1.dogFex:
300 check(gFEX.gFEXSysSimTool.Key_gFexSRJetOutputContainer)
301 check(gFEX.gFEXSysSimTool.Key_gFexLRJetOutputContainer)
302 check(gFEX.gFEXSysSimTool.Key_gFexRhoOutputContainer)
303 check(gFEX.gFEXSysSimTool.Key_gScalarEJwojOutputContainer)
304 check(gFEX.gFEXSysSimTool.Key_gMETComponentsJwojOutputContainer)
305 check(gFEX.gFEXSysSimTool.Key_gMHTComponentsJwojOutputContainer)
306 check(gFEX.gFEXSysSimTool.Key_gMSTComponentsJwojOutputContainer)
307 check(gFEX.gFEXSysSimTool.Key_gMETComponentsNoiseCutOutputContainer)
308 check(gFEX.gFEXSysSimTool.Key_gMETComponentsRmsOutputContainer)
309 check(gFEX.gFEXSysSimTool.Key_gScalarENoiseCutOutputContainer)
310 check(gFEX.gFEXSysSimTool.Key_gScalarERmsOutputContainer)
311 else:
312 # Rename outputs for monitoring resimulation to avoid clash with standard SG keys
313 def getSimHandle(key):
314 """
315 Add 'Sim' to the standard handle path and include user-specified suffix
316 """
317 key += outputSuffix
318 if not key.endswith("Sim"): key += "Sim"
319 return key
320
321 if flags.Trigger.L1.doeFex:
322 eFEX.eFEXSysSimTool.Key_eFexEMOutputContainer=getSimHandle("L1_eEMRoI")
323 eFEX.eFEXSysSimTool.Key_eFexTauOutputContainer=getSimHandle("L1_eTauRoI")
324 eFEX.eFEXSysSimTool.Key_eFexEMxTOBOutputContainer=getSimHandle("L1_eEMxRoI")
325 eFEX.eFEXSysSimTool.Key_eFexTauxTOBOutputContainer=getSimHandle("L1_eTauxRoI")
326 if simulateAltTau:
327 eFEX.eFEXSysSimTool.Key_eFexAltTauOutputContainer=getSimHandle("L1_eTauRoIAlt")
328 eFEX.eFEXSysSimTool.Key_eFexAltTauxTOBOutputContainer=getSimHandle("L1_eTauxRoIAlt")
329
330 if flags.Trigger.L1.dojFex:
331 jFEX.jFEXSysSimTool.Key_jFexSRJetOutputContainer=getSimHandle("L1_jFexSRJetRoI")
332 jFEX.jFEXSysSimTool.Key_jFexLRJetOutputContainer=getSimHandle("L1_jFexLRJetRoI")
333 jFEX.jFEXSysSimTool.Key_jFexTauOutputContainer=getSimHandle("L1_jFexTauRoI")
334 jFEX.jFEXSysSimTool.Key_jFexSumETOutputContainer=getSimHandle("L1_jFexSumETRoI")
335 jFEX.jFEXSysSimTool.Key_jFexMETOutputContainer=getSimHandle("L1_jFexMETRoI")
336 jFEX.jFEXSysSimTool.Key_jFexFwdElOutputContainer=getSimHandle("L1_jFexFwdElRoI")
337 jFEX.jFEXSysSimTool.Key_xTobOutKey_jJ=getSimHandle("L1_jFexSRJetxRoI")
338 jFEX.jFEXSysSimTool.Key_xTobOutKey_jLJ=getSimHandle("L1_jFexLRJetxRoI")
339 jFEX.jFEXSysSimTool.Key_xTobOutKey_jTau=getSimHandle("L1_jFexTauxRoI")
340 jFEX.jFEXSysSimTool.Key_xTobOutKey_jEM=getSimHandle("L1_jFexFwdElxRoI")
341 if flags.Trigger.L1.dogFex:
342 gFEX.gFEXSysSimTool.Key_gFexSRJetOutputContainer=getSimHandle("L1_gFexSRJetRoI")
343 gFEX.gFEXSysSimTool.Key_gFexLRJetOutputContainer=getSimHandle("L1_gFexLRJetRoI")
344 gFEX.gFEXSysSimTool.Key_gFexRhoOutputContainer=getSimHandle("L1_gFexRhoRoI")
345 gFEX.gFEXSysSimTool.Key_gScalarEJwojOutputContainer=getSimHandle("L1_gScalarEJwoj")
346 gFEX.gFEXSysSimTool.Key_gMETComponentsJwojOutputContainer=getSimHandle("L1_gMETComponentsJwoj")
347 gFEX.gFEXSysSimTool.Key_gMHTComponentsJwojOutputContainer=getSimHandle("L1_gMHTComponentsJwoj")
348 gFEX.gFEXSysSimTool.Key_gMSTComponentsJwojOutputContainer=getSimHandle("L1_gMSTComponentsJwoj")
349 gFEX.gFEXSysSimTool.Key_gMETComponentsNoiseCutOutputContainer=getSimHandle("L1_gMETComponentsNoiseCut")
350 gFEX.gFEXSysSimTool.Key_gMETComponentsRmsOutputContainer=getSimHandle("L1_gMETComponentsRms")
351 gFEX.gFEXSysSimTool.Key_gScalarENoiseCutOutputContainer=getSimHandle("L1_gScalarENoiseCut")
352 gFEX.gFEXSysSimTool.Key_gScalarERmsOutputContainer=getSimHandle("L1_gScalarERms")
353
354 return acc
355
356
357if __name__ == '__main__':
358
361 import argparse
362 p = argparse.ArgumentParser()
363 p.add_argument('-i', '--input',
364 metavar='KEY',
365 default='ttbar',
366 help='Key of the input from TrigValInputs to be used, default=%(default)s')
367 p.add_argument('-e', '--execute',
368 action='store_true',
369 help='After building the configuration, also process a few events')
370 p.add_argument('-n', '--nevents',
371 metavar='N',
372 type=int,
373 default=25,
374 help='Number of events to process if --execute is used, default=%(default)s')
375 p.add_argument('-d', '--efexdebug',
376 action='store_true',
377 help='Activate DEBUG mode for eFEX driver .. this option is required by a unit test')
378
379 args = p.parse_args()
380
381
384 from AthenaConfiguration.AllConfigFlags import initConfigFlags
385 from TrigValTools.TrigValSteering import Input
386 import os
387
388 flags = initConfigFlags()
389 flags.Common.isOnline = True
390 flags.Input.Files = [args.input] if os.path.isfile(args.input) else Input.get_input(args.input).paths
391 if not flags.Input.isMC:
392 from AthenaConfiguration.TestDefaults import defaultGeometryTags
393 flags.GeoModel.AtlasVersion = defaultGeometryTags.autoconfigure(flags)
394 from AthenaConfiguration.Enums import LHCPeriod
395 flags.IOVDb.GlobalTag = 'CONDBR2-HLTP-2023-01' if flags.GeoModel.Run is LHCPeriod.Run3 else 'CONDBR2-HLTP-2018-04'
396 else:
397 from AthenaConfiguration.TestDefaults import defaultConditionsTags
398 flags.IOVDb.GlobalTag = defaultConditionsTags.RUN3_MC
399 flags.Output.AODFileName = 'AOD.pool.root'
400 flags.Exec.MaxEvents = args.nevents
401 flags.Concurrency.NumThreads = 1
402 flags.Concurrency.NumConcurrentEvents = 1
403 flags.Scheduler.ShowDataDeps = True
404 flags.Scheduler.CheckDependencies = True
405 flags.Scheduler.ShowDataFlow = True
406 flags.Trigger.EDMVersion = 3
407 flags.Trigger.doLVL1 = True
408 flags.Trigger.enableL1CaloPhase1 = True
409 flags.Trigger.triggerConfig = 'FILE'
410
411 # Enable only calo for this test
412 from AthenaConfiguration.DetectorConfigFlags import setupDetectorFlags
413 setupDetectorFlags(flags, ['LAr','Tile','MBTS'], toggle_geometry=True)
414
415 flags.lock()
416
417
420 from AthenaConfiguration.MainServicesConfig import MainServicesCfg
421 acc = MainServicesCfg(flags)
422
423 from AthenaConfiguration.Enums import Format
424 if flags.Input.Format == Format.POOL:
425 from AthenaPoolCnvSvc.PoolReadConfig import PoolReadCfg
426 acc.merge(PoolReadCfg(flags))
427 else:
428 from TriggerJobOpts.TriggerByteStreamConfig import ByteStreamReadCfg
429 acc.merge(ByteStreamReadCfg(flags))
430
431 from TrigConfigSvc.TrigConfigSvcCfg import L1ConfigSvcCfg, generateL1Menu, createL1PrescalesFileFromMenu
432 generateL1Menu(flags)
433 createL1PrescalesFileFromMenu(flags)
434 acc.merge(L1ConfigSvcCfg(flags))
435
436 from OutputStreamAthenaPool.OutputStreamConfig import OutputStreamCfg
437 FexEDMList = [
438 'xAOD::eFexEMRoIContainer#L1_eEMRoI','xAOD::eFexEMRoIAuxContainer#L1_eEMRoIAux.',
439 'xAOD::eFexTauRoIContainer#L1_eTauRoI','xAOD::eFexTauRoIAuxContainer#L1_eTauRoIAux.',
440 'xAOD::jFexTauRoIContainer#L1_jFexTauRoI','xAOD::jFexTauRoIAuxContainer#L1_jFexTauRoIAux.',
441 'xAOD::jFexSRJetRoIContainer#L1_jFexSRJetRoI','xAOD::jFexSRJetRoIAuxContainer#L1_jFexSRJetRoIAux.',
442 'xAOD::jFexLRJetRoIContainer#L1_jFexLRJetRoI','xAOD::jFexLRJetRoIAuxContainer#L1_jFexLRJetRoIAux.',
443 'xAOD::jFexMETRoIContainer#L1_jFexMETRoI','xAOD::jFexMETRoIAuxContainer#L1_jFexMETRoIAux.',
444 'xAOD::jFexSumETRoIContainer#L1_jFexSumETRoI','xAOD::jFexSumETRoIAuxContainer#L1_jFexSumETRoIAux.',
445 'xAOD::gFexJetRoIContainer#L1_gFexSRJetRoI','xAOD::gFexJetRoIAuxContainer#L1_gFexSRJetRoIAux.',
446 'xAOD::gFexJetRoIContainer#L1_gFexLRJetRoI','xAOD::gFexJetRoIAuxContainer#L1_gFexLRJetRoIAux.',
447 'xAOD::gFexJetRoIContainer#L1_gFexRhoRoI','xAOD::gFexJetRoIAuxContainer#L1_gFexRhoRoIAux.',
448 'xAOD::gFexGlobalRoIContainer#L1_gScalarEJwoj','xAOD::gFexGlobalRoIAuxContainer#L1_gScalarEJwojAux.',
449 'xAOD::gFexGlobalRoIContainer#L1_gMETComponentsJwoj','xAOD::gFexGlobalRoIAuxContainer#L1_gMETComponentsJwojAux.',
450 'xAOD::gFexGlobalRoIContainer#L1_gMHTComponentsJwoj','xAOD::gFexGlobalRoIAuxContainer#L1_gMHTComponentsJwojAux.',
451 'xAOD::gFexGlobalRoIContainer#L1_gMSTComponentsJwoj','xAOD::gFexGlobalRoIAuxContainer#L1_gMSTComponentsJwojAux.',
452 'xAOD::gFexGlobalRoIContainer#L1_gMETComponentsNoiseCut','xAOD::gFexGlobalRoIAuxContainer#L1_gMETComponentsNoiseCutAux.',
453 'xAOD::gFexGlobalRoIContainer#L1_gMETComponentsRms','xAOD::gFexGlobalRoIAuxContainer#L1_gMETComponentsRmsAux.',
454 'xAOD::gFexGlobalRoIContainer#L1_gScalarENoiseCut','xAOD::gFexGlobalRoIAuxContainer#L1_gScalarENoiseCutAux.',
455 'xAOD::gFexGlobalRoIContainer#L1_gScalarERms','xAOD::gFexGlobalRoIAuxContainer#L1_gScalarERmsAux.',
456
457 ]
458 acc.merge(OutputStreamCfg(flags, 'AOD', ItemList=FexEDMList))
459
460
463 acc.merge(L1CaloFEXSimCfg(flags))
464 if args.efexdebug:
465 from AthenaCommon.Constants import DEBUG
466 acc.getEventAlgo("eFEXDriver").OutputLevel = DEBUG
467
468
471 with open("L1Sim.pkl", "wb") as f:
472 acc.store(f)
473 f.close()
474
475 if args.execute:
476 sc = acc.run()
477 if sc.isFailure():
478 exit(1)
static std::string FindCalibFile(const std::string &logical_file_name)
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:130
TriggerTowersInputCfg(flags)
ReadSCellFromByteStreamCfg(flags, key='SCell', SCmask=True)
ReadSCellFromPoolFileCfg(flags, key='SCell')