20#include "TGeoManager.h"
22#include "ROOTGeo/MucROOTGeo.h"
24const int MucROOTGeo::m_kSeg[m_kPart] = { 4, 8, 4 };
25const int MucROOTGeo::m_kAbsorber[m_kPart] = { 9, 9, 9 };
26const int MucROOTGeo::m_kGap[m_kPart] = { 8, 9, 8 };
27const int MucROOTGeo::m_kPanel[m_kPart] = { 4, 3, 4 };
31 for (
int part = 0; part < m_kPart; part++ )
33 for (
int seg = 0; seg < m_kSegMax; seg++ )
35 for (
int gap = 0; gap < m_kGapMax; gap++ )
37 m_NodeGap[part][seg][gap] = 0;
38 m_PhysicalGap[part][seg][gap] = 0;
41 for (
int strip = 0; strip < m_kStripMax; strip++ )
43 m_NodeStrip[part][seg][gap][strip] = 0;
44 m_PhysicalStrip[part][seg][gap][strip] = 0;
50 string GdmlManagementPath = getenv(
"GDMLMANAGEMENTDATAROOT" );
52 string GdmlFile = GdmlManagementPath + string(
"/dat/Muc.gdml" );
54 cout <<
"GdmlFile " << GdmlFile << endl;
71 if ( !m_Muc ) std::cout <<
"m_Muc = 0" << std::endl;
74 for (
int part = 0; part < m_kPart; part++ )
76 for (
int seg = 0; seg < m_kSeg[part]; seg++ )
78 for (
int gap = 0; gap < m_kGap[part]; gap++ )
84 std::stringstream osnameGap;
88 <<
"P" << part <<
"S" << seg <<
"G" << gap <<
"_" << gapCount;
89 m_NodeGap[part][seg][gap] =
GetNode( osnameGap.str() );
95 std::stringstream osnameBox;
99 <<
"P" << part <<
"S" << seg <<
"G" << gap <<
"Al"
103 TGeoNode* temp =
GetNode( osnameBox.str() );
106 if ( part == 1 && seg == 2 ) segment = 2;
107 std::stringstream osnameStripPlane;
108 osnameStripPlane <<
"pv_"
111 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"SP"
114 m_NodeStripPlane[part][seg][gap] =
GetNode( osnameStripPlane.str() );
116 for (
int strip = 0; strip < m_StripNum[part][seg][gap]; strip++ )
118 std::stringstream osnameStrip;
124 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"s"
125 <<
"00" << strip <<
"_" << strip;
127 else if ( strip < 100 )
132 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"s"
133 <<
"0" << strip <<
"_" << strip;
140 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"s" << strip <<
"_"
144 m_NodeStrip[part][seg][gap][strip] =
GetNode( osnameStrip.str() );
154 int absorberColor = 2;
156 int gasChamberColor = 8;
157 int bakeliteColor = 8;
160 m_Muc->SetLineColor( mucColor );
161 m_Muc->SetVisibility( 0 );
163 for (
int part = 0; part < m_kPart; part++ )
165 for (
int seg = 0; seg < m_kSeg[part]; seg++ )
167 for (
int absorber = 0; absorber < m_kAbsorber[part]; absorber++ )
173 for (
int panel = 0; panel < m_kPanel[part]; panel++ )
176 ->SetLineColor( absorberColor );
182 for (
int gap = 0; gap < m_kGap[part]; gap++ )
184 GetVolumeGap( part, seg, gap )->SetLineColor( gapColor );
189 for (
int strip = 0; strip < m_StripNum[part][seg][gap]; strip++ )
191 GetVolumeStrip( part, seg, gap, strip )->SetLineColor( stripColor );
195 for (
int panel = 0; panel < m_kPanel[part]; panel++ )
197 for (
int bakelite = 0; bakelite < m_kBakelite; bakelite++ )
200 ->SetLineColor( bakeliteColor );
203 for (
int gasChamber = 0; gasChamber < m_kGasChamber; gasChamber++ )
206 ->SetLineColor( gasChamberColor );
214 for (
int part = 0; part < m_kPart; part++ )
216 for (
int seg = 0; seg < m_kSeg[part]; seg++ )
218 for (
int gap = 0; gap < m_kGap[part]; gap++ )
220 GetGap( part, seg, gap )->SetVisibility( 0 );
221 for (
int strip = 0; strip < m_StripNum[part][seg][gap]; strip++ )
222 {
GetStrip( part, seg, gap, strip )->SetVisibility( 0 ); }
231 for (
int part = 0; part < m_kPart; part++ )
233 for (
int seg = 0; seg < m_kSeg[part]; seg++ )
235 for (
int absorber = 0; absorber < m_kAbsorber[part]; absorber++ )
237 if ( part == 1 ) {
GetVolumeAbsorber( part, seg, absorber )->SetVisibility( 1 ); }
241 for (
int panel = 0; panel < m_kPanel[part]; panel++ )
246 for (
int gap = 0; gap < m_kGap[part]; gap++ )
249 for (
int strip = 0; strip < m_StripNum[part][seg][gap]; strip++ )
252 for (
int panel = 0; panel < m_kPanel[part]; panel++ )
254 for (
int bakelite = 0; bakelite < m_kBakelite; bakelite++ )
256 for (
int gasChamber = 0; gasChamber < m_kGasChamber; gasChamber++ )
263 for (
int part = 0; part < m_kPart; part++ )
265 for (
int seg = 0; seg < m_kSeg[part]; seg++ )
267 for (
int gap = 0; gap < m_kGap[part]; gap++ )
269 GetGap( part, seg, gap )->SetVisibility( 1 );
270 for (
int strip = 0; strip < m_StripNum[part][seg][gap]; strip++ )
271 {
GetStrip( part, seg, gap, strip )->SetVisibility( 0 ); }
278 for (
int part = 0; part < m_kPart; part++ )
280 for (
int seg = 0; seg < m_kSeg[part]; seg++ )
282 for (
int absorber = 0; absorber < m_kAbsorber[part]; absorber++ )
291 for (
int panel = 0; panel < m_kPanel[part]; panel++ )
293 if ( seg > 0 && seg < 3 )
299 for (
int gap = 0; gap < m_kGap[part]; gap++ )
301 if ( part == 1 && seg > 2 )
304 GetGap( part, seg, gap )->SetVisibility( 1 );
309 GetGap( part, seg, gap )->SetVisibility( 0 );
311 for (
int strip = 0; strip < m_StripNum[part][seg][gap]; strip++ )
314 for (
int panel = 0; panel < m_kPanel[part]; panel++ )
316 for (
int bakelite = 0; bakelite < m_kBakelite; bakelite++ )
318 if ( ( part != 1 && seg > 0 && seg < 3 ) || ( part == 1 && seg > 2 ) )
321 for (
int gasChamber = 0; gasChamber < m_kGasChamber; gasChamber++ )
323 if ( ( part != 1 && seg > 0 && seg < 3 ) || ( part == 1 && seg > 2 ) )
335 if ( gGeoManager == 0 ) std::cout <<
"Create gGeoManager first" << std::endl;
336 TGeoNode*
bes = gGeoManager->GetTopNode();
339 for (
int part = 0; part < m_kPart; part++ )
341 for (
int seg = 0; seg < m_kSeg[part]; seg++ )
343 for (
int gap = 0; gap < m_kGap[part]; gap++ )
345 TGeoNode* nodeGap =
GetGap( part, seg, gap );
346 m_PhysicalGap[part][seg][gap] = gGeoManager->MakePhysicalNode(
347 TString(
"/" ) +
bes->GetName() + TString(
"/" ) + muc->GetName() +
348 TString(
"/" ) + nodeGap->GetName() + TString(
"/" ) +
349 nodeGap->GetDaughter( 0 )->GetName() );
350 m_PhysicalGap[part][seg][gap]->SetVisibility( 0 );
351 m_PhysicalGap[part][seg][gap]->SetIsVolAtt( kFALSE );
363 for (
int strip = 0; strip < m_StripNum[part][seg][gap]; strip++ )
365 TGeoNode* nodeStrip =
GetStrip( part, seg, gap, strip );
366 m_PhysicalStrip[part][seg][gap][strip] = gGeoManager->MakePhysicalNode(
367 TString(
"/" ) +
bes->GetName() + TString(
"/" ) + muc->GetName() +
368 TString(
"/" ) + nodeGap->GetName() + TString(
"/" ) +
369 nodeGap->GetDaughter( 0 )->GetName() + TString(
"/" ) +
370 nodeStripPlane->GetName() + TString(
"/" ) + nodeStrip->GetName() );
371 m_PhysicalStrip[part][seg][gap][strip]->SetVisibility( 0 );
372 m_PhysicalStrip[part][seg][gap][strip]->SetIsVolAtt( kFALSE );
373 m_PhysicalStrip[part][seg][gap][strip]->SetLineColor( stripColor );
386 int seg = m_kSeg[part];
391 int gap = m_kGap[part];
396 int strip = m_StripNum[part][seg][gap];
401 std::stringstream osname;
404 <<
"P" << part <<
"S" << seg <<
"Ab" << absorber;
410 float thickness = 0.0;
412 if ( vol ) { thickness = 2.0 * ( (TGeoBBox*)vol->GetShape() )->GetDZ(); }
418 std::stringstream osname;
421 <<
"P" << part <<
"S" << seg <<
"Ab" << absorber <<
"Pn" << panel;
427 std::stringstream osname;
430 <<
"P" << part <<
"S" << seg <<
"G" << gap;
436 std::stringstream osname;
439 <<
"P" << part <<
"S" << seg <<
"G" << gap <<
"Al";
446 if ( part == 1 && seg == 2 ) segment = 2;
447 std::stringstream osname;
450 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"SP";
456 std::stringstream osname;
461 <<
"P" << part <<
"S"
466 else if ( strip < 100 )
470 <<
"P" << part <<
"S"
479 <<
"P" << part <<
"S"
481 <<
"G" << gap <<
"s" << strip;
489 std::stringstream osname;
492 <<
"P" << part <<
"S"
494 <<
"G" << gap <<
"R" << gasChamber <<
"Pn" << panel <<
"C";
501 std::stringstream osname;
504 <<
"P" << part <<
"S"
506 <<
"G" << gap <<
"R" << panel <<
"B" << bakelite;
512 if ( m_NodeGap[part][seg][gap] != 0 ) {
return m_NodeGap[part][seg][gap]; }
515 std::cout <<
"Node: "
516 <<
"Part" << part <<
"Seg" << seg <<
"Gap" << gap <<
" not found" << std::endl;
534 if ( m_NodeStripPlane[part][seg][gap] != 0 ) {
return m_NodeStripPlane[part][seg][gap]; }
537 std::cout <<
"Node: "
538 <<
"Part" << part <<
"Seg" << seg <<
"Gap" << gap <<
"StripPlane"
539 <<
" not found" << std::endl;
545 if ( m_NodeStrip[part][seg][gap][strip] != 0 ) {
return m_NodeStrip[part][seg][gap][strip]; }
548 std::cout <<
"Node: "
549 <<
"Part" << part <<
"Seg"
551 <<
"Gap" << gap <<
"Strip" << strip <<
" not found" << std::endl;
557 if ( m_PhysicalGap[part][seg][gap] != 0 ) {
return m_PhysicalGap[part][seg][gap]; }
560 std::cout <<
"PhysicalNode: "
561 <<
"Part" << part <<
"Seg" << seg <<
"Gap" << gap <<
" not found" << std::endl;
579 if ( m_PhysicalStrip[part][seg][gap][strip] != 0 )
580 {
return m_PhysicalStrip[part][seg][gap][strip]; }
583 std::cout <<
"PhysicalNode: "
584 <<
"Part" << part <<
"Seg" << seg <<
"Gap" << gap <<
"Strip" << strip
585 <<
" not found" << std::endl;
void SetQuarterVisible()
Set quater visible;.
TGeoVolume * GetVolumeStripPlane(int part, int seg, int gap)
Get strip plane volume;.
void SetPhysicalNode()
Set the pointers to the physical nodes;.
float GetAbsorberThickness(int part, int seg, int absorber)
Get thickness of an absorber;.
TGeoVolume * GetVolumeAluminumBox(int part, int seg, int gap)
Get box volume;.
TGeoVolume * GetVolumeGasChamber(int part, int seg, int gap, int panel, int gasChamber)
Get rpc gas chamber volume;.
TGeoPhysicalNode * GetPhysicalStrip(int part, int seg, int gap, int strip)
Get strip physical node;.
TGeoVolume * GetVolumeBakelite(int part, int seg, int gap, int panel, int bakelite)
Get rpc bakelite volume;.
void SetNode()
Set the pointers to theirs nodes;.
TGeoVolume * GetVolumeAbsorberPanel(int part, int seg, int absorber, int panel)
Get absorber panel volume;.
void SetAllVisible()
Set all visible;.
TGeoVolume * GetVolumeGap(int part, int seg, int gap)
Get gap volume;.
int GetSegNum(int part)
Get number of segment on part;.
TGeoNode * GetGap(int part, int seg, int gap)
Get absorber node;.
TGeoNode * GetStripPlane(int part, int seg, int gap)
Get box node;.
void SetDefaultVis()
Set default visual attributes;.
TGeoVolume * GetVolumeStrip(int part, int seg, int gap, int strip)
Get strip volume;.
TGeoVolume * GetVolumeAbsorber(int part, int seg, int absorber)
Get absorber volume;.
TGeoPhysicalNode * GetPhysicalGap(int part, int seg, int gap)
Get rpc gas chamber node;.
TGeoNode * GetStrip(int part, int seg, int gap, int strip)
Get strip node;.
int GetStripNum(int part, int seg, int gap)
Get number of strip on gap;.
int GetPartNum()
Get number of part;.
void InitFromGdml(const char *gdmlFile, const char *setupName)
Initialize the instance of ROOTGeo.
int GetGapNum(int part)
Get number of gap on part;.
TGeoNode * GetNode(const std::string &nn)
Get a node(physical volume) by name;.
TGeoVolume * GetTopVolume()
Get the top(world) volume;.
TGeoVolume * GetLogicalVolume(const std::string &vn)
Get a logical volume by name;.
void ReadGdml(const char *gdmlFile, const char *setupName)
Initialize the instance of ROOTGeo.