15 from pylab
import savefig, subplot
16 import matplotlib.pyplot
as plt
17 from matplotlib
import ticker
18 import matplotlib
as mpl
23 from ROOT
import Belle2
25 sys.exit(
"No input .root file specified!")
27 inputroot = sys.argv[1]
28 file = ROOT.TFile(inputroot,
"OPEN")
29 vxd = file.Get(
"VXDAlignment")
31 fileName = inputroot +
'.txt'
32 text_file = open(fileName,
"w")
33 text_file.write(
"layer ladder sensor param value\n")
34 for entry
in vxd.getMap():
35 element_parameter = entry.first
37 element = element_parameter.first
38 param = element_parameter.second
40 layer = vxdid.getLayerNumber()
41 ladder = vxdid.getLadderNumber()
42 sensor = vxdid.getSensorNumber()
44 text_file.write(
"{0} {1} {2} {3} {4}\n".format(layer, ladder, sensor, param, value))
51 components = {
'value'}
52 comp_map = {
'value': 0}
53 parameters = {
'du',
'dv',
'dw',
'alpha',
'beta',
'gamma',
'P_20',
'P_11',
'P_02',
'P_30',
'P_21',
'P_12',
'P_03'}
54 param_map = {1:
'du', 2:
'dv', 3:
'dw', 4:
'alpha', 5:
'beta', 6:
'gamma',
55 31:
'P_20', 32:
'P_11', 33:
'P_02',
56 41:
'P_30', 42:
'P_21', 43:
'P_12', 44:
'P_03'}
57 param_nums = dict([(u, v)
for (v, u)
in param_map.items()])
58 layers = {1, 2, 3, 4, 5, 6}
66 3: 33.624 * np.pi / 180,
89 unit_scale = {
'value': {
'shift': (-10.0,
103 print(
'reading from file ' + fileName)
105 dataframe = pd.read_table(
108 skipinitialspace=
True,
118 scale = np.where((dataframe.parameter < 4) | (dataframe.parameter > 6), 1.0e4, 1.0e3)
119 for colname
in [
'value']:
120 dataframe[colname] *= scale
127 data_columns = [
'value']
128 min_shift = dataframe[data_columns][dataframe.parameter < 4].min().min()
129 max_shift = dataframe[data_columns][dataframe.parameter < 4].max().max()
130 min_shift = min(min_shift, -max_shift)
131 max_shift = max(-min_shift, max_shift)
132 min_rot = dataframe[data_columns][(3 < dataframe.parameter) & (dataframe.parameter < 7)].min().min()
133 max_rot = dataframe[data_columns][(3 < dataframe.parameter) & (dataframe.parameter < 7)].max().max()
134 min_rot = min(min_rot, -max_rot)
135 max_rot = max(-min_rot, max_rot)
136 min_sur2 = dataframe[data_columns][(30 < dataframe.parameter) & (dataframe.parameter < 34)].min().min()
137 max_sur2 = dataframe[data_columns][(30 < dataframe.parameter) & (dataframe.parameter < 34)].max().max()
138 min_sur2 = min(min_sur2, -max_sur2)
139 max_sur2 = max(-min_sur2, max_sur2)
140 min_sur3 = dataframe[data_columns][(40 < dataframe.parameter) & (dataframe.parameter < 45)].min().min()
141 max_sur3 = dataframe[data_columns][(40 < dataframe.parameter) & (dataframe.parameter < 45)].max().max()
142 min_sur3 = min(min_sur3, -max_sur3)
143 max_sur3 = max(-min_sur3, max_sur3)
145 if math.isnan(min_rot):
147 if math.isnan(max_rot):
149 if math.isnan(min_shift):
151 if math.isnan(max_shift):
153 if math.isnan(min_sur2):
155 if math.isnan(max_sur2):
157 if math.isnan(min_sur3):
159 if math.isnan(max_sur3):
162 print(
'Symmetrized scales for value: ')
163 print(
'Shifts: ' + str(min_shift) +
' to ' + str(max_shift))
164 print(
'Rotations: ' + str(min_rot) +
' to ' + str(max_rot))
165 print(
'Surface^2 ' + str(min_sur2) +
' to ' + str(max_sur2))
166 print(
'Surface^3 ' + str(min_sur3) +
' to ' + str(max_sur3))
169 unit_scale[
'value'][
'shift'] = (min_shift, max_shift, plt.cm.bwr,
' [um]')
170 unit_scale[
'value'][
'rotation'] = (min_rot, max_rot, plt.cm.bwr,
' [mrad]')
171 unit_scale[
'value'][
'surface2'] = (min_sur2, max_sur2, plt.cm.bwr,
' [um]')
172 unit_scale[
'value'][
'surface3'] = (min_sur3, max_sur3, plt.cm.bwr,
' [um]')
174 fig = plt.figure(figsize=(10, 6.5))
175 for value
in components:
176 for shiftrot, i_params
in zip([
'shift',
'rotation'], [[1, 2, 3], [4, 5, 6]]):
177 cmin, cmax, cmap, unit = unit_scale[value][shiftrot]
178 for i_param
in i_params:
179 parameter = param_map[i_param]
181 val_param = dataframe[[
'layer',
'ladder',
'sensor', value]][dataframe[
'parameter'] == i_param]
182 val_param[value] = val_param[value]
184 ax = subplot(2, 3, i_param, projection=
'polar')
188 ladder_width = 2 * np.pi / layer_nladders[layer]
189 ladder_angles = np.linspace(layer_phi0[layer], layer_phi0[layer] + 2 * np.pi, layer_nladders[layer], endpoint=
False)
191 for sensor
in range(1, 1 + layer_nsensors[layer]):
192 height = (layer > 3
and sensor == 1) * 10.0 + 28.0 / (1.0 + 0.3 * layer + 0.5 * sensor)
193 content = height * np.ones(layer_nladders[layer])
199 label=str(sensor + 1),
204 for (ladder, bar)
in zip(range(1, 1 + layer_nladders[layer]), bars):
205 cond = (val_param.layer == layer) & (val_param.ladder == ladder) & (val_param.sensor == sensor)
207 c = float(val_param[value][cond])
208 except BaseException:
210 if (cmax - cmin) > 0.:
211 color_value = (c - cmin) / (cmax - cmin)
214 bar.set_facecolor(cmap(color_value))
215 bar.set_linewidth(0.2)
218 for i
in range(layer_nladders[layer]):
228 bottom += layer_gap * (1 + 0.5 * (layer == 2))
237 if shiftrot ==
'shift':
238 par_shifts = (cmap, cmin, cmax, unit)
239 elif shiftrot ==
'rotation':
240 par_rots = (cmap, cmin, cmax, unit)
243 axb1 = fig.add_axes([0.01, 0.55, 0.02, 0.33])
244 cmap, cmin, cmax, unit = par_shifts
245 norm1 = mpl.colors.Normalize(vmin=cmin, vmax=cmax)
246 cb1 = mpl.colorbar.ColorbarBase(axb1, cmap=cmap, norm=norm1, orientation=
'vertical')
247 cb1.set_label(
'Shifts ' + unit)
248 cb1.locator = ticker.MaxNLocator(nbins=11)
251 axb2 = fig.add_axes([0.01, 0.11, 0.02, 0.33])
252 cmap, cmin, cmax, unit = par_rots
253 norm2 = mpl.colors.Normalize(vmin=cmin, vmax=cmax)
254 cb2 = mpl.colorbar.ColorbarBase(axb2, cmap=cmap, norm=norm2, orientation=
'vertical')
255 cb2.set_label(
'Rotations ' + unit)
256 cb2.locator = ticker.MaxNLocator(nbins=11)
259 fig.suptitle(value, fontsize=20, x=0.01, y=0.95, horizontalalignment=
'left')
260 figname = inputroot +
'.rigid.png'
262 print(
'Saved figure ' + figname)
264 fig = plt.figure(figsize=(14, 6.5))
265 for value
in components:
266 for shiftrot, i_params
in zip([
'surface2',
'surface3'], [[31, 32, 33], [41, 42, 43, 44]]):
267 cmin, cmax, cmap, unit = unit_scale[value][shiftrot]
268 for i_param
in i_params:
269 parameter = param_map[i_param]
271 val_param = dataframe[[
'layer',
'ladder',
'sensor', value]][dataframe[
'parameter'] == i_param]
272 val_param[value] = val_param[value]
274 if shiftrot ==
'surface2':
275 ax = subplot(2, 4, i_param-30, projection=
'polar')
276 if shiftrot ==
'surface3':
277 ax = subplot(2, 4, i_param-36, projection=
'polar')
281 ladder_width = 2 * np.pi / layer_nladders[layer]
282 ladder_angles = np.linspace(layer_phi0[layer], layer_phi0[layer] + 2 * np.pi, layer_nladders[layer], endpoint=
False)
284 for sensor
in range(1, 1 + layer_nsensors[layer]):
285 height = (layer > 3
and sensor == 1) * 10.0 + 28.0 / (1.0 + 0.3 * layer + 0.5 * sensor)
286 content = height * np.ones(layer_nladders[layer])
292 label=str(sensor + 1),
297 for (ladder, bar)
in zip(range(1, 1 + layer_nladders[layer]), bars):
298 cond = (val_param.layer == layer) & (val_param.ladder == ladder) & (val_param.sensor == sensor)
300 c = float(val_param[value][cond])
301 except BaseException:
303 if (cmax - cmin) > 0.:
304 color_value = (c - cmin) / (cmax - cmin)
307 bar.set_facecolor(cmap(color_value))
308 bar.set_linewidth(0.2)
311 for i
in range(layer_nladders[layer]):
321 bottom += layer_gap * (1 + 0.5 * (layer == 2))
330 if shiftrot ==
'surface2':
331 par_sur2 = (cmap, cmin, cmax, unit)
332 elif shiftrot ==
'surface3':
333 par_sur3 = (cmap, cmin, cmax, unit)
336 axb1 = fig.add_axes([0.01, 0.55, 0.02, 0.33])
337 cmap, cmin, cmax, unit = par_sur2
338 norm1 = mpl.colors.Normalize(vmin=cmin, vmax=cmax)
339 cb1 = mpl.colorbar.ColorbarBase(axb1, cmap=cmap, norm=norm1, orientation=
'vertical')
340 cb1.set_label(
'Quadratic parameters ' + unit)
341 cb1.locator = ticker.MaxNLocator(nbins=11)
344 axb2 = fig.add_axes([0.01, 0.11, 0.02, 0.33])
345 cmap, cmin, cmax, unit = par_sur3
346 norm2 = mpl.colors.Normalize(vmin=cmin, vmax=cmax)
347 cb2 = mpl.colorbar.ColorbarBase(axb2, cmap=cmap, norm=norm2, orientation=
'vertical')
348 cb2.set_label(
'Cubic parameters ' + unit)
349 cb2.locator = ticker.MaxNLocator(nbins=11)
352 fig.suptitle(value, fontsize=20, x=0.01, y=0.95, horizontalalignment=
'left')
354 figname = inputroot +
'.surface.png'
356 print(
'Saved figure ' + figname)
Class to uniquely identify a any structure of the PXD and SVD.