ATLAS Offline Software
TriggerCoolUtil.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
2 
3 import sys
4 from re import match
5 from time import ctime
6 
7 from PyCool import cool
8 from CoolConvUtilities.AtlCoolLib import indirectOpen
9 
10 def iterate_runlist(runlist):
11  """Helper to iterate through runlist. The format is:
12  runlist: [[run1,run2], [run3,run4], ... ]
13  In addition each "run" can be a tuple of format (run,LB)
14  """
15  def makeRunLumi(rl):
16  """Create (Run,Lumi) tuple"""
17  return rl if isinstance(rl,tuple) else (rl,0)
18 
19  for (a,b) in runlist:
20  (r1,l1) = makeRunLumi(a)
21  (r2,l2) = makeRunLumi(b)
22 
23  limmin = (r1 << 32) + l1
24  if isinstance(b,tuple):
25  limmax = (r2 << 32) + l2
26  else:
27  limmax = ((r2+1) << 32) - 1 # full run
28 
29  yield (limmin, limmax)
30 
31 
33 
34  @staticmethod
35  def GetConnection(dbconn,verbosity=0):
36  connection = None
37  m = match(r".*?([^/.]+)\.db",dbconn)
38  if dbconn in ["CONDBR2","COMP200","OFLP200"]:
39  connection = f'COOLONL_TRIGGER/{dbconn}'
40  elif m:
41  dbname=m.group(1).upper()
42  connection = "sqlite://;schema=%s;dbname=%s;" % (dbconn,dbname)
43  else:
44  raise RuntimeError ("Can't connect to COOL db %s" % dbconn)
45  try:
46  openConn = indirectOpen(connection,readOnly=True,debug=(verbosity>0))
47  except Exception:
48  import traceback
49  traceback.print_exc()
50  sys.exit(-1)
51  return openConn
52 
53  @staticmethod
54  def getHLTConfigKeys(db,runlist):
55  configKeys = {}
56  f = db.getFolder( "/TRIGGER/HLT/HltConfigKeys" )
57  for (limmin,limmax) in iterate_runlist(runlist):
58  objs = f.browseObjects( limmin, limmax, cool.ChannelSelection(0))
59  while objs.goToNext():
60  obj=objs.currentRef()
61  runNr = obj.since()>>32
62  if runNr>1e9: continue # test runs in COOL
63  payload=obj.payload()
64  smk = payload['MasterConfigurationKey']
65  hltpsk = payload['HltPrescaleConfigurationKey']
66  # Format for ConfigSource (see ATR-21550):
67  # Run-2: TRIGGERDBR2R,21.1.24,AthenaP1
68  # Run-3: TRIGGERDB_RUN3;22.0.101;Athena,22.0.101 --extra_args ...
69  release = 'unknown'
70  if runNr>379000:
71  confsrc = payload['ConfigSource'].split(';')
72  if len(confsrc)>2: release = confsrc[2].split()[0]
73  else:
74  confsrc = payload['ConfigSource'].split(',', maxsplit=1)
75  if len(confsrc)>1: release = confsrc[1]
76 
77  dbalias = confsrc[0]
78  configKeys[runNr] = { "REL" : release,
79  "SMK" : smk,
80  "HLTPSK" : hltpsk,
81  "DB" : dbalias }
82  return configKeys
83 
84  @staticmethod
85  def _getKeys(db, runlist, folder, in_name, out_name):
86  """Helper to retrieve run/LB-index configuration keys"""
87  lbmask = 0xFFFFFFFF
88  configKeys = {}
89  f = db.getFolder( folder )
90  for (limmin,limmax) in iterate_runlist(runlist):
91  objs = f.browseObjects( limmin, limmax, cool.ChannelSelection(0))
92  while objs.goToNext():
93  obj=objs.currentRef()
94  runNr = obj.since()>>32
95  if runNr>1e9: continue # test runs in COOL
96  payload = obj.payload()
97  key = payload[in_name]
98  firstLB = obj.since() & lbmask
99  until = (obj.until() & lbmask)
100  lastLB = until-1 if until>0 else lbmask
101  configKeys.setdefault(runNr,{}).setdefault( out_name, [] ).append((key,firstLB,lastLB))
102 
103  return configKeys
104 
105  @staticmethod
106  def getHLTPrescaleKeys(db,runlist):
107  return TriggerCoolUtil._getKeys(db, runlist, "/TRIGGER/HLT/PrescaleKey",
108  "HltPrescaleKey", "HLTPSK2")
109 
110  @staticmethod
111  def getL1ConfigKeys(db,runlist):
112  return TriggerCoolUtil._getKeys(db, runlist, "/TRIGGER/LVL1/Lvl1ConfigKey",
113  "Lvl1PrescaleConfigurationKey", "LVL1PSK")
114 
115  @staticmethod
116  def getBunchGroupKey(db,runlist):
117  return TriggerCoolUtil._getKeys(db, runlist, "/TRIGGER/LVL1/BunchGroupKey",
118  "Lvl1BunchGroupConfigurationKey", "BGKey")
119 
120  @staticmethod
121  def getRunStartTime(db,runlist, runs):
122  latestRunNr=0
123  startTime = {}
124  f = db.getFolder( "/TRIGGER/LUMI/LBLB" )
125  for rr in runlist:
126  limmin=(rr[0] << 32)+0
127  limmax=((rr[1]+1) << 32)+0
128  objs = f.browseObjects( limmin, limmax, cool.ChannelSelection(0) )
129  while objs.goToNext():
130  obj=objs.currentRef()
131  runNr = obj.since()>>32
132  if runNr==latestRunNr: continue
133  latestRunNr=runNr
134  if runNr not in runs: continue
135  payload=obj.payload()
136  starttime = payload['StartTime']
137  startTime[runNr] = { "STARTTIME" : ctime(starttime/1E9).replace(' ','_') }
138  return startTime
139 
140 
141  @staticmethod
142  def printL1Menu(db, run, verbosity):
143  limmin=run<<32
144  limmax=(run+1)<<32
145 
146  printPrescales = verbosity>0
147  printDisabled = verbosity>1
148  print ("LVL1 Menu:")
149  f = db.getFolder( "/TRIGGER/LVL1/Menu" )
150  chansel=cool.ChannelSelection.all()
151  objs = f.browseObjects( limmin,limmax,chansel)
152  fps = db.getFolder( "/TRIGGER/LVL1/Prescales" )
153  objsps = fps.browseObjects( limmin,limmax,chansel)
154  itemName = {}
155  itemPrescale = {}
156  longestName = 0
157  while objs.goToNext():
158  obj=objs.currentRef()
159  channel = obj.channelId()
160  payload=obj.payload()
161  itemname = payload['ItemName']
162  itemName[channel] = itemname
163  longestName=max(longestName,len(itemname))
164  while objsps.goToNext():
165  objps=objsps.currentRef()
166  channel = objps.channelId()
167  payloadps=objps.payload()
168  ps = payloadps['Lvl1Prescale']
169  if channel in itemPrescale:
170  itemPrescale[channel] += [ ps ]
171  else:
172  itemPrescale[channel] = [ ps ]
173  for channel in itemName:
174  doPrint = False
175  for x in itemPrescale[channel]:
176  if x>0 or printDisabled: doPrint = True
177  if not doPrint: continue
178  if printPrescales:
179  print ("%4i: %-*s PS " % (channel, longestName, itemName[channel]), itemPrescale[channel])
180  else:
181  print ("%4i: %s" % (channel, itemName[channel]))
182 
183 
184  @staticmethod
185  def printHLTMenu(db, run, verbosity, printL2=True, printEF=True):
186  limmin=run<<32
187  limmax=((run+1)<<32)-1
188  print ("HLT Menu:")
189  f = db.getFolder( "/TRIGGER/HLT/Menu" )
190  chansel=cool.ChannelSelection.all()
191  objs = f.browseObjects( limmin,limmax,chansel)
192  sizeName=0
193  sizePS=0
194  sizePT=0
195  sizeStr=0
196  sizeLow=0
197  chainNames = {}
198  chainExtraInfo = {}
199  while objs.goToNext():
200  obj=objs.currentRef()
201  payload=obj.payload()
202  level = payload['TriggerLevel']
203  if level=='L2' and not printL2: continue
204  if level=='EF' and not printEF: continue
205  name = payload['ChainName']
206  sizeName=max(sizeName,len(name))
207  counter = payload['ChainCounter']
208  chainNames[(level,counter)] = name
209  if verbosity>0:
210  version = payload['ChainVersion']
211  prescale = payload['Prescale']
212  passthr = payload['PassThrough']
213  stream = payload['StreamInfo']
214  lower = payload['LowerChainName']
215  sizePS=max(sizePS,prescale)
216  sizePT=max(sizePT,passthr)
217  sizeStr=max(sizeStr,len(stream))
218  sizeLow=max(sizeLow,len(lower))
219  chainExtraInfo[(name,level)] = (version, prescale, passthr, stream, lower)
220  sizePS = len("%i"%sizePS)
221  sizePT = len("%i"%sizePT)
222  counters = chainNames.keys()
223  counters.sort()
224  for c in counters:
225  name = chainNames[c]
226  print ("%s %4i: %-*s" % (c[0], c[1], sizeName, name),)
227  if verbosity>0:
228  (version, prescale, passthr, stream, lower) = chainExtraInfo[(name,c[0])]
229  print ("[V %1s, PS %*i, PT %*i, by %-*s , => %-*s ]" %
230  (version, sizePS, prescale, sizePT, passthr, sizeLow, lower, sizeStr, stream), end='')
231  print()
232 
233  @staticmethod
234  def printStreams(db, run, verbosity):
235  limmin=run<<32
236  limmax=((run+1)<<32)-1
237  print ("Used Streams:")
238  f = db.getFolder( "/TRIGGER/HLT/Menu" )
239  chansel=cool.ChannelSelection.all()
240  objs = f.browseObjects( limmin,limmax,chansel)
241  streams = set()
242  while objs.goToNext():
243  obj=objs.currentRef()
244  payload=obj.payload()
245  streamsOfChain = payload['StreamInfo']
246  for streamprescale in streamsOfChain.split(';'):
247  streamname = streamprescale.split(',')[0]
248  streams.add(streamname)
249  for s in sorted(list(streams)):
250  print (s)
251 
252 
253 # Testing
254 if __name__ == "__main__":
255  from pprint import pprint
256 
257  db = TriggerCoolUtil.GetConnection('CONDBR2')
258  run2 = 363947 # Run-2
259  run3 = 435333 # Run-3
260 
261  for run in [run2, run3]:
262  print("\nFull run:")
263  pprint(TriggerCoolUtil.getHLTConfigKeys(db, [[run,run]]))
264  pprint(TriggerCoolUtil.getHLTPrescaleKeys(db, [[run,run]]))
265  pprint(TriggerCoolUtil.getL1ConfigKeys(db, [[run,run]]))
266  pprint(TriggerCoolUtil.getBunchGroupKey(db, [[run,run]]))
267 
268  # Detailed tests for Run-3:
269  print("\nLB range within run:")
270  pprint(TriggerCoolUtil.getHLTPrescaleKeys(db, [[(run3,266),(run3,400)]]))
271 
272  print("\nRun range:")
273  pprint(TriggerCoolUtil.getHLTPrescaleKeys(db, [[run3,435349]]))
274 
275  print("\nMultiple run ranges:")
276  pprint(TriggerCoolUtil.getHLTPrescaleKeys(db, [[run3,435349],[435831,435927]]))
277 
278  print("\nMultiple run/LB ranges:")
279  pprint(TriggerCoolUtil.getHLTPrescaleKeys(db, [[(run3,266),(435349,10)],
280  [(435831,466),435927]]))
replace
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition: hcg.cxx:307
python.TriggerCoolUtil.TriggerCoolUtil.getL1ConfigKeys
def getL1ConfigKeys(db, runlist)
Definition: TriggerCoolUtil.py:111
python.TriggerCoolUtil.TriggerCoolUtil.getHLTConfigKeys
def getHLTConfigKeys(db, runlist)
Definition: TriggerCoolUtil.py:54
max
#define max(a, b)
Definition: cfImp.cxx:41
python.TriggerCoolUtil.TriggerCoolUtil._getKeys
def _getKeys(db, runlist, folder, in_name, out_name)
Definition: TriggerCoolUtil.py:85
python.TriggerCoolUtil.TriggerCoolUtil.getBunchGroupKey
def getBunchGroupKey(db, runlist)
Definition: TriggerCoolUtil.py:116
python.TriggerCoolUtil.TriggerCoolUtil.printStreams
def printStreams(db, run, verbosity)
Definition: TriggerCoolUtil.py:234
python.TriggerCoolUtil.TriggerCoolUtil.GetConnection
def GetConnection(dbconn, verbosity=0)
Definition: TriggerCoolUtil.py:35
python.TriggerCoolUtil.iterate_runlist
def iterate_runlist(runlist)
Definition: TriggerCoolUtil.py:10
upper
int upper(int c)
Definition: LArBadChannelParser.cxx:49
dumpHVPathFromNtuple.append
bool append
Definition: dumpHVPathFromNtuple.py:91
python.TriggerCoolUtil.TriggerCoolUtil
Definition: TriggerCoolUtil.py:32
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
python.TriggerCoolUtil.TriggerCoolUtil.getHLTPrescaleKeys
def getHLTPrescaleKeys(db, runlist)
Definition: TriggerCoolUtil.py:106
DerivationFramework::TriggerMatchingUtils::sorted
std::vector< typename T::value_type > sorted(T begin, T end)
Helper function to create a sorted vector from an unsorted one.
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:224
python.TriggerCoolUtil.TriggerCoolUtil.printHLTMenu
def printHLTMenu(db, run, verbosity, printL2=True, printEF=True)
Definition: TriggerCoolUtil.py:185
Muon::print
std::string print(const MuPatSegment &)
Definition: MuonTrackSteering.cxx:28
python.TriggerCoolUtil.TriggerCoolUtil.getRunStartTime
def getRunStartTime(db, runlist, runs)
Definition: TriggerCoolUtil.py:121
python.TriggerCoolUtil.TriggerCoolUtil.printL1Menu
def printL1Menu(db, run, verbosity)
Definition: TriggerCoolUtil.py:142
python.AtlCoolLib.indirectOpen
def indirectOpen(coolstr, readOnly=True, debug=False)
Definition: AtlCoolLib.py:130
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
match
bool match(std::string s1, std::string s2)
match the individual directories of two strings
Definition: hcg.cxx:356