Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
ReadCalibFromCrest.py
Go to the documentation of this file.
1 #!/bin/env python
2 
3 # Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
4 #
5 # ReadCalibFromCrest.py
6 # Sanya Solodkov <Sanya.Solodkov@cern.ch>, 2025-02-04
7 #
8 # Purpose: Read calibration constants from CREST DB or from JSON file
9 #
10 
11 import getopt,sys,os
12 os.environ['TERM'] = 'linux'
13 
14 def usage():
15  print ("Usage: ",sys.argv[0]," [OPTION] ... ")
16  print ("Dumps the TileCal constants from various schemas / folders / tags")
17  print ("")
18  print ("-h, --help shows this help")
19  print ("-f, --folder= specify status folder to use f.i. /TILE/OFL02/CALIB/CIS/LIN ")
20  print ("-t, --tag= specify tag to use, f.i. UPD1 or UPD4 or full suffix like RUN2-HLT-UPD1-00")
21  print ("-r, --run= specify run number, by default uses latest iov")
22  print ("-l, --lumi= specify lumi block number, default is 0")
23  print ("-b, --begin= specify run number of first iov in multi-iov mode, by default uses very first iov")
24  print ("-e, --end= specify run number of last iov in multi-iov mode, by default uses latest iov")
25  print ("-m, --module= specify module to use, default is not set")
26  print ("-N, --chmin= specify minimal channel to use, default is 0")
27  print ("-X, --chmax= specify maximal channel to use, default is 47")
28  print ("-c, --chan= specify channel to use , default is all channels from chmin to chmax")
29  print ("-g, --gain=, -a, --adc= specify adc(gain) to print or number of adcs to print with - sign, default is -2")
30  print ("-n, --nval= specify number of values to output, default is all")
31  print ("-C, --comment print comment for every IOV")
32  print ("-i, --iov print IOVs only for every module")
33  print ("-I, --IOV print IOVs only")
34  print ("-d, --default print also default values stored in AUX01-AUX20")
35  print ("-B, --blob print additional blob info")
36  print ("-H, --hex print frag id instead of module name")
37  print ("-P, --pmt print pmt number in addition to channel number")
38  print ("-p, --prefix= print some prefix on every line ")
39  print ("-k, --keep= field numbers or channel numbers to ignore, e.g. '0,2,3,EBch0,EBch1,EBch12,EBch13,EBspD4ch18,EBspD4ch19,EBspC10ch4,EBspC10ch5' ")
40  print ("-s, --schema= specify name of input JSON file or CREST_SERVER_PATH")
41  #print ("-D, --dbname= specify dbname part of schema if schema only contains file name, default is CONDBR2")
42  #print ("-S, --server= specify server - ORACLE or FRONTIER, default is FRONTIER")
43 
44 letters = "hr:l:s:t:f:D:S:n:b:e:m:N:X:c:a:g:p:dBCiIHPk:"
45 keywords = ["help","run=","lumi=","schema=","tag=","folder=","dbname=","server=","module=","begin=","end=","chmin=","chmax=","gain=","adc=","chan=","nval=","prefix=","default","blob","hex","pmt","keep=","comment","iov","IOV"]
46 
47 try:
48  opts, extraparams = getopt.getopt(sys.argv[1:],letters,keywords)
49 except getopt.GetoptError as err:
50  print (str(err))
51  usage()
52  sys.exit(2)
53 
54 # defaults
55 run = 2147483647
56 lumi = 0
57 #schema = "output.%s.json" % (run)
58 schema = 'CREST'
59 dbname = ''
60 server = ''
61 folderPath = "/TILE/OFL02/CALIB/CIS/LIN"
62 tag = "UPD4"
63 nval = 0
64 nadc = -1
65 rosmin = 1
66 rosmax = 5
67 blob = False
68 hexid = False
69 pmt = False
70 prefix = None
71 modmin = 0
72 modmax = 99999
73 modulename="AUX-1"
74 partname=""
75 one_mod = False
76 mod = -1
77 ros = -1
78 chan_n= -1
79 chanmin = -1
80 chanmax = -1
81 gainmin = -1
82 gainmax = -1
83 begin = -1
84 end = 2147483647
85 iov = False
86 iovonly = False
87 IOVONLY = False
88 comment = False
89 keep=[]
90 
91 for o, a in opts:
92  a = a.strip()
93  if o in ("-f","--folder"):
94  folderPath = a
95  elif o in ("-t","--tag"):
96  tag = a
97  elif o in ("-s","--schema"):
98  schema = a
99  elif o in ("-D","--dbname"):
100  dbname = a
101  elif o in ("-S","--server"):
102  server = a
103  elif o in ("-n","--nval"):
104  nval = int(a)
105  elif o in ("-b","--begin"):
106  begin = int(a)
107  iov = True
108  one_mod = True
109  elif o in ("-e","--end"):
110  end = int(a)
111  iov = True
112  one_mod = True
113  elif o in ("-i","--iov"):
114  iov = True
115  iovonly = True
116  if modulename=='AUX-1':
117  modulename='ALL00'
118  elif o in ("-I","--IOV"):
119  iov = True
120  IOVONLY = True
121  if modulename=='AUX-1':
122  modulename='ALL00'
123  elif o in ("-a","--adc","-g","--gain"):
124  nadc = int(a)
125  elif o in ("-m","--module"):
126  modulename = a
127  one_mod = True
128  elif o in ("-c","--chan"):
129  chan_n = int(a)
130  elif o in ("-N","--chmin"):
131  chanmin = int(a)
132  elif o in ("-X","--chmax"):
133  chanmax = int(a)
134  elif o in ("-C","--comment"):
135  comment = True
136  elif o in ("-r","--run"):
137  run = int(a)
138  elif o in ("-l","--lumi"):
139  lumi = int(a)
140  elif o in ("-d","--default"):
141  rosmin = 0
142  elif o in ("-B","--blob"):
143  blob = True
144  elif o in ("-H","--hex"):
145  hexid = True
146  elif o in ("-P","--pmt"):
147  pmt = True
148  elif o in ("-p","--prefix"):
149  prefix = a
150  elif o in ("-k","--keep"):
151  keep = a.split(",")
152  elif o in ("-h","--help"):
153  usage()
154  sys.exit(2)
155  else:
156  raise RuntimeError("unhandled option")
157 
158 
159 from TileCalibBlobPython import TileCalibCrest
160 from TileCalibBlobPython import TileCalibTools
161 from TileCalibBlobPython.TileCalibTools import MAXRUN, MAXLBK
162 from TileCalibBlobObjs.Classes import TileCalibUtils, TileCalibType
163 
164 
165 from TileCalibBlobPython.TileCalibLogger import getLogger
166 log = getLogger("ReadCalibFrCrest")
167 import logging
168 logLevel=logging.DEBUG
169 log.setLevel(logLevel)
170 log1 = getLogger("TileCalibTools")
171 log1.setLevel(logLevel)
172 
173 #=== check ROS and module numbers
174 if one_mod:
175  partname = modulename[:3]
176  mod = int(modulename[3:]) -1
177 
178 part_dict = {'AUX':0,'LBA':1,'LBC':2,'EBA':3,'EBC':4}
179 if partname in part_dict:
180  ros = part_dict[partname]
181  rosmin = ros
182  rosmax = ros+1
183 else:
184  ros = -1
185 
186 if mod >= 0:
187  modmin = mod
188  modmax = mod+1
189 elif mod < -1:
190  modmax = modmin
191 
192 if iov:
193  run=end
194  lumi=0
195 
196 folderTag = tag
197 if folderTag.startswith("Tile") or folderTag.startswith("CALO") :
198  folderPath=""
199 log.info("Initializing folder %s with tag %s", folderPath, folderTag)
200 
201 blobReader = TileCalibCrest.TileBlobReaderCrest(schema,folderPath, folderTag, run, lumi,
202  TileCalibUtils.getDrawerIdx(max(rosmin,0),max(modmin,0)),
203  TileCalibUtils.getDrawerIdx(min(rosmax-1,4),max(0,min(modmax-1,TileCalibUtils.getMaxDrawer(min(rosmax-1,4))-1))))
204 
205 #=== get drawer with status at given run
206 flt=None
207 r=5
208 d=0
211 while not flt:
212  d-=1
213  if d<0:
214  r-=1
215  if r<0:
216  break
218  flt = blobReader.getDrawer(r, d, (run,lumi), True, False)
219 if flt:
220  blobT=flt.getObjType()
221  blobV=flt.getObjVersion()
222  mchan=flt.getNChans()
223  mgain=flt.getNGains()
224  mval=flt.getObjSizeUint32()
225  log.info( "Blob type: %d Version: %d Nchannels: %d Ngains: %d Nval: %d", blobT,blobV,mchan,mgain,mval)
226  if nadc<-mgain:
227  nadc=-mgain
228  if nchan<mchan:
229  nchan=mchan
230  if ngain<mgain:
231  ngain=mgain
232 else:
233  mgain=1
234 if nadc==-1:
235  nadc=-ngain
236 
237 log.info("Comment: %s", blobReader.getComment((run,lumi)))
238 
239 if chan_n >= 0 and chan_n < nchan:
240  chanmin = chan_n
241  chanmax = chan_n+1
242 else:
243  if chanmin<0:
244  chanmin = 0
245  if chanmax<0:
246  chanmax = nchan
247  else:
248  chanmax += 1
249 
250 if nadc >= 0 and nadc < ngain:
251  gainmin = nadc
252  gainmax = nadc+1
253 else:
254  gainmin = 0
255  if nadc<0:
256  gainmax = -nadc
257  else:
258  gainmax = ngain
259 
260 
261 #=== Filling the iovList
262 iovList = []
263 if iov:
264  if begin<0:
265  if iovonly or IOVONLY:
266  begin = end
267  else:
268  begin=0
269  iovList = blobReader.getIovs((begin,0),(end,0))
270 
271  be=iovList[0][0]
272  en=iovList[-1][0]
273 
274  if begin != be or end != en:
275  ib=0
276  ie=len(iovList)
277  for i,iovs in enumerate(iovList):
278  run = iovs[0]
279  lumi = iovs[1]
280  if (run<begin and run>be) or (run==begin and lumi==0) :
281  be=run
282  ib=i
283  if run>=end and run<en:
284  en=run
285  ie=i+1
286  log.info( "" )
287  if be != begin:
288  log.info( "Changing begin run from %d to %d (start of IOV)", begin,be)
289  begin=be
290  if en != end:
291  if en>end:
292  log.info( "Changing end run from %d to %d (start of next IOV)", end,en)
293  else:
294  log.info( "Changing end run from %d to %d (start of last IOV)", end,en)
295  end=en
296  iovList=iovList[ib:ie]
297  log.info( "%d IOVs in total", len(iovList))
298 
299  #=== IOV only option
300  if iovonly or IOVONLY:
301  alliovs={}
302  allmods={}
303  nmod=0
304  for ros in range(rosmin,rosmax):
305  for mod in range(modmin, min(modmax,TileCalibUtils.getMaxDrawer(ros))):
306  allmods[TileCalibUtils.getDrawerString(ros,mod)] = ""
307  nmod+=1
308  for since in iovList:
309  iov="(%s,%s)" % since
310  allmod=""
311  miss=0
312  for ros in range(rosmin,rosmax):
313  for mod in range(modmin, min(modmax,TileCalibUtils.getMaxDrawer(ros))):
314  flt = blobReader.getDrawer(ros, mod, since, False, False)
315  if flt:
316  mod = TileCalibUtils.getDrawerString(ros,mod)
317  allmod += " " + mod
318  allmods[mod] += " " + iov
319  else:
320  miss+=1
321  if miss==0 and nmod>1:
322  alliovs[iov] = " All %d modules" % nmod
323  else:
324  alliovs[iov] = allmod
325  print("")
326  if len(iovList)>0:
327  if iovonly:
328  for key,value in allmods.items():
329  if value=="":
330  value=" None"
331  print("%s\t%s" % (key,value))
332  if IOVONLY:
333  for key,value in alliovs.items():
334  if value=="":
335  value=" None"
336  print("%s\t%s" % (key,value))
337  else:
338  print("No IOVs found")
339  sys.exit(0)
340 else:
341  iovList.append((run,lumi))
342 
343 log.info( "\n" )
344 
345 
346 
349 dummy = [0]*48
350 barrel = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
351  13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
352  27, 26, 25, 30, 29, 28,-33,-32, 31, 36, 35, 34,
353  39, 38, 37, 42, 41, 40, 45,-44, 43, 48, 47, 46]
354 extbar = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
355  13, 14, 15, 16, 17, 18,-19,-20, 21, 22, 23, 24,
356  -27,-26,-25,-31,-32,-28, 33, 29, 30,-36,-35, 34,
357  44, 38, 37, 43, 42, 41,-45,-39,-40,-48,-47,-46]
358 
359 ch2pmt = [ dummy, barrel, barrel, extbar, extbar ]
360 gname=[]
361 if mgain!=2:
362  for i in range(mgain+1):
363  gname+=[ "g "+str(i) ]
364 else:
365  gname = [ "LG", "HG" ]
366 
367 #=== loop over all partitions,modules,channels
368 pref = ""
369 for iovs in iovList:
370  if iov:
371  pref = "(%i,%i) " % (iovs[0],iovs[1])
372  if prefix:
373  pref = prefix + " " + pref
374  if comment:
375  log.info( pref + str(blobReader.getComment(iovs)) )
376  if prefix and prefix.startswith("Write"):
377  comm = blobReader.getComment(iovs)
378  if ": " in comm:
379  comm = comm[comm.find(": ")+2:]
380  print ('%s --update --folder=%s --tag=%s --run=%i --lumi=%i --comment="%s"' % (prefix,folderPath,folderTag,iovs[0],iovs[1],comm))
381  miss=0
382  good=0
383  for ros in range(rosmin,rosmax):
384  for mod in range(modmin, min(modmax,TileCalibUtils.getMaxDrawer(ros))):
385  if hexid:
386  modName = "0x%x" % ((ros<<8)+mod)
387  else:
388  modName = TileCalibUtils.getDrawerString(ros,mod)
389  if modName in ['EBA39','EBA40','EBA41','EBA42','EBA55','EBA56','EBA57','EBA58',
390  'EBC39','EBC40','EBC41','EBC42','EBC55','EBC56','EBC57','EBC58' ]:
391  modSpec = 'EBspC10'
392  elif modName in ['EBA15','EBC18']:
393  modSpec = 'EBspD4'
394  elif modName in ['EBC29','EBC32','EBC34','EBC37']:
395  modSpec = 'EBspE4'
396  elif modName in ['EBA07', 'EBA25', 'EBA44', 'EBA53',
397  'EBC07', 'EBC25', 'EBC44', 'EBC53',
398  'EBC28', 'EBC31', 'EBC35', 'EBC38' ]:
399  modSpec = 'EBspE1'
400  elif modName in ['EBA08', 'EBA24', 'EBA43', 'EBA54',
401  'EBC08', 'EBC24', 'EBC43', 'EBC54' ]:
402  modSpec = 'EBMBTS'
403  else:
404  modSpec = modName
405  try:
406  flt = blobReader.getDrawer(ros, mod,iovs, False, False)
407  if flt is None or isinstance(flt, (int)):
408  miss+=1
409  print ("%s is missing in DB" % modName)
410  else:
411  good+=1
412  if blob:
413  print ("%s Blob type: %d Version: %d Nchannels: %d Ngains: %d Nval: %d" % (modName, flt.getObjType(), flt.getObjVersion(), flt.getNChans(), flt.getNGains(), flt.getObjSizeUint32()))
414  typeName = TileCalibType.getClassName(flt.getObjType())[-3:]
415  mval0 = 0
416  mval = flt.getObjSizeUint32()
417  if nval<0 and -nval<=mval:
418  mval=-nval
419  mval0=mval-1
420  elif nval!=0 and nval<mval:
421  mval = nval
422  mchan=flt.getNChans()
423  mgain=flt.getNGains()
424  chmin = chanmin if chanmin<mchan else mchan
425  chmax = chanmax if chanmax<mchan else mchan
426  gnmin = gainmin if gainmin<mgain else mgain
427  gnmax = gainmax if gainmax<mgain else mgain
428  for chn in range(chmin,chmax):
429  for adc in range(gnmin,gnmax):
430  if pmt:
431  msg = "%s pm %02i ch %02i %s " % ( modName, abs(ch2pmt[ros][chn]), chn, gname[adc] )
432  else:
433  msg = "%s %2i %1i " % ( modName, chn, adc )
434  for val in range(mval0,mval):
435  if str(val) in keep or modName in keep or modSpec in keep or modName[:3] in keep or modName[:2] in keep \
436  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 \
437  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:
438  msg += " keep "
439  else:
440  if typeName=='Int':
441  v = flt.getData(chn, adc, val)
442  if v>0xff:
443  msg += " 0x%x" % v
444  else:
445  msg += " %3d" % v
446  elif typeName=='Bch':
447  msg += " %d" % flt.getData(chn, adc, val)
448  else:
449  msg += " %f" % flt.getData(chn, adc, val)
450  print (pref+msg)
451  except Exception as e:
452  print (e)
453  if miss:
454  if iovs[0]!=2147483647:
455  print ("%3i drawers are present in DB for run %d lb %d" % (good,iovs[0],iovs[1]))
456  print ("%3i drawers are missing in DB for run %d lb %d" % (miss,iovs[0],iovs[1]))
457  else:
458  print ("%3i drawers are present in DB" % (good))
459  print ("%3i drawers are missing in DB" % (miss))
460  if good==0:
461  print ("Please, check that you are using correct schema and correct tag")
TileCalibUtils::getMaxDrawer
static unsigned int getMaxDrawer(unsigned int ros)
Returns the maximal channel number for a given drawer.
Definition: TileCalibUtils.cxx:136
ReadCalibFromCrest.usage
def usage()
Definition: ReadCalibFromCrest.py:14
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
TileCalibType::getClassName
static std::string getClassName(TileCalibType::TYPE type)
Returns the class name.
Definition: TileCalibType.cxx:10
TileCalibUtils::max_gain
static unsigned int max_gain()
Python compatibility function.
Definition: TileCalibUtils.h:114
python.LArMinBiasAlgConfig.int
int
Definition: LArMinBiasAlgConfig.py:59
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:25
TileCalibUtils::getDrawerString
static std::string getDrawerString(unsigned int ros, unsigned int drawer)
Return the drawer name, e.g.
Definition: TileCalibUtils.cxx:145
TileCalibUtils::max_chan
static unsigned int max_chan()
Python compatibility function.
Definition: TileCalibUtils.h:112
str
Definition: BTagTrackIpAccessor.cxx:11
TileCalibUtils::getDrawerIdx
static unsigned int getDrawerIdx(unsigned int ros, unsigned int drawer)
Returns a drawer hash.
Definition: TileCalibUtils.cxx:60
python.CaloCondLogger.getLogger
def getLogger(name="CaloCond")
Definition: CaloCondLogger.py:16