11 from ROOT
import Belle2
12 from ROOT
import TH1F, TFile
13 from ROOT
import gROOT, AddressOf
21 ''' shift digits in time by timeShift'''
24 ''' event processing '''
28 digit.setTime(digit.getTime() + timeShift)
31 gROOT.ProcessLine(
'struct TreeStruct {\
32 int slot; /* slot number */ \
33 int nfot; /* number of photons in the slot */ \
34 int pdg; /* PDG code from barHit */ \
35 float x; /* local x from barHit */ \
36 float y; /* local y from barHit */ \
37 float z; /* local z from barHit */ \
38 float t; /* time from barHit */ \
39 float p; /* momentum from barHit */ \
40 float theta; /* momentum theta [deg] from barHit */ \
41 float phi; /* momentum local phi [deg] from barHit */ \
42 float dx; /* extHit - barHit difference in local x */ \
43 float dy; /* extHit - barHit difference in local y */ \
44 float dz; /* extHit - barHit difference in local z */ \
45 float dt; /* extHit - barHit difference in time */ \
46 float dp; /* extHit - barHit difference in momentum */ \
47 float dtheta; /* extHit - barHit difference in theta [deg] */ \
48 float dphi; /* extHit - barHit difference in local phi [deg] */ \
49 float t0; /* t0 determined by TOPCosmicT0Finder */ \
50 float t0err; /* error on t0 */ \
51 float timeShift; /* time shift applied to TOPDigits */ \
52 float dt0; /* difference: dt + t0 - timeShift */ \
55 from ROOT
import TreeStruct
59 ''' makes ntuple for MC studies of TOPCosmicT0Finder performance '''
65 self.
file = ROOT.TFile(
'cosmicT0FinderNtuple.root',
'recreate')
67 self.
tree = ROOT.TTree(
'tree',
'')
71 for key
in TreeStruct.__dict__.keys():
74 if isinstance(self.
data.__getattribute__(key), int):
76 self.
tree.Branch(key, AddressOf(self.
data, key), key + formstring)
79 self.
reso = TH1F(
'reso',
'T0 residuals', 200, -1.0, 1.0)
80 self.
reso.SetXTitle(
'#Delta t0 [ns]')
82 self.
pull = TH1F(
'pull',
'T0 pulls', 200, -10.0, 10.0)
85 ''' event processing: fill ntuple and histograms '''
89 for timeZero
in timeZeros:
90 extHit = timeZero.getRelated(
'ExtHits')
92 B2WARNING(
'no related extHits')
95 for barhit
in mcParticles[0].getRelationsWith(
'TOPBarHits'):
96 if barhit.getModuleID() == extHit.getCopyID():
99 B2WARNING(
'no corresponding TOPBarHit')
102 moduleID = timeZero.getModuleID()
103 if extHit.getCopyID() != moduleID:
104 B2ERROR(
'moduleID in extHit differs: ' + str(extHit.getCopyID()) +
106 if barHit.getModuleID() != moduleID:
107 B2ERROR(
'moduleID in barHit differs: ' + str(barHit.getModuleID()) +
110 self.
data.slot = moduleID
111 self.
data.nfot = timeZero.getNumPhotons()
112 self.
data.pdg = barHit.getPDG()
113 pos = barHit.getLocalPosition()
114 self.
data.x = pos.x()
115 self.
data.y = pos.y()
116 self.
data.z = pos.z()
117 self.
data.t = barHit.getTime()
118 phiBar = math.pi / 2 - math.pi / 8 * (moduleID - 0.5)
119 mom = barHit.getMomentum()
121 self.
data.p = mom.Mag()
122 self.
data.theta = math.degrees(mom.Theta())
123 self.
data.phi = math.degrees(mom.Phi())
124 dr = extHit.getPosition() - barHit.getPosition()
126 self.
data.dx = dr.x()
127 self.
data.dy = dr.y()
128 self.
data.dz = dr.z()
129 self.
data.dt = extHit.getTOF() - self.
data.t
130 momExt = extHit.getMomentum()
131 momExt.RotateZ(phiBar)
132 self.
data.dp = momExt.Mag() - self.
data.p
133 self.
data.dtheta = math.degrees(momExt.Theta()) - self.
data.theta
134 self.
data.dphi = math.degrees(momExt.Phi()) - self.
data.phi
135 self.
data.t0 = timeZero.getTime()
136 self.
data.t0err = timeZero.getError()
137 self.
data.timeShift = timeShift
143 if timeZero.getChi2().GetEntries() > 0:
144 timeZero.getChi2().Write()
145 timeZero.getPDF().Write()
146 timeZero.getHits().Write()
149 ''' terminate: write and close root file '''
157 set_log_level(LogLevel.WARNING)
160 use_central_database(
'data_reprocessing_proc8')
166 roinput = register_module(
'RootInput')
167 main.add_module(roinput)
170 main.add_module(
'TOPGeometryParInitializer')
176 finder = register_module(
'TOPCosmicT0Finder')
177 finder.param(
'useIncomingTrack',
False)
179 main.add_module(finder)
185 main.add_module(
'Progress')