BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_CSC_Run9_detailed.C
Go to the documentation of this file.
1/*
2 * Use this macro to create detailed ROOT geometry of CSC (Cathode
3 * Strip Chamber) detector for the RUN-9 configuration (4 small chambers +
4 * 2 large chambers)
5 *
6 * Author: Baranov D.
7 * Created: 23.04.2025
8 *
9 * WARNING: all units are in cm!!!
10 */
11
12// Set Parameters of CSC --------------------------------------------------------
13const Int_t NStations = 6; // number of stations in the detector
14const Int_t NMaxModules = 8; // max. number of modules in a station
15
16// X-positions of stations
18 // geometrical center
19 +130.688, // st. 0 (small CSC)
20 -89.761, // st. 1 (small CSC)
21 +196.159, // st. 2 (small CSC)
22 -144.430, // st. 3 (small CSC)
23 +27.126, // st. 4 (large CSC)
24 +30.503 // st. 5 (large CSC)
25};
26
27// Y-positions of stations
29 // geometrical center
30 +8.571, // st. 0 (small CSC)
31 +8.530, // st. 1 (small CSC)
32 -0.025, // st. 2 (small CSC)
33 -0.087, // st. 3 (small CSC)
34 -0.032, // st. 4 (large CSC)
35 -0.046 // st. 5 (large CSC)
36};
37
38// Z-positions of stations
40 // outer side, closest to the target
41 +399.250, // st. 0 (small CSC)
42 +399.246, // st. 1 (small CSC)
43 +471.557, // st. 2 (small CSC)
44 +471.589, // st. 3 (small CSC)
45 +491.4198, // st. 4 (large CSC)
46 +536.7465 // st. 5 (large CSC)
47};
48
49//(X-Y-Z)Shifts of modules in each station
51 // centers of gas volumes
52 {0.0, 0.0}, // st. 0
53 {0.0, 0.0}, // st. 1
54 {0.0, 0.0}, // st. 2
55 {0.0, 0.0}, // st. 3
56
57 {+81.375 /*0*/, +27.125 /*1*/, -27.125 /*2*/, -81.375 /*3*/, +81.375 /*4*/, +27.125 /*5*/, -27.125 /*6*/,
58 -81.375 /*7*/}, // st. 4
59
60 {+81.375 /*0*/, +27.125 /*1*/, -27.125 /*2*/, -81.375 /*3*/, +81.375 /*4*/, +27.125 /*5*/, -27.125 /*6*/,
61 -81.375 /*7*/} // st. 5
62};
64 // centers of gas volumes
65 {27.1875, -27.1875}, // st. 0
66 {27.1875, -27.1875}, // st. 1
67 {27.1875, -27.1875}, // st. 2
68 {27.1875, -27.1875}, // st. 3
69
70 {+36.5 /*0*/, +36.5 /*1*/, +36.5 /*2*/, +36.5 /*3*/, -36.5 /*4*/, -36.5 /*5*/, -36.5 /*6*/, -36.5 /*7*/}, // st. 4
71
72 {+36.5 /*0*/, +36.5 /*1*/, +36.5 /*2*/, +36.5 /*3*/, -36.5 /*4*/, -36.5 /*5*/, -36.5 /*6*/, -36.5 /*7*/} // st. 5
73};
75 // distances from st.side to mod.side
76 {1.25, 1.25}, // st. 0
77 {1.25, 1.25}, // st. 1
78 {1.25, 1.25}, // st. 2
79 {1.25, 1.25}, // st. 3
80
81 {2.5 /*0*/, 2.5 /*1*/, 2.5 /*2*/, 2.5 /*3*/, 2.5 /*4*/, 2.5 /*5*/, 2.5 /*6*/, 2.5 /*7*/}, // st. 4
82
83 {2.5 /*0*/, 2.5 /*1*/, 2.5 /*2*/, 2.5 /*3*/, 2.5 /*4*/, 2.5 /*5*/, 2.5 /*6*/, 2.5 /*7*/} // st. 5
84};
85
92
94 {WHOLE_MOD, WHOLE_MOD}, // st. 0
95 {WHOLE_MOD, WHOLE_MOD}, // st. 1
96 {WHOLE_MOD, WHOLE_MOD}, // st. 2
97 {WHOLE_MOD, WHOLE_MOD}, // st. 3
98
99 {WHOLE_MOD /*0*/, HOLED_LEFT_MOD /*1*/, HOLED_RIGHT_MOD /*2*/, WHOLE_MOD /*3*/, WHOLE_MOD /*4*/,
100 HOLED_RIGHT_MOD /*5*/, HOLED_LEFT_MOD /*6*/, WHOLE_MOD /*7*/}, // st. 4
101
102 {WHOLE_MOD /*0*/, HOLED_LEFT_MOD /*1*/, HOLED_RIGHT_MOD /*2*/, WHOLE_MOD /*3*/, WHOLE_MOD /*4*/,
103 HOLED_RIGHT_MOD /*5*/, HOLED_LEFT_MOD /*6*/, WHOLE_MOD /*7*/} // st. 5
104};
105
107 {false, false}, // st. 0
108 {false, false}, // st. 1
109 {false, false}, // st. 2
110 {false, false}, // st. 3
111
112 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, true /*4*/, true /*5*/, true /*6*/, true /*7*/}, // st. 4
113
114 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, true /*4*/, true /*5*/, true /*6*/, true /*7*/} // st. 5
115};
116
118 {false, false}, // st. 0
119 {false, false}, // st. 1
120 {false, false}, // st. 2
121 {false, false}, // st. 3
122
123 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, true /*4*/, true /*5*/, true /*6*/, true /*7*/}, // st. 4
124
125 {false /*0*/, false /*1*/, false /*2*/, false /*3*/, true /*4*/, true /*5*/, true /*6*/, true /*7*/} // st. 5
126};
127
128// Sizes of elements (cm) -------------------------------------------------------
129
130// Gas volume sizes (small module: half of station)
134
135// Sensitive volume sizes (module: half of station)
137const Double_t YSensSize_small = 53.25; // 106.5*0.5
139
140// Gas volume sizes (large module)
144
147//------------------------------------------------------------------------------
148
149// GeoManager
151
152// media
163
164class FairGeoMedia;
165class FairGeoBuilder;
166
167TGeoVolume* CreateStation(TString station_name);
170
171TGeoVolume* CreateLargeModule(TString module_name, ModuleType module_type);
172
173void DefineRequiredMedia(FairGeoMedia* geoMedia, FairGeoBuilder* geoBuild)
174{
175
176 // air medium
177 FairGeoMedium* mAir = geoMedia->getMedium("air");
178 if (!mAir)
179 Fatal("Main", "FairMedium air not found");
180 geoBuild->createMedium(mAir);
181 pMedAir = gGeoManager->GetMedium("air");
182 if (!pMedAir)
183 Fatal("Main", "Medium air not found");
184
185 // carbon medium
186 FairGeoMedium* mCarbon = geoMedia->getMedium("carbon");
187 if (!mCarbon)
188 Fatal("Main", "FairMedium carbon not found");
189 geoBuild->createMedium(mCarbon);
190 pMedCarbon = gGeoManager->GetMedium("carbon");
191 if (!pMedCarbon)
192 Fatal("Main", "Medium carbon not found");
193
194 // fiberglass medium
195 FairGeoMedium* mFiberGlass = geoMedia->getMedium("fiberglass");
196 if (!mFiberGlass)
197 Fatal("Main", "FairMedium fiberglass not found");
198 geoBuild->createMedium(mFiberGlass);
199 pMedFiberGlass = gGeoManager->GetMedium("fiberglass");
200 if (!pMedFiberGlass)
201 Fatal("Main", "Medium fiberglass not found");
202
203 // arco27020 medium
204 FairGeoMedium* mArCO27030 = geoMedia->getMedium("arco27030");
205 if (!mArCO27030)
206 Fatal("Main", "FairMedium arco27030 not found");
207 geoBuild->createMedium(mArCO27030);
208 pMedArCO27030 = gGeoManager->GetMedium("arco27030");
209 if (!pMedArCO27030)
210 Fatal("Main", "Medium arco27030 not found");
211
212 // ArgonIsobutane (75/25): Ar-iC4H10 medium
213 FairGeoMedium* mArgonIsobutane7525 = geoMedia->getMedium("ArgonIsobutane7525");
214 if (!mArgonIsobutane7525)
215 Fatal("Main", "FairMedium ArgonIsobutane7525 not found");
216 geoBuild->createMedium(mArgonIsobutane7525);
217 pMedArgonIsobutane7525 = gGeoManager->GetMedium("ArgonIsobutane7525");
219 Fatal("Main", "Medium ArgonIsobutane7525 not found");
220
221 // HoneyComb medium
222 FairGeoMedium* mHoneyComb = geoMedia->getMedium("AramidHoneyComb");
223 if (!mHoneyComb)
224 Fatal("Main", "FairMedium AramidHoneyComb not found");
225 geoBuild->createMedium(mHoneyComb);
226 pMedHoneyComb = gGeoManager->GetMedium("AramidHoneyComb");
227 if (!pMedHoneyComb)
228 Fatal("Main", "Medium AramidHoneyComb not found");
229
230 // epoxide compound (as Araldit glue based on solid epoxide resin)
231 FairGeoMedium* mEpoxideCompound = geoMedia->getMedium("polyurethane_hd");
232 if (!mEpoxideCompound)
233 Fatal("Main", "FairMedium epoxideCompound not found");
234 geoBuild->createMedium(mEpoxideCompound);
235 pMedEpoxideCompound = gGeoManager->GetMedium("polyurethane_hd");
237 Fatal("Main", "Medium epoxideCompound not found");
238
239 // brass medium
240 FairGeoMedium* mBrass = geoMedia->getMedium("brass");
241 if (!mBrass)
242 Fatal("Main", "FairMedium brass not found");
243 geoBuild->createMedium(mBrass);
244 pMedBrass = gGeoManager->GetMedium("brass");
245 if (!pMedBrass)
246 Fatal("Main", "Medium brass not found");
247
248 // teflon medium
249 FairGeoMedium* mTeflon = geoMedia->getMedium("teflon");
250 if (!mTeflon)
251 Fatal("Main", "FairMedium teflon not found");
252 geoBuild->createMedium(mTeflon);
253 pMedTeflon = gGeoManager->GetMedium("teflon");
254 if (!pMedTeflon)
255 Fatal("Main", "Medium teflon not found");
256}
257
259{
260
261 // ---- set working directory --------------------------------------------
262 TString gPath = gSystem->Getenv("VMCWORKDIR");
263
264 // ------- Geometry file name (output) ----------------------------------
265 const TString geoDetectorName = "CSC";
266 const TString geoDetectorVersion = "Run9_detailed";
267 const TString geoFileName = gPath + "/geometry/" + geoDetectorName + "_" + geoDetectorVersion + ".root";
268
269 // ---- global geometry parameters ---------------------------------------
270 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
271 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
272
273 // ------- Load media from media file ----------------------------------
274 TString medFile = gPath + "/geometry/media.geo";
275 geoFace->setMediaFile(medFile);
276 geoFace->readMedia();
277 FairGeoMedia* geoMedia = geoFace->getMedia();
278 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
279
280 DefineRequiredMedia(geoMedia, geoBuild);
281 // -------------------------------------------------------------------------
282
283 // -------------- Create geometry and top volume ------------------------
284 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
285 gGeoMan->SetName(geoDetectorName + "_geom");
286 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
287 top->SetMedium(pMedAir);
288 gGeoMan->SetTopVolume(top);
289 // gGeoMan->SetTopVisible(1);
290 // -------------------------------------------------------------------------
291
292 // Define TOP Geometry
293 TGeoVolume* CSC = new TGeoVolumeAssembly(geoDetectorName);
294 CSC->SetMedium(pMedAir);
295
296 for (Int_t istation = 0; istation < NStations; ++istation) {
297
298 Int_t stationNum = istation; // station number
299
300 TGeoVolume* station = CreateStation(TString("station") + TString::Itoa(stationNum, 10) + TString("_CSC"));
301
302 if (stationNum < 4) { // small CSC
303
304 TGeoVolume* module0 = CreateSmallModule(TString("module0_") + station->GetName());
305 TGeoVolume* module1 = CreateSmallModule(TString("module1_") + station->GetName());
306
307 TGeoVolume* frame0 = CreateFrameForSmallModule(TString("frame0_") + station->GetName());
308 TGeoVolume* frame1 = CreateFrameForSmallModule(TString("frame1_") + station->GetName());
309
310 TGeoCombiTrans* module0_transform = new TGeoCombiTrans();
311 module0_transform->SetTranslation(XModuleShifts[stationNum][0], YModuleShifts[stationNum][0],
312 ZModuleShifts[stationNum][0] + 0.5 * ZGasSize_small);
313
314 TGeoCombiTrans* module1_transform = new TGeoCombiTrans();
315 module1_transform->RotateZ(180);
316 module1_transform->SetTranslation(XModuleShifts[stationNum][1], YModuleShifts[stationNum][1],
317 ZModuleShifts[stationNum][1] + 0.5 * ZGasSize_small);
318
319 TGeoCombiTrans* frame0_transform = new TGeoCombiTrans();
320 frame0_transform->SetTranslation(XModuleShifts[stationNum][0], YModuleShifts[stationNum][0],
321 ZModuleShifts[stationNum][0] + 0.5 * ZGasSize_small);
322
323 TGeoCombiTrans* frame1_transform = new TGeoCombiTrans();
324 frame1_transform->RotateZ(180);
325 frame1_transform->SetTranslation(XModuleShifts[stationNum][1], YModuleShifts[stationNum][1],
326 ZModuleShifts[stationNum][1] + 0.5 * ZGasSize_small);
327
328 station->AddNode(module0, 0, new TGeoCombiTrans(*module0_transform));
329 station->AddNode(module1, 0, new TGeoCombiTrans(*module1_transform));
330
331 station->AddNode(frame0, 0, new TGeoCombiTrans(*frame0_transform));
332 station->AddNode(frame1, 0, new TGeoCombiTrans(*frame1_transform));
333 } else {
334 if (stationNum >= 4) { // large CSC
335 for (Int_t imod = 0; imod < NMaxModules; ++imod) {
336
337 TGeoVolume* module =
338 CreateLargeModule(Form("module%d_%s", imod, station->GetName()), ModuleTypes[istation][imod]);
339
340 TGeoCombiTrans* module_transform =
341 new TGeoCombiTrans(Form("transf_module%d_%s", imod, station->GetName()));
342
343 if (ModulesYRotations[istation][imod])
344 module_transform->RotateY(180.0);
345 if (ModulesXRotations[istation][imod])
346 module_transform->RotateX(180.0);
347
348 module_transform->SetTranslation(XModuleShifts[stationNum][imod], YModuleShifts[stationNum][imod],
349 ZModuleShifts[stationNum][imod] + 0.5 * ZGasSize_large);
350
351 station->AddNode(module, 0, module_transform);
352 }
353 }
354 }
355
356 TGeoCombiTrans* station_transform = new TGeoCombiTrans();
357 station_transform->SetTranslation(XStationPositions[stationNum], YStationPositions[stationNum],
358 ZStationPositions[stationNum]);
359
360 CSC->AddNode(station, 0, station_transform);
361 }
362
363 top->AddNode(CSC, 0);
365
366 // --------------- Finish -----------------------------------------------
367 gGeoMan->CloseGeometry();
368 gGeoMan->CheckOverlaps(0.0001);
369 gGeoMan->PrintOverlaps();
370 gGeoMan->Test();
371 // gGeoMan->RestoreMasterVolume();
372
373 TFile* geoFile = new TFile(geoFileName, "RECREATE");
374 top->Write();
375 geoFile->Close();
376 top->Draw("ogl");
377}
378
380{
381
382 TGeoVolume* stationA = new TGeoVolumeAssembly(station_name);
383 stationA->SetMedium(pMedAir);
384
385 return stationA;
386}
387
389{
390
391 // shapes
392 TGeoShape* moduleS = new TGeoBBox(TString("moduleS") + TString("_") + module_name, XGasSize_small * 0.5,
393 YGasSize_small * 0.5, ZGasSize_small * 0.5);
394 TGeoShape* sensS = new TGeoBBox(TString("sensS") + TString("_") + module_name, XSensSize_small * 0.5,
395 YSensSize_small * 0.5, ZSensSize_small * 0.5);
396
397 // volumes
398 TGeoVolume* moduleV = new TGeoVolume(TString("moduleV") + TString("_") + module_name, moduleS);
399 TGeoVolume* sensV = new TGeoVolume(TString("CSCSensor") + TString("_") + module_name, sensS);
400
401 // medium
405 } else
406 Fatal("Main", "Invalid medium for moduleV and sensV volumes!");
407
408 // volume visual property (transparency)
409 moduleV->SetLineColor(TColor::GetColor("#47ffca"));
410 moduleV->SetTransparency(50);
411 sensV->SetLineColor(TColor::GetColor("#ff47ca"));
412 sensV->SetTransparency(50);
413
414 // inner spacer (the spacer located inside a sensitive volume (gas)) --------
415 Double_t innerSpacerPart1_Radius = 1.65 * 0.5; // cm
416 Double_t innerSpacerPart1_ZSize = 0.12; // cm
417
418 Double_t innerSpacerPart2_Radius = 1.15 * 0.5; // cm
419 Double_t innerSpacerPart2_ZSize = 0.52; // cm
420
421 TGeoShape* innerSpacerPart1S =
422 new TGeoTubeSeg(TString("innerSpacerPart1S") + TString("_") + moduleV->GetName(), 0.0, innerSpacerPart1_Radius,
423 innerSpacerPart1_ZSize * 0.5, 0.0, 180.0);
424 TGeoShape* innerSpacerPart2S =
425 new TGeoTubeSeg(TString("innerSpacerPart2S") + TString("_") + moduleV->GetName(), 0.0, innerSpacerPart2_Radius,
426 innerSpacerPart2_ZSize * 0.5, 0.0, 180.0);
427
428 TGeoTranslation* innerSpacerPart1_pos1 = new TGeoTranslation();
429 innerSpacerPart1_pos1->SetName(TString("innerSpacerPart1_pos1") + TString("_") + moduleV->GetName());
430 innerSpacerPart1_pos1->SetDx(0.0);
431 innerSpacerPart1_pos1->SetDy(0.0);
432 innerSpacerPart1_pos1->SetDz(-(ZGasSize_small * 0.5 - innerSpacerPart1_ZSize * 0.5));
433 innerSpacerPart1_pos1->RegisterYourself();
434
435 TGeoTranslation* innerSpacerPart1_pos2 = new TGeoTranslation();
436 innerSpacerPart1_pos2->SetName(TString("innerSpacerPart1_pos2") + TString("_") + moduleV->GetName());
437 innerSpacerPart1_pos2->SetDx(0.0);
438 innerSpacerPart1_pos2->SetDy(0.0);
439 innerSpacerPart1_pos2->SetDz(+(ZGasSize_small * 0.5 - innerSpacerPart1_ZSize * 0.5));
440 innerSpacerPart1_pos2->RegisterYourself();
441
442 TGeoTranslation* innerSpacerPart2_pos = new TGeoTranslation();
443 innerSpacerPart2_pos->SetName(TString("innerSpacerPart2_pos") + TString("_") + moduleV->GetName());
444 innerSpacerPart2_pos->SetDx(0.0);
445 innerSpacerPart2_pos->SetDy(0.0);
446 innerSpacerPart2_pos->SetDz(0.0);
447 innerSpacerPart2_pos->RegisterYourself();
448
449 TGeoCompositeShape* innerSpacerS = new TGeoCompositeShape();
450 innerSpacerS->SetName(TString("innerSpacerS") + TString("_") + moduleV->GetName());
451 {
452 TString expression = "innerSpacerPart1S";
453 expression += TString("_") + moduleV->GetName();
454 expression += ":innerSpacerPart1_pos1";
455 expression += TString("_") + moduleV->GetName();
456 expression += "+innerSpacerPart1S";
457 expression += TString("_") + moduleV->GetName();
458 expression += ":innerSpacerPart1_pos2";
459 expression += TString("_") + moduleV->GetName();
460 expression += "+innerSpacerPart2S";
461 expression += TString("_") + moduleV->GetName();
462 expression += ":innerSpacerPart2_pos";
463 expression += TString("_") + moduleV->GetName();
464
465 innerSpacerS->MakeNode(expression);
466 innerSpacerS->ComputeBBox(); // need to compute a bounding box
467 }
468
469 TGeoVolume* innerSpacerV =
470 new TGeoVolume(TString("innerSpacerV") + TString("_") + moduleV->GetName(), innerSpacerS);
471
472 // volume medium
473 TGeoMedium* innerSpacerV_medium = pMedEpoxideCompound;
474 if (innerSpacerV_medium) {
475 innerSpacerV->SetMedium(innerSpacerV_medium);
476 } else
477 Fatal("Main", "Invalid medium for innerSpacerV!");
478
479 // volume visual property (transparency)
480 innerSpacerV->SetLineColor(TColor::GetColor("#ffcf40"));
481 innerSpacerV->SetTransparency(0);
482
483 TGeoCombiTrans* innerSpacerV_transf[1];
484
485 innerSpacerV_transf[0] = new TGeoCombiTrans();
486 innerSpacerV_transf[0]->SetDx(0.0);
487 innerSpacerV_transf[0]->SetDy(-(YSensSize_small * 0.5));
488 innerSpacerV_transf[0]->SetDz(0.0);
489
490 sensV->AddNode(innerSpacerV, 0, innerSpacerV_transf[0]);
491 //--------------------------------------------------------------------------
492
493 // support wire -------------------------------------------------------------
494 Double_t supportWire_YSize = YSensSize_small - 1.15 * 0.5 /*cut element*/; // cm
495 Double_t supportWire_Radius = 0.08 * 0.5; // cm
496
497 TGeoShape* supportWireS = new TGeoTube(TString("supportWireS") + TString("_") + moduleV->GetName(), 0.0,
498 supportWire_Radius, supportWire_YSize * 0.5);
499
500 TGeoVolume* supportWireV =
501 new TGeoVolume(TString("supportWireV") + TString("_") + moduleV->GetName(), supportWireS);
502
503 // volume medium
504 TGeoMedium* supportWireV_medium = pMedTeflon;
505 if (supportWireV_medium) {
506 supportWireV->SetMedium(supportWireV_medium);
507 } else
508 Fatal("Main", "Invalid medium for supportWireV!");
509
510 // volume visual property (transparency)
511 supportWireV->SetLineColor(TColor::GetColor("#5294ff"));
512 supportWireV->SetTransparency(0);
513
514 TGeoCombiTrans* supportWireV_transf[2];
515
516 supportWireV_transf[0] = new TGeoCombiTrans();
517 supportWireV_transf[0]->RotateX(90.0);
518 supportWireV_transf[0]->SetDx(+0.4 /*shift*/);
519 supportWireV_transf[0]->SetDy(+(YSensSize_small - supportWire_YSize) * 0.5);
520 supportWireV_transf[0]->SetDz(-(supportWire_Radius + 0.005 /*shift*/));
521
522 supportWireV_transf[1] = new TGeoCombiTrans();
523 supportWireV_transf[1]->RotateX(90.0);
524 supportWireV_transf[1]->SetDx(+0.4 /*shift*/);
525 supportWireV_transf[1]->SetDy(+(YSensSize_small - supportWire_YSize) * 0.5);
526 supportWireV_transf[1]->SetDz(+(supportWire_Radius + 0.005 /*shift*/));
527
528 sensV->AddNode(supportWireV, 0, supportWireV_transf[0]);
529 sensV->AddNode(supportWireV, 1, supportWireV_transf[1]);
530 //--------------------------------------------------------------------------
531
532 TGeoCombiTrans* sensV_transf[1];
533 sensV_transf[0] = new TGeoCombiTrans();
534 sensV_transf[0]->SetDx(0.0);
535 sensV_transf[0]->SetDy(-(YGasSize_small - YSensSize_small) * 0.5);
536 sensV_transf[0]->SetDz(0.0);
537
538 moduleV->AddNode(sensV, 0, sensV_transf[0]);
539
540 return moduleV;
541}
542//------------------------------------------------------------------------------
543
545{
546
547 // frame
548 TGeoVolume* frameA = new TGeoVolumeAssembly(frame_name);
549 frameA->SetMedium(pMedAir);
550
551 // vertical frames ----------------------------------------------------------
552 Double_t verticalFrame_XSize = 4.5; // cm
553 Double_t verticalFrame_YSize = YGasSize_small; // cm
554 Double_t verticalFrame_ZSize = 3.25; // cm
555
556 Double_t verticalFrameHole_Radius = 1.6 * 0.5; // cm
557 Double_t verticalFrameHole_ZSize = 0.6; // cm
558
559 TGeoShape* verticalFrameS =
560 new TGeoBBox(TString("verticalFrameS") + TString("_") + frameA->GetName(), verticalFrame_XSize * 0.5,
561 verticalFrame_YSize * 0.5, verticalFrame_ZSize * 0.5);
562 TGeoShape* verticalFrameHoleS = new TGeoTube(TString("verticalFrameHoleS") + TString("_") + frameA->GetName(), 0.0,
563 verticalFrameHole_Radius, verticalFrameHole_ZSize * 0.5);
564
565 TGeoVolume* verticalFrameV =
566 new TGeoVolume(TString("verticalFrameV") + TString("_") + frameA->GetName(), verticalFrameS);
567 TGeoVolume* verticalFrameHoleV =
568 new TGeoVolume(TString("verticalFrameHoleV") + TString("_") + frameA->GetName(), verticalFrameHoleS);
569
570 // volume medium
571 TGeoMedium* verticalFrameV_medium = pMedFiberGlass;
572 if (verticalFrameV_medium) {
573 verticalFrameV->SetMedium(verticalFrameV_medium);
574 } else
575 Fatal("Main", "Invalid medium for verticalFrameV!");
576
577 TGeoMedium* verticalFrameHoleV_medium = pMedAir;
578 if (verticalFrameHoleV_medium) {
579 verticalFrameHoleV->SetMedium(verticalFrameHoleV_medium);
580 } else
581 Fatal("Main", "Invalid medium for verticalFrameHoleV!");
582
583 // volume visual property (transparency)
584 verticalFrameV->SetLineColor(TColor::GetColor("#9999ff"));
585 verticalFrameV->SetTransparency(0);
586 verticalFrameHoleV->SetLineColor(TColor::GetColor("#ffffff"));
587 verticalFrameHoleV->SetTransparency(0);
588
589 TGeoCombiTrans* verticalFrameHoleV_transf[8];
590 {
591 Double_t y_pos = verticalFrame_YSize * 0.5 - 9.175;
592 for (Int_t i = 0; i < 4; ++i) {
593 verticalFrameHoleV_transf[i] = new TGeoCombiTrans();
594 verticalFrameHoleV_transf[i]->SetDx(+0.65 /*shift*/);
595 verticalFrameHoleV_transf[i]->SetDy(y_pos);
596 verticalFrameHoleV_transf[i]->SetDz(-verticalFrame_ZSize * 0.5 + verticalFrameHole_ZSize * 0.5
597 - 0.0001 /*shift*/);
598
599 verticalFrameHoleV_transf[i + 4] = new TGeoCombiTrans();
600 verticalFrameHoleV_transf[i + 4]->SetDx(+0.65 /*shift*/);
601 verticalFrameHoleV_transf[i + 4]->SetDy(y_pos);
602 verticalFrameHoleV_transf[i + 4]->SetDz(
603 -(-verticalFrame_ZSize * 0.5 + verticalFrameHole_ZSize * 0.5 - 0.0001 /*shift*/));
604
605 verticalFrameV->AddNode(verticalFrameHoleV, i, verticalFrameHoleV_transf[i]);
606 verticalFrameV->AddNode(verticalFrameHoleV, i + 4, verticalFrameHoleV_transf[i + 4]);
607
608 y_pos -= 12.5;
609 }
610 }
611
612 TGeoCombiTrans* verticalFrameV_transf[2];
613
614 verticalFrameV_transf[0] = new TGeoCombiTrans();
615 verticalFrameV_transf[0]->SetDx(+(XGasSize_small * 0.5 + verticalFrame_XSize * 0.5));
616 verticalFrameV_transf[0]->SetDy(0.0);
617 verticalFrameV_transf[0]->SetDz(0.0);
618
619 verticalFrameV_transf[1] = new TGeoCombiTrans();
620 // verticalFrameV_transf[1]->ReflectX(true);
621 verticalFrameV_transf[1]->RotateY(180.0);
622 verticalFrameV_transf[1]->SetDx(-(XGasSize_small * 0.5 + verticalFrame_XSize * 0.5));
623 verticalFrameV_transf[1]->SetDy(0.0);
624 verticalFrameV_transf[1]->SetDz(0.0);
625
626 frameA->AddNode(verticalFrameV, 0, verticalFrameV_transf[0]);
627 frameA->AddNode(verticalFrameV, 1, verticalFrameV_transf[1]);
628 //--------------------------------------------------------------------------
629
630 // horizontal frame ---------------------------------------------------------
631 Double_t horizontalFrame_XSize = XGasSize_small + verticalFrame_XSize * 2; // cm
632 Double_t horizontalFrame_YSize = 4.5; // cm
633 Double_t horizontalFrame_ZSize = 3.25; // cm
634
635 Double_t horizontalFrameHole_Radius = 1.6 * 0.5; // cm
636 Double_t horizontalFrameHole_ZSize = 0.6; // cm
637
638 TGeoShape* horizontalFrameS =
639 new TGeoBBox(TString("horizontalFrameS") + TString("_") + frameA->GetName(), horizontalFrame_XSize * 0.5,
640 horizontalFrame_YSize * 0.5, horizontalFrame_ZSize * 0.5);
641 TGeoShape* horizontalFrameHoleS = new TGeoTube(TString("horizontalFrameHoleS") + TString("_") + frameA->GetName(),
642 0.0, horizontalFrameHole_Radius, horizontalFrameHole_ZSize * 0.5);
643
644 TGeoVolume* horizontalFrameV =
645 new TGeoVolume(TString("horizontalFrameV") + TString("_") + frameA->GetName(), horizontalFrameS);
646 TGeoVolume* horizontalFrameHoleV =
647 new TGeoVolume(TString("horizontalFrameHoleV") + TString("_") + frameA->GetName(), horizontalFrameHoleS);
648
649 // volume medium
650 TGeoMedium* horizontalFrameV_medium = pMedFiberGlass;
651 if (horizontalFrameV_medium) {
652 horizontalFrameV->SetMedium(horizontalFrameV_medium);
653 } else
654 Fatal("Main", "Invalid medium for horizontalFrameV!");
655
656 TGeoMedium* horizontalFrameHoleV_medium = pMedAir;
657 if (horizontalFrameHoleV_medium) {
658 horizontalFrameHoleV->SetMedium(horizontalFrameHoleV_medium);
659 } else
660 Fatal("Main", "Invalid medium for horizontalFrameHoleV!");
661
662 // volume visual property (transparency)
663 horizontalFrameV->SetLineColor(TColor::GetColor("#9999ff"));
664 horizontalFrameV->SetTransparency(0);
665 horizontalFrameHoleV->SetLineColor(TColor::GetColor("#ffffff"));
666 horizontalFrameHoleV->SetTransparency(0);
667
668 TGeoCombiTrans* horizontalFrameHoleV_transf[20];
669 {
670 Double_t x_pos = horizontalFrame_XSize * 0.5 - 1.6;
671 for (Int_t i = 0; i < 10; ++i) {
672 horizontalFrameHoleV_transf[i] = new TGeoCombiTrans();
673 horizontalFrameHoleV_transf[i]->SetDx(x_pos);
674 horizontalFrameHoleV_transf[i]->SetDy(+0.65 /*shift*/);
675 horizontalFrameHoleV_transf[i]->SetDz(-horizontalFrame_ZSize * 0.5 + horizontalFrameHole_ZSize * 0.5
676 - 0.0001 /*shift*/);
677
678 horizontalFrameHoleV_transf[i + 10] = new TGeoCombiTrans();
679 horizontalFrameHoleV_transf[i + 10]->SetDx(x_pos);
680 horizontalFrameHoleV_transf[i + 10]->SetDy(+0.65 /*shift*/);
681 horizontalFrameHoleV_transf[i + 10]->SetDz(
682 -(-horizontalFrame_ZSize * 0.5 + horizontalFrameHole_ZSize * 0.5 - 0.0001 /*shift*/));
683
684 horizontalFrameV->AddNode(horizontalFrameHoleV, i, horizontalFrameHoleV_transf[i]);
685 horizontalFrameV->AddNode(horizontalFrameHoleV, i + 10, horizontalFrameHoleV_transf[i + 10]);
686
687 if (i == 0 || i == 8)
688 x_pos -= 15.6;
689 else
690 x_pos -= 12.5;
691 }
692 }
693
694 TGeoCombiTrans* horizontalFrameV_transf[1];
695
696 horizontalFrameV_transf[0] = new TGeoCombiTrans();
697 horizontalFrameV_transf[0]->SetDx(0.0);
698 horizontalFrameV_transf[0]->SetDy(+(YGasSize_small * 0.5 + horizontalFrame_YSize * 0.5));
699 horizontalFrameV_transf[0]->SetDz(0.0);
700
701 frameA->AddNode(horizontalFrameV, 0, horizontalFrameV_transf[0]);
702 //--------------------------------------------------------------------------
703
704 // panels -------------------------------------------------------------------
705 Double_t fiberGlassPanel_XSize = XGasSize_small; // cm
706 Double_t fiberGlassPanel_YSize = YGasSize_small; // cm
707 Double_t fiberGlassPanel_ZSize = 0.1; // cm
708 Double_t fiberGlassPanel_HoleRadius = 1.75; // cm
709
710 Double_t honeyCombPanel_XSize = XGasSize_small; // cm
711 Double_t honeyCombPanel_YSize = YGasSize_small; // cm
712 Double_t honeyCombPanel_ZSize = 1.05; // cm
713 Double_t honeyCombPanel_HoleRadius = 1.75; // cm
714
715 // TGeoShape *fiberGlassPanelS = new TGeoBBox(TString("fiberGlassPanelS")+=TString("_") + frameA->GetName(),
716 // fiberGlassPanel_XSize*0.5, fiberGlassPanel_YSize*0.5, fiberGlassPanel_ZSize*0.5);
717 TGeoShape* fiberGlassPanelBigPartS =
718 new TGeoBBox(TString("fiberGlassPanelBigPartS") + TString("_") + frameA->GetName(), fiberGlassPanel_XSize * 0.5,
719 (fiberGlassPanel_YSize - fiberGlassPanel_HoleRadius) * 0.5, fiberGlassPanel_ZSize * 0.5);
720 TGeoShape* fiberGlassPanelSmallPartS =
721 new TGeoBBox(TString("fiberGlassPanelSmallPartS") + TString("_") + frameA->GetName(),
722 (fiberGlassPanel_XSize * 0.5 - fiberGlassPanel_HoleRadius) * 0.5, fiberGlassPanel_HoleRadius * 0.5,
723 fiberGlassPanel_ZSize * 0.5);
724
725 TGeoTranslation* fiberGlassPanelBigPart_pos = new TGeoTranslation();
726 fiberGlassPanelBigPart_pos->SetName(TString("fiberGlassPanelBigPart_pos") + TString("_") + frameA->GetName());
727 fiberGlassPanelBigPart_pos->SetDx(0.0);
728 fiberGlassPanelBigPart_pos->SetDy(+fiberGlassPanel_HoleRadius * 0.5 + 0.0001);
729 fiberGlassPanelBigPart_pos->SetDz(0.0);
730 fiberGlassPanelBigPart_pos->RegisterYourself();
731
732 TGeoTranslation* fiberGlassPanelSmallPart_pos1 = new TGeoTranslation();
733 fiberGlassPanelSmallPart_pos1->SetName(TString("fiberGlassPanelSmallPart_pos1") +=
734 TString("_") + frameA->GetName());
735 fiberGlassPanelSmallPart_pos1->SetDx(+(fiberGlassPanel_XSize * 0.5 + fiberGlassPanel_HoleRadius) * 0.5);
736 fiberGlassPanelSmallPart_pos1->SetDy(-(fiberGlassPanel_YSize - fiberGlassPanel_HoleRadius) * 0.5);
737 fiberGlassPanelSmallPart_pos1->SetDz(0.0);
738 fiberGlassPanelSmallPart_pos1->RegisterYourself();
739
740 TGeoTranslation* fiberGlassPanelSmallPart_pos2 = new TGeoTranslation();
741 fiberGlassPanelSmallPart_pos2->SetName(TString("fiberGlassPanelSmallPart_pos2") +=
742 TString("_") + frameA->GetName());
743 fiberGlassPanelSmallPart_pos2->SetDx(-(fiberGlassPanel_XSize * 0.5 + fiberGlassPanel_HoleRadius) * 0.5);
744 fiberGlassPanelSmallPart_pos2->SetDy(-(fiberGlassPanel_YSize - fiberGlassPanel_HoleRadius) * 0.5);
745 fiberGlassPanelSmallPart_pos2->SetDz(0.0);
746 fiberGlassPanelSmallPart_pos2->RegisterYourself();
747
748 TGeoCompositeShape* fiberGlassPanelS = new TGeoCompositeShape();
749 fiberGlassPanelS->SetName(TString("fiberGlassPanelS") + TString("_") + frameA->GetName());
750 {
751 TString expression = "fiberGlassPanelBigPartS";
752 expression += TString("_") + frameA->GetName();
753 expression += ":fiberGlassPanelBigPart_pos";
754 expression += TString("_") + frameA->GetName();
755 expression += "+fiberGlassPanelSmallPartS";
756 expression += TString("_") + frameA->GetName();
757 expression += ":fiberGlassPanelSmallPart_pos1";
758 expression += TString("_") + frameA->GetName();
759 expression += "+fiberGlassPanelSmallPartS";
760 expression += TString("_") + frameA->GetName();
761 expression += ":fiberGlassPanelSmallPart_pos2";
762 expression += TString("_") + frameA->GetName();
763
764 fiberGlassPanelS->MakeNode(expression);
765 fiberGlassPanelS->ComputeBBox(); // need to compute a bounding box
766 }
767
768 // TGeoShape *honeyCombPanelS = new TGeoBBox(TString("honeyCombPanelS")+=TString("_") + frameA->GetName(),
769 // honeyCombPanel_XSize*0.5, honeyCombPanel_YSize*0.5, honeyCombPanel_ZSize*0.5);
770 TGeoShape* honeyCombPanelBigPartS =
771 new TGeoBBox(TString("honeyCombPanelBigPartS") + TString("_") + frameA->GetName(), honeyCombPanel_XSize * 0.5,
772 (honeyCombPanel_YSize - honeyCombPanel_HoleRadius) * 0.5, honeyCombPanel_ZSize * 0.5);
773 TGeoShape* honeyCombPanelSmallPartS =
774 new TGeoBBox(TString("honeyCombPanelSmallPartS") + TString("_") + frameA->GetName(),
775 (honeyCombPanel_XSize * 0.5 - honeyCombPanel_HoleRadius) * 0.5, honeyCombPanel_HoleRadius * 0.5,
776 honeyCombPanel_ZSize * 0.5);
777
778 TGeoTranslation* honeyCombPanelBigPart_pos = new TGeoTranslation();
779 honeyCombPanelBigPart_pos->SetName(TString("honeyCombPanelBigPart_pos") + TString("_") + frameA->GetName());
780 honeyCombPanelBigPart_pos->SetDx(0.0);
781 honeyCombPanelBigPart_pos->SetDy(+honeyCombPanel_HoleRadius * 0.5 + 0.0001);
782 honeyCombPanelBigPart_pos->SetDz(0.0);
783 honeyCombPanelBigPart_pos->RegisterYourself();
784
785 TGeoTranslation* honeyCombPanelSmallPart_pos1 = new TGeoTranslation();
786 honeyCombPanelSmallPart_pos1->SetName(TString("honeyCombPanelSmallPart_pos1") + TString("_") + frameA->GetName());
787 honeyCombPanelSmallPart_pos1->SetDx(+(honeyCombPanel_XSize * 0.5 + honeyCombPanel_HoleRadius) * 0.5);
788 honeyCombPanelSmallPart_pos1->SetDy(-(honeyCombPanel_YSize - honeyCombPanel_HoleRadius) * 0.5);
789 honeyCombPanelSmallPart_pos1->SetDz(0.0);
790 honeyCombPanelSmallPart_pos1->RegisterYourself();
791
792 TGeoTranslation* honeyCombPanelSmallPart_pos2 = new TGeoTranslation();
793 honeyCombPanelSmallPart_pos2->SetName(TString("honeyCombPanelSmallPart_pos2") + TString("_") + frameA->GetName());
794 honeyCombPanelSmallPart_pos2->SetDx(-(honeyCombPanel_XSize * 0.5 + honeyCombPanel_HoleRadius) * 0.5);
795 honeyCombPanelSmallPart_pos2->SetDy(-(honeyCombPanel_YSize - honeyCombPanel_HoleRadius) * 0.5);
796 honeyCombPanelSmallPart_pos2->SetDz(0.0);
797 honeyCombPanelSmallPart_pos2->RegisterYourself();
798
799 TGeoCompositeShape* honeyCombPanelS = new TGeoCompositeShape();
800 honeyCombPanelS->SetName(TString("honeyCombPanelS") + TString("_") + frameA->GetName());
801 {
802 TString expression = "honeyCombPanelBigPartS";
803 expression += TString("_") + frameA->GetName();
804 expression += ":honeyCombPanelBigPart_pos";
805 expression += TString("_") + frameA->GetName();
806 expression += "+honeyCombPanelSmallPartS";
807 expression += TString("_") + frameA->GetName();
808 expression += ":honeyCombPanelSmallPart_pos1";
809 expression += TString("_") + frameA->GetName();
810 expression += "+honeyCombPanelSmallPartS";
811 expression += TString("_") + frameA->GetName();
812 expression += ":honeyCombPanelSmallPart_pos2";
813 expression += TString("_") + frameA->GetName();
814
815 honeyCombPanelS->MakeNode(expression);
816 honeyCombPanelS->ComputeBBox(); // need to compute a bounding box
817 }
818
819 TGeoVolume* fiberGlassPanelV =
820 new TGeoVolume(TString("fiberGlassPanelV") + TString("_") + frameA->GetName(), fiberGlassPanelS);
821 TGeoVolume* honeyCombPanelV =
822 new TGeoVolume(TString("honeyCombPanelV") + TString("_") + frameA->GetName(), honeyCombPanelS);
823
824 // volume medium
825 TGeoMedium* fiberGlassPanelV_medium = pMedFiberGlass;
826 if (fiberGlassPanelV_medium) {
827 fiberGlassPanelV->SetMedium(fiberGlassPanelV_medium);
828 } else
829 Fatal("Main", "Invalid medium for fiberGlassPanelV!");
830
831 TGeoMedium* honeyCombPanelV_medium = pMedHoneyComb;
832 if (honeyCombPanelV_medium) {
833 honeyCombPanelV->SetMedium(honeyCombPanelV_medium);
834 } else
835 Fatal("Main", "Invalid medium for honeyCombPanelV!");
836
837 // volume visual property (transparency)
838 fiberGlassPanelV->SetLineColor(TColor::GetColor("#ffcf40"));
839 fiberGlassPanelV->SetTransparency(0);
840 honeyCombPanelV->SetLineColor(TColor::GetColor("#ffff00"));
841 honeyCombPanelV->SetTransparency(0);
842
843 TGeoCombiTrans* fiberGlassPanelV_transf[4];
844
845 fiberGlassPanelV_transf[0] = new TGeoCombiTrans();
846 fiberGlassPanelV_transf[0]->SetDx(0.0);
847 fiberGlassPanelV_transf[0]->SetDy(0.0);
848 fiberGlassPanelV_transf[0]->SetDz(-(ZGasSize_small * 0.5 + fiberGlassPanel_ZSize * 0.5));
849
850 fiberGlassPanelV_transf[1] = new TGeoCombiTrans();
851 fiberGlassPanelV_transf[1]->SetDx(0.0);
852 fiberGlassPanelV_transf[1]->SetDy(0.0);
853 fiberGlassPanelV_transf[1]->SetDz(+(ZGasSize_small * 0.5 + fiberGlassPanel_ZSize * 0.5));
854
855 fiberGlassPanelV_transf[2] = new TGeoCombiTrans();
856 fiberGlassPanelV_transf[2]->SetDx(0.0);
857 fiberGlassPanelV_transf[2]->SetDy(0.0);
858 fiberGlassPanelV_transf[2]->SetDz(
859 -(ZGasSize_small * 0.5 + fiberGlassPanel_ZSize + honeyCombPanel_ZSize + fiberGlassPanel_ZSize * 0.5));
860
861 fiberGlassPanelV_transf[3] = new TGeoCombiTrans();
862 fiberGlassPanelV_transf[3]->SetDx(0.0);
863 fiberGlassPanelV_transf[3]->SetDy(0.0);
864 fiberGlassPanelV_transf[3]->SetDz(
865 +(ZGasSize_small * 0.5 + fiberGlassPanel_ZSize + honeyCombPanel_ZSize + fiberGlassPanel_ZSize * 0.5));
866
867 TGeoCombiTrans* honeyCombPanelV_transf[4];
868
869 honeyCombPanelV_transf[0] = new TGeoCombiTrans();
870 honeyCombPanelV_transf[0]->SetDx(0.0);
871 honeyCombPanelV_transf[0]->SetDy(0.0);
872 honeyCombPanelV_transf[0]->SetDz(-(ZGasSize_small * 0.5 + fiberGlassPanel_ZSize + honeyCombPanel_ZSize * 0.5));
873
874 honeyCombPanelV_transf[1] = new TGeoCombiTrans();
875 honeyCombPanelV_transf[1]->SetDx(0.0);
876 honeyCombPanelV_transf[1]->SetDy(0.0);
877 honeyCombPanelV_transf[1]->SetDz(+(ZGasSize_small * 0.5 + fiberGlassPanel_ZSize + honeyCombPanel_ZSize * 0.5));
878
879 frameA->AddNode(fiberGlassPanelV, 0, fiberGlassPanelV_transf[0]);
880 frameA->AddNode(fiberGlassPanelV, 1, fiberGlassPanelV_transf[1]);
881 frameA->AddNode(fiberGlassPanelV, 2, fiberGlassPanelV_transf[2]);
882 frameA->AddNode(fiberGlassPanelV, 3, fiberGlassPanelV_transf[3]);
883
884 frameA->AddNode(honeyCombPanelV, 0, honeyCombPanelV_transf[0]);
885 frameA->AddNode(honeyCombPanelV, 1, honeyCombPanelV_transf[1]);
886 //--------------------------------------------------------------------------
887
888 // outer spacer (the spacer located inside a sensitive volume (gas)) --------
889 Double_t outerSpacerPart1_Radius = 0.8 * 0.5; // cm
890 Double_t outerSpacerPart1_ZSize = 0.4; // cm
891
892 TGeoShape* outerSpacerPart1S = new TGeoTubeSeg(TString("outerSpacerPart1S") + TString("_") + frameA->GetName(), 0.0,
893 outerSpacerPart1_Radius, outerSpacerPart1_ZSize * 0.5, 0.0, 360.0);
894
895 TGeoTranslation* outerSpacerPart1_pos1 = new TGeoTranslation();
896 outerSpacerPart1_pos1->SetName(TString("outerSpacerPart1_pos1") + TString("_") + frameA->GetName());
897 outerSpacerPart1_pos1->SetDx(0.0);
898 outerSpacerPart1_pos1->SetDy(0.0);
899 outerSpacerPart1_pos1->SetDz(-(ZGasSize_small * 0.5 + outerSpacerPart1_ZSize * 0.5));
900 outerSpacerPart1_pos1->RegisterYourself();
901
902 TGeoTranslation* outerSpacerPart1_pos2 = new TGeoTranslation();
903 outerSpacerPart1_pos2->SetName(TString("outerSpacerPart1_pos2") + TString("_") + frameA->GetName());
904 outerSpacerPart1_pos2->SetDx(0.0);
905 outerSpacerPart1_pos2->SetDy(0.0);
906 outerSpacerPart1_pos2->SetDz(+(ZGasSize_small * 0.5 + outerSpacerPart1_ZSize * 0.5));
907 outerSpacerPart1_pos2->RegisterYourself();
908
909 TGeoCompositeShape* outerSpacerS = new TGeoCompositeShape();
910 outerSpacerS->SetName(TString("outerSpacerS") + TString("_") + frameA->GetName());
911 {
912 TString expression = "outerSpacerPart1S";
913 expression += TString("_") + frameA->GetName();
914 expression += ":outerSpacerPart1_pos1";
915 expression += TString("_") + frameA->GetName();
916 expression += "+outerSpacerPart1S";
917 expression += TString("_") + frameA->GetName();
918 expression += ":outerSpacerPart1_pos2";
919 expression += TString("_") + frameA->GetName();
920
921 outerSpacerS->MakeNode(expression);
922 outerSpacerS->ComputeBBox(); // need to compute a bounding box
923 }
924
925 TGeoVolume* outerSpacerV = new TGeoVolume(TString("outerSpacerV") + TString("_") + frameA->GetName(), outerSpacerS);
926
927 // volume medium
928 TGeoMedium* outerSpacerV_medium = pMedEpoxideCompound;
929 if (outerSpacerV_medium) {
930 outerSpacerV->SetMedium(outerSpacerV_medium);
931 } else
932 Fatal("Main", "Invalid medium for outerSpacerV!");
933
934 // volume visual property (transparency)
935 outerSpacerV->SetLineColor(TColor::GetColor("#ffcf40"));
936 outerSpacerV->SetTransparency(0);
937
938 TGeoCombiTrans* outerSpacerV_transf[1];
939
940 outerSpacerV_transf[0] = new TGeoCombiTrans();
941 outerSpacerV_transf[0]->SetDx(0.0);
942 outerSpacerV_transf[0]->SetDy(-(YGasSize_small * 0.5));
943 outerSpacerV_transf[0]->SetDz(0.0);
944
945 if (!TString(frameA->GetName()).Contains("frame1")) {
946 frameA->AddNode(outerSpacerV, 0, outerSpacerV_transf[0]);
947 }
948 //--------------------------------------------------------------------------
949
950 // spacer bed ---------------------------------------------------------------
951 Double_t spacerBed_XSize = 3.5; // cm
952 Double_t spacerBed_YSize = 3.5; // cm
953 Double_t spacerBed_ZSize = 1.25; // cm
954
955 Double_t spacerBedInnerHole_Radius = 0.8 * 0.5 + 0.01; // cm
956 Double_t spacerBedInnerHole_ZSize = 0.4; // cm
957
958 Double_t spacerBedOuterHole_Radius = 2.0 * 0.5; // cm
959 Double_t spacerBedOuterHole_ZSize = 0.85; // cm
960
961 TGeoShape* spacerBedBlankS = new TGeoBBox(TString("spacerBedBlankS") + TString("_") + frameA->GetName(),
962 spacerBed_XSize * 0.5, spacerBed_YSize * 0.5, spacerBed_ZSize * 0.5);
963 TGeoShape* spacerBedInnerHoleS = new TGeoTube(TString("spacerBedInnerHoleS") + TString("_") + frameA->GetName(),
964 0.0, spacerBedInnerHole_Radius, (spacerBed_ZSize + 0.01) * 0.5);
965 TGeoShape* spacerBedOuterHoleS =
966 new TGeoTube(TString("spacerBedOuterHoleS") + TString("_") + frameA->GetName(), 0.0, spacerBedOuterHole_Radius,
967 (spacerBedOuterHole_ZSize + 0.01) * 0.5);
968
969 TGeoTranslation* spacerBedBlank_pos = new TGeoTranslation();
970 spacerBedBlank_pos->SetName(TString("spacerBedBlank_pos") + TString("_") + frameA->GetName());
971 spacerBedBlank_pos->SetDx(0.0);
972 spacerBedBlank_pos->SetDy(0.0);
973 spacerBedBlank_pos->SetDz(0.0);
974 spacerBedBlank_pos->RegisterYourself();
975
976 TGeoTranslation* spacerBedInnerHole_pos = new TGeoTranslation();
977 spacerBedInnerHole_pos->SetName(TString("spacerBedInnerHole_pos") + TString("_") + frameA->GetName());
978 spacerBedInnerHole_pos->SetDx(0.0);
979 spacerBedInnerHole_pos->SetDy(0.0);
980 spacerBedInnerHole_pos->SetDz(0.0);
981 spacerBedInnerHole_pos->RegisterYourself();
982
983 TGeoTranslation* spacerBedOuterHole_pos = new TGeoTranslation();
984 spacerBedOuterHole_pos->SetName(TString("spacerBedOuterHole_pos") + TString("_") + frameA->GetName());
985 spacerBedOuterHole_pos->SetDx(0.0);
986 spacerBedOuterHole_pos->SetDy(0.0);
987 spacerBedOuterHole_pos->SetDz(-(spacerBed_ZSize * 0.5 - spacerBedOuterHole_ZSize * 0.5 + 0.01));
988 spacerBedOuterHole_pos->RegisterYourself();
989
990 TGeoCompositeShape* spacerBedS = new TGeoCompositeShape();
991 spacerBedS->SetName(TString("spacerBedS") + TString("_") + frameA->GetName());
992 {
993 TString expression = "spacerBedBlankS";
994 expression += TString("_") + frameA->GetName();
995 expression += ":spacerBedBlank_pos";
996 expression += TString("_") + frameA->GetName();
997 expression += "-spacerBedOuterHoleS";
998 expression += TString("_") + frameA->GetName();
999 expression += ":spacerBedOuterHole_pos";
1000 expression += TString("_") + frameA->GetName();
1001 expression += "-spacerBedInnerHoleS";
1002 expression += TString("_") + frameA->GetName();
1003 expression += ":spacerBedInnerHole_pos";
1004 expression += TString("_") + frameA->GetName();
1005
1006 spacerBedS->MakeNode(expression);
1007 spacerBedS->ComputeBBox(); // need to compute a bounding box
1008 }
1009
1010 TGeoVolume* spacerBedV = new TGeoVolume(TString("spacerBedV") + TString("_") + frameA->GetName(), spacerBedS);
1011
1012 // volume medium
1013 TGeoMedium* spacerBedV_medium = pMedFiberGlass;
1014 if (spacerBedV_medium) {
1015 spacerBedV->SetMedium(spacerBedV_medium);
1016 } else
1017 Fatal("Main", "Invalid medium for spacerBedV!");
1018
1019 // volume visual property (transparency)
1020 spacerBedV->SetLineColor(TColor::GetColor("#c2ff99"));
1021 spacerBedV->SetTransparency(0);
1022
1023 TGeoCombiTrans* spacerBedV_transf[2];
1024
1025 spacerBedV_transf[0] = new TGeoCombiTrans();
1026 spacerBedV_transf[0]->SetDx(0.0);
1027 spacerBedV_transf[0]->SetDy(-(YGasSize_small * 0.5));
1028 spacerBedV_transf[0]->SetDz(-(ZGasSize_small * 0.5 + spacerBed_ZSize * 0.5));
1029
1030 spacerBedV_transf[1] = new TGeoCombiTrans();
1031 spacerBedV_transf[1]->RotateY(180.0);
1032 spacerBedV_transf[1]->SetDx(0.0);
1033 spacerBedV_transf[1]->SetDy(-(YGasSize_small * 0.5));
1034 spacerBedV_transf[1]->SetDz(+(ZGasSize_small * 0.5 + spacerBed_ZSize * 0.5));
1035
1036 if (!TString(frameA->GetName()).Contains("frame1")) {
1037 frameA->AddNode(spacerBedV, 0, spacerBedV_transf[0]);
1038 frameA->AddNode(spacerBedV, 1, spacerBedV_transf[1]);
1039 }
1040 //--------------------------------------------------------------------------
1041
1042 // fixing plate -------------------------------------------------------------
1043 Double_t fixingPlate_Radius = 1.8 * 0.5; // cm
1044 Double_t fixingPlate_ZSize = 0.3; // cm
1045
1046 TGeoShape* fixingPlateS = new TGeoTube(TString("fixingPlateS") + TString("_") + frameA->GetName(), 0.0,
1047 fixingPlate_Radius, fixingPlate_ZSize * 0.5);
1048
1049 TGeoVolume* fixingPlateV = new TGeoVolume(TString("fixingPlateV") + TString("_") + frameA->GetName(), fixingPlateS);
1050
1051 // volume medium
1052 TGeoMedium* fixingPlateV_medium = pMedBrass;
1053 if (fixingPlateV_medium) {
1054 fixingPlateV->SetMedium(fixingPlateV_medium);
1055 } else
1056 Fatal("Main", "Invalid medium for fixingPlateV!");
1057
1058 // volume visual property (transparency)
1059 fixingPlateV->SetLineColor(TColor::GetColor("#ffcfaa"));
1060 fixingPlateV->SetTransparency(0);
1061
1062 TGeoCombiTrans* fixingPlateV_transf[2];
1063
1064 fixingPlateV_transf[0] = new TGeoCombiTrans();
1065 fixingPlateV_transf[0]->SetDx(0.0);
1066 fixingPlateV_transf[0]->SetDy(-(YGasSize_small * 0.5));
1067 fixingPlateV_transf[0]->SetDz(
1068 -(ZGasSize_small * 0.5 + fixingPlate_ZSize * 0.5 + spacerBedInnerHole_ZSize + 0.005 /*shift*/));
1069
1070 fixingPlateV_transf[1] = new TGeoCombiTrans();
1071 fixingPlateV_transf[1]->SetDx(0.0);
1072 fixingPlateV_transf[1]->SetDy(-(YGasSize_small * 0.5));
1073 fixingPlateV_transf[1]->SetDz(
1074 +(ZGasSize_small * 0.5 + fixingPlate_ZSize * 0.5 + spacerBedInnerHole_ZSize + 0.005 /*shift*/));
1075
1076 if (!TString(frameA->GetName()).Contains("frame1")) {
1077 frameA->AddNode(fixingPlateV, 0, fixingPlateV_transf[0]);
1078 frameA->AddNode(fixingPlateV, 1, fixingPlateV_transf[1]);
1079 }
1080 //--------------------------------------------------------------------------
1081
1082 return frameA;
1083}
1084
1086{
1087
1088 // shapes
1089 TGeoShape* moduleS = 0;
1090
1091 switch (module_type) {
1092 case ModuleType::WHOLE_MOD: {
1093 moduleS = new TGeoBBox(Form("moduleS_%s", module_name.Data()), XGasSize_large * 0.5, YGasSize_large * 0.5,
1094 ZGasSize_large * 0.5);
1095 break;
1096 }
1097 case ModuleType::HOLED_LEFT_MOD: {
1098 moduleS = new TGeoXtru(2);
1099 moduleS->SetName(Form("moduleS_%s", module_name.Data()));
1100 Double_t x_pos[6] = {+XGasSize_large * 0.5,
1101 -XGasSize_large * 0.5,
1102 -XGasSize_large * 0.5,
1105 +XGasSize_large * 0.5};
1106 Double_t y_pos[6] = {+YGasSize_large * 0.5,
1107 +YGasSize_large * 0.5,
1110 -YGasSize_large * 0.5,
1111 -YGasSize_large * 0.5};
1112 ((TGeoXtru*)moduleS)->DefinePolygon(6, x_pos, y_pos);
1113 ((TGeoXtru*)moduleS)->DefineSection(0, -ZGasSize_large * 0.5);
1114 ((TGeoXtru*)moduleS)->DefineSection(1, +ZGasSize_large * 0.5);
1115 break;
1116 }
1117 case ModuleType::HOLED_RIGHT_MOD: {
1118 moduleS = new TGeoXtru(2);
1119 moduleS->SetName(Form("moduleS_%s", module_name.Data()));
1120 Double_t x_pos[6] = {-XGasSize_large * 0.5,
1121 -XGasSize_large * 0.5,
1122 +XGasSize_large * 0.5,
1123 +XGasSize_large * 0.5,
1126 Double_t y_pos[6] = {-YGasSize_large * 0.5,
1127 +YGasSize_large * 0.5,
1128 +YGasSize_large * 0.5,
1131 -YGasSize_large * 0.5};
1132 ((TGeoXtru*)moduleS)->DefinePolygon(6, x_pos, y_pos);
1133 ((TGeoXtru*)moduleS)->DefineSection(0, -ZGasSize_large * 0.5);
1134 ((TGeoXtru*)moduleS)->DefineSection(1, +ZGasSize_large * 0.5);
1135 break;
1136 }
1137 default:
1138 Error("CreateModule()", "Incorrect module type selected!!!");
1139 }
1140
1141 // volumes
1142 TGeoVolume* moduleV = new TGeoVolume(Form("CSCSensor_%s", module_name.Data()), moduleS);
1143
1144 // medium
1147 } else
1148 Fatal("Main", "Invalid medium for moduleV volume!");
1149
1150 // volume visual property (transparency)
1151 moduleV->SetLineColor(TColor::GetColor("#47ffca"));
1152 moduleV->SetTransparency(30);
1153
1154 return moduleV;
1155}
1156//------------------------------------------------------------------------------
int i
Definition P4_F32vec4.h:22
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
char * Form(const char *fmt,...)
R__EXTERN TSystem * gSystem
static Int_t GetColor(const char *hexcolor)
void Close(Option_t *option="") override
void SetDz(Double_t dz) override
void RotateY(Double_t angle) override
void SetDy(Double_t dy) override
void SetDx(Double_t dx) override
void RotateX(Double_t angle) override
void SetTranslation(const TGeoTranslation &tr)
void 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)
const char * Data() const
static TString Itoa(Int_t value, Int_t base)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
TGeoMedium * pMedAir
const Double_t YStationPositions[NStations]
TGeoMedium * pMedCarbon
TGeoManager * gGeoMan
const Int_t NMaxModules
const Double_t ZStationPositions[NStations]
TGeoMedium * pMedArCO27030
const Int_t NStations
TGeoMedium * pMedFiberGlass
const Double_t XStationPositions[NStations]
TGeoMedium * pMedCopper
ModuleType
const Bool_t ModulesYRotations[NStations][NMaxModules]
const Bool_t ModulesXRotations[NStations][NMaxModules]
TGeoMedium * pMedArgonIsobutane7525
TGeoMedium * pMedBrass
TGeoMedium * pMedTeflon
TGeoMedium * pMedHoneyComb
TGeoMedium * pMedEpoxideCompound
@ WHOLE_MOD
@ HOLED_LEFT_MOD
const Double_t YGasSize_small
const Double_t XGasSize_large
const ModuleType ModuleTypes[NStations][NMaxModules]
const Double_t BeamHole_YSize_large
const Double_t BeamHole_XSize_large
const Double_t ZGasSize_small
const Double_t YGasSize_large
const Double_t ZGasSize_large
const Double_t XSensSize_small
const Double_t ZSensSize_small
const Double_t XGasSize_small
const Double_t YSensSize_small
TGeoVolume * CreateSmallModule(TString module_name)
TGeoVolume * CreateLargeModule(TString module_name, ModuleType module_type)
TGeoVolume * CreateStation(TString station_name)
void create_rootgeom_CSC_Run9_detailed()
TGeoVolume * CreateFrameForSmallModule(TString frame_name)
void DefineRequiredMedia(FairGeoMedia *geoMedia, FairGeoBuilder *geoBuild)