BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_Hodo_oldnames_v1.C
Go to the documentation of this file.
1//---------------------------
2// M.Golubeva (INR RAS), January 2021
3//---------------------------
4
5// create_rootgeom_Hodo_oldnames_v1(Double_t Hodo_Xpos=0,Double_t Hodo_Ypos=0,Double_t Hodo_Zpos=900,Double_t rotY=0)
6// Hodo_Xpos - X coordinate of front surface center [cm]
7// Hodo_Ypos - Y coordinate of front surface center [cm]
8// Hodo_Zpos - Z coordinate of front surface center [cm]
9// rotY - rotation around Y axis [deg.]
10
11// Example of root file creation
12// root -l "create_rootgeom_Hodo_oldnames_v1.C(0,0,900,0)"
13
14#include "../run/bmnloadlibs.C"
15#include "TFile.h"
16#include "TGeoManager.h"
17#include "TGeoMedium.h"
18#include "TGeoVolume.h"
19
20// Detector's construct parameters ===================
21
22// Global dimensions for Hodo in cm
23Double_t Hodo_X_size = 8; // 16./2.
24Double_t Hodo_Y_size = 8; // 16./2.
25Double_t Hodo_Z_size = 0.2; // half of 0.4 cm
26
27// HODO sticks
33
34// media ============================================
38
39class FairGeoMedia;
40class FairGeoBuilder;
41
42void DefineRequiredMedia(FairGeoMedia* geoMedia, FairGeoBuilder* geoBuild)
43{
44 // vacuum medium
45 FairGeoMedium* mVacuum = geoMedia->getMedium("vacuum");
46 if (!mVacuum)
47 Fatal("Main", "FairMedium vacuum not found");
48 geoBuild->createMedium(mVacuum);
49 pMedVacuum = gGeoManager->GetMedium("vacuum");
50 if (!pMedVacuum)
51 Fatal("Main", "Medium vacuum not found");
52
53 // air medium
54 FairGeoMedium* mAir = geoMedia->getMedium("air");
55 if (!mAir)
56 Fatal("Main", "FairMedium air not found");
57 geoBuild->createMedium(mAir);
58 pMedAir = gGeoManager->GetMedium("air");
59 if (!pMedAir)
60 Fatal("Main", "Medium air not found");
61
62 // medium polystyrene (Scint.)
63 FairGeoMedium* mPolystyrene = geoMedia->getMedium("polystyrene");
64 if (!mPolystyrene)
65 Fatal("Main", "FairMedium polystyrene not found");
66 geoBuild->createMedium(mPolystyrene);
67 pMedScint = gGeoManager->GetMedium("polystyrene");
68 if (!pMedScint)
69 Fatal("Main", "Medium polystyrene not found");
70
71} // DefineRequiredMedia
72
73void FillStick(TGeoVolume* hodoStickV);
74
76 Double_t Hodo_Ypos = 0,
77 Double_t Hodo_Zpos = 900,
78 Double_t rotY = 0)
79{
80
81 bmnloadlibs(); // load libraries
82
83 // ---- set working directory --------------------------------------------
84 TString gPath = gSystem->Getenv("VMCWORKDIR");
85
86 // ------- Geometry file name (output) ---------------------------------
87 const TString geoDetectorName = "Hodo_oldnames";
88 const TString geoDetectorVersion = "v1";
89
90 Double_t Hodo_center_Zpos = Hodo_Zpos + Hodo_Z_size * TMath::Cos(rotY * TMath::DegToRad()); //(900+0.2);//cm
91 Double_t Hodo_center_Xpos = Hodo_Xpos + Hodo_Z_size * TMath::Sin(rotY * TMath::DegToRad()); // cm
92
93 TString sXshift_1 = "";
94 TString sXshift_2 = "";
95
96 TString sYshift_1 = "";
97 TString sYshift_2 = "";
98
99 TString sZshift_1 = "";
100 TString sZshift_2 = "";
101
102 TString sRotY_1 = "";
103 TString sRotY_2 = "";
104
105 Int_t Zshift_1 = Int_t(Hodo_Zpos); // cm
106 sZshift_1 += Zshift_1;
107 Int_t Zshift_2 = Int_t(10 * (Hodo_Zpos - Int_t(Hodo_Zpos))); // cm
108 sZshift_2 += Zshift_2;
109
110 Int_t Xshift_1 = Int_t(Hodo_Xpos); // cm
111 sXshift_1 += Xshift_1;
112 Int_t Xshift_2 = Int_t(0.5 + 100 * (Hodo_Xpos - Int_t(Hodo_Xpos))); // cm
113 sXshift_2 += Xshift_2;
114
115 Int_t Yshift_1 = Int_t(Hodo_Ypos); // cm
116 sYshift_1 += Yshift_1;
117 Int_t Yshift_2 = Int_t(100 * (Hodo_Ypos - Int_t(Hodo_Ypos))); // cm
118 sYshift_2 += Yshift_2;
119
120 Int_t rotY_1 = Int_t(rotY);
121 sRotY_1 += rotY_1;
122 Int_t rotY_2 = Int_t(100 * (rotY - Int_t(rotY)));
123 sRotY_2 += rotY_2;
124
125 TString geoFileName = gPath + "/geometry/" + geoDetectorName + "_" + "Zpos_" + sZshift_1 + "." + sZshift_2 + "cm"
126 + "_" + "Xshift_" + sXshift_1 + "." + sXshift_2 + "cm" + "_" + "Yshift_" + sYshift_1 + "."
127 + sYshift_2 + "cm" + "_" + "rotationY_" + sRotY_1 + "." + sRotY_2 + "deg_"
128 + geoDetectorVersion + ".root";
129
130 // ---- global geometry parameters ---------------------------------
131 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
132 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
133
134 // ------- Load media from media file ----------------------------
135 TString medFile = gPath + "/geometry/media.geo";
136 geoFace->setMediaFile(medFile);
137 geoFace->readMedia();
138 FairGeoMedia* geoMedia = geoFace->getMedia();
139 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
140 geoMedia->list();
141 geoMedia->print();
142 DefineRequiredMedia(geoMedia, geoBuild);
143
144 // -------------- Create geometry and global top volume ------------
145 gGeoManager = (TGeoManager*)gROOT->FindObject("FAIRGeom");
146 gGeoManager->SetName(geoDetectorName + "_geom");
147 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
148 top->SetMedium(pMedAir);
149 gGeoManager->SetTopVolume(top);
150 // gGeoMan->SetTopVisible(1);
151
152 // Define Hodo Geometry
153 TString Hodo_common_name = "Hodo_common";
154 TGeoVolume* Hodo_common = new TGeoVolumeAssembly(Hodo_common_name);
155 Hodo_common->SetMedium(pMedAir);
156 // Hodo_common->SetMedium(pMedVacuum);
157
158 TString hodo_name = "hodo01";
159 TGeoBBox* HodoS = new TGeoBBox(hodo_name, Hodo_X_size, Hodo_Y_size, Hodo_Z_size);
160 TGeoVolume* HodoV = new TGeoVolume(hodo_name, HodoS);
161 HodoV->SetMedium(pMedAir);
162
163 TString hodoStick_name = "hodo01stick";
164
165 TGeoBBox* hodoStickS = new TGeoBBox(hodoStick_name, Hodo_stick_X_size, Hodo_stick_Y_size, Hodo_stick_Z_size);
166 TGeoVolume* hodoStickV = new TGeoVolume(hodoStick_name, hodoStickS);
167
168 hodoStickV->SetMedium(pMedAir);
169
170 // Fill Hodo with sticks (1-16)
172 Float_t yCur = 0.;
173 Float_t zCur = 0;
174
175 Int_t iMod = -1, modNb = -1;
176
177 for (Int_t iy = 0; iy < Hodo_NRows; iy++) {
178 for (Int_t ix = 0; ix < Hodo_NColumns; ix++) {
179 xCur = xCur - 2. * Hodo_stick_X_size;
180
181 TGeoTranslation* hodoStickV_position = new TGeoTranslation(xCur, yCur, zCur);
182 iMod = iy * Hodo_NColumns + ix;
183 modNb = iMod + 1;
184
185 HodoV->AddNode(hodoStickV, modNb, hodoStickV_position);
186 cout << "Hodo modNb,xxxx,yyyy " << modNb << " " << xCur << " " << yCur << endl;
187
188 } // for(Int_t ix==0; ix<7; ix++)
189 } // for(Int_t iy==0; iy<7; iy++)
190
191 FillStick(hodoStickV);
192
193 // Adding the Hodo mother volume to the global TOP Volume
194 TGeoRotation* rot = new TGeoRotation("rot");
195 rot->RotateY(rotY);
196 TGeoCombiTrans* hodoHodo = new TGeoCombiTrans("hodoHodo", Hodo_center_Xpos, Hodo_Ypos, Hodo_center_Zpos, rot);
197 Hodo_common->AddNode(HodoV, 1, hodoHodo);
198
199 top->AddNode(Hodo_common, 0);
201
202 // --------------- Finish ---------------------------------------
203 gGeoManager->CloseGeometry();
204 gGeoManager->CheckOverlaps(0.001);
205 gGeoManager->PrintOverlaps();
206
207 gGeoManager->Test();
208
209 TFile* geoFile = new TFile(geoFileName, "RECREATE");
210 top->Write();
211 geoFile->Close();
212
213 // TString gdmlname = gPath + "/geometry/tpc_v7.gdml";
214 // gGeoManager->Export(gdmlname);
215
216 // top->Draw("ogl");
217 // TGLViewer *v = (TGLViewer*)gPad->GetViewer3D();
218 // v->SetStyle(TGLRnrCtx::kOutline);
219 // top->Draw("");
220
221} // end macro
222
223void FillStick(TGeoVolume* mother_volume)
224{
225 TString hodoSensitiveStick_name = "hodo_stick_sens";
226
227 // Stick
228 TGeoShape* hodoSensitiveStickS =
229 new TGeoBBox(hodoSensitiveStick_name, Hodo_stick_X_size, Hodo_stick_Y_size, Hodo_stick_Z_size);
230 TGeoVolume* hodoSensitiveStickV = new TGeoVolume(hodoSensitiveStick_name, hodoSensitiveStickS);
231 TGeoMedium* Sc_medium_stick = pMedScint; // set medium
232 if (Sc_medium_stick)
233 hodoSensitiveStickV->SetMedium(Sc_medium_stick);
234 else
235 Fatal("Main", "Invalid medium for Sc_medium_stick");
236
237 mother_volume->AddNode(hodoSensitiveStickV, 1, new TGeoTranslation(0, 0, 0));
238
239} // 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)
TGeoMedium * pMedAir
Double_t Hodo_stick_Y_size
void FillStick(TGeoVolume *hodoStickV)
Double_t Hodo_stick_X_size
void DefineRequiredMedia(FairGeoMedia *geoMedia, FairGeoBuilder *geoBuild)
Double_t Hodo_stick_Z_size
void create_rootgeom_Hodo_oldnames_v1(Double_t Hodo_Xpos=0, Double_t Hodo_Ypos=0, Double_t Hodo_Zpos=900, Double_t rotY=0)
TGeoMedium * pMedScint
TGeoMedium * pMedVacuum
constexpr Double_t DegToRad()
Double_t Cos(Double_t)
Double_t Sin(Double_t)