10 from ROOT
import Belle2
15 """A simple module to check the reconstruction of PXDTrueHits."""
18 """Initialize the module"""
22 self.
file = open(
'PXDHitErrorOutput.txt',
'w')
26 self.
fHisto = ROOT.TFile(
'PXDPulls.root',
'RECREATE')
28 self.
h_pull_u = ROOT.TH1F(
'h_pull_u',
'Pulls in u', 150, -10, 5)
30 self.
h_pull_v = ROOT.TH1F(
'h_pull_v',
'Pulls in v', 100, -5, 5)
33 """ Write legend for file columns """
35 self.
file.write(
'vxd.id layer ladder sensor truehit.index cluster.index ')
36 self.
file.write(
'truehit.u truehit.v truehit.time truehit.charge theta.u theta.v ')
37 self.
file.write(
'u v u.error v.error rho charge seed size u.size v.size u.pull v.pull\n')
40 """Find clusters with a truehit and print some stats."""
43 nTruehits = truehits.getEntries()
45 nClusters = clusters.getEntries()
47 nDigits = digits.getEntries()
48 relClustersToTrueHits = \
49 Belle2.PyRelationArray(
'PXDClustersToPXDTrueHits')
50 nClusterRelations = relClustersToTrueHits.getEntries()
51 relClustersToDigits = Belle2.PyRelationArray(
'PXDClustersToPXDDigits')
52 nDigitRelations = relClustersToDigits.getEntries()
56 for cluster_index
in range(nClusters):
57 cluster = clusters[cluster_index]
59 relClustersToTrueHits.getToIndices(cluster_index)
63 if len(cluster_truehits) != 1:
66 for truehit_index
in cluster_truehits:
67 truehit = truehits[truehit_index]
71 sensorID = truehit.getRawSensorID()
72 [layer, ladder, sensor] = self.
decode(sensorID)
74 s_id =
'{sID} {layer} {ladder} {sensor} {indexT:4d} {indexC:4d} '.format(
84 thetaU = math.atan2(truehit.getExitU() - truehit.getEntryU(),
86 thetaV = math.atan2(truehit.getExitV() - truehit.getEntryV(),
88 s_th =
'{uTH:10.5f} {vTH:10.5f} {tTH:10.2f} {eTH:10.7f} '.format(
89 uTH=truehit.getU(), vTH=truehit.getV(), tTH=truehit.getGlobalTime(),
90 eTH=truehit.getEnergyDep()) +
'{thetaU:6.3f} {thetaV:6.3f} '.format(thetaU=thetaU, thetaV=thetaV)
96 cluster_pull_u = (cluster.getU() - truehit.getU()) \
98 cluster_pull_v = (cluster.getV() - truehit.getV()) \
100 except ZeroDivisionError
as e:
101 if cluster.getUSigma() < 1.0e-8:
102 B2ERROR(
'Zero error in u, clsize {cl}.'.format(cl=cluster.getUSize()))
104 B2ERROR(
'Zero error in v, clsize {cl}.'.format(cl=cluster.getVSize()))
107 '{u:10.5f} {v:10.5f} {uEr:10.5f} {vEr:10.5f} {rho:10.4f} '.format(
108 u=cluster.getU(), v=cluster.getV(), uEr=cluster.getUSigma(),
109 vEr=cluster.getVSigma(), rho=cluster.getRho()) \
110 +
'{eC:9.1f} {eSeed:9.1f} {size:5d} {uSize:5d} {vSize:5d} '.format(
111 eC=cluster.getCharge(), eSeed=cluster.getSeedCharge(), size=cluster.getSize(),
112 uSize=cluster.getUSize(), vSize=cluster.getVSize()) \
113 +
'{uPull:10.3f} {vPull:10.3f}'.format(
114 uPull=cluster_pull_u, vPull=cluster_pull_v)
119 if cluster.getUSize() == 2:
121 if cluster.getVSize() == 2:
125 """ Close the output file."""
136 """ Utility to decode sensor IDs """
140 result.append(vxdid / f)