21 from ROOT
import Belle2
24 b2.set_random_seed(10346)
29 Histogram the difference position residuals and pulls between clusters and truehits.
34 Create histograms for pulls and residuals
46 self.
rfilerfile = ROOT.TFile(
"PXDPositionEstimation.root",
"RECREATE")
60 self.
hist_map_momentumhist_map_momentum[kind] = ROOT.TH1F(
"hist_momentum_kind_{:d}".format(
61 kind),
'Particle momentum kind={:d}'.format(kind), 5000, 0.0, 10.0)
62 self.
hist_map_theta_uhist_map_theta_u[kind] = ROOT.TH1F(
"hist_theta_u_kind_{:d}".format(
63 kind),
'Particle angle thetaU kind={:d}'.format(kind), 180, -90, +90)
64 self.
hist_map_theta_vhist_map_theta_v[kind] = ROOT.TH1F(
"hist_theta_v_kind_{:d}".format(
65 kind),
'Particle angle thetaV kind={:d}'.format(kind), 180, -90, +90)
67 kind),
'Cluster charge kind={:d}'.format(kind), 255, 0.0, 255.0)
82 self.
hist_map_residual_uhist_map_residual_u[(kind, mode)] = ROOT.TH1F(
'hist_map_residual_u_kind_{:d}_mode_{:d}'.format(
83 kind, mode),
'PXD residual U kind={:d} mode={:d}'.format(kind, mode), 400, -0.007, +0.007)
84 self.
hist_map_residual_vhist_map_residual_v[(kind, mode)] = ROOT.TH1F(
'hist_map_residual_v_kind_{:d}_mode_{:d}'.format(
85 kind, mode),
'PXD residual V kind={:d} mode={:d}'.format(kind, mode), 400, -0.007, +0.007)
86 self.
hist_map_residual_pull_uhist_map_residual_pull_u[(kind, mode)] = ROOT.TH1F(
'hist_map_residual_pull_u_kind_{:d}_mode_{:d}'.format(
87 kind, mode),
'PXD residual pull U kind={:d} mode={:d}'.format(kind, mode), 200, -10, +10)
88 self.
hist_map_residual_pull_vhist_map_residual_pull_v[(kind, mode)] = ROOT.TH1F(
'hist_map_residual_pull_v_kind_{:d}_mode_{:d}'.format(
89 kind, mode),
'PXD residual pull V kind={:d} mode={:d}'.format(kind, mode), 200, -10, +10)
98 name =
'hist_map_residual_v_kind_{:d}_mode_{:d}_special_{:d}'.format(kind, mode, bin)
99 title =
'PXD residual V kind={:d} mode={:d} {:.0f}<thetaV<{:.0f}'.format(
104 """Fill the residual and pull histograms"""
109 for truehit
in truehits:
112 clusters = truehit.getRelationsFrom(
"PXDClusters")
115 for j, cls
in enumerate(clusters):
118 if clusters.weight(j) < 100:
121 mom = truehit.getMomentum()
124 thetaU = math.atan(tu) * 180 / math.pi
125 thetaV = math.atan(tv) * 180 / math.pi
134 clusterkind = cls.getKind()
139 if clusterkind <= 3
and mom.Mag() > 0.02:
157 pull_u = (truehit.getU() - cls.getU()) / cls.getUSigma()
158 pull_v = (truehit.getV() - cls.getV()) / cls.getVSigma()
160 self.
hist_map_residual_uhist_map_residual_u[(clusterkind, mode)].Fill(truehit.getU() - cls.getU())
161 self.
hist_map_residual_vhist_map_residual_v[(clusterkind, mode)].Fill(truehit.getV() - cls.getV())
165 if thetaV >= self.
binlimitsbinlimits[0][0]
and thetaV < self.
binlimitsbinlimits[0][1]:
167 elif thetaV >= self.
binlimitsbinlimits[1][0]
and thetaV < self.
binlimitsbinlimits[1][1]:
172 shape_likelyhood = PositionEstimator.getShapeLikelyhood(cls, tu, tv)
173 if shape_likelyhood > 0:
176 offset = PositionEstimator.getClusterOffset(cls, tu, tv)
183 shiftU = sensor_info.getUCellPosition(cls.getUStart())
184 shiftV = sensor_info.getVCellPosition(cls.getVStart())
188 pull_u = (truehit.getU() - shiftU - offset.getU()) / (math.sqrt(offset.getUSigma2()))
189 pull_v = (truehit.getV() - shiftV - offset.getV()) / (math.sqrt(offset.getVSigma2()))
191 self.
hist_map_residual_uhist_map_residual_u[(clusterkind, mode)].Fill(truehit.getU() - shiftU - offset.getU())
192 self.
hist_map_residual_vhist_map_residual_v[(clusterkind, mode)].Fill(truehit.getV() - shiftV - offset.getV())
196 if thetaV >= self.
binlimitsbinlimits[0][0]
and thetaV < self.
binlimitsbinlimits[0][1]:
198 truehit.getV() - shiftV - offset.getV())
199 elif thetaV >= self.
binlimitsbinlimits[1][0]
and thetaV < self.
binlimitsbinlimits[1][1]:
201 truehit.getV() - shiftV - offset.getV())
204 truehit.getV() - shiftV - offset.getV())
208 self.
hist_map_residual_uhist_map_residual_u[(clusterkind, mode)].Fill(truehit.getU() - shiftU - offset.getU())
209 self.
hist_map_residual_vhist_map_residual_v[(clusterkind, mode)].Fill(truehit.getV() - shiftV - offset.getV())
213 if thetaV >= self.
binlimitsbinlimits[0][0]
and thetaV < self.
binlimitsbinlimits[0][1]:
215 truehit.getV() - shiftV - offset.getV())
216 elif thetaV >= self.
binlimitsbinlimits[1][0]
and thetaV < self.
binlimitsbinlimits[1][1]:
218 truehit.getV() - shiftV - offset.getV())
221 truehit.getV() - shiftV - offset.getV())
227 pull_u = (truehit.getU() - cls.getU()) / cls.getUSigma()
228 pull_v = (truehit.getV() - cls.getV()) / cls.getVSigma()
230 self.
hist_map_residual_uhist_map_residual_u[(clusterkind, mode)].Fill(truehit.getU() - cls.getU())
231 self.
hist_map_residual_vhist_map_residual_v[(clusterkind, mode)].Fill(truehit.getV() - cls.getV())
235 if thetaV >= self.
binlimitsbinlimits[0][0]
and thetaV < self.
binlimitsbinlimits[0][1]:
237 elif thetaV >= self.
binlimitsbinlimits[1][0]
and thetaV < self.
binlimitsbinlimits[1][1]:
244 Format and write all histograms and plot them
247 for kind
in range(5):
254 self.
hist_map_theta_uhist_map_theta_u[kind].SetYTitle(
'number of particles')
258 self.
hist_map_theta_vhist_map_theta_v[kind].SetYTitle(
'number of particles')
264 for kind
in range(4):
265 for mode
in range(3):
287 hcoverage = ROOT.TH1F(
"hist_coverage",
'Coverage of corrections', 2, 1, 2)
290 hcoverage.SetLineWidth(2)
291 hcoverage.SetYTitle(
'coverage / %')
292 hcoverage.SetTitle(
'Coverage of cluster shape corrections')
294 print(
"Coverage of cluster shape corrections is {:.2f}% ".format(100.0 * float(self.
nfound_offsetnfound_offset / self.
nclustersnclusters)))
295 print(
"Coverage of cluster shape likelyhoods is {:.2f}% ".format(100.0 * float(self.
nfound_shapesnfound_shapes / self.
nclustersnclusters)))
297 self.
rfilerfile.Write()
298 self.
rfilerfile.Close()
301 if __name__ ==
"__main__":
307 parser = argparse.ArgumentParser(description=
"Test cluster shape corrections on generic BBbar events")
311 default=
'/home/benjamin/prerelease-01-00-00b-validation/samples',
313 help=
'Location of bg overlay files')
314 parser.add_argument(
'--bkgOverlay', dest=
'bkgOverlay', action=
"store_true", help=
'Perform background overlay')
315 args = parser.parse_args()
318 bkgfiles = glob.glob(args.bglocation +
'/*.root')
319 if len(bkgfiles) == 0:
320 print(
'No BG overlay files found')
324 main = b2.create_path()
325 main.add_module(
"EventInfoSetter", evtNumList=[10000])
326 main.add_module(
"Gearbox")
328 main.add_module(
"Geometry", components=[
'MagneticField',
'BeamPipe',
'PXD'], useDB=
False)
331 main.add_module(
"EvtGenInput")
336 bkginput = b2.register_module(
'BGOverlayInput')
337 bkginput.param(
'inputFileNames', bkgfiles)
338 main.add_module(bkginput)
340 main.add_module(
"FullSim")
341 main.add_module(
"PXDDigitizer")
346 main.add_module(
'BGOverlayExecutor', PXDDigitsName=
'')
347 main.add_module(
"PXDDigitSorter", digits=
'')
349 main.add_module(
"ActivatePXDClusterPositionEstimator")
350 main.add_module(
"PXDClusterizer")
353 main.add_module(positionestimation)
354 main.add_module(
"Progress")
Class PXDTrueHit - Records of tracks that either enter or leave the sensitive volume.
static PXDClusterPositionEstimator & getInstance()
Main (and only) way to access the PXDClusterPositionEstimator.
a (simplified) python wrapper for StoreArray.
static const SensorInfoBase & get(Belle2::VxdID id)
Return a reference to the SensorInfo of a given SensorID.
hist_map_clustercharge
Histograms for cluster charge related to particle.
hist_map_theta_u
Histograms for true particle angle thetaU.
rfile
Output file to store all plots.
hist_map_residual_pull_v
Histograms for v residual pulls.
nfound_offset
Counter for clusters where position correction was found in payload.
hist_map_residual_v_special
Histograms for v residuals for smaller thetaV range.
binlimits
ThetaV angle ranges for v residuals.
nclusters
Counter for all clusters.
hist_map_residual_pull_u
Histograms for u residual pulls.
nfound_shapes
Counter for cluster where shape likelyhood was found in payload.
hist_map_momentum
Histograms for true particle momenta.
hist_map_residual_u
Histograms for u residuals.
hist_map_theta_v
Histograms for true particle angle thetaV.
hist_map_residual_v
Histograms for v residuals.