BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_Silicon_Run8_5stations.C
Go to the documentation of this file.
1/*
2 * Baranov D.
3 * 05.01.2022
4 * Use this macro to create ROOT geometry for the RUN-8 config. of SILICON
5 * detector including 5 Si-Stations
6 *
7 * WARNING: all units is in cm!!!
8 *
9 */
10
11using namespace TMath;
12
13// Set Parameters of SILICON detector -------------------------------------------
14const Int_t NStations = 5; // stations in the detector
15const Int_t NMaxModules = 22; // max. number of modules in a station
16
17const Int_t NModulesInStations[NStations] = {6, 10, 14, 18, 22};
18
19//(X-Y-Z)Positions of stations (sensitive volumes)
20const Double_t XStationPositions[NStations] = {0.0, 0.0, 0.0, 0.0};
21const Double_t YStationPositions[NStations] = {0.0, 0.0, 0.0, 0.0};
22const Double_t ZStationPositions[NStations] = {15.7 - 8.64 /*7.06*/, +15.7, +15.7 + 8.64, +15.7 + 8.64 + 8.64,
23 +15.7 + 8.64 + 8.64 + 8.64};
24
25/*
26 * where
27 * (1)
28 *
29 * (2)
30 */
31
32//(X-Y-Z)Shifts of modules in each station
34 {+9.15 /*0*/, +3.15 /*1*/, -9.15 /*2*/, +9.15 /*3*/, +3.15 /*4*/, -9.15 /*5*/},
35 {+15.15 /*0*/, +9.15 /*1*/, +3.15 /*2*/, -9.15 /*3*/, -15.15 /*4*/, +15.15 /*5*/, +9.15 /*6*/, +3.15 /*7*/,
36 -9.15 /*8*/, -15.15 /*9*/},
37 {+21.15 /*0*/, +15.15 /*1*/, +9.15 /*2*/, +3.15 /*3*/, -9.15 /*4*/, -15.15 /*5*/, -21.15 /*6*/, +21.15 /*7*/,
38 +15.15 /*8*/, +9.15 /*9*/, +3.15 /*10*/, -9.15 /*11*/, -15.15 /*12*/, -21.15 /*13*/},
39 {+27.15 /*0*/, +21.15 /*1*/, +15.15 /*2*/, +9.15 /*3*/, +3.15 /*4*/, -9.15 /*5*/, -15.15 /*6*/, -21.15 /*7*/,
40 -27.15 /*8*/, +27.15 /*9*/, +21.15 /*10*/, +15.15 /*11*/, +9.15 /*12*/, +3.15 /*13*/, -9.15 /*14*/, -15.15 /*15*/,
41 -21.15 /*16*/, -27.15 /*17*/},
42 {+33.15 /*0*/, +27.15 /*1*/, +21.15 /*2*/, +15.15 /*3*/, +9.15 /*4*/, +3.15 /*5*/,
43 -9.15 /*6*/, -15.15 /*7*/, -21.15 /*8*/, -27.15 /*9*/, -33.15 /*10*/, +33.15 /*11*/,
44 +27.15 /*12*/, +21.15 /*13*/, +15.15 /*14*/, +9.15 /*15*/, +3.15 /*16*/, -9.15 /*17*/,
45 -15.15 /*18*/, -21.15 /*19*/, -27.15 /*20*/, -33.15 /*21*/}};
47 {-0.15 /*0*/, +2.85 /*1*/, -0.15 /*2*/, +0.15 /*3*/, -2.85 /*4*/, +0.15 /*5*/},
48 {-0.15 /*0*/, -0.15 /*1*/, +2.85 /*2*/, -0.15 /*3*/, -0.15 /*4*/, +0.15 /*5*/, +0.15 /*6*/, -2.85 /*7*/,
49 +0.15 /*8*/, +0.15 /*9*/},
50 {-0.15 /*0*/, -0.15 /*1*/, -0.15 /*2*/, +2.85 /*3*/, -0.15 /*4*/, -0.15 /*5*/, -0.15 /*6*/, +0.15 /*7*/,
51 +0.15 /*8*/, +0.15 /*9*/, -2.85 /*10*/, +0.15 /*11*/, +0.15 /*12*/, +0.15 /*13*/},
52 {-0.15 /*0*/, -0.15 /*1*/, -0.15 /*2*/, -0.15 /*3*/, +2.85 /*4*/, -0.15 /*5*/, -0.15 /*6*/, -0.15 /*7*/,
53 -0.15 /*8*/, +0.15 /*9*/, +0.15 /*10*/, +0.15 /*11*/, +0.15 /*12*/, -2.85 /*13*/, +0.15 /*14*/, +0.15 /*15*/,
54 +0.15 /*16*/, +0.15 /*17*/},
55 {-0.15 /*0*/, -0.15 /*1*/, -0.15 /*2*/, -0.15 /*3*/, -0.15 /*4*/, +2.85 /*5*/, -0.15 /*6*/, -0.15 /*7*/,
56 -0.15 /*8*/, -0.15 /*9*/, -0.15 /*10*/, +0.15 /*11*/, +0.15 /*12*/, +0.15 /*13*/, +0.15 /*14*/, +0.15 /*15*/,
57 -2.85 /*16*/, +0.15 /*17*/, +0.15 /*18*/, +0.15 /*19*/, +0.15 /*20*/, +0.15 /*21*/}};
59 {+0.14 + 4.31 /*0*/, +1.36 + 4.31 /*1*/, +0.0 + 4.31 /*2*/, +1.22 /*3*/, 0.0 /*4*/, +1.36 /*5*/},
60 {+1.36 + 4.31 /*0*/, +0.14 + 4.31 /*1*/, +1.36 + 4.31 /*2*/, +0.0 + 4.31 /*3*/, +1.22 + 4.31 /*4*/, +0.0 /*5*/,
61 +1.22 /*6*/, 0.0 /*7*/, +1.36 /*8*/, +0.14 /*9*/},
62 {+0.14 + 4.31 /*0*/, +1.36 + 4.31 /*1*/, +0.14 + 4.31 /*2*/, +1.36 + 4.31 /*3*/, +0.0 + 4.31 /*4*/,
63 +1.22 + 4.31 /*5*/, +0.0 + 4.31 /*6*/, +1.22 /*7*/, +0.0 /*8*/, +1.22 /*9*/, +0.0 /*10*/, +1.36 /*11*/,
64 +0.14 /*12*/, +1.36 /*13*/},
65 {+1.36 + 4.31 /*0*/, +0.14 + 4.31 /*1*/, +1.36 + 4.31 /*2*/, +0.14 + 4.31 /*3*/, +1.36 + 4.31 /*4*/,
66 +0.0 + 4.31 /*5*/, +1.22 + 4.31 /*6*/, +0.0 + 4.31 /*7*/, +1.22 + 4.31 /*8*/, +0.0 /*9*/, +1.22 /*10*/,
67 +0.0 /*11*/, +1.22 /*12*/, +0.0 /*13*/, +1.36 /*14*/, +0.14 /*15*/, +1.36 /*16*/, +0.14 /*17*/},
68 {+0.14 + 4.31 /*0*/, +1.36 + 4.31 /*1*/,
69 +0.14 + 4.31 /*2*/, +1.36 + 4.31 /*3*/,
70 +0.14 + 4.31 /*4*/, +1.36 + 4.31 /*5*/,
71 +0.0 + 4.31 /*6*/, +1.22 + 4.31 /*7*/,
72 +0.0 + 4.31 /*8*/, +1.22 + 4.31 /*9*/,
73 +0.0 + 4.31 /*10*/, +1.22 /*11*/,
74 +0.0 /*12*/, +1.22 /*13*/,
75 +0.0 /*14*/, +1.22 /*15*/,
76 +0.0 /*16*/, +1.36 /*17*/,
77 +0.14 /*18*/, +1.36 /*19*/,
78 +0.14 /*20*/, +1.36 /*21*/}};
79
80// Geometry parameters of modules
88
106
107// rotations of modules around y-axis by 180 deg.
109 {true /*0*/, true /*1*/, false /*2*/, true /*3*/, true /*4*/, false /*5*/},
110 {true /*0*/, true /*1*/, true /*2*/, false /*3*/, false /*4*/, true /*5*/, true /*6*/, true /*7*/, false /*8*/,
111 false /*9*/},
112 {true /*0*/, true /*1*/, true /*2*/, true /*3*/, false /*4*/, false /*5*/, false /*6*/, true /*7*/, true /*8*/,
113 true /*9*/, true /*10*/, false /*11*/, false /*12*/, false /*13*/},
114 {true /*0*/, true /*1*/, true /*2*/, true /*3*/, true /*4*/, false /*5*/, false /*6*/, false /*7*/, false /*8*/,
115 true /*9*/, true /*10*/, true /*11*/, true /*12*/, true /*13*/, false /*14*/, false /*15*/, false /*16*/,
116 false /*17*/},
117 {true /*0*/, true /*1*/, true /*2*/, true /*3*/, true /*4*/, true /*5*/, false /*6*/, false /*7*/,
118 false /*8*/, false /*9*/, false /*10*/, true /*11*/, true /*12*/, true /*13*/, true /*14*/, true /*15*/,
119 true /*16*/, false /*17*/, false /*18*/, false /*19*/, false /*20*/, false /*21*/}
120
121};
122
123// rotations of modules around x-axis by 180 deg.
125 {false /*0*/, false /*1*/, false /*2*/, true /*3*/, true /*4*/, true /*5*/},
126 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, false /*4*/, true /*5*/, true /*6*/, true /*7*/, true /*8*/,
127 true /*9*/},
128 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, false /*4*/, false /*5*/, false /*6*/, true /*7*/, true /*8*/,
129 true /*9*/, true /*10*/, true /*11*/, true /*12*/, true /*13*/},
130 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, false /*4*/, false /*5*/, false /*6*/, false /*7*/,
131 false /*8*/, true /*9*/, true /*10*/, true /*11*/, true /*12*/, true /*13*/, true /*14*/, true /*15*/, true /*16*/,
132 true /*17*/},
133 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, false /*4*/, false /*5*/, false /*6*/, false /*7*/,
134 false /*8*/, false /*9*/, false /*10*/, true /*11*/, true /*12*/, true /*13*/, true /*14*/, true /*15*/,
135 true /*16*/, true /*17*/, true /*18*/, true /*19*/, true /*20*/, true /*21*/}};
136//------------------------------------------------------------------------------
137
138// GeoManager
140
141// Module parameters ------------------------------------------------------------
143{
146}; // STANDARD_MODULE is (63x126)mm, LONG_MODULE is (63x186)mm
147const unsigned int NModuleSizes = 2;
148
149Double_t YGapBetweenPartsOfModule[NModuleSizes] = {0.0035 /*STANDARD_MODULE*/, 0.0035 /*LONG_MODULE*/}; // Mrs. Slit
150
151Double_t XModuleSize[NModuleSizes] = {6.3 /*STANDARD_MODULE*/, 6.3 /*LONG_MODULE*/};
152
153Double_t YModuleSizeUpperPart[NModuleSizes] = {6.3 /*STANDARD_MODULE*/, 9.3 /*LONG_MODULE*/};
154Double_t YModuleSizeLowerPart[NModuleSizes] = {6.3 /*STANDARD_MODULE*/, 9.3 /*LONG_MODULE*/};
155
162
163Double_t ZModuleSize[NModuleSizes] = {0.03 /*STANDARD_MODULE*/, 0.03 /*LONG_MODULE*/};
164
165Double_t XBevelSize[NModuleSizes] = {3.82 /*STANDARD_MODULE*/, 3.82 /*LONG_MODULE*/}; // x-bevel for a angled cut
166Double_t YBevelSize[NModuleSizes] = {3.82 /*STANDARD_MODULE*/, 3.82 /*LONG_MODULE*/}; // y-bevel for a angled cut
167
172
177
178Double_t XLeftBorder[NModuleSizes] = {0.1145 /*STANDARD_MODULE*/, 0.1118 /*LONG_MODULE*/};
179Double_t XRightBorder[NModuleSizes] = {0.1118 /*STANDARD_MODULE*/, 0.1118 /*LONG_MODULE*/};
180Double_t YTopBorder[NModuleSizes] = {0.1143 /*STANDARD_MODULE*/, 0.1148 /*LONG_MODULE*/};
181Double_t YMiddleBorderUpperPart[NModuleSizes] = {0.1121 /*STANDARD_MODULE*/, 0.1148 /*LONG_MODULE*/};
182Double_t YMiddleBorderLowerPart[NModuleSizes] = {0.1147 /*STANDARD_MODULE*/, 0.1148 /*LONG_MODULE*/};
183Double_t YBottomBorder[NModuleSizes] = {0.1148 /*STANDARD_MODULE*/, 0.1148 /*LONG_MODULE*/};
184Double_t XYBevelBorder[NModuleSizes] = {0.1146 /*STANDARD_MODULE*/, 0.1146 /*LONG_MODULE*/};
185
186// Sensor zones ------------------------------------
191
197
204
206 ZModuleSize[STANDARD_MODULE], /*STANDARD_MODULE*/
207 ZModuleSize[LONG_MODULE] /*LONG_MODULE*/
208};
209//-------------------------------------------------
210
211// Module frames -----------------------------------
213 XModuleSize[STANDARD_MODULE], /*STANDARD_MODULE*/
214 XModuleSize[LONG_MODULE] /*LONG_MODULE*/
215};
216
218 YModuleSize[STANDARD_MODULE], /*STANDARD_MODULE*/
219 YModuleSize[LONG_MODULE] /*LONG_MODULE*/
220};
221
222Double_t ZModuleFrameSize[NModuleSizes] = {0.18 /*STANDARD_MODULE*/, 0.18 /*LONG_MODULE*/};
223//-------------------------------------------------
224
225// Y-shift from center of the gap to the global x-axis (for y-alignment of the module)
230
231// X-shift from center of the module to the origin of the local x-axis
233 +XModuleSize[STANDARD_MODULE] * 0.5, /*STANDARD_MODULE*/
234 +XModuleSize[LONG_MODULE] * 0.5 /*LONG_MODULE*/
235};
236
237// Y-shift from center of the module to the origin of the local y-axis
242//------------------------------------------------------------------------------
243/*
244 ASCII module picture (view from target)
245
246 |<---- XModuleSize ---------->| ^
247 | | | Y-axis
248 ------------------------------ ---------
249 | | top border | | ^
250 ------------------------------ |
251 | | | | |
252 | l | rectangle | r | |
253 | e | sensor | i | |
254 | f | zone | g | |
255 | t | | h | |
256 | | | t | |
257 | | | | |
258 ------------------------------ |
259 | | middle (upper part) | |
260 ------ gap between parts ----- YModuleSize
261 | | middle (lower part) | |
262 ------------------------------ |
263 | | | | |
264 | b | bevel (or rect.) | r | |
265 | e | sensor | i | |
266 \ v \ zone | g | |
267 \ e \ | h | |
268 \ l \ | t | |
269 \ \ | | |
270 ------------------------- |
271 \ \ bottom | | v
272 ---------------------- ---------
273
274 * x-axis <----------------------------------(x0,y0) local point
275 */
276
277// media
283
284class FairGeoMedia;
285class FairGeoBuilder;
286
287// function declarations
288TGeoVolume* CreateStation(TString station_name);
289TGeoVolume* CreateModule(TString module_name, ModuleType module_type, ModuleSize module_size);
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
341{
342 cout << "\n";
343 cout << "Module parameters information [STANDARD_MODULE]: ------------------" << "\n";
344 cout << " XModuleSize = " << XModuleSize[STANDARD_MODULE] << " cm" << "\n";
345 cout << " YModuleSize = " << YModuleSize[STANDARD_MODULE] << " cm" << " ( "
347 << YModuleSizeLowerPart[STANDARD_MODULE] << " )" << "\n";
348 cout << " YModuleSizeUpperPart = " << YModuleSizeUpperPart[STANDARD_MODULE] << " cm" << "\n";
349 cout << " YModuleSizeLowerPart = " << YModuleSizeLowerPart[STANDARD_MODULE] << " cm" << "\n";
350 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule[STANDARD_MODULE] << " cm" << "\n";
351 cout << " ZModuleSize = " << ZModuleSize[STANDARD_MODULE] << " cm" << "\n";
352 cout << "\n";
353 cout << " XBevelSize = " << XBevelSize[STANDARD_MODULE] << " cm" << "\n";
354 cout << " YBevelSize = " << YBevelSize[STANDARD_MODULE] << " cm" << "\n";
355 cout << " BevelAngleDeg = " << BevelAngleDeg[STANDARD_MODULE] << " deg" << "\n";
356 cout << "\n";
357 cout << " XLeftBorder = " << XLeftBorder[STANDARD_MODULE] << " cm" << "\n";
358 cout << " XRightBorder = " << XRightBorder[STANDARD_MODULE] << " cm" << "\n";
359 cout << " YTopBorder = " << YTopBorder[STANDARD_MODULE] << " cm" << "\n";
360 cout << " YMiddleBorderUpperPart = " << YMiddleBorderUpperPart[STANDARD_MODULE] << " cm" << "\n";
361 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule[STANDARD_MODULE] << " cm"
362 << " (gap between two parts)\n";
363 cout << " YMiddleBorderLowerPart = " << YMiddleBorderLowerPart[STANDARD_MODULE] << " cm" << "\n";
364 cout << " YBottomBorder = " << YBottomBorder[STANDARD_MODULE] << " cm" << "\n";
365 cout << " XYBevelBorder = " << XYBevelBorder[STANDARD_MODULE] << " cm" << "\n";
366 cout << "\n";
367 cout << " XSensorZoneSize = " << XSensorZoneSize[STANDARD_MODULE] << " cm" << "\n";
368 cout << " YSensorZoneSizeUpperPart = " << YSensorZoneSizeUpperPart[STANDARD_MODULE] << " cm" << "\n";
369 cout << " YSensorZoneSizeLowerPart = " << YSensorZoneSizeLowerPart[STANDARD_MODULE] << " cm" << "\n";
370 cout << " ZSensorZoneSize = " << ZSensorZoneSize[STANDARD_MODULE] << " cm" << "\n";
371
372 cout << "-------------------------------------------------------------\n";
373
374 cout << "\n";
375 cout << "Module parameters information [LONG_MODULE]: ------------------" << "\n";
376 cout << " XModuleSize = " << XModuleSize[LONG_MODULE] << " cm" << "\n";
377 cout << " YModuleSize = " << YModuleSize[LONG_MODULE] << " cm" << " ( " << YModuleSizeUpperPart[LONG_MODULE]
379 << "\n";
380 cout << " YModuleSizeUpperPart = " << YModuleSizeUpperPart[LONG_MODULE] << " cm" << "\n";
381 cout << " YModuleSizeLowerPart = " << YModuleSizeLowerPart[LONG_MODULE] << " cm" << "\n";
382 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule[LONG_MODULE] << " cm" << "\n";
383 cout << " ZModuleSize = " << ZModuleSize[LONG_MODULE] << " cm" << "\n";
384 cout << "\n";
385 cout << " XBevelSize = " << XBevelSize[LONG_MODULE] << " cm" << "\n";
386 cout << " YBevelSize = " << YBevelSize[LONG_MODULE] << " cm" << "\n";
387 cout << " BevelAngleDeg = " << BevelAngleDeg[LONG_MODULE] << " deg" << "\n";
388 cout << "\n";
389 cout << " XLeftBorder = " << XLeftBorder[LONG_MODULE] << " cm" << "\n";
390 cout << " XRightBorder = " << XRightBorder[LONG_MODULE] << " cm" << "\n";
391 cout << " YTopBorder = " << YTopBorder[LONG_MODULE] << " cm" << "\n";
392 cout << " YMiddleBorderUpperPart = " << YMiddleBorderUpperPart[LONG_MODULE] << " cm" << "\n";
393 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule[LONG_MODULE] << " cm"
394 << " (gap between two parts)\n";
395 cout << " YMiddleBorderLowerPart = " << YMiddleBorderLowerPart[LONG_MODULE] << " cm" << "\n";
396 cout << " YBottomBorder = " << YBottomBorder[LONG_MODULE] << " cm" << "\n";
397 cout << " XYBevelBorder = " << XYBevelBorder[LONG_MODULE] << " cm" << "\n";
398 cout << "\n";
399 cout << " XSensorZoneSize = " << XSensorZoneSize[LONG_MODULE] << " cm" << "\n";
400 cout << " YSensorZoneSizeUpperPart = " << YSensorZoneSizeUpperPart[LONG_MODULE] << " cm" << "\n";
401 cout << " YSensorZoneSizeLowerPart = " << YSensorZoneSizeLowerPart[LONG_MODULE] << " cm" << "\n";
402 cout << " ZSensorZoneSize = " << ZSensorZoneSize[LONG_MODULE] << " cm" << "\n";
403
404 cout << "-------------------------------------------------------------\n";
405}
406
408{
409 cout << "\n";
410 for (Int_t istation = 0; istation < NStations; ++istation) {
411 cout << "station " << istation << ":\n";
412 cout << " XStationPositions[" << istation << "] = " << XStationPositions[istation] << " cm\n";
413 cout << " YStationPositions[" << istation << "] = " << YStationPositions[istation] << " cm\n";
414 cout << " ZStationPositions[" << istation << "] = " << ZStationPositions[istation] << " cm\n";
415 cout << "\n";
416
417 for (Int_t imodule = 0; imodule < NModulesInStations[istation]; ++imodule) {
418 cout << " module " << imodule << ":\n";
419 cout << " XModuleShifts[" << istation << "][" << imodule << "] = " << XModuleShifts[istation][imodule]
420 << " cm\n";
421 cout << " YModuleShifts[" << istation << "][" << imodule << "] = " << YModuleShifts[istation][imodule]
422 << " cm\n";
423 cout << " ZModuleShifts[" << istation << "][" << imodule << "] = " << ZModuleShifts[istation][imodule]
424 << " cm\n";
425 cout << "\n";
426
427 Double_t XGlobalModulePos = XModuleShifts[istation][imodule] + XStationPositions[istation];
428 Double_t YGlobalModulePos = YModuleShifts[istation][imodule] + YStationPositions[istation];
429 Double_t ZGlobalModulePos = ZModuleShifts[istation][imodule] + ZStationPositions[istation];
430
431 cout << " XGlobalModulePos = " << XGlobalModulePos << " cm\n";
432 cout << " YGlobalModulePos = " << YGlobalModulePos << " cm\n";
433 cout << " ZGlobalModulePos = " << ZGlobalModulePos << " cm\n";
434 cout << "\n";
435
436 cout << " ModulesTypes[" << istation << "][" << imodule << "] = ";
437 if (ModulesTypes[istation][imodule] == 0)
438 cout << "RIGHT_ANGLED_MODULE\n";
439 if (ModulesTypes[istation][imodule] == 1)
440 cout << "BEVEL_MODULE\n";
441 if (ModulesTypes[istation][imodule] == 2)
442 cout << "RIGHT_ANGLED_MODULE_HALF\n";
443 if (ModulesTypes[istation][imodule] == 3)
444 cout << "BEVEL_MODULE_HALF\n";
445 cout << " ModulesYRotations[" << istation << "][" << imodule << "] = ";
446 if (ModulesYRotations[istation][imodule] == false)
447 cout << "not rotated around Y\n";
448 if (ModulesYRotations[istation][imodule] == true)
449 cout << "rotated around Y\n";
450 cout << " ModulesXRotations[" << istation << "][" << imodule << "] = ";
451 if (ModulesXRotations[istation][imodule] == false)
452 cout << "not rotated around X\n";
453 if (ModulesXRotations[istation][imodule] == true)
454 cout << "rotated around X\n";
455 cout << "\n";
456 }
457 cout << "-------------------------------------------------------------\n";
458 }
459 cout << "-------------------------------------------------------------\n";
460}
461
463{
464
465 // ---- set working directory --------------------------------------------
466 TString gPath = gSystem->Getenv("VMCWORKDIR");
467
468 // ------- Geometry file name (output) ----------------------------------
469 const TString geoDetectorName = "Silicon";
470 const TString geoDetectorVersion = "Run8_5stations";
471 const TString geoFileName = gPath + "/geometry/" + geoDetectorName + "_" + geoDetectorVersion + ".root";
472
473 // ---- global geometry parameters ---------------------------------------
474 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
475 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
476
477 // ------- Load media from media file ----------------------------------
478 TString medFile = gPath + "/geometry/media.geo";
479 geoFace->setMediaFile(medFile);
480 geoFace->readMedia();
481 FairGeoMedia* geoMedia = geoFace->getMedia();
482 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
483
484 DefineRequiredMedia(geoMedia, geoBuild);
485 // -------------------------------------------------------------------------
486
487 // Print information about parameters of SILICON
490
491 // -------------- Create geometry and top volume -------------------------
492 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
493 gGeoMan->SetName(geoDetectorName + "_geom");
494 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
495 top->SetMedium(pMedAir);
496 gGeoMan->SetTopVolume(top);
497 // gGeoMan->SetTopVisible(1);
498 // --------------------------------------------------------------------------
499
500 // Define TOP Geometry
501 TGeoVolume* SILICON = new TGeoVolumeAssembly(geoDetectorName);
502 SILICON->SetMedium(pMedAir);
503
504 // Let's create SILICON stations filled with modules
505 for (Int_t istation = 0; istation < NStations; ++istation) {
506
507 // module size in a station
508 ModuleSize module_size = STANDARD_MODULE;
509
510 //(!!!) the last (fourth) station has long modules (!!!)
511 if (istation == 4)
512 module_size = LONG_MODULE;
513
514 TGeoVolume* station = CreateStation(TString("station") + TString::Itoa(istation, 10));
515
516 Int_t NModules = NModulesInStations[istation];
517
518 TGeoVolume* modules[NModules];
519 TGeoCombiTrans* modTransforms[NModules];
520
521 for (Int_t imodule = 0; imodule < NModules; ++imodule) {
522
523 TString module_name = TString("module") + TString::Itoa(imodule, 10) + TString("_") + station->GetName();
524 modules[imodule] = CreateModule(module_name, ModulesTypes[istation][imodule], module_size);
525
526 modTransforms[imodule] = new TGeoCombiTrans();
527
528 if (ModulesYRotations[istation][imodule]) {
529 modTransforms[imodule]->RotateY(180.0);
530 modTransforms[imodule]->SetDx(XModuleShifts[istation][imodule]
531 - XShiftFromCenterToLocalX0[module_size]);
532 } else {
533 modTransforms[imodule]->SetDx(XModuleShifts[istation][imodule]
534 + XShiftFromCenterToLocalX0[module_size]);
535 }
536
537 if (ModulesXRotations[istation][imodule]) {
538 modTransforms[imodule]->RotateX(180.0);
539 if (ModulesTypes[istation][imodule] == ModuleType::BEVEL_MODULE_HALF
540 || ModulesTypes[istation][imodule] == ModuleType::RIGHT_ANGLED_MODULE_HALF)
541 {
542 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule]
543 - YModuleSizeUpperPart[module_size] * 0.5);
544 } else {
545 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule] + YShiftFromCenterToAxis[module_size]
546 - YShiftFromCenterToLocalY0[module_size]);
547 }
548 } else {
549 if (ModulesTypes[istation][imodule] == ModuleType::BEVEL_MODULE_HALF
550 || ModulesTypes[istation][imodule] == ModuleType::RIGHT_ANGLED_MODULE_HALF)
551 {
552 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule]
553 + YModuleSizeUpperPart[module_size] * 0.5);
554 } else {
555 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule] + YShiftFromCenterToAxis[module_size]
556 + YShiftFromCenterToLocalY0[module_size]);
557 }
558 }
559
560 Double_t z_module_shift =
561 +ZModuleSize[module_size] * 0.5; // To z-module position is at the beginning of the sensitive volume
562 modTransforms[imodule]->SetDz(ZModuleShifts[istation][imodule] + z_module_shift);
563
564 // if(imodule == 1) station->AddNode(modules[imodule], 0, modTransforms[imodule]);
565 station->AddNode(modules[imodule], 0, modTransforms[imodule]);
566 }
567
568 TGeoCombiTrans* station_transform = new TGeoCombiTrans();
569 station_transform->SetTranslation(XStationPositions[istation], YStationPositions[istation],
570 ZStationPositions[istation]);
571
572 SILICON->AddNode(station, 0, station_transform);
573 }
574
575 top->AddNode(SILICON, 0);
577
578 // --------------- Finish -----------------------------------------------
579 gGeoMan->CloseGeometry();
580 gGeoMan->CheckOverlaps(0.0001);
581 gGeoMan->PrintOverlaps();
582 gGeoMan->Test();
583
584 TFile* geoFile = new TFile(geoFileName, "RECREATE");
585 top->Write();
586 geoFile->Close();
587 top->Draw("ogl");
588}
589//------------------------------------------------------------------------------
590
592{
593
594 TGeoVolume* stationA = new TGeoVolumeAssembly(station_name);
595 stationA->SetMedium(pMedAir);
596
597 return stationA;
598}
599
600TGeoVolume* CreateModule(TString module_name, ModuleType module_type, ModuleSize module_size)
601{
602
603 // Shapes -------------------------------------------------------------------
604 // module shape
605 TGeoShape* moduleS = 0;
606
607 switch (module_type) {
608 case RIGHT_ANGLED_MODULE: {
609 moduleS = new TGeoBBox("moduleS", XModuleSize[module_size] * 0.5, YModuleSize[module_size] * 0.5,
610 ZModuleSize[module_size] * 0.5);
611 break;
612 }
614 moduleS = new TGeoBBox("moduleS", XModuleSize[module_size] * 0.5, YModuleSizeUpperPart[module_size] * 0.5,
615 ZModuleSize[module_size] * 0.5);
616 break;
617 }
618 case BEVEL_MODULE: {
619 moduleS = new TGeoXtru(2);
620 moduleS->SetName("moduleS");
621 Double_t x_pos[5] = {
622 +XModuleSize[module_size] * 0.5, -XModuleSize[module_size] * 0.5, -XModuleSize[module_size] * 0.5,
623 +XModuleSize[module_size] * 0.5 - XBevelSize[module_size], +XModuleSize[module_size] * 0.5};
624 Double_t y_pos[5] = {+YModuleSize[module_size] * 0.5, +YModuleSize[module_size] * 0.5,
625 -YModuleSize[module_size] * 0.5, -YModuleSize[module_size] * 0.5,
626 -YModuleSize[module_size] * 0.5 + YBevelSize[module_size]};
627 ((TGeoXtru*)moduleS)->DefinePolygon(5, x_pos, y_pos);
628 ((TGeoXtru*)moduleS)->DefineSection(0, -ZModuleSize[module_size] * 0.5);
629 ((TGeoXtru*)moduleS)->DefineSection(1, +ZModuleSize[module_size] * 0.5);
630 break;
631 }
632 case BEVEL_MODULE_HALF: {
633 moduleS = new TGeoXtru(2);
634 moduleS->SetName("moduleS");
635 Double_t x_pos[5] = {
636 +XModuleSize[module_size] * 0.5, -XModuleSize[module_size] * 0.5, -XModuleSize[module_size] * 0.5,
637 +XModuleSize[module_size] * 0.5 - XBevelSize[module_size], +XModuleSize[module_size] * 0.5};
638 Double_t y_pos[5] = {+YModuleSizeUpperPart[module_size] * 0.5, +YModuleSizeUpperPart[module_size] * 0.5,
639 -YModuleSizeUpperPart[module_size] * 0.5, -YModuleSizeUpperPart[module_size] * 0.5,
640 -YModuleSizeUpperPart[module_size] * 0.5 + YBevelSize[module_size]};
641 ((TGeoXtru*)moduleS)->DefinePolygon(5, x_pos, y_pos);
642 ((TGeoXtru*)moduleS)->DefineSection(0, -ZModuleSize[module_size] * 0.5);
643 ((TGeoXtru*)moduleS)->DefineSection(1, +ZModuleSize[module_size] * 0.5);
644 break;
645 }
646 default:
647 Error("CreateModule()", "Incorrect module type selected!!!");
648 }
649
650 // sensor zone shape (upper part of the module: rectangle zone)
651 TGeoShape* sensor_zone_upper_part_rectS =
652 new TGeoBBox("sensor_zone_upper_part_rectS", XSensorZoneSize[module_size] * 0.5,
653 YSensorZoneSizeUpperPart[module_size] * 0.5, ZSensorZoneSize[module_size] * 0.5);
654
655 // sensor zone shape (upper part of the module: bevel zone)
656 TGeoShape* sensor_zone_upper_part_bevelS = new TGeoXtru(2);
657 sensor_zone_upper_part_bevelS->SetName("sensor_zone_upper_part_bevelS");
658 // Calculate coordinates of the bottom and the top points of the inner bevel
659 {
660 // find x and y projections of the bevel border thickness
661 Double_t x_delta = XYBevelBorder[module_size] / TMath::Cos(BevelAngleRad[module_size]);
662 Double_t y_delta = XYBevelBorder[module_size] / TMath::Sin(BevelAngleRad[module_size]);
663
664 // find shifts of the sensitive zone from module borders via the equation of the straight line for the inner
665 // bevel
666 Double_t x_delta_top_BP = XLeftBorder[module_size];
667 Double_t y_delta_top_BP = TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]) * x_delta_top_BP
668 + (YBevelSize[module_size] + y_delta);
669
670 Double_t y_delta_bottom_BP = YMiddleBorderUpperPart[module_size];
671 Double_t x_delta_bottom_BP = (y_delta_bottom_BP - (YBevelSize[module_size] + y_delta))
672 / (TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]));
673 //----------------------------------------------------------------------
674
675 Double_t x_pos_sensor_zone_bevel[5] = {+XModuleSize[module_size] * 0.5 - XLeftBorder[module_size],
676 -XModuleSize[module_size] * 0.5 + XRightBorder[module_size],
677 -XModuleSize[module_size] * 0.5 + XRightBorder[module_size],
678 +XModuleSize[module_size] * 0.5 - x_delta_bottom_BP,
679 +XModuleSize[module_size] * 0.5 - XLeftBorder[module_size]};
680 Double_t y_pos_sensor_zone_bevel[5] = {
681 +YModuleSizeUpperPart[module_size] * 0.5 - YTopBorder[module_size],
682 +YModuleSizeUpperPart[module_size] * 0.5 - YTopBorder[module_size],
683 -YModuleSizeUpperPart[module_size] * 0.5 + YMiddleBorderUpperPart[module_size],
684 -YModuleSizeUpperPart[module_size] * 0.5 + YMiddleBorderUpperPart[module_size],
685 -YModuleSizeUpperPart[module_size] * 0.5 + y_delta_top_BP};
686
687 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefinePolygon(5, x_pos_sensor_zone_bevel, y_pos_sensor_zone_bevel);
688 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefineSection(0, -ZModuleSize[module_size] * 0.5);
689 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefineSection(1, +ZModuleSize[module_size] * 0.5);
690 }
691
692 // sensor zone shape (lower part of the module: rectangle zone)
693 TGeoShape* sensor_zone_lower_part_rectS =
694 new TGeoBBox("sensor_zone_lower_part_rectS", XSensorZoneSize[module_size] * 0.5,
695 YSensorZoneSizeLowerPart[module_size] * 0.5, ZSensorZoneSize[module_size] * 0.5);
696
697 // sensor zone shape (lower part of the module: bevel zone)
698 TGeoShape* sensor_zone_lower_part_bevelS = new TGeoXtru(2);
699 sensor_zone_lower_part_bevelS->SetName("sensor_zone_lower_part_bevelS");
700 // Calculate coordinates of the bottom and the top points of the inner bevel
701 {
702 // find x and y projections of the bevel border thickness
703 Double_t x_delta = XYBevelBorder[module_size] / TMath::Cos(BevelAngleRad[module_size]);
704 Double_t y_delta = XYBevelBorder[module_size] / TMath::Sin(BevelAngleRad[module_size]);
705
706 // find shifts of the sensitive zone from module borders via the equation of the straight line for the inner
707 // bevel
708 Double_t x_delta_top_BP = XLeftBorder[module_size];
709 Double_t y_delta_top_BP = TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]) * x_delta_top_BP
710 + (YBevelSize[module_size] + y_delta);
711
712 Double_t y_delta_bottom_BP = YBottomBorder[module_size];
713 Double_t x_delta_bottom_BP = (y_delta_bottom_BP - (YBevelSize[module_size] + y_delta))
714 / (TMath::Tan(TMath::PiOver2() + BevelAngleRad[module_size]));
715 //----------------------------------------------------------------------
716
717 Double_t x_pos_sensor_zone_bevel[5] = {+XModuleSize[module_size] * 0.5 - XLeftBorder[module_size],
718 -XModuleSize[module_size] * 0.5 + XRightBorder[module_size],
719 -XModuleSize[module_size] * 0.5 + XRightBorder[module_size],
720 +XModuleSize[module_size] * 0.5 - x_delta_bottom_BP,
721 +XModuleSize[module_size] * 0.5 - XLeftBorder[module_size]};
722 Double_t y_pos_sensor_zone_bevel[5] = {
723 +YModuleSizeLowerPart[module_size] * 0.5 - YMiddleBorderLowerPart[module_size],
724 +YModuleSizeLowerPart[module_size] * 0.5 - YMiddleBorderLowerPart[module_size],
725 -YModuleSizeLowerPart[module_size] * 0.5 + YBottomBorder[module_size],
726 -YModuleSizeLowerPart[module_size] * 0.5 + YBottomBorder[module_size],
727 -YModuleSizeLowerPart[module_size] * 0.5 + y_delta_top_BP};
728
729 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefinePolygon(5, x_pos_sensor_zone_bevel, y_pos_sensor_zone_bevel);
730 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefineSection(0, -ZModuleSize[module_size] * 0.5);
731 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefineSection(1, +ZModuleSize[module_size] * 0.5);
732 }
733
734 //--------------------------------------------------------------------------
735
736 // Volumes ------------------------------------------------------------------
737 // module volume
738 // TString module_name = "moduleV_";
739
740 TGeoVolume* moduleV = new TGeoVolume(module_name, moduleS);
741
742 // sensor zone volume (upper part of the module)
743 TGeoVolume* sensor_zone_upper_part_rectV =
744 new TGeoVolume("Sensor_zone_upper_part_rectV", sensor_zone_upper_part_rectS);
745
746 // sensor zone volume (lower part of the module)
747 TGeoVolume* sensor_zone_upper_part_bevelV =
748 new TGeoVolume("Sensor_zone_upper_part_bevelV", sensor_zone_upper_part_bevelS);
749
750 // sensor zone volume (lower part of the module: rectangle zone)
751 TGeoVolume* sensor_zone_lower_part_rectV =
752 new TGeoVolume("Sensor_zone_lower_part_rectV", sensor_zone_lower_part_rectS);
753
754 // sensor zone volume (lower part of the module: bevel zone)
755 TGeoVolume* sensor_zone_lower_part_bevelV =
756 new TGeoVolume("Sensor_zone_lower_part_bevelV", sensor_zone_lower_part_bevelS);
757
758 // volumes media
759 TGeoMedium* silicon_medium = pMedSilicon;
760 if (silicon_medium) {
761 moduleV->SetMedium(silicon_medium);
762 sensor_zone_upper_part_rectV->SetMedium(silicon_medium);
763 sensor_zone_upper_part_bevelV->SetMedium(silicon_medium);
764 sensor_zone_lower_part_rectV->SetMedium(silicon_medium);
765 sensor_zone_lower_part_bevelV->SetMedium(silicon_medium);
766 } else
767 Fatal("Main", "Invalid medium for modules and sensor zones!");
768
769 // volumes visual property (transparency)
770 moduleV->SetLineColor(TColor::GetColor("#ff47ca"));
771 sensor_zone_upper_part_rectV->SetLineColor(TColor::GetColor("#e0b0ff"));
772 sensor_zone_upper_part_bevelV->SetLineColor(TColor::GetColor("#e0b0ff"));
773 sensor_zone_lower_part_rectV->SetLineColor(TColor::GetColor("#e0b0ff"));
774 sensor_zone_lower_part_bevelV->SetLineColor(TColor::GetColor("#e0b0ff"));
775 moduleV->SetTransparency(50);
776
777 switch (module_type) {
778
779 case RIGHT_ANGLED_MODULE: {
780
781 // position of the sensor zone in the upper part of the module
782 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
783 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder[module_size] + XRightBorder[module_size]) * 0.5
784 - XLeftBorder[module_size]);
785 sensor_zone_upper_part_pos->SetDy(
786 +YSensorZoneSizeUpperPart[module_size] * 0.5 + YGapBetweenPartsOfModule[module_size] * 0.5
787 + YMiddleBorderUpperPart[module_size] - YShiftFromCenterToAxis[module_size]);
788 sensor_zone_upper_part_pos->SetDz(0.0);
789
790 // position of the sensor zone in the lower part of the module
791 TGeoTranslation* sensor_zone_lower_part_pos = new TGeoTranslation();
792 sensor_zone_lower_part_pos->SetDx(+(XLeftBorder[module_size] + XRightBorder[module_size]) * 0.5
793 - XLeftBorder[module_size]);
794 sensor_zone_lower_part_pos->SetDy(
795 -YSensorZoneSizeLowerPart[module_size] * 0.5 - YGapBetweenPartsOfModule[module_size] * 0.5
796 - YMiddleBorderLowerPart[module_size] - YShiftFromCenterToAxis[module_size]);
797 sensor_zone_lower_part_pos->SetDz(0.0);
798
799 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
800 moduleV->AddNode(sensor_zone_lower_part_rectV, 0, sensor_zone_lower_part_pos);
801 break;
802 }
803
805 // position of the sensor zone in the upper part of the module
806 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
807 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder[module_size] + XRightBorder[module_size]) * 0.5
808 - XLeftBorder[module_size]);
809 sensor_zone_upper_part_pos->SetDy(+(YTopBorder[module_size] + YMiddleBorderUpperPart[module_size]) * 0.5
810 - YTopBorder[module_size]);
811 sensor_zone_upper_part_pos->SetDz(0.0);
812
813 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
814 break;
815 }
816
817 case BEVEL_MODULE: {
818
819 // position of the sensor zone in the upper part of the module
820 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
821 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder[module_size] + XRightBorder[module_size]) * 0.5
822 - XLeftBorder[module_size]);
823 sensor_zone_upper_part_pos->SetDy(
824 +YSensorZoneSizeUpperPart[module_size] * 0.5 + YGapBetweenPartsOfModule[module_size] * 0.5
825 + YMiddleBorderUpperPart[module_size] - YShiftFromCenterToAxis[module_size]);
826 sensor_zone_upper_part_pos->SetDz(0.0);
827
828 // position of the sensor zone in the lower part of the module
829 TGeoTranslation* sensor_zone_lower_part_bevel_pos = new TGeoTranslation();
830 sensor_zone_lower_part_bevel_pos->SetDx(0.0);
831 sensor_zone_lower_part_bevel_pos->SetDy(-YModuleSizeLowerPart[module_size] * 0.5
832 - YGapBetweenPartsOfModule[module_size] * 0.5
833 - YShiftFromCenterToAxis[module_size]);
834 sensor_zone_lower_part_bevel_pos->SetDz(0.0);
835
836 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
837 moduleV->AddNode(sensor_zone_lower_part_bevelV, 0, sensor_zone_lower_part_bevel_pos);
838 break;
839 }
840
841 case BEVEL_MODULE_HALF: {
842
843 // position of the sensor zone in the upper part of the module
844 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
845 sensor_zone_upper_part_pos->SetDx(0);
846 sensor_zone_upper_part_pos->SetDy(0);
847 sensor_zone_upper_part_pos->SetDz(0.0);
848
849 moduleV->AddNode(sensor_zone_upper_part_bevelV, 0, sensor_zone_upper_part_pos);
850 break;
851 }
852
853 default:
854 Error("CreateModule()", "Incorrect module type selected!!!");
855 }
856
857 return moduleV;
858}
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]
TGeoVolume * CreateModule(TString module_name, ModuleType module_type, ModuleSize module_size)
TGeoVolume * CreateStation(TString station_name)
void create_rootgeom_Silicon_Run8_5stations()
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()