14 <contact> SVD Software Group, svd-software@belle2.org </contact>
16 This module is used for the SVD validation.
17 It gets information about clusters and truehits, saving in a ttree in a ROOT file.
28 from ROOT
import Belle2
29 from ROOT
import gROOT, addressof
30 from ROOT
import TVector3
33 gROOT.ProcessLine(
'struct EventDataCluster {\
40 int cluster_truehits_number;\
44 float cluster_position;\
45 float cluster_positionSigma;\
46 float cluster_clsTime;\
47 float cluster_clsTimeSigma;\
48 float cluster_charge;\
49 float cluster_seedCharge;\
52 float cluster_interstripPosition;\
54 float cluster_residual;\
55 float truehit_position;\
56 float truehit_interstripPosition;\
57 float truehit_deposEnergy;\
58 float truehit_lossmomentum;\
67 from ROOT
import EventDataCluster
71 '''class to produce the ttree for cluster validation'''
74 """Initialize the module"""
76 super(SVDValidationTTreeCluster, self).
__init__()
79 self.
filefile = ROOT.TFile(
'../SVDValidationTTreeCluster.root',
'recreate')
81 self.
treetree = ROOT.TTree(
'tree',
'Event data of SVD validation events')
83 self.
datadata = EventDataCluster()
86 for key
in EventDataCluster.__dict__:
89 if isinstance(self.
datadata.__getattribute__(key), int):
91 self.
treetree.Branch(key, addressof(self.
datadata, key), key + formstring)
94 """ Find clusters with a truehit and save needed information """
99 self.
datadata.eventt0_all = -1
100 self.
datadata.eventt0_top = -1
101 self.
datadata.eventt0_cdc = -1
102 self.
datadata.eventt0_ecl = -1
106 if eventt0.hasEventT0():
107 self.
datadata.eventt0_all = eventt0.getEventT0()
108 if eventt0.hasTemporaryEventT0(cdc):
109 tmp = eventt0.getTemporaryEventT0s(Belle2.Const.CDC)
110 self.
datadata.eventt0_cdc = tmp.back().eventT0
111 if eventt0.hasTemporaryEventT0(top):
112 tmp = eventt0.getTemporaryEventT0s(Belle2.Const.TOP)
113 self.
datadata.eventt0_top = tmp.back().eventT0
114 if eventt0.hasTemporaryEventT0(ecl):
115 evtT0List_ECL = eventt0.getTemporaryEventT0s(Belle2.Const.ECL)
117 smallest_ECL_t0_minChi2 = evtT0List_ECL[0].quality
118 self.
datadata.eventt0_ecl = evtT0List_ECL[0].eventT0
119 for tmp
in evtT0List_ECL:
120 if tmp.quality < smallest_ECL_t0_minChi2:
121 smallest_ECL_t0_minChi2 = tmp.quality
122 self.
datadata.eventt0_ecl = tmp.eventT0
124 for cluster
in clusters:
125 cluster_truehits = cluster.getRelationsTo(
'SVDTrueHits')
126 cluster_TrueHit_Length = len(cluster_truehits)
127 if (cluster_TrueHit_Length == 0)
or (cluster_TrueHit_Length != 1):
129 sensorID = cluster.getSensorID()
130 self.
datadata.sensor_id = int(sensorID)
131 sensorNum = sensorID.getSensorNumber()
132 self.
datadata.sensor = sensorNum
133 layerNum = sensorID.getLayerNumber()
134 self.
datadata.layer = layerNum
142 self.
datadata.sensor_type = sensorType
143 ladderNum = sensorID.getLadderNumber()
144 self.
datadata.ladder = ladderNum
146 self.
datadata.strip_dir = -1
147 self.
datadata.cluster_truehits_number = cluster_TrueHit_Length
153 for truehit
in cluster_truehits:
154 self.
datadata.cluster_truehits_number = cluster_TrueHit_Length
157 sensorID = cluster.getSensorID()
158 self.
datadata.sensor_id = int(sensorID)
159 sensorNum = sensorID.getSensorNumber()
160 self.
datadata.sensor = sensorNum
161 layerNum = sensorID.getLayerNumber()
162 self.
datadata.layer = layerNum
170 self.
datadata.sensor_type = sensorType
171 ladderNum = sensorID.getLadderNumber()
172 self.
datadata.ladder = ladderNum
174 self.
datadata.cluster_clsTime = cluster.getClsTime()
175 self.
datadata.cluster_clsTimeSigma = cluster.getClsTimeSigma()
176 self.
datadata.cluster_charge = cluster.getCharge()
177 self.
datadata.cluster_seedCharge = cluster.getSeedCharge()
178 self.
datadata.cluster_size = cluster.getSize()
179 self.
datadata.cluster_snr = cluster.getSNR()
180 cluster_position = cluster.getPosition()
181 if cluster.isUCluster():
182 cluster_position = cluster.getPosition(truehit.getV())
184 if cluster.isUCluster():
186 strip_pitch = sensorInfo.getUPitch(truehit.getV())
189 strip_pitch = sensorInfo.getVPitch(truehit.getU())
190 self.
datadata.strip_dir = strip_dir
191 self.
datadata.strip_pitch = strip_pitch
192 cluster_interstripPosition = cluster_position % strip_pitch / strip_pitch
193 self.
datadata.cluster_interstripPosition = cluster_interstripPosition
195 if cluster.isUCluster():
196 uPos = cluster_position
200 vPos = cluster_position
201 localPosition = TVector3(uPos, vPos, 0)
202 globalPosition = sensorInfo.pointToGlobal(localPosition,
True)
203 x = globalPosition[0]
204 y = globalPosition[1]
205 z = globalPosition[2]
208 rho = math.sqrt(x * x + y * y)
209 r = math.sqrt(x * x + y * y + z * z)
211 thetaRadians = math.acos(z / r)
212 theta = (thetaRadians * 180) / math.pi
214 phiRadians = math.acos(x / rho)
216 phi = 360 - (phiRadians * 180) / math.pi
218 phi = (phiRadians * 180) / math.pi
219 self.
datadata.cluster_theta = theta
220 self.
datadata.cluster_phi = phi
222 clusterPos = cluster_position
223 clusterPosSigma = cluster.getPositionSigma()
224 if cluster.isUCluster():
225 truehitPos = truehit.getU()
227 truehitPos = truehit.getV()
228 cluster_residual = clusterPos - truehitPos
229 cluster_pull = cluster_residual / clusterPosSigma
230 self.
datadata.cluster_position = clusterPos
231 self.
datadata.cluster_positionSigma = clusterPosSigma
232 self.
datadata.cluster_residual = cluster_residual
233 self.
datadata.cluster_pull = cluster_pull
235 self.
datadata.truehit_position = truehitPos
236 truehit_interstripPosition = truehitPos % strip_pitch / strip_pitch
237 self.
datadata.truehit_interstripPosition = truehit_interstripPosition
238 self.
datadata.truehit_deposEnergy = truehit.getEnergyDep()
239 self.
datadata.truehit_lossmomentum = truehit.getEntryMomentum().Mag() - truehit.getExitMomentum().Mag()
240 self.
datadata.truehit_time = truehit.getGlobalTime()
247 """Close the output file. """
249 self.
filefile.Write()
250 self.
filefile.Close()
The DetectorSet class for sets of detector IDs in the form of EDetector values.
a (simplified) python wrapper for StoreArray.
a (simplified) python wrapper for StoreObjPtr.
static const SensorInfoBase & get(Belle2::VxdID id)
Return a reference to the SensorInfo of a given SensorID.
data
instance of EventData class
tree
TTree for output data.