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