BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_Silicon_Run8_4stations.C
Go to the documentation of this file.
1/*
2 * Baranov D.
3 * 30.06.2021
4 * Use this macro to create ROOT geometry for the RUN-8 config. of SILICON
5 * detector including 4 Si-Stations
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//------------------------------------------------------------------------------
132
133// GeoManager
135
136// Module parameters ------------------------------------------------------------
138{
141}; // STANDARD_MODULE is (63x126)mm, LONG_MODULE is (63x186)mm
142const unsigned int NModuleSizes = 2;
143
144Double_t YGapBetweenPartsOfModule[NModuleSizes] = {0.0035 /*STANDARD_MODULE*/, 0.0035 /*LONG_MODULE*/}; // Mrs. Slit
145
146Double_t XModuleSize[NModuleSizes] = {6.3 /*STANDARD_MODULE*/, 6.3 /*LONG_MODULE*/};
147
148Double_t YModuleSizeUpperPart[NModuleSizes] = {6.3 /*STANDARD_MODULE*/, 9.3 /*LONG_MODULE*/};
149Double_t YModuleSizeLowerPart[NModuleSizes] = {6.3 /*STANDARD_MODULE*/, 9.3 /*LONG_MODULE*/};
150
157
158Double_t ZModuleSize[NModuleSizes] = {0.03 /*STANDARD_MODULE*/, 0.03 /*LONG_MODULE*/};
159
160Double_t XBevelSize[NModuleSizes] = {3.82 /*STANDARD_MODULE*/, 3.82 /*LONG_MODULE*/}; // x-bevel for a angled cut
161Double_t YBevelSize[NModuleSizes] = {3.82 /*STANDARD_MODULE*/, 3.82 /*LONG_MODULE*/}; // y-bevel for a angled cut
162
167
172
173Double_t XLeftBorder[NModuleSizes] = {0.1145 /*STANDARD_MODULE*/, 0.1118 /*LONG_MODULE*/};
174Double_t XRightBorder[NModuleSizes] = {0.1118 /*STANDARD_MODULE*/, 0.1118 /*LONG_MODULE*/};
175Double_t YTopBorder[NModuleSizes] = {0.1143 /*STANDARD_MODULE*/, 0.1148 /*LONG_MODULE*/};
176Double_t YMiddleBorderUpperPart[NModuleSizes] = {0.1121 /*STANDARD_MODULE*/, 0.1148 /*LONG_MODULE*/};
177Double_t YMiddleBorderLowerPart[NModuleSizes] = {0.1147 /*STANDARD_MODULE*/, 0.1148 /*LONG_MODULE*/};
178Double_t YBottomBorder[NModuleSizes] = {0.1148 /*STANDARD_MODULE*/, 0.1148 /*LONG_MODULE*/};
179Double_t XYBevelBorder[NModuleSizes] = {0.1146 /*STANDARD_MODULE*/, 0.1146 /*LONG_MODULE*/};
180
181// Sensor zones ------------------------------------
186
192
199
201 ZModuleSize[STANDARD_MODULE], /*STANDARD_MODULE*/
202 ZModuleSize[LONG_MODULE] /*LONG_MODULE*/
203};
204//-------------------------------------------------
205
206// Module frames -----------------------------------
208 XModuleSize[STANDARD_MODULE], /*STANDARD_MODULE*/
209 XModuleSize[LONG_MODULE] /*LONG_MODULE*/
210};
211
213 YModuleSize[STANDARD_MODULE], /*STANDARD_MODULE*/
214 YModuleSize[LONG_MODULE] /*LONG_MODULE*/
215};
216
217Double_t ZModuleFrameSize[NModuleSizes] = {0.18 /*STANDARD_MODULE*/, 0.18 /*LONG_MODULE*/};
218//-------------------------------------------------
219
220// Y-shift from center of the gap to the global x-axis (for y-alignment of the module)
225
226// X-shift from center of the module to the origin of the local x-axis
228 +XModuleSize[STANDARD_MODULE] * 0.5, /*STANDARD_MODULE*/
229 +XModuleSize[LONG_MODULE] * 0.5 /*LONG_MODULE*/
230};
231
232// Y-shift from center of the module to the origin of the local y-axis
237//------------------------------------------------------------------------------
238/*
239 ASCII module picture (view from target)
240
241 |<---- XModuleSize ---------->| ^
242 | | | Y-axis
243 ------------------------------ ---------
244 | | top border | | ^
245 ------------------------------ |
246 | | | | |
247 | l | rectangle | r | |
248 | e | sensor | i | |
249 | f | zone | g | |
250 | t | | h | |
251 | | | t | |
252 | | | | |
253 ------------------------------ |
254 | | middle (upper part) | |
255 ------ gap between parts ----- YModuleSize
256 | | middle (lower part) | |
257 ------------------------------ |
258 | | | | |
259 | b | bevel (or rect.) | r | |
260 | e | sensor | i | |
261 \ v \ zone | g | |
262 \ e \ | h | |
263 \ l \ | t | |
264 \ \ | | |
265 ------------------------- |
266 \ \ bottom | | v
267 ---------------------- ---------
268
269 * x-axis <----------------------------------(x0,y0) local point
270 */
271
272// media
278
279class FairGeoMedia;
280class FairGeoBuilder;
281
282// function declarations
283TGeoVolume* CreateStation(TString station_name);
284TGeoVolume* CreateModule(TString module_name, ModuleType module_type, ModuleSize module_size);
285
286void DefineRequiredMedia(FairGeoMedia* geoMedia, FairGeoBuilder* geoBuild)
287{
288
289 // air medium
290 FairGeoMedium* mAir = geoMedia->getMedium("air");
291 if (!mAir)
292 Fatal("Main", "FairMedium air not found");
293 geoBuild->createMedium(mAir);
294 pMedAir = gGeoManager->GetMedium("air");
295 if (!pMedAir)
296 Fatal("Main", "Medium air not found");
297
298 // carbon medium
299 FairGeoMedium* mCarbon = geoMedia->getMedium("carbon");
300 if (!mCarbon)
301 Fatal("Main", "FairMedium carbon not found");
302 geoBuild->createMedium(mCarbon);
303 pMedCarbon = gGeoManager->GetMedium("carbon");
304 if (!pMedCarbon)
305 Fatal("Main", "Medium carbon not found");
306
307 // fiberglass medium
308 FairGeoMedium* mFiberGlass = geoMedia->getMedium("fiberglass");
309 if (!mFiberGlass)
310 Fatal("Main", "FairMedium fiberglass not found");
311 geoBuild->createMedium(mFiberGlass);
312 pMedFiberGlass = gGeoManager->GetMedium("fiberglass");
313 if (!pMedFiberGlass)
314 Fatal("Main", "Medium fiberglass not found");
315
316 // copper medium
317 FairGeoMedium* mCopper = geoMedia->getMedium("copper");
318 if (!mCopper)
319 Fatal("Main", "FairMedium copper not found");
320 geoBuild->createMedium(mCopper);
321 pMedCopper = gGeoManager->GetMedium("copper");
322 if (!pMedCopper)
323 Fatal("Main", "Medium copper not found");
324
325 // silicon medium
326 FairGeoMedium* mSilicon = geoMedia->getMedium("silicon");
327 if (!mSilicon)
328 Fatal("Main", "FairMedium silicon not found");
329 geoBuild->createMedium(mSilicon);
330 pMedSilicon = gGeoManager->GetMedium("silicon");
331 if (!pMedSilicon)
332 Fatal("Main", "Medium silicon not found");
333}
334
336{
337 cout << "\n";
338 cout << "Module parameters information [STANDARD_MODULE]: ------------------" << "\n";
339 cout << " XModuleSize = " << XModuleSize[STANDARD_MODULE] << " cm" << "\n";
340 cout << " YModuleSize = " << YModuleSize[STANDARD_MODULE] << " cm" << " ( "
342 << YModuleSizeLowerPart[STANDARD_MODULE] << " )" << "\n";
343 cout << " YModuleSizeUpperPart = " << YModuleSizeUpperPart[STANDARD_MODULE] << " cm" << "\n";
344 cout << " YModuleSizeLowerPart = " << YModuleSizeLowerPart[STANDARD_MODULE] << " cm" << "\n";
345 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule[STANDARD_MODULE] << " cm" << "\n";
346 cout << " ZModuleSize = " << ZModuleSize[STANDARD_MODULE] << " cm" << "\n";
347 cout << "\n";
348 cout << " XBevelSize = " << XBevelSize[STANDARD_MODULE] << " cm" << "\n";
349 cout << " YBevelSize = " << YBevelSize[STANDARD_MODULE] << " cm" << "\n";
350 cout << " BevelAngleDeg = " << BevelAngleDeg[STANDARD_MODULE] << " deg" << "\n";
351 cout << "\n";
352 cout << " XLeftBorder = " << XLeftBorder[STANDARD_MODULE] << " cm" << "\n";
353 cout << " XRightBorder = " << XRightBorder[STANDARD_MODULE] << " cm" << "\n";
354 cout << " YTopBorder = " << YTopBorder[STANDARD_MODULE] << " cm" << "\n";
355 cout << " YMiddleBorderUpperPart = " << YMiddleBorderUpperPart[STANDARD_MODULE] << " cm" << "\n";
356 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule[STANDARD_MODULE] << " cm"
357 << " (gap between two parts)\n";
358 cout << " YMiddleBorderLowerPart = " << YMiddleBorderLowerPart[STANDARD_MODULE] << " cm" << "\n";
359 cout << " YBottomBorder = " << YBottomBorder[STANDARD_MODULE] << " cm" << "\n";
360 cout << " XYBevelBorder = " << XYBevelBorder[STANDARD_MODULE] << " cm" << "\n";
361 cout << "\n";
362 cout << " XSensorZoneSize = " << XSensorZoneSize[STANDARD_MODULE] << " cm" << "\n";
363 cout << " YSensorZoneSizeUpperPart = " << YSensorZoneSizeUpperPart[STANDARD_MODULE] << " cm" << "\n";
364 cout << " YSensorZoneSizeLowerPart = " << YSensorZoneSizeLowerPart[STANDARD_MODULE] << " cm" << "\n";
365 cout << " ZSensorZoneSize = " << ZSensorZoneSize[STANDARD_MODULE] << " cm" << "\n";
366
367 cout << "-------------------------------------------------------------\n";
368
369 cout << "\n";
370 cout << "Module parameters information [LONG_MODULE]: ------------------" << "\n";
371 cout << " XModuleSize = " << XModuleSize[LONG_MODULE] << " cm" << "\n";
372 cout << " YModuleSize = " << YModuleSize[LONG_MODULE] << " cm" << " ( " << YModuleSizeUpperPart[LONG_MODULE]
374 << "\n";
375 cout << " YModuleSizeUpperPart = " << YModuleSizeUpperPart[LONG_MODULE] << " cm" << "\n";
376 cout << " YModuleSizeLowerPart = " << YModuleSizeLowerPart[LONG_MODULE] << " cm" << "\n";
377 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule[LONG_MODULE] << " cm" << "\n";
378 cout << " ZModuleSize = " << ZModuleSize[LONG_MODULE] << " cm" << "\n";
379 cout << "\n";
380 cout << " XBevelSize = " << XBevelSize[LONG_MODULE] << " cm" << "\n";
381 cout << " YBevelSize = " << YBevelSize[LONG_MODULE] << " cm" << "\n";
382 cout << " BevelAngleDeg = " << BevelAngleDeg[LONG_MODULE] << " deg" << "\n";
383 cout << "\n";
384 cout << " XLeftBorder = " << XLeftBorder[LONG_MODULE] << " cm" << "\n";
385 cout << " XRightBorder = " << XRightBorder[LONG_MODULE] << " cm" << "\n";
386 cout << " YTopBorder = " << YTopBorder[LONG_MODULE] << " cm" << "\n";
387 cout << " YMiddleBorderUpperPart = " << YMiddleBorderUpperPart[LONG_MODULE] << " cm" << "\n";
388 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule[LONG_MODULE] << " cm"
389 << " (gap between two parts)\n";
390 cout << " YMiddleBorderLowerPart = " << YMiddleBorderLowerPart[LONG_MODULE] << " cm" << "\n";
391 cout << " YBottomBorder = " << YBottomBorder[LONG_MODULE] << " cm" << "\n";
392 cout << " XYBevelBorder = " << XYBevelBorder[LONG_MODULE] << " cm" << "\n";
393 cout << "\n";
394 cout << " XSensorZoneSize = " << XSensorZoneSize[LONG_MODULE] << " cm" << "\n";
395 cout << " YSensorZoneSizeUpperPart = " << YSensorZoneSizeUpperPart[LONG_MODULE] << " cm" << "\n";
396 cout << " YSensorZoneSizeLowerPart = " << YSensorZoneSizeLowerPart[LONG_MODULE] << " cm" << "\n";
397 cout << " ZSensorZoneSize = " << ZSensorZoneSize[LONG_MODULE] << " cm" << "\n";
398
399 cout << "-------------------------------------------------------------\n";
400}
401
403{
404 cout << "\n";
405 for (Int_t istation = 0; istation < NStations; ++istation) {
406 cout << "station " << istation << ":\n";
407 cout << " XStationPositions[" << istation << "] = " << XStationPositions[istation] << " cm\n";
408 cout << " YStationPositions[" << istation << "] = " << YStationPositions[istation] << " cm\n";
409 cout << " ZStationPositions[" << istation << "] = " << ZStationPositions[istation] << " cm\n";
410 cout << "\n";
411
412 for (Int_t imodule = 0; imodule < NModulesInStations[istation]; ++imodule) {
413 cout << " module " << imodule << ":\n";
414 cout << " XModuleShifts[" << istation << "][" << imodule << "] = " << XModuleShifts[istation][imodule]
415 << " cm\n";
416 cout << " YModuleShifts[" << istation << "][" << imodule << "] = " << YModuleShifts[istation][imodule]
417 << " cm\n";
418 cout << " ZModuleShifts[" << istation << "][" << imodule << "] = " << ZModuleShifts[istation][imodule]
419 << " cm\n";
420 cout << "\n";
421
422 Double_t XGlobalModulePos = XModuleShifts[istation][imodule] + XStationPositions[istation];
423 Double_t YGlobalModulePos = YModuleShifts[istation][imodule] + YStationPositions[istation];
424 Double_t ZGlobalModulePos = ZModuleShifts[istation][imodule] + ZStationPositions[istation];
425
426 cout << " XGlobalModulePos = " << XGlobalModulePos << " cm\n";
427 cout << " YGlobalModulePos = " << YGlobalModulePos << " cm\n";
428 cout << " ZGlobalModulePos = " << ZGlobalModulePos << " cm\n";
429 cout << "\n";
430
431 cout << " ModulesTypes[" << istation << "][" << imodule << "] = ";
432 if (ModulesTypes[istation][imodule] == 0)
433 cout << "RIGHT_ANGLED_MODULE\n";
434 if (ModulesTypes[istation][imodule] == 1)
435 cout << "BEVEL_MODULE\n";
436 if (ModulesTypes[istation][imodule] == 2)
437 cout << "RIGHT_ANGLED_MODULE_HALF\n";
438 if (ModulesTypes[istation][imodule] == 3)
439 cout << "BEVEL_MODULE_HALF\n";
440 cout << " ModulesYRotations[" << istation << "][" << imodule << "] = ";
441 if (ModulesYRotations[istation][imodule] == false)
442 cout << "not rotated around Y\n";
443 if (ModulesYRotations[istation][imodule] == true)
444 cout << "rotated around Y\n";
445 cout << " ModulesXRotations[" << istation << "][" << imodule << "] = ";
446 if (ModulesXRotations[istation][imodule] == false)
447 cout << "not rotated around X\n";
448 if (ModulesXRotations[istation][imodule] == true)
449 cout << "rotated around X\n";
450 cout << "\n";
451 }
452 cout << "-------------------------------------------------------------\n";
453 }
454 cout << "-------------------------------------------------------------\n";
455}
456
458{
459
460 // ---- set working directory --------------------------------------------
461 TString gPath = gSystem->Getenv("VMCWORKDIR");
462
463 // ------- Geometry file name (output) ----------------------------------
464 const TString geoDetectorName = "Silicon";
465 const TString geoDetectorVersion = "Run8_4stations";
466 const TString geoFileName = gPath + "/geometry/" + geoDetectorName + "_" + geoDetectorVersion + ".root";
467
468 // ---- global geometry parameters ---------------------------------------
469 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
470 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
471
472 // ------- Load media from media file ----------------------------------
473 TString medFile = gPath + "/geometry/media.geo";
474 geoFace->setMediaFile(medFile);
475 geoFace->readMedia();
476 FairGeoMedia* geoMedia = geoFace->getMedia();
477 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
478
479 DefineRequiredMedia(geoMedia, geoBuild);
480 // -------------------------------------------------------------------------
481
482 // Print information about parameters of SILICON
485
486 // -------------- Create geometry and top volume -------------------------
487 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
488 gGeoMan->SetName(geoDetectorName + "_geom");
489 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
490 top->SetMedium(pMedAir);
491 gGeoMan->SetTopVolume(top);
492 // gGeoMan->SetTopVisible(1);
493 // --------------------------------------------------------------------------
494
495 // Define TOP Geometry
496 TGeoVolume* SILICON = new TGeoVolumeAssembly(geoDetectorName);
497 SILICON->SetMedium(pMedAir);
498
499 // Let's create SILICON stations filled with modules
500 for (Int_t istation = 0; istation < NStations; ++istation) {
501
502 // module size in a station
503 ModuleSize module_size = STANDARD_MODULE;
504
505 //(!!!) the third station has long modules (!!!)
506 if (istation == 3)
507 module_size = LONG_MODULE;
508
509 TGeoVolume* station = CreateStation(TString("station") + TString::Itoa(istation, 10));
510
511 Int_t NModules = NModulesInStations[istation];
512
513 TGeoVolume* modules[NModules];
514 TGeoCombiTrans* modTransforms[NModules];
515
516 for (Int_t imodule = 0; imodule < NModules; ++imodule) {
517
518 TString module_name = TString("module") + TString::Itoa(imodule, 10) + TString("_") + station->GetName();
519 modules[imodule] = CreateModule(module_name, ModulesTypes[istation][imodule], module_size);
520
521 modTransforms[imodule] = new TGeoCombiTrans();
522
523 if (ModulesYRotations[istation][imodule]) {
524 modTransforms[imodule]->RotateY(180.0);
525 modTransforms[imodule]->SetDx(XModuleShifts[istation][imodule]
526 - XShiftFromCenterToLocalX0[module_size]);
527 } else {
528 modTransforms[imodule]->SetDx(XModuleShifts[istation][imodule]
529 + XShiftFromCenterToLocalX0[module_size]);
530 }
531
532 if (ModulesXRotations[istation][imodule]) {
533 modTransforms[imodule]->RotateX(180.0);
534 if (ModulesTypes[istation][imodule] == ModuleType::BEVEL_MODULE_HALF
535 || ModulesTypes[istation][imodule] == ModuleType::RIGHT_ANGLED_MODULE_HALF)
536 {
537 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule]
538 - YModuleSizeUpperPart[module_size] * 0.5);
539 } else {
540 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule] + YShiftFromCenterToAxis[module_size]
541 - YShiftFromCenterToLocalY0[module_size]);
542 }
543 } else {
544 if (ModulesTypes[istation][imodule] == ModuleType::BEVEL_MODULE_HALF
545 || ModulesTypes[istation][imodule] == ModuleType::RIGHT_ANGLED_MODULE_HALF)
546 {
547 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule]
548 + YModuleSizeUpperPart[module_size] * 0.5);
549 } else {
550 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule] + YShiftFromCenterToAxis[module_size]
551 + YShiftFromCenterToLocalY0[module_size]);
552 }
553 }
554
555 Double_t z_module_shift =
556 +ZModuleSize[module_size] * 0.5; // To z-module position is at the beginning of the sensitive volume
557 modTransforms[imodule]->SetDz(ZModuleShifts[istation][imodule] + z_module_shift);
558
559 // if(imodule == 1) station->AddNode(modules[imodule], 0, modTransforms[imodule]);
560 station->AddNode(modules[imodule], 0, modTransforms[imodule]);
561 }
562
563 TGeoCombiTrans* station_transform = new TGeoCombiTrans();
564 station_transform->SetTranslation(XStationPositions[istation], YStationPositions[istation],
565 ZStationPositions[istation]);
566
567 SILICON->AddNode(station, 0, station_transform);
568 }
569
570 top->AddNode(SILICON, 0);
572
573 // --------------- Finish -----------------------------------------------
574 gGeoMan->CloseGeometry();
575 gGeoMan->CheckOverlaps(0.0001);
576 gGeoMan->PrintOverlaps();
577 gGeoMan->Test();
578
579 TFile* geoFile = new TFile(geoFileName, "RECREATE");
580 top->Write();
581 geoFile->Close();
582 top->Draw("ogl");
583}
584//------------------------------------------------------------------------------
585
587{
588
589 TGeoVolume* stationA = new TGeoVolumeAssembly(station_name);
590 stationA->SetMedium(pMedAir);
591
592 return stationA;
593}
594
595TGeoVolume* CreateModule(TString module_name, ModuleType module_type, ModuleSize module_size)
596{
597
598 // Shapes -------------------------------------------------------------------
599 // module shape
600 TGeoShape* moduleS = 0;
601
602 switch (module_type) {
603 case RIGHT_ANGLED_MODULE: {
604 moduleS = new TGeoBBox("moduleS", XModuleSize[module_size] * 0.5, YModuleSize[module_size] * 0.5,
605 ZModuleSize[module_size] * 0.5);
606 break;
607 }
609 moduleS = new TGeoBBox("moduleS", XModuleSize[module_size] * 0.5, YModuleSizeUpperPart[module_size] * 0.5,
610 ZModuleSize[module_size] * 0.5);
611 break;
612 }
613 case BEVEL_MODULE: {
614 moduleS = new TGeoXtru(2);
615 moduleS->SetName("moduleS");
616 Double_t x_pos[5] = {
617 +XModuleSize[module_size] * 0.5, -XModuleSize[module_size] * 0.5, -XModuleSize[module_size] * 0.5,
618 +XModuleSize[module_size] * 0.5 - XBevelSize[module_size], +XModuleSize[module_size] * 0.5};
619 Double_t y_pos[5] = {+YModuleSize[module_size] * 0.5, +YModuleSize[module_size] * 0.5,
620 -YModuleSize[module_size] * 0.5, -YModuleSize[module_size] * 0.5,
621 -YModuleSize[module_size] * 0.5 + YBevelSize[module_size]};
622 ((TGeoXtru*)moduleS)->DefinePolygon(5, x_pos, y_pos);
623 ((TGeoXtru*)moduleS)->DefineSection(0, -ZModuleSize[module_size] * 0.5);
624 ((TGeoXtru*)moduleS)->DefineSection(1, +ZModuleSize[module_size] * 0.5);
625 break;
626 }
627 case BEVEL_MODULE_HALF: {
628 moduleS = new TGeoXtru(2);
629 moduleS->SetName("moduleS");
630 Double_t x_pos[5] = {
631 +XModuleSize[module_size] * 0.5, -XModuleSize[module_size] * 0.5, -XModuleSize[module_size] * 0.5,
632 +XModuleSize[module_size] * 0.5 - XBevelSize[module_size], +XModuleSize[module_size] * 0.5};
633 Double_t y_pos[5] = {+YModuleSizeUpperPart[module_size] * 0.5, +YModuleSizeUpperPart[module_size] * 0.5,
634 -YModuleSizeUpperPart[module_size] * 0.5, -YModuleSizeUpperPart[module_size] * 0.5,
635 -YModuleSizeUpperPart[module_size] * 0.5 + YBevelSize[module_size]};
636 ((TGeoXtru*)moduleS)->DefinePolygon(5, x_pos, y_pos);
637 ((TGeoXtru*)moduleS)->DefineSection(0, -ZModuleSize[module_size] * 0.5);
638 ((TGeoXtru*)moduleS)->DefineSection(1, +ZModuleSize[module_size] * 0.5);
639 break;
640 }
641 default:
642 Error("CreateModule()", "Incorrect module type selected!!!");
643 }
644
645 // sensor zone shape (upper part of the module: rectangle zone)
646 TGeoShape* sensor_zone_upper_part_rectS =
647 new TGeoBBox("sensor_zone_upper_part_rectS", XSensorZoneSize[module_size] * 0.5,
648 YSensorZoneSizeUpperPart[module_size] * 0.5, ZSensorZoneSize[module_size] * 0.5);
649
650 // sensor zone shape (upper part of the module: bevel zone)
651 TGeoShape* sensor_zone_upper_part_bevelS = new TGeoXtru(2);
652 sensor_zone_upper_part_bevelS->SetName("sensor_zone_upper_part_bevelS");
653 // Calculate coordinates of the bottom and the top points of the inner bevel
654 {
655 // find x and y projections of the bevel border thickness
656 Double_t x_delta = XYBevelBorder[module_size] / TMath::Cos(BevelAngleRad[module_size]);
657 Double_t y_delta = XYBevelBorder[module_size] / TMath::Sin(BevelAngleRad[module_size]);
658
659 // find shifts of the sensitive zone from module borders via the equation of the straight line for the inner
660 // bevel
661 Double_t x_delta_top_BP = XLeftBorder[module_size];
662 Double_t y_delta_top_BP = TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]) * x_delta_top_BP
663 + (YBevelSize[module_size] + y_delta);
664
665 Double_t y_delta_bottom_BP = YMiddleBorderUpperPart[module_size];
666 Double_t x_delta_bottom_BP = (y_delta_bottom_BP - (YBevelSize[module_size] + y_delta))
667 / (TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]));
668 //----------------------------------------------------------------------
669
670 Double_t x_pos_sensor_zone_bevel[5] = {+XModuleSize[module_size] * 0.5 - XLeftBorder[module_size],
671 -XModuleSize[module_size] * 0.5 + XRightBorder[module_size],
672 -XModuleSize[module_size] * 0.5 + XRightBorder[module_size],
673 +XModuleSize[module_size] * 0.5 - x_delta_bottom_BP,
674 +XModuleSize[module_size] * 0.5 - XLeftBorder[module_size]};
675 Double_t y_pos_sensor_zone_bevel[5] = {
676 +YModuleSizeUpperPart[module_size] * 0.5 - YTopBorder[module_size],
677 +YModuleSizeUpperPart[module_size] * 0.5 - YTopBorder[module_size],
678 -YModuleSizeUpperPart[module_size] * 0.5 + YMiddleBorderUpperPart[module_size],
679 -YModuleSizeUpperPart[module_size] * 0.5 + YMiddleBorderUpperPart[module_size],
680 -YModuleSizeUpperPart[module_size] * 0.5 + y_delta_top_BP};
681
682 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefinePolygon(5, x_pos_sensor_zone_bevel, y_pos_sensor_zone_bevel);
683 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefineSection(0, -ZModuleSize[module_size] * 0.5);
684 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefineSection(1, +ZModuleSize[module_size] * 0.5);
685 }
686
687 // sensor zone shape (lower part of the module: rectangle zone)
688 TGeoShape* sensor_zone_lower_part_rectS =
689 new TGeoBBox("sensor_zone_lower_part_rectS", XSensorZoneSize[module_size] * 0.5,
690 YSensorZoneSizeLowerPart[module_size] * 0.5, ZSensorZoneSize[module_size] * 0.5);
691
692 // sensor zone shape (lower part of the module: bevel zone)
693 TGeoShape* sensor_zone_lower_part_bevelS = new TGeoXtru(2);
694 sensor_zone_lower_part_bevelS->SetName("sensor_zone_lower_part_bevelS");
695 // Calculate coordinates of the bottom and the top points of the inner bevel
696 {
697 // find x and y projections of the bevel border thickness
698 Double_t x_delta = XYBevelBorder[module_size] / TMath::Cos(BevelAngleRad[module_size]);
699 Double_t y_delta = XYBevelBorder[module_size] / TMath::Sin(BevelAngleRad[module_size]);
700
701 // find shifts of the sensitive zone from module borders via the equation of the straight line for the inner
702 // bevel
703 Double_t x_delta_top_BP = XLeftBorder[module_size];
704 Double_t y_delta_top_BP = TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]) * x_delta_top_BP
705 + (YBevelSize[module_size] + y_delta);
706
707 Double_t y_delta_bottom_BP = YBottomBorder[module_size];
708 Double_t x_delta_bottom_BP = (y_delta_bottom_BP - (YBevelSize[module_size] + y_delta))
709 / (TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]));
710 //----------------------------------------------------------------------
711
712 Double_t x_pos_sensor_zone_bevel[5] = {+XModuleSize[module_size] * 0.5 - XLeftBorder[module_size],
713 -XModuleSize[module_size] * 0.5 + XRightBorder[module_size],
714 -XModuleSize[module_size] * 0.5 + XRightBorder[module_size],
715 +XModuleSize[module_size] * 0.5 - x_delta_bottom_BP,
716 +XModuleSize[module_size] * 0.5 - XLeftBorder[module_size]};
717 Double_t y_pos_sensor_zone_bevel[5] = {
718 +YModuleSizeLowerPart[module_size] * 0.5 - YMiddleBorderLowerPart[module_size],
719 +YModuleSizeLowerPart[module_size] * 0.5 - YMiddleBorderLowerPart[module_size],
720 -YModuleSizeLowerPart[module_size] * 0.5 + YBottomBorder[module_size],
721 -YModuleSizeLowerPart[module_size] * 0.5 + YBottomBorder[module_size],
722 -YModuleSizeLowerPart[module_size] * 0.5 + y_delta_top_BP};
723
724 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefinePolygon(5, x_pos_sensor_zone_bevel, y_pos_sensor_zone_bevel);
725 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefineSection(0, -ZModuleSize[module_size] * 0.5);
726 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefineSection(1, +ZModuleSize[module_size] * 0.5);
727 }
728
729 //--------------------------------------------------------------------------
730
731 // Volumes ------------------------------------------------------------------
732 // module volume
733 // TString module_name = "moduleV_";
734
735 TGeoVolume* moduleV = new TGeoVolume(module_name, moduleS);
736
737 // sensor zone volume (upper part of the module)
738 TGeoVolume* sensor_zone_upper_part_rectV =
739 new TGeoVolume("Sensor_zone_upper_part_rectV", sensor_zone_upper_part_rectS);
740
741 // sensor zone volume (lower part of the module)
742 TGeoVolume* sensor_zone_upper_part_bevelV =
743 new TGeoVolume("Sensor_zone_upper_part_bevelV", sensor_zone_upper_part_bevelS);
744
745 // sensor zone volume (lower part of the module: rectangle zone)
746 TGeoVolume* sensor_zone_lower_part_rectV =
747 new TGeoVolume("Sensor_zone_lower_part_rectV", sensor_zone_lower_part_rectS);
748
749 // sensor zone volume (lower part of the module: bevel zone)
750 TGeoVolume* sensor_zone_lower_part_bevelV =
751 new TGeoVolume("Sensor_zone_lower_part_bevelV", sensor_zone_lower_part_bevelS);
752
753 // volumes media
754 TGeoMedium* silicon_medium = pMedSilicon;
755 if (silicon_medium) {
756 moduleV->SetMedium(silicon_medium);
757 sensor_zone_upper_part_rectV->SetMedium(silicon_medium);
758 sensor_zone_upper_part_bevelV->SetMedium(silicon_medium);
759 sensor_zone_lower_part_rectV->SetMedium(silicon_medium);
760 sensor_zone_lower_part_bevelV->SetMedium(silicon_medium);
761 } else
762 Fatal("Main", "Invalid medium for modules and sensor zones!");
763
764 // volumes visual property (transparency)
765 moduleV->SetLineColor(TColor::GetColor("#ff47ca"));
766 sensor_zone_upper_part_rectV->SetLineColor(TColor::GetColor("#e0b0ff"));
767 sensor_zone_upper_part_bevelV->SetLineColor(TColor::GetColor("#e0b0ff"));
768 sensor_zone_lower_part_rectV->SetLineColor(TColor::GetColor("#e0b0ff"));
769 sensor_zone_lower_part_bevelV->SetLineColor(TColor::GetColor("#e0b0ff"));
770 moduleV->SetTransparency(50);
771
772 switch (module_type) {
773
774 case RIGHT_ANGLED_MODULE: {
775
776 // position of the sensor zone in the upper part of the module
777 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
778 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder[module_size] + XRightBorder[module_size]) * 0.5
779 - XLeftBorder[module_size]);
780 sensor_zone_upper_part_pos->SetDy(
781 +YSensorZoneSizeUpperPart[module_size] * 0.5 + YGapBetweenPartsOfModule[module_size] * 0.5
782 + YMiddleBorderUpperPart[module_size] - YShiftFromCenterToAxis[module_size]);
783 sensor_zone_upper_part_pos->SetDz(0.0);
784
785 // position of the sensor zone in the lower part of the module
786 TGeoTranslation* sensor_zone_lower_part_pos = new TGeoTranslation();
787 sensor_zone_lower_part_pos->SetDx(+(XLeftBorder[module_size] + XRightBorder[module_size]) * 0.5
788 - XLeftBorder[module_size]);
789 sensor_zone_lower_part_pos->SetDy(
790 -YSensorZoneSizeLowerPart[module_size] * 0.5 - YGapBetweenPartsOfModule[module_size] * 0.5
791 - YMiddleBorderLowerPart[module_size] - YShiftFromCenterToAxis[module_size]);
792 sensor_zone_lower_part_pos->SetDz(0.0);
793
794 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
795 moduleV->AddNode(sensor_zone_lower_part_rectV, 0, sensor_zone_lower_part_pos);
796 break;
797 }
798
800 // position of the sensor zone in the upper part of the module
801 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
802 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder[module_size] + XRightBorder[module_size]) * 0.5
803 - XLeftBorder[module_size]);
804 sensor_zone_upper_part_pos->SetDy(+(YTopBorder[module_size] + YMiddleBorderUpperPart[module_size]) * 0.5
805 - YTopBorder[module_size]);
806 sensor_zone_upper_part_pos->SetDz(0.0);
807
808 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
809 break;
810 }
811
812 case BEVEL_MODULE: {
813
814 // position of the sensor zone in the upper part of the module
815 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
816 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder[module_size] + XRightBorder[module_size]) * 0.5
817 - XLeftBorder[module_size]);
818 sensor_zone_upper_part_pos->SetDy(
819 +YSensorZoneSizeUpperPart[module_size] * 0.5 + YGapBetweenPartsOfModule[module_size] * 0.5
820 + YMiddleBorderUpperPart[module_size] - YShiftFromCenterToAxis[module_size]);
821 sensor_zone_upper_part_pos->SetDz(0.0);
822
823 // position of the sensor zone in the lower part of the module
824 TGeoTranslation* sensor_zone_lower_part_bevel_pos = new TGeoTranslation();
825 sensor_zone_lower_part_bevel_pos->SetDx(0.0);
826 sensor_zone_lower_part_bevel_pos->SetDy(-YModuleSizeLowerPart[module_size] * 0.5
827 - YGapBetweenPartsOfModule[module_size] * 0.5
828 - YShiftFromCenterToAxis[module_size]);
829 sensor_zone_lower_part_bevel_pos->SetDz(0.0);
830
831 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
832 moduleV->AddNode(sensor_zone_lower_part_bevelV, 0, sensor_zone_lower_part_bevel_pos);
833 break;
834 }
835
836 case BEVEL_MODULE_HALF: {
837
838 // position of the sensor zone in the upper part of the module
839 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
840 sensor_zone_upper_part_pos->SetDx(0);
841 sensor_zone_upper_part_pos->SetDy(0);
842 sensor_zone_upper_part_pos->SetDz(0.0);
843
844 moduleV->AddNode(sensor_zone_upper_part_bevelV, 0, sensor_zone_upper_part_pos);
845 break;
846 }
847
848 default:
849 Error("CreateModule()", "Incorrect module type selected!!!");
850 }
851
852 return moduleV;
853}
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
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 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 unsigned int 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]
void create_rootgeom_Silicon_Run8_4stations()
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()