ATLAS Offline Software
Loading...
Searching...
No Matches
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
6import sys, os
7import time, datetime
8import ROOT
9import logging
10from ROOT import TCanvas, TH1D, TH2D, TArrayD, TLegend
11from TileCoolDcs.TileDCSDataGrabber import TileDCSDataGrabber
12from 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 #_______________________________________________________________________________________
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
798if __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")
void print(char *figname, TCanvas *c1)
__init__(self, argv, useCool, useTestBeam, verbose, dbstring=None, putDuplicates=False, hvonly=False)
getTree(self, drawer=None, var=None, lastOnly=False, firstAndLast=False)
STL class.
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition hcg.cxx:310
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition hcg.cxx:177