BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_GEMS_AZv2.C
Go to the documentation of this file.
1//---------------------------
2#include "TFile.h"
3#include "TGeoBBox.h"
4#include "TGeoManager.h"
5#include "TGeoShape.h"
6#include "TMath.h"
7#include "TString.h"
8
9using namespace TMath;
10
11// GeoManager
13
14// Set Parameters of GEMS
15const Int_t nStations = 12;
16
17// Stantion Parameters
18const Double_t XSizeOfStation[nStations] = {60, 60, 80, 132, 160, 160, 240, 240, 240, 240, 240, 240};
19const Double_t YSizeOfStation[nStations] = {60, 60, 80, 82, 80, 80, 80, 80, 80, 80, 80, 80};
20const Double_t ZStantionPosition[nStations] = {30, 50, 70, 90, 110, 140, 170, 200, 240, 280, 320, 360};
21
22// Beam Pipe Hole Parameters
23const Double_t BeamPipeMinRadius = 2.5; // radius of the hole in first GEM-station
24const Double_t BeamPipeMaxRadius = 5.0; // radius of the hole in last GEM-station
26
27// Module Parameters
34const Double_t dZSensor = 0.02; // AZ
35const Double_t xyShort = 8.0; // AZ - short strip area close to the beam
37
40
41const Double_t XSizeSpacer = 10.0;
42const Double_t YSizeSpacer = 10.0;
45
46// Position of GEM-Detector
49
50// Add spacers or not?
52
54{
55 // Calculate the Beam Pipe Radius for each GEM-stations
56 Double_t BeamPipeAngle =
58 * 180 / Pi();
62 for (UInt_t iStation = 1; iStation < nStations - 1; iStation++) {
63 // AZ BeamPipeRadius[iStation] = delta_const + (ZStantionPosition[iStation] -
64 // ZStantionPosition[0])*(BeamPipeAngle*Pi()/180);
65 BeamPipeRadius[iStation] = delta_const
66 + (ZStantionPosition[iStation] - ZStantionPosition[0])
67 * TMath::Tan(BeamPipeAngle * TMath::DegToRad()); // AZ
68 }
69 cout << "Beam Pipe Angle = " << BeamPipeAngle << " deg" << "\n";
70 cout << "Beam Pipe Radiuses:" << "\n";
71 for (UInt_t iStation = 0; iStation < nStations; iStation++) {
72 cout << " Station[" << iStation << "] = " << BeamPipeRadius[iStation] << " cm" << "\n";
73 }
74 cout << "----------------------------" << "\n";
75
76 // Calculate sizes of Modules
77 cout << "Modules Size ( X : Y ):" << "\n";
78 for (UInt_t iStation = 0; iStation < nStations; iStation++) {
79 XModuleSize[iStation] = XSizeOfStation[iStation] / 2;
80 YModuleSize[iStation] = YSizeOfStation[iStation] / 2;
81 cout << " Modules[" << iStation << "] = " << XModuleSize[iStation] << " : " << YModuleSize[iStation]
82 << "\n";
83 }
84 cout << "----------------------------" << "\n";
85}
86
88{
89
91
92 // Load the necessary FairRoot libraries
93 gROOT->LoadMacro("$VMCWORKDIR/macro/run/bmnloadlibs.C");
94 bmnloadlibs(); // load libraries
95
96 // ------- Load media from media file -----------------------------------
97 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
98 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
99 TString geoPath = gSystem->Getenv("VMCWORKDIR");
100 TString medFile = geoPath + "/geometry/media.geo";
101 geoFace->setMediaFile(medFile);
102 geoFace->readMedia();
104 // --------------------------------------------------------------------------
105
106 // ------- Geometry file name (output) ----------------------------------
107 const TString geoDetectorName = "GEMS";
108 const TString geoDetectorVersion = "v2_AZ";
109 const TString geoFileName = geoPath + "/geometry/" + geoDetectorName + "_" + geoDetectorVersion + ".root";
110 // --------------------------------------------------------------------------
111
112 // ----------------- Get and create the required media -----------------
113 FairGeoMedia* geoMedia = geoFace->getMedia();
114 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
115
116 FairGeoMedium* mAir = geoMedia->getMedium("air");
117 if (!mAir)
118 Fatal("Main", "FairMedium air not found");
119 geoBuild->createMedium(mAir);
120 TGeoMedium* pMedAir = gGeoMan->GetMedium("air");
121 if (!pMedAir)
122 Fatal("Main", "Medium air not found");
123
124 FairGeoMedium* mCarbon = geoMedia->getMedium("carbon");
125 if (!mCarbon)
126 Fatal("Main", "FairMedium carbon not found");
127 geoBuild->createMedium(mCarbon);
128 TGeoMedium* pMedCarbon = gGeoMan->GetMedium("carbon");
129 if (!pMedCarbon)
130 Fatal("Main", "Medium carbon not found");
131
132 FairGeoMedium* mFiberGlass = geoMedia->getMedium("fiberglass");
133 if (!mFiberGlass)
134 Fatal("Main", "FairMedium fiberglass not found");
135 geoBuild->createMedium(mFiberGlass);
136 TGeoMedium* pMedFiberGlass = gGeoMan->GetMedium("fiberglass");
137 if (!pMedFiberGlass)
138 Fatal("Main", "Medium fiberglass not found");
139
140 // AZ FairGeoMedium* mArCO27030 = geoMedia->getMedium("arco27030");
141 FairGeoMedium* mArCO27030 = geoMedia->getMedium("titanium");
142 if (!mArCO27030)
143 Fatal("Main", "FairMedium arco27030 not found");
144 geoBuild->createMedium(mArCO27030);
145 // AZ TGeoMedium* pMedArCO27030 = gGeoMan->GetMedium("arco27030");
146 TGeoMedium* pMedArCO27030 = gGeoMan->GetMedium("titanium");
147 if (!pMedArCO27030)
148 Fatal("Main", "Medium arco27030 not found");
149
150 // --------------------------------------------------------------------------
151
152 // -------------- Create geometry and top volume -------------------------
153 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
154 gGeoMan->SetName(geoDetectorName + "_geom");
155 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
156 top->SetMedium(pMedAir);
157 gGeoMan->SetTopVolume(top);
158 // gGeoMan->SetTopVisible(1);
159 // --------------------------------------------------------------------------
160
161 // Define TOP Geometry
162 TGeoVolume* GEMSTop = new TGeoVolumeAssembly(geoDetectorName);
163 GEMSTop->SetMedium(pMedAir);
164
165 TGeoBBox* StationS[nStations];
166 TGeoVolume* StationV[nStations];
167
168 TGeoBBox* BeamPipeHoleS[nStations];
169 TGeoCompositeShape* StationWithHoleS[nStations];
170
171 TGeoBBox* ModuleS[nStations];
173
174 TGeoBBox* VerticalOuterFrameS[nStations];
175 TGeoBBox* HorizontalOuterFrameS[nStations];
176 TGeoBBox* HorizontalInnerFrameS[nStations];
177 TGeoBBox* VerticalInnerFrameS[nStations];
178
179 TGeoVolume* VerticalOuterFrameV[nStations];
180 TGeoVolume* HorizontalOuterFrameV[nStations];
181 TGeoVolume* HorizontalInnerFrameV[nStations];
182 TGeoVolume* VerticalInnerFrameV[nStations];
183
184 // AZ TGeoBBox *SensitiveVolumeS[nStations];
185 TGeoBBox* SensitiveVolumeS[nStations][nModulesInStation];
186 TGeoBBox* SensitiveVolume1S[nStations]; // AZ - short strip area close to the beam
187 TGeoVolume* SensitiveVolumeV[nStations][nModulesInStation];
188 TGeoVolume* SensitiveVolume1V[nStations]; // AZ - short strips
189
190 TGeoBBox* HorizontalSpacerS[nStations];
191 TGeoBBox* VerticalSpacerPartS[nStations];
192 TGeoBBox* VerticalSpacerSmallPartS[nStations];
193
194 TGeoVolume* HorizontalSpacerV[nStations];
195 TGeoVolume* VerticalSpacerPartV[nStations];
196 TGeoVolume* VerticalSpacerSmallPartV[nStations];
197
199
201
202 TGeoTranslation* VerticalOuterFrameVPosition[nStations][nModulesInStation];
203 TGeoTranslation* HorizontalOuterFrameVPosition[nStations][nModulesInStation];
204 TGeoTranslation* HorizontalInnerFrameVPosition[nStations][nModulesInStation];
205 TGeoTranslation* VerticalInnerFrameVPosition[nStations][nModulesInStation];
206
207 TGeoRotation* SpacerBoxVRot[nModulesInStation];
208
209 TGeoTranslation* SensitiveVolumePosition[nStations][nModulesInStation];
210
212
213 TGeoTranslation* shortPos[nStations][nModulesInStation] = {{NULL}, {NULL}}; // AZ - short strips
214
215 for (Int_t iStation = 0; iStation < nStations; iStation++) {
216
217 // AZ - do not create spacers
218 // Creating spacers
219 /*
220 Int_t NHorizontalSpacers =
221 (Int_t)((YModuleSize[iStation]-(dYInnerFrame+dYOuterFrame))/(YSizeSpacer+SpacerWidth)); Int_t NVerticalSpacers =
222 (Int_t)((XModuleSize[iStation]-(dXInnerFrame+dXOuterFrame))/(XSizeSpacer+SpacerWidth)); Double_t YSizeSmallPart =
223 (YModuleSize[iStation]-(dYInnerFrame+dYOuterFrame))/(YSizeSpacer+SpacerWidth); YSizeSmallPart -=
224 (Int_t)YSizeSmallPart; YSizeSmallPart *= YSizeSpacer+SpacerWidth;
225
226 HorizontalSpacerS[iStation] = new TGeoBBox("HorizontalSpacerS",
227 (XModuleSize[iStation]-(dXInnerFrame+dXOuterFrame))/2, SpacerWidth/2, SpacerThickness/2);
228 HorizontalSpacerV[iStation] = new TGeoVolume("HorizontalSpacerV", HorizontalSpacerS[iStation]);
229 HorizontalSpacerV[iStation]->SetMedium(pMedFiberGlass);
230 HorizontalSpacerV[iStation]->SetLineColor(kYellow);
231 HorizontalSpacerV[iStation]->SetTransparency(10);
232
233 VerticalSpacerPartS[iStation] = new TGeoBBox("VerticalSpacerPartS", SpacerWidth/2, YSizeSpacer/2,
234 SpacerThickness/2); VerticalSpacerPartV[iStation] = new TGeoVolume("VerticalSpacerPartV",
235 VerticalSpacerPartS[iStation]); VerticalSpacerPartV[iStation]->SetMedium(pMedFiberGlass);
236 VerticalSpacerPartV[iStation]->SetLineColor(kYellow);
237 VerticalSpacerPartV[iStation]->SetTransparency(10);
238
239 VerticalSpacerSmallPartS[iStation] = new TGeoBBox("VerticalSpacerSmallPartS", SpacerWidth/2, YSizeSmallPart/2,
240 SpacerThickness/2); VerticalSpacerSmallPartV[iStation] = new TGeoVolume("VerticalSpacerSmallPartV",
241 VerticalSpacerSmallPartS[iStation]); VerticalSpacerSmallPartV[iStation]->SetMedium(pMedFiberGlass);
242 VerticalSpacerSmallPartV[iStation]->SetLineColor(kYellow);
243 VerticalSpacerSmallPartV[iStation]->SetTransparency(10);
244
245 for(Int_t iModule = 0; iModule < nModulesInStation; iModule++) {
246 SpacerBoxV[iStation][iModule] = new TGeoVolumeAssembly("SpacerBoxV");
247 SpacerBoxV[iStation][iModule]->SetMedium(pMedArCO27030);
248
249 Int_t hpart_cnt = 0;
250 Int_t vpart_cnt = 0;
251 for(Int_t ihspacer = 0; ihspacer < NHorizontalSpacers; ihspacer++) {
252 Double_t ydisph = ((YModuleSize[iStation]-(dYInnerFrame+dYOuterFrame))/2 - SpacerWidth/2) -
253 YSizeSpacer*(ihspacer+1) - SpacerWidth*ihspacer;
254 SpacerBoxV[iStation][iModule]->AddNode(HorizontalSpacerV[iStation], hpart_cnt, new TGeoTranslation(0, ydisph ,
255 0)); hpart_cnt++;
256
257 for(Int_t ivspacer = 0; ivspacer < NVerticalSpacers; ivspacer++) {
258 Double_t xdispv = (-(XModuleSize[iStation]-(dXInnerFrame+dXOuterFrame))/2 + SpacerWidth/2) +
259 XSizeSpacer*(ivspacer+1) + SpacerWidth*ivspacer; Double_t ydispv =
260 (YModuleSize[iStation]-(dYInnerFrame+dYOuterFrame))/2 - YSizeSpacer/2 - (YSizeSpacer+SpacerWidth)*ihspacer;
261 SpacerBoxV[iStation][iModule]->AddNode(VerticalSpacerPartV[iStation], vpart_cnt, new TGeoTranslation(xdispv,
262 ydispv, 0)); vpart_cnt++;
263
264 if(ihspacer == NHorizontalSpacers-1) {
265 Double_t ydispvs = (YModuleSize[iStation]-(dYInnerFrame+dYOuterFrame))/2 - YSizeSpacer/2 -
266 (YSizeSpacer+SpacerWidth)*(ihspacer+1) + (YSizeSpacer-YSizeSmallPart)/2;
267 SpacerBoxV[iStation][iModule]->AddNode(VerticalSpacerSmallPartV[iStation], ivspacer, new
268 TGeoTranslation(xdispv, ydispvs, 0));
269 }
270 }
271 }
272 }
273 */
274
275 // Creating sensitive shapes and volumes + Adding spacer boxes to sensitive volumes
276 // AZ SensitiveVolumeS[iStation] = new TGeoBBox("SensitiveVolumeS", (XModuleSize[iStation]
277 // -(dXOuterFrame+dXInnerFrame))/2, (YModuleSize[iStation]-(dYOuterFrame+dYInnerFrame))/2, dZSensitiveVolume/2);
278 SensitiveVolume1S[iStation] =
279 new TGeoBBox("SensitiveVolumeSS", xyShort / 2, xyShort / 2, dZSensor / 2 + 0.0); // AZ - short strips
280
281 for (Int_t iModule = 0; iModule < nModulesInStation; iModule++) {
282 // AZ - Subtract short strip area from the large one
283 TString solidNameSensor = "SensitiveVolume";
284 solidNameSensor += iStation;
285 solidNameSensor += iModule;
286 solidNameSensor += "S";
287 SensitiveVolumeS[iStation][iModule] =
288 new TGeoBBox(solidNameSensor, (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame)) / 2,
289 (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame)) / 2, dZSensor / 2);
290 Double_t dx = SensitiveVolumeS[iStation][iModule]->GetDX(),
291 dy = SensitiveVolumeS[iStation][iModule]->GetDY();
292 TString transName = "T";
293 transName += iStation;
294 transName += iModule;
295 Double_t ddx = -dx + xyShort / 2, ddy = dy - xyShort / 2;
296 if (iModule == 1)
297 ddx = dx - xyShort / 2, ddy = dy - xyShort / 2;
298 else if (iModule == 2)
299 ddx = dx - xyShort / 2, ddy = -dy + xyShort / 2;
300 else if (iModule == 3)
301 ddx = -dx + xyShort / 2, ddy = -dy + xyShort / 2;
302 shortPos[iStation][iModule] = new TGeoTranslation(transName, ddx, ddy, 0.0);
303 gGeoMan->AddTransformation(shortPos[iStation][iModule]);
304
305 // TString solidNameSensor = SensitiveVolumeS[iStation][iModule]->GetName();
306 TString booleanExpression = solidNameSensor;
307 booleanExpression += "-(";
308 booleanExpression += SensitiveVolume1S[iStation]->GetName();
309 booleanExpression += ":";
310 booleanExpression += shortPos[iStation][iModule]->GetName();
311 booleanExpression += ")";
312 TGeoCompositeShape* sensorCut = new TGeoCompositeShape(solidNameSensor, booleanExpression);
313 SensitiveVolumeS[iStation][iModule] = sensorCut;
314 // AZ
315
316 SensitiveVolumeV[iStation][iModule] =
317 new TGeoVolume("SensitiveVolume_SensorV", SensitiveVolumeS[iStation][iModule]);
318 SensitiveVolumeV[iStation][iModule]->SetMedium(pMedArCO27030);
319 SensitiveVolumeV[iStation][iModule]->SetLineColor(kRed);
320 SensitiveVolumeV[iStation][iModule]->SetTransparency(50);
321 // SensitiveVolumeV->SetVisibility(kFALSE);
322
323 SpacerBoxVRot[iModule] = new TGeoRotation();
324
325 switch (iModule) {
326 case 0:
327 SpacerBoxVRot[iModule]->SetAngles(0, 0, 0);
328 break;
329
330 case 1:
331 SpacerBoxVRot[iModule]->SetAngles(0, 180, 180);
332 break;
333
334 case 2:
335 SpacerBoxVRot[iModule]->SetAngles(180, 0, 0);
336 break;
337
338 case 3:
339 SpacerBoxVRot[iModule]->SetAngles(0, 180, 0);
340 break;
341 }
342
343 /*AZ - no spacers
344 if(WithSpacers)
345 SensitiveVolumeV[iStation][iModule]->AddNode(SpacerBoxV[iStation][iModule], iModule,
346 SpacerBoxVRot[iModule]);
347 */
348
349 // AZ - short strip area
350 SensitiveVolume1V[iStation] = new TGeoVolume("SensitiveVolume_SensorSV", SensitiveVolume1S[iStation]);
351 // SensitiveVolume1V[iStation] = new TGeoVolume("SensitiveVolume_SensoSV", SensitiveVolume1S[iStation]); //
352 // - test
353 SensitiveVolume1V[iStation]->SetMedium(pMedArCO27030);
354 // SensitiveVolume1V[iStation]->SetMedium(pMedAir);
355 SensitiveVolume1V[iStation]->SetLineColor(kBlue);
356 }
357
358 // Creating border frames shapes and volumes
359 VerticalOuterFrameS[iStation] =
360 new TGeoBBox("VerticalOuterFrameS", dXOuterFrame / 2, YModuleSize[iStation] / 2, ZModuleSize / 2);
361 VerticalOuterFrameV[iStation] = new TGeoVolume("VerticalOuterFrameV", VerticalOuterFrameS[iStation]);
362 // AZ VerticalOuterFrameV[iStation]->SetMedium(pMedCarbon);
363 VerticalOuterFrameV[iStation]->SetMedium(pMedFiberGlass);
364 VerticalOuterFrameV[iStation]->SetLineColor(kBlue);
365 VerticalOuterFrameV[iStation]->SetTransparency(40);
366
367 HorizontalOuterFrameS[iStation] =
368 new TGeoBBox("HorizontalOuterFrameS", (XModuleSize[iStation] - dXOuterFrame) / 2, dYOuterFrame / 2,
369 (ZModuleSize[iStation] - dZSensitiveVolume) / 2);
370 HorizontalOuterFrameV[iStation] = new TGeoVolume("HorizontalOuterFrameV", HorizontalOuterFrameS[iStation]);
371 // AZ HorizontalOuterFrameV[iStation]->SetMedium(pMedCarbon);
372 HorizontalOuterFrameV[iStation]->SetMedium(pMedFiberGlass);
373 HorizontalOuterFrameV[iStation]->SetLineColor(kBlue);
374 HorizontalOuterFrameV[iStation]->SetTransparency(40);
375
376 HorizontalInnerFrameS[iStation] =
377 new TGeoBBox("HorizontalInnerFrameS", (XModuleSize[iStation] - dXOuterFrame) / 2, dYInnerFrame / 2,
378 (ZModuleSize[iStation] - dZSensitiveVolume) / 2);
379 HorizontalInnerFrameV[iStation] = new TGeoVolume("HorizontalInnerFrameV", HorizontalInnerFrameS[iStation]);
380 // AZ HorizontalInnerFrameV[iStation]->SetMedium(pMedCarbon);
381 HorizontalInnerFrameV[iStation]->SetMedium(pMedFiberGlass);
382 HorizontalInnerFrameV[iStation]->SetLineColor(kBlue);
383 HorizontalInnerFrameV[iStation]->SetTransparency(40);
384
385 VerticalInnerFrameS[iStation] = new TGeoBBox("VerticalInnerFrameS", dXInnerFrame / 2,
386 (YModuleSize[iStation] - dYInnerFrame - dYOuterFrame) / 2,
387 (ZModuleSize[iStation] - dZSensitiveVolume) / 2);
388 VerticalInnerFrameV[iStation] = new TGeoVolume("VerticalInnerFrameV", VerticalInnerFrameS[iStation]);
389 // AZ VerticalInnerFrameV[iStation]->SetMedium(pMedCarbon);
390 VerticalInnerFrameV[iStation]->SetMedium(pMedFiberGlass);
391 VerticalInnerFrameV[iStation]->SetLineColor(kBlue);
392 VerticalInnerFrameV[iStation]->SetTransparency(40);
393
394 // Creating box frames from parts
395 for (Int_t iModule = 0; iModule < nModulesInStation; iModule++) {
396 FrameBoxV[iStation][iModule] = new TGeoVolumeAssembly("FrameBoxV");
397 FrameBoxV[iStation][iModule]->SetMedium(pMedAir);
398
399 VerticalOuterFrameVPosition[iStation][iModule] = new TGeoTranslation();
400 HorizontalOuterFrameVPosition[iStation][iModule] = new TGeoTranslation();
401 HorizontalInnerFrameVPosition[iStation][iModule] = new TGeoTranslation();
402 VerticalInnerFrameVPosition[iStation][iModule] = new TGeoTranslation();
403
404 switch (iModule) {
405 case 0:
406 VerticalOuterFrameVPosition[iStation][iModule]->SetTranslation(
407 XModuleSize[iStation] / 2 - dXOuterFrame / 2, 0.0, 0.0);
408 HorizontalOuterFrameVPosition[iStation][iModule]->SetTranslation(
409 -dXOuterFrame / 2, -(YModuleSize[iStation] / 2 - dYOuterFrame / 2),
410 -(ZModuleSize[iStation] / 2 - (ZModuleSize[iStation] - dZSensitiveVolume) / 2));
411 HorizontalInnerFrameVPosition[iStation][iModule]->SetTranslation(
412 -dXOuterFrame / 2, YModuleSize[iStation] / 2 - dYInnerFrame / 2,
413 -(ZModuleSize[iStation] / 2 - (ZModuleSize[iStation] - dZSensitiveVolume) / 2));
414 VerticalInnerFrameVPosition[iStation][iModule]->SetTranslation(
415 -(XModuleSize[iStation] / 2 - dXInnerFrame / 2), dYOuterFrame / 2 - dYInnerFrame / 2,
416 -(ZModuleSize[iStation] / 2 - (ZModuleSize[iStation] - dZSensitiveVolume) / 2));
417 break;
418
419 case 1:
420 VerticalOuterFrameVPosition[iStation][iModule]->SetTranslation(
421 -(XModuleSize[iStation] / 2 - dXOuterFrame / 2), 0.0, 0.0);
422 HorizontalOuterFrameVPosition[iStation][iModule]->SetTranslation(
423 dXOuterFrame / 2, -(YModuleSize[iStation] / 2 - dYOuterFrame / 2),
424 ZModuleSize[iStation] / 2 - (ZModuleSize[iStation] - dZSensitiveVolume) / 2);
425 HorizontalInnerFrameVPosition[iStation][iModule]->SetTranslation(
426 dXOuterFrame / 2, YModuleSize[iStation] / 2 - dYInnerFrame / 2,
427 ZModuleSize[iStation] / 2 - (ZModuleSize[iStation] - dZSensitiveVolume) / 2);
428 VerticalInnerFrameVPosition[iStation][iModule]->SetTranslation(
429 XModuleSize[iStation] / 2 - dXInnerFrame / 2, dYOuterFrame / 2 - dYInnerFrame / 2,
430 ZModuleSize[iStation] / 2 - (ZModuleSize[iStation] - dZSensitiveVolume) / 2);
431 break;
432
433 case 2:
434 VerticalOuterFrameVPosition[iStation][iModule]->SetTranslation(
435 -(XModuleSize[iStation] / 2 - dXOuterFrame / 2), 0.0, 0.0);
436 HorizontalOuterFrameVPosition[iStation][iModule]->SetTranslation(
437 dXOuterFrame / 2, YModuleSize[iStation] / 2 - dYOuterFrame / 2,
438 -(ZModuleSize[iStation] / 2 - (ZModuleSize[iStation] - dZSensitiveVolume) / 2));
439 HorizontalInnerFrameVPosition[iStation][iModule]->SetTranslation(
440 dXOuterFrame / 2, -(YModuleSize[iStation] / 2 - dYInnerFrame / 2),
441 -(ZModuleSize[iStation] / 2 - (ZModuleSize[iStation] - dZSensitiveVolume) / 2));
442 VerticalInnerFrameVPosition[iStation][iModule]->SetTranslation(
443 XModuleSize[iStation] / 2 - dXInnerFrame / 2, -(dYOuterFrame / 2 - dYInnerFrame / 2),
444 -(ZModuleSize[iStation] / 2 - (ZModuleSize[iStation] - dZSensitiveVolume) / 2));
445 break;
446
447 case 3:
448 VerticalOuterFrameVPosition[iStation][iModule]->SetTranslation(
449 XModuleSize[iStation] / 2 - dXOuterFrame / 2, 0.0, 0.0);
450 HorizontalOuterFrameVPosition[iStation][iModule]->SetTranslation(
451 -dXOuterFrame / 2, YModuleSize[iStation] / 2 - dYOuterFrame / 2,
452 ZModuleSize[iStation] / 2 - (ZModuleSize[iStation] - dZSensitiveVolume) / 2);
453 HorizontalInnerFrameVPosition[iStation][iModule]->SetTranslation(
454 -dXOuterFrame / 2, -(YModuleSize[iStation] / 2 - dYInnerFrame / 2),
455 ZModuleSize[iStation] / 2 - (ZModuleSize[iStation] - dZSensitiveVolume) / 2);
456 VerticalInnerFrameVPosition[iStation][iModule]->SetTranslation(
457 -(XModuleSize[iStation] / 2 - dXInnerFrame / 2), -(dYOuterFrame / 2 - dYInnerFrame / 2),
458 ZModuleSize[iStation] / 2 - (ZModuleSize[iStation] - dZSensitiveVolume) / 2);
459 break;
460 }
461
462 FrameBoxV[iStation][iModule]->AddNode(VerticalOuterFrameV[iStation], iModule,
463 VerticalOuterFrameVPosition[iStation][iModule]);
464 FrameBoxV[iStation][iModule]->AddNode(HorizontalOuterFrameV[iStation], iModule,
465 HorizontalOuterFrameVPosition[iStation][iModule]);
466 FrameBoxV[iStation][iModule]->AddNode(HorizontalInnerFrameV[iStation], iModule,
467 HorizontalInnerFrameVPosition[iStation][iModule]);
468 FrameBoxV[iStation][iModule]->AddNode(VerticalInnerFrameV[iStation], iModule,
469 VerticalInnerFrameVPosition[iStation][iModule]);
470 }
471
472 // Creating modules from parts
473 ModuleS[iStation] =
474 new TGeoBBox("ModuleS", XModuleSize[iStation] / 2, YModuleSize[iStation] / 2, ZModuleSize / 2);
475
476 for (Int_t iModule = 0; iModule < nModulesInStation; iModule++) {
477 ModuleV[iStation][iModule] = new TGeoVolume("ModuleV", ModuleS[iStation]);
478 ModuleV[iStation][iModule]->SetMedium(pMedAir);
479 ModuleV[iStation][iModule]->SetLineColor(kYellow);
480 ModuleV[iStation][iModule]->SetTransparency(40);
481 // ModuleV[iModule]->SetVisibility(kFALSE);
482
483 SensitiveVolumePosition[iStation][iModule] = new TGeoTranslation();
484
485 // AZ - short strip area
486 TString transName = "T";
487 transName += iStation;
488 transName += iModule;
489 TGeoTranslation* trans = (TGeoTranslation*)gGeoMan->GetListOfMatrices()->FindObject(transName);
490 TGeoTranslation* shortStripPosition = new TGeoTranslation(*trans);
491 shortStripPosition->SetName("aaa");
492 // AZ
493
494 switch (iModule) {
495 case 0:
496 SensitiveVolumePosition[iStation][iModule]->SetTranslation(
497 -((XModuleSize[iStation] - (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame))) / 2
498 - dXInnerFrame),
499 (YModuleSize[iStation] - (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame))) / 2
500 - dYInnerFrame,
502 break;
503
504 case 1:
505 SensitiveVolumePosition[iStation][iModule]->SetTranslation(
506 (XModuleSize[iStation] - (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame))) / 2
507 - dXInnerFrame,
508 (YModuleSize[iStation] - (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame))) / 2
509 - dYInnerFrame,
511 break;
512
513 case 2:
514 SensitiveVolumePosition[iStation][iModule]->SetTranslation(
515 (XModuleSize[iStation] - (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame))) / 2
516 - dXInnerFrame,
517 (YModuleSize[iStation] - (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame))) / 2
518 - dYOuterFrame,
520 break;
521
522 case 3:
523 SensitiveVolumePosition[iStation][iModule]->SetTranslation(
524 -((XModuleSize[iStation] - (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame))) / 2
525 - dXInnerFrame),
526 (YModuleSize[iStation] - (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame))) / 2
527 - dYOuterFrame,
529 break;
530 }
531
532 ModuleV[iStation][iModule]->AddNode(FrameBoxV[iStation][iModule], iModule);
533 ModuleV[iStation][iModule]->AddNode(SensitiveVolumeV[iStation][iModule], 0,
534 SensitiveVolumePosition[iStation][iModule]);
535 shortStripPosition->Add(SensitiveVolumePosition[iStation][iModule]); // AZ
536 ModuleV[iStation][iModule]->AddNode(SensitiveVolume1V[iStation], 1, shortStripPosition); // AZ
537 }
538
539 // Creating GEM-stations from parts
540 TString SolidName = "Station";
541 SolidName += iStation;
542 SolidName += "S";
543 StationS[iStation] =
544 new TGeoBBox(SolidName, (2 * XModuleSize[iStation]) / 2 + BeamPipeRadius[iStation],
545 (2 * YModuleSize[iStation]) / 2 + BeamPipeRadius[iStation], (ZModuleSize * 2) / 2);
546
547 SolidName = "BeamPipeHole";
548 SolidName += iStation;
549 SolidName += "S";
550 BeamPipeHoleS[iStation] =
551 new TGeoBBox(SolidName, BeamPipeRadius[iStation], BeamPipeRadius[iStation], (ZModuleSize * 2) / 2 + 0.1);
552
553 // Subtraction the beam pipe hole from the current GEM-station
554 TString BooleanExpression = StationS[iStation]->GetName();
555 BooleanExpression += "-";
556 BooleanExpression += BeamPipeHoleS[iStation]->GetName();
557 StationWithHoleS[iStation] = new TGeoCompositeShape("StationWithHoleS", BooleanExpression);
558 StationS[iStation] = StationWithHoleS[iStation];
559
560 TString VolumeName = "Station";
561 VolumeName += iStation;
562 VolumeName += "V";
563 StationV[iStation] = new TGeoVolume(VolumeName, StationS[iStation]);
564 StationV[iStation]->SetMedium(pMedAir);
565 StationV[iStation]->SetLineColor(kGreen);
566 StationV[iStation]->SetTransparency(90);
567 // StationV[iStation]->SetVisibility(kFALSE);
568
569 for (Int_t iModule = 0; iModule < nModulesInStation; iModule++) {
570 ModulePosition[iStation][iModule] = new TGeoTranslation();
571
572 switch (iModule) {
573 case 0:
574 // x > 0, y < 0
575 ModulePosition[iStation][iModule]->SetTranslation(
576 XModuleSize[iStation] / 2 + BeamPipeRadius[iStation],
577 -(YModuleSize[iStation] / 2 + BeamPipeRadius[iStation])
578 + (2 * dYInnerFrame + 2 * BeamPipeRadius[iStation]),
579 -0.5 * ZModuleSize);
580 break;
581
582 case 1:
583 // x < 0, y < 0
584 ModulePosition[iStation][iModule]->SetTranslation(
585 -(XModuleSize[iStation] / 2 + BeamPipeRadius[iStation])
586 + (2 * dXInnerFrame + 2 * BeamPipeRadius[iStation]),
587 -(YModuleSize[iStation] / 2 + BeamPipeRadius[iStation]), 0.5 * ZModuleSize);
588 break;
589
590 case 2:
591 // x < 0, y > 0
592 ModulePosition[iStation][iModule]->SetTranslation(
593 -(XModuleSize[iStation] / 2 + BeamPipeRadius[iStation]),
594 (YModuleSize[iStation] / 2 + BeamPipeRadius[iStation])
595 - (2 * dYInnerFrame + 2 * BeamPipeRadius[iStation]),
596 -0.5 * ZModuleSize);
597 break;
598
599 case 3:
600 // x > 0, y > 0
601 ModulePosition[iStation][iModule]->SetTranslation(
602 XModuleSize[iStation] / 2 + BeamPipeRadius[iStation]
603 - (2 * dXInnerFrame + 2 * BeamPipeRadius[iStation]),
604 (YModuleSize[iStation] / 2 + BeamPipeRadius[iStation]), 0.5 * ZModuleSize);
605 break;
606 }
607
608 StationV[iStation]->AddNode(ModuleV[iStation][iModule], iModule, ModulePosition[iStation][iModule]);
609 }
610
611 GEMSTop->AddNode(StationV[iStation], iStation, new TGeoTranslation(0.0, 0.0, ZStantionPosition[iStation]));
612 }
613
615 top->AddNode(GEMSTop, 0);
616 } else {
617 top->AddNode(GEMSTop, 0, new TGeoTranslation(0, 0, ZDisplacementOfDetector));
618 }
619
621
622 // --------------- Finish -----------------------------------------------
623 gGeoMan->CloseGeometry();
624 gGeoMan->CheckOverlaps(0.0001);
625 gGeoMan->PrintOverlaps();
626 gGeoMan->Test();
627
628 TFile* geoFile = new TFile(geoFileName, "RECREATE");
629 top->Write();
630 geoFile->Close();
631 top->Draw("ogl");
632}
bool Bool_t
int Int_t
unsigned int UInt_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
kRed
kGreen
kBlue
kYellow
void Fatal(const char *location, const char *msgfmt,...)
R__EXTERN TGeoManager * gGeoManager
#define gROOT
R__EXTERN TSystem * gSystem
void Close(Option_t *option="") override
virtual Double_t GetDX() const
virtual Double_t GetDY() const
void SetAngles(Double_t phi, Double_t theta, Double_t psi)
const char * GetName() const override
void SetTranslation(const TGeoMatrix &other)
void Add(const TGeoTranslation *other)
TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="") 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)
TGeoManager * gGeoMan
const Double_t dXOuterFrame
const Double_t dZSensitiveVolume
const Double_t BeamPipeMaxRadius
const Double_t BeamPipeMinRadius
const Int_t nStations
const Double_t XSizeOfStation[nStations]
const Double_t YSizeOfStation[nStations]
const Double_t dXInnerFrame
const Double_t ZStantionPosition[nStations]
const Bool_t StationCenterPosition
const Double_t dYOuterFrame
const Double_t dYInnerFrame
const Int_t nModulesInStation
const Double_t ZDisplacementOfDetector
const Double_t xyShort
void CalculateParameters()
const Double_t XSizeSpacer
void create_rootgeom_GEMS_AZv2()
const Double_t YSizeSpacer
const Double_t SpacerThickness
const Bool_t WithSpacers
const Double_t dZSensor
const Double_t SpacerWidth
Double_t ATan(Double_t)
constexpr Double_t DegToRad()
constexpr Double_t Pi()
Double_t Tan(Double_t)