106 ''' initialize: open root file, construct ntuple '''
109 expNo = evtMetaData.obj().getExperiment()
110 runNo = evtMetaData.obj().getRun()
111 exp_run =
'-e' + f
'{expNo:04d}' +
'-r' + f
'{runNo:05d}'
112 outName =
'timeResoNtuple' + exp_run +
'.root'
121 self.
file = ROOT.TFile(outName,
'recreate')
124 self.
bunchOffset = TH1F(
"bunchOffset",
"bunch offset", 100, -1.0, 1.0)
127 self.
h_cth_vs_p = TH2F(
"cth_vs_p",
"local cos #theta vs. p", 100, 0.0, 10.0,
132 self.
h_momentum = TH1F(
"momentum",
"momentum", 100, 0.0, 10.0)
135 self.
h_cth = TH1F(
"cos_theta",
"local cos #theta", 100, -1.0, 1.0)
136 self.
h_cth.SetXTitle(
"cos #theta")
138 self.
h_phi = TH1F(
"local_phi",
"local phi", 100, -math.pi, math.pi)
139 self.
h_phi.SetXTitle(
"local #phi")
141 self.
h_z = TH1F(
"local_z",
"local z", 100, -140.0, 140.0)
142 self.
h_z.SetXTitle(
"local z [cm]")
144 self.
h_x = TH1F(
"local_x",
"local x", 100, -23.0, 23.0)
145 self.
h_x.SetXTitle(
"local x [cm]")
147 self.
h_charge = TH1F(
"charge",
"charge", 3, -1.5, 1.5)
150 self.
h_poca_xy = TH2F(
"poca_xy",
"POCA distribution in x-y", 100, -1.0, 1.0,
155 self.
h_poca_z = TH1F(
"poca_z",
"POCA distribution in z", 100, -2.0, 2.0)
158 self.
h_hitsCDC = TH1F(
"cdc_hits",
"CDC hits", 100, 0.0, 100.0)
159 self.
h_hitsCDC.SetXTitle(
"number of CDC hits")
161 self.
h_Ecms = TH1F(
"Ecms",
"c.m.s. energy of muon", 300, 4.5, 6.0)
162 self.
h_Ecms.SetXTitle(
"E_{cm} [GeV/c]")
165 self.
tree = ROOT.TTree(
'tree',
'time resolution')
170 for key
in TreeStruct.__dict__.keys():
173 if isinstance(self.
data.__getattribute__(key), int):
175 if key
in int_arrays:
176 formstring =
'[nfot]/I'
177 elif key
in float_arrays:
178 formstring =
'[nfot]/F'
179 self.
tree.Branch(key, addressof(self.
data, key), key + formstring)
204 ''' event processing '''
208 b2.B2ERROR(
'no TOPRecBunch')
210 if not recBunch.isReconstructed():
215 self.
data.run = evtMetaData.getRun()
216 self.
data.offset = recBunch.getCurrentOffset()
217 self.
data.usedTrk = recBunch.getUsedTracks()
221 if not trk.isValid():
225 pdfs = track.getRelated(
'TOPPDFCollections')
228 self.
data.slot = pdfs.getModuleID()
229 momentum = pdfs.getAssociatedLocalMomentum()
230 position = pdfs.getAssociatedLocalHit()
231 self.
data.p = momentum.R()
232 self.
data.cth = math.cos(momentum.Theta())
233 self.
data.phi = momentum.Phi()
234 self.
data.z = position.Z()
235 self.
data.x = position.X()
236 self.
data.tof = trk.getTOF(Belle2.Const.muon)
238 tfit = track.getTrackFitResultWithClosestMass(Belle2.Const.muon)
239 except BaseException:
240 b2.B2ERROR(
"No trackFitResult available")
242 self.
data.charge = tfit.getChargeSign()
243 pocaPosition = tfit.getPosition()
244 self.
data.poca_x = pocaPosition.X()
245 self.
data.poca_y = pocaPosition.Y()
246 self.
data.poca_z = pocaPosition.Z()
247 self.
data.hitsCDC = tfit.getHitPatternCDC().getNHits()
250 extHit = trk.getExtHit()
251 timeZero = extHit.getRelated(
'TOPTimeZeros')
252 self.
data.rec_t0 = timeZero.getTime()
253 self.
data.valid_t0 = timeZero.isValid()
254 except BaseException:
256 self.
data.valid_t0 = 0
270 pdf = pdfs.getHypothesisPDF(13)
271 except BaseException:
272 b2.B2ERROR(
"No PDF available for PDG = 13")
276 emi = trk.getEmissionPoint()
277 x0 = emi.position.X()
278 z0 = emi.position.Y()
281 if digit.getModuleID() == self.
data.slot
and digit.getHitQuality() == 1:
286 self.
data.channel[k] = digit.getChannel()
287 self.
data.pixel[k] = digit.getPixelID()
288 self.
data.time[k] = digit.getTime()
289 self.
data.timeErr[k] = digit.getTimeError()
290 self.
data.pulseHeight[k] = digit.getPulseHeight()
291 self.
data.pulseWidth[k] = digit.getPulseWidth()
292 self.
data.sample[k] = digit.getModulo256Sample()
293 self.
data.status[k] = digit.getStatus()
294 peaks = pdf[digit.getPixelID() - 1]
297 self.
data.wid0[k] = 0
301 self.
data.t0[k] = sorted_peaks[0].mean
302 self.
data.wid0[k] = sorted_peaks[0].width
303 self.
data.t1[k] = self.
data.t0[k] + 100
305 self.
data.t1[k] = sorted_peaks[1].mean
306 self.
data.t_pdf[k] = 0
309 self.
data.type[k] = 0
322 self.
data.alpha[k] = 0
323 assocPDF = digit.getRelated(
'TOPAssociatedPDFs')
325 pik = assocPDF.getSinglePeak()
327 self.
data.t_pdf[k] = pik.position
328 self.
data.wid[k] = pik.width
329 self.
data.fic[k] = math.degrees(pik.fic)
330 self.
data.type[k] = pik.type
331 self.
data.nx[k] = pik.nx
332 self.
data.ny[k] = pik.ny
333 self.
data.nxm[k] = pik.nxm
334 self.
data.nym[k] = pik.nym
335 self.
data.nxe[k] = pik.nxe
336 self.
data.nye[k] = pik.nye
338 self.
data.nys[k] = int(pik.nye / 2)
340 self.
data.nys[k] = int((pik.nye + 1) / 2)
341 self.
data.xd[k] = pik.xd
342 self.
data.yd[k] = pik.yd
344 self.
data.xm[k] = x0 + pik.kxe / pik.kze * (130.0 - z0)
345 self.
data.kx[k] = pik.kxe
346 self.
data.ky[k] = pik.kye
347 self.
data.alpha[k] = math.degrees(math.acos(abs(pik.kzd)))