11from AthenaCommon.Logging
import logging
12from AthenaCommon.Logging
import log
as topLog
13topLog.setLevel(logging.WARNING)
14log = logging.getLogger(
'l1calo-ath-mon')
15log.setLevel(logging.INFO)
17from TrigT1CaloMonitoring.LVL1CaloMonitoringConfig
import L1CaloMonitorCfgHelper
18L1CaloMonitorCfgHelper.embargoed = [
"Expert/Efficiency/gFEX/MuonReferenceTrigger/SRpt_L1_gJ400p0ETA25"]
22from AthenaConfiguration.ComponentFactory
import CompFactory
23from AthenaConfiguration.AllConfigFlags
import initConfigFlags
24from AthenaConfiguration.Enums
import LHCPeriod,Format
25from AthenaCommon
import Constants
29partition = ispy.IPCPartition(os.getenv(
"TDAQ_PARTITION",
"ATLAS"))
31flags = initConfigFlags()
38flags.Exec.OutputLevel = Constants.WARNING
39flags.Exec.InfoMessageComponents = [
"AthenaEventLoopMgr",
"AthenaHiveEventLoopMgr",
"THistSvc",
"PerfMonMTSvc",
"ApplicationMgr",
"AvalancheSchedulerSvc"]
40flags.Exec.PrintAlgsSequence =
True
44flags.GeoModel.Run = LHCPeriod.Run3
45flags.Common.useOnlineLumi =
True
46flags.DQ.doMonitoring =
True
47flags.DQ.enableLumiAccess =
False
48flags.DQ.FileKey =
"" if partition.isValid()
else "EXPERT"
49flags.Output.HISTFileName = os.getenv(
"L1CALO_ATHENA_JOB_NAME",
"") +
"monitoring.root"
50flags.DQ.useTrigger =
False
51flags.Trigger.L1.doCaloInputs = partition.isValid()
52flags.Trigger.enableL1CaloPhase1 =
True
53flags.Trigger.enableL1MuonPhase1 =
False
55flags.Trigger.L1.doCalo = partition.isValid()
56flags.Trigger.L1.doeFex = partition.isValid()
57flags.Trigger.L1.dojFex = partition.isValid()
58flags.Trigger.L1.dogFex = partition.isValid()
59flags.Trigger.L1.doTopo = partition.isValid()
62if partition.isValid():
65 flags.Trigger.doLVL1 =
False
66 flags.Trigger.doHLT =
False
67 from AthenaConfiguration.AutoConfigOnlineRecoFlags
import autoConfigOnlineRecoFlags
68 autoConfigOnlineRecoFlags(flags, partition.name())
70 flags.Trigger.doLVL1 =
True
74if "--help" in sys.argv:
76 neededCats = [
"DQ",
"Trigger",
"PerfMon"]
77 for cat
in list(flags._dynaflags.keys()):
78 if cat
not in neededCats: del flags._dynaflags[cat]
82parser = flags.getArgumentParser(epilog=
"""
83Extra flags are specified after a " -- " and the following are most relevant flags for this script:
85 Trigger.enableL1CaloPhase1 : turn on/off the offline simulation [default: True]
86 DQ.doMonitoring : turn on/off the monitoring [default: True]
87 Trigger.L1.doCaloInputs : controls input readout decoding and monitoring [default: False*]
88 Trigger.L1.doCalo : controls trex (legacy syst) monitoring [default: False]
89 Trigger.L1.doeFex : controls efex simulation and monitoring [default: False*]
90 Trigger.L1.dojFex : controls jfex simulation and monitoring [default: False*]
91 Trigger.L1.dogFex : controls gfex simulation and monitoring [default: False*]
92 Trigger.L1.doTopo : controls topo simulation and monitoring [default: False*] (from 2023 Onwards)
93 Trigger.L1.doGlobal : controls global simulation and monitoring [default: False]
94 DQ.useTrigger : controls if JetEfficiency monitoring alg is run or not [default: False]
95 PerfMon.doFullMonMT : print info about execution time of algorithms and memory use etc [default: False]
96 Trigger.triggerConfig : if you specifying this as "FILE:<filename>" the script will use that L1 json menu. [default: "DB" (takes menu from DB for data)]
98Note: If you do not specify any flags, then all the flags that are marked with a * will automatically become True
100E.g. to run just the jFex monitoring, without offline simulation, you can do:
102l1calo-ath-mon .... -- Trigger.enableL1CaloPhase1=False Trigger.L1.doCaloInputs=False Trigger.L1.doeFex=False Trigger.L1.dogFex=False
104To run with a plugin you can do e.g:
106l1calo-ath-mon PluginPackage/plugin.py --evtMax 10 ...
108Further notes: Run with "--evtMax 0" to print flags and ca config, and generate a hanConfig file.
109 Run with "--evtMax 1" to dump StoreGate contents after the first event
114parser.formatter_class = argparse.RawDescriptionHelpFormatter
115parser.add_argument(
'--runNumber',default=
None,help=
"specify to select a run number")
116parser.add_argument(
'--lumiBlock',default=
None,help=
"specify to select a lumiBlock")
117parser.add_argument(
'--evtNumber',default=
None,nargs=
"+",type=int,help=
"specify to select an evtNumber")
118parser.add_argument(
'--stream',default=
"*",help=
"stream to lookup files in")
119parser.add_argument(
'--fexReadoutFilter',action=
'store_true',help=
"If specified, will skip events without fexReadout")
120parser.add_argument(
'--dbOverrides',default=
None,nargs=
"+",type=str,help=
"specify overrides of COOL database folders in form <folder>=<dbPath> or <folder>:<tag>[=<dbPath>] to override a tag, example: /TRIGGER/L1Calo/V1/Calibration/EfexEnergyCalib=mytest.db ")
121parser.add_argument(
'--postConfig',default=[],nargs=
"+",type=str,help=
"specify component properties to apply at the end of the config. Can also specify in the flags section if start with 'cfg.' Use '--postHelp' option to explore the configurables and their properties")
122parser.add_argument(
'--postInclude',default=[],nargs=
"+",type=str,help=
"specify python files to call before configuration completes")
123parser.add_argument(
'--postHelp',default=
None,nargs=
"*",help=
"Displays configurables and their properties")
126sys.argv = [
"--help" if x==
"-h" else x
for x
in sys.argv]
127preHelpArgs = sys.argv[0:sys.argv.index(
"--help")]
if "--help" in sys.argv
else sys.argv
128postHelpArgs = sys.argv[sys.argv.index(
"--help"):]
if "--help" in sys.argv
else []
129args,unknown_args = flags.fillFromArgs(parser=parser,return_unknown=
True,listOfArgs=preHelpArgs[1:])
133 optionsPathEnv = os.environ[
'JOBOPTSEARCHPATH' ]
135 optionsPathEnv = os.curdir
136optionsPath = re.split(
',|' + os.pathsep, optionsPathEnv )
138 optionsPath[ optionsPath.index(
'' ) ] = str(os.curdir)
139for fn
in unknown_args:
140 from AthenaCommon.Utils.unixtools
import FindFile
141 name = FindFile( os.path.expanduser( os.path.expandvars( fn ) ), optionsPath, os.R_OK )
142 if not name: name = FindFile( os.path.basename( fn ), optionsPath, os.R_OK )
144 args.postInclude += [fn]
145 unknown_args.remove(fn)
146args.postConfig += [x[4:]
for x
in unknown_args
if x.startswith(
"cfg.")]
148if len(args.postInclude):
149 flags.addFlag(
"L1CaloAthMon.UnknownArgs",[x
for x
in unknown_args
if not x.startswith(
"cfg.")])
150 if "--help" in sys.argv: flags.L1CaloAthMon.UnknownArgs += [
"--help"]
151elif any([
not x.startswith(
"cfg.")
for x
in unknown_args]):
152 raise KeyError(
"Unknown flags: " +
" ".join([x
for x
in unknown_args
if not x.startswith(
"cfg.")]))
157if len(flags.Input.Files)>0:
159 from AthenaConfiguration.TestDefaults
import defaultTestFiles
160 flags.Input.Files = [getattr(defaultTestFiles,f,f)
for f
in flags.Input.Files]
161 flags.Input.Files = [item
for x
in flags.Input.Files
for item
in (x
if isinstance(x,list)
else [x])]
163 for f
in flags.Input.Files:
164 if not os.path.exists(f)
and not any([os.path.exists(fpart)
for fpart
in f.split(
":")]):
165 log.fatal(f
"file '{f}' does not exist")
168if args.runNumber
is not None:
174 from glob
import glob
175 if args.lumiBlock
is None: args.lumiBlock=
"*"
176 log.info(
" ".join((
"Looking up files in atlastier0 for run",args.runNumber,
"lb =",args.lumiBlock)))
177 flags.Input.Files = []
178 for lb
in args.lumiBlock.split(
","):
180 tryStr = f
"/eos/atlas/atlastier0/rucio/data*/{args.stream}/*{args.runNumber}/*RAW/*lb*.*"
182 tryStr = f
"/eos/atlas/atlastier0/rucio/data*/{args.stream}/*{args.runNumber}/*RAW/*lb{int(lb):04}.*"
183 log.info(
" ".join((
"Trying",tryStr)))
184 flags.Input.Files += glob(tryStr)
185 log.info(
" ".join((
"Found",str(len(flags.Input.Files)),
"files")))
190if len(args.postInclude):
193 with ConfigurableCABehavior():
194 from AthenaCommon.Utils.unixtools
import FindFile
198 with open(file_path,
"r", encoding=
"utf-8")
as f:
200 tree = ast.parse(source, filename=file_path)
201 for node
in tree.body:
202 if isinstance(node, ast.FunctionDef)
and node.name == function_name:
204 mod = ast.Module(body=[node], type_ignores=[])
206 code = compile(mod, filename=file_path, mode=
"exec")
209 exec(code, namespace)
210 return namespace[function_name]
211 for fn
in args.postInclude:
212 name = FindFile( os.path.expanduser( os.path.expandvars( fn ) ), optionsPath, os.R_OK )
214 name = FindFile( os.path.basename( fn ), optionsPath, os.R_OK )
215 if not name:
raise RuntimeError(
'plugin file %s can not be found' % fn )
218 topLog.setLevel(logging.INFO)
220 topLog.setLevel(logging.WARNING)
224if not flags.Common.isOnline
and len(flags.Input.Files)==0
and not flags.Input.isMC:
225 if flags.Exec.MaxEvents==0:
227 flags.Input.Files = [
"/eos/atlas/atlascerngroupdisk/det-l1calo/OfflineSoftware/TestFiles/data24_13p6TeV/data24_13p6TeV.00477048.physics_Main.daq.RAW._lb0821._SFO-20._0001.data"]
229 if len(postHelpArgs): flags.fillFromArgs(listOfArgs=postHelpArgs)
230 log.fatal(
"Running in offline mode but no input files provided. Please specify with: --filesInput <file>")
231 from AthenaConfiguration.TestDefaults
import defaultTestFiles
232 log.fatal(
"You can specify one of the default test files:" +
",".join([f
for f
in dir(defaultTestFiles)
if f[0].isupper()]))
234elif flags.Common.isOnline:
235 log.info(
"Running Online with Partition: "+partition.name())
238 if flags.Trigger.Online.partitionName ==
'':
241 flags.Trigger.doLVL1 =
False
242 flags.Trigger.doHLT =
False
243 from AthenaConfiguration.AutoConfigOnlineRecoFlags
import autoConfigOnlineRecoFlags
244 autoConfigOnlineRecoFlags(flags, partition.name())
245 standalone = (partition.name()!=
"ATLAS")
246 if standalone : log.info(
"Using local menu because partition is not ATLAS")
247 elif len(flags.Input.Files)==0
and partition.isValid():
250 log.info(
"Waiting 2 minutes for LATOME to get their databases in order")
253if len(args.postInclude)==0
and not any([flags.Trigger.L1.doCalo,flags.Trigger.L1.doCaloInputs,flags.Trigger.L1.doeFex,flags.Trigger.L1.dojFex,flags.Trigger.L1.dogFex,flags.Trigger.L1.doTopo,flags.DQ.useTrigger]):
254 log.info(
"No steering flags specified and no postInclude, turning on all phase 1 systems (trex,efex,jfex,gfex,topo)")
255 flags.Trigger.L1.doCaloInputs =
True
256 flags.Trigger.L1.doCalo =
True
257 flags.Trigger.L1.doeFex =
True
258 flags.Trigger.L1.dojFex =
True
259 flags.Trigger.L1.dogFex =
True
260 flags.Trigger.L1.doTopo =
True
264if type(flags.Trigger.triggerConfig)==str
and flags.Trigger.triggerConfig.startswith(
"FILE:"):
265 customMenuFile = flags.Trigger.triggerConfig.split(
":",1)[-1]
266 flags.Trigger.triggerConfig=
"FILE"
271if len(flags.Input.Files)>0:
272 flags.DQ.Environment =
"user"
275 standalone = ((flags.Input.ProjectName ==
"data_test")
or (re.match(
r"data\d\d_calib", flags.Input.ProjectName)))
276 if standalone :
print(
"Using local menu because project_name=",flags.Input.ProjectName)
277 if flags.Input.isMC : flags.Trigger.triggerConfig=
'FILE'
278 elif flags.Trigger.triggerConfig==
'INFILE':
280 flags.Trigger.triggerConfig=
"DB"
282 if flags.Input.isMC
and flags.Trigger.L1.doCalo:
283 log.info(
"Disabling legacy monitoring because it doesn't work with MC")
284 flags.Trigger.L1.doCalo=
False
287 flags.Trigger.triggerConfig=
'FILE'
290if flags.Exec.MaxEvents == 0:
292 flags.DQ.doMonitoring=
True
293 flags.Trigger.L1.doCalo=
True
294 flags.Trigger.L1.doCaloInputs=
True
295 flags.Trigger.L1.doeFex=
True
296 flags.Trigger.L1.dojFex=
True
297 flags.Trigger.L1.dogFex=
True
298 flags.Trigger.L1.doTopo=
True
299 flags.DQ.useTrigger=
True
300 flags.Exec.OutputLevel = Constants.INFO
303if flags.GeoModel.AtlasVersion
is None:
304 from AthenaConfiguration.TestDefaults
import defaultGeometryTags
305 flags.GeoModel.AtlasVersion = defaultGeometryTags.autoconfigure(flags)
307if flags.Trigger.triggerConfig==
"FILE" and flags.Trigger.L1.doCalo:
310 log.warning(
"Cannot run Legacy sim/mon when using json l1 menu. Disabling")
311 flags.Trigger.L1.doCalo=
False
313if (flags.Input.Format == Format.POOL): flags.Trigger.L1.doTopo =
False
314if not flags.Trigger.L1.doTopo: flags.Trigger.L1.doMuon =
False
316if flags.Trigger.enableL1CaloPhase1:
319 from AthenaConfiguration.DetectorConfigFlags
import setupDetectorsFromList
320 setupDetectorsFromList(flags,[
'LAr',
'Tile',
'MBTS'] + ([
'RPC',
'TGC',
'MDT']
if flags.Trigger.L1.doMuon
else []),
True)
322from AthenaConfiguration.MainServicesConfig
import MainServicesCfg
323cfg = MainServicesCfg(flags)
325log.setLevel(logging.INFO)
330if len(postHelpArgs): flags.fillFromArgs(listOfArgs=postHelpArgs)
333if flags.Exec.MaxEvents == 0: flags.dump(evaluate=
True)
336if len(args.postInclude)==0
and not any([flags.Trigger.L1.doCaloInputs,flags.Trigger.L1.doCalo,flags.Trigger.L1.doeFex,flags.Trigger.L1.dojFex,flags.Trigger.L1.dogFex,flags.Trigger.L1.doTopo]):
337 log.fatal(
"You did not set any flags to specify what to run. ")
338 log.fatal(
"Please set at least one of the flags in Trigger.L1.(doCaloInputs, doCalo, doeFex, dojFex, dogFex, doTopo) ")
339 log.fatal(
"or use '--all' option to turn on everything (but that is slow)")
340 log.fatal(
"See --help for more info about the flags")
343if flags.Common.isOnline
and len(flags.Input.Files)==0:
344 flags.dump(evaluate=
True)
345 from ByteStreamEmonSvc.EmonByteStreamConfig
import EmonByteStreamCfg
346 cfg.merge(EmonByteStreamCfg(flags))
347 bsSvc = cfg.getService(
"ByteStreamInputSvc")
348 bsSvc.Partition = partition.name()
349 bsSvc.Key = os.environ.get(
"L1CALO_PTIO_KEY",
"REB" if partition.name()==
"L1CaloStandalone" else "dcm")
350 if partition.name()==
"L1CaloSTF": bsSvc.Key =
"SWROD"
351 bsSvc.KeyCount = int(os.environ.get(
"L1CALO_PTIO_KEY_COUNT",
"25"))
352 bsSvc.ISServer =
"Histogramming"
353 bsSvc.BufferSize = 10
354 bsSvc.UpdatePeriod = 30
355 bsSvc.Timeout = 240000
356 bsSvc.PublishName = os.getenv(
"L1CALO_ATHENA_JOB_NAME",
"testing")
357 bsSvc.StreamType = os.getenv(
"L1CALO_PTIO_STREAM_TYPE",
"physics")
358 bsSvc.ExitOnPartitionShutdown =
False
359 bsSvc.ClearHistograms =
True
360 bsSvc.GroupName =
"RecExOnline"
362 bsSvc.StreamNames = os.getenv(
"L1CALO_PTIO_STREAM_NAME",
"L1Calo:Main:MinBias:MinBiasOverlay:UPC:EnhancedBias:ZeroBias:HardProbes:Standby:ALFACalib").
split(
":")
363 bsSvc.StreamLogic = os.getenv(
"L1CALO_PTIO_STREAM_LOGIC",
"Or")
if partition.name() !=
"L1CaloStandalone" else "Ignore"
365 bsSvc.LVL1Logic =
"Ignore"
366elif flags.Input.Format == Format.POOL:
367 log.info(f
"Running Offline on {len(flags.Input.Files)} POOL files: {flags.Input.Files[0]} ...")
368 from AthenaPoolCnvSvc.PoolReadConfig
import PoolReadCfg
369 cfg.merge(PoolReadCfg(flags))
370elif len(flags.Input.Files)>0:
371 log.info(f
"Running Offline on {len(flags.Input.Files)} bytestream files: {flags.Input.Files[0]} ...")
374 from TriggerJobOpts.TriggerByteStreamConfig
import ByteStreamReadCfg
375 cfg.merge(ByteStreamReadCfg(flags))
378from AthenaMonitoring.AthMonitorCfgHelper
import getDQTHistSvc
379cfg.merge(getDQTHistSvc(flags))
382from TrigConfigSvc.TrigConfigSvcCfg
import L1ConfigSvcCfg,generateL1Menu, createL1PrescalesFileFromMenu,getL1MenuFileName
383if flags.Trigger.triggerConfig==
"FILE":
385 menuFilename = getL1MenuFileName(flags)
386 if customMenuFile ==
"":
387 if os.path.exists(menuFilename): os.remove(menuFilename)
388 generateL1Menu(flags)
393 os.symlink(customMenuFile, menuFilename)
395 if e.errno == errno.EEXIST:
396 os.remove(menuFilename)
397 os.symlink(customMenuFile, menuFilename)
400 menuFilename = customMenuFile
401 if os.path.exists(menuFilename):
402 log.info(f
"Using L1Menu: {menuFilename}")
404 log.fatal(f
"L1Menu file does not exist: {menuFilename}")
406 createL1PrescalesFileFromMenu(flags)
409if not (
not flags.Common.isOnline
and len(flags.Input.Files)==0): cfg.merge(L1ConfigSvcCfg(flags))
416if flags.Common.isOnline
or (flags.Input.Format != Format.POOL
and not flags.Input.isMC):
417 from L1CaloFEXByteStream.L1CaloFEXByteStreamConfig
import eFexByteStreamToolCfg, jFexRoiByteStreamToolCfg, jFexInputByteStreamToolCfg, gFexByteStreamToolCfg, gFexInputByteStreamToolCfg
418 if flags.Trigger.L1.doeFex: decoderTools += [cfg.popToolsAndMerge(eFexByteStreamToolCfg(flags=flags,name=
'eFexBSDecoderTool',TOBs=flags.Trigger.L1.doeFex,xTOBs=flags.Trigger.L1.doeFex,decodeInputs=flags.Trigger.L1.doCaloInputs,multiSlice=
True))]
419 if flags.Trigger.L1.dojFex: decoderTools += [cfg.popToolsAndMerge(jFexRoiByteStreamToolCfg(flags=flags,name=
"jFexBSDecoderTool",writeBS=
False))]
420 if flags.Trigger.L1.dogFex: decoderTools += [cfg.popToolsAndMerge(gFexByteStreamToolCfg(flags=flags,name=
"gFexBSDecoderTool",writeBS=
False))]
421 if flags.Trigger.L1.doTopo:
422 from L1TopoByteStream.L1TopoByteStreamConfig
import L1TopoPhase1ByteStreamToolCfg
423 decoderTools += [cfg.popToolsAndMerge(L1TopoPhase1ByteStreamToolCfg(flags=flags,name=
"L1TopoBSDecoderTool",writeBS=
False))]
425 if flags.Trigger.L1.doMuon:
426 from MuonConfig.MuonBytestreamDecodeConfig
import RpcBytestreamDecodeCfg,TgcBytestreamDecodeCfg
427 cfg.merge(RpcBytestreamDecodeCfg(flags))
428 cfg.merge(TgcBytestreamDecodeCfg(flags))
429 from TrigT1ResultByteStream.TrigT1ResultByteStreamConfig
import MuonRoIByteStreamToolCfg
430 decoderTools += [cfg.popToolsAndMerge(MuonRoIByteStreamToolCfg(flags, name=
"L1MuonBSDecoderTool", writeBS=
False))]
433 if flags.Trigger.L1.doCaloInputs:
434 if flags.Trigger.L1.dojFex: decoderTools += [cfg.popToolsAndMerge(jFexInputByteStreamToolCfg(flags=flags,name=
'jFexInputBSDecoderTool',writeBS=
False))]
435 if flags.Trigger.L1.dogFex: decoderTools += [cfg.popToolsAndMerge(gFexInputByteStreamToolCfg(flags=flags,name=
'gFexInputBSDecoderTool',writeBS=
False))]
437 if len(decoderTools) > 0:
438 from TrigT1ResultByteStream.TrigT1ResultByteStreamMonitoringConfig
import L1TriggerByteStreamDecoderMonitoringCfg
439 cfg.addEventAlgo(CompFactory.L1TriggerByteStreamDecoderAlg(
440 name=
"L1TriggerByteStreamDecoder",
441 OutputLevel=Constants.ERROR,
442 DecoderTools=decoderTools,
443 ByteStreamMetadataRHKey =
'',
444 MaybeMissingROBs= [id
for tool
in decoderTools
for id
in tool.ROBIDs ]
if partition.name()!=
"ATLAS" or not flags.Common.isOnline
else [],
445 MonTool= cfg.popToolsAndMerge(L1TriggerByteStreamDecoderMonitoringCfg(flags,
"L1TriggerByteStreamDecoder", decoderTools))
446 ),sequenceName=
'AthAlgSeq'
450if flags.Trigger.enableL1CaloPhase1:
451 from L1CaloFEXSim.L1CaloFEXSimCfg
import L1CaloFEXSimCfg
453 cfg.addSequence(CompFactory.AthSequencer(
"L1Sim",StopOverride=
True),parentName=
"AthAlgSeq")
458 cfg.merge(
L1CaloFEXSimCfg(flags,outputSuffix=
"_ReSim" if flags.Input.Format == Format.POOL
and flags.Input.ProcessingTags != [
'StreamRDO']
else ""),sequenceName=
"L1Sim")
460 if flags.Trigger.L1.doTopo:
461 from L1TopoSimulation.L1TopoSimulationConfig
import L1TopoSimulationCfg
462 cfg.merge(L1TopoSimulationCfg(flags,readMuCTPI=
True,doMonitoring=
False),sequenceName=
"L1Sim")
464 for alg
in cfg.getSequence(
"L1Sim").Members:
465 if alg.name
in [a.name
for a
in cfg.getSequence(
"AthAlgSeq").Members]:
466 cfg.getSequence(
"L1Sim").Members.remove(alg)
470 if "doGlobal" in flags.Trigger.L1
and flags.Trigger.L1.doGlobal:
472 cfg.addSequence(CompFactory.AthSequencer(
"L1GlobalSim",StopOverride=
True),parentName=
"AthAlgSeq")
473 from GlobalSimulation.GlobalSimulationConfig
import GlobalSimulationCfg
474 cfg.merge(GlobalSimulationCfg(flags),sequenceName=
"L1GlobalSim")
476 if flags.Trigger.L1.doeFex:
478 from TrigConfigSvc.TriggerConfigAccess
import getL1MenuAccess
479 L1_menu = getL1MenuAccess(flags)
480 L1_menu.printSummary()
481 em_algoVersion = L1_menu.thresholdExtraInfo(
"eEM").
get(
"algoVersion", 0)
482 tau_algoVersion = L1_menu.thresholdExtraInfo(
"eTAU").
get(
"algoVersion", 0)
483 log.info(f
"algoVersions: eEM: {em_algoVersion}, eTAU: {tau_algoVersion}")
498if flags.Trigger.enableL1MuonPhase1:
500 cfg.addSequence(CompFactory.AthSequencer(
"L1MuonSim",StopOverride=
True),parentName=
"AthAlgSeq")
501 from TriggerJobOpts.Lvl1MuonSimulationConfig
import Lvl1MuonSimulationCfg
502 cfg.merge(Lvl1MuonSimulationCfg(flags), sequenceName=
'L1MuonSim')
505if flags.DQ.doMonitoring:
507 cfg.addSequence(CompFactory.AthSequencer(
"L1Mon",StopOverride=
True),parentName=
"AthAlgSeq")
508 if flags.Trigger.L1.doCalo:
509 from TrigT1CaloMonitoring.PprMonitorAlgorithm
import PprMonitoringConfig
510 cfg.merge(PprMonitoringConfig(flags),sequenceName=
"L1Mon")
511 from TrigT1CaloMonitoring.PPMSimBSMonitorAlgorithm
import PPMSimBSMonitoringConfig
512 cfg.merge(PPMSimBSMonitoringConfig(flags),sequenceName=
"L1Mon")
513 from TrigT1CaloMonitoring.OverviewMonitorAlgorithm
import OverviewMonitoringConfig
514 cfg.merge(OverviewMonitoringConfig(flags),sequenceName=
"L1Mon")
517 OverviewMonAlg = cfg.getEventAlgo(
"OverviewMonAlg")
518 OverviewMonAlg.CPMErrorLocation =
""
519 OverviewMonAlg.CPMMismatchLocation =
""
521 if flags.Trigger.L1.doeFex:
522 from TrigT1CaloMonitoring.EfexMonitorAlgorithm
import EfexMonitoringConfig
523 cfg.merge(EfexMonitoringConfig(flags),sequenceName=
"L1Mon")
524 EfexMonAlg = cfg.getEventAlgo(
'EfexMonAlg')
526 EfexMonAlg.eFexEMTobKeyList = [
'L1_eEMRoI',
'L1_eEMxRoI']
527 EfexMonAlg.eFexTauTobKeyList = [
'L1_eTauRoI',
'L1_eTauxRoI']
529 if flags.Input.Format == Format.POOL
or flags.Trigger.enableL1CaloPhase1:
530 for l
in [EfexMonAlg.eFexEMTobKeyList,EfexMonAlg.eFexTauTobKeyList]: l += [x + (
"_ReSim" if flags.Input.Format == Format.POOL
and flags.Trigger.enableL1CaloPhase1
else "Sim")
for x
in l ]
532 if not flags.Input.isMC
and flags.Trigger.enableL1CaloPhase1:
533 from TrigT1CaloMonitoring.EfexSimMonitorAlgorithm
import EfexSimMonitoringConfig
534 cfg.merge(EfexSimMonitoringConfig(flags),sequenceName=
"L1Mon")
537 from TrigT1CaloMonitoring.EfexMonitorAlgorithm
import EfexMonitoringHistConfig
538 cfg.merge(EfexMonitoringHistConfig(flags,EfexMonAlg),sequenceName=
"L1Mon")
540 if flags.Trigger.L1.dojFex:
541 from TrigT1CaloMonitoring.JfexMonitorAlgorithm
import JfexMonitoringConfig
542 cfg.merge(JfexMonitoringConfig(flags),sequenceName=
"L1Mon")
543 if not flags.Input.isMC
and flags.Trigger.enableL1CaloPhase1:
544 from TrigT1CaloMonitoring.JfexSimMonitorAlgorithm
import JfexSimMonitoringConfig
545 cfg.merge(JfexSimMonitoringConfig(flags),sequenceName=
"L1Mon")
546 if flags.Trigger.L1.dogFex:
547 from TrigT1CaloMonitoring.GfexMonitorAlgorithm
import GfexMonitoringConfig
548 cfg.merge(GfexMonitoringConfig(flags),sequenceName=
"L1Mon")
549 if not flags.Input.isMC
and flags.Trigger.enableL1CaloPhase1:
550 from TrigT1CaloMonitoring.GfexSimMonitorAlgorithm
import GfexSimMonitoringConfig
551 cfg.merge(GfexSimMonitoringConfig(flags),sequenceName=
"L1Mon")
554 if flags.DQ.useTrigger:
555 from TrigT1CaloMonitoring.JetEfficiencyMonitorAlgorithm
import JetEfficiencyMonitoringConfig
556 cfg.merge(JetEfficiencyMonitoringConfig(flags),sequenceName=
"L1Mon")
558 if flags.Trigger.L1.doTopo:
559 from L1TopoOnlineMonitoring.L1TopoOnlineMonitoringConfig
import Phase1TopoMonitoringCfg
560 cfg.merge(Phase1TopoMonitoringCfg(flags))
563 if flags.Trigger.L1.doCaloInputs
and not flags.Input.isMC:
564 from TrigT1CaloMonitoring.EfexInputMonitorAlgorithm
import EfexInputMonitoringConfig
565 if flags.Trigger.L1.doeFex: cfg.merge(EfexInputMonitoringConfig(flags),sequenceName=
"L1Mon")
566 from TrigT1CaloMonitoring.JfexInputMonitorAlgorithm
import JfexInputMonitoringConfig
567 if flags.Trigger.L1.dojFex: cfg.merge(JfexInputMonitoringConfig(flags),sequenceName=
"L1Mon")
568 from TrigT1CaloMonitoring.GfexInputMonitorAlgorithm
import GfexInputMonitoringConfig
569 if flags.Trigger.L1.dogFex: cfg.merge(GfexInputMonitoringConfig(flags),sequenceName=
"L1Mon")
571mainSeq =
"AthAllAlgSeq"
572if args.fexReadoutFilter:
574 topSeq = cfg.getSequence(
"AthAlgEvtSeq")
575 algSeq = cfg.getSequence(mainSeq)
576 mainSeq =
"New" + mainSeq
578 topSeq.Members = [topSeq.Members[0],CompFactory.AthSequencer(mainSeq),topSeq.Members[-1]]
579 cfg.addEventAlgo(CompFactory.L1IDFilterAlgorithm(),sequenceName=mainSeq)
580 cfg.getSequence(mainSeq).Members += [algSeq]
582if args.evtNumber
is not None:
583 print(
"filtering events",args.evtNumber)
585 topSeq = cfg.getSequence(
"AthAlgEvtSeq")
586 algSeq = cfg.getSequence(mainSeq)
587 mainSeq =
"New" + mainSeq
589 topSeq.Members = [topSeq.Members[0],CompFactory.AthSequencer(mainSeq),topSeq.Members[-1]]
590 cfg.addEventAlgo(CompFactory.EventNumberFilterAlgorithm(
"EvtNumberFilter",EventNumbers=args.evtNumber),sequenceName=mainSeq)
591 cfg.getSequence(mainSeq).Members += [algSeq]
593from PerfMonComps.PerfMonCompsConfig
import PerfMonMTSvcCfg
594cfg.merge( PerfMonMTSvcCfg(flags) )
596from AthenaConfiguration.Utils
import setupLoggingLevels
597setupLoggingLevels(flags,cfg)
599if any([s.name==
"AthenaEventLoopMgr" for s
in cfg.getServices()]): cfg.getService(
"AthenaEventLoopMgr").IntervalInSeconds = 30
600if any([s.name==
"AthenaHiveEventLoopMgr" for s
in cfg.getServices()]): cfg.getService(
"AthenaHiveEventLoopMgr").EventPrintoutInterval = 100
601if any([s.name==
"AvalancheSchedulerSvc" for s
in cfg.getServices()]): cfg.getService(
"AvalancheSchedulerSvc").ShowDataDependencies=
True
604if not flags.Input.isMC:
606 runinfo = getLArDTInfoForRun(flags.Input.RunNumbers[0], connstring=
"COOLONL_LAR/CONDBR2")
607 if runinfo.FWversion()==6:
609 if args.dbOverrides
is None: args.dbOverrides = []
610 args.dbOverrides += [
"/LAR/Identifier/LatomeMapping:LARIdentifierLatomeMapping-fw6"]
614if type(args.dbOverrides)==list:
615 from IOVDbSvc.IOVDbSvcConfig
import addOverride
619 for override
in args.dbOverrides:
620 folderName,dbPath = override.split(
"=",1)
if "=" in override
else (override,
"")
621 if folderName ==
"":
raise ValueError(
"Cannot parse dbOverride: " + override)
624 if ";dbname=" not in dbPath: dbPath +=
";dbname=CONDBR2"
625 dbPath,dbInst = dbPath.split(
";dbname=")
626 if not os.path.exists(dbPath):
raise ValueError(
"dbOverride file doesn't exist: " + dbPath)
627 db = f
"sqlite://;schema={dbPath};dbname={dbInst}"
629 if ":" in folderName:
630 folderName,tag = folderName.split(
":",1)
631 if folderName[0] !=
"/": folderName =
"/TRIGGER/L1Calo/V1/Calibration/" + folderName
632 log.info(
" ".join((
"Overriding COOL folder=",folderName,
"db=",db,
"tag=",tag)))
634 cfg.merge( addOverride(flags,folder=folderName,tag=tag))
636 cfg.merge( addOverride(flags,folder=folderName,db=db,tag=tag))
641if flags.Output.AODFileName !=
"" and len(flags.Input.Files)>0:
643 if edmName.endswith(
"Sim")
and flags.Input.Format == Format.POOL: edmName = edmName.replace(
"Sim",
"_ReSim")
644 auxType = edmType.replace(
'Container',
'AuxContainer')
645 return [f
'{edmType}#{edmName}', f
'{auxType}#{edmName}Aux.']
649 if flags.Trigger.L1.doeFex:
650 outputEDM +=
addEDM(
'xAOD::eFexEMRoIContainer' ,
"L1_eEMRoI")
651 outputEDM +=
addEDM(
'xAOD::eFexEMRoIContainer' ,
"L1_eEMRoISim")
652 outputEDM +=
addEDM(
'xAOD::eFexEMRoIContainer' ,
"L1_eEMxRoI")
653 outputEDM +=
addEDM(
'xAOD::eFexEMRoIContainer' ,
"L1_eEMxRoISim")
655 outputEDM +=
addEDM(
'xAOD::eFexTauRoIContainer' ,
"L1_eTauRoI")
656 outputEDM +=
addEDM(
'xAOD::eFexTauRoIContainer' ,
"L1_eTauRoISim")
657 outputEDM +=
addEDM(
'xAOD::eFexTauRoIContainer' ,
"L1_eTauxRoI")
658 outputEDM +=
addEDM(
'xAOD::eFexTauRoIContainer' ,
"L1_eTauxRoISim")
660 if flags.Trigger.L1.dojFex:
661 outputEDM +=
addEDM(
'xAOD::jFexTowerContainer' ,
"L1_jFexDataTowers")
662 outputEDM +=
addEDM(
'xAOD::jFexTowerContainer' ,
"L1_jFexEmulatedTowers")
663 outputEDM +=
addEDM(
'xAOD::jFexSRJetRoIContainer',
'L1_jFexSRJetRoISim')
664 outputEDM +=
addEDM(
'xAOD::jFexLRJetRoIContainer',
'L1_jFexLRJetRoISim')
665 outputEDM +=
addEDM(
'xAOD::jFexTauRoIContainer' ,
'L1_jFexTauRoISim' )
666 outputEDM +=
addEDM(
'xAOD::jFexFwdElRoIContainer',
'L1_jFexFwdElRoISim')
667 outputEDM +=
addEDM(
'xAOD::jFexSumETRoIContainer',
'L1_jFexSumETRoISim')
668 outputEDM +=
addEDM(
'xAOD::jFexMETRoIContainer' ,
'L1_jFexMETRoISim' )
669 outputEDM +=
addEDM(
'xAOD::jFexSRJetRoIContainer',
'L1_jFexSRJetRoI')
670 outputEDM +=
addEDM(
'xAOD::jFexLRJetRoIContainer',
'L1_jFexLRJetRoI')
671 outputEDM +=
addEDM(
'xAOD::jFexTauRoIContainer' ,
'L1_jFexTauRoI' )
672 outputEDM +=
addEDM(
'xAOD::jFexFwdElRoIContainer',
'L1_jFexFwdElRoI')
673 outputEDM +=
addEDM(
'xAOD::jFexSumETRoIContainer',
'L1_jFexSumETRoI')
674 outputEDM +=
addEDM(
'xAOD::jFexMETRoIContainer' ,
'L1_jFexMETRoI' )
676 outputEDM +=
addEDM(
'xAOD::jFexSRJetRoIContainer',
'L1_jFexSRJetxRoI')
677 outputEDM +=
addEDM(
'xAOD::jFexLRJetRoIContainer',
'L1_jFexLRJetxRoI')
678 outputEDM +=
addEDM(
'xAOD::jFexTauRoIContainer' ,
'L1_jFexTauxRoI' )
679 outputEDM +=
addEDM(
'xAOD::jFexFwdElRoIContainer',
'L1_jFexFwdElxRoI')
680 outputEDM +=
addEDM(
'xAOD::jFexSumETRoIContainer',
'L1_jFexSumETxRoI')
681 outputEDM +=
addEDM(
'xAOD::jFexMETRoIContainer' ,
'L1_jFexMETxRoI' )
683 if flags.Trigger.L1.dogFex:
684 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gMETComponentsJwoj')
685 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gMETComponentsJwojSim')
686 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gMHTComponentsJwoj')
687 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gMHTComponentsJwojSim')
688 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gMSTComponentsJwoj')
689 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gMSTComponentsJwojSim')
690 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gScalarEJwoj')
691 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gScalarEJwojSim')
692 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gScalarENoiseCutSim')
693 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gScalarERmsSim')
695 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer',
'L1_gFexLRJetRoI')
696 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer',
'L1_gFexLRJetRoISim')
697 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer',
'L1_gFexSRJetRoI')
698 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer',
'L1_gFexSRJetRoISim')
699 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer',
'L1_gFexRhoRoI')
700 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer',
'L1_gFexRhoRoISim')
704 from OutputStreamAthenaPool.OutputStreamConfig
import OutputStreamCfg
705 cfg.merge(OutputStreamCfg(flags,
'AOD', ItemList=outputEDM, takeItemsFromInput=
True))
706 from xAODMetaDataCnv.InfileMetaDataConfig
import SetupMetaDataForStreamCfg
707 cfg.merge(SetupMetaDataForStreamCfg(flags,
'AOD'))
710if flags.Output.BSFileName !=
"":
711 from TrigT1ResultByteStream.TrigT1ResultByteStreamConfig
import L1TriggerByteStreamEncoderCfg
712 cfg.merge(L1TriggerByteStreamEncoderCfg(flags))
715 algo = CompFactory.L1TriggerResultMaker(
"OutputBSTCCMaker",
717 eFexEMRoIKeys=[], eFexTauRoIKeys=[],
718 jFexFwdElRoIKeys=[], jFexTauRoIKeys = [],
719 jFexSRJetRoIKeys = [], jFexLRJetRoIKeys = [],
720 gFexSRJetRoIKeys = [], gFexLRJetRoIKeys = [],
721 cTauRoIKey =
"", cjTauLinkKey =
"", ThresholdPatternTools= [],
723 L1TriggerResultWHKey =
"OutputBSTCC")
725 cfg.getService(
"ByteStreamCnvSvc").FillTriggerBits=
False
726 if flags.Trigger.L1.doeFex:
727 algo.eFexEMRoIKeys = [
"L1_eEMRoI",
"L1_eEMxRoI"]
728 algo.eFexTauRoIKeys = [
"L1_eTauRoI",
"L1_eTauxRoI"]
730 if flags.Trigger.L1.dojFex:
731 algo.jFexSRJetRoIKeys = [
"L1_jFexSRJetRoI"]
732 algo.jFexLRJetRoIKeys = [
"L1_jFexLRJetRoI"]
733 algo.jFexTauRoIKeys = [
"L1_jFexTauRoI"]
734 algo.jFexFwdElRoIKeys = [
"L1_jFexFwdElRoI"]
736 if flags.Trigger.L1.dogFex:
737 algo.gFexSRJetRoIKeys = [
"L1_gFexSRJetRoI"]
738 algo.gFexLRJetRoIKeys = [
"L1_gFexLRJetRoI"]
739 algo.gScalarEJwojKeys = [
"L1_gScalarEJwoj"]
740 algo.gMETComponentsJwojKeys = [
"L1_gMETComponentsJwoj"]
742 cfg.addEventAlgo(algo)
743 from ByteStreamCnvSvc.ByteStreamConfig
import ByteStreamWriteCfg
744 write = ByteStreamWriteCfg(flags, [
"xAOD::TrigCompositeContainer#OutputBSTCC"])
747if "MuonAlignmentCondAlg" in [a.name
for a
in cfg.getCondAlgos()]: cfg.getCondAlgo(
"MuonAlignmentCondAlg").OutputLevel=Constants.ERROR
750if flags.Trigger.L1.doeFex
and (args.evtNumber
is not None):
752 cfg.addEventAlgo(CompFactory.LVL1.eFexEventDumper(TowersKey=
"L1_eFexDataTowers",EMRoIKey=
"L1_eEMRoI",TauRoIKey=
"L1_eTauRoI"))
757from AthenaCommon.Include
import include
759with ConfigurableCABehavior():
760 for inc
in args.postInclude:
762 topLog.setLevel(logging.INFO)
764 topLog.setLevel(logging.WARNING)
765 except Exception
as e:
767 print(f
"Exception from {inc}")
771 while tb
is not None:
772 if tb.tb_frame.f_code.co_filename.endswith(inc):
776 traceback.print_exception(
type(e), e, tb)
779for conf
in args.postConfig:
780 compName,propNameAndVal=conf.split(
".",1)
781 propName,propVal=propNameAndVal.split(
"=",1)
783 ast.literal_eval(propVal)
785 propVal=f
"\"{propVal}\""
786 propNameAndVal = f
"{propName}={propVal}"
788 from collections
import defaultdict
789 availableComps = defaultdict(list)
790 for comp
in [c
for c
in cfg._allComponents()]+cfg.getServices():
791 availableComps[comp.getType()] += [comp.getName()]
792 if comp.getName()==compName
or comp.getType()==compName
or comp.toStringProperty()==compName:
795 log.info(
"Setting "+compName+
" property: "+propNameAndVal)
796 exec(f
"comp.{propNameAndVal}")
797 except AttributeError
as e:
798 log.fatal(
"Unknown property of " + compName +
" : " + propNameAndVal)
799 log.fatal(
"See next line for available properties:")
804 print(
"Available comps:")
805 for k,v
in availableComps.items():
807 raise ValueError(f
"postConfig {conf} had no effect ... typo? See list above of available components")
809if args.postHelp
is not None:
810 from collections
import defaultdict
811 availableComps = defaultdict(list)
812 for comp
in [c
for c
in cfg._allComponents()]+cfg.getServices():
813 availableComps[comp.getType()] += [comp.getName()]
814 print(
"Available comps:")
815 for k,v
in availableComps.items():
816 print(
"",k,
":",
", ".join(v))
821if flags.Exec.MaxEvents==0: cfg.printConfig(withDetails =
True, summariseProps =
True, printDefaults =
True)
822log.info(
" ".join((
"Configured Services:",*[svc.name
for svc
in cfg.getServices()])) )
826if flags.Exec.MaxEvents==1:
828 cfg.getService(
"StoreGateSvc").Dump=
True
829 cfg.getService(
"DetectorStore").Dump=
True
832if cfg.getService(
"StoreGateSvc").Dump:
833 cfg.getService(
"StoreGateSvc").OutputLevel=3
834if cfg.getService(
"DetectorStore").Dump:
835 cfg.getService(
"DetectorStore").OutputLevel=3
838 from AthenaConfiguration.ComponentAccumulator
import startInteractive
839 oldLevel = int(cfg._msg.getEffectiveLevel())
840 cfg._msg.setLevel(logging.INFO)
841 print(
"\n\nEntering interactive configuration mode. You can explore and edit the cfg object. Ctrl+D to configure application and move to pre-initialize step")
842 startInteractive(locals()|{
"self":cfg})
843 cfg._msg.setLevel(oldLevel)
846 readline.write_history_file(os.path.expanduser(
'~/.athena.history' ))
848if flags.Exec.MaxEvents==0:
852 from TrigT1CaloMonitoring.LVL1CaloMonitoringConfig
import L1CaloMonitorCfgHelper
853 L1CaloMonitorCfgHelper.printHanConfig()
854 cfg._wasMerged =
True
857if cfg.run().isFailure():
void print(char *figname, TCanvas *c1)
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
std::vector< std::string > split(const std::string &s, const std::string &t=":")
load_function(file_path, function_name)