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