22#include <TGeoBoolNode.h>
23#include <TGeoManager.h>
27#include "BesVisLib/BesEvent.h"
28#include "BesVisLib/BesView.h"
29#include "BesVisLib/MucROOTGeo.h"
30#include "Identifier/MucID.h"
32const int MucROOTGeo::m_kSeg[m_kPart] = { 4, 8, 4 };
33const int MucROOTGeo::m_kAbsorber[m_kPart] = { 9, 9, 9 };
34const int MucROOTGeo::m_kGap[m_kPart] = { 8, 9, 8 };
35const int MucROOTGeo::m_kPanel[m_kPart] = { 3, 4, 3 };
36const int MucROOTGeo::m_kBakelitePanel[m_kPart][m_kUpDown] = { 3, 5, 4, 4, 3, 5 };
40 for (
int part = 0; part < m_kPart; part++ )
42 for (
int seg = 0; seg < m_kSegMax; seg++ )
44 m_MucXY[part][seg] = 0;
45 m_MucZR[part][seg] = 0;
47 for (
int gap = 0; gap < m_kGapMax; gap++ )
49 m_NodeGap[part][seg][gap] = 0;
50 m_PhysicalGap[part][seg][gap] = 0;
51 m_MucXYGap[part][seg][gap] = 0;
52 m_MucZRGap[part][seg][gap] = 0;
54 for (
int strip = 0; strip < m_kStripMax; strip++ )
56 m_NodeStrip[part][seg][gap][strip] = 0;
57 m_PhysicalStrip[part][seg][gap][strip] = 0;
61 for (
int absorber = 0; absorber < m_kAbsorberMax; absorber++ )
63 m_NodeAbsorber[part][seg][absorber] = 0;
64 for (
int panel = 0; panel < m_kPanelMax; panel++ )
66 m_NodeAbsorberPanel[part][seg][absorber][panel] = 0;
67 m_PhysicalAbsorber[part][seg][absorber][panel] = 0;
76 m_gasChamberColor = 8;
83 cout <<
"delete old MucROOTGeo" << endl;
84 for (
int part = 0; part <
GetPartNb(); part++ )
86 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
88 for (
int gap = 0; gap <
GetGapNb( part ); gap++ )
90 for (
int strip = 0; strip <
GetStripNb( part, seg, gap ); strip++ )
91 {
delete m_Muc2DStrip[part][seg][gap][strip]; }
92 delete m_MucXYGap[part][seg][gap];
93 delete m_MucZRGap[part][seg][gap];
95 delete m_MucXY[part][seg];
96 delete m_MucZR[part][seg];
118 cout <<
"MucROOTGeo::Init2DGeometry, ROOT Geometry not Initialized yet!" << endl;
123 Int_t mucColor = 9002;
124 Int_t mucLineColor = 15;
125 Int_t mucXYStyle = 1001;
126 Int_t mucZRStyle = 1001;
128 Int_t mucGapColor = 10;
129 Int_t mucGapStyle = 1001;
130 Int_t mucGapXYECStyle = 4000;
131 Int_t mucGapLineColor = 15;
133 Double_t x = 0.0, y = 0.0, z = 0.0;
134 Double_t r = 0.0, phi = 0.0;
135 Double_t local[3] = { 0.0, 0.0, 0.0 };
136 Double_t master[3] = { 0.0, 0.0, 0.0 };
138 Double_t
P[300] = { 0.0 };
142 Int_t part = 0, seg = 0, gap = 0, strip = 0;
146 TGeoCompositeShape* mucShape = (TGeoCompositeShape*)
GetVolumeMuc()->GetShape();
150 TGeoBoolNode* mucBoolNode = mucShape->GetBoolNode();
151 TGeoCompositeShape* mucWithHoleShape = (TGeoCompositeShape*)mucBoolNode->GetLeftShape();
152 TGeoBoolNode* mucWithHoleBoolNode = mucWithHoleShape->GetBoolNode();
154 TGeoBBox* mucOuterShape = (TGeoBBox*)mucWithHoleBoolNode->GetLeftShape();
155 TGeoTube* mucInnerShape = (TGeoTube*)mucWithHoleBoolNode->GetRightShape();
161 Double_t mucOuterR = mucOuterShape->GetDX();
162 Double_t mucInnerR = mucInnerShape->GetRmax() + 40.0;
168 Int_t xySegPointSeq[4] = { 0, 1, 1, 0 };
169 for ( seg = 0; seg <
GetSegNb( part ); seg++ )
171 name = TString(
"MucBarrelSeg" );
173 for ( Int_t iPoint = 0; iPoint < 4; iPoint++ )
175 if ( iPoint < 2 ) r = mucInnerR / TMath::Cos( TMath::Pi() / 8.0 );
176 else r = mucOuterR / TMath::Cos( TMath::Pi() / 8.0 );
177 phi = TMath::Pi() / 8.0 * ( 2 * seg - 1 + 2 * xySegPointSeq[iPoint] );
178 x = r * TMath::Cos( phi );
179 y = r * TMath::Sin( phi );
182 P[3 * iPoint + 1] = y;
183 P[3 * iPoint + 2] = z;
185 m_MucXY[part][seg] =
new BesPolygon2D( name, name, 4, &
P[0] );
186 m_MucXY[part][seg]->SetFillColor( mucColor );
187 m_MucXY[part][seg]->SetFillStyle( mucXYStyle );
188 m_MucXY[part][seg]->SetLineColor( mucLineColor );
194 for ( seg = 0; seg <
GetSegNb( part ); seg++ )
196 for ( Int_t iPoint = 0; iPoint < 4; iPoint++ )
198 if ( iPoint == 0 || iPoint == 3 ) r = mucInnerR;
200 phi = TMath::Pi() / 4.0 * seg;
202 x = r * TMath::Cos( phi );
203 y = r * TMath::Sin( phi );
205 TGeoVolume* volAbsorber = 0;
206 volAbsorber =
GetAbsorber( part, seg, 0 )->GetVolume();
207 TGeoBBox* absorberShape = (TGeoBBox*)volAbsorber->GetShape();
209 cout <<
"in MucROOTGeo::Init2DGeometry() x,y,z = " << absorberShape->GetDX() <<
" "
210 << absorberShape->GetDY() <<
" " << absorberShape->GetDZ() << endl;
211 Double_t dy = absorberShape->GetDY();
213 if ( iPoint < 2 ) z = -dy;
216 P[3 * iPoint + 1] = y;
217 P[3 * iPoint + 2] = z;
220 if ( seg == 2 || seg == 6 )
222 if ( seg == 2 ) name = TString(
"MucBarrelUpSeg" );
223 if ( seg == 6 ) name = TString(
"MucBarrelDownSeg" );
225 m_MucZR[part][seg] =
new BesPolygon2D( name, name, 4, &
P[0] );
226 m_MucZR[part][seg]->SetFillColor( mucColor );
227 m_MucZR[part][seg]->SetFillStyle( mucZRStyle );
228 m_MucZR[part][seg]->SetLineColor( mucLineColor );
235 for ( seg = 0; seg <
GetSegNb( part ); seg++ )
237 for ( gap = 0; gap <
GetGapNb( part ); gap++ )
240 TGeoPhysicalNode* phyNode = 0;
243 TGeoBBox* gapShape = (TGeoBBox*)phyNode->GetShape();
244 Double_t dx = gapShape->GetDX();
245 Double_t dy = gapShape->GetDY();
246 Double_t dz = gapShape->GetDZ();
249 for ( Int_t i = 0; i < 4; i++ )
271 phyNode->GetMatrix( -1 * phyNode->GetLevel() )
272 ->LocalToMaster( local, &master[0] );
273 for ( Int_t j = 0; j < 3; j++ )
P[3 * i + j] = master[j];
276 name = TString(
"MucBarrelSeg" );
278 name += TString(
"Gap" );
281 m_MucXYGap[part][seg][gap] =
new BesPolygon2D( name, name, 4, &
P[0] );
282 m_MucXYGap[part][seg][gap]->SetFillColor( mucGapColor );
283 m_MucXYGap[part][seg][gap]->SetFillStyle( mucGapStyle );
284 m_MucXYGap[part][seg][gap]->SetLineColor( mucGapLineColor );
287 for ( Int_t i = 0; i < 4; i++ )
309 phyNode->GetMatrix( -1 * phyNode->GetLevel() )
310 ->LocalToMaster( local, &master[0] );
311 for ( Int_t j = 0; j < 3; j++ )
P[3 * i + j] = master[j];
314 if ( seg == 2 || seg == 6 )
318 name = TString(
"MucBarrelUpSegGap" );
323 name = TString(
"MucBarrelDownSegGap" );
327 m_MucZRGap[part][seg][gap] =
new BesPolygon2D( name, name, 4, &
P[0] );
328 m_MucZRGap[part][seg][gap]->SetFillColor( mucGapColor );
329 m_MucZRGap[part][seg][gap]->SetFillStyle( mucGapStyle );
330 m_MucZRGap[part][seg][gap]->SetLineColor( mucGapLineColor );
335 for ( part = 0; part <
GetPartNb(); part++ )
337 if ( part == 1 )
continue;
338 for ( seg = 0; seg <
GetSegNb( part ); seg++ )
343 for ( gap = 0; gap <
GetGapNb( part ); gap++ )
345 TGeoPhysicalNode* phyNode = 0;
348 Int_t ixyPoint = 0, izrPoint = 0;
352 TGeoCompositeShape* addPanelShape[4];
353 TGeoTrap* panelShape[4];
355 for ( Int_t panel = nPanel - 1; panel >= 0; panel-- )
357 if ( panel == nPanel - 1 )
358 addPanelShape[panel] =
359 (TGeoCompositeShape*)
GetGap( part, seg, gap )->GetVolume()->GetShape();
361 addPanelShape[panel] =
362 (TGeoCompositeShape*)addPanelShape[panel + 1]->GetBoolNode()->GetLeftShape();
364 panelShape[panel] = (TGeoTrap*)addPanelShape[panel]->GetBoolNode()->GetRightShape();
366 Double_t *localArb8Point, masterArb8Point[3 * 8];
367 localArb8Point = panelShape[panel]->GetVertices();
368 for ( Int_t i = 0; i < 8; i++ )
370 local[0] = localArb8Point[2 * i];
371 local[1] = localArb8Point[2 * i + 1];
372 if ( i < 4 ) local[2] = panelShape[panel]->GetDz() * ( -1.0 );
373 else local[2] = panelShape[panel]->GetDz();
375 addPanelShape[panel]->GetBoolNode()->GetRightMatrix()->LocalToMaster(
378 for ( Int_t j = 0; j < 3; j++ ) local[j] = master[j];
379 phyNode->GetMatrix( -1 * phyNode->GetLevel() )
380 ->LocalToMaster( local, &master[0] );
381 for ( Int_t j = 0; j < 3; j++ ) { masterArb8Point[3 * i + j] = master[j]; }
387 Int_t xyPanelPointSeq[4] = { 0, 3, 7, 4 };
388 for ( Int_t i = 0; i < 4; i++ )
390 for ( Int_t j = 0; j < 3; j++ )
391 {
P[3 * ixyPoint + j] = masterArb8Point[3 * xyPanelPointSeq[i] + j]; }
397 Int_t xyPanelPointSeq[4] = { 7, 4, 0, 3 };
398 for ( Int_t i = 0; i < 4; i++ )
400 for ( Int_t j = 0; j < 3; j++ )
401 {
P[3 * ixyPoint + j] = masterArb8Point[3 * xyPanelPointSeq[i] + j]; }
410 Int_t zrPanelPointSeq[4] = { 4, 7, 6, 5 };
411 for ( Int_t i = 0; i < 4; i++ )
413 for ( Int_t j = 0; j < 3; j++ )
414 {
P[100 + 3 * izrPoint + j] = masterArb8Point[3 * zrPanelPointSeq[i] + j]; }
420 Int_t zrPanelPointSeq[4] = { 6, 5, 4, 7 };
421 for ( Int_t i = 0; i < 4; i++ )
423 for ( Int_t j = 0; j < 3; j++ )
424 {
P[100 + 3 * izrPoint + j] = masterArb8Point[3 * zrPanelPointSeq[i] + j]; }
430 if ( part == 0 ) name = TString(
"MucEastEc" );
431 else if ( part == 2 ) name = TString(
"MucWestEc" );
432 name += TString(
"Seg" );
434 name += TString(
"Gap" );
438 m_MucXYGap[part][seg][gap] =
440 m_MucXYGap[part][seg][gap]->SetFillColor( mucGapColor );
441 m_MucXYGap[part][seg][gap]->SetFillStyle( mucGapXYECStyle );
442 m_MucXYGap[part][seg][gap]->SetLineColor( mucGapLineColor );
444 m_MucZRGap[part][seg][gap] =
446 m_MucZRGap[part][seg][gap]->SetFillColor( mucGapColor );
447 m_MucZRGap[part][seg][gap]->SetFillStyle( mucGapStyle );
448 m_MucZRGap[part][seg][gap]->SetLineColor( mucGapLineColor );
454 Double_t zrFirstAbsorberHeight =
455 ( (TGeoBBox*)
GetAbsorber( part, seg, 0 )->GetVolume()->GetShape() )->GetDZ() *
457 for ( Int_t i = 0; i < 4; i++ )
459 for ( Int_t j = 0; j < 3; j++ )
461 if ( ( part == 0 && ( seg == 0 || seg == 2 ) ) ||
462 ( part == 2 && ( seg == 1 || seg == 3 ) ) )
464 Int_t zrSegPointSeq[4] = { 6, 7, 0, 1 };
465 segP[3 * iSegPoint + j] =
P[100 + 3 * zrSegPointSeq[i] + j];
469 Int_t zrSegPointSeq[4] = { 5, 4, 3, 2 };
470 segP[3 * iSegPoint + j] =
P[100 + 3 * zrSegPointSeq[i] + j];
475 if ( part == 0 ) segP[3 * iSegPoint + j] -= zrFirstAbsorberHeight;
476 else if ( part == 2 ) segP[3 * iSegPoint + j] += zrFirstAbsorberHeight;
484 Double_t zrLastAbsorberHeight =
485 ( (TGeoBBox*)
GetAbsorber( part, seg, 8 )->GetVolume()->GetShape() )->GetDZ() *
487 for ( Int_t i = 0; i < 4; i++ )
489 for ( Int_t j = 0; j < 3; j++ )
491 if ( ( part == 0 && ( seg == 0 || seg == 2 ) ) ||
492 ( part == 2 && ( seg == 1 || seg == 3 ) ) )
494 Int_t zrSegPointSeq[4] = { 2, 3, 4, 5 };
495 segP[3 * iSegPoint + j] =
P[100 + 3 * zrSegPointSeq[i] + j];
499 Int_t zrSegPointSeq[4] = { 1, 0, 7, 6 };
500 segP[3 * iSegPoint + j] =
P[100 + 3 * zrSegPointSeq[i] + j];
505 if ( part == 0 ) segP[3 * iSegPoint + j] += zrLastAbsorberHeight;
506 else if ( part == 2 ) segP[3 * iSegPoint + j] -= zrLastAbsorberHeight;
513 if ( part == 0 ) name = TString(
"MucEastEc" );
514 else if ( part == 2 ) name = TString(
"MucWestEc" );
515 name += TString(
"Seg" );
517 m_MucZR[part][seg] =
new BesPolygon2D( name, name, iSegPoint, &segP[0] );
518 m_MucZR[part][seg]->SetFillColor( mucColor );
519 m_MucZR[part][seg]->SetFillStyle( mucZRStyle );
520 m_MucZR[part][seg]->SetLineColor( mucLineColor );
524 for ( part = 0; part <
GetPartNb(); part++ )
526 for ( seg = 0; seg <
GetSegNb( part ); seg++ )
528 for ( gap = 0; gap <
GetGapNb( part ); gap++ )
530 for ( strip = 0; strip <
GetStripNb( part, seg, gap ); strip++ )
532 TGeoPhysicalNode* phyNode = 0;
534 TGeoBBox* stripShape = (TGeoBBox*)phyNode->GetShape();
535 Double_t dx = stripShape->GetDX();
536 Double_t dy = stripShape->GetDY();
537 Double_t dz = stripShape->GetDZ();
538 dz *= m_kStripZMuliple;
540 for ( Int_t i = 0; i < 8; i++ )
586 phyNode->GetMatrix( -1 * phyNode->GetLevel() )
587 ->LocalToMaster( local, &master[0] );
588 for ( Int_t j = 0; j < 3; j++ )
P[3 * i + j] = master[j];
591 name = TString(
"Muc Part" );
593 name += TString(
" Seg" );
595 name += TString(
" Gap" );
597 name += TString(
" Strip" );
600 m_Muc2DStrip[part][seg][gap][strip] =
601 new Muc2DStrip( name, name, 8, &
P[0], part, seg, gap, strip );
613 if ( !m_Muc ) std::cout <<
"m_Muc = 0" << std::endl;
616 for (
int part = 0; part <
GetPartNb(); part++ )
618 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
620 for (
int gap = 0; gap <
GetGapNb( part ); gap++ )
624 std::stringstream osnameGap;
628 <<
"P" << part <<
"S" << seg <<
"G" << gap <<
"_" << gapCount;
629 m_NodeGap[part][seg][gap] =
GetNode( osnameGap.str() );
633 if ( part == 1 && seg == 2 ) segment = 2;
634 std::stringstream osnameStripPlane;
635 osnameStripPlane <<
"pv_"
638 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"SP"
641 m_NodeStripPlane[part][seg][gap] =
GetNode( osnameStripPlane.str() );
642 for (
int strip = 0; strip <
GetStripNb( part, seg, gap ); strip++ )
644 std::stringstream osnameStrip;
650 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"s"
651 <<
"00" << strip <<
"_" << strip;
653 else if ( strip < 100 )
658 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"s"
659 <<
"0" << strip <<
"_" << strip;
666 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"s" << strip <<
"_"
670 m_NodeStrip[part][seg][gap][strip] =
GetNode( osnameStrip.str() );
676 int absorberCount = gapCount;
677 for (
int part = 0; part <
GetPartNb(); part++ )
679 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
681 for (
int absorber = 0; absorber <
GetAbsorberNb( part ); absorber++ )
683 std::stringstream osnameAbsorber;
684 osnameAbsorber <<
"pv_"
687 <<
"P" << part <<
"S" << seg <<
"Ab" << absorber <<
"_"
689 m_NodeAbsorber[part][seg][absorber] =
GetNode( osnameAbsorber.str() );
707 for (
int part = 0; part <
GetPartNb(); part++ )
709 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
711 for (
int gap = 0; gap <
GetGapNb( part ); gap++ )
713 m_NodeGap[part][seg][gap] = m_Muc->GetNode( gapCount );
716 m_NodeStripPlane[part][seg][gap] =
720 m_StripNum[part][seg][gap] =
GetStripPlane( part, seg, gap )->GetNdaughters();
722 for (
int strip = 0; strip <
GetStripNb( part, seg, gap ); strip++ )
724 m_NodeStrip[part][seg][gap][strip] =
725 GetStripPlane( part, seg, gap )->GetVolume()->GetNode( strip );
731 int absorberCount = gapCount;
732 for (
int part = 0; part <
GetPartNb(); part++ )
734 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
736 for (
int absorber = 0; absorber <
GetAbsorberNb( part ); absorber++ )
738 m_NodeAbsorber[part][seg][absorber] = m_Muc->GetNode( absorberCount );
755 m_Muc->SetLineColor( m_MucColor );
756 m_Muc->SetVisibility( 0 );
758 for (
int part = 0; part <
GetPartNb(); part++ )
760 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
762 for (
int absorber = 0; absorber <
GetAbsorberNb( part ); absorber++ )
775 for (
int gap = 0; gap <
GetGapNb( part ); gap++ )
777 GetVolumeGap( part, seg, gap )->SetLineColor( m_gapColor );
780 GetVolumeBox( part, seg, gap )->SetLineColor( m_gapColor );
785 for (
int sb = 0; sb < m_kSmallBlockMax; sb++ )
795 for (
int strip = 0; strip <
GetStripNb( part, seg, gap ); strip++ )
797 GetVolumeStrip( part, seg, gap, strip )->SetLineColor( m_stripColor );
801 for (
int up = 0; up < 2; up++ )
807 if ( part == 1 && seg == 2 ) seg_shift = 1;
808 for (
int panel = 0; panel < m_kPanel[part] + seg_shift; panel++ )
811 ->SetLineColor( m_gasChamberColor );
817 for (
int panel = 0; panel < m_kBakelitePanel[part][up] + seg_shift; panel++ )
819 for (
int bakelite = 0; bakelite < m_kBakelite; bakelite++ )
822 ->SetLineColor( m_bakeliteColor );
844 for (
int part = 0; part <
GetPartNb(); part++ )
846 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
848 for (
int gap = 0; gap <
GetGapNb( part ); gap++ )
850 GetGap( part, seg, gap )->SetVisibility( 0 );
851 for (
int strip = 0; strip <
GetStripNb( part, seg, gap ); strip++ )
852 {
GetStrip( part, seg, gap, strip )->SetVisibility( 0 ); }
860 for (
int part = 0; part <
GetPartNb(); part++ )
862 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
864 for (
int gap = 0; gap <
GetGapNb( part ); gap++ )
866 for (
int strip = 0; strip <
GetStripNb( part, seg, gap ); strip++ )
875 m_Muc->SetLineColor( m_MucColor );
876 m_Muc->SetVisibility( 0 );
878 for (
int part = 0; part <
GetPartNb(); part++ )
880 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
882 for (
int absorber = 0; absorber <
GetAbsorberNb( part ); absorber++ )
895 for (
int gap = 0; gap <
GetGapNb( part ); gap++ )
897 GetVolumeGap( part, seg, gap )->SetLineColor( m_gapColor );
900 GetVolumeBox( part, seg, gap )->SetLineColor( m_stripColor );
905 for (
int sb = 0; sb < m_kSmallBlockMax; sb++ )
915 for (
int strip = 0; strip <
GetStripNb( part, seg, gap ); strip++ )
917 GetVolumeStrip( part, seg, gap, strip )->SetLineColor( m_stripColor );
921 for (
int up = 0; up < 2; up++ )
926 if ( part == 1 && seg == 2 ) seg_shift = 1;
927 for (
int panel = 0; panel < m_kPanel[part] + seg_shift; panel++ )
930 ->SetLineColor( m_gasChamberColor );
936 for (
int panel = 0; panel < m_kBakelitePanel[part][up] + seg_shift; panel++ )
938 for (
int bakelite = 0; bakelite < m_kBakelite; bakelite++ )
941 ->SetLineColor( m_bakeliteColor );
963 for (
int part = 0; part <
GetPartNb(); part++ )
965 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
967 for (
int gap = 0; gap <
GetGapNb( part ); gap++ )
969 GetGap( part, seg, gap )->SetVisibility( 0 );
970 for (
int strip = 0; strip <
GetStripNb( part, seg, gap ); strip++ )
971 {
GetStrip( part, seg, gap, strip )->SetVisibility( 0 ); }
978 for (
int part = 0; part < m_kPart; part++ )
980 for (
int seg = 0; seg < m_kSeg[part]; seg++ )
982 for (
int absorber = 0; absorber < m_kAbsorber[part]; absorber++ )
991 for (
int panel = 0; panel < m_kPanel[part]; panel++ )
993 if ( seg > 0 && seg < 3 )
999 for (
int gap = 0; gap < m_kGap[part]; gap++ )
1001 if ( part == 1 && seg > 2 )
1004 GetGap( part, seg, gap )->SetVisibility( 1 );
1009 GetGap( part, seg, gap )->SetVisibility( 0 );
1011 for (
int strip = 0; strip < m_StripNum[part][seg][gap]; strip++ )
1030 for (
int part = 0; part < m_kPart; part++ )
1032 for (
int seg = 0; seg < m_kSeg[part]; seg++ )
1034 for (
int absorber = 0; absorber < m_kAbsorber[part]; absorber++ )
1038 if ( seg < 3 || seg > 5 )
1044 for (
int panel = 0; panel < m_kPanel[part]; panel++ )
1046 if ( seg == 0 || seg == 3 )
1052 for (
int gap = 0; gap < m_kGap[part]; gap++ )
1054 if ( part == 1 && ( seg < 3 || seg > 5 ) )
1057 GetGap( part, seg, gap )->SetVisibility( 1 );
1062 GetGap( part, seg, gap )->SetVisibility( 0 );
1064 for (
int strip = 0; strip < m_StripNum[part][seg][gap]; strip++ )
1084 for (
int seg = 0; seg < m_kSeg[part]; seg++ )
1086 for (
int absorber = 0; absorber < m_kAbsorber[part]; absorber++ )
1089 for (
int gap = 0; gap < m_kGap[part]; gap++ )
1092 GetGap( part, seg, gap )->SetVisibility( 1 );
1099 if ( gGeoManager == 0 ) std::cout <<
"Create gGeoManager first" << std::endl;
1100 TGeoNode*
bes = gGeoManager->GetTopNode();
1101 TGeoNode* muc =
bes->GetDaughter( 3 );
1103 for (
int part = 0; part <
GetPartNb(); part++ )
1105 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
1107 for (
int gap = 0; gap <
GetGapNb( part ); gap++ )
1109 TGeoNode* nodeGap =
GetGap( part, seg, gap );
1110 m_PhysicalGap[part][seg][gap] = gGeoManager->MakePhysicalNode(
1111 TString(
"/" ) +
bes->GetName() + TString(
"/" ) + muc->GetName() +
1112 TString(
"/" ) + nodeGap->GetName() + TString(
"/" ) +
1113 nodeGap->GetDaughter( 0 )->GetName() );
1115 m_PhysicalGap[part][seg][gap]->SetVisibility( 0 );
1116 m_PhysicalGap[part][seg][gap]->SetIsVolAtt( kFALSE );
1117 m_PhysicalGap[part][seg][gap]->SetLineColor( m_gapColor );
1121 for (
int strip = 0; strip < m_StripNum[part][seg][gap]; strip++ )
1123 TGeoNode* nodeStrip =
GetStrip( part, seg, gap, strip );
1124 m_PhysicalStrip[part][seg][gap][strip] = gGeoManager->MakePhysicalNode(
1125 TString(
"/" ) +
bes->GetName() + TString(
"/" ) + muc->GetName() +
1126 TString(
"/" ) + nodeGap->GetName() + TString(
"/" ) +
1127 nodeGap->GetDaughter( 0 )->GetName() + TString(
"/" ) +
1128 nodeStripPlane->GetName() + TString(
"/" ) + nodeStrip->GetName() );
1129 m_PhysicalStrip[part][seg][gap][strip]->SetVisibility( 0 );
1130 m_PhysicalStrip[part][seg][gap][strip]->SetIsVolAtt( kFALSE );
1131 m_PhysicalStrip[part][seg][gap][strip]->SetLineColor( m_stripColor );
1137 for (
int part = 0; part <
GetPartNb(); part++ )
1139 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
1141 for (
int absorber = 0; absorber <
GetAbsorberNb( part ); absorber++ )
1143 TGeoNode* nodeAbsorber =
GetAbsorber( part, seg, absorber );
1145 m_PhysicalAbsorber[part][seg][absorber][0] = gGeoManager->MakePhysicalNode(
1146 TString(
"/" ) + bes->GetName() + TString(
"/" ) + muc->GetName() +
1147 TString(
"/" ) + nodeAbsorber->GetName() );
1148 m_PhysicalAbsorber[part][seg][absorber][0]->SetVisibility( 0 );
1149 m_PhysicalAbsorber[part][seg][absorber][0]->SetIsVolAtt( kFALSE );
1150 m_PhysicalAbsorber[part][seg][absorber][0]->SetLineColor( m_absorberColor );
1173 if ( gPad ) view =
dynamic_cast<BesView*
>( gPad->GetView() );
1176 for (
int part = 0; part <
GetPartNb(); part++ )
1178 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
1180 for (
int gap = 0; gap <
GetGapNb( part ); gap++ )
1182 TGeoPhysicalNode* phyNode = 0;
1186 phyNode->SetVisibility( 0 );
1187 if ( ( part == 1 && seg <= 8 ) || ( part == 0 && seg <= 3 ) ||
1188 ( part == 2 && seg <= 3 ) )
1193 for (
int absorber = 0; absorber <
GetAbsorberNb( part ); absorber++ )
1195 for (
int panel = 0; panel < m_kPanelMax; panel++ )
1197 TGeoPhysicalNode* phyNode = 0;
1201 phyNode->SetVisibility( 0 );
1202 if ( ( part == 1 && seg <= 8 ) || ( part == 0 && seg <= 3 ) ||
1203 ( part == 2 && seg <= 3 ) )
1215 for (
int i = 0; i <
m_HitsArray->GetEntries(); i++ )
1217 TGeoPhysicalNode* phyNode = (TGeoPhysicalNode*)
m_HitsArray->At( i );
1218 phyNode->SetLineColor( m_stripColor );
1219 phyNode->SetVisibility( 0 );
1228 aStrip->
AddInfo( aStrip->GetTitle() );
1237 m_MucDigiCol =
gEvent->GetMucDigiCol();
1239 if ( m_MucDigiCol ) NDigiCol = m_MucDigiCol->GetEntries();
1243 for (
int i = 0; i < NDigiCol; i++ )
1251 TGeoPhysicalNode* phyNode =
1256 aStrip = m_Muc2DStrip[part][seg][gap][strip];
1260 aStrip->
AddInfo( aStrip->GetTitle() );
1275 if ( gPad ) view =
dynamic_cast<BesView*
>( gPad->GetView() );
1280 phyNode->SetVisibility( 0 );
1284 int part =
GetPart( phyNode );
1287 phyNode->SetVisibility( 1 );
1294 if ( gPad ) view =
dynamic_cast<BesView*
>( gPad->GetView() );
1296 for (
int i = 0; i <
m_HitsArray->GetEntries(); i++ )
1298 TGeoPhysicalNode* phyNode = (TGeoPhysicalNode*)
m_HitsArray->At( i );
1301 int part =
GetPart( phyNode );
1305 phyNode->SetVisibility( 1 );
1308 phyNode->SetLineColor( 922 );
1310 phyNode->SetVisibility( 0 );
1319 return m_kSeg[part];
1323 return m_kGap[part];
1327 return m_StripNum[part][seg][gap];
1331 return m_kAbsorber[part];
1335 std::stringstream osname;
1338 <<
"P" << part <<
"S" << seg <<
"Ab" << absorber;
1344 std::stringstream osname;
1345 osname <<
"VolumeSmallBlock"
1346 <<
"Gap" << gap <<
"SB" << sb;
1352 std::stringstream osname;
1355 <<
"Part" << part <<
"Seg" << seg <<
"Absorber" << absorber <<
"Panel" << panel;
1361 std::stringstream osname;
1364 <<
"P" << part <<
"S" << seg <<
"G" << gap;
1370 std::stringstream osname;
1373 <<
"P" << part <<
"S" << seg <<
"G" << gap <<
"Al";
1379 std::stringstream osname;
1381 if ( part == 1 && seg == 2 ) segment = 2;
1384 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"AlSf" << up;
1391 if ( part == 1 && seg == 2 ) segment = 2;
1392 std::stringstream osname;
1395 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"SP";
1401 std::stringstream osname;
1403 if ( part == 1 && seg == 2 ) segment = 2;
1408 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"s"
1411 else if ( strip < 100 )
1415 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"s"
1422 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"s" << strip;
1430 std::stringstream osname;
1432 if ( part == 1 && seg == 2 ) segment = 2;
1435 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"R" << rpcUpDown <<
"Pn" << panel
1443 std::stringstream osname;
1445 if ( part == 1 && seg == 2 ) segment = 2;
1448 <<
"P" << part % 2 <<
"S" << segment <<
"G" << gap <<
"R" << rpcUpDown <<
"Pn"
1455 int panel,
int bakelite ) {
1456 std::stringstream osname;
1458 if ( part == 1 && seg == 2 ) segment = 2;
1461 <<
"P" << part <<
"S" << segment <<
"G" << gap <<
"R" << RpcUpDown <<
"Pn" << panel
1468 if ( m_NodeAbsorber[part][seg][absorber] != 0 )
1469 {
return m_NodeAbsorber[part][seg][absorber]; }
1474 if ( m_NodeAbsorberPanel[part][seg][absorber][panel] != 0 )
1475 {
return m_NodeAbsorberPanel[part][seg][absorber][panel]; }
1480 if ( m_NodeGap[part][seg][gap] != 0 ) {
return m_NodeGap[part][seg][gap]; }
1485 if ( m_NodeStripPlane[part][seg][gap] != 0 ) {
return m_NodeStripPlane[part][seg][gap]; }
1490 if ( m_NodeStrip[part][seg][gap][strip] != 0 ) {
return m_NodeStrip[part][seg][gap][strip]; }
1496 return m_PhysicalAbsorber[part][seg][absorber][panel];
1500 if ( m_PhysicalGap[part][seg][gap] != 0 ) {
return m_PhysicalGap[part][seg][gap]; }
1505 if ( m_PhysicalStrip[part][seg][gap][strip] != 0 )
1506 {
return m_PhysicalStrip[part][seg][gap][strip]; }
1511 if ( m_Muc2DStrip[part][seg][gap][strip] )
return m_Muc2DStrip[part][seg][gap][strip];
1516 for (
int part = 0; part <
GetPartNb(); part++ )
1518 for (
int seg = 0; seg <
GetSegNb( part ); seg++ )
1520 for (
int gap = 0; gap <
GetGapNb( part ); gap++ )
1522 if ( phyNode ==
GetPhysicalGap( part, seg, gap ) ) {
return part; }
1523 for (
int strip = 0; strip < m_StripNum[part][seg][gap]; strip++ )
1525 if ( phyNode ==
GetPhysicalStrip( part, seg, gap, strip ) ) {
return part; }
1528 for (
int absorber = 0; absorber <
GetAbsorberNb( part ); absorber++ )
1530 for (
int panel = 0; panel < m_kPanelMax; panel++ )
1542 if ( part != 1 )
return true;
1548 Int_t viewSeg = Int_t( viewPhi / 45.0 + 0.5 );
1549 Int_t upSeg = viewSeg + 2;
1550 Int_t downSeg = viewSeg - 2;
1551 if ( upSeg < 0 ) upSeg += 8;
1552 else if ( upSeg >= 8 ) upSeg -= 8;
1553 if ( downSeg < 0 ) downSeg += 8;
1554 else if ( downSeg >= 8 ) downSeg -= 8;
1556 if ( seg == upSeg || seg == downSeg )
return true;
1561 if ( input >= 360.0 )
1565 }
while ( input >= 360.0 );
1567 else if ( input < 0.0 )
1571 }
while ( input < 0.0 );
1578 TString opt = option;
1581 if ( !
m_2DGeoInit ) cout <<
"MucROOTGeo::Draw2D(), 2D Geometry not initialized!" << endl;
1583 if ( !view ) cout <<
"MucROOTGeo::Draw(), BesView not found" << endl;
1588 for ( Int_t part =
GetPartNb() - 1; part >= 0; part-- )
1593 for ( Int_t seg = 0; seg <
GetSegNb( part ); seg++ )
1595 if ( opt.Contains(
"XY" ) )
1597 if ( m_MucXY[part][seg] ) m_MucXY[part][seg]->Draw(
"" );
1598 for ( Int_t gap = 0; gap <
GetGapNb( part ); gap++ )
1600 if ( m_MucXYGap[part][seg][gap] ) m_MucXYGap[part][seg][gap]->Draw(
"" );
1603 if ( opt.Contains(
"ZR" ) )
1605 if ( m_MucZR[part][seg] )
1607 if ( part == 1 ) m_MucZR[part][seg]->SetRotatable(
true );
1608 m_MucZR[part][seg]->Draw(
"" );
1610 for ( Int_t gap = 0; gap <
GetGapNb( part ); gap++ )
1612 if ( m_MucZRGap[part][seg][gap] )
1614 if ( part == 1 ) m_MucZRGap[part][seg][gap]->SetRotatable(
true );
1615 m_MucZRGap[part][seg][gap]->Draw(
"" );
1624 for ( Int_t part =
GetPartNb() - 1; part >= 0; part-- )
1626 for ( Int_t seg = 0; seg <
GetSegNb( part ); seg++ )
1628 for ( Int_t gap = 0; gap <
GetGapNb( part ); gap++ )
1630 for ( Int_t strip = 0; strip <
GetStripNb( part, seg, gap ); strip++ )
1632 if ( m_Muc2DStrip[part][seg][gap][strip] )
1634 m_Muc2DStrip[part][seg][gap][strip]->SetFired(
false );
1638 { m_Muc2DStrip[part][seg][gap][strip]->Draw(
"" ); }
1649 if ( !view ) cout <<
"MucROOTGeo::DrawHits(), BesView not found" << endl;
double P(RecMdcKalTrack *trk)
sprintf(cut, "kal_costheta0_em>-0.93&&kal_costheta0_em<0.93&&kal_pxy0_em>=0.05+%d*0.1&&kal_" "pxy0_em<0.15+%d*0.1&&NGch>=2", j, j)
R__EXTERN BesEvent * gEvent
Bool_t GetVisMucHitsWest()
Bool_t GetVisMucHitsGlobal()
Bool_t GetVisMucHitsEast()
Bool_t GetVisMucHitsBarrel()
virtual void Draw(Option_t *option="")
virtual void AddInfo(TString info)
virtual void SetFired(bool status=true)
static int part(const Identifier &id)
static int gap(const Identifier &id)
static int seg(const Identifier &id)
static int strip(const Identifier &id)
TGeoVolume * GetVolumeMuc()
Get Muc volume;.
void SetPhysicalDefaultVis()
void SetQuarterVisible()
Set quater visible;.
TGeoVolume * GetVolumeStripPlane(int part, int seg, int gap)
Get strip plane volume;.
void Draw(Option_t *option)
Draw function.
void SetPhysicalNode()
Set the pointers to the physical nodes;.
int GetGapNb(int part)
Get number of gap on part;.
void SetDetector()
Set Detecor (what is detector depends on you).
void SetVolumeDefaultVis()
Set default visual attributes;.
TGeoVolume * GetVolumeGasChamber(int part, int seg, int gap, int panel, int gasChamber)
Get rpc gas chamber volume;.
void SetHalfVisible()
Set half visible;.
int GetAbsorberNb(int part)
Get number of absorber on part;.
TGeoPhysicalNode * GetPhysicalStrip(int part, int seg, int gap, int strip)
Get strip physical node;.
TGeoVolume * GetVolumeBox(int part, int seg, int gap)
Get box volume;.
TGeoVolume * GetVolumeBakelite(int part, int seg, int gap, int panel, int bakelite)
Get rpc bakelite volume;.
TGeoVolume * GetVolumeGasBorder(int part, int seg, int gap, int panel, int gasChamber)
Get rpc gas border volume;.
Double_t Range360(Double_t input)
Get input value 0~360.
void SetNode()
Set the pointers to theirs nodes;.
void SetVolumeMuc(TGeoVolume *vol)
Set Muc volume, while initializing from ROOT;.
TGeoVolume * GetVolumeAbsorberPanel(int part, int seg, int absorber, int panel)
Get absorber panel volume;.
TGeoNode * GetAbsorber(int part, int seg, int absorber)
Get absorber node;.
Bool_t IsZRVisible(int part, int seg)
Is a segment visible in ZR view.
void SetVisMucDetector()
Set Muc detector visibility;.
void SetAllVisible()
Set all visible;.
Int_t GetPart(TGeoPhysicalNode *phyNode)
Get part no of a physcial node.
int GetSegNb(int part)
Get number of segment on part;.
TGeoVolume * GetVolumeGap(int part, int seg, int gap)
Get gap volume;.
int GetPartNb()
Get number of part;.
void SetHits()
Set all physicalNodes corresponding to digiCol;.
void SetNoEndVisible()
Set noend visible;.
TGeoVolume * GetVolumeBoxSurface(int part, int seg, int gap, int up)
Get box surface volume;.
TGeoNode * GetGap(int part, int seg, int gap)
Get absorber node;.
TGeoNode * GetStripPlane(int part, int seg, int gap)
Get box node;.
TGeoVolume * GetVolumeStrip(int part, int seg, int gap, int strip)
Get strip volume;.
void SetVisMucHits()
Set Muc hits visibility;.
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;.
TGeoPhysicalNode * GetPhysicalAbsorber(int part, int seg, int gap, int panel)
Get rpc gas chamber node;.
void Init2DGeometry()
Initialize 2D Geometry.
void DrawHits(Option_t *option)
Draw 2D hits.
int GetStripNb(int part, int seg, int gap)
Get number of strip on gap;.
Muc2DStrip * Get2DStrip(int part, int seg, int gap, int strip)
Get Muc2DStrip;.
TGeoVolume * GetVolumeAbsorberSmallBlock(int gap, int sb)
Get absorber small block;.
TGeoNode * GetAbsorberPanel(int part, int seg, int absorber, int panel)
Get absorber panel node;.
void InitFromGDML(const char *gdmlFile, const char *setupName)
Initialize ROOTGeo from GDML.
void InitFromROOT(TGeoVolume *vol)
Initialize ROOTGeo from TGeoVolume logicalMuc.
TGeoNode * GetNode(const std::string &nn)
Get a node(physical volume) by name;.
TObjArray * m_2DHitsArray
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.
TObjArray * m_DetectorsArray