BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_GEMS_AZ.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
34// AZ const Double_t dZSensitiveVolume = 1.0;
36const Double_t xyShort = 8.0; // AZ - short strip area close to the beam
39
40// Position of GEM-Detector
43
44// -----------------------------------------------------------------------
46{
47
48 // Calculate the Beam Pipe Radius for each GEM-stations
49 Double_t BeamPipeAngle =
51 * 180 / Pi();
55 for (UInt_t iStation = 1; iStation < nStations - 1; iStation++) {
56 // AZ BeamPipeRadius[iStation] = delta_const + (ZStantionPosition[iStation] -
57 // ZStantionPosition[0])*(BeamPipeAngle*Pi()/180);
58 BeamPipeRadius[iStation] = delta_const
59 + (ZStantionPosition[iStation] - ZStantionPosition[0])
60 * TMath::Tan(BeamPipeAngle * TMath::DegToRad()); // AZ
61 }
62 cout << "Beam Pipe Angle = " << BeamPipeAngle << " deg" << "\n";
63 cout << "Beam Pipe Radiuses:" << "\n";
64 for (UInt_t iStation = 0; iStation < nStations; iStation++) {
65 cout << " Station[" << iStation << "] = " << BeamPipeRadius[iStation] << " cm" << "\n";
66 }
67 cout << "----------------------------" << "\n";
68
69 // Calculate sizes of Modules
70 cout << "Modules Size ( X : Y ):" << "\n";
71 for (UInt_t iStation = 0; iStation < nStations; iStation++) {
72 XModuleSize[iStation] = XSizeOfStation[iStation] / 2 - BeamPipeRadius[iStation];
73 YModuleSize[iStation] = YSizeOfStation[iStation] / 2 - BeamPipeRadius[iStation];
74 cout << " Modules[" << iStation << "] = " << XModuleSize[iStation] << " : " << YModuleSize[iStation]
75 << "\n";
76 }
77 cout << "----------------------------" << "\n";
78}
79
80// -----------------------------------------------------------------------
82{
83
85
86 // Load the necessary FairRoot libraries
87 gROOT->LoadMacro("$VMCWORKDIR/macro/run/bmnloadlibs.C");
88 bmnloadlibs(); // load libraries
89
90 // ------- Load media from media file --------------------------------
91 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
92 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
93 TString geoPath = gSystem->Getenv("VMCWORKDIR");
94 TString medFile = geoPath + "/geometry/media.geo";
95 geoFace->setMediaFile(medFile);
96 geoFace->readMedia();
98 // -----------------------------------------------------------------------
99
100 // ------- Geometry file name (output) -------------------------------
101 const TString geoDetectorName = "GEMS";
102 const TString geoDetectorVersion = "v1_AZ";
103 const TString geoFileName = geoPath + "/geometry/" + geoDetectorName + "_" + geoDetectorVersion + ".root";
104 // -----------------------------------------------------------------------
105
106 // ----------------- Get and create the required media --------------
107 FairGeoMedia* geoMedia = geoFace->getMedia();
108 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
109
110 FairGeoMedium* mAir = geoMedia->getMedium("air");
111 if (!mAir)
112 Fatal("Main", "FairMedium air not found");
113 geoBuild->createMedium(mAir);
114 TGeoMedium* pMedAir = gGeoMan->GetMedium("air");
115 if (!pMedAir)
116 Fatal("Main", "Medium air not found");
117
118 // AZ FairGeoMedium* mArCO27030 = geoMedia->getMedium("arco27030");
119 FairGeoMedium* mArCO27030 = geoMedia->getMedium("titanium");
120 if (!mArCO27030)
121 Fatal("Main", "FairMedium arco27030 not found");
122 geoBuild->createMedium(mArCO27030);
123 // AZ TGeoMedium* pMedArCO27030 = gGeoMan->GetMedium("arco27030");
124 TGeoMedium* pMedArCO27030 = gGeoMan->GetMedium("titanium");
125 if (!pMedArCO27030)
126 Fatal("Main", "Medium arco27030 not found");
127
128 // -----------------------------------------------------------------------
129
130 // -------------- Create geometry and top volume ----------------------
131 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
132 gGeoMan->SetName(geoDetectorName + "_geom");
133 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
134 top->SetMedium(pMedAir);
135 gGeoMan->SetTopVolume(top);
136 // gGeoMan->SetTopVisible(1);
137 // -----------------------------------------------------------------------
138
139 // Define TOP Geometry
140 TGeoVolume* GEMSTop = new TGeoVolumeAssembly(geoDetectorName);
141 GEMSTop->SetMedium(pMedAir);
142
143 // Transformations (translations, rotations and scales)
144 TGeoTranslation* SensitiveVolumePosition = new TGeoTranslation(
145 "SensitiveVolumePosition",
147 (YModuleSize[0] - (YModuleSize[0] - (dYOuterFrame + dYInnerFrame))) / 2 - dYInnerFrame, 0.0);
148 // SetPos_trans->RegisterYourself();
149
150 // Solids (shapes)
151 TGeoBBox* StationS[nStations];
153 TGeoBBox* SensitiveVolumeS[nStations][nModulesInStation];
154 TGeoBBox* SensitiveVolume1S[nStations]; // AZ - short strip area close to the beam
155 TGeoBBox* BeamPipeHoleS[nStations];
156
157 for (UInt_t iStation = 0; iStation < nStations; iStation++) {
158 TString SolidNameStation = "Station";
159 SolidNameStation += iStation;
160 SolidNameStation += "S";
161 StationS[iStation] = new TGeoBBox(SolidNameStation, XSizeOfStation[iStation] / 2, YSizeOfStation[iStation] / 2,
162 (ZModuleSize * 4) / 2);
163
164 for (UInt_t iModule = 0; iModule < nModulesInStation; iModule++) {
165 TString SolidNameModule = "Module";
166 SolidNameModule += iModule;
167 SolidNameModule += "S";
168 ModuleS[iStation][iModule] =
169 new TGeoBBox(SolidNameModule, XModuleSize[iStation] / 2, YModuleSize[iStation] / 2, ZModuleSize / 2);
170 TString SolidNameSensor = "SensitiveVolume";
171 SolidNameSensor += iStation;
172 SolidNameSensor += iModule;
173 SolidNameSensor += "S";
174 SensitiveVolumeS[iStation][iModule] =
175 new TGeoBBox(SolidNameSensor, (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame)) / 2,
176 (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame)) / 2, dZSensitiveVolume / 2);
177 }
178
179 // SensitiveVolumeS[iStation] = new TGeoBBox("SensitiveVolumeS",
180 // (XModuleSize[iStation]-(dXOuterFrame+dXInnerFrame))/2, (YModuleSize[iStation]-(dYOuterFrame+dYInnerFrame))/2,
181 // dZSensitiveVolume/2);
182 SensitiveVolume1S[iStation] = new TGeoBBox("SensitiveVolumeSS", xyShort / 2, xyShort / 2,
183 dZSensitiveVolume / 2 + 0.0); // AZ - short strips
184
185 TString SolidNameHole = "BeamPipeHole";
186 SolidNameHole += iStation;
187 SolidNameHole += "S";
188 BeamPipeHoleS[iStation] = new TGeoBBox(SolidNameHole, BeamPipeRadius[iStation], BeamPipeRadius[iStation],
189 (ZModuleSize * 4) / 2 + 0.1);
190
191 // Subtraction the beam pipe hole from the current GEM-station
192 TString BooleanExpression = StationS[iStation]->GetName();
193 BooleanExpression += "-";
194 BooleanExpression += BeamPipeHoleS[iStation]->GetName();
195 TGeoCompositeShape* StationWithHoleS = new TGeoCompositeShape(SolidNameStation, BooleanExpression);
196 StationS[iStation] = StationWithHoleS;
197 }
198
199 // AZ - Subtract short strip area from the large one
200 TGeoTranslation* shortPos[nStations][nModulesInStation] = {{NULL}, {NULL}};
201 for (UInt_t iStation = 0; iStation < nStations; iStation++) {
202 for (UInt_t iModule = 0; iModule < nModulesInStation; iModule++) {
203 Double_t dx = SensitiveVolumeS[iStation][iModule]->GetDX(),
204 dy = SensitiveVolumeS[iStation][iModule]->GetDY();
205 TString transName = "T";
206 transName += iStation;
207 transName += iModule;
208 Double_t ddx = -dx + xyShort / 2, ddy = dy - xyShort / 2;
209 if (iModule == 1)
210 ddx = dx - xyShort / 2, ddy = dy - xyShort / 2;
211 else if (iModule == 2)
212 ddx = dx - xyShort / 2, ddy = -dy + xyShort / 2;
213 else if (iModule == 3)
214 ddx = -dx + xyShort / 2, ddy = -dy + xyShort / 2;
215 shortPos[iStation][iModule] = new TGeoTranslation(transName, ddx, ddy, 0.0);
216 gGeoMan->AddTransformation(shortPos[iStation][iModule]);
217
218 TString solidNameSensor = SensitiveVolumeS[iStation][iModule]->GetName();
219 TString booleanExpression = solidNameSensor;
220 booleanExpression += "-(";
221 booleanExpression += SensitiveVolume1S[iStation]->GetName();
222 booleanExpression += ":";
223 booleanExpression += shortPos[iStation][iModule]->GetName();
224 booleanExpression += ")";
225 TGeoCompositeShape* sensorCut = new TGeoCompositeShape(solidNameSensor, booleanExpression);
226 SensitiveVolumeS[iStation][iModule] = sensorCut;
227 }
228 }
229
230 // Volumes
231 TGeoVolume* StationV[nStations];
233 TGeoVolume* SensitiveVolumeV[nStations][nModulesInStation];
234 TGeoVolume* SensitiveVolume1V[nStations]; // AZ - short strips
235 for (UInt_t iStation = 0; iStation < nStations; iStation++) {
236 TString VolumeName = "Station";
237 VolumeName += iStation;
238 VolumeName += "V";
239 StationV[iStation] = new TGeoVolume(VolumeName, StationS[iStation]);
240 StationV[iStation]->SetMedium(pMedAir);
241 StationV[iStation]->SetLineColor(kGreen);
242 StationV[iStation]->SetTransparency(95);
243 // StationV[iStation]->SetVisibility(kFALSE);
244
245 for (UInt_t iModule = 0; iModule < nModulesInStation; iModule++) {
246 TString VolumeName = "Module";
247 VolumeName += iModule;
248 VolumeName += "V";
249 ModuleV[iStation][iModule] = new TGeoVolume(VolumeName, ModuleS[iStation][iModule]);
250 ModuleV[iStation][iModule]->SetMedium(pMedAir);
251 ModuleV[iStation][iModule]->SetLineColor(kYellow);
252 ModuleV[iStation][iModule]->SetTransparency(40);
253 // ModuleV[iStation][iModule]->SetVisibility(kFALSE);
254
255 VolumeName = "SensitiveVolume_Sensor";
256 VolumeName += iModule;
257 VolumeName += "V";
258 SensitiveVolumeV[iStation][iModule] = new TGeoVolume(VolumeName, SensitiveVolumeS[iStation][iModule]);
259 SensitiveVolumeV[iStation][iModule]->SetMedium(pMedArCO27030);
260 SensitiveVolumeV[iStation][iModule]->SetLineColor(kRed);
261 }
262
263 // SensitiveVolumeV[iStation] = new TGeoVolume("SensitiveVolume_SensorV", SensitiveVolumeS[iStation]);
264 // SensitiveVolumeV[iStation]->SetMedium(pMedArCO27030);
265 // SensitiveVolumeV[iStation]->SetLineColor(kRed);
266 // SensitiveVolumeV[iStation]->SetVisibility(kFALSE);
267 // AZ - short strip area
268 SensitiveVolume1V[iStation] = new TGeoVolume("SensitiveVolume_SensorSV", SensitiveVolume1S[iStation]);
269 // SensitiveVolume1V[iStation] = new TGeoVolume("SensitiveVolume_SensoSV", SensitiveVolume1S[iStation]);
270 SensitiveVolume1V[iStation]->SetMedium(pMedArCO27030);
271 // SensitiveVolume1V[iStation]->SetMedium(pMedAir);
272 SensitiveVolume1V[iStation]->SetLineColor(kBlue);
273 }
274
275 // Adding volumes to the TOP Volume
276 for (UInt_t iStation = 0; iStation < nStations; iStation++) {
277
278 GEMSTop->AddNode(StationV[iStation], iStation, new TGeoTranslation(0.0, 0.0, ZStantionPosition[iStation]));
279
280 for (UInt_t iModule = 0; iModule < nModulesInStation; iModule++) {
281 TGeoTranslation* ModulePosition = new TGeoTranslation();
282 TGeoTranslation* ActiveVolumePosition = new TGeoTranslation();
283 // AZ - short strip area
284 TString transName = "T";
285 transName += iStation;
286 transName += iModule;
287 TGeoTranslation* trans = (TGeoTranslation*)gGeoMan->GetListOfMatrices()->FindObject(transName);
288 TGeoTranslation* shortStripPosition = new TGeoTranslation(*trans);
289 shortStripPosition->SetName("aaa");
290 // Double_t dx = SensitiveVolumeS[iStation][iModule]->GetDX(), dy =
291 // SensitiveVolumeS[iStation][iModule]->GetDY();
292 switch (iModule) {
293 case 0:
294 // x > 0, y < 0
295 ModulePosition->SetTranslation(XModuleSize[iStation] / 2 + BeamPipeRadius[iStation],
296 -(YModuleSize[iStation] / 2 + BeamPipeRadius[iStation])
297 + (2 * dYInnerFrame + 2 * BeamPipeRadius[iStation]),
298 -(1.5 * ZModuleSize));
299 ActiveVolumePosition->SetTranslation(
300 -((XModuleSize[iStation] - (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame))) / 2
301 - dXInnerFrame),
302 (YModuleSize[iStation] - (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame))) / 2
303 - dYInnerFrame,
304 0);
305 // shortStripPosition->SetTranslation(-dx + xyShort/2, dy - xyShort/2, 0.0); //AZ
306 break;
307 case 1:
308 // x < 0, y < 0
309 ModulePosition->SetTranslation(-(XModuleSize[iStation] / 2 + BeamPipeRadius[iStation])
310 + (2 * dXInnerFrame + 2 * BeamPipeRadius[iStation]),
311 -(YModuleSize[iStation] / 2 + BeamPipeRadius[iStation]),
312 -(0.5 * ZModuleSize));
313 ActiveVolumePosition->SetTranslation(
314 (XModuleSize[iStation] - (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame))) / 2
315 - dXInnerFrame,
316 (YModuleSize[iStation] - (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame))) / 2
317 - dYInnerFrame,
318 0);
319 // shortStripPosition->SetTranslation(dx - xyShort/2, dy - xyShort/2, 0.0); //AZ
320 break;
321 case 2:
322 // x < 0, y > 0
323 ModulePosition->SetTranslation(-(XModuleSize[iStation] / 2 + BeamPipeRadius[iStation]),
324 (YModuleSize[iStation] / 2 + BeamPipeRadius[iStation])
325 - (2 * dYInnerFrame + 2 * BeamPipeRadius[iStation]),
326 0.5 * ZModuleSize);
327 ActiveVolumePosition->SetTranslation(
328 (XModuleSize[iStation] - (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame))) / 2
329 - dXInnerFrame,
330 -((YModuleSize[iStation] - (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame))) / 2
331 - dYInnerFrame),
332 0);
333 // shortStripPosition->SetTranslation(dx - xyShort/2, -dy + xyShort/2, 0.0); //AZ
334 break;
335 case 3:
336 // x > 0, y > 0
337 ModulePosition->SetTranslation(XModuleSize[iStation] / 2 + BeamPipeRadius[iStation]
338 - (2 * dXInnerFrame + 2 * BeamPipeRadius[iStation]),
339 (YModuleSize[iStation] / 2 + BeamPipeRadius[iStation]),
340 1.5 * ZModuleSize);
341 ActiveVolumePosition->SetTranslation(
342 -((XModuleSize[iStation] - (XModuleSize[iStation] - (dXOuterFrame + dXInnerFrame))) / 2
343 - dXInnerFrame),
344 -((YModuleSize[iStation] - (YModuleSize[iStation] - (dYOuterFrame + dYInnerFrame))) / 2
345 - dYInnerFrame),
346 0);
347 // shortStripPosition->SetTranslation(-dx + xyShort/2, -dy + xyShort/2, 0.0); //AZ
348 break;
349 }
350
351 // SensitiveVolumeV[iStation][iModule]->AddNode(SensitiveVolume1V[iStation], iModule, shortStripPosition);
352 // //AZ - short
353 StationV[iStation]->AddNode(ModuleV[iStation][iModule], iModule, ModulePosition);
354 shortStripPosition->Add(ActiveVolumePosition);
355 ModuleV[iStation][iModule]->AddNode(SensitiveVolume1V[iStation], 1, shortStripPosition); // AZ
356 // ModuleV[iStation][iModule]->AddNodeOverlap(SensitiveVolumeV[iStation][iModule], iModule,
357 // ActiveVolumePosition);
358 ModuleV[iStation][iModule]->AddNode(SensitiveVolumeV[iStation][iModule], 2, ActiveVolumePosition);
359 }
360 }
361
363 top->AddNode(GEMSTop, 0);
364 } else {
365 top->AddNode(GEMSTop, 0, new TGeoTranslation(0, 0, ZDisplacementOfDetector));
366 }
367
369
370 // --------------- Finish --------------------------------------------
371 gGeoMan->CloseGeometry();
372 gGeoMan->CheckOverlaps(0.001);
373 gGeoMan->PrintOverlaps();
374 gGeoMan->Test();
375
376 TFile* geoFile = new TFile(geoFileName, "RECREATE");
377 top->Write();
378 geoFile->Close();
379 top->Draw("ogl");
380}
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
const char * GetName() const override
void SetTranslation(const TGeoMatrix &other)
void Add(const TGeoTranslation *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
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()
void create_rootgeom_GEMS_AZ()
Double_t ATan(Double_t)
constexpr Double_t DegToRad()
constexpr Double_t Pi()
Double_t Tan(Double_t)