BmnRoot
26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Toggle main menu visibility
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
23
Double_t
Hodo_X_size
= 8;
// 16./2.
24
Double_t
Hodo_Y_size
= 8;
// 16./2.
25
Double_t
Hodo_Z_size
= 0.2;
// half of 0.4 cm
26
27
// HODO sticks
28
Double_t
Hodo_NColumns
= 16;
29
Double_t
Hodo_NRows
= 1;
30
Double_t
Hodo_stick_X_size
= 0.5;
// 1./2.
31
Double_t
Hodo_stick_Y_size
= 8;
// 16./2.
32
Double_t
Hodo_stick_Z_size
= 0.2;
// 0.4/2.
33
34
// media ============================================
35
TGeoMedium
*
pMedVacuum
= 0;
36
TGeoMedium
*
pMedAir
= 0;
37
TGeoMedium
*
pMedScint
= 0;
38
39
class
FairGeoMedia;
40
class
FairGeoBuilder;
41
42
void
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
73
void
FillStick
(
TGeoVolume
* hodoStickV);
74
75
void
create_rootgeom_Hodo_oldnames_v1
(
Double_t
Hodo_Xpos = 0,
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)
171
Float_t
xCur =
Hodo_X_size
+
Hodo_stick_X_size
;
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);
200
top->
SetVisContainers
(
kTRUE
);
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
223
void
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_t
int Int_t
Float_t
float Float_t
Double_t
double Double_t
kTRUE
constexpr Bool_t kTRUE
Fatal
void Fatal(const char *location, const char *msgfmt,...)
TFile.h
TGeoManager.h
gGeoManager
R__EXTERN TGeoManager * gGeoManager
TGeoMedium.h
TGeoVolume.h
gROOT
#define gROOT
gSystem
R__EXTERN TSystem * gSystem
TFile
TFile::Close
void Close(Option_t *option="") override
TGeoBBox
TGeoCombiTrans
TGeoManager
TGeoMedium
TGeoRotation
TGeoRotation::RotateY
void RotateY(Double_t angle) override
TGeoShape
TGeoTranslation
TGeoVolumeAssembly
TGeoVolume
TGeoVolume::SetVisContainers
void SetVisContainers(Bool_t flag=kTRUE) override
TGeoVolume::AddNode
virtual TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="")
TGeoVolume::SetMedium
virtual void SetMedium(TGeoMedium *medium)
TObject::Write
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
TString
pMedAir
TGeoMedium * pMedAir
Definition
create_rootgeom_Hodo_oldnames_v1.C:36
Hodo_stick_Y_size
Double_t Hodo_stick_Y_size
Definition
create_rootgeom_Hodo_oldnames_v1.C:31
Hodo_NRows
Double_t Hodo_NRows
Definition
create_rootgeom_Hodo_oldnames_v1.C:29
Hodo_stick_X_size
Double_t Hodo_stick_X_size
Definition
create_rootgeom_Hodo_oldnames_v1.C:30
Hodo_NColumns
Double_t Hodo_NColumns
Definition
create_rootgeom_Hodo_oldnames_v1.C:28
Hodo_Z_size
Double_t Hodo_Z_size
Definition
create_rootgeom_Hodo_oldnames_v1.C:25
Hodo_stick_Z_size
Double_t Hodo_stick_Z_size
Definition
create_rootgeom_Hodo_oldnames_v1.C:32
Hodo_Y_size
Double_t Hodo_Y_size
Definition
create_rootgeom_Hodo_oldnames_v1.C:24
Hodo_X_size
Double_t Hodo_X_size
Definition
create_rootgeom_Hodo_oldnames_v1.C:23
pMedScint
TGeoMedium * pMedScint
Definition
create_rootgeom_Hodo_oldnames_v1.C:37
pMedVacuum
TGeoMedium * pMedVacuum
Definition
create_rootgeom_Hodo_oldnames_v1.C:35
FillStick
void FillStick(TGeoVolume *hodoStickV)
Definition
create_rootgeom_Hodo_oldnames_v1.C:223
DefineRequiredMedia
void DefineRequiredMedia(FairGeoMedia *geoMedia, FairGeoBuilder *geoBuild)
Definition
create_rootgeom_Hodo_oldnames_v1.C:42
create_rootgeom_Hodo_oldnames_v1
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)
Definition
create_rootgeom_Hodo_oldnames_v1.C:75
TMath::DegToRad
constexpr Double_t DegToRad()
TMath::Cos
Double_t Cos(Double_t)
TMath::Sin
Double_t Sin(Double_t)
macro
geometry
create_rootgeom_Hodo_oldnames_v1.C
Generated on
for BmnRoot by
1.17.0