BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_TOF400_RUN7.C
Go to the documentation of this file.
1//**************************************************************************************
2R__ADD_INCLUDE_PATH($VMCWORKDIR)
3#include "macro/run/bmnloadlibs.C"
4
5using namespace std;
6
8{
9 // Load the necessary FairRoot libraries
10 // gROOT->LoadMacro("$VMCWORKDIR/macro/run/bmnloadlibs.C");
11 bmnloadlibs(); // load libraries
12
13 // ------- Load media from media file --------------------------------
14 TGeoManager* gGeoMan;
15 cout << "!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
16 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
17 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
18 TString geoPath = gSystem->Getenv("VMCWORKDIR");
19 TString medFile = geoPath + "/geometry/media.geo";
20 geoFace->setMediaFile(medFile);
21 geoFace->readMedia();
22 gGeoMan = gGeoManager;
23
24 // ------- Geometry file name (output) -------------------------------
25 const TString geoDetectorName = "TOF400";
26 const TString geoDetectorVersion = "RUN7";
27 const TString geoFileName =
28 geoPath + "/geometry/" + geoDetectorName + "_" + geoDetectorVersion + "BMN_byKolesnicov_Aligned.root";
29
30 // ----------------- Get and create the required media --------------
31 FairGeoMedia* geoMedia = geoFace->getMedia();
32 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
33
34 // Air
35 FairGeoMedium* matAir = geoMedia->getMedium("air");
36 if (!matAir)
37 Fatal("Main", "FairMedium air not found");
38 geoBuild->createMedium(matAir);
39 TGeoMedium* medAir = gGeoMan->GetMedium("air");
40 if (!medAir)
41 Fatal("Main", "Medium air not found");
42
43 // Polypropylene
44 FairGeoMedium* matPprop = geoMedia->getMedium("polypropylene");
45 if (!matPprop)
46 Fatal("Main", "FairMedium polypropylene not found");
47 geoBuild->createMedium(matPprop);
48 TGeoMedium* medPprop = gGeoMan->GetMedium("polypropylene");
49 if (!medPprop)
50 Fatal("Main", "Medium polypropylene not found");
51
52 // lead
53 FairGeoMedium* matPb = geoMedia->getMedium("lead");
54 if (!matPb)
55 Fatal("Main", "FairMedium lead not found");
56 geoBuild->createMedium(matPb);
57 TGeoMedium* medPb = gGeoMan->GetMedium("lead");
58 if (!medPb)
59 Fatal("Main", "Medium lead not found");
60
61 // aluminium
62 FairGeoMedium* matAl = geoMedia->getMedium("aluminium");
63 if (!matAl)
64 Fatal("Main", "FairMedium aluminium not found");
65 geoBuild->createMedium(matAl);
66 TGeoMedium* medAl = gGeoMan->GetMedium("aluminium");
67 if (!medAl)
68 Fatal("Main", "Medium aluminium not found");
69
70 // RPCglass
71 FairGeoMedium* matGlass = geoMedia->getMedium("RPCglass");
72 if (!matGlass)
73 Fatal("Main", "FairMedium RPCglass not found");
74 geoBuild->createMedium(matGlass);
75 TGeoMedium* medGlass = gGeoMan->GetMedium("RPCglass");
76 if (!medGlass)
77 Fatal("Main", "Medium RPCglass not found");
78
79 // RPCgas
80 FairGeoMedium* matGas = geoMedia->getMedium("RPCgas");
81 if (!matGas)
82 Fatal("Main", "FairMedium RPCgas not found");
83 geoBuild->createMedium(matGas);
84 TGeoMedium* medGas = gGeoMan->GetMedium("RPCgas");
85 if (!medGas)
86 Fatal("Main", "Medium RPCgas not found");
87
88 // G10
89 FairGeoMedium* matG10 = geoMedia->getMedium("G10");
90 if (!matG10)
91 Fatal("Main", "FairMedium G10 not found");
92 geoBuild->createMedium(matG10);
93 TGeoMedium* medG10 = gGeoMan->GetMedium("G10");
94 if (!medG10)
95 Fatal("Main", "Medium G10 not found");
96
97 // ----------------------------------------- Create geometry and top volume
98 // -----------------------------------------------
99 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
100 gGeoMan->SetName(geoDetectorName + "_geom");
101 TGeoVolume* top = new TGeoVolumeAssembly("TOP"); // TOP VOLUME
102 top->SetMedium(medAir);
103 gGeoMan->SetTopVolume(top);
104 gGeoMan->SetTopVisible(1);
105 gGeoMan->SetVisLevel(7);
106
107 // --------------------------------------- Define TOP Geometry ------------------------------------
108 TGeoVolume* topTof = new TGeoVolumeAssembly(geoDetectorName);
109 topTof->SetMedium(medAir);
110
111 TGeoVolume* vDetector = new TGeoVolumeAssembly("tof1Detector");
112 vDetector->SetMedium(medAir);
113
114 const double DetXsize = 60.; // [cm]
115 const double DetYsize = 30.; // [cm]
116 const double DetZsize = 3.0; // [cm]
117 // --------------------- Create strip ------------------
118 const float stripGasX = 1., stripGasY = DetYsize, stripGasZ = 0.3; // [cm]
119 TGeoBBox* sStripGas = new TGeoBBox(stripGasX / 2., stripGasY / 2., stripGasZ / 2.);
120 sStripGas->SetName("StripGas");
121 TGeoVolume* vStripGas = new TGeoVolume("tof1StripActiveGasV", sStripGas, medGas);
122 vStripGas->SetLineColor(kRed);
123
124 // --------------------- Create Glass plates ------------------
125 const float detGlassX = DetXsize, detGlassY = DetYsize, detGlassZ = 0.618 / 2.; // [cm] 6.18 mm / 2 plate
126 TGeoBBox* sDetGlass = new TGeoBBox(detGlassX / 2., detGlassY / 2., detGlassZ / 2.);
127 sDetGlass->SetName("DetectorGlass");
128 TGeoVolume* vDetGlass = new TGeoVolume("tof1DetGlassV", sDetGlass, medGlass);
129 vDetGlass->SetLineColor(kYellow);
130
131 // --------------------- Create G10 plates ------------------
132 const float detPlateX = DetXsize, detPlateY = DetYsize, detPlateZ = 0.64 / 2.; // [cm] 6.4 mm / 2 plate
133 TGeoBBox* sDetPlate = new TGeoBBox(detPlateX / 2., detPlateY / 2., detPlateZ / 2.);
134 sDetPlate->SetName("DetectorPlate");
135 TGeoVolume* vDetPlate = new TGeoVolume("tof1DetPlateV", sDetPlate, medG10);
136 vDetPlate->SetLineColor(kBlue);
137
138 // --------------------------------------- Assemble detector
139
140 // Add strips
141 const int NStrips = 48; // 24 strips group
142 const double StripStep = 1.25; // [cm]
143 for (int i = 0; i < NStrips; i++) {
144 vDetector->AddNode(vStripGas, i + 1,
145 new TGeoTranslation("", -DetXsize / 2. + StripStep / 2. + i * StripStep, 0., 0.));
146 }
147
148 // Add Glass plates
149 vDetector->AddNode(vDetGlass, 1, new TGeoTranslation("", 0., 0., -stripGasZ / 2. - detGlassZ / 2.));
150 vDetector->AddNode(vDetGlass, 2, new TGeoTranslation("", 0., 0., +stripGasZ / 2. + detGlassZ / 2.));
151
152 // Add G10 plates
153 vDetector->AddNode(vDetPlate, 1, new TGeoTranslation("", 0., 0., -DetZsize / 2. + detPlateZ / 2.));
154 vDetector->AddNode(vDetPlate, 2, new TGeoTranslation("", 0., 0., +DetZsize / 2. - detPlateZ / 2.));
155
156 // -------------------------------------- Install Detectors
157 const double tofZgap = 0.86; // 8.6 mm between detectors
158 const double tofYoverlap = 3.0; // 30 mm detectors overlap at Y direction
159
160 const double tofXgap = 0.; // [cm] RUN5, part1
161 // const double tofXgap = 2. * 24.4; // [cm] RUN5, part2
162
163 double tofX = tofXgap / 2. + DetXsize / 2.;
164 double tofZshift = tofZgap + DetZsize;
165
166 // 1 box left side, 0 < X
167 const double box1_x = 154.016 - 9. + 2.2; // [cm]
168 const double box1_y = -0.51475 - 2.99 - 0.24; // [cm]
169 const double box1_z = 448.579 - 4.82; // [cm] :
170 TGeoRotation* geoRot1 = new TGeoRotation;
171 geoRot1->RotateX(-0.905381);
172 geoRot1->RotateY(-0.189805);
173 geoRot1->RotateZ(0.352046);
174
175 TGeoRotation* geoRot1_Pl0 = new TGeoRotation;
176 geoRot1_Pl0->RotateX(-0.905381);
177 geoRot1_Pl0->RotateY(-0.189805);
178 geoRot1_Pl0->RotateZ(0.352046 + 7.22 - 0.97);
179
180 TGeoCombiTrans* cR1 = new TGeoCombiTrans("", box1_x + 1.35, 2. * DetYsize - 2 * tofYoverlap + box1_y - 4.14,
181 box1_z + tofZshift - 5.02, geoRot1_Pl0);
182 topTof->AddNode(vDetector, 1, cR1);
183
184 TGeoCombiTrans* cR2 = new TGeoCombiTrans("", box1_x, 1. * DetYsize - tofYoverlap + box1_y, box1_z + 2.7, geoRot1);
185 topTof->AddNode(vDetector, 2, cR2);
186
187 TGeoCombiTrans* cR3 = new TGeoCombiTrans("", box1_x, 0 + box1_y, box1_z + tofZshift - 5.02, geoRot1);
188 topTof->AddNode(vDetector, 3, cR3);
189
190 TGeoCombiTrans* cR4 = new TGeoCombiTrans("", box1_x, -1. * DetYsize + tofYoverlap + box1_y, box1_z + 2.7, geoRot1);
191 topTof->AddNode(vDetector, 4, cR4);
192
193 TGeoCombiTrans* cR5 =
194 new TGeoCombiTrans("", box1_x, -2. * DetYsize + 2 * tofYoverlap + box1_y, box1_z + tofZshift - 5.02, geoRot1);
195 topTof->AddNode(vDetector, 5, cR5);
196
197 // 2 box left side, 0 < x < box1_x
198 const double box2_x = 89.7258 + 2.2; // [cm]
199 const double box2_y = -0.51475 - 2.99 - 0.24; // [cm]
200 const double box2_z = 434.875; // [cm] :
201 TGeoRotation* geoRot2 = new TGeoRotation;
202 geoRot2->RotateX(-0.68269);
203 geoRot2->RotateY(0.337719);
204 geoRot2->RotateZ(0.320785);
205
206 TGeoCombiTrans* cR6 =
207 new TGeoCombiTrans("", box2_x, 2. * DetYsize - 2 * tofYoverlap + box2_y, box2_z + tofZshift - 5.02, geoRot2);
208 topTof->AddNode(vDetector, 6, cR6);
209
210 TGeoCombiTrans* cR7 = new TGeoCombiTrans("", box2_x, 1. * DetYsize - tofYoverlap + box2_y, box2_z + 2.7, geoRot2);
211 topTof->AddNode(vDetector, 7, cR7);
212
213 TGeoCombiTrans* cR8 = new TGeoCombiTrans("", box2_x, 0 + box2_y, box2_z + tofZshift - 5.02, geoRot2);
214 topTof->AddNode(vDetector, 8, cR8);
215
216 TGeoCombiTrans* cR9 = new TGeoCombiTrans("", box2_x, -1. * DetYsize + tofYoverlap + box2_y, box2_z + 2.7, geoRot2);
217 topTof->AddNode(vDetector, 9, cR9);
218
219 TGeoCombiTrans* cR10 =
220 new TGeoCombiTrans("", box2_x, -2. * DetYsize + 2 * tofYoverlap + box2_y, box2_z + tofZshift - 5.02, geoRot2);
221 topTof->AddNode(vDetector, 10, cR10);
222
223 // 3 box left side, x < 0
224 const double box3_x = -72.73 - 5 - 2.6; // [cm]
225 const double box3_y = -0.6015 + 0.455; // [cm]
226 const double box3_z = 434.129 - 1.32; // [cm] :
227 TGeoRotation* geoRot3 = new TGeoRotation;
228 geoRot3->RotateX(-0.16831);
229 geoRot3->RotateY(0.0435636);
230 geoRot3->RotateZ(0.190775);
231
232 TGeoCombiTrans* cR11 =
233 new TGeoCombiTrans("", box3_x, 2. * DetYsize - 2 * tofYoverlap + box3_y, box3_z + tofZshift - 5.02, geoRot3);
234 topTof->AddNode(vDetector, 11, cR11);
235
236 TGeoCombiTrans* cR12 = new TGeoCombiTrans("", box3_x, 1. * DetYsize - tofYoverlap + box3_y, box3_z + 2.7, geoRot3);
237 topTof->AddNode(vDetector, 12, cR12);
238
239 TGeoCombiTrans* cR13 = new TGeoCombiTrans("", box3_x, 0 + box3_y, box3_z + tofZshift - 5.02, geoRot3);
240 topTof->AddNode(vDetector, 13, cR13);
241
242 TGeoCombiTrans* cR14 = new TGeoCombiTrans("", box3_x, -1. * DetYsize + tofYoverlap + box3_y, box3_z + 2.7, geoRot3);
243 topTof->AddNode(vDetector, 14, cR14);
244
245 TGeoCombiTrans* cR15 =
246 new TGeoCombiTrans("", box3_x, -2. * DetYsize + 2 * tofYoverlap + box3_y, box3_z + tofZshift - 5.02, geoRot3);
247 topTof->AddNode(vDetector, 15, cR15);
248
249 // 4 box left side, box3 < x < 0
250 const double box4_x = -138.442 + 10 - 5. - 2.6; // [cm]
251 const double box4_y = -0.6015 + 0.455; // [cm]
252 const double box4_z = 447.906 - 7.; // [cm] :
253 TGeoRotation* geoRot4 = new TGeoRotation;
254 geoRot4->RotateX(0);
255 geoRot4->RotateY(0);
256 geoRot4->RotateZ(0);
257
258 TGeoCombiTrans* cR16 =
259 new TGeoCombiTrans("", box4_x, 2. * DetYsize - 2 * tofYoverlap + box4_y, box4_z + tofZshift - 5.02, geoRot4);
260 topTof->AddNode(vDetector, 16, cR16);
261
262 TGeoCombiTrans* cR17 = new TGeoCombiTrans("", box4_x, 1. * DetYsize - tofYoverlap + box4_y, box4_z + 2.7, geoRot4);
263 topTof->AddNode(vDetector, 17, cR17);
264
265 TGeoCombiTrans* cR18 = new TGeoCombiTrans("", box4_x, 0 + box4_y, box4_z + tofZshift - 5.02, geoRot4);
266 topTof->AddNode(vDetector, 18, cR18);
267
268 TGeoCombiTrans* cR19 = new TGeoCombiTrans("", box4_x, -1. * DetYsize + tofYoverlap + box4_y, box4_z + 2.7, geoRot4);
269 topTof->AddNode(vDetector, 19, cR19);
270
271 TGeoCombiTrans* cR20 =
272 new TGeoCombiTrans("", box4_x, -2. * DetYsize + 2 * tofYoverlap + box4_y, box4_z + tofZshift - 5.02, geoRot4);
273 topTof->AddNode(vDetector, 20, cR20);
274
275 // 2 box
276 /* topTof->AddNode(vDetector, 6, new TGeoTranslation("t1", box2_x, 2. * DetYsize - 2 * tofYoverlap, tofZ_2box +
277 tofZshift)); // right side, x > 0 topTof->AddNode(vDetector, 7, new TGeoTranslation("t1", box2_x, 1. * DetYsize -
278 tofYoverlap, tofZ_2box)); topTof->AddNode(vDetector, 8, new TGeoTranslation("t1", box2_x, 0, tofZ_2box + tofZshift));
279 topTof->AddNode(vDetector, 9, new TGeoTranslation("t1", box2_x, -1. * DetYsize + tofYoverlap, tofZ_2box));
280 topTof->AddNode(vDetector, 10, new TGeoTranslation("t1", box2_x, -2 * DetYsize + 2 * tofYoverlap, tofZ_2box +
281 tofZshift));
282
283 //3 box
284 topTof->AddNode(vDetector, 11, new TGeoTranslation("t1", box3_x, 2. * DetYsize - 2 * tofYoverlap, tofZ_2box +
285 tofZshift)); // right side, x > 0 topTof->AddNode(vDetector, 12, new TGeoTranslation("t1", box3_x, 1. * DetYsize -
286 tofYoverlap, tofZ_2box)); topTof->AddNode(vDetector, 13, new TGeoTranslation("t1", box3_x, 0, tofZ_2box +
287 tofZshift)); topTof->AddNode(vDetector, 14, new TGeoTranslation("t1", box3_x, -1. * DetYsize + tofYoverlap,
288 tofZ_2box)); topTof->AddNode(vDetector, 15, new TGeoTranslation("t1", box3_x, -2 * DetYsize + 2 * tofYoverlap,
289 tofZ_2box + tofZshift));
290
291 // 4 box
292 topTof->AddNode(vDetector, 16, new TGeoTranslation("t1", box4_x, 2. * DetYsize - 2 * tofYoverlap, tofZ_1box +
293 tofZshift)); // right side, x > 0 topTof->AddNode(vDetector, 17, new TGeoTranslation("t1", box4_x, 1. * DetYsize -
294 tofYoverlap, tofZ_1box)); topTof->AddNode(vDetector, 18, new TGeoTranslation("t1", box4_x, 0, tofZ_1box +
295 tofZshift)); topTof->AddNode(vDetector, 19, new TGeoTranslation("t1", box4_x, -1. * DetYsize + tofYoverlap,
296 tofZ_1box)); topTof->AddNode(vDetector, 20, new TGeoTranslation("t1", box4_x, -2. * DetYsize + 2 * tofYoverlap,
297 tofZ_1box + tofZshift));
298
299 //topTof->AddNode(vDetector, 4, new TGeoTranslation("t1", -tofX, 0., tofZ + tofZshift)); // left side, x < 0
300 //topTof->AddNode(vDetector, 5, new TGeoTranslation("t1", -tofX, +DetYsize -tofYoverlap, tofZ - tofZshift));
301 //topTof->AddNode(vDetector, 6, new TGeoTranslation("t1", -tofX, -DetYsize +tofYoverlap, tofZ - tofZshift));
302
303 //*/
304 // ------------------ Adding the TOP Volume --------------------------
305 top->AddNode(topTof, 1, new TGeoTranslation("tw", 0., 0., 0.));
306
307 // --------------- Finish --------------------------------------------
309
310 gGeoMan->CloseGeometry();
311 gGeoMan->CheckOverlaps(0.001);
312 gGeoMan->PrintOverlaps();
313 gGeoMan->Test();
314
315 TFile* geoFile = new TFile(geoFileName, "RECREATE");
316 top->Write();
317 geoFile->Close();
318
319 top->Draw("ogl");
320 gGeoMan->Browse(new TBrowser);
321}
int i
Definition P4_F32vec4.h:22
constexpr Bool_t kTRUE
#define R__ADD_INCLUDE_PATH(PATH)
kRed
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 RotateX(Double_t angle) override
void RotateY(Double_t angle) override
void RotateZ(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="")
void Draw(Option_t *option="") override
virtual void SetMedium(TGeoMedium *medium)
void SetLineColor(Color_t lcolor) override
virtual void SetName(const char *name)
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
void create_rootgeom_TOF400_RUN7()
Definition json.hpp:4446