ATLAS Offline Software
AthHLT.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
2 #
3 # Utilities used in athenaHLT.py
4 #
5 from typing import Any
6 from AthenaCommon.Logging import logging
7 log = logging.getLogger('athenaHLT')
8 
9 from functools import cache
10 import os
11 import sys
12 
13 class CondDB:
14  _run2 = 236108
15  def __init__(self, run):
16  self.run = run
17  def db_instance(self):
18  if self.run>=self._run2:
19  return 'CONDBR2'
20  else:
21  return 'COMP200'
22  def sor_folder(self):
23  if self.run>=self._run2:
24  return '/TDAQ/RunCtrl/SOR'
25  else:
26  return '/TDAQ/RunCtrl/SOR_Params'
27 
28 @cache
29 def get_sor_params(run_number) -> dict[str, Any] | None:
30  from CoolConvUtilities import AtlCoolLib
31 
32  log.info('Reading SOR record for run %s from COOL', run_number)
33 
34  cdb = CondDB(run_number)
35  dbcon = AtlCoolLib.readOpen('COOLONL_TDAQ/%s' % cdb.db_instance())
36  folder = dbcon.getFolder(cdb.sor_folder()) # type: ignore
37 
38  # need to keep sor variable while using payload (cannot do the following in
39  # one single line nor overwrite sor). Otherwise: 1) GC comes into play;
40  # 2) the object is deleted; 3) since it's a shared_ptr, the internal
41  # cool::IObject also gets deleted; 4) payload is not valid any longer
42  try:
43  sor = folder.findObject(run_number << 32, 0)
44  except Exception:
45  return None # This can happen for unknown run numbers
46 
47  payload = sor.payload()
48  d = {k: payload[k] for k in payload}
49  return d
50 
51 @cache
52 def get_eor_params_crest(run_number, crest_server:str) -> dict[str, Any] | None:
53  from TrigConfStorage.TriggerCrestUtil import TriggerCrestUtil
54  log.info('Reading EOR record for run %s from Crest', run_number)
55  return TriggerCrestUtil.getEORParams(run_number, server=crest_server)
56 
57 @cache
58 def get_trigconf_keys(run_number, lb_number):
59  """Read Trigger keys from COOL"""
60 
61  from TrigConfStorage.TriggerCoolUtil import TriggerCoolUtil
62 
63  cdb = CondDB(run_number)
64  db = TriggerCoolUtil.GetConnection(cdb.db_instance())
65  run_range = [[run_number,run_number]]
66  d = {}
67  d['SMK'] = TriggerCoolUtil.getHLTConfigKeys(db, run_range)[run_number]['SMK']
68 
69  def findKey(keys):
70  for (key, firstLB, lastLB) in keys:
71  if lb_number>=firstLB and lb_number<=lastLB:
72  return key
73  return None
74 
75  # Find L1/HLT prescale key
76  d['LVL1PSK'] = findKey(TriggerCoolUtil.getL1ConfigKeys(db, run_range)[run_number]['LVL1PSK'])
77  d['HLTPSK'] = findKey(TriggerCoolUtil.getHLTPrescaleKeys(db, run_range)[run_number]['HLTPSK2'])
78 
79  return d
80 
81 @cache
82 def get_trigconf_keys_crest(run_number, lb_number, crest_server):
83  """Read Trigger keys from CREST"""
84  from TrigConfStorage.TriggerCrestUtil import TriggerCrestUtil
85 
86  def _find_lb(config: list[dict[str, Any]], lb:int) -> int:
87  ret_key: int = -1
88  for c in config:
89  if c['since_lb'] > lb:
90  break
91  ret_key = c['key']
92  if ret_key == -1:
93  raise RuntimeError(f"LB {lb} not found in list of config keys {config}")
94  return ret_key
95 
96  log.info("Using CREST server %s", crest_server)
97  api = TriggerCrestUtil.getCrestApi(server=crest_server)
98  cfgkeysinfo = TriggerCrestUtil.getHLTConfigKeys(run_number, api=api)
99 
100  return {
101  'SMK': cfgkeysinfo['SMK'],
102  'LVL1PSK': _find_lb(TriggerCrestUtil.getL1ConfigKeys(run_number, api=api), lb=lb_number),
103  'HLTPSK': _find_lb(TriggerCrestUtil.getHLTPrescaleKeys(run_number, api=api), lb=lb_number),
104  'LVL1BGK': _find_lb(TriggerCrestUtil.getBunchGroupKey(run_number, api=api),lb=lb_number),
105  'DBAlias': cfgkeysinfo['DB']
106  }
107 
108 def getCACfg(jopath):
109  """Return the CA Cfg function based on joboptions path.
110  The format is MODULE[.FNC]. If no FNC is given, 'main' will be tried."""
111 
112  import importlib
113 
114  sys.path.append('.') # temporarily add local directory to search path
115 
116  # try to import module as given:
117  try:
118  module = importlib.import_module(jopath)
119  except ModuleNotFoundError:
120  if '.' not in jopath:
121  raise
122  # or interpret as module.fnc:
123  mod_name, fnc_name = jopath.rsplit('.', maxsplit=1)
124  module = importlib.import_module(mod_name)
125  else:
126  # if the first import worked we are using the 'main(flags)' function:
127  fnc_name = 'main'
128 
129  sys.path.pop()
130 
131  log.info("Loading %s.%s", module.__name__, fnc_name)
132  return getattr(module, fnc_name)
133 
134 
135 def reload_from_json(filename, suppress_args=[]):
136  """Re-launch athenaHLT from the given json file. Optionally suppress
137  the list of command line args (e.g. flags)."""
138 
139  # Remove all command line args that are not compatible with running from JSON:
140  argv = []
141  for arg_index, arg in enumerate(sys.argv):
142  if arg == '--dump-config-reload':
143  continue
144  if arg in ['--precommand', '-c', '--postcommand', '-C']:
145  continue
146  if arg_index > 0 and sys.argv[arg_index-1] in ['--precommand', '-c', '--postcommand', '-C']:
147  continue
148  if arg.startswith('--precommand') or arg.startswith('--postcommand'):
149  continue
150  if arg in suppress_args:
151  continue
152  argv.append(arg)
153 
154  argv[-1] = filename
155  log.info('Restarting %s from %s ...', argv[0], argv[-1])
156  sys.stdout.flush()
157  sys.stderr.flush()
158  os.execvp(argv[0], argv)
159 
160 
161 #
162 # Testing (used as ctest)
163 #
164 if __name__=='__main__':
165  # Can be used as script, e.g.: python -m TrigCommon.AthHLT 327265
166  if len(sys.argv)>1:
167  log.info('SOR parameters: %s', get_sor_params(int(sys.argv[1])))
168  sys.exit(0)
169 
170  # Unit testing case:
171  d = get_sor_params(327265) # Run-2
172  assert(d is not None)
173  if d is not None:
174  print(d)
175  assert(d['DetectorMask']=='0000000000000000c10069fffffffff7')
176 
177  d = get_eor_params_crest(327265, "https://crest.cern.ch/api-v5.0") # Run-2
178  assert(d is not None)
179  if d is not None:
180  print(d)
181  assert(d['DetectorMask']=='0000000000000000c10069fffffffff7')
182 
183  d = get_sor_params(216416) # Run-1
184  assert(d is not None)
185  if d is not None:
186  print(d)
187  assert(d['DetectorMask']==281474976710647)
188 
189  # Config keys
190  d = get_trigconf_keys(360026, 1)
191  print(d)
192  assert(d['SMK']==2749)
193  assert(d['LVL1PSK']==15186)
194  assert(d['HLTPSK']==17719)
195 
196  # Config keys crest
197  d = get_trigconf_keys_crest(360026, 1, "https://crest.cern.ch/api-v5.0")
198  print(d)
199  assert(d['SMK']==2749)
200  assert(d['LVL1PSK']==15186)
201  assert(d['HLTPSK']==17719)
202 
203  d = get_trigconf_keys(360026, 100)
204  print(d)
205  assert(d['SMK']==2749)
206  assert(d['LVL1PSK']==23504)
207  assert(d['HLTPSK']==17792)
python.AthHLT.CondDB.__init__
def __init__(self, run)
Definition: AthHLT.py:15
python.AthHLT.CondDB.run
run
Definition: AthHLT.py:16
python.AthHLT.reload_from_json
def reload_from_json(filename, suppress_args=[])
Definition: AthHLT.py:135
python.AthHLT.get_trigconf_keys_crest
def get_trigconf_keys_crest(run_number, lb_number, crest_server)
Definition: AthHLT.py:82
python.AthHLT.get_sor_params
dict[str, Any]|None get_sor_params(run_number)
Definition: AthHLT.py:29
python.AthHLT.get_trigconf_keys
def get_trigconf_keys(run_number, lb_number)
Definition: AthHLT.py:58
python.AthHLT.get_eor_params_crest
dict[str, Any]|None get_eor_params_crest(run_number, str crest_server)
Definition: AthHLT.py:52
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:26
python.AthHLT.getCACfg
def getCACfg(jopath)
Definition: AthHLT.py:108
python.AthHLT.CondDB
Definition: AthHLT.py:13
python.AthHLT.CondDB.sor_folder
def sor_folder(self)
Definition: AthHLT.py:22
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
python.AthHLT.CondDB.db_instance
def db_instance(self)
Definition: AthHLT.py:17
python.AthHLT.CondDB._run2
int _run2
Definition: AthHLT.py:14