BmnRoot 26.10.0-19-g6979a6c6
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_Silicon_Run8_mods_10_14rot_18_detailed.C
Go to the documentation of this file.
1/*
2 * Baranov D.
3 * 15.06.2020
4 * Use this macro to create ROOT geometry for the RUN-8 config. of SILICON
5 * detector 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 = 3; // stations in the detector
15const Int_t NMaxModules = 18; // max. number of modules in a station
16
17const Int_t NModulesInStations[NStations] = {10, 14, 18};
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 };
24const Double_t ZStationPositions[NStations] = {+15.7, +15.7 + 8.64, +15.7 + 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*/}};
43 {-0.15 /*0*/, -0.15 /*1*/, +2.85 /*2*/, -0.15 /*3*/, -0.15 /*4*/, +0.15 /*5*/, +0.15 /*6*/, -2.85 /*7*/,
44 +0.15 /*8*/, +0.15 /*9*/},
45 {-0.15 /*0*/, -0.15 /*1*/, -0.15 /*2*/, +2.85 /*3*/, -0.15 /*4*/, -0.15 /*5*/, -0.15 /*6*/, +0.15 /*7*/,
46 +0.15 /*8*/, +0.15 /*9*/, -2.85 /*10*/, +0.15 /*11*/, +0.15 /*12*/, +0.15 /*13*/},
47 {-0.15 /*0*/, -0.15 /*1*/, -0.15 /*2*/, -0.15 /*3*/, +2.85 /*4*/, -0.15 /*5*/, -0.15 /*6*/, -0.15 /*7*/,
48 -0.15 /*8*/, +0.15 /*9*/, +0.15 /*10*/, +0.15 /*11*/, +0.15 /*12*/, -2.85 /*13*/, +0.15 /*14*/, +0.15 /*15*/,
49 +0.15 /*16*/, +0.15 /*17*/}};
51 {+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*/,
52 +1.22 /*6*/, 0.0 /*7*/, +1.36 /*8*/, +0.14 /*9*/},
53 {+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*/,
54 +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*/,
55 +0.14 /*12*/, +1.36 /*13*/},
56 {+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*/,
57 +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*/,
58 +0.0 /*11*/, +1.22 /*12*/, +0.0 /*13*/, +1.36 /*14*/, +0.14 /*15*/, +1.36 /*16*/, +0.14 /*17*/}};
59
60// Geometry parameters of modules
68
79
80// rotations of modules around y-axis by 180 deg.
82 {true /*0*/, true /*1*/, true /*2*/, false /*3*/, false /*4*/, true /*5*/, true /*6*/, true /*7*/, false /*8*/,
83 false /*9*/},
84 {true /*0*/, true /*1*/, true /*2*/, true /*3*/, false /*4*/, false /*5*/, false /*6*/, true /*7*/, true /*8*/,
85 true /*9*/, true /*10*/, false /*11*/, false /*12*/, false /*13*/},
86 {true /*0*/, true /*1*/, true /*2*/, true /*3*/, true /*4*/, false /*5*/, false /*6*/, false /*7*/, false /*8*/,
87 true /*9*/, true /*10*/, true /*11*/, true /*12*/, true /*13*/, false /*14*/, false /*15*/, false /*16*/,
88 false /*17*/}};
89
90// rotations of modules around x-axis by 180 deg.
92 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, false /*4*/, true /*5*/, true /*6*/, true /*7*/, true /*8*/,
93 true /*9*/},
94 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, false /*4*/, false /*5*/, false /*6*/, true /*7*/, true /*8*/,
95 true /*9*/, true /*10*/, true /*11*/, true /*12*/, true /*13*/},
96 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, false /*4*/, false /*5*/, false /*6*/, false /*7*/,
97 false /*8*/, true /*9*/, true /*10*/, true /*11*/, true /*12*/, true /*13*/, true /*14*/, true /*15*/, true /*16*/,
98 true /*17*/}};
99
100// GeoManager
102
103// Module -----------------------------------------------------------------------
104Double_t YGapBetweenPartsOfModule = 0.0035; // Mrs. Slit
105
109
112
113Double_t XBevelSize = 3.82; // x-bevel for a angled cut
114Double_t YBevelSize = XBevelSize; // y-bevel for a angled cut
115
118
126//------------------------------------------------------------------------------
127
128// Sensor zones -----------------------------------------------------------------
133//------------------------------------------------------------------------------
134
135// Module frames ----------------------------------------------------------------
136// Double_t XModuleFrameSize = XModuleSize;
137// Double_t YModuleFrameSize = YModuleSize;
139//------------------------------------------------------------------------------
140
141// Y-shift from center of the gap to the global x-axis (for y-alignment of the module)
143
144// X-shift from center of the module to the origin of the local x-axis
146
147// Y-shift from center of the module to the origin of the local y-axis
149
150/*
151 ASCII module picture (view from target)
152
153 |<---- XModuleSize ---------->| ^
154 | | | Y-axis
155 ------------------------------ ---------
156 | | top border | | ^
157 ------------------------------ |
158 | | | | |
159 | l | rectangle | r | |
160 | e | sensor | i | |
161 | f | zone | g | |
162 | t | | h | |
163 | | | t | |
164 | | | | |
165 ------------------------------ |
166 | | middle (upper part) | |
167 ------ gap between parts ----- YModuleSize
168 | | middle (lower part) | |
169 ------------------------------ |
170 | | | | |
171 | b | bevel (or rect.) | r | |
172 | e | sensor | i | |
173 \ v \ zone | g | |
174 \ e \ | h | |
175 \ l \ | t | |
176 \ \ | | |
177 ------------------------- |
178 \ \ bottom | | v
179 ---------------------- ---------
180
181 * x-axis <----------------------------------(x0,y0) local point
182
183 */
184
185// media
193
194class FairGeoMedia;
195class FairGeoBuilder;
196
197// function declarations
198TGeoVolume* CreateStation(TString station_name);
199TGeoVolume* CreateModule(TString module_name, ModuleType module_type);
200TGeoVolume* CreateModuleFrame(TString module_name, ModuleType module_type);
201
202void DefineRequiredMedia(FairGeoMedia* geoMedia, FairGeoBuilder* geoBuild)
203{
204
205 // air medium
206 FairGeoMedium* mAir = geoMedia->getMedium("air");
207 if (!mAir)
208 Fatal("Main", "FairMedium air not found");
209 geoBuild->createMedium(mAir);
210 pMedAir = gGeoManager->GetMedium("air");
211 if (!pMedAir)
212 Fatal("Main", "Medium air not found");
213
214 // carbon medium
215 FairGeoMedium* mCarbon = geoMedia->getMedium("carbon");
216 if (!mCarbon)
217 Fatal("Main", "FairMedium carbon not found");
218 geoBuild->createMedium(mCarbon);
219 pMedCarbon = gGeoManager->GetMedium("carbon");
220 if (!pMedCarbon)
221 Fatal("Main", "Medium carbon not found");
222
223 // fiberglass medium
224 FairGeoMedium* mFiberGlass = geoMedia->getMedium("fiberglass");
225 if (!mFiberGlass)
226 Fatal("Main", "FairMedium fiberglass not found");
227 geoBuild->createMedium(mFiberGlass);
228 pMedFiberGlass = gGeoManager->GetMedium("fiberglass");
229 if (!pMedFiberGlass)
230 Fatal("Main", "Medium fiberglass not found");
231
232 // copper medium
233 FairGeoMedium* mCopper = geoMedia->getMedium("copper");
234 if (!mCopper)
235 Fatal("Main", "FairMedium copper not found");
236 geoBuild->createMedium(mCopper);
237 pMedCopper = gGeoManager->GetMedium("copper");
238 if (!pMedCopper)
239 Fatal("Main", "Medium copper not found");
240
241 // silicon medium
242 FairGeoMedium* mSilicon = geoMedia->getMedium("silicon");
243 if (!mSilicon)
244 Fatal("Main", "FairMedium silicon not found");
245 geoBuild->createMedium(mSilicon);
246 pMedSilicon = gGeoManager->GetMedium("silicon");
247 if (!pMedSilicon)
248 Fatal("Main", "Medium silicon not found");
249
250 // aluminium medium
251 FairGeoMedium* mAluminium = geoMedia->getMedium("aluminium");
252 if (!mAluminium)
253 Fatal("Main", "FairMedium aluminium not found");
254 geoBuild->createMedium(mAluminium);
255 pMedAluminium = gGeoManager->GetMedium("aluminium");
256 if (!pMedAluminium)
257 Fatal("Main", "Medium aluminium not found");
258
259 // polystyrene medium
260 FairGeoMedium* mPolystyrene = geoMedia->getMedium("polystyrene");
261 if (!mPolystyrene)
262 Fatal("Main", "FairMedium polystyrene not found");
263 geoBuild->createMedium(mPolystyrene);
264 pMedPolystyrene = gGeoManager->GetMedium("polystyrene");
265 if (!pMedPolystyrene)
266 Fatal("Main", "Medium polystyrene not found");
267}
268
270{
271 cout << "\n";
272 cout << "Module parameters information: ---------------------------" << "\n";
273 cout << " XModuleSize = " << XModuleSize << " cm" << "\n";
274 cout << " YModuleSize = " << YModuleSize << " cm" << " ( " << YModuleSizeUpperPart << " + "
275 << YGapBetweenPartsOfModule << " + " << YModuleSizeLowerPart << " )" << "\n";
276 cout << " YModuleSizeUpperPart = " << YModuleSizeUpperPart << " cm" << "\n";
277 cout << " YModuleSizeLowerPart = " << YModuleSizeLowerPart << " cm" << "\n";
278 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule << " cm" << "\n";
279 cout << " ZModuleSize = " << ZModuleSize << " cm" << "\n";
280 cout << "\n";
281 cout << " XBevelSize = " << XBevelSize << " cm" << "\n";
282 cout << " YBevelSize = " << YBevelSize << " cm" << "\n";
283 cout << " BevelAngleDeg = " << BevelAngleDeg << " deg" << "\n";
284 cout << "\n";
285 cout << " XLeftBorder = " << XLeftBorder << " cm" << "\n";
286 cout << " XRightBorder = " << XRightBorder << " cm" << "\n";
287 cout << " YTopBorder = " << YTopBorder << " cm" << "\n";
288 cout << " YMiddleBorderUpperPart = " << YMiddleBorderUpperPart << " cm" << "\n";
289 cout << " YGapBetweenPartsOfModule = " << YGapBetweenPartsOfModule << " cm" << " (gap between two parts)\n";
290 cout << " YMiddleBorderLowerPart = " << YMiddleBorderLowerPart << " cm" << "\n";
291 cout << " YBottomBorder = " << YBottomBorder << " cm" << "\n";
292 cout << " XYBevelBorder = " << XYBevelBorder << " cm" << "\n";
293 cout << "\n";
294 cout << " XSensorZoneSize = " << XSensorZoneSize << " cm" << "\n";
295 cout << " YSensorZoneSizeUpperPart = " << YSensorZoneSizeUpperPart << " cm" << "\n";
296 cout << " YSensorZoneSizeLowerPart = " << YSensorZoneSizeLowerPart << " cm" << "\n";
297 cout << " ZSensorZoneSize = " << ZSensorZoneSize << " cm" << "\n";
298
299 cout << "-------------------------------------------------------------\n";
300}
301
303{
304 cout << "\n";
305 for (Int_t istation = 0; istation < NStations; ++istation) {
306 cout << "station " << istation << ":\n";
307 cout << " XStationPositions[" << istation << "] = " << XStationPositions[istation] << " cm\n";
308 cout << " YStationPositions[" << istation << "] = " << YStationPositions[istation] << " cm\n";
309 cout << " ZStationPositions[" << istation << "] = " << ZStationPositions[istation] << " cm\n";
310 cout << "\n";
311
312 for (Int_t imodule = 0; imodule < NModulesInStations[istation]; ++imodule) {
313 cout << " module " << imodule << ":\n";
314 cout << " XModuleShifts[" << istation << "][" << imodule << "] = " << XModuleShifts[istation][imodule]
315 << " cm\n";
316 cout << " YModuleShifts[" << istation << "][" << imodule << "] = " << YModuleShifts[istation][imodule]
317 << " cm\n";
318 cout << " ZModuleShifts[" << istation << "][" << imodule << "] = " << ZModuleShifts[istation][imodule]
319 << " cm\n";
320 cout << "\n";
321
322 Double_t XGlobalModulePos = XModuleShifts[istation][imodule] + XStationPositions[istation];
323 Double_t YGlobalModulePos = YModuleShifts[istation][imodule] + YStationPositions[istation];
324 Double_t ZGlobalModulePos = ZModuleShifts[istation][imodule] + ZStationPositions[istation];
325
326 cout << " XGlobalModulePos = " << XGlobalModulePos << " cm\n";
327 cout << " YGlobalModulePos = " << YGlobalModulePos << " cm\n";
328 cout << " ZGlobalModulePos = " << ZGlobalModulePos << " cm\n";
329 cout << "\n";
330
331 cout << " ModulesTypes[" << istation << "][" << imodule << "] = ";
332 if (ModulesTypes[istation][imodule] == 0)
333 cout << "RIGHT_ANGLED_MODULE\n";
334 if (ModulesTypes[istation][imodule] == 1)
335 cout << "BEVEL_MODULE\n";
336 if (ModulesTypes[istation][imodule] == 2)
337 cout << "RIGHT_ANGLED_MODULE_HALF\n";
338 if (ModulesTypes[istation][imodule] == 3)
339 cout << "BEVEL_MODULE_HALF\n";
340 cout << " ModulesYRotations[" << istation << "][" << imodule << "] = ";
341 if (ModulesYRotations[istation][imodule] == false)
342 cout << "not rotated around Y\n";
343 if (ModulesYRotations[istation][imodule] == true)
344 cout << "rotated around Y\n";
345 cout << " ModulesXRotations[" << istation << "][" << imodule << "] = ";
346 if (ModulesXRotations[istation][imodule] == false)
347 cout << "not rotated around X\n";
348 if (ModulesXRotations[istation][imodule] == true)
349 cout << "rotated around X\n";
350 cout << "\n";
351 }
352 cout << "-------------------------------------------------------------\n";
353 }
354 cout << "-------------------------------------------------------------\n";
355}
356
357// create geometry of silicon detector with passive frames
359{
360
361 // ---- set working directory --------------------------------------------
362 TString gPath = gSystem->Getenv("VMCWORKDIR");
363
364 // ------- Geometry file name (output) ----------------------------------
365 const TString geoDetectorName = "Silicon";
366 const TString geoDetectorVersion = "Run8_mods_10_14rot_18_detailed";
367 const TString geoFileName = gPath + "/geometry/" + geoDetectorName + "_" + geoDetectorVersion + ".root";
368
369 // ---- global geometry parameters ---------------------------------------
370 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
371 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
372
373 // ------- Load media from media file ----------------------------------
374 TString medFile = gPath + "/geometry/media.geo";
375 geoFace->setMediaFile(medFile);
376 geoFace->readMedia();
377 FairGeoMedia* geoMedia = geoFace->getMedia();
378 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
379
380 DefineRequiredMedia(geoMedia, geoBuild);
381 // -------------------------------------------------------------------------
382
383 // Print information about parameters of SILICON
386
387 // -------------- Create geometry and top volume -------------------------
388 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
389 gGeoMan->SetName(geoDetectorName + "_geom");
390 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
391 top->SetMedium(pMedAir);
392 gGeoMan->SetTopVolume(top);
393 // gGeoMan->SetTopVisible(1);
394 // --------------------------------------------------------------------------
395
396 // Define TOP Geometry
397 TGeoVolume* SILICON = new TGeoVolumeAssembly(geoDetectorName);
398 SILICON->SetMedium(pMedAir);
399
400 // Let's create SILICON stations filled with modules
401 for (Int_t istation = 0; istation < NStations; ++istation) {
402 // for(Int_t istation = 0; istation < 3; ++istation) {
403
404 TGeoVolume* station = CreateStation(TString("station") + TString::Itoa(istation, 10));
405
406 Int_t NModules = NModulesInStations[istation];
407
408 TGeoVolume* modules[NModules];
409 TGeoVolume* moduleFrames[NModules];
410
411 TGeoCombiTrans* modTransforms[NModules];
412
413 for (Int_t imodule = 0; imodule < NModules; ++imodule) {
414
415 TString module_name = TString("module") + TString::Itoa(imodule, 10) + TString("_") + station->GetName();
416 modules[imodule] = CreateModule(module_name, ModulesTypes[istation][imodule]);
417
418 TString moduleFrame_name =
419 TString("moduleFrame") + TString::Itoa(imodule, 10) + TString("_") + station->GetName();
420 moduleFrames[imodule] = CreateModuleFrame(moduleFrame_name, ModulesTypes[istation][imodule]);
421
422 modTransforms[imodule] = new TGeoCombiTrans();
423
424 if (ModulesYRotations[istation][imodule]) {
425 modTransforms[imodule]->RotateY(180.0);
426 modTransforms[imodule]->SetDx(XModuleShifts[istation][imodule] - XShiftFromCenterToLocalX0);
427 } else {
428 modTransforms[imodule]->SetDx(XModuleShifts[istation][imodule] + XShiftFromCenterToLocalX0);
429 }
430
431 if (ModulesXRotations[istation][imodule]) {
432 modTransforms[imodule]->RotateX(180.0);
433 if (ModulesTypes[istation][imodule] == ModuleType::BEVEL_MODULE_HALF
434 || ModulesTypes[istation][imodule] == ModuleType::RIGHT_ANGLED_MODULE_HALF)
435 {
436 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule] - YModuleSizeUpperPart * 0.5);
437 } else {
438 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule] + YShiftFromCenterToAxis
440 }
441 } else {
442 if (ModulesTypes[istation][imodule] == ModuleType::BEVEL_MODULE_HALF
443 || ModulesTypes[istation][imodule] == ModuleType::RIGHT_ANGLED_MODULE_HALF)
444 {
445 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule] + YModuleSizeUpperPart * 0.5);
446 } else {
447 modTransforms[imodule]->SetDy(YModuleShifts[istation][imodule] + YShiftFromCenterToAxis
449 }
450 }
451
452 Double_t z_module_shift =
453 +ZModuleSize * 0.5; // To z-module position is at the beginning of the sensitive volume
454 modTransforms[imodule]->SetDz(ZModuleShifts[istation][imodule] + z_module_shift);
455
456 TGeoCombiTrans* modFrameTransform = new TGeoCombiTrans(*modTransforms[imodule]);
457
458 if (ModulesYRotations[istation][imodule] ^ ModulesXRotations[istation][imodule]) {
459 modFrameTransform->SetDz(modFrameTransform->GetTranslation()[2]
460 - (ZModuleSize * 0.5 + ZModuleFrameSize * 0.5));
461 } else {
462 modFrameTransform->SetDz(modFrameTransform->GetTranslation()[2]
463 + (ZModuleSize * 0.5 + ZModuleFrameSize * 0.5));
464 }
465
466 // modFrameTransform->SetDz(modFrameTransform->GetTranslation()[2] + 1.0);
467
468 // if(imodule == 1) station->AddNode(modules[imodule], 0, modTransforms[imodule]);
469 station->AddNode(modules[imodule], 0, modTransforms[imodule]);
470 station->AddNode(moduleFrames[imodule], 0, modFrameTransform);
471 }
472
473 // frames ---------------------------------------------------------------
474
475 TGeoVolume* frames = new TGeoVolumeAssembly(TString("frames") += TString("_") + station->GetName());
476 frames->SetMedium(pMedAir);
477
478 // face shield ----------------------------------------------------------
479 Double_t faceShild_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 8.6; // cm
480 Double_t faceShild_YSize = 14.74; // cm
481 Double_t faceShild_ZSize = 0.3; // cm
482
483 TGeoShape* faceShildS = new TGeoXtru(2);
484 faceShildS->SetName("faceShildS");
485 {
486 Double_t x_pos[8] = {faceShild_XSize * 0.5,
487 faceShild_XSize * 0.5,
488 -faceShild_XSize * 0.5,
489 -faceShild_XSize * 0.5,
490 -2.75,
491 -2.3,
492 2.3,
493 2.75};
494 Double_t y_pos[8] = {-faceShild_YSize * 0.5,
495 faceShild_YSize * 0.5,
496 faceShild_YSize * 0.5,
497 -faceShild_YSize * 0.5,
498 -faceShild_YSize * 0.5,
499 -3.8,
500 -3.8,
501 -faceShild_YSize * 0.5};
502 ((TGeoXtru*)faceShildS)->DefinePolygon(8, x_pos, y_pos);
503 ((TGeoXtru*)faceShildS)->DefineSection(0, -faceShild_ZSize * 0.5);
504 ((TGeoXtru*)faceShildS)->DefineSection(1, +faceShild_ZSize * 0.5);
505 }
506
507 TGeoVolume* faceShildV = new TGeoVolume(TString("faceShildV") += TString("_") + station->GetName(), faceShildS);
508
509 // volume medium
510 TGeoMedium* faceShildV_medium = pMedPolystyrene;
511 if (faceShildV_medium) {
512 faceShildV->SetMedium(faceShildV_medium);
513 } else
514 Fatal("Main", "Invalid medium for faceShildV!");
515
516 // volume visual property (transparency)
517 faceShildV->SetLineColor(TColor::GetColor("#ccffcc"));
518 faceShildV->SetTransparency(50);
519
520 TGeoCombiTrans* faceShild_transf[4];
521
522 faceShild_transf[0] = new TGeoCombiTrans();
523 faceShild_transf[0]->SetDy(+faceShild_YSize * 0.5 - 0.95);
524 faceShild_transf[0]->SetDz(+0.695 /*center of half-plane*/ - 1.35 /*half-thick of frame box*/
525 - faceShild_ZSize * 0.5 /*face shield shift*/ + 4.31 /*half-plane shift*/);
526
527 faceShild_transf[1] = new TGeoCombiTrans();
528 faceShild_transf[1]->SetDy(+faceShild_YSize * 0.5 - 0.95);
529 faceShild_transf[1]->SetDz(+0.695 /*center of half-plane*/ + 1.35 /*half-thick of frame box*/
530 + faceShild_ZSize * 0.5 /*face shield shift*/ + 4.31 /*half-plane shift*/);
531
532 faceShild_transf[2] = new TGeoCombiTrans();
533 faceShild_transf[2]->RotateX(180.0);
534 faceShild_transf[2]->SetDy(-faceShild_YSize * 0.5 + 0.95);
535 faceShild_transf[2]->SetDz(+0.695 /*center of half-plane*/ - 1.35 /*half-thick of frame box*/
536 - faceShild_ZSize * 0.5 /*face shield shift*/);
537
538 faceShild_transf[3] = new TGeoCombiTrans();
539 faceShild_transf[3]->RotateX(180.0);
540 faceShild_transf[3]->SetDy(-faceShild_YSize * 0.5 + 0.95);
541 faceShild_transf[3]->SetDz(+0.695 /*center of half-plane*/ + 1.35 /*half-thick of frame box*/
542 + faceShild_ZSize * 0.5 /*face shield shift*/);
543
544 frames->AddNode(faceShildV, 0, faceShild_transf[0]);
545 frames->AddNode(faceShildV, 1, faceShild_transf[1]);
546 frames->AddNode(faceShildV, 2, faceShild_transf[2]);
547 frames->AddNode(faceShildV, 3, faceShild_transf[3]);
548 //----------------------------------------------------------------------
549
550 // sidewall of shield ---------------------------------------------------
551 Double_t sideShild_XSize = 0.95; // cm
552 Double_t sideShild_YSize = 15.2; // cm
553 Double_t sideShild_ZSize = 2.7; // cm
554
555 TGeoShape* sideShieldS =
556 new TGeoBBox("sideShieldS", sideShild_XSize * 0.5, sideShild_YSize * 0.5, sideShild_ZSize * 0.5);
557
558 TGeoVolume* sideShieldV =
559 new TGeoVolume(TString("sideShieldV") += TString("_") + station->GetName(), sideShieldS);
560
561 // volume medium
562 TGeoMedium* sideShieldV_medium = pMedAluminium;
563 if (sideShieldV_medium) {
564 sideShieldV->SetMedium(sideShieldV_medium);
565 } else
566 Fatal("Main", "Invalid medium for sideShieldV!");
567
568 // volume visual property (transparency)
569 sideShieldV->SetLineColor(TColor::GetColor("#ffcccc"));
570 sideShieldV->SetTransparency(50);
571
572 TGeoCombiTrans* sideShild_transf[4];
573
574 sideShild_transf[0] = new TGeoCombiTrans();
575 sideShild_transf[0]->SetDx(+(faceShild_XSize * 0.5 - sideShild_XSize * 0.5));
576 sideShild_transf[0]->SetDy(+faceShild_YSize * 0.5 - 0.95 + (sideShild_YSize - faceShild_YSize) * 0.5);
577 sideShild_transf[0]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
578
579 sideShild_transf[1] = new TGeoCombiTrans();
580 sideShild_transf[1]->SetDx(-(faceShild_XSize * 0.5 - sideShild_XSize * 0.5));
581 sideShild_transf[1]->SetDy(+faceShild_YSize * 0.5 - 0.95 + (sideShild_YSize - faceShild_YSize) * 0.5);
582 sideShild_transf[1]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
583
584 sideShild_transf[2] = new TGeoCombiTrans();
585 sideShild_transf[2]->SetDx(+(faceShild_XSize * 0.5 - sideShild_XSize * 0.5));
586 sideShild_transf[2]->SetDy(-faceShild_YSize * 0.5 + 0.95 - (sideShild_YSize - faceShild_YSize) * 0.5);
587 sideShild_transf[2]->SetDz(+0.695 /*center of half-plane*/);
588
589 sideShild_transf[3] = new TGeoCombiTrans();
590 sideShild_transf[3]->SetDx(-(faceShild_XSize * 0.5 - sideShild_XSize * 0.5));
591 sideShild_transf[3]->SetDy(-faceShild_YSize * 0.5 + 0.95 - (sideShild_YSize - faceShild_YSize) * 0.5);
592 sideShild_transf[3]->SetDz(+0.695 /*center of half-plane*/);
593
594 frames->AddNode(sideShieldV, 0, sideShild_transf[0]);
595 frames->AddNode(sideShieldV, 1, sideShild_transf[1]);
596 frames->AddNode(sideShieldV, 2, sideShild_transf[2]);
597 frames->AddNode(sideShieldV, 3, sideShild_transf[3]);
598 //----------------------------------------------------------------------
599
600 // horizontal plane of shield -------------------------------------------
601 Double_t horizShild_XSize = faceShild_XSize * 0.5 - sideShild_XSize - 2.75 /*half-size of hole*/; // cm
602 Double_t horizShild_YSize = 0.3; // cm
603 Double_t horizShild_ZSize = 2.7; // cm
604
605 TGeoShape* horizShieldS =
606 new TGeoBBox("horizShieldS", horizShild_XSize * 0.5, horizShild_YSize * 0.5, horizShild_ZSize * 0.5);
607
608 TGeoVolume* horizShieldV =
609 new TGeoVolume(TString("horizShieldV") += TString("_") + station->GetName(), horizShieldS);
610
611 // volume medium
612 TGeoMedium* horizShieldV_medium = pMedPolystyrene;
613 if (horizShieldV_medium) {
614 horizShieldV->SetMedium(horizShieldV_medium);
615 } else
616 Fatal("Main", "Invalid medium for horizShieldV!");
617
618 // volume visual property (transparency)
619 horizShieldV->SetLineColor(TColor::GetColor("#ccffcc"));
620 horizShieldV->SetTransparency(50);
621
622 TGeoCombiTrans* horizShild_transf[4];
623
624 horizShild_transf[0] = new TGeoCombiTrans();
625 horizShild_transf[0]->SetDx(+(faceShild_XSize * 0.5 - horizShild_XSize * 0.5 - sideShild_XSize));
626 horizShild_transf[0]->SetDy(+(-0.95 + horizShild_YSize * 0.5));
627 horizShild_transf[0]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
628
629 horizShild_transf[1] = new TGeoCombiTrans();
630 horizShild_transf[1]->SetDx(-(faceShild_XSize * 0.5 - horizShild_XSize * 0.5 - sideShild_XSize));
631 horizShild_transf[1]->SetDy(+(-0.95 + horizShild_YSize * 0.5));
632 horizShild_transf[1]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
633
634 horizShild_transf[2] = new TGeoCombiTrans();
635 horizShild_transf[2]->SetDx(+(faceShild_XSize * 0.5 - horizShild_XSize * 0.5 - sideShild_XSize));
636 horizShild_transf[2]->SetDy(-(-0.95 + horizShild_YSize * 0.5));
637 horizShild_transf[2]->SetDz(+0.695 /*center of half-plane*/);
638
639 horizShild_transf[3] = new TGeoCombiTrans();
640 horizShild_transf[3]->SetDx(-(faceShild_XSize * 0.5 - horizShild_XSize * 0.5 - sideShild_XSize));
641 horizShild_transf[3]->SetDy(-(-0.95 + horizShild_YSize * 0.5));
642 horizShild_transf[3]->SetDz(+0.695 /*center of half-plane*/);
643
644 frames->AddNode(horizShieldV, 0, horizShild_transf[0]);
645 frames->AddNode(horizShieldV, 1, horizShild_transf[1]);
646 frames->AddNode(horizShieldV, 2, horizShild_transf[2]);
647 frames->AddNode(horizShieldV, 3, horizShild_transf[3]);
648 //----------------------------------------------------------------------
649
650 // plank of shield ------------------------------------------------------
651 Double_t plankShild_XSize = faceShild_XSize; // cm
652 Double_t plankShild_YSize = 1.5; // cm
653 Double_t plankShild_ZSize = 0.3; // cm
654
655 TGeoShape* plankShieldS =
656 new TGeoBBox("plankShieldS", plankShild_XSize * 0.5, plankShild_YSize * 0.5, plankShild_ZSize * 0.5);
657
658 TGeoVolume* plankShieldV =
659 new TGeoVolume(TString("plankShieldV") += TString("_") + station->GetName(), plankShieldS);
660
661 // volume medium
662 TGeoMedium* plankShieldV_medium = pMedAluminium;
663 if (plankShieldV_medium) {
664 plankShieldV->SetMedium(plankShieldV_medium);
665 } else
666 Fatal("Main", "Invalid medium for plankShieldV!");
667
668 // volume visual property (transparency)
669 plankShieldV->SetLineColor(TColor::GetColor("#ffcccc"));
670 plankShieldV->SetTransparency(50);
671
672 TGeoCombiTrans* plankShild_transf[4];
673
674 plankShild_transf[0] = new TGeoCombiTrans();
675 plankShild_transf[0]->SetDx(0.0);
676 plankShild_transf[0]->SetDy(+(-0.95 + faceShild_YSize) - 0.05);
677 plankShild_transf[0]->SetDz(+0.695 /*center of half-plane*/
678 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize * 0.5)
679 + 4.31 /*half-plane shift*/);
680
681 plankShild_transf[1] = new TGeoCombiTrans();
682 plankShild_transf[1]->SetDx(0.0);
683 plankShild_transf[1]->SetDy(+(-0.95 + faceShild_YSize) - 0.05);
684 plankShild_transf[1]->SetDz(+0.695 /*center of half-plane*/
685 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize * 0.5)
686 + 4.31 /*half-plane shift*/);
687
688 plankShild_transf[2] = new TGeoCombiTrans();
689 plankShild_transf[2]->SetDx(0.0);
690 plankShild_transf[2]->SetDy(-(-0.95 + faceShild_YSize) + 0.05);
691 plankShild_transf[2]->SetDz(+0.695 /*center of half-plane*/
692 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize * 0.5));
693
694 plankShild_transf[3] = new TGeoCombiTrans();
695 plankShild_transf[3]->SetDx(0.0);
696 plankShild_transf[3]->SetDy(-(-0.95 + faceShild_YSize) + 0.05);
697 plankShild_transf[3]->SetDz(+0.695 /*center of half-plane*/
698 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize * 0.5));
699
700 frames->AddNode(plankShieldV, 0, plankShild_transf[0]);
701 frames->AddNode(plankShieldV, 1, plankShild_transf[1]);
702 frames->AddNode(plankShieldV, 2, plankShild_transf[2]);
703 frames->AddNode(plankShieldV, 3, plankShild_transf[3]);
704 //----------------------------------------------------------------------
705
706 // base rail
707 Double_t baseRailMainPart_XSize = faceShild_XSize + 3.4 * 2 /*margin*/; // cm
708 Double_t baseRailMainPart_YSize = 5.0; // cm
709 Double_t baseRailMainPart_ZSize = 0.7; // cm
710
711 cout << "baseRailMainPart_XSize = " << baseRailMainPart_XSize << "\n";
712
713 Double_t baseRailUpperPart_XSize = baseRailMainPart_XSize; // cm
714 Double_t baseRailUpperPart_YSize = 1.0; // cm
715 Double_t baseRailUpperPart_ZSize = 0.3; // cm
716
717 Double_t baseRailLowerPart_XSize = baseRailMainPart_XSize - 8.8 /*cut*/; // cm
718 Double_t baseRailLowerPart_YSize = 0.7; // cm
719 Double_t baseRailLowerPart_ZSize = 0.3; // cm
720
721 TGeoShape* baseRailMainPartS =
722 new TGeoBBox(TString("baseRailMainPartS") += TString("_") + station->GetName(),
723 baseRailMainPart_XSize * 0.5, baseRailMainPart_YSize * 0.5, baseRailMainPart_ZSize * 0.5);
724 TGeoShape* baseRailUpperPartS =
725 new TGeoBBox(TString("baseRailUpperPartS") += TString("_") + station->GetName(),
726 baseRailUpperPart_XSize * 0.5, baseRailUpperPart_YSize * 0.5, baseRailUpperPart_ZSize * 0.5);
727 TGeoShape* baseRailLowerPartS =
728 new TGeoBBox(TString("baseRailLowerPartS") += TString("_") + station->GetName(),
729 baseRailLowerPart_XSize * 0.5, baseRailLowerPart_YSize * 0.5, baseRailLowerPart_ZSize * 0.5);
730
731 TGeoTranslation* baseRailUpperPart_pos = new TGeoTranslation();
732 baseRailUpperPart_pos->SetName(TString("baseRailUpperPart_pos") += TString("_") + station->GetName());
733 baseRailUpperPart_pos->SetDx(0.0);
734 baseRailUpperPart_pos->SetDy(+(baseRailMainPart_YSize * 0.5 + baseRailUpperPart_YSize * 0.5));
735 baseRailUpperPart_pos->SetDz(baseRailMainPart_ZSize * 0.5 - baseRailUpperPart_ZSize * 0.5);
736 baseRailUpperPart_pos->RegisterYourself();
737
738 TGeoTranslation* baseRailLowerPart_pos = new TGeoTranslation();
739 baseRailLowerPart_pos->SetName(TString("baseRailLowerPart_pos") += TString("_") + station->GetName());
740 baseRailLowerPart_pos->SetDx(0.0);
741 baseRailLowerPart_pos->SetDy(-(baseRailMainPart_YSize * 0.5 + baseRailLowerPart_YSize * 0.5));
742 baseRailLowerPart_pos->SetDz(baseRailMainPart_ZSize * 0.5 - baseRailLowerPart_ZSize * 0.5);
743 baseRailLowerPart_pos->RegisterYourself();
744
745 TGeoCompositeShape* baseRailS = new TGeoCompositeShape();
746 baseRailS->SetName(TString("baseRailS") += TString("_") + station->GetName());
747 {
748 TString expression = "baseRailMainPartS";
749 expression += TString("_") + station->GetName();
750 expression += "+baseRailUpperPartS";
751 expression += TString("_") + station->GetName();
752 expression += ":baseRailUpperPart_pos";
753 expression += TString("_") + station->GetName();
754 expression += "+baseRailLowerPartS";
755 expression += TString("_") + station->GetName();
756 expression += ":baseRailLowerPart_pos";
757 expression += TString("_") + station->GetName();
758 baseRailS->MakeNode(expression);
759 baseRailS->ComputeBBox(); // need to compute a bounding box
760 }
761
762 TGeoVolume* baseRailV = new TGeoVolume(TString("baseRailV") += TString("_") + station->GetName(), baseRailS);
763
764 // volume medium
765 TGeoMedium* baseRailV_medium = pMedAluminium;
766 if (baseRailV_medium) {
767 baseRailV->SetMedium(baseRailV_medium);
768 } else
769 Fatal("Main", "Invalid medium for baseRailV!");
770
771 // volume visual property (transparency)
772 baseRailV->SetLineColor(TColor::GetColor("#ffcccc"));
773 baseRailV->SetTransparency(50);
774
775 TGeoCombiTrans* baseRail_transf[2];
776
777 baseRail_transf[0] = new TGeoCombiTrans();
778 baseRail_transf[0]->RotateY(180.0);
779 baseRail_transf[0]->SetDx(0.1);
780 baseRail_transf[0]->SetDy(+(14.5 + baseRailMainPart_YSize * 0.5));
781 baseRail_transf[0]->SetDz(+0.695 /*center of half-plane*/
782 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + baseRailMainPart_ZSize * 0.5
783 - baseRailLowerPart_ZSize)
784 + 4.31 /*half-plane shift*/);
785
786 baseRail_transf[1] = new TGeoCombiTrans();
787 baseRail_transf[1]->ReflectY(true);
788 baseRail_transf[1]->SetDx(0.0);
789 baseRail_transf[1]->SetDy(-(14.5 + baseRailMainPart_YSize * 0.5));
790 baseRail_transf[1]->SetDz(+0.695 /*center of half-plane*/
791 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + baseRailMainPart_ZSize * 0.5
792 - baseRailLowerPart_ZSize));
793
794 frames->AddNode(baseRailV, 0, baseRail_transf[0]);
795 frames->AddNode(baseRailV, 1, baseRail_transf[1]);
796 //----------------------------------------------------------------------
797
798 // back rail ------------------------------------------------------------
799 Double_t backRailMainPart_XSize = faceShild_XSize + -0.3 * 2 /*margin*/; // cm
800 Double_t backRailMainPart_YSize = 3.0; // cm
801 Double_t backRailMainPart_ZSize = 0.9; // cm, average 6..12 cm
802
803 Double_t backRailLowerPart_XSize = backRailMainPart_XSize - 1.4; // cm
804 Double_t backRailLowerPart_YSize = 0.7; // cm
805 Double_t backRailLowerPart_ZSize = 0.6; // cm
806
807 Double_t backRailSidePart_XSize = 1.2; // cm
808 Double_t backRailSidePart_YSize = 3.0; // cm
809 Double_t backRailSidePart_ZSize = 1.62; // cm
810
811 TGeoShape* backRailMainPartS =
812 new TGeoBBox(TString("backRailMainPartS") += TString("_") + station->GetName(),
813 backRailMainPart_XSize * 0.5, backRailMainPart_YSize * 0.5, backRailMainPart_ZSize * 0.5);
814 TGeoShape* backRailLowerPartS =
815 new TGeoBBox(TString("backRailLowerPartS") += TString("_") + station->GetName(),
816 backRailLowerPart_XSize * 0.5, backRailLowerPart_YSize * 0.5, backRailLowerPart_ZSize * 0.5);
817 TGeoShape* backRailSidePartS =
818 new TGeoBBox(TString("backRailSidePartS") += TString("_") + station->GetName(),
819 backRailSidePart_XSize * 0.5, backRailSidePart_YSize * 0.5, backRailSidePart_ZSize * 0.5);
820
821 TGeoTranslation* backRailLowerPart_pos = new TGeoTranslation();
822 backRailLowerPart_pos->SetName(TString("backRailLowerPart_pos") += TString("_") + station->GetName());
823 backRailLowerPart_pos->SetDx(0.0);
824 backRailLowerPart_pos->SetDy(-(backRailMainPart_YSize * 0.5 + backRailLowerPart_YSize * 0.5));
825 backRailLowerPart_pos->SetDz(backRailMainPart_ZSize * 0.5 - backRailLowerPart_ZSize * 0.5);
826 backRailLowerPart_pos->RegisterYourself();
827
828 TGeoTranslation* backRailSidePart1_pos = new TGeoTranslation();
829 backRailSidePart1_pos->SetName(TString("backRailSidePart1_pos") += TString("_") + station->GetName());
830 backRailSidePart1_pos->SetDx(+(backRailMainPart_XSize * 0.5 - backRailSidePart_XSize * 0.5));
831 backRailSidePart1_pos->SetDy(0.0);
832 backRailSidePart1_pos->SetDz(backRailMainPart_ZSize * 0.5 + backRailSidePart_ZSize * 0.5);
833 backRailSidePart1_pos->RegisterYourself();
834
835 TGeoTranslation* backRailSidePart2_pos = new TGeoTranslation();
836 backRailSidePart2_pos->SetName(TString("backRailSidePart2_pos") += TString("_") + station->GetName());
837 backRailSidePart2_pos->SetDx(-(backRailMainPart_XSize * 0.5 - backRailSidePart_XSize * 0.5));
838 backRailSidePart2_pos->SetDy(0.0);
839 backRailSidePart2_pos->SetDz(backRailMainPart_ZSize * 0.5 + backRailSidePart_ZSize * 0.5);
840 backRailSidePart2_pos->RegisterYourself();
841
842 TGeoCompositeShape* backRailS = new TGeoCompositeShape();
843 backRailS->SetName(TString("backRailS") += TString("_") + station->GetName());
844 {
845 TString expression = "backRailMainPartS";
846 expression += TString("_") + station->GetName();
847 expression += "+backRailLowerPartS";
848 expression += TString("_") + station->GetName();
849 expression += ":backRailLowerPart_pos";
850 expression += TString("_") + station->GetName();
851 expression += "+backRailSidePartS";
852 expression += TString("_") + station->GetName();
853 expression += ":backRailSidePart1_pos";
854 expression += TString("_") + station->GetName();
855 expression += "+backRailSidePartS";
856 expression += TString("_") + station->GetName();
857 expression += ":backRailSidePart2_pos";
858 expression += TString("_") + station->GetName();
859 backRailS->MakeNode(expression);
860 backRailS->ComputeBBox(); // need to compute a bounding box
861 }
862
863 TGeoVolume* backRailV = new TGeoVolume(TString("backRailV") += TString("_") + station->GetName(), backRailS);
864
865 // volume medium
866 TGeoMedium* backRailV_medium = pMedAluminium;
867 if (backRailV_medium) {
868 backRailV->SetMedium(backRailV_medium);
869 } else
870 Fatal("Main", "Invalid medium for backRailV!");
871
872 // volume visual property (transparency)
873 backRailV->SetLineColor(TColor::GetColor("#ffcccc"));
874 backRailV->SetTransparency(50);
875
876 TGeoCombiTrans* backRail_transf[2];
877
878 backRail_transf[0] = new TGeoCombiTrans();
879 backRail_transf[0]->SetDx(0.0);
880 backRail_transf[0]->SetDy(+(14.5 + backRailMainPart_YSize * 0.5));
881 backRail_transf[0]->SetDz(+0.695 /*center of half-plane*/
882 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize
883 + (backRailMainPart_ZSize * 0.5 - backRailLowerPart_ZSize))
884 + 4.31 /*half-plane shift*/);
885
886 backRail_transf[1] = new TGeoCombiTrans();
887 backRail_transf[1]->RotateX(180.0);
888 backRail_transf[1]->SetDx(0.0);
889 backRail_transf[1]->SetDy(-(14.5 + backRailMainPart_YSize * 0.5));
890 backRail_transf[1]->SetDz(+0.695 /*center of half-plane*/
891 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize
892 + (backRailMainPart_ZSize * 0.5 - backRailLowerPart_ZSize)));
893
894 frames->AddNode(backRailV, 0, backRail_transf[0]);
895 frames->AddNode(backRailV, 1, backRail_transf[1]);
896 //----------------------------------------------------------------------
897
898 // holding back rail ----------------------------------------------------
899 Double_t holdBackRail_XSize = backRailMainPart_XSize;
900 Double_t holdBackRail_YSize = 1.8; // cm
901 Double_t holdBackRail_ZSize = 1.0;
902
903 TGeoShape* holdBackRailS = new TGeoXtru(2);
904 holdBackRailS->SetName("holdBackRailS");
905 {
906 Double_t x_pos[5] = {
907 +0.0 /*0*/, +0.1 /*1*/, +holdBackRail_ZSize /*2*/, +holdBackRail_ZSize /*3*/, +0.0 /*4*/
908 };
909 Double_t y_pos[5] = {
910 -holdBackRail_YSize /*0*/,
911 -holdBackRail_YSize /*1*/,
912 -holdBackRail_YSize * 0.5 /*2*/,
913 -0.0 /*3*/,
914 -0.0 /*4*/,
915 };
916 ((TGeoXtru*)holdBackRailS)->DefinePolygon(5, x_pos, y_pos);
917 ((TGeoXtru*)holdBackRailS)->DefineSection(0, -holdBackRail_XSize * 0.5);
918 ((TGeoXtru*)holdBackRailS)->DefineSection(1, +holdBackRail_XSize * 0.5);
919 }
920
921 TGeoVolume* holdBackRailV =
922 new TGeoVolume(TString("holdBackRailV") += TString("_") + station->GetName(), holdBackRailS);
923
924 // volume medium
925 TGeoMedium* holdBackRailV_medium = pMedAluminium;
926 if (holdBackRailV_medium) {
927 holdBackRailV->SetMedium(holdBackRailV_medium);
928 } else
929 Fatal("Main", "Invalid medium for holdBackRailV!");
930
931 // volume visual property (transparency)
932 holdBackRailV->SetLineColor(TColor::GetColor("#ffcccc"));
933 holdBackRailV->SetTransparency(10);
934
935 TGeoCombiTrans* holdBackRail_transf[2];
936
937 holdBackRail_transf[0] = new TGeoCombiTrans();
938 holdBackRail_transf[0]->RotateY(90.0);
939 holdBackRail_transf[0]->SetDx(0.0);
940 holdBackRail_transf[0]->SetDy(+(14.5 + backRailMainPart_YSize));
941 holdBackRail_transf[0]->SetDz(
942 +0.695 /*center of half-plane*/ - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize)
943 + 4.31 /*half-plane shift*/);
944
945 holdBackRail_transf[1] = new TGeoCombiTrans();
946 holdBackRail_transf[1]->RotateY(90.0);
947 holdBackRail_transf[1]->RotateX(180.0);
948 holdBackRail_transf[1]->SetDx(0.0);
949 holdBackRail_transf[1]->SetDy(-(14.5 + backRailMainPart_YSize));
950 holdBackRail_transf[1]->SetDz(
951 +0.695 /*center of half-plane*/ + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize));
952
953 frames->AddNode(holdBackRailV, 0, holdBackRail_transf[0]);
954 frames->AddNode(holdBackRailV, 1, holdBackRail_transf[1]);
955 //----------------------------------------------------------------------
956
957 // back plane -----------------------------------------------------------
958 Double_t backPlane_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 3.95 * 2 /*margin*/; // cm
959 Double_t backPlane_YSize = 13.1; // cm
960 Double_t backPlane_ZSize = 0.15; // cm
961
962 TGeoShape* backPlaneS =
963 new TGeoBBox("backPlaneS", backPlane_XSize * 0.5, backPlane_YSize * 0.5, backPlane_ZSize * 0.5);
964
965 TGeoVolume* backPlaneV = new TGeoVolume(TString("backPlaneV") += TString("_") + station->GetName(), backPlaneS);
966
967 // volume medium
968 TGeoMedium* backPlaneV_medium = pMedAluminium;
969 if (backPlaneV_medium) {
970 backPlaneV->SetMedium(backPlaneV_medium);
971 } else
972 Fatal("Main", "Invalid medium for backPlaneV!");
973
974 // volume visual property (transparency)
975 backPlaneV->SetLineColor(TColor::GetColor("#ffcccc"));
976 backPlaneV->SetTransparency(10);
977
978 TGeoCombiTrans* backPlane_transf[2];
979
980 backPlane_transf[0] = new TGeoCombiTrans();
981 backPlane_transf[0]->SetDx(0.0);
982 backPlane_transf[0]->SetDy(+(16.75 + backPlane_YSize * 0.5));
983 backPlane_transf[0]->SetDz(+0.695 /*center of half-plane*/
984 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize
985 + holdBackRail_ZSize + backPlane_ZSize * 0.5)
986 + 4.31 /*half-plane shift*/);
987
988 backPlane_transf[1] = new TGeoCombiTrans();
989 backPlane_transf[1]->SetDx(0.0);
990 backPlane_transf[1]->SetDy(-(16.75 + backPlane_YSize * 0.5));
991 backPlane_transf[1]->SetDz(+0.695 /*center of half-plane*/
992 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize
993 + holdBackRail_ZSize + backPlane_ZSize * 0.5));
994
995 frames->AddNode(backPlaneV, 0, backPlane_transf[0]);
996 frames->AddNode(backPlaneV, 1, backPlane_transf[1]);
997 //----------------------------------------------------------------------
998
999 // front plane ----------------------------------------------------------
1000 Double_t frontPlane_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 1.8 * 2 /*margin*/; // cm
1001 Double_t frontPlane_YSize = 10.8; // cm
1002 Double_t frontPlane_ZSize = 0.15; // cm
1003
1004 TGeoShape* frontPlaneS =
1005 new TGeoBBox("frontPlaneS", frontPlane_XSize * 0.5, frontPlane_YSize * 0.5, frontPlane_ZSize * 0.5);
1006
1007 TGeoVolume* frontPlaneV =
1008 new TGeoVolume(TString("frontPlaneV") += TString("_") + station->GetName(), frontPlaneS);
1009
1010 // volume medium
1011 TGeoMedium* frontPlaneV_medium = pMedAluminium;
1012 if (frontPlaneV_medium) {
1013 frontPlaneV->SetMedium(frontPlaneV_medium);
1014 } else
1015 Fatal("Main", "Invalid medium for frontPlaneV!");
1016
1017 // volume visual property (transparency)
1018 frontPlaneV->SetLineColor(TColor::GetColor("#ffcccc"));
1019 frontPlaneV->SetTransparency(10);
1020
1021 TGeoCombiTrans* frontPlane_transf[2];
1022
1023 frontPlane_transf[0] = new TGeoCombiTrans();
1024 frontPlane_transf[0]->SetDx(0.0);
1025 frontPlane_transf[0]->SetDy(+(19.7 + frontPlane_YSize * 0.5));
1026 frontPlane_transf[0]->SetDz(
1027 +0.695 /*center of half-plane*/
1028 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize + frontPlane_ZSize * 0.5)
1029 + 4.31 /*half-plane shift*/);
1030
1031 frontPlane_transf[1] = new TGeoCombiTrans();
1032 frontPlane_transf[1]->SetDx(0.0);
1033 frontPlane_transf[1]->SetDy(-(19.7 + frontPlane_YSize * 0.5));
1034 frontPlane_transf[1]->SetDz(
1035 +0.695 /*center of half-plane*/
1036 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + plankShild_ZSize + frontPlane_ZSize * 0.5));
1037
1038 frames->AddNode(frontPlaneV, 0, frontPlane_transf[0]);
1039 frames->AddNode(frontPlaneV, 1, frontPlane_transf[1]);
1040 //----------------------------------------------------------------------
1041
1042 // front plane with a window --------------------------------------------
1043 Double_t frontPlaneWithWindow_XSize =
1044 (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 4.0 * 2 /*margin*/; // cm
1045 Double_t frontPlaneWithWindow_YSize = 18.3; // cm
1046 Double_t frontPlaneWithWindow_ZSize = 0.3; // cm
1047
1048 Double_t frontPlaneWindow_XSize = frontPlaneWithWindow_XSize - 3.0 * 2 /*margin*/; // cm
1049 Double_t frontPlaneWindow_YSize = 8.6; // cm
1050
1051 TGeoShape* frontPlaneWithWindowBlankS = new TGeoBBox(
1052 TString("frontPlaneWithWindowBlankS") += TString("_") + station->GetName(),
1053 frontPlaneWithWindow_XSize * 0.5, frontPlaneWithWindow_YSize * 0.5, frontPlaneWithWindow_ZSize * 0.5);
1054 TGeoShape* frontPlaneWindowS = new TGeoBBox(TString("frontPlaneWindowS") += TString("_") + station->GetName(),
1055 frontPlaneWindow_XSize * 0.5, frontPlaneWindow_YSize * 0.5,
1056 (frontPlaneWithWindow_ZSize + 0.001) * 0.5);
1057
1058 TGeoTranslation* frontPlaneWindow_pos = new TGeoTranslation();
1059 frontPlaneWindow_pos->SetName(TString("frontPlaneWindow_pos") += TString("_") + station->GetName());
1060 frontPlaneWindow_pos->SetDx(0.0);
1061 frontPlaneWindow_pos->SetDy(-2.85 /*shift*/);
1062 frontPlaneWindow_pos->SetDz(0.0);
1063 frontPlaneWindow_pos->RegisterYourself();
1064
1065 TGeoCompositeShape* frontPlaneWithWindowS = new TGeoCompositeShape();
1066 frontPlaneWithWindowS->SetName(TString("frontPlaneWithWindowS") += TString("_") + station->GetName());
1067 {
1068 TString expression = "frontPlaneWithWindowBlankS";
1069 expression += TString("_") + station->GetName();
1070 expression += "-frontPlaneWindowS";
1071 expression += TString("_") + station->GetName();
1072 expression += ":frontPlaneWindow_pos";
1073 expression += TString("_") + station->GetName();
1074 frontPlaneWithWindowS->MakeNode(expression);
1075 frontPlaneWithWindowS->ComputeBBox(); // need to compute a bounding box
1076 }
1077
1078 TGeoVolume* frontPlaneWithWindowV = new TGeoVolume(
1079 TString("frontPlaneWithWindowV") += TString("_") + station->GetName(), frontPlaneWithWindowS);
1080
1081 // volume medium
1082 TGeoMedium* frontPlaneWithWindowV_medium = pMedAluminium;
1083 if (frontPlaneWithWindowV_medium) {
1084 frontPlaneWithWindowV->SetMedium(frontPlaneWithWindowV_medium);
1085 } else
1086 Fatal("Main", "Invalid medium for frontPlaneWithWindowV!");
1087
1088 // volume visual property (transparency)
1089 frontPlaneWithWindowV->SetLineColor(TColor::GetColor("#ffcccc"));
1090 frontPlaneWithWindowV->SetTransparency(50);
1091
1092 TGeoCombiTrans* frontPlaneWithWindow_transf[2];
1093
1094 frontPlaneWithWindow_transf[0] = new TGeoCombiTrans();
1095 frontPlaneWithWindow_transf[0]->SetDx(0.0);
1096 frontPlaneWithWindow_transf[0]->SetDy(+(19.5 + frontPlaneWithWindow_YSize * 0.5));
1097 frontPlaneWithWindow_transf[0]->SetDz(
1098 +0.695 /*center of half-plane*/
1099 + (1.35 /*half-thick of frame box*/ + faceShild_ZSize + frontPlaneWithWindow_ZSize * 0.5)
1100 + 4.31 /*half-plane shift*/);
1101
1102 frontPlaneWithWindow_transf[1] = new TGeoCombiTrans();
1103 frontPlaneWithWindow_transf[1]->RotateX(180.0);
1104 frontPlaneWithWindow_transf[1]->SetDx(0.0);
1105 frontPlaneWithWindow_transf[1]->SetDy(-(19.5 + frontPlaneWithWindow_YSize * 0.5));
1106 frontPlaneWithWindow_transf[1]->SetDz(
1107 +0.695 /*center of half-plane*/
1108 - (1.35 /*half-thick of frame box*/ + faceShild_ZSize + frontPlaneWithWindow_ZSize * 0.5));
1109
1110 frames->AddNode(frontPlaneWithWindowV, 0, frontPlaneWithWindow_transf[0]);
1111 frames->AddNode(frontPlaneWithWindowV, 1, frontPlaneWithWindow_transf[1]);
1112 //----------------------------------------------------------------------
1113
1114 // PCB (Printed Circuit Board) ------------------------------------------
1115 Double_t pcb_XSize = (NModules / 2.0) * 6.3 - (NModules / 2.0) * 0.3 + 4.865 /*margin*/; // cm
1116 Double_t pcb_YSize = 10.0; // cm
1117 Double_t pcb_ZSize = 0.2; // cm
1118
1119 TGeoShape* pcbS = new TGeoBBox("pcbS", frontPlane_XSize * 0.5, frontPlane_YSize * 0.5, frontPlane_ZSize * 0.5);
1120
1121 TGeoVolume* pcbV = new TGeoVolume(TString("pcbV") += TString("_") + station->GetName(), pcbS);
1122
1123 // volume medium
1124 TGeoMedium* pcbV_medium = pMedFiberGlass;
1125 if (pcbV_medium) {
1126 pcbV->SetMedium(pcbV_medium);
1127 } else
1128 Fatal("Main", "Invalid medium for pcbV!");
1129
1130 // volume visual property (transparency)
1131 pcbV->SetLineColor(TColor::GetColor("#ccccff"));
1132 pcbV->SetTransparency(10);
1133
1134 TGeoCombiTrans* pcb_transf[2];
1135
1136 pcb_transf[0] = new TGeoCombiTrans();
1137 pcb_transf[0]->SetDx(0.0);
1138 pcb_transf[0]->SetDy(+(26.5 + pcb_YSize * 0.5));
1139 pcb_transf[0]->SetDz(+0.695 /*center of half-plane*/ + 4.31 /*half-plane shift*/);
1140
1141 pcb_transf[1] = new TGeoCombiTrans();
1142 pcb_transf[1]->SetDx(0.0);
1143 pcb_transf[1]->SetDy(-(26.5 + pcb_YSize * 0.5));
1144 pcb_transf[1]->SetDz(+0.695 /*center of half-plane*/);
1145
1146 frames->AddNode(pcbV, 0, pcb_transf[0]);
1147 frames->AddNode(pcbV, 1, pcb_transf[1]);
1148 //----------------------------------------------------------------------
1149
1150 // upper side shield ----------------------------------------------------
1151 Double_t upperSideShield_XSize = 4.4; // cm
1152 Double_t upperSideShield_YSize = 12.3; // cm
1153 Double_t upperSideShield_ZSize = 0.8; // cm
1154
1155 Double_t upperSideShieldCut_XSize = 0.9; // cm
1156 Double_t upperSideShieldCut_YSize = 2.4; // cm
1157
1158 Double_t upperSideShieldWindow_XSize = 3.0; // cm
1159 Double_t upperSideShieldWindow_YSize = 7.0; // cm
1160
1161 TGeoShape* upperSideShieldBlankS = new TGeoXtru(2);
1162 upperSideShieldBlankS->SetName(TString("upperSideShieldBlankS") += TString("_") + station->GetName());
1163 {
1164 Double_t x_pos[6] = {
1165 +upperSideShield_XSize * 0.5 /*0*/,
1166 +upperSideShield_XSize * 0.5 /*1*/,
1167 -upperSideShield_XSize * 0.5 /*2*/,
1168 -upperSideShield_XSize * 0.5 /*3*/,
1169 -upperSideShield_XSize * 0.5 + upperSideShieldCut_XSize /*4*/,
1170 -upperSideShield_XSize * 0.5 + upperSideShieldCut_XSize /*5*/
1171
1172 };
1173 Double_t y_pos[6] = {
1174 -upperSideShield_YSize * 0.5 /*0*/,
1175 +upperSideShield_YSize * 0.5 /*1*/,
1176 +upperSideShield_YSize * 0.5 /*2*/,
1177 -upperSideShield_YSize * 0.5 + upperSideShieldCut_YSize /*3*/,
1178 -upperSideShield_YSize * 0.5 + upperSideShieldCut_YSize /*4*/,
1179 -upperSideShield_YSize * 0.5 /*5*/
1180
1181 };
1182 ((TGeoXtru*)upperSideShieldBlankS)->DefinePolygon(6, x_pos, y_pos);
1183 ((TGeoXtru*)upperSideShieldBlankS)->DefineSection(0, -upperSideShield_ZSize * 0.5);
1184 ((TGeoXtru*)upperSideShieldBlankS)->DefineSection(1, +upperSideShield_ZSize * 0.5);
1185 }
1186
1187 TGeoShape* upperSideShieldWindowS = new TGeoBBox(
1188 TString("upperSideShieldWindowS") += TString("_") + station->GetName(), upperSideShieldWindow_XSize * 0.5,
1189 upperSideShieldWindow_YSize * 0.5, (upperSideShield_ZSize + 0.001) * 0.5);
1190
1191 TGeoTranslation* upperSideShieldWindow_pos = new TGeoTranslation();
1192 upperSideShieldWindow_pos->SetName(TString("upperSideShieldWindow_pos") += TString("_") + station->GetName());
1193 upperSideShieldWindow_pos->SetDx(0.0);
1194 upperSideShieldWindow_pos->SetDy(+1.65 /*shift*/);
1195 upperSideShieldWindow_pos->SetDz(0.0);
1196 upperSideShieldWindow_pos->RegisterYourself();
1197
1198 TGeoCompositeShape* upperSideShieldWithWindowS = new TGeoCompositeShape();
1199 upperSideShieldWithWindowS->SetName(TString("upperSideShieldWithWindowS") += TString("_") + station->GetName());
1200 {
1201 TString expression = "upperSideShieldBlankS";
1202 expression += TString("_") + station->GetName();
1203 expression += "-upperSideShieldWindowS";
1204 expression += TString("_") + station->GetName();
1205 expression += ":upperSideShieldWindow_pos";
1206 expression += TString("_") + station->GetName();
1207 upperSideShieldWithWindowS->MakeNode(expression);
1208 upperSideShieldWithWindowS->ComputeBBox(); // need to compute a bounding box
1209 }
1210
1211 TGeoVolume* upperSideShieldV = new TGeoVolume(TString("upperSideShieldV") += TString("_") + station->GetName(),
1212 upperSideShieldWithWindowS);
1213
1214 // volume medium
1215 TGeoMedium* upperSideShieldV_medium = pMedAluminium;
1216 if (upperSideShieldV_medium) {
1217 upperSideShieldV->SetMedium(upperSideShieldV_medium);
1218 } else
1219 Fatal("Main", "Invalid medium for upperSideShieldV!");
1220
1221 // volume visual property (transparency)
1222 upperSideShieldV->SetLineColor(TColor::GetColor("#ffcccc"));
1223 upperSideShieldV->SetTransparency(50);
1224
1225 TGeoCombiTrans* upperSideShield_transf[4];
1226
1227 upperSideShield_transf[0] = new TGeoCombiTrans();
1228 upperSideShield_transf[0]->RotateY(90.0);
1229 upperSideShield_transf[0]->SetDx(+(frontPlaneWithWindow_XSize * 0.5 - upperSideShield_ZSize * 0.5));
1230 upperSideShield_transf[0]->SetDy(+(17.6 + upperSideShield_YSize * 0.5));
1231 upperSideShield_transf[0]->SetDz(+0.695 /*center of half-plane*/ - 0.65 /*shift*/ + 4.31 /*half-plane shift*/);
1232
1233 upperSideShield_transf[1] = new TGeoCombiTrans();
1234 upperSideShield_transf[1]->RotateY(90.0);
1235 upperSideShield_transf[1]->SetDx(-(frontPlaneWithWindow_XSize * 0.5 - upperSideShield_ZSize * 0.5));
1236 upperSideShield_transf[1]->SetDy(+(17.6 + upperSideShield_YSize * 0.5));
1237 upperSideShield_transf[1]->SetDz(+0.695 /*center of half-plane*/ - 0.65 /*shift*/ + 4.31 /*half-plane shift*/);
1238
1239 upperSideShield_transf[2] = new TGeoCombiTrans();
1240 upperSideShield_transf[2]->RotateY(-90.0);
1241 upperSideShield_transf[2]->ReflectY(true);
1242 upperSideShield_transf[2]->SetDx(+(frontPlaneWithWindow_XSize * 0.5 - upperSideShield_ZSize * 0.5));
1243 upperSideShield_transf[2]->SetDy(-(17.6 + upperSideShield_YSize * 0.5));
1244 upperSideShield_transf[2]->SetDz(+0.695 /*center of half-plane*/ + 0.65 /*shift*/);
1245
1246 upperSideShield_transf[3] = new TGeoCombiTrans();
1247 upperSideShield_transf[3]->RotateY(-90.0);
1248 upperSideShield_transf[3]->ReflectY(true);
1249 upperSideShield_transf[3]->SetDx(-(frontPlaneWithWindow_XSize * 0.5 - upperSideShield_ZSize * 0.5));
1250 upperSideShield_transf[3]->SetDy(-(17.6 + upperSideShield_YSize * 0.5));
1251 upperSideShield_transf[3]->SetDz(+0.695 /*center of half-plane*/ + 0.65 /*shift*/);
1252
1253 frames->AddNode(upperSideShieldV, 0, upperSideShield_transf[0]);
1254 frames->AddNode(upperSideShieldV, 1, upperSideShield_transf[1]);
1255 frames->AddNode(upperSideShieldV, 2, upperSideShield_transf[2]);
1256 frames->AddNode(upperSideShieldV, 3, upperSideShield_transf[3]);
1257 //----------------------------------------------------------------------
1258
1259 // upper side shield cover----------------------------------------------
1260 Double_t upperSideShieldCover_XSize = 4.4; // cm
1261 Double_t upperSideShieldCover_YSize = 8.5; // cm
1262 Double_t upperSideShieldCover_ZSize = 0.15; // cm
1263
1264 TGeoShape* upperSideShieldCoverS =
1265 new TGeoBBox("upperSideShieldCoverS", upperSideShieldCover_XSize * 0.5, upperSideShieldCover_YSize * 0.5,
1266 upperSideShieldCover_ZSize * 0.5);
1267
1268 TGeoVolume* upperSideShieldCoverV = new TGeoVolume(
1269 TString("upperSideShieldCoverV") += TString("_") + station->GetName(), upperSideShieldCoverS);
1270
1271 // volume medium
1272 TGeoMedium* upperSideShieldCoverV_medium = pMedAluminium;
1273 if (upperSideShieldCoverV_medium) {
1274 upperSideShieldCoverV->SetMedium(upperSideShieldCoverV_medium);
1275 } else
1276 Fatal("Main", "Invalid medium for upperSideShieldCoverV!");
1277
1278 // volume visual property (transparency)
1279 upperSideShieldCoverV->SetLineColor(TColor::GetColor("#ffcccc"));
1280 upperSideShieldCoverV->SetTransparency(10);
1281
1282 TGeoCombiTrans* upperSideShieldCover_transf[4];
1283
1284 upperSideShieldCover_transf[0] = new TGeoCombiTrans();
1285 upperSideShieldCover_transf[0]->RotateY(90.0);
1286 upperSideShieldCover_transf[0]->SetDx(+(frontPlaneWithWindow_XSize * 0.5 + upperSideShieldCover_ZSize * 0.5));
1287 upperSideShieldCover_transf[0]->SetDy(+(20.7 + upperSideShieldCover_YSize * 0.5));
1288 upperSideShieldCover_transf[0]->SetDz(
1289 +0.695 /*center of half-plane*/ - 0.65 /*shift*/ + 4.31 /*half-plane shift*/);
1290
1291 upperSideShieldCover_transf[1] = new TGeoCombiTrans();
1292 upperSideShieldCover_transf[1]->RotateY(90.0);
1293 upperSideShieldCover_transf[1]->SetDx(-(frontPlaneWithWindow_XSize * 0.5 + upperSideShieldCover_ZSize * 0.5));
1294 upperSideShieldCover_transf[1]->SetDy(+(20.7 + upperSideShieldCover_YSize * 0.5));
1295 upperSideShieldCover_transf[1]->SetDz(
1296 +0.695 /*center of half-plane*/ - 0.65 /*shift*/ + 4.31 /*half-plane shift*/);
1297
1298 upperSideShieldCover_transf[2] = new TGeoCombiTrans();
1299 upperSideShieldCover_transf[2]->RotateY(90.0);
1300 upperSideShieldCover_transf[2]->SetDx(+(frontPlaneWithWindow_XSize * 0.5 + upperSideShieldCover_ZSize * 0.5));
1301 upperSideShieldCover_transf[2]->SetDy(-(20.7 + upperSideShieldCover_YSize * 0.5));
1302 upperSideShieldCover_transf[2]->SetDz(+0.695 /*center of half-plane*/ + 0.65 /*shift*/);
1303
1304 upperSideShieldCover_transf[3] = new TGeoCombiTrans();
1305 upperSideShieldCover_transf[3]->RotateY(90.0);
1306 upperSideShieldCover_transf[3]->SetDx(-(frontPlaneWithWindow_XSize * 0.5 + upperSideShieldCover_ZSize * 0.5));
1307 upperSideShieldCover_transf[3]->SetDy(-(20.7 + upperSideShieldCover_YSize * 0.5));
1308 upperSideShieldCover_transf[3]->SetDz(+0.695 /*center of half-plane*/ + 0.65 /*shift*/);
1309
1310 frames->AddNode(upperSideShieldCoverV, 0, upperSideShieldCover_transf[0]);
1311 frames->AddNode(upperSideShieldCoverV, 1, upperSideShieldCover_transf[1]);
1312 frames->AddNode(upperSideShieldCoverV, 2, upperSideShieldCover_transf[2]);
1313 frames->AddNode(upperSideShieldCoverV, 3, upperSideShieldCover_transf[3]);
1314 //----------------------------------------------------------------------
1315
1316 station->AddNode(frames, 0, new TGeoCombiTrans());
1317
1318 //----------------------------------------------------------------------
1319
1320 TGeoCombiTrans* station_transform = new TGeoCombiTrans();
1321 if (istation == 1)
1322 station_transform->RotateZ(+2.5);
1323 station_transform->SetTranslation(XStationPositions[istation], YStationPositions[istation],
1324 ZStationPositions[istation]);
1325
1326 SILICON->AddNode(station, 0, station_transform);
1327 }
1328
1329 top->AddNode(SILICON, 0);
1330 top->SetVisContainers(kTRUE);
1331
1332 // --------------- Finish -----------------------------------------------
1333 gGeoMan->CloseGeometry();
1334 gGeoMan->CheckOverlaps(0.0001);
1335 gGeoMan->PrintOverlaps();
1336 gGeoMan->Test();
1337
1338 TFile* geoFile = new TFile(geoFileName, "RECREATE");
1339 top->Write();
1340 geoFile->Close();
1341 top->Draw("ogl");
1342}
1343//------------------------------------------------------------------------------
1344
1346{
1347
1348 TGeoVolume* stationA = new TGeoVolumeAssembly(station_name);
1349 stationA->SetMedium(pMedAir);
1350
1351 return stationA;
1352}
1353
1354TGeoVolume* CreateModule(TString module_name, ModuleType module_type)
1355{
1356
1357 // Shapes -------------------------------------------------------------------
1358 // module shape
1359 TGeoShape* moduleS = 0;
1360
1361 switch (module_type) {
1362 case RIGHT_ANGLED_MODULE: {
1363 moduleS = new TGeoBBox("moduleS", XModuleSize * 0.5, YModuleSize * 0.5, ZModuleSize * 0.5);
1364 break;
1365 }
1367 moduleS = new TGeoBBox("moduleS", XModuleSize * 0.5, YModuleSizeUpperPart * 0.5, ZModuleSize * 0.5);
1368 break;
1369 }
1370 case BEVEL_MODULE: {
1371 moduleS = new TGeoXtru(2);
1372 moduleS->SetName("moduleS");
1373 Double_t x_pos[5] = {+XModuleSize * 0.5, -XModuleSize * 0.5, -XModuleSize * 0.5,
1374 +XModuleSize * 0.5 - XBevelSize, +XModuleSize * 0.5};
1375 Double_t y_pos[5] = {+YModuleSize * 0.5, +YModuleSize * 0.5, -YModuleSize * 0.5, -YModuleSize * 0.5,
1376 -YModuleSize * 0.5 + YBevelSize};
1377 ((TGeoXtru*)moduleS)->DefinePolygon(5, x_pos, y_pos);
1378 ((TGeoXtru*)moduleS)->DefineSection(0, -ZModuleSize * 0.5);
1379 ((TGeoXtru*)moduleS)->DefineSection(1, +ZModuleSize * 0.5);
1380 break;
1381 }
1382 case BEVEL_MODULE_HALF: {
1383 moduleS = new TGeoXtru(2);
1384 moduleS->SetName("moduleS");
1385 Double_t x_pos[5] = {+XModuleSize * 0.5, -XModuleSize * 0.5, -XModuleSize * 0.5,
1386 +XModuleSize * 0.5 - XBevelSize, +XModuleSize * 0.5};
1389 ((TGeoXtru*)moduleS)->DefinePolygon(5, x_pos, y_pos);
1390 ((TGeoXtru*)moduleS)->DefineSection(0, -ZModuleSize * 0.5);
1391 ((TGeoXtru*)moduleS)->DefineSection(1, +ZModuleSize * 0.5);
1392 break;
1393 }
1394 default:
1395 Error("CreateModule()", "Incorrect module type selected!!!");
1396 }
1397
1398 // sensor zone shape (upper part of the module: rectangle zone)
1399 TGeoShape* sensor_zone_upper_part_rectS = new TGeoBBox("sensor_zone_upper_part_rectS", XSensorZoneSize * 0.5,
1401
1402 // sensor zone shape (upper part of the module: bevel zone)
1403 TGeoShape* sensor_zone_upper_part_bevelS = new TGeoXtru(2);
1404 sensor_zone_upper_part_bevelS->SetName("sensor_zone_upper_part_bevelS");
1405 // Calculate coordinates of the bottom and the top points of the inner bevel
1406 {
1407 // find x and y projections of the bevel border thickness
1410
1411 // find shifts of the sensetive zone from module borders via the equation of the straight line for the inner
1412 // bevel
1413 Double_t x_delta_top_BP = XLeftBorder;
1414 Double_t y_delta_top_BP =
1415 TMath::Tan(TMath::PiOver2() + BevelAngleRad) * x_delta_top_BP + (YBevelSize + y_delta);
1416
1417 Double_t y_delta_bottom_BP = YMiddleBorderUpperPart;
1418 Double_t x_delta_bottom_BP =
1419 (y_delta_bottom_BP - (YBevelSize + y_delta)) / (TMath::Tan(TMath::PiOver2() + BevelAngleRad));
1420 //----------------------------------------------------------------------
1421
1422 Double_t x_pos_sensor_zone_bevel[5] = {
1424 +XModuleSize * 0.5 - x_delta_bottom_BP, +XModuleSize * 0.5 - XLeftBorder};
1425 Double_t y_pos_sensor_zone_bevel[5] = {
1428 -YModuleSizeUpperPart * 0.5 + y_delta_top_BP};
1429
1430 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefinePolygon(5, x_pos_sensor_zone_bevel, y_pos_sensor_zone_bevel);
1431 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefineSection(0, -ZModuleSize * 0.5);
1432 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefineSection(1, +ZModuleSize * 0.5);
1433 }
1434
1435 // sensor zone shape (lower part of the module: rectangle zone)
1436 TGeoShape* sensor_zone_lower_part_rectS = new TGeoBBox("sensor_zone_lower_part_rectS", XSensorZoneSize * 0.5,
1438
1439 // sensor zone shape (lower part of the module: bevel zone)
1440 TGeoShape* sensor_zone_lower_part_bevelS = new TGeoXtru(2);
1441 sensor_zone_lower_part_bevelS->SetName("sensor_zone_lower_part_bevelS");
1442 // Calculate coordinates of the bottom and the top points of the inner bevel
1443 {
1444 // find x and y projections of the bevel border thickness
1447
1448 // find shifts of the sensitive zone from module borders via the equation of the straight line for the inner
1449 // bevel
1450 Double_t x_delta_top_BP = XLeftBorder;
1451 Double_t y_delta_top_BP =
1452 TMath::Tan(TMath::PiOver2() + BevelAngleRad) * x_delta_top_BP + (YBevelSize + y_delta);
1453
1454 Double_t y_delta_bottom_BP = YBottomBorder;
1455 Double_t x_delta_bottom_BP =
1456 (y_delta_bottom_BP - (YBevelSize + y_delta)) / (TMath::Tan(TMath::PiOver2() + BevelAngleRad));
1457 //----------------------------------------------------------------------
1458
1459 Double_t x_pos_sensor_zone_bevel[5] = {
1461 +XModuleSize * 0.5 - x_delta_bottom_BP, +XModuleSize * 0.5 - XLeftBorder};
1462 Double_t y_pos_sensor_zone_bevel[5] = {
1465 -YModuleSizeLowerPart * 0.5 + y_delta_top_BP};
1466
1467 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefinePolygon(5, x_pos_sensor_zone_bevel, y_pos_sensor_zone_bevel);
1468 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefineSection(0, -ZModuleSize * 0.5);
1469 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefineSection(1, +ZModuleSize * 0.5);
1470 }
1471
1472 //--------------------------------------------------------------------------
1473
1474 // Volumes ------------------------------------------------------------------
1475 // module volume
1476 // TString module_name = "moduleV_";
1477
1478 TGeoVolume* moduleV = new TGeoVolume(module_name, moduleS);
1479
1480 // sensor zone volume (upper part of the module)
1481 TGeoVolume* sensor_zone_upper_part_rectV =
1482 new TGeoVolume("Sensor_zone_upper_part_rectV", sensor_zone_upper_part_rectS);
1483
1484 // sensor zone volume (lower part of the module)
1485 TGeoVolume* sensor_zone_upper_part_bevelV =
1486 new TGeoVolume("Sensor_zone_upper_part_bevelV", sensor_zone_upper_part_bevelS);
1487
1488 // sensor zone volume (lower part of the module: rectangle zone)
1489 TGeoVolume* sensor_zone_lower_part_rectV =
1490 new TGeoVolume("Sensor_zone_lower_part_rectV", sensor_zone_lower_part_rectS);
1491
1492 // sensor zone volume (lower part of the module: bevel zone)
1493 TGeoVolume* sensor_zone_lower_part_bevelV =
1494 new TGeoVolume("Sensor_zone_lower_part_bevelV", sensor_zone_lower_part_bevelS);
1495
1496 // volumes media
1497 TGeoMedium* silicon_medium = pMedSilicon;
1498 if (silicon_medium) {
1499 moduleV->SetMedium(silicon_medium);
1500 sensor_zone_upper_part_rectV->SetMedium(silicon_medium);
1501 sensor_zone_upper_part_bevelV->SetMedium(silicon_medium);
1502 sensor_zone_lower_part_rectV->SetMedium(silicon_medium);
1503 sensor_zone_lower_part_bevelV->SetMedium(silicon_medium);
1504 } else
1505 Fatal("Main", "Invalid medium for modules and sensor zones!");
1506
1507 // volumes visual property (transparency)
1508 moduleV->SetLineColor(TColor::GetColor("#ff47ca"));
1509 sensor_zone_upper_part_rectV->SetLineColor(TColor::GetColor("#e0b0ff"));
1510 sensor_zone_upper_part_bevelV->SetLineColor(TColor::GetColor("#e0b0ff"));
1511 sensor_zone_lower_part_rectV->SetLineColor(TColor::GetColor("#e0b0ff"));
1512 sensor_zone_lower_part_bevelV->SetLineColor(TColor::GetColor("#e0b0ff"));
1513 moduleV->SetTransparency(50);
1514
1515 switch (module_type) {
1516
1517 case RIGHT_ANGLED_MODULE: {
1518
1519 // position of the sensor zone in the upper part of the module
1520 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
1521 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder + XRightBorder) * 0.5 - XLeftBorder);
1522 sensor_zone_upper_part_pos->SetDy(+YSensorZoneSizeUpperPart * 0.5 + YGapBetweenPartsOfModule * 0.5
1524 sensor_zone_upper_part_pos->SetDz(0.0);
1525
1526 // position of the sensor zone in the lower part of the module
1527 TGeoTranslation* sensor_zone_lower_part_pos = new TGeoTranslation();
1528 sensor_zone_lower_part_pos->SetDx(+(XLeftBorder + XRightBorder) * 0.5 - XLeftBorder);
1529 sensor_zone_lower_part_pos->SetDy(-YSensorZoneSizeLowerPart * 0.5 - YGapBetweenPartsOfModule * 0.5
1531 sensor_zone_lower_part_pos->SetDz(0.0);
1532
1533 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
1534 moduleV->AddNode(sensor_zone_lower_part_rectV, 0, sensor_zone_lower_part_pos);
1535 break;
1536 }
1537
1539 // position of the sensor zone in the upper part of the module
1540 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
1541 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder + XRightBorder) * 0.5 - XLeftBorder);
1542 sensor_zone_upper_part_pos->SetDy(+(YTopBorder + YMiddleBorderUpperPart) * 0.5 - YTopBorder);
1543 sensor_zone_upper_part_pos->SetDz(0.0);
1544
1545 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
1546 break;
1547 }
1548
1549 case BEVEL_MODULE: {
1550
1551 // position of the sensor zone in the upper part of the module
1552 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
1553 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder + XRightBorder) * 0.5 - XLeftBorder);
1554 sensor_zone_upper_part_pos->SetDy(+YSensorZoneSizeUpperPart * 0.5 + YGapBetweenPartsOfModule * 0.5
1556 sensor_zone_upper_part_pos->SetDz(0.0);
1557
1558 // position of the sensor zone in the lower part of the module
1559 TGeoTranslation* sensor_zone_lower_part_bevel_pos = new TGeoTranslation();
1560 sensor_zone_lower_part_bevel_pos->SetDx(0.0);
1561 sensor_zone_lower_part_bevel_pos->SetDy(-YModuleSizeLowerPart * 0.5 - YGapBetweenPartsOfModule * 0.5
1563 sensor_zone_lower_part_bevel_pos->SetDz(0.0);
1564
1565 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
1566 moduleV->AddNode(sensor_zone_lower_part_bevelV, 0, sensor_zone_lower_part_bevel_pos);
1567 break;
1568 }
1569
1570 case BEVEL_MODULE_HALF: {
1571
1572 // position of the sensor zone in the upper part of the module
1573 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
1574 sensor_zone_upper_part_pos->SetDx(0);
1575 sensor_zone_upper_part_pos->SetDy(0);
1576 sensor_zone_upper_part_pos->SetDz(0.0);
1577
1578 moduleV->AddNode(sensor_zone_upper_part_bevelV, 0, sensor_zone_upper_part_pos);
1579 break;
1580 }
1581
1582 default:
1583 Error("CreateModule()", "Incorrect module type selected!!!");
1584 }
1585
1586 return moduleV;
1587}
1588
1589//------------------------------------------------------------------------------
1590
1592{
1593
1594 // Shapes -------------------------------------------------------------------
1595 // module shape
1596 TGeoShape* frameS = 0;
1597
1598 // frame margins for a basic si-module
1599 Double_t leftMargin = 0.1; // cm
1600 Double_t rightMargin = 0.4; // cm
1601 Double_t bottomMargin = 0.1; // cm
1602 Double_t topMargin = 5.0; // cm
1603
1604 switch (module_type) {
1605 case RIGHT_ANGLED_MODULE: {
1606 // frameS = new TGeoBBox("frameS", XModuleSize*0.5, YModuleSize*0.5, ZModuleFrameSize*0.5);
1607 frameS = new TGeoXtru(2);
1608 frameS->SetName(TString("frameS") += module_name);
1609 Double_t x_pos[12] = {
1610 +(XModuleSize * 0.5 + leftMargin) /*0*/, +(XModuleSize * 0.5 + leftMargin) /*1*/,
1611 +(XModuleSize * 0.5 + leftMargin + 1.0) /*2*/, +(XModuleSize * 0.5 + leftMargin + 1.0) /*3*/,
1612 +(XModuleSize * 0.5 + leftMargin) /*4*/, +(XModuleSize * 0.5 + leftMargin) /*5*/,
1613 -(XModuleSize * 0.5 + rightMargin) /*6*/, -(XModuleSize * 0.5 + rightMargin) /*7*/,
1614 -(XModuleSize * 0.5 + rightMargin + 1.0) /*8*/, -(XModuleSize * 0.5 + rightMargin + 1.0) /*9*/,
1615 -(XModuleSize * 0.5 + rightMargin) /*10*/, -(XModuleSize * 0.5 + rightMargin) /*11*/,
1616 };
1617 Double_t y_pos[12] = {
1618 -(YModuleSize * 0.5 + bottomMargin) /*0*/, +(YModuleSize * 0.5 - 1.6) /*1*/,
1619 +(YModuleSize * 0.5 - 0.5) /*2*/, +(YModuleSize * 0.5 + 5.0) /*3*/,
1620 +(YModuleSize * 0.5 + 5.0) /*4*/, +(YModuleSize * 0.5 + 9.0) /*5*/,
1621 +(YModuleSize * 0.5 + 9.0) /*6*/, +(YModuleSize * 0.5 + 5.0) /*7*/,
1622 +(YModuleSize * 0.5 + 5.0) /*8*/, +(YModuleSize * 0.5 - 0.5) /*9*/,
1623 +(YModuleSize * 0.5 - 1.6) /*10*/, -(YModuleSize * 0.5) /*11*/,
1624 };
1625 ((TGeoXtru*)frameS)->DefinePolygon(12, x_pos, y_pos);
1626 ((TGeoXtru*)frameS)->DefineSection(0, -ZModuleFrameSize * 0.5);
1627 ((TGeoXtru*)frameS)->DefineSection(1, +ZModuleFrameSize * 0.5);
1628 break;
1629 }
1631 // frameS = new TGeoBBox("frameS", XModuleSize*0.5, YModuleSizeUpperPart*0.5, ZModuleFrameSize*0.5);
1632 frameS = new TGeoXtru(2);
1633 frameS->SetName(TString("frameS") += module_name);
1634 Double_t x_pos[12] = {
1635 +(XModuleSize * 0.5 + leftMargin) /*0*/, +(XModuleSize * 0.5 + leftMargin) /*1*/,
1636 +(XModuleSize * 0.5 + leftMargin + 1.0) /*2*/, +(XModuleSize * 0.5 + leftMargin + 1.0) /*3*/,
1637 +(XModuleSize * 0.5 + leftMargin) /*4*/, +(XModuleSize * 0.5 + leftMargin) /*5*/,
1638 -(XModuleSize * 0.5 + rightMargin) /*6*/, -(XModuleSize * 0.5 + rightMargin) /*7*/,
1639 -(XModuleSize * 0.5 + rightMargin + 1.0) /*8*/, -(XModuleSize * 0.5 + rightMargin + 1.0) /*9*/,
1640 -(XModuleSize * 0.5 + rightMargin) /*10*/, -(XModuleSize * 0.5 + rightMargin) /*11*/,
1641 };
1642 Double_t y_pos[12] = {
1643 -(YModuleSizeUpperPart * 0.5 + bottomMargin) /*0*/, +(YModuleSizeUpperPart * 0.5 - 1.6) /*1*/,
1644 +(YModuleSizeUpperPart * 0.5 - 0.5) /*2*/, +(YModuleSizeUpperPart * 0.5 + 5.0) /*3*/,
1645 +(YModuleSizeUpperPart * 0.5 + 5.0) /*4*/, +(YModuleSizeUpperPart * 0.5 + 9.0) /*5*/,
1646 +(YModuleSizeUpperPart * 0.5 + 9.0) /*6*/, +(YModuleSizeUpperPart * 0.5 + 5.0) /*7*/,
1647 +(YModuleSizeUpperPart * 0.5 + 5.0) /*8*/, +(YModuleSizeUpperPart * 0.5 - 0.5) /*9*/,
1648 +(YModuleSizeUpperPart * 0.5 - 1.6) /*10*/, -(YModuleSizeUpperPart * 0.5) /*11*/,
1649 };
1650 ((TGeoXtru*)frameS)->DefinePolygon(12, x_pos, y_pos);
1651 ((TGeoXtru*)frameS)->DefineSection(0, -ZModuleFrameSize * 0.5);
1652 ((TGeoXtru*)frameS)->DefineSection(1, +ZModuleFrameSize * 0.5);
1653 break;
1654 }
1655 case BEVEL_MODULE: {
1656 frameS = new TGeoXtru(2);
1657 frameS->SetName(TString("frameS") += module_name);
1658 Double_t x_pos[13] = {
1659 +(XModuleSize * 0.5 - XBevelSize + leftMargin) /*0*/,
1660 +(XModuleSize * 0.5 + leftMargin) /*1*/,
1661 +(XModuleSize * 0.5 + leftMargin) /*2*/,
1662 +(XModuleSize * 0.5 + leftMargin + 1.0) /*3*/,
1663 +(XModuleSize * 0.5 + leftMargin + 1.0) /*4*/,
1664 +(XModuleSize * 0.5 + leftMargin) /*5*/,
1665 +(XModuleSize * 0.5 + leftMargin) /*6*/,
1666 -(XModuleSize * 0.5 + rightMargin) /*7*/,
1667 -(XModuleSize * 0.5 + rightMargin) /*8*/,
1668 -(XModuleSize * 0.5 + rightMargin + 1.0) /*9*/,
1669 -(XModuleSize * 0.5 + rightMargin + 1.0) /*10*/,
1670 -(XModuleSize * 0.5 + rightMargin) /*11*/,
1671 -(XModuleSize * 0.5 + rightMargin) /*12*/,
1672 };
1673 Double_t y_pos[13] = {
1674 -(YModuleSize * 0.5 + bottomMargin) /*0*/,
1675 -(YModuleSize * 0.5 - YBevelSize + bottomMargin) /*1*/,
1676 +(YModuleSize * 0.5 - 1.6) /*2*/,
1677 +(YModuleSize * 0.5 - 0.5) /*3*/,
1678 +(YModuleSize * 0.5 + 5.0) /*4*/,
1679 +(YModuleSize * 0.5 + 5.0) /*5*/,
1680 +(YModuleSize * 0.5 + 9.0) /*6*/,
1681 +(YModuleSize * 0.5 + 9.0) /*7*/,
1682 +(YModuleSize * 0.5 + 5.0) /*8*/,
1683 +(YModuleSize * 0.5 + 5.0) /*9*/,
1684 +(YModuleSize * 0.5 - 0.5) /*10*/,
1685 +(YModuleSize * 0.5 - 1.6) /*11*/,
1686 -(YModuleSize * 0.5) /*12*/,
1687 };
1688 ((TGeoXtru*)frameS)->DefinePolygon(13, x_pos, y_pos);
1689 ((TGeoXtru*)frameS)->DefineSection(0, -ZModuleFrameSize * 0.5);
1690 ((TGeoXtru*)frameS)->DefineSection(1, +ZModuleFrameSize * 0.5);
1691 break;
1692 }
1693 case BEVEL_MODULE_HALF: {
1694 frameS = new TGeoXtru(2);
1695 frameS->SetName(TString("frameS") += module_name);
1696 Double_t x_pos[13] = {
1697 +(XModuleSize * 0.5 - XBevelSize + leftMargin) /*0*/,
1698 +(XModuleSize * 0.5 + leftMargin) /*1*/,
1699 +(XModuleSize * 0.5 + leftMargin) /*2*/,
1700 +(XModuleSize * 0.5 + leftMargin + 1.0) /*3*/,
1701 +(XModuleSize * 0.5 + leftMargin + 1.0) /*4*/,
1702 +(XModuleSize * 0.5 + leftMargin) /*5*/,
1703 +(XModuleSize * 0.5 + leftMargin) /*6*/,
1704 -(XModuleSize * 0.5 + rightMargin) /*7*/,
1705 -(XModuleSize * 0.5 + rightMargin) /*8*/,
1706 -(XModuleSize * 0.5 + rightMargin + 1.0) /*9*/,
1707 -(XModuleSize * 0.5 + rightMargin + 1.0) /*10*/,
1708 -(XModuleSize * 0.5 + rightMargin) /*11*/,
1709 -(XModuleSize * 0.5 + rightMargin) /*12*/,
1710 };
1711 Double_t y_pos[13] = {
1712 -(YModuleSizeUpperPart * 0.5 + bottomMargin) /*0*/,
1713 -(YModuleSizeUpperPart * 0.5 - YBevelSize + bottomMargin) /*1*/,
1714 +(YModuleSizeUpperPart * 0.5 - 1.6) /*2*/,
1715 +(YModuleSizeUpperPart * 0.5 - 0.5) /*3*/,
1716 +(YModuleSizeUpperPart * 0.5 + 5.0) /*4*/,
1717 +(YModuleSizeUpperPart * 0.5 + 5.0) /*5*/,
1718 +(YModuleSizeUpperPart * 0.5 + 9.0) /*6*/,
1719 +(YModuleSizeUpperPart * 0.5 + 9.0) /*7*/,
1720 +(YModuleSizeUpperPart * 0.5 + 5.0) /*8*/,
1721 +(YModuleSizeUpperPart * 0.5 + 5.0) /*9*/,
1722 +(YModuleSizeUpperPart * 0.5 - 0.5) /*10*/,
1723 +(YModuleSizeUpperPart * 0.5 - 1.6) /*11*/,
1724 -(YModuleSizeUpperPart * 0.5) /*12*/,
1725 };
1726 ((TGeoXtru*)frameS)->DefinePolygon(13, x_pos, y_pos);
1727 ((TGeoXtru*)frameS)->DefineSection(0, -ZModuleFrameSize * 0.5);
1728 ((TGeoXtru*)frameS)->DefineSection(1, +ZModuleFrameSize * 0.5);
1729 break;
1730 }
1731 default:
1732 Error("CreateModule()", "Incorrect module type selected!!!");
1733 }
1734
1735 Double_t innerMargin = 0.5; // cm, frame inner margin from edge of sens.
1736
1737 // rectangle window of the frame
1738 TGeoShape* window_rectS =
1739 new TGeoBBox(TString("window_rectS") += module_name, (XModuleSize - innerMargin * 2) * 0.5,
1740 (YModuleSize * 0.5 - innerMargin * 2) * 0.5, (ZModuleFrameSize + 0.001) * 0.5);
1741
1742 // bevel window of the frame
1743 TGeoShape* window_bevelS = new TGeoXtru(2);
1744 window_bevelS->SetName(TString("window_bevelS") += module_name);
1745 // Calculate coordinates of the bottom and the top points of the inner bevel
1746 {
1747 // find x and y projections of the bevel border thickness
1748 Double_t x_delta = innerMargin / TMath::Cos(BevelAngleRad);
1749 Double_t y_delta = innerMargin / TMath::Sin(BevelAngleRad);
1750
1751 // find shifts of the sensitive zone from module borders via the equation of the straight line for the inner
1752 // bevel
1753 Double_t x_delta_top_BP = innerMargin;
1754 Double_t y_delta_top_BP =
1755 TMath::Tan(TMath::PiOver2() + BevelAngleRad) * x_delta_top_BP + (YBevelSize + y_delta);
1756
1757 Double_t y_delta_bottom_BP = innerMargin;
1758 Double_t x_delta_bottom_BP =
1759 (y_delta_bottom_BP - (YBevelSize + y_delta)) / (TMath::Tan(TMath::PiOver2() + BevelAngleRad));
1760 //----------------------------------------------------------------------
1761
1762 Double_t x_pos[5] = {+XModuleSize * 0.5 - innerMargin, -XModuleSize * 0.5 + innerMargin,
1763 -XModuleSize * 0.5 + innerMargin, +XModuleSize * 0.5 - x_delta_bottom_BP,
1764 +XModuleSize * 0.5 - innerMargin};
1765 Double_t y_pos[5] = {+YModuleSize * 0.25 - innerMargin, +YModuleSize * 0.25 - innerMargin,
1766 -YModuleSize * 0.25 + innerMargin, -YModuleSize * 0.25 + innerMargin,
1767 -YModuleSize * 0.25 + y_delta_top_BP};
1768
1769 ((TGeoXtru*)window_bevelS)->DefinePolygon(5, x_pos, y_pos);
1770 ((TGeoXtru*)window_bevelS)->DefineSection(0, -(ZModuleFrameSize + 0.001) * 0.5);
1771 ((TGeoXtru*)window_bevelS)->DefineSection(1, +(ZModuleFrameSize + 0.001) * 0.5);
1772 }
1773
1774 // translations
1775 TGeoTranslation* upper_window_frame_pos = new TGeoTranslation();
1776 upper_window_frame_pos->SetName(TString("upper_window_frame_pos") += module_name);
1777 upper_window_frame_pos->SetDx(0.0);
1778 upper_window_frame_pos->SetDy(+YSensorZoneSizeUpperPart * 0.5 + YGapBetweenPartsOfModule * 0.5
1780 upper_window_frame_pos->SetDz(0.0);
1781 upper_window_frame_pos->RegisterYourself();
1782
1783 TGeoTranslation* lower_window_frame_pos = new TGeoTranslation();
1784 lower_window_frame_pos->SetName(TString("lower_window_frame_pos") += module_name);
1785 lower_window_frame_pos->SetDx(0.0);
1786 lower_window_frame_pos->SetDy(-YSensorZoneSizeLowerPart * 0.5 - YGapBetweenPartsOfModule * 0.5
1788 lower_window_frame_pos->SetDz(0.0);
1789 lower_window_frame_pos->RegisterYourself();
1790
1791 TGeoTranslation* window_half_frame_pos = new TGeoTranslation();
1792 window_half_frame_pos->SetName(TString("window_half_frame_pos") += module_name);
1793 window_half_frame_pos->SetDx(0.0);
1794 window_half_frame_pos->SetDy(0.0);
1795 window_half_frame_pos->SetDz(0.0);
1796 window_half_frame_pos->RegisterYourself();
1797
1798 TGeoCompositeShape* frame_with_windowsS = new TGeoCompositeShape();
1799 frame_with_windowsS->SetName("frame_with_windowsS");
1800
1801 switch (module_type) {
1802
1803 case RIGHT_ANGLED_MODULE: {
1804 TString expression = "(frameS";
1805 expression += module_name;
1806 expression += "-window_rectS";
1807 expression += module_name;
1808 expression += ":upper_window_frame_pos";
1809 expression += module_name;
1810 expression += ")-window_rectS";
1811 expression += module_name;
1812 expression += ":lower_window_frame_pos";
1813 expression += module_name;
1814 frame_with_windowsS->MakeNode(expression);
1815 frame_with_windowsS->ComputeBBox();
1816 break;
1817 }
1818
1820 TString expression = "(frameS";
1821 expression += module_name;
1822 expression += ")-window_rectS";
1823 expression += module_name;
1824 expression += ":window_half_frame_pos";
1825 expression += module_name;
1826 frame_with_windowsS->MakeNode(expression);
1827 frame_with_windowsS->ComputeBBox();
1828 break;
1829 }
1830
1831 case BEVEL_MODULE: {
1832 TString expression = "(frameS";
1833 expression += module_name;
1834 expression += "-window_rectS";
1835 expression += module_name;
1836 expression += ":upper_window_frame_pos";
1837 expression += module_name;
1838 expression += ")-window_bevelS";
1839 expression += module_name;
1840 expression += ":lower_window_frame_pos";
1841 expression += module_name;
1842 frame_with_windowsS->MakeNode(expression);
1843 frame_with_windowsS->ComputeBBox();
1844 break;
1845 }
1846
1847 case BEVEL_MODULE_HALF: {
1848 TString expression = "(frameS";
1849 expression += module_name;
1850 expression += ")-window_bevelS";
1851 expression += module_name;
1852 expression += ":window_half_frame_pos";
1853 expression += module_name;
1854 frame_with_windowsS->MakeNode(expression);
1855 frame_with_windowsS->ComputeBBox();
1856 break;
1857 }
1858
1859 default:
1860 Error("CreateModule()", "Incorrect module type selected!!!");
1861 }
1862 //--------------------------------------------------------------------------
1863
1864 // Volumes ------------------------------------------------------------------
1865 // module frame volume
1866 TGeoVolume* frameV = new TGeoVolume(module_name, frame_with_windowsS);
1867
1868 // volumes media
1869 TGeoMedium* carbon_medium = pMedCarbon;
1870 if (carbon_medium) {
1871 frameV->SetMedium(carbon_medium);
1872 } else
1873 Fatal("Main", "Invalid medium for frameV!");
1874
1875 // volumes visual property (transparency)
1876 frameV->SetLineColor(TColor::GetColor("#cccccc"));
1877 frameV->SetTransparency(0);
1878
1879 return frameV;
1880}
const Int_t NModulesInStations[NStations]
bool Bool_t
int Int_t
double Double_t
constexpr Bool_t kTRUE
ModuleType
@ BEVEL_MODULE
@ RIGHT_ANGLED_MODULE_HALF
@ RIGHT_ANGLED_MODULE
const Bool_t ModulesYRotations[NStations][NMaxModules]
const ModuleType ModulesTypes[NStations][NMaxModules]
const Bool_t ModulesXRotations[NStations][NMaxModules]
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 RotateZ(Double_t angle) 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]
TGeoVolume * CreateModuleFrame(TString module_name, ModuleType module_type)
TGeoVolume * CreateModule(TString module_name, ModuleType module_type)
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()