3 from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
4 from AthenaConfiguration.ComponentFactory
import CompFactory
5 from AthenaMonitoringKernel.GenericMonitoringTool
import GenericMonitoringTool
11 from L1TopoSimulation.L1TopoInputHistograms
import configureEMTauInputProviderHistograms, configureEnergyInputProviderHistograms, configureJetInputProviderHistograms
12 emtauProvider = CompFactory.LVL1.EMTauInputProvider(
"EMTauInputProvider")
14 emtauProvider.MonTool.HistPath =
'L1LegacyTopoSimulation/EMTauInputProvider'
16 energyProvider = CompFactory.LVL1.EnergyInputProvider(
"EnergyInputProvider")
18 energyProvider.MonTool.HistPath =
'L1LegacyTopoSimulation/EnergyInputProvider'
20 jetProvider = CompFactory.LVL1.JetInputProvider(
"JetInputProvider")
22 jetProvider.MonTool.HistPath =
'L1LegacyTopoSimulation/JetInputProvider'
25 topoSimAlg = CompFactory.LVL1.L1TopoSimulation(
"L1LegacyTopoSimulation",
26 EMTAUInputProvider = emtauProvider,
27 JetInputProvider = jetProvider,
28 EnergyInputProvider = energyProvider,
30 InputDumpFile =
"inputdump_legacy.txt",
31 EnableInputDump = flags.Trigger.enableL1TopoDump,
32 UseBitwise = flags.Trigger.enableL1TopoBWSimulation,
33 MonHistBaseDir =
"L1/L1LegacyTopoAlgorithms"
37 topoSimAlg.MuonInputProvider.locationMuCTPItoL1Topo =
""
38 topoSimAlg.MuonInputProvider.locationMuCTPItoL1Topo1 =
""
39 topoSimAlg.MuonInputProvider.locationMuonRoI =
""
40 topoSimAlg.MuonInputProvider.locationMuonRoI1 =
""
41 topoSimAlg.MuonInputProvider.ROIBResultLocation =
""
43 acc.addEventAlgo(topoSimAlg)
53 if flags.Trigger.L1.doMuon:
54 muProvider = CompFactory.LVL1.MuonInputProvider(
"MuonInputProvider")
57 If muons coming from the decoding, we use MuonRoI, otherwise MuCTPIL1Topo
58 So here we should be adding proper flag for P1, and when input file is RAW
59 Simply, if muons are simulated, we will use MuCTPIL1Topo, if decoded MuonRoI
63 muProvider.locationMuCTPItoL1Topo =
""
64 muProvider.locationMuCTPItoL1Topo1 =
""
66 muProvider.locationMuonRoI =
""
67 muProvider.locationMuonRoI1 =
""
70 from TrigT1MuonRecRoiTool.TrigT1MuonRecRoiToolConfig
import RPCRecRoiToolCfg, TGCRecRoiToolCfg
74 emtauProvider = CompFactory.LVL1.eFexInputProvider(
"eFexInputProvider")
75 jetProvider = CompFactory.LVL1.jFexInputProvider(
"jFexInputProvider")
76 energyProvider = CompFactory.LVL1.gFexInputProvider(
"gFexInputProvider")
78 controlHistSvc = CompFactory.LVL1.ControlHistSvc(
"ControlHistSvc")
87 from L1TopoByteStream.L1TopoByteStreamConfig
import L1TopoPhase1ByteStreamToolCfg
89 decoderTools += [l1topoBSTool]
90 maybeMissingRobs += l1topoBSTool.ROBIDs
93 decoderAlg = CompFactory.L1TriggerByteStreamDecoderAlg(name=
"L1TriggerByteStreamDecoder",
94 DecoderTools=decoderTools,
95 MaybeMissingROBs=maybeMissingRobs)
97 acc.addEventAlgo(decoderAlg, sequenceName=
'AthAlgSeq')
99 if not flags.Trigger.enableL1CaloPhase1:
100 emtauProvider.eFexEMRoIKey =
""
101 emtauProvider.eFexTauRoIKey =
""
102 jetProvider.jFexSRJetRoIKey =
""
103 jetProvider.jFexLRJetRoIKey =
""
104 jetProvider.jFexFwdElRoIKey =
""
105 jetProvider.jFexTauRoIKey =
""
106 jetProvider.jFexMETRoIKey =
""
107 jetProvider.jFexSumETRoIKey =
""
108 energyProvider.gFexSRJetRoIKey =
""
109 energyProvider.gFexLRJetRoIKey =
""
110 energyProvider.gMETComponentsJwojKey =
""
111 energyProvider.gMHTComponentsJwojKey =
""
112 energyProvider.gMETComponentsNoiseCutKey =
""
113 energyProvider.gMETComponentsRmsKey =
""
114 energyProvider.gScalarEJwojKey =
""
116 topoSimAlg = CompFactory.LVL1.L1TopoSimulation(name,
117 MuonInputProvider = muProvider,
118 EMTAUInputProvider = emtauProvider,
119 JetInputProvider = jetProvider,
120 EnergyInputProvider = energyProvider,
121 ControlHistSvc = controlHistSvc,
122 IsLegacyTopo =
False,
123 doMonitoring = doMonitoring,
124 EnableInputDump = flags.Trigger.enableL1TopoDump,
125 UseBitwise = flags.Trigger.enableL1TopoBWSimulation
127 if name!=
"L1TopoSimulation":
128 topoSimAlg.MonHistBaseDir =
"L1/OnlineL1TopoAlgorithms"
130 acc.addEventAlgo(topoSimAlg)
134 from L1TopoOnlineMonitoring
import L1TopoOnlineMonitoringConfig
as TopoMonConfig
135 if name==
"L1TopoSimulation":
136 acc.addEventAlgo(TopoMonConfig.getL1TopoPhase1OnlineMonitor(flags,
'L1/L1TopoSimDecisions',
137 doHwMon=IsData,doComp=IsData, doMultComp=IsData))
139 acc.addEventAlgo(TopoMonConfig.getL1TopoPhase1OnlineMonitor(flags,
'L1/OnlineL1TopoSimDecisions',
140 toolName=name+
"_Monitor",
141 doHwMon=IsData,doComp=IsData, doMultComp=IsData))
149 efex_provider_attr = [
'eFexEMRoI',
'eFexTauRoI']
150 jfex_provider_attr = [
'jFexSRJetRoI',
'jFexLRJetRoI',
'jFexFwdElRoI',
'jFexTauRoI',
'jFexMETRoI',
'jFexSumETRoI']
151 gfex_provider_attr = [
'gFexSRJetRoI',
'gFexLRJetRoI',
'gScalarEJwoj',
'gMETComponentsJwoj',
'gMHTComponentsJwoj',
'gMETComponentsNoiseCut',
'gMETComponentsRms']
157 from L1TopoSimulation.L1TopoInputHistograms
import configureMuonInputProviderHistograms, configureeFexInputProviderHistograms, configurejFexInputProviderHistograms, configuregFexInputProviderHistograms
162 muProvider = CompFactory.LVL1.MuonInputProvider(
"MuonInputProvider")
164 if flags.Trigger.L1.doMuonTopoInputs:
165 muProvider.locationMuCTPItoL1Topo =
""
166 muProvider.locationMuCTPItoL1Topo1 =
""
168 muProvider.locationMuonRoI =
""
169 muProvider.locationMuonRoI1 =
""
172 from TrigT1MuonRecRoiTool.TrigT1MuonRecRoiToolConfig
import RPCRecRoiToolCfg, TGCRecRoiToolCfg
176 muProvider.MonTool.HistPath =
'L1TopoSimulation/MuonInputProvider'
180 efexProvider = CompFactory.LVL1.eFexInputProvider(
"eFexInputProvider")
182 efexProvider.MonTool.HistPath =
'L1TopoSimulation/eFexInputProvider'
184 jfexProvider = CompFactory.LVL1.jFexInputProvider(
"jFexInputProvider")
186 jfexProvider.MonTool.HistPath =
'L1TopoSimulation/jFexInputProvider'
188 gfexProvider = CompFactory.LVL1.gFexInputProvider(
"gFexInputProvider")
190 gfexProvider.MonTool.HistPath =
'L1TopoSimulation/gFexInputProvider'
193 for attr
in efex_provider_attr:
194 res = [x
for x
in outputEDM
if attr
in x]
196 key = res[0].
split(
'#')[1]
197 print (f
'Key found for eFEX: {key}')
198 setattr(efexProvider,attr+
'Key',key)
200 setattr(efexProvider,attr+
'Key',
'')
202 for attr
in jfex_provider_attr:
203 res = [x
for x
in outputEDM
if attr
in x]
205 key = res[0].
split(
'#')[1]
206 print (f
'Key found for jFEX: {key}')
207 setattr(jfexProvider,attr+
'Key',key)
209 setattr(jfexProvider,attr+
'Key',
'')
211 for attr
in gfex_provider_attr:
212 res = [x
for x
in outputEDM
if attr
in x]
214 key = res[0].
split(
'#')[1]
215 print (f
'Key found for gFEX: {key}')
216 setattr(gfexProvider,attr+
'Key',key)
218 setattr(gfexProvider,attr+
'Key',
'')
220 topoSimAlg = CompFactory.LVL1.L1TopoSimulation(
"L1TopoSimulation",
221 MuonInputProvider = muProvider,
222 EMTAUInputProvider = efexProvider,
223 JetInputProvider = jfexProvider,
224 EnergyInputProvider = gfexProvider,
225 IsLegacyTopo =
False,
226 doMonitoring = doMonitoring,
227 EnableInputDump = flags.Trigger.enableL1TopoDump,
228 UseBitwise = flags.Trigger.enableL1TopoBWSimulation
231 acc.addEventAlgo(topoSimAlg)
235 if __name__ ==
'__main__':
236 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
237 from AthenaCommon.Logging
import logging
240 from argparse
import RawTextHelpFormatter
242 from libpyeformat_helper
import SourceIdentifier, SubDetector
244 log = logging.getLogger(
'runL1TopoSim')
248 parser = argparse.ArgumentParser(
"Running L1TopoSimulation standalone for the BS input", formatter_class=RawTextHelpFormatter)
249 parser.add_argument(
"-i",
"--inputs",nargs=
'*',action=
"store", dest=
"inputs", help=
"Inputs will be used in commands", required=
True)
250 parser.add_argument(
"-m",
"--module",action=
"store", dest=
"module", help=
"Input modules wants to be simulated.",default=
"", required=
False)
251 parser.add_argument(
"-bw",
"--useBitWise",action=
"store_true", dest=
"useBW", help=
"Run with L1Topo Bitwise simulation?",default=
True, required=
False)
252 parser.add_argument(
"-ifex",
"--doCaloInput",action=
"store_true", dest=
"doCaloInput", help=
"Decoding L1Calo inputs",default=
False, required=
False)
253 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)
254 parser.add_argument(
"-hdwMon",
"--algoHdwMon",action=
"store_true", dest=
"algoHdwMon", help=
"Fill algorithm histograms based on hardware decision.",default=
False, required=
False)
255 parser.add_argument(
"-perfMon",
"--perfMonitoring",action=
"store_true", dest=
"perfmon", help=
"Enable performance monitoring",default=
False, required=
False)
256 parser.add_argument(
"-redoMenu",
"--rederiveMenu",action=
"store_true", dest=
"redoMenu", help=
"Will rederive the menu based in local code",default=
False, required=
False)
257 parser.add_argument(
"-l",
"--logLevel",action=
"store", dest=
"log", help=
"Log level.",default=
"warning", required=
False)
258 parser.add_argument(
"-n",
"--nevent", type=int, action=
"store", dest=
"nevent", help=
"Maximum number of events will be executed.",default=0, required=
False)
259 parser.add_argument(
"-s",
"--skipEvents", type=int, action=
"store", dest=
"skipEvents", help=
"How many events will be skipped.",default=0, required=
False)
260 parser.add_argument(
"-d",
"--enableL1TopoDump", type=bool, action=
"store", dest=
"enableL1TopoDump", help=
"Whether to output events into inputdump.txt",default=
False, required=
False)
261 args = parser.parse_args()
263 supportedSubsystems = [
'Muons',
'jFex',
'eFex',
'gFex',
'Topo']
264 args_subsystem = args.module.split(
',')
265 subsystem =
list(
set(args_subsystem) &
set(supportedSubsystems) )
266 filename = args.inputs
268 if len(subsystem)==0:
269 log.warning(f
'subsystem not given or the given subsystem not supported with one of the: {supportedSubsystems}')
271 if args.log ==
'info': algLogLevel = INFO
272 if args.log ==
'warning': algLogLevel = WARNING
273 if args.log ==
'debug': algLogLevel = DEBUG
274 if args.log ==
'verbose': algLogLevel = VERBOSE
278 flags.Exec.OutputLevel = algLogLevel
280 flags.Exec.MaxEvents = args.nevent
281 flags.Trigger.triggerMenuSetup =
'PhysicsP1_pp_run3_v1'
283 flags.Trigger.triggerConfig =
'FILE'
285 flags.Trigger.triggerConfig =
'DB'
286 flags.Input.Files = args.inputs
287 flags.Concurrency.NumThreads = 1
288 flags.Concurrency.NumConcurrentEvents = 1
289 flags.Exec.SkipEvents = args.skipEvents
290 flags.Output.AODFileName =
'AOD.pool.root'
291 flags.Trigger.L1.doMuon =
True
292 flags.Trigger.enableL1MuonPhase1 =
True
293 flags.Trigger.L1.doMuonTopoInputs =
True
294 flags.Trigger.enableL1TopoBWSimulation = args.useBW
295 flags.PerfMon.doFullMonMT = args.perfmon
296 flags.PerfMon.OutputJSON =
'perfmonmt_test.json'
297 flags.Trigger.enableL1TopoDump = args.enableL1TopoDump
298 from IOVDbSvc.IOVDbAutoCfgFlags
import getLastGlobalTag
301 if not flags.Input.isMC:
302 from AthenaConfiguration.TestDefaults
import defaultGeometryTags
303 flags.GeoModel.AtlasVersion = defaultGeometryTags.RUN2
306 from AthenaConfiguration.MainServicesConfig
import MainServicesCfg
310 from PerfMonComps.PerfMonCompsConfig
import PerfMonMTSvcCfg
313 from TriggerJobOpts.TriggerByteStreamConfig
import ByteStreamReadCfg
317 from TrigConfigSvc.TrigConfigSvcCfg
import L1ConfigSvcCfg,generateL1Menu
319 if "data22" not in filename:
323 from AnalysisTriggerAlgs.AnalysisTriggerAlgsConfig
import RoIBResultToxAODCfg
325 acc.merge(xRoIBResultAcc)
329 maybeMissingRobs = []
331 from TrigT1ResultByteStream.TrigT1ResultByteStreamConfig
import RoIBResultByteStreamToolCfg
333 decoderTools += [roibResultTool]
335 for module_id
in roibResultTool.L1TopoModuleIds:
336 maybeMissingRobs.append(
int(SourceIdentifier(SubDetector.TDAQ_CALO_TOPO_PROC, module_id)))
338 for module_id
in roibResultTool.JetModuleIds:
339 maybeMissingRobs.append(
int(SourceIdentifier(SubDetector.TDAQ_CALO_JET_PROC_ROI, module_id)))
341 for module_id
in roibResultTool.EMModuleIds:
342 maybeMissingRobs.append(
int(SourceIdentifier(SubDetector.TDAQ_CALO_CLUSTER_PROC_ROI, module_id)))
346 auxType = edmType.replace(
'Container',
'AuxContainer')
347 return [f
'{edmType}#{edmName}',
348 f
'{auxType}#{edmName}Aux.']
350 outputEDM += [
'CTP_RDO#*']
351 outputEDM += [
'ROIB::RoIBResult#*']
353 outputEDM +=
addEDM(
'xAOD::JetEtRoI' ,
'LVL1JetEtRoI')
354 outputEDM +=
addEDM(
'xAOD::JetRoIContainer' ,
'LVL1JetRoIs')
355 outputEDM +=
addEDM(
'xAOD::EmTauRoIContainer',
'LVL1EmTauRoIs')
357 outputEDM += [
"xAOD::EnergySumRoI#LVL1EnergySumRoI",
"xAOD::EnergySumRoIAuxInfo#LVL1EnergySumRoIAux."]
359 if 'Muons' in subsystem:
360 from MuonConfig.MuonBytestreamDecodeConfig
import RpcBytestreamDecodeCfg,TgcBytestreamDecodeCfg
362 acc.merge(rpcdecodingAcc)
364 acc.merge(tgcdecodingAcc)
366 from TrigT1ResultByteStream.TrigT1ResultByteStreamConfig
import MuonRoIByteStreamToolCfg
368 decoderTools += [muonRoiTool]
369 outputEDM +=
addEDM(
'xAOD::MuonRoIContainer' ,
'*')
370 maybeMissingRobs += muonRoiTool.ROBIDs
372 if 'jFex' in subsystem:
373 from L1CaloFEXByteStream.L1CaloFEXByteStreamConfig
import jFexRoiByteStreamToolCfg,jFexInputByteStreamToolCfg
375 decoderTools += [jFexTool]
376 outputEDM +=
addEDM(
'xAOD::jFexSRJetRoIContainer', jFexTool.jJRoIContainerWriteKey.Path)
377 outputEDM +=
addEDM(
'xAOD::jFexLRJetRoIContainer', jFexTool.jLJRoIContainerWriteKey.Path)
378 outputEDM +=
addEDM(
'xAOD::jFexTauRoIContainer' , jFexTool.jTauRoIContainerWriteKey.Path)
379 outputEDM +=
addEDM(
'xAOD::jFexFwdElRoIContainer', jFexTool.jEMRoIContainerWriteKey.Path)
380 outputEDM +=
addEDM(
'xAOD::jFexSumETRoIContainer', jFexTool.jTERoIContainerWriteKey.Path)
381 outputEDM +=
addEDM(
'xAOD::jFexMETRoIContainer' , jFexTool.jXERoIContainerWriteKey.Path)
382 maybeMissingRobs += jFexTool.ROBIDs
385 decoderTools += [jFexInputByteStreamTool]
386 outputEDM +=
addEDM(
'xAOD::jFexTowerContainer', jFexInputByteStreamTool.jTowersWriteKey.Path)
387 maybeMissingRobs += jFexInputByteStreamTool.ROBIDs
390 if 'eFex' in subsystem:
391 from L1CaloFEXByteStream.L1CaloFEXByteStreamConfig
import eFexByteStreamToolCfg
392 eFexTool = acc.popToolsAndMerge(
eFexByteStreamToolCfg(flags,
'eFexBSDecoder', writeBS=
False, decodeInputs=args.doCaloInput))
393 decoderTools += [eFexTool]
394 outputEDM +=
addEDM(
'xAOD::eFexEMRoIContainer', eFexTool.eEMContainerWriteKey.Path)
395 outputEDM +=
addEDM(
'xAOD::eFexTauRoIContainer', eFexTool.eTAUContainerWriteKey.Path)
397 outputEDM +=
addEDM(
'xAOD::eFexTowerContainer', eFexTool.eTowerContainerWriteKey.Path)
398 maybeMissingRobs += eFexTool.ROBIDs
401 if 'gFex' in subsystem:
402 from L1CaloFEXByteStream.L1CaloFEXByteStreamConfig
import gFexByteStreamToolCfg,gFexInputByteStreamToolCfg
404 decoderTools += [gFexTool]
405 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer', gFexTool.gFexRhoOutputContainerWriteKey.Path)
406 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer', gFexTool.gFexSRJetOutputContainerWriteKey.Path)
407 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer', gFexTool.gFexLRJetOutputContainerWriteKey.Path)
408 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gScalarEJwojOutputContainerWriteKey.Path)
409 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gMETComponentsJwojOutputContainerWriteKey.Path)
410 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gMHTComponentsJwojOutputContainerWriteKey.Path)
411 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gMSTComponentsJwojOutputContainerWriteKey.Path)
412 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gMETComponentsNoiseCutOutputContainerWriteKey.Path)
413 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gMETComponentsRmsOutputContainerWriteKey.Path)
414 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gScalarENoiseCutOutputContainerWriteKey.Path)
415 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer', gFexTool.gScalarERmsOutputContainerWriteKey.Path)
416 maybeMissingRobs += gFexTool.ROBIDs
419 decoderTools += [gFexInputByteStreamTool]
420 outputEDM +=
addEDM(
'xAOD::gFexTowerContainer', gFexInputByteStreamTool.gTowersWriteKey.Path)
421 maybeMissingRobs += gFexInputByteStreamTool.ROBIDs
423 if 'Topo' in subsystem:
424 from L1TopoByteStream.L1TopoByteStreamConfig
import L1TopoPhase1ByteStreamToolCfg
426 decoderTools += [l1topoBSTool]
427 outputEDM +=
addEDM(
'xAOD::L1TopoRawDataContainer', l1topoBSTool.L1TopoPhase1RAWDataWriteContainer.Path)
428 maybeMissingRobs += l1topoBSTool.ROBIDs
430 decoderAlg = CompFactory.L1TriggerByteStreamDecoderAlg(name=
"L1TriggerByteStreamDecoder",
431 DecoderTools=decoderTools,
432 MaybeMissingROBs=maybeMissingRobs,
433 OutputLevel=algLogLevel)
435 acc.addEventAlgo(decoderAlg, sequenceName=
'AthAlgSeq')
437 roib2topo = CompFactory.LVL1.RoiB2TopoInputDataCnv(name=
'RoiB2TopoInputDataCnv')
438 roib2topo.OutputLevel = algLogLevel
439 acc.addEventAlgo(roib2topo, sequenceName=
"AthAlgSeq")
440 from L1TopoByteStream.L1TopoByteStreamConfig
import L1TopoByteStreamCfg
442 outputEDM +=
addEDM(
'xAOD::L1TopoRawDataContainer',
'L1TopoRawData')
446 acc.getEventAlgo(
'L1TopoSimulation').FillHistoBasedOnHardware =
True
447 acc.getEventAlgo(
'L1TopoSimulation').PrescaleDAQROBAccess = 1
448 outputEDM +=
addEDM(
'xAOD::L1TopoSimResultsContainer',
'L1_TopoSimResults')
451 from L1TopoOnlineMonitoring
import L1TopoOnlineMonitoringConfig
as TopoMonConfig
453 TopoMonConfig.getL1TopoPhase1OnlineMonitor(flags,
'L1/L1TopoOffline',
True,
True,
True,
True,
True,args.forceCtp,algLogLevel),
454 sequenceName=
"AthAlgSeq"
457 from GaudiSvc.GaudiSvcConf
import THistSvc
458 histSvc = CompFactory.THistSvc(Output = [
"EXPERT DATAFILE='expert-monitoring-l1topo.root', OPT='RECREATE'"])
459 acc.addService(histSvc)
461 from OutputStreamAthenaPool.OutputStreamConfig
import OutputStreamCfg
462 log.debug(
'Adding the following output EDM to ItemList: %s', outputEDM)
464 from xAODMetaDataCnv.InfileMetaDataConfig
import SetupMetaDataForStreamCfg
467 if args.log ==
'verbose' or args.perfmon:
468 acc.printConfig(withDetails=
True, summariseProps=
True, printDefaults=
True)
470 if acc.run().isFailure():