3 from typing
import Any, cast
4 from AthenaCommon.Logging
import logging
5 from AthenaConfiguration.ComponentFactory
import CompFactory
6 from AthenaConfiguration.ComponentAccumulator
import ComponentAccumulator
7 from AthenaConfiguration.AccumulatorCache
import AccumulatorCache
8 from TrigConfStorage.TriggerCrestUtil
import TriggerCrestUtil
10 from functools
import cache
13 log = 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"
88 flags.dump(
"Input", evaluate=
True)
90 run: int = flags.Input.RunNumbers[0]
if flags.Input.RunNumbers
else -1
91 lb: int = flags.Input.LumiBlockNumbers[0]
if flags.Input.LumiBlockNumbers
else 0
93 useCrest=flags.Trigger.useCrest, crestServer=flags.Trigger.crestServer)
97 log.info(
"Parsing trigger configuration from flag Trigger.triggerConfig='%s' for run=%d and lb=%d",
98 triggerConfig, run, lb)
99 log.info(
"Crest usage flags are: Trigger.useCrest=%s, Trigger.crestServer=%s", useCrest, crestServer)
102 source, dbconn, keys = (triggerConfig+
":::").
split(
":")[:3]
103 smk,l1psk,hltpsk,bgsk = (keys+
",,,").
split(
",")[:4]
105 smk, l1psk, hltpsk, bgsk = (
int(k)
if k!=
"" else None for k
in (smk, l1psk, hltpsk, bgsk))
106 source: str = source.upper()
110 msg: str =
"Run number is required to extract trigger conditions"
112 raise RuntimeError(msg)
119 dbconn = cast(str, trigConf[
"DB"])
121 if dbconn
in [
"TRIGGERDB_RUN3",
"TRIGGERDBDEV1_I8",
"TRIGGERDBDEV1",
"TRIGGERDBDEV2"]:
123 smk = trigConf[
"SMK"]
125 l1psk = trigConf[
'LVL1PSK']
127 hltpsk = trigConf[
'HLTPSK']
129 bgsk = trigConf[
'BGSK']
133 crestConn = TriggerCrestUtil.getCrestConnection(dbconn)
134 if crestConn
is None:
135 msg: str = f
"Could not find CREST triggerdb connection from DB connection alias '{dbconn}'"
137 raise RuntimeError(msg)
138 dbconn = f
"{crestServer}/{crestConn}"
152 return "/TRIGGER/LVL1/Lvl1ConfigKey <tag>HEAD</tag>"
156 return "/TRIGGER/HLT/PrescaleKey <tag>HEAD</tag>"
160 """Do JSON menu conversion for Run-1&2 data"""
161 return flags.Input.Files
and flags.Trigger.EDMVersion
in [1, 2]
and not flags.Input.isMC
165 """Return base name for menu files"""
167 from PyUtils.Helpers
import release_metadata
198 return 'HLTJobOptions.json'
202 from TriggerMenuMT.L1.Base.PrescaleHelper
import getCutFromPrescale
205 with open(menuFN,
'r')
as fh:
207 pso = {
'filetype':
'l1prescale',
208 'name': data[
'name'],
210 ps = pso[
'cutValues']
212 ps = prescales[name]
if prescales
and name
in prescales
else 1
213 pso[
'cutValues'][name] = {
216 'info': f
'prescale: {ps}'
220 with open(psFN,
'w')
as outfile:
221 json.dump(pso, outfile, indent = 4)
222 log.info(
"Generated default L1 prescale set %s", outfile.name)
227 log.error(
"L1 menu has already been generated")
230 log.info(
"Generating L1 menu %s", flags.Trigger.triggerMenuSetup)
231 from TriggerMenuMT.L1.L1MenuConfig
import L1MenuConfig
232 l1cfg = L1MenuConfig(flags)
240 log.info(
"Setting up LVL1ConfigSvc" )
246 l1ConfigSvc = CompFactory.getComp(
"TrigConf::LVL1ConfigSvc")(
"LVL1ConfigSvc")
248 if cfg[
"SOURCE"] ==
"FILE":
252 lb = flags.Input.LumiBlockNumbers[0], flags=flags)
253 l1ConfigSvc.SMK = dbKeys[
'SMK']
255 l1ConfigSvc.InputType =
"FILE"
258 log.info(
"Configured LVL1ConfigSvc with InputType='FILE', L1JsonFileName=%s (and HLT, used to compute SMK:%s) ", l1ConfigSvc.L1JsonFileName, l1ConfigSvc.HLTJsonFileName )
259 elif cfg[
"SOURCE"] ==
"DB":
260 l1ConfigSvc.InputType =
"DB"
261 l1ConfigSvc.L1JsonFileName =
""
262 l1ConfigSvc.HLTJsonFileName =
""
263 l1ConfigSvc.TriggerDB = cfg[
"DBCONN"]
264 l1ConfigSvc.SMK = cfg[
"SMK"]
265 log.info(
"Configured LVL1ConfigSvc with InputType='DB', TriggerDB='%s' and SMK %d", l1ConfigSvc.TriggerDB, cfg[
'SMK'] )
267 acc.addService( l1ConfigSvc, create=
True )
273 log.info(
"Setting up HLTConfigSvc" )
277 hltConfigSvc = CompFactory.getComp(
"TrigConf::HLTConfigSvc")(
"HLTConfigSvc")
279 if cfg[
"SOURCE"] ==
"FILE":
283 lb = flags.Input.LumiBlockNumbers[0], flags=flags)
284 hltConfigSvc.SMK = dbKeys[
'SMK']
286 hltConfigSvc.InputType =
"FILE"
290 log.info(
"Configured HLTConfigSvc with InputType='FILE', HLTJsonFileName=%s and MonitoringJsonFileName=%s (and L1, used to compute MC-SMK:%s)",
291 hltConfigSvc.HLTJsonFileName, hltConfigSvc.MonitoringJsonFileName, hltConfigSvc.L1JsonFileName)
292 elif cfg[
"SOURCE"] ==
"DB":
293 hltConfigSvc.InputType =
"DB"
294 hltConfigSvc.L1JsonFileName =
""
295 hltConfigSvc.HLTJsonFileName =
""
296 hltConfigSvc.MonitoringJsonFileName =
""
297 hltConfigSvc.TriggerDB = cfg[
"DBCONN"]
298 hltConfigSvc.SMK = cfg[
"SMK"]
299 log.info(
"Configured HLTConfigSvc with InputType='DB', TriggerDB='%s' and SMK %d", hltConfigSvc.TriggerDB, cfg[
'SMK'])
300 acc.addService( hltConfigSvc, create=
True )
315 log.info(
"Setting up L1PrescaleCondAlg")
317 TrigConf__L1PrescaleCondAlg = CompFactory.getComp(
"TrigConf::L1PrescaleCondAlg")
318 l1PrescaleCondAlg = TrigConf__L1PrescaleCondAlg(
"L1PrescaleCondAlg")
321 l1PrescaleCondAlg.Source = tc[
"SOURCE"]
322 if flags.Common.isOnline:
323 from IOVDbSvc.IOVDbSvcConfig
import addFolders
326 if tc[
"SOURCE"] ==
"COOL":
327 l1PrescaleCondAlg.TriggerDB = tc[
"DBCONN"]
328 elif tc[
"SOURCE"] ==
"DB":
329 l1PrescaleCondAlg.TriggerDB = tc[
"DBCONN"]
330 l1PrescaleCondAlg.L1Psk = tc[
"LVL1PSK"]
331 log.info(
"Configured L1PrescaleCondAlg with InputType='DB', TriggerDB='%s' and L1Psk %d",
332 l1PrescaleCondAlg.TriggerDB, l1PrescaleCondAlg.L1Psk)
333 elif tc[
"SOURCE"] ==
"FILE":
338 lb = flags.Input.LumiBlockNumbers[0], flags=flags)
339 l1PrescaleCondAlg.L1Psk = dbKeys[
'LVL1PSK']
341 raise RuntimeError(
"trigger configuration flag 'trigConfig' starts with %s, which is not understood" % tc[
"SOURCE"])
342 acc.addCondAlgo(l1PrescaleCondAlg)
347 log.info(
"Setting up BunchGroupCondAlg")
349 TrigConf__BunchGroupCondAlg = CompFactory.getComp(
"TrigConf::BunchGroupCondAlg")
350 bunchGroupCondAlg = TrigConf__BunchGroupCondAlg(
"TrigConf__BunchGroupCondAlg")
353 bunchGroupCondAlg.Source = tc[
"SOURCE"]
354 if tc[
"SOURCE"] ==
"COOL":
355 bunchGroupCondAlg.TriggerDB = tc[
"DBCONN"]
356 elif tc[
"SOURCE"] ==
"DB":
357 bunchGroupCondAlg.TriggerDB = tc[
"DBCONN"]
358 bunchGroupCondAlg.BGSK = tc[
"BGSK"]
359 log.info(
"Configured BunchGroupCondAlg with InputType='DB', TriggerDB='%s' and BGSK %d",
360 bunchGroupCondAlg.TriggerDB, bunchGroupCondAlg.BGSK)
361 elif tc[
"SOURCE"] ==
"FILE":
366 lb = flags.Input.LumiBlockNumbers[0], flags=flags)
367 bunchGroupCondAlg.BGSK = dbKeys[
'BGSK']
369 raise RuntimeError(
"trigger configuration flag 'trigConfig' starts with %s, which is not understood" % tc[
"SOURCE"])
370 acc.addCondAlgo(bunchGroupCondAlg)
375 log.info(
"Setting up HLTPrescaleCondAlg")
377 hltPrescaleCondAlg = CompFactory.getComp(
"TrigConf::HLTPrescaleCondAlg")(
"HLTPrescaleCondAlg")
380 hltPrescaleCondAlg.Source = tc[
"SOURCE"]
381 if flags.Common.isOnline
or tc[
"SOURCE"]==
"COOL":
382 from IOVDbSvc.IOVDbSvcConfig
import addFolders
384 className =
"AthenaAttributeList",
385 extensible = flags.Trigger.Online.isPartition))
387 if tc[
"SOURCE"] ==
"COOL":
388 hltPrescaleCondAlg.TriggerDB = tc[
"DBCONN"]
389 elif tc[
"SOURCE"] ==
"DB":
390 hltPrescaleCondAlg.TriggerDB = tc[
"DBCONN"]
391 hltPrescaleCondAlg.HLTPsk = tc[
"HLTPSK"]
392 log.info(
"Configured HLTPrescaleCondAlg with InputType='DB', TriggerDB='%s' and HLTPsk %d",
393 hltPrescaleCondAlg.TriggerDB, hltPrescaleCondAlg.HLTPsk)
394 elif tc[
"SOURCE"] ==
"FILE":
399 lb = flags.Input.LumiBlockNumbers[0], flags=flags)
400 hltPrescaleCondAlg.HLTPsk = dbKeys[
'HLTPSK']
402 raise RuntimeError(
"trigger configuration flag 'trigConfig' starts with %s, which is not understood" % tc[
"SOURCE"])
403 acc.addCondAlgo(hltPrescaleCondAlg)
407 if __name__ ==
"__main__":
414 l1menu_generated._hasRun =
False
417 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
419 flags.Trigger.EDMVersion = 3
420 from AthenaConfiguration.TestDefaults
import defaultTestFiles
421 flags.Input.Files = defaultTestFiles.RAW_RUN2
426 from AthenaConfiguration.AllConfigFlags
import initConfigFlags
428 from AthenaConfiguration.TestDefaults
import defaultTestFiles
429 flags.Input.Files = defaultTestFiles.RAW_RUN2
435 assert keys
is not None,
"No keys returned"
436 for k,v
in {
"SMK" : 2749,
"LVL1PSK" : 23557,
"HLTPSK" : 17824,
"BGSK" : 2181}.
items():
437 assert k
in keys,
"Missing key {}".
format(k)
438 assert v == keys[k],
"Wrong value {}".
format(v)
440 unittest.main(verbosity=2)