15 from ROOT
import Belle2, TFile, TTree, TH1F, TH2F, TH2D, TGraph, TFitResultPtr
16 from ROOT
import TROOT, gROOT, TF1, TMath, gStyle, gDirectory, TTree
21 from array
import array
25 import matplotlib.pyplot
as plt
27 from numpy.linalg
import inv, pinv
28 from numpy.linalg
import det, norm, cond
31 svd_Clusters =
"SVDClustersFromTracks"
32 svd_EventInfo =
"SVDEventInfo"
42 Python class used for checking SVD CoG Calibration stored in a localDB
47 Function that fill the lists needed for the check of the calibration
50 svdClusterFromTracks (SVDCluster): Cluster related to tracks
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()
70 tZeroError = self.
cdcEventT0.getEventT0Uncertainty()
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]
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)
95 Function that allows to set the localDB
98 localDB (str): Name of the localDB used
105 Function that allows to save the run number
108 run (int): run number
115 Function that allows to save the experiment number
118 exp (int): experiment number
125 Initialize object (histograms, lists, ...) used by the class
153 for layer
in geoCache.getLayers(Belle2.VXD.SensorInfoBase.SVD):
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)
172 for ladder
in geoCache.getLadders(layer):
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)
191 for sensor
in geoCache.getSensors(ladder):
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)
210 for i
in geoCache.getLayers(Belle2.VXD.SensorInfoBase.SVD):
211 layerN = i.getLayerNumber()
213 for j
in geoCache.getLadders(i):
214 ladderN = j.getLadderNumber()
216 for k
in geoCache.getSensors(j):
217 sensorN = k.getSensorNumber()
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),
239 self.
cdcErrorList[li][ldi][si].append(TH1F(
"cdcError" +
"_" + str(layerN) +
"." +
240 str(ladderN) +
"." + str(sensorN) +
"." + str(s),
247 self.
gaus = TF1(
"gaus",
'gaus(0)', -150, 150)
249 self.
pol1 = TF1(
"pol1",
"[0] + [1]*x", -30, 30)
251 self.
pol3 = TF1(
"pol3",
"[0] + [1]*x + [2]*x*x + [3]*x*x*x", -50, 50)
257 Function that allows to cicle on the events
271 clsTB = svd_evtInfo.getModeByte().getTriggerBin()
274 for svdCluster
in svdCluster_list:
279 Terminates te class and produces the output rootfile
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)
294 expnumber = np.zeros(1, dtype=int)
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)
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")
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
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):
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")))
353 cog = self.
cogList[li][ldi][si][side]
354 cog.GetXaxis().SetTitle(
"cluster time (ns)")
357 cdc = self.
cdcList[li][ldi][si][side]
358 cdc.GetXaxis().SetTitle(
"EventT0 (ns)")
361 cdcError.GetXaxis().SetTitle(
"EventT0 Error (ns)")
364 snr = self.
snrList[li][ldi][si][side]
365 clsSNR[0] = snr.GetMean()
366 snr.GetXaxis().SetTitle(
"cluster SNR")
369 size = self.
sizeList[li][ldi][si][side]
370 clsSize[0] = size.GetMean()
371 size.GetXaxis().SetTitle(
"cluster Size")
375 clsCharge[0] = charge.GetMean()
376 charge.GetXaxis().SetTitle(
"cluster Charge")
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)")
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:
395 cogmeanerr[0] = cog.GetRMS()/math.sqrt(cog.GetEntries())
396 evttime[0] = cdc.GetMean()
397 if cdc.GetEntries() == 0:
400 jitter[0] = cdc.GetRMS()
401 cdcErrorMean[0] = cdcError.GetMean()