BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_Silicon_Run8_detailed_aligned.C
Go to the documentation of this file.
1/*
2 * Baranov D.
3 * 13.01.2022 (created)
4 * 12.12.2022 (updated): new module type in the first station and
5 * positions have been corrected in accordance with
6 * the measurement scheme
7 *
8 * 18.01.2023 (updated): shifts to z-positions of modules have been added to compensate
9 * for rotations of half-planes around the Y-axis
10 *
11 * 20.01.2023 (updated): rotation angles around the Y-axis for each half-plane
12 * have been added
13 *
14 * Use this macro to create ROOT geometry for the RUN-8 config. of SILICON
15 * detector including 4 Si-Stations (6-10-14-18 modules)
16 *
17 * WARNING: all units is in cm!!!
18 *
19 */
20
21using namespace TMath;
22
23// Set Parameters of SILICON detector -------------------------------------------
24const Int_t NStations = 4; // stations in the detector
25const Int_t NMaxModules = 22; // max. number of modules in a station
26
27const Int_t NModulesInStations[NStations] = {6, 10, 14, 18};
28
29//(X-Y-Z)Positions of stations (sensitive volumes)
30const Double_t XStationPositions[NStations] = {+0.4025 /*0*/, +0.726 /*1*/, 0.8415 /*2*/,
31 +0.877 /*3*/}; // центр отверстия нижней п.плоскости
32const Double_t YStationPositions[NStations] = {-0.159 /*0*/, -0.165 /*1*/, -0.122 /*2*/,
33 -0.111 /*3*/}; // центр отверстия нижней п.плоскости
35 +14.2735 /*0*/, +23.022 /*1*/, 31.594 /*2*/,
36 40.407 /*3*/}; // реперная точка (средняя измеренная позиция по нижним п.плоскостям (ближним к мишени))
37
38const Double_t z_shift_up = +2.68; // см, z-смещение от реперной точки (точки измерения) до локальной СК базовой точки
39 // для верхних полуплоскостей
40const Double_t z_shift_low = -0.61; // см, z-смещение от реперной точки (точки измерения) до локальной СК базовой
41 // точки для нижних полуплоскостей
42
43const Double_t z_mod_thick = 0.03; // см
44
45const Double_t x_dist_cent_base[NStations] = {21.7 /*0*/, 21.7 /*1*/, 27.7 /*2*/,
46 33.7 /*3*/}; // x-расcтояние от центра полуплоскости до базы
47const Double_t y_dist_cent_base[NStations] = {12.99 /*0*/, 16.29 /*1*/, 16.29 /*2*/,
48 16.29 /*3*/}; // y-расстояние от центра полуплоскости до базы
49
51 +5.0 /*0*/, 5.134 /*1*/, 5.2825 /*2*/,
52 5.106 /*3*/}; // см, z-сдвиг верхней полуплоскости относительно нижней для разных станций
53
55 +0.1255 /*0*/, -0.0105 /*1*/, +0.013 /*2*/,
56 +0.239 /*3*/}; // см, x-сдвиг центра отверстия верхней полуплоскости относительно нижней
57
59 +0.1495 /*0*/, +0.0425 /*1*/, +0.0265 /*2*/,
60 +0.5025 /*3*/}; // см, y-сдвиг центра отверстия верхней полуплоскости относительно нижней
61
63 {-x_dist_cent_base[0] + x_shift_hp[0] + 30.850 /*0*/, -x_dist_cent_base[0] + x_shift_hp[0] + 24.852 /*1*/,
64 -x_dist_cent_base[0] + x_shift_hp[0] + 12.556 /*2*/,
65
66 -x_dist_cent_base[0] + 30.848 /*3*/, -x_dist_cent_base[0] + 24.845 /*4*/, -x_dist_cent_base[0] + 12.548 /*5*/},
67
68 {-x_dist_cent_base[1] + x_shift_hp[1] + 36.866 /*0*/, -x_dist_cent_base[1] + x_shift_hp[1] + 30.8505 /*1*/,
69 -x_dist_cent_base[1] + x_shift_hp[1] + 24.8645 /*2*/, -x_dist_cent_base[1] + x_shift_hp[1] + 12.5575 /*3*/,
70 -x_dist_cent_base[1] + x_shift_hp[1] + 6.5635 /*4*/,
71
72 -x_dist_cent_base[1] + 36.8425 /*5*/, -x_dist_cent_base[1] + 30.8505 /*6*/, -x_dist_cent_base[1] + 24.845 /*7*/,
73 -x_dist_cent_base[1] + 12.555 /*8*/, -x_dist_cent_base[1] + 6.585 /*9*/},
74
75 {-x_dist_cent_base[2] + x_shift_hp[2] + 48.8465 /*0*/, -x_dist_cent_base[2] + x_shift_hp[2] + 42.8315 /*1*/,
76 -x_dist_cent_base[2] + x_shift_hp[2] + 36.8485 /*2*/, -x_dist_cent_base[2] + x_shift_hp[2] + 30.8425 /*3*/,
77 -x_dist_cent_base[2] + x_shift_hp[2] + 18.5555 /*4*/, -x_dist_cent_base[2] + x_shift_hp[2] + 12.5395 /*5*/,
78 -x_dist_cent_base[2] + x_shift_hp[2] + 6.553 /*6*/,
79
80 -x_dist_cent_base[2] + 48.87 /*7*/, -x_dist_cent_base[2] + 42.859 /*8*/, -x_dist_cent_base[2] + 36.857 /*9*/,
81 -x_dist_cent_base[2] + 30.8515 /*10*/, -x_dist_cent_base[2] + 18.556 /*11*/, -x_dist_cent_base[2] + 12.555 /*12*/,
82 -x_dist_cent_base[2] + 6.5535 /*13*/},
83
84 {-x_dist_cent_base[3] + x_shift_hp[3] + 60.862 /*0*/, -x_dist_cent_base[3] + x_shift_hp[3] + 54.8545 /*1*/,
85 -x_dist_cent_base[3] + x_shift_hp[3] + 48.862 /*2*/, -x_dist_cent_base[3] + x_shift_hp[3] + 42.849 /*3*/,
86 -x_dist_cent_base[3] + x_shift_hp[3] + 36.851 /*4*/, -x_dist_cent_base[3] + x_shift_hp[3] + 24.5565 /*5*/,
87 -x_dist_cent_base[3] + x_shift_hp[3] + 18.549 /*6*/, -x_dist_cent_base[3] + x_shift_hp[3] + 12.5515 /*7*/,
88 -x_dist_cent_base[3] + x_shift_hp[3] + 6.651 /*8*/,
89
90 -x_dist_cent_base[3] + 60.8615 /*9*/, -x_dist_cent_base[3] + 54.85 /*10*/, -x_dist_cent_base[3] + 48.863 /*11*/,
91 -x_dist_cent_base[3] + 42.848 /*12*/, -x_dist_cent_base[3] + 36.849 /*13*/, -x_dist_cent_base[3] + 24.548 /*14*/,
92 -x_dist_cent_base[3] + 18.559 /*15*/, -x_dist_cent_base[3] + 12.5545 /*16*/, -x_dist_cent_base[3] + 6.553 /*17*/}};
94 {+y_dist_cent_base[0] + y_shift_hp[0] - 13.112 /*0*/, +y_dist_cent_base[0] + y_shift_hp[0] - 10.113 /*1*/,
95 +y_dist_cent_base[0] + y_shift_hp[0] - 13.086 /*2*/,
96
97 -y_dist_cent_base[0] + 13.100 /*3*/, -y_dist_cent_base[0] + 10.110 /*4*/, -y_dist_cent_base[0] + 13.098 /*5*/},
98
99 {+y_dist_cent_base[1] + y_shift_hp[1] - 16.427 /*0*/, +y_dist_cent_base[1] + y_shift_hp[1] - 16.425 /*1*/,
100 +y_dist_cent_base[1] + y_shift_hp[1] - 13.423 /*2*/, +y_dist_cent_base[1] + y_shift_hp[1] - 16.423 /*3*/,
101 +y_dist_cent_base[1] + y_shift_hp[1] - 16.425 /*4*/,
102
103 -y_dist_cent_base[1] + 16.432 /*5*/, -y_dist_cent_base[1] + 16.423 /*6*/, -y_dist_cent_base[1] + 13.428 /*7*/,
104 -y_dist_cent_base[1] + 16.425 /*8*/, -y_dist_cent_base[1] + 16.429 /*9*/},
105
106 {+y_dist_cent_base[2] + y_shift_hp[2] - 16.424 /*0*/, +y_dist_cent_base[2] + y_shift_hp[2] - 16.427 /*1*/,
107 +y_dist_cent_base[2] + y_shift_hp[2] - 16.427 /*2*/, +y_dist_cent_base[2] + y_shift_hp[2] - 13.411 /*3*/,
108 +y_dist_cent_base[2] + y_shift_hp[2] - 16.431 /*4*/, +y_dist_cent_base[2] + y_shift_hp[2] - 16.420 /*5*/,
109 +y_dist_cent_base[2] + y_shift_hp[2] - 16.430 /*6*/,
110
111 -y_dist_cent_base[2] + 16.420 /*7*/, -y_dist_cent_base[2] + 16.426 /*8*/, -y_dist_cent_base[2] + 16.427 /*9*/,
112 -y_dist_cent_base[2] + 13.428 /*10*/, -y_dist_cent_base[2] + 16.418 /*11*/, -y_dist_cent_base[2] + 16.426 /*12*/,
113 -y_dist_cent_base[2] + 16.417 /*13*/},
114
115 {+y_dist_cent_base[3] + y_shift_hp[3] - 16.414 /*0*/, +y_dist_cent_base[3] + y_shift_hp[3] - 16.414 /*1*/,
116 +y_dist_cent_base[3] + y_shift_hp[3] - 16.413 /*2*/, +y_dist_cent_base[3] + y_shift_hp[3] - 16.420 /*3*/,
117 +y_dist_cent_base[3] + y_shift_hp[3] - 13.417 /*4*/, +y_dist_cent_base[3] + y_shift_hp[3] - 16.426 /*5*/,
118 +y_dist_cent_base[3] + y_shift_hp[3] - 16.418 /*6*/, +y_dist_cent_base[3] + y_shift_hp[3] - 16.425 /*7*/,
119 +y_dist_cent_base[3] + y_shift_hp[3] - 16.427 /*8*/,
120
121 -y_dist_cent_base[3] + 16.430 /*9*/, -y_dist_cent_base[3] + 16.433 /*10*/, -y_dist_cent_base[3] + 16.433 /*11*/,
122 -y_dist_cent_base[3] + 16.430 /*12*/, -y_dist_cent_base[3] + 13.435 /*13*/, -y_dist_cent_base[3] + 16.430 /*14*/,
123 -y_dist_cent_base[3] + 16.434 /*15*/, -y_dist_cent_base[3] + 16.419 /*16*/, -y_dist_cent_base[3] + 16.426 /*17*/}};
125 {+z_shift_hp[0] + z_shift_up - 2.60 /*0*/, +z_shift_hp[0] + z_shift_up - 1.45 /*1*/,
126 +z_shift_hp[0] + z_shift_up - 2.70 /*2*/,
127
128 +z_shift_low - z_mod_thick + 2.61 /*3*/, +z_shift_low - z_mod_thick + 1.40 /*4*/,
129 +z_shift_low - z_mod_thick + 2.79 /*5*/},
130
131 {+z_shift_hp[1] + z_shift_up - 1.430 /*0*/, +z_shift_hp[1] + z_shift_up - 2.605 /*1*/,
132 +z_shift_hp[1] + z_shift_up - 1.435 /*2*/, +z_shift_hp[1] + z_shift_up - 2.750 /*3*/,
133 +z_shift_hp[1] + z_shift_up - 1.580 /*4*/,
134
135 +z_shift_low - z_mod_thick + 1.425 /*5*/, +z_shift_low - z_mod_thick + 2.595 /*6*/,
136 +z_shift_low - z_mod_thick + 1.445 /*7*/, +z_shift_low - z_mod_thick + 2.730 /*8*/,
137 +z_shift_low - z_mod_thick + 1.510 /*9*/},
138
139 {+z_shift_hp[2] + z_shift_up - 2.595 /*0*/, +z_shift_hp[2] + z_shift_up - 1.395 /*1*/,
140 +z_shift_hp[2] + z_shift_up - 2.665 /*2*/, +z_shift_hp[2] + z_shift_up - 1.425 /*3*/,
141 +z_shift_hp[2] + z_shift_up - 2.735 /*4*/, +z_shift_hp[2] + z_shift_up - 1.560 /*5*/,
142 +z_shift_hp[2] + z_shift_up - 2.705 /*6*/,
143
144 +z_shift_low - z_mod_thick + 2.580 /*7*/, +z_shift_low - z_mod_thick + 1.410 /*8*/,
145 +z_shift_low - z_mod_thick + 2.565 /*9*/, +z_shift_low - z_mod_thick + 1.390 /*10*/,
146 +z_shift_low - z_mod_thick + 2.755 /*11*/, +z_shift_low - z_mod_thick + 1.570 /*12*/,
147 +z_shift_low - z_mod_thick + 2.765 /*13*/},
148
149 {+z_shift_hp[3] + z_shift_up - 1.405 /*0*/, +z_shift_hp[3] + z_shift_up - 2.610 /*1*/,
150 +z_shift_hp[3] + z_shift_up - 1.460 /*2*/, +z_shift_hp[3] + z_shift_up - 2.605 /*3*/,
151 +z_shift_hp[3] + z_shift_up - 1.420 /*4*/, +z_shift_hp[3] + z_shift_up - 2.755 /*5*/,
152 +z_shift_hp[3] + z_shift_up - 1.580 /*6*/, +z_shift_hp[3] + z_shift_up - 2.760 /*7*/,
153 +z_shift_hp[3] + z_shift_up - 1.575 /*8*/,
154
155 +z_shift_low - z_mod_thick + 1.450 /*9*/, +z_shift_low - z_mod_thick + 2.575 /*10*/,
156 +z_shift_low - z_mod_thick + 1.445 /*11*/, +z_shift_low - z_mod_thick + 2.600 /*12*/,
157 +z_shift_low - z_mod_thick + 1.455 /*13*/, +z_shift_low - z_mod_thick + 2.745 /*14*/,
158 +z_shift_low - z_mod_thick + 1.575 /*15*/, +z_shift_low - z_mod_thick + 2.700 /*16*/,
159 +z_shift_low - z_mod_thick + 1.545 /*17*/}};
160
161// alignment corrections --------------------------------------------------------
163 {2.68835e-01, 2.39831e-01, 2.52506e-01, 2.05206e-01, 2.11052e-01, 0.20737190},
164 {3.15120e-01, 2.74671e-01, 2.55372e-01, 2.83446e-01, 2.79317e-01, 3.48623e-01, 3.18654e-01, 3.00181e-01,
165 3.16157e-01, 3.80363e-01},
166 {1.65037e-01, 2.71806e-01, 2.66914e-01, 2.40166e-01, 2.59614e-01, 2.66288e-01, 2.83516e-01, 2.88311e-01,
167 2.61280e-01, 3.02609e-01, 2.96469e-01, 2.98769e-01, 2.66650e-01, 3.72627e-01},
168 {3.01013e-01, 3.62381e-01, 3.03249e-01, 3.06502e-01, 2.75747e-01, 2.95530e-01, 3.05152e-01, 3.42706e-01,
169 3.09787e-01, 2.24795e-01, 2.31845e-01, 2.59297e-01, 2.17342e-01, 2.20424e-01, 2.06861e-01, 2.49563e-01,
170 2.64846e-01, 2.02358e-01}};
171
173 {-0.272688, -0.300649, -0.343639, -0.313878, -0.331129, -0.299529},
174 {-0.342847, -0.343267, -0.328436, -0.354188, -0.332445, -0.349645, -0.332025, -0.294098, -0.249696, -0.217585},
175 {-0.398784, -0.342968, -0.325462, -0.325316, -0.338778, -0.338966, -0.324549, -0.339105, -0.314266, -0.301756,
176 -0.288295, -0.272864, -0.272913, -0.21294},
177 {-0.269827, -0.227419, -0.295412, -0.274608, -0.322856, -0.33417, -0.361013, -0.397192, -0.368905, -0.217688,
178 -0.240085, -0.266281, -0.285738, -0.269306, -0.292405, -0.297714, -0.323987, -0.379705}};
179
181 {-0.4, -0.3, -0.23, -0.27, -0.3, -0.23},
182 {-0.5, -0.4, -0.4, -0.28, -0.25, -0.45, -0.45, -0.3, -0.23, -0.2},
183 {-0.3, -0.5, -0.45, -0.4, -0.3, -0.2, -0.2, -0.25, -0.2, -0.3, -0.3, -0.4, -0.5, -0.27},
184 {-0.5, -0.6, -0.4, -0.5, -0.3, -0.35, -0.2, -0.1, -0.4, -0.6, -0.6, -0.6, -0.5, -0.35, -0.2, -0.1, 0.1, 0.}};
185//------------------------------------------------------------------------------
186
187// Geometry parameters of modules
195
208
209// rotations of modules around y-axis by 180 deg.
211 {true /*0*/, true /*1*/, false /*2*/, true /*3*/, true /*4*/, false /*5*/},
212 {true /*0*/, true /*1*/, true /*2*/, false /*3*/, false /*4*/, true /*5*/, true /*6*/, true /*7*/, false /*8*/,
213 false /*9*/},
214 {true /*0*/, true /*1*/, true /*2*/, true /*3*/, false /*4*/, false /*5*/, false /*6*/, true /*7*/, true /*8*/,
215 true /*9*/, true /*10*/, false /*11*/, false /*12*/, false /*13*/},
216 {true /*0*/, true /*1*/, true /*2*/, true /*3*/, true /*4*/, false /*5*/, false /*6*/, false /*7*/, false /*8*/,
217 true /*9*/, true /*10*/, true /*11*/, true /*12*/, true /*13*/, false /*14*/, false /*15*/, false /*16*/,
218 false /*17*/}};
219
220// rotations of modules around x-axis by 180 deg.
222 {false /*0*/, false /*1*/, false /*2*/, true /*3*/, true /*4*/, true /*5*/},
223 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, false /*4*/, true /*5*/, true /*6*/, true /*7*/, true /*8*/,
224 true /*9*/},
225 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, false /*4*/, false /*5*/, false /*6*/, true /*7*/, true /*8*/,
226 true /*9*/, true /*10*/, true /*11*/, true /*12*/, true /*13*/},
227 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, false /*4*/, false /*5*/, false /*6*/, false /*7*/,
228 false /*8*/, true /*9*/, true /*10*/, true /*11*/, true /*12*/, true /*13*/, true /*14*/, true /*15*/, true /*16*/,
229 true /*17*/}};
230
231/*
232//rotations of half-planes around y-axis (angles in degrees)
233const Int_t NMaxHalfPlanes = 2;
234const Double_t HalfPlanesYRotations[NStations][NMaxHalfPlanes] = {
235 {-0.205, -0.235}, // st.0 (upper [0] and lower [1] half-planes)
236 {-0.399, -0.173}, // st.1
237 {-0.151, -0.584}, // st.2
238 {-0.108, +0.367} // st.3
239};
240*/
241
242//------------------------------------------------------------------------------
243
244// GeoManager
246
247// Module parameters ------------------------------------------------------------
249{
252}; // STANDARD_MODULE is (63x126)mm, LONG_MODULE is (63x186)mm
253const unsigned int NModuleSizes = 2;
254
255Double_t YGapBetweenPartsOfModule[NModuleSizes] = {0.0035 /*STANDARD_MODULE*/, 0.0035 /*LONG_MODULE*/}; // Mrs. Slit
256
257Double_t XModuleSize[NModuleSizes] = {6.3 /*STANDARD_MODULE*/, 6.3 /*LONG_MODULE*/};
258
259Double_t YModuleSizeUpperPart[NModuleSizes] = {6.3 /*STANDARD_MODULE*/, 9.3 /*LONG_MODULE*/};
260Double_t YModuleSizeLowerPart[NModuleSizes] = {6.3 /*STANDARD_MODULE*/, 9.3 /*LONG_MODULE*/};
261
268
269Double_t ZModuleSize[NModuleSizes] = {z_mod_thick /*STANDARD_MODULE*/, z_mod_thick /*LONG_MODULE*/};
270
271Double_t XBevelSize[NModuleSizes] = {3.82 /*STANDARD_MODULE*/, 3.82 /*LONG_MODULE*/}; // x-bevel for a angled cut
272Double_t YBevelSize[NModuleSizes] = {3.82 /*STANDARD_MODULE*/, 3.82 /*LONG_MODULE*/}; // y-bevel for a angled cut
273
278
283
284Double_t XLeftBorder[NModuleSizes] = {0.1145 /*STANDARD_MODULE*/, 0.1118 /*LONG_MODULE*/};
285Double_t XRightBorder[NModuleSizes] = {0.1118 /*STANDARD_MODULE*/, 0.1118 /*LONG_MODULE*/};
286Double_t YTopBorder[NModuleSizes] = {0.1143 /*STANDARD_MODULE*/, 0.1148 /*LONG_MODULE*/};
287Double_t YMiddleBorderUpperPart[NModuleSizes] = {0.1121 /*STANDARD_MODULE*/, 0.1148 /*LONG_MODULE*/};
288Double_t YMiddleBorderLowerPart[NModuleSizes] = {0.1147 /*STANDARD_MODULE*/, 0.1148 /*LONG_MODULE*/};
289Double_t YBottomBorder[NModuleSizes] = {0.1148 /*STANDARD_MODULE*/, 0.1148 /*LONG_MODULE*/};
290Double_t XYBevelBorder[NModuleSizes] = {0.1146 /*STANDARD_MODULE*/, 0.1146 /*LONG_MODULE*/};
291
292// Sensor zones ------------------------------------
297
303
310
312 ZModuleSize[STANDARD_MODULE], /*STANDARD_MODULE*/
313 ZModuleSize[LONG_MODULE] /*LONG_MODULE*/
314};
315//-------------------------------------------------
316
317// Module frames -----------------------------------
319 XModuleSize[STANDARD_MODULE], /*STANDARD_MODULE*/
320 XModuleSize[LONG_MODULE] /*LONG_MODULE*/
321};
322
324 YModuleSize[STANDARD_MODULE], /*STANDARD_MODULE*/
325 YModuleSize[LONG_MODULE] /*LONG_MODULE*/
326};
327
328Double_t ZModuleFrameSize[NModuleSizes] = {0.18 /*STANDARD_MODULE*/, 0.18 /*LONG_MODULE*/};
329//-------------------------------------------------
330
331// Y-shift from center of the gap to the global x-axis (for y-alignment of the module)
336
337// X-shift from center of the module to the origin of the local x-axis
339 +XModuleSize[STANDARD_MODULE] * 0.5, /*STANDARD_MODULE*/
340 +XModuleSize[LONG_MODULE] * 0.5 /*LONG_MODULE*/
341};
342
343// Y-shift from center of the module to the origin of the local y-axis
348//------------------------------------------------------------------------------
349/*
350 ASCII module picture (view from target)
351
352 |<---- XModuleSize ---------->| ^
353 | | | Y-axis
354 ------------------------------ ---------
355 | | top border | | ^
356 ------------------------------ |
357 | | | | |
358 | l | rectangle | r | |
359 | e | sensor | i | |
360 | f | zone | g | |
361 | t | | h | |
362 | | | t | |
363 | | | | |
364 ------------------------------ |
365 | | middle (upper part) | |
366 ------ gap between parts ----- YModuleSize
367 | | middle (lower part) | |
368 ------------------------------ |
369 | | | | |
370 | b | bevel (or rect.) | r | |
371 | e | sensor | i | |
372 \ v \ zone | g | |
373 \ e \ | h | |
374 \ l \ | t | |
375 \ \ | | |
376 ------------------------- |
377 \ \ bottom | | v
378 ---------------------- ---------
379
380 * x-axis <----------------------------------(x0,y0) local point
381 */
382
383// media
384// media
392
393class FairGeoMedia;
394class FairGeoBuilder;
395
396// function declarations
397TGeoVolume* CreateStation(TString station_name);
398TGeoVolume* CreateModule(TString module_name, ModuleType module_type, ModuleSize module_size);
399TGeoVolume* CreateModuleFrame(TString module_name, ModuleType module_type, ModuleSize module_size);
400TGeoVolume* CreateFrameForStation_StandardModule(TString frame_name, Int_t current_station_num);
401TGeoVolume* CreateFrameForStation_LongModule(TString frame_name, Int_t current_station_num);
402
403void DefineRequiredMedia(FairGeoMedia* geoMedia, FairGeoBuilder* geoBuild)
404{
405
406 // air medium
407 FairGeoMedium* mAir = geoMedia->getMedium("air");
408 if (!mAir)
409 Fatal("Main", "FairMedium air not found");
410 geoBuild->createMedium(mAir);
411 pMedAir = gGeoManager->GetMedium("air");
412 if (!pMedAir)
413 Fatal("Main", "Medium air not found");
414
415 // carbon medium
416 FairGeoMedium* mCarbon = geoMedia->getMedium("carbon");
417 if (!mCarbon)
418 Fatal("Main", "FairMedium carbon not found");
419 geoBuild->createMedium(mCarbon);
420 pMedCarbon = gGeoManager->GetMedium("carbon");
421 if (!pMedCarbon)
422 Fatal("Main", "Medium carbon not found");
423
424 // fiberglass medium
425 FairGeoMedium* mFiberGlass = geoMedia->getMedium("fiberglass");
426 if (!mFiberGlass)
427 Fatal("Main", "FairMedium fiberglass not found");
428 geoBuild->createMedium(mFiberGlass);
429 pMedFiberGlass = gGeoManager->GetMedium("fiberglass");
430 if (!pMedFiberGlass)
431 Fatal("Main", "Medium fiberglass not found");
432
433 // copper medium
434 FairGeoMedium* mCopper = geoMedia->getMedium("copper");
435 if (!mCopper)
436 Fatal("Main", "FairMedium copper not found");
437 geoBuild->createMedium(mCopper);
438 pMedCopper = gGeoManager->GetMedium("copper");
439 if (!pMedCopper)
440 Fatal("Main", "Medium copper not found");
441
442 // silicon medium
443 FairGeoMedium* mSilicon = geoMedia->getMedium("silicon");
444 if (!mSilicon)
445 Fatal("Main", "FairMedium silicon not found");
446 geoBuild->createMedium(mSilicon);
447 pMedSilicon = gGeoManager->GetMedium("silicon");
448 if (!pMedSilicon)
449 Fatal("Main", "Medium silicon not found");
450
451 // aluminium medium
452 FairGeoMedium* mAluminium = geoMedia->getMedium("aluminium");
453 if (!mAluminium)
454 Fatal("Main", "FairMedium aluminium not found");
455 geoBuild->createMedium(mAluminium);
456 pMedAluminium = gGeoManager->GetMedium("aluminium");
457 if (!pMedAluminium)
458 Fatal("Main", "Medium aluminium not found");
459
460 // polystyrene medium
461 FairGeoMedium* mPolystyrene = geoMedia->getMedium("polystyrene");
462 if (!mPolystyrene)
463 Fatal("Main", "FairMedium polystyrene not found");
464 geoBuild->createMedium(mPolystyrene);
465 pMedPolystyrene = gGeoManager->GetMedium("polystyrene");
466 if (!pMedPolystyrene)
467 Fatal("Main", "Medium polystyrene not found");
468}
469
471{
472 cout << "\n";
473 cout << "Module parameters information [STANDARD_MODULE]: ------------------" << "\n";
474 cout << " XModuleSize = " << XModuleSize[STANDARD_MODULE] << " cm" << "\n";
475 cout << " YModuleSize = " << YModuleSize[STANDARD_MODULE] << " cm" << " ( "
477 << YModuleSizeLowerPart[STANDARD_MODULE] << " )" << "\n";
478 cout << " YModuleSizeUpperPart = " << YModuleSizeUpperPart[STANDARD_MODULE] << " cm" << "\n";
479 cout << " YModuleSizeLowerPart = " << YModuleSizeLowerPart[STANDARD_MODULE] << " cm" << "\n";
480 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule[STANDARD_MODULE] << " cm" << "\n";
481 cout << " ZModuleSize = " << ZModuleSize[STANDARD_MODULE] << " cm" << "\n";
482 cout << "\n";
483 cout << " XBevelSize = " << XBevelSize[STANDARD_MODULE] << " cm" << "\n";
484 cout << " YBevelSize = " << YBevelSize[STANDARD_MODULE] << " cm" << "\n";
485 cout << " BevelAngleDeg = " << BevelAngleDeg[STANDARD_MODULE] << " deg" << "\n";
486 cout << "\n";
487 cout << " XLeftBorder = " << XLeftBorder[STANDARD_MODULE] << " cm" << "\n";
488 cout << " XRightBorder = " << XRightBorder[STANDARD_MODULE] << " cm" << "\n";
489 cout << " YTopBorder = " << YTopBorder[STANDARD_MODULE] << " cm" << "\n";
490 cout << " YMiddleBorderUpperPart = " << YMiddleBorderUpperPart[STANDARD_MODULE] << " cm" << "\n";
491 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule[STANDARD_MODULE] << " cm"
492 << " (gap between two parts)\n";
493 cout << " YMiddleBorderLowerPart = " << YMiddleBorderLowerPart[STANDARD_MODULE] << " cm" << "\n";
494 cout << " YBottomBorder = " << YBottomBorder[STANDARD_MODULE] << " cm" << "\n";
495 cout << " XYBevelBorder = " << XYBevelBorder[STANDARD_MODULE] << " cm" << "\n";
496 cout << "\n";
497 cout << " XSensorZoneSize = " << XSensorZoneSize[STANDARD_MODULE] << " cm" << "\n";
498 cout << " YSensorZoneSizeUpperPart = " << YSensorZoneSizeUpperPart[STANDARD_MODULE] << " cm" << "\n";
499 cout << " YSensorZoneSizeLowerPart = " << YSensorZoneSizeLowerPart[STANDARD_MODULE] << " cm" << "\n";
500 cout << " ZSensorZoneSize = " << ZSensorZoneSize[STANDARD_MODULE] << " cm" << "\n";
501
502 cout << "-------------------------------------------------------------\n";
503
504 cout << "\n";
505 cout << "Module parameters information [LONG_MODULE]: ------------------" << "\n";
506 cout << " XModuleSize = " << XModuleSize[LONG_MODULE] << " cm" << "\n";
507 cout << " YModuleSize = " << YModuleSize[LONG_MODULE] << " cm" << " ( " << YModuleSizeUpperPart[LONG_MODULE]
509 << "\n";
510 cout << " YModuleSizeUpperPart = " << YModuleSizeUpperPart[LONG_MODULE] << " cm" << "\n";
511 cout << " YModuleSizeLowerPart = " << YModuleSizeLowerPart[LONG_MODULE] << " cm" << "\n";
512 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule[LONG_MODULE] << " cm" << "\n";
513 cout << " ZModuleSize = " << ZModuleSize[LONG_MODULE] << " cm" << "\n";
514 cout << "\n";
515 cout << " XBevelSize = " << XBevelSize[LONG_MODULE] << " cm" << "\n";
516 cout << " YBevelSize = " << YBevelSize[LONG_MODULE] << " cm" << "\n";
517 cout << " BevelAngleDeg = " << BevelAngleDeg[LONG_MODULE] << " deg" << "\n";
518 cout << "\n";
519 cout << " XLeftBorder = " << XLeftBorder[LONG_MODULE] << " cm" << "\n";
520 cout << " XRightBorder = " << XRightBorder[LONG_MODULE] << " cm" << "\n";
521 cout << " YTopBorder = " << YTopBorder[LONG_MODULE] << " cm" << "\n";
522 cout << " YMiddleBorderUpperPart = " << YMiddleBorderUpperPart[LONG_MODULE] << " cm" << "\n";
523 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule[LONG_MODULE] << " cm"
524 << " (gap between two parts)\n";
525 cout << " YMiddleBorderLowerPart = " << YMiddleBorderLowerPart[LONG_MODULE] << " cm" << "\n";
526 cout << " YBottomBorder = " << YBottomBorder[LONG_MODULE] << " cm" << "\n";
527 cout << " XYBevelBorder = " << XYBevelBorder[LONG_MODULE] << " cm" << "\n";
528 cout << "\n";
529 cout << " XSensorZoneSize = " << XSensorZoneSize[LONG_MODULE] << " cm" << "\n";
530 cout << " YSensorZoneSizeUpperPart = " << YSensorZoneSizeUpperPart[LONG_MODULE] << " cm" << "\n";
531 cout << " YSensorZoneSizeLowerPart = " << YSensorZoneSizeLowerPart[LONG_MODULE] << " cm" << "\n";
532 cout << " ZSensorZoneSize = " << ZSensorZoneSize[LONG_MODULE] << " cm" << "\n";
533
534 cout << "-------------------------------------------------------------\n";
535}
536
538{
539 cout << "\n";
540 for (Int_t istation = 0; istation < NStations; ++istation) {
541 cout << "station " << istation << ":\n";
542 cout << " XStationPositions[" << istation << "] = " << XStationPositions[istation] << " cm\n";
543 cout << " YStationPositions[" << istation << "] = " << YStationPositions[istation] << " cm\n";
544 cout << " ZStationPositions[" << istation << "] = " << ZStationPositions[istation] << " cm\n";
545 cout << "\n";
546
547 for (Int_t imodule = 0; imodule < NModulesInStations[istation]; ++imodule) {
548 cout << " module " << imodule << ":\n";
549 cout << " XModuleShifts[" << istation << "][" << imodule << "] = " << XModuleShifts[istation][imodule]
550 << " cm\n";
551 cout << " YModuleShifts[" << istation << "][" << imodule << "] = " << YModuleShifts[istation][imodule]
552 << " cm\n";
553 cout << " ZModuleShifts[" << istation << "][" << imodule << "] = " << ZModuleShifts[istation][imodule]
554 << " cm\n";
555 cout << "\n";
556
557 Double_t XGlobalModulePos = XModuleShifts[istation][imodule] + XStationPositions[istation];
558 Double_t YGlobalModulePos = YModuleShifts[istation][imodule] + YStationPositions[istation];
559 Double_t ZGlobalModulePos = ZModuleShifts[istation][imodule] + ZStationPositions[istation];
560
561 cout << " XGlobalModulePos = " << XGlobalModulePos << " cm\n";
562 cout << " YGlobalModulePos = " << YGlobalModulePos << " cm\n";
563 cout << " ZGlobalModulePos = " << ZGlobalModulePos << " cm\n";
564 cout << "\n";
565
566 cout << " ModulesTypes[" << istation << "][" << imodule << "] = ";
567 if (ModulesTypes[istation][imodule] == 0)
568 cout << "RIGHT_ANGLED_MODULE\n";
569 if (ModulesTypes[istation][imodule] == 1)
570 cout << "BEVEL_MODULE\n";
571 if (ModulesTypes[istation][imodule] == 2)
572 cout << "RIGHT_ANGLED_MODULE_HALF\n";
573 if (ModulesTypes[istation][imodule] == 3)
574 cout << "BEVEL_MODULE_HALF\n";
575 cout << " ModulesYRotations[" << istation << "][" << imodule << "] = ";
576 if (ModulesYRotations[istation][imodule] == false)
577 cout << "not rotated around Y\n";
578 if (ModulesYRotations[istation][imodule] == true)
579 cout << "rotated around Y\n";
580 cout << " ModulesXRotations[" << istation << "][" << imodule << "] = ";
581 if (ModulesXRotations[istation][imodule] == false)
582 cout << "not rotated around X\n";
583 if (ModulesXRotations[istation][imodule] == true)
584 cout << "rotated around X\n";
585 cout << "\n";
586 }
587 cout << "-------------------------------------------------------------\n";
588 }
589 cout << "-------------------------------------------------------------\n";
590}
591
593{
594
595 // ---- set working directory --------------------------------------------
596 TString gPath = gSystem->Getenv("VMCWORKDIR");
597
598 // ------- Geometry file name (output) ----------------------------------
599 const TString geoDetectorName = "Silicon";
600 const TString geoDetectorVersion = "Run8_detailed_aligned";
601 const TString geoFileName = gPath + "/geometry/" + geoDetectorName + "_" + geoDetectorVersion + ".root";
602
603 // ---- global geometry parameters ---------------------------------------
604 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
605 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
606
607 // ------- Load media from media file ----------------------------------
608 TString medFile = gPath + "/geometry/media.geo";
609 geoFace->setMediaFile(medFile);
610 geoFace->readMedia();
611 FairGeoMedia* geoMedia = geoFace->getMedia();
612 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
613
614 DefineRequiredMedia(geoMedia, geoBuild);
615 // -------------------------------------------------------------------------
616
617 // Print information about parameters of SILICON
620
621 // -------------- Create geometry and top volume -------------------------
622 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
623 gGeoMan->SetName(geoDetectorName + "_geom");
624 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
625 top->SetMedium(pMedAir);
626 gGeoMan->SetTopVolume(top);
627 // gGeoMan->SetTopVisible(1);
628 // --------------------------------------------------------------------------
629
630 // Define TOP Geometry
631 TGeoVolume* SILICON = new TGeoVolumeAssembly(geoDetectorName);
632 SILICON->SetMedium(pMedAir);
633
634 // Let's create SILICON stations filled with modules
635 for (Int_t istation = 0; istation < NStations; ++istation) {
636 // for(Int_t istation = 1; istation < 2; ++istation) {
637
638 // module size in a station
639 ModuleSize module_size = STANDARD_MODULE;
640
641 // if(istation == 0) module_size = LONG_MODULE;
642
643 TGeoVolume* station = CreateStation(TString("station") + TString::Itoa(istation, 10));
644
645 Int_t NModules = NModulesInStations[istation];
646
647 TGeoVolume* modules[NModules];
648 TGeoVolume* moduleFrames[NModules];
649
650 TGeoCombiTrans* modTransforms[NModules];
651
652 for (Int_t imodule = 0; imodule < NModules; ++imodule) {
653
654 TString module_name = TString("module") + TString::Itoa(imodule, 10) + TString("_") + station->GetName();
655 modules[imodule] = CreateModule(module_name, ModulesTypes[istation][imodule], module_size);
656
657 TString moduleFrame_name =
658 TString("moduleFrame") + TString::Itoa(imodule, 10) + TString("_") + station->GetName();
659 moduleFrames[imodule] = CreateModuleFrame(moduleFrame_name, ModulesTypes[istation][imodule], module_size);
660
661 modTransforms[imodule] = new TGeoCombiTrans();
662
663 // Applying alignment corrections to module shifts
664 XModuleShifts[istation][imodule] -= XAlignmentCorrections[istation][imodule];
665 YModuleShifts[istation][imodule] -= YAlignmentCorrections[istation][imodule];
666 ZModuleShifts[istation][imodule] += ZAlignmentCorrections[istation][imodule];
667
668 if (ModulesYRotations[istation][imodule]) {
669 modTransforms[imodule]->RotateY(180.0);
670 modTransforms[imodule]->SetDx(XModuleShifts[istation][imodule]
671 - XShiftFromCenterToLocalX0[module_size]);
672 } else {
673 modTransforms[imodule]->SetDx(XModuleShifts[istation][imodule]
674 + XShiftFromCenterToLocalX0[module_size]);
675 }
676
677 if (ModulesXRotations[istation][imodule]) {
678 modTransforms[imodule]->RotateX(180.0);
679 if (ModulesTypes[istation][imodule] == ModuleType::BEVEL_MODULE_HALF
680 || ModulesTypes[istation][imodule] == ModuleType::RIGHT_ANGLED_MODULE_HALF)
681 {
682 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule]
683 - YModuleSizeUpperPart[module_size] * 0.5);
684 } else {
685 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule] + YShiftFromCenterToAxis[module_size]
686 - YShiftFromCenterToLocalY0[module_size]);
687 }
688 } else {
689 if (ModulesTypes[istation][imodule] == ModuleType::BEVEL_MODULE_HALF
690 || ModulesTypes[istation][imodule] == ModuleType::RIGHT_ANGLED_MODULE_HALF)
691 {
692 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule]
693 + YModuleSizeUpperPart[module_size] * 0.5);
694 } else {
695 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule] + YShiftFromCenterToAxis[module_size]
696 + YShiftFromCenterToLocalY0[module_size]);
697 }
698 }
699
700 Double_t z_module_shift =
701 +ZModuleSize[module_size] * 0.5; // To z-module position is at the beginning of the sensitive volume
702 modTransforms[imodule]->SetDz(ZModuleShifts[istation][imodule] + z_module_shift);
703
704 // Rotate half-planes
705 if (imodule < NModulesInStations[istation] / 2) { // modules of upper half-plane
706 modTransforms[imodule]->SetDx(modTransforms[imodule]->GetTranslation()[0] - x_shift_hp[istation]);
707 modTransforms[imodule]->SetDy(modTransforms[imodule]->GetTranslation()[1] - y_shift_hp[istation]);
708 modTransforms[imodule]->SetDz(modTransforms[imodule]->GetTranslation()[2] - z_shift_hp[istation]);
709
710 // modTransforms[imodule]->RotateY(HalfPlanesYRotations[istation][0]);
711
712 modTransforms[imodule]->SetDx(modTransforms[imodule]->GetTranslation()[0] + x_shift_hp[istation]);
713 modTransforms[imodule]->SetDy(modTransforms[imodule]->GetTranslation()[1] + y_shift_hp[istation]);
714 modTransforms[imodule]->SetDz(modTransforms[imodule]->GetTranslation()[2] + z_shift_hp[istation]);
715 } else { // modules of lower half-plane
716 modTransforms[imodule]->SetDz(ZModuleShifts[istation][imodule] + z_module_shift);
717 // modTransforms[imodule]->RotateY(HalfPlanesYRotations[istation][1]);
718 }
719
720 TGeoCombiTrans* modFrameTransform = new TGeoCombiTrans(*modTransforms[imodule]);
721
722 if (ModulesYRotations[istation][imodule] ^ ModulesXRotations[istation][imodule]) {
723 modFrameTransform->SetDz(modFrameTransform->GetTranslation()[2]
724 - (ZModuleSize[module_size] * 0.5 + ZModuleFrameSize[module_size] * 0.5));
725 } else {
726 modFrameTransform->SetDz(modFrameTransform->GetTranslation()[2]
727 + (ZModuleSize[module_size] * 0.5 + ZModuleFrameSize[module_size] * 0.5));
728 }
729
730 station->AddNode(modules[imodule], 0, modTransforms[imodule]);
731 station->AddNode(moduleFrames[imodule], 0, modFrameTransform);
732 }
733
734 // frames ---------------------------------------------------------------
735 TGeoVolume* frames;
736 if (module_size == STANDARD_MODULE)
737 frames =
738 CreateFrameForStation_StandardModule(TString("frames") += TString("_") + station->GetName(), istation);
739 if (module_size == LONG_MODULE)
740 frames = CreateFrameForStation_LongModule(TString("frames") += TString("_") + station->GetName(), istation);
741 //----------------------------------------------------------------------
742
743 TGeoCombiTrans* frames_transform = new TGeoCombiTrans();
744 frames_transform->SetDz(+0.61 - 0.065 /*for alignment corr*/);
745
746 station->AddNode(frames, 0, frames_transform);
747 // station->AddNode(frames, 0, new TGeoCombiTrans());
748
749 TGeoCombiTrans* station_transform = new TGeoCombiTrans();
750 station_transform->SetTranslation(XStationPositions[istation], YStationPositions[istation],
751 ZStationPositions[istation]);
752
753 SILICON->AddNode(station, 0, station_transform);
754 }
755
756 top->AddNode(SILICON, 0);
758
759 // --------------- Finish -----------------------------------------------
760 gGeoMan->CloseGeometry();
761 gGeoMan->CheckOverlaps(0.0001);
762 gGeoMan->PrintOverlaps();
763 gGeoMan->Test();
764
765 TFile* geoFile = new TFile(geoFileName, "RECREATE");
766 top->Write();
767 geoFile->Close();
768 top->Draw("ogl");
769}
770//------------------------------------------------------------------------------
771
773{
774
775 TGeoVolume* stationA = new TGeoVolumeAssembly(station_name);
776 stationA->SetMedium(pMedAir);
777
778 return stationA;
779}
780
781TGeoVolume* CreateModule(TString module_name, ModuleType module_type, ModuleSize module_size)
782{
783
784 // Shapes -------------------------------------------------------------------
785 // module shape
786 TGeoShape* moduleS = 0;
787
788 switch (module_type) {
789 case RIGHT_ANGLED_MODULE: {
790 moduleS = new TGeoBBox("moduleS", XModuleSize[module_size] * 0.5, YModuleSize[module_size] * 0.5,
791 ZModuleSize[module_size] * 0.5);
792 break;
793 }
795 moduleS = new TGeoBBox("moduleS", XModuleSize[module_size] * 0.5, YModuleSizeUpperPart[module_size] * 0.5,
796 ZModuleSize[module_size] * 0.5);
797 break;
798 }
799 case BEVEL_MODULE: {
800 moduleS = new TGeoXtru(2);
801 moduleS->SetName("moduleS");
802 Double_t x_pos[5] = {
803 +XModuleSize[module_size] * 0.5, -XModuleSize[module_size] * 0.5, -XModuleSize[module_size] * 0.5,
804 +XModuleSize[module_size] * 0.5 - XBevelSize[module_size], +XModuleSize[module_size] * 0.5};
805 Double_t y_pos[5] = {+YModuleSize[module_size] * 0.5, +YModuleSize[module_size] * 0.5,
806 -YModuleSize[module_size] * 0.5, -YModuleSize[module_size] * 0.5,
807 -YModuleSize[module_size] * 0.5 + YBevelSize[module_size]};
808 ((TGeoXtru*)moduleS)->DefinePolygon(5, x_pos, y_pos);
809 ((TGeoXtru*)moduleS)->DefineSection(0, -ZModuleSize[module_size] * 0.5);
810 ((TGeoXtru*)moduleS)->DefineSection(1, +ZModuleSize[module_size] * 0.5);
811 break;
812 }
813 case BEVEL_MODULE_HALF: {
814 moduleS = new TGeoXtru(2);
815 moduleS->SetName("moduleS");
816 Double_t x_pos[5] = {
817 +XModuleSize[module_size] * 0.5, -XModuleSize[module_size] * 0.5, -XModuleSize[module_size] * 0.5,
818 +XModuleSize[module_size] * 0.5 - XBevelSize[module_size], +XModuleSize[module_size] * 0.5};
819 Double_t y_pos[5] = {+YModuleSizeUpperPart[module_size] * 0.5, +YModuleSizeUpperPart[module_size] * 0.5,
820 -YModuleSizeUpperPart[module_size] * 0.5, -YModuleSizeUpperPart[module_size] * 0.5,
821 -YModuleSizeUpperPart[module_size] * 0.5 + YBevelSize[module_size]};
822 ((TGeoXtru*)moduleS)->DefinePolygon(5, x_pos, y_pos);
823 ((TGeoXtru*)moduleS)->DefineSection(0, -ZModuleSize[module_size] * 0.5);
824 ((TGeoXtru*)moduleS)->DefineSection(1, +ZModuleSize[module_size] * 0.5);
825 break;
826 }
827 default:
828 Error("CreateModule()", "Incorrect module type selected!!!");
829 }
830
831 // sensor zone shape (upper part of the module: rectangle zone)
832 TGeoShape* sensor_zone_upper_part_rectS =
833 new TGeoBBox("sensor_zone_upper_part_rectS", XSensorZoneSize[module_size] * 0.5,
834 YSensorZoneSizeUpperPart[module_size] * 0.5, ZSensorZoneSize[module_size] * 0.5);
835
836 // sensor zone shape (upper part of the module: bevel zone)
837 TGeoShape* sensor_zone_upper_part_bevelS = new TGeoXtru(2);
838 sensor_zone_upper_part_bevelS->SetName("sensor_zone_upper_part_bevelS");
839 // Calculate coordinates of the bottom and the top points of the inner bevel
840 {
841 // find x and y projections of the bevel border thickness
842 Double_t x_delta = XYBevelBorder[module_size] / TMath::Cos(BevelAngleRad[module_size]);
843 Double_t y_delta = XYBevelBorder[module_size] / TMath::Sin(BevelAngleRad[module_size]);
844
845 // find shifts of the sensitive zone from module borders via the equation of the straight line for the inner
846 // bevel
847 Double_t x_delta_top_BP = XLeftBorder[module_size];
848 Double_t y_delta_top_BP = TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]) * x_delta_top_BP
849 + (YBevelSize[module_size] + y_delta);
850
851 Double_t y_delta_bottom_BP = YMiddleBorderUpperPart[module_size];
852 Double_t x_delta_bottom_BP = (y_delta_bottom_BP - (YBevelSize[module_size] + y_delta))
853 / (TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]));
854 //----------------------------------------------------------------------
855
856 Double_t x_pos_sensor_zone_bevel[5] = {+XModuleSize[module_size] * 0.5 - XLeftBorder[module_size],
857 -XModuleSize[module_size] * 0.5 + XRightBorder[module_size],
858 -XModuleSize[module_size] * 0.5 + XRightBorder[module_size],
859 +XModuleSize[module_size] * 0.5 - x_delta_bottom_BP,
860 +XModuleSize[module_size] * 0.5 - XLeftBorder[module_size]};
861 Double_t y_pos_sensor_zone_bevel[5] = {
862 +YModuleSizeUpperPart[module_size] * 0.5 - YTopBorder[module_size],
863 +YModuleSizeUpperPart[module_size] * 0.5 - YTopBorder[module_size],
864 -YModuleSizeUpperPart[module_size] * 0.5 + YMiddleBorderUpperPart[module_size],
865 -YModuleSizeUpperPart[module_size] * 0.5 + YMiddleBorderUpperPart[module_size],
866 -YModuleSizeUpperPart[module_size] * 0.5 + y_delta_top_BP};
867
868 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefinePolygon(5, x_pos_sensor_zone_bevel, y_pos_sensor_zone_bevel);
869 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefineSection(0, -ZModuleSize[module_size] * 0.5);
870 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefineSection(1, +ZModuleSize[module_size] * 0.5);
871 }
872
873 // sensor zone shape (lower part of the module: rectangle zone)
874 TGeoShape* sensor_zone_lower_part_rectS =
875 new TGeoBBox("sensor_zone_lower_part_rectS", XSensorZoneSize[module_size] * 0.5,
876 YSensorZoneSizeLowerPart[module_size] * 0.5, ZSensorZoneSize[module_size] * 0.5);
877
878 // sensor zone shape (lower part of the module: bevel zone)
879 TGeoShape* sensor_zone_lower_part_bevelS = new TGeoXtru(2);
880 sensor_zone_lower_part_bevelS->SetName("sensor_zone_lower_part_bevelS");
881 // Calculate coordinates of the bottom and the top points of the inner bevel
882 {
883 // find x and y projections of the bevel border thickness
884 Double_t x_delta = XYBevelBorder[module_size] / TMath::Cos(BevelAngleRad[module_size]);
885 Double_t y_delta = XYBevelBorder[module_size] / TMath::Sin(BevelAngleRad[module_size]);
886
887 // find shifts of the sensitive zone from module borders via the equation of the straight line for the inner
888 // bevel
889 Double_t x_delta_top_BP = XLeftBorder[module_size];
890 Double_t y_delta_top_BP = TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]) * x_delta_top_BP
891 + (YBevelSize[module_size] + y_delta);
892
893 Double_t y_delta_bottom_BP = YBottomBorder[module_size];
894 Double_t x_delta_bottom_BP = (y_delta_bottom_BP - (YBevelSize[module_size] + y_delta))
895 / (TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]));
896 //----------------------------------------------------------------------
897
898 Double_t x_pos_sensor_zone_bevel[5] = {+XModuleSize[module_size] * 0.5 - XLeftBorder[module_size],
899 -XModuleSize[module_size] * 0.5 + XRightBorder[module_size],
900 -XModuleSize[module_size] * 0.5 + XRightBorder[module_size],
901 +XModuleSize[module_size] * 0.5 - x_delta_bottom_BP,
902 +XModuleSize[module_size] * 0.5 - XLeftBorder[module_size]};
903 Double_t y_pos_sensor_zone_bevel[5] = {
904 +YModuleSizeLowerPart[module_size] * 0.5 - YMiddleBorderLowerPart[module_size],
905 +YModuleSizeLowerPart[module_size] * 0.5 - YMiddleBorderLowerPart[module_size],
906 -YModuleSizeLowerPart[module_size] * 0.5 + YBottomBorder[module_size],
907 -YModuleSizeLowerPart[module_size] * 0.5 + YBottomBorder[module_size],
908 -YModuleSizeLowerPart[module_size] * 0.5 + y_delta_top_BP};
909
910 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefinePolygon(5, x_pos_sensor_zone_bevel, y_pos_sensor_zone_bevel);
911 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefineSection(0, -ZModuleSize[module_size] * 0.5);
912 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefineSection(1, +ZModuleSize[module_size] * 0.5);
913 }
914
915 //--------------------------------------------------------------------------
916
917 // Volumes ------------------------------------------------------------------
918 // module volume
919 // TString module_name = "moduleV_";
920
921 TGeoVolume* moduleV = new TGeoVolume(module_name, moduleS);
922
923 // sensor zone volume (upper part of the module)
924 TGeoVolume* sensor_zone_upper_part_rectV =
925 new TGeoVolume("Sensor_zone_upper_part_rectV", sensor_zone_upper_part_rectS);
926
927 // sensor zone volume (lower part of the module)
928 TGeoVolume* sensor_zone_upper_part_bevelV =
929 new TGeoVolume("Sensor_zone_upper_part_bevelV", sensor_zone_upper_part_bevelS);
930
931 // sensor zone volume (lower part of the module: rectangle zone)
932 TGeoVolume* sensor_zone_lower_part_rectV =
933 new TGeoVolume("Sensor_zone_lower_part_rectV", sensor_zone_lower_part_rectS);
934
935 // sensor zone volume (lower part of the module: bevel zone)
936 TGeoVolume* sensor_zone_lower_part_bevelV =
937 new TGeoVolume("Sensor_zone_lower_part_bevelV", sensor_zone_lower_part_bevelS);
938
939 // volumes media
940 TGeoMedium* silicon_medium = pMedSilicon;
941 if (silicon_medium) {
942 moduleV->SetMedium(silicon_medium);
943 sensor_zone_upper_part_rectV->SetMedium(silicon_medium);
944 sensor_zone_upper_part_bevelV->SetMedium(silicon_medium);
945 sensor_zone_lower_part_rectV->SetMedium(silicon_medium);
946 sensor_zone_lower_part_bevelV->SetMedium(silicon_medium);
947 } else
948 Fatal("Main", "Invalid medium for modules and sensor zones!");
949
950 // volumes visual property (transparency)
951 moduleV->SetLineColor(TColor::GetColor("#ff47ca"));
952 sensor_zone_upper_part_rectV->SetLineColor(TColor::GetColor("#e0b0ff"));
953 sensor_zone_upper_part_bevelV->SetLineColor(TColor::GetColor("#e0b0ff"));
954 sensor_zone_lower_part_rectV->SetLineColor(TColor::GetColor("#e0b0ff"));
955 sensor_zone_lower_part_bevelV->SetLineColor(TColor::GetColor("#e0b0ff"));
956 moduleV->SetTransparency(50);
957
958 switch (module_type) {
959
960 case RIGHT_ANGLED_MODULE: {
961
962 // position of the sensor zone in the upper part of the module
963 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
964 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder[module_size] + XRightBorder[module_size]) * 0.5
965 - XLeftBorder[module_size]);
966 sensor_zone_upper_part_pos->SetDy(
967 +YSensorZoneSizeUpperPart[module_size] * 0.5 + YGapBetweenPartsOfModule[module_size] * 0.5
968 + YMiddleBorderUpperPart[module_size] - YShiftFromCenterToAxis[module_size]);
969 sensor_zone_upper_part_pos->SetDz(0.0);
970
971 // position of the sensor zone in the lower part of the module
972 TGeoTranslation* sensor_zone_lower_part_pos = new TGeoTranslation();
973 sensor_zone_lower_part_pos->SetDx(+(XLeftBorder[module_size] + XRightBorder[module_size]) * 0.5
974 - XLeftBorder[module_size]);
975 sensor_zone_lower_part_pos->SetDy(
976 -YSensorZoneSizeLowerPart[module_size] * 0.5 - YGapBetweenPartsOfModule[module_size] * 0.5
977 - YMiddleBorderLowerPart[module_size] - YShiftFromCenterToAxis[module_size]);
978 sensor_zone_lower_part_pos->SetDz(0.0);
979
980 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
981 moduleV->AddNode(sensor_zone_lower_part_rectV, 0, sensor_zone_lower_part_pos);
982 break;
983 }
984
986 // position of the sensor zone in the upper part of the module
987 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
988 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder[module_size] + XRightBorder[module_size]) * 0.5
989 - XLeftBorder[module_size]);
990 sensor_zone_upper_part_pos->SetDy(+(YTopBorder[module_size] + YMiddleBorderUpperPart[module_size]) * 0.5
991 - YTopBorder[module_size]);
992 sensor_zone_upper_part_pos->SetDz(0.0);
993
994 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
995 break;
996 }
997
998 case BEVEL_MODULE: {
999
1000 // position of the sensor zone in the upper part of the module
1001 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
1002 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder[module_size] + XRightBorder[module_size]) * 0.5
1003 - XLeftBorder[module_size]);
1004 sensor_zone_upper_part_pos->SetDy(
1005 +YSensorZoneSizeUpperPart[module_size] * 0.5 + YGapBetweenPartsOfModule[module_size] * 0.5
1006 + YMiddleBorderUpperPart[module_size] - YShiftFromCenterToAxis[module_size]);
1007 sensor_zone_upper_part_pos->SetDz(0.0);
1008
1009 // position of the sensor zone in the lower part of the module
1010 TGeoTranslation* sensor_zone_lower_part_bevel_pos = new TGeoTranslation();
1011 sensor_zone_lower_part_bevel_pos->SetDx(0.0);
1012 sensor_zone_lower_part_bevel_pos->SetDy(-YModuleSizeLowerPart[module_size] * 0.5
1013 - YGapBetweenPartsOfModule[module_size] * 0.5
1014 - YShiftFromCenterToAxis[module_size]);
1015 sensor_zone_lower_part_bevel_pos->SetDz(0.0);
1016
1017 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
1018 moduleV->AddNode(sensor_zone_lower_part_bevelV, 0, sensor_zone_lower_part_bevel_pos);
1019 break;
1020 }
1021
1022 case BEVEL_MODULE_HALF: {
1023
1024 // position of the sensor zone in the upper part of the module
1025 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
1026 sensor_zone_upper_part_pos->SetDx(0);
1027 sensor_zone_upper_part_pos->SetDy(0);
1028 sensor_zone_upper_part_pos->SetDz(0.0);
1029
1030 moduleV->AddNode(sensor_zone_upper_part_bevelV, 0, sensor_zone_upper_part_pos);
1031 break;
1032 }
1033
1034 default:
1035 Error("CreateModule()", "Incorrect module type selected!!!");
1036 }
1037
1038 return moduleV;
1039}
1040//------------------------------------------------------------------------------
1041
1042TGeoVolume* CreateModuleFrame(TString module_name, ModuleType module_type, ModuleSize module_size)
1043{
1044
1045 // Shapes -------------------------------------------------------------------
1046 // module shape
1047 TGeoShape* frameS = 0;
1048
1049 // frame margins for a basic si-module
1050 Double_t leftMargin = 0.1; // cm
1051 Double_t rightMargin = 0.4; // cm
1052 Double_t bottomMargin = 0.1; // cm
1053 Double_t topMargin = 5.0; // cm
1054
1055 switch (module_type) {
1056 case RIGHT_ANGLED_MODULE: {
1057 // frameS = new TGeoBBox("frameS", XModuleSize*0.5, YModuleSize*0.5, ZModuleFrameSize*0.5);
1058 frameS = new TGeoXtru(2);
1059 frameS->SetName(TString("frameS") += module_name);
1060 Double_t x_pos[12] = {
1061 +(XModuleSize[module_size] * 0.5 + leftMargin) /*0*/,
1062 +(XModuleSize[module_size] * 0.5 + leftMargin) /*1*/,
1063 +(XModuleSize[module_size] * 0.5 + leftMargin + 1.0) /*2*/,
1064 +(XModuleSize[module_size] * 0.5 + leftMargin + 1.0) /*3*/,
1065 +(XModuleSize[module_size] * 0.5 + leftMargin) /*4*/,
1066 +(XModuleSize[module_size] * 0.5 + leftMargin) /*5*/,
1067 -(XModuleSize[module_size] * 0.5 + rightMargin) /*6*/,
1068 -(XModuleSize[module_size] * 0.5 + rightMargin) /*7*/,
1069 -(XModuleSize[module_size] * 0.5 + rightMargin + 1.0) /*8*/,
1070 -(XModuleSize[module_size] * 0.5 + rightMargin + 1.0) /*9*/,
1071 -(XModuleSize[module_size] * 0.5 + rightMargin) /*10*/,
1072 -(XModuleSize[module_size] * 0.5 + rightMargin) /*11*/,
1073 };
1074 Double_t y_pos[12] = {
1075 -(YModuleSize[module_size] * 0.5 + bottomMargin) /*0*/, +(YModuleSize[module_size] * 0.5 - 1.6) /*1*/,
1076 +(YModuleSize[module_size] * 0.5 - 0.5) /*2*/, +(YModuleSize[module_size] * 0.5 + 5.0) /*3*/,
1077 +(YModuleSize[module_size] * 0.5 + 5.0) /*4*/, +(YModuleSize[module_size] * 0.5 + 9.0) /*5*/,
1078 +(YModuleSize[module_size] * 0.5 + 9.0) /*6*/, +(YModuleSize[module_size] * 0.5 + 5.0) /*7*/,
1079 +(YModuleSize[module_size] * 0.5 + 5.0) /*8*/, +(YModuleSize[module_size] * 0.5 - 0.5) /*9*/,
1080 +(YModuleSize[module_size] * 0.5 - 1.6) /*10*/, -(YModuleSize[module_size] * 0.5) /*11*/,
1081 };
1082 ((TGeoXtru*)frameS)->DefinePolygon(12, x_pos, y_pos);
1083 ((TGeoXtru*)frameS)->DefineSection(0, -ZModuleFrameSize[module_size] * 0.5);
1084 ((TGeoXtru*)frameS)->DefineSection(1, +ZModuleFrameSize[module_size] * 0.5);
1085 break;
1086 }
1088 // frameS = new TGeoBBox("frameS", XModuleSize*0.5, YModuleSizeUpperPart*0.5, ZModuleFrameSize*0.5);
1089 frameS = new TGeoXtru(2);
1090 frameS->SetName(TString("frameS") += module_name);
1091 Double_t x_pos[12] = {
1092 +(XModuleSize[module_size] * 0.5 + leftMargin) /*0*/,
1093 +(XModuleSize[module_size] * 0.5 + leftMargin) /*1*/,
1094 +(XModuleSize[module_size] * 0.5 + leftMargin + 1.0) /*2*/,
1095 +(XModuleSize[module_size] * 0.5 + leftMargin + 1.0) /*3*/,
1096 +(XModuleSize[module_size] * 0.5 + leftMargin) /*4*/,
1097 +(XModuleSize[module_size] * 0.5 + leftMargin) /*5*/,
1098 -(XModuleSize[module_size] * 0.5 + rightMargin) /*6*/,
1099 -(XModuleSize[module_size] * 0.5 + rightMargin) /*7*/,
1100 -(XModuleSize[module_size] * 0.5 + rightMargin + 1.0) /*8*/,
1101 -(XModuleSize[module_size] * 0.5 + rightMargin + 1.0) /*9*/,
1102 -(XModuleSize[module_size] * 0.5 + rightMargin) /*10*/,
1103 -(XModuleSize[module_size] * 0.5 + rightMargin) /*11*/,
1104 };
1105 Double_t y_pos[12] = {
1106 -(YModuleSizeUpperPart[module_size] * 0.5 + bottomMargin) /*0*/,
1107 +(YModuleSizeUpperPart[module_size] * 0.5 - 1.6) /*1*/,
1108 +(YModuleSizeUpperPart[module_size] * 0.5 - 0.5) /*2*/,
1109 +(YModuleSizeUpperPart[module_size] * 0.5 + 5.0) /*3*/,
1110 +(YModuleSizeUpperPart[module_size] * 0.5 + 5.0) /*4*/,
1111 +(YModuleSizeUpperPart[module_size] * 0.5 + 9.0) /*5*/,
1112 +(YModuleSizeUpperPart[module_size] * 0.5 + 9.0) /*6*/,
1113 +(YModuleSizeUpperPart[module_size] * 0.5 + 5.0) /*7*/,
1114 +(YModuleSizeUpperPart[module_size] * 0.5 + 5.0) /*8*/,
1115 +(YModuleSizeUpperPart[module_size] * 0.5 - 0.5) /*9*/,
1116 +(YModuleSizeUpperPart[module_size] * 0.5 - 1.6) /*10*/,
1117 -(YModuleSizeUpperPart[module_size] * 0.5) /*11*/,
1118 };
1119 ((TGeoXtru*)frameS)->DefinePolygon(12, x_pos, y_pos);
1120 ((TGeoXtru*)frameS)->DefineSection(0, -ZModuleFrameSize[module_size] * 0.5);
1121 ((TGeoXtru*)frameS)->DefineSection(1, +ZModuleFrameSize[module_size] * 0.5);
1122 break;
1123 }
1124 case BEVEL_MODULE: {
1125 frameS = new TGeoXtru(2);
1126 frameS->SetName(TString("frameS") += module_name);
1127 Double_t x_pos[13] = {
1128 +(XModuleSize[module_size] * 0.5 - XBevelSize[module_size] + leftMargin) /*0*/,
1129 +(XModuleSize[module_size] * 0.5 + leftMargin) /*1*/,
1130 +(XModuleSize[module_size] * 0.5 + leftMargin) /*2*/,
1131 +(XModuleSize[module_size] * 0.5 + leftMargin + 1.0) /*3*/,
1132 +(XModuleSize[module_size] * 0.5 + leftMargin + 1.0) /*4*/,
1133 +(XModuleSize[module_size] * 0.5 + leftMargin) /*5*/,
1134 +(XModuleSize[module_size] * 0.5 + leftMargin) /*6*/,
1135 -(XModuleSize[module_size] * 0.5 + rightMargin) /*7*/,
1136 -(XModuleSize[module_size] * 0.5 + rightMargin) /*8*/,
1137 -(XModuleSize[module_size] * 0.5 + rightMargin + 1.0) /*9*/,
1138 -(XModuleSize[module_size] * 0.5 + rightMargin + 1.0) /*10*/,
1139 -(XModuleSize[module_size] * 0.5 + rightMargin) /*11*/,
1140 -(XModuleSize[module_size] * 0.5 + rightMargin) /*12*/,
1141 };
1142 Double_t y_pos[13] = {
1143 -(YModuleSize[module_size] * 0.5 + bottomMargin) /*0*/,
1144 -(YModuleSize[module_size] * 0.5 - YBevelSize[module_size] + bottomMargin) /*1*/,
1145 +(YModuleSize[module_size] * 0.5 - 1.6) /*2*/,
1146 +(YModuleSize[module_size] * 0.5 - 0.5) /*3*/,
1147 +(YModuleSize[module_size] * 0.5 + 5.0) /*4*/,
1148 +(YModuleSize[module_size] * 0.5 + 5.0) /*5*/,
1149 +(YModuleSize[module_size] * 0.5 + 9.0) /*6*/,
1150 +(YModuleSize[module_size] * 0.5 + 9.0) /*7*/,
1151 +(YModuleSize[module_size] * 0.5 + 5.0) /*8*/,
1152 +(YModuleSize[module_size] * 0.5 + 5.0) /*9*/,
1153 +(YModuleSize[module_size] * 0.5 - 0.5) /*10*/,
1154 +(YModuleSize[module_size] * 0.5 - 1.6) /*11*/,
1155 -(YModuleSize[module_size] * 0.5) /*12*/,
1156 };
1157 ((TGeoXtru*)frameS)->DefinePolygon(13, x_pos, y_pos);
1158 ((TGeoXtru*)frameS)->DefineSection(0, -ZModuleFrameSize[module_size] * 0.5);
1159 ((TGeoXtru*)frameS)->DefineSection(1, +ZModuleFrameSize[module_size] * 0.5);
1160 break;
1161 }
1162 case BEVEL_MODULE_HALF: {
1163 frameS = new TGeoXtru(2);
1164 frameS->SetName(TString("frameS") += module_name);
1165 Double_t x_pos[13] = {
1166 +(XModuleSize[module_size] * 0.5 - XBevelSize[module_size] + leftMargin) /*0*/,
1167 +(XModuleSize[module_size] * 0.5 + leftMargin) /*1*/,
1168 +(XModuleSize[module_size] * 0.5 + leftMargin) /*2*/,
1169 +(XModuleSize[module_size] * 0.5 + leftMargin + 1.0) /*3*/,
1170 +(XModuleSize[module_size] * 0.5 + leftMargin + 1.0) /*4*/,
1171 +(XModuleSize[module_size] * 0.5 + leftMargin) /*5*/,
1172 +(XModuleSize[module_size] * 0.5 + leftMargin) /*6*/,
1173 -(XModuleSize[module_size] * 0.5 + rightMargin) /*7*/,
1174 -(XModuleSize[module_size] * 0.5 + rightMargin) /*8*/,
1175 -(XModuleSize[module_size] * 0.5 + rightMargin + 1.0) /*9*/,
1176 -(XModuleSize[module_size] * 0.5 + rightMargin + 1.0) /*10*/,
1177 -(XModuleSize[module_size] * 0.5 + rightMargin) /*11*/,
1178 -(XModuleSize[module_size] * 0.5 + rightMargin) /*12*/,
1179 };
1180 Double_t y_pos[13] = {
1181 -(YModuleSizeUpperPart[module_size] * 0.5 + bottomMargin) /*0*/,
1182 -(YModuleSizeUpperPart[module_size] * 0.5 - YBevelSize[module_size] + bottomMargin) /*1*/,
1183 +(YModuleSizeUpperPart[module_size] * 0.5 - 1.6) /*2*/,
1184 +(YModuleSizeUpperPart[module_size] * 0.5 - 0.5) /*3*/,
1185 +(YModuleSizeUpperPart[module_size] * 0.5 + 5.0) /*4*/,
1186 +(YModuleSizeUpperPart[module_size] * 0.5 + 5.0) /*5*/,
1187 +(YModuleSizeUpperPart[module_size] * 0.5 + 9.0) /*6*/,
1188 +(YModuleSizeUpperPart[module_size] * 0.5 + 9.0) /*7*/,
1189 +(YModuleSizeUpperPart[module_size] * 0.5 + 5.0) /*8*/,
1190 +(YModuleSizeUpperPart[module_size] * 0.5 + 5.0) /*9*/,
1191 +(YModuleSizeUpperPart[module_size] * 0.5 - 0.5) /*10*/,
1192 +(YModuleSizeUpperPart[module_size] * 0.5 - 1.6) /*11*/,
1193 -(YModuleSizeUpperPart[module_size] * 0.5) /*12*/,
1194 };
1195 ((TGeoXtru*)frameS)->DefinePolygon(13, x_pos, y_pos);
1196 ((TGeoXtru*)frameS)->DefineSection(0, -ZModuleFrameSize[module_size] * 0.5);
1197 ((TGeoXtru*)frameS)->DefineSection(1, +ZModuleFrameSize[module_size] * 0.5);
1198 break;
1199 }
1200 default:
1201 Error("CreateModule()", "Incorrect module type selected!!!");
1202 }
1203
1204 Double_t innerMargin = 0.5; // cm, frame inner margin from edge of sens.
1205
1206 // rectangle window of the frame
1207 TGeoShape* window_rectS = new TGeoBBox(
1208 TString("window_rectS") += module_name, (XModuleSize[module_size] - innerMargin * 2) * 0.5,
1209 (YModuleSize[module_size] * 0.5 - innerMargin * 2) * 0.5, (ZModuleFrameSize[module_size] + 0.001) * 0.5);
1210
1211 // bevel window of the frame
1212 TGeoShape* window_bevelS = new TGeoXtru(2);
1213 window_bevelS->SetName(TString("window_bevelS") += module_name);
1214 // Calculate coordinates of the bottom and the top points of the inner bevel
1215 {
1216 // find x and y projections of the bevel border thickness
1217 Double_t x_delta = innerMargin / TMath::Cos(BevelAngleRad[module_size]);
1218 Double_t y_delta = innerMargin / TMath::Sin(BevelAngleRad[module_size]);
1219
1220 // find shifts of the sensitive zone from module borders via the equation of the straight line for the inner
1221 // bevel
1222 Double_t x_delta_top_BP = innerMargin;
1223 Double_t y_delta_top_BP = TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]) * x_delta_top_BP
1224 + (YBevelSize[module_size] + y_delta);
1225
1226 Double_t y_delta_bottom_BP = innerMargin;
1227 Double_t x_delta_bottom_BP = (y_delta_bottom_BP - (YBevelSize[module_size] + y_delta))
1228 / (TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]));
1229 //----------------------------------------------------------------------
1230
1231 Double_t x_pos[5] = {
1232 +XModuleSize[module_size] * 0.5 - innerMargin, -XModuleSize[module_size] * 0.5 + innerMargin,
1233 -XModuleSize[module_size] * 0.5 + innerMargin, +XModuleSize[module_size] * 0.5 - x_delta_bottom_BP,
1234 +XModuleSize[module_size] * 0.5 - innerMargin};
1235 Double_t y_pos[5] = {
1236 +YModuleSize[module_size] * 0.25 - innerMargin, +YModuleSize[module_size] * 0.25 - innerMargin,
1237 -YModuleSize[module_size] * 0.25 + innerMargin, -YModuleSize[module_size] * 0.25 + innerMargin,
1238 -YModuleSize[module_size] * 0.25 + y_delta_top_BP};
1239
1240 ((TGeoXtru*)window_bevelS)->DefinePolygon(5, x_pos, y_pos);
1241 ((TGeoXtru*)window_bevelS)->DefineSection(0, -(ZModuleFrameSize[module_size] + 0.001) * 0.5);
1242 ((TGeoXtru*)window_bevelS)->DefineSection(1, +(ZModuleFrameSize[module_size] + 0.001) * 0.5);
1243 }
1244
1245 // translations
1246 TGeoTranslation* upper_window_frame_pos = new TGeoTranslation();
1247 upper_window_frame_pos->SetName(TString("upper_window_frame_pos") += module_name);
1248 upper_window_frame_pos->SetDx(0.0);
1249 upper_window_frame_pos->SetDy(+YSensorZoneSizeUpperPart[module_size] * 0.5
1250 + YGapBetweenPartsOfModule[module_size] * 0.5 + YMiddleBorderUpperPart[module_size]
1251 - YShiftFromCenterToAxis[module_size]);
1252 upper_window_frame_pos->SetDz(0.0);
1253 upper_window_frame_pos->RegisterYourself();
1254
1255 TGeoTranslation* lower_window_frame_pos = new TGeoTranslation();
1256 lower_window_frame_pos->SetName(TString("lower_window_frame_pos") += module_name);
1257 lower_window_frame_pos->SetDx(0.0);
1258 lower_window_frame_pos->SetDy(-YSensorZoneSizeLowerPart[module_size] * 0.5
1259 - YGapBetweenPartsOfModule[module_size] * 0.5 - YMiddleBorderLowerPart[module_size]
1260 - YShiftFromCenterToAxis[module_size]);
1261 lower_window_frame_pos->SetDz(0.0);
1262 lower_window_frame_pos->RegisterYourself();
1263
1264 TGeoTranslation* window_half_frame_pos = new TGeoTranslation();
1265 window_half_frame_pos->SetName(TString("window_half_frame_pos") += module_name);
1266 window_half_frame_pos->SetDx(0.0);
1267 window_half_frame_pos->SetDy(0.0);
1268 window_half_frame_pos->SetDz(0.0);
1269 window_half_frame_pos->RegisterYourself();
1270
1271 TGeoCompositeShape* frame_with_windowsS = new TGeoCompositeShape();
1272 frame_with_windowsS->SetName("frame_with_windowsS");
1273
1274 switch (module_type) {
1275
1276 case RIGHT_ANGLED_MODULE: {
1277 TString expression = "(frameS";
1278 expression += module_name;
1279 expression += "-window_rectS";
1280 expression += module_name;
1281 expression += ":upper_window_frame_pos";
1282 expression += module_name;
1283 expression += ")-window_rectS";
1284 expression += module_name;
1285 expression += ":lower_window_frame_pos";
1286 expression += module_name;
1287 frame_with_windowsS->MakeNode(expression);
1288 frame_with_windowsS->ComputeBBox();
1289 break;
1290 }
1291
1293 TString expression = "(frameS";
1294 expression += module_name;
1295 expression += ")-window_rectS";
1296 expression += module_name;
1297 expression += ":window_half_frame_pos";
1298 expression += module_name;
1299 frame_with_windowsS->MakeNode(expression);
1300 frame_with_windowsS->ComputeBBox();
1301 break;
1302 }
1303
1304 case BEVEL_MODULE: {
1305 TString expression = "(frameS";
1306 expression += module_name;
1307 expression += "-window_rectS";
1308 expression += module_name;
1309 expression += ":upper_window_frame_pos";
1310 expression += module_name;
1311 expression += ")-window_bevelS";
1312 expression += module_name;
1313 expression += ":lower_window_frame_pos";
1314 expression += module_name;
1315 frame_with_windowsS->MakeNode(expression);
1316 frame_with_windowsS->ComputeBBox();
1317 break;
1318 }
1319
1320 case BEVEL_MODULE_HALF: {
1321 TString expression = "(frameS";
1322 expression += module_name;
1323 expression += ")-window_bevelS";
1324 expression += module_name;
1325 expression += ":window_half_frame_pos";
1326 expression += module_name;
1327 frame_with_windowsS->MakeNode(expression);
1328 frame_with_windowsS->ComputeBBox();
1329 break;
1330 }
1331
1332 default:
1333 Error("CreateModule()", "Incorrect module type selected!!!");
1334 }
1335 //--------------------------------------------------------------------------
1336
1337 // Volumes ------------------------------------------------------------------
1338 // module frame volume
1339 TGeoVolume* frameV = new TGeoVolume(module_name, frame_with_windowsS);
1340
1341 // volumes media
1342 TGeoMedium* carbon_medium = pMedCarbon;
1343 if (carbon_medium) {
1344 frameV->SetMedium(carbon_medium);
1345 } else
1346 Fatal("Main", "Invalid medium for frameV!");
1347
1348 // volumes visual property (transparency)
1349 frameV->SetLineColor(TColor::GetColor("#cccccc"));
1350 frameV->SetTransparency(0);
1351
1352 return frameV;
1353}
1354//------------------------------------------------------------------------------
1355
1357{
1358
1359 // TGeoVolume *frames = new TGeoVolumeAssembly(frame_name);
1360
1361 TGeoVolume* frames = new TGeoVolumeAssembly(frame_name);
1362 frames->SetMedium(pMedAir);
1363
1364 Int_t NModules = NModulesInStations[current_station_num];
1365
1366 // face shield ----------------------------------------------------------
1367 Double_t faceShild_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 8.6; // cm
1368 Double_t faceShild_YSize = 14.74; // cm
1369 Double_t faceShild_ZSize = 0.3; // cm
1370
1371 TGeoShape* faceShildS = new TGeoXtru(2);
1372 faceShildS->SetName("faceShildS");
1373 {
1374 Double_t x_pos[8] = {faceShild_XSize * 0.5,
1375 faceShild_XSize * 0.5,
1376 -faceShild_XSize * 0.5,
1377 -faceShild_XSize * 0.5,
1378 -2.75,
1379 -2.3,
1380 2.3,
1381 2.75};
1382 Double_t y_pos[8] = {-faceShild_YSize * 0.5,
1383 faceShild_YSize * 0.5,
1384 faceShild_YSize * 0.5,
1385 -faceShild_YSize * 0.5,
1386 -faceShild_YSize * 0.5,
1387 -3.8,
1388 -3.8,
1389 -faceShild_YSize * 0.5};
1390 ((TGeoXtru*)faceShildS)->DefinePolygon(8, x_pos, y_pos);
1391 ((TGeoXtru*)faceShildS)->DefineSection(0, -faceShild_ZSize * 0.5);
1392 ((TGeoXtru*)faceShildS)->DefineSection(1, +faceShild_ZSize * 0.5);
1393 }
1394
1395 TGeoVolume* faceShildV = new TGeoVolume(TString("faceShildV") += TString("_") + frames->GetName(), faceShildS);
1396
1397 // volume medium
1398 TGeoMedium* faceShildV_medium = pMedPolystyrene;
1399 if (faceShildV_medium) {
1400 faceShildV->SetMedium(faceShildV_medium);
1401 } else
1402 Fatal("Main", "Invalid medium for faceShildV!");
1403
1404 // volume visual property (transparency)
1405 faceShildV->SetLineColor(TColor::GetColor("#ccffcc"));
1406 faceShildV->SetTransparency(50);
1407
1408 TGeoCombiTrans* faceShild_transf[4];
1409
1410 faceShild_transf[0] = new TGeoCombiTrans();
1411 faceShild_transf[0]->SetDy(+faceShild_YSize * 0.5 - 0.95);
1412 faceShild_transf[0]->SetDz(+0.695 /*center of half-plane*/ - 1.35 /*half-thick of frame box*/
1413 - faceShild_ZSize * 0.5 /*face shield shift*/ + 4.31 /*half-plane shift*/);
1414
1415 faceShild_transf[1] = new TGeoCombiTrans();
1416 faceShild_transf[1]->SetDy(+faceShild_YSize * 0.5 - 0.95);
1417 faceShild_transf[1]->SetDz(+0.695 /*center of half-plane*/ + 1.35 /*half-thick of frame box*/
1418 + faceShild_ZSize * 0.5 /*face shield shift*/ + 4.31 /*half-plane shift*/);
1419
1420 faceShild_transf[2] = new TGeoCombiTrans();
1421 faceShild_transf[2]->RotateX(180.0);
1422 faceShild_transf[2]->SetDy(-faceShild_YSize * 0.5 + 0.95);
1423 faceShild_transf[2]->SetDz(+0.695 /*center of half-plane*/ - 1.35 /*half-thick of frame box*/
1424 - faceShild_ZSize * 0.5 /*face shield shift*/);
1425
1426 faceShild_transf[3] = new TGeoCombiTrans();
1427 faceShild_transf[3]->RotateX(180.0);
1428 faceShild_transf[3]->SetDy(-faceShild_YSize * 0.5 + 0.95);
1429 faceShild_transf[3]->SetDz(+0.695 /*center of half-plane*/ + 1.35 /*half-thick of frame box*/
1430 + faceShild_ZSize * 0.5 /*face shield shift*/);
1431
1432 frames->AddNode(faceShildV, 0, faceShild_transf[0]);
1433 frames->AddNode(faceShildV, 1, faceShild_transf[1]);
1434 frames->AddNode(faceShildV, 2, faceShild_transf[2]);
1435 frames->AddNode(faceShildV, 3, faceShild_transf[3]);
1436 //----------------------------------------------------------------------
1437
1438 // sidewall of shield ---------------------------------------------------
1439 Double_t sideShild_XSize = 0.95; // cm
1440 Double_t sideShild_YSize = 15.2; // cm
1441 Double_t sideShild_ZSize = 2.7; // cm
1442
1443 TGeoShape* sideShieldS =
1444 new TGeoBBox("sideShieldS", sideShild_XSize * 0.5, sideShild_YSize * 0.5, sideShild_ZSize * 0.5);
1445
1446 TGeoVolume* sideShieldV = new TGeoVolume(TString("sideShieldV") += TString("_") + frames->GetName(), sideShieldS);
1447
1448 // volume medium
1449 TGeoMedium* sideShieldV_medium = pMedAluminium;
1450 if (sideShieldV_medium) {
1451 sideShieldV->SetMedium(sideShieldV_medium);
1452 } else
1453 Fatal("Main", "Invalid medium for sideShieldV!");
1454
1455 // volume visual property (transparency)
1456 sideShieldV->SetLineColor(TColor::GetColor("#ffcccc"));
1457 sideShieldV->SetTransparency(50);
1458
1459 TGeoCombiTrans* sideShild_transf[4];
1460
1461 sideShild_transf[0] = new TGeoCombiTrans();
1462 sideShild_transf[0]->SetDx(+(faceShild_XSize * 0.5 - sideShild_XSize * 0.5));
1463 sideShild_transf[0]->SetDy(+faceShild_YSize * 0.5 - 0.95 + (sideShild_YSize - faceShild_YSize) * 0.5);
1464 sideShild_transf[0]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
1465
1466 sideShild_transf[1] = new TGeoCombiTrans();
1467 sideShild_transf[1]->SetDx(-(faceShild_XSize * 0.5 - sideShild_XSize * 0.5));
1468 sideShild_transf[1]->SetDy(+faceShild_YSize * 0.5 - 0.95 + (sideShild_YSize - faceShild_YSize) * 0.5);
1469 sideShild_transf[1]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
1470
1471 sideShild_transf[2] = new TGeoCombiTrans();
1472 sideShild_transf[2]->SetDx(+(faceShild_XSize * 0.5 - sideShild_XSize * 0.5));
1473 sideShild_transf[2]->SetDy(-faceShild_YSize * 0.5 + 0.95 - (sideShild_YSize - faceShild_YSize) * 0.5);
1474 sideShild_transf[2]->SetDz(+0.695 /*center of half-plane*/);
1475
1476 sideShild_transf[3] = new TGeoCombiTrans();
1477 sideShild_transf[3]->SetDx(-(faceShild_XSize * 0.5 - sideShild_XSize * 0.5));
1478 sideShild_transf[3]->SetDy(-faceShild_YSize * 0.5 + 0.95 - (sideShild_YSize - faceShild_YSize) * 0.5);
1479 sideShild_transf[3]->SetDz(+0.695 /*center of half-plane*/);
1480
1481 frames->AddNode(sideShieldV, 0, sideShild_transf[0]);
1482 frames->AddNode(sideShieldV, 1, sideShild_transf[1]);
1483 frames->AddNode(sideShieldV, 2, sideShild_transf[2]);
1484 frames->AddNode(sideShieldV, 3, sideShild_transf[3]);
1485 //----------------------------------------------------------------------
1486
1487 // horizontal plane of shield -------------------------------------------
1488 Double_t horizShild_XSize = faceShild_XSize * 0.5 - sideShild_XSize - 2.75 /*half-size of hole*/; // cm
1489 Double_t horizShild_YSize = 0.3; // cm
1490 Double_t horizShild_ZSize = 2.7; // cm
1491
1492 TGeoShape* horizShieldS =
1493 new TGeoBBox("horizShieldS", horizShild_XSize * 0.5, horizShild_YSize * 0.5, horizShild_ZSize * 0.5);
1494
1495 TGeoVolume* horizShieldV =
1496 new TGeoVolume(TString("horizShieldV") += TString("_") + frames->GetName(), horizShieldS);
1497
1498 // volume medium
1499 TGeoMedium* horizShieldV_medium = pMedPolystyrene;
1500 if (horizShieldV_medium) {
1501 horizShieldV->SetMedium(horizShieldV_medium);
1502 } else
1503 Fatal("Main", "Invalid medium for horizShieldV!");
1504
1505 // volume visual property (transparency)
1506 horizShieldV->SetLineColor(TColor::GetColor("#ccffcc"));
1507 horizShieldV->SetTransparency(50);
1508
1509 TGeoCombiTrans* horizShild_transf[4];
1510
1511 horizShild_transf[0] = new TGeoCombiTrans();
1512 horizShild_transf[0]->SetDx(+(faceShild_XSize * 0.5 - horizShild_XSize * 0.5 - sideShild_XSize));
1513 horizShild_transf[0]->SetDy(+(-0.95 + horizShild_YSize * 0.5));
1514 horizShild_transf[0]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
1515
1516 horizShild_transf[1] = new TGeoCombiTrans();
1517 horizShild_transf[1]->SetDx(-(faceShild_XSize * 0.5 - horizShild_XSize * 0.5 - sideShild_XSize));
1518 horizShild_transf[1]->SetDy(+(-0.95 + horizShild_YSize * 0.5));
1519 horizShild_transf[1]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
1520
1521 horizShild_transf[2] = new TGeoCombiTrans();
1522 horizShild_transf[2]->SetDx(+(faceShild_XSize * 0.5 - horizShild_XSize * 0.5 - sideShild_XSize));
1523 horizShild_transf[2]->SetDy(-(-0.95 + horizShild_YSize * 0.5));
1524 horizShild_transf[2]->SetDz(+0.695 /*center of half-plane*/);
1525
1526 horizShild_transf[3] = new TGeoCombiTrans();
1527 horizShild_transf[3]->SetDx(-(faceShild_XSize * 0.5 - horizShild_XSize * 0.5 - sideShild_XSize));
1528 horizShild_transf[3]->SetDy(-(-0.95 + horizShild_YSize * 0.5));
1529 horizShild_transf[3]->SetDz(+0.695 /*center of half-plane*/);
1530
1531 frames->AddNode(horizShieldV, 0, horizShild_transf[0]);
1532 frames->AddNode(horizShieldV, 1, horizShild_transf[1]);
1533 frames->AddNode(horizShieldV, 2, horizShild_transf[2]);
1534 frames->AddNode(horizShieldV, 3, horizShild_transf[3]);
1535 //----------------------------------------------------------------------
1536
1537 // plank of shield ------------------------------------------------------
1538 Double_t plankShild_XSize = faceShild_XSize; // cm
1539 Double_t plankShild_YSize = 1.5; // cm
1540 Double_t plankShild_ZSize = 0.3; // cm
1541
1542 TGeoShape* plankShieldS =
1543 new TGeoBBox("plankShieldS", plankShild_XSize * 0.5, plankShild_YSize * 0.5, plankShild_ZSize * 0.5);
1544
1545 TGeoVolume* plankShieldV =
1546 new TGeoVolume(TString("plankShieldV") += TString("_") + frames->GetName(), plankShieldS);
1547
1548 // volume medium
1549 TGeoMedium* plankShieldV_medium = pMedAluminium;
1550 if (plankShieldV_medium) {
1551 plankShieldV->SetMedium(plankShieldV_medium);
1552 } else
1553 Fatal("Main", "Invalid medium for plankShieldV!");
1554
1555 // volume visual property (transparency)
1556 plankShieldV->SetLineColor(TColor::GetColor("#ffcccc"));
1557 plankShieldV->SetTransparency(50);
1558
1559 TGeoCombiTrans* plankShild_transf[4];
1560
1561 plankShild_transf[0] = new TGeoCombiTrans();
1562 plankShild_transf[0]->SetDx(0.0);
1563 plankShild_transf[0]->SetDy(+(-0.95 + faceShild_YSize) - 0.05);
1564 plankShild_transf[0]->SetDz(
1565 +0.695 /*center of half-plane*/ - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize * 0.5)
1566 + 4.31 /*half-plane shift*/);
1567
1568 plankShild_transf[1] = new TGeoCombiTrans();
1569 plankShild_transf[1]->SetDx(0.0);
1570 plankShild_transf[1]->SetDy(+(-0.95 + faceShild_YSize) - 0.05);
1571 plankShild_transf[1]->SetDz(
1572 +0.695 /*center of half-plane*/ + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize * 0.5)
1573 + 4.31 /*half-plane shift*/);
1574
1575 plankShild_transf[2] = new TGeoCombiTrans();
1576 plankShild_transf[2]->SetDx(0.0);
1577 plankShild_transf[2]->SetDy(-(-0.95 + faceShild_YSize) + 0.05);
1578 plankShild_transf[2]->SetDz(+0.695 /*center of half-plane*/
1579 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize * 0.5));
1580
1581 plankShild_transf[3] = new TGeoCombiTrans();
1582 plankShild_transf[3]->SetDx(0.0);
1583 plankShild_transf[3]->SetDy(-(-0.95 + faceShild_YSize) + 0.05);
1584 plankShild_transf[3]->SetDz(+0.695 /*center of half-plane*/
1585 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize * 0.5));
1586
1587 frames->AddNode(plankShieldV, 0, plankShild_transf[0]);
1588 frames->AddNode(plankShieldV, 1, plankShild_transf[1]);
1589 frames->AddNode(plankShieldV, 2, plankShild_transf[2]);
1590 frames->AddNode(plankShieldV, 3, plankShild_transf[3]);
1591 //----------------------------------------------------------------------
1592
1593 // base rail
1594 Double_t baseRailMainPart_XSize = faceShild_XSize + 3.4 * 2 /*margin*/; // cm
1595 Double_t baseRailMainPart_YSize = 5.0; // cm
1596 Double_t baseRailMainPart_ZSize = 0.7; // cm
1597
1598 cout << "baseRailMainPart_XSize = " << baseRailMainPart_XSize << "\n";
1599
1600 Double_t baseRailUpperPart_XSize = baseRailMainPart_XSize; // cm
1601 Double_t baseRailUpperPart_YSize = 1.0; // cm
1602 Double_t baseRailUpperPart_ZSize = 0.3; // cm
1603
1604 Double_t baseRailLowerPart_XSize = baseRailMainPart_XSize - 8.8 /*cut*/; // cm
1605 Double_t baseRailLowerPart_YSize = 0.7; // cm
1606 Double_t baseRailLowerPart_ZSize = 0.3; // cm
1607
1608 TGeoShape* baseRailMainPartS =
1609 new TGeoBBox(TString("baseRailMainPartS") += TString("_") + frames->GetName(), baseRailMainPart_XSize * 0.5,
1610 baseRailMainPart_YSize * 0.5, baseRailMainPart_ZSize * 0.5);
1611 TGeoShape* baseRailUpperPartS =
1612 new TGeoBBox(TString("baseRailUpperPartS") += TString("_") + frames->GetName(), baseRailUpperPart_XSize * 0.5,
1613 baseRailUpperPart_YSize * 0.5, baseRailUpperPart_ZSize * 0.5);
1614 TGeoShape* baseRailLowerPartS =
1615 new TGeoBBox(TString("baseRailLowerPartS") += TString("_") + frames->GetName(), baseRailLowerPart_XSize * 0.5,
1616 baseRailLowerPart_YSize * 0.5, baseRailLowerPart_ZSize * 0.5);
1617
1618 TGeoTranslation* baseRailUpperPart_pos = new TGeoTranslation();
1619 baseRailUpperPart_pos->SetName(TString("baseRailUpperPart_pos") += TString("_") + frames->GetName());
1620 baseRailUpperPart_pos->SetDx(0.0);
1621 baseRailUpperPart_pos->SetDy(+(baseRailMainPart_YSize * 0.5 + baseRailUpperPart_YSize * 0.5));
1622 baseRailUpperPart_pos->SetDz(baseRailMainPart_ZSize * 0.5 - baseRailUpperPart_ZSize * 0.5);
1623 baseRailUpperPart_pos->RegisterYourself();
1624
1625 TGeoTranslation* baseRailLowerPart_pos = new TGeoTranslation();
1626 baseRailLowerPart_pos->SetName(TString("baseRailLowerPart_pos") += TString("_") + frames->GetName());
1627 baseRailLowerPart_pos->SetDx(0.0);
1628 baseRailLowerPart_pos->SetDy(-(baseRailMainPart_YSize * 0.5 + baseRailLowerPart_YSize * 0.5));
1629 baseRailLowerPart_pos->SetDz(baseRailMainPart_ZSize * 0.5 - baseRailLowerPart_ZSize * 0.5);
1630 baseRailLowerPart_pos->RegisterYourself();
1631
1632 TGeoCompositeShape* baseRailS = new TGeoCompositeShape();
1633 baseRailS->SetName(TString("baseRailS") += TString("_") + frames->GetName());
1634 {
1635 TString expression = "baseRailMainPartS";
1636 expression += TString("_") + frames->GetName();
1637 expression += "+baseRailUpperPartS";
1638 expression += TString("_") + frames->GetName();
1639 expression += ":baseRailUpperPart_pos";
1640 expression += TString("_") + frames->GetName();
1641 expression += "+baseRailLowerPartS";
1642 expression += TString("_") + frames->GetName();
1643 expression += ":baseRailLowerPart_pos";
1644 expression += TString("_") + frames->GetName();
1645 baseRailS->MakeNode(expression);
1646 baseRailS->ComputeBBox(); // need to compute a bounding box
1647 }
1648
1649 TGeoVolume* baseRailV = new TGeoVolume(TString("baseRailV") += TString("_") + frames->GetName(), baseRailS);
1650
1651 // volume medium
1652 TGeoMedium* baseRailV_medium = pMedAluminium;
1653 if (baseRailV_medium) {
1654 baseRailV->SetMedium(baseRailV_medium);
1655 } else
1656 Fatal("Main", "Invalid medium for baseRailV!");
1657
1658 // volume visual property (transparency)
1659 baseRailV->SetLineColor(TColor::GetColor("#ffcccc"));
1660 baseRailV->SetTransparency(50);
1661
1662 TGeoCombiTrans* baseRail_transf[2];
1663
1664 baseRail_transf[0] = new TGeoCombiTrans();
1665 baseRail_transf[0]->RotateY(180.0);
1666 baseRail_transf[0]->SetDx(0.1);
1667 baseRail_transf[0]->SetDy(+(14.5 + baseRailMainPart_YSize * 0.5));
1668 baseRail_transf[0]->SetDz(
1669 +0.695 /*center of half-plane*/
1670 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + baseRailMainPart_ZSize * 0.5 - baseRailLowerPart_ZSize)
1671 + 4.31 /*half-plane shift*/);
1672
1673 baseRail_transf[1] = new TGeoCombiTrans();
1674 baseRail_transf[1]->ReflectY(true);
1675 baseRail_transf[1]->SetDx(0.0);
1676 baseRail_transf[1]->SetDy(-(14.5 + baseRailMainPart_YSize * 0.5));
1677 baseRail_transf[1]->SetDz(+0.695 /*center of half-plane*/
1678 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + baseRailMainPart_ZSize * 0.5
1679 - baseRailLowerPart_ZSize));
1680
1681 frames->AddNode(baseRailV, 0, baseRail_transf[0]);
1682 frames->AddNode(baseRailV, 1, baseRail_transf[1]);
1683 //----------------------------------------------------------------------
1684
1685 // back rail ------------------------------------------------------------
1686 Double_t backRailMainPart_XSize = faceShild_XSize + -0.3 * 2 /*margin*/; // cm
1687 Double_t backRailMainPart_YSize = 3.0; // cm
1688 Double_t backRailMainPart_ZSize = 0.9; // cm, average 6..12 cm
1689
1690 cout << "backRailMainPart_XSize = " << backRailMainPart_XSize << "\n";
1691
1692 Double_t backRailLowerPart_XSize = backRailMainPart_XSize - 1.4; // cm
1693 Double_t backRailLowerPart_YSize = 0.7; // cm
1694 Double_t backRailLowerPart_ZSize = 0.6; // cm
1695
1696 Double_t backRailSidePart_XSize = 1.2; // cm
1697 Double_t backRailSidePart_YSize = 3.0; // cm
1698 Double_t backRailSidePart_ZSize = 1.62; // cm
1699
1700 TGeoShape* backRailMainPartS =
1701 new TGeoBBox(TString("backRailMainPartS") += TString("_") + frames->GetName(), backRailMainPart_XSize * 0.5,
1702 backRailMainPart_YSize * 0.5, backRailMainPart_ZSize * 0.5);
1703 TGeoShape* backRailLowerPartS =
1704 new TGeoBBox(TString("backRailLowerPartS") += TString("_") + frames->GetName(), backRailLowerPart_XSize * 0.5,
1705 backRailLowerPart_YSize * 0.5, backRailLowerPart_ZSize * 0.5);
1706 TGeoShape* backRailSidePartS =
1707 new TGeoBBox(TString("backRailSidePartS") += TString("_") + frames->GetName(), backRailSidePart_XSize * 0.5,
1708 backRailSidePart_YSize * 0.5, backRailSidePart_ZSize * 0.5);
1709
1710 TGeoTranslation* backRailLowerPart_pos = new TGeoTranslation();
1711 backRailLowerPart_pos->SetName(TString("backRailLowerPart_pos") += TString("_") + frames->GetName());
1712 backRailLowerPart_pos->SetDx(0.0);
1713 backRailLowerPart_pos->SetDy(-(backRailMainPart_YSize * 0.5 + backRailLowerPart_YSize * 0.5));
1714 backRailLowerPart_pos->SetDz(backRailMainPart_ZSize * 0.5 - backRailLowerPart_ZSize * 0.5);
1715 backRailLowerPart_pos->RegisterYourself();
1716
1717 TGeoTranslation* backRailSidePart1_pos = new TGeoTranslation();
1718 backRailSidePart1_pos->SetName(TString("backRailSidePart1_pos") += TString("_") + frames->GetName());
1719 backRailSidePart1_pos->SetDx(+(backRailMainPart_XSize * 0.5 - backRailSidePart_XSize * 0.5));
1720 backRailSidePart1_pos->SetDy(0.0);
1721 backRailSidePart1_pos->SetDz(backRailMainPart_ZSize * 0.5 + backRailSidePart_ZSize * 0.5);
1722 backRailSidePart1_pos->RegisterYourself();
1723
1724 TGeoTranslation* backRailSidePart2_pos = new TGeoTranslation();
1725 backRailSidePart2_pos->SetName(TString("backRailSidePart2_pos") += TString("_") + frames->GetName());
1726 backRailSidePart2_pos->SetDx(-(backRailMainPart_XSize * 0.5 - backRailSidePart_XSize * 0.5));
1727 backRailSidePart2_pos->SetDy(0.0);
1728 backRailSidePart2_pos->SetDz(backRailMainPart_ZSize * 0.5 + backRailSidePart_ZSize * 0.5);
1729 backRailSidePart2_pos->RegisterYourself();
1730
1731 TGeoCompositeShape* backRailS = new TGeoCompositeShape();
1732 backRailS->SetName(TString("backRailS") += TString("_") + frames->GetName());
1733 {
1734 TString expression = "backRailMainPartS";
1735 expression += TString("_") + frames->GetName();
1736 expression += "+backRailLowerPartS";
1737 expression += TString("_") + frames->GetName();
1738 expression += ":backRailLowerPart_pos";
1739 expression += TString("_") + frames->GetName();
1740 expression += "+backRailSidePartS";
1741 expression += TString("_") + frames->GetName();
1742 expression += ":backRailSidePart1_pos";
1743 expression += TString("_") + frames->GetName();
1744 expression += "+backRailSidePartS";
1745 expression += TString("_") + frames->GetName();
1746 expression += ":backRailSidePart2_pos";
1747 expression += TString("_") + frames->GetName();
1748 backRailS->MakeNode(expression);
1749 backRailS->ComputeBBox(); // need to compute a bounding box
1750 }
1751
1752 TGeoVolume* backRailV = new TGeoVolume(TString("backRailV") += TString("_") + frames->GetName(), backRailS);
1753
1754 // volume medium
1755 TGeoMedium* backRailV_medium = pMedAluminium;
1756 if (backRailV_medium) {
1757 backRailV->SetMedium(backRailV_medium);
1758 } else
1759 Fatal("Main", "Invalid medium for backRailV!");
1760
1761 // volume visual property (transparency)
1762 backRailV->SetLineColor(TColor::GetColor("#ffcccc"));
1763 backRailV->SetTransparency(50);
1764
1765 TGeoCombiTrans* backRail_transf[2];
1766
1767 backRail_transf[0] = new TGeoCombiTrans();
1768 backRail_transf[0]->SetDx(0.0);
1769 backRail_transf[0]->SetDy(+(14.5 + backRailMainPart_YSize * 0.5));
1770 backRail_transf[0]->SetDz(+0.695 /*center of half-plane*/
1771 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize
1772 + (backRailMainPart_ZSize * 0.5 - backRailLowerPart_ZSize))
1773 + 4.31 /*half-plane shift*/);
1774
1775 backRail_transf[1] = new TGeoCombiTrans();
1776 backRail_transf[1]->RotateX(180.0);
1777 backRail_transf[1]->SetDx(0.0);
1778 backRail_transf[1]->SetDy(-(14.5 + backRailMainPart_YSize * 0.5));
1779 backRail_transf[1]->SetDz(+0.695 /*center of half-plane*/
1780 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize
1781 + (backRailMainPart_ZSize * 0.5 - backRailLowerPart_ZSize)));
1782
1783 frames->AddNode(backRailV, 0, backRail_transf[0]);
1784 frames->AddNode(backRailV, 1, backRail_transf[1]);
1785 //----------------------------------------------------------------------
1786
1787 // holding back rail ----------------------------------------------------
1788 Double_t holdBackRail_XSize = backRailMainPart_XSize;
1789 Double_t holdBackRail_YSize = 1.8; // cm
1790 Double_t holdBackRail_ZSize = 1.0;
1791
1792 TGeoShape* holdBackRailS = new TGeoXtru(2);
1793 holdBackRailS->SetName("holdBackRailS");
1794 {
1795 Double_t x_pos[5] = {
1796 +0.0 /*0*/, +0.1 /*1*/, +holdBackRail_ZSize /*2*/, +holdBackRail_ZSize /*3*/, +0.0 /*4*/
1797 };
1798 Double_t y_pos[5] = {
1799 -holdBackRail_YSize /*0*/,
1800 -holdBackRail_YSize /*1*/,
1801 -holdBackRail_YSize * 0.5 /*2*/,
1802 -0.0 /*3*/,
1803 -0.0 /*4*/,
1804 };
1805 ((TGeoXtru*)holdBackRailS)->DefinePolygon(5, x_pos, y_pos);
1806 ((TGeoXtru*)holdBackRailS)->DefineSection(0, -holdBackRail_XSize * 0.5);
1807 ((TGeoXtru*)holdBackRailS)->DefineSection(1, +holdBackRail_XSize * 0.5);
1808 }
1809
1810 TGeoVolume* holdBackRailV =
1811 new TGeoVolume(TString("holdBackRailV") += TString("_") + frames->GetName(), holdBackRailS);
1812
1813 // volume medium
1814 TGeoMedium* holdBackRailV_medium = pMedAluminium;
1815 if (holdBackRailV_medium) {
1816 holdBackRailV->SetMedium(holdBackRailV_medium);
1817 } else
1818 Fatal("Main", "Invalid medium for holdBackRailV!");
1819
1820 // volume visual property (transparency)
1821 holdBackRailV->SetLineColor(TColor::GetColor("#ffcccc"));
1822 holdBackRailV->SetTransparency(10);
1823
1824 TGeoCombiTrans* holdBackRail_transf[2];
1825
1826 holdBackRail_transf[0] = new TGeoCombiTrans();
1827 holdBackRail_transf[0]->RotateY(90.0);
1828 holdBackRail_transf[0]->SetDx(0.0);
1829 holdBackRail_transf[0]->SetDy(+(14.5 + backRailMainPart_YSize));
1830 holdBackRail_transf[0]->SetDz(
1831 +0.695 /*center of half-plane*/ - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize)
1832 + 4.31 /*half-plane shift*/);
1833
1834 holdBackRail_transf[1] = new TGeoCombiTrans();
1835 holdBackRail_transf[1]->RotateY(90.0);
1836 holdBackRail_transf[1]->RotateX(180.0);
1837 holdBackRail_transf[1]->SetDx(0.0);
1838 holdBackRail_transf[1]->SetDy(-(14.5 + backRailMainPart_YSize));
1839 holdBackRail_transf[1]->SetDz(
1840 +0.695 /*center of half-plane*/ + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize));
1841
1842 frames->AddNode(holdBackRailV, 0, holdBackRail_transf[0]);
1843 frames->AddNode(holdBackRailV, 1, holdBackRail_transf[1]);
1844 //----------------------------------------------------------------------
1845
1846 // back plane -----------------------------------------------------------
1847 Double_t backPlane_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 3.95 * 2 /*margin*/; // cm
1848 Double_t backPlane_YSize = 13.1; // cm
1849 Double_t backPlane_ZSize = 0.15; // cm
1850
1851 TGeoShape* backPlaneS =
1852 new TGeoBBox("backPlaneS", backPlane_XSize * 0.5, backPlane_YSize * 0.5, backPlane_ZSize * 0.5);
1853
1854 TGeoVolume* backPlaneV = new TGeoVolume(TString("backPlaneV") += TString("_") + frames->GetName(), backPlaneS);
1855
1856 // volume medium
1857 TGeoMedium* backPlaneV_medium = pMedAluminium;
1858 if (backPlaneV_medium) {
1859 backPlaneV->SetMedium(backPlaneV_medium);
1860 } else
1861 Fatal("Main", "Invalid medium for backPlaneV!");
1862
1863 // volume visual property (transparency)
1864 backPlaneV->SetLineColor(TColor::GetColor("#ffcccc"));
1865 backPlaneV->SetTransparency(10);
1866
1867 TGeoCombiTrans* backPlane_transf[2];
1868
1869 backPlane_transf[0] = new TGeoCombiTrans();
1870 backPlane_transf[0]->SetDx(0.0);
1871 backPlane_transf[0]->SetDy(+(16.75 + backPlane_YSize * 0.5));
1872 backPlane_transf[0]->SetDz(+0.695 /*center of half-plane*/
1873 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize
1874 + holdBackRail_ZSize + backPlane_ZSize * 0.5)
1875 + 4.31 /*half-plane shift*/);
1876
1877 backPlane_transf[1] = new TGeoCombiTrans();
1878 backPlane_transf[1]->SetDx(0.0);
1879 backPlane_transf[1]->SetDy(-(16.75 + backPlane_YSize * 0.5));
1880 backPlane_transf[1]->SetDz(+0.695 /*center of half-plane*/
1881 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize
1882 + holdBackRail_ZSize + backPlane_ZSize * 0.5));
1883
1884 frames->AddNode(backPlaneV, 0, backPlane_transf[0]);
1885 frames->AddNode(backPlaneV, 1, backPlane_transf[1]);
1886 //----------------------------------------------------------------------
1887
1888 // front plane ----------------------------------------------------------
1889 Double_t frontPlane_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 1.8 * 2 /*margin*/; // cm
1890 Double_t frontPlane_YSize = 10.8; // cm
1891 Double_t frontPlane_ZSize = 0.15; // cm
1892
1893 TGeoShape* frontPlaneS =
1894 new TGeoBBox("frontPlaneS", frontPlane_XSize * 0.5, frontPlane_YSize * 0.5, frontPlane_ZSize * 0.5);
1895
1896 TGeoVolume* frontPlaneV = new TGeoVolume(TString("frontPlaneV") += TString("_") + frames->GetName(), frontPlaneS);
1897
1898 // volume medium
1899 TGeoMedium* frontPlaneV_medium = pMedAluminium;
1900 if (frontPlaneV_medium) {
1901 frontPlaneV->SetMedium(frontPlaneV_medium);
1902 } else
1903 Fatal("Main", "Invalid medium for frontPlaneV!");
1904
1905 // volume visual property (transparency)
1906 frontPlaneV->SetLineColor(TColor::GetColor("#ffcccc"));
1907 frontPlaneV->SetTransparency(10);
1908
1909 TGeoCombiTrans* frontPlane_transf[2];
1910
1911 frontPlane_transf[0] = new TGeoCombiTrans();
1912 frontPlane_transf[0]->SetDx(0.0);
1913 frontPlane_transf[0]->SetDy(+(19.7 + frontPlane_YSize * 0.5));
1914 frontPlane_transf[0]->SetDz(
1915 +0.695 /*center of half-plane*/
1916 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize + frontPlane_ZSize * 0.5)
1917 + 4.31 /*half-plane shift*/);
1918
1919 frontPlane_transf[1] = new TGeoCombiTrans();
1920 frontPlane_transf[1]->SetDx(0.0);
1921 frontPlane_transf[1]->SetDy(-(19.7 + frontPlane_YSize * 0.5));
1922 frontPlane_transf[1]->SetDz(
1923 +0.695 /*center of half-plane*/
1924 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize + frontPlane_ZSize * 0.5));
1925
1926 frames->AddNode(frontPlaneV, 0, frontPlane_transf[0]);
1927 frames->AddNode(frontPlaneV, 1, frontPlane_transf[1]);
1928 //----------------------------------------------------------------------
1929
1930 // front plane with a window --------------------------------------------
1931 Double_t frontPlaneWithWindow_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 4.0 * 2 /*margin*/; // cm
1932 Double_t frontPlaneWithWindow_YSize = 18.3; // cm
1933 Double_t frontPlaneWithWindow_ZSize = 0.3; // cm
1934
1935 Double_t frontPlaneWindow_XSize = frontPlaneWithWindow_XSize - 3.0 * 2 /*margin*/; // cm
1936 Double_t frontPlaneWindow_YSize = 8.6; // cm
1937
1938 TGeoShape* frontPlaneWithWindowBlankS = new TGeoBBox(
1939 TString("frontPlaneWithWindowBlankS") += TString("_") + frames->GetName(), frontPlaneWithWindow_XSize * 0.5,
1940 frontPlaneWithWindow_YSize * 0.5, frontPlaneWithWindow_ZSize * 0.5);
1941 TGeoShape* frontPlaneWindowS =
1942 new TGeoBBox(TString("frontPlaneWindowS") += TString("_") + frames->GetName(), frontPlaneWindow_XSize * 0.5,
1943 frontPlaneWindow_YSize * 0.5, (frontPlaneWithWindow_ZSize + 0.001) * 0.5);
1944
1945 TGeoTranslation* frontPlaneWindow_pos = new TGeoTranslation();
1946 frontPlaneWindow_pos->SetName(TString("frontPlaneWindow_pos") += TString("_") + frames->GetName());
1947 frontPlaneWindow_pos->SetDx(0.0);
1948 frontPlaneWindow_pos->SetDy(-2.85 /*shift*/);
1949 frontPlaneWindow_pos->SetDz(0.0);
1950 frontPlaneWindow_pos->RegisterYourself();
1951
1952 TGeoCompositeShape* frontPlaneWithWindowS = new TGeoCompositeShape();
1953 frontPlaneWithWindowS->SetName(TString("frontPlaneWithWindowS") += TString("_") + frames->GetName());
1954 {
1955 TString expression = "frontPlaneWithWindowBlankS";
1956 expression += TString("_") + frames->GetName();
1957 expression += "-frontPlaneWindowS";
1958 expression += TString("_") + frames->GetName();
1959 expression += ":frontPlaneWindow_pos";
1960 expression += TString("_") + frames->GetName();
1961 frontPlaneWithWindowS->MakeNode(expression);
1962 frontPlaneWithWindowS->ComputeBBox(); // need to compute a bounding box
1963 }
1964
1965 TGeoVolume* frontPlaneWithWindowV =
1966 new TGeoVolume(TString("frontPlaneWithWindowV") += TString("_") + frames->GetName(), frontPlaneWithWindowS);
1967
1968 // volume medium
1969 TGeoMedium* frontPlaneWithWindowV_medium = pMedAluminium;
1970 if (frontPlaneWithWindowV_medium) {
1971 frontPlaneWithWindowV->SetMedium(frontPlaneWithWindowV_medium);
1972 } else
1973 Fatal("Main", "Invalid medium for frontPlaneWithWindowV!");
1974
1975 // volume visual property (transparency)
1976 frontPlaneWithWindowV->SetLineColor(TColor::GetColor("#ffcccc"));
1977 frontPlaneWithWindowV->SetTransparency(50);
1978
1979 TGeoCombiTrans* frontPlaneWithWindow_transf[2];
1980
1981 frontPlaneWithWindow_transf[0] = new TGeoCombiTrans();
1982 frontPlaneWithWindow_transf[0]->SetDx(0.0);
1983 frontPlaneWithWindow_transf[0]->SetDy(+(19.5 + frontPlaneWithWindow_YSize * 0.5));
1984 frontPlaneWithWindow_transf[0]->SetDz(
1985 +0.695 /*center of half-plane*/
1986 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + frontPlaneWithWindow_ZSize * 0.5)
1987 + 4.31 /*half-plane shift*/);
1988
1989 frontPlaneWithWindow_transf[1] = new TGeoCombiTrans();
1990 frontPlaneWithWindow_transf[1]->RotateX(180.0);
1991 frontPlaneWithWindow_transf[1]->SetDx(0.0);
1992 frontPlaneWithWindow_transf[1]->SetDy(-(19.5 + frontPlaneWithWindow_YSize * 0.5));
1993 frontPlaneWithWindow_transf[1]->SetDz(
1994 +0.695 /*center of half-plane*/
1995 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + frontPlaneWithWindow_ZSize * 0.5));
1996
1997 frames->AddNode(frontPlaneWithWindowV, 0, frontPlaneWithWindow_transf[0]);
1998 frames->AddNode(frontPlaneWithWindowV, 1, frontPlaneWithWindow_transf[1]);
1999 //----------------------------------------------------------------------
2000
2001 // PCB (Printed Circuit Board) ------------------------------------------
2002 Double_t pcb_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 4.865 /*margin*/; // cm
2003 Double_t pcb_YSize = 10.0; // cm
2004 Double_t pcb_ZSize = 0.2; // cm
2005
2006 TGeoShape* pcbS = new TGeoBBox("pcbS", frontPlane_XSize * 0.5, frontPlane_YSize * 0.5, frontPlane_ZSize * 0.5);
2007
2008 TGeoVolume* pcbV = new TGeoVolume(TString("pcbV") += TString("_") + frames->GetName(), pcbS);
2009
2010 // volume medium
2011 TGeoMedium* pcbV_medium = pMedFiberGlass;
2012 if (pcbV_medium) {
2013 pcbV->SetMedium(pcbV_medium);
2014 } else
2015 Fatal("Main", "Invalid medium for pcbV!");
2016
2017 // volume visual property (transparency)
2018 pcbV->SetLineColor(TColor::GetColor("#ccccff"));
2019 pcbV->SetTransparency(10);
2020
2021 TGeoCombiTrans* pcb_transf[2];
2022
2023 pcb_transf[0] = new TGeoCombiTrans();
2024 pcb_transf[0]->SetDx(0.0);
2025 pcb_transf[0]->SetDy(+(26.5 + pcb_YSize * 0.5));
2026 pcb_transf[0]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
2027
2028 pcb_transf[1] = new TGeoCombiTrans();
2029 pcb_transf[1]->SetDx(0.0);
2030 pcb_transf[1]->SetDy(-(26.5 + pcb_YSize * 0.5));
2031 pcb_transf[1]->SetDz(+0.695 /*center of half-plane*/);
2032
2033 frames->AddNode(pcbV, 0, pcb_transf[0]);
2034 frames->AddNode(pcbV, 1, pcb_transf[1]);
2035 //----------------------------------------------------------------------
2036
2037 // upper side shield ----------------------------------------------------
2038 Double_t upperSideShield_XSize = 4.4; // cm
2039 Double_t upperSideShield_YSize = 12.3; // cm
2040 Double_t upperSideShield_ZSize = 0.8; // cm
2041
2042 Double_t upperSideShieldCut_XSize = 0.9; // cm
2043 Double_t upperSideShieldCut_YSize = 2.4; // cm
2044
2045 Double_t upperSideShieldWindow_XSize = 3.0; // cm
2046 Double_t upperSideShieldWindow_YSize = 7.0; // cm
2047
2048 TGeoShape* upperSideShieldBlankS = new TGeoXtru(2);
2049 upperSideShieldBlankS->SetName(TString("upperSideShieldBlankS") += TString("_") + frames->GetName());
2050 {
2051 Double_t x_pos[6] = {
2052 +upperSideShield_XSize * 0.5 /*0*/,
2053 +upperSideShield_XSize * 0.5 /*1*/,
2054 -upperSideShield_XSize * 0.5 /*2*/,
2055 -upperSideShield_XSize * 0.5 /*3*/,
2056 -upperSideShield_XSize * 0.5 + upperSideShieldCut_XSize /*4*/,
2057 -upperSideShield_XSize * 0.5 + upperSideShieldCut_XSize /*5*/
2058
2059 };
2060 Double_t y_pos[6] = {
2061 -upperSideShield_YSize * 0.5 /*0*/,
2062 +upperSideShield_YSize * 0.5 /*1*/,
2063 +upperSideShield_YSize * 0.5 /*2*/,
2064 -upperSideShield_YSize * 0.5 + upperSideShieldCut_YSize /*3*/,
2065 -upperSideShield_YSize * 0.5 + upperSideShieldCut_YSize /*4*/,
2066 -upperSideShield_YSize * 0.5 /*5*/
2067
2068 };
2069 ((TGeoXtru*)upperSideShieldBlankS)->DefinePolygon(6, x_pos, y_pos);
2070 ((TGeoXtru*)upperSideShieldBlankS)->DefineSection(0, -upperSideShield_ZSize * 0.5);
2071 ((TGeoXtru*)upperSideShieldBlankS)->DefineSection(1, +upperSideShield_ZSize * 0.5);
2072 }
2073
2074 TGeoShape* upperSideShieldWindowS = new TGeoBBox(
2075 TString("upperSideShieldWindowS") += TString("_") + frames->GetName(), upperSideShieldWindow_XSize * 0.5,
2076 upperSideShieldWindow_YSize * 0.5, (upperSideShield_ZSize + 0.001) * 0.5);
2077
2078 TGeoTranslation* upperSideShieldWindow_pos = new TGeoTranslation();
2079 upperSideShieldWindow_pos->SetName(TString("upperSideShieldWindow_pos") += TString("_") + frames->GetName());
2080 upperSideShieldWindow_pos->SetDx(0.0);
2081 upperSideShieldWindow_pos->SetDy(+1.65 /*shift*/);
2082 upperSideShieldWindow_pos->SetDz(0.0);
2083 upperSideShieldWindow_pos->RegisterYourself();
2084
2085 TGeoCompositeShape* upperSideShieldWithWindowS = new TGeoCompositeShape();
2086 upperSideShieldWithWindowS->SetName(TString("upperSideShieldWithWindowS") += TString("_") + frames->GetName());
2087 {
2088 TString expression = "upperSideShieldBlankS";
2089 expression += TString("_") + frames->GetName();
2090 expression += "-upperSideShieldWindowS";
2091 expression += TString("_") + frames->GetName();
2092 expression += ":upperSideShieldWindow_pos";
2093 expression += TString("_") + frames->GetName();
2094 upperSideShieldWithWindowS->MakeNode(expression);
2095 upperSideShieldWithWindowS->ComputeBBox(); // need to compute a bounding box
2096 }
2097
2098 TGeoVolume* upperSideShieldV =
2099 new TGeoVolume(TString("upperSideShieldV") += TString("_") + frames->GetName(), upperSideShieldWithWindowS);
2100
2101 // volume medium
2102 TGeoMedium* upperSideShieldV_medium = pMedAluminium;
2103 if (upperSideShieldV_medium) {
2104 upperSideShieldV->SetMedium(upperSideShieldV_medium);
2105 } else
2106 Fatal("Main", "Invalid medium for upperSideShieldV!");
2107
2108 // volume visual property (transparency)
2109 upperSideShieldV->SetLineColor(TColor::GetColor("#ffcccc"));
2110 upperSideShieldV->SetTransparency(50);
2111
2112 TGeoCombiTrans* upperSideShield_transf[4];
2113
2114 upperSideShield_transf[0] = new TGeoCombiTrans();
2115 upperSideShield_transf[0]->RotateY(90.0);
2116 upperSideShield_transf[0]->SetDx(+(frontPlaneWithWindow_XSize * 0.5 - upperSideShield_ZSize * 0.5));
2117 upperSideShield_transf[0]->SetDy(+(17.6 + upperSideShield_YSize * 0.5));
2118 upperSideShield_transf[0]->SetDz(+0.695 /*center of half-plane*/ - 0.65 /*shift*/ + 4.31 /*half-plane shift*/);
2119
2120 upperSideShield_transf[1] = new TGeoCombiTrans();
2121 upperSideShield_transf[1]->RotateY(90.0);
2122 upperSideShield_transf[1]->SetDx(-(frontPlaneWithWindow_XSize * 0.5 - upperSideShield_ZSize * 0.5));
2123 upperSideShield_transf[1]->SetDy(+(17.6 + upperSideShield_YSize * 0.5));
2124 upperSideShield_transf[1]->SetDz(+0.695 /*center of half-plane*/ - 0.65 /*shift*/ + 4.31 /*half-plane shift*/);
2125
2126 upperSideShield_transf[2] = new TGeoCombiTrans();
2127 upperSideShield_transf[2]->RotateY(-90.0);
2128 upperSideShield_transf[2]->ReflectY(true);
2129 upperSideShield_transf[2]->SetDx(+(frontPlaneWithWindow_XSize * 0.5 - upperSideShield_ZSize * 0.5));
2130 upperSideShield_transf[2]->SetDy(-(17.6 + upperSideShield_YSize * 0.5));
2131 upperSideShield_transf[2]->SetDz(+0.695 /*center of half-plane*/ + 0.65 /*shift*/);
2132
2133 upperSideShield_transf[3] = new TGeoCombiTrans();
2134 upperSideShield_transf[3]->RotateY(-90.0);
2135 upperSideShield_transf[3]->ReflectY(true);
2136 upperSideShield_transf[3]->SetDx(-(frontPlaneWithWindow_XSize * 0.5 - upperSideShield_ZSize * 0.5));
2137 upperSideShield_transf[3]->SetDy(-(17.6 + upperSideShield_YSize * 0.5));
2138 upperSideShield_transf[3]->SetDz(+0.695 /*center of half-plane*/ + 0.65 /*shift*/);
2139
2140 frames->AddNode(upperSideShieldV, 0, upperSideShield_transf[0]);
2141 frames->AddNode(upperSideShieldV, 1, upperSideShield_transf[1]);
2142 frames->AddNode(upperSideShieldV, 2, upperSideShield_transf[2]);
2143 frames->AddNode(upperSideShieldV, 3, upperSideShield_transf[3]);
2144 //----------------------------------------------------------------------
2145
2146 // upper side shield cover----------------------------------------------
2147 Double_t upperSideShieldCover_XSize = 4.4; // cm
2148 Double_t upperSideShieldCover_YSize = 8.5; // cm
2149 Double_t upperSideShieldCover_ZSize = 0.15; // cm
2150
2151 TGeoShape* upperSideShieldCoverS = new TGeoBBox("upperSideShieldCoverS", upperSideShieldCover_XSize * 0.5,
2152 upperSideShieldCover_YSize * 0.5, upperSideShieldCover_ZSize * 0.5);
2153
2154 TGeoVolume* upperSideShieldCoverV =
2155 new TGeoVolume(TString("upperSideShieldCoverV") += TString("_") + frames->GetName(), upperSideShieldCoverS);
2156
2157 // volume medium
2158 TGeoMedium* upperSideShieldCoverV_medium = pMedAluminium;
2159 if (upperSideShieldCoverV_medium) {
2160 upperSideShieldCoverV->SetMedium(upperSideShieldCoverV_medium);
2161 } else
2162 Fatal("Main", "Invalid medium for upperSideShieldCoverV!");
2163
2164 // volume visual property (transparency)
2165 upperSideShieldCoverV->SetLineColor(TColor::GetColor("#ffcccc"));
2166 upperSideShieldCoverV->SetTransparency(10);
2167
2168 TGeoCombiTrans* upperSideShieldCover_transf[4];
2169
2170 upperSideShieldCover_transf[0] = new TGeoCombiTrans();
2171 upperSideShieldCover_transf[0]->RotateY(90.0);
2172 upperSideShieldCover_transf[0]->SetDx(+(frontPlaneWithWindow_XSize * 0.5 + upperSideShieldCover_ZSize * 0.5));
2173 upperSideShieldCover_transf[0]->SetDy(+(20.7 + upperSideShieldCover_YSize * 0.5));
2174 upperSideShieldCover_transf[0]->SetDz(+0.695 /*center of half-plane*/ - 0.65 /*shift*/ + 4.31 /*half-plane shift*/);
2175
2176 upperSideShieldCover_transf[1] = new TGeoCombiTrans();
2177 upperSideShieldCover_transf[1]->RotateY(90.0);
2178 upperSideShieldCover_transf[1]->SetDx(-(frontPlaneWithWindow_XSize * 0.5 + upperSideShieldCover_ZSize * 0.5));
2179 upperSideShieldCover_transf[1]->SetDy(+(20.7 + upperSideShieldCover_YSize * 0.5));
2180 upperSideShieldCover_transf[1]->SetDz(+0.695 /*center of half-plane*/ - 0.65 /*shift*/ + 4.31 /*half-plane shift*/);
2181
2182 upperSideShieldCover_transf[2] = new TGeoCombiTrans();
2183 upperSideShieldCover_transf[2]->RotateY(90.0);
2184 upperSideShieldCover_transf[2]->SetDx(+(frontPlaneWithWindow_XSize * 0.5 + upperSideShieldCover_ZSize * 0.5));
2185 upperSideShieldCover_transf[2]->SetDy(-(20.7 + upperSideShieldCover_YSize * 0.5));
2186 upperSideShieldCover_transf[2]->SetDz(+0.695 /*center of half-plane*/ + 0.65 /*shift*/);
2187
2188 upperSideShieldCover_transf[3] = new TGeoCombiTrans();
2189 upperSideShieldCover_transf[3]->RotateY(90.0);
2190 upperSideShieldCover_transf[3]->SetDx(-(frontPlaneWithWindow_XSize * 0.5 + upperSideShieldCover_ZSize * 0.5));
2191 upperSideShieldCover_transf[3]->SetDy(-(20.7 + upperSideShieldCover_YSize * 0.5));
2192 upperSideShieldCover_transf[3]->SetDz(+0.695 /*center of half-plane*/ + 0.65 /*shift*/);
2193
2194 frames->AddNode(upperSideShieldCoverV, 0, upperSideShieldCover_transf[0]);
2195 frames->AddNode(upperSideShieldCoverV, 1, upperSideShieldCover_transf[1]);
2196 frames->AddNode(upperSideShieldCoverV, 2, upperSideShieldCover_transf[2]);
2197 frames->AddNode(upperSideShieldCoverV, 3, upperSideShieldCover_transf[3]);
2198 //--------------------------------------------------------------------------
2199
2200 return frames;
2201}
2202//------------------------------------------------------------------------------
2203
2205{
2206
2207 // TGeoVolume *frames = new TGeoVolumeAssembly(frame_name);
2208
2209 TGeoVolume* frames = new TGeoVolumeAssembly(frame_name);
2210 frames->SetMedium(pMedAir);
2211
2212 Int_t NModules = NModulesInStations[current_station_num];
2213
2214 // face shield ----------------------------------------------------------
2215 Double_t faceShild_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 8.6; // cm
2216 Double_t faceShild_YSize = 14.74 + 6.0; // cm
2217 Double_t faceShild_ZSize = 0.3; // cm
2218
2219 TGeoShape* faceShildS = new TGeoXtru(2);
2220 faceShildS->SetName("faceShildS");
2221 {
2222 Double_t x_pos[8] = {faceShild_XSize * 0.5,
2223 faceShild_XSize * 0.5,
2224 -faceShild_XSize * 0.5,
2225 -faceShild_XSize * 0.5,
2226 -2.75,
2227 -2.3,
2228 2.3,
2229 2.75};
2230 Double_t y_pos[8] = {-faceShild_YSize * 0.5,
2231 faceShild_YSize * 0.5,
2232 faceShild_YSize * 0.5,
2233 -faceShild_YSize * 0.5,
2234 -faceShild_YSize * 0.5,
2235 -3.8,
2236 -3.8,
2237 -faceShild_YSize * 0.5};
2238 ((TGeoXtru*)faceShildS)->DefinePolygon(8, x_pos, y_pos);
2239 ((TGeoXtru*)faceShildS)->DefineSection(0, -faceShild_ZSize * 0.5);
2240 ((TGeoXtru*)faceShildS)->DefineSection(1, +faceShild_ZSize * 0.5);
2241 }
2242
2243 TGeoVolume* faceShildV = new TGeoVolume(TString("faceShildV") += TString("_") + frames->GetName(), faceShildS);
2244
2245 // volume medium
2246 TGeoMedium* faceShildV_medium = pMedPolystyrene;
2247 if (faceShildV_medium) {
2248 faceShildV->SetMedium(faceShildV_medium);
2249 } else
2250 Fatal("Main", "Invalid medium for faceShildV!");
2251
2252 // volume visual property (transparency)
2253 faceShildV->SetLineColor(TColor::GetColor("#ccffcc"));
2254 faceShildV->SetTransparency(50);
2255
2256 TGeoCombiTrans* faceShild_transf[4];
2257
2258 faceShild_transf[0] = new TGeoCombiTrans();
2259 faceShild_transf[0]->SetDy(+faceShild_YSize * 0.5 - 0.95);
2260 faceShild_transf[0]->SetDz(+0.695 /*center of half-plane*/ - 1.35 /*half-thick of frame box*/
2261 - faceShild_ZSize * 0.5 /*face shield shift*/ + 4.31 /*half-plane shift*/);
2262
2263 faceShild_transf[1] = new TGeoCombiTrans();
2264 faceShild_transf[1]->SetDy(+faceShild_YSize * 0.5 - 0.95);
2265 faceShild_transf[1]->SetDz(+0.695 /*center of half-plane*/ + 1.35 /*half-thick of frame box*/
2266 + faceShild_ZSize * 0.5 /*face shield shift*/ + 4.31 /*half-plane shift*/);
2267
2268 faceShild_transf[2] = new TGeoCombiTrans();
2269 faceShild_transf[2]->RotateX(180.0);
2270 faceShild_transf[2]->SetDy(-faceShild_YSize * 0.5 + 0.95);
2271 faceShild_transf[2]->SetDz(+0.695 /*center of half-plane*/ - 1.35 /*half-thick of frame box*/
2272 - faceShild_ZSize * 0.5 /*face shield shift*/);
2273
2274 faceShild_transf[3] = new TGeoCombiTrans();
2275 faceShild_transf[3]->RotateX(180.0);
2276 faceShild_transf[3]->SetDy(-faceShild_YSize * 0.5 + 0.95);
2277 faceShild_transf[3]->SetDz(+0.695 /*center of half-plane*/ + 1.35 /*half-thick of frame box*/
2278 + faceShild_ZSize * 0.5 /*face shield shift*/);
2279
2280 frames->AddNode(faceShildV, 0, faceShild_transf[0]);
2281 frames->AddNode(faceShildV, 1, faceShild_transf[1]);
2282 frames->AddNode(faceShildV, 2, faceShild_transf[2]);
2283 frames->AddNode(faceShildV, 3, faceShild_transf[3]);
2284 //----------------------------------------------------------------------
2285
2286 // sidewall of shield ---------------------------------------------------
2287 Double_t sideShild_XSize = 0.95; // cm
2288 Double_t sideShild_YSize = 15.2 + 6.0; // cm
2289 Double_t sideShild_ZSize = 2.7; // cm
2290
2291 TGeoShape* sideShieldS =
2292 new TGeoBBox("sideShieldS", sideShild_XSize * 0.5, sideShild_YSize * 0.5, sideShild_ZSize * 0.5);
2293
2294 TGeoVolume* sideShieldV = new TGeoVolume(TString("sideShieldV") += TString("_") + frames->GetName(), sideShieldS);
2295
2296 // volume medium
2297 TGeoMedium* sideShieldV_medium = pMedAluminium;
2298 if (sideShieldV_medium) {
2299 sideShieldV->SetMedium(sideShieldV_medium);
2300 } else
2301 Fatal("Main", "Invalid medium for sideShieldV!");
2302
2303 // volume visual property (transparency)
2304 sideShieldV->SetLineColor(TColor::GetColor("#ffcccc"));
2305 sideShieldV->SetTransparency(50);
2306
2307 TGeoCombiTrans* sideShild_transf[4];
2308
2309 sideShild_transf[0] = new TGeoCombiTrans();
2310 sideShild_transf[0]->SetDx(+(faceShild_XSize * 0.5 - sideShild_XSize * 0.5));
2311 sideShild_transf[0]->SetDy(+faceShild_YSize * 0.5 - 0.95 + (sideShild_YSize - faceShild_YSize) * 0.5);
2312 sideShild_transf[0]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
2313
2314 sideShild_transf[1] = new TGeoCombiTrans();
2315 sideShild_transf[1]->SetDx(-(faceShild_XSize * 0.5 - sideShild_XSize * 0.5));
2316 sideShild_transf[1]->SetDy(+faceShild_YSize * 0.5 - 0.95 + (sideShild_YSize - faceShild_YSize) * 0.5);
2317 sideShild_transf[1]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
2318
2319 sideShild_transf[2] = new TGeoCombiTrans();
2320 sideShild_transf[2]->SetDx(+(faceShild_XSize * 0.5 - sideShild_XSize * 0.5));
2321 sideShild_transf[2]->SetDy(-faceShild_YSize * 0.5 + 0.95 - (sideShild_YSize - faceShild_YSize) * 0.5);
2322 sideShild_transf[2]->SetDz(+0.695 /*center of half-plane*/);
2323
2324 sideShild_transf[3] = new TGeoCombiTrans();
2325 sideShild_transf[3]->SetDx(-(faceShild_XSize * 0.5 - sideShild_XSize * 0.5));
2326 sideShild_transf[3]->SetDy(-faceShild_YSize * 0.5 + 0.95 - (sideShild_YSize - faceShild_YSize) * 0.5);
2327 sideShild_transf[3]->SetDz(+0.695 /*center of half-plane*/);
2328
2329 frames->AddNode(sideShieldV, 0, sideShild_transf[0]);
2330 frames->AddNode(sideShieldV, 1, sideShild_transf[1]);
2331 frames->AddNode(sideShieldV, 2, sideShild_transf[2]);
2332 frames->AddNode(sideShieldV, 3, sideShild_transf[3]);
2333 //----------------------------------------------------------------------
2334
2335 // horizontal plane of shield -------------------------------------------
2336 Double_t horizShild_XSize = faceShild_XSize * 0.5 - sideShild_XSize - 2.75 /*half-size of hole*/; // cm
2337 Double_t horizShild_YSize = 0.3; // cm
2338 Double_t horizShild_ZSize = 2.7; // cm
2339
2340 TGeoShape* horizShieldS =
2341 new TGeoBBox("horizShieldS", horizShild_XSize * 0.5, horizShild_YSize * 0.5, horizShild_ZSize * 0.5);
2342
2343 TGeoVolume* horizShieldV =
2344 new TGeoVolume(TString("horizShieldV") += TString("_") + frames->GetName(), horizShieldS);
2345
2346 // volume medium
2347 TGeoMedium* horizShieldV_medium = pMedPolystyrene;
2348 if (horizShieldV_medium) {
2349 horizShieldV->SetMedium(horizShieldV_medium);
2350 } else
2351 Fatal("Main", "Invalid medium for horizShieldV!");
2352
2353 // volume visual property (transparency)
2354 horizShieldV->SetLineColor(TColor::GetColor("#ccffcc"));
2355 horizShieldV->SetTransparency(50);
2356
2357 TGeoCombiTrans* horizShild_transf[4];
2358
2359 horizShild_transf[0] = new TGeoCombiTrans();
2360 horizShild_transf[0]->SetDx(+(faceShild_XSize * 0.5 - horizShild_XSize * 0.5 - sideShild_XSize));
2361 horizShild_transf[0]->SetDy(+(-0.95 + horizShild_YSize * 0.5));
2362 horizShild_transf[0]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
2363
2364 horizShild_transf[1] = new TGeoCombiTrans();
2365 horizShild_transf[1]->SetDx(-(faceShild_XSize * 0.5 - horizShild_XSize * 0.5 - sideShild_XSize));
2366 horizShild_transf[1]->SetDy(+(-0.95 + horizShild_YSize * 0.5));
2367 horizShild_transf[1]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
2368
2369 horizShild_transf[2] = new TGeoCombiTrans();
2370 horizShild_transf[2]->SetDx(+(faceShild_XSize * 0.5 - horizShild_XSize * 0.5 - sideShild_XSize));
2371 horizShild_transf[2]->SetDy(-(-0.95 + horizShild_YSize * 0.5));
2372 horizShild_transf[2]->SetDz(+0.695 /*center of half-plane*/);
2373
2374 horizShild_transf[3] = new TGeoCombiTrans();
2375 horizShild_transf[3]->SetDx(-(faceShild_XSize * 0.5 - horizShild_XSize * 0.5 - sideShild_XSize));
2376 horizShild_transf[3]->SetDy(-(-0.95 + horizShild_YSize * 0.5));
2377 horizShild_transf[3]->SetDz(+0.695 /*center of half-plane*/);
2378
2379 frames->AddNode(horizShieldV, 0, horizShild_transf[0]);
2380 frames->AddNode(horizShieldV, 1, horizShild_transf[1]);
2381 frames->AddNode(horizShieldV, 2, horizShild_transf[2]);
2382 frames->AddNode(horizShieldV, 3, horizShild_transf[3]);
2383 //----------------------------------------------------------------------
2384
2385 // plank of shield ------------------------------------------------------
2386 Double_t plankShild_XSize = faceShild_XSize; // cm
2387 Double_t plankShild_YSize = 1.5; // cm
2388 Double_t plankShild_ZSize = 0.3; // cm
2389
2390 TGeoShape* plankShieldS =
2391 new TGeoBBox("plankShieldS", plankShild_XSize * 0.5, plankShild_YSize * 0.5, plankShild_ZSize * 0.5);
2392
2393 TGeoVolume* plankShieldV =
2394 new TGeoVolume(TString("plankShieldV") += TString("_") + frames->GetName(), plankShieldS);
2395
2396 // volume medium
2397 TGeoMedium* plankShieldV_medium = pMedAluminium;
2398 if (plankShieldV_medium) {
2399 plankShieldV->SetMedium(plankShieldV_medium);
2400 } else
2401 Fatal("Main", "Invalid medium for plankShieldV!");
2402
2403 // volume visual property (transparency)
2404 plankShieldV->SetLineColor(TColor::GetColor("#ffcccc"));
2405 plankShieldV->SetTransparency(50);
2406
2407 TGeoCombiTrans* plankShild_transf[4];
2408
2409 plankShild_transf[0] = new TGeoCombiTrans();
2410 plankShild_transf[0]->SetDx(0.0);
2411 plankShild_transf[0]->SetDy(+(-0.95 + faceShild_YSize) - 0.05);
2412 plankShild_transf[0]->SetDz(
2413 +0.695 /*center of half-plane*/ - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize * 0.5)
2414 + 4.31 /*half-plane shift*/);
2415
2416 plankShild_transf[1] = new TGeoCombiTrans();
2417 plankShild_transf[1]->SetDx(0.0);
2418 plankShild_transf[1]->SetDy(+(-0.95 + faceShild_YSize) - 0.05);
2419 plankShild_transf[1]->SetDz(
2420 +0.695 /*center of half-plane*/ + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize * 0.5)
2421 + 4.31 /*half-plane shift*/);
2422
2423 plankShild_transf[2] = new TGeoCombiTrans();
2424 plankShild_transf[2]->SetDx(0.0);
2425 plankShild_transf[2]->SetDy(-(-0.95 + faceShild_YSize) + 0.05);
2426 plankShild_transf[2]->SetDz(+0.695 /*center of half-plane*/
2427 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize * 0.5));
2428
2429 plankShild_transf[3] = new TGeoCombiTrans();
2430 plankShild_transf[3]->SetDx(0.0);
2431 plankShild_transf[3]->SetDy(-(-0.95 + faceShild_YSize) + 0.05);
2432 plankShild_transf[3]->SetDz(+0.695 /*center of half-plane*/
2433 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize * 0.5));
2434
2435 frames->AddNode(plankShieldV, 0, plankShild_transf[0]);
2436 frames->AddNode(plankShieldV, 1, plankShild_transf[1]);
2437 frames->AddNode(plankShieldV, 2, plankShild_transf[2]);
2438 frames->AddNode(plankShieldV, 3, plankShild_transf[3]);
2439 //----------------------------------------------------------------------
2440
2441 // base rail
2442 Double_t baseRailMainPart_XSize = faceShild_XSize + 3.4 * 2 /*margin*/; // cm
2443 Double_t baseRailMainPart_YSize = 5.0; // cm
2444 Double_t baseRailMainPart_ZSize = 0.7; // cm
2445
2446 cout << "baseRailMainPart_XSize = " << baseRailMainPart_XSize << "\n";
2447
2448 Double_t baseRailUpperPart_XSize = baseRailMainPart_XSize; // cm
2449 Double_t baseRailUpperPart_YSize = 1.0; // cm
2450 Double_t baseRailUpperPart_ZSize = 0.3; // cm
2451
2452 Double_t baseRailLowerPart_XSize = baseRailMainPart_XSize - 8.8 /*cut*/; // cm
2453 Double_t baseRailLowerPart_YSize = 0.7; // cm
2454 Double_t baseRailLowerPart_ZSize = 0.3; // cm
2455
2456 TGeoShape* baseRailMainPartS =
2457 new TGeoBBox(TString("baseRailMainPartS") += TString("_") + frames->GetName(), baseRailMainPart_XSize * 0.5,
2458 baseRailMainPart_YSize * 0.5, baseRailMainPart_ZSize * 0.5);
2459 TGeoShape* baseRailUpperPartS =
2460 new TGeoBBox(TString("baseRailUpperPartS") += TString("_") + frames->GetName(), baseRailUpperPart_XSize * 0.5,
2461 baseRailUpperPart_YSize * 0.5, baseRailUpperPart_ZSize * 0.5);
2462 TGeoShape* baseRailLowerPartS =
2463 new TGeoBBox(TString("baseRailLowerPartS") += TString("_") + frames->GetName(), baseRailLowerPart_XSize * 0.5,
2464 baseRailLowerPart_YSize * 0.5, baseRailLowerPart_ZSize * 0.5);
2465
2466 TGeoTranslation* baseRailUpperPart_pos = new TGeoTranslation();
2467 baseRailUpperPart_pos->SetName(TString("baseRailUpperPart_pos") += TString("_") + frames->GetName());
2468 baseRailUpperPart_pos->SetDx(0.0);
2469 baseRailUpperPart_pos->SetDy(+(baseRailMainPart_YSize * 0.5 + baseRailUpperPart_YSize * 0.5));
2470 baseRailUpperPart_pos->SetDz(baseRailMainPart_ZSize * 0.5 - baseRailUpperPart_ZSize * 0.5);
2471 baseRailUpperPart_pos->RegisterYourself();
2472
2473 TGeoTranslation* baseRailLowerPart_pos = new TGeoTranslation();
2474 baseRailLowerPart_pos->SetName(TString("baseRailLowerPart_pos") += TString("_") + frames->GetName());
2475 baseRailLowerPart_pos->SetDx(0.0);
2476 baseRailLowerPart_pos->SetDy(-(baseRailMainPart_YSize * 0.5 + baseRailLowerPart_YSize * 0.5));
2477 baseRailLowerPart_pos->SetDz(baseRailMainPart_ZSize * 0.5 - baseRailLowerPart_ZSize * 0.5);
2478 baseRailLowerPart_pos->RegisterYourself();
2479
2480 TGeoCompositeShape* baseRailS = new TGeoCompositeShape();
2481 baseRailS->SetName(TString("baseRailS") += TString("_") + frames->GetName());
2482 {
2483 TString expression = "baseRailMainPartS";
2484 expression += TString("_") + frames->GetName();
2485 expression += "+baseRailUpperPartS";
2486 expression += TString("_") + frames->GetName();
2487 expression += ":baseRailUpperPart_pos";
2488 expression += TString("_") + frames->GetName();
2489 expression += "+baseRailLowerPartS";
2490 expression += TString("_") + frames->GetName();
2491 expression += ":baseRailLowerPart_pos";
2492 expression += TString("_") + frames->GetName();
2493 baseRailS->MakeNode(expression);
2494 baseRailS->ComputeBBox(); // need to compute a bounding box
2495 }
2496
2497 TGeoVolume* baseRailV = new TGeoVolume(TString("baseRailV") += TString("_") + frames->GetName(), baseRailS);
2498
2499 // volume medium
2500 TGeoMedium* baseRailV_medium = pMedAluminium;
2501 if (baseRailV_medium) {
2502 baseRailV->SetMedium(baseRailV_medium);
2503 } else
2504 Fatal("Main", "Invalid medium for baseRailV!");
2505
2506 // volume visual property (transparency)
2507 baseRailV->SetLineColor(TColor::GetColor("#ffcccc"));
2508 baseRailV->SetTransparency(50);
2509
2510 TGeoCombiTrans* baseRail_transf[2];
2511
2512 baseRail_transf[0] = new TGeoCombiTrans();
2513 baseRail_transf[0]->RotateY(180.0);
2514 baseRail_transf[0]->SetDx(0.1);
2515 baseRail_transf[0]->SetDy(+(14.5 + baseRailMainPart_YSize * 0.5 + 6.0));
2516 baseRail_transf[0]->SetDz(
2517 +0.695 /*center of half-plane*/
2518 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + baseRailMainPart_ZSize * 0.5 - baseRailLowerPart_ZSize)
2519 + 4.31 /*half-plane shift*/);
2520
2521 baseRail_transf[1] = new TGeoCombiTrans();
2522 baseRail_transf[1]->ReflectY(true);
2523 baseRail_transf[1]->SetDx(0.0);
2524 baseRail_transf[1]->SetDy(-(14.5 + baseRailMainPart_YSize * 0.5 + 6.0));
2525 baseRail_transf[1]->SetDz(+0.695 /*center of half-plane*/
2526 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + baseRailMainPart_ZSize * 0.5
2527 - baseRailLowerPart_ZSize));
2528
2529 frames->AddNode(baseRailV, 0, baseRail_transf[0]);
2530 frames->AddNode(baseRailV, 1, baseRail_transf[1]);
2531 //----------------------------------------------------------------------
2532
2533 // back rail ------------------------------------------------------------
2534 Double_t backRailMainPart_XSize = faceShild_XSize + -0.3 * 2 /*margin*/; // cm
2535 Double_t backRailMainPart_YSize = 3.0; // cm
2536 Double_t backRailMainPart_ZSize = 0.9; // cm, average 6..12 cm
2537
2538 Double_t backRailLowerPart_XSize = backRailMainPart_XSize - 1.4; // cm
2539 Double_t backRailLowerPart_YSize = 0.7; // cm
2540 Double_t backRailLowerPart_ZSize = 0.6; // cm
2541
2542 Double_t backRailSidePart_XSize = 1.2; // cm
2543 Double_t backRailSidePart_YSize = 3.0; // cm
2544 Double_t backRailSidePart_ZSize = 1.62; // cm
2545
2546 TGeoShape* backRailMainPartS =
2547 new TGeoBBox(TString("backRailMainPartS") += TString("_") + frames->GetName(), backRailMainPart_XSize * 0.5,
2548 backRailMainPart_YSize * 0.5, backRailMainPart_ZSize * 0.5);
2549 TGeoShape* backRailLowerPartS =
2550 new TGeoBBox(TString("backRailLowerPartS") += TString("_") + frames->GetName(), backRailLowerPart_XSize * 0.5,
2551 backRailLowerPart_YSize * 0.5, backRailLowerPart_ZSize * 0.5);
2552 TGeoShape* backRailSidePartS =
2553 new TGeoBBox(TString("backRailSidePartS") += TString("_") + frames->GetName(), backRailSidePart_XSize * 0.5,
2554 backRailSidePart_YSize * 0.5, backRailSidePart_ZSize * 0.5);
2555
2556 TGeoTranslation* backRailLowerPart_pos = new TGeoTranslation();
2557 backRailLowerPart_pos->SetName(TString("backRailLowerPart_pos") += TString("_") + frames->GetName());
2558 backRailLowerPart_pos->SetDx(0.0);
2559 backRailLowerPart_pos->SetDy(-(backRailMainPart_YSize * 0.5 + backRailLowerPart_YSize * 0.5));
2560 backRailLowerPart_pos->SetDz(backRailMainPart_ZSize * 0.5 - backRailLowerPart_ZSize * 0.5);
2561 backRailLowerPart_pos->RegisterYourself();
2562
2563 TGeoTranslation* backRailSidePart1_pos = new TGeoTranslation();
2564 backRailSidePart1_pos->SetName(TString("backRailSidePart1_pos") += TString("_") + frames->GetName());
2565 backRailSidePart1_pos->SetDx(+(backRailMainPart_XSize * 0.5 - backRailSidePart_XSize * 0.5));
2566 backRailSidePart1_pos->SetDy(0.0);
2567 backRailSidePart1_pos->SetDz(backRailMainPart_ZSize * 0.5 + backRailSidePart_ZSize * 0.5);
2568 backRailSidePart1_pos->RegisterYourself();
2569
2570 TGeoTranslation* backRailSidePart2_pos = new TGeoTranslation();
2571 backRailSidePart2_pos->SetName(TString("backRailSidePart2_pos") += TString("_") + frames->GetName());
2572 backRailSidePart2_pos->SetDx(-(backRailMainPart_XSize * 0.5 - backRailSidePart_XSize * 0.5));
2573 backRailSidePart2_pos->SetDy(0.0);
2574 backRailSidePart2_pos->SetDz(backRailMainPart_ZSize * 0.5 + backRailSidePart_ZSize * 0.5);
2575 backRailSidePart2_pos->RegisterYourself();
2576
2577 TGeoCompositeShape* backRailS = new TGeoCompositeShape();
2578 backRailS->SetName(TString("backRailS") += TString("_") + frames->GetName());
2579 {
2580 TString expression = "backRailMainPartS";
2581 expression += TString("_") + frames->GetName();
2582 expression += "+backRailLowerPartS";
2583 expression += TString("_") + frames->GetName();
2584 expression += ":backRailLowerPart_pos";
2585 expression += TString("_") + frames->GetName();
2586 expression += "+backRailSidePartS";
2587 expression += TString("_") + frames->GetName();
2588 expression += ":backRailSidePart1_pos";
2589 expression += TString("_") + frames->GetName();
2590 expression += "+backRailSidePartS";
2591 expression += TString("_") + frames->GetName();
2592 expression += ":backRailSidePart2_pos";
2593 expression += TString("_") + frames->GetName();
2594 backRailS->MakeNode(expression);
2595 backRailS->ComputeBBox(); // need to compute a bounding box
2596 }
2597
2598 TGeoVolume* backRailV = new TGeoVolume(TString("backRailV") += TString("_") + frames->GetName(), backRailS);
2599
2600 // volume medium
2601 TGeoMedium* backRailV_medium = pMedAluminium;
2602 if (backRailV_medium) {
2603 backRailV->SetMedium(backRailV_medium);
2604 } else
2605 Fatal("Main", "Invalid medium for backRailV!");
2606
2607 // volume visual property (transparency)
2608 backRailV->SetLineColor(TColor::GetColor("#ffcccc"));
2609 backRailV->SetTransparency(50);
2610
2611 TGeoCombiTrans* backRail_transf[2];
2612
2613 backRail_transf[0] = new TGeoCombiTrans();
2614 backRail_transf[0]->SetDx(0.0);
2615 backRail_transf[0]->SetDy(+(14.5 + backRailMainPart_YSize * 0.5 + 6.0));
2616 backRail_transf[0]->SetDz(+0.695 /*center of half-plane*/
2617 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize
2618 + (backRailMainPart_ZSize * 0.5 - backRailLowerPart_ZSize))
2619 + 4.31 /*half-plane shift*/);
2620
2621 backRail_transf[1] = new TGeoCombiTrans();
2622 backRail_transf[1]->RotateX(180.0);
2623 backRail_transf[1]->SetDx(0.0);
2624 backRail_transf[1]->SetDy(-(14.5 + backRailMainPart_YSize * 0.5 + 6.0));
2625 backRail_transf[1]->SetDz(+0.695 /*center of half-plane*/
2626 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize
2627 + (backRailMainPart_ZSize * 0.5 - backRailLowerPart_ZSize)));
2628
2629 frames->AddNode(backRailV, 0, backRail_transf[0]);
2630 frames->AddNode(backRailV, 1, backRail_transf[1]);
2631 //----------------------------------------------------------------------
2632
2633 // holding back rail ----------------------------------------------------
2634 Double_t holdBackRail_XSize = backRailMainPart_XSize;
2635 Double_t holdBackRail_YSize = 1.8; // cm
2636 Double_t holdBackRail_ZSize = 1.0;
2637
2638 TGeoShape* holdBackRailS = new TGeoXtru(2);
2639 holdBackRailS->SetName("holdBackRailS");
2640 {
2641 Double_t x_pos[5] = {
2642 +0.0 /*0*/, +0.1 /*1*/, +holdBackRail_ZSize /*2*/, +holdBackRail_ZSize /*3*/, +0.0 /*4*/
2643 };
2644 Double_t y_pos[5] = {
2645 -holdBackRail_YSize /*0*/,
2646 -holdBackRail_YSize /*1*/,
2647 -holdBackRail_YSize * 0.5 /*2*/,
2648 -0.0 /*3*/,
2649 -0.0 /*4*/,
2650 };
2651 ((TGeoXtru*)holdBackRailS)->DefinePolygon(5, x_pos, y_pos);
2652 ((TGeoXtru*)holdBackRailS)->DefineSection(0, -holdBackRail_XSize * 0.5);
2653 ((TGeoXtru*)holdBackRailS)->DefineSection(1, +holdBackRail_XSize * 0.5);
2654 }
2655
2656 TGeoVolume* holdBackRailV =
2657 new TGeoVolume(TString("holdBackRailV") += TString("_") + frames->GetName(), holdBackRailS);
2658
2659 // volume medium
2660 TGeoMedium* holdBackRailV_medium = pMedAluminium;
2661 if (holdBackRailV_medium) {
2662 holdBackRailV->SetMedium(holdBackRailV_medium);
2663 } else
2664 Fatal("Main", "Invalid medium for holdBackRailV!");
2665
2666 // volume visual property (transparency)
2667 holdBackRailV->SetLineColor(TColor::GetColor("#ffcccc"));
2668 holdBackRailV->SetTransparency(10);
2669
2670 TGeoCombiTrans* holdBackRail_transf[2];
2671
2672 holdBackRail_transf[0] = new TGeoCombiTrans();
2673 holdBackRail_transf[0]->RotateY(90.0);
2674 holdBackRail_transf[0]->SetDx(0.0);
2675 holdBackRail_transf[0]->SetDy(+(14.5 + backRailMainPart_YSize + 6.0));
2676 holdBackRail_transf[0]->SetDz(
2677 +0.695 /*center of half-plane*/ - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize)
2678 + 4.31 /*half-plane shift*/);
2679
2680 holdBackRail_transf[1] = new TGeoCombiTrans();
2681 holdBackRail_transf[1]->RotateY(90.0);
2682 holdBackRail_transf[1]->RotateX(180.0);
2683 holdBackRail_transf[1]->SetDx(0.0);
2684 holdBackRail_transf[1]->SetDy(-(14.5 + backRailMainPart_YSize + 6.0));
2685 holdBackRail_transf[1]->SetDz(
2686 +0.695 /*center of half-plane*/ + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize));
2687
2688 frames->AddNode(holdBackRailV, 0, holdBackRail_transf[0]);
2689 frames->AddNode(holdBackRailV, 1, holdBackRail_transf[1]);
2690 //----------------------------------------------------------------------
2691
2692 // back plane -----------------------------------------------------------
2693 Double_t backPlane_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 3.95 * 2 /*margin*/; // cm
2694 Double_t backPlane_YSize = 13.1; // cm
2695 Double_t backPlane_ZSize = 0.15; // cm
2696
2697 TGeoShape* backPlaneS =
2698 new TGeoBBox("backPlaneS", backPlane_XSize * 0.5, backPlane_YSize * 0.5, backPlane_ZSize * 0.5);
2699
2700 TGeoVolume* backPlaneV = new TGeoVolume(TString("backPlaneV") += TString("_") + frames->GetName(), backPlaneS);
2701
2702 // volume medium
2703 TGeoMedium* backPlaneV_medium = pMedAluminium;
2704 if (backPlaneV_medium) {
2705 backPlaneV->SetMedium(backPlaneV_medium);
2706 } else
2707 Fatal("Main", "Invalid medium for backPlaneV!");
2708
2709 // volume visual property (transparency)
2710 backPlaneV->SetLineColor(TColor::GetColor("#ffcccc"));
2711 backPlaneV->SetTransparency(10);
2712
2713 TGeoCombiTrans* backPlane_transf[2];
2714
2715 backPlane_transf[0] = new TGeoCombiTrans();
2716 backPlane_transf[0]->SetDx(0.0);
2717 backPlane_transf[0]->SetDy(+(16.75 + backPlane_YSize * 0.5 + 6.0));
2718 backPlane_transf[0]->SetDz(+0.695 /*center of half-plane*/
2719 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize
2720 + holdBackRail_ZSize + backPlane_ZSize * 0.5)
2721 + 4.31 /*half-plane shift*/);
2722
2723 backPlane_transf[1] = new TGeoCombiTrans();
2724 backPlane_transf[1]->SetDx(0.0);
2725 backPlane_transf[1]->SetDy(-(16.75 + backPlane_YSize * 0.5 + 6.0));
2726 backPlane_transf[1]->SetDz(+0.695 /*center of half-plane*/
2727 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize
2728 + holdBackRail_ZSize + backPlane_ZSize * 0.5));
2729
2730 frames->AddNode(backPlaneV, 0, backPlane_transf[0]);
2731 frames->AddNode(backPlaneV, 1, backPlane_transf[1]);
2732 //----------------------------------------------------------------------
2733
2734 // front plane ----------------------------------------------------------
2735 Double_t frontPlane_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 1.8 * 2 /*margin*/; // cm
2736 Double_t frontPlane_YSize = 10.8; // cm
2737 Double_t frontPlane_ZSize = 0.15; // cm
2738
2739 TGeoShape* frontPlaneS =
2740 new TGeoBBox("frontPlaneS", frontPlane_XSize * 0.5, frontPlane_YSize * 0.5, frontPlane_ZSize * 0.5);
2741
2742 TGeoVolume* frontPlaneV = new TGeoVolume(TString("frontPlaneV") += TString("_") + frames->GetName(), frontPlaneS);
2743
2744 // volume medium
2745 TGeoMedium* frontPlaneV_medium = pMedAluminium;
2746 if (frontPlaneV_medium) {
2747 frontPlaneV->SetMedium(frontPlaneV_medium);
2748 } else
2749 Fatal("Main", "Invalid medium for frontPlaneV!");
2750
2751 // volume visual property (transparency)
2752 frontPlaneV->SetLineColor(TColor::GetColor("#ffcccc"));
2753 frontPlaneV->SetTransparency(10);
2754
2755 TGeoCombiTrans* frontPlane_transf[2];
2756
2757 frontPlane_transf[0] = new TGeoCombiTrans();
2758 frontPlane_transf[0]->SetDx(0.0);
2759 frontPlane_transf[0]->SetDy(+(19.7 + frontPlane_YSize * 0.5 + 6.0));
2760 frontPlane_transf[0]->SetDz(
2761 +0.695 /*center of half-plane*/
2762 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize + frontPlane_ZSize * 0.5)
2763 + 4.31 /*half-plane shift*/);
2764
2765 frontPlane_transf[1] = new TGeoCombiTrans();
2766 frontPlane_transf[1]->SetDx(0.0);
2767 frontPlane_transf[1]->SetDy(-(19.7 + frontPlane_YSize * 0.5 + 6.0));
2768 frontPlane_transf[1]->SetDz(
2769 +0.695 /*center of half-plane*/
2770 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize + frontPlane_ZSize * 0.5));
2771
2772 frames->AddNode(frontPlaneV, 0, frontPlane_transf[0]);
2773 frames->AddNode(frontPlaneV, 1, frontPlane_transf[1]);
2774 //----------------------------------------------------------------------
2775
2776 // front plane with a window --------------------------------------------
2777 Double_t frontPlaneWithWindow_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 4.0 * 2 /*margin*/; // cm
2778 Double_t frontPlaneWithWindow_YSize = 18.3; // cm
2779 Double_t frontPlaneWithWindow_ZSize = 0.3; // cm
2780
2781 Double_t frontPlaneWindow_XSize = frontPlaneWithWindow_XSize - 3.0 * 2 /*margin*/; // cm
2782 Double_t frontPlaneWindow_YSize = 8.6; // cm
2783
2784 TGeoShape* frontPlaneWithWindowBlankS = new TGeoBBox(
2785 TString("frontPlaneWithWindowBlankS") += TString("_") + frames->GetName(), frontPlaneWithWindow_XSize * 0.5,
2786 frontPlaneWithWindow_YSize * 0.5, frontPlaneWithWindow_ZSize * 0.5);
2787 TGeoShape* frontPlaneWindowS =
2788 new TGeoBBox(TString("frontPlaneWindowS") += TString("_") + frames->GetName(), frontPlaneWindow_XSize * 0.5,
2789 frontPlaneWindow_YSize * 0.5, (frontPlaneWithWindow_ZSize + 0.001) * 0.5);
2790
2791 TGeoTranslation* frontPlaneWindow_pos = new TGeoTranslation();
2792 frontPlaneWindow_pos->SetName(TString("frontPlaneWindow_pos") += TString("_") + frames->GetName());
2793 frontPlaneWindow_pos->SetDx(0.0);
2794 frontPlaneWindow_pos->SetDy(-2.85 /*shift*/);
2795 frontPlaneWindow_pos->SetDz(0.0);
2796 frontPlaneWindow_pos->RegisterYourself();
2797
2798 TGeoCompositeShape* frontPlaneWithWindowS = new TGeoCompositeShape();
2799 frontPlaneWithWindowS->SetName(TString("frontPlaneWithWindowS") += TString("_") + frames->GetName());
2800 {
2801 TString expression = "frontPlaneWithWindowBlankS";
2802 expression += TString("_") + frames->GetName();
2803 expression += "-frontPlaneWindowS";
2804 expression += TString("_") + frames->GetName();
2805 expression += ":frontPlaneWindow_pos";
2806 expression += TString("_") + frames->GetName();
2807 frontPlaneWithWindowS->MakeNode(expression);
2808 frontPlaneWithWindowS->ComputeBBox(); // need to compute a bounding box
2809 }
2810
2811 TGeoVolume* frontPlaneWithWindowV =
2812 new TGeoVolume(TString("frontPlaneWithWindowV") += TString("_") + frames->GetName(), frontPlaneWithWindowS);
2813
2814 // volume medium
2815 TGeoMedium* frontPlaneWithWindowV_medium = pMedAluminium;
2816 if (frontPlaneWithWindowV_medium) {
2817 frontPlaneWithWindowV->SetMedium(frontPlaneWithWindowV_medium);
2818 } else
2819 Fatal("Main", "Invalid medium for frontPlaneWithWindowV!");
2820
2821 // volume visual property (transparency)
2822 frontPlaneWithWindowV->SetLineColor(TColor::GetColor("#ffcccc"));
2823 frontPlaneWithWindowV->SetTransparency(50);
2824
2825 TGeoCombiTrans* frontPlaneWithWindow_transf[2];
2826
2827 frontPlaneWithWindow_transf[0] = new TGeoCombiTrans();
2828 frontPlaneWithWindow_transf[0]->SetDx(0.0);
2829 frontPlaneWithWindow_transf[0]->SetDy(+(19.5 + frontPlaneWithWindow_YSize * 0.5 + 6.0));
2830 frontPlaneWithWindow_transf[0]->SetDz(
2831 +0.695 /*center of half-plane*/
2832 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + frontPlaneWithWindow_ZSize * 0.5)
2833 + 4.31 /*half-plane shift*/);
2834
2835 frontPlaneWithWindow_transf[1] = new TGeoCombiTrans();
2836 frontPlaneWithWindow_transf[1]->RotateX(180.0);
2837 frontPlaneWithWindow_transf[1]->SetDx(0.0);
2838 frontPlaneWithWindow_transf[1]->SetDy(-(19.5 + frontPlaneWithWindow_YSize * 0.5 + 6.0));
2839 frontPlaneWithWindow_transf[1]->SetDz(
2840 +0.695 /*center of half-plane*/
2841 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + frontPlaneWithWindow_ZSize * 0.5));
2842
2843 frames->AddNode(frontPlaneWithWindowV, 0, frontPlaneWithWindow_transf[0]);
2844 frames->AddNode(frontPlaneWithWindowV, 1, frontPlaneWithWindow_transf[1]);
2845 //----------------------------------------------------------------------
2846
2847 // PCB (Printed Circuit Board) ------------------------------------------
2848 Double_t pcb_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 4.865 /*margin*/; // cm
2849 Double_t pcb_YSize = 10.0; // cm
2850 Double_t pcb_ZSize = 0.2; // cm
2851
2852 TGeoShape* pcbS = new TGeoBBox("pcbS", frontPlane_XSize * 0.5, frontPlane_YSize * 0.5, frontPlane_ZSize * 0.5);
2853
2854 TGeoVolume* pcbV = new TGeoVolume(TString("pcbV") += TString("_") + frames->GetName(), pcbS);
2855
2856 // volume medium
2857 TGeoMedium* pcbV_medium = pMedFiberGlass;
2858 if (pcbV_medium) {
2859 pcbV->SetMedium(pcbV_medium);
2860 } else
2861 Fatal("Main", "Invalid medium for pcbV!");
2862
2863 // volume visual property (transparency)
2864 pcbV->SetLineColor(TColor::GetColor("#ccccff"));
2865 pcbV->SetTransparency(10);
2866
2867 TGeoCombiTrans* pcb_transf[2];
2868
2869 pcb_transf[0] = new TGeoCombiTrans();
2870 pcb_transf[0]->SetDx(0.0);
2871 pcb_transf[0]->SetDy(+(26.5 + pcb_YSize * 0.5 + 6.0));
2872 pcb_transf[0]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
2873
2874 pcb_transf[1] = new TGeoCombiTrans();
2875 pcb_transf[1]->SetDx(0.0);
2876 pcb_transf[1]->SetDy(-(26.5 + pcb_YSize * 0.5 + 6.0));
2877 pcb_transf[1]->SetDz(+0.695 /*center of half-plane*/);
2878
2879 frames->AddNode(pcbV, 0, pcb_transf[0]);
2880 frames->AddNode(pcbV, 1, pcb_transf[1]);
2881 //----------------------------------------------------------------------
2882
2883 // upper side shield ----------------------------------------------------
2884 Double_t upperSideShield_XSize = 4.4; // cm
2885 Double_t upperSideShield_YSize = 12.3; // cm
2886 Double_t upperSideShield_ZSize = 0.8; // cm
2887
2888 Double_t upperSideShieldCut_XSize = 0.9; // cm
2889 Double_t upperSideShieldCut_YSize = 2.4; // cm
2890
2891 Double_t upperSideShieldWindow_XSize = 3.0; // cm
2892 Double_t upperSideShieldWindow_YSize = 7.0; // cm
2893
2894 TGeoShape* upperSideShieldBlankS = new TGeoXtru(2);
2895 upperSideShieldBlankS->SetName(TString("upperSideShieldBlankS") += TString("_") + frames->GetName());
2896 {
2897 Double_t x_pos[6] = {
2898 +upperSideShield_XSize * 0.5 /*0*/,
2899 +upperSideShield_XSize * 0.5 /*1*/,
2900 -upperSideShield_XSize * 0.5 /*2*/,
2901 -upperSideShield_XSize * 0.5 /*3*/,
2902 -upperSideShield_XSize * 0.5 + upperSideShieldCut_XSize /*4*/,
2903 -upperSideShield_XSize * 0.5 + upperSideShieldCut_XSize /*5*/
2904
2905 };
2906 Double_t y_pos[6] = {
2907 -upperSideShield_YSize * 0.5 /*0*/,
2908 +upperSideShield_YSize * 0.5 /*1*/,
2909 +upperSideShield_YSize * 0.5 /*2*/,
2910 -upperSideShield_YSize * 0.5 + upperSideShieldCut_YSize /*3*/,
2911 -upperSideShield_YSize * 0.5 + upperSideShieldCut_YSize /*4*/,
2912 -upperSideShield_YSize * 0.5 /*5*/
2913
2914 };
2915 ((TGeoXtru*)upperSideShieldBlankS)->DefinePolygon(6, x_pos, y_pos);
2916 ((TGeoXtru*)upperSideShieldBlankS)->DefineSection(0, -upperSideShield_ZSize * 0.5);
2917 ((TGeoXtru*)upperSideShieldBlankS)->DefineSection(1, +upperSideShield_ZSize * 0.5);
2918 }
2919
2920 TGeoShape* upperSideShieldWindowS = new TGeoBBox(
2921 TString("upperSideShieldWindowS") += TString("_") + frames->GetName(), upperSideShieldWindow_XSize * 0.5,
2922 upperSideShieldWindow_YSize * 0.5, (upperSideShield_ZSize + 0.001) * 0.5);
2923
2924 TGeoTranslation* upperSideShieldWindow_pos = new TGeoTranslation();
2925 upperSideShieldWindow_pos->SetName(TString("upperSideShieldWindow_pos") += TString("_") + frames->GetName());
2926 upperSideShieldWindow_pos->SetDx(0.0);
2927 upperSideShieldWindow_pos->SetDy(+1.65 /*shift*/);
2928 upperSideShieldWindow_pos->SetDz(0.0);
2929 upperSideShieldWindow_pos->RegisterYourself();
2930
2931 TGeoCompositeShape* upperSideShieldWithWindowS = new TGeoCompositeShape();
2932 upperSideShieldWithWindowS->SetName(TString("upperSideShieldWithWindowS") += TString("_") + frames->GetName());
2933 {
2934 TString expression = "upperSideShieldBlankS";
2935 expression += TString("_") + frames->GetName();
2936 expression += "-upperSideShieldWindowS";
2937 expression += TString("_") + frames->GetName();
2938 expression += ":upperSideShieldWindow_pos";
2939 expression += TString("_") + frames->GetName();
2940 upperSideShieldWithWindowS->MakeNode(expression);
2941 upperSideShieldWithWindowS->ComputeBBox(); // need to compute a bounding box
2942 }
2943
2944 TGeoVolume* upperSideShieldV =
2945 new TGeoVolume(TString("upperSideShieldV") += TString("_") + frames->GetName(), upperSideShieldWithWindowS);
2946
2947 // volume medium
2948 TGeoMedium* upperSideShieldV_medium = pMedAluminium;
2949 if (upperSideShieldV_medium) {
2950 upperSideShieldV->SetMedium(upperSideShieldV_medium);
2951 } else
2952 Fatal("Main", "Invalid medium for upperSideShieldV!");
2953
2954 // volume visual property (transparency)
2955 upperSideShieldV->SetLineColor(TColor::GetColor("#ffcccc"));
2956 upperSideShieldV->SetTransparency(50);
2957
2958 TGeoCombiTrans* upperSideShield_transf[4];
2959
2960 upperSideShield_transf[0] = new TGeoCombiTrans();
2961 upperSideShield_transf[0]->RotateY(90.0);
2962 upperSideShield_transf[0]->SetDx(+(frontPlaneWithWindow_XSize * 0.5 - upperSideShield_ZSize * 0.5));
2963 upperSideShield_transf[0]->SetDy(+(17.6 + upperSideShield_YSize * 0.5 + 6.0));
2964 upperSideShield_transf[0]->SetDz(+0.695 /*center of half-plane*/ - 0.65 /*shift*/ + 4.31 /*half-plane shift*/);
2965
2966 upperSideShield_transf[1] = new TGeoCombiTrans();
2967 upperSideShield_transf[1]->RotateY(90.0);
2968 upperSideShield_transf[1]->SetDx(-(frontPlaneWithWindow_XSize * 0.5 - upperSideShield_ZSize * 0.5));
2969 upperSideShield_transf[1]->SetDy(+(17.6 + upperSideShield_YSize * 0.5 + 6.0));
2970 upperSideShield_transf[1]->SetDz(+0.695 /*center of half-plane*/ - 0.65 /*shift*/ + 4.31 /*half-plane shift*/);
2971
2972 upperSideShield_transf[2] = new TGeoCombiTrans();
2973 upperSideShield_transf[2]->RotateY(-90.0);
2974 upperSideShield_transf[2]->ReflectY(true);
2975 upperSideShield_transf[2]->SetDx(+(frontPlaneWithWindow_XSize * 0.5 - upperSideShield_ZSize * 0.5));
2976 upperSideShield_transf[2]->SetDy(-(17.6 + upperSideShield_YSize * 0.5 + 6.0));
2977 upperSideShield_transf[2]->SetDz(+0.695 /*center of half-plane*/ + 0.65 /*shift*/);
2978
2979 upperSideShield_transf[3] = new TGeoCombiTrans();
2980 upperSideShield_transf[3]->RotateY(-90.0);
2981 upperSideShield_transf[3]->ReflectY(true);
2982 upperSideShield_transf[3]->SetDx(-(frontPlaneWithWindow_XSize * 0.5 - upperSideShield_ZSize * 0.5));
2983 upperSideShield_transf[3]->SetDy(-(17.6 + upperSideShield_YSize * 0.5 + 6.0));
2984 upperSideShield_transf[3]->SetDz(+0.695 /*center of half-plane*/ + 0.65 /*shift*/);
2985
2986 frames->AddNode(upperSideShieldV, 0, upperSideShield_transf[0]);
2987 frames->AddNode(upperSideShieldV, 1, upperSideShield_transf[1]);
2988 frames->AddNode(upperSideShieldV, 2, upperSideShield_transf[2]);
2989 frames->AddNode(upperSideShieldV, 3, upperSideShield_transf[3]);
2990 //----------------------------------------------------------------------
2991
2992 // upper side shield cover----------------------------------------------
2993 Double_t upperSideShieldCover_XSize = 4.4; // cm
2994 Double_t upperSideShieldCover_YSize = 8.5; // cm
2995 Double_t upperSideShieldCover_ZSize = 0.15; // cm
2996
2997 TGeoShape* upperSideShieldCoverS = new TGeoBBox("upperSideShieldCoverS", upperSideShieldCover_XSize * 0.5,
2998 upperSideShieldCover_YSize * 0.5, upperSideShieldCover_ZSize * 0.5);
2999
3000 TGeoVolume* upperSideShieldCoverV =
3001 new TGeoVolume(TString("upperSideShieldCoverV") += TString("_") + frames->GetName(), upperSideShieldCoverS);
3002
3003 // volume medium
3004 TGeoMedium* upperSideShieldCoverV_medium = pMedAluminium;
3005 if (upperSideShieldCoverV_medium) {
3006 upperSideShieldCoverV->SetMedium(upperSideShieldCoverV_medium);
3007 } else
3008 Fatal("Main", "Invalid medium for upperSideShieldCoverV!");
3009
3010 // volume visual property (transparency)
3011 upperSideShieldCoverV->SetLineColor(TColor::GetColor("#ffcccc"));
3012 upperSideShieldCoverV->SetTransparency(10);
3013
3014 TGeoCombiTrans* upperSideShieldCover_transf[4];
3015
3016 upperSideShieldCover_transf[0] = new TGeoCombiTrans();
3017 upperSideShieldCover_transf[0]->RotateY(90.0);
3018 upperSideShieldCover_transf[0]->SetDx(+(frontPlaneWithWindow_XSize * 0.5 + upperSideShieldCover_ZSize * 0.5));
3019 upperSideShieldCover_transf[0]->SetDy(+(20.7 + upperSideShieldCover_YSize * 0.5 + 6.0));
3020 upperSideShieldCover_transf[0]->SetDz(+0.695 /*center of half-plane*/ - 0.65 /*shift*/ + 4.31 /*half-plane shift*/);
3021
3022 upperSideShieldCover_transf[1] = new TGeoCombiTrans();
3023 upperSideShieldCover_transf[1]->RotateY(90.0);
3024 upperSideShieldCover_transf[1]->SetDx(-(frontPlaneWithWindow_XSize * 0.5 + upperSideShieldCover_ZSize * 0.5));
3025 upperSideShieldCover_transf[1]->SetDy(+(20.7 + upperSideShieldCover_YSize * 0.5 + 6.0));
3026 upperSideShieldCover_transf[1]->SetDz(+0.695 /*center of half-plane*/ - 0.65 /*shift*/ + 4.31 /*half-plane shift*/);
3027
3028 upperSideShieldCover_transf[2] = new TGeoCombiTrans();
3029 upperSideShieldCover_transf[2]->RotateY(90.0);
3030 upperSideShieldCover_transf[2]->SetDx(+(frontPlaneWithWindow_XSize * 0.5 + upperSideShieldCover_ZSize * 0.5));
3031 upperSideShieldCover_transf[2]->SetDy(-(20.7 + upperSideShieldCover_YSize * 0.5 + 6.0));
3032 upperSideShieldCover_transf[2]->SetDz(+0.695 /*center of half-plane*/ + 0.65 /*shift*/);
3033
3034 upperSideShieldCover_transf[3] = new TGeoCombiTrans();
3035 upperSideShieldCover_transf[3]->RotateY(90.0);
3036 upperSideShieldCover_transf[3]->SetDx(-(frontPlaneWithWindow_XSize * 0.5 + upperSideShieldCover_ZSize * 0.5));
3037 upperSideShieldCover_transf[3]->SetDy(-(20.7 + upperSideShieldCover_YSize * 0.5 + 6.0));
3038 upperSideShieldCover_transf[3]->SetDz(+0.695 /*center of half-plane*/ + 0.65 /*shift*/);
3039
3040 frames->AddNode(upperSideShieldCoverV, 0, upperSideShieldCover_transf[0]);
3041 frames->AddNode(upperSideShieldCoverV, 1, upperSideShieldCover_transf[1]);
3042 frames->AddNode(upperSideShieldCoverV, 2, upperSideShieldCover_transf[2]);
3043 frames->AddNode(upperSideShieldCoverV, 3, upperSideShieldCover_transf[3]);
3044 //--------------------------------------------------------------------------
3045
3046 return frames;
3047}
3048//------------------------------------------------------------------------------
bool Bool_t
int Int_t
double Double_t
constexpr Bool_t kTRUE
void Error(const char *location, const char *msgfmt,...)
void Fatal(const char *location, const char *msgfmt,...)
R__EXTERN TGeoManager * gGeoManager
#define gROOT
R__EXTERN TSystem * gSystem
static Int_t GetColor(const char *hexcolor)
void Close(Option_t *option="") override
void SetDz(Double_t dz) override
const Double_t * GetTranslation() const override
void RotateY(Double_t angle) override
void SetDy(Double_t dy) override
void SetDx(Double_t dx) override
void RotateX(Double_t angle) override
void SetTranslation(const TGeoTranslation &tr)
void ReflectY(Bool_t leftside, Bool_t rotonly=kFALSE) override
void ComputeBBox() override
void MakeNode(const char *expression)
virtual void RegisterYourself()
void SetDy(Double_t dy) override
void SetDz(Double_t dz) override
void SetDx(Double_t dx) override
void SetVisContainers(Bool_t flag=kTRUE) override
virtual TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="")
void Draw(Option_t *option="") override
void SetTransparency(Char_t transparency=0)
virtual void SetMedium(TGeoMedium *medium)
void SetLineColor(Color_t lcolor) override
const char * GetName() const override
virtual void SetName(const char *name)
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
static TString Itoa(Int_t value, Int_t base)
const Double_t YStationPositions[NStations]
Double_t XModuleShifts[NStations][NMaxModules]
const Double_t ZStationPositions[NStations]
Double_t ZModuleShifts[NStations][NMaxModules]
const Double_t XStationPositions[NStations]
Double_t YModuleShifts[NStations][NMaxModules]
const Int_t NModulesInStations[NStations]
const Double_t XAlignmentCorrections[NStations][NMaxModules]
const Double_t YAlignmentCorrections[NStations][NMaxModules]
const Double_t ZAlignmentCorrections[NStations][NMaxModules]
Double_t ZModuleSize[NModuleSizes]
const Double_t x_dist_cent_base[NStations]
Double_t BevelAngleRad[NModuleSizes]
const Double_t x_shift_hp[NStations]
ModuleType
@ BEVEL_MODULE
@ RIGHT_ANGLED_MODULE_HALF
@ RIGHT_ANGLED_MODULE
const Double_t y_dist_cent_base[NStations]
Double_t YModuleSizeUpperPart[NModuleSizes]
Double_t YBevelSize[NModuleSizes]
const Double_t y_shift_hp[NStations]
ModuleSize
@ STANDARD_MODULE
const Bool_t ModulesYRotations[NStations][NMaxModules]
Double_t YModuleSize[NModuleSizes]
Double_t YModuleSizeLowerPart[NModuleSizes]
Double_t BevelAngleDeg[NModuleSizes]
Double_t YGapBetweenPartsOfModule[NModuleSizes]
Double_t XModuleSize[NModuleSizes]
const unsigned int NModuleSizes
const ModuleType ModulesTypes[NStations][NMaxModules]
const Double_t z_shift_hp[NStations]
const Bool_t ModulesXRotations[NStations][NMaxModules]
Double_t XBevelSize[NModuleSizes]
Double_t ZModuleFrameSize[NModuleSizes]
Double_t XShiftFromCenterToLocalX0[NModuleSizes]
Double_t YModuleFrameSize[NModuleSizes]
Double_t YSensorZoneSizeUpperPart[NModuleSizes]
Double_t YSensorZoneSizeLowerPart[NModuleSizes]
Double_t XModuleFrameSize[NModuleSizes]
Double_t YShiftFromCenterToAxis[NModuleSizes]
Double_t YShiftFromCenterToLocalY0[NModuleSizes]
TGeoVolume * CreateModuleFrame(TString module_name, ModuleType module_type, ModuleSize module_size)
TGeoVolume * CreateFrameForStation_LongModule(TString frame_name, Int_t current_station_num)
TGeoVolume * CreateFrameForStation_StandardModule(TString frame_name, Int_t current_station_num)
TGeoVolume * CreateModule(TString module_name, ModuleType module_type, ModuleSize module_size)
TGeoVolume * CreateStation(TString station_name)
void DefineRequiredMedia(FairGeoMedia *geoMedia, FairGeoBuilder *geoBuild)
Double_t ATan(Double_t)
constexpr Double_t PiOver2()
Double_t Cos(Double_t)
Double_t Sin(Double_t)
Double_t Tan(Double_t)
constexpr Double_t RadToDeg()