Belle II Software  release-05-01-25
dqm.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 import sys
4 from array import array
5 from ROOT import gROOT, gStyle
6 from ROOT import TFile, TF1, TH1D, TCanvas
7 from ROOT import TH2D, TGraph, TLine, TBox
8 from ROOT import kFullCircle, kOpenCircle
9 from ROOT import kRed, kBlue, kGreen
10 from ROOT import TGraphErrors
11 import argparse
12 
13 nWires = [160, 160, 160, 160, 160, 160, 160, 160,
14  160, 160, 160, 160, 160, 160,
15  192, 192, 192, 192, 192, 192,
16  224, 224, 224, 224, 224, 224,
17  256, 256, 256, 256, 256, 256,
18  288, 288, 288, 288, 288, 288,
19  320, 320, 320, 320, 320, 320,
20  352, 352, 352, 352, 352, 352,
21  384, 384, 384, 384, 384, 384]
22 
23 nWiresSum = []
24 sum = 0
25 for w in nWires:
26  sum = sum + w
27  nWiresSum.append(sum)
28 
29 nWiresSL = [160 * 8, 160 * 6, 192 * 6, 224 * 6, 256 * 6, 288 * 6,
30  320 * 6, 352 * 6, 384 * 6]
31 
32 rfClock = 1.017774
33 refT0 = 4905.0 * rfClock
34 refMPV = 80
35 
36 
37 class DQM():
38 
39  """
40  DQM class.
41  """
42 
43  def __init__(self, fname='output.root'):
44  """
45  call constructor of base class, required.
46  """
47 
48  super(DQM, self).__init__()
49 
50 
51  self.f = TFile(fname)
52 
53  self.type = 'adc'
54 
55  self.histADC = [self.f.Get('h' + str(100000 + i))
56  for i in range(14336)]
57 
58  self.histTDC = [self.f.Get('h' + str(200000 + i))
59  for i in range(14336)]
60 
61  self.histHit = [self.f.Get('h' + str(400000 + i))
62  for i in range(56)]
63 
64  self.lines = []
65  for h in self.histTDC:
66  y = h.GetMaximum()
67  line = TLine(refT0, 0, refT0, y)
68  line.SetLineColor(2)
69  self.lines.append(line)
70 
71 
72  self.lineMPVs = []
73  for h in self.histADC:
74  y = h.GetMaximum()
75  line = TLine(refMPV, 0, refMPV, y)
76  line.SetLineColor(2)
77  self.lineMPVs.append(line)
78  # self.histADCinLayer = [self.f.Get('h' + str(500000 + i))
79  # for i in range(56)]
80 
81 
82  self.sig = TF1("sig", "landau", 0, 200)
83  # self.sig = TF1("sig", "landau+expo(3)", 0, 200)
84  # self.sig.SetParameters(300.0,60.0,20.0,1000,-1.0)
85 
86  self.ft0 = TF1("ft0", "[0]+[1]*(exp([2]*([3]-x))/(1+exp(-([4]-x)/[5])))", 2000, 4000)
87  self.ft0.SetParameters(0, 10, 0, 0, 3800, 3.)
88  self.ft0.FixParameter(0, 0.)
89 
90  self.m_fitStatus = False
91 
92  self.canvas = TCanvas("canvas", "canvas", 800, 800)
93 
94  self.hid = 0
95 
96  self.ndiv = 1
97 
98  self.par = [-1.0 for i in range(14336)]
99 
100  self.parADCinLayer = [-1.0 for i in range(56)]
101 
102  self.parT0 = [0.0 for i in range(14336)]
103 
104  self.h2 = TH2D("h2d", "MPV of all ADCs", 15000,
105  -500, 14500, 100, 0, 200)
106 
107  self.h2.SetStats(0)
108 
109  self.h2.GetXaxis().SetTitle('Cell ID')
110 
111  self.h2.GetYaxis().SetTitle('MPV')
112 
113  self.h2ADCvsLayer = TH2D("h2dl", "MPV for every Layer", 56,
114  0, 56, 100, 0, 200)
115 
116  self.h2ADCvsLayer.SetStats(0)
117 
118  self.h2ADCvsLayer.GetXaxis().SetTitle('Layer')
119 
120  self.h2ADCvsLayer.GetYaxis().SetTitle('MPV (adc count)')
121 
122  self.x = array("d", [i for i in range(14336)])
123 
124  self.l = array("d", [i for i in range(56)])
125 
126  self.graph = TGraph(len(self.x))
127 
128  self.graph.SetMarkerStyle(kFullCircle)
129 
130  self.graph.SetMarkerSize(0.3)
131 
132 
133  self.graph2 = TGraph(len(self.l))
134 
135  self.graph2.SetMarkerStyle(kFullCircle)
136 
137  self.graph2.SetMarkerSize(1.0)
138 
139  self.line = [TLine(0, 0, 0, 200)]
140 
141  x0 = 0
142  for i in range(9):
143  x0 = x0 + nWiresSL[i]
144  line = TLine(x0, 0, x0, 200)
145  self.line.append(line)
146  for l in self.line:
147  l.SetLineColorAlpha(8, 0.5)
148  l.SetLineStyle(2)
149 
150  def fitADC(self, xmin=8, xmax=200):
151  """
152  Fit all ADC histgrams.
153  """
154  if self.m_fitStatus is True:
155  print("Fitting for ADC has been already applied.")
156  else:
157 
158  for (i, h) in enumerate(self.histADC):
159  if h.GetEntries() > 0:
160  h.Fit(self.sig, "Q", "", xmin, xmax)
161  self.par[i] = self.sig.GetParameter(1)
162  self.m_fitStatus = True
163 
164  def getHistID(self, lay=0, wire=0):
165  """
166  Get Hist ID from (layer, wire) ID.
167  Return values : hist ID (cell ID)
168  """
169  hid = nWiresSum[lay - 1] + wire if lay > 0 else wire
170  return hid
171 
172  def getLayerWireID(self, hid=0):
173  """
174  Get (layer, wire) ID from cell ID.
175  Return values : [layer, wire]
176  """
177  if hid < nWiresSum[0]:
178  return [0, hid]
179  else:
180  layer = 0
181  wire = 0
182  for (i, wsum) in enumerate(nWiresSum):
183  diff = hid - wsum
184  if diff > 0 and diff < nWires[i]:
185  layer = i + 1
186  wire = diff
187  break
188  return [layer, wire]
189 
190  def drawADC(self, l=0, w=0):
191  """
192  Draw ADC histgrams w.r.t (lay,wire).
193  """
194  i = self.getHistID(l, w)
195  for j in range(self.ndiv):
196  self.hid = i + j
197  self.canvas.cd(j + 1)
198  self.histADC[self.hid].Draw()
199  self.lineMPVs[self.hid].Draw()
200 
201  self.type = 'adc'
202  self.canvas.Update()
203 
204  def drawTDC(self, l=0, w=0):
205  """
206  Draw TDC histgrams w.r.t (lay,wire).
207  """
208  i = self.getHistID(l, w)
209  for j in range(self.ndiv):
210  self.hid = i + j
211  self.canvas.cd(j + 1)
212  self.histTDC[self.hid].Draw()
213  self.lines[self.hid].Draw()
214 
215  self.canvas.Update()
216  self.type = 'tdc'
217 
218  def drawHit(self, l=0):
219  """
220  Draw Hit histgrams w.r.t layer ID.
221  """
222  for j in range(self.ndiv):
223  self.hid = l + j
224  if self.hid > 55:
225  break
226  self.canvas.cd(j + 1)
227  self.histHit[self.hid].Draw()
228  self.canvas.Update()
229  self.type = 'hit'
230 
231  def drawTDCByCell(self, i):
232  """
233  Draw TDC histgrams w.r.t cell ID (0-14336).
234  """
235  for j in range(self.ndiv):
236  self.hid = i + j
237  self.canvas.cd(j + 1)
238  self.histTDC[self.hid].Draw()
239  self.lines[self.hid].Draw()
240 
241  self.type = 'tdc'
242  self.canvas.Update()
243 
244  def drawADCByCell(self, i):
245  """
246  Draw ADC histgrams w.r.t cell ID (0-14336).
247  """
248  for j in range(self.ndiv):
249  self.hid = i + j
250  self.canvas.cd(j + 1)
251  self.histADC[self.hid].Draw()
252  self.lineMPVs[self.hid].Draw()
253 
254  self.type = 'adc'
255  self.canvas.Update()
256 
257  def next(self):
258  """
259  Show next plots.
260  """
261  self.hid = self.hid + 1
262  if self.type == 'adc':
263  self.canvas.Clear('d')
264  self.drawADCByCell(self.hid)
265  elif self.type == 'tdc':
266  self.canvas.Clear('d')
267  self.drawTDCByCell(self.hid)
268  elif self.type == 'hit':
269  self.canvas.Clear('d')
270  self.drawHit(self.hid)
271  else:
272  print('Undefined type: ' + type)
273 
274  def div(self, i=1, j=1):
275  """
276  Divide Tcanvas by (i,j).
277  """
278  self.canvas.Clear()
279  self.canvas.Divide(i, j)
280  self.ndiv = i * j
281 
282  def mpv(self):
283  """
284  Show the MPV of ADC distribution
285  for all wires.
286  """
287  self.canvas.Clear()
288 
289  for (i, p) in enumerate(self.par):
290  self.graph.SetPoint(i, self.x[i], p)
291 
292  self.h2.Draw()
293  for line in self.line:
294  line.Draw()
295  self.graph.Draw("P")
296  self.canvas.Update()
297 
298  def xrange(self, xmin=-500, xmax=14500):
299  """
300  Set x range of MPV plot.
301  """
302  self.h2.GetXaxis().SetRangeUser(xmin, xmax)
303 
304  def xrangeHit(self, xmin=0, xmax=350):
305  """
306  Set x range of Hit distributions.
307  """
308  for h in self.histHit:
309  h.GetXaxis().SetRangeUser(xmin, xmax)
310 
311  def xrangeTDC(self, xmin=0, xmax=4000):
312  """
313  Set x range of TDC distributions.
314  """
315  for h in self.histTDC:
316  h.GetXaxis().SetRangeUser(xmin, xmax)
317 
318  def xrangeADC(self, xmin=0, xmax=200):
319  """
320  Set x range of ADC distributions.
321  """
322  for h in self.histADC:
323  h.GetXaxis().SetRangeUser(xmin, xmax)
324 
325  def print(self, fname='test.png'):
326  """
327  Print the current plot.
328  """
329  self.canvas.Print(fname)
330 
331  def ne(self):
332  """
333  Alias to next()
334  """
335  self.next()
336 
337  def dh(self, l):
338  """
339  Alias to drawHit()
340  """
341  self.drawHit(l)
342 
343  def da(self, l, w):
344  """
345  Alias to drawADC()
346  """
347  self.drawADC(l, w)
348 
349  def dt(self, l, w):
350  """
351  Alias to drawTDC()
352  """
353  self.drawTDC(l, w)
354 
355 
356 if __name__ == "__main__":
357  # Make the parameters accessible form the outside.
358 
359  parser = argparse.ArgumentParser()
360  parser.add_argument('input', help='Input file to be processed (unpacked CDC data).')
361  args = parser.parse_args()
362  dqm = DQM(args.input)
dqm.DQM.da
def da(self, l, w)
Definition: dqm.py:343
dqm.DQM.line
line
Marker style.
Definition: dqm.py:139
dqm.DQM.x
x
Set stats.
Definition: dqm.py:122
dqm.DQM.mpv
def mpv(self)
Definition: dqm.py:282
dqm.DQM.graph
graph
TGraph.
Definition: dqm.py:126
dqm.DQM.getHistID
def getHistID(self, lay=0, wire=0)
Definition: dqm.py:164
dqm.DQM
Definition: dqm.py:37
dqm.DQM.histTDC
histTDC
TDC histograms.
Definition: dqm.py:58
dqm.DQM.xrangeTDC
def xrangeTDC(self, xmin=0, xmax=4000)
Definition: dqm.py:311
dqm.DQM.xrange
def xrange(self, xmin=-500, xmax=14500)
Definition: dqm.py:298
dqm.DQM.h2
h2
histogram
Definition: dqm.py:104
dqm.DQM.drawADC
def drawADC(self, l=0, w=0)
Definition: dqm.py:190
dqm.DQM.drawHit
def drawHit(self, l=0)
Definition: dqm.py:218
dqm.DQM.drawTDC
def drawTDC(self, l=0, w=0)
Definition: dqm.py:204
dqm.DQM.drawADCByCell
def drawADCByCell(self, i)
Definition: dqm.py:244
dqm.DQM.ne
def ne(self)
Definition: dqm.py:331
dqm.DQM.ndiv
ndiv
Number of division for canvas.
Definition: dqm.py:96
dqm.DQM.hid
hid
histogram ID
Definition: dqm.py:94
dqm.DQM.sig
sig
Fitting function for ADC histogram.
Definition: dqm.py:82
dqm.DQM.h2ADCvsLayer
h2ADCvsLayer
Set stats.
Definition: dqm.py:113
dqm.DQM.canvas
canvas
canvas
Definition: dqm.py:92
dqm.DQM.drawTDCByCell
def drawTDCByCell(self, i)
Definition: dqm.py:231
dqm.DQM.type
type
plot type (adc/tdc/hit)
Definition: dqm.py:53
dqm.DQM.dh
def dh(self, l)
Definition: dqm.py:337
dqm.DQM.xrangeHit
def xrangeHit(self, xmin=0, xmax=350)
Definition: dqm.py:304
dqm.DQM.div
def div(self, i=1, j=1)
Definition: dqm.py:274
dqm.DQM.f
f
input file name
Definition: dqm.py:51
dqm.DQM.lineMPVs
lineMPVs
Line for guide of ADC MPV.
Definition: dqm.py:72
dqm.DQM.ft0
ft0
Fitting function for TDC histogram.
Definition: dqm.py:86
dqm.DQM.graph2
graph2
Marker style.
Definition: dqm.py:133
dqm.DQM.fitADC
def fitADC(self, xmin=8, xmax=200)
Definition: dqm.py:150
dqm.DQM.dt
def dt(self, l, w)
Definition: dqm.py:349
dqm.DQM.parADCinLayer
parADCinLayer
MPV values w.r.t.
Definition: dqm.py:100
dqm.DQM.getLayerWireID
def getLayerWireID(self, hid=0)
Definition: dqm.py:172
dqm.DQM.xrangeADC
def xrangeADC(self, xmin=0, xmax=200)
Definition: dqm.py:318
dqm.DQM.parT0
parT0
T0 values.
Definition: dqm.py:102
dqm.DQM.__init__
def __init__(self, fname='output.root')
Definition: dqm.py:43
dqm.DQM.next
def next(self)
Definition: dqm.py:257
dqm.DQM.print
def print(self, fname='test.png')
Definition: dqm.py:325
dqm.DQM.par
par
MPV values.
Definition: dqm.py:98
dqm.DQM.histADC
histADC
ADC histograms.
Definition: dqm.py:55
dqm.DQM.l
l
array layer
Definition: dqm.py:124
dqm.DQM.histHit
histHit
Hit distribution histograms.
Definition: dqm.py:61
dqm.DQM.lines
lines
Line for guide of TDC T0.
Definition: dqm.py:64
dqm.DQM.m_fitStatus
m_fitStatus
Fit status True if fitting has been finished.
Definition: dqm.py:90