BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_GEMS_1stConfigShort.C
Go to the documentation of this file.
1//---------------------------
2#include "../../gem/BmnGemStripConfiguration.h"
3#include "TFile.h"
4#include "TGeoBBox.h"
5#include "TGeoManager.h"
6#include "TGeoShape.h"
7#include "TMath.h"
8#include "TString.h"
9
10using namespace TMath;
11
12// GeoManager
14
15// Set Parameters of GEMS
16const Int_t nStations = 5;
17
18// Station Parameters
19/*
20const Double_t XStationPositions[nStations] = {-2.2, 3.0, -1.8, 3.5, -1.1};
21const Double_t YStationPositions[nStations] = {0.0, 0.0, 0.0, 0.0, 0.0};
22const Double_t ZStationPositions[nStations] = {30.0, 45.0, 60.0, 80.0, 100.0}; // z pos is the first surface of the
23first sens. volume in module !!!
24*/
25
27XStationPositions[0] = BmnGemStripPositions_FirstConfigShort::XStationPositions[0];
28XStationPositions[1] = BmnGemStripPositions_FirstConfigShort::XStationPositions[1];
29XStationPositions[2] = BmnGemStripPositions_FirstConfigShort::XStationPositions[2];
30XStationPositions[3] = BmnGemStripPositions_FirstConfigShort::XStationPositions[3];
31XStationPositions[4] = BmnGemStripPositions_FirstConfigShort::XStationPositions[4];
32
34YStationPositions[0] = BmnGemStripPositions_FirstConfigShort::YStationPositions[0];
35YStationPositions[1] = BmnGemStripPositions_FirstConfigShort::YStationPositions[1];
36YStationPositions[2] = BmnGemStripPositions_FirstConfigShort::YStationPositions[2];
37YStationPositions[3] = BmnGemStripPositions_FirstConfigShort::YStationPositions[3];
38YStationPositions[4] = BmnGemStripPositions_FirstConfigShort::YStationPositions[4];
39
41ZStationPositions[0] = BmnGemStripPositions_FirstConfigShort::ZStationPositions[0];
42ZStationPositions[1] = BmnGemStripPositions_FirstConfigShort::ZStationPositions[1];
43ZStationPositions[2] = BmnGemStripPositions_FirstConfigShort::ZStationPositions[2];
44ZStationPositions[3] = BmnGemStripPositions_FirstConfigShort::ZStationPositions[3];
45ZStationPositions[4] = BmnGemStripPositions_FirstConfigShort::ZStationPositions[4];
46
47// GEM plane sizes (66x41 type)
50
53
54// Module Parameters
61
62// media
68
69class FairGeoMedia;
70class FairGeoBuilder;
71
72void DefineRequiredMedia(FairGeoMedia* geoMedia, FairGeoBuilder* geoBuild)
73{
74 // air medium
75 FairGeoMedium* mAir = geoMedia->getMedium("air");
76 if (!mAir)
77 Fatal("Main", "FairMedium air not found");
78 geoBuild->createMedium(mAir);
79 pMedAir = gGeoManager->GetMedium("air");
80 if (!pMedAir)
81 Fatal("Main", "Medium air not found");
82
83 // carbon medium
84 FairGeoMedium* mCarbon = geoMedia->getMedium("carbon");
85 if (!mCarbon)
86 Fatal("Main", "FairMedium carbon not found");
87 geoBuild->createMedium(mCarbon);
88 pMedCarbon = gGeoManager->GetMedium("carbon");
89 if (!pMedCarbon)
90 Fatal("Main", "Medium carbon not found");
91
92 // fiberglass medium
93 FairGeoMedium* mFiberGlass = geoMedia->getMedium("fiberglass");
94 if (!mFiberGlass)
95 Fatal("Main", "FairMedium fiberglass not found");
96 geoBuild->createMedium(mFiberGlass);
97 pMedFiberGlass = gGeoManager->GetMedium("fiberglass");
98 if (!pMedFiberGlass)
99 Fatal("Main", "Medium fiberglass not found");
100
101 // arco27020 medium
102 FairGeoMedium* mArCO27030 = geoMedia->getMedium("arco27030");
103 if (!mArCO27030)
104 Fatal("Main", "FairMedium arco27030 not found");
105 geoBuild->createMedium(mArCO27030);
106 pMedArCO27030 = gGeoManager->GetMedium("arco27030");
107 if (!pMedArCO27030)
108 Fatal("Main", "Medium arco27030 not found");
109}
110
112{
113
114 // Load the necessary FairRoot libraries
115 gROOT->LoadMacro("$VMCWORKDIR/macro/run/bmnloadlibs.C");
116 bmnloadlibs(); // load libraries
117
118 // ---- set working directory --------------------------------------------
119 TString gPath = gSystem->Getenv("VMCWORKDIR");
120
121 // ------- Geometry file name (output) ----------------------------------
122 const TString geoDetectorName = "GEMS";
123 const TString geoDetectorVersion = "1stConfigShort";
124 const TString geoFileName = gPath + "/geometry/" + geoDetectorName + "_" + geoDetectorVersion + ".root";
125
126 // ---- global geometry parameters ---------------------------------------
127 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
128 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
129
130 // ------- Load media from media file ----------------------------------
131 TString medFile = gPath + "/geometry/media.geo";
132 geoFace->setMediaFile(medFile);
133 geoFace->readMedia();
134 FairGeoMedia* geoMedia = geoFace->getMedia();
135 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
136
137 DefineRequiredMedia(geoMedia, geoBuild);
138 // -------------------------------------------------------------------------
139
140 // -------------- Create geometry and top volume -------------------------
141 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
142 gGeoMan->SetName(geoDetectorName + "_geom");
143 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
144 top->SetMedium(pMedAir);
145 gGeoMan->SetTopVolume(top);
146 // gGeoMan->SetTopVisible(1);
147 // --------------------------------------------------------------------------
148
149 // Define TOP Geometry
150 TGeoVolume* GEMS = new TGeoVolumeAssembly(geoDetectorName);
151 GEMS->SetMedium(pMedAir);
152
153 // station creating
154
156 kFALSE);
158 kTRUE);
160 kFALSE);
162 kTRUE);
164 kFALSE);
165
166 top->AddNode(GEMS, 0);
168
169 // --------------- Finish -----------------------------------------------
170 gGeoMan->CloseGeometry();
171 gGeoMan->CheckOverlaps(0.0001);
172 gGeoMan->PrintOverlaps();
173 gGeoMan->Test();
174
175 TFile* geoFile = new TFile(geoFileName, "RECREATE");
176 top->Write();
177 geoFile->Close();
178 top->Draw("ogl");
179}
180
181//------------------------------------------------------------------------------
183 TString station_name,
184 Double_t x_position,
185 Double_t y_position,
186 Double_t z_position,
187 Bool_t IsInverted)
188{
189 TGeoVolume* stationA = new TGeoVolumeAssembly(station_name);
190 stationA->SetMedium(pMedAir);
191
192 // sensitive shapes
194 dZSensitiveVolume * 0.5);
195 TGeoShape* hot_zoneS = new TGeoBBox("hot_zoneS", XHotZoneSize_StationPrototype * 0.5,
197
198 // frame shapes
199 TGeoShape* vertical_outer_frameS =
200 new TGeoBBox("vertical_outer_frameS", dXOuterFrame * 0.5,
202 TGeoShape* horizontal_outer_frameS =
203 new TGeoBBox("horizontal_outer_frameS", (XModuleSize_StationPrototype + dXInnerFrame) * 0.5, dYOuterFrame * 0.5,
205 TGeoShape* vertical_inner_frameS =
206 new TGeoBBox("vertical_inner_frameS", dXInnerFrame * 0.5, YModuleSize_StationPrototype * 0.5,
208 TGeoShape* horizontal_inner_frameS =
209 new TGeoBBox("horizontal_inner_frameS", (XModuleSize_StationPrototype + dXInnerFrame) * 0.5, dYInnerFrame * 0.5,
210 ZModuleSize * 0.5);
211
212 /*
213 TGeoXtru *moduleS = new TGeoXtru(2);
214 Double_t x_pos[6] = {XModuleSize_StationPrototype, XModuleSize_StationPrototype, 0.0, 0.0,
215 XHotZoneSize_StationPrototype, XHotZoneSize_StationPrototype}; Double_t y_pos[6] = {0.0,
216 YModuleSize_StationPrototype, YModuleSize_StationPrototype, YHotZoneSize_StationPrototype,
217 YHotZoneSize_StationPrototype, 0.0}; moduleS->DefinePolygon(6, x_pos, y_pos); moduleS->DefineSection(0,
218 -dZSensitiveVolume*0.5); moduleS->DefineSection(1, dZSensitiveVolume*0.5);
219 */
220 // sensitive volumes
221 TGeoVolume* moduleV = new TGeoVolume("module_Sensor", moduleS);
222 TGeoVolume* hot_zoneV = new TGeoVolume("hot_zone_Sensor", hot_zoneS);
223 moduleV->SetLineColor(TColor::GetColor("#ff47ca"));
224 hot_zoneV->SetLineColor(TColor::GetColor("#e0b0ff"));
225
226 // frame volumes
227 TGeoVolume* vertical_outer_frameV = new TGeoVolume("vertical_outer_frame", vertical_outer_frameS);
228 TGeoVolume* horizontal_outer_frameV = new TGeoVolume("horizontal_outer_frame", horizontal_outer_frameS);
229 TGeoVolume* vertical_inner_frameV = new TGeoVolume("vertical_inner_frame", vertical_inner_frameS);
230 TGeoVolume* horizontal_inner_frameV = new TGeoVolume("horizontal_inner_frame", horizontal_inner_frameS);
231 TGeoVolume* composite_frameV = new TGeoVolumeAssembly("frame");
232 vertical_outer_frameV->SetLineColor(TColor::GetColor("#9999ff"));
233 horizontal_outer_frameV->SetLineColor(TColor::GetColor("#9999ff"));
234 vertical_inner_frameV->SetLineColor(TColor::GetColor("#9999ff"));
235 horizontal_inner_frameV->SetLineColor(TColor::GetColor("#9999ff"));
236
237 // media for sensitive volumes
238 TGeoMedium* sensitive_medium = pMedArCO27030; // set medium
239 if (sensitive_medium) {
240 moduleV->SetMedium(sensitive_medium);
241 hot_zoneV->SetMedium(sensitive_medium);
242 } else
243 Fatal("Main", "Invalid medium for sensitive modules!");
244
245 // media for frames
246 TGeoMedium* frame_medium = pMedCarbon; // set medium
247 if (frame_medium) {
248 vertical_outer_frameV->SetMedium(frame_medium);
249 horizontal_outer_frameV->SetMedium(frame_medium);
250 vertical_inner_frameV->SetMedium(frame_medium);
251 horizontal_inner_frameV->SetMedium(frame_medium);
252 composite_frameV->SetMedium(frame_medium);
253 } else
254 Fatal("Main", "Invalid medium for frames!");
255
256 moduleV->SetTransparency(20);
257
258 // hot zone position in the module
259 TGeoTranslation* hot_zone_trans =
262
263 // module positions in the station
264 TGeoCombiTrans* module_center_position = new TGeoCombiTrans();
265 module_center_position->ReflectX(true);
266 if (IsInverted) {
267 module_center_position->ReflectY(true);
268 }
269 // module_center_position->SetTranslation(0.0, 0.0, 0.0);
270
271 // frame part positions in the frame
272 TGeoCombiTrans* left_outer_frame_position = new TGeoCombiTrans();
273 left_outer_frame_position->SetTranslation(XModuleSize_StationPrototype * 0.5 + dXOuterFrame * 0.5,
274 (dYOuterFrame - dYInnerFrame) * 0.5,
276
277 TGeoCombiTrans* top_outer_frame_position = new TGeoCombiTrans();
278 top_outer_frame_position->SetTranslation(
280
281 TGeoCombiTrans* right_inner_frame_position = new TGeoCombiTrans();
282 right_inner_frame_position->SetTranslation(-XModuleSize_StationPrototype * 0.5 - dXInnerFrame * 0.5, 0,
283 ZModuleSize * 0.5);
284
285 TGeoCombiTrans* bottom_inner_frame_position = new TGeoCombiTrans();
286 bottom_inner_frame_position->SetTranslation(-dXInnerFrame * 0.5,
289
290 // frame positions in the station
291 TGeoCombiTrans* comp_frame_center_position = new TGeoCombiTrans();
292 comp_frame_center_position->ReflectX(true);
293 if (IsInverted) {
294 comp_frame_center_position->ReflectY(true);
295 }
296 // comp_frame_center_position->SetTranslation(module_center_position->GetTranslation());
297
298 // station assembling
299 moduleV->AddNode(hot_zoneV, 0, hot_zone_trans);
300
301 composite_frameV->AddNode(vertical_outer_frameV, 0, left_outer_frame_position);
302 composite_frameV->AddNode(horizontal_outer_frameV, 0, top_outer_frame_position);
303 composite_frameV->AddNode(vertical_inner_frameV, 0, right_inner_frame_position);
304 composite_frameV->AddNode(horizontal_inner_frameV, 0, bottom_inner_frame_position);
305
306 stationA->AddNode(moduleV, 0, module_center_position);
307
308 stationA->AddNode(composite_frameV, 0, comp_frame_center_position);
309
310 // Station position
311 Double_t station_shift = dZSensitiveVolume * 0.5;
312 TGeoTranslation* station_pos = new TGeoTranslation(x_position, y_position, z_position + station_shift);
313
314 mother_volume->AddNode(stationA, 0, station_pos);
315}
316
317//------------------------------------------------------------------------------
bool Bool_t
int Int_t
constexpr Bool_t kFALSE
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 ReflectX(Bool_t leftside, Bool_t rotonly=kFALSE) override
void SetTranslation(const TGeoTranslation &tr)
void ReflectY(Bool_t leftside, Bool_t rotonly=kFALSE) 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)
TGeoMedium * pMedCarbon
TGeoManager * gGeoMan
TGeoMedium * pMedArCO27030
TGeoMedium * pMedFiberGlass
TGeoMedium * pMedCopper
const Double_t dXOuterFrame
const Double_t dZSensitiveVolume
const Double_t dXInnerFrame
const Double_t dYOuterFrame
const Double_t dYInnerFrame
void CreateStation_One66x41Plane(TGeoVolume *mother_volume, TString station_name, Double_t x_position, Double_t y_position, Double_t z_position, Bool_t IsInverted)
void create_rootgeom_GEMS_1stConfigShort()
void DefineRequiredMedia(FairGeoMedia *geoMedia, FairGeoBuilder *geoBuild)
const Double_t XModuleSize_StationPrototype
const Double_t XHotZoneSize_StationPrototype
const Double_t YHotZoneSize_StationPrototype
const Double_t YModuleSize_StationPrototype