BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_GEMS_run1.C
Go to the documentation of this file.
1/*
2 @brief
3 Macro for creating geometry root-file describing 1 GEM-module for
4 the first BM@N run (<<Shanghai>>)
5*/
6
7#include "TFile.h"
8#include "TGeoBBox.h"
9#include "TGeoManager.h"
10#include "TGeoShape.h"
11#include "TMath.h"
12#include "TString.h"
13
14using namespace TMath;
15
16// GeoManager
18
19// Module Parameters
20const Double_t XModuleSize = 66.0; // cm
21const Double_t YModuleSize = 41.0;
23
25
31
32const Double_t XSizeSpacer = 10.0;
33const Double_t YSizeSpacer = 10.0;
36
37// Position of GEM-Module
40
41// Add spacers or not?
43
45{
46
47 // Load the necessary FairRoot libraries
48 gROOT->LoadMacro("$VMCWORKDIR/macro/run/bmnloadlibs.C");
49 bmnloadlibs(); // load libraries
50
51 // ------- Load media from media file -----------------------------------
52 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
53 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
54 TString geoPath = gSystem->Getenv("VMCWORKDIR");
55 TString medFile = geoPath + "/geometry/media.geo";
56 geoFace->setMediaFile(medFile);
57 geoFace->readMedia();
59 // --------------------------------------------------------------------------
60
61 // ------- Geometry file name (output) ----------------------------------
62 const TString geoDetectorName = "GEMS";
63 const TString geoDetectorVersion = "run1";
64 const TString geoFileName = geoPath + "/geometry/" + geoDetectorName + "_" + geoDetectorVersion + ".root";
65 // --------------------------------------------------------------------------
66
67 // ----------------- Get and create the required media -----------------
68 FairGeoMedia* geoMedia = geoFace->getMedia();
69 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
70
71 FairGeoMedium* mAir = geoMedia->getMedium("air");
72 if (!mAir)
73 Fatal("Main", "FairMedium air not found");
74 geoBuild->createMedium(mAir);
75 TGeoMedium* pMedAir = gGeoMan->GetMedium("air");
76 if (!pMedAir)
77 Fatal("Main", "Medium air not found");
78
79 FairGeoMedium* mCarbon = geoMedia->getMedium("carbon");
80 if (!mCarbon)
81 Fatal("Main", "FairMedium carbon not found");
82 geoBuild->createMedium(mCarbon);
83 TGeoMedium* pMedCarbon = gGeoMan->GetMedium("carbon");
84 if (!pMedCarbon)
85 Fatal("Main", "Medium carbon not found");
86
87 FairGeoMedium* mFiberGlass = geoMedia->getMedium("fiberglass");
88 if (!mFiberGlass)
89 Fatal("Main", "FairMedium fiberglass not found");
90 geoBuild->createMedium(mFiberGlass);
91 TGeoMedium* pMedFiberGlass = gGeoMan->GetMedium("fiberglass");
92 if (!pMedFiberGlass)
93 Fatal("Main", "Medium fiberglass not found");
94
95 FairGeoMedium* mArCO27030 = geoMedia->getMedium("arco27030");
96 if (!mArCO27030)
97 Fatal("Main", "FairMedium arco27030 not found");
98 geoBuild->createMedium(mArCO27030);
99 TGeoMedium* pMedArCO27030 = gGeoMan->GetMedium("arco27030");
100 if (!pMedArCO27030)
101 Fatal("Main", "Medium arco27030 not found");
102 // --------------------------------------------------------------------------
103
104 // -------------- Create geometry and top volume -------------------------
105 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
106 gGeoMan->SetName(geoDetectorName + "_geom");
107 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
108 top->SetMedium(pMedAir);
109 gGeoMan->SetTopVolume(top);
110 // gGeoMan->SetTopVisible(1);
111 // --------------------------------------------------------------------------
112
113 // Define TOP Geometry
114 TGeoVolume* GEMSTop = new TGeoVolumeAssembly(geoDetectorName);
115 GEMSTop->SetMedium(pMedAir);
116
117 // Shapes and volume pointers
118 TGeoBBox* ModuleS;
119 TGeoVolume* ModuleV;
120
121 TGeoBBox* VerticalOuterFrameS;
122 TGeoBBox* HorizontalOuterFrameS;
123 TGeoBBox* HorizontalInnerFrameS;
124 TGeoBBox* VerticalInnerFrameS;
125
126 TGeoVolume* VerticalOuterFrameV;
127 TGeoVolume* HorizontalOuterFrameV;
128 TGeoVolume* HorizontalInnerFrameV;
129 TGeoVolume* VerticalInnerFrameV;
130
131 TGeoBBox* SensitiveVolumeS;
132 TGeoVolume* SensitiveVolumeV;
133
134 TGeoBBox* HorizontalSpacerS;
135 TGeoBBox* VerticalSpacerPartS;
136 TGeoBBox* VerticalSpacerSmallPartS;
137
138 TGeoVolume* HorizontalSpacerV;
139 TGeoVolume* VerticalSpacerPartV;
140 TGeoVolume* VerticalSpacerSmallPartV;
141
142 TGeoVolumeAssembly* SpacerBoxV;
143 TGeoVolumeAssembly* FrameBoxV;
144
145 TGeoTranslation* VerticalOuterFrameVPosition;
146 TGeoTranslation* HorizontalOuterFrameVPosition;
147 TGeoTranslation* HorizontalInnerFrameVPosition;
148 TGeoTranslation* VerticalInnerFrameVPosition;
149 TGeoRotation* SpacerBoxVRot;
150 TGeoTranslation* SensitiveVolumePosition;
151 //------------------------------------------------------------------------------
152
153 // Creating spacers
154 Int_t NHorizontalSpacers = (Int_t)((YModuleSize - (dYInnerFrame + dYOuterFrame)) / (YSizeSpacer + SpacerWidth));
155 Int_t NVerticalSpacers = (Int_t)((XModuleSize - (dXInnerFrame + dXOuterFrame)) / (XSizeSpacer + SpacerWidth));
157 YSizeSmallPart -= (Int_t)YSizeSmallPart;
158 YSizeSmallPart *= YSizeSpacer + SpacerWidth;
159
160 HorizontalSpacerS = new TGeoBBox("HorizontalSpacerS", (XModuleSize - (dXInnerFrame + dXOuterFrame)) / 2,
162 HorizontalSpacerV = new TGeoVolume("HorizontalSpacerV", HorizontalSpacerS);
163 HorizontalSpacerV->SetMedium(pMedCarbon);
164 HorizontalSpacerV->SetLineColor(kYellow);
165 HorizontalSpacerV->SetTransparency(10);
166
167 VerticalSpacerPartS = new TGeoBBox("VerticalSpacerPartS", SpacerWidth / 2, YSizeSpacer / 2, SpacerThickness / 2);
168 VerticalSpacerPartV = new TGeoVolume("VerticalSpacerPartV", VerticalSpacerPartS);
169 VerticalSpacerPartV->SetMedium(pMedCarbon);
170 VerticalSpacerPartV->SetLineColor(kYellow);
171 VerticalSpacerPartV->SetTransparency(10);
172
173 VerticalSpacerSmallPartS =
174 new TGeoBBox("VerticalSpacerSmallPartS", SpacerWidth / 2, YSizeSmallPart / 2, SpacerThickness / 2);
175 VerticalSpacerSmallPartV = new TGeoVolume("VerticalSpacerSmallPartV", VerticalSpacerSmallPartS);
176 VerticalSpacerSmallPartV->SetMedium(pMedCarbon);
177 VerticalSpacerSmallPartV->SetLineColor(kYellow);
178 VerticalSpacerSmallPartV->SetTransparency(10);
179
180 SpacerBoxV = new TGeoVolumeAssembly("SpacerBoxV");
181 SpacerBoxV->SetMedium(pMedArCO27030);
182
183 Int_t hpart_cnt = 0;
184 Int_t vpart_cnt = 0;
185 for (Int_t ihspacer = 0; ihspacer < NHorizontalSpacers; ihspacer++) {
186 Double_t ydisph = ((YModuleSize - (dYInnerFrame + dYOuterFrame)) / 2 - SpacerWidth / 2)
187 - YSizeSpacer * (ihspacer + 1) - SpacerWidth * ihspacer;
188 SpacerBoxV->AddNode(HorizontalSpacerV, hpart_cnt, new TGeoTranslation(0, ydisph, 0));
189 hpart_cnt++;
190
191 for (Int_t ivspacer = 0; ivspacer < NVerticalSpacers; ivspacer++) {
192 Double_t xdispv = (-(XModuleSize - (dXInnerFrame + dXOuterFrame)) / 2 + SpacerWidth / 2)
193 + XSizeSpacer * (ivspacer + 1) + SpacerWidth * ivspacer;
194 Double_t ydispv = (YModuleSize - (dYInnerFrame + dYOuterFrame)) / 2 - YSizeSpacer / 2
195 - (YSizeSpacer + SpacerWidth) * ihspacer;
196 SpacerBoxV->AddNode(VerticalSpacerPartV, vpart_cnt, new TGeoTranslation(xdispv, ydispv, 0));
197 vpart_cnt++;
198
199 if (ihspacer == NHorizontalSpacers - 1) {
200 Double_t ydispvs = (YModuleSize - (dYInnerFrame + dYOuterFrame)) / 2 - YSizeSpacer / 2
201 - (YSizeSpacer + SpacerWidth) * (ihspacer + 1) + (YSizeSpacer - YSizeSmallPart) / 2;
202 SpacerBoxV->AddNode(VerticalSpacerSmallPartV, ivspacer, new TGeoTranslation(xdispv, ydispvs, 0));
203 }
204 }
205 }
206
207 // Creating sensitive shape and volume + adding spacer box to sensitive volume
208 SensitiveVolumeS = new TGeoBBox("SensitiveVolumeS", (XModuleSize - (dXOuterFrame + dXInnerFrame)) / 2,
210
211 SensitiveVolumeV = new TGeoVolume("SensitiveVolume_SensorV", SensitiveVolumeS);
212 SensitiveVolumeV->SetMedium(pMedArCO27030);
213 SensitiveVolumeV->SetLineColor(kRed);
214 SensitiveVolumeV->SetTransparency(50);
215 // SensitiveVolumeV->SetVisibility(kFALSE);
216
217 SpacerBoxVRot = new TGeoRotation();
218 SpacerBoxVRot->SetAngles(180, 0, 0);
219
220 if (WithSpacers)
221 SensitiveVolumeV->AddNode(SpacerBoxV, 0, SpacerBoxVRot);
222
223 // Creating border frames shapes and volumes
224 VerticalOuterFrameS = new TGeoBBox("VerticalOuterFrameS", dXOuterFrame / 2, YModuleSize / 2, ZModuleSize / 2);
225 VerticalOuterFrameV = new TGeoVolume("VerticalOuterFrameV", VerticalOuterFrameS);
226 VerticalOuterFrameV->SetMedium(pMedFiberGlass);
227 VerticalOuterFrameV->SetLineColor(kBlue);
228 VerticalOuterFrameV->SetTransparency(40);
229
230 HorizontalOuterFrameS = new TGeoBBox("HorizontalOuterFrameS", (XModuleSize - dXOuterFrame) / 2, dYOuterFrame / 2,
232 HorizontalOuterFrameV = new TGeoVolume("HorizontalOuterFrameV", HorizontalOuterFrameS);
233 HorizontalOuterFrameV->SetMedium(pMedFiberGlass);
234 HorizontalOuterFrameV->SetLineColor(kBlue);
235 HorizontalOuterFrameV->SetTransparency(40);
236
237 HorizontalInnerFrameS = new TGeoBBox("HorizontalInnerFrameS", (XModuleSize - dXOuterFrame) / 2, dYInnerFrame / 2,
239 HorizontalInnerFrameV = new TGeoVolume("HorizontalInnerFrameV", HorizontalInnerFrameS);
240 HorizontalInnerFrameV->SetMedium(pMedFiberGlass);
241 HorizontalInnerFrameV->SetLineColor(kBlue);
242 HorizontalInnerFrameV->SetTransparency(40);
243
244 VerticalInnerFrameS =
245 new TGeoBBox("VerticalInnerFrameS", dXInnerFrame / 2, (YModuleSize - dYInnerFrame - dYOuterFrame) / 2,
247 VerticalInnerFrameV = new TGeoVolume("VerticalInnerFrameV", VerticalInnerFrameS);
248 VerticalInnerFrameV->SetMedium(pMedFiberGlass);
249 VerticalInnerFrameV->SetLineColor(kBlue);
250 VerticalInnerFrameV->SetTransparency(40);
251
252 // Creating box frame from parts
253 FrameBoxV = new TGeoVolumeAssembly("FrameBoxV");
254 FrameBoxV->SetMedium(pMedAir);
255
256 VerticalOuterFrameVPosition = new TGeoTranslation();
257 HorizontalOuterFrameVPosition = new TGeoTranslation();
258 HorizontalInnerFrameVPosition = new TGeoTranslation();
259 VerticalInnerFrameVPosition = new TGeoTranslation();
260
261 VerticalOuterFrameVPosition->SetTranslation(-(XModuleSize / 2 - dXOuterFrame / 2), 0.0, 0.0);
262 HorizontalOuterFrameVPosition->SetTranslation(dXOuterFrame / 2, YModuleSize / 2 - dYOuterFrame / 2,
263 -(ZModuleSize / 2 - (ZModuleSize - dZSensitiveVolume) / 2));
264 HorizontalInnerFrameVPosition->SetTranslation(dXOuterFrame / 2, -(YModuleSize / 2 - dYInnerFrame / 2),
265 -(ZModuleSize / 2 - (ZModuleSize - dZSensitiveVolume) / 2));
266 VerticalInnerFrameVPosition->SetTranslation(XModuleSize / 2 - dXInnerFrame / 2,
267 -(dYOuterFrame / 2 - dYInnerFrame / 2),
268 -(ZModuleSize / 2 - (ZModuleSize - dZSensitiveVolume) / 2));
269
270 FrameBoxV->AddNode(VerticalOuterFrameV, 0, VerticalOuterFrameVPosition);
271 FrameBoxV->AddNode(HorizontalOuterFrameV, 0, HorizontalOuterFrameVPosition);
272 FrameBoxV->AddNode(HorizontalInnerFrameV, 0, HorizontalInnerFrameVPosition);
273 FrameBoxV->AddNode(VerticalInnerFrameV, 0, VerticalInnerFrameVPosition);
274
275 // Creating module
276 ModuleS = new TGeoBBox("ModuleS", XModuleSize / 2, YModuleSize / 2, ZModuleSize / 2);
277 ModuleV = new TGeoVolume("ModuleV", ModuleS);
278 ModuleV->SetMedium(pMedAir);
279 ModuleV->SetLineColor(kYellow);
280 ModuleV->SetTransparency(40);
281 // ModuleV->SetVisibility(kFALSE);
282
283 SensitiveVolumePosition = new TGeoTranslation();
284 SensitiveVolumePosition->SetTranslation(
288
289 ModuleV->AddNode(FrameBoxV, 0);
290 ModuleV->AddNode(SensitiveVolumeV, 0, SensitiveVolumePosition);
291
292 GEMSTop->AddNode(ModuleV, 0, new TGeoTranslation(0.0, 0.0, ZModulePosition));
293
295 top->AddNode(GEMSTop, 0);
296 } else {
297 top->AddNode(GEMSTop, 0, new TGeoTranslation(0, 0, ZDisplacementOfModule));
298 }
299
301
302 // --------------- Finish -----------------------------------------------
303 gGeoMan->CloseGeometry();
304 gGeoMan->CheckOverlaps(0.0001);
305 gGeoMan->PrintOverlaps();
306 gGeoMan->Test();
307
308 TFile* geoFile = new TFile(geoFileName, "RECREATE");
309 top->Write();
310 geoFile->Close();
311 top->Draw("ogl");
312}
bool Bool_t
int Int_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
kRed
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
void SetAngles(Double_t phi, Double_t theta, Double_t psi)
void SetTranslation(const TGeoMatrix &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
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 dXInnerFrame
const Double_t dYOuterFrame
const Double_t dYInnerFrame
const Double_t XSizeSpacer
const Double_t YSizeSpacer
const Double_t SpacerThickness
const Bool_t WithSpacers
const Double_t SpacerWidth
const Double_t ZModulePosition
const Bool_t ModuleCenterPosition
const Double_t ZDisplacementOfModule
void create_rootgeom_GEMS_run1()