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
54flags.Trigger.L1.doCalo = partition.isValid()
55flags.Trigger.L1.doeFex = partition.isValid()
56flags.Trigger.L1.dojFex = partition.isValid()
57flags.Trigger.L1.dogFex = partition.isValid()
58flags.Trigger.L1.doTopo = partition.isValid()
61if partition.isValid():
64 flags.Trigger.doLVL1 =
False
65 flags.Trigger.doHLT =
False
66 from AthenaConfiguration.AutoConfigOnlineRecoFlags
import autoConfigOnlineRecoFlags
67 autoConfigOnlineRecoFlags(flags, partition.name())
69 flags.Trigger.doLVL1 =
True
73if "--help" in sys.argv:
75 neededCats = [
"DQ",
"Trigger",
"PerfMon"]
76 for cat
in list(flags._dynaflags.keys()):
77 if cat
not in neededCats: del flags._dynaflags[cat]
81parser = flags.getArgumentParser(epilog=
"""
82Extra flags are specified after a " -- " and the following are most relevant flags for this script:
84 Trigger.enableL1CaloPhase1 : turn on/off the offline simulation [default: True]
85 DQ.doMonitoring : turn on/off the monitoring [default: True]
86 Trigger.L1.doCaloInputs : controls input readout decoding and monitoring [default: False*]
87 Trigger.L1.doCalo : controls trex (legacy syst) monitoring [default: False]
88 Trigger.L1.doeFex : controls efex simulation and monitoring [default: False*]
89 Trigger.L1.dojFex : controls jfex simulation and monitoring [default: False*]
90 Trigger.L1.dogFex : controls gfex simulation and monitoring [default: False*]
91 Trigger.L1.doTopo : controls topo simulation and monitoring [default: False*] (from 2023 Onwards)
92 Trigger.L1.doGlobal : controls global simulation and monitoring [default: False]
93 DQ.useTrigger : controls if JetEfficiency monitoring alg is run or not [default: False]
94 PerfMon.doFullMonMT : print info about execution time of algorithms and memory use etc [default: False]
95 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)]
97Note: If you do not specify any flags, then all the flags that are marked with a * will automatically become True
99E.g. to run just the jFex monitoring, without offline simulation, you can do:
101l1calo-ath-mon .... -- Trigger.enableL1CaloPhase1=False Trigger.L1.doCaloInputs=False Trigger.L1.doeFex=False Trigger.L1.dogFex=False
103To run with a plugin you can do e.g:
105l1calo-ath-mon PluginPackage/plugin.py --evtMax 10 ...
107Further notes: Run with "--evtMax 0" to print flags and ca config, and generate a hanConfig file.
108 Run with "--evtMax 1" to dump StoreGate contents after the first event
113parser.formatter_class = argparse.RawDescriptionHelpFormatter
114parser.add_argument(
'--runNumber',default=
None,help=
"specify to select a run number")
115parser.add_argument(
'--lumiBlock',default=
None,help=
"specify to select a lumiBlock")
116parser.add_argument(
'--evtNumber',default=
None,nargs=
"+",type=int,help=
"specify to select an evtNumber")
117parser.add_argument(
'--stream',default=
"*",help=
"stream to lookup files in")
118parser.add_argument(
'--fexReadoutFilter',action=
'store_true',help=
"If specified, will skip events without fexReadout")
119parser.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 ")
120parser.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")
121parser.add_argument(
'--postInclude',default=[],nargs=
"+",type=str,help=
"specify python files to call before configuration completes")
122parser.add_argument(
'--postHelp',default=
None,nargs=
"*",help=
"Displays configurables and their properties")
123args,unknown_args = flags.fillFromArgs(parser=parser,return_unknown=
True)
127 optionsPathEnv = os.environ[
'JOBOPTSEARCHPATH' ]
129 optionsPathEnv = os.curdir
130optionsPath = re.split(
',|' + os.pathsep, optionsPathEnv )
132 optionsPath[ optionsPath.index(
'' ) ] = str(os.curdir)
133for fn
in unknown_args:
134 from AthenaCommon.Utils.unixtools
import FindFile
135 name = FindFile( os.path.expanduser( os.path.expandvars( fn ) ), optionsPath, os.R_OK )
136 if not name: name = FindFile( os.path.basename( fn ), optionsPath, os.R_OK )
138 args.postInclude += [fn]
139 unknown_args.remove(fn)
140args.postConfig += [x[4:]
for x
in unknown_args
if x.startswith(
"cfg.")]
141if any([
not x.startswith(
"cfg.")
for x
in unknown_args]):
142 raise KeyError(
"Unknown flags: " +
" ".join([x
for x
in unknown_args
if not x.startswith(
"cfg.")]))
144if len(args.postInclude):
147 with ConfigurableCABehavior():
148 from AthenaCommon.Utils.unixtools
import FindFile
152 with open(file_path,
"r", encoding=
"utf-8")
as f:
154 tree = ast.parse(source, filename=file_path)
155 for node
in tree.body:
156 if isinstance(node, ast.FunctionDef)
and node.name == function_name:
158 mod = ast.Module(body=[node], type_ignores=[])
160 code = compile(mod, filename=file_path, mode=
"exec")
163 exec(code, namespace)
164 return namespace[function_name]
165 for fn
in args.postInclude:
166 name = FindFile( os.path.expanduser( os.path.expandvars( fn ) ), optionsPath, os.R_OK )
168 name = FindFile( os.path.basename( fn ), optionsPath, os.R_OK )
169 if not name:
raise RuntimeError(
'plugin file %s can not be found' % fn )
174if 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]):
175 log.info(
"No steering flags specified, turning on all phase 1 systems (trex,efex,jfex,gfex,topo)")
176 flags.Trigger.L1.doCaloInputs =
True
177 flags.Trigger.L1.doCalo =
True
178 flags.Trigger.L1.doeFex =
True
179 flags.Trigger.L1.dojFex =
True
180 flags.Trigger.L1.dogFex =
True
181 flags.Trigger.L1.doTopo =
True
184if len(flags.Input.Files)>0:
186 from AthenaConfiguration.TestDefaults
import defaultTestFiles
187 flags.Input.Files = [getattr(defaultTestFiles,f,f)
for f
in flags.Input.Files]
188 flags.Input.Files = [item
for x
in flags.Input.Files
for item
in (x
if isinstance(x,list)
else [x])]
190 for f
in flags.Input.Files:
191 if not os.path.exists(f):
192 log.fatal(f
"file '{f}' does not exist")
195if args.runNumber
is not None:
201 from glob
import glob
202 if args.lumiBlock
is None: args.lumiBlock=
"*"
203 log.info(
" ".join((
"Looking up files in atlastier0 for run",args.runNumber,
"lb =",args.lumiBlock)))
204 flags.Input.Files = []
205 for lb
in args.lumiBlock.split(
","):
207 tryStr = f
"/eos/atlas/atlastier0/rucio/data*/{args.stream}/*{args.runNumber}/*RAW/*lb*.*"
209 tryStr = f
"/eos/atlas/atlastier0/rucio/data*/{args.stream}/*{args.runNumber}/*RAW/*lb{int(lb):04}.*"
210 log.info(
" ".join((
"Trying",tryStr)))
211 flags.Input.Files += glob(tryStr)
212 log.info(
" ".join((
"Found",str(len(flags.Input.Files)),
"files")))
215if type(flags.Trigger.triggerConfig)==str
and flags.Trigger.triggerConfig.startswith(
"FILE:"):
216 customMenuFile = flags.Trigger.triggerConfig.split(
":",1)[-1]
217 flags.Trigger.triggerConfig=
"FILE"
221if not flags.Common.isOnline
and len(flags.Input.Files)==0:
222 if flags.Exec.MaxEvents==0:
224 flags.Input.Files = [
"/eos/atlas/atlascerngroupdisk/det-l1calo/OfflineSoftware/TestFiles/data24_13p6TeV/data24_13p6TeV.00477048.physics_Main.daq.RAW._lb0821._SFO-20._0001.data"]
226 log.fatal(
"Running in offline mode but no input files provided. Please specify with: --filesInput <file>")
227 from AthenaConfiguration.TestDefaults
import defaultTestFiles
228 log.fatal(
"You can specify one of the default test files:" +
",".join([f
for f
in dir(defaultTestFiles)
if f[0].isupper()]))
230elif flags.Common.isOnline:
231 log.info(
"Running Online with Partition: "+partition.name())
234 if flags.Trigger.Online.partitionName ==
'':
237 flags.Trigger.doLVL1 =
False
238 flags.Trigger.doHLT =
False
239 from AthenaConfiguration.AutoConfigOnlineRecoFlags
import autoConfigOnlineRecoFlags
240 autoConfigOnlineRecoFlags(flags, partition.name())
241 standalone = (partition.name()!=
"ATLAS")
242 if standalone : log.info(
"Using local menu because partition is not ATLAS")
243 elif len(flags.Input.Files)==0
and partition.isValid():
246 log.info(
"Waiting 2 minutes for LATOME to get their databases in order")
250if len(flags.Input.Files)>0:
251 flags.DQ.Environment =
"user"
254 standalone = ((flags.Input.ProjectName ==
"data_test")
or (re.match(
r"data\d\d_calib", flags.Input.ProjectName)))
255 if standalone :
print(
"Using local menu because project_name=",flags.Input.ProjectName)
256 if flags.Input.isMC : flags.Trigger.triggerConfig=
'FILE'
257 elif flags.Trigger.triggerConfig==
'INFILE':
259 flags.Trigger.triggerConfig=
"DB"
261 if flags.Input.isMC
and flags.Trigger.L1.doCalo:
262 log.info(
"Disabling legacy monitoring because it doesn't work with MC")
263 flags.Trigger.L1.doCalo=
False
266 flags.Trigger.triggerConfig=
'FILE'
269if flags.Exec.MaxEvents == 0:
271 flags.DQ.doMonitoring=
True
272 flags.Trigger.L1.doCalo=
True
273 flags.Trigger.L1.doCaloInputs=
True
274 flags.Trigger.L1.doeFex=
True
275 flags.Trigger.L1.dojFex=
True
276 flags.Trigger.L1.dogFex=
True
277 flags.Trigger.L1.doTopo=
True
278 flags.DQ.useTrigger=
True
279 flags.Exec.OutputLevel = Constants.INFO
282if flags.GeoModel.AtlasVersion
is None:
283 from AthenaConfiguration.TestDefaults
import defaultGeometryTags
284 flags.GeoModel.AtlasVersion = defaultGeometryTags.autoconfigure(flags)
286if flags.Trigger.triggerConfig==
"FILE" and flags.Trigger.L1.doCalo:
289 log.warning(
"Cannot run Legacy sim/mon when using json l1 menu. Disabling")
290 flags.Trigger.L1.doCalo=
False
292if (flags.Input.Format == Format.POOL): flags.Trigger.L1.doTopo =
False
293if not flags.Trigger.L1.doTopo: flags.Trigger.L1.doMuon =
False
295if flags.Trigger.enableL1CaloPhase1:
298 from AthenaConfiguration.DetectorConfigFlags
import setupDetectorsFromList
299 setupDetectorsFromList(flags,[
'LAr',
'Tile',
'MBTS'] + ([
'RPC',
'TGC',
'MDT']
if flags.Trigger.L1.doMuon
else []),
True)
301from AthenaConfiguration.MainServicesConfig
import MainServicesCfg
302cfg = MainServicesCfg(flags)
304log.setLevel(logging.INFO)
310if flags.Exec.MaxEvents == 0: flags.dump(evaluate=
True)
313if 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]):
314 log.fatal(
"You did not set any flags to specify what to run. ")
315 log.fatal(
"Please set at least one of the flags in Trigger.L1.(doCaloInputs, doCalo, doeFex, dojFex, dogFex, doTopo) ")
316 log.fatal(
"or use '--all' option to turn on everything (but that is slow)")
317 log.fatal(
"See --help for more info about the flags")
320if flags.Common.isOnline
and len(flags.Input.Files)==0:
321 flags.dump(evaluate=
True)
322 from ByteStreamEmonSvc.EmonByteStreamConfig
import EmonByteStreamCfg
323 cfg.merge(EmonByteStreamCfg(flags))
324 bsSvc = cfg.getService(
"ByteStreamInputSvc")
325 bsSvc.Partition = partition.name()
326 bsSvc.Key = os.environ.get(
"L1CALO_PTIO_KEY",
"REB" if partition.name()==
"L1CaloStandalone" else "dcm")
327 if partition.name()==
"L1CaloSTF": bsSvc.Key =
"SWROD"
328 bsSvc.KeyCount = int(os.environ.get(
"L1CALO_PTIO_KEY_COUNT",
"25"))
329 bsSvc.ISServer =
"Histogramming"
330 bsSvc.BufferSize = 10
331 bsSvc.UpdatePeriod = 30
332 bsSvc.Timeout = 240000
333 bsSvc.PublishName = os.getenv(
"L1CALO_ATHENA_JOB_NAME",
"testing")
334 bsSvc.StreamType = os.getenv(
"L1CALO_PTIO_STREAM_TYPE",
"physics")
335 bsSvc.ExitOnPartitionShutdown =
False
336 bsSvc.ClearHistograms =
True
337 bsSvc.GroupName =
"RecExOnline"
339 bsSvc.StreamNames = os.getenv(
"L1CALO_PTIO_STREAM_NAME",
"L1Calo:Main:MinBias:MinBiasOverlay:UPC:EnhancedBias:ZeroBias:HardProbes:Standby:ALFACalib").
split(
":")
340 bsSvc.StreamLogic = os.getenv(
"L1CALO_PTIO_STREAM_LOGIC",
"Or")
if partition.name() !=
"L1CaloStandalone" else "Ignore"
342 bsSvc.LVL1Logic =
"Ignore"
343elif flags.Input.Format == Format.POOL:
344 log.info(f
"Running Offline on {len(flags.Input.Files)} POOL files: {flags.Input.Files[0]} ...")
345 from AthenaPoolCnvSvc.PoolReadConfig
import PoolReadCfg
346 cfg.merge(PoolReadCfg(flags))
348 log.info(f
"Running Offline on {len(flags.Input.Files)} bytestream files: {flags.Input.Files[0]} ...")
351 from TriggerJobOpts.TriggerByteStreamConfig
import ByteStreamReadCfg
352 cfg.merge(ByteStreamReadCfg(flags))
355from AthenaMonitoring.AthMonitorCfgHelper
import getDQTHistSvc
356cfg.merge(getDQTHistSvc(flags))
359from TrigConfigSvc.TrigConfigSvcCfg
import L1ConfigSvcCfg,generateL1Menu, createL1PrescalesFileFromMenu,getL1MenuFileName
360if flags.Trigger.triggerConfig==
"FILE":
362 menuFilename = getL1MenuFileName(flags)
363 if customMenuFile ==
"":
364 if os.path.exists(menuFilename): os.remove(menuFilename)
365 generateL1Menu(flags)
370 os.symlink(customMenuFile, menuFilename)
372 if e.errno == errno.EEXIST:
373 os.remove(menuFilename)
374 os.symlink(customMenuFile, menuFilename)
377 menuFilename = customMenuFile
378 if os.path.exists(menuFilename):
379 log.info(f
"Using L1Menu: {menuFilename}")
381 log.fatal(f
"L1Menu file does not exist: {menuFilename}")
383 createL1PrescalesFileFromMenu(flags)
384cfg.merge(L1ConfigSvcCfg(flags))
391if flags.Common.isOnline
or (flags.Input.Format != Format.POOL
and not flags.Input.isMC):
392 from L1CaloFEXByteStream.L1CaloFEXByteStreamConfig
import eFexByteStreamToolCfg, jFexRoiByteStreamToolCfg, jFexInputByteStreamToolCfg, gFexByteStreamToolCfg, gFexInputByteStreamToolCfg
393 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))]
394 if flags.Trigger.L1.dojFex: decoderTools += [cfg.popToolsAndMerge(jFexRoiByteStreamToolCfg(flags=flags,name=
"jFexBSDecoderTool",writeBS=
False))]
395 if flags.Trigger.L1.dogFex: decoderTools += [cfg.popToolsAndMerge(gFexByteStreamToolCfg(flags=flags,name=
"gFexBSDecoderTool",writeBS=
False))]
396 if flags.Trigger.L1.doTopo:
397 from L1TopoByteStream.L1TopoByteStreamConfig
import L1TopoPhase1ByteStreamToolCfg
398 decoderTools += [cfg.popToolsAndMerge(L1TopoPhase1ByteStreamToolCfg(flags=flags,name=
"L1TopoBSDecoderTool",writeBS=
False))]
400 if flags.Trigger.L1.doMuon:
401 from MuonConfig.MuonBytestreamDecodeConfig
import RpcBytestreamDecodeCfg,TgcBytestreamDecodeCfg
402 cfg.merge(RpcBytestreamDecodeCfg(flags))
403 cfg.merge(TgcBytestreamDecodeCfg(flags))
404 from TrigT1ResultByteStream.TrigT1ResultByteStreamConfig
import MuonRoIByteStreamToolCfg
405 decoderTools += [cfg.popToolsAndMerge(MuonRoIByteStreamToolCfg(flags, name=
"L1MuonBSDecoderTool", writeBS=
False))]
408 if flags.Trigger.L1.doCaloInputs:
409 if flags.Trigger.L1.dojFex: decoderTools += [cfg.popToolsAndMerge(jFexInputByteStreamToolCfg(flags=flags,name=
'jFexInputBSDecoderTool',writeBS=
False))]
410 if flags.Trigger.L1.dogFex: decoderTools += [cfg.popToolsAndMerge(gFexInputByteStreamToolCfg(flags=flags,name=
'gFexInputBSDecoderTool',writeBS=
False))]
412 if len(decoderTools) > 0:
413 from TrigT1ResultByteStream.TrigT1ResultByteStreamMonitoringConfig
import L1TriggerByteStreamDecoderMonitoringCfg
414 cfg.addEventAlgo(CompFactory.L1TriggerByteStreamDecoderAlg(
415 name=
"L1TriggerByteStreamDecoder",
416 OutputLevel=Constants.ERROR,
417 DecoderTools=decoderTools,
418 ByteStreamMetadataRHKey =
'',
419 MaybeMissingROBs= [id
for tool
in decoderTools
for id
in tool.ROBIDs ]
if partition.name()!=
"ATLAS" or not flags.Common.isOnline
else [],
420 MonTool= cfg.popToolsAndMerge(L1TriggerByteStreamDecoderMonitoringCfg(flags,
"L1TriggerByteStreamDecoder", decoderTools))
421 ),sequenceName=
'AthAlgSeq'
425if flags.Trigger.enableL1CaloPhase1:
426 from L1CaloFEXSim.L1CaloFEXSimCfg
import L1CaloFEXSimCfg
428 cfg.addSequence(CompFactory.AthSequencer(
"L1Sim",StopOverride=
True),parentName=
"AthAlgSeq")
433 cfg.merge(
L1CaloFEXSimCfg(flags,outputSuffix=
"_ReSim" if flags.Input.Format == Format.POOL
else ""),sequenceName=
"L1Sim")
435 if flags.Trigger.L1.doTopo:
436 from L1TopoSimulation.L1TopoSimulationConfig
import L1TopoSimulationCfg
437 cfg.merge(L1TopoSimulationCfg(flags,readMuCTPI=
True,doMonitoring=
False),sequenceName=
"L1Sim")
439 for alg
in cfg.getSequence(
"L1Sim").Members:
440 if alg.name
in [a.name
for a
in cfg.getSequence(
"AthAlgSeq").Members]:
441 cfg.getSequence(
"L1Sim").Members.remove(alg)
445 if "doGlobal" in flags.Trigger.L1
and flags.Trigger.L1.doGlobal:
447 cfg.addSequence(CompFactory.AthSequencer(
"L1GlobalSim",StopOverride=
True),parentName=
"AthAlgSeq")
448 from GlobalSimulation.GlobalSimulationConfig
import GlobalSimulationCfg
449 cfg.merge(GlobalSimulationCfg(flags),sequenceName=
"L1GlobalSim")
451 if flags.Trigger.L1.doeFex:
453 from TrigConfigSvc.TriggerConfigAccess
import getL1MenuAccess
454 L1_menu = getL1MenuAccess(flags)
455 L1_menu.printSummary()
456 em_algoVersion = L1_menu.thresholdExtraInfo(
"eEM").
get(
"algoVersion", 0)
457 tau_algoVersion = L1_menu.thresholdExtraInfo(
"eTAU").
get(
"algoVersion", 0)
458 log.info(f
"algoVersions: eEM: {em_algoVersion}, eTAU: {tau_algoVersion}")
475if flags.DQ.doMonitoring:
477 cfg.addSequence(CompFactory.AthSequencer(
"L1Mon",StopOverride=
True),parentName=
"AthAlgSeq")
478 if flags.Trigger.L1.doCalo:
479 from TrigT1CaloMonitoring.PprMonitorAlgorithm
import PprMonitoringConfig
480 cfg.merge(PprMonitoringConfig(flags),sequenceName=
"L1Mon")
481 from TrigT1CaloMonitoring.PPMSimBSMonitorAlgorithm
import PPMSimBSMonitoringConfig
482 cfg.merge(PPMSimBSMonitoringConfig(flags),sequenceName=
"L1Mon")
483 from TrigT1CaloMonitoring.OverviewMonitorAlgorithm
import OverviewMonitoringConfig
484 cfg.merge(OverviewMonitoringConfig(flags),sequenceName=
"L1Mon")
487 OverviewMonAlg = cfg.getEventAlgo(
"OverviewMonAlg")
488 OverviewMonAlg.CPMErrorLocation =
""
489 OverviewMonAlg.CPMMismatchLocation =
""
491 if flags.Trigger.L1.doeFex:
492 from TrigT1CaloMonitoring.EfexMonitorAlgorithm
import EfexMonitoringConfig
493 cfg.merge(EfexMonitoringConfig(flags),sequenceName=
"L1Mon")
494 EfexMonAlg = cfg.getEventAlgo(
'EfexMonAlg')
496 EfexMonAlg.eFexEMTobKeyList = [
'L1_eEMRoI',
'L1_eEMxRoI']
497 EfexMonAlg.eFexTauTobKeyList = [
'L1_eTauRoI',
'L1_eTauxRoI']
499 if flags.Input.Format == Format.POOL
or flags.Trigger.enableL1CaloPhase1:
500 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 ]
502 if not flags.Input.isMC
and flags.Trigger.enableL1CaloPhase1:
503 from TrigT1CaloMonitoring.EfexSimMonitorAlgorithm
import EfexSimMonitoringConfig
504 cfg.merge(EfexSimMonitoringConfig(flags),sequenceName=
"L1Mon")
507 from TrigT1CaloMonitoring.EfexMonitorAlgorithm
import EfexMonitoringHistConfig
508 cfg.merge(EfexMonitoringHistConfig(flags,EfexMonAlg),sequenceName=
"L1Mon")
510 if flags.Trigger.L1.dojFex:
511 from TrigT1CaloMonitoring.JfexMonitorAlgorithm
import JfexMonitoringConfig
512 cfg.merge(JfexMonitoringConfig(flags),sequenceName=
"L1Mon")
513 if not flags.Input.isMC
and flags.Trigger.enableL1CaloPhase1:
514 from TrigT1CaloMonitoring.JfexSimMonitorAlgorithm
import JfexSimMonitoringConfig
515 cfg.merge(JfexSimMonitoringConfig(flags),sequenceName=
"L1Mon")
516 if flags.Trigger.L1.dogFex:
517 from TrigT1CaloMonitoring.GfexMonitorAlgorithm
import GfexMonitoringConfig
518 cfg.merge(GfexMonitoringConfig(flags),sequenceName=
"L1Mon")
519 if not flags.Input.isMC
and flags.Trigger.enableL1CaloPhase1:
520 from TrigT1CaloMonitoring.GfexSimMonitorAlgorithm
import GfexSimMonitoringConfig
521 cfg.merge(GfexSimMonitoringConfig(flags),sequenceName=
"L1Mon")
524 if flags.DQ.useTrigger:
525 from TrigT1CaloMonitoring.JetEfficiencyMonitorAlgorithm
import JetEfficiencyMonitoringConfig
526 cfg.merge(JetEfficiencyMonitoringConfig(flags),sequenceName=
"L1Mon")
528 if flags.Trigger.L1.doTopo:
529 from L1TopoOnlineMonitoring.L1TopoOnlineMonitoringConfig
import Phase1TopoMonitoringCfg
530 cfg.merge(Phase1TopoMonitoringCfg(flags))
533 if flags.Trigger.L1.doCaloInputs
and not flags.Input.isMC:
534 from TrigT1CaloMonitoring.EfexInputMonitorAlgorithm
import EfexInputMonitoringConfig
535 if flags.Trigger.L1.doeFex: cfg.merge(EfexInputMonitoringConfig(flags),sequenceName=
"L1Mon")
536 from TrigT1CaloMonitoring.JfexInputMonitorAlgorithm
import JfexInputMonitoringConfig
537 if flags.Trigger.L1.dojFex: cfg.merge(JfexInputMonitoringConfig(flags),sequenceName=
"L1Mon")
538 from TrigT1CaloMonitoring.GfexInputMonitorAlgorithm
import GfexInputMonitoringConfig
539 if flags.Trigger.L1.dogFex: cfg.merge(GfexInputMonitoringConfig(flags),sequenceName=
"L1Mon")
541mainSeq =
"AthAllAlgSeq"
542if args.fexReadoutFilter:
544 topSeq = cfg.getSequence(
"AthAlgEvtSeq")
545 algSeq = cfg.getSequence(mainSeq)
546 mainSeq =
"New" + mainSeq
548 topSeq.Members = [topSeq.Members[0],CompFactory.AthSequencer(mainSeq),topSeq.Members[-1]]
549 cfg.addEventAlgo(CompFactory.L1IDFilterAlgorithm(),sequenceName=mainSeq)
550 cfg.getSequence(mainSeq).Members += [algSeq]
552if args.evtNumber
is not None:
553 print(
"filtering events",args.evtNumber)
555 topSeq = cfg.getSequence(
"AthAlgEvtSeq")
556 algSeq = cfg.getSequence(mainSeq)
557 mainSeq =
"New" + mainSeq
559 topSeq.Members = [topSeq.Members[0],CompFactory.AthSequencer(mainSeq),topSeq.Members[-1]]
560 cfg.addEventAlgo(CompFactory.EventNumberFilterAlgorithm(
"EvtNumberFilter",EventNumbers=args.evtNumber),sequenceName=mainSeq)
561 cfg.getSequence(mainSeq).Members += [algSeq]
563from PerfMonComps.PerfMonCompsConfig
import PerfMonMTSvcCfg
564cfg.merge( PerfMonMTSvcCfg(flags) )
566from AthenaConfiguration.Utils
import setupLoggingLevels
567setupLoggingLevels(flags,cfg)
569if any([s.name==
"AthenaEventLoopMgr" for s
in cfg.getServices()]): cfg.getService(
"AthenaEventLoopMgr").IntervalInSeconds = 30
570if any([s.name==
"AthenaHiveEventLoopMgr" for s
in cfg.getServices()]): cfg.getService(
"AthenaHiveEventLoopMgr").EventPrintoutInterval = 100
571if any([s.name==
"AvalancheSchedulerSvc" for s
in cfg.getServices()]): cfg.getService(
"AvalancheSchedulerSvc").ShowDataDependencies=
True
574if not flags.Input.isMC:
576 runinfo = getLArDTInfoForRun(flags.Input.RunNumbers[0], connstring=
"COOLONL_LAR/CONDBR2")
577 if runinfo.FWversion()==6:
579 if args.dbOverrides
is None: args.dbOverrides = []
580 args.dbOverrides += [
"/LAR/Identifier/LatomeMapping:LARIdentifierLatomeMapping-fw6"]
584if type(args.dbOverrides)==list:
585 from IOVDbSvc.IOVDbSvcConfig
import addOverride
589 for override
in args.dbOverrides:
590 folderName,dbPath = override.split(
"=",1)
if "=" in override
else (override,
"")
591 if folderName ==
"":
raise ValueError(
"Cannot parse dbOverride: " + override)
594 if ";dbname=" not in dbPath: dbPath +=
";dbname=CONDBR2"
595 dbPath,dbInst = dbPath.split(
";dbname=")
596 if not os.path.exists(dbPath):
raise ValueError(
"dbOverride file doesn't exist: " + dbPath)
597 db = f
"sqlite://;schema={dbPath};dbname={dbInst}"
599 if ":" in folderName:
600 folderName,tag = folderName.split(
":",1)
601 if folderName[0] !=
"/": folderName =
"/TRIGGER/L1Calo/V1/Calibration/" + folderName
602 log.info(
" ".join((
"Overriding COOL folder=",folderName,
"db=",db,
"tag=",tag)))
604 cfg.merge( addOverride(flags,folder=folderName,tag=tag))
606 cfg.merge( addOverride(flags,folder=folderName,db=db,tag=tag))
610if flags.Output.AODFileName !=
"":
612 if edmName.endswith(
"Sim")
and flags.Input.Format == Format.POOL: edmName = edmName.replace(
"Sim",
"_ReSim")
613 auxType = edmType.replace(
'Container',
'AuxContainer')
614 return [f
'{edmType}#{edmName}', f
'{auxType}#{edmName}Aux.']
618 if flags.Trigger.L1.doeFex:
619 outputEDM +=
addEDM(
'xAOD::eFexEMRoIContainer' ,
"L1_eEMRoI")
620 outputEDM +=
addEDM(
'xAOD::eFexEMRoIContainer' ,
"L1_eEMRoISim")
621 outputEDM +=
addEDM(
'xAOD::eFexEMRoIContainer' ,
"L1_eEMxRoI")
622 outputEDM +=
addEDM(
'xAOD::eFexEMRoIContainer' ,
"L1_eEMxRoISim")
624 outputEDM +=
addEDM(
'xAOD::eFexTauRoIContainer' ,
"L1_eTauRoI")
625 outputEDM +=
addEDM(
'xAOD::eFexTauRoIContainer' ,
"L1_eTauRoISim")
626 outputEDM +=
addEDM(
'xAOD::eFexTauRoIContainer' ,
"L1_eTauxRoI")
627 outputEDM +=
addEDM(
'xAOD::eFexTauRoIContainer' ,
"L1_eTauxRoISim")
629 if flags.Trigger.L1.dojFex:
630 outputEDM +=
addEDM(
'xAOD::jFexTowerContainer' ,
"L1_jFexDataTowers")
631 outputEDM +=
addEDM(
'xAOD::jFexTowerContainer' ,
"L1_jFexEmulatedTowers")
632 outputEDM +=
addEDM(
'xAOD::jFexSRJetRoIContainer',
'L1_jFexSRJetRoISim')
633 outputEDM +=
addEDM(
'xAOD::jFexLRJetRoIContainer',
'L1_jFexLRJetRoISim')
634 outputEDM +=
addEDM(
'xAOD::jFexTauRoIContainer' ,
'L1_jFexTauRoISim' )
635 outputEDM +=
addEDM(
'xAOD::jFexFwdElRoIContainer',
'L1_jFexFwdElRoISim')
636 outputEDM +=
addEDM(
'xAOD::jFexSumETRoIContainer',
'L1_jFexSumETRoISim')
637 outputEDM +=
addEDM(
'xAOD::jFexMETRoIContainer' ,
'L1_jFexMETRoISim' )
638 outputEDM +=
addEDM(
'xAOD::jFexSRJetRoIContainer',
'L1_jFexSRJetRoI')
639 outputEDM +=
addEDM(
'xAOD::jFexLRJetRoIContainer',
'L1_jFexLRJetRoI')
640 outputEDM +=
addEDM(
'xAOD::jFexTauRoIContainer' ,
'L1_jFexTauRoI' )
641 outputEDM +=
addEDM(
'xAOD::jFexFwdElRoIContainer',
'L1_jFexFwdElRoI')
642 outputEDM +=
addEDM(
'xAOD::jFexSumETRoIContainer',
'L1_jFexSumETRoI')
643 outputEDM +=
addEDM(
'xAOD::jFexMETRoIContainer' ,
'L1_jFexMETRoI' )
645 outputEDM +=
addEDM(
'xAOD::jFexSRJetRoIContainer',
'L1_jFexSRJetxRoI')
646 outputEDM +=
addEDM(
'xAOD::jFexLRJetRoIContainer',
'L1_jFexLRJetxRoI')
647 outputEDM +=
addEDM(
'xAOD::jFexTauRoIContainer' ,
'L1_jFexTauxRoI' )
648 outputEDM +=
addEDM(
'xAOD::jFexFwdElRoIContainer',
'L1_jFexFwdElxRoI')
649 outputEDM +=
addEDM(
'xAOD::jFexSumETRoIContainer',
'L1_jFexSumETxRoI')
650 outputEDM +=
addEDM(
'xAOD::jFexMETRoIContainer' ,
'L1_jFexMETxRoI' )
652 if flags.Trigger.L1.dogFex:
653 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gMETComponentsJwoj')
654 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gMETComponentsJwojSim')
655 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gMHTComponentsJwoj')
656 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gMHTComponentsJwojSim')
657 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gMSTComponentsJwoj')
658 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gMSTComponentsJwojSim')
659 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gScalarEJwoj')
660 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gScalarEJwojSim')
661 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gScalarENoiseCutSim')
662 outputEDM +=
addEDM(
'xAOD::gFexGlobalRoIContainer',
'L1_gScalarERmsSim')
664 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer',
'L1_gFexLRJetRoI')
665 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer',
'L1_gFexLRJetRoISim')
666 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer',
'L1_gFexSRJetRoI')
667 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer',
'L1_gFexSRJetRoISim')
668 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer',
'L1_gFexRhoRoI')
669 outputEDM +=
addEDM(
'xAOD::gFexJetRoIContainer',
'L1_gFexRhoRoISim')
673 from OutputStreamAthenaPool.OutputStreamConfig
import OutputStreamCfg
674 cfg.merge(OutputStreamCfg(flags,
'AOD', ItemList=outputEDM, takeItemsFromInput=
True))
675 from xAODMetaDataCnv.InfileMetaDataConfig
import SetupMetaDataForStreamCfg
676 cfg.merge(SetupMetaDataForStreamCfg(flags,
'AOD'))
679if flags.Output.BSFileName !=
"":
680 from TrigT1ResultByteStream.TrigT1ResultByteStreamConfig
import L1TriggerByteStreamEncoderCfg
681 cfg.merge(L1TriggerByteStreamEncoderCfg(flags))
684 algo = CompFactory.L1TriggerResultMaker(
"OutputBSTCCMaker",
686 eFexEMRoIKeys=[], eFexTauRoIKeys=[],
687 jFexFwdElRoIKeys=[], jFexTauRoIKeys = [],
688 jFexSRJetRoIKeys = [], jFexLRJetRoIKeys = [],
689 gFexSRJetRoIKeys = [], gFexLRJetRoIKeys = [],
690 cTauRoIKey =
"", cjTauLinkKey =
"", ThresholdPatternTools= [],
692 L1TriggerResultWHKey =
"OutputBSTCC")
694 cfg.getService(
"ByteStreamCnvSvc").FillTriggerBits=
False
695 if flags.Trigger.L1.doeFex:
696 algo.eFexEMRoIKeys = [
"L1_eEMRoI",
"L1_eEMxRoI"]
697 algo.eFexTauRoIKeys = [
"L1_eTauRoI",
"L1_eTauxRoI"]
699 if flags.Trigger.L1.dojFex:
700 algo.jFexSRJetRoIKeys = [
"L1_jFexSRJetRoI"]
701 algo.jFexLRJetRoIKeys = [
"L1_jFexLRJetRoI"]
702 algo.jFexTauRoIKeys = [
"L1_jFexTauRoI"]
703 algo.jFexFwdElRoIKeys = [
"L1_jFexFwdElRoI"]
705 if flags.Trigger.L1.dogFex:
706 algo.gFexSRJetRoIKeys = [
"L1_gFexSRJetRoI"]
707 algo.gFexLRJetRoIKeys = [
"L1_gFexLRJetRoI"]
708 algo.gScalarEJwojKeys = [
"L1_gScalarEJwoj"]
709 algo.gMETComponentsJwojKeys = [
"L1_gMETComponentsJwoj"]
711 cfg.addEventAlgo(algo)
712 from ByteStreamCnvSvc.ByteStreamConfig
import ByteStreamWriteCfg
713 write = ByteStreamWriteCfg(flags, [
"xAOD::TrigCompositeContainer#OutputBSTCC"])
716if "MuonAlignmentCondAlg" in [a.name
for a
in cfg.getCondAlgos()]: cfg.getCondAlgo(
"MuonAlignmentCondAlg").OutputLevel=Constants.ERROR
719if flags.Trigger.L1.doeFex
and (args.evtNumber
is not None):
721 cfg.addEventAlgo(CompFactory.LVL1.eFexEventDumper(TowersKey=
"L1_eFexDataTowers",EMRoIKey=
"L1_eEMRoI",TauRoIKey=
"L1_eTauRoI"))
726from AthenaCommon.Include
import include
728with ConfigurableCABehavior():
729 for inc
in args.postInclude: include(inc)
731for conf
in args.postConfig:
732 compName,propNameAndVal=conf.split(
".",1)
733 propName,propVal=propNameAndVal.split(
"=",1)
735 from collections
import defaultdict
736 availableComps = defaultdict(list)
737 for comp
in [c
for c
in cfg._allComponents()]+cfg.getServices():
738 availableComps[comp.getType()] += [comp.getName()]
739 if comp.getName()==compName
or comp.getType()==compName
or comp.toStringProperty()==compName:
742 log.info(
"Setting "+compName+
" property: "+propNameAndVal)
743 exec(f
"comp.{propNameAndVal}")
744 except AttributeError
as e:
745 log.fatal(
"Unknown property of " + compName +
" : " + propNameAndVal)
746 log.fatal(
"See next line for available properties:")
751 print(
"Available comps:")
752 for k,v
in availableComps.items():
754 raise ValueError(f
"postConfig {conf} had no effect ... typo? See list above of available components")
756if args.postHelp
is not None:
757 from collections
import defaultdict
758 availableComps = defaultdict(list)
759 for comp
in [c
for c
in cfg._allComponents()]+cfg.getServices():
760 availableComps[comp.getType()] += [comp.getName()]
761 print(
"Available comps:")
762 for k,v
in availableComps.items():
763 print(
"",k,
":",
", ".join(v))
768if flags.Exec.MaxEvents==0: cfg.printConfig(withDetails =
True, summariseProps =
True, printDefaults =
True)
769log.info(
" ".join((
"Configured Services:",*[svc.name
for svc
in cfg.getServices()])) )
773if flags.Exec.MaxEvents==1:
775 cfg.getService(
"StoreGateSvc").Dump=
True
776 cfg.getService(
"DetectorStore").Dump=
True
779if cfg.getService(
"StoreGateSvc").Dump:
780 cfg.getService(
"StoreGateSvc").OutputLevel=3
781if cfg.getService(
"DetectorStore").Dump:
782 cfg.getService(
"DetectorStore").OutputLevel=3
785 from AthenaConfiguration.ComponentAccumulator
import startInteractive
786 oldLevel = int(cfg._msg.getEffectiveLevel())
787 cfg._msg.setLevel(logging.INFO)
788 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")
789 startInteractive(locals()|{
"self":cfg})
790 cfg._msg.setLevel(oldLevel)
793 readline.write_history_file(os.path.expanduser(
'~/.athena.history' ))
795if flags.Exec.MaxEvents==0:
799 from TrigT1CaloMonitoring.LVL1CaloMonitoringConfig
import L1CaloMonitorCfgHelper
800 L1CaloMonitorCfgHelper.printHanConfig()
801 cfg._wasMerged =
True
804if 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)