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