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