4 from PyCool
import cool
5 from copy
import deepcopy
7 from CoolRunQuery.utils.AtlRunQueryUtils
import coolDbConn, MergeRanges, SmartRangeCalulator
8 from CoolRunQuery.utils.AtlRunQueryIOV
import IOVTime, IOVRange
12 from collections
import namedtuple, defaultdict
14 from itertools
import groupby
15 from operator
import itemgetter
18 OOO = namedtuple(
'OOO',
'channel payload iovrange isvf')
20 while coolobjs.goToNext():
21 obj=coolobjs.currentRef()
22 yield OOO(obj.channelId(),obj.payloadValue, IOVRange(obj),
False)
24 ChDesc = namedtuple(
'ChDesc',
'CoolPayloadKey,CoolChannel,ResultKey,Header,SelectShowRetrieve')
36 def __init__(self, x, keytype=UNDEFINED, selecttype = SELECT):
66 if isinstance(other,DataKey):
76 if isinstance(other,DataKey):
128 Selector._conddb =
'OFLP200'
134 return Selector._conddb
135 raise RuntimeError(
"CondDB not yet set")
137 Selector._conddb =
"CONDBR2" if run_number > 236100
else "COMP200"
138 print (
"Determinded %s, based on run number %i" % (Selector._conddb, run_number))
139 return Selector._conddb
143 return Selector.condDB(run_number)==
"CONDBR2"
166 def __init__(self, name, dbfolderkey, channelKeys):
167 super(Condition,self).
__init__(name)
174 self.schema, foldertag = dbfoldertag.split(
'::')
175 self.folder, self.
tagname = (foldertag.split(
'#')+[
''])[0:2]
184 x._select_show_retrieve = _ssr
198 f = coolDbConn.GetDBConn(schema = self.schema,db=Selector.condDB()).getFolder(self.folder)
199 if f.versioningMode()==0:
201 if self.
tagname not in [
"HEAD",
""]:
207 channelKey: (0,'SMK','MasterConfigurationKey')
208 ssr: 0-retrieve only, 1-select, 2-show, 3-select&show
217 self.
data_keys[-1]._select_show_retrieve = ssr
250 if listofchans
and cd.ResultKey
not in listofchans:
252 cd._select_show_retrieve |= 2
257 from CoolRunQuery.AtlRunQueryRun
import Run
259 if cd.SelectShowRetrieve<2:
261 Run.AddToShowOrder(cd)
265 def __init__(self, name, dbfolderkey, channelKeys=None):
266 super(RunLBBasedCondition,self).
__init__(name, dbfolderkey, channelKeys)
270 for ch1,ch2
in sortedRanges:
272 chansel = cool.ChannelSelection(ch1,ch2,cool.ChannelSelection.sinceBeforeChannel)
274 chansel.addRange(ch1,ch2)
276 return coolgen(f.browseObjects( iovmin, iovmax, chansel, self.
tagname))
280 iovpllist is a list [(IOV,payload),(IOV,payload),..,(IOV,payload)]
283 if IOVTime(runNr,1).
inRange(x[0]):
290 pld = defaultdict(list)
296 runnrlist = [r.runNr
for r
in runlist]
297 nlb = dict([(r.runNr,r.lastlb)
for r
in runlist])
300 firstrun = runnrlist[0]
301 lastrun = runnrlist[-1]
303 for iov, pl
in iovpllist:
304 first =
max(firstrun,iov.startTime.run)
305 last =
min(lastrun,(iov.endTime-1).run)
306 for r
in range(first,last+1):
308 pld[r].
append((deepcopy(iov),pl))
311 for runnr, iovplbyrun
in pld.items():
313 if iovplbyrun[0][0].startTime.lb==0:
314 iovplbyrun[0][0].startTime.lb=1
317 iovplbyrun[0][0].truncateToSingleRun(runnr)
322 if iovplbyrun[0][0].startTime == iovplbyrun[0][0].endTime:
326 lastiov = iovplbyrun[-1][0]
327 lastiov.truncateToSingleRun(runnr)
331 curTime = IOVTime(runnr,1)
332 while curTime<lastiov.startTime:
333 iov = iovplbyrun[idx][0]
334 if curTime < iov.startTime:
336 missingIOV = IOVRange(starttime=curTime, endtime=iov.startTime)
337 iovplbyrun.insert( idx, (missingIOV,
"n.a.") )
338 curTime = IOVTime(iov.endTime)
342 runEndTime = IOVTime(runnr,nlb[runnr]+1)
343 if lastiov.endTime<runEndTime:
344 missingIOV = IOVRange(starttime=lastiov.endTime, endtime=runEndTime)
345 iovplbyrun.append( (missingIOV,
"n.a.") )
351 condData = defaultdict(list)
353 keys = dict([(ch,
set(k))
for ch, k
in groupby(
sorted(self.
ChannelKeys(), key=itemgetter(0)), itemgetter(0))])
356 iovmin=(rr[0] << 32)+0
357 iovmax=((rr[1]+1) << 32)-1
360 objs = self.
_retrieve(iovmin, iovmax, f, sortedRanges)
364 for chtmp, internalKey, payloadKey
in keys[ch]:
365 if type(payloadKey)==tuple:
367 payload = obj.payload
369 payload = tuple(map(obj.payload, payloadKey))
371 payload = obj.payload(payloadKey)
373 condData[internalKey].
append( (IOVRange(obj.iovrange), payload) )
384 sortedRanges =
MergeRanges([(x,x)
for x
in sortedChannel])
390 condData = self.
readCondData(runranges, f, sortedRanges)
405 rejectSomething =
False
407 if run.runNr
not in condDataDict[k]:
409 rejectSomething =
True
410 run.addResult(k,
"n.a.")
413 datavec = condDataDict[k][run.runNr]
415 if not datavec
or len(datavec)==0:
416 run.addResult(k,
"n.a.")
419 if 'n.a.' in datavec:
420 run.showDataIncomplete =
True
422 for iov, data
in datavec:
426 rejectSomething =
True
430 run.selDataIncomplete =
True
432 if not (rejectSomething
and self.
rejectRun(run)):
433 newrunlist += [run.runNr]
435 runlist = [r
for r
in runlist
if r.runNr
in newrunlist]
437 duration = time() - start
440 print (
" ==> %i runs found (%.2f sec)" % (len(runlist),duration))
442 print (
" ==> Done (%g sec)" % duration)
448 return run.data.isRejected
452 def __init__(self, name, dbfolderkey, channelKeys=None):
453 super(TimeBasedCondition,self).
__init__(name, dbfolderkey, channelKeys)
460 if not iovpllist
or not runlist:
471 iovindex = startiovindex
474 iov = iovpllist[iovindex][0]
475 iovstart = iov.startTime.time
476 iovend = iov.endTime.time
479 startiovindex = iovindex
486 if iovend<run.sor
and iovindex==len(iovpllist)-1:
498 iovindex = startiovindex
500 iov = iovpllist[iovindex][0]
501 iovstart = iov.startTime.time
502 iovend = iov.endTime.time
504 if iovend>=run.eor
or iovindex==len(iovpllist)-1:
505 endiovindex = iovindex
512 for iov,pl
in iovpllist[startiovindex:endiovindex+1]:
513 iovstart = iov.startTime.time
514 iovend = iov.endTime.time
517 while lbindex<len(run.lbtimes)
and run.lbtimes[lbindex][0]<iovstart:
521 while lbindex<len(run.lbtimes)
and run.lbtimes[lbindex][0]<iovend:
526 if lbindex==len(run.lbtimes)-1:
534 lastIOV,lastpl=
None,
None
535 if len(pld[run.runNr])>0:
536 lastIOV,lastpl = pld[run.runNr][-1]
538 lastIOV.endTime.run = endrun
539 lastIOV.endTime.lb = endlb
541 pld[run.runNr] += [(IOVRange(runStart=run.runNr, lbStart=startlb, runEnd=endrun, lbEnd=endlb), pl)]
545 startiovindex = endiovindex
551 runlistNo = [run.runNr
for run
in runlist]
554 f = coolDbConn.GetDBConn(schema=self.schema, db=Selector.condDB()).getFolder(self.folder)
557 for ch
in sortedChannel:
559 chansel = cool.ChannelSelection(ch,ch,cool.ChannelSelection.sinceBeforeChannel)
561 chansel.addChannel(ch)
564 condData = defaultdict(list)
569 firstrun = runlist[runlistNo.index(rr[0])]
570 lastrun = runlist[runlistNo.index(rr[1])]
574 objs = f.browseObjects( iovmin, iovmax, chansel)
575 while objs.goToNext():
576 obj= objs.currentRef()
579 (channelNumber, resultKey, payloadKey) = chKey
580 if channelNumber != ch:
582 isBlob = (resultKey ==
'olc:bcidmask')
584 payloadvalue = obj.payload()[chKey[2]].
read()
586 payloadvalue = obj.payloadValue(chKey[2])
588 condData[resultKey].
append( (IOVRange(obj=obj, timebased=
True), payloadvalue) )
601 rejectSomething =
False
604 if run.runNr
not in condDataDict[k]:
605 run.addResult(k,
"n.a.")
608 datavec = condDataDict[k][run.runNr]
610 if not datavec
or len(datavec)==0:
611 run.addResult(k,
"n.a.")
614 if 'n.a.' in datavec:
615 run.showDataIncomplete=
True
617 for iov, data
in datavec:
620 run.addResult(k, self.
prettyValue(data,k), iov, reject=
True)
621 rejectSomething =
True
627 run.selDataIncomplete =
True
629 if not (rejectSomething
and self.
rejectRun(run)):
630 newrunlist += [run.runNr]
633 runlist = [r
for r
in runlist
if r.runNr
in newrunlist]
635 duration = time() - start
638 print (
" ==> %i runs found (%.2f sec)" % (len(runlist),duration))
640 print (
" ==> Done (%g sec)" % duration)
645 return run.data.isRejected