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
15class TileDCSDataPlotter (object):
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