11 from AthenaConfiguration.ComponentFactory
import CompFactory
12 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
13 from AthenaConfiguration.Enums
import LHCPeriod,Format
14 from AthenaCommon
import Constants
17 partition = ispy.IPCPartition(os.getenv(
"TDAQ_PARTITION",
"ATLAS"))
20 flags.Input.Files = []
26 flags.Exec.OutputLevel = Constants.WARNING
27 flags.Exec.InfoMessageComponents = [
"AthenaEventLoopMgr",
"THistSvc",
"PerfMonMTSvc",
"ApplicationMgr"]
28 flags.Exec.PrintAlgsSequence =
True
32 flags.GeoModel.Run = LHCPeriod.Run3
33 flags.Common.useOnlineLumi =
True
34 flags.DQ.doMonitoring =
True
35 flags.DQ.enableLumiAccess =
False
36 flags.DQ.FileKey =
"" if partition.isValid()
else "EXPERT"
37 flags.Output.HISTFileName = os.getenv(
"L1CALO_ATHENA_JOB_NAME",
"") +
"monitoring.root"
38 flags.DQ.useTrigger =
False
40 flags.Trigger.L1.doCaloInputs =
True
42 flags.Trigger.L1.doeFex =
True
43 flags.Trigger.L1.dojFex =
True
44 flags.Trigger.L1.dogFex =
True
47 if partition.isValid():
50 flags.Trigger.doLVL1 =
False
51 flags.Trigger.doHLT =
False
52 from AthenaConfiguration.AutoConfigOnlineRecoFlags
import autoConfigOnlineRecoFlags
55 flags.Trigger.doLVL1 =
True
60 parser = flags.getArgumentParser()
61 parser.add_argument(
'--runNumber',default=
None,help=
"specify to select a run number")
62 parser.add_argument(
'--lumiBlock',default=
None,help=
"specify to select a lumiBlock")
63 parser.add_argument(
'--evtNumber',default=
None,nargs=
"+",type=int,help=
"specify to select an evtNumber")
64 parser.add_argument(
'--stream',default=
"*",help=
"stream to lookup files in")
65 parser.add_argument(
'--fexReadoutFilter',action=
'store_true',help=
"If specified, will skip events without fexReadout")
66 parser.add_argument(
'--dbOverrides',default=
None,nargs=
"+",type=str,help=
"specify overrides of COOL database folders in form <folder>=<dbPath>, example: /TRIGGER/L1Calo/V1/Calibration/EfexEnergyCalib=mytest.db ")
67 parser.add_argument(
'--postConfig',default=[],nargs=
"+",type=str,help=
"specify component properties to apply at the end of the config")
68 args = flags.fillFromArgs(parser=parser)
69 if args.runNumber
is not None:
71 if args.lumiBlock
is None: args.lumiBlock=
"*"
72 print(
"Looking up files in atlastier0 for run",args.runNumber,
"lb =",args.lumiBlock)
73 flags.Input.Files = []
74 for lb
in args.lumiBlock.split(
","):
76 tryStr = f
"/eos/atlas/atlastier0/rucio/data*/{args.stream}/*{args.runNumber}/*RAW/*lb*.*"
78 tryStr = f
"/eos/atlas/atlastier0/rucio/data*/{args.stream}/*{args.runNumber}/*RAW/*lb{int(lb):04}.*"
79 print(
"Trying",tryStr)
80 flags.Input.Files += glob(tryStr)
81 print(
"Found",len(flags.Input.Files),
"files")
84 if not partition.isValid()
and len(flags.Input.Files)==0:
85 print(
"FATAL: Running in offline mode but no input files provided")
87 elif partition.isValid():
88 print(
"Running Online with Partition:",partition.name())
91 if len(flags.Input.Files)>0:
92 flags.DQ.Environment =
"user"
94 if flags.Input.isMC: flags.Trigger.triggerConfig=
'FILE'
95 elif flags.Trigger.triggerConfig==
'INFILE':
97 flags.Trigger.triggerConfig=
"DB"
100 if flags.GeoModel.AtlasVersion
is None:
101 from AthenaConfiguration.TestDefaults
import defaultGeometryTags
102 flags.GeoModel.AtlasVersion = defaultGeometryTags.autoconfigure(flags)
106 from AthenaConfiguration.DetectorConfigFlags
import setupDetectorsFromList
109 from AthenaConfiguration.MainServicesConfig
import MainServicesCfg
114 if flags.Exec.MaxEvents == 0: flags.dump(evaluate=
True)
116 if partition.isValid()
and len(flags.Input.Files)==0:
117 from ByteStreamEmonSvc.EmonByteStreamConfig
import EmonByteStreamCfg
119 bsSvc = cfg.getService(
"ByteStreamInputSvc")
120 bsSvc.Partition = partition.name()
121 bsSvc.Key = os.environ.get(
"L1CALO_PTIO_KEY",
"REB" if partition.name()==
"L1CaloStandalone" else "dcm")
122 if partition.name()==
"L1CaloSTF": bsSvc.Key =
"SWROD"
123 bsSvc.KeyCount =
int(os.environ.get(
"L1CALO_PTIO_KEY_COUNT",
"25"))
124 bsSvc.ISServer =
"Histogramming"
125 bsSvc.BufferSize = 10
126 bsSvc.UpdatePeriod = 30
127 bsSvc.Timeout = 240000
128 bsSvc.PublishName = os.getenv(
"L1CALO_ATHENA_JOB_NAME",
"testing")
129 bsSvc.StreamType = os.getenv(
"L1CALO_PTIO_STREAM_TYPE",
"physics")
130 bsSvc.ExitOnPartitionShutdown =
False
131 bsSvc.ClearHistograms =
True
132 bsSvc.GroupName =
"RecExOnline"
134 bsSvc.StreamNames = os.getenv(
"L1CALO_PTIO_STREAM_NAME",
"L1Calo:Main:MinBias:MinBiasOverlay:UPC:EnhancedBias:ZeroBias:HardProbes:Standby:ALFACalib").
split(
":")
135 bsSvc.StreamLogic = os.getenv(
"L1CALO_PTIO_STREAM_LOGIC",
"Or")
if partition.name() !=
"L1CaloStandalone" else "Ignore"
137 bsSvc.LVL1Logic =
"Ignore"
138 elif flags.Input.Format == Format.POOL:
139 from AthenaPoolCnvSvc.PoolReadConfig
import PoolReadCfg
142 print(
"Running Offline on", len(flags.Input.Files),
" bytestream files")
145 from TriggerJobOpts.TriggerByteStreamConfig
import ByteStreamReadCfg
149 from AthenaMonitoring.AthMonitorCfgHelper
import getDQTHistSvc
153 from TrigConfigSvc.TrigConfigSvcCfg
import L1ConfigSvcCfg,generateL1Menu, createL1PrescalesFileFromMenu,getL1MenuFileName
158 if flags.Trigger.triggerConfig==
"FILE":
160 if os.path.exists(menuFilename):
161 print(
"Using L1Menu:",menuFilename)
163 print(
"L1Menu file does not exist:",menuFilename)
172 if partition.isValid()
or (flags.Input.Format != Format.POOL
and not flags.Input.isMC):
173 from L1CaloFEXByteStream.L1CaloFEXByteStreamConfig
import eFexByteStreamToolCfg, jFexRoiByteStreamToolCfg, jFexInputByteStreamToolCfg, gFexByteStreamToolCfg, gFexInputByteStreamToolCfg
174 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))]
175 if flags.Trigger.L1.dojFex: decoderTools += [cfg.popToolsAndMerge(
jFexRoiByteStreamToolCfg(flags=flags,name=
"jFexBSDecoderTool",writeBS=
False))]
176 if flags.Trigger.L1.dogFex: decoderTools += [cfg.popToolsAndMerge(
gFexByteStreamToolCfg(flags=flags,name=
"gFexBSDecoderTool",writeBS=
False))]
180 if flags.Trigger.L1.doCaloInputs:
181 if flags.Trigger.L1.dojFex: decoderTools += [cfg.popToolsAndMerge(
jFexInputByteStreamToolCfg(flags=flags,name=
'jFexInputBSDecoderTool',writeBS=
False))]
182 if flags.Trigger.L1.dogFex: decoderTools += [cfg.popToolsAndMerge(
gFexInputByteStreamToolCfg(flags=flags,name=
'gFexInputBSDecoderTool',writeBS=
False))]
184 if len(decoderTools) > 0:
185 from TrigT1ResultByteStream.TrigT1ResultByteStreamMonitoringConfig
import L1TriggerByteStreamDecoderMonitoringCfg
186 cfg.addEventAlgo(CompFactory.L1TriggerByteStreamDecoderAlg(
187 name=
"L1TriggerByteStreamDecoder",
188 OutputLevel=Constants.ERROR,
189 DecoderTools=decoderTools,
190 ByteStreamMetadataRHKey =
'',
191 MaybeMissingROBs= [id
for tool
in decoderTools
for id
in tool.ROBIDs ]
if partition.name()!=
"ATLAS" or not partition.isValid()
else [],
193 ),sequenceName=
'AthAlgSeq'
202 if flags.Trigger.L1.doeFex
or flags.Trigger.L1.dojFex
or flags.Trigger.L1.dogFex
or flags.Trigger.L1.doCaloInputs:
203 from L1CaloFEXSim.L1CaloFEXSimCfg
import L1CaloFEXSimCfg
204 cfg.merge(
L1CaloFEXSimCfg(flags,outputSuffix=
"DAODSim" if flags.Input.Format == Format.POOL
else ""))
219 if flags.DQ.doMonitoring:
220 if flags.Trigger.L1.doeFex:
221 from TrigT1CaloMonitoring.EfexMonitorAlgorithm
import EfexMonitoringConfig
223 EfexMonAlg = cfg.getEventAlgo(
'EfexMonAlg')
225 EfexMonAlg.eFexEMTobKeyList = [
'L1_eEMRoI',
'L1_eEMxRoI']
226 EfexMonAlg.eFexTauTobKeyList = [
'L1_eTauRoI',
'L1_eTauxRoI']
228 for l
in [EfexMonAlg.eFexEMTobKeyList,EfexMonAlg.eFexTauTobKeyList]: l += [x +
"Sim" for x
in l ]
230 if not flags.Input.isMC:
231 from TrigT1CaloMonitoring.EfexSimMonitorAlgorithm
import EfexSimMonitoringConfig
235 from TrigT1CaloMonitoring.EfexMonitorAlgorithm
import EfexMonitoringHistConfig
238 if flags.Trigger.L1.dojFex:
239 from TrigT1CaloMonitoring.JfexMonitorAlgorithm
import JfexMonitoringConfig
241 from TrigT1CaloMonitoring.JfexSimMonitorAlgorithm
import JfexSimMonitoringConfig
243 if flags.Trigger.L1.dogFex:
244 from TrigT1CaloMonitoring.GfexMonitorAlgorithm
import GfexMonitoringConfig
246 from TrigT1CaloMonitoring.GfexSimMonitorAlgorithm
import GfexSimMonitoringConfig
250 if flags.DQ.useTrigger:
251 from TrigT1CaloMonitoring.JetEfficiencyMonitorAlgorithm
import JetEfficiencyMonitoringConfig
255 if flags.Trigger.L1.doCaloInputs
and not flags.Input.isMC:
256 from TrigT1CaloMonitoring.EfexInputMonitorAlgorithm
import EfexInputMonitoringConfig
258 from TrigT1CaloMonitoring.JfexInputMonitorAlgorithm
import JfexInputMonitoringConfig
260 from TrigT1CaloMonitoring.GfexInputMonitorAlgorithm
import GfexInputMonitoringConfig
263 mainSeq =
"AthAllAlgSeq"
264 if args.fexReadoutFilter:
266 topSeq = cfg.getSequence(
"AthAlgEvtSeq")
267 algSeq = cfg.getSequence(mainSeq)
268 mainSeq =
"New" + mainSeq
270 topSeq.Members = [topSeq.Members[0],CompFactory.AthSequencer(mainSeq),topSeq.Members[-1]]
271 cfg.addEventAlgo(CompFactory.L1IDFilterAlgorithm(),sequenceName=mainSeq)
272 cfg.getSequence(mainSeq).Members += [algSeq]
274 if args.evtNumber
is not None:
275 print(
"filtering events",args.evtNumber)
277 topSeq = cfg.getSequence(
"AthAlgEvtSeq")
278 algSeq = cfg.getSequence(mainSeq)
279 mainSeq =
"New" + mainSeq
281 topSeq.Members = [topSeq.Members[0],CompFactory.AthSequencer(mainSeq),topSeq.Members[-1]]
282 cfg.addEventAlgo(CompFactory.EventNumberFilterAlgorithm(
"EvtNumberFilter",EventNumbers=args.evtNumber),sequenceName=mainSeq)
283 cfg.getSequence(mainSeq).Members += [algSeq]
286 from PerfMonComps.PerfMonCompsConfig
import PerfMonMTSvcCfg
289 from AthenaConfiguration.Utils
import setupLoggingLevels
292 if cfg.getService(
"AthenaEventLoopMgr"): cfg.getService(
"AthenaEventLoopMgr").IntervalInSeconds = 30
294 if type(args.dbOverrides)==list:
295 from IOVDbSvc.IOVDbSvcConfig
import addOverride
299 for override
in args.dbOverrides:
301 folderName,dbPath = override.split(
"=",1)
302 if folderName ==
"":
raise ValueError(
"Cannot parse dbOverride: " + override)
303 if ";dbname=" not in dbPath: dbPath +=
";dbname=CONDBR2"
304 dbPath,dbInst = dbPath.split(
";dbname=")
305 if not os.path.exists(dbPath):
raise ValueError(
"dbOverride file doesn't exist: " + dbPath)
306 if folderName[0] !=
"/": folderName =
"/TRIGGER/L1Calo/V1/Calibration/" + folderName
307 print(
"Overriding COOL folder:",folderName,dbPath,dbInst)
308 cfg.merge(
addOverride(flags,folder=folderName,db=f
"sqlite://;schema={dbPath};dbname={dbInst}",tag=
""))
312 if flags.Output.AODFileName !=
"":
314 auxType = edmType.replace(
'Container',
'AuxContainer')
315 return [f
'{edmType}#{edmName}', f
'{auxType}#{edmName}Aux.']
318 outputEDM +=
addEDM(
'xAOD::jFexTowerContainer' ,
"L1_jFexDataTowers")
319 outputEDM +=
addEDM(
'xAOD::jFexTowerContainer' ,
"L1_jFexEmulatedTowers")
320 outputEDM +=
addEDM(
'xAOD::jFexSRJetRoIContainer',
'L1_jFexSRJetRoISim')
321 outputEDM +=
addEDM(
'xAOD::jFexLRJetRoIContainer',
'L1_jFexLRJetRoISim')
322 outputEDM +=
addEDM(
'xAOD::jFexTauRoIContainer' ,
'L1_jFexTauRoISim' )
323 outputEDM +=
addEDM(
'xAOD::jFexFwdElRoIContainer',
'L1_jFexFwdElRoISim')
324 outputEDM +=
addEDM(
'xAOD::jFexSumETRoIContainer',
'L1_jFexSumETRoISim')
325 outputEDM +=
addEDM(
'xAOD::jFexMETRoIContainer' ,
'L1_jFexMETRoISim' )
326 outputEDM +=
addEDM(
'xAOD::jFexSRJetRoIContainer',
'L1_jFexSRJetRoI')
327 outputEDM +=
addEDM(
'xAOD::jFexLRJetRoIContainer',
'L1_jFexLRJetRoI')
328 outputEDM +=
addEDM(
'xAOD::jFexTauRoIContainer' ,
'L1_jFexTauRoI' )
329 outputEDM +=
addEDM(
'xAOD::jFexFwdElRoIContainer',
'L1_jFexFwdElRoI')
330 outputEDM +=
addEDM(
'xAOD::jFexSumETRoIContainer',
'L1_jFexSumETRoI')
331 outputEDM +=
addEDM(
'xAOD::jFexMETRoIContainer' ,
'L1_jFexMETRoI' )
333 outputEDM +=
addEDM(
'xAOD::jFexSRJetRoIContainer',
'L1_jFexSRJetxRoI')
334 outputEDM +=
addEDM(
'xAOD::jFexLRJetRoIContainer',
'L1_jFexLRJetxRoI')
335 outputEDM +=
addEDM(
'xAOD::jFexTauRoIContainer' ,
'L1_jFexTauxRoI' )
336 outputEDM +=
addEDM(
'xAOD::jFexFwdElRoIContainer',
'L1_jFexFwdElxRoI')
337 outputEDM +=
addEDM(
'xAOD::jFexSumETRoIContainer',
'L1_jFexSumETxRoI')
338 outputEDM +=
addEDM(
'xAOD::jFexMETRoIContainer' ,
'L1_jFexMETxRoI' )
339 from OutputStreamAthenaPool.OutputStreamConfig
import OutputStreamCfg
341 from xAODMetaDataCnv.InfileMetaDataConfig
import SetupMetaDataForStreamCfg
347 for conf
in args.postConfig:
348 compName,propNameAndVal=conf.split(
".",1)
349 propName,propVal=propNameAndVal.split(
"=",1)
351 for comp
in [c
for c
in cfg._allComponents()]+cfg.getServices():
352 if comp.name==compName:
354 exec(f
"comp.{propNameAndVal}")
357 raise ValueError(f
"postConfig {conf} had no effect ... typo?")
361 if flags.Exec.MaxEvents==0: cfg.printConfig()
362 print(
"Configured Services:",*[svc.name
for svc
in cfg.getServices()])
369 if cfg.getService(
"StoreGateSvc").Dump:
370 cfg.getService(
"StoreGateSvc").OutputLevel=3
373 if flags.Exec.MaxEvents==0:
375 from TrigT1CaloMonitoring.LVL1CaloMonitoringConfig
import L1CaloMonitorCfgHelper
376 L1CaloMonitorCfgHelper.printHanConfig()
379 if cfg.run().isFailure():