BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_Hodo_oldnames_with_box_v1.C
Go to the documentation of this file.
1//---------------------------
2// M.Golubeva (INR RAS), January 2021
3//---------------------------
4
6#include "TFile.h"
7#include "TGeoManager.h"
8#include "TGeoMedium.h"
9#include "TGeoVolume.h"
10
11// Detector's construct parameters ===================
12
13// Global dimensions for Hodo in cm (only Hodo scint)
14Double_t Hodo_X_size = 8; // 16./2.
15Double_t Hodo_Y_size = 8; // 16./2.
16Double_t Hodo_Z_size = 0.2; // half of 0.4 cm
17
18Double_t Hodo_X_size_box = 9.7; // 19.4/2.
20Double_t Hodo_Z_size_box = 2.25; // half of 4.5 cm (4.4+2.*0.05)
21
22// Al plates
23Double_t Hodo_X_size_Al_plate = 0.15; // half of 0.3 cm
24Double_t Hodo_Y_size_Al_plate = 9.7; // half of 19.4 cm
25Double_t Hodo_Z_size_Al_plate = 2.2; // half of 4.4 cm
26
27Double_t Hodo_X_size_Al_plate_horiz = 9.7; // half of 19.4 cm
28Double_t Hodo_Y_size_Al_plate_horiz = 0.15; // half of 0.3 cm
29Double_t Hodo_Z_size_Al_plate_horiz = 2.2; // half of 4.4 cm
30
31// Fe plates
32Double_t Hodo_thickness_Fe_plate = 0.025; // half of 0.05 cm
33
34// HODO sticks
40
41// media ============================================
47
48class FairGeoMedia;
49class FairGeoBuilder;
50
51void DefineRequiredMedia(FairGeoMedia* geoMedia, FairGeoBuilder* geoBuild)
52{
53 // vacuum medium
54 FairGeoMedium* mVacuum = geoMedia->getMedium("vacuum");
55 if (!mVacuum)
56 Fatal("Main", "FairMedium vacuum not found");
57 geoBuild->createMedium(mVacuum);
58 pMedVacuum = gGeoManager->GetMedium("vacuum");
59 if (!pMedVacuum)
60 Fatal("Main", "Medium vacuum not found");
61
62 // air medium
63 FairGeoMedium* mAir = geoMedia->getMedium("air");
64 if (!mAir)
65 Fatal("Main", "FairMedium air not found");
66 geoBuild->createMedium(mAir);
67 pMedAir = gGeoManager->GetMedium("air");
68 if (!pMedAir)
69 Fatal("Main", "Medium air not found");
70
71 // medium polystyrene (Scint.)
72 FairGeoMedium* mPolystyrene = geoMedia->getMedium("polystyrene");
73 if (!mPolystyrene)
74 Fatal("Main", "FairMedium polystyrene not found");
75 geoBuild->createMedium(mPolystyrene);
76 pMedScint = gGeoManager->GetMedium("polystyrene");
77 if (!pMedScint)
78 Fatal("Main", "Medium polystyrene not found");
79
80 // medium aluminium (Hodo box)
81 FairGeoMedium* mAluminium = geoMedia->getMedium("aluminium");
82 if (!mAluminium)
83 Fatal("Main", "FairMedium aluminium not found");
84 geoBuild->createMedium(mAluminium);
85 pMedAlum = gGeoManager->GetMedium("aluminium");
86 if (!pMedAlum)
87 Fatal("Main", "Medium aluminium not found");
88
89 // medium iron (Hodo box)
90 FairGeoMedium* mIron = geoMedia->getMedium("iron");
91 if (!mIron)
92 Fatal("Main", "FairMedium iron not found");
93 geoBuild->createMedium(mIron);
94 pMedIron = gGeoManager->GetMedium("iron");
95 if (!pMedIron)
96 Fatal("Main", "Medium iron not found");
97
98} // DefineRequiredMedia
99
100void FillStick(TGeoVolume* hodoStickV);
101
103 Double_t Hodo_Ypos = -1,
104 Double_t Hodo_Zpos = 970.2,
105 Double_t rotY = 1.6)
106{
107
108 bmnloadlibs(); // load libraries
109
110 // ---- set working directory --------------------------------------------
111 TString gPath = gSystem->Getenv("VMCWORKDIR");
112
113 // ------- Geometry file name (output) ---------------------------------
114 const TString geoDetectorName = "Hodo_with_box";
115 const TString geoDetectorVersion = "v1";
116
117 Double_t Hodo_center_Zpos = Hodo_Zpos + Hodo_Z_size_box * TMath::Cos(rotY * TMath::DegToRad()); //(900+0.2);//cm
118 Double_t Hodo_center_Xpos = Hodo_Xpos + Hodo_Z_size_box * TMath::Sin(rotY * TMath::DegToRad()); // cm
119
120 TString sXshift_1 = "";
121 TString sXshift_2 = "";
122
123 TString sYshift_1 = "";
124 TString sYshift_2 = "";
125
126 TString sZshift_1 = "";
127 TString sZshift_2 = "";
128
129 TString sRotY_1 = "";
130 TString sRotY_2 = "";
131
132 Int_t Zshift_1 = Int_t(Hodo_Zpos); // cm
133 sZshift_1 += Zshift_1;
134 Int_t Zshift_2 = Int_t(10 * (Hodo_Zpos - Int_t(Hodo_Zpos))); // cm
135 sZshift_2 += Zshift_2;
136
137 Int_t Xshift_1 = Int_t(Hodo_Xpos); // cm
138 sXshift_1 += Xshift_1;
139 // Int_t Xshift_2 = Hodo_Xpos-Hodo_Xpos; //to make "0" //cm
140 Int_t Xshift_2 = Int_t(100 * (Hodo_Xpos - Int_t(Hodo_Xpos))); // cm
141 // Int_t Xshift_3 = Int_t(0.5+100*(Hodo_Xpos-Int_t(Hodo_Xpos))); //cm
142 sXshift_2 += Xshift_2;
143 // sXshift_2 += Xshift_3;
144
145 Int_t Yshift_1 = Int_t(Hodo_Ypos); // cm
146 sYshift_1 += Yshift_1;
147 Int_t Yshift_2 = Int_t(100 * (Hodo_Ypos - Int_t(Hodo_Ypos))); // cm
148 sYshift_2 += Yshift_2;
149
150 Int_t rotY_1 = Int_t(rotY);
151 sRotY_1 += rotY_1;
152 // Int_t rotY_2 = Int_t(100*(rotY-Int_t(rotY)));
153 Int_t rotY_2 = TMath::Abs(Int_t(10 * (rotY - Int_t(rotY))));
154 sRotY_2 += rotY_2;
155 // cout <<"sRotY_1,sRotY_2 " <<sRotY_1 <<" " <<rotY_2 <<endl;
156
157 TString geoFileName = gPath + "/geometry/" + geoDetectorName + "_" + "Zpos_" + sZshift_1 + "." + sZshift_2 + "cm"
158 + "_" + "Xshift_" + sXshift_1 + "." + sXshift_2 + "cm" + "_" + "Yshift_" + sYshift_1 + "."
159 + sYshift_2 + "cm" + "_" + "rotationY_" + sRotY_1 + "." + sRotY_2 + "deg_"
160 + geoDetectorVersion + ".root";
161
162 // ---- global geometry parameters ---------------------------------
163 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
164 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
165
166 // ------- Load media from media file ----------------------------
167 TString medFile = gPath + "/geometry/media.geo";
168 geoFace->setMediaFile(medFile);
169 geoFace->readMedia();
170 FairGeoMedia* geoMedia = geoFace->getMedia();
171 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
172 geoMedia->list();
173 geoMedia->print();
174 DefineRequiredMedia(geoMedia, geoBuild);
175
176 // -------------- Create geometry and global top volume ------------
177 gGeoManager = (TGeoManager*)gROOT->FindObject("FAIRGeom");
178 gGeoManager->SetName(geoDetectorName + "_geom");
179 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
180 top->SetMedium(pMedAir);
181 gGeoManager->SetTopVolume(top);
182 // gGeoMan->SetTopVisible(1);
183
184 // Define Hodo Geometry
185 TString Hodo_common_name = "Hodo_common";
186 TGeoVolume* Hodo_common = new TGeoVolumeAssembly(Hodo_common_name);
187 Hodo_common->SetMedium(pMedAir);
188 // Hodo_common->SetMedium(pMedVacuum);
189
190 TString hodo_name = "hodo01"; // only Hodo
191 TGeoBBox* HodoS = new TGeoBBox(hodo_name, Hodo_X_size, Hodo_Y_size, Hodo_Z_size);
192 TGeoVolume* HodoV = new TGeoVolume(hodo_name, HodoS);
193 HodoV->SetMedium(pMedAir);
194
195 TString hodoStick_name = "hodo01stick";
196
197 TGeoBBox* hodoStickS = new TGeoBBox(hodoStick_name, Hodo_stick_X_size, Hodo_stick_Y_size, Hodo_stick_Z_size);
198 TGeoVolume* hodoStickV = new TGeoVolume(hodoStick_name, hodoStickS);
199
200 hodoStickV->SetMedium(pMedAir);
201
202 // Fill Hodo with sticks (1-16)
203 // Fill Hodo with sticks (16-1)
205 Float_t yCur = 0.;
206 Float_t zCur = 0;
207
208 Int_t iMod = -1, modNb = -1;
209
210 for (Int_t iy = 0; iy < Hodo_NRows; iy++) {
211 for (Int_t ix = 0; ix < Hodo_NColumns; ix++) {
212 xCur = xCur - 2. * Hodo_stick_X_size;
213
214 TGeoTranslation* hodoStickV_position = new TGeoTranslation(xCur, yCur, zCur);
215 iMod = iy * Hodo_NColumns + ix;
216 // modNb = iMod+1;
217 // new numbering
218 modNb = (Hodo_NColumns + 1) - (iMod + 1);
219
220 HodoV->AddNode(hodoStickV, modNb, hodoStickV_position);
221 cout << "Hodo modNb,xxxx,yyyy " << modNb << " " << xCur << " " << yCur << endl;
222
223 } // for(Int_t ix==0; ix<7; ix++)
224 } // for(Int_t iy==0; iy<7; iy++)
225 // return;
226
227 // Fill Hodo box
228 TString hodo_name_box = "hodo01_box"; // Hodo+box
229 TGeoBBox* HodoS_box = new TGeoBBox(hodo_name_box, Hodo_X_size_box, Hodo_Y_size_box, Hodo_Z_size_box);
230 TGeoVolume* HodoV_box = new TGeoVolume(hodo_name_box, HodoS_box);
231 HodoV_box->SetMedium(pMedAir);
232
233 // Al plates
234 TString hodo_name_Al_plate = "hodo01_Al_plate";
235 TGeoBBox* HodoS_Al_plate =
237 TGeoVolume* HodoV_Al_plate = new TGeoVolume(hodo_name_Al_plate, HodoS_Al_plate);
238 HodoV_Al_plate->SetMedium(pMedAlum);
239
240 xCur = -Hodo_X_size_box + Hodo_X_size_Al_plate; // Al left
241 TGeoTranslation* hodoBox = new TGeoTranslation(xCur, 0., 0.);
242 HodoV_box->AddNode(HodoV_Al_plate, 1, hodoBox);
243 cout << "Hodo box Al_left " << xCur << endl;
244
245 hodoBox = new TGeoTranslation(-xCur, 0., 0.); // Al right
246 HodoV_box->AddNode(HodoV_Al_plate, 2, hodoBox);
247 cout << "Hodo box Al_right " << -xCur << endl;
248
249 TString hodo_name_Al_plate_horiz = "hodo01_Al_plate_horiz";
250 TGeoBBox* HodoS_Al_plate_horiz = new TGeoBBox(hodo_name_Al_plate_horiz, Hodo_X_size_Al_plate_horiz,
252 TGeoVolume* HodoV_Al_plate_horiz = new TGeoVolume(hodo_name_Al_plate_horiz, HodoS_Al_plate_horiz);
253 HodoV_Al_plate_horiz->SetMedium(pMedAlum);
254
255 yCur = -Hodo_Y_size_box + Hodo_Y_size_Al_plate_horiz; // Al bottom
256 hodoBox = new TGeoTranslation(0., yCur, 0.);
257 HodoV_box->AddNode(HodoV_Al_plate_horiz, 1, hodoBox); // bottom
258 cout << "Hodo box Al_bottom " << xCur << endl;
259
260 hodoBox = new TGeoTranslation(0., -yCur, 0.);
261 HodoV_box->AddNode(HodoV_Al_plate_horiz, 2, hodoBox); // top
262 cout << "Hodo box Al_top " << xCur << endl;
263
264 // Fe plates
265 TString hodo_name_Fe_plate = "hodo01_Fe_plate";
266 TGeoBBox* HodoS_Fe_plate =
268 TGeoVolume* HodoV_Fe_plate = new TGeoVolume(hodo_name_Fe_plate, HodoS_Fe_plate);
269 HodoV_Fe_plate->SetMedium(pMedIron);
270
271 zCur = -Hodo_Z_size_box + Hodo_thickness_Fe_plate; // Fe upstream
272 hodoBox = new TGeoTranslation(0., 0., zCur);
273 HodoV_box->AddNode(HodoV_Fe_plate, 1, hodoBox);
274 cout << "Hodo box Fe_downstream " << xCur << endl;
275
276 hodoBox = new TGeoTranslation(0., 0., -zCur); // Fe downstream
277 HodoV_box->AddNode(HodoV_Fe_plate, 2, hodoBox);
278 cout << "Hodo box Fe_upstream " << xCur << endl;
279
280 // Scint. sticks
281 hodoBox = new TGeoTranslation(0., 0., 0.);
282 HodoV_box->AddNode(HodoV, 1, hodoBox);
283 cout << "Hodo box Scint " << xCur << endl;
284
285 FillStick(hodoStickV);
286
287 // Adding the Hodo box mother volume to the global TOP Volume
288 TGeoRotation* rot = new TGeoRotation("rot");
289 rot->RotateY(rotY);
290 TGeoCombiTrans* hodoHodo = new TGeoCombiTrans("hodoHodo", Hodo_center_Xpos, Hodo_Ypos, Hodo_center_Zpos, rot);
291 // Hodo_common->AddNode(HodoV, 1, hodoHodo);
292 Hodo_common->AddNode(HodoV_box, 1, hodoHodo);
293
294 top->AddNode(Hodo_common, 0);
296
297 // --------------- Finish ---------------------------------------
298 gGeoManager->CloseGeometry();
299 gGeoManager->CheckOverlaps(0.001);
300 gGeoManager->PrintOverlaps();
301
302 gGeoManager->Test();
303
304 TFile* geoFile = new TFile(geoFileName, "RECREATE");
305 top->Write();
306 geoFile->Close();
307
308 // TString gdmlname = gPath + "/geometry/tpc_v7.gdml";
309 // gGeoManager->Export(gdmlname);
310
311 // top->Draw("ogl");
312 // TGLViewer *v = (TGLViewer*)gPad->GetViewer3D();
313 // v->SetStyle(TGLRnrCtx::kOutline);
314 // top->Draw("");
315
316} // end macro
317
318void FillStick(TGeoVolume* mother_volume)
319{
320 TString hodoSensitiveStick_name = "hodo_stick_sens";
321
322 // Stick
323 TGeoShape* hodoSensitiveStickS =
324 new TGeoBBox(hodoSensitiveStick_name, Hodo_stick_X_size, Hodo_stick_Y_size, Hodo_stick_Z_size);
325 TGeoVolume* hodoSensitiveStickV = new TGeoVolume(hodoSensitiveStick_name, hodoSensitiveStickS);
326 TGeoMedium* Sc_medium_stick = pMedScint; // set medium
327 if (Sc_medium_stick)
328 hodoSensitiveStickV->SetMedium(Sc_medium_stick);
329 else
330 Fatal("Main", "Invalid medium for Sc_medium_stick");
331
332 mother_volume->AddNode(hodoSensitiveStickV, 1, new TGeoTranslation(0, 0, 0));
333
334} // FillStick()
int Int_t
float Float_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
void Close(Option_t *option="") override
void RotateY(Double_t angle) override
void SetVisContainers(Bool_t flag=kTRUE) override
virtual TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="")
virtual void SetMedium(TGeoMedium *medium)
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
void bmnloadlibs()
Definition bmnloadlibs.C:4
void FillStick(TGeoVolume *hodoStickV)
void create_rootgeom_Hodo_oldnames_with_box_v1(Double_t Hodo_Xpos=64.9, Double_t Hodo_Ypos=-1, Double_t Hodo_Zpos=970.2, Double_t rotY=1.6)
void DefineRequiredMedia(FairGeoMedia *geoMedia, FairGeoBuilder *geoBuild)
constexpr Double_t DegToRad()
Double_t Cos(Double_t)
Double_t Abs(Double_t d)
Double_t Sin(Double_t)