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