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