BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_fd_root_run9.C
Go to the documentation of this file.
2#include "TGeoCone.h"
3#include "TGeoManager.h"
4#include "TGeoPara.h"
5#include "TGeoTrd2.h"
6#include "TGeoTube.h"
7
8#include <iomanip>
9#include <iostream>
10
11R__ADD_INCLUDE_PATH($VMCWORKDIR)
12//---------------------------
13//---------------------------
14
16
17const Double_t FD_Xpos = 0.0;
18const Double_t FD_Ypos = 0.0;
19const Double_t FD_Zpos = 453.8; // cm
20
21const Double_t MaxRadFD = 7.0;
22const Double_t MinRadFD = 0.;
23const Double_t Zthick_FD = 0.025;
24
26const Double_t MinRadtubeFD = 12.35;
27const Double_t Z_tube_FD = 20.;
28
30const Double_t MinRadtubeFD2 = 10.35;
31const Double_t Z_tube_FD2 = 30.;
32
33const Double_t MaxR = 7.6;
34const Double_t MinR = 7.3;
35const Double_t Zl = 11.;
36
38{
39
40 // ------- Load media from media file -----------------------------------
41 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
42 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
43 TString geoPath = gSystem->Getenv("VMCWORKDIR");
44 TString medFile = geoPath + "/geometry/media.geo";
45 geoFace->setMediaFile(medFile);
46 geoFace->readMedia();
48 // --------------------------------------------------------------------------
49
50 // ------- Geometry file name (output) ----------------------------------
51 const TString geoDetectorName = "FD";
52 const TString geoDetectorVersion = "run9";
53 TString geoFileName = geoPath + "/geometry/" + geoDetectorName + "_" + geoDetectorVersion + ".root";
54 // --------------------------------------------------------------------------
55
56 // ----------------- Get and create the required media -----------------
57 FairGeoMedia* geoMedia = geoFace->getMedia();
58 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
59
60 FairGeoMedium* mAir = geoMedia->getMedium("air");
61 if (!mAir)
62 Fatal("Main", "FairMedium air not found");
63 geoBuild->createMedium(mAir);
64 TGeoMedium* pMedAir = gGeoMan->GetMedium("air");
65 if (!pMedAir)
66 Fatal("Main", "Medium air not found");
67
68 FairGeoMedium* mBC408 = geoMedia->getMedium("BC408");
69 if (!mBC408)
70 Fatal("Main", "FairMedium BC408 not found");
71 geoBuild->createMedium(mBC408);
72 TGeoMedium* pMedBC408 = gGeoMan->GetMedium("BC408");
73 if (!pMedBC408)
74 Fatal("Main", "Medium BC408 not found");
75
76 FairGeoMedium* msteel = geoMedia->getMedium("steel");
77 if (!msteel)
78 Fatal("Main", "FairMedium steel not found");
79 geoBuild->createMedium(msteel);
80 TGeoMedium* pMedsteel = gGeoMan->GetMedium("steel");
81 if (!pMedsteel)
82 Fatal("Main", "Medium steel not found");
83
84 FairGeoMedium* maluminium = geoMedia->getMedium("aluminium");
85 if (!maluminium)
86 Fatal("Main", "FairMedium aluminium not found");
87 geoBuild->createMedium(maluminium);
88 TGeoMedium* pMedaluminium = gGeoMan->GetMedium("aluminium");
89 if (!pMedaluminium)
90 Fatal("Main", "Medium aluminium not found");
91
92 FairGeoMedium* mVac = geoMedia->getMedium("vacuum");
93 if (!mVac)
94 Fatal("Main", "FairMedium vacuum not found");
95 geoBuild->createMedium(mVac);
96 TGeoMedium* pMedVac = gGeoMan->GetMedium("vacuum");
97 if (!pMedVac)
98 Fatal("Main", "Medium vacuum not found");
99
100 // --------------------------------------------------------------------------
101
102 // -------------- Create geometry and top volume -------------------------
103 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
104 gGeoMan->SetName(geoDetectorName + "_geom");
105 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
106 top->SetMedium(pMedAir);
107 gGeoMan->SetTopVolume(top);
108
109 TGeoTranslation* FD_Position = new TGeoTranslation("FD_Position", FD_Xpos, FD_Ypos, FD_Zpos);
110
111 TGeoTranslation* crystal_cord = new TGeoTranslation("crystal_cord", 0, 0, 0);
112 crystal_cord->RegisterYourself();
113
114 TGeoTranslation* sec_tube_cord = new TGeoTranslation("sec_tube_cord", 0, 0, 0);
115 sec_tube_cord->RegisterYourself();
116
117 TGeoCombiTrans* tube_cord = new TGeoCombiTrans("tube_cord", 0, -17, 0, new TGeoRotation("rot0", 0, 90, 0));
118 tube_cord->RegisterYourself();
119
120 TGeoCombiTrans* tube_cord1 = new TGeoCombiTrans("tube_cord1", 0, -5, 0, new TGeoRotation("rot0", 0, 90, 0));
121 tube_cord1->RegisterYourself();
122
123 TGeoCombiTrans* pmt_tube_cord = new TGeoCombiTrans("pmt_tube_cord", 0, -38, 0, new TGeoRotation("rot0", 0, 90, 0));
124 pmt_tube_cord->RegisterYourself();
125
126 TGeoTranslation* ring_cord1 = new TGeoTranslation("ring_cord1", 0, 0, -5.5);
127 ring_cord1->RegisterYourself();
128
129 TGeoTranslation* ring_cord2 = new TGeoTranslation("ring_cord2", 0, 0, 5.5);
130 ring_cord2->RegisterYourself();
131
132 // Define TOP Geometry
133 TGeoVolume* FD = new TGeoVolumeAssembly("FD");
134 FD->SetMedium(pMedVac);
135
136 TGeoTube* fd_crystal = new TGeoTube("fd_crystal", MinRadFD / 2, MaxRadFD / 2, Zthick_FD / 2);
137 TGeoTube* fd_section_tube = new TGeoTube("fd_section_tube", MinRadtubeFD / 2, MaxRadtubeFD / 2, Z_tube_FD / 2);
138 TGeoTube* fd_tube = new TGeoTube("fd_tube", MinRadtubeFD2 / 2, MaxRadtubeFD2 / 2, Z_tube_FD2 / 2);
139
140 TGeoTube* P_tube = new TGeoTube("P_tube", 0., MaxRadtubeFD / 2, Z_tube_FD / 2);
141 TGeoTube* P_tube1 = new TGeoTube("P_tube1", 0., MaxRadtubeFD2 / 2, 10 / 2);
142
143 TGeoTube* pmt_tube = new TGeoTube("pmt_tube", MinR / 2, MaxR / 2, Zl / 2);
144
145 TGeoTube* ring1 = new TGeoTube("ring1", 5. / 2, 13. / 2, 1. / 2);
146 TGeoTube* ring2 = new TGeoTube("ring2", 7.6 / 2, 12. / 2, 1. / 2);
147
148 TGeoCompositeShape* FD_tube_sh = new TGeoCompositeShape("FD_tube_sh", "fd_tube:tube_cord- P_tube:sec_tube_cord");
149 TGeoCompositeShape* FD_tube_sh1 =
150 new TGeoCompositeShape("FD_tube_sh", "fd_section_tube:sec_tube_cord- P_tube1:tube_cord1");
151
152 TGeoCompositeShape* pmt_tube_comp =
153 new TGeoCompositeShape("pmt_tube_comp", "pmt_tube:sec_tube_cord + ring1:ring_cord1 + ring2:ring_cord2");
154
155 TGeoVolume* FDActiveVolumeV = new TGeoVolume("FDActiveVolumeV", fd_crystal);
156 FDActiveVolumeV->SetMedium(pMedBC408);
157 FDActiveVolumeV->SetLineColor(kCyan - 2);
158
159 TGeoVolume* FD_sec_tube_mat = new TGeoVolume("FD_sec_tube_mat", FD_tube_sh1);
160 FD_sec_tube_mat->SetMedium(pMedaluminium);
161 FD_sec_tube_mat->SetLineColor(kGray);
162
163 TGeoVolume* FD_sec_tube_mat2 = new TGeoVolume("FD_sec_tube_mat2", FD_tube_sh);
164 FD_sec_tube_mat2->SetMedium(pMedaluminium);
165 FD_sec_tube_mat2->SetLineColor(kGray);
166
167 TGeoVolume* FD_pmt_tube_mat = new TGeoVolume("FD_pmt_tube_mat", pmt_tube_comp);
168 FD_pmt_tube_mat->SetMedium(pMedsteel);
169 FD_pmt_tube_mat->SetLineColor(kGray + 3);
170
171 FD->AddNode(FDActiveVolumeV, 1, crystal_cord);
172 FD->AddNode(FD_sec_tube_mat, 2, sec_tube_cord);
173 FD->AddNode(FD_sec_tube_mat2, 3, sec_tube_cord);
174 FD->AddNode(FD_pmt_tube_mat, 4, pmt_tube_cord);
175
176 // Adding volumes to the TOP Volume
177 top->AddNode(FD, 1, FD_Position);
179
180 // --------------- Finish -----------------------------------------------
181 gGeoMan->CloseGeometry();
182 gGeoMan->CheckOverlaps(0.001);
183 gGeoMan->PrintOverlaps();
184 gGeoMan->Test();
185
186 TFile* geoFile = new TFile(geoFileName, "RECREATE");
187 top->Write();
188 geoFile->Close();
189 top->Draw("ogl");
190 // top->Draw("");
191}
double Double_t
constexpr Bool_t kTRUE
#define R__ADD_INCLUDE_PATH(PATH)
kGray
kCyan
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
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
TGeoManager * gGeoMan
const Double_t MinRadtubeFD
const Double_t MinRadFD
const Double_t MaxRadtubeFD
const Double_t Zl
const Double_t FD_Xpos
const Double_t Zthick_FD
const Double_t FD_Ypos
const Double_t FD_Zpos
const Double_t MinR
const Double_t Z_tube_FD
void create_fd_root_run9()
const Double_t MaxR
const Double_t MinRadtubeFD2
const Double_t Z_tube_FD2
const Double_t MaxRadFD
const Double_t MaxRadtubeFD2