BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_SiBT_Run9_detailed.C
Go to the documentation of this file.
1/*
2 * Use this macro to create detailed ROOT geometry of Silicon Beam Tracker (SiBT)
3 * for the RUN-9 configuration (3 stations)
4 *
5 * Author: Baranov D.
6 * Created: 25.04.2025
7 *
8 * WARNING: all units is in cm!!!
9 */
10
11// Set Parameters of SiBT -------------------------------------------------------
12const Int_t NStations = 3; // stations in the detector
13const Int_t NMaxModules = 1; // max. number of modules in a station
14
15// X-position of geometrical center of sensor
17 +0.002, // st. 0 (+0.002 + 0.0)
18 -0.258, // st. 1 (+0.012 + (-0.27))
19 +0.097 // st. 2 (+0.137 + (-0.04))
20};
21
22// Y-position of geometrical center of sensor
24 +0.084, // st. 0 (-0.006 + 0.09)
25 -0.003, // st. 1 (+0.027 + (-0.03))
26 +0.105 // st. 2 (+0.095 + 0.01)
27};
28
29// Z-position of sensor side, closest to the beam
31 -283.39, // st. 0 (-283.060 - 0.33)
32 -183.386, // st. 1 (-183.276 - 0.11)
33 -84.397 // st. 2 (-84.087 - 0.31)
34};
35
36//(X-Y-Z)Shifts of modules in each station
38 {0.0}, // st. 0
39 {0.0}, // st. 1
40 {0.0} // st. 2
41};
43 {0.0}, // st. 0
44 {0.0}, // st. 1
45 {0.0} // st. 2
46};
48 {0.0}, // st. 0
49 {0.0}, // st. 1
50 {0.0} // st. 2
51};
52
53// Rotations of stations around Z (deg.)
55 {+0.1020}, // st. 0 (-(90-90.102))
56 {-30.005}, // st. 1 (-(90-59.995))
57 {-59.944} // st. 2 (-(90-30.560))
58};
59
60// Sizes of elements (cm) -------------------------------------------------------
61
62// Sensor sizes
63const Double_t XSensSize = 6.08; // cm
64const Double_t YSensSize = 6.08; // cm
65const Double_t ZSensSize = 0.018; // cm
66//------------------------------------------------------------------------------
67
68// GeoManager
70
71// media
78
79class FairGeoMedia;
80class FairGeoBuilder;
81
82TGeoVolume* CreateStation(TString station_name);
83TGeoVolume* CreateModule(TString module_name);
85
86void DefineRequiredMedia(FairGeoMedia* geoMedia, FairGeoBuilder* geoBuild)
87{
88
89 // air medium
90 FairGeoMedium* mAir = geoMedia->getMedium("air");
91 if (!mAir)
92 Fatal("Main", "FairMedium air not found");
93 geoBuild->createMedium(mAir);
94 pMedAir = gGeoManager->GetMedium("air");
95 if (!pMedAir)
96 Fatal("Main", "Medium air not found");
97
98 // carbon medium
99 FairGeoMedium* mCarbon = geoMedia->getMedium("carbon");
100 if (!mCarbon)
101 Fatal("Main", "FairMedium carbon not found");
102 geoBuild->createMedium(mCarbon);
103 pMedCarbon = gGeoManager->GetMedium("carbon");
104 if (!pMedCarbon)
105 Fatal("Main", "Medium carbon not found");
106
107 // fiberglass medium
108 FairGeoMedium* mFiberGlass = geoMedia->getMedium("fiberglass");
109 if (!mFiberGlass)
110 Fatal("Main", "FairMedium fiberglass not found");
111 geoBuild->createMedium(mFiberGlass);
112 pMedFiberGlass = gGeoManager->GetMedium("fiberglass");
113 if (!pMedFiberGlass)
114 Fatal("Main", "Medium fiberglass not found");
115
116 // silicon medium
117 FairGeoMedium* mSilicon = geoMedia->getMedium("silicon");
118 if (!mSilicon)
119 Fatal("Main", "FairMedium silicon not found");
120 geoBuild->createMedium(mSilicon);
121 pMedSilicon = gGeoManager->GetMedium("silicon");
122 if (!pMedSilicon)
123 Fatal("Main", "Medium silicon not found");
124
125 // aluminium medium
126 FairGeoMedium* mAluminium = geoMedia->getMedium("aluminium");
127 if (!mAluminium)
128 Fatal("Main", "FairMedium aluminium not found");
129 geoBuild->createMedium(mAluminium);
130 pMedAluminium = gGeoManager->GetMedium("aluminium");
131 if (!pMedAluminium)
132 Fatal("Main", "Medium aluminium not found");
133
134 // steel medium
135 FairGeoMedium* mSteel = geoMedia->getMedium("steel");
136 if (!mSteel)
137 Fatal("Main", "FairMedium steel not found");
138 geoBuild->createMedium(mSteel);
139 pMedSteel = gGeoManager->GetMedium("steel");
140 if (!pMedSteel)
141 Fatal("Main", "Medium steel not found");
142}
143
145{
146
147 // ---- set working directory --------------------------------------------
148 TString gPath = gSystem->Getenv("VMCWORKDIR");
149
150 // ------- Geometry file name (output) ----------------------------------
151 const TString geoDetectorName = "SiBT";
152 const TString geoDetectorVersion = "Run9_detailed";
153 const TString geoFileName = gPath + "/geometry/" + geoDetectorName + "_" + geoDetectorVersion + ".root";
154
155 // ---- global geometry parameters ---------------------------------------
156 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
157 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
158
159 // ------- Load media from media file ----------------------------------
160 TString medFile = gPath + "/geometry/media.geo";
161 geoFace->setMediaFile(medFile);
162 geoFace->readMedia();
163 FairGeoMedia* geoMedia = geoFace->getMedia();
164 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
165
166 DefineRequiredMedia(geoMedia, geoBuild);
167 // -------------------------------------------------------------------------
168
169 // -------------- Create geometry and top volume ------------------------
170 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
171 gGeoMan->SetName(geoDetectorName + "_geom");
172 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
173 top->SetMedium(pMedAir);
174 gGeoMan->SetTopVolume(top);
175 // gGeoMan->SetTopVisible(1);
176 // -------------------------------------------------------------------------
177
178 // Define TOP Geometry
179 TGeoVolume* SiBT = new TGeoVolumeAssembly(geoDetectorName);
180 SiBT->SetMedium(pMedAir);
181
182 for (Int_t istation = 0; istation < NStations; ++istation) {
183 // for(Int_t istation = 0; istation < 1; ++istation) {
184
185 Int_t stationNum = istation; // station number
186
187 TGeoVolume* station = CreateStation(TString("station") + TString::Itoa(stationNum, 10));
188
189 TGeoVolume* module0 = CreateModule(TString("module0_") + station->GetName());
190
191 TGeoVolume* vacuumTube = CreateVacuumTube(TString("vacuumTube_") + station->GetName());
192
193 TGeoCombiTrans* module0_transform = new TGeoCombiTrans();
194 module0_transform->RotateZ(ZStationRotations[stationNum][0]);
195 module0_transform->SetTranslation(XModuleShifts[stationNum][0], YModuleShifts[stationNum][0],
196 ZModuleShifts[stationNum][0] + 0.5 * ZSensSize);
197
198 TGeoCombiTrans* station_transform = new TGeoCombiTrans();
199 station_transform->SetTranslation(XStationPositions[stationNum], YStationPositions[stationNum],
200 ZStationPositions[stationNum]);
201
202 station->AddNode(module0, 0, new TGeoCombiTrans(*module0_transform));
203 station->AddNode(vacuumTube, 0, new TGeoCombiTrans(*module0_transform));
204
205 SiBT->AddNode(station, 0, station_transform);
206 }
207
208 top->AddNode(SiBT, 0);
210
211 // --------------- Finish -----------------------------------------------
212 gGeoMan->CloseGeometry();
213 gGeoMan->CheckOverlaps(0.0001);
214 gGeoMan->PrintOverlaps();
215 gGeoMan->Test();
216 // gGeoMan->RestoreMasterVolume();
217
218 TFile* geoFile = new TFile(geoFileName, "RECREATE");
219 top->Write();
220 geoFile->Close();
221 top->Draw("ogl");
222}
223
225{
226
227 TGeoVolume* stationA = new TGeoVolumeAssembly(station_name);
228 stationA->SetMedium(pMedAir);
229
230 return stationA;
231}
232
234{
235
236 // shapes
237 TGeoShape* moduleS = new TGeoBBox(TString("moduleS") += TString("_") + module_name, XSensSize * 0.5,
238 YSensSize * 0.5, ZSensSize * 0.5);
239
240 // volumes
241 TGeoVolume* moduleV = new TGeoVolume(TString("SiBTSensor") += TString("_") + module_name, moduleS);
242
243 // medium
244 if (pMedSilicon) {
245 moduleV->SetMedium(pMedSilicon);
246 } else
247 Fatal("Main", "Invalid medium for moduleV volumes!");
248
249 // volume visual property
250 moduleV->SetLineColor(TColor::GetColor("#ff47ca"));
251 moduleV->SetTransparency(30);
252
253 return moduleV;
254}
255
257{
258
259 // shapes
260 TGeoShape* vacTubeS =
261 new TGeoTube(TString("vacTubeS") += TString("_") + vacTube_name, 21.3 * 0.5, 21.9 * 0.5, 19.6 * 0.5);
262 TGeoShape* vacTubeHoleS =
263 new TGeoTube(TString("vacTubeHoleS") += TString("_") + vacTube_name, 0.0, 15.905 * 0.5, 10. * 0.5);
264
265 TGeoShape* sideTubeS =
266 new TGeoTube(TString("sideTubeS") += TString("_") + vacTube_name, 15.3 * 0.5, 15.9 * 0.5, 15.0 * 0.5);
267 TGeoShape* sideTubeCutS =
268 new TGeoTube(TString("sideTubeCutS") += TString("_") + vacTube_name, 0.0, 21.3 * 0.5, 19.6 * 0.5);
269
270 TGeoShape* vacTubeFlangeS =
271 new TGeoTube(TString("vacTubeFlangeS") += TString("_") + vacTube_name, 21.9 * 0.5, 24.0 * 0.5, 1.2 * 0.5);
272 TGeoShape* sideTubeFlangeS =
273 new TGeoTube(TString("sideTubeFlangeS") += TString("_") + vacTube_name, 15.9 * 0.5, 18.0 * 0.5, 1.2 * 0.5);
274
275 TGeoCombiTrans* vacTubeHole_transf = new TGeoCombiTrans();
276 vacTubeHole_transf->SetName(TString("vacTubeHole_transf") += TString("_") + vacTube_name);
277 vacTubeHole_transf->RotateY(90.0);
278 vacTubeHole_transf->SetDx(-10.0);
279 vacTubeHole_transf->SetDy(0.0);
280 vacTubeHole_transf->SetDz(0.0);
281 vacTubeHole_transf->RegisterYourself();
282
283 TGeoCompositeShape* vacTubeWithHoleS = new TGeoCompositeShape();
284 vacTubeWithHoleS->SetName(TString("vacTubeWithHoleS") += TString("_") + vacTube_name);
285 {
286 TString expression = "vacTubeS";
287 expression += TString("_") + vacTube_name;
288 expression += "-vacTubeHoleS";
289 expression += TString("_") + vacTube_name;
290 expression += ":vacTubeHole_transf";
291 expression += TString("_") + vacTube_name;
292 vacTubeWithHoleS->MakeNode(expression);
293 vacTubeWithHoleS->ComputeBBox(); // need to compute a bounding box
294 }
295
296 TGeoCombiTrans* sideTube_transf = new TGeoCombiTrans();
297 sideTube_transf->SetName(TString("sideTube_transf") += TString("_") + vacTube_name);
298 sideTube_transf->RotateY(90.0);
299 sideTube_transf->SetTranslation(-15.0 * 0.5, 0.0, 0.0);
300 sideTube_transf->RegisterYourself();
301
302 TGeoCompositeShape* sideTubeWithCutS = new TGeoCompositeShape();
303 sideTubeWithCutS->SetName(TString("sideTubeWithCutS") += TString("_") + vacTube_name);
304 {
305 TString expression = "sideTubeS";
306 expression += TString("_") + vacTube_name;
307 expression += ":sideTube_transf";
308 expression += TString("_") + vacTube_name;
309 expression += "-sideTubeCutS";
310 expression += TString("_") + vacTube_name;
311 sideTubeWithCutS->MakeNode(expression);
312 sideTubeWithCutS->ComputeBBox(); // need to compute a bounding box
313 }
314
315 // volumes
316 // frame volumes
317 TGeoVolumeAssembly* vacTubeBoxV = new TGeoVolumeAssembly(vacTube_name);
318 TGeoVolume* vacTubeWithHoleV =
319 new TGeoVolume(TString("vacTubeWithHoleV") += TString("_") + vacTube_name, vacTubeWithHoleS);
320 TGeoVolume* sideTubeWithCutV =
321 new TGeoVolume(TString("sideTubeWithCutV") += TString("_") + vacTube_name, sideTubeWithCutS);
322 TGeoVolume* vacTubeFlangeV =
323 new TGeoVolume(TString("vacTubeFlangeV") += TString("_") + vacTube_name, vacTubeFlangeS);
324 TGeoVolume* sideTubeFlangeV =
325 new TGeoVolume(TString("sideTubeFlangeV") += TString("_") + vacTube_name, sideTubeFlangeS);
326
327 // volume medium
328 TGeoMedium* vacTubeWithHoleV_medium = nullptr;
329 if (vacTube_name.Contains("station0") || vacTube_name.Contains("station1"))
330 vacTubeWithHoleV_medium = pMedSteel;
331 if (vacTube_name.Contains("station2"))
332 vacTubeWithHoleV_medium = pMedAluminium;
333 if (vacTubeWithHoleV_medium) {
334 vacTubeWithHoleV->SetMedium(vacTubeWithHoleV_medium);
335 sideTubeWithCutV->SetMedium(vacTubeWithHoleV_medium);
336 vacTubeFlangeV->SetMedium(vacTubeWithHoleV_medium);
337 sideTubeFlangeV->SetMedium(vacTubeWithHoleV_medium);
338 } else
339 Fatal("Main", "Invalid medium for vacTubeWithHoleV!");
340
341 // volume visual property (transparency)
342 vacTubeWithHoleV->SetLineColor(TColor::GetColor("#ffcccc"));
343 vacTubeWithHoleV->SetTransparency(0);
344 sideTubeWithCutV->SetLineColor(TColor::GetColor("#ffcccc"));
345 vacTubeFlangeV->SetLineColor(TColor::GetColor("#ffcccc"));
346 sideTubeFlangeV->SetLineColor(TColor::GetColor("#ffcccc"));
347
348 // part positions in the vacuum tube box
349 TGeoCombiTrans* vacTubeFlangeV_transf[2];
350
351 vacTubeFlangeV_transf[0] = new TGeoCombiTrans();
352 vacTubeFlangeV_transf[0]->SetTranslation(0.0, 0.0, -19.6 * 0.5 + 1.2 * 0.5);
353
354 vacTubeFlangeV_transf[1] = new TGeoCombiTrans();
355 vacTubeFlangeV_transf[1]->SetTranslation(0.0, 0.0, +19.6 * 0.5 - 1.2 * 0.5);
356
357 TGeoCombiTrans* sideTubeFlangeV_transf[1];
358
359 sideTubeFlangeV_transf[0] = new TGeoCombiTrans();
360 sideTubeFlangeV_transf[0]->RotateY(90.0);
361 sideTubeFlangeV_transf[0]->SetTranslation(-15.0 + 1.2 * 0.5, 0.0, 0.0);
362
363 vacTubeBoxV->AddNode(vacTubeWithHoleV, 0, new TGeoCombiTrans());
364 vacTubeBoxV->AddNode(sideTubeWithCutV, 0, new TGeoCombiTrans());
365 vacTubeBoxV->AddNode(vacTubeFlangeV, 0, vacTubeFlangeV_transf[0]);
366 vacTubeBoxV->AddNode(vacTubeFlangeV, 1, vacTubeFlangeV_transf[1]);
367 vacTubeBoxV->AddNode(sideTubeFlangeV, 0, sideTubeFlangeV_transf[0]);
368
369 return vacTubeBoxV;
370}
371//------------------------------------------------------------------------------
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 SetDz(Double_t dz) override
void RegisterYourself() override
void RotateY(Double_t angle) override
void SetDy(Double_t dy) override
void SetDx(Double_t dx) override
void SetTranslation(const TGeoTranslation &tr)
void RotateZ(Double_t angle) override
void ComputeBBox() override
void MakeNode(const char *expression)
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)
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]
const Int_t NStations
TGeoMedium * pMedFiberGlass
const Double_t XStationPositions[NStations]
const Double_t YSensSize
const Double_t ZSensSize
const Double_t XSensSize
TGeoMedium * pMedSteel
TGeoMedium * pMedAluminium
const Double_t ZStationRotations[NStations][NMaxModules]
TGeoMedium * pMedSilicon
TGeoVolume * CreateModule(TString module_name)
void create_rootgeom_SiBT_Run9_detailed()
TGeoVolume * CreateVacuumTube(TString vacTube_name)
TGeoVolume * CreateStation(TString station_name)
void DefineRequiredMedia(FairGeoMedia *geoMedia, FairGeoBuilder *geoBuild)