BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_MAGNET.C
Go to the documentation of this file.
1// Creating MAGNET geometry. Macro writes geometry to 'geometry/magnet_modified.root'
2#include "TFile.h"
3#include "TGeoManager.h"
4#include "TGeoMedium.h"
5#include "TGeoXtru.h"
6#include "TMath.h"
7
8using namespace TMath;
9//---------------------------
10
12
13//--------Magnet position-------------------------------------------------------
14const double XMagnetPos = 0.0;
15const double YMagnetPos = 0.0;
16const double ZMagnetPos = 124.5; // cm
17
18//--------Magnet construct parameters-------------------------------------------
19
20// Yoke parameters:
21const double XSizeYoke = 700.0; // cm
22const double YSizeYoke = 448.0;
23const double ZSizeYoke = 260.0;
24
25const double XSizeInnerSpaceInYoke = 460.0; // x-inner size of empty space in yoke
26const double YSizeInnerSpaceInYoke = 230.0; // y-inner size of empty space in yoke
27const double ZSizeInnerSpaceInYoke = ZSizeYoke + 0.01; // z-inner size of empty space in yoke
28
29double AngleOfBevelYoke = 30.0;
30double AdjCatetOfBevelYoke = 80.0;
32
33// Coil parameters:
34const double XSizeCoil = 429.2;
35const double YSizeCoil = 50.0;
36const double ZSizeCoil = 514.2;
37
38const double WidthCoil = 110.0;
39const double RMinCoil = 25.0;
40const double RMaxCoil = 135.0;
41
42const double LengthCoilShortSide = 209.2 - 2 * RMinCoil;
43const double LengthCoilLongSide = 294.2 - 2 * RMinCoil;
44
45const double YDistanceBetweenCoils = 120.0;
46
47// Pole parameters
48const double YDistanceBetweenPoles = 107.0;
49
50const double XSizePole = 168.0;
52const double ZSizePole = 249.0;
53double CatetOfBevelPole = 30.0;
54
56{
57
58 // Load the necessary FairRoot libraries
59 gROOT->LoadMacro("$VMCWORKDIR/macro/run/bmnloadlibs.C");
60 bmnloadlibs(); // load libraries
61
62 // ------- Load media from media file -----------------------------------
63 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
64 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
65 TString geoPath = gSystem->Getenv("VMCWORKDIR");
66 TString medFile = geoPath + "/geometry/media.geo";
67 geoFace->setMediaFile(medFile);
68 geoFace->readMedia();
70 // --------------------------------------------------------------------------
71
72 // ------- Geometry file name (output) ----------------------------------
73 const TString geoObjectName = "magnet";
74 const TString geoObjectVersion = "modified";
75 const TString geoFileName = geoPath + "/geometry/" + geoObjectName + "_" + geoObjectVersion + ".root";
76 // --------------------------------------------------------------------------
77
78 // ----------------- Get and create the required media -----------------
79 FairGeoMedia* geoMedia = geoFace->getMedia();
80 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
81
82 FairGeoMedium* mAir = geoMedia->getMedium("air");
83 if (!mAir)
84 Fatal("Main", "FairMedium air not found");
85 geoBuild->createMedium(mAir);
86 TGeoMedium* pMedAir = gGeoMan->GetMedium("air");
87 if (!pMedAir)
88 Fatal("Main", "Medium air not found");
89
90 FairGeoMedium* mIron = geoMedia->getMedium("iron");
91 if (!mIron)
92 Fatal("Main", "FairMedium iron not found");
93 geoBuild->createMedium(mIron);
94 TGeoMedium* pMedIron = gGeoMan->GetMedium("iron");
95 if (!pMedIron)
96 Fatal("Main", "Medium iron not found");
97
98 FairGeoMedium* mSteel = geoMedia->getMedium("steel");
99 if (!mSteel)
100 Fatal("Main", "FairMedium steel not found");
101 geoBuild->createMedium(mSteel);
102 TGeoMedium* pMedSteel = gGeoMan->GetMedium("steel");
103 if (!pMedSteel)
104 Fatal("Main", "Medium steel not found");
105
106 FairGeoMedium* mCopper = geoMedia->getMedium("copper");
107 if (!mCopper)
108 Fatal("Main", "FairMedium copper not found");
109 geoBuild->createMedium(mCopper);
110 TGeoMedium* pMedCopper = gGeoMan->GetMedium("copper");
111 if (!pMedCopper)
112 Fatal("Main", "Medium copper not found");
113
114 // --------------------------------------------------------------------------
115
116 // -------------- Create geometry and top volume -------------------------
117 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
118 gGeoMan->SetName(geoObjectName + "_geom");
119 // gGeoMan->SetTopVisible(1);
120 // --------------------------------------------------------------------------
121
122 // Define TOP Geometry
123 TGeoVolume* top = new TGeoVolumeAssembly(geoObjectName);
124 top->SetMedium(pMedAir);
125 gGeoMan->SetTopVolume(top);
126
127 //-----------Solids (shapes)----------------------------------------------------
128
129 // Start of yoke shape creating
130 const Int_t NYokeProfilePoints = 8;
131 const Int_t NYokeZPlanes = 2;
132 TGeoXtru* YokeContainerS = new TGeoXtru(NYokeZPlanes);
133 YokeContainerS->SetName("YokeContainerS");
134
135 Double_t XYokeProfile[NYokeProfilePoints];
136 XYokeProfile[0] = -((XSizeYoke - 2 * OppCatetOfBevelYoke) / 2);
137 XYokeProfile[1] = -(XSizeYoke / 2);
138 XYokeProfile[2] = -(XSizeYoke / 2);
139 XYokeProfile[3] = -((XSizeYoke - 2 * OppCatetOfBevelYoke) / 2);
140 XYokeProfile[4] = (XSizeYoke - 2 * OppCatetOfBevelYoke) / 2;
141 XYokeProfile[5] = XSizeYoke / 2;
142 XYokeProfile[6] = XSizeYoke / 2;
143 XYokeProfile[7] = (XSizeYoke - 2 * OppCatetOfBevelYoke) / 2;
144
145 Double_t YYokeProfile[NYokeProfilePoints];
146 YYokeProfile[0] = -(YSizeYoke / 2);
147 YYokeProfile[1] = -((YSizeYoke - 2 * AdjCatetOfBevelYoke) / 2);
148 YYokeProfile[2] = (YSizeYoke - 2 * AdjCatetOfBevelYoke) / 2;
149 YYokeProfile[3] = YSizeYoke / 2;
150 YYokeProfile[4] = YSizeYoke / 2;
151 YYokeProfile[5] = (YSizeYoke - 2 * AdjCatetOfBevelYoke) / 2;
152 YYokeProfile[6] = -((YSizeYoke - 2 * AdjCatetOfBevelYoke) / 2);
153 YYokeProfile[7] = -YSizeYoke / 2;
154
155 YokeContainerS->DefinePolygon(NYokeProfilePoints, XYokeProfile, YYokeProfile);
156 YokeContainerS->DefineSection(0, -ZSizeYoke / 2, 0, 0, 1.0);
157 YokeContainerS->DefineSection(1, ZSizeYoke / 2, 0, 0, 1.0);
158
159 TGeoShape* InnerSpaceInYokeS = new TGeoBBox("InnerSpaceInYokeS", XSizeInnerSpaceInYoke / 2,
161
162 TGeoCompositeShape* YokeS = new TGeoCompositeShape("YokeS", "YokeContainerS-InnerSpaceInYokeS");
163 // End of yoke shape creating
164
165 // Start of coil shape creating
166 TGeoShape* CoilCornerS = new TGeoTubeSeg("CoilCornerS", RMinCoil, RMaxCoil, YSizeCoil / 2, 0, 90);
167
168 TGeoRotation* rot_CoilCorner1 = new TGeoRotation("", 90.0, 0.0, 180.0, 0.0, 90.0, 90.0);
169 TGeoTranslation* tran_CoilCorner1 =
170 new TGeoTranslation("", XSizeCoil / 2 - (WidthCoil + RMinCoil), 0, -(ZSizeCoil / 2 - (WidthCoil + RMinCoil)));
171 TGeoCombiTrans* combitran_CoilCorner1 = new TGeoCombiTrans(*tran_CoilCorner1, *rot_CoilCorner1);
172 combitran_CoilCorner1->SetName("combitran_CoilCorner1");
173 combitran_CoilCorner1->RegisterYourself();
174
175 TGeoRotation* rot_CoilCorner2 = new TGeoRotation("", 90.0, 180.0, 180.0, 0.0, 90.0, 270.0);
176 TGeoTranslation* tran_CoilCorner2 = new TGeoTranslation("", -(XSizeCoil / 2 - (WidthCoil + RMinCoil)), 0,
177 -(ZSizeCoil / 2 - (WidthCoil + RMinCoil)));
178 TGeoCombiTrans* combitran_CoilCorner2 = new TGeoCombiTrans(*tran_CoilCorner2, *rot_CoilCorner2);
179 combitran_CoilCorner2->SetName("combitran_CoilCorner2");
180 combitran_CoilCorner2->RegisterYourself();
181
182 TGeoRotation* rot_CoilCorner3 = new TGeoRotation("", 90.0, 180.0, 0.0, 0.0, 90.0, 90.0);
183 TGeoTranslation* tran_CoilCorner3 =
184 new TGeoTranslation("", -(XSizeCoil / 2 - (WidthCoil + RMinCoil)), 0, ZSizeCoil / 2 - (WidthCoil + RMinCoil));
185 TGeoCombiTrans* combitran_CoilCorner3 = new TGeoCombiTrans(*tran_CoilCorner3, *rot_CoilCorner3);
186 combitran_CoilCorner3->SetName("combitran_CoilCorner3");
187 combitran_CoilCorner3->RegisterYourself();
188
189 TGeoRotation* rot_CoilCorner4 = new TGeoRotation("", 90.0, 0.0, 0.0, 0.0, 90.0, 270.0);
190 TGeoTranslation* tran_CoilCorner4 =
191 new TGeoTranslation("", XSizeCoil / 2 - (WidthCoil + RMinCoil), 0, ZSizeCoil / 2 - (WidthCoil + RMinCoil));
192 TGeoCombiTrans* combitran_CoilCorner4 = new TGeoCombiTrans(*tran_CoilCorner4, *rot_CoilCorner4);
193 combitran_CoilCorner4->SetName("combitran_CoilCorner4");
194 combitran_CoilCorner4->RegisterYourself();
195
196 TGeoShape* CoilShortSideS = new TGeoBBox("CoilShortSideS", LengthCoilShortSide / 2, YSizeCoil / 2, WidthCoil / 2);
197 TGeoShape* CoilLongSideS = new TGeoBBox("CoilLongSideS", WidthCoil / 2, YSizeCoil / 2, LengthCoilLongSide / 2);
198
199 TGeoTranslation* tran_CoilShortSide1 = new TGeoTranslation("", 0, 0, -(ZSizeCoil / 2 - WidthCoil / 2));
200 tran_CoilShortSide1->SetName("tran_CoilShortSide1");
201 tran_CoilShortSide1->RegisterYourself();
202
203 TGeoTranslation* tran_CoilShortSide2 = new TGeoTranslation("", 0, 0, ZSizeCoil / 2 - WidthCoil / 2);
204 tran_CoilShortSide2->SetName("tran_CoilShortSide2");
205 tran_CoilShortSide2->RegisterYourself();
206
207 TGeoTranslation* tran_CoilLongSide1 = new TGeoTranslation("", -(XSizeCoil / 2 - WidthCoil / 2), 0, 0);
208 tran_CoilLongSide1->SetName("tran_CoilLongSide1");
209 tran_CoilLongSide1->RegisterYourself();
210
211 TGeoTranslation* tran_CoilLongSide2 = new TGeoTranslation("", XSizeCoil / 2 - WidthCoil / 2, 0, 0);
212 tran_CoilLongSide2->SetName("tran_CoilLongSide2");
213 tran_CoilLongSide2->RegisterYourself();
214
215 TGeoCompositeShape* CoilS = new TGeoCompositeShape("CoilTS", "CoilCornerS:combitran_CoilCorner1"
216 "+CoilCornerS:combitran_CoilCorner2"
217 "+CoilCornerS:combitran_CoilCorner3"
218 "+CoilCornerS:combitran_CoilCorner4"
219 "+CoilShortSideS:tran_CoilShortSide1"
220 "+CoilShortSideS:tran_CoilShortSide2"
221 "+CoilLongSideS:tran_CoilLongSide1"
222 "+CoilLongSideS:tran_CoilLongSide2");
223 // End of coil shape creating
224
225 // Start of pole shape creating
226 const Int_t NPoleProfilePoints = 8;
227 const Int_t NPoleZPlanes = 2;
228 TGeoXtru* PoleS = new TGeoXtru(NPoleZPlanes);
229 PoleS->SetName("PoleS");
230
231 Double_t XPoleProfile[NPoleProfilePoints];
232 XPoleProfile[0] = -((XSizePole - 2 * CatetOfBevelPole) / 2);
233 XPoleProfile[1] = -(XSizePole / 2);
234 XPoleProfile[2] = -(XSizePole / 2);
235 XPoleProfile[3] = -((XSizePole - 2 * CatetOfBevelPole) / 2);
236 XPoleProfile[4] = (XSizePole - 2 * CatetOfBevelPole) / 2;
237 XPoleProfile[5] = XSizePole / 2;
238 XPoleProfile[6] = XSizePole / 2;
239 XPoleProfile[7] = (XSizePole - 2 * CatetOfBevelPole) / 2;
240
241 Double_t ZPoleProfile[NPoleProfilePoints];
242 ZPoleProfile[0] = -(ZSizePole / 2);
243 ZPoleProfile[1] = -((ZSizePole - 2 * CatetOfBevelPole) / 2);
244 ZPoleProfile[2] = (ZSizePole - 2 * CatetOfBevelPole) / 2;
245 ZPoleProfile[3] = ZSizePole / 2;
246 ZPoleProfile[4] = ZSizePole / 2;
247 ZPoleProfile[5] = (ZSizePole - 2 * CatetOfBevelPole) / 2;
248 ZPoleProfile[6] = -((ZSizePole - 2 * CatetOfBevelPole) / 2);
249 ZPoleProfile[7] = -ZSizePole / 2;
250
251 PoleS->DefinePolygon(NPoleProfilePoints, XPoleProfile, ZPoleProfile);
252 PoleS->DefineSection(0, -YSizePole / 2, 0, 0, 1.0);
253 PoleS->DefineSection(1, YSizePole / 2, 0, 0, 1.0);
254
255 TGeoRotation* rot_Pole = new TGeoRotation("", 90.0, 0.0, 180.0, 0.0, 90.0, 90.0);
256
257 //------------Volumes-----------------------------------------------------------
258 TGeoVolume* MagnetContainerV = new TGeoVolumeAssembly("Magnet");
259 MagnetContainerV->SetMedium(pMedAir);
260
261 TGeoVolume* YokeV = new TGeoVolume("Yoke", YokeS);
262 YokeV->SetMedium(pMedSteel);
263 YokeV->SetLineColor(kBlue);
264 // YokeV->SetVisLeaves(kTRUE);
265 // YokeV->SetTransparency(60);
266
267 TGeoVolume* CoilV = new TGeoVolume("Coil", CoilS);
268 CoilV->SetMedium(pMedCopper);
269 CoilV->SetLineColor(kYellow);
270 // CoilV->SetVisLeaves(kTRUE);
271 // CoilV->SetTransparency(0);
272
273 TGeoVolume* PoleV = new TGeoVolume("Pole", PoleS);
274 PoleV->SetMedium(pMedIron);
275 PoleV->SetLineColor(kBlue);
276 // PoleV->SetVisLeaves(kTRUE);
277 // PoleV->SetTransparency(0);
278
279 //--------------Adding volumes to the TOP Volume--------------------------------
280 MagnetContainerV->AddNode(CoilV, 1, new TGeoTranslation(0, -(YDistanceBetweenCoils / 2 + YSizeCoil / 2), 0));
281 MagnetContainerV->AddNode(CoilV, 2, new TGeoTranslation(0, YDistanceBetweenCoils / 2 + YSizeCoil / 2, 0));
282
283 MagnetContainerV->AddNode(PoleV, 1,
284 new TGeoCombiTrans(0, -(YDistanceBetweenPoles / 2 + YSizePole / 2), 0, rot_Pole));
285 MagnetContainerV->AddNode(PoleV, 2, new TGeoCombiTrans(0, YDistanceBetweenPoles / 2 + YSizePole / 2, 0, rot_Pole));
286
287 MagnetContainerV->AddNode(YokeV, 0);
288
289 top->AddNode(MagnetContainerV, 0, new TGeoTranslation(XMagnetPos, YMagnetPos, ZMagnetPos));
290
292
293 //---------------- Finish------------------------------------------------------
294 gGeoMan->CloseGeometry();
295 gGeoMan->CheckOverlaps(0.001);
296 gGeoMan->PrintOverlaps();
297 gGeoMan->Test();
298
299 TFile* geoFile = new TFile(geoFileName, "RECREATE");
300 top->Write();
301 geoFile->Close();
302 top->Draw("ogl");
303}
int Int_t
double Double_t
constexpr Bool_t kTRUE
kBlue
kYellow
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 RegisterYourself() override
virtual void RegisterYourself()
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
virtual void SetMedium(TGeoMedium *medium)
void SetLineColor(Color_t lcolor) override
Bool_t DefinePolygon(Int_t nvert, const Double_t *xv, const Double_t *yv)
virtual void DefineSection(Int_t snum, Double_t z, Double_t x0=0., Double_t y0=0., Double_t scale=1.)
virtual void SetName(const char *name)
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
TGeoManager * gGeoMan
double OppCatetOfBevelYoke
const double YSizePole
const double YMagnetPos
double AngleOfBevelYoke
double CatetOfBevelPole
const double YSizeYoke
const double ZMagnetPos
const double ZSizeInnerSpaceInYoke
const double YDistanceBetweenCoils
const double RMaxCoil
const double YSizeCoil
const double XMagnetPos
const double RMinCoil
const double WidthCoil
const double LengthCoilShortSide
const double XSizeYoke
void create_rootgeom_MAGNET()
double AdjCatetOfBevelYoke
const double ZSizeYoke
const double XSizeCoil
const double XSizeInnerSpaceInYoke
const double YSizeInnerSpaceInYoke
const double XSizePole
const double LengthCoilLongSide
const double YDistanceBetweenPoles
const double ZSizePole
const double ZSizeCoil
constexpr Double_t Pi()
Double_t Tan(Double_t)