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