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