23 from ROOT
import Belle2, TFile, TTree, TH1F, TH2F, TH2D, TGraph, TFitResultPtr
24 from ROOT
import TROOT, gROOT, TF1, TMath, gStyle, gDirectory
29 from array
import array
32 from ROOT.Belle2
import SVDCoGCalibrationFunction
33 from ROOT.Belle2
import SVDCoGTimeCalibrations
35 import matplotlib.pyplot
as plt
37 from numpy.linalg
import inv, pinv
38 from numpy.linalg
import det, norm, cond
40 svd_recoDigits =
"SVDRecoDigitsFromTracks"
42 svd_Clusters =
"SVDClustersFromTracks"
51 Python class used for checking SVD CoG Calibration stored in a localDB,
52 creating a localDB with the correction and a root file to check the corrections
57 Function that allows to set if apply the CDC latency correction
61 - if True -> not apply correction
62 - if False -> apply correction
68 def fillLists(self, svdRecoDigits_rel_Clusters, svdClusters_rel_RecoTracks_cl):
70 Function that fill the lists needed for the CoG corrections
73 svdRecoDigits_rel_Clusters (SVDRecoDigit): reco digits related to clusters
74 svdClusters_rel_RecoTracks_cl (SVDCluster): cluster related to tracks
77 timeCluster = svdClusters_rel_RecoTracks_cl.getClsTime()
78 snrCluster = svdClusters_rel_RecoTracks_cl.getSNR()
79 layerCluster = svdClusters_rel_RecoTracks_cl.getSensorID().getLayerNumber()
80 layerIndex = layerCluster - 3
81 sensorCluster = svdClusters_rel_RecoTracks_cl.getSensorID().getSensorNumber()
82 sensorIndex = sensorCluster - 1
83 ladderCluster = svdClusters_rel_RecoTracks_cl.getSensorID().getLadderNumber()
84 ladderIndex = ladderCluster - 1
85 sideCluster = svdClusters_rel_RecoTracks_cl.isUCluster()
94 TBClusters = svdRecoDigits_rel_Clusters.getModeByte().getTriggerBin()
95 TBIndex = ord(TBClusters)
99 tZeroSync = tZero - 4000./509 * (3 - TBIndex)
105 resHist = self.
resList[layerIndex][ladderIndex][sensorIndex][sideIndex]
106 resHist.Fill(timeCluster - tZeroSync)
107 spHist = self.
spList[layerIndex][ladderIndex][sensorIndex][sideIndex]
109 spHist.Fill(timeCluster, tZeroSync)
110 cogHist = self.
cogList[layerIndex][ladderIndex][sensorIndex][sideIndex]
111 cogHist.Fill(timeCluster)
112 cdcHist = self.
cdcList[layerIndex][ladderIndex][sensorIndex][sideIndex]
113 cdcHist.Fill(tZeroSync)
114 snrHist = self.
snrList[layerIndex][ladderIndex][sensorIndex][sideIndex]
115 snrHist.Fill(snrCluster)
117 self.
nList[layerIndex][ladderIndex][sensorIndex][sideIndex] += 1
119 self.
sumCOGList[layerIndex][ladderIndex][sensorIndex][sideIndex] += timeCluster
120 self.
sumCOGList2[layerIndex][ladderIndex][sensorIndex][sideIndex] += timeCluster * timeCluster
121 self.
sumCOGList3[layerIndex][ladderIndex][sensorIndex][sideIndex] += timeCluster * timeCluster * timeCluster
122 self.
sumCOGList4[layerIndex][ladderIndex][sensorIndex][sideIndex] += timeCluster * \
123 timeCluster * timeCluster * timeCluster
124 self.
sumCOGList5[layerIndex][ladderIndex][sensorIndex][sideIndex] += timeCluster * \
125 timeCluster * timeCluster * timeCluster * timeCluster
126 self.
sumCOGList6[layerIndex][ladderIndex][sensorIndex][sideIndex] += timeCluster * \
127 timeCluster * timeCluster * timeCluster * timeCluster * timeCluster
129 self.
sumCDCList[layerIndex][ladderIndex][sensorIndex][sideIndex] += tZeroSync
130 self.
sumCDCCOGList[layerIndex][ladderIndex][sensorIndex][sideIndex] += tZeroSync * timeCluster
131 self.
sumCDCCOGList2[layerIndex][ladderIndex][sensorIndex][sideIndex] += tZeroSync * timeCluster * timeCluster
132 self.
sumCDCCOGList3[layerIndex][ladderIndex][sensorIndex][sideIndex] += tZeroSync * \
133 timeCluster * timeCluster * timeCluster
140 Function that allows to set the localDB
143 localDB (str): Name of the localDB used
150 Initialize object (histograms, lists, ...) used by the class
193 for layer
in geoCache.getLayers(Belle2.VXD.SensorInfoBase.SVD):
214 self.
resList.append(layerList0)
215 self.
spList.append(layerList1)
216 self.
cogList.append(layerList2)
217 self.
cdcList.append(layerList3)
218 self.
snrList.append(layerList4)
220 self.
nList.append(layerList8)
234 for ladder
in geoCache.getLadders(layer):
255 layerList0.append(ladderList0)
256 layerList1.append(ladderList1)
257 layerList2.append(ladderList2)
258 layerList3.append(ladderList3)
259 layerList4.append(ladderList4)
260 layerList5.append(ladderList5)
261 layerList6.append(ladderList6)
262 layerList7.append(ladderList7)
263 layerList8.append(ladderList8)
265 layerList9.append(ladderList9)
266 layerList10.append(ladderList10)
267 layerList11.append(ladderList11)
268 layerList12.append(ladderList12)
269 layerList13.append(ladderList13)
270 layerList14.append(ladderList14)
271 layerList15.append(ladderList15)
272 layerList16.append(ladderList16)
273 layerList17.append(ladderList17)
275 for sensor
in geoCache.getSensors(ladder):
296 ladderList0.append(sensorList0)
297 ladderList1.append(sensorList1)
298 ladderList2.append(sensorList2)
299 ladderList3.append(sensorList3)
300 ladderList4.append(sensorList4)
301 ladderList5.append(sensorList5)
302 ladderList6.append(sensorList6)
303 ladderList7.append(sensorList7)
304 ladderList8.append(sensorList8)
306 ladderList9.append(sensorList9)
307 ladderList10.append(sensorList10)
308 ladderList11.append(sensorList11)
309 ladderList12.append(sensorList12)
310 ladderList13.append(sensorList13)
311 ladderList14.append(sensorList14)
312 ladderList15.append(sensorList15)
313 ladderList16.append(sensorList16)
314 ladderList17.append(sensorList17)
317 for side in range(2):
327 sensorList0.append(sideList0)
328 sensorList1.append(sideList1)
329 sensorList2.append(sideList2)
330 sensorList3.append(sideList3)
331 sensorList4.append(sideList4)
332 sensorList5.append(sideList5)
333 sensorList6.append(sideList6)
334 sensorList7.append(sideList7)
335 sensorList8.append(sideList8)
337 for i
in geoCache.getLayers(Belle2.VXD.SensorInfoBase.SVD):
338 layerN = i.getLayerNumber()
340 for j
in geoCache.getLadders(i):
341 ladderN = j.getLadderNumber()
343 for k
in geoCache.getSensors(j):
344 sensorN = k.getSensorNumber()
347 self.
resList[li][ldi][si].append(
348 TH1F(
"res" +
"_" + str(k) +
"." + str(s),
" ", 200, -100, 100))
349 self.
spList[li][ldi][si].append(
350 TH2D(
"sp" +
"_" + str(k) +
"." + str(s),
" ", 300, -150, 150, 300, -150, 150))
351 self.
cogList[li][ldi][si].append(
352 TH1F(
"cog" +
"_" + str(k) +
"." + str(s),
" ", 200, -100, 100))
353 self.
cdcList[li][ldi][si].append(
354 TH1F(
"cdc" +
"_" + str(k) +
"." + str(s),
" ", 200, -100, 100))
355 self.
snrList[li][ldi][si].append(
356 TH1F(
"snr" +
"_" + str(k) +
"." + str(s),
" ", 100, 0, 100))
357 self.
nList[li][ldi][si].append(0)
372 self.
gaus = TF1(
"gaus",
'gaus(0)', -150, 100)
374 self.
pol = TF1(
"pol",
"[0] + [1]*x + [2]*x*x + [3]*x*x*x", -150, 150)
380 Function that allows to cicle on the events
395 for svdCluster
in svdCluster_list:
396 svdRecoDigit = svdCluster.getRelatedTo(svd_recoDigits)
401 Terminates te class and produces the output rootfile
409 timeCal = SVDCoGCalibrationFunction()
415 geoCache = Belle2.VXD.GeoCache.getInstance()
416 for layer in geoCache.getLayers(Belle2.VXD.SensorInfoBase.SVD):
417 layerNumber = layer.getLayerNumber()
419 for ladder in geoCache.getLadders(layer):
420 ladderNumber = ladder.getLadderNumber()
421 ldi = ladderNumber - 1
422 for sensor in geoCache.getSensors(ladder):
423 sensorNumber = sensor.getSensorNumber()
424 si = sensorNumber - 1
425 for side in range(2):
427 n = self.nList[li][ldi][si][side][tb]
431 gDirectory.mkdir(
"plots")
432 gDirectory.cd(
"plots")
433 for layer
in geoCache.getLayers(Belle2.VXD.SensorInfoBase.SVD):
434 layerNumber = layer.getLayerNumber()
436 gDirectory.mkdir(
"layer" + str(layer))
437 gDirectory.cd(
"layer" + str(layer))
438 for ladder
in geoCache.getLadders(layer):
439 ladderNumber = ladder.getLadderNumber()
440 ldi = ladderNumber - 1
441 for sensor
in geoCache.getSensors(ladder):
442 sensorNumber = sensor.getSensorNumber()
443 si = sensorNumber - 1
444 for side
in range(2):
446 res = self.
resList[li][ldi][si][side]
447 fitResult = int(TFitResultPtr(res.Fit(self.
gaus,
"R")))
451 cog = self.
cogList[li][ldi][si][side]
454 cdc = self.
cdcList[li][ldi][si][side]
457 snr = self.
snrList[li][ldi][si][side]
458 snrMean = snr.GetMean()
461 sp = self.
spList[li][ldi][si][side]
462 covscalebias = sp.GetCovariance()
463 pfxsp = sp.ProfileX()
464 self.
pol.SetParameters(-50, 1.5, 0.001, 0.00001)
465 pfxsp.Fit(self.
pol,
"R")
466 par[0] = self.
pol.GetParameter(0)
467 par[1] = self.
pol.GetParameter(1)
468 par[2] = self.
pol.GetParameter(2)
469 par[3] = self.
pol.GetParameter(3)
474 m = sp.GetCovariance() / pow(sp.GetRMS(1), 2)
476 m_err = 2 / pow(sp.GetRMS(), 3) * sp.GetRMSError() * sp.GetCovariance()
477 q = sp.GetMean(2) - m * sp.GetMean(1)
478 q_err = math.sqrt(pow(sp.GetMeanError(2), 2) +
479 pow(m * sp.GetMeanError(1), 2) + pow(m_err * sp.GetMean(1), 2))
487 T0MEAN = cdc.GetMean()
490 "Mean of the CoG corrected distribution: " +
492 " Mean of the T0 distribution: " +
495 timeCal.set_current(1)
496 timeCal.set_pol3parameters(par[0] - T0MEAN, par[1], par[2], par[3])
497 print(
"setting CoG calibration for " + str(layerNumber) +
"." + str(ladderNumber) +
"." + str(sensorNumber))
498 payload.set(layerNumber, ladderNumber, sensorNumber, bool(side), 1, timeCal)