15 from ROOT
import Belle2
16 from ROOT
import TFile, TH1F, TH2F, TF1, TMatrixDSym
17 from array
import array
26 data_dir =
'/group/belle2/dataprod/Data/release-03-02-02/DB00000635/proc00000009_nofilter'
27 skim_dir =
'skim/hlt_bhabha/cdst/sub00/'
28 globalTag =
'data_reprocessing_prompt'
29 stagingTags = [
'staging_data_reprocessing']
32 output_dir =
'moduleT0'
39 print(
"usage: basf2", argvs[0],
"experiment runFirst runLast")
41 experiment = int(argvs[1])
42 run_first = int(argvs[2])
43 run_last = int(argvs[3])
45 expNo =
'e' +
'{:0=4d}'.format(experiment)
49 for run
in range(run_first, run_last + 1):
50 runNo =
'r' +
'{:0=5d}'.format(run)
51 for typ
in [
'4S',
'Continuum',
'Scan']:
52 folder = data_dir +
'/' + expNo +
'/' + typ +
'/' + runNo +
'/' + skim_dir
53 files += glob.glob(folder +
'/cdst.*.root')
55 B2ERROR(
'No cdst files found')
60 output_folder = output_dir +
'/' + expNo +
'/' + sampleType +
'/' + method
61 if not os.path.isdir(output_folder):
62 os.makedirs(output_folder)
63 print(
'New folder created: ' + output_folder)
66 fileName = output_folder +
'/moduleT0-' + expNo +
'-'
67 run1 =
'r' +
'{:0=5d}'.format(run_first)
68 run2 =
'r' +
'{:0=5d}'.format(run_last)
69 fileName += run1 +
'_to_' + run2 +
'.root'
70 print(
'Output file:', fileName)
74 ''' exclude (mask-out) BS 13d '''
77 ''' event processing '''
80 if digit.getModuleID() == 13
and digit.getBoardstackNumber() == 3:
81 digit.setHitQuality(Belle2.TOPDigit.c_Junk)
85 ''' module T0 calibrator using chi2 minimization of time differences between slots '''
88 ''' initialize and book histograms '''
99 self.
h_slotPairs = TH2F(
"slots",
"slot pairs: number of entries",
100 16, 0.5, 16.5, 16, 0.5, 16.5)
106 "slot pairs: #chi^{2} /NDF of " +
107 "successfully fitted time differences",
108 16, 0.5, 16.5, 16, 0.5, 16.5)
113 self.
h_relModuleT0 = TH1F(
"relModuleT0",
"Module T0 relative to calibration",
119 self.
h_moduleT0 = TH1F(
"moduleT0",
"Module T0", 16, 0.5, 16.5)
124 ''' sorting timeZeros according to slot number '''
127 py_list = [x
for x
in unsortedPyStoreArray]
137 ''' event processor: fill histograms for events with two entries in timeZeros '''
140 if timeZeros.getEntries() != 2:
145 slot1 = tZeros[0].getModuleID()
146 slot2 = tZeros[1].getModuleID()
151 name =
'deltaT0_' + str(slot1) +
'-' + str(slot2)
152 title =
'time difference: slot ' + str(slot1) +
' - slot ' + str(slot2)
153 self.
h_deltaT0[slot1][slot2] = TH1F(name, title, 200, -5, 5)
154 self.
h_deltaT0[slot1][slot2].SetXTitle(
'time difference [ns]')
155 dt = tZeros[0].getTime() - tZeros[1].getTime()
159 ''' perform a fit of time difference distribution '''
161 xmin = h.GetXaxis().GetXmin()
162 xmax = h.GetXaxis().GetXmax()
163 fun = TF1(
"fun",
"[0]*exp(-0.5*((x-[1])/[2])**2)+[3]", xmin, xmax)
164 fun.SetParameter(0, h.GetMaximum())
165 fun.SetParameter(1, h.GetBinCenter(h.GetMaximumBin()))
166 fun.SetParameter(2, 0.2)
167 fun.SetParameter(3, 0)
168 return h.Fit(fun,
"LERSQ")
171 ''' fit all histograms and store the results into lists '''
182 for slot1
in range(1, 10):
185 for slot2
in range(slot1 + 7, slot1 + 10):
190 if h.GetEntries() > minEntries:
193 chi2 = result.Chi2() / result.Ndf()
195 self.
delT0.append(result.Parameter(1))
196 self.
sigma.append(result.ParError(1))
197 a = [0
for i
in range(16)]
204 Minimization procedure. For the method see NIM A 586 (2008) 174-179, sect. 2.2.
208 self.
delT0.append(0.0)
209 self.
sigma.append(0.001)
210 a = [1
for i
in range(16)]
222 B[i][j] += self.
A[k][i] * self.
A[k][j] / self.
sigma[k]**2
225 det = array(
'd', [0])
228 B2ERROR(
"Matrix inversion failed")
232 b = [0.0
for i
in range(16)]
235 b[i] += self.
A[k][i] * self.
delT0[k] / self.
sigma[k]**2
238 x = [0
for i
in range(16)]
239 e = [0
for i
in range(16)]
242 x[i] += B[i][j] * b[j]
243 e[i] = math.sqrt(B[i][i])
250 s += self.
A[k][i] * x[i]
251 chi2 += ((s - self.
delT0[k]) / self.
sigma[k])**2
253 chi_ndf =
'chi^2/NDF = ' + str(round(chi2, 2)) +
'/' + str(ndf)
262 T0 = [0.0
for i
in range(16)]
275 self.
h_moduleT0.SetBinContent(i+1, x[i] + T0[i] - average)
278 B2RESULT(
"Module T0 calibration constants successfully determined, " + chi_ndf)
282 ''' fit histograms, minimize and write results to file '''
291 file = TFile.Open(fileName,
'recreate')
303 B2RESULT(
"Output written to " + fileName)
307 use_central_database(globalTag)
308 for tag
in stagingTags:
309 use_central_database(tag)
311 if os.path.isfile(db):
312 use_local_database(db, invertLogging=
True)
314 B2ERROR(db +
": local database not found")
321 main.add_module(
'RootInput', inputFileNames=files)
324 main.add_module(
'TOPGeometryParInitializer')
327 main.add_module(
'TOPTimeRecalibrator', subtractBunchTime=
False)
330 main.add_module(
'TOPChannelMasker')
336 main.add_module(
'TOPBunchFinder', usePIDLikelihoods=
True, subtractRunningOffset=
False)
342 main.add_module(
'Progress')