6 <contact> SVD Software Group, svd-software@belle2.org </contact>
8 This module is used for the SVD validation.
9 It gets information about clusters related to SVDRecoTracks, saving
10 in a ttree in a ROOT file.
14 from collections
import OrderedDict
20 from ROOT
import Belle2
21 from ROOT
import gROOT, AddressOf
24 gROOT.ProcessLine(
'struct EventDataRecoTrack {\
30 int cluster_truehits_number;\
31 float cluster_UVTimeDiff;\
32 float cluster_UUTimeDiff;\
33 float cluster_VVTimeDiff;\
37 from ROOT
import EventDataRecoTrack
41 '''class to create the reco track ttree'''
44 """Initialize the module"""
46 super(SVDValidationTTreeRecoTrack, self).
__init__()
47 self.
file = ROOT.TFile(
'../SVDValidationTTreeRecoTrack.root',
'recreate')
48 '''Output ROOT file'''
49 self.
tree = ROOT.TTree(
'tree',
'Event data of SVD validation events')
50 '''TTrees for output data'''
51 self.
data = EventDataRecoTrack()
52 '''Instance of the EventData class'''
55 for key
in EventDataRecoTrack.__dict__:
58 if isinstance(self.
data.__getattribute__(key), int):
60 self.
tree.Branch(key, AddressOf(self.
data, key), key + formstring)
63 """Take clusters from SVDRecoTracks with a truehit and save needed information"""
66 clusters = track.getRelationsWith(
'SVDClusters')
67 dict_cluster = OrderedDict({
'L3': [],
'L4': [],
'L5': [],
'L6': []})
69 for i
in range(0, len(clusters), 2):
70 c_U, c_V = clusters[i], clusters[i+1]
71 cluster_U_truehits = c_U.getRelationsTo(
'SVDTrueHits')
72 U_id = c_U.getSensorID()
73 sensorNum_U = U_id.getSensorNumber()
74 layer_U = U_id.getLayerNumber()
78 clusters_number = len(clusters)
80 if (sensorNum_U == 1):
84 cluster_U = {
'sensor_id': int(U_id),
85 'layer': U_id.getLayerNumber(),
86 'ladder': U_id.getLadderNumber(),
87 'sensor_type': sensor_type_U,
89 'cluster_truehits_number': len(cluster_U_truehits),
90 'cluster_clsTime': c_U.getClsTime()
if len(cluster_U_truehits) == 1
else -128,
91 'cluster_UVTimeDiff': -128,
92 'cluster_UUTimeDiff': -128,
93 'cluster_VVTimeDiff': -128,
94 'clusters_number': clusters_number}
95 cluster_V_truehits = c_V.getRelationsTo(
'SVDTrueHits')
96 V_id = c_V.getSensorID()
97 sensorNum_V = V_id.getSensorNumber()
98 layer_V = V_id.getLayerNumber()
102 if (sensorNum_V == 1):
106 cluster_V = {
'sensor_id': int(V_id),
107 'layer': V_id.getLayerNumber(),
108 'ladder': V_id.getLadderNumber(),
109 'sensor_type': sensor_type_V,
111 'cluster_truehits_number': len(cluster_V_truehits),
112 'cluster_clsTime': c_V.getClsTime()
if len(cluster_V_truehits) == 1
else -128,
113 'cluster_UVTimeDiff': c_U.getClsTime() - c_V.getClsTime()
114 if (len(cluster_U_truehits) == 1)
and (len(cluster_V_truehits) == 1)
else -128,
115 'cluster_UUTimeDiff': -128,
116 'cluster_VVTimeDiff': -128,
117 'clusters_number': clusters_number}
119 if U_id.getLayerNumber() == 3:
120 dict_cluster[
'L3'].append(cluster_U)
121 dict_cluster[
'L3'].append(cluster_V)
122 elif U_id.getLayerNumber() == 4:
123 dict_cluster[
'L4'].append(cluster_U)
124 dict_cluster[
'L4'].append(cluster_V)
125 elif U_id.getLayerNumber() == 5:
126 dict_cluster[
'L5'].append(cluster_U)
127 dict_cluster[
'L5'].append(cluster_V)
128 elif U_id.getLayerNumber() == 6:
129 dict_cluster[
'L6'].append(cluster_U)
130 dict_cluster[
'L6'].append(cluster_V)
132 raise Exception(
'Incorrect number of layer')
134 for (i, layer)
in enumerate(dict_cluster.items()):
135 if i < len(dict_cluster) - 1:
136 next_layer = list(dict_cluster.items())[i + 1]
138 if (layer[0] ==
"L3" and next_layer[0] ==
"L4" and len(layer[1]) != 0
and len(next_layer[1]) != 0)
or \
139 (layer[0] ==
"L4" and next_layer[0] ==
"L5" and len(layer[1]) != 0
and len(next_layer[1]) != 0)
or \
140 (layer[0] ==
"L5" and next_layer[0] ==
"L6" and len(layer[1]) != 0
and len(next_layer[1]) != 0):
141 cluster_UUTimeDiff = \
142 layer[1][0][
'cluster_clsTime'] - next_layer[1][0][
'cluster_clsTime']
143 cluster_VVTimeDiff = \
144 layer[1][1][
'cluster_clsTime'] - next_layer[1][1][
'cluster_clsTime']
145 layer[1][0].update({
'cluster_UUTimeDiff': cluster_UUTimeDiff})
146 layer[1][0].update({
'cluster_VVTimeDiff': -128})
147 layer[1][1].update({
'cluster_UUTimeDiff': -128})
148 layer[1][1].update({
'cluster_VVTimeDiff': cluster_VVTimeDiff})
153 for layer
in dict_cluster.items():
156 self.
data.sensor_id = c[
'sensor_id']
157 self.
data.layer = c[
'layer']
158 self.
data.ladder = c[
'ladder']
159 self.
data.sensor_type = c[
'sensor_type']
160 self.
data.strip_dir = c[
'strip_dir']
161 self.
data.cluster_truehits_number = c[
'cluster_truehits_number']
162 self.
data.cluster_UVTimeDiff = c[
'cluster_UVTimeDiff']
163 self.
data.cluster_UUTimeDiff = c[
'cluster_UUTimeDiff']
164 self.
data.cluster_VVTimeDiff = c[
'cluster_VVTimeDiff']
165 self.
data.clusters_number = c[
'clusters_number']
167 print(layer[0],
": empty list")
173 """Close the output file. """