19 from ROOT
import Belle2
21 from ROOT
import gROOT, AddressOf
29 ''' shift digits in time by timeShift'''
32 ''' event processing '''
36 digit.setTime(digit.getTime() + timeShift)
39 gROOT.ProcessLine(
'struct TreeStruct {\
40 int slot; /* slot number */ \
41 int nfot; /* number of photons in the slot */ \
42 int pdg; /* PDG code from barHit */ \
43 float x; /* local x from barHit */ \
44 float y; /* local y from barHit */ \
45 float z; /* local z from barHit */ \
46 float t; /* time from barHit */ \
47 float p; /* momentum from barHit */ \
48 float theta; /* momentum theta [deg] from barHit */ \
49 float phi; /* momentum local phi [deg] from barHit */ \
50 float dx; /* extHit - barHit difference in local x */ \
51 float dy; /* extHit - barHit difference in local y */ \
52 float dz; /* extHit - barHit difference in local z */ \
53 float dt; /* extHit - barHit difference in time */ \
54 float dp; /* extHit - barHit difference in momentum */ \
55 float dtheta; /* extHit - barHit difference in theta [deg] */ \
56 float dphi; /* extHit - barHit difference in local phi [deg] */ \
57 float t0; /* t0 determined by TOPCosmicT0Finder */ \
58 float t0err; /* error on t0 */ \
59 float timeShift; /* time shift applied to TOPDigits */ \
60 float dt0; /* difference: dt + t0 - timeShift */ \
63 from ROOT
import TreeStruct
67 ''' makes ntuple for MC studies of TOPCosmicT0Finder performance '''
73 self.
filefile = ROOT.TFile(
'cosmicT0FinderNtuple.root',
'recreate')
75 self.
treetree = ROOT.TTree(
'tree',
'')
77 self.
datadata = TreeStruct()
79 for key
in TreeStruct.__dict__.keys():
82 if isinstance(self.
datadata.__getattribute__(key), int):
84 self.
treetree.Branch(key, AddressOf(self.
datadata, key), key + formstring)
87 self.
resoreso = TH1F(
'reso',
'T0 residuals', 200, -1.0, 1.0)
88 self.
resoreso.SetXTitle(
'#Delta t0 [ns]')
90 self.
pullpull = TH1F(
'pull',
'T0 pulls', 200, -10.0, 10.0)
93 ''' event processing: fill ntuple and histograms '''
97 for timeZero
in timeZeros:
98 extHit = timeZero.getRelated(
'ExtHits')
100 b2.B2WARNING(
'no related extHits')
103 for barhit
in mcParticles[0].getRelationsWith(
'TOPBarHits'):
104 if barhit.getModuleID() == extHit.getCopyID():
107 b2.B2WARNING(
'no corresponding TOPBarHit')
110 moduleID = timeZero.getModuleID()
111 if extHit.getCopyID() != moduleID:
112 b2.B2ERROR(
'moduleID in extHit differs: ' + str(extHit.getCopyID()) +
114 if barHit.getModuleID() != moduleID:
115 b2.B2ERROR(
'moduleID in barHit differs: ' + str(barHit.getModuleID()) +
118 self.
datadata.slot = moduleID
119 self.
datadata.nfot = timeZero.getNumPhotons()
120 self.
datadata.pdg = barHit.getPDG()
121 pos = barHit.getLocalPosition()
122 self.
datadata.x = pos.x()
123 self.
datadata.y = pos.y()
124 self.
datadata.z = pos.z()
125 self.
datadata.t = barHit.getTime()
126 phiBar = math.pi / 2 - math.pi / 8 * (moduleID - 0.5)
127 mom = barHit.getMomentum()
129 self.
datadata.p = mom.Mag()
130 self.
datadata.theta = math.degrees(mom.Theta())
131 self.
datadata.phi = math.degrees(mom.Phi())
132 dr = extHit.getPosition() - barHit.getPosition()
134 self.
datadata.dx = dr.x()
135 self.
datadata.dy = dr.y()
136 self.
datadata.dz = dr.z()
137 self.
datadata.dt = extHit.getTOF() - self.
datadata.t
138 momExt = extHit.getMomentum()
139 momExt.RotateZ(phiBar)
140 self.
datadata.dp = momExt.Mag() - self.
datadata.p
141 self.
datadata.dtheta = math.degrees(momExt.Theta()) - self.
datadata.theta
142 self.
datadata.dphi = math.degrees(momExt.Phi()) - self.
datadata.phi
143 self.
datadata.t0 = timeZero.getTime()
144 self.
datadata.t0err = timeZero.getError()
145 self.
datadata.timeShift = timeShift
146 self.
datadata.dt0 = self.
datadata.dt + self.
datadata.t0 - self.
datadata.timeShift
149 self.
resoreso.Fill(self.
datadata.dt0)
150 self.
pullpull.Fill(self.
datadata.dt0/self.
datadata.t0err)
151 if timeZero.getChi2().GetEntries() > 0:
152 timeZero.getChi2().Write()
153 timeZero.getPDF().Write()
154 timeZero.getHits().Write()
157 ''' terminate: write and close root file '''
160 self.
filefile.Write()
161 self.
filefile.Close()
165 b2.set_log_level(b2.LogLevel.WARNING)
168 b2.use_central_database(
'data_reprocessing_proc8')
171 main = b2.create_path()
174 roinput = b2.register_module(
'RootInput')
175 main.add_module(roinput)
178 main.add_module(
'TOPGeometryParInitializer')
184 finder = b2.register_module(
'TOPCosmicT0Finder')
185 finder.param(
'useIncomingTrack',
False)
187 main.add_module(finder)
193 main.add_module(
'Progress')
a (simplified) python wrapper for StoreArray.
data
data structure to be written to tree
reso
histogram of t0 residuals
pull
histogram of t0 pulls