BOSS 7.0.2
BESIII Offline Software System
Loading...
Searching...
No Matches
BesGeometry.cxx
Go to the documentation of this file.
1
2#include <iostream>
3#include <TGeoManager.h>
4#include <TGeoMaterial.h>
5#include <TGeoMedium.h>
6#include <TGeoVolume.h>
7#include <TGeoTube.h>
8#include <TGeoArb8.h>
9#include <TGeoMatrix.h>
10#include <TCanvas.h>
11
12#include "BesVisLib/BesGeometry.h"
13#include "BesVisLib/BesCircle2D.h"
14#include "BesVisLib/BesPolygon2D.h"
15#include "BesVisLib/Mdc2DWire.h"
16
18
19using namespace std;
20
21#ifndef __CINT__
23#endif
24
25//_____________________________________________________________________________
26
27BesGeometry::BesGeometry() : TObject(),
28 m_Bes(0),
29 m_BeamPipe(0),
30 m_Mdc(0),
31 m_Tof(0),
32 m_Emc(0),
33 m_Muc(0),
34 m_MdcROOTGeo(0),
35 m_TofROOTGeo(0),
36 m_EmcROOTGeo(0),
37 m_MucROOTGeo(0)
38{
39 // Create Bes geometry
40 if (!gGeoManager) new TGeoManager("BesGeo", "BesGeometry");
41 else gGeoManager-> ClearPhysicalNodes();
42
43 m_BesR = 2840.0;
44 m_BesZ = 5680.0;
45
46 m_BeamPipeRMin = 31.5;
47 m_BeamPipeRMax = 35.8;
48 m_BeamPipeZ = 150.0;
49}
50
51
53{
54 delete m_Bes;
55 delete m_BeamPipe;
56
57 delete m_MdcROOTGeo;
58 delete m_TofROOTGeo;
59 delete m_EmcROOTGeo;
60 delete m_MucROOTGeo;
61}
62
63void BesGeometry::InitFromGDML(const TString fPath)
64{
65 gGeoManager->SetVisOption(0); // to show all visible volumes.
66 gGeoManager->SetVisLevel(5);
67
68 TGeoIdentity *identity = new TGeoIdentity();
69
70 TGeoMaterial *mat = new TGeoMaterial("VOID",0,0,0);
71 mat->SetTransparency(20);
72 TGeoMedium *med = new TGeoMedium("MED",1,mat);
73 m_Bes = gGeoManager->MakeBox("volBes", med, m_BesR, m_BesR, 0.5*m_BesZ);
74
75 TGeoVolume *topVolume = new TGeoVolume(); // temp top volume for load geometry more than once
76 gGeoManager->SetTopVolume(topVolume);
77 gGeoManager->SetTopVolume(m_Bes);
78
79 Int_t iChildNo = 0;
80 m_MdcROOTGeo = new MdcROOTGeo();
81 m_MdcROOTGeo->InitFromGDML( (fPath + TString("Mdc.gdml")).Data(), "Mdc" );
82 cout<<"in BesGeometry construct mdc1"<<endl;
83 m_Mdc = m_MdcROOTGeo->GetVolumeMdc();
84 if (m_Mdc) cout << "Construct Mdc" << endl;
85 else cout << "Volume Mdc not found " << endl;
86 m_Bes->AddNode(m_Mdc, iChildNo, identity);
87 m_MdcROOTGeo->SetChildNo(iChildNo);//Connect bes with mdc, form physcialnode path. m_Bes->GetNdaughters()-1
88
89 iChildNo++;
90 m_TofROOTGeo = new TofROOTGeo();
91 m_TofROOTGeo->InitFromGDML( (fPath + TString("Tof.gdml")).Data(), "Tof" );
92 cout<<"construct tof"<<endl;
93 m_Tof = m_TofROOTGeo->GetVolumeTof();
94 if (m_Tof) cout << "Construct Tof" << endl;
95 else cout << "Volume Tof not found " << endl;
96 m_Bes->AddNode(m_Tof, iChildNo, identity);
97 m_TofROOTGeo->SetChildNo(iChildNo);
98
99 iChildNo++;
100 m_EmcROOTGeo = new EmcROOTGeo();
101 m_EmcROOTGeo->InitFromGDML( (fPath + TString("Emc.gdml")).Data(), "Emc" );
102 m_Emc = m_EmcROOTGeo->GetVolumeEmc();
103 if (m_Emc) cout << "Construct Emc" << endl;
104 else cout << "Volume Emc not found " << endl;
105 m_Bes->AddNode(m_Emc, iChildNo, identity);
106 m_EmcROOTGeo->SetChildNo(iChildNo);
107
108 iChildNo++;
109 m_MucROOTGeo = new MucROOTGeo();
110 m_MucROOTGeo->InitFromGDML( (fPath + TString("Muc.gdml")).Data(), "Muc" );
111 m_Muc = m_MucROOTGeo->GetVolumeMuc();
112 if (m_Muc) cout << "Construct Muc" << endl;
113 else cout << "Volume Muc not found " << endl;
114 m_Bes->AddNode(m_Muc, iChildNo, identity);
115 m_MucROOTGeo->SetChildNo(iChildNo);
116
117 iChildNo++;
118 Int_t beamPipeColor = 3;
119 m_BeamPipe = gGeoManager->MakeTube("volBeamPipe", med, m_BeamPipeRMin, m_BeamPipeRMax, m_BeamPipeZ);
120 m_BeamPipe->SetLineColor(beamPipeColor);
121 m_Bes->AddNode(m_BeamPipe, iChildNo, identity);
122
123 Int_t nDaughters = m_Bes->GetNodes()->GetEntries();
124 cout << "volBes contains " << nDaughters << " nodes : " << endl;
125 for (Int_t i = 0; i < nDaughters; i++) {
126 cout << i << " : " << m_Bes->GetNode(i)->GetName() << endl;
127 }
128
129 InitGeometry();
130}
131
132void BesGeometry::InitFromROOT(TGeoVolume *volBes)
133{
134 gGeoManager->SetVisOption(0); // to show all visible volumes.
135 gGeoManager->SetVisLevel(5);
136
137 m_Bes = volBes;
138 m_BesR = ((TGeoBBox*)m_Bes->GetShape())->GetDX();
139 m_BesZ = ((TGeoBBox*)m_Bes->GetShape())->GetDZ()*2.0;
140
141 TGeoVolume *topVolume = new TGeoVolume();
142 gGeoManager->SetTopVolume(topVolume);
143 gGeoManager->SetTopVolume(m_Bes);
144
145 Int_t nDaughters = m_Bes->GetNodes()->GetEntries();
146
147 //cout << "volBes contains " << nDaughters << " nodes : " << endl;
148 //for (Int_t i = 0; i < nDaughters; i++) {
149 // cout << i << " : " << m_Bes->GetNode(i)->GetName() << endl;
150 //}
151
152 Int_t iChildNo = 0;
153 m_MdcROOTGeo = new MdcROOTGeo();
154 TGeoNode *nodeMdc = m_Bes->GetNode(iChildNo);
155 if (nodeMdc) m_Mdc = nodeMdc->GetVolume();
156 //else cout << "Node logicalMdc not found" << endl;
157 //if (m_Mdc) cout << "Set Mdc" << endl;
158 //else cout << "Volume Mdc not found " << endl;
159 m_MdcROOTGeo->InitFromROOT( m_Mdc );
160 m_MdcROOTGeo->SetChildNo(iChildNo);//Connect bes with mdc, form physcialnode path. m_Bes->GetNdaughters()-1
161
162 iChildNo++;
163 m_TofROOTGeo = new TofROOTGeo();
164 TGeoNode *nodeTof = m_Bes->GetNode(iChildNo);
165 if (nodeTof) m_Tof = nodeTof->GetVolume();
166 //else cout << "Node logicalTof not found" << endl;
167 //if (m_Tof) cout << "Set Tof" << endl;
168 //else cout << "Volume Tof not found " << endl;
169 m_TofROOTGeo->InitFromROOT( m_Tof );
170 m_TofROOTGeo->SetChildNo(iChildNo);
171
172 iChildNo++;
173 m_EmcROOTGeo = new EmcROOTGeo();
174 TGeoNode *nodeEmc = m_Bes->GetNode(iChildNo);
175 if (nodeEmc) m_Emc = nodeEmc->GetVolume();
176 //else cout << "Node logicalEmc not found" << endl;
177 //if (m_Emc) cout << "Set Emc" << endl;
178 //else cout << "Volume Emc not found " << endl;
179 m_EmcROOTGeo->InitFromROOT( m_Emc );
180 m_EmcROOTGeo->SetChildNo(iChildNo);
181
182 iChildNo++;
183 m_MucROOTGeo = new MucROOTGeo();
184 TGeoNode *nodeMuc = m_Bes->GetNode(iChildNo);
185 if (nodeMuc) m_Muc = nodeMuc->GetVolume();
186 //else cout << "Node logicalMuc not found" << endl;
187 //if (m_Muc) cout << "Set Muc" << endl;
188 //else cout << "Volume Muc not found " << endl;
189 m_MucROOTGeo->InitFromROOT( m_Muc );
190 m_MucROOTGeo->SetChildNo(iChildNo);
191
192 iChildNo++;
193 TGeoNode *nodeBeamPipe = m_Bes->GetNode(iChildNo);
194 if (nodeBeamPipe) {
195 m_BeamPipe = nodeBeamPipe->GetVolume();
196 m_BeamPipe->SetLineColor(4);
197 }
198 //else cout << "Node volBeamPipe not found " << endl;
199 //cout << "Set beanmpi complete" << endl;
200 InitGeometry();
201 //cout << "init root ok" << endl;
202}
203
205{
206 gGeoManager->SetDrawExtraPaths(); // draw physical node or not;
207 gGeoManager->CloseGeometry();
208 gGeoManager->SetNsegments(20); // devide a circle to 20 slides
209
210 // PhysicalNode necessary for fast setting node visible or not in an event
211 // Should be set after gGeoManager closed
212 m_MdcROOTGeo->SetPhysicalNode(); //here liang
213 m_TofROOTGeo->SetPhysicalNode(); //here liang
214 m_EmcROOTGeo->SetPhysicalNode(); //here liang
215 m_MucROOTGeo->SetPhysicalNode();
216
217 // 2D Geometry initialization should be after SetPhysicalNode();
218 m_MdcROOTGeo->Init2DGeometry(); //here liang
219 m_TofROOTGeo->Init2DGeometry(); //here liang
220 m_EmcROOTGeo->Init2DGeometry(); //here liang
221 m_MucROOTGeo->Init2DGeometry();
222
223 Double_t P[3*4] = {0.0};
224
225 // BeamPipe
226 Double_t beamPipeCenter[3] = {0.0, 0.0, 0.0};
227 m_BeamPipeXY =
228 new BesCircle2D("BeamPipe", "BeamPipe", m_BeamPipeRMin, m_BeamPipeRMax, &beamPipeCenter[0]);
229
230 for (Int_t i = 0; i < 4; i++) {
231 P[3*i] = 0.0;
232 if (i == 0 || i == 3) P[3*i+1] = -1.0*m_BeamPipeRMax;
233 else P[3*i+1] = m_BeamPipeRMax;
234 if (i == 0 || i == 1) P[3*i+2] = -1.0*m_BeamPipeZ;
235 else P[3*i+2] = m_BeamPipeZ;
236 }
237 m_BeamPipeZR = new BesPolygon2D("BeamPipe", "BeamPipe", 4, &P[0]);
238
239 // Auxiliary line
240 if (!m_Bes) cout << "BesGeometry:InitGeometry, top volume m_Bes not found" << endl;
241 TGeoBBox *besShape = (TGeoBBox*)m_Bes->GetShape();
242 m_BesR = besShape->GetDX();
243 m_BesZ = besShape->GetDZ()*2.0;
244 for (Int_t i = 0; i < 4; i++) {
245 P[3*i] = 0.0;
246 if (i == 0 || i == 3) P[3*i+1] = -1.0*m_BesR;
247 else P[3*i+1] = m_BesR;
248 if (i == 0 || i == 1) P[3*i+2] = -1.0*m_BesZ;
249 else P[3*i+2] = m_BesZ;
250 }
251
252 m_ZRPlaneOnXY = new BesPolygon2D("ZRPlaneOnXY", "ZRPlaneOnXY", 4, &P[0]);
253 m_ZRPlaneOnXY->SetRotatable(true);
254 m_ZRPlaneOnXY->SetLineWidth(1);
255 m_ZRPlaneOnXY->SetLineStyle(3);
256 m_ZRPlaneOnXY->SetFillStyle(4000);
257}
258
259const char* BesGeometry::GetFilename(const char* RunPeriod)
260{
261 return RunPeriod;
262}
263
265{
266 m_Bes->SetLineColor(2);
267 m_Bes->SetVisibility(0);
268
269 m_BeamPipe->SetLineColor(4);
270 m_BeamPipe->SetVisibility(0);
271
272 m_MdcROOTGeo->SetAllVisible();
273 m_TofROOTGeo->SetAllVisible();
274 m_EmcROOTGeo->SetAllVisible();
275 m_MucROOTGeo->SetAllVisible();
276
277}
278
279void BesGeometry::Draw(Option_t *option)
280{
281 //
282 // BesGeometry draw function
283 TString opt = option;
284 opt.ToUpper();
285
286 if ( opt.Contains("3D") ) {
287 Draw3D();
288 }
289 else if ( opt.Contains("XY") ) {
290 Draw2DXY();
291 }
292 else if ( opt.Contains("ZR") ) {
293 Draw2DZR();
294 }
295}
296
298{
299 BesView *view = (BesView*)gPad->GetView();
300
301 if (view && view->GetViewType() == k3DView) {
302
303 if (m_MdcROOTGeo) {
304 m_MdcROOTGeo->SetVisMdcDetector();
305 m_MdcROOTGeo->SetVisMdcHits();
306 }
307
308 if (m_TofROOTGeo) {
309 m_TofROOTGeo->SetVisTofDetector();
310 m_TofROOTGeo->SetVisTofHits();
311 }
312
313 if (m_EmcROOTGeo) {
314 m_EmcROOTGeo->SetVisEmcDetector();
315 m_EmcROOTGeo->SetVisEmcHits();
316 }
317
318 if (m_MucROOTGeo) {
319 m_MucROOTGeo->SetVisMucDetector();
320 m_MucROOTGeo->SetVisMucHits();
321 }
322 }
323
324 //if (gGeoManager) {
325 // cout << "gGeoManager exit" << endl;
326 //}
327 //else {
328 // cout << "gGeoManager do not exit" << endl;
329 //}
330
331 //if (m_Bes){
332 // cout << "m_Bes address:" << m_Bes << endl;
333 //}
334
335
336 //if (m_Bes) m_Bes->Draw();
337 //if (view && view->GetVisAxis()) view->ShowAxis();
338}
339
341{
342 BesView *view = (BesView*)gPad->GetView();
343
344 if (view && view->GetVisBeamPipe()) m_BeamPipeXY->Draw();
345
346 if (m_MdcROOTGeo) m_MdcROOTGeo->Draw("XY");
347 if (m_TofROOTGeo) m_TofROOTGeo->Draw("XY");
348 if (m_EmcROOTGeo) m_EmcROOTGeo->Draw("XY");
349 if (m_MucROOTGeo) m_MucROOTGeo->Draw("XY");
350
351 if (view && view->GetVisZRPlaneOnXY()) m_ZRPlaneOnXY->Draw();
352 if (view && view->GetVisAxis()) view->ShowAxis();
353}
354
356{
357 BesView *view = (BesView*)gPad->GetView();
358
359 if (view && view->GetVisBeamPipe()) m_BeamPipeZR->Draw();
360
361 if (m_MdcROOTGeo) m_MdcROOTGeo->Draw("ZR");
362 if (m_TofROOTGeo) m_TofROOTGeo->Draw("ZR");
363 if (m_EmcROOTGeo) m_EmcROOTGeo->Draw("ZR");
364 if (m_MucROOTGeo) m_MucROOTGeo->Draw("ZR");
365
366 if (view && view->GetVisAxis()) view->ShowAxis();
367}
BesGeometry * gBesGeometry
Definition: BesGeometry.cxx:17
ClassImp(BesGeometry) BesGeometry
Definition: BesGeometry.cxx:22
double P(RecMdcKalTrack *trk)
virtual void Draw(Option_t *option="")
virtual void InitGeometry()
virtual void SetDefaultVis()
virtual ~BesGeometry()
Definition: BesGeometry.cxx:52
virtual void Draw2DXY()
const char * GetFilename(const char *RunPeriod)
virtual void InitFromGDML(const TString fPath)
Definition: BesGeometry.cxx:63
virtual void Draw(Option_t *option="3D")
virtual void Draw2DZR()
virtual void InitFromROOT(TGeoVolume *volBes)
virtual void Draw3D()
virtual void Draw(Option_t *option="")
void SetVisEmcDetector()
Set Emc detector visibility;.
void InitFromROOT(TGeoVolume *vol)
Initialize ROOTGeo from TGeoVolume logicalEmc.
void InitFromGDML(const char *gdmlFile, const char *setupName)
Initialize ROOTGeo from GDML.
void SetPhysicalNode()
Set the pointers to the physical nodes;.
void InitFromROOT(TGeoVolume *vol)
Initialize ROOTGeo from TGeoVolume logicalMdc.
void SetVisMdcDetector()
Set Mdc default detector visibility;.
void SetPhysicalNode()
Set the pointers to the physical nodes;.
void InitFromGDML(const char *gdmlFile, const char *setupName)
Initialize ROOTGeo from GDML.
void SetPhysicalNode()
Set the pointers to the physical nodes;.
void SetVisMucDetector()
Set Muc detector visibility;.
void InitFromGDML(const char *gdmlFile, const char *setupName)
Initialize ROOTGeo from GDML.
void InitFromROOT(TGeoVolume *vol)
Initialize ROOTGeo from TGeoVolume logicalMuc.
void InitFromROOT(TGeoVolume *vol)
Initialize ROOTGeo from TGeoVolume logicalTof.
void InitFromGDML(const char *gdmlFile, const char *setupName)
Initialize ROOTGeo from GDML.
void SetVisTofDetector()
Set Tof detector visibility;.
void SetPhysicalNode()
Set the pointers to the physical nodes;.