Forked from
atlas / athena
108587 commits behind the upstream repository.
-
Sanya Solodkov authored
Two additional variables - TDC and QDC timeout (coming from laser fragment in bytestream) were added to h2000 Also, cosmetic changes in ReadBchFromCool.py and ReadCalibFromCool.py - printing IOV together with comments string
Sanya Solodkov authoredTwo additional variables - TDC and QDC timeout (coming from laser fragment in bytestream) were added to h2000 Also, cosmetic changes in ReadBchFromCool.py and ReadCalibFromCool.py - printing IOV together with comments string
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ReadCalibFromCool.py 14.52 KiB
#!/bin/env python
# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
#
# ReadCalibFromCool.py
# Andrei Artamonov 2009-11-03
import getopt,sys,os,string
os.environ['TERM'] = 'linux'
def usage():
print "Usage: ",sys.argv[0]," [OPTION] ... "
print "Dumps the TileCal constants from various schemas / folders / tags"
print ""
print "-h, --help shows this help"
print "-f, --folder= specify status folder to use f.i. /TILE/OFL02/CALIB/CIS/LIN "
print "-t, --tag= specify tag to use, f.i. UPD1 or UPD4 or full suffix like RUN2-HLT-UPD1-00"
print "-r, --run= specify run number, by default uses latest iov"
print "-l, --lumi= specify lumi block number, default is 0"
print "-b, --begin= specify run number of first iov in multi-iov mode, by default uses very first iov"
print "-e, --end= specify run number of last iov in multi-iov mode, by default uses latest iov"
print "-m, --module= specify module to use, default is not set"
print "-N, --chmin= specify minimal channel to use, default is 0"
print "-X, --chmax= specify maximal channel to use, default is 47"
print "-c, --chan= specify channel to use , default is all channels from chmin to chmax"
print "-g, --gain=, -a, --adc= specify adc(gain) to print or number of adcs to print with - sign, default is -2"
print "-n, --nval= specify number of values to output, default is all"
print "-C, --comment print comment for every IOV"
print "-d, --default print also default values stored in AUX01-AUX20 "
print "-b, --blob print additional blob info"
print "-H, --hex print frag id instead of module name"
print "-P, --pmt print pmt number in addition to channel number"
print "-p, --prefix= print some prefix on every line "
print "-k, --keep= field numbers or channel numbers to ignore, e.g. '0,2,3,EBch0,EBch1,EBch12,EBch13,EBspD4ch18,EBspD4ch19,EBspC10ch4,EBspC10ch5' "
print "-s, --schema= specify schema to use, like 'COOLONL_TILE/CONDBR2' or 'sqlite://;schema=tileSqlite.db;dbname=CONDBR2' or tileSqlite.db"
print "-D, --dbname= specify dbname part of schema if schema only contains file name, default is CONDBR2'"
letters = "hr:l:s:t:f:D:n:b:e:m:N:X:c:a:g:p:dBCHPk:"
keywords = ["help","run=","lumi=","schema=","tag=","folder=","dbname=","module=","begin=","end=","chmin=","chmax=","gain=","adc=","chan=","nval=","prefix=","default","blob","hex","pmt","keep=","comment"]
try:
opts, extraparams = getopt.getopt(sys.argv[1:],letters,keywords)
except getopt.GetoptError, err:
print str(err)
usage()
sys.exit(2)
# defaults
run = 2147483647
lumi = 0
schema = 'COOLOFL_TILE/CONDBR2'
dbname = ''
folderPath = "/TILE/OFL02/CALIB/CIS/LIN"
tag = "UPD4"
nval = 0
nadc = -1
rosmin = 1
rosmax = 5
blob = False
hexid = False
pmt = False
prefix = None
modmin = 0
modmax = 99999
modulename="AUX-1"
partname=""
one_mod = False
mod = -1
ros = -1
chan_n= -1
chanmin = -1
chanmax = -1
gainmin = -1
gainmax = -1
begin = 0
end = 2147483647
iov = False
comment = False
keep=[]
for o, a in opts:
if o in ("-f","--folder"):
folderPath = a
elif o in ("-t","--tag"):
tag = a
elif o in ("-s","--schema"):
schema = a
elif o in ("-D","--dbname"):
dbname = a
elif o in ("-n","--nval"):
nval = int(a)
elif o in ("-b","--begin"):
begin = int(a)
iov = True
one_mod = True
elif o in ("-e","--end"):
end = int(a)
iov = True
one_mod = True
elif o in ("-a","--adc","-g","--gain"):
nadc = int(a)
elif o in ("-m","--module"):
modulename = a
one_mod = True
elif o in ("-c","--chan"):
chan_n = int(a)
elif o in ("-N","--chmin"):
chanmin = int(a)
elif o in ("-X","--chmax"):
chanmax = int(a)
elif o in ("-C","--comment"):
comment = True
elif o in ("-r","--run"):
run = int(a)
elif o in ("-l","--lumi"):
lumi = int(a)
elif o in ("-d","--default"):
rosmin = 0
elif o in ("-b","--blob"):
blob = True
elif o in ("-H","--hex"):
hexid = True
elif o in ("-P","--pmt"):
pmt = True
elif o in ("-p","--prefix"):
prefix = a
elif o in ("-k","--keep"):
keep = a.split(",")
elif o in ("-h","--help"):
usage()
sys.exit(2)
else:
assert False, "unhandeled option"
from TileCalibBlobPython import TileCalibTools
from TileCalibBlobPython.TileCalibTools import MINRUN, MINLBK, MAXRUN, MAXLBK
from TileCalibBlobObjs.Classes import *
from TileCalibBlobPython.TileCalibLogger import TileCalibLogger, getLogger
log = getLogger("ReadCalibFrCool")
import logging
logLevel=logging.DEBUG
log.setLevel(logLevel)
log1 = getLogger("TileCalibTools")
log1.setLevel(logLevel)
#=== check parameters
if len(dbname)<7 and run!=2147483647:
dbname = 'COMP200' if run<232000 else 'CONDBR2'
if not 'COOLO' in schema and not ':' in schema and not ';' in schema:
schema='sqlite://;schema='+schema+';dbname='+(dbname if len(dbname) else 'CONDBR2')
if schema=='COOLONL_TILE/COMP200':
if not (folderPath.startswith('/TILE/ONL01/') or folderPath.startswith('/TILE/OFL01/')):
print "Folder %s doesn't exist in schema %s " % (folderPath,schema)
sys.exit(2)
if schema=='COOLONL_TILE/CONDBR2':
if not folderPath.startswith('/TILE/ONL01/'):
print "Folder %s doesn't exist in schema %s, only /TILE/ONL01 " % (folderPath,schema)
sys.exit(2)
if schema=='COOLOFL_TILE/COMP200' or schema=='COOLOFL_TILE/CONDBR2':
if not folderPath.startswith('/TILE/OFL02/'):
print "Folder %s doesn't exist in schema %s " % (folderPath,schema)
sys.exit(2)
#=== set database
db = TileCalibTools.openDbConn(schema,'READONLY')
folderTag = TileCalibTools.getFolderTag(schema if 'COMP200' in schema or 'OFLP200' in schema else db, folderPath, tag)
log.info("Initializing folder %s with tag %s" % (folderPath, folderTag))
#=== initialize blob reader
blobReader = TileCalibTools.TileBlobReader(db,folderPath, folderTag)
#blobReader.log().setLevel(logging.DEBUG)
#=== get drawer with status at given run
log.info("Initializing for run %d, lumiblock %d" % (run,lumi))
flt=None
r=5
d=0
nchan=TileCalibUtils.max_chan()
ngain=TileCalibUtils.max_gain()
while not flt:
d-=1
if d<0:
r-=1
if r<0: break
d=TileCalibUtils.getMaxDrawer(r)-1
flt = blobReader.getDrawer(r, d, (run,lumi), False, False)
if flt:
blobT=flt.getObjType()
blobV=flt.getObjVersion()
mchan=flt.getNChans()
mgain=flt.getNGains()
mval=flt.getObjSizeUint32()
log.info( "Blob type: %d Version: %d Nchannels: %d Ngains: %d Nval: %d" % (blobT,blobV,mchan,mgain,mval) )
if nadc<-mgain: nadc=-mgain
if nchan<mchan: nchan=mchan
if ngain<mgain: ngain=mgain
else:
mgain=1
if nadc==-1: nadc=-ngain
log.info("Comment: %s" % blobReader.getComment((run,lumi)))
#=== check ROS and module numbers
if one_mod:
partname = modulename[:3]
mod = int(modulename[3:]) -1
part_dict = {'AUX':0,'LBA':1,'LBC':2,'EBA':3,'EBC':4}
if partname in part_dict:
ros = part_dict[partname]
rosmin = ros
rosmax = ros+1
else:
ros = -1
if mod >= 0:
modmin = mod
modmax = mod+1
elif mod < -1:
modmax = modmin
if chan_n >= 0 and chan_n < nchan:
chanmin = chan_n
chanmax = chan_n+1
else:
if chanmin<0: chanmin = 0
if chanmax<0: chanmax = nchan
else: chanmax += 1
if nadc >= 0 and nadc < ngain:
gainmin = nadc
gainmax = nadc+1
else:
gainmin = 0
if nadc<0: gainmax = -nadc
else: gainmax = ngain
#=== Filling the iovList
iovList = []
if iov:
if mod>=0:
COOL_part = ros
COOL_chan = mod
else:
COOL_part = -1
COOL_chan = 1000
try:
dbobjs = blobReader.getDBobjsWithinRange(COOL_part,COOL_chan)
if (dbobjs == None): raise Exception("No DB objects retrieved when building IOV list!")
while dbobjs.goToNext():
obj = dbobjs.currentRef()
objsince = obj.since()
sinceRun = objsince >> 32
sinceLum = objsince & 0xFFFFFFFF
since = (sinceRun, sinceLum)
objuntil = obj.until()
untilRun = objuntil >> 32
untilLum = objuntil & 0xFFFFFFFF
until = (untilRun, untilLum)
iovList.append((since, until))
except:
log.warning( "Warning: can not read IOVs from input DB file" )
sys.exit(2)
be=iovList[0][0][0]
en=iovList[-1][0][0]
if begin != be or end != en:
ib=0
ie=len(iovList)
for i,iovs in enumerate(iovList):
run = iovs[0][0]
lumi = iovs[0][1]
if (run<begin and run>be) or run==begin :
be=run
ib=i
if run>=end and run<en:
en=run
ie=i+1
log.info( "" )
if be != begin:
log.info( "Changing begin run from %d to %d (start of IOV)" % (begin,be) )
begin=be
if en != end:
if en>end: log.info( "Changing end run from %d to %d (start of next IOV)" % (end,en) )
else: log.info( "Changing end run from %d to %d (start of last IOV)" % (end,en) )
end=en
iovList=iovList[ib:ie]
if COOL_chan == 1000:
log.info( "%d IOVs in total for comment field" % len(iovList) )
else:
log.info( "%d IOVs in total for %s" % (len(iovList),modulename) )
else:
iovList.append(((run,lumi),(MAXRUN, MAXLBK)))
log.info( "\n" )
##channel2pmt
##negative means not connected !
##
dummy = [0]*48
barrel = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
27, 26, 25, 30, 29, 28,-33,-32, 31, 36, 35, 34,
39, 38, 37, 42, 41, 40, 45,-44, 43, 48, 47, 46]
extbar = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
13, 14, 15, 16, 17, 18,-19,-20, 21, 22, 23, 24,
-27,-26,-25,-31,-32,-28, 33, 29, 30,-36,-35, 34,
44, 38, 37, 43, 42, 41,-45,-39,-40,-48,-47,-46]
ch2pmt = [ dummy, barrel, barrel, extbar, extbar ]
gname=[]
if mgain!=2:
for i in xrange(mgain+1): gname+=[ "g "+str(i) ]
else: gname = [ "LG", "HG" ]
#=== loop over all partitions,modules,channels
pref = ""
for iovs in iovList:
if iov:
pref = "(%i,%i) " % (iovs[0][0],iovs[0][1])
if prefix:
pref = prefix + " " + pref
if comment:
log.info( pref + blobReader.getComment(iovs[0]) )
if prefix and prefix.startswith("Write"):
comm = blobReader.getComment(iovs[0])
if ": " in comm: comm = comm[comm.find(": ")+2:]
print '%s --update --folder=%s --tag=%s --run=%i --lumi=%i --comment="%s"' % (prefix,folderPath,folderTag,iovs[0][0],iovs[0][1],comm)
miss=0
good=0
for ros in xrange(rosmin,rosmax):
for mod in xrange(modmin, min(modmax,TileCalibUtils.getMaxDrawer(ros))):
if hexid:
modName = "0x%x" % ((ros<<8)+mod)
else:
modName = TileCalibUtils.getDrawerString(ros,mod)
if modName in ['EBA39','EBA40','EBA41','EBA42','EBA55','EBA56','EBA57','EBA58',
'EBC39','EBC40','EBC41','EBC42','EBC55','EBC56','EBC57','EBC58' ]:
modSpec = 'EBspC10'
elif modName in ['EBA15','EBC18']:
modSpec = 'EBspD4'
elif modName in ['EBC29','EBC32','EBC34','EBC37']:
modSpec = 'EBspE4'
elif modName in ['EBA07', 'EBA25', 'EBA44', 'EBA53',
'EBC07', 'EBC25', 'EBC44', 'EBC53',
'EBC28', 'EBC31', 'EBC35', 'EBC38' ]:
modSpec = 'EBspE1'
elif modName in ['EBA08', 'EBA24', 'EBA43', 'EBA54',
'EBC08', 'EBC24', 'EBC43', 'EBC54' ]:
modSpec = 'EBMBTS'
else:
modSpec = modName
try:
flt = blobReader.getDrawer(ros, mod,iovs[0], False, False)
if flt is None or isinstance(flt, (int)):
miss+=1
print "%s is missing in DB" % modName
else:
good+=1
if blob:
print "%s Blob type: %d Version: %d Nchannels: %d Ngains: %d Nval: %d" % (modName, flt.getObjType(), flt.getObjVersion(), flt.getNChans(), flt.getNGains(), flt.getObjSizeUint32())
mval0 = 0
mval = flt.getObjSizeUint32()
if nval<0 and -nval<=mval:
mval=-nval
mval0=mval-1
elif nval!=0 and nval<mval:
mval = nval
mchan=flt.getNChans()
mgain=flt.getNGains()
chmin = chanmin if chanmin<mchan else mchan
chmax = chanmax if chanmax<mchan else mchan
gnmin = gainmin if gainmin<mgain else mgain
gnmax = gainmax if gainmax<mgain else mgain
for chn in xrange(chmin,chmax):
for adc in xrange(gnmin,gnmax):
if pmt:
msg = "%s pm %02i ch %02i %s " % ( modName, abs(ch2pmt[ros][chn]), chn, gname[adc] )
else:
msg = "%s %2i %1i " % ( modName, chn, adc )
for val in xrange(mval0,mval):
if str(val) in keep or modName in keep or modSpec in keep or modName[:3] in keep or modName[:2] in keep \
or ("%sch%i"% (modName,chn)) in keep or ("%sch%i"% (modSpec,chn)) in keep or ("%sch%i"% (modName[:3],chn)) in keep or ("%sch%i"% (modName[:2],chn)) in keep \
or ("%sch%ig%i"% (modName,chn,adc)) in keep or ("%sch%ig%i"% (modSpec,chn,adc)) in keep or ("%sch%ig%i"% (modName[:3],chn,adc)) in keep or ("%sch%ig%i"% (modName[:2],chn,adc)) in keep:
msg += " keep "
else:
msg += " %f" % flt.getData(chn, adc, val)
print pref+msg
except Exception, e:
print e
if miss:
if iovs[0][0]!=2147483647:
print "%3i drawers are preseint in DB for run %d lb %d" % (good,iovs[0][0],iovs[0][1])
print "%3i drawers are missing in DB for run %d lb %d" % (miss,iovs[0][0],iovs[0][1])
else:
print "%3i drawers are preseint in DB" % (good)
print "%3i drawers are missing in DB" % (miss)
if good==0:
print "Please, check that you are using correct schema and correct tag"
#=== close DB
db.closeDatabase()