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

Go to the documentation of this file.
00001 //$id$
00002 /*
00003  *    2004/11/29   Zhengyun You      Peking University
00004  *                 Muc Geometry General for EventDisplay
00005  *
00006  *    2004/12/11   Zhengyun You      Peking University
00007  *                 named from MucGeo to MucROOTGeo
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/MucROOTGeo.h"
00023 
00024 const int MucROOTGeo::m_kSeg[m_kPart]  = {4, 8, 4};
00025 const int MucROOTGeo::m_kAbsorber[m_kPart] = {9, 9, 9};
00026 const int MucROOTGeo::m_kGap[m_kPart]      = {8, 9, 8};
00027 const int MucROOTGeo::m_kPanel[m_kPart]    = {4, 3, 4};
00028 
00029 MucROOTGeo::MucROOTGeo()
00030 { 
00031   // Default constructor.
00032   for (int part = 0; part < m_kPart; part++) {
00033     for (int seg = 0; seg < m_kSegMax; seg++) {
00034       for (int gap = 0; gap < m_kGapMax; gap++) {
00035         m_NodeGap[part][seg][gap] = 0;
00036         m_PhysicalGap[part][seg][gap] = 0;
00037         //      m_NodeBox[part][seg][gap] = 0;
00038         //      m_PhysicalBox[part][seg][gap] = 0;
00039         for (int strip = 0; strip < m_kStripMax; strip++) {
00040           m_NodeStrip[part][seg][gap][strip] = 0;
00041           m_PhysicalStrip[part][seg][gap][strip] = 0;
00042         }
00043       }
00044     }
00045   }
00046 
00047   string GdmlManagementPath = getenv("GDMLMANAGEMENTROOT");
00048   //cout << "MucGeoGeneral::InitFromXML(), GdmlManagementPath not found" << endl;
00049   string GdmlFile = GdmlManagementPath + string("/dat/Muc.gdml");
00050   //string GdmlFile = string("Muc.gdml");
00051   cout << "GdmlFile " << GdmlFile << endl;
00052   InitFromGdml( GdmlFile.c_str(), "Muc" );
00053 }
00054 
00055 MucROOTGeo::~MucROOTGeo()
00056 { }
00057 
00058 void
00059 MucROOTGeo::InitFromGdml( const char *gdmlFile, const char *setupName )
00060 {
00061   ReadGdml(gdmlFile, setupName);
00062   SetNode();
00063   //SetDefaultVis();
00064 
00065   m_ROOTGeoInit = 1;  
00066 }
00067 
00068 void 
00069 MucROOTGeo::SetNode()
00070 {
00071   m_Muc = GetTopVolume();
00072   if(!m_Muc) {
00073     m_Muc = GetLogicalVolume("logicalMuc");
00074   }
00075   if(!m_Muc) std::cout << "m_Muc = 0" << std::endl;
00076 
00077   int gapCount = 0;
00078   for (int part = 0; part < m_kPart; part++) {
00079     for (int seg = 0; seg < m_kSeg[part]; seg++) {  
00080       for (int gap = 0; gap < m_kGap[part]; gap++) {
00081         m_StripNum[part][seg][gap] = GetVolumeStripPlane(part, seg, gap)->GetNdaughters();
00082         //std::cout << part << " " << seg << " " << gap << " " << m_StripNum[part][seg][gap] <<" "<<GetVolumeStripPlane(part, seg, gap)->GetName()<< std::endl;
00083 
00084         std::stringstream osnameGap;
00085         osnameGap << "pv_" << "l" << "Muc" << "P" << part << "S" << seg << "G" << gap << "_" << gapCount; 
00086         m_NodeGap[part][seg][gap] = GetNode( osnameGap.str() );
00087         gapCount++;
00088 
00089         //cout<<"in MucROOTGeo "<<m_NodeGap[part][seg][gap]->GetName()<<" "<<m_NodeGap[part][seg][gap]->GetDaughter(0)->GetName()<<endl;
00090 
00091         std::stringstream osnameBox;
00092         osnameBox << "pv_" << "l" << "Muc" << "P" << part << "S" << seg << "G" << gap << "Al" << "_" << "0"; 
00093         //      m_NodeAluminumBox[part][seg][gap] = GetNode( osnameBox.str() );
00094         TGeoNode *temp = GetNode( osnameBox.str() );
00095 
00096         int segment = 0; if(part==1&&seg==2) segment = 2;
00097         std::stringstream osnameStripPlane;
00098         osnameStripPlane << "pv_" << "l" << "Muc" << "P" << part << "S" << segment << "G" << gap << "SP" << "_" << "0";
00099         m_NodeStripPlane[part][seg][gap] = GetNode( osnameStripPlane.str() );
00100         
00101         for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00102           std::stringstream osnameStrip;
00103           if(strip < 10) {
00104             osnameStrip << "pv_" << "l" << "Muc" << "P" << part << "S" << segment << "G" << gap << "s" << "00" << strip << "_" << strip; 
00105           }
00106           else if(strip < 100) {
00107             osnameStrip << "pv_" << "l" << "Muc" << "P" << part << "S" << segment << "G" << gap << "s" << "0" << strip << "_" << strip; 
00108           }
00109           else {
00110             osnameStrip << "pv_" << "l" << "Muc" << "P" << part << "S" << segment << "G" << gap << "s" << strip << "_" << strip; 
00111           }
00112           
00113           m_NodeStrip[part][seg][gap][strip] = GetNode( osnameStrip.str() );
00114         }
00115       }
00116     }
00117   }
00118 }
00119 
00120 void 
00121 MucROOTGeo::SetDefaultVis()
00122 {
00123   //std::cout << "begin of set defaultvis" << std::endl;
00124   int mucColor        = 2;
00125   int absorberColor   = 2;
00126   int gapColor        = 8;
00127   int gasChamberColor = 8;
00128   int bakeliteColor   = 8;
00129   int stripColor      = 6;
00130 
00131   m_Muc->SetLineColor(mucColor);
00132   m_Muc->SetVisibility(0);
00133   
00134   for (int part = 0; part < m_kPart; part++) {
00135     for (int seg = 0; seg < m_kSeg[part]; seg++) {
00136       for (int absorber = 0; absorber < m_kAbsorber[part]; absorber++) {
00137         GetVolumeAbsorber(part, seg, absorber)->SetLineColor(absorberColor);
00138         GetVolumeAbsorber(part, seg, absorber)->SetVisibility(0);
00139         if (part != 1) {
00140           for (int panel = 0; panel < m_kPanel[part]; panel++) {
00141             GetVolumeAbsorberPanel(part, seg, absorber, panel)->SetLineColor(absorberColor);
00142             GetVolumeAbsorberPanel(part, seg, absorber, panel)->SetVisibility(0);
00143           }
00144         }
00145       }
00146       
00147       for (int gap = 0; gap < m_kGap[part]; gap++) {
00148         GetVolumeGap(part, seg, gap)->SetLineColor(gapColor);
00149         GetVolumeGap(part, seg, gap)->SetVisibility(0);
00150         GetVolumeStripPlane(part, seg, gap)->SetLineColor(gapColor);
00151         GetVolumeStripPlane(part, seg, gap)->SetVisibility(0);
00152  
00153         for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00154           GetVolumeStrip(part, seg, gap, strip)->SetLineColor(stripColor);
00155           GetVolumeStrip(part, seg, gap, strip)->SetVisibility(1);
00156         }
00157         
00158         for (int panel = 0; panel < m_kPanel[part]; panel++) {
00159           for(int bakelite = 0; bakelite < m_kBakelite; bakelite++) {
00160             GetVolumeBakelite(part, seg, gap, panel, bakelite)->SetLineColor(bakeliteColor);
00161             GetVolumeBakelite(part, seg, gap, panel, bakelite)->SetVisibility(0);
00162           }
00163           for (int gasChamber = 0; gasChamber < m_kGasChamber; gasChamber++) {
00164             GetVolumeGasChamber(part, seg, gap, panel, gasChamber)->SetLineColor(gasChamberColor);
00165             GetVolumeGasChamber(part, seg, gap, panel, gasChamber)->SetVisibility(0);
00166           }
00167         }
00168       }
00169     }
00170   }
00171 
00172   for (int part = 0; part < m_kPart; part++) {
00173     for (int seg = 0; seg < m_kSeg[part]; seg++) {
00174       for (int gap = 0; gap < m_kGap[part]; gap++) {
00175         GetGap(part, seg, gap)->SetVisibility(0);
00176         for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00177           GetStrip(part, seg, gap, strip)->SetVisibility(0);
00178         }
00179       }
00180     }
00181   }
00182 
00183   //std::cout << "end of set defaultvis" << std::endl;
00184 }
00185 
00186 void
00187 MucROOTGeo::SetAllVisible()
00188 {
00189   for (int part = 0; part < m_kPart; part++) {
00190     for (int seg = 0; seg < m_kSeg[part]; seg++) {
00191       for (int absorber = 0; absorber < m_kAbsorber[part]; absorber++) {
00192         if(part == 1) {
00193           GetVolumeAbsorber(part, seg, absorber)->SetVisibility(1);
00194         }
00195         else {
00196           GetVolumeAbsorber(part, seg, absorber)->SetVisibility(0);
00197           for (int panel = 0; panel < m_kPanel[part]; panel++) {
00198             GetVolumeAbsorberPanel(part, seg, absorber, panel)->SetVisibility(1);
00199           }
00200         }
00201       }
00202         
00203       for (int gap = 0; gap < m_kGap[part]; gap++) {
00204         GetVolumeGap(part, seg, gap)->SetVisibility(0);
00205         for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00206           GetVolumeStrip(part, seg, gap, strip)->SetVisibility(0);
00207         }
00208         
00209         for (int panel = 0; panel < m_kPanel[part]; panel++) {
00210           for(int bakelite = 0; bakelite < m_kBakelite; bakelite++) {
00211             GetVolumeBakelite(part, seg, gap, panel, bakelite)->SetVisibility(1);
00212           }
00213           for (int gasChamber = 0; gasChamber < m_kGasChamber; gasChamber++) {
00214             GetVolumeGasChamber(part, seg, gap, panel, gasChamber)->SetVisibility(1);
00215           }
00216         }
00217       }
00218     }
00219   }
00220 
00221   for (int part = 0; part < m_kPart; part++) {
00222     for (int seg = 0; seg < m_kSeg[part]; seg++) {
00223       for (int gap = 0; gap < m_kGap[part]; gap++) {
00224         GetGap(part, seg, gap)->SetVisibility(1);
00225         for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00226           GetStrip(part, seg, gap, strip)->SetVisibility(0);
00227         }
00228       }
00229     }
00230   }
00231 }
00232 
00233 void
00234 MucROOTGeo::SetQuarterVisible()
00235 {
00236   for (int part = 0; part < m_kPart; part++) {
00237     for (int seg = 0; seg < m_kSeg[part]; seg++) {
00238       for (int absorber = 0; absorber < m_kAbsorber[part]; absorber++) {
00239         if(part == 1) {
00240           if(seg > 2) GetVolumeAbsorber(part, seg, absorber)->SetVisibility(1);
00241         }
00242         else {
00243           GetVolumeAbsorber(part, seg, absorber)->SetVisibility(0);
00244           for (int panel = 0; panel < m_kPanel[part]; panel++) {
00245             if(seg > 0 && seg < 3) GetVolumeAbsorberPanel(part, seg, absorber, panel)->SetVisibility(1);
00246           }
00247         }
00248       }
00249       
00250       for (int gap = 0; gap < m_kGap[part]; gap++) {
00251         if (part == 1 && seg > 2) {
00252           GetVolumeGap(part, seg, gap)->SetVisibility(1);
00253           GetGap(part, seg, gap)->SetVisibility(1);
00254         }
00255         else {
00256           GetVolumeGap(part, seg, gap)->SetVisibility(0);
00257           GetGap(part, seg, gap)->SetVisibility(0);
00258         }
00259         for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00260           GetVolumeStrip(part, seg, gap, strip)->SetVisibility(0);
00261         }
00262         
00263         for (int panel = 0; panel < m_kPanel[part]; panel++) {
00264           for (int bakelite = 0; bakelite < m_kBakelite; bakelite++) {
00265             if ((part != 1 && seg > 0 && seg < 3) || (part == 1 && seg > 2)) GetVolumeBakelite(part, seg, gap, panel, bakelite)->SetVisibility(1);
00266           }
00267           for (int gasChamber = 0; gasChamber < m_kGasChamber; gasChamber++) {
00268             if ((part != 1 && seg > 0 && seg < 3) || (part == 1 && seg > 2)) GetVolumeGasChamber(part, seg, gap, panel, gasChamber)->SetVisibility(1);
00269           }
00270         }
00271       }
00272     }
00273   }
00274 
00275 }
00276 
00277 void 
00278 MucROOTGeo::SetPhysicalNode()
00279 {
00280   int stripColor = 2;
00281 
00282   if (gGeoManager == 0) std::cout << "Create gGeoManager first" << std::endl; 
00283   TGeoNode *bes = gGeoManager->GetTopNode();
00284   TGeoNode *muc = bes->GetDaughter(m_childNo);
00285   
00286   for (int part = 0; part < m_kPart; part++) {
00287     for (int seg = 0; seg < m_kSeg[part]; seg++) {
00288       for (int gap = 0; gap < m_kGap[part]; gap++) {
00289         TGeoNode *nodeGap = GetGap(part, seg, gap);
00290         m_PhysicalGap[part][seg][gap] = gGeoManager->MakePhysicalNode( TString("/") + bes->GetName() + 
00291                                                                        TString("/") + muc->GetName() +
00292                                                                        TString("/") + nodeGap->GetName() +
00293                                                                        TString("/") + nodeGap->GetDaughter(0)->GetName());
00294         m_PhysicalGap[part][seg][gap]->SetVisibility(0);
00295         m_PhysicalGap[part][seg][gap]->SetIsVolAtt(kFALSE);
00296 
00297         TGeoNode *nodeStripPlane = GetStripPlane(part, seg, gap);
00298         //std::cout << nodeGap->GetName() << "  " << nodeStripPlane->GetName() << endl;
00299         
00300         //TGeoNode *nodeBox = GetAluminumBox(part, seg, gap);
00301 //      m_PhysicalAluminumBox[part][seg][gap] = gGeoManager->MakePhysicalNode( TString("/") + bes->GetName() + 
00302 //                                                                       TString("/") + muc->GetName() +
00303 //                                                                       TString("/") + nodeGap->GetName() +
00304 //                                                                       TString("/") + nodeGap->GetDaughter(0)->GetName() );
00305 
00306 
00307         for (int strip = 0; strip < m_StripNum[part][seg][gap]; strip++) {
00308           TGeoNode *nodeStrip = GetStrip(part, seg, gap, strip);
00309           m_PhysicalStrip[part][seg][gap][strip] = gGeoManager->MakePhysicalNode( TString("/") + bes->GetName() + 
00310                                                                                   TString("/") + muc->GetName() +
00311                                                                                   TString("/") + nodeGap->GetName() +
00312                                                                                   TString("/") + nodeGap->GetDaughter(0)->GetName() +
00313                                                                                   TString("/") + nodeStripPlane->GetName() +
00314                                                                                   TString("/") + nodeStrip->GetName() );
00315           m_PhysicalStrip[part][seg][gap][strip]->SetVisibility(0);
00316           m_PhysicalStrip[part][seg][gap][strip]->SetIsVolAtt(kFALSE);
00317           m_PhysicalStrip[part][seg][gap][strip]->SetLineColor(stripColor);
00318         }
00319       }
00320     }
00321   }
00322 }
00323 
00324 int
00325 MucROOTGeo::GetPartNum()
00326 {
00327   int part = m_kPart;
00328   return part;
00329 }
00330 
00331 int 
00332 MucROOTGeo::GetSegNum(int part)
00333 {
00334   int seg = m_kSeg[part];
00335   return seg;
00336 }
00337   
00338 int 
00339 MucROOTGeo::GetGapNum(int part)
00340 {
00341   int gap = m_kGap[part];
00342   return gap;
00343 }
00344 
00345 int 
00346 MucROOTGeo::GetStripNum(int part, int seg, int gap)
00347 {
00348   int strip = m_StripNum[part][seg][gap];
00349   return strip;
00350 }
00351 
00352 TGeoVolume*
00353 MucROOTGeo::GetVolumeAbsorber( int part, int seg, int absorber )
00354 {
00355   std::stringstream osname;
00356   osname << "l" << "Muc" << "P" << part << "S" << seg << "Ab" << absorber;
00357   
00358   return GetLogicalVolume( osname.str() );
00359 }
00360   
00361 float
00362 MucROOTGeo::GetAbsorberThickness( int part, int seg, int absorber )
00363 {
00364   float thickness = 0.0;
00365   TGeoVolume *vol = GetVolumeAbsorber(part, seg, absorber);
00366   if (vol) {
00367     thickness = 2.0*((TGeoBBox*)vol->GetShape())->GetDZ();
00368   }
00369  
00370   return thickness;
00371 }
00372 
00373 TGeoVolume*
00374 MucROOTGeo::GetVolumeAbsorberPanel( int part, int seg, int absorber, int panel )
00375 {
00376   std::stringstream osname;
00377   osname << "l" << "Muc" << "P" << part << "S" << seg << "Ab" << absorber << "Pn" << panel;
00378   
00379   return GetLogicalVolume( osname.str() );
00380 }
00381   
00382 TGeoVolume*
00383 MucROOTGeo::GetVolumeGap( int part, int seg, int gap )
00384 {
00385   std::stringstream osname;
00386   osname << "l" << "Muc" << "P" << part << "S" << seg << "G" << gap;
00387   
00388   return GetLogicalVolume( osname.str() );
00389 }
00390 
00391 TGeoVolume*
00392 MucROOTGeo::GetVolumeAluminumBox( int part, int seg, int gap )
00393 {
00394   std::stringstream osname;
00395   osname <<"l" << "Muc" << "P" << part << "S" << seg << "G" << gap <<"Al";
00396   
00397   return GetLogicalVolume( osname.str() );
00398 }
00399 
00400 TGeoVolume*
00401 MucROOTGeo::GetVolumeStripPlane( int part, int seg, int gap )
00402 {
00403   int segment = 0; if(part==1&&seg==2) segment = 2;
00404   std::stringstream osname;
00405   osname << "l" << "Muc" << "P" << part << "S" << segment << "G" << gap << "SP";
00406 
00407   return GetLogicalVolume( osname.str() );
00408 }
00409   
00410 TGeoVolume*
00411 MucROOTGeo::GetVolumeStrip( int part, int seg, int gap, int strip )
00412 {
00413   std::stringstream osname;
00414   if(strip < 10) {
00415     osname << "l" << "Muc" << "P" << part << "S" << "0" << "G" << gap << "s" << "00" << strip; 
00416   }
00417   else if(strip<100){
00418     osname << "l" << "Muc" << "P" << part << "S" << "0" << "G" << gap << "s" << "0" << strip; 
00419   }
00420   else {
00421     osname << "l" << "Muc" << "P" << part << "S" << "0" << "G" << gap << "s" << strip; 
00422   }
00423   
00424   return GetLogicalVolume( osname.str() );
00425 }
00426   
00427 TGeoVolume* 
00428 MucROOTGeo::GetVolumeGasChamber( int part, int seg, int gap, int panel, int gasChamber )
00429 {
00430   std::stringstream osname;
00431   osname << "l" << "Muc" << "P" << part << "S" << "0" << "G" << gap << "R" << gasChamber << "Pn" << panel << "C";
00432 
00433   return GetLogicalVolume( osname.str() );
00434 }
00435 
00436 TGeoVolume* 
00437 MucROOTGeo::GetVolumeBakelite( int part, int seg, int gap, int panel, int bakelite )
00438 {
00439   std::stringstream osname;
00440   osname << "l" << "Muc" << "P" << part << "S" << "0" << "G" << gap << "R" << panel << "B" << bakelite;
00441   
00442   return GetLogicalVolume( osname.str() );
00443 }
00444 
00445 TGeoNode*
00446 MucROOTGeo::GetGap( int part, int seg, int gap )
00447 {
00448   if (m_NodeGap[part][seg][gap] != 0) {
00449     return m_NodeGap[part][seg][gap];
00450   }
00451   else {
00452     std::cout << "Node: " << "Part" << part << "Seg" << seg << "Gap" << gap << " not found" << std::endl;
00453     return 0;
00454   } 
00455 }
00456 
00457 // TGeoNode*
00458 // MucROOTGeo::GetAluminumBox( int part, int seg, int gap )
00459 // {
00460 //   if (m_NodeAluminumBox[part][seg][gap] != 0) {
00461 //     return m_NodeAluminumBox[part][seg][gap];
00462 //   }
00463 //   else {
00464 //     std::cout << "Node: " << "Part" << part << "Seg" << seg << "Gap" << gap << "AluminumBox" << " not found" << std::endl;
00465 //     return 0;
00466 //   } 
00467 // }
00468 
00469 
00470 TGeoNode*
00471 MucROOTGeo::GetStripPlane( int part, int seg, int gap )
00472 {
00473   if (m_NodeStripPlane[part][seg][gap] != 0) {
00474     return m_NodeStripPlane[part][seg][gap];
00475   }
00476   else {
00477     std::cout << "Node: " << "Part" << part << "Seg" << seg << "Gap" << gap << "StripPlane" << " not found" << std::endl;
00478     return 0;
00479   }
00480 }
00481     
00482 TGeoNode*
00483 MucROOTGeo::GetStrip( int part, int seg, int gap, int strip )
00484 {
00485   if (m_NodeStrip[part][seg][gap][strip] != 0) {
00486     return m_NodeStrip[part][seg][gap][strip];
00487   }
00488   else {
00489     std::cout << "Node: " << "Part" << part << "Seg" << "0" << "Gap" << gap << "Strip" << strip << " not found" << std::endl;
00490     return 0;
00491   } 
00492 }
00493 
00494 TGeoPhysicalNode*
00495 MucROOTGeo::GetPhysicalGap( int part, int seg, int gap )
00496 {
00497   if (m_PhysicalGap[part][seg][gap] != 0) {
00498     return m_PhysicalGap[part][seg][gap];
00499   }
00500   else {
00501     std::cout << "PhysicalNode: " << "Part" << part << "Seg" << seg << "Gap" << gap << " not found" << std::endl;
00502     return 0;
00503   } 
00504 }
00505 
00506 // TGeoPhysicalNode*
00507 // MucROOTGeo::GetPhysicalAluminumBox( int part, int seg, int gap )
00508 // {
00509 //   if (m_PhysicalAluminumBox[part][seg][gap] != 0) {
00510 //     return m_PhysicalAluminumBox[part][seg][gap];
00511 //   }
00512 //   else {
00513 //     std::cout << "PhysicalNode: " << "Part" << part << "Seg" << seg << "Gap" << gap << "AluminumBox" << " not found" << std::endl;
00514 //     return 0;
00515 //   } 
00516 // }
00517 
00518 TGeoPhysicalNode*
00519 MucROOTGeo::GetPhysicalStrip( int part, int seg, int gap, int strip )
00520 {
00521   if (m_PhysicalStrip[part][seg][gap][strip] != 0) {
00522     return m_PhysicalStrip[part][seg][gap][strip];
00523   }
00524   else {
00525     std::cout << "PhysicalNode: " << "Part" << part << "Seg" << seg << "Gap" << gap << "Strip" << strip << " not found" << std::endl;
00526     return 0;
00527   } 
00528 }

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