BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_GEMS.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, 130, 160, 160, 240, 240, 240, 240, 240, 240};
19const Double_t YSizeOfStation[nStations] = {60, 60, 80, 80, 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
37
38// Position of GEM-Detector
41
43{
44
45 // Calculate the Beam Pipe Radius for each GEM-stations
46 Double_t BeamPipeAngle =
48 * 180 / Pi();
52 for (UInt_t iStation = 1; iStation < nStations - 1; iStation++) {
53 BeamPipeRadius[iStation] =
54 delta_const + (ZStantionPosition[iStation] - ZStantionPosition[0]) * (BeamPipeAngle * Pi() / 180);
55 }
56 cout << "Beam Pipe Angle = " << BeamPipeAngle << " deg" << "\n";
57 cout << "Beam Pipe Radiuses:" << "\n";
58 for (UInt_t iStation = 0; iStation < nStations; iStation++) {
59 cout << " Station[" << iStation << "] = " << BeamPipeRadius[iStation] << " cm" << "\n";
60 }
61 cout << "----------------------------" << "\n";
62
63 // Calculate sizes of Modules
64 cout << "Modules Size ( X : Y ):" << "\n";
65 for (UInt_t iStation = 0; iStation < nStations; iStation++) {
66 XModuleSize[iStation] = XSizeOfStation[iStation] / 2 - BeamPipeRadius[iStation];
67 YModuleSize[iStation] = YSizeOfStation[iStation] / 2 - BeamPipeRadius[iStation];
68 cout << " Modules[" << iStation << "] = " << XModuleSize[iStation] << " : " << YModuleSize[iStation]
69 << "\n";
70 }
71 cout << "----------------------------" << "\n";
72}
73
75{
76
78
79 // Load the necessary FairRoot libraries
80 gROOT->LoadMacro("$VMCWORKDIR/macro/run/bmnloadlibs.C");
81 bmnloadlibs(); // load libraries
82
83 // ------- Load media from media file -----------------------------------
84 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
85 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
86 TString geoPath = gSystem->Getenv("VMCWORKDIR");
87 TString medFile = geoPath + "/geometry/media.geo";
88 geoFace->setMediaFile(medFile);
89 geoFace->readMedia();
91 // --------------------------------------------------------------------------
92
93 // ------- Geometry file name (output) ----------------------------------
94 const TString geoDetectorName = "GEMS";
95 const TString geoDetectorVersion = "v1";
96 const TString geoFileName = geoPath + "/geometry/" + geoDetectorName + "_" + geoDetectorVersion + ".root";
97 // --------------------------------------------------------------------------
98
99 // ----------------- Get and create the required media -----------------
100 FairGeoMedia* geoMedia = geoFace->getMedia();
101 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
102
103 FairGeoMedium* mAir = geoMedia->getMedium("air");
104 if (!mAir)
105 Fatal("Main", "FairMedium air not found");
106 geoBuild->createMedium(mAir);
107 TGeoMedium* pMedAir = gGeoMan->GetMedium("air");
108 if (!pMedAir)
109 Fatal("Main", "Medium air not found");
110
111 FairGeoMedium* mArCO27030 = geoMedia->getMedium("arco27030");
112 if (!mArCO27030)
113 Fatal("Main", "FairMedium arco27030 not found");
114 geoBuild->createMedium(mArCO27030);
115 TGeoMedium* pMedArCO27030 = gGeoMan->GetMedium("arco27030");
116 if (!pMedArCO27030)
117 Fatal("Main", "Medium arco27030 not found");
118
119 // --------------------------------------------------------------------------
120
121 // -------------- Create geometry and top volume -------------------------
122 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
123 gGeoMan->SetName(geoDetectorName + "_geom");
124 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
125 top->SetMedium(pMedAir);
126 gGeoMan->SetTopVolume(top);
127 // gGeoMan->SetTopVisible(1);
128 // --------------------------------------------------------------------------
129
130 // Define TOP Geometry
131 TGeoVolume* GEMSTop = new TGeoVolumeAssembly(geoDetectorName);
132 GEMSTop->SetMedium(pMedAir);
133
134 // Transformations (translations, rotations and scales)
135 TGeoTranslation* SensitiveVolumePosition = new TGeoTranslation(
136 "SensitiveVolumePosition",
138 (YModuleSize[0] - (YModuleSize[0] - (dYOuterFrame + dYInnerFrame))) / 2 - dYInnerFrame, 0.0);
139 // SetPos_trans->RegisterYourself();
140
141 // Solids (shapes)
142 TGeoBBox* StationS[nStations];
144 TGeoBBox* SensitiveVolumeS[nStations];
145 TGeoBBox* BeamPipeHoleS[nStations];
146
147 for (UInt_t iStation = 0; iStation < nStations; iStation++) {
148 TString SolidNameStation = "Station";
149 SolidNameStation += iStation;
150 SolidNameStation += "S";
151 StationS[iStation] = new TGeoBBox(SolidNameStation, XSizeOfStation[iStation] / 2, YSizeOfStation[iStation] / 2,
152 (ZModuleSize * 4) / 2);
153
154 for (UInt_t iModule = 0; iModule < nModulesInStation; iModule++) {
155 TString SolidNameModule = "Module";
156 SolidNameModule += iModule;
157 SolidNameModule += "S";
158 ModuleS[iStation][iModule] =
159 new TGeoBBox(SolidNameModule, XModuleSize[iStation] / 2, YModuleSize[iStation] / 2, ZModuleSize / 2);
160 }
161
162 SensitiveVolumeS[iStation] =
163 new TGeoBBox("SensitiveVolumeS", (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame)) / 2,
164 (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame)) / 2, dZSensitiveVolume / 2);
165
166 TString SolidNameHole = "BeamPipeHole";
167 SolidNameHole += iStation;
168 SolidNameHole += "S";
169 BeamPipeHoleS[iStation] = new TGeoBBox(SolidNameHole, BeamPipeRadius[iStation], BeamPipeRadius[iStation],
170 (ZModuleSize * 4) / 2 + 0.1);
171
172 // Subtraction the beam pipe hole from the current GEM-station
173 TString BooleanExpression = StationS[iStation]->GetName();
174 BooleanExpression += "-";
175 BooleanExpression += BeamPipeHoleS[iStation]->GetName();
176 TGeoCompositeShape* StationWithHoleS = new TGeoCompositeShape(SolidNameStation, BooleanExpression);
177 StationS[iStation] = StationWithHoleS;
178 }
179
180 // Volumes
181 TGeoVolume* StationV[nStations];
183 TGeoVolume* SensitiveVolumeV[nStations];
184 for (UInt_t iStation = 0; iStation < nStations; iStation++) {
185 TString VolumeName = "Station";
186 VolumeName += iStation;
187 VolumeName += "V";
188 StationV[iStation] = new TGeoVolume(VolumeName, StationS[iStation]);
189 StationV[iStation]->SetMedium(pMedAir);
190 StationV[iStation]->SetLineColor(kGreen);
191 StationV[iStation]->SetTransparency(95);
192 // StationV[iStation]->SetVisibility(kFALSE);
193
194 for (UInt_t iModule = 0; iModule < nModulesInStation; iModule++) {
195 TString VolumeName = "Module";
196 VolumeName += iModule;
197 VolumeName += "V";
198 ModuleV[iStation][iModule] = new TGeoVolume(VolumeName, ModuleS[iStation][iModule]);
199 ModuleV[iStation][iModule]->SetMedium(pMedAir);
200 ModuleV[iStation][iModule]->SetLineColor(kYellow);
201 ModuleV[iStation][iModule]->SetTransparency(40);
202 // ModuleV[iStation][iModule]->SetVisibility(kFALSE);
203 }
204
205 SensitiveVolumeV[iStation] = new TGeoVolume("SensitiveVolume_SensorV", SensitiveVolumeS[iStation]);
206 SensitiveVolumeV[iStation]->SetMedium(pMedArCO27030);
207 SensitiveVolumeV[iStation]->SetLineColor(kRed);
208 // SensitiveVolumeV[iStation]->SetVisibility(kFALSE);
209 }
210
211 // Adding volumes to the TOP Volume
212 for (UInt_t iStation = 0; iStation < nStations; iStation++) {
213
214 GEMSTop->AddNode(StationV[iStation], iStation, new TGeoTranslation(0.0, 0.0, ZStantionPosition[iStation]));
215
216 for (UInt_t iModule = 0; iModule < nModulesInStation; iModule++) {
217 TGeoTranslation* ModulePosition = new TGeoTranslation();
218 TGeoTranslation* ActiveVolumePosition = new TGeoTranslation();
219 switch (iModule) {
220 case 0:
221 ModulePosition->SetTranslation(XModuleSize[iStation] / 2 + BeamPipeRadius[iStation],
222 -(YModuleSize[iStation] / 2 + BeamPipeRadius[iStation])
223 + (2 * dYInnerFrame + 2 * BeamPipeRadius[iStation]),
224 -(1.5 * ZModuleSize));
225 ActiveVolumePosition->SetTranslation(
226 -((XModuleSize[iStation] - (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame))) / 2
227 - dXInnerFrame),
228 (YModuleSize[iStation] - (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame))) / 2
229 - dYInnerFrame,
230 0);
231 break;
232 case 1:
233 ModulePosition->SetTranslation(-(XModuleSize[iStation] / 2 + BeamPipeRadius[iStation])
234 + (2 * dXInnerFrame + 2 * BeamPipeRadius[iStation]),
235 -(YModuleSize[iStation] / 2 + BeamPipeRadius[iStation]),
236 -(0.5 * ZModuleSize));
237 ActiveVolumePosition->SetTranslation(
238 (XModuleSize[iStation] - (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame))) / 2
239 - dXInnerFrame,
240 (YModuleSize[iStation] - (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame))) / 2
241 - dYInnerFrame,
242 0);
243 break;
244 case 2:
245 ModulePosition->SetTranslation(-(XModuleSize[iStation] / 2 + BeamPipeRadius[iStation]),
246 (YModuleSize[iStation] / 2 + BeamPipeRadius[iStation])
247 - (2 * dYInnerFrame + 2 * BeamPipeRadius[iStation]),
248 0.5 * ZModuleSize);
249 ActiveVolumePosition->SetTranslation(
250 (XModuleSize[iStation] - (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame))) / 2
251 - dXInnerFrame,
252 -((YModuleSize[iStation] - (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame))) / 2
253 - dYInnerFrame),
254 0);
255 break;
256 case 3:
257 ModulePosition->SetTranslation(XModuleSize[iStation] / 2 + BeamPipeRadius[iStation]
258 - (2 * dXInnerFrame + 2 * BeamPipeRadius[iStation]),
259 (YModuleSize[iStation] / 2 + BeamPipeRadius[iStation]),
260 1.5 * ZModuleSize);
261 ActiveVolumePosition->SetTranslation(
262 -((XModuleSize[iStation] - (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame))) / 2
263 - dXInnerFrame),
264 -((YModuleSize[iStation] - (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame))) / 2
265 - dYInnerFrame),
266 0);
267 break;
268 }
269
270 StationV[iStation]->AddNode(ModuleV[iStation][iModule], iModule, ModulePosition);
271 ModuleV[iStation][iModule]->AddNode(SensitiveVolumeV[iStation], iModule, ActiveVolumePosition);
272 }
273 }
274
276 top->AddNode(GEMSTop, 0);
277 } else {
278 top->AddNode(GEMSTop, 0, new TGeoTranslation(0, 0, ZDisplacementOfDetector));
279 }
280
282
283 // --------------- Finish -----------------------------------------------
284 gGeoMan->CloseGeometry();
285 gGeoMan->CheckOverlaps(0.001);
286 gGeoMan->PrintOverlaps();
287 gGeoMan->Test();
288
289 TFile* geoFile = new TFile(geoFileName, "RECREATE");
290 top->Write();
291 geoFile->Close();
292 top->Draw("ogl");
293}
bool Bool_t
int Int_t
unsigned int UInt_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
kRed
kGreen
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
const char * GetName() const override
void SetTranslation(const TGeoMatrix &other)
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
void CalculateParameters()
const Double_t dZSensitiveVolume
Double_t BeamPipeRadius[nStations]
=======================================================================
const Double_t BeamPipeMaxRadius
const Double_t BeamPipeMinRadius
const Int_t nStations
const Double_t XSizeOfStation[nStations]
void create_rootgeom_GEMS()
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
Double_t ATan(Double_t)
constexpr Double_t Pi()