ATLAS Offline Software
Loading...
Searching...
No Matches
AtlRunQuerySelectorTrigger.py
Go to the documentation of this file.
1# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
2
3
4"""Provides Trigger related selectors:
5
6TriggerSelector Trigger menu from TriggerDB
7TrigKeySelector SMK
8BGSKeySelector BGK
9L1TrigKeySelector L1PSK
10HLTTrigKeySelector HLTPSK
11RatesSelector L1 rates from COOL
12
13"""
14
15import re,sys
16
17from time import time
18from collections import defaultdict
19
20from PyCool import cool
21
22from CoolRunQuery.selector.AtlRunQuerySelectorBase import Selector, RunLBBasedCondition
23from CoolRunQuery.utils.AtlRunQueryUtils import coolDbConn, GetRanges
24
25
26class TrigKeySelector(RunLBBasedCondition):
27 def __init__(self, name):
28 self.showRelease = False
29 self.showTrigKeys = False
30 self.smkCutRange = None
31 self.relCutRange = None
32 self.trigkeys = None
33 self.release = None
34 super(TrigKeySelector,self).__init__(name=name,
35 dbfolderkey='COOLONL_TRIGGER::/TRIGGER/HLT/HltConfigKeys',
36 channelKeys = [(0,'SMK','MasterConfigurationKey'),
37 (0,'Release','ConfigSource')])
38 self.applySelection = False
39
40 def setSelectSMK(self,smks):
41 self.trigkeys = smks
42 if self.trigkeys:
43 self.smkCutRange = GetRanges(self.trigkeys)
44 self.applySelection = True
45
46 def setSelectRelease(self,release):
47 self.release = release
48 if self.release:
49 self.relCutRange = GetRanges(','.join(self.release), intRepFnc=self.relStringToInt)
50 self.applySelection = True
51
52 def setShow(self, what):
53 if what == 'smk':
54 super(TrigKeySelector,self).setShowOutput('SMK')
55 self.showTrigKeys = True
56 if what == 'release':
57 super(TrigKeySelector,self).setShowOutput('Release')
58 self.showRelease = True
59
60 def relStringToInt(self, r):
61 major, minor, sub, patch = ([int(x) for x in r.split('.')] + [0,0,0,0])[0:4]
62 if sub<10:
63 sub*=10
64 return 1000000*major+10000*minor+100*sub+patch
65
66 def __str__(self):
67 if self.applySelection:
68 if self.trigkeys and self.release:
69 return 'SELOUT Checking if SMK matches "%s" and release matches "%s"' % (self.trigkeys,self.release)
70 elif self.trigkeys:
71 return 'SELOUT Checking if SMK matches "%s"' % self.trigkeys
72 else:
73 return 'SELOUT Checking if release matches "%s"' % (self.release)
74 else:
75 if self.showTrigKeys and self.showRelease:
76 return "Retrieving SMK and release version"
77 elif self.showTrigKeys:
78 return "Retrieving SMK"
79 else:
80 return "Retrieving release version"
81
82 def passes(self,values,key):
83 if self.smkCutRange:
84 smkPass = False
85 try:
86 val = int(values)
87 except ValueError:
88 self.selDataMissing = True
89 smkPass = True
90 else:
91 for cr in self.smkCutRange:
92 if val>=cr[0] and val<=cr[1]:
93 smkPass= True
94 if not smkPass:
95 return False
96 if self.relCutRange:
97 relPass = False
98 val = values[1]
99 if val=='n.a.':
100 self.selDataMissing = True
101 relPass = True
102 else:
103 val = val.split(',')
104 if len(val)>1:
105 val = self.relStringToInt(val[1])
106 for cr in self.relCutRange:
107 if val>=cr[0] and val<=cr[1]:
108 relPass= True
109 else:
110 self.selDataMissing = True
111 relPass = True
112 if not relPass:
113 return False
114 return True
115
116 def prettyValue(self, value, key):
117 if key=='Release' and value!="n.a." and ',' in value:
118 return value.split(',')[1]
119 return value
120
121 def valueForStorage(self, condData, key):
122 if key=='Release' and ';' in condData:
123 [db,rel,relfull] = condData.split(';')
124 return {"db" : db, "release" : rel, "releaseFullName" : relfull}
125 elif key == 'SMK':
126 try:
127 smk = int(condData)
128 except ValueError:
129 smk = 0
130 return {"value": smk}
131
132 def runAfterQuery(self,runlist):
133
134 from CoolRunQuery.utils.AtlRunQueryTriggerUtils import getSmkNames, getRandom, triggerDBAlias
135
136 smksByLHCRun = {
137 1: set(),
138 2: set(),
139 3: defaultdict(set)
140 }
141 smkNamesByLHCRun = {}
142
143 for run in runlist:
144 try:
145 smk = int(run.result['SMK'])
146 except (ValueError, KeyError):
147 continue
148
149 if run.lhcRun < 3:
150 smksByLHCRun[run.lhcRun].add(smk)
151 else:
152 try:
153 dbAlias = run.data['Release'][0]["db"]
154 except KeyError:
155 smk = run.data['SMK'][0].value
156 dbAlias = "TRIGGERDB_RUN3" if smk>=3000 else "TRIGGERDBDEV1_I8"
157 smksByLHCRun[run.lhcRun][dbAlias].add(smk)
158
159 smkNamesByLHCRun[1] = getSmkNames(smksByLHCRun[1], triggerDBAlias(lhcRun=1))
160 smkNamesByLHCRun[2] = getSmkNames(smksByLHCRun[2], triggerDBAlias(lhcRun=2))
161 smkNamesByLHCRun[3] = {}
162 for dbAlias in smksByLHCRun[3]:
163 smkNamesByLHCRun[3].update( getSmkNames(smksByLHCRun[3][dbAlias], dbAlias) )
164
165 for run in runlist:
166 try:
167 smk = int(run.result['SMK'])
168 except (ValueError, KeyError):
169 continue
170
171 if smk in smkNamesByLHCRun[run.lhcRun]:
172 info = list(smkNamesByLHCRun[run.lhcRun][smk])
173 else:
174 info = ["Name unknown", 0, "no comment"]
175 if info[2]=="" or info[2]=="~":
176 info[2]="no comment"
177 run.stats['SMK'] = {
178 "info": tuple(info),
179 "random": getRandom(smk, run.lhcRun)
180 }
181
182
183class BGSKeySelector(RunLBBasedCondition):
184 def __init__(self, name):
185 self.showBGKeys = False
186 super(BGSKeySelector,self).__init__(name=name,
187 dbfolderkey='COOLONL_TRIGGER::/TRIGGER/LVL1/BunchGroupKey',
188 channelKeys = [(0,'BGS Key','Lvl1BunchGroupConfigurationKey')])
189 def __str__(self):
190 return "Retrieving Bunch group set key"
191
192 def passes(self,values,key):
193 return True
194
195 def prettyValue(self, value, key):
196 if not str.isdigit(value):
197 return None
198 return int(value)
199
200 def runAfterQuery(self,runlist):
201 for k in self.ResultKey():
202 for run in runlist:
203 run.stats[k] = { "blocks" : [], "first" : 0 }
204 entries = run.data[k]
205 if len(entries)==0:
206 continue
207 blocks = []
208 for entry in entries:
209 v = entry.value
210 if len(blocks) > 0 and blocks[-1][0]==v and blocks[-1][2]==entry.startlb:
211 blocks[-1][2] = entry.endlb
212 else:
213 blocks += [ [v, entry.startlb, entry.endlb] ]
214 run.stats[k] = { "blocks" : blocks, "first" : entries[0].value }
215
216
217class L1TrigKeySelector(RunLBBasedCondition):
218 def __init__(self, name):
219 self.showTrigKeys = False
220 super(L1TrigKeySelector,self).__init__(name=name,
221 dbfolderkey='COOLONL_TRIGGER::/TRIGGER/LVL1/Lvl1ConfigKey',
222 channelKeys = [(0,'L1 PSK','Lvl1PrescaleConfigurationKey')])
223
224 def __str__(self):
225 return "Retrieving L1 PSK"
226
227 def passes(self,values,key):
228 return True
229
230 def prettyValue(self, value, key):
231 return int(value) if str.isdigit(value) else None
232
233 def runAfterQuery(self,runlist):
234 for k in self.ResultKey():
235 for run in runlist:
236 run.stats[k] = { "blocks" : [], "first" : 0 }
237 entries = run.data[k]
238 if len(entries)==0:
239 continue
240 blocks = []
241 for entry in entries:
242 v = entry.value
243 if v == "n.a.":
244 v = None
245 if len(blocks) > 0 and blocks[-1][0]==v and blocks[-1][2]==entry.startlb:
246 blocks[-1][2] = entry.endlb
247 else:
248 blocks += [ [v, entry.startlb, entry.endlb] ]
249 run.stats[k] = { "blocks" : blocks, "first" : entries[0].value }
250 HLTTrigKeySelector.combineHltL1Keys(runlist)
251
252
253class HLTTrigKeySelector(RunLBBasedCondition):
254 def __init__(self, name):
255 self.showTrigKeys = False
256 if Selector.condDB() == 'OFLP200':
257 super(HLTTrigKeySelector,self).__init__(name=name,
258 dbfolderkey='COOLONL_TRIGGER::/TRIGGER/HLT/HltConfigKeys',
259 channelKeys = [(0,'HLT PSK','HltPrescaleConfigurationKey')])
260 else:
261 super(HLTTrigKeySelector,self).__init__(name=name,
262 dbfolderkey='COOLONL_TRIGGER::/TRIGGER/HLT/PrescaleKey',
263 channelKeys = [(0,'HLT PSK','HltPrescaleKey')])
264
265 def __str__(self):
266 return "Retrieving HLT PSK"
267
268 def passes(self,values,key):
269 return True
270
271 def prettyValue(self, value, key):
272 if not str.isdigit(value):
273 return None
274 return int(value)
275
276 def runAfterQuery(self,runlist):
277 for k in self.ResultKey():
278 for run in runlist:
279 blocks = []
280 run.stats[k] = {}
281 for entry in run.data[k]:
282 v = entry.value
283 if v == "n.a.":
284 v = None
285 if len(blocks) > 0 and blocks[-1][0]==v and blocks[-1][2]==entry.startlb:
286 blocks[-1][2] = entry.endlb
287 else:
288 blocks += [ [v, entry.startlb, entry.endlb] ]
289 run.stats[k] = { "blocks" : blocks, "first" : run.data[k][0].value }
290
291 HLTTrigKeySelector.combineHltL1Keys(runlist)
292
293 @classmethod
294 def combineHltL1Keys(cls, runlist):
295 from CoolRunQuery.utils.AtlRunQueryTriggerUtils import isTriggerRun2
296 l1keysByDbAlias = defaultdict(set)
297 hltkeysByDbAlias = defaultdict(set)
298
299 l1keysRun1 = set() # to collect run 1 keys
300 hltkeysRun1 = set()
301 l1keysRun2 = set() # to collect run 2 keys
302 hltkeysRun2 = set()
303 for run in runlist:
304 if run.lhcRun == 3:
305 try:
306 dbAlias = run.data['Release'][0]["db"]
307 except KeyError:
308 smk = run.data['SMK'][0].value
309 dbAlias = "TRIGGERDB_RUN3" if smk>=3000 else "TRIGGERDBDEV1_I8"
310 if 'L1 PSK' in run.stats:
311 l1keysByDbAlias[dbAlias].update( [x[0] for x in run.stats['L1 PSK']['blocks']] )
312 if 'HLT PSK' in run.stats:
313 hltkeysByDbAlias[dbAlias].update( [x[0] for x in run.stats['HLT PSK']['blocks']] )
314 elif isTriggerRun2(run_number = run.runNr): # run 2
315 if 'L1 PSK' in run.stats:
316 l1keysRun2.update( [x[0] for x in run.stats['L1 PSK']['blocks']] )
317 if 'HLT PSK' in run.stats:
318 hltkeysRun2.update( [x[0] for x in run.stats['HLT PSK']['blocks']] )
319 else: # run 1
320 if 'L1 PSK' in run.stats:
321 l1keysRun1.update( [x[0] for x in run.stats['L1 PSK']['blocks']] )
322 if 'HLT PSK' in run.stats:
323 hltkeysRun1.update( [x[0] for x in run.stats['HLT PSK']['blocks']] )
324
325 # we need L1 and HLT keys before it makes sense to continue
326 if len(l1keysRun1)+len(l1keysRun2)+len(l1keysByDbAlias) == 0:
327 return
328 if len(hltkeysRun1)+len(hltkeysRun2)+len(hltkeysByDbAlias) == 0:
329 return
330
331 from CoolRunQuery.utils.AtlRunQueryTriggerUtils import getL1PskNames, getHLTPskNames
332 l1namesRun1 = getL1PskNames(l1keysRun1, lhcRun = 1)
333 hltnamesRun1 = getHLTPskNames(hltkeysRun1, lhcRun = 1)
334 l1namesRun2 = getL1PskNames(l1keysRun2, lhcRun = 2)
335 hltnamesRun2 = getHLTPskNames(hltkeysRun2, lhcRun = 2)
336 l1NamesByDbAlias = {}
337 hltNamesByDbAlias = {}
338 for dbAlias in l1keysByDbAlias:
339 l1NamesByDbAlias[dbAlias] = getL1PskNames(l1keysByDbAlias[dbAlias], dbAlias = dbAlias)
340 for dbAlias in hltkeysByDbAlias:
341 hltNamesByDbAlias[dbAlias] = getHLTPskNames(hltkeysByDbAlias[dbAlias], dbAlias = dbAlias)
342
343 for run in runlist:
344 if run.lhcRun == 3:
345 try:
346 dbAlias = run.data['Release'][0]["db"]
347 except KeyError:
348 smk = run.data['SMK'][0].value
349 dbAlias = "TRIGGERDB_RUN3" if smk>=3000 else "TRIGGERDBDEV1_I8"
350 l1names = l1NamesByDbAlias[dbAlias]
351 hltnames = hltNamesByDbAlias[dbAlias]
352 elif isTriggerRun2(run_number = run.runNr): # run 2
353 l1names = l1namesRun2
354 hltnames = hltnamesRun2
355 else:
356 l1names = l1namesRun1
357 hltnames = hltnamesRun1
358 if not ('L1 PSK' in run.stats and 'HLT PSK' in run.stats):
359 continue
360 ic = 0
361 blocks = set()
362 for l1key, l1beg, l1end in run.stats['L1 PSK' ]['blocks']:
363 for hltkey, hltbeg, hltend in run.stats['HLT PSK' ]['blocks']:
364 lbmin = max(ic,min(l1beg,hltbeg))
365 lbmax = min(l1end-1,hltend-1)
366 if lbmin > lbmax or lbmin == 0 or lbmax == 0:
367 continue
368 ic = lbmax + 1
369 # accept if new
370 l1name = l1names[l1key] if l1key else ""
371 hltname = hltnames[hltkey] if hltkey else ""
372 elm = (lbmin, lbmax, l1key, hltkey, l1name, hltname)
373 blocks.update([elm])
374 run.stats['PSK' ] = {'blocks' : sorted(list(blocks)) }
375
376
377class RatesSelector(RunLBBasedCondition):
378 def __init__(self, name, trigger=[]):
379 # trigger can be ["*Electron*", "L1_*"]
380 # rate will be printed for all triggers matching the pattern
381
382 super(RatesSelector,self).__init__(
383 name=name,
384 dbfolderkey='COOLONL_TRIGGER::/TRIGGER/LUMI/LVL1COUNTERS',
385 channelKeys = [(-1,'TriggerRates','TriggerName')]
386 )
387
388 self.trigger=trigger
389 from CoolRunQuery.AtlRunQuerySelectorWorker import SelectorWorker
390 self.trigSel = SelectorWorker.getRetrieveSelector('trigger','TriggerSelector')
391 if len(trigger)>0:
392 self.trigSel.addShowTriggerPattern(','.join(trigger))
393
394 def addPattern(self,pattern):
395 if pattern=="" or pattern=="L1":
396 pattern="L1_EM5,L1_TAU5,L1_XE10,L1_J5,L1_MBTS_4_4,L1_MU6"
397 self.trigSel.addShowTriggerPattern(pattern)
398 self.trigger += pattern.split(',')
399
400
401 def __str__(self):
402 return "Retrieving trigger rates for %r" % ','.join(self.trigger)
403
404 def select(self, runlist):
405 start = time()
406 print (self, end='')
407 sys.stdout.flush()
408
409 fL1R = coolDbConn.GetDBConn(self.schema,db=Selector.condDB()).getFolder(self.folder)
410
411 for r in runlist:
412 menu = r.result['TriggerMenu']
413
414 namelookup = 256*['']
415 channellist = []
416 for tr in menu:
417 if not tr.name.startswith("L1_"):
418 continue
419 ch = tr.counter
420 namelookup[ch] = tr.name
421 channellist.append(ch)
422
423 if len(channellist)>50:
424 r.addResult(self.ResultKey()[0], "Too many L1 triggers requested (%i), maximum is 50" % len(channellist))
425 continue
426
427 if len(channellist)==0:
428 r.addResult(self.ResultKey()[0], "No match")
429 continue
430
431 channellist.sort()
432 ch = channellist[0]
433 chanselL1 = cool.ChannelSelection(ch,ch,cool.ChannelSelection.sinceBeforeChannel)
434 for ch in channellist[1:]:
435 chanselL1.addChannel(ch)
436
437 iovmin=(r.runNr << 32)+0
438 iovmax=((r.runNr+1) << 32)-1
439
440 countsholder = defaultdict(list)
441
442 # the hlt part
443 objs = fL1R.browseObjects( iovmin, iovmax, chanselL1)
444 while objs.goToNext():
445 obj=objs.currentRef()
446 ch = obj.channelId()
447 countsholder[namelookup[ch]].append((obj.since()&0xFFFFFFFF,
448 obj.payloadValue('BeforePrescale'),
449 obj.payloadValue('AfterPrescale'),
450 obj.payloadValue('L1Accept')))
451
452 r.addResult(self.ResultKey()[0], countsholder)
453
454 duration = time() - start
455
457 print (" ==> %i runs found (%.2f sec)" % (len(runlist),duration))
458 else:
459 print (" ==> Done (%g sec)" % duration)
460
461 return runlist
462
463
464class TriggerSelector(RunLBBasedCondition):
465
466 def __init__(self, name, trigger=[]):
467 # trigger can be ["*Electron*", "L1_*"]
468 # will select runs that satiesfy an 'or' of all patterns in the list
469 # a pattern without number are checked for existence
470 # a pattern with number will be checked against the sum of the events in all matching triggers
471 from CoolRunQuery.AtlRunQuerySelectorWorker import SelectorWorker
472 SelectorWorker.getRetrieveSelector('trigkey','TrigKeySelector')
473 SelectorWorker.getRetrieveSelector('l1trigkey','L1TrigKeySelector')
474 SelectorWorker.getRetrieveSelector('hlttrigkey','HLTTrigKeySelector')
475
476 super(TriggerSelector,self).__init__(name=name,
477 dbfolderkey='COOLONL_TRIGGER::/TRIGGER/HLT/Menu',
478 channelKeys = [(-1,'TriggerMenu','ChainName')])
479
480 self.triggers = ' or '.join(trigger)
481 self.applySelection = (len(trigger)>0)
484
485 for s in trigger:
486 s += "$"
487 p = re.compile(s.split()[0].replace(',','|').replace('*','.*').replace('?','.').replace('%','.*'), re.I)
488 self.seltriggerpatterns += [p]
489
490
491 def addShowTriggerPattern(self, triggerpattern):
492 if triggerpattern=="":
493 triggerpattern = "*"
494 self.showtriggerpatterns += triggerpattern.split(',')
495
496 def __str__(self):
497 if self.applySelection:
498 return 'SELOUT Checking if the trigger name matches "%s"' % self.triggers
499 else:
500 return "Retrieving trigger names [%s]" % ','.join(self.showtriggerpatterns)
501
502
503 def getL1Prescales(self, runl1psks):
504 """
505 runl1psks is a dict run -> [l1psk,...]
506 """
507 from CoolRunQuery.utils.AtlRunQueryTriggerUtils import getL1Prescales
508 l1pscache = dict()
509 for run_number, pss in runl1psks.items():
510 for l1psk in pss:
511 l1pscache[(run_number,l1psk)] = getL1Prescales(l1psk,run_number = run_number)
512 return l1pscache
513
514 def getHLTPrescales(self, runhltpsks):
515 """
516 runhltpsks is a dict run -> [hltpsk,...]
517 """
518 from CoolRunQuery.utils.AtlRunQueryTriggerUtils import getHLTPrescales
519 l2pscache = dict()
520 efpscache = dict()
521 for run_number, pss in runhltpsks.items():
522 for psk in pss:
523 l2pscache[(run_number,psk)], efpscache[(run_number,psk)] = getHLTPrescales(psk, run_number = run_number)
524
525 return l2pscache, efpscache
526
527
528 def getMenuFromRun(self, smks):
529 from CoolRunQuery.utils.AtlRunQueryTriggerUtils import getL1Menu, getHLTMenu
530
531 l1menucache = dict()
532 l2menucache = defaultdict(dict)
533 efmenucache = defaultdict(dict)
534
535 # fill the menu and prescale caches
536 for smk in set(smks):
537
538 # the l1 menu
539 l1items = getL1Menu(smk)
540 l1menucache[smk] = l1items
541
542 # the hlt menu
543 l2chains, efchains = getHLTMenu(smk)
544 d2 = l2menucache[smk] = dict([(c.counter,c) for c in l2chains])
545
546 # connect the levels (assign lower counter)
547 for chain in efchains:
548 if chain.lowername=="":
549 continue
550 cc = chain.counter
551 if (cc in d2) and (chain.lowername == d2[cc].name):
552 chain.lower = d2[cc]
553 chain.lowercounter = cc
554 continue
555 for l2ch in l2chains:
556 if chain.lowername == l2ch.name:
557 chain.lower = l2ch
558 chain.lowercounter = l2ch.counter
559 break
560
561 for chain in l2chains:
562 if chain.lowername == "":
563 continue
564 for l1item in l1items:
565 if l1item and chain.lowername == l1item.name:
566 chain.lower = l1item
567 chain.lowercounter = l1item.counter
568 break
569
570 # set display flag
571 for item in l1items + l2chains + efchains:
572 if item:
573 item.forshow = self.matchShowPattern(item.name)
574
575 # set 'selected' flag
576 if self.applySelection:
577 for item in l1items + l2chains + efchains:
578 if item:
579 item.forselect = self.matchSelectPattern(item.name)
580
581 return l1menucache, l2menucache, efmenucache
582
583
584 def select(self, runlist):
585 start = time()
586 # some preparation: compile the show patterns
588 if '*' in self.showtriggerpatterns:
589 self.compiledShowPatterns = ['all']
590 else:
591 for p in self.showtriggerpatterns:
592 p += "$"
593 self.compiledShowPatterns += [re.compile(p.replace('*','.*').replace('?','.').replace('%','.*'),re.I)]
594
595 print (self, end='')
596 sys.stdout.flush()
597 newrunlist = []
598
599 smks = [int(r.result['SMK']) for r in runlist]
600 runl1psks = dict()
601 runhltpsks = dict()
602 for r in runlist:
603 runl1psks[r.runNr] = [l1psk for (l1psk,firstlb,lastlb) in r.stats['L1 PSK']['blocks']]
604 runhltpsks[r.runNr] = [hltpsk for (hltpsk,firstlb,lastlb) in r.stats['HLT PSK']['blocks']]
605
606 l1menucache, l2menucache, efmenucache = self.getMenuFromRun(smks)
607
608 l1pscache = self.getL1Prescales(runl1psks)
609
610 l2pscache, efpscache = self.getHLTPrescales(runhltpsks) # for RUN 2 only efpscache is filled, l2pscache is None
611
612 for run in runlist: # go through old runlist and see
613
614 smk = int(run.result['SMK'])
615 psks = [(x[2],x[3]) for x in run.stats['PSK']['blocks']]
616
617 l1items = [it for it in l1menucache[smk] if it and (it.forshow or it.forselect)]
618 l2chains = [ch for ch in l2menucache[smk].values() if (ch.forshow or ch.forselect) and not ch.multiseeded]
619 efchains = [ch for ch in efmenucache[smk].values() if (ch.forshow or ch.forselect) and not ch.multiseeded and ch.lower and not ch.lower.multiseeded]
620
621 value = defaultdict(list)
622
623 for item in l1items:
624 for l1psk,hltpsk in psks:
625 if not l1psk:
626 value[item].append(None)
627 continue
628 itemps = l1pscache[(run.runNr,l1psk)][item.counter]
629 value[item].append(itemps if itemps>=0 else -1)
630
631 for l2chain in l2chains:
632 for l1psk,hltpsk in psks:
633 if not l1psk or not hltpsk:
634 value[l2chain].append(None)
635 continue
636 chainps,chainpt = l2pscache[(smk,hltpsk)][l2chain.counter]
637 if chainps<0:
638 value[l2chain].append(-1)
639 continue
640 chainps *= l1pscache[(run.runNr,l1psk)][l2chain.lowercounter]
641 value[l2chain].append(chainps if chainps>=0 else -1)
642
643 for efchain in efchains:
644 l2chain = efchain.lower
645 for l1psk,hltpsk in psks:
646 if not l1psk or not hltpsk:
647 value[efchain].append(None)
648 continue
649 chainps,chainpt = efpscache[(smk,hltpsk)][efchain.counter]
650 if chainps<0:
651 value[efchain].append(-1)
652 continue
653 l2chainps,l2chainpt = l2pscache[(smk,hltpsk)][l2chain.counter]
654 chainps *= l2chainps
655 if chainps<0:
656 value[efchain].append(-1)
657 continue
658 chainps *= l1pscache[(run.runNr,l1psk)][l2chain.lowercounter]
659 value[efchain].append(chainps if chainps>=0 else -1)
660
661 # remove all the disabled triggers
662 for tr,pslist in value.items():
663 if not any([ps is None or ps>=0 for ps in pslist]):
664 value.pop(tr)
665
666 if self.applySelection and not self.passes(value):
667 continue
668 newrunlist += [run.runNr]
669
670 run.addResult(self.ResultKey()[0], value)
671
672 runlist = [r for r in runlist if r.runNr in newrunlist]
673
674 duration = time() - start
675
676 if self.applySelection:
677 print (" ==> %i runs found (%.2f sec)" % (len(runlist),duration))
678 else:
679 print (" ==> Done (%g sec)" % duration)
680
681 return runlist
682
683 def matchShowPattern(self,name):
684 if len(self.compiledShowPatterns)==0 or self.compiledShowPatterns[0]=='all':
685 return True
686 else:
687 return any([p.match(name) for p in self.compiledShowPatterns])
688
689
690 def matchSelectPattern(self,name):
691 return any([p.match(name) for p in self.seltriggerpatterns])
692
693 def prettyValue(self, value):
694 form = []
695 for v in value:
696 if len(v)==2:
697 form += ["%s (%s)" % (v[0],','.join(v[1]))]
698 else:
699 form += ["%s (%s|%s)" % v]
700 return ', '.join(form)
701
702
703 def passes(self,triggers):
704 for chain in triggers:
705 if chain.forselect:
706 return True
707 return False
#define min(a, b)
Definition cfImp.cxx:40
#define max(a, b)
Definition cfImp.cxx:41
STL class.
bool add(const std::string &hname, TKey *tobj)
Definition fastadd.cxx:55
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition hcg.cxx:310