00001 #include "BDSMagnetOuterFactoryPolesFacet.hh"
00002
00003 #include "globals.hh"
00004
00005 #include "G4Box.hh"
00006 #include "G4Polyhedra.hh"
00007 #include "G4SubtractionSolid.hh"
00008 #include "G4ThreeVector.hh"
00009 #include "G4Tubs.hh"
00010 #include "G4VSolid.hh"
00011
00012 BDSMagnetOuterFactoryPolesFacet* BDSMagnetOuterFactoryPolesFacet::_instance = 0;
00013
00014 BDSMagnetOuterFactoryPolesFacet* BDSMagnetOuterFactoryPolesFacet::Instance()
00015 {
00016 if (_instance == 0)
00017 {_instance = new BDSMagnetOuterFactoryPolesFacet();}
00018 return _instance;
00019 }
00020
00021 BDSMagnetOuterFactoryPolesFacet::~BDSMagnetOuterFactoryPolesFacet()
00022 {
00023 _instance = 0;
00024 }
00025
00026 void BDSMagnetOuterFactoryPolesFacet::CreatePoleSolid(G4String name,
00027 G4double length,
00028 G4int order)
00029 {
00030
00031
00032
00033
00034 G4double tempPoleFinishRadius = poleFinishRadius;
00035 poleFinishRadius = 2*poleFinishRadius;
00036
00037
00038 BDSMagnetOuterFactoryPolesBase::CreatePoleSolid(name,length,order);
00039
00040 poleFinishRadius = tempPoleFinishRadius;
00041
00042 G4VSolid* baseClassPoleSolid = poleSolid;
00043
00044
00045
00046
00047 G4VSolid* subtractionBox = new G4Box(name + "_subtraction_box",
00048 poleFinishRadius,
00049 poleFinishRadius,
00050 length);
00051
00052
00053
00054
00055 G4ThreeVector boxTranslation(2*poleFinishRadius,0,0);
00056 poleSolid = new G4SubtractionSolid(name + "_pole_solid",
00057 baseClassPoleSolid,
00058 subtractionBox,
00059 0,
00060 boxTranslation);
00061
00062 }
00063
00064 void BDSMagnetOuterFactoryPolesFacet::CreateYokeAndContainerSolid(G4String name,
00065 G4double length,
00066 G4int order)
00067 {
00068 G4double segmentAngle = CLHEP::twopi / (2*order);
00069
00070 G4double zPlanes[2] = {-length*0.5, length*0.5};
00071 std::vector<G4double> innerRadii;
00072 std::vector<G4double> outerRadii;
00073 for (G4int i = 0; i < order*2; ++i)
00074 {
00075 innerRadii.push_back(yokeStartRadius);
00076 outerRadii.push_back(yokeFinishRadius);
00077 }
00078
00079 yokeSolid = new G4Polyhedra(name + "_yoke_solid",
00080 CLHEP::pi*0.5,
00081 CLHEP::twopi,
00082 2*order,
00083 2,
00084 zPlanes,
00085 innerRadii.data(),
00086 outerRadii.data());
00087
00088
00089
00090 G4double yokeExtent = yokeFinishRadius / cos(segmentAngle*0.5);
00091 containerSolid = new G4Tubs(name + "_container_solid",
00092 poleStartRadius,
00093 yokeExtent + lengthSafety,
00094 length*0.5,
00095 0,
00096 CLHEP::twopi);
00097
00098
00099 }