src/BDSTunnelCavity.cc

00001 #include "BDSTunnelCavity.hh"
00002 #include "BDSBeamline.hh"
00003 #include "BDSMaterials.hh"
00004 #include "G4UnionSolid.hh"
00005 
00006 
00007 BDSTunnelCavity* BDSTunnelCavity::_instance = 0;
00008 
00009 BDSTunnelCavity* BDSTunnelCavity::Instance(){
00010   if(_instance==0){
00011     _instance = new BDSTunnelCavity();
00012   }
00013   return _instance;
00014 }
00015 
00016 BDSTunnelCavity::BDSTunnelCavity(){
00017   _first=true;
00018   _straightSectionBuilder = new BDSStraightTunnelCavitySectionBuilder();
00019   _angleSectionBuilder = new BDSAngleTunnelCavitySectionBuilder();
00020   _widthMax = new G4ThreeVector(0,0,0);
00021   build();
00022 }
00023 
00024 BDSTunnelCavity::~BDSTunnelCavity(){
00025   delete _straightSectionBuilder;
00026   delete _angleSectionBuilder;
00027   delete _widthMax;
00028   delete _solidVolume;
00029   delete _logicalVolume;
00030   delete _physicalVolume;
00031   delete _instance;
00032 }
00033 
00034 void BDSTunnelCavity::build(){
00035   inspectBeamline();
00036   for(BDSBeamline::Instance()->first();!BDSBeamline::Instance()->isDone();BDSBeamline::Instance()->next()){
00037     _acceleratorComponent = BDSBeamline::Instance()->currentItem();
00038     G4cout << "BDSTunnelCavity::build() - making tunnel cavity for " << _acceleratorComponent->GetName() << G4endl;
00039     
00040     constructSection();
00041     calcWidthMax();
00042     appendSection();    
00043   }
00044   G4cout << "BDSTunnelCavity::build() - constructing logical" << G4endl;
00045   constructLogical();
00046   G4cout << "BDSTunnelCavity::build() - finished" << G4endl;
00047 }
00048 
00049 
00050 void BDSTunnelCavity::constructSection(){
00051   //Select the appropriate builder
00052   if (_acceleratorComponent->GetAngle() != 0){
00053     _sectionGenerator.tunnelCavitySectionBuilder(_angleSectionBuilder);
00054   } else {
00055     _sectionGenerator.tunnelCavitySectionBuilder(_straightSectionBuilder);
00056   }
00057   //Build the tunnel section
00058   _sectionGenerator.constructTunnelCavitySection(_acceleratorComponent);
00059 }
00060 
00061 void BDSTunnelCavity::calcWidthMax(){
00062   _widthMax -> setX(2*(_acceleratorComponent->GetTunnelRadius() + std::abs(_acceleratorComponent->GetTunnelOffsetX() + BDSBeamline::Instance()->positionEnd()->x())));
00063   _widthMax -> setY(2*(_acceleratorComponent->GetTunnelRadius() + std::abs(BDSGlobalConstants::Instance()->GetTunnelOffsetY() + BDSBeamline::Instance()->positionEnd()->y())));
00064   _widthMax -> setZ(BDSBeamline::Instance()->positionEnd()->z());
00065 }
00066 
00067 G4ThreeVector* BDSTunnelCavity::widthMax(){
00068   return _widthMax;
00069 }
00070 
00071 void BDSTunnelCavity::appendSection(){ 
00072   G4cout << "BDSTunnelCavity::appendSection()" << G4endl;
00073   if(_first){
00074     _first=false;
00075     G4cout << "BDSTunnelCavity::appendSection() - making new solid volume" << G4endl;
00076     _solidVolume = _sectionGenerator.tunnelCavitySection()->solid();
00077   } else {
00078     G4cout << "BDSTunnelCavity::appendSection() - appending to solid volume" << G4endl;
00079     const G4String tunnelCavityName = "tunnelCavitySol";
00080     G4VSolid* solidVolumeCopy = _solidVolume->Clone();
00081     (*_solidVolume) = 
00082       G4UnionSolid(tunnelCavityName,
00083                    solidVolumeCopy,
00084                    _sectionGenerator.tunnelCavitySection()->solid(),
00085                    BDSBeamline::Instance()->rotation(),
00086                    *BDSBeamline::Instance()->positionFromCurrentCenter());
00087     G4cout << "BDSTunnelCavity::appendSection() - deleting solid volume copy" << G4endl;
00088     delete solidVolumeCopy;
00089   }
00090   G4cout << "BDSTunnelCavity::appendSection() - finished" << G4endl;
00091 }
00092 
00093   void BDSTunnelCavity::constructLogical(){
00094     G4cout << "BDSTunnelCavity::constructLogical() - making logical volume" << G4endl;
00095   const G4String logicalVolumeName = "tunnelCavityLog";
00096   _logicalVolume = new G4LogicalVolume(_solidVolume,
00097                                        //                                      BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetTunnelCavityMaterialName()),
00098                                        BDSMaterials::Instance()->GetMaterial("air"),
00099                                        logicalVolumeName);
00100   G4cout << "BDSTunnelCavity::constructLogical() - made logical volume" << G4endl;
00101 }
00102 
00103 void BDSTunnelCavity::inspectBeamline(){
00104   if (BDSBeamline::Instance()->size() == 0){
00105     G4Exception("BDSTunnelCavity: beam line is empty!", "-1", FatalException, "");
00106   }
00107 }

Generated on 27 Aug 2013 for BDSIM by  doxygen 1.4.7