00001 #include "BDSWorld.hh"
00002 #include "BDSBeamlineNavigator.hh"
00003 #include "BDSMaterials.hh"
00004 #include "BDSTunnelCavity.hh"
00005 #include "G4Box.hh"
00006 #include "G4PVPlacement.hh"
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 BDSWorld::BDSWorld(){
00020 _size = new G4ThreeVector(0.,0.,0.);
00021 _material = BDSMaterials::Instance()->GetMaterial(BDSGlobalConstants::Instance()->GetSoilMaterialName()),
00022 build();
00023 G4cout << "BDSWorld - placing" << G4endl;
00024 place();
00025 }
00026
00027 BDSWorld::~BDSWorld(){
00028 delete _size;
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 }
00039
00040 void BDSWorld::build(){
00041 G4cout << "BDSWorld::build() - constructSolid()" << G4endl;
00042 constructSolid();
00043 G4cout << "BDSWorld::build() - constructLogical()" << G4endl;
00044 constructLogical();
00045 G4cout << "BDSWorld::build() - setVisAttributes()" << G4endl;
00046 setVisAttributes();
00047 G4cout << "BDSWorld::build() - setUseLimits()" << G4endl;
00048 setUserLimits();
00049 G4cout << "BDSWorld::build() - finished()" << G4endl;
00050 }
00051
00052
00053 void BDSWorld::constructSolid(){
00054 calcSize();
00055 G4cout << "BDSWorld::constructSolid - making solid volume..." << G4endl;
00056 _solidVolume = new G4Box("World", _size->x(), _size->y(), _size->z());
00057 _solidVolume->DumpInfo();
00058 }
00059
00060 void BDSWorld::calcSize(){
00061 G4cout << "BDSWorld::calcSize() - " << G4endl;
00062 _size->setX((BDSTunnelCavity::Instance()->widthMax()->x()+BDSGlobalConstants::Instance()->GetTunnelSoilThickness())/2.0);
00063 _size->setY((BDSTunnelCavity::Instance()->widthMax()->y()+BDSGlobalConstants::Instance()->GetTunnelSoilThickness())/2.0);
00064 _size->setZ((BDSTunnelCavity::Instance()->widthMax()->z())/2.0);
00065 G4cout << "BDSWorld::calcSize() - size x, y, z = " << _size->x()/m << " " << _size->y()/m << " " << _size->z()/m << " m" << G4endl;
00066 }
00067
00068 void BDSWorld::constructLogical(){
00069 G4cout << "BDSWorld::constructLogical - making logical volume..." << G4endl;
00070 _logicalVolume = new G4LogicalVolume(_solidVolume,
00071 _material,
00072 "world_logical");
00073 G4cout << "BDSWorld::constructLogical - finished." << G4endl;
00074 }
00075
00076 void BDSWorld::setVisAttributes(){
00077 _visAttributes = new G4VisAttributes(true);
00078 _logicalVolume->SetVisAttributes(_visAttributes);
00079 }
00080
00081 void BDSWorld::setUserLimits(){
00082 #ifndef NOUSERLIMITS
00083 _userLimits =new G4UserLimits();
00084 _userLimits->SetMaxAllowedStep(10*m);
00085 _userLimits->SetUserMinEkine(BDSGlobalConstants::Instance()->GetThresholdCutCharged());
00086 _userLimits->SetUserMaxTime(BDSGlobalConstants::Instance()->GetMaxTime());
00087 _logicalVolume->SetUserLimits(_userLimits);
00088 #endif
00089 }
00090
00091 void BDSWorld::place(){
00092 G4cout << "BDSWorld::place - " << G4endl;
00093 G4ThreeVector zeroThreeVector = G4ThreeVector(0,0,0);
00094 _physicalVolume = new G4PVPlacement(0,
00095 zeroThreeVector,
00096 _logicalVolume,
00097 "world_physical_volume",
00098 NULL,
00099 false,
00100 0,
00101 false
00102 );
00103
00104 }
00105
00106 G4VPhysicalVolume* BDSWorld::physicalVolume(){
00107 return _physicalVolume;
00108 }
00109
00110 G4LogicalVolume* BDSWorld::logicalVolume(){
00111 return _logicalVolume;
00112
00113 }
00114
00115 G4UserLimits* BDSWorld::userLimits(){
00116 return _userLimits;
00117 }