CGEM BOSS 6.6.5.i
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
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_Cgem(0), //Long Peixun's update: for CGEM
31 m_Mdc(0),
32 m_Tof(0),
33 m_Emc(0),
34 m_Muc(0),
35 m_MdcROOTGeo(0),
36 m_TofROOTGeo(0),
37 m_EmcROOTGeo(0),
38 m_MucROOTGeo(0),
39 m_CgemROOTGeo(0) //Long Peixun's update: for CGEM
40{
41 // Create Bes geometry
42 if (!gGeoManager) new TGeoManager("BesGeo", "BesGeometry");
43 else gGeoManager-> ClearPhysicalNodes();
44
45 m_BesR = 2840.0;
46 m_BesZ = 5680.0;
47
48 m_BeamPipeRMin = 31.5;
49 m_BeamPipeRMax = 35.8;
50 m_BeamPipeZ = 150.0;
51 m_BeamPipeColor = 922; //Long Peixun's update: Set Beampipe's color
52}
53
54
56{
57 delete m_Bes;
58 delete m_BeamPipe;
59
60 delete m_CgemROOTGeo; //Long Peixun's update: for CGEM
61 delete m_MdcROOTGeo;
62 delete m_TofROOTGeo;
63 delete m_EmcROOTGeo;
64 delete m_MucROOTGeo;
65}
66
67void BesGeometry::InitFromGDML(const TString fPath, bool mrpc, bool cgem)
68{
69 gGeoManager->SetVisOption(0); // to show all visible volumes.
70 gGeoManager->SetVisLevel(5);
71
72 TGeoIdentity *identity = new TGeoIdentity();
73
74 TGeoMaterial *mat = new TGeoMaterial("VOID",0,0,0);
75 mat->SetTransparency(20);
76 TGeoMedium *med = new TGeoMedium("MED",1,mat);
77 m_Bes = gGeoManager->MakeBox("volBes", med, m_BesR, m_BesR, 0.5*m_BesZ);
78
79 TGeoVolume *topVolume = new TGeoVolume(); // temp top volume for load geometry more than once
80 gGeoManager->SetTopVolume(topVolume);
81 gGeoManager->SetTopVolume(m_Bes);
82
83 //Long Peixun's update: add loading CGEM gdml file code
84 if (cgem)
85 {
86 m_CgemROOTGeo = new CgemROOTGeo();
87 m_CgemROOTGeo->InitFromGDML((fPath + TString("Cgem.gdml")).Data(), "Default");
88 m_Cgem = m_CgemROOTGeo->GetVolumeCgem();
89 }
90
91 Int_t iChildNo = 0;
92 m_MdcROOTGeo = new MdcROOTGeo(Bool_t(m_Cgem)); //Long Peixun's update: Consider CGEM when loading Mdc
93 m_MdcROOTGeo->InitFromGDML( (fPath + TString("Mdc.gdml")).Data(), "Default" ); //Long Peixun's update: "Mdc"->"Default"
94 cout<<"in BesGeometry construct mdc1"<<endl;
95 m_Mdc = m_MdcROOTGeo->GetVolumeMdc();
96 if (m_Mdc) cout << "Construct Mdc" << endl;
97 else cout << "Volume Mdc not found " << endl;
98 m_Bes->AddNode(m_Mdc, iChildNo, identity);
99 m_MdcROOTGeo->SetChildNo(iChildNo);//Connect bes with mdc, form physcialnode path. m_Bes->GetNdaughters()-1
100
101 iChildNo++;
102 m_TofROOTGeo = new TofROOTGeo();
103
104 //Long Peixun's update: Judge MRPC flag and load relevant Tof GDML
105 if (mrpc)
106 m_TofROOTGeo->InitFromGDML( (fPath + TString("Tof_mrpc.gdml")).Data(), "Default" ); //Huang Shuhui's update: for Tof_mrpc
107 else
108 m_TofROOTGeo->InitFromGDML( (fPath + TString("Tof.gdml")).Data(), "Default" ); //Long Peixun's update: "Tof"->"Default"
109
110 cout<<"construct tof"<<endl;
111 m_Tof = m_TofROOTGeo->GetVolumeTof();
112 if (m_Tof) cout << "Construct Tof" << endl;
113 else cout << "Volume Tof not found " << endl;
114 m_Bes->AddNode(m_Tof, iChildNo, identity);
115 m_TofROOTGeo->SetChildNo(iChildNo);
116
117 iChildNo++;
118 m_EmcROOTGeo = new EmcROOTGeo();
119 m_EmcROOTGeo->InitFromGDML( (fPath + TString("Emc.gdml")).Data(), "Default" ); //Long Peixun's update: "Emc"->"Default"
120 m_Emc = m_EmcROOTGeo->GetVolumeEmc();
121 if (m_Emc) cout << "Construct Emc" << endl;
122 else cout << "Volume Emc not found " << endl;
123 m_Bes->AddNode(m_Emc, iChildNo, identity);
124 m_EmcROOTGeo->SetChildNo(iChildNo);
125
126 iChildNo++;
127 m_MucROOTGeo = new MucROOTGeo();
128 m_MucROOTGeo->InitFromGDML( (fPath + TString("Muc.gdml")).Data(), "Default" ); //Long Peixun's update: "Muc"->"Default"
129 m_Muc = m_MucROOTGeo->GetVolumeMuc();
130 if (m_Muc) cout << "Construct Muc" << endl;
131 else cout << "Volume Muc not found " << endl;
132 m_Bes->AddNode(m_Muc, iChildNo, identity);
133 m_MucROOTGeo->SetChildNo(iChildNo);
134
135 iChildNo++;
136 Int_t beamPipeColor = m_BeamPipeColor; //Long Peixun's update: Blue -> m_BeamPipeColor
137 m_BeamPipe = gGeoManager->MakeTube("volBeamPipe", med, m_BeamPipeRMin, m_BeamPipeRMax, m_BeamPipeZ);
138 m_BeamPipe->SetLineColor(beamPipeColor);
139 m_Bes->AddNode(m_BeamPipe, iChildNo, identity);
140
141 //Long Peixun's update: Add CGEM node into detector geometry
142 if (m_Cgem)
143 {
144 iChildNo++;
145 m_Bes->AddNode(m_Cgem, iChildNo, identity);
146 }
147 else
148 {
149 delete m_CgemROOTGeo;
150 m_CgemROOTGeo = 0;
151 }
152
153 Int_t nDaughters = m_Bes->GetNodes()->GetEntries();
154 cout << "volBes contains " << nDaughters << " nodes : " << endl;
155 for (Int_t i = 0; i < nDaughters; i++) {
156 cout << i << " : " << m_Bes->GetNode(i)->GetName() << endl;
157 }
158
159 InitGeometry();
160}
161
162void BesGeometry::InitFromROOT(TGeoVolume *volBes)
163{
164 gGeoManager->SetVisOption(0); // to show all visible volumes.
165 gGeoManager->SetVisLevel(5);
166
167 m_Bes = volBes;
168 m_BesR = ((TGeoBBox*)m_Bes->GetShape())->GetDX();
169 m_BesZ = ((TGeoBBox*)m_Bes->GetShape())->GetDZ()*2.0;
170
171 TGeoVolume *topVolume = new TGeoVolume();
172 gGeoManager->SetTopVolume(topVolume);
173 gGeoManager->SetTopVolume(m_Bes);
174
175 Int_t nDaughters = m_Bes->GetNodes()->GetEntries();
176
177 //cout << "volBes contains " << nDaughters << " nodes : " << endl;
178 //for (Int_t i = 0; i < nDaughters; i++) {
179 // cout << i << " : " << m_Bes->GetNode(i)->GetName() << endl;
180 //}
181
182 //Long Peixun's update: Add loading CGEM geometry from ROOT code.
183 TGeoNode* nodeCgem = m_Bes->GetNode(5);
184 if (nodeCgem)
185 {
186 m_CgemROOTGeo = new CgemROOTGeo();
187 m_Cgem = nodeCgem->GetVolume();
188 m_CgemROOTGeo->InitFromROOT(m_Cgem);
189 }
190
191 Int_t iChildNo = 0;
192 m_MdcROOTGeo = new MdcROOTGeo(Bool_t(nodeCgem));
193 TGeoNode *nodeMdc = m_Bes->GetNode(iChildNo);
194 if (nodeMdc) m_Mdc = nodeMdc->GetVolume();
195 //else cout << "Node logicalMdc not found" << endl;
196 //if (m_Mdc) cout << "Set Mdc" << endl;
197 //else cout << "Volume Mdc not found " << endl;
198 m_MdcROOTGeo->InitFromROOT( m_Mdc );
199 m_MdcROOTGeo->SetChildNo(iChildNo);//Connect bes with mdc, form physcialnode path. m_Bes->GetNdaughters()-1
200
201 iChildNo++;
202 m_TofROOTGeo = new TofROOTGeo();
203 TGeoNode *nodeTof = m_Bes->GetNode(iChildNo);
204 if (nodeTof) m_Tof = nodeTof->GetVolume();
205 //else cout << "Node logicalTof not found" << endl;
206 //if (m_Tof) cout << "Set Tof" << endl;
207 //else cout << "Volume Tof not found " << endl;
208 m_TofROOTGeo->InitFromROOT( m_Tof );
209 m_TofROOTGeo->SetChildNo(iChildNo);
210
211 iChildNo++;
212 m_EmcROOTGeo = new EmcROOTGeo();
213 TGeoNode *nodeEmc = m_Bes->GetNode(iChildNo);
214 if (nodeEmc) m_Emc = nodeEmc->GetVolume();
215 //else cout << "Node logicalEmc not found" << endl;
216 //if (m_Emc) cout << "Set Emc" << endl;
217 //else cout << "Volume Emc not found " << endl;
218 m_EmcROOTGeo->InitFromROOT( m_Emc );
219 m_EmcROOTGeo->SetChildNo(iChildNo);
220
221 iChildNo++;
222 m_MucROOTGeo = new MucROOTGeo();
223 TGeoNode *nodeMuc = m_Bes->GetNode(iChildNo);
224 if (nodeMuc) m_Muc = nodeMuc->GetVolume();
225 //else cout << "Node logicalMuc not found" << endl;
226 //if (m_Muc) cout << "Set Muc" << endl;
227 //else cout << "Volume Muc not found " << endl;
228 m_MucROOTGeo->InitFromROOT( m_Muc );
229 m_MucROOTGeo->SetChildNo(iChildNo);
230
231 iChildNo++;
232 TGeoNode *nodeBeamPipe = m_Bes->GetNode(iChildNo);
233 if (nodeBeamPipe) {
234 m_BeamPipe = nodeBeamPipe->GetVolume();
235 m_BeamPipe->SetLineColor(m_BeamPipeColor); //Long Peixun's update: Blue -> m_BeamPipeColor
236 }
237 //else cout << "Node volBeamPipe not found " << endl;
238 //cout << "Set beanmpi complete" << endl;
239
240 InitGeometry();
241 //cout << "init root ok" << endl;
242}
243
245{
246 gGeoManager->SetDrawExtraPaths(); // draw physical node or not;
247 gGeoManager->CloseGeometry();
248 gGeoManager->SetNsegments(20); // devide a circle to 20 slides
249
250 // PhysicalNode necessary for fast setting node visible or not in an event
251 // Should be set after gGeoManager closed
252 if (m_CgemROOTGeo) m_CgemROOTGeo->SetPhysicalNode(); //Long Peixun's update
253 m_MdcROOTGeo->SetPhysicalNode(); //here liang
254 m_TofROOTGeo->SetPhysicalNode(); //here liang
255 m_EmcROOTGeo->SetPhysicalNode(); //here liang
256 m_MucROOTGeo->SetPhysicalNode();
257
258 //Long Peixun's update: Build BeamPipe's PhysicalNode to display 3D view
259 m_phyBeamPipe = gGeoManager->MakePhysicalNode(TString("/") + m_Bes->GetName() + TString("_1/") + m_BeamPipe->GetName() + TString("_4"));
260 m_phyBeamPipe->SetVisibility(0);
261 m_phyBeamPipe->SetIsVolAtt(kFALSE);
262 m_phyBeamPipe->SetLineColor(m_BeamPipeColor); //Long Peixun's update: Blue -> m_BeamPipeColor
263
264 // 2D Geometry initialization should be after SetPhysicalNode();
265 if (m_CgemROOTGeo) m_CgemROOTGeo->InitGeometry(); //Long Peixun's update
266 //Long Peixun's update: Change initialization order of subdetectors can avoid a strange bug in Mdc2DWire::DistancetoPrimitive()
267 //Mdc, Tof, Emu, Muc -> Tof, Mdc, Emc, Muc
268 m_TofROOTGeo->Init2DGeometry(); //here liang
269 m_MdcROOTGeo->Init2DGeometry(); //here liang
270 m_EmcROOTGeo->Init2DGeometry(); //here liang
271 m_MucROOTGeo->Init2DGeometry();
272
273 Double_t P[3*4] = {0.0};
274
275 // BeamPipe
276 Double_t beamPipeCenter[3] = {0.0, 0.0, 0.0};
277 m_BeamPipeXY =
278 new BesCircle2D("BeamPipe", "BeamPipe", m_BeamPipeRMin, m_BeamPipeRMax, &beamPipeCenter[0]);
279
280 for (Int_t i = 0; i < 4; i++) {
281 P[3*i] = 0.0;
282 if (i == 0 || i == 3) P[3*i+1] = -1.0*m_BeamPipeRMax;
283 else P[3*i+1] = m_BeamPipeRMax;
284 if (i == 0 || i == 1) P[3*i+2] = -1.0*m_BeamPipeZ;
285 else P[3*i+2] = m_BeamPipeZ;
286 }
287 m_BeamPipeZR = new BesPolygon2D("BeamPipe", "BeamPipe", 4, &P[0]);
288 m_BeamPipeZR->SetRotatable(true); //Long Peixun's update: BeamPipe rectangle should not rotate when phi is changed
289
290 // Auxiliary line
291 if (!m_Bes) cout << "BesGeometry:InitGeometry, top volume m_Bes not found" << endl;
292 TGeoBBox *besShape = (TGeoBBox*)m_Bes->GetShape();
293 m_BesR = besShape->GetDX();
294 m_BesZ = besShape->GetDZ()*2.0;
295 for (Int_t i = 0; i < 4; i++) {
296 P[3*i] = 0.0;
297 if (i == 0 || i == 3) P[3*i+1] = -1.0*m_BesR;
298 else P[3*i+1] = m_BesR;
299 if (i == 0 || i == 1) P[3*i+2] = -1.0*m_BesZ;
300 else P[3*i+2] = m_BesZ;
301 }
302
303 m_ZRPlaneOnXY = new BesPolygon2D("ZRPlaneOnXY", "ZRPlaneOnXY", 4, &P[0]);
304 m_ZRPlaneOnXY->SetRotatable(true);
305 m_ZRPlaneOnXY->SetLineWidth(1);
306 m_ZRPlaneOnXY->SetLineStyle(3);
307 m_ZRPlaneOnXY->SetFillStyle(4000);
308}
309
310const char* BesGeometry::GetFilename(const char* RunPeriod)
311{
312 return RunPeriod;
313}
314
316{
317 m_Bes->SetLineColor(2);
318 m_Bes->SetVisibility(0);
319
320 m_BeamPipe->SetLineColor(m_BeamPipeColor); //Long Peixun's update: Blue -> m_BeamPipeColor
321 m_BeamPipe->SetVisibility(0);
322
323 //Long Peixun's update: Annotate useless code
324 // m_CgemROOTGeo->SetAllVisible();
325 // m_MdcROOTGeo->SetAllVisible();
326 // m_TofROOTGeo->SetAllVisible();
327 // m_EmcROOTGeo->SetAllVisible();
328 // m_MucROOTGeo->SetAllVisible();
329}
330
331//Long Peixun's update: Reset color
333{
334 m_CgemROOTGeo->SetPhysicalDefaultVis();
335 m_MdcROOTGeo->SetPhysicalDefaultVis();
336 m_TofROOTGeo->SetPhysicalDefaultVis();
337 m_EmcROOTGeo->SetPhysicalDefaultVis();
338 m_MucROOTGeo->SetPhysicalDefaultVis();
339}
340
341void BesGeometry::Draw(Option_t *option)
342{
343 //
344 // BesGeometry draw function
345 TString opt = option;
346 opt.ToUpper();
347
348 if ( opt.Contains("3D") ) {
349 Draw3D();
350 }
351 else if ( opt.Contains("XY") ) {
352 Draw2DXY();
353 }
354 else if ( opt.Contains("ZR") ) {
355 Draw2DZR();
356 }
357}
358
360{
361 BesView *view = dynamic_cast<BesView*>(gPad->GetView());
362
363 if (view && view->GetViewType() == k3DView)
364 {
365 //Long Peixun's update: Draw Detector 3D
366 m_BeamPipe->AppendPad();
367
368 //Long Peixun's update: Set BeamPipe 3D visibility
369 if (view->GetVisBeamPipe()) m_phyBeamPipe->SetVisibility(1);
370 else m_phyBeamPipe->SetVisibility(0);
371
372 //Long Peixun's update: for CGEM
373 if (m_CgemROOTGeo)
374 {
375 //m_CgemROOTGeo->SetVisCgemDetector();
376 //m_CgemROOTGeo->SetVisCgemHits();
377 }
378
379 if (m_MdcROOTGeo) {
380 m_MdcROOTGeo->SetVisMdcDetector();
381 m_MdcROOTGeo->SetPhysicalDefaultVis(); //Long Peixun's update: Reset Color
382 m_MdcROOTGeo->SetVisMdcHits();
383 }
384
385 if (m_TofROOTGeo) {
386 m_TofROOTGeo->SetVisTofDetector();
387 m_TofROOTGeo->SetPhysicalDefaultVis(); //Long Peixun's update: Reset Color
388 m_TofROOTGeo->SetVisTofHits();
389 }
390
391 if (m_EmcROOTGeo) {
392 m_EmcROOTGeo->SetVisEmcDetector();
393 m_EmcROOTGeo->SetPhysicalDefaultVis(); //Long Peixun's update: Reset Color
394 m_EmcROOTGeo->SetVisEmcHits();
395 }
396
397 if (m_MucROOTGeo) {
398 m_MucROOTGeo->SetVisMucDetector();
399 m_MucROOTGeo->SetPhysicalDefaultVis(); //Long Peixun's update: Reset Color
400 m_MucROOTGeo->SetVisMucHits();
401 }
402 }
403
404 //if (gGeoManager) {
405 // cout << "gGeoManager exit" << endl;
406 //}
407 //else {
408 // cout << "gGeoManager do not exit" << endl;
409 //}
410
411 //if (m_Bes){
412 // cout << "m_Bes address:" << m_Bes << endl;
413 //}
414
415
416 //if (m_Bes) m_Bes->Draw();
417 //if (view && view->GetVisAxis()) view->ShowAxis();
418}
419
421{
422 BesView *view = dynamic_cast<BesView*>(gPad->GetView());
423 //Long Peixun's update: Judge view before draw
424 if (view)
425 {
426 if (view->GetVisBeamPipe()) m_BeamPipeXY->Draw();
427 if (m_MdcROOTGeo) m_MdcROOTGeo->Draw("XY");
428 if (m_TofROOTGeo) m_TofROOTGeo->Draw("XY");
429 if (m_EmcROOTGeo) m_EmcROOTGeo->Draw("XY");
430 if (m_MucROOTGeo) m_MucROOTGeo->Draw("XY");
431 if (m_CgemROOTGeo) m_CgemROOTGeo->Draw("XY"); //Long Peixun's update: for CGEM
432 if (view->GetVisZRPlaneOnXY()) m_ZRPlaneOnXY->Draw();
433 if (view->GetVisAxis()) view->ShowAxis();
434 }
435}
436
438{
439 BesView *view = dynamic_cast<BesView*>(gPad->GetView());
440 //Long Peixun's update: Judge view before draw
441 if (view)
442 {
443 if (view->GetVisBeamPipe()) m_BeamPipeZR->Draw();
444 if (m_CgemROOTGeo) m_CgemROOTGeo->Draw("ZR"); //Long Peixun's update: for CGEM
445 if (m_MdcROOTGeo) m_MdcROOTGeo->Draw("ZR");
446 if (m_TofROOTGeo) m_TofROOTGeo->Draw("ZR");
447 if (m_EmcROOTGeo) m_EmcROOTGeo->Draw("ZR");
448 if (m_MucROOTGeo) m_MucROOTGeo->Draw("ZR");
449 if (view->GetVisAxis()) view->ShowAxis();
450 }
451}
452
453
454//Long Peixun's update: Add CGEM unfolded drawing function
456{
457 BesView *view = dynamic_cast<BesView*>(gPad->GetView());
458 if (view && m_CgemROOTGeo)
459 {
460 m_CgemROOTGeo->DrawUF(layer);
461 // if (view->GetVisAxis())
462 // {
463 // view->ShowAxis();
464 // }
465 }
466}
BesGeometry * gBesGeometry
ClassImp(BesGeometry) BesGeometry
@ k3DView
Definition BesStatus.h:14
double P(RecMdcKalTrack *trk)
virtual void Draw(Option_t *option="")
virtual void InitGeometry()
virtual void SetDefaultVis()
virtual ~BesGeometry()
virtual void Draw2DXY()
const char * GetFilename(const char *RunPeriod)
virtual void InitFromGDML(const TString fPath, bool mrpc=false, bool cgem=false)
virtual void SetPhysicalDefaultVis()
virtual void DrawCgemUF(int layer)
virtual void Draw(Option_t *option="3D")
virtual void Draw2DZR()
virtual void InitFromROOT(TGeoVolume *volBes)
virtual void Draw3D()
void SetRotatable(Bool_t input)
virtual void Draw(Option_t *option="")
virtual void ShowAxis()
Definition BesTView.h:178
Bool_t GetVisAxis()
Definition BesView.h:194
Bool_t GetVisBeamPipe()
Definition BesView.h:192
EBESViewType GetViewType()
Definition BesView.h:74
Bool_t GetVisZRPlaneOnXY()
Definition BesView.h:193
void SetPhysicalNode()
void InitFromROOT(TGeoVolume *vol)
void InitGeometry()
TGeoVolume * GetVolumeCgem() const
Definition CgemROOTGeo.h:70
void SetPhysicalDefaultVis()
void Draw(Option_t *option)
void DrawUF(int layer, Option_t *option="")
void InitFromGDML(const char *gdmlFile, const char *setupName)
void SetVisEmcDetector()
Set Emc detector visibility;.
void SetPhysicalDefaultVis()
Set default physical node attributes;.
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 SetPhysicalDefaultVis()
Set default physical node attributes;.
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;.