3from typing
import Any, cast
4from AthenaCommon.Logging
import logging
5from AthenaConfiguration.ComponentFactory
import CompFactory
6from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
7from AthenaConfiguration.AccumulatorCache
import AccumulatorCache
8from TrigConfStorage.TriggerCrestUtil
import TriggerCrestUtil
10from functools
import cache
13log = logging.getLogger(
'TrigConfigSvcCfg')
19 return l1menu_generated._hasRun
20 except AttributeError:
21 l1menu_generated._hasRun =
True
26 if flags.Trigger.useCrest:
33 trigConf = TriggerCrestUtil.getTrigConfKeys(runNumber, lumiBlock, server=crestServer)
34 log.info(
"Extracted the following info for run %d and lumi block %d from CREST: %r",
35 runNumber, lumiBlock, trigConf)
36 for key, value
in trigConf.items():
38 msg: str = f
"Did not find {key} for run {runNumber} and lumi block {lumiBlock}"
40 raise RuntimeError(msg)
45 from TrigConfStorage.TriggerCoolUtil
import TriggerCoolUtil
46 trigConf = TriggerCoolUtil.getTrigConfKeys(runNumber, lumiBlock)
47 log.info(
"Extracted the following info for run %d and lumi block %d from COOL: %r",
48 runNumber, lumiBlock, trigConf)
49 for key, value
in trigConf.items():
51 msg: str = f
"Did not find {key} for run {runNumber} and lumi block {lumiBlock}"
53 raise RuntimeError(msg)
57 crestServer: str |
None = flags.Trigger.crestServer
if flags.Trigger.useCrest
else None
62 """Retrieve Run-2 trigger configuration from the DB and save as Run3 .JSON files
63 returns the trigger DB keys used, or None if the L1 menu has already been generated
68 log.error(
"L1 menu has already been generated")
71 log.info(
"Configuring Run-1&2 to Run-3 configuration metadata conversion")
72 if crestServer
is not None:
76 triggerDBKeys[
'DB'] =
'TRIGGERDB' if run > 230000
else 'TRIGGERDB_RUN1'
78 cmd =
"TrigConfReadWrite -i {DB} {SMK},{LVL1PSK},{HLTPSK},{BGSK} -o r3json > Run3ConfigFetchJSONFiles.log".format(**triggerDBKeys)
79 log.info(
"Running command '%s'", cmd)
80 filesFetchStatus = subprocess.run(cmd, shell=
True)
81 assert filesFetchStatus.returncode == 0,
"TrigConfReadWrite failed to fetch JSON files"
89 run: int = flags.Input.RunNumbers[0]
if flags.Input.RunNumbers
else -1
90 lb: int = flags.Input.LumiBlockNumbers[0]
if flags.Input.LumiBlockNumbers
else 0
92 useCrest=flags.Trigger.useCrest, crestServer=flags.Trigger.crestServer)
96 log.info(
"Parsing trigger configuration from flag Trigger.triggerConfig='%s' for run=%d and lb=%d",
97 triggerConfig, run, lb)
98 log.info(
"Crest usage flags are: Trigger.useCrest=%s, Trigger.crestServer=%s", useCrest, crestServer)
101 source, dbconn, keys = (triggerConfig+
":::").
split(
":")[:3]
102 smk,l1psk,hltpsk,bgsk = (keys+
",,,").
split(
",")[:4]
104 smk, l1psk, hltpsk, bgsk = (int(k)
if k!=
"" else None for k
in (smk, l1psk, hltpsk, bgsk))
105 source: str = source.upper()
109 msg: str =
"Run number is required to extract trigger conditions"
111 raise RuntimeError(msg)
118 dbconn = cast(str, trigConf[
"DB"])
120 if dbconn
in [
"TRIGGERDB_RUN3",
"TRIGGERDBDEV1_I8",
"TRIGGERDBDEV1",
"TRIGGERDBDEV2"]:
122 smk = trigConf[
"SMK"]
124 l1psk = trigConf[
'LVL1PSK']
126 hltpsk = trigConf[
'HLTPSK']
128 bgsk = trigConf[
'BGSK']
132 crestConn = TriggerCrestUtil.getCrestConnection(dbconn)
133 if crestConn
is None:
134 msg: str = f
"Could not find CREST triggerdb connection from DB connection alias '{dbconn}'"
136 raise RuntimeError(msg)
137 dbconn = f
"{crestServer}/{crestConn}"
151 return "/TRIGGER/LVL1/Lvl1ConfigKey <tag>HEAD</tag>"
155 return "/TRIGGER/HLT/PrescaleKey <tag>HEAD</tag>"
159 """Do JSON menu conversion for Run-1&2 data"""
160 return flags.Input.Files
and flags.Trigger.EDMVersion
in [1, 2]
and not flags.Input.isMC
164 """Return base name for menu files"""
166 from PyUtils.Helpers
import release_metadata
167 return '_'+flags.Trigger.triggerMenuSetup+
'_'+release_metadata()[
'release']
197 return 'HLTJobOptions.json'
201 from TriggerMenuMT.L1.Base.PrescaleHelper
import getCutFromPrescale
204 with open(menuFN,
'r')
as fh:
206 pso = {
'filetype':
'l1prescale',
207 'name': data[
'name'],
209 ps = pso[
'cutValues']
210 for name
in sorted(data[
'items'].keys()):
211 ps = prescales[name]
if prescales
and name
in prescales
else 1
212 pso[
'cutValues'][name] = {
213 'cut': getCutFromPrescale(ps),
215 'info': f
'prescale: {ps}'
219 with open(psFN,
'w')
as outfile:
220 json.dump(pso, outfile, indent = 4)
221 log.info(
"Generated default L1 prescale set %s", outfile.name)
226 log.error(
"L1 menu has already been generated")
229 log.info(
"Generating L1 menu %s", flags.Trigger.triggerMenuSetup)
230 from TriggerMenuMT.L1.L1MenuConfig
import L1MenuConfig
231 l1cfg = L1MenuConfig(flags)
239 log.info(
"Setting up LVL1ConfigSvc" )
240 acc = ComponentAccumulator()
245 l1ConfigSvc = CompFactory.getComp(
"TrigConf::LVL1ConfigSvc")(
"LVL1ConfigSvc")
247 if cfg[
"SOURCE"] ==
"FILE":
251 lb = flags.Input.LumiBlockNumbers[0], flags=flags)
252 l1ConfigSvc.SMK = dbKeys[
'SMK']
254 l1ConfigSvc.InputType =
"FILE"
257 log.info(
"Configured LVL1ConfigSvc with InputType='FILE', L1JsonFileName=%s (and HLT, used to compute SMK:%s) ", l1ConfigSvc.L1JsonFileName, l1ConfigSvc.HLTJsonFileName )
258 elif cfg[
"SOURCE"] ==
"DB":
259 l1ConfigSvc.InputType =
"DB"
260 l1ConfigSvc.L1JsonFileName =
""
261 l1ConfigSvc.HLTJsonFileName =
""
262 l1ConfigSvc.TriggerDB = cfg[
"DBCONN"]
263 l1ConfigSvc.SMK = cfg[
"SMK"]
264 log.info(
"Configured LVL1ConfigSvc with InputType='DB', TriggerDB='%s' and SMK %d", l1ConfigSvc.TriggerDB, cfg[
'SMK'] )
266 acc.addService( l1ConfigSvc, create=
True )
272 log.info(
"Setting up HLTConfigSvc" )
273 acc = ComponentAccumulator()
276 hltConfigSvc = CompFactory.getComp(
"TrigConf::HLTConfigSvc")(
"HLTConfigSvc")
278 if cfg[
"SOURCE"] ==
"FILE":
282 lb = flags.Input.LumiBlockNumbers[0], flags=flags)
283 hltConfigSvc.SMK = dbKeys[
'SMK']
285 hltConfigSvc.InputType =
"FILE"
289 log.info(
"Configured HLTConfigSvc with InputType='FILE', HLTJsonFileName=%s and MonitoringJsonFileName=%s (and L1, used to compute MC-SMK:%s)",
290 hltConfigSvc.HLTJsonFileName, hltConfigSvc.MonitoringJsonFileName, hltConfigSvc.L1JsonFileName)
291 elif cfg[
"SOURCE"] ==
"DB":
292 hltConfigSvc.InputType =
"DB"
293 hltConfigSvc.L1JsonFileName =
""
294 hltConfigSvc.HLTJsonFileName =
""
295 hltConfigSvc.MonitoringJsonFileName =
""
296 hltConfigSvc.TriggerDB = cfg[
"DBCONN"]
297 hltConfigSvc.SMK = cfg[
"SMK"]
298 log.info(
"Configured HLTConfigSvc with InputType='DB', TriggerDB='%s' and SMK %d", hltConfigSvc.TriggerDB, cfg[
'SMK'])
299 acc.addService( hltConfigSvc, create=
True )
303def TrigConfigSvcCfg( flags ):
304 acc = ComponentAccumulator()
314 log.info(
"Setting up L1PrescaleCondAlg")
315 acc = ComponentAccumulator()
316 TrigConf__L1PrescaleCondAlg = CompFactory.getComp(
"TrigConf::L1PrescaleCondAlg")
317 l1PrescaleCondAlg = TrigConf__L1PrescaleCondAlg(
"L1PrescaleCondAlg")
320 l1PrescaleCondAlg.Source = tc[
"SOURCE"]
321 if flags.Common.isOnline:
322 from IOVDbSvc.IOVDbSvcConfig
import addFolders
325 if tc[
"SOURCE"] ==
"COOL":
326 l1PrescaleCondAlg.TriggerDB = tc[
"DBCONN"]
327 elif tc[
"SOURCE"] ==
"DB":
328 l1PrescaleCondAlg.TriggerDB = tc[
"DBCONN"]
329 l1PrescaleCondAlg.L1Psk = tc[
"LVL1PSK"]
330 log.info(
"Configured L1PrescaleCondAlg with InputType='DB', TriggerDB='%s' and L1Psk %d",
331 l1PrescaleCondAlg.TriggerDB, l1PrescaleCondAlg.L1Psk)
332 elif tc[
"SOURCE"] ==
"FILE":
337 lb = flags.Input.LumiBlockNumbers[0], flags=flags)
338 l1PrescaleCondAlg.L1Psk = dbKeys[
'LVL1PSK']
340 raise RuntimeError(
"trigger configuration flag 'trigConfig' starts with %s, which is not understood" % tc[
"SOURCE"])
341 acc.addCondAlgo(l1PrescaleCondAlg)
346 log.info(
"Setting up BunchGroupCondAlg")
347 acc = ComponentAccumulator()
348 TrigConf__BunchGroupCondAlg = CompFactory.getComp(
"TrigConf::BunchGroupCondAlg")
349 bunchGroupCondAlg = TrigConf__BunchGroupCondAlg(
"TrigConf__BunchGroupCondAlg")
352 bunchGroupCondAlg.Source = tc[
"SOURCE"]
353 if tc[
"SOURCE"] ==
"COOL":
354 bunchGroupCondAlg.TriggerDB = tc[
"DBCONN"]
355 elif tc[
"SOURCE"] ==
"DB":
356 bunchGroupCondAlg.TriggerDB = tc[
"DBCONN"]
357 bunchGroupCondAlg.BGSK = tc[
"BGSK"]
358 log.info(
"Configured BunchGroupCondAlg with InputType='DB', TriggerDB='%s' and BGSK %d",
359 bunchGroupCondAlg.TriggerDB, bunchGroupCondAlg.BGSK)
360 elif tc[
"SOURCE"] ==
"FILE":
365 lb = flags.Input.LumiBlockNumbers[0], flags=flags)
366 bunchGroupCondAlg.BGSK = dbKeys[
'BGSK']
368 raise RuntimeError(
"trigger configuration flag 'trigConfig' starts with %s, which is not understood" % tc[
"SOURCE"])
369 acc.addCondAlgo(bunchGroupCondAlg)
374 log.info(
"Setting up HLTPrescaleCondAlg")
375 acc = ComponentAccumulator()
376 hltPrescaleCondAlg = CompFactory.getComp(
"TrigConf::HLTPrescaleCondAlg")(
"HLTPrescaleCondAlg")
379 hltPrescaleCondAlg.Source = tc[
"SOURCE"]
380 if flags.Common.isOnline
or tc[
"SOURCE"]==
"COOL":
381 from IOVDbSvc.IOVDbSvcConfig
import addFolders
383 className =
"AthenaAttributeList",
384 extensible = flags.Trigger.Online.isPartition))
386 if tc[
"SOURCE"] ==
"COOL":
387 hltPrescaleCondAlg.TriggerDB = tc[
"DBCONN"]
388 elif tc[
"SOURCE"] ==
"DB":
389 hltPrescaleCondAlg.TriggerDB = tc[
"DBCONN"]
390 hltPrescaleCondAlg.HLTPsk = tc[
"HLTPSK"]
391 log.info(
"Configured HLTPrescaleCondAlg with InputType='DB', TriggerDB='%s' and HLTPsk %d",
392 hltPrescaleCondAlg.TriggerDB, hltPrescaleCondAlg.HLTPsk)
393 elif tc[
"SOURCE"] ==
"FILE":
398 lb = flags.Input.LumiBlockNumbers[0], flags=flags)
399 hltPrescaleCondAlg.HLTPsk = dbKeys[
'HLTPSK']
401 raise RuntimeError(
"trigger configuration flag 'trigConfig' starts with %s, which is not understood" % tc[
"SOURCE"])
402 acc.addCondAlgo(hltPrescaleCondAlg)
406if __name__ ==
"__main__":
413 l1menu_generated._hasRun =
False
416 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
417 flags = initConfigFlags()
418 flags.Trigger.EDMVersion = 3
419 from AthenaConfiguration.TestDefaults
import defaultTestFiles
420 flags.Input.Files = defaultTestFiles.RAW_RUN2
422 TrigConfigSvcCfg( flags )
425 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
426 flags = initConfigFlags()
427 from AthenaConfiguration.TestDefaults
import defaultTestFiles
428 flags.Input.Files = defaultTestFiles.RAW_RUN2
430 TrigConfigSvcCfg( flags )
434 assert keys
is not None,
"No keys returned"
435 for k,v
in {
"SMK" : 2749,
"LVL1PSK" : 23557,
"HLTPSK" : 17824,
"BGSK" : 2181}.items():
436 assert k
in keys,
"Missing key {}".format(k)
437 assert v == keys[k],
"Wrong value {}".format(v)
439 unittest.main(verbosity=2)
std::vector< std::string > split(const std::string &s, const std::string &t=":")
dict[str, int|str] _createJsonMenuFiles(run, lb, str|None crestServer=None)
getTrigConfigFromFlag(flags)
L1PrescaleCondAlgCfg(flags)
getHLTMenuFileName(flags)
getHLTPrescaleFolderName()
BunchGroupCondAlgCfg(flags)
getHLTMonitoringFileName(flags)
getL1PrescaleFolderName()
dict[str, Any] _getTrigConfigFromFlag(*, triggerConfig, run, lb, useCrest, crestServer)
HLTPrescaleCondAlgCfg(flags)
getL1PrescalesSetFileName(flags)
createL1PrescalesFileFromMenu(flags, dict[str, float]|None prescales=None)
dict[str, int|str] getTrigConfFromCool(runNumber, lumiBlock)
getBunchGroupSetFileName(flags)
getHLTPrescalesSetFileName(flags)
getHLTJobOptionsFileName()
dict[str, int|str] getTrigConfFromConditions(runNumber, lumiBlock, flags)
createJsonMenuFiles(run, lb, flags)
dict[str, int|str] getTrigConfFromCrest(runNumber, lumiBlock, crestServer)