ATLAS Offline Software
TileDCSDataPlotter.py
Go to the documentation of this file.
1 #!/bin/env python
2 # Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 # Author: nils.gollub@cern.ch
4 
5 
6 import sys, os
7 import time, datetime
8 import ROOT
9 import logging
10 from ROOT import TCanvas, TH1D, TH2D, TArrayD, TLegend
11 from TileCoolDcs.TileDCSDataGrabber import TileDCSDataGrabber
12 from TileCoolDcs.ProgressBar import progressBar
13 
14 
16 
17  #_______________________________________________________________________________________
18  def __init__( self, argv, useCool, useTestBeam, verbose, dbstring=None, putDuplicates=False, hvonly=False ):
19 
20  dbSource = "ORACLE"
21  self.useCool = useCool or hvonly
22  if useCool:
23  dbSource = "COOL"
24  self.useTestBeam = useTestBeam
25  if useTestBeam:
26  dbSource = "TESTBEAM"
27  logLvl = logging.WARNING
28  if verbose:
29  logLvl = logging.DEBUG
30 
31 # self.dataGrabber = TileDCSDataGrabber(dbSource, logLvl, dbstring, putDuplicates)
32 # self.info = self.dataGrabber.info
33 
34  self.cmd = argv[1]
35  self.drawer = argv[2]
36  self.varExp = argv[3]
37  beg = argv[4]
38  end = argv[5]
39  self.iovBeg = int(time.mktime(time.strptime(beg,"%Y-%m-%d %H:%M:%S")))
40  self.iovEnd = int(time.mktime(time.strptime(end,"%Y-%m-%d %H:%M:%S")))
41 
42  self.dataGrabber = TileDCSDataGrabber(dbSource, logLvl, dbstring, putDuplicates, self.iovBeg)
43  self.info = self.dataGrabber.info
44 
45  self.cutExp = ""
46  if len(argv) >6:
47  self.cutExp = argv[6]
48  beg = beg.replace(' ','_')
49  end = end.replace(' ','_')
50  self.outName = self.drawer+"_"+self.varExp[:100]+"__"+beg+"__"+end
51  self.outName = self.outName.replace('/',':')
52  self.outName = self.outName.replace('(','0')
53  self.outName = self.outName.replace(')','0')
54  if len(argv) >7:
55  self.outName = argv[7]
56  print ("---> OUTNAME: " , self.outName)
57 
58  timeBegInfo = time.localtime(self.iovBeg)
59  timeEndInfo = time.localtime(self.iovEnd)
60  self.rangeStr = "FROM: "+time.asctime(timeBegInfo)+" UNTIL: "+time.asctime(timeEndInfo)
61 
62  part=["LBA","LBC","EBA","EBC"]
63  if self.drawer == "ALL":
64  self.drawer=""
65  for p in range(4):
66  for m in range(64):
67  self.drawer+="%s%2.2d," % (part[p],m+1)
68  self.drawer=self.drawer[:-1]
69  elif self.drawer in part:
70  p=self.drawer
71  self.drawer=""
72  for m in range(64):
73  self.drawer+="%s%2.2d," % (p,m+1)
74  self.drawer=self.drawer[:-1]
75 
76 
77  #_______________________________________________________________________________________
78  def parseVarExpression(self, varExpression):
79 
80  knownVars = self.info.get_all_variables()
81  varDict = {}
82  for var in knownVars:
83  pos = varExpression.find(var)
84  if pos>-1:
85  oldVar=""
86  if pos in varDict:
87  #=== other variable found at same place?
88  #=== -> choose the longer one
89  oldVar = varDict[pos]
90  if len(oldVar) > len(var):
91  vtmp = var
92  var = oldVar
93  oldVar = vtmp
94  varDict[pos] = var
95  if oldVar!="":
96  #=== check if shorter variable is also present at another place
97  varExpr = varExpression
98  for v in list(varDict.values()):
99  varExpr=varExpr.replace(v," "*len(v))
100  oldPos = varExpr.find(oldVar)
101  if oldPos>-1:
102  varDict[oldPos] = oldVar
103 
104  #=== check for overlap
105  positions = sorted(varDict.keys())
106  posLength = len(positions)
107  if posLength > 1:
108  iPos = 1
109  while iPos < posLength:
110  if positions[iPos] < positions[iPos-1]+len(varDict[positions[iPos-1]]):
111  varDict.pop(positions[iPos])
112  positions.pop(iPos)
113  posLength=len(positions)
114  else:
115  iPos+=1
116 
117  varList = list(varDict.values())
118  if "ALL_LVPS_AI" in varExpression:
119  varList.extend(list(self.info.vars_LVPS_AI.keys()))
120  if "ALL_LVPS_STATES" in varExpression:
121  varList.extend(list(self.info.vars_LVPS_STATES.keys()))
122  if "ALL_HVSET" in varExpression or "ALL_SETHV" in varExpression:
123  varList.extend(list(self.info.vars_HVSET.keys()))
124  if self.useCool or ("ALL_HV-ALL_SETHV" in varExpression or "ALL_HV-ALL_HVSET" in varExpression):
125  for i in range(2):
126  if "Set.vFix1%d" % (i+1) in varList:
127  varList.remove("Set.vFix1%d" % (i+1))
128  for i in range(4):
129  varList.remove("Set.hvIn%d" % (i+1))
130  for i in range(7):
131  varList.remove("Set.volt%d" % (i+1))
132  for i in range(7):
133  varList.remove("Set.temp%d" % (i+1))
134  if ("ALL_HV" in varExpression and "ALL_HVSET" not in varExpression) or "ALL_HV-ALL_HVSET" in varExpression:
135  varList.extend(list(self.info.vars_HV.keys()))
136  if self.useCool or ("ALL_HV-ALL_SETHV" in varExpression or "ALL_HV-ALL_HVSET" in varExpression):
137  for i in range(4):
138  varList.remove("hvIn%d" % (i+1))
139  for i in range(7):
140  varList.remove("volt%d" % (i+1))
141  for i in range(7):
142  varList.remove("temp%d" % (i+1))
143 
144  return list(set(varList))
145 
146 
147  #_______________________________________________________________________________________
148  def getTree(self, drawer=None, var=None,lastOnly=False,firstAndLast=False):
149 
150  #=== parse for variables needed
151  varList = self.parseVarExpression(self.varExp+" "+self.cutExp)
152 
153  #=== get the variable
154  if drawer is None:
155  t = self.dataGrabber.getDCSTree(self.iovBeg, self.iovEnd, self.drawer.split(","), varList, lastOnly, firstAndLast)
156  elif var is None:
157  drl=[drawer]
158  t = self.dataGrabber.getDCSTree(self.iovBeg, self.iovEnd, drl, varList, lastOnly, firstAndLast)
159  else:
160  drl=[drawer]
161  varl=[var]
162  t = self.dataGrabber.getDCSTree(self.iovBeg, self.iovEnd, drl, varl, lastOnly, firstAndLast)
163 
164  if t.GetEntries()==0:
165  print ("ERROR: No data in time interval!")
166  sys.exit(1)
167  else:
168  print ("Found number of entries: ", t.GetEntries())
169 
170  #=== append drawer to all variables
171  if self.cmd!="tree" and drawer is None and var is None:
172  for var in varList:
173  if "," in self.drawer:
174  newvar=""
175  newcut=""
176  if var in self.cutExp:
177  cut=self.cutExp
178  else:
179  cut=None
180  for dr in self.drawer.split(","):
181  newvar += dr+"."+var+","
182  if cut:
183  newcut += dr+"."+cut+","
184  self.varExp = self.varExp.replace(var,newvar[:-1])
185  if cut:
186  self.cutExp = newcut[:-1]
187  self.varExp = self.varExp.replace("Set."+newvar[:-1],"Set."+var)
188  if cut and "Set." in cut and "Set." not in var:
189  self.cutExp=cut
190  else:
191  self.varExp = self.varExp.replace(var,self.drawer+"."+var)
192  self.cutExp = self.cutExp.replace(var,self.drawer+"."+var)
193  self.varExp = self.varExp.replace(self.drawer+"."+self.drawer,self.drawer)
194  self.cutExp = self.cutExp.replace(self.drawer+"."+self.drawer,self.drawer)
195  self.varExp = self.varExp.replace("Set."+self.drawer,"Set")
196  self.cutExp = self.cutExp.replace("Set."+self.drawer,"Set")
197  if "ALL_LVPS_AI" in self.varExp:
198  newvar=""
199  for dr in self.drawer.split(","):
200  for var in list(self.info.vars_LVPS_AI.keys()):
201  newvar += dr+"."+var+","
202  self.varExp = self.varExp.replace("ALL_LVPS_AI",newvar[:-1])
203 
204  if "ALL_LVPS_STATES" in self.varExp:
205  newvar=""
206  for dr in self.drawer.split(","):
207  for var in list(self.info.vars_LVPS_STATES.keys()):
208  newvar += dr+"."+var+","
209  self.varExp = self.varExp.replace("ALL_LVPS_STATES",newvar[:-1])
210 
211  if "ALL_HV-ALL_SETHV" in self.varExp or "ALL_HV-ALL_HVSET" in self.varExp:
212  newvar=""
213  for dr in self.drawer.split(","):
214  for var in list(self.info.vars_HVSET.keys()):
215  if not ("Set.vFix" in var or "Set.hvIn" in var or "Set.volt" in var or "Set.temp" in var):
216  newvar += dr+"."+var.replace("Set.","")+"-"+dr+"."+var+","
217  self.varExp = self.varExp.replace("ALL_HV-ALL_SETHV",newvar[:-1])
218  self.varExp = self.varExp.replace("ALL_HV-ALL_HVSET",newvar[:-1])
219  if "ALL_HVSET" in self.varExp or "ALL_SETHV" in self.varExp:
220  newvar=""
221  for dr in self.drawer.split(","):
222  for var in list(self.info.vars_HVSET.keys()):
223  if not self.useCool or not ("Set.vFix" in var or "Set.hvIn" in var or "Set.volt" in var or "Set.temp" in var):
224  newvar += dr+"."+var+","
225  self.varExp = self.varExp.replace("ALL_HVSET",newvar[:-1])
226  self.varExp = self.varExp.replace("ALL_SETHV",newvar[:-1])
227  if "ALL_HV" in self.varExp and "ALL_HVSET" not in self.varExp :
228  newvar=""
229  for dr in self.drawer.split(","):
230  for var in list(self.info.vars_HV.keys()):
231  if not self.useCool or not ("hvIn" in var or "volt" in var or "temp" in var):
232  newvar += dr+"."+var+","
233  self.varExp = self.varExp.replace("ALL_HV",newvar[:-1])
234 
235  print ("self.drawer: ", self.drawer)
236  print ("self.varExp: ", self.varExp)
237  print ("self.cutExp: ", self.cutExp)
238 
239  return t
240 
241 
242  #_______________________________________________________________________________________
243  def cutReplace(self, incut, var):
244  """
245  Relace "ALL" keywords in cut variable by appropriate names from var variable
246 
247  """
248 
249  cut = incut
250  for vv in var.split("-"):
251  if "hvOut" in vv:
252  if "Set" in vv:
253  cut = cut.replace("ALL_SETHV",vv)
254  cut = cut.replace("ALL_HVSET",vv)
255  vvv=vv.replace("Set.hv","hv")
256  cut = cut.replace("ALL_HV",vvv)
257  else:
258  vvv=vv.replace("hv","Set.hv")
259  cut = cut.replace("ALL_SETHV",vvv)
260  cut = cut.replace("ALL_HVSET",vvv)
261  cut = cut.replace("ALL_HV",vv)
262  cut = cut.replace("ALL",var)
263  return cut
264 
265 
266  #_______________________________________________________________________________________
267  def scan(self):
268  """
269  Scan ROOT TTree and show all values on the screen
270 
271  """
272 
273  t = self.getTree()
274  if "ALL" in self.cutExp or self.varExp.count(',')>2 :
275  #=== extract the values
276  for var in self.varExp.split(","):
277  treevar="EvTime:"+var
278  cut=self.cutReplace(self.cutExp,var)
279  self.scantree(t,treevar,cut)
280  else:
281  treevar="EvTime:"+self.varExp.replace(",",":")
282  self.scantree(t,treevar,self.cutExp)
283 
284  return
285 
286 
287  #_______________________________________________________________________________________
288  def scantree(self,t,treevar,cut):
289  """
290  Scan ROOT TTree and show up to 4 variables on the screen
291 
292  """
293 
294  #t.Scan("-1000000000+"+treevar,cut)
295  t.Draw(treevar,cut,"goff")
296  n = t.GetSelectedRows()
297  if n>0: # at least one point passed the cut
298  vars = treevar.split(":")
299  nv = len(vars)
300  fmt = [ "%d" ]
301  for i in range(1,nv):
302  if "DAQ" in vars[i]:
303  fmt += [ "\t%6d\t\t" ]
304  else:
305  fmt += [ "\t%6.2f\t" ]
306  x = t.GetV1()
307  v1 = None
308  v2 = None
309  v3 = None
310  v=vars[0]
311  if v=="EvTime": v += 13*" "
312  if nv>1:
313  v1 = t.GetV2()
314  v += "\t"+vars[1]
315  if nv>2:
316  v2 = t.GetV3()
317  v += "\t"+vars[2]
318  if nv>3:
319  v3 = t.GetV4()
320  v += "\t"+vars[3]
321  print(v)
322  for i in range(n):
323  v=""
324  if v1 is not None:
325  v += fmt[1] % v1[i]
326  if v2 is not None:
327  v += fmt[2] % v2[i]
328  if v3 is not None:
329  v += fmt[3] % v3[i]
330  dt = datetime.datetime.fromtimestamp(int(x[i])).strftime('%Y-%m-%d %H:%M:%S')
331  print(dt,v)
332  return
333 
334 
335  #_______________________________________________________________________________________
336  def getTimelinePlot(self):
337  """
338  Returns a TCanvas with the variable plotted vs time.
339 
340  """
341 
342  ROOT.gStyle.SetOptStat(0)
343  t = self.getTree()
344 
345  if t.GetEntries()==1:
346  print ("ERROR: Only one data point, need at least 2")
347  print ("---> Try increasing the time span")
348  sys.exit(1)
349 
350  #=== extract the values
351  hh=[]
352  ih=0
353  hmin=1000000000
354  hmax=-1000000000
355  color = [2,4,3,5,6,7]
356  for var in self.varExp.split(","):
357  cut=self.cutReplace(self.cutExp,var)
358  #print (var)
359  #print (cut)
360  t.Draw(var+":EvTime",cut,"goff")
361  n = t.GetSelectedRows()
362  if len(cut)>0:
363  print ("var=",var," \tcut=",cut," \tnpoints=",n)
364  else:
365  print ("var=",var," \tnpoints=",n)
366  if n>0: # at least one point passed the cut
367  x1 = t.GetV2()
368  y1 = t.GetV1()
369  x = TArrayD(n)
370  y = TArrayD(n)
371  for i in range(n):
372  x[i] = x1[i]
373  y[i] = y1[i]
374 
375  t.Draw(var+":EvTime","","goff") # the same but without cut
376  n0 = t.GetSelectedRows()
377  x0 = t.GetV2()
378 
379  #=== fix for **** root time convention and add end time
380  offset = 788918400 # = 1.1.1995(UTC), the root offset
381  xarr = TArrayD(n0+1)
382  for i in range(n0):
383  xarr[i] = x0[i]-offset
384  xarr[n0] = self.iovEnd-offset
385  #=== create and fill histogram with values
386  title = var
387  h = TH1D("hDCS"+str(ih),title,n0,xarr.GetArray())
388  for i in range(n):
389  h.Fill(x[i]-offset,y[i])
390  if y[i]>hmax:
391  hmax=y[i]
392  if y[i]<hmin:
393  hmin=y[i]
394 
395  #=== set time display
396  sec_min = 60
397  sec_hrs = sec_min*60
398  sec_day = sec_hrs*24
399  sec_mon = sec_day*30
400  timeDiff = self.iovEnd-self.iovBeg
401  h.GetXaxis().SetTimeFormat("%S")
402  h.SetXTitle("time [seconds]")
403  if timeDiff > 12*sec_mon:
404  h.GetXaxis().SetTimeFormat("%m/%y")
405  h.SetXTitle("time [month/year]")
406  #elif timeDiff >3.33448*sec_mon:
407  elif timeDiff > 6*sec_day:
408  h.GetXaxis().SetTimeFormat("%d/%m")
409  h.SetXTitle("time [day/month]")
410  elif timeDiff > 2*sec_day:
411  h.GetXaxis().SetTimeFormat("%d(%H)")
412  h.SetXTitle("time [day(hour)]")
413  elif timeDiff > 2*sec_hrs:
414  h.GetXaxis().SetTimeFormat("%H:%M")
415  h.SetXTitle("time [hour:min]")
416  elif timeDiff > 2*sec_min:
417  h.GetXaxis().SetTimeFormat("%M")
418  h.SetXTitle("time [min]")
419  h.GetXaxis().SetTimeDisplay(1)
420  h.SetLineColor(color[ih%len(color)])
421 
422  ih+=1
423  hh+=[h]
424 
425  if len(hh)>1:
426  delta=(hmax-hmin)/20.
427  if delta<=0:
428  delta=0.5
429  hmin-=delta
430  hmax+=delta
431  for h in hh:
432  h.SetMaximum(hmax)
433  h.SetMinimum(hmin)
434 
435  return hh
436 
437 
438  #_______________________________________________________________________________________
439  def getDiffPlot(self,opt):
440  """
441  Returns a TCanvas with 2D plot showing difference between last and first entries.
442 
443  """
444 
445  ROOT.gStyle.SetOptStat(0)
446  tree = self.getTree(firstAndLast=(opt==1))
447 
448  if tree.GetEntries()==1:
449  print ("ERROR: Only one data point, need at least 2")
450  print ("---> Try increasing the time span")
451  sys.exit(1)
452 
453  if len(self.cutExp) and "ALL" not in self.cutExp:
454  print ("Cut expression is ignored in diff plot")
455 
456  #=== extract the values
457  leaves=tree.GetListOfLeaves()
458  xaxis=[]
459  yaxis=[]
460  for leaf in leaves:
461  z=leaf.GetTitle().split('.')
462  if len(z)==2 or (len(z)==3 and z[1]=="Set"):
463  x=z[0]
464  y=z[1]
465  if len(z)==3:
466  y+= "."+z[2]
467  if not y[-2].isdigit() and y[-1].isdigit():
468  y=y[:-2]+'0'+y[-1]
469  if x not in xaxis:
470  xaxis+=[x]
471  if y not in yaxis:
472  yaxis+=[y]
473  xaxis.sort()
474  yaxis.sort()
475  nx=len(xaxis)
476  ny=len(yaxis)
477  if opt==1:
478  pref="Diff "
479  elif opt==2:
480  pref="Diff_Prof "
481  elif opt==3:
482  pref="Prof "
483  else:
484  pref=""
485  if opt==1:
486  hist=ROOT.TH2F("hist2D",pref+self.outName,nx,-0.5,nx-0.5,ny,-0.5,ny-0.5)
487  else:
488  hist=ROOT.TProfile2D("hist2D",pref+self.outName,nx,-0.5,nx-0.5,ny,-0.5,ny-0.5)
489 
490  XA=hist.GetXaxis()
491  n=0
492  for i in range(nx):
493  if n:
494  XA.SetBinLabel(i + 1, '')
495  else:
496  XA.SetBinLabel(i + 1, xaxis[i])
497  n=1-n
498 
499  YA=hist.GetYaxis()
500  for i in range(ny):
501  YA.SetBinLabel(i + 1, yaxis[i])
502 
503  tree.GetEntry(0)
504  val = {}
505  for leaf in leaves:
506  if opt>2:
507  val[leaf.GetTitle()] = 0
508  else:
509  val[leaf.GetTitle()] = leaf.GetValue()
510 
511  ne=tree.GetEntries()
512  if opt==1:
513  n1=ne-1
514  elif opt==2:
515  n1=1
516  else:
517  n1=0
518  bar = progressBar(n1,ne, 78)
519  for n in range(n1,ne):
520  tree.GetEntry(n)
521  bar.update(n)
522  for leaf in leaves:
523  v1=val[leaf.GetTitle()]
524  z=leaf.GetTitle().split('.')
525  if len(z)==2 or (len(z)==3 and z[1]=="Set"):
526  x=z[0]
527  y=z[1]
528  if len(z)==3:
529  y+= "."+z[2]
530  if not y[-2].isdigit() and y[-1].isdigit():
531  y=y[:-2]+'0'+y[-1]
532  v2=leaf.GetValue()
533  if "ALL" in self.cutExp:
534  var=str(v2)
535  vardiff=str(v2-v1)
536  cut = self.cutExp.replace("ALL_DIFF",vardiff)
537  cut = self.cutReplace(cut,var)
538  ok = eval(cut)
539  #print (cut)
540  #print (ok)
541  else:
542  ok = True
543  if ok:
544  hist.Fill(xaxis.index(x),yaxis.index(y),v2-v1)
545  bar.done()
546 
547  return hist
548 
549 
550  #_______________________________________________________________________________________
552  """
553  Returns a TCanvas with the variable distribution plotted (using weights)
554 
555  """
556 
557  t = self.getTree()
558 
559  hh=[]
560  ih=0
561  color = [2,4,3,5,6,7]
562  xmin=1000000000
563  xmax=-1000000000
564  ymin=1000000000
565  ymax=-1000000000
566  hmin=1000000000
567  hmax=-1000000000
568  dim=0
569  xtit=""
570  ytit=""
571  for var in sorted(self.varExp.split(",")):
572  cut=self.cutExp
573  dim = var.count(':')
574  if dim>0:
575  varX = var.split(":")[1]
576  varY = var.split(":")[0]
577  if len(cut):
578  cutY = self.cutReplace(cut,varY)
579  cut = self.cutReplace(cut,varX)
580  cut = "("+cut+") && ("+cutY+")"
581  else:
582  varX=var
583  varY=""
584  if len(cut):
585  cut = self.cutReplace(cut,varX)
586  if cut!="":
587  cut = "weight*("+cut+")"
588  else:
589  cut = "weight"
590  #print (var)
591  #print (cut)
592 
593  t.Draw(var,cut,"goff")
594  h = ROOT.gDirectory.Get("htemp")
595  h.SetXTitle(var.split(":")[0])
596  h.SetTitle(self.rangeStr)
597  h.SetName("TileDCSDataPlotter"+str(ih))
598  #print ("n=",h.GetEntries())
599 
600  if h.GetEntries()>0:
601  xmi = h.GetXaxis().GetBinLowEdge(1)
602  xma = h.GetXaxis().GetBinLowEdge(h.GetNbinsX())+h.GetXaxis().GetBinWidth(h.GetNbinsX())
603  if xmi<xmin:
604  xmin=xmi
605  if xma>xmax:
606  xmax=xma
607  if dim>0:
608  ymi = h.GetYaxis().GetBinLowEdge(1)
609  yma = h.GetYaxis().GetBinLowEdge(h.GetNbinsY())+h.GetYaxis().GetBinWidth(h.GetNbinsY())
610  if ymi<ymin:
611  ymin=ymi
612  if yma>ymax:
613  ymax=yma
614  hmi = h.GetMinimum()
615  hma = h.GetMaximum()
616  if hmi<hmin:
617  hmin=hmi
618  if hma>hmax:
619  hmax=hma
620  xtit+=varX+","
621  if dim>0:
622  ytit+=varY+","
623 
624  h.SetLineColor(color[ih%len(color)])
625  h.SetMarkerColor(color[ih%len(color)])
626 
627  ih+=1
628  hh+=[h]
629 
630  if len(hh)>1:
631  if xmin>xmax:
632  xmin=0
633  xmax=0
634  delta=(xmax-xmin)/20.
635  if delta<=0:
636  delta=0.5
637  xmin-=delta
638  xmax+=delta
639  if ymin>ymax:
640  ymin=0
641  ymax=0
642  delta=(ymax-ymin)/20.
643  if delta<=0:
644  delta=0.5
645  ymin-=delta
646  ymax+=delta
647  if hmin>hmax:
648  hmin=0
649  hmax=1
650  delta=(hmax-hmin)/20.
651  if delta<=0:
652  delta=0.5
653  if hmin!=0:
654  hmin-=delta
655  hmax+=delta
656  if dim>0:
657  h0 = TH2D("hDCS","dummy",2,xmin,xmax,2,ymin,ymax)
658  h0.SetYTitle(ytit[:-1])
659  else:
660  h0 = TH1D("hDCS","dummy",2,xmin,xmax)
661  h0.SetXTitle(xtit[:-1])
662  h0.SetTitle(self.rangeStr)
663  h0.SetMaximum(hmax)
664  if hmin!=0:
665  h0.SetMinimum(hmin)
666  hh=[h0]+hh
667  ROOT.gStyle.SetOptStat(0)
668 
669  return hh
670 
671 
672  #_______________________________________________________________________________________
674  """
675  Print mean values from histograms
676 
677  """
678 
679  t = self.getTree()
680  if self.cutExp!="":
681  for v, c in zip(self.varExp.split(","), self.cutExp.split(",")):
682  t.Draw(v,c,"goff")
683  h = ROOT.gDirectory.Get("htemp")
684 
685  print ("%s %s %s Nentries %d Mean %7.3f RMS %8.4f" % \
686  (v,c,self.rangeStr,h.GetEntries(),h.GetMean(),h.GetRMS()))
687  else:
688  cut = ""
689  for v in self.varExp.split(","):
690  t.Draw(v,cut,"goff")
691  h = ROOT.gDirectory.Get("htemp")
692  print ("%s %s Nentries %d Mean %7.3f RMS %8.4f" % \
693  (v,self.rangeStr,h.GetEntries(),h.GetMean(),h.GetRMS()))
694 
695  return 0
696 
697 
698  #_______________________________________________________________________________________
699  def printDistributionStat(self, lastOnly=False):
700  """
701  Print mean values from histograms
702 
703  """
704 
705  if "ALL_LVPS_AI" in self.varExp:
706  self.varExp = self.varExp.replace("ALL_LVPS_AI",",".join(sorted(self.info.vars_LVPS_AI.keys())))
707  if "ALL_LVPS_STATES" in self.varExp:
708  self.varExp = self.varExp.replace("ALL_LVPS_STATES",",".join(sorted(self.info.vars_LVPS_STATES.keys())))
709  if "ALL_HV-ALL_SETHV" in self.varExp or "ALL_HV-ALL_HVSET" in self.varExp:
710  vlist = []
711  for var in list(self.info.vars_HVSET.keys()):
712  if not ("Set.vFix" in var or "Set.hvIn" in var or "Set.volt" in var or "Set.temp" in var):
713  vlist += [var.replace("Set.","")+"-"+var]
714  self.varExp = self.varExp.replace("ALL_HV-ALL_SETHV",",".join(sorted(vlist)))
715  self.varExp = self.varExp.replace("ALL_HV-ALL_HVSET",",".join(sorted(vlist)))
716  if "ALL_HVSET" in self.varExp or "ALL_SETHV" in self.varExp:
717  vlist = list(self.info.vars_HVSET.keys())
718  if self.useCool:
719  for i in range(2):
720  if "Set.vFix1%d" % (i+1) in vlist:
721  vlist.remove("Set.vFix1%d" % (i+1))
722  for i in range(4):
723  vlist.remove("Set.hvIn%d" % (i+1))
724  for i in range(7):
725  vlist.remove("Set.volt%d" % (i+1))
726  for i in range(7):
727  vlist.remove("Set.temp%d" % (i+1))
728  self.varExp = self.varExp.replace("ALL_HVSET",",".join(sorted(vlist)))
729  self.varExp = self.varExp.replace("ALL_SETHV",",".join(sorted(vlist)))
730  if "ALL_HV" in self.varExp and "ALL_HVSET" not in self.varExp:
731  vlist = list(self.info.vars_HV.keys())
732  if self.useCool:
733  for i in range(4):
734  vlist.remove("hvIn%d" % (i+1))
735  for i in range(7):
736  vlist.remove("volt%d" % (i+1))
737  for i in range(7):
738  vlist.remove("temp%d" % (i+1))
739  self.varExp = self.varExp.replace("ALL_HV",",".join(sorted(vlist)))
740  varlist=self.parseVarExpression(self.varExp)
741  print ("var list is",varlist)
742 
743  reslist=[]
744  cutlist = self.parseVarExpression(self.cutExp)
745  print ("cut list is",cutlist)
746  fulllist=sorted(list(set(varlist+cutlist)))
747  print ("full list is",fulllist)
748  t = None
749  drlistprev=[]
750  varlistprev=[]
751  for drawer in self.drawer.split(","):
752  drlist=[drawer]
753  for v in self.varExp.split(","):
754  varlist=self.parseVarExpression(v)
755  varlist += cutlist
756  varlist=sorted(list(set(varlist)))
757  #for drawer in self.drawer.split(","):
758  # drlist=[drawer]
759  if not (t and drlist==drlistprev and varlist==varlistprev):
760  t = self.dataGrabber.getDCSTree(self.iovBeg, self.iovEnd, drlist, varlist, lastOnly)
761  drlistprev=drlist
762  varlistprev=varlist
763  if t and t.GetEntries()>0:
764  var = v
765  cut = self.cutReplace(self.cutExp,var)
766  for va in varlist:
767  var = var.replace(va,drawer+"."+va)
768  cut = cut.replace(va,drawer+"."+va)
769  var = var.replace(drawer+"."+drawer,drawer)
770  cut = cut.replace(drawer+"."+drawer,drawer)
771  var = var.replace("Set."+drawer,"Set")
772  cut = cut.replace("Set."+drawer,"Set")
773  print ("var is",var)
774  print ("cut is",cut)
775  t.Draw(var,cut,"goff")
776  h = ROOT.gDirectory.Get("htemp")
777  if h:
778  if cut!="":
779  reslist.append((var+" CUT "+cut,self.rangeStr,h.GetEntries(),h.GetMean(),h.GetRMS()))
780  else:
781  reslist.append((var,self.rangeStr,h.GetEntries(),h.GetMean(),h.GetRMS()))
782  else:
783  reslist.append((var,self.rangeStr,-1,0.0,0.0))
784 
785  if lastOnly:
786  for res in reslist:
787  print ("%-25s %s Last %-9.3f" % (res[0],res[1],res[3]))
788  else:
789  for res in reslist:
790  print ("%-25s %s Nentries %-7d Mean %-9.3f RMS %-9.4f" % res)
791  return 0
792 
793 
794 #================================================================================================
795 
796 
797 #==== interactive use
798 if __name__ == "__main__":
799 
800  #=== check if we are in batch mode
801  batch = False
802  if "-b" in sys.argv:
803  batch=True
804  sys.argv.remove("-b")
805 
806 
807  #=== check if we are in Oracle mode
808  useCool = True
809  if "--oracle" in sys.argv:
810  useCool=False
811  sys.argv.remove("--oracle")
812  if "--cool" in sys.argv:
813  useCool=True
814  sys.argv.remove("--cool")
815 
816  #=== check if we are in testbeam mode
817  useTestBeam = False
818  if "--testbeam" in sys.argv:
819  useTestBeam=True
820  sys.argv.remove("--testbeam")
821 
822  #=== check if we are in hvonly mode
823  hvonly = False
824  if "--hvonly" in sys.argv:
825  hvonly=True
826  sys.argv.remove("--hvonly")
827 
828  #=== check if we are in verbose mode
829  verbose = False
830  if "-v" in sys.argv:
831  verbose=True
832  sys.argv.remove("-v")
833 
834  #=== catch invalid commands
835  cmd = sys.argv[1]
836  if not(cmd=="plot" or cmd=="diff" or cmd=="diffprof" or cmd=="prof" or cmd=="dist" or cmd=="tree" or cmd=="mean" or cmd=="last" or cmd=="scan"):
837  print (""" Please use one of the following commands: plot, diff, dist, tree, mean, last, scan !""")
838  sys.exit(1)
839 
840  #=== command is recognized, we go on....
841  ROOT.gROOT.SetBatch()
842  dp = TileDCSDataPlotter(sys.argv, useCool, useTestBeam, verbose, putDuplicates=(cmd =="mean" or cmd =="dist"), hvonly=hvonly)
843 
844  #=== no graphics if only get tree
845  if cmd == "tree":
846  t = dp.getTree()
847  f = ROOT.TFile(dp.outName+".root", "recreate")
848  t.Write()
849  f.Close()
850 
851  elif cmd == "scan":
852  dp.scan()
853 
854  #=== distribution plot (using weights)
855  elif cmd =="mean":
856  dp.printDistributionStat()
857  elif cmd =="last":
858  dp.printDistributionStat(True)
859 
860  else:
861  #=== graphics output below -> configure style and canvas
862  ROOT.gROOT.SetStyle("Plain")
863  ROOT.gROOT.ForceStyle()
864  if cmd =="diff" or cmd=="diffprof" or cmd=="prof":
865  can = TCanvas("c_TileDCSDataPlotter","c_TileDCSDataPlotter",0,0,1200,900)
866  else:
867  can = TCanvas("c_TileDCSDataPlotter","c_TileDCSDataPlotter")
868 
869  #=== simple timeline plot
870  if cmd =="plot":
871  can.SetGridx()
872  can.SetGridy()
873  hh = dp.getTimelinePlot()
874  if len(hh)>0:
875  h0 = TH1D(hh[0])
876  tt=dp.rangeStr
877  if len(sys.argv)>6:
878  tt+=" with cut "+sys.argv[6]
879  XA=h0.GetXaxis()
880  tx=XA.GetTitle()
881  ttt=tt+";"+tx+";"+sys.argv[2]+" :: "+sys.argv[3]
882  h0.SetTitle(ttt)
883  if len(hh)>2:
884  ymin=h0.GetMinimum()
885  ymax=h0.GetMaximum()
886  max1=ymax+ymax-ymin
887  h0.SetMaximum(max1)
888  h0.Draw("HIST")
889  leg = TLegend(0.1,0.55,0.9,0.9)
890  for h in hh:
891  h.Draw("HISTSAME")
892  tit=h.GetTitle()
893  leg.AddEntry(h,tit,"l")
894  if len(hh)>2:
895  if len(hh)>30:
896  leg.SetNColumns(4)
897  elif len(hh)>20:
898  leg.SetNColumns(3)
899  elif len(hh)>5:
900  leg.SetNColumns(2)
901  leg.Draw()
902 
903  #=== simple diff plot
904  if cmd =="diff":
905  h = dp.getDiffPlot(1)
906  h.Draw('COLZ')
907 
908  #=== simple diff profile plot
909  if cmd =="diffprof":
910  h = dp.getDiffPlot(2)
911  h.Draw('COLZ')
912 
913  #=== simple diff profile plot
914  if cmd =="prof":
915  h = dp.getDiffPlot(3)
916  h.Draw('COLZ')
917 
918  #=== distribution plot (using weights)
919  elif cmd =="dist":
920  hh = dp.getDistributionPlot()
921  if len(hh)>0:
922  dim = dp.varExp.split(',')[0].count(':')
923  opt=""
924  pr=(len(hh)==1)
925  for h in hh:
926  if dim==0:
927  h.Draw("EHIST"+opt)
928  if pr:
929  print ("%s %s Nentries %d Mean %7.3f RMS %8.4f" % \
930  (h.GetXaxis().GetTitle(),h.GetTitle(),h.GetEntries(),h.GetMean(),h.GetRMS()))
931  else:
932  pr=True
933  elif dim==1:
934  print ("2D plot, opt ",opt)
935  h.Draw("BOX"+opt)
936  else:
937  h.Draw(opt)
938  opt="SAME"
939 
940  #=== save output in eps and png
941  can.Print(dp.outName+"_"+cmd+".eps")
942  can.Print(dp.outName+"_"+cmd+".png")
943 
944  #=== display plot
945  if not batch:
946  os.system("display "+dp.outName+"_"+cmd+".png")
DerivationFramework::TriggerMatchingUtils::sorted
std::vector< typename R::value_type > sorted(const R &r, PROJ proj={})
Helper function to create a sorted vector from an unsorted range.
replace
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition: hcg.cxx:307
TileDCSDataPlotter.TileDCSDataPlotter.printDistributionStatAll
def printDistributionStatAll(self)
Definition: TileDCSDataPlotter.py:673
TileDCSDataPlotter.TileDCSDataPlotter.iovEnd
iovEnd
Definition: TileDCSDataPlotter.py:40
TileDCSDataPlotter.TileDCSDataPlotter.cmd
cmd
Definition: TileDCSDataPlotter.py:34
TileDCSDataPlotter.TileDCSDataPlotter.drawer
drawer
Definition: TileDCSDataPlotter.py:35
TileDCSDataPlotter.TileDCSDataPlotter.useTestBeam
useTestBeam
Definition: TileDCSDataPlotter.py:24
XMLtoHeader.count
count
Definition: XMLtoHeader.py:84
TileDCSDataPlotter.TileDCSDataPlotter.varExp
varExp
Definition: TileDCSDataPlotter.py:36
TileDCSDataPlotter.TileDCSDataPlotter.getDiffPlot
def getDiffPlot(self, opt)
Definition: TileDCSDataPlotter.py:439
TileDCSDataPlotter.TileDCSDataPlotter.getDistributionPlot
def getDistributionPlot(self)
Definition: TileDCSDataPlotter.py:551
TileDCSDataPlotter.TileDCSDataPlotter.info
info
Definition: TileDCSDataPlotter.py:43
TileDCSDataPlotter.TileDCSDataPlotter.rangeStr
rangeStr
Definition: TileDCSDataPlotter.py:60
TileDCSDataPlotter.TileDCSDataPlotter.printDistributionStat
def printDistributionStat(self, lastOnly=False)
Definition: TileDCSDataPlotter.py:699
TileDCSDataPlotter.TileDCSDataPlotter.iovBeg
iovBeg
Definition: TileDCSDataPlotter.py:39
TileDCSDataPlotter.TileDCSDataPlotter.parseVarExpression
def parseVarExpression(self, varExpression)
Definition: TileDCSDataPlotter.py:78
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:194
TileDCSDataPlotter.TileDCSDataPlotter.__init__
def __init__(self, argv, useCool, useTestBeam, verbose, dbstring=None, putDuplicates=False, hvonly=False)
Definition: TileDCSDataPlotter.py:18
histSizes.list
def list(name, path='/')
Definition: histSizes.py:38
TileDCSDataPlotter.TileDCSDataPlotter.outName
outName
Definition: TileDCSDataPlotter.py:50
CxxUtils::set
constexpr std::enable_if_t< is_bitmask_v< E >, E & > set(E &lhs, E rhs)
Convenience function to set bits in a class enum bitmask.
Definition: bitmask.h:232
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:25
TileDCSDataPlotter.TileDCSDataPlotter.cutReplace
def cutReplace(self, incut, var)
Definition: TileDCSDataPlotter.py:243
TCS::join
std::string join(const std::vector< std::string > &v, const char c=',')
Definition: Trigger/TrigT1/L1Topo/L1TopoCommon/Root/StringUtils.cxx:10
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
pickleTool.object
object
Definition: pickleTool.py:29
str
Definition: BTagTrackIpAccessor.cxx:11
TileDCSDataPlotter.TileDCSDataPlotter
Definition: TileDCSDataPlotter.py:15
TileDCSDataPlotter.TileDCSDataPlotter.scantree
def scantree(self, t, treevar, cut)
Definition: TileDCSDataPlotter.py:288
TileDCSDataPlotter.TileDCSDataPlotter.getTree
def getTree(self, drawer=None, var=None, lastOnly=False, firstAndLast=False)
Definition: TileDCSDataPlotter.py:148
TileDCSDataPlotter.TileDCSDataPlotter.cutExp
cutExp
Definition: TileDCSDataPlotter.py:45
Trk::split
@ split
Definition: LayerMaterialProperties.h:38
TileDCSDataPlotter.TileDCSDataPlotter.getTimelinePlot
def getTimelinePlot(self)
Definition: TileDCSDataPlotter.py:336
TileDCSDataPlotter.TileDCSDataPlotter.scan
def scan(self)
Definition: TileDCSDataPlotter.py:267
TileDCSDataPlotter.TileDCSDataPlotter.useCool
useCool
Definition: TileDCSDataPlotter.py:21
TileDCSDataPlotter.TileDCSDataPlotter.dataGrabber
dataGrabber
Definition: TileDCSDataPlotter.py:42