BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_Silicon_Run8_3stations_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_3stations_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 station_transform->SetTranslation(XStationPositions[istation], YStationPositions[istation],
1322 ZStationPositions[istation]);
1323
1324 SILICON->AddNode(station, 0, station_transform);
1325 }
1326
1327 top->AddNode(SILICON, 0);
1328 top->SetVisContainers(kTRUE);
1329
1330 // --------------- Finish -----------------------------------------------
1331 gGeoMan->CloseGeometry();
1332 gGeoMan->CheckOverlaps(0.0001);
1333 gGeoMan->PrintOverlaps();
1334 gGeoMan->Test();
1335
1336 TFile* geoFile = new TFile(geoFileName, "RECREATE");
1337 top->Write();
1338 geoFile->Close();
1339 top->Draw("ogl");
1340}
1341//------------------------------------------------------------------------------
1342
1344{
1345
1346 TGeoVolume* stationA = new TGeoVolumeAssembly(station_name);
1347 stationA->SetMedium(pMedAir);
1348
1349 return stationA;
1350}
1351
1352TGeoVolume* CreateModule(TString module_name, ModuleType module_type)
1353{
1354
1355 // Shapes -------------------------------------------------------------------
1356 // module shape
1357 TGeoShape* moduleS = 0;
1358
1359 switch (module_type) {
1360 case RIGHT_ANGLED_MODULE: {
1361 moduleS = new TGeoBBox("moduleS", XModuleSize * 0.5, YModuleSize * 0.5, ZModuleSize * 0.5);
1362 break;
1363 }
1365 moduleS = new TGeoBBox("moduleS", XModuleSize * 0.5, YModuleSizeUpperPart * 0.5, ZModuleSize * 0.5);
1366 break;
1367 }
1368 case BEVEL_MODULE: {
1369 moduleS = new TGeoXtru(2);
1370 moduleS->SetName("moduleS");
1371 Double_t x_pos[5] = {+XModuleSize * 0.5, -XModuleSize * 0.5, -XModuleSize * 0.5,
1372 +XModuleSize * 0.5 - XBevelSize, +XModuleSize * 0.5};
1373 Double_t y_pos[5] = {+YModuleSize * 0.5, +YModuleSize * 0.5, -YModuleSize * 0.5, -YModuleSize * 0.5,
1374 -YModuleSize * 0.5 + YBevelSize};
1375 ((TGeoXtru*)moduleS)->DefinePolygon(5, x_pos, y_pos);
1376 ((TGeoXtru*)moduleS)->DefineSection(0, -ZModuleSize * 0.5);
1377 ((TGeoXtru*)moduleS)->DefineSection(1, +ZModuleSize * 0.5);
1378 break;
1379 }
1380 case BEVEL_MODULE_HALF: {
1381 moduleS = new TGeoXtru(2);
1382 moduleS->SetName("moduleS");
1383 Double_t x_pos[5] = {+XModuleSize * 0.5, -XModuleSize * 0.5, -XModuleSize * 0.5,
1384 +XModuleSize * 0.5 - XBevelSize, +XModuleSize * 0.5};
1387 ((TGeoXtru*)moduleS)->DefinePolygon(5, x_pos, y_pos);
1388 ((TGeoXtru*)moduleS)->DefineSection(0, -ZModuleSize * 0.5);
1389 ((TGeoXtru*)moduleS)->DefineSection(1, +ZModuleSize * 0.5);
1390 break;
1391 }
1392 default:
1393 Error("CreateModule()", "Incorrect module type selected!!!");
1394 }
1395
1396 // sensor zone shape (upper part of the module: rectangle zone)
1397 TGeoShape* sensor_zone_upper_part_rectS = new TGeoBBox("sensor_zone_upper_part_rectS", XSensorZoneSize * 0.5,
1399
1400 // sensor zone shape (upper part of the module: bevel zone)
1401 TGeoShape* sensor_zone_upper_part_bevelS = new TGeoXtru(2);
1402 sensor_zone_upper_part_bevelS->SetName("sensor_zone_upper_part_bevelS");
1403 // Calculate coordinates of the bottom and the top points of the inner bevel
1404 {
1405 // find x and y projections of the bevel border thickness
1408
1409 // find shifts of the sensetive zone from module borders via the equation of the straight line for the inner
1410 // bevel
1411 Double_t x_delta_top_BP = XLeftBorder;
1412 Double_t y_delta_top_BP =
1413 TMath::Tan(TMath::PiOver2() + BevelAngleRad) * x_delta_top_BP + (YBevelSize + y_delta);
1414
1415 Double_t y_delta_bottom_BP = YMiddleBorderUpperPart;
1416 Double_t x_delta_bottom_BP =
1417 (y_delta_bottom_BP - (YBevelSize + y_delta)) / (TMath::Tan(TMath::PiOver2() + BevelAngleRad));
1418 //----------------------------------------------------------------------
1419
1420 Double_t x_pos_sensor_zone_bevel[5] = {
1422 +XModuleSize * 0.5 - x_delta_bottom_BP, +XModuleSize * 0.5 - XLeftBorder};
1423 Double_t y_pos_sensor_zone_bevel[5] = {
1426 -YModuleSizeUpperPart * 0.5 + y_delta_top_BP};
1427
1428 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefinePolygon(5, x_pos_sensor_zone_bevel, y_pos_sensor_zone_bevel);
1429 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefineSection(0, -ZModuleSize * 0.5);
1430 ((TGeoXtru*)sensor_zone_upper_part_bevelS)->DefineSection(1, +ZModuleSize * 0.5);
1431 }
1432
1433 // sensor zone shape (lower part of the module: rectangle zone)
1434 TGeoShape* sensor_zone_lower_part_rectS = new TGeoBBox("sensor_zone_lower_part_rectS", XSensorZoneSize * 0.5,
1436
1437 // sensor zone shape (lower part of the module: bevel zone)
1438 TGeoShape* sensor_zone_lower_part_bevelS = new TGeoXtru(2);
1439 sensor_zone_lower_part_bevelS->SetName("sensor_zone_lower_part_bevelS");
1440 // Calculate coordinates of the bottom and the top points of the inner bevel
1441 {
1442 // find x and y projections of the bevel border thickness
1445
1446 // find shifts of the sensitive zone from module borders via the equation of the straight line for the inner
1447 // bevel
1448 Double_t x_delta_top_BP = XLeftBorder;
1449 Double_t y_delta_top_BP =
1450 TMath::Tan(TMath::PiOver2() + BevelAngleRad) * x_delta_top_BP + (YBevelSize + y_delta);
1451
1452 Double_t y_delta_bottom_BP = YBottomBorder;
1453 Double_t x_delta_bottom_BP =
1454 (y_delta_bottom_BP - (YBevelSize + y_delta)) / (TMath::Tan(TMath::PiOver2() + BevelAngleRad));
1455 //----------------------------------------------------------------------
1456
1457 Double_t x_pos_sensor_zone_bevel[5] = {
1459 +XModuleSize * 0.5 - x_delta_bottom_BP, +XModuleSize * 0.5 - XLeftBorder};
1460 Double_t y_pos_sensor_zone_bevel[5] = {
1463 -YModuleSizeLowerPart * 0.5 + y_delta_top_BP};
1464
1465 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefinePolygon(5, x_pos_sensor_zone_bevel, y_pos_sensor_zone_bevel);
1466 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefineSection(0, -ZModuleSize * 0.5);
1467 ((TGeoXtru*)sensor_zone_lower_part_bevelS)->DefineSection(1, +ZModuleSize * 0.5);
1468 }
1469
1470 //--------------------------------------------------------------------------
1471
1472 // Volumes ------------------------------------------------------------------
1473 // module volume
1474 // TString module_name = "moduleV_";
1475
1476 TGeoVolume* moduleV = new TGeoVolume(module_name, moduleS);
1477
1478 // sensor zone volume (upper part of the module)
1479 TGeoVolume* sensor_zone_upper_part_rectV =
1480 new TGeoVolume("Sensor_zone_upper_part_rectV", sensor_zone_upper_part_rectS);
1481
1482 // sensor zone volume (lower part of the module)
1483 TGeoVolume* sensor_zone_upper_part_bevelV =
1484 new TGeoVolume("Sensor_zone_upper_part_bevelV", sensor_zone_upper_part_bevelS);
1485
1486 // sensor zone volume (lower part of the module: rectangle zone)
1487 TGeoVolume* sensor_zone_lower_part_rectV =
1488 new TGeoVolume("Sensor_zone_lower_part_rectV", sensor_zone_lower_part_rectS);
1489
1490 // sensor zone volume (lower part of the module: bevel zone)
1491 TGeoVolume* sensor_zone_lower_part_bevelV =
1492 new TGeoVolume("Sensor_zone_lower_part_bevelV", sensor_zone_lower_part_bevelS);
1493
1494 // volumes media
1495 TGeoMedium* silicon_medium = pMedSilicon;
1496 if (silicon_medium) {
1497 moduleV->SetMedium(silicon_medium);
1498 sensor_zone_upper_part_rectV->SetMedium(silicon_medium);
1499 sensor_zone_upper_part_bevelV->SetMedium(silicon_medium);
1500 sensor_zone_lower_part_rectV->SetMedium(silicon_medium);
1501 sensor_zone_lower_part_bevelV->SetMedium(silicon_medium);
1502 } else
1503 Fatal("Main", "Invalid medium for modules and sensor zones!");
1504
1505 // volumes visual property (transparency)
1506 moduleV->SetLineColor(TColor::GetColor("#ff47ca"));
1507 sensor_zone_upper_part_rectV->SetLineColor(TColor::GetColor("#e0b0ff"));
1508 sensor_zone_upper_part_bevelV->SetLineColor(TColor::GetColor("#e0b0ff"));
1509 sensor_zone_lower_part_rectV->SetLineColor(TColor::GetColor("#e0b0ff"));
1510 sensor_zone_lower_part_bevelV->SetLineColor(TColor::GetColor("#e0b0ff"));
1511 moduleV->SetTransparency(50);
1512
1513 switch (module_type) {
1514
1515 case RIGHT_ANGLED_MODULE: {
1516
1517 // position of the sensor zone in the upper part of the module
1518 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
1519 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder + XRightBorder) * 0.5 - XLeftBorder);
1520 sensor_zone_upper_part_pos->SetDy(+YSensorZoneSizeUpperPart * 0.5 + YGapBetweenPartsOfModule * 0.5
1522 sensor_zone_upper_part_pos->SetDz(0.0);
1523
1524 // position of the sensor zone in the lower part of the module
1525 TGeoTranslation* sensor_zone_lower_part_pos = new TGeoTranslation();
1526 sensor_zone_lower_part_pos->SetDx(+(XLeftBorder + XRightBorder) * 0.5 - XLeftBorder);
1527 sensor_zone_lower_part_pos->SetDy(-YSensorZoneSizeLowerPart * 0.5 - YGapBetweenPartsOfModule * 0.5
1529 sensor_zone_lower_part_pos->SetDz(0.0);
1530
1531 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
1532 moduleV->AddNode(sensor_zone_lower_part_rectV, 0, sensor_zone_lower_part_pos);
1533 break;
1534 }
1535
1537 // position of the sensor zone in the upper part of the module
1538 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
1539 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder + XRightBorder) * 0.5 - XLeftBorder);
1540 sensor_zone_upper_part_pos->SetDy(+(YTopBorder + YMiddleBorderUpperPart) * 0.5 - YTopBorder);
1541 sensor_zone_upper_part_pos->SetDz(0.0);
1542
1543 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
1544 break;
1545 }
1546
1547 case BEVEL_MODULE: {
1548
1549 // position of the sensor zone in the upper part of the module
1550 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
1551 sensor_zone_upper_part_pos->SetDx(+(XLeftBorder + XRightBorder) * 0.5 - XLeftBorder);
1552 sensor_zone_upper_part_pos->SetDy(+YSensorZoneSizeUpperPart * 0.5 + YGapBetweenPartsOfModule * 0.5
1554 sensor_zone_upper_part_pos->SetDz(0.0);
1555
1556 // position of the sensor zone in the lower part of the module
1557 TGeoTranslation* sensor_zone_lower_part_bevel_pos = new TGeoTranslation();
1558 sensor_zone_lower_part_bevel_pos->SetDx(0.0);
1559 sensor_zone_lower_part_bevel_pos->SetDy(-YModuleSizeLowerPart * 0.5 - YGapBetweenPartsOfModule * 0.5
1561 sensor_zone_lower_part_bevel_pos->SetDz(0.0);
1562
1563 moduleV->AddNode(sensor_zone_upper_part_rectV, 0, sensor_zone_upper_part_pos);
1564 moduleV->AddNode(sensor_zone_lower_part_bevelV, 0, sensor_zone_lower_part_bevel_pos);
1565 break;
1566 }
1567
1568 case BEVEL_MODULE_HALF: {
1569
1570 // position of the sensor zone in the upper part of the module
1571 TGeoTranslation* sensor_zone_upper_part_pos = new TGeoTranslation();
1572 sensor_zone_upper_part_pos->SetDx(0);
1573 sensor_zone_upper_part_pos->SetDy(0);
1574 sensor_zone_upper_part_pos->SetDz(0.0);
1575
1576 moduleV->AddNode(sensor_zone_upper_part_bevelV, 0, sensor_zone_upper_part_pos);
1577 break;
1578 }
1579
1580 default:
1581 Error("CreateModule()", "Incorrect module type selected!!!");
1582 }
1583
1584 return moduleV;
1585}
1586
1587//------------------------------------------------------------------------------
1588
1590{
1591
1592 // Shapes -------------------------------------------------------------------
1593 // module shape
1594 TGeoShape* frameS = 0;
1595
1596 // frame margins for a basic si-module
1597 Double_t leftMargin = 0.1; // cm
1598 Double_t rightMargin = 0.4; // cm
1599 Double_t bottomMargin = 0.1; // cm
1600 Double_t topMargin = 5.0; // cm
1601
1602 switch (module_type) {
1603 case RIGHT_ANGLED_MODULE: {
1604 // frameS = new TGeoBBox("frameS", XModuleSize*0.5, YModuleSize*0.5, ZModuleFrameSize*0.5);
1605 frameS = new TGeoXtru(2);
1606 frameS->SetName(TString("frameS") += module_name);
1607 Double_t x_pos[12] = {
1608 +(XModuleSize * 0.5 + leftMargin) /*0*/, +(XModuleSize * 0.5 + leftMargin) /*1*/,
1609 +(XModuleSize * 0.5 + leftMargin + 1.0) /*2*/, +(XModuleSize * 0.5 + leftMargin + 1.0) /*3*/,
1610 +(XModuleSize * 0.5 + leftMargin) /*4*/, +(XModuleSize * 0.5 + leftMargin) /*5*/,
1611 -(XModuleSize * 0.5 + rightMargin) /*6*/, -(XModuleSize * 0.5 + rightMargin) /*7*/,
1612 -(XModuleSize * 0.5 + rightMargin + 1.0) /*8*/, -(XModuleSize * 0.5 + rightMargin + 1.0) /*9*/,
1613 -(XModuleSize * 0.5 + rightMargin) /*10*/, -(XModuleSize * 0.5 + rightMargin) /*11*/,
1614 };
1615 Double_t y_pos[12] = {
1616 -(YModuleSize * 0.5 + bottomMargin) /*0*/, +(YModuleSize * 0.5 - 1.6) /*1*/,
1617 +(YModuleSize * 0.5 - 0.5) /*2*/, +(YModuleSize * 0.5 + 5.0) /*3*/,
1618 +(YModuleSize * 0.5 + 5.0) /*4*/, +(YModuleSize * 0.5 + 9.0) /*5*/,
1619 +(YModuleSize * 0.5 + 9.0) /*6*/, +(YModuleSize * 0.5 + 5.0) /*7*/,
1620 +(YModuleSize * 0.5 + 5.0) /*8*/, +(YModuleSize * 0.5 - 0.5) /*9*/,
1621 +(YModuleSize * 0.5 - 1.6) /*10*/, -(YModuleSize * 0.5) /*11*/,
1622 };
1623 ((TGeoXtru*)frameS)->DefinePolygon(12, x_pos, y_pos);
1624 ((TGeoXtru*)frameS)->DefineSection(0, -ZModuleFrameSize * 0.5);
1625 ((TGeoXtru*)frameS)->DefineSection(1, +ZModuleFrameSize * 0.5);
1626 break;
1627 }
1629 // frameS = new TGeoBBox("frameS", XModuleSize*0.5, YModuleSizeUpperPart*0.5, ZModuleFrameSize*0.5);
1630 frameS = new TGeoXtru(2);
1631 frameS->SetName(TString("frameS") += module_name);
1632 Double_t x_pos[12] = {
1633 +(XModuleSize * 0.5 + leftMargin) /*0*/, +(XModuleSize * 0.5 + leftMargin) /*1*/,
1634 +(XModuleSize * 0.5 + leftMargin + 1.0) /*2*/, +(XModuleSize * 0.5 + leftMargin + 1.0) /*3*/,
1635 +(XModuleSize * 0.5 + leftMargin) /*4*/, +(XModuleSize * 0.5 + leftMargin) /*5*/,
1636 -(XModuleSize * 0.5 + rightMargin) /*6*/, -(XModuleSize * 0.5 + rightMargin) /*7*/,
1637 -(XModuleSize * 0.5 + rightMargin + 1.0) /*8*/, -(XModuleSize * 0.5 + rightMargin + 1.0) /*9*/,
1638 -(XModuleSize * 0.5 + rightMargin) /*10*/, -(XModuleSize * 0.5 + rightMargin) /*11*/,
1639 };
1640 Double_t y_pos[12] = {
1641 -(YModuleSizeUpperPart * 0.5 + bottomMargin) /*0*/, +(YModuleSizeUpperPart * 0.5 - 1.6) /*1*/,
1642 +(YModuleSizeUpperPart * 0.5 - 0.5) /*2*/, +(YModuleSizeUpperPart * 0.5 + 5.0) /*3*/,
1643 +(YModuleSizeUpperPart * 0.5 + 5.0) /*4*/, +(YModuleSizeUpperPart * 0.5 + 9.0) /*5*/,
1644 +(YModuleSizeUpperPart * 0.5 + 9.0) /*6*/, +(YModuleSizeUpperPart * 0.5 + 5.0) /*7*/,
1645 +(YModuleSizeUpperPart * 0.5 + 5.0) /*8*/, +(YModuleSizeUpperPart * 0.5 - 0.5) /*9*/,
1646 +(YModuleSizeUpperPart * 0.5 - 1.6) /*10*/, -(YModuleSizeUpperPart * 0.5) /*11*/,
1647 };
1648 ((TGeoXtru*)frameS)->DefinePolygon(12, x_pos, y_pos);
1649 ((TGeoXtru*)frameS)->DefineSection(0, -ZModuleFrameSize * 0.5);
1650 ((TGeoXtru*)frameS)->DefineSection(1, +ZModuleFrameSize * 0.5);
1651 break;
1652 }
1653 case BEVEL_MODULE: {
1654 frameS = new TGeoXtru(2);
1655 frameS->SetName(TString("frameS") += module_name);
1656 Double_t x_pos[13] = {
1657 +(XModuleSize * 0.5 - XBevelSize + leftMargin) /*0*/,
1658 +(XModuleSize * 0.5 + leftMargin) /*1*/,
1659 +(XModuleSize * 0.5 + leftMargin) /*2*/,
1660 +(XModuleSize * 0.5 + leftMargin + 1.0) /*3*/,
1661 +(XModuleSize * 0.5 + leftMargin + 1.0) /*4*/,
1662 +(XModuleSize * 0.5 + leftMargin) /*5*/,
1663 +(XModuleSize * 0.5 + leftMargin) /*6*/,
1664 -(XModuleSize * 0.5 + rightMargin) /*7*/,
1665 -(XModuleSize * 0.5 + rightMargin) /*8*/,
1666 -(XModuleSize * 0.5 + rightMargin + 1.0) /*9*/,
1667 -(XModuleSize * 0.5 + rightMargin + 1.0) /*10*/,
1668 -(XModuleSize * 0.5 + rightMargin) /*11*/,
1669 -(XModuleSize * 0.5 + rightMargin) /*12*/,
1670 };
1671 Double_t y_pos[13] = {
1672 -(YModuleSize * 0.5 + bottomMargin) /*0*/,
1673 -(YModuleSize * 0.5 - YBevelSize + bottomMargin) /*1*/,
1674 +(YModuleSize * 0.5 - 1.6) /*2*/,
1675 +(YModuleSize * 0.5 - 0.5) /*3*/,
1676 +(YModuleSize * 0.5 + 5.0) /*4*/,
1677 +(YModuleSize * 0.5 + 5.0) /*5*/,
1678 +(YModuleSize * 0.5 + 9.0) /*6*/,
1679 +(YModuleSize * 0.5 + 9.0) /*7*/,
1680 +(YModuleSize * 0.5 + 5.0) /*8*/,
1681 +(YModuleSize * 0.5 + 5.0) /*9*/,
1682 +(YModuleSize * 0.5 - 0.5) /*10*/,
1683 +(YModuleSize * 0.5 - 1.6) /*11*/,
1684 -(YModuleSize * 0.5) /*12*/,
1685 };
1686 ((TGeoXtru*)frameS)->DefinePolygon(13, x_pos, y_pos);
1687 ((TGeoXtru*)frameS)->DefineSection(0, -ZModuleFrameSize * 0.5);
1688 ((TGeoXtru*)frameS)->DefineSection(1, +ZModuleFrameSize * 0.5);
1689 break;
1690 }
1691 case BEVEL_MODULE_HALF: {
1692 frameS = new TGeoXtru(2);
1693 frameS->SetName(TString("frameS") += module_name);
1694 Double_t x_pos[13] = {
1695 +(XModuleSize * 0.5 - XBevelSize + leftMargin) /*0*/,
1696 +(XModuleSize * 0.5 + leftMargin) /*1*/,
1697 +(XModuleSize * 0.5 + leftMargin) /*2*/,
1698 +(XModuleSize * 0.5 + leftMargin + 1.0) /*3*/,
1699 +(XModuleSize * 0.5 + leftMargin + 1.0) /*4*/,
1700 +(XModuleSize * 0.5 + leftMargin) /*5*/,
1701 +(XModuleSize * 0.5 + leftMargin) /*6*/,
1702 -(XModuleSize * 0.5 + rightMargin) /*7*/,
1703 -(XModuleSize * 0.5 + rightMargin) /*8*/,
1704 -(XModuleSize * 0.5 + rightMargin + 1.0) /*9*/,
1705 -(XModuleSize * 0.5 + rightMargin + 1.0) /*10*/,
1706 -(XModuleSize * 0.5 + rightMargin) /*11*/,
1707 -(XModuleSize * 0.5 + rightMargin) /*12*/,
1708 };
1709 Double_t y_pos[13] = {
1710 -(YModuleSizeUpperPart * 0.5 + bottomMargin) /*0*/,
1711 -(YModuleSizeUpperPart * 0.5 - YBevelSize + bottomMargin) /*1*/,
1712 +(YModuleSizeUpperPart * 0.5 - 1.6) /*2*/,
1713 +(YModuleSizeUpperPart * 0.5 - 0.5) /*3*/,
1714 +(YModuleSizeUpperPart * 0.5 + 5.0) /*4*/,
1715 +(YModuleSizeUpperPart * 0.5 + 5.0) /*5*/,
1716 +(YModuleSizeUpperPart * 0.5 + 9.0) /*6*/,
1717 +(YModuleSizeUpperPart * 0.5 + 9.0) /*7*/,
1718 +(YModuleSizeUpperPart * 0.5 + 5.0) /*8*/,
1719 +(YModuleSizeUpperPart * 0.5 + 5.0) /*9*/,
1720 +(YModuleSizeUpperPart * 0.5 - 0.5) /*10*/,
1721 +(YModuleSizeUpperPart * 0.5 - 1.6) /*11*/,
1722 -(YModuleSizeUpperPart * 0.5) /*12*/,
1723 };
1724 ((TGeoXtru*)frameS)->DefinePolygon(13, x_pos, y_pos);
1725 ((TGeoXtru*)frameS)->DefineSection(0, -ZModuleFrameSize * 0.5);
1726 ((TGeoXtru*)frameS)->DefineSection(1, +ZModuleFrameSize * 0.5);
1727 break;
1728 }
1729 default:
1730 Error("CreateModule()", "Incorrect module type selected!!!");
1731 }
1732
1733 Double_t innerMargin = 0.5; // cm, frame inner margin from edge of sens.
1734
1735 // rectangle window of the frame
1736 TGeoShape* window_rectS =
1737 new TGeoBBox(TString("window_rectS") += module_name, (XModuleSize - innerMargin * 2) * 0.5,
1738 (YModuleSize * 0.5 - innerMargin * 2) * 0.5, (ZModuleFrameSize + 0.001) * 0.5);
1739
1740 // bevel window of the frame
1741 TGeoShape* window_bevelS = new TGeoXtru(2);
1742 window_bevelS->SetName(TString("window_bevelS") += module_name);
1743 // Calculate coordinates of the bottom and the top points of the inner bevel
1744 {
1745 // find x and y projections of the bevel border thickness
1746 Double_t x_delta = innerMargin / TMath::Cos(BevelAngleRad);
1747 Double_t y_delta = innerMargin / TMath::Sin(BevelAngleRad);
1748
1749 // find shifts of the sensitive zone from module borders via the equation of the straight line for the inner
1750 // bevel
1751 Double_t x_delta_top_BP = innerMargin;
1752 Double_t y_delta_top_BP =
1753 TMath::Tan(TMath::PiOver2() + BevelAngleRad) * x_delta_top_BP + (YBevelSize + y_delta);
1754
1755 Double_t y_delta_bottom_BP = innerMargin;
1756 Double_t x_delta_bottom_BP =
1757 (y_delta_bottom_BP - (YBevelSize + y_delta)) / (TMath::Tan(TMath::PiOver2() + BevelAngleRad));
1758 //----------------------------------------------------------------------
1759
1760 Double_t x_pos[5] = {+XModuleSize * 0.5 - innerMargin, -XModuleSize * 0.5 + innerMargin,
1761 -XModuleSize * 0.5 + innerMargin, +XModuleSize * 0.5 - x_delta_bottom_BP,
1762 +XModuleSize * 0.5 - innerMargin};
1763 Double_t y_pos[5] = {+YModuleSize * 0.25 - innerMargin, +YModuleSize * 0.25 - innerMargin,
1764 -YModuleSize * 0.25 + innerMargin, -YModuleSize * 0.25 + innerMargin,
1765 -YModuleSize * 0.25 + y_delta_top_BP};
1766
1767 ((TGeoXtru*)window_bevelS)->DefinePolygon(5, x_pos, y_pos);
1768 ((TGeoXtru*)window_bevelS)->DefineSection(0, -(ZModuleFrameSize + 0.001) * 0.5);
1769 ((TGeoXtru*)window_bevelS)->DefineSection(1, +(ZModuleFrameSize + 0.001) * 0.5);
1770 }
1771
1772 // translations
1773 TGeoTranslation* upper_window_frame_pos = new TGeoTranslation();
1774 upper_window_frame_pos->SetName(TString("upper_window_frame_pos") += module_name);
1775 upper_window_frame_pos->SetDx(0.0);
1776 upper_window_frame_pos->SetDy(+YSensorZoneSizeUpperPart * 0.5 + YGapBetweenPartsOfModule * 0.5
1778 upper_window_frame_pos->SetDz(0.0);
1779 upper_window_frame_pos->RegisterYourself();
1780
1781 TGeoTranslation* lower_window_frame_pos = new TGeoTranslation();
1782 lower_window_frame_pos->SetName(TString("lower_window_frame_pos") += module_name);
1783 lower_window_frame_pos->SetDx(0.0);
1784 lower_window_frame_pos->SetDy(-YSensorZoneSizeLowerPart * 0.5 - YGapBetweenPartsOfModule * 0.5
1786 lower_window_frame_pos->SetDz(0.0);
1787 lower_window_frame_pos->RegisterYourself();
1788
1789 TGeoTranslation* window_half_frame_pos = new TGeoTranslation();
1790 window_half_frame_pos->SetName(TString("window_half_frame_pos") += module_name);
1791 window_half_frame_pos->SetDx(0.0);
1792 window_half_frame_pos->SetDy(0.0);
1793 window_half_frame_pos->SetDz(0.0);
1794 window_half_frame_pos->RegisterYourself();
1795
1796 TGeoCompositeShape* frame_with_windowsS = new TGeoCompositeShape();
1797 frame_with_windowsS->SetName("frame_with_windowsS");
1798
1799 switch (module_type) {
1800
1801 case RIGHT_ANGLED_MODULE: {
1802 TString expression = "(frameS";
1803 expression += module_name;
1804 expression += "-window_rectS";
1805 expression += module_name;
1806 expression += ":upper_window_frame_pos";
1807 expression += module_name;
1808 expression += ")-window_rectS";
1809 expression += module_name;
1810 expression += ":lower_window_frame_pos";
1811 expression += module_name;
1812 frame_with_windowsS->MakeNode(expression);
1813 frame_with_windowsS->ComputeBBox();
1814 break;
1815 }
1816
1818 TString expression = "(frameS";
1819 expression += module_name;
1820 expression += ")-window_rectS";
1821 expression += module_name;
1822 expression += ":window_half_frame_pos";
1823 expression += module_name;
1824 frame_with_windowsS->MakeNode(expression);
1825 frame_with_windowsS->ComputeBBox();
1826 break;
1827 }
1828
1829 case BEVEL_MODULE: {
1830 TString expression = "(frameS";
1831 expression += module_name;
1832 expression += "-window_rectS";
1833 expression += module_name;
1834 expression += ":upper_window_frame_pos";
1835 expression += module_name;
1836 expression += ")-window_bevelS";
1837 expression += module_name;
1838 expression += ":lower_window_frame_pos";
1839 expression += module_name;
1840 frame_with_windowsS->MakeNode(expression);
1841 frame_with_windowsS->ComputeBBox();
1842 break;
1843 }
1844
1845 case BEVEL_MODULE_HALF: {
1846 TString expression = "(frameS";
1847 expression += module_name;
1848 expression += ")-window_bevelS";
1849 expression += module_name;
1850 expression += ":window_half_frame_pos";
1851 expression += module_name;
1852 frame_with_windowsS->MakeNode(expression);
1853 frame_with_windowsS->ComputeBBox();
1854 break;
1855 }
1856
1857 default:
1858 Error("CreateModule()", "Incorrect module type selected!!!");
1859 }
1860 //--------------------------------------------------------------------------
1861
1862 // Volumes ------------------------------------------------------------------
1863 // module frame volume
1864 TGeoVolume* frameV = new TGeoVolume(module_name, frame_with_windowsS);
1865
1866 // volumes media
1867 TGeoMedium* carbon_medium = pMedCarbon;
1868 if (carbon_medium) {
1869 frameV->SetMedium(carbon_medium);
1870 } else
1871 Fatal("Main", "Invalid medium for frameV!");
1872
1873 // volumes visual property (transparency)
1874 frameV->SetLineColor(TColor::GetColor("#cccccc"));
1875 frameV->SetTransparency(0);
1876
1877 return frameV;
1878}
bool Bool_t
int Int_t
double Double_t
constexpr Bool_t kTRUE
void Error(const char *location, const char *msgfmt,...)
void Fatal(const char *location, const char *msgfmt,...)
R__EXTERN TGeoManager * gGeoManager
#define gROOT
R__EXTERN TSystem * gSystem
static Int_t GetColor(const char *hexcolor)
void Close(Option_t *option="") override
void SetDz(Double_t dz) override
const Double_t * GetTranslation() const override
void RotateY(Double_t angle) override
void SetDy(Double_t dy) override
void SetDx(Double_t dx) override
void RotateX(Double_t angle) override
void SetTranslation(const TGeoTranslation &tr)
void ReflectY(Bool_t leftside, Bool_t rotonly=kFALSE) override
void ComputeBBox() override
void MakeNode(const char *expression)
virtual void RegisterYourself()
void SetDy(Double_t dy) override
void SetDz(Double_t dz) override
void SetDx(Double_t dx) override
void SetVisContainers(Bool_t flag=kTRUE) override
virtual TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="")
void Draw(Option_t *option="") override
void SetTransparency(Char_t transparency=0)
virtual void SetMedium(TGeoMedium *medium)
void SetLineColor(Color_t lcolor) override
const char * GetName() const override
virtual void SetName(const char *name)
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
static TString Itoa(Int_t value, Int_t base)
const Double_t YStationPositions[NStations]
const Double_t ZStationPositions[NStations]
const Double_t XStationPositions[NStations]
const Int_t NModulesInStations[NStations]
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]
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()