/home/bes3soft/bes3soft/Boss/7.0.2/dist/7.0.2/DetectorDescription/ROOTGeo/ROOTGeo-00-00-15/src/MdcROOTGeo.cxx

Go to the documentation of this file.
00001 //$id$
00002 /*
00003  *    2004/11/29   Zhengyun You      Peking University
00004  *                 Tof Geometry General for EventDisplay
00005  *
00006  *    2004/12/10   Zhengyun You      Peking University
00007  *                 named from MdcGeo to MdcROOTGeo
00008  *                 inherit from class SubDetectorROOTGeo
00009  */
00010 
00011 using namespace std;
00012 
00013 #include <string>
00014 #include <fstream>
00015 #include <iostream>
00016 #include <sstream>
00017 #include <vector>
00018 #include <iomanip>
00019 
00020 #include <TGeoManager.h>
00021 
00022 #include "ROOTGeo/MdcROOTGeo.h"
00023 
00024 const int 
00025 MdcROOTGeo::m_kReplica[m_kLayer] = { 40,  44,  48,  56,  64,  72,  80,  80,
00026                                      76,  76,  88,  88,  100, 100, 112, 112, 128, 128, 140, 140,
00027                                      160, 160, 160, 160, 192, 192, 192, 192, 208, 208, 208, 208, 240, 240, 240, 240,
00028                                      256, 256, 256, 256, 288, 288, 288,
00029                                      256, 256, 256, 256, 288, 288, 288 };
00030 const int 
00031 MdcROOTGeo::m_kiCorrectLayer[m_kCorrectLayer] =   {9, 11, 13, 15, 17, 19,  36,  38,  40,  42};
00032 const int 
00033 //MdcROOTGeo::m_kiCorrectReplica[m_kCorrectLayer] = {38, 44, 50, 56, 65, 71, 127, 127, 144, 143};
00034 MdcROOTGeo::m_kiCorrectReplica[m_kCorrectLayer] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
00035 
00036 MdcROOTGeo::MdcROOTGeo()
00037 { 
00038   // Default constructor.
00039   for (int layer = 0; layer < m_kLayer; layer++) {
00040     for (int replica = 0; replica < m_kReplicaMax; replica++) {
00041       m_NodeReplica[layer][replica] = 0;
00042       m_PhysicalReplica[layer][replica] = 0;
00043     }
00044   }
00045 
00046   for (int i = 0; i < m_kCorrectLayer; i++) {
00047     m_CorrectMap[m_kiCorrectLayer[i]] = m_kiCorrectReplica[i];
00048   }
00049 }
00050 
00051 MdcROOTGeo::~MdcROOTGeo()
00052 { }
00053 
00054 void
00055 MdcROOTGeo::InitFromGdml( const char *gdmlFile, const char *setupName )
00056 {
00057   ReadGdml(gdmlFile, setupName);
00058   SetNode();
00059   SetDefaultVis();
00060 
00061   m_ROOTGeoInit = 1;  
00062 }
00063 
00064 void 
00065 MdcROOTGeo::SetNode()
00066 {
00067   m_Mdc = GetTopVolume();
00068   if(!m_Mdc) std::cout << "m_Mdc = 0" << std::endl;
00069   
00070   for (int layer = 0; layer < m_kLayer; layer++) {
00071     //std::cout << "Layer " << layer << std::endl;
00072     for (int replica = 0; replica < m_kReplica[layer]; replica++) {
00073       std::stringstream osname;
00074       int rep = replica;
00075       if (layer >= 0 && layer < m_kStereoLayerIn) {
00076         osname << "pv_" << "logical" << "Mdc" << "Stereo" << "Layer" << layer << "TwistedTubs" << "_" << rep; 
00077       }
00078       else if (layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn) {
00079         rep = CorrectReplica(layer, rep);
00080         osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << layer << "Replica" << "_" << rep; 
00081       }
00082       else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
00083                layer <  m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut) {
00084         osname << "pv_" << "logical" << "Mdc" << "Stereo" << "Layer" << layer << "TwistedTubs" << "_" << rep;
00085       }
00086       else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
00087                layer <  m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut) {
00088         rep = CorrectReplica(layer, rep);
00089         osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << layer << "_0" << "Replica" << "_" << rep;
00090       }
00091       else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
00092                layer <  m_kLayer) {
00093         rep = CorrectReplica(layer, rep);
00094         osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << layer - m_kAxialLayerOut << "_1" << "Replica" << "_" << rep;
00095       }
00096       
00097       m_NodeReplica[layer][replica] = GetNode( osname.str() );
00098     }
00099   }
00100 }
00101 
00102 int 
00103 MdcROOTGeo::CorrectReplica(int layer, int replica)
00104 {
00105   int rep = replica;
00106   for (intMap::iterator iter = m_CorrectMap.begin(); iter != m_CorrectMap.end(); iter++) {
00107     if (layer == (*iter).first ||
00108         (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
00109          layer - m_kAxialLayerOut == (*iter).first)) {
00110       rep -= (*iter).second;
00111       if (rep < 0) rep += m_kReplica[layer];
00112     }
00113   }
00114 
00115   //std::cout << "layer" << layer << " " << replica << "->" << rep << std::endl; 
00116   return rep;
00117 }
00118 
00119 void 
00120 MdcROOTGeo::SetDefaultVis()
00121 {
00122   //std::cout << "begin of set defaultvis" << std::endl;
00123   int mdcColor         = 3;
00124   int segmentColor     = 0;
00125   int hypeColor        = 3;
00126   int tubeColor        = 4;
00127   int twistedTubsColor = 3;
00128   int replicaColor     = 4;
00129 
00130   m_Mdc->SetLineColor(mdcColor);
00131   m_Mdc->SetVisibility(0);
00132   
00133   for (int segment = 1; segment <= m_kSegment; segment++) {
00134     GetVolumeSegment(segment)->SetLineColor(segmentColor);
00135     GetVolumeSegment(segment)->SetVisibility(0);
00136   }
00137 
00138   for (int layer =0; layer < m_kLayer; layer++) {
00139     if ( (layer >= 0 && layer < m_kStereoLayerIn) ||
00140          (layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
00141           layer <  m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut) ) {
00142       GetVolumeLayer(layer)->SetLineColor(hypeColor);
00143       GetVolumeReplica(layer)->SetLineColor(twistedTubsColor);
00144     }
00145     else {
00146       GetVolumeLayer(layer)->SetLineColor(tubeColor);
00147       GetVolumeReplica(layer)->SetLineColor(replicaColor);
00148     }
00149     GetVolumeLayer(layer)->SetVisibility(0);
00150     GetVolumeReplica(layer)->SetVisibility(1);
00151   }
00152 
00153   for (int segment = 1; segment <= m_kSegment; segment++) {
00154     for (int no = 0; no < 2; no++) {
00155       GetSegment(segment, no)->SetVisibility(0);
00156     }
00157   }
00158 
00159   for (int layer = 0; layer < m_kLayer; layer++) {
00160     GetLayer(layer)->SetVisibility(0);
00161     for (int replica = 0; replica < m_kReplica[layer]; replica++) {
00162       GetReplica(layer, replica)->SetVisibility(0);
00163     }
00164   }
00165 
00166   //std::cout << "end of set defaultvis" << std::endl;
00167 }
00168 
00169 void
00170 MdcROOTGeo::SetAllVisible()
00171 {
00172   for (int segment = 1; segment <= m_kSegment; segment++) {
00173     GetVolumeSegment(segment)->SetVisibility(0);
00174   }
00175   
00176   for (int layer = 0; layer < m_kLayer; layer++) {
00177     GetVolumeLayer(layer)->SetVisibility(1);
00178     GetVolumeReplica(layer)->SetVisibility(0);
00179   }
00180 
00181   for (int segment = 1; segment <= m_kSegment; segment++) {
00182     for (int no = 0; no < 2; no++) {
00183       GetSegment(segment, no)->SetVisibility(1);
00184     }
00185   }
00186 
00187   for (int layer = 0; layer < m_kLayer; layer++) {
00188     GetLayer(layer)->SetVisibility(1);
00189     for (int replica = 0; replica < m_kReplica[layer]; replica++) {
00190       GetReplica(layer, replica)->SetVisibility(0);
00191     }
00192   }
00193 }
00194 
00195 void
00196 MdcROOTGeo::SetQuarterVisible()
00197 {
00198   for (int segment = 1; segment <= m_kSegment; segment++) {
00199     GetVolumeSegment(segment)->SetVisibility(0);
00200   }
00201   
00202   for (int layer = 0; layer < m_kLayer; layer++) {
00203     GetVolumeLayer(layer)->SetVisibility(0);
00204     GetVolumeReplica(layer)->SetVisibility(1);
00205   }
00206 
00207   for (int segment = 1; segment <= m_kSegment; segment++) {
00208     for (int no = 0; no < 2; no++) {
00209       GetSegment(segment, no)->SetVisibility(0);
00210     }
00211   }
00212 
00213   for (int layer = 0; layer < m_kLayer; layer++) {
00214     GetLayer(layer)->SetVisibility(0);
00215     for (int replica = 0; replica < m_kReplica[layer]; replica++) {
00216       if (replica < m_kReplica[layer]/4) GetReplica(layer, replica)->SetVisibility(0);
00217       else                               GetReplica(layer, replica)->SetVisibility(1);
00218     }
00219   }
00220 }
00221 
00222 void 
00223 MdcROOTGeo::SetPhysicalNode()
00224 {
00225   int twistedTubsColor = 3;
00226   int replicaColor     = 4;
00227 
00228   if (gGeoManager == 0) std::cout << "Create gGeoManager first" << std::endl; 
00229   TGeoNode *bes = gGeoManager->GetTopNode();
00230   //std::cout << "m_childNo " << m_childNo << std::endl;
00231   TGeoNode *mdc = bes->GetDaughter(m_childNo);
00232 
00233   //if(!m_Mdc) std::cout << "m_Mdc = 0" << std::endl;
00234   
00235   for (int layer = 0; layer < m_kLayer; layer++) {
00236     TGeoNode *nodeLayer = GetLayer(layer);
00237     //std::cout << "Layer " << layer << std::endl;
00238     for (int replica = 0; replica < m_kReplica[layer]; replica++) {
00239       TGeoNode *nodeReplica = GetReplica(layer, replica);
00240       m_PhysicalReplica[layer][replica] = gGeoManager->MakePhysicalNode( TString("/") + bes->GetName() + 
00241                                                                          TString("/") + mdc->GetName() +
00242                                                                          TString("/") + nodeLayer->GetName() +
00243                                                                          TString("/") + nodeReplica->GetName());
00244       m_PhysicalReplica[layer][replica]->SetVisibility(0); 
00245       m_PhysicalReplica[layer][replica]->SetIsVolAtt(kFALSE);
00246       if ( (layer >= 0 && layer < m_kStereoLayerIn) ||
00247            (layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
00248             layer < m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut) ) {
00249         m_PhysicalReplica[layer][replica]->SetLineColor(twistedTubsColor);
00250       }
00251       else {
00252         m_PhysicalReplica[layer][replica]->SetLineColor(replicaColor);
00253       } 
00254       //if (m_PhysicalReplica[layer][replica]->IsVolAttributes()) std::cout << "yes " << std::endl; 
00255     }
00256   }
00257 }
00258 
00259 TGeoVolume*
00260 MdcROOTGeo::GetVolumeSegment( int segment )
00261 {
00262   std::stringstream osname;
00263   osname << "logical" << "Mdc" << "Segment" << segment;
00264   return GetLogicalVolume( osname.str() );
00265 }
00266   
00267 TGeoVolume* 
00268 MdcROOTGeo::GetVolumeLayer( int layer )
00269 {
00270   std::stringstream osname;
00271   if (layer >= 0 && layer < m_kStereoLayerIn) {
00272     osname << "logical" << "Mdc" << "Stereo" << "Layer" << layer; 
00273   }
00274   else if (layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn) {
00275     osname << "logical" << "Mdc" << "Axial" << "Layer" << layer; 
00276   }
00277   else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
00278            layer <  m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut) {
00279     osname << "logical" << "Mdc" << "Stereo" << "Layer" << layer;
00280   }
00281   else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
00282            layer <  m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut) {
00283     osname << "logical" << "Mdc" << "Axial" << "Layer" << layer << "_0";
00284   }
00285   else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
00286            layer <  m_kLayer) {
00287     osname << "logical" << "Mdc" << "Axial" << "Layer" << layer - m_kAxialLayerOut << "_1";
00288   }
00289   
00290   return GetLogicalVolume( osname.str() );
00291 }
00292 
00293 TGeoVolume* 
00294 MdcROOTGeo::GetVolumeReplica( int layer )
00295 {
00296   std::stringstream osname;
00297   if (layer >= 0 && layer < m_kStereoLayerIn) {
00298     osname << "logical" << "Mdc" << "Stereo" << "Layer" << layer << "TwistedTubs"; 
00299   }
00300   else if (layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn) {
00301     osname << "logical" << "Mdc" << "Axial" << "Layer" << layer << "Replica"; 
00302   }
00303   else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
00304            layer <  m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut) {
00305     osname << "logical" << "Mdc" << "Stereo" << "Layer" << layer << "TwistedTubs";
00306   }
00307   else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
00308            layer <  m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut) {
00309     osname << "logical" << "Mdc" << "Axial" << "Layer" << layer << "_0" << "Replica";
00310   }
00311   else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
00312            layer <  m_kLayer) {
00313     osname << "logical" << "Mdc" << "Axial" << "Layer" << layer - m_kAxialLayerOut << "_1" << "Replica";
00314   }
00315   
00316   return GetLogicalVolume( osname.str() );
00317 }
00318 
00319 TGeoNode*
00320 MdcROOTGeo::GetSegment( int segment, int no )
00321 {
00322   std::stringstream osname;
00323   if (segment == 1 || segment == 2) {
00324     osname << "pv_" << "logical" << "Mdc" << "Segment" << segment << "_" << m_kLayer + segment - 1; 
00325   }
00326   else {
00327     osname << "pv_" << "logical" << "Mdc" << "Segment" << segment << "_" << m_kLayer + 2 + (segment - 3)*2 + no; 
00328   }    
00329 
00330   return GetNode( osname.str() );
00331 }
00332 
00333 TGeoNode*
00334 MdcROOTGeo::GetLayer( int layer )
00335 {
00336   std::stringstream osname;
00337   if (layer >= 0 && layer < m_kStereoLayerIn) {
00338     osname << "pv_" << "logical" << "Mdc" << "Stereo" << "Layer" << layer << "_" << layer; 
00339   }
00340   else if (layer >= m_kStereoLayerIn && layer < m_kStereoLayerIn + m_kAxialLayerIn) {
00341     osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << layer << "_" << layer; 
00342   }
00343   else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn &&
00344            layer <  m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut) {
00345     osname << "pv_" << "logical" << "Mdc" << "Stereo" << "Layer" << layer << "_" << layer;
00346   }
00347   else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut &&
00348            layer <  m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut) {
00349     osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << layer << "_0" << "_" 
00350            << 2*layer - m_kStereoLayerIn - m_kAxialLayerIn - m_kStereoLayerOut; 
00351   }
00352   else if (layer >= m_kStereoLayerIn + m_kAxialLayerIn + m_kStereoLayerOut + m_kAxialLayerOut &&
00353            layer <  m_kLayer) {
00354     osname << "pv_" << "logical" << "Mdc" << "Axial" << "Layer" << layer - m_kAxialLayerOut << "_1" << "_" 
00355            << 2*(layer - m_kAxialLayerOut) - m_kStereoLayerIn - m_kAxialLayerIn - m_kStereoLayerOut + 1;
00356   }
00357   
00358   //std::cout << osname.str() << std::endl;
00359   return GetNode( osname.str() );
00360 }
00361 
00362 TGeoNode*
00363 MdcROOTGeo::GetReplica( int layer, int replica )
00364 {
00365   if (m_NodeReplica[layer][replica] != 0) {
00366     //std::cout << " replica " << layer <<  "  " << replica << " found " << std::endl;
00367     return m_NodeReplica[layer][replica];
00368   }
00369   else {
00370     std::cout << "Node: " << "Layer" << layer << "Replica" << replica << " not found" << std::endl;
00371     return 0;
00372   } 
00373 }
00374 
00375 TGeoPhysicalNode*
00376 MdcROOTGeo::GetPhysicalReplica( int layer, int replica )
00377 {
00378   if (m_PhysicalReplica[layer][replica] != 0) {
00379     return m_PhysicalReplica[layer][replica];
00380   }
00381   else {
00382     std::cout << "PhysicalNode: " << "Layer" << layer << "Replica" << replica << " not found" << std::endl;
00383     return 0;
00384   } 
00385 }

Generated on Tue Nov 29 22:58:01 2016 for BOSS_7.0.2 by  doxygen 1.4.7