20#include "TGeoManager.h"
22#include "ROOTGeo/MdcROOTGeo.h"
24const int MdcROOTGeo::m_kReplica[m_kLayer] = {
25 40, 44, 48, 56, 64, 72, 80, 80, 76, 76, 88, 88, 100, 100, 112, 112, 128,
26 128, 140, 140, 160, 160, 160, 160, 192, 192, 192, 192, 208, 208, 208, 208, 240, 240,
27 240, 240, 256, 256, 256, 256, 288, 288, 288, 256, 256, 256, 256, 288, 288, 288 };
28const int MdcROOTGeo::m_kiCorrectLayer[m_kCorrectLayer] = { 9, 11, 13, 15, 17,
33 MdcROOTGeo::m_kiCorrectReplica[m_kCorrectLayer] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
37 for (
int layer = 0; layer < m_kLayer; layer++ )
39 for (
int replica = 0; replica < m_kReplicaMax; replica++ )
41 m_NodeReplica[layer][replica] = 0;
42 m_PhysicalReplica[layer][replica] = 0;
46 for (
int i = 0; i < m_kCorrectLayer; i++ )
47 { m_CorrectMap[m_kiCorrectLayer[i]] = m_kiCorrectReplica[i]; }
62 if ( !m_Mdc ) std::cout <<
"m_Mdc = 0" << std::endl;
64 for (
int layer = 0; layer < m_kLayer; layer++ )
67 for (
int replica = 0; replica < m_kReplica[layer]; replica++ )
69 std::stringstream osname;
71 if ( layer >= 0 && layer < m_kStereoLayerIn )
77 <<
"Layer" << layer <<
"TwistedTubs"
80 else if ( layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn )
87 <<
"Layer" << layer <<
"Replica"
90 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
91 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
97 <<
"Layer" << layer <<
"TwistedTubs"
100 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
102 m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut )
109 <<
"Layer" << layer <<
"_0"
113 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut +
122 <<
"Layer" << layer - m_kAxialLayerOut <<
"_1"
127 m_NodeReplica[layer][replica] =
GetNode( osname.str() );
134 for ( intMap::iterator
iter = m_CorrectMap.begin();
iter != m_CorrectMap.end();
iter++ )
136 if ( layer == ( *iter ).first || ( layer >= m_kStereoLayerIn + m_kAxialLayerIn +
137 m_kStereoLayerOut + m_kAxialLayerOut &&
138 layer - m_kAxialLayerOut == ( *iter ).first ) )
140 rep -= ( *iter ).second;
141 if ( rep < 0 ) rep += m_kReplica[layer];
152 int segmentColor = 0;
155 int twistedTubsColor = 3;
156 int replicaColor = 4;
158 m_Mdc->SetLineColor( mdcColor );
159 m_Mdc->SetVisibility( 0 );
161 for (
int segment = 1; segment <= m_kSegment; segment++ )
167 for (
int layer = 0; layer < m_kLayer; layer++ )
169 if ( ( layer >= 0 && layer < m_kStereoLayerIn ) ||
170 ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
171 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut ) )
185 for (
int segment = 1; segment <= m_kSegment; segment++ )
187 for (
int no = 0; no < 2; no++ ) {
GetSegment( segment, no )->SetVisibility( 0 ); }
190 for (
int layer = 0; layer < m_kLayer; layer++ )
192 GetLayer( layer )->SetVisibility( 0 );
193 for (
int replica = 0; replica < m_kReplica[layer]; replica++ )
194 {
GetReplica( layer, replica )->SetVisibility( 0 ); }
201 for (
int segment = 1; segment <= m_kSegment; segment++ )
204 for (
int layer = 0; layer < m_kLayer; layer++ )
210 for (
int segment = 1; segment <= m_kSegment; segment++ )
212 for (
int no = 0; no < 2; no++ ) {
GetSegment( segment, no )->SetVisibility( 1 ); }
215 for (
int layer = 0; layer < m_kLayer; layer++ )
217 GetLayer( layer )->SetVisibility( 1 );
218 for (
int replica = 0; replica < m_kReplica[layer]; replica++ )
219 {
GetReplica( layer, replica )->SetVisibility( 0 ); }
224 for (
int segment = 1; segment <= m_kSegment; segment++ )
227 for (
int layer = 0; layer < m_kLayer; layer++ )
233 for (
int segment = 1; segment <= m_kSegment; segment++ )
235 for (
int no = 0; no < 2; no++ ) {
GetSegment( segment, no )->SetVisibility( 0 ); }
238 for (
int layer = 0; layer < m_kLayer; layer++ )
240 GetLayer( layer )->SetVisibility( 0 );
241 for (
int replica = 0; replica < m_kReplica[layer]; replica++ )
243 if ( replica < m_kReplica[layer] / 4 )
GetReplica( layer, replica )->SetVisibility( 0 );
244 else GetReplica( layer, replica )->SetVisibility( 1 );
250 int twistedTubsColor = 3;
251 int replicaColor = 4;
253 if ( gGeoManager == 0 ) std::cout <<
"Create gGeoManager first" << std::endl;
254 TGeoNode*
bes = gGeoManager->GetTopNode();
260 for (
int layer = 0; layer < m_kLayer; layer++ )
262 TGeoNode* nodeLayer =
GetLayer( layer );
264 for (
int replica = 0; replica < m_kReplica[layer]; replica++ )
266 TGeoNode* nodeReplica =
GetReplica( layer, replica );
267 m_PhysicalReplica[layer][replica] = gGeoManager->MakePhysicalNode(
268 TString(
"/" ) +
bes->GetName() + TString(
"/" ) +
mdc->GetName() + TString(
"/" ) +
269 nodeLayer->GetName() + TString(
"/" ) + nodeReplica->GetName() );
270 m_PhysicalReplica[layer][replica]->SetVisibility( 0 );
271 m_PhysicalReplica[layer][replica]->SetIsVolAtt( kFALSE );
272 if ( ( layer >= 0 && layer < m_kStereoLayerIn ) ||
273 ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
274 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut ) )
275 { m_PhysicalReplica[layer][replica]->SetLineColor( twistedTubsColor ); }
276 else { m_PhysicalReplica[layer][replica]->SetLineColor( replicaColor ); }
284 std::stringstream osname;
287 <<
"Segment" << segment;
292 std::stringstream osname;
293 if ( layer >= 0 && layer < m_kStereoLayerIn )
300 else if ( layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn )
307 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
308 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
315 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
316 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut )
321 <<
"Layer" << layer <<
"_0";
324 m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
330 <<
"Layer" << layer - m_kAxialLayerOut <<
"_1";
337 std::stringstream osname;
338 if ( layer >= 0 && layer < m_kStereoLayerIn )
343 <<
"Layer" << layer <<
"TwistedTubs";
345 else if ( layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn )
350 <<
"Layer" << layer <<
"Replica";
352 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
353 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
358 <<
"Layer" << layer <<
"TwistedTubs";
360 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
361 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut )
366 <<
"Layer" << layer <<
"_0"
370 m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
376 <<
"Layer" << layer - m_kAxialLayerOut <<
"_1"
384 std::stringstream osname;
385 if ( segment == 1 || segment == 2 )
390 <<
"Segment" << segment <<
"_" << m_kLayer + segment - 1;
397 <<
"Segment" << segment <<
"_" << m_kLayer + 2 + ( segment - 3 ) * 2 + no;
400 return GetNode( osname.str() );
404 std::stringstream osname;
405 if ( layer >= 0 && layer < m_kStereoLayerIn )
411 <<
"Layer" << layer <<
"_" << layer;
413 else if ( layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn )
419 <<
"Layer" << layer <<
"_" << layer;
421 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
422 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut )
428 <<
"Layer" << layer <<
"_" << layer;
430 else if ( layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
431 layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut )
437 <<
"Layer" << layer <<
"_0"
438 <<
"_" << 2 * layer - m_kStereoLayerIn - m_kAxialLayerIn - m_kStereoLayerOut;
441 m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
448 <<
"Layer" << layer - m_kAxialLayerOut <<
"_1"
450 << 2 * ( layer - m_kAxialLayerOut ) - m_kStereoLayerIn - m_kAxialLayerIn -
451 m_kStereoLayerOut + 1;
455 return GetNode( osname.str() );
459 if ( m_NodeReplica[layer][replica] != 0 )
462 return m_NodeReplica[layer][replica];
466 std::cout <<
"Node: "
467 <<
"Layer" << layer <<
"Replica" << replica <<
" not found" << std::endl;
473 if ( m_PhysicalReplica[layer][replica] != 0 ) {
return m_PhysicalReplica[layer][replica]; }
476 std::cout <<
"PhysicalNode: "
477 <<
"Layer" << layer <<
"Replica" << replica <<
" not found" << std::endl;
TGeoNode * GetSegment(int segment, int no)
Get segment node;.
int CorrectReplica(int layer, int replica)
Correct some axial layer id to copyNo;.
TGeoVolume * GetVolumeLayer(int layer)
Get layer volume;.
void SetQuarterVisible()
Set quater visible;.
void SetNode()
Set the pointers to theirs nodes;.
TGeoNode * GetLayer(int layer)
Get layer node;.
TGeoNode * GetReplica(int layer, int replica)
Get replica node;.
void SetDefaultVis()
Set default visual attributes;.
TGeoVolume * GetVolumeReplica(int layer)
Get replica volume;.
TGeoVolume * GetVolumeSegment(int segment)
Get segment volume;.
TGeoPhysicalNode * GetPhysicalReplica(int layer, int replica)
Get replica physical node;.
void SetPhysicalNode()
Set the pointers to the physical nodes;.
void SetAllVisible()
Set all visible;.
void InitFromGdml(const char *gdmlFile, const char *setupName)
Initialize the instance of ROOTGeo.
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.