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
00052 if (_acceleratorComponent->GetAngle() != 0){
00053 _sectionGenerator.tunnelCavitySectionBuilder(_angleSectionBuilder);
00054 } else {
00055 _sectionGenerator.tunnelCavitySectionBuilder(_straightSectionBuilder);
00056 }
00057
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
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 }