3 from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
4 from AthenaConfiguration.ComponentFactory
import CompFactory
5 from AthenaMonitoringKernel.GenericMonitoringTool
import GenericMonitoringTool
12 from L1TopoSimulation.L1TopoInputHistograms
import configureEMTauInputProviderHistograms, configureEnergyInputProviderHistograms, configureJetInputProviderHistograms
13 emtauProvider = CompFactory.LVL1.EMTauInputProvider(
"EMTauInputProvider")
15 emtauProvider.MonTool.HistPath =
'L1LegacyTopoSimulation/EMTauInputProvider'
17 energyProvider = CompFactory.LVL1.EnergyInputProvider(
"EnergyInputProvider")
19 energyProvider.MonTool.HistPath =
'L1LegacyTopoSimulation/EnergyInputProvider'
21 jetProvider = CompFactory.LVL1.JetInputProvider(
"JetInputProvider")
23 jetProvider.MonTool.HistPath =
'L1LegacyTopoSimulation/JetInputProvider'
26 topoSimAlg = CompFactory.LVL1.L1TopoSimulation(
"L1LegacyTopoSimulation",
27 EMTAUInputProvider = emtauProvider,
28 JetInputProvider = jetProvider,
29 EnergyInputProvider = energyProvider,
31 InputDumpFile =
"inputdump_legacy.txt",
32 EnableInputDump = flags.Trigger.enableL1TopoDump,
33 UseBitwise = flags.Trigger.enableL1TopoBWSimulation,
34 MonHistBaseDir =
"L1/L1LegacyTopoAlgorithms"
38 topoSimAlg.MuonInputProvider.locationMuCTPItoL1Topo =
""
39 topoSimAlg.MuonInputProvider.locationMuCTPItoL1Topo1 =
""
40 topoSimAlg.MuonInputProvider.locationMuonRoI =
""
41 topoSimAlg.MuonInputProvider.locationMuonRoI1 =
""
42 topoSimAlg.MuonInputProvider.ROIBResultLocation =
""
44 acc.addEventAlgo(topoSimAlg)
53 muProvider = CompFactory.LVL1.MuonInputProvider(
"MuonInputProvider")
56 If muons coming from the decoding, we use MuonRoI, otherwise MuCTPIL1Topo
57 So here we should be adding proper flag for P1, and when input file is RAW
58 Simply, if muons are simulated, we will use MuCTPIL1Topo, if decoded MuonRoI
64 muProvider.locationMuCTPItoL1Topo =
""
65 muProvider.locationMuCTPItoL1Topo1 =
""
67 muProvider.locationMuonRoI =
""
68 muProvider.locationMuonRoI1 =
""
71 from TrigT1MuonRecRoiTool.TrigT1MuonRecRoiToolConfig
import RPCRecRoiToolCfg, TGCRecRoiToolCfg
75 emtauProvider = CompFactory.LVL1.eFexInputProvider(
"eFexInputProvider")
76 jetProvider = CompFactory.LVL1.jFexInputProvider(
"jFexInputProvider")
77 energyProvider = CompFactory.LVL1.gFexInputProvider(
"gFexInputProvider")
79 controlHistSvc = CompFactory.LVL1.ControlHistSvc(
"ControlHistSvc")
81 if not flags.Trigger.enableL1CaloPhase1:
82 emtauProvider.eFexEMRoIKey =
""
83 emtauProvider.eFexTauRoIKey =
""
84 jetProvider.jFexSRJetRoIKey =
""
85 jetProvider.jFexLRJetRoIKey =
""
86 jetProvider.jFexFwdElRoIKey =
""
87 jetProvider.jFexTauRoIKey =
""
88 jetProvider.jFexMETRoIKey =
""
89 jetProvider.jFexSumETRoIKey =
""
90 energyProvider.gFexSRJetRoIKey =
""
91 energyProvider.gFexLRJetRoIKey =
""
92 energyProvider.gMETComponentsJwojKey =
""
93 energyProvider.gMHTComponentsJwojKey =
""
94 energyProvider.gMETComponentsNoiseCutKey =
""
95 energyProvider.gMETComponentsRmsKey =
""
96 energyProvider.gScalarEJwojKey =
""
98 topoSimAlg = CompFactory.LVL1.L1TopoSimulation(name,
99 MuonInputProvider = muProvider,
100 EMTAUInputProvider = emtauProvider,
101 JetInputProvider = jetProvider,
102 EnergyInputProvider = energyProvider,
103 ControlHistSvc = controlHistSvc,
104 IsLegacyTopo =
False,
105 EnableInputDump = flags.Trigger.enableL1TopoDump,
106 UseBitwise = flags.Trigger.enableL1TopoBWSimulation
108 if name!=
"L1TopoSimulation":
109 topoSimAlg.MonHistBaseDir =
"L1/OnlineL1TopoAlgorithms"
111 acc.addEventAlgo(topoSimAlg)
115 from L1TopoOnlineMonitoring
import L1TopoOnlineMonitoringConfig
as TopoMonConfig
116 if name==
"L1TopoSimulation":
117 acc.addEventAlgo(TopoMonConfig.getL1TopoPhase1OnlineMonitor(flags,
'L1/L1TopoSimDecisions'))
119 acc.addEventAlgo(TopoMonConfig.getL1TopoPhase1OnlineMonitor(flags,
'L1/OnlineL1TopoSimDecisions',
120 toolName=name+
"_Monitor"))
128 efex_provider_attr = [
'eFexEMRoI',
'eFexTauRoI']
129 jfex_provider_attr = [
'jFexSRJetRoI',
'jFexLRJetRoI',
'jFexFwdElRoI',
'jFexTauRoI',
'jFexMETRoI',
'jFexSumETRoI']
130 gfex_provider_attr = [
'gFexSRJetRoI',
'gFexLRJetRoI',
'gScalarEJwoj',
'gMETComponentsJwoj',
'gMHTComponentsJwoj',
'gMETComponentsNoiseCut',
'gMETComponentsRms']
136 from L1TopoSimulation.L1TopoInputHistograms
import configureMuonInputProviderHistograms, configureeFexInputProviderHistograms, configurejFexInputProviderHistograms, configuregFexInputProviderHistograms
141 muProvider = CompFactory.LVL1.MuonInputProvider(
"MuonInputProvider")
143 if flags.Trigger.L1.doMuonTopoInputs:
144 muProvider.locationMuCTPItoL1Topo =
""
145 muProvider.locationMuCTPItoL1Topo1 =
""
147 muProvider.locationMuonRoI =
""
148 muProvider.locationMuonRoI1 =
""
151 from TrigT1MuonRecRoiTool.TrigT1MuonRecRoiToolConfig
import RPCRecRoiToolCfg, TGCRecRoiToolCfg
155 muProvider.MonTool.HistPath =
'L1TopoSimulation/MuonInputProvider'
159 efexProvider = CompFactory.LVL1.eFexInputProvider(
"eFexInputProvider")
161 efexProvider.MonTool.HistPath =
'L1TopoSimulation/eFexInputProvider'
163 jfexProvider = CompFactory.LVL1.jFexInputProvider(
"jFexInputProvider")
165 jfexProvider.MonTool.HistPath =
'L1TopoSimulation/jFexInputProvider'
167 gfexProvider = CompFactory.LVL1.gFexInputProvider(
"gFexInputProvider")
169 gfexProvider.MonTool.HistPath =
'L1TopoSimulation/gFexInputProvider'
172 for attr
in efex_provider_attr:
173 res = [x
for x
in outputEDM
if attr
in x]
175 key = res[0].
split(
'#')[1]
176 print (f
'Key found for eFEX: {key}')
177 setattr(efexProvider,attr+
'Key',key)
179 setattr(efexProvider,attr+
'Key',
'')
181 for attr
in jfex_provider_attr:
182 res = [x
for x
in outputEDM
if attr
in x]
184 key = res[0].
split(
'#')[1]
185 print (f
'Key found for jFEX: {key}')
186 setattr(jfexProvider,attr+
'Key',key)
188 setattr(jfexProvider,attr+
'Key',
'')
190 for attr
in gfex_provider_attr:
191 res = [x
for x
in outputEDM
if attr
in x]
193 key = res[0].
split(
'#')[1]
194 print (f
'Key found for gFEX: {key}')
195 setattr(gfexProvider,attr+
'Key',key)
197 setattr(gfexProvider,attr+
'Key',
'')
199 topoSimAlg = CompFactory.LVL1.L1TopoSimulation(
"L1TopoSimulation",
200 MuonInputProvider = muProvider,
201 EMTAUInputProvider = efexProvider,
202 JetInputProvider = jfexProvider,
203 EnergyInputProvider = gfexProvider,
204 IsLegacyTopo =
False,
205 EnableInputDump = flags.Trigger.enableL1TopoDump,
206 UseBitwise = flags.Trigger.enableL1TopoBWSimulation
209 acc.addEventAlgo(topoSimAlg)
213 if __name__ ==
'__main__':
214 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
215 from AthenaCommon.Logging
import logging
218 from argparse
import RawTextHelpFormatter
220 from libpyeformat_helper
import SourceIdentifier, SubDetector
222 log = logging.getLogger(
'runL1TopoSim')
226 parser = argparse.ArgumentParser(
"Running L1TopoSimulation standalone for the BS input", formatter_class=RawTextHelpFormatter)
227 parser.add_argument(
"-i",
"--inputs",nargs=
'*',action=
"store", dest=
"inputs", help=
"Inputs will be used in commands", required=
True)
228 parser.add_argument(
"-m",
"--module",action=
"store", dest=
"module", help=
"Input modules wants to be simulated.",default=
"", required=
False)
229 parser.add_argument(
"-bw",
"--useBitWise",action=
"store_true", dest=
"useBW", help=
"Run with L1Topo Bitwise simulation?",default=
True, required=
False)
230 parser.add_argument(
"-ifex",
"--doCaloInput",action=
"store_true", dest=
"doCaloInput", help=
"Decoding L1Calo inputs",default=
False, required=
False)
231 parser.add_argument(
"-fCtp",
"--forceCtp",action=
"store_true", dest=
"forceCtp", help=
"Force to CTP monitoring as primary in Sim/Hdw comparison.",default=
False, required=
False)
232 parser.add_argument(
"-hdwMon",
"--algoHdwMon",action=
"store_true", dest=
"algoHdwMon", help=
"Fill algorithm histograms based on hardware decision.",default=
False, required=
False)
233 parser.add_argument(
"-perfMon",
"--perfMonitoring",action=
"store_true", dest=
"perfmon", help=
"Enable performance monitoring",default=
False, required=
False)
234 parser.add_argument(
"-l",
"--logLevel",action=
"store", dest=
"log", help=
"Log level.",default=
"warning", required=
False)
235 parser.add_argument(
"-n",
"--nevent", type=int, action=
"store", dest=
"nevent", help=
"Maximum number of events will be executed.",default=0, required=
False)
236 parser.add_argument(
"-s",
"--skipEvents", type=int, action=
"store", dest=
"skipEvents", help=
"How many events will be skipped.",default=0, required=
False)
237 parser.add_argument(
"-d",
"--enableL1TopoDump", type=bool, action=
"store", dest=
"enableL1TopoDump", help=
"Whether to output events into inputdump.txt",default=
False, required=
False)
238 args = parser.parse_args()
240 supportedSubsystems = [
'Muons',
'jFex',
'eFex',
'gFex',
'Topo']
241 args_subsystem = args.module.split(
',')
242 subsystem =
list(
set(args_subsystem) &
set(supportedSubsystems) )
243 filename = args.inputs
245 if len(subsystem)==0:
246 log.warning(f
'subsystem not given or the given subsystem not supported with one of the: {supportedSubsystems}')
248 if args.log ==
'info': algLogLevel = INFO
249 if args.log ==
'warning': algLogLevel = WARNING
250 if args.log ==
'debug': algLogLevel = DEBUG
251 if args.log ==
'verbose': algLogLevel = VERBOSE
255 flags.Exec.OutputLevel = algLogLevel
257 flags.Exec.MaxEvents = args.nevent
258 flags.Trigger.triggerMenuSetup =
'PhysicsP1_pp_run3_v1'
259 flags.Trigger.triggerConfig =
'DB'
260 flags.Input.Files = args.inputs
261 flags.Concurrency.NumThreads = 1
262 flags.Concurrency.NumConcurrentEvents = 1
263 flags.Exec.SkipEvents = args.skipEvents
264 flags.Output.AODFileName =
'AOD.pool.root'
265 flags.Trigger.L1.doMuon =
True
266 flags.Trigger.enableL1MuonPhase1 =
True
267 flags.Trigger.L1.doMuonTopoInputs =
True
268 flags.Trigger.enableL1TopoBWSimulation = args.useBW
269 flags.PerfMon.doFullMonMT = args.perfmon
270 flags.PerfMon.OutputJSON =
'perfmonmt_test.json'
271 flags.Trigger.enableL1TopoDump = args.enableL1TopoDump
272 if not flags.Input.isMC:
273 from AthenaConfiguration.TestDefaults
import defaultGeometryTags
274 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN2
277 from AthenaConfiguration.MainServicesConfig
import MainServicesCfg
281 from PerfMonComps.PerfMonCompsConfig
import PerfMonMTSvcCfg
284 from TriggerJobOpts.TriggerByteStreamConfig
import ByteStreamReadCfg
288 from TrigConfigSvc.TrigConfigSvcCfg
import L1ConfigSvcCfg,generateL1Menu
290 if "data22" not in filename:
294 from AnalysisTriggerAlgs.AnalysisTriggerAlgsConfig
import RoIBResultToxAODCfg
296 acc.merge(xRoIBResultAcc)
300 maybeMissingRobs = []
302 from TrigT1ResultByteStream.TrigT1ResultByteStreamConfig
import RoIBResultByteStreamToolCfg
304 decoderTools += [roibResultTool]
306 for module_id
in roibResultTool.L1TopoModuleIds:
307 maybeMissingRobs.append(
int(SourceIdentifier(SubDetector.TDAQ_CALO_TOPO_PROC, module_id)))
309 for module_id
in roibResultTool.JetModuleIds:
310 maybeMissingRobs.append(
int(SourceIdentifier(SubDetector.TDAQ_CALO_JET_PROC_ROI, module_id)))
312 for module_id
in roibResultTool.EMModuleIds:
313 maybeMissingRobs.append(
int(SourceIdentifier(SubDetector.TDAQ_CALO_CLUSTER_PROC_ROI, module_id)))
317 auxType = edmType.replace(
'Container',
'AuxContainer')
318 return [f
'{edmType}#{edmName}',
319 f
'{auxType}#{edmName}Aux.']
321 outputEDM += [
'CTP_RDO#*']
322 outputEDM += [
'ROIB::RoIBResult#*']
324 outputEDM +=
addEDM(
'xAOD::JetEtRoI' ,
'LVL1JetEtRoI')
325 outputEDM +=
addEDM(
'xAOD::JetRoIContainer' ,
'LVL1JetRoIs')
326 outputEDM +=
addEDM(
'xAOD::EmTauRoIContainer',
'LVL1EmTauRoIs')
328 outputEDM += [
"xAOD::EnergySumRoI#LVL1EnergySumRoI",
"xAOD::EnergySumRoIAuxInfo#LVL1EnergySumRoIAux."]
330 if 'Muons' in subsystem:
331 from MuonConfig.MuonBytestreamDecodeConfig
import RpcBytestreamDecodeCfg,TgcBytestreamDecodeCfg
333 acc.merge(rpcdecodingAcc)
335 acc.merge(tgcdecodingAcc)
337 from TrigT1ResultByteStream.TrigT1ResultByteStreamConfig
import MuonRoIByteStreamToolCfg
339 decoderTools += [muonRoiTool]
340 outputEDM +=
addEDM(
'xAOD::MuonRoIContainer' ,
'*')
341 maybeMissingRobs += muonRoiTool.ROBIDs
343 if 'jFex' in subsystem:
344 from L1CaloFEXByteStream.L1CaloFEXByteStreamConfig
import jFexRoiByteStreamToolCfg,jFexInputByteStreamToolCfg
346 decoderTools += [jFexTool]
347 outputEDM +=
addEDM(
'xAOD::jFexSRJetRoIContainer', jFexTool.jJRoIContainerWriteKey.Path)
348 outputEDM +=
addEDM(
'xAOD::jFexLRJetRoIContainer', jFexTool.jLJRoIContainerWriteKey.Path)
349 outputEDM +=
addEDM(
'xAOD::jFexTauRoIContainer' , jFexTool.jTauRoIContainerWriteKey.Path)
350 outputEDM +=
addEDM(
'xAOD::jFexFwdElRoIContainer', jFexTool.jEMRoIContainerWriteKey.Path)
351 outputEDM +=
addEDM(
'xAOD::jFexSumETRoIContainer', jFexTool.jTERoIContainerWriteKey.Path)
352 outputEDM +=
addEDM(
'xAOD::jFexMETRoIContainer' , jFexTool.jXERoIContainerWriteKey.Path)
353 maybeMissingRobs += jFexTool.ROBIDs
356 decoderTools += [jFexInputByteStreamTool]
357 outputEDM +=
addEDM(
'xAOD::jFexTowerContainer', jFexInputByteStreamTool.jTowersWriteKey.Path)
358 maybeMissingRobs += jFexInputByteStreamTool.ROBIDs
361 if 'eFex' in subsystem:
362 from L1CaloFEXByteStream.L1CaloFEXByteStreamConfig
import eFexByteStreamToolCfg
363 eFexTool = acc.popToolsAndMerge(
eFexByteStreamToolCfg(flags,
'eFexBSDecoder', writeBS=
False, decodeInputs=args.doCaloInput))
364 decoderTools += [eFexTool]
365 outputEDM +=
addEDM(
'xAOD::eFexEMRoIContainer', eFexTool.eEMContainerWriteKey.Path)
366 outputEDM +=
addEDM(
'xAOD::eFexTauRoIContainer', eFexTool.eTAUContainerWriteKey.Path)
368 outputEDM +=
addEDM(
'xAOD::eFexTowerContainer', eFexTool.eTowerContainerWriteKey.Path)
369 maybeMissingRobs += eFexTool.ROBIDs
372 if 'gFex' in subsystem:
373 from L1CaloFEXByteStream.L1CaloFEXByteStreamConfig
import gFexByteStreamToolCfg,gFexInputByteStreamToolCfg
375 decoderTools += [gFexTool]
376 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer', gFexTool.gFexRhoOutputContainerWriteKey.Path)
377 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer', gFexTool.gFexSRJetOutputContainerWriteKey.Path)
378 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer', gFexTool.gFexLRJetOutputContainerWriteKey.Path)
379 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gScalarEJwojOutputContainerWriteKey.Path)
380 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gMETComponentsJwojOutputContainerWriteKey.Path)
381 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gMHTComponentsJwojOutputContainerWriteKey.Path)
382 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gMSTComponentsJwojOutputContainerWriteKey.Path)
383 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gMETComponentsNoiseCutOutputContainerWriteKey.Path)
384 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gMETComponentsRmsOutputContainerWriteKey.Path)
385 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gScalarENoiseCutOutputContainerWriteKey.Path)
386 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gScalarERmsOutputContainerWriteKey.Path)
387 maybeMissingRobs += gFexTool.ROBIDs
390 decoderTools += [gFexInputByteStreamTool]
391 outputEDM +=
addEDM(
'xAOD::gFexTowerContainer', gFexInputByteStreamTool.gTowersWriteKey.Path)
392 maybeMissingRobs += gFexInputByteStreamTool.ROBIDs
394 if 'Topo' in subsystem:
395 from L1TopoByteStream.L1TopoByteStreamConfig
import L1TopoPhase1ByteStreamToolCfg
397 decoderTools += [l1topoBSTool]
398 outputEDM +=
addEDM(
'xAOD::L1TopoRawDataContainer', l1topoBSTool.L1TopoPhase1RAWDataWriteContainer.Path)
399 maybeMissingRobs += l1topoBSTool.ROBIDs
401 decoderAlg = CompFactory.L1TriggerByteStreamDecoderAlg(name=
"L1TriggerByteStreamDecoder",
402 DecoderTools=decoderTools,
403 MaybeMissingROBs=maybeMissingRobs,
404 OutputLevel=algLogLevel)
406 acc.addEventAlgo(decoderAlg, sequenceName=
'AthAlgSeq')
408 roib2topo = CompFactory.LVL1.RoiB2TopoInputDataCnv(name=
'RoiB2TopoInputDataCnv')
409 roib2topo.OutputLevel = algLogLevel
410 acc.addEventAlgo(roib2topo, sequenceName=
"AthAlgSeq")
411 from L1TopoByteStream.L1TopoByteStreamConfig
import L1TopoByteStreamCfg
413 outputEDM +=
addEDM(
'xAOD::L1TopoRawDataContainer',
'L1TopoRawData')
417 acc.getEventAlgo(
'L1TopoSimulation').FillHistoBasedOnHardware =
True
418 acc.getEventAlgo(
'L1TopoSimulation').PrescaleDAQROBAccess = 1
419 outputEDM +=
addEDM(
'xAOD::L1TopoSimResultsContainer',
'L1_TopoSimResults')
422 from L1TopoOnlineMonitoring
import L1TopoOnlineMonitoringConfig
as TopoMonConfig
424 TopoMonConfig.getL1TopoPhase1OnlineMonitor(flags,
'L1/L1TopoOffline',
True,
True,
True,
True,
True,args.forceCtp,algLogLevel),
425 sequenceName=
"AthAlgSeq"
428 from GaudiSvc.GaudiSvcConf
import THistSvc
429 histSvc = CompFactory.THistSvc(Output = [
"EXPERT DATAFILE='expert-monitoring-l1topo.root', OPT='RECREATE'"])
430 acc.addService(histSvc)
432 from OutputStreamAthenaPool.OutputStreamConfig
import OutputStreamCfg
433 log.debug(
'Adding the following output EDM to ItemList: %s', outputEDM)
435 from xAODMetaDataCnv.InfileMetaDataConfig
import SetupMetaDataForStreamCfg
438 if args.log ==
'verbose' or args.perfmon:
439 acc.printConfig(withDetails=
True, summariseProps=
True, printDefaults=
True)
441 if acc.run().isFailure():