Belle II Software  release-05-01-25
CoGCalibration_utils_checkCalibration.py
1 # !/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 
4 #
5 # util module to check SVD CoG Calibration stored in a localDB
6 #
7 # called by SVDCoGTimeCalibrationCheck script in
8 # svd/scripts/caf/SVDCoGTimeCalibrationCheck.py
9 #
10 
11 
12 from basf2 import *
13 from svd import *
14 import ROOT
15 from ROOT import Belle2, TFile, TTree, TH1F, TH2F, TH2D, TGraph, TFitResultPtr
16 from ROOT import TROOT, gROOT, TF1, TMath, gStyle, gDirectory, TTree
17 import os
18 # import numpy
19 import math
20 import random
21 from array import array
22 import basf2
23 import sys
24 
25 import matplotlib.pyplot as plt
26 import numpy as np
27 from numpy.linalg import inv, pinv
28 from numpy.linalg import det, norm, cond
29 
30 cdc_Time0 = "EventT0"
31 svd_Clusters = "SVDClustersFromTracks"
32 svd_EventInfo = "SVDEventInfo"
33 # svd_EventMD = "EventMetaData"
34 
35 gROOT.SetBatch(True)
36 
37 # mode = True
38 
39 
41  """
42  Python class used for checking SVD CoG Calibration stored in a localDB
43  """
44 
45  def fillLists(self, svdClusterFromTracks):
46  """
47  Function that fill the lists needed for the check of the calibration
48 
49  parameters:
50  svdClusterFromTracks (SVDCluster): Cluster related to tracks
51  """
52  timeCluster = svdClusterFromTracks.getClsTime()
53  snrCluster = svdClusterFromTracks.getSNR()
54  sizeCluster = svdClusterFromTracks.getSize()
55  chargeCluster = svdClusterFromTracks.getCharge()
56  layerCluster = svdClusterFromTracks.getSensorID().getLayerNumber()
57  layerIndex = layerCluster - 3
58  sensorCluster = svdClusterFromTracks.getSensorID().getSensorNumber()
59  sensorIndex = sensorCluster - 1
60  ladderCluster = svdClusterFromTracks.getSensorID().getLadderNumber()
61  ladderIndex = ladderCluster - 1
62  sideCluster = svdClusterFromTracks.isUCluster()
63  sideIndex = 0
64  if sideCluster:
65  sideIndex = 1
66 
67  hasTimezero = self.cdcEventT0.hasEventT0()
68  if hasTimezero:
69  tZero = self.cdcEventT0.getEventT0()
70  tZeroError = self.cdcEventT0.getEventT0Uncertainty()
71 
72  # filling histograms
73  resHist = self.resList[layerIndex][ladderIndex][sensorIndex][sideIndex]
74  resHist.Fill(timeCluster - tZero)
75  spHist = self.spList[layerIndex][ladderIndex][sensorIndex][sideIndex]
76  spHist.Fill(timeCluster, tZero)
77  cogHist = self.cogList[layerIndex][ladderIndex][sensorIndex][sideIndex]
78  cogHist.Fill(timeCluster)
79  cdcHist = self.cdcList[layerIndex][ladderIndex][sensorIndex][sideIndex]
80  cdcHist.Fill(tZero)
81  snrHist = self.snrList[layerIndex][ladderIndex][sensorIndex][sideIndex]
82  snrHist.Fill(snrCluster)
83  sizeHist = self.sizeList[layerIndex][ladderIndex][sensorIndex][sideIndex]
84  sizeHist.Fill(sizeCluster)
85  chargeHist = self.chargeList[layerIndex][ladderIndex][sensorIndex][sideIndex]
86  chargeHist.Fill(chargeCluster/1000.)
87  cdcErrorHist = self.cdcErrorList[layerIndex][ladderIndex][sensorIndex][sideIndex]
88  cdcErrorHist.Fill(tZeroError)
89 
90 
91  self.NTOT = self.NTOT + 1
92 
93  def set_localdb(self, localDB):
94  """
95  Function that allows to set the localDB
96 
97  parameters:
98  localDB (str): Name of the localDB used
99  """
100 
101  self.localdb = localDB
102 
103  def set_run_number(self, run):
104  """
105  Function that allows to save the run number
106 
107  parameters:
108  run (int): run number
109  """
110 
111  self.runnumber = run
112 
113  def set_exp_number(self, exp):
114  """
115  Function that allows to save the experiment number
116 
117  parameters:
118  exp (int): experiment number
119  """
120 
121  self.expnumber = exp
122 
123  def initialize(self):
124  """
125  Initialize object (histograms, lists, ...) used by the class
126  """
127 
128 
129  self.outputFileName = "../caf/tree/SVDCoGCalibrationCheck_Exp" + \
130  str(self.expnumber) + "_Run" + str(self.runnumber) + ".root"
131 
133  self.resList = []
134 
135  self.spList = []
136 
137  self.cogList = []
138 
139  self.cdcList = []
140 
141  self.snrList = []
142 
143  self.sizeList = []
144 
145  self.chargeList = []
146 
147  self.cdcErrorList = []
148 
150 
151 
152  self.Evt = 0
153  for layer in geoCache.getLayers(Belle2.VXD.SensorInfoBase.SVD):
154  layerList0 = []
155  layerList1 = []
156  layerList2 = []
157  layerList3 = []
158  layerList4 = []
159  layerList5 = []
160  layerList6 = []
161  layerList7 = []
162 
163  self.resList.append(layerList0)
164  self.spList.append(layerList1)
165  self.cogList.append(layerList2)
166  self.cdcList.append(layerList3)
167  self.snrList.append(layerList4)
168  self.sizeList.append(layerList5)
169  self.chargeList.append(layerList6)
170  self.cdcErrorList.append(layerList7)
171 
172  for ladder in geoCache.getLadders(layer):
173  ladderList0 = []
174  ladderList1 = []
175  ladderList2 = []
176  ladderList3 = []
177  ladderList4 = []
178  ladderList5 = []
179  ladderList6 = []
180  ladderList7 = []
181 
182  layerList0.append(ladderList0)
183  layerList1.append(ladderList1)
184  layerList2.append(ladderList2)
185  layerList3.append(ladderList3)
186  layerList4.append(ladderList4)
187  layerList5.append(ladderList5)
188  layerList6.append(ladderList6)
189  layerList7.append(ladderList7)
190 
191  for sensor in geoCache.getSensors(ladder):
192  sensorList0 = []
193  sensorList1 = []
194  sensorList2 = []
195  sensorList3 = []
196  sensorList4 = []
197  sensorList5 = []
198  sensorList6 = []
199  sensorList7 = []
200 
201  ladderList0.append(sensorList0)
202  ladderList1.append(sensorList1)
203  ladderList2.append(sensorList2)
204  ladderList3.append(sensorList3)
205  ladderList4.append(sensorList4)
206  ladderList5.append(sensorList5)
207  ladderList6.append(sensorList6)
208  ladderList7.append(sensorList7)
209 
210  for i in geoCache.getLayers(Belle2.VXD.SensorInfoBase.SVD):
211  layerN = i.getLayerNumber()
212  li = layerN - 3
213  for j in geoCache.getLadders(i):
214  ladderN = j.getLadderNumber()
215  ldi = ladderN - 1
216  for k in geoCache.getSensors(j):
217  sensorN = k.getSensorNumber()
218  si = sensorN - 1
219  for s in range(2):
220  self.resList[li][ldi][si].append(TH1F("res" + "_" + str(layerN) + "." +
221  str(ladderN) + "." + str(sensorN) + "." +
222  str(s), " ", 200, -100, 100))
223  self.spList[li][ldi][si].append(TH2D("sp" + "_" + str(layerN) + "." +
224  str(ladderN) + "." + str(sensorN) + "." +
225  str(s), " ", 300, -150, 150, 300, -150, 150))
226  self.cogList[li][ldi][si].append(TH1F("cog" + "_" + str(layerN) + "." +
227  str(ladderN) + "." + str(sensorN) + "." + str(s),
228  " ", 200, -100, 100))
229  self.cdcList[li][ldi][si].append(TH1F("cdc" + "_" + str(layerN) + "." +
230  str(ladderN) + "." + str(sensorN) + "." + str(s),
231  " ", 200, -100, 100))
232  self.snrList[li][ldi][si].append(TH1F("snr" + "_" + str(layerN) + "." +
233  str(ladderN) + "." + str(sensorN) + "." + str(s), " ", 100, 0, 100))
234  self.sizeList[li][ldi][si].append(TH1F("size" + "_" + str(layerN) + "." +
235  str(ladderN) + "." + str(sensorN) + "." + str(s), " ", 20, 0, 20))
236  self.chargeList[li][ldi][si].append(TH1F("charge" + "_" + str(layerN) + "." +
237  str(ladderN) + "." + str(sensorN) + "." + str(s),
238  " ", 100, 0, 200))
239  self.cdcErrorList[li][ldi][si].append(TH1F("cdcError" + "_" + str(layerN) + "." +
240  str(ladderN) + "." + str(sensorN) + "." + str(s),
241  " ", 200, 0, 50))
242 
243 
244  self.EventT0Hist = TH1F("EventT0", " ", 160, -40, 40)
245 
246 
247  self.gaus = TF1("gaus", 'gaus(0)', -150, 150)
248 
249  self.pol1 = TF1("pol1", "[0] + [1]*x", -30, 30)
250 
251  self.pol3 = TF1("pol3", "[0] + [1]*x + [2]*x*x + [3]*x*x*x", -50, 50)
252 
253  self.NTOT = 0
254 
255  def event(self):
256  """
257  Function that allows to cicle on the events
258  """
259  self.Evt = self.Evt + 1
260 
261  # fill EventT0 histogram
262 
263  self.cdcEventT0 = Belle2.PyStoreObj(cdc_Time0)
264  if self.cdcEventT0.hasEventT0():
265  et0 = self.EventT0Hist
266  et0.Fill(self.cdcEventT0.getEventT0())
267 
268  # fill plots
269  svdCluster_list = Belle2.PyStoreArray(svd_Clusters)
270  svd_evtInfo = Belle2.PyStoreObj(svd_EventInfo)
271  clsTB = svd_evtInfo.getModeByte().getTriggerBin()
272  self.TB = ord(clsTB)
273 
274  for svdCluster in svdCluster_list:
275  self.fillLists(svdCluster)
276 
277  def terminate(self):
278  """
279  Terminates te class and produces the output rootfile
280  """
281 
282  layerNumberTree = np.zeros(1, dtype=int)
283  ladderNumberTree = np.zeros(1, dtype=int)
284  sensorNumberTree = np.zeros(1, dtype=int)
285  sideTree = np.zeros(1, dtype=int)
286  mean = np.zeros(1, dtype=float)
287  meanerr = np.zeros(1, dtype=float)
288  width = np.zeros(1, dtype=float)
289  widtherr = np.zeros(1, dtype=float)
290  cogmean = np.zeros(1, dtype=float)
291  cogmeanerr = np.zeros(1, dtype=float)
292  runnumber = np.zeros(1, dtype=int)
293  runnumber[0] = int(self.runnumber)
294  expnumber = np.zeros(1, dtype=int)
295  expnumber[0] = int(self.expnumber)
296  evttime = np.zeros(1, dtype=float)
297  jitter = np.zeros(1, dtype=float)
298  cdcErrorMean = np.zeros(1, dtype=float)
299  clsSize = np.zeros(1, dtype=float)
300  clsCharge = np.zeros(1, dtype=float)
301  clsSNR = np.zeros(1, dtype=float)
302 
303  tfile = TFile(self.outputFileName, 'recreate')
304  tfile.cd()
305  tree = TTree("cog", "tree")
306  tree.Branch("Layer", layerNumberTree, "Layer/I")
307  tree.Branch("Ladder", ladderNumberTree, "Ladder/I")
308  tree.Branch("Sensor", sensorNumberTree, "Sensor/I")
309  tree.Branch("Side", sideTree, "Side/I")
310  tree.Branch("ResMean", mean, "ResMean/D")
311  tree.Branch("ResMeanErr", meanerr, "ResMeanErr/D")
312  tree.Branch("ResWidth", width, "ResWidth/D")
313  tree.Branch("ResWidthErr", widtherr, "ResWidthErr/D")
314  tree.Branch("CoGMean", cogmean, "CoGMean/D")
315  tree.Branch("CoGMeanErr", cogmeanerr, "CoGMeanErr/D")
316  tree.Branch("RunNumber", runnumber, "RunNumber/I")
317  tree.Branch("ExpNumber", expnumber, "ExpNumber/I")
318  tree.Branch("EvtT0Mean", evttime, "EvtT0Mean/D")
319  tree.Branch("Jitter", jitter, "Jitter/D")
320  tree.Branch("EvtT0ErrorMean", cdcErrorMean, "EvtT0ErrorMean/D")
321  tree.Branch("ClsSizeMean", clsSize, "ClsSizeMean/D")
322  tree.Branch("ClsChargeMean", clsCharge, "ClsChargeMean/D")
323  tree.Branch("ClsSNRMean", clsSNR, "ClsSNRMean/D")
324 
325  par = [0, 1]
326 
327  # tfileHist.cd()
329  gDirectory.mkdir("plots")
330  gDirectory.cd("plots")
331  for layer in geoCache.getLayers(Belle2.VXD.SensorInfoBase.SVD):
332  layerNumber = layer.getLayerNumber()
333  layerNumberTree[0] = layerNumber
334  li = layerNumber - 3
335  gDirectory.mkdir("layer" + str(layerNumber))
336  gDirectory.cd("layer" + str(layerNumber))
337  for ladder in geoCache.getLadders(layer):
338  ladderNumber = ladder.getLadderNumber()
339  ladderNumberTree[0] = ladderNumber
340  ldi = ladderNumber - 1
341  for sensor in geoCache.getSensors(ladder):
342  sensorNumber = sensor.getSensorNumber()
343  sensorNumberTree[0] = sensorNumber
344  si = sensorNumber - 1
345  for side in range(2):
346  sideTree[0] = side
347  # Resolution distribution Histograms with Gaussian Fit
348  res = self.resList[li][ldi][si][side]
349  res.GetXaxis().SetTitle("cluster time - EventT0 (ns)")
350  fitResult = int(TFitResultPtr(res.Fit(self.gaus, "R")))
351  res.Write()
352  # COG Distribution Histograms
353  cog = self.cogList[li][ldi][si][side]
354  cog.GetXaxis().SetTitle("cluster time (ns)")
355  cog.Write()
356  # CDC EventT0 Distribution Histograms
357  cdc = self.cdcList[li][ldi][si][side]
358  cdc.GetXaxis().SetTitle("EventT0 (ns)")
359  cdc.Write()
360  cdcError = self.cdcErrorList[li][ldi][si][side]
361  cdcError.GetXaxis().SetTitle("EventT0 Error (ns)")
362  cdcError.Write()
363  # SNR Distribution Histograms
364  snr = self.snrList[li][ldi][si][side]
365  clsSNR[0] = snr.GetMean()
366  snr.GetXaxis().SetTitle("cluster SNR")
367  snr.Write()
368  # Size Distribution Histograms
369  size = self.sizeList[li][ldi][si][side]
370  clsSize[0] = size.GetMean()
371  size.GetXaxis().SetTitle("cluster Size")
372  size.Write()
373  # Charge Distribution Histograms
374  charge = self.chargeList[li][ldi][si][side]
375  clsCharge[0] = charge.GetMean()
376  charge.GetXaxis().SetTitle("cluster Charge")
377  charge.Write()
378  # ScatterPlot Histograms with Linear Fit
379  sp = self.spList[li][ldi][si][side]
380  covscalebias = sp.GetCovariance()
381  pfxsp = sp.ProfileX()
382  sp.GetXaxis().SetTitle("cluster time (ns)")
383  sp.GetYaxis().SetTitle("EventT0 (ns)")
384  sp.Write()
385  pfxsp.Write()
386 
387  mean[0] = self.gaus.GetParameter(1)
388  meanerr[0] = self.gaus.GetParError(1)
389  width[0] = self.gaus.GetParameter(2)
390  widtherr[0] = self.gaus.GetParError(2)
391  cogmean[0] = cog.GetMean()
392  if cog.GetEntries() == 0:
393  cogmeanerr[0] = -1
394  else:
395  cogmeanerr[0] = cog.GetRMS()/math.sqrt(cog.GetEntries())
396  evttime[0] = cdc.GetMean()
397  if cdc.GetEntries() == 0:
398  jitter[0] = -1
399  else:
400  jitter[0] = cdc.GetRMS()
401  cdcErrorMean[0] = cdcError.GetMean()
402 
403  if fitResult == -1:
404  mean[0] = -100.0
405  meanerr[0] = -100.0
406  width[0] = -100.0
407  widtherr[0] = -100.0
408 
409  tree.Fill()
410 
411  gDirectory.cd("../")
412 
413  gDirectory.cd("../")
414  self.EventT0Hist.Write()
415  tree.Write()
416  tfile.Purge()
417  tfile.Close()
418  del tfile
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.cogList
cogList
cog
Definition: CoGCalibration_utils_checkCalibration.py:137
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.EventT0Hist
EventT0Hist
distribution of EventT0
Definition: CoGCalibration_utils_checkCalibration.py:244
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.gaus
gaus
gaus function used for fitting distributions
Definition: CoGCalibration_utils_checkCalibration.py:247
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.spList
spList
scatterplot t0 vs cog
Definition: CoGCalibration_utils_checkCalibration.py:135
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.cdcEventT0
cdcEventT0
registers PyStoreObj EventT0
Definition: CoGCalibration_utils_checkCalibration.py:263
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.cdcErrorList
cdcErrorList
t0 no synchronized
Definition: CoGCalibration_utils_checkCalibration.py:147
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.NTOT
NTOT
counts the number of clusters
Definition: CoGCalibration_utils_checkCalibration.py:91
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.set_localdb
def set_localdb(self, localDB)
Definition: CoGCalibration_utils_checkCalibration.py:93
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.set_run_number
def set_run_number(self, run)
Definition: CoGCalibration_utils_checkCalibration.py:103
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule
Definition: CoGCalibration_utils_checkCalibration.py:40
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.outputFileName
outputFileName
name of the output file
Definition: CoGCalibration_utils_checkCalibration.py:129
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.localdb
localdb
set the name of the localDB used
Definition: CoGCalibration_utils_checkCalibration.py:101
Belle2::PyStoreObj
a (simplified) python wrapper for StoreObjPtr.
Definition: PyStoreObj.h:69
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.terminate
def terminate(self)
Definition: CoGCalibration_utils_checkCalibration.py:277
Belle2::VXD::GeoCache::getInstance
static GeoCache & getInstance()
Return a reference to the singleton instance.
Definition: GeoCache.cc:215
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.expnumber
expnumber
set the experiment number
Definition: CoGCalibration_utils_checkCalibration.py:121
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.snrList
snrList
Cluster SNR.
Definition: CoGCalibration_utils_checkCalibration.py:141
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.pol3
pol3
order 3 polynomium used for the calibration
Definition: CoGCalibration_utils_checkCalibration.py:251
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.runnumber
runnumber
set the run number
Definition: CoGCalibration_utils_checkCalibration.py:111
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.chargeList
chargeList
Cluster charge.
Definition: CoGCalibration_utils_checkCalibration.py:145
Belle2::PyStoreArray
a (simplified) python wrapper for StoreArray.
Definition: PyStoreArray.h:58
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.event
def event(self)
Definition: CoGCalibration_utils_checkCalibration.py:255
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.cdcList
cdcList
t0
Definition: CoGCalibration_utils_checkCalibration.py:139
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.TB
TB
Definition: CoGCalibration_utils_checkCalibration.py:272
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.Evt
Evt
counts the number of events
Definition: CoGCalibration_utils_checkCalibration.py:152
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.set_exp_number
def set_exp_number(self, exp)
Definition: CoGCalibration_utils_checkCalibration.py:113
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.pol1
pol1
order 1 polynomium used for the calibration
Definition: CoGCalibration_utils_checkCalibration.py:249
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.resList
resList
lists used to create the histograms for each TB : residuals
Definition: CoGCalibration_utils_checkCalibration.py:133
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.sizeList
sizeList
Cluster Size.
Definition: CoGCalibration_utils_checkCalibration.py:143
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.fillLists
def fillLists(self, svdClusterFromTracks)
Definition: CoGCalibration_utils_checkCalibration.py:45
svd.CoGCalibration_utils_checkCalibration.SVDCoGTimeCalibrationCheckModule.initialize
def initialize(self)
Definition: CoGCalibration_utils_checkCalibration.py:123