BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
create_rootgeom_SRCArmTriggers.C
Go to the documentation of this file.
1#include "TFile.h"
2#include "TGeoBBox.h"
3#include "TGeoManager.h"
4#include "TGeoShape.h"
5#include "TMath.h"
6#include "TString.h"
7
8using namespace TMath;
9
11
12const Double_t Zshift = -647.5;
13
14// Detector's position
15const Double_t X_pos1[] = {-7.5, 0, 0}; // cm
16const Double_t X_pos2[] = {7.5, 0, 0}; // cm +15 cm
17
18const Double_t X1_pos1[] = {23.3086, 1.2160, 35.5676 + Zshift};
19const Double_t Y1_pos[] = {79.9954, -2.8672, 150.3262 + Zshift};
20const Double_t X2_pos1[] = {-22.0804, 0.6820, 38.4383 + Zshift};
21const Double_t Y2_pos[] = {-83.5340, -1.9742, 147.0401 + Zshift};
22const Double_t R_angle[] = {90, 30, 0.0};
23const Double_t L_angle[] = {-90, 30, 0.0};
24
25// X,Y:
26// A______________B
27// | |
28// | |
29// | |
30// |______________|
31// D C
32//
33//
34//
35
36const Double_t X1_ABSize = 30.00; // cm 20.2422; //cm
37const Double_t X1_BCSize = 15.00; // 13.7804; //cm
38const Double_t X_ZSize = 1.0; // cm
39
40const Double_t X2_ABSize = 30.00; // 24.0359; //cm
41const Double_t X2_BCSize = 15.00; // 12.8968; //cm
42
43const Double_t Y_ABSize = 50.00; // 50.1; //cm
44const Double_t Y_BCSize = 50.00; // 55.3; //cm
45const Double_t Y_ZSize = 1.0; // cm
46
48{
49
50 // Load the necessary FairRott libraries
51 // gROOT->LoadMacro("$MCWORKDIR/macro/run/bmnloadlibs.C");
52 // bmnloadlibs(); // load libraries
53
54 // ------- Load media from media file----------------------------------
55 FairGeoLoader* geoLoad = new FairGeoLoader("TGeo", "FairGeoLoader");
56 FairGeoInterface* geoFace = geoLoad->getGeoInterface();
57 TString geoPath = TString(gSystem->Getenv("VMCWORKDIR")) + "/geometry/";
58 TString medFile = geoPath + "media.geo";
59 geoFace->setMediaFile(medFile);
60 geoFace->readMedia();
62
63 // ------ Geometry file name (output)----------------------------------
64 const TString geoDetectorName = "SRCArmTriggers";
65 const TString geoDetectorVersion = "Spring2018";
66 TString geoFileName = geoPath + geoDetectorName + "_" + geoDetectorVersion + ".root";
67 //-----------------------------------------------------------------------
68
69 // ---------- Get and Create the required media
70 FairGeoMedia* geoMedia = geoFace->getMedia();
71 FairGeoBuilder* geoBuild = geoLoad->getGeoBuilder();
72
73 FairGeoMedium* mAir = geoMedia->getMedium("air");
74 if (!mAir)
75 Fatal("Main", "FairMedium air not found");
76 geoBuild->createMedium(mAir);
77 TGeoMedium* pMedAir = gGeoMan->GetMedium("air");
78 if (!pMedAir)
79 Fatal("Main", "Medium air not found");
80
81 FairGeoMedium* mBC408 = geoMedia->getMedium("BC408");
82 if (!mBC408)
83 Fatal("Main", "FairMedium BC400 not found");
84 geoBuild->createMedium(mBC408);
85 TGeoMedium* pMedBC408 = gGeoMan->GetMedium("BC408");
86 if (!pMedBC408)
87 Fatal("Main", " Medium BC408 not found");
88
89 // ---------- Create geometry and top volume --------------------------
90 gGeoMan = (TGeoManager*)gROOT->FindObject("FAIRGeom");
91 gGeoMan->SetName(geoDetectorName + "_geom");
92 TGeoVolume* top = new TGeoVolumeAssembly("TOP");
93 top->SetMedium(pMedAir);
94 gGeoMan->SetTopVolume(top);
95 //
96
97 // Define TOP Geometry
98 TGeoVolume* ARM = new TGeoVolumeAssembly(geoDetectorName);
99 ARM->SetMedium(pMedAir);
100 ARM->SetTransparency(50);
101
102 // Translotations and rotations
103 TGeoTranslation* DetPos_transX_1 = new TGeoTranslation("DetPos_transX1_1", X_pos1[0], X_pos1[1], X_pos1[2]);
104 TGeoTranslation* DetPos_transX_2 = new TGeoTranslation("DetPos_transX1_2", X_pos2[0], X_pos2[1], X_pos2[2]);
105
106 TGeoTranslation* DetPos_transX1_1 = new TGeoTranslation("DetPos_transX1_1", X1_pos1[0], X1_pos1[1], X1_pos1[2]);
107 TGeoTranslation* DetPos_transX2_1 = new TGeoTranslation("DetPos_transX2_1", X2_pos1[0], X2_pos1[1], X2_pos1[2]);
108 TGeoTranslation* DetPos_transY1 = new TGeoTranslation("DetPos_transY1", Y1_pos[0], Y1_pos[1], Y1_pos[2]);
109 TGeoTranslation* DetPos_transY2 = new TGeoTranslation("DetPos_transY2", Y2_pos[0], Y2_pos[1], Y2_pos[2]);
110
111 TGeoRotation* DetPos_rot1 = new TGeoRotation("DetPos_rot1", R_angle[0], R_angle[1], R_angle[2]);
112 TGeoRotation* DetPos_rot2 = new TGeoRotation("DetPos_rot2", L_angle[0], L_angle[1], L_angle[2]);
113
114 // Solids (shapes)
115 // Container X1
116 TGeoBBox* SRCArmsContainerX1S = new TGeoBBox("SRCArmsContainerX1S", X1_BCSize, X1_ABSize / 2, X_ZSize / 2);
117 TGeoVolume* SRCArmsContainerX1V = new TGeoVolume("SRCArmsContainerX1V", SRCArmsContainerX1S);
118 SRCArmsContainerX1V->SetMedium(pMedAir);
119 SRCArmsContainerX1V->SetVisibility(kTRUE);
120 SRCArmsContainerX1V->SetTransparency(75);
121
122 // Container X2
123 TGeoBBox* SRCArmsContainerX2S = new TGeoBBox("SRCArmsContainerX2S", X1_BCSize, X1_ABSize / 2, X_ZSize / 2);
124 TGeoVolume* SRCArmsContainerX2V = new TGeoVolume("SRCArmsContainerX2V", SRCArmsContainerX2S);
125 SRCArmsContainerX2V->SetMedium(pMedAir);
126 SRCArmsContainerX2V->SetVisibility(kTRUE);
127 SRCArmsContainerX2V->SetTransparency(75);
128
129 // Container Y1
130 TGeoBBox* SRCArmsContainerY1S = new TGeoBBox("SRCArmsContainerY1S", Y_BCSize / 2, Y_ABSize / 2, Y_ZSize / 2);
131 TGeoVolume* SRCArmsContainerY1V = new TGeoVolume("SRCArmsContainerY1V", SRCArmsContainerY1S);
132 SRCArmsContainerY1V->SetMedium(pMedAir);
133 SRCArmsContainerY1V->SetVisibility(kTRUE);
134 SRCArmsContainerY1V->SetTransparency(75);
135
136 // Container Y2
137 TGeoBBox* SRCArmsContainerY2S = new TGeoBBox("SRCArmsContainerY2S", Y_BCSize / 2, Y_ABSize / 2, Y_ZSize / 2);
138 TGeoVolume* SRCArmsContainerY2V = new TGeoVolume("SRCArmsContainerY2V", SRCArmsContainerY2S);
139 SRCArmsContainerY2V->SetMedium(pMedAir);
140 SRCArmsContainerY2V->SetVisibility(kTRUE);
141 SRCArmsContainerY2V->SetTransparency(75);
142
143 // Active planes X1_1 & X1_2
144 TGeoBBox* SRCArmsActivePlane_X1S1 =
145 new TGeoBBox("SRCArmsActivePlane_X1S1", X1_BCSize / 2, X1_ABSize / 2, X_ZSize / 2);
146 TGeoVolume* SRCArmsActivePlane_X1V1 = new TGeoVolume("SRCArmsActivePlane_X1V1", SRCArmsActivePlane_X1S1);
147 SRCArmsActivePlane_X1V1->SetMedium(pMedBC408);
148 SRCArmsActivePlane_X1V1->SetVisibility(kTRUE);
149 SRCArmsActivePlane_X1V1->SetTransparency(40);
150
151 TGeoBBox* SRCArmsActivePlane_X1S2 =
152 new TGeoBBox("SRCArmsActivePlane_X1S2", X1_BCSize / 2, X1_ABSize / 2, X_ZSize / 2);
153 TGeoVolume* SRCArmsActivePlane_X1V2 = new TGeoVolume("SRCArmsActivePlane_X1V2", SRCArmsActivePlane_X1S2);
154 SRCArmsActivePlane_X1V2->SetMedium(pMedBC408);
155 SRCArmsActivePlane_X1V2->SetVisibility(kTRUE);
156 SRCArmsActivePlane_X1V2->SetTransparency(40);
157
158 // Active planes X2_1 & X2_2
159 TGeoBBox* SRCArmsActivePlane_X2S1 =
160 new TGeoBBox("SRCArmsActivePlane_X2S1", X1_BCSize / 2, X1_ABSize / 2, X_ZSize / 2);
161 TGeoVolume* SRCArmsActivePlane_X2V1 = new TGeoVolume("SRCArmsActivePlane_X2V1", SRCArmsActivePlane_X2S1);
162 SRCArmsActivePlane_X2V1->SetMedium(pMedBC408);
163 SRCArmsActivePlane_X2V1->SetVisibility(kTRUE);
164 SRCArmsActivePlane_X2V1->SetTransparency(40);
165
166 TGeoBBox* SRCArmsActivePlane_X2S2 =
167 new TGeoBBox("SRCArmsActivePlane_X2S2", X1_BCSize / 2, X1_ABSize / 2, X_ZSize / 2);
168 TGeoVolume* SRCArmsActivePlane_X2V2 = new TGeoVolume("SRCArmsActivePlane_X2V2", SRCArmsActivePlane_X2S2);
169 SRCArmsActivePlane_X2V2->SetMedium(pMedBC408);
170 SRCArmsActivePlane_X2V2->SetVisibility(kTRUE);
171 SRCArmsActivePlane_X2V2->SetTransparency(40);
172
173 // Active plane Y1
174 TGeoBBox* SRCArmsActivePlane_Y1S = new TGeoBBox("SRCArmsActivePlane_Y1S", Y_BCSize / 2, Y_ABSize / 2, Y_ZSize / 2);
175 TGeoVolume* SRCArmsActivePlane_Y1V = new TGeoVolume("SRCArmsActivePlane_Y1V", SRCArmsActivePlane_Y1S);
176 SRCArmsActivePlane_Y1V->SetMedium(pMedBC408);
177 SRCArmsActivePlane_Y1V->SetVisibility(kTRUE);
178 SRCArmsActivePlane_Y1V->SetTransparency(40);
179
180 // Active plane Y2
181 TGeoBBox* SRCArmsActivePlane_Y2S = new TGeoBBox("SRCArmsActivePlane_Y2S", Y_BCSize / 2, Y_ABSize / 2, Y_ZSize / 2);
182 TGeoVolume* SRCArmsActivePlane_Y2V = new TGeoVolume("SRCArmsActivePlane_Y2V", SRCArmsActivePlane_Y2S);
183 SRCArmsActivePlane_Y2V->SetMedium(pMedBC408);
184 SRCArmsActivePlane_Y2V->SetVisibility(kTRUE);
185 SRCArmsActivePlane_Y2V->SetTransparency(40);
186
187 // Adding volumes to the Top Volume
188 SRCArmsContainerX1V->AddNode(SRCArmsActivePlane_X1V1, 0,
189 DetPos_transX_1); //, new TGeoCombiTrans(*DetPos_transX1_1, *DetPos_rot1));
190 SRCArmsContainerX1V->AddNode(SRCArmsActivePlane_X1V2, 0,
191 DetPos_transX_2); //, new TGeoCombiTrans(*DetPos_transX1_2, *DetPos_rot1));
192 SRCArmsContainerX2V->AddNode(SRCArmsActivePlane_X2V1, 0,
193 DetPos_transX_1); //, new TGeoCombiTrans(*DetPos_transX2_1, *DetPos_rot2));
194 SRCArmsContainerX2V->AddNode(SRCArmsActivePlane_X2V2, 0,
195 DetPos_transX_2); //, new TGeoCombiTrans(*DetPos_transX2_2, *DetPos_rot2));
196
197 SRCArmsContainerY1V->AddNode(SRCArmsActivePlane_Y1V, 0); //, new TGeoCombiTrans(*DetPos_transY1, *DetPos_rot1));
198 SRCArmsContainerY2V->AddNode(SRCArmsActivePlane_Y2V, 0); //, new TGeoCombiTrans(*DetPos_transY2, *DetPos_rot2));
199
200 ARM->AddNode(SRCArmsContainerX1V, 0, new TGeoCombiTrans(*DetPos_transX1_1, *DetPos_rot1));
201 ARM->AddNode(SRCArmsContainerX2V, 0, new TGeoCombiTrans(*DetPos_transX2_1, *DetPos_rot2));
202 ARM->AddNode(SRCArmsContainerY1V, 0, new TGeoCombiTrans(*DetPos_transY1, *DetPos_rot1));
203 ARM->AddNode(SRCArmsContainerY2V, 0, new TGeoCombiTrans(*DetPos_transY2, *DetPos_rot2));
204 top->AddNode(ARM, 0);
205
207
208 //-----------------Finish----------------------------------
209 gGeoMan->CloseGeometry();
210 gGeoMan->CheckOverlaps(0.001);
211 gGeoMan->PrintOverlaps();
212 gGeoMan->Test();
213
214 TFile* geoFile = new TFile(geoFileName, "RECREATE");
215 top->Write();
216 geoFile->Close();
217 top->Draw("ogl");
218}
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 SetVisContainers(Bool_t flag=kTRUE) override
void SetVisibility(Bool_t vis=kTRUE) override
virtual TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="")
void Draw(Option_t *option="") override
void SetTransparency(Char_t transparency=0)
virtual void SetMedium(TGeoMedium *medium)
virtual Int_t Write(const char *name=nullptr, Int_t option=0, Int_t bufsize=0)
TGeoManager * gGeoMan
const Double_t Zshift
const Double_t Y_ZSize
const Double_t X_pos1[]
const Double_t X2_pos1[]
const Double_t R_angle[]
const Double_t Y1_pos[]
const Double_t X_ZSize
const Double_t X2_BCSize
const Double_t X1_ABSize
const Double_t L_angle[]
const Double_t Y_ABSize
const Double_t X2_ABSize
const Double_t X_pos2[]
const Double_t X1_pos1[]
const Double_t X1_BCSize
const Double_t Y_BCSize
const Double_t Y2_pos[]
void create_rootgeom_SRCArmTriggers()