00001 #ifndef BDSBEAMPIPEFACTORYBASE_H
00002 #define BDSBEAMPIPEFACTORYBASE_H
00003
00004 #include "BDSBeamPipe.hh"
00005
00006 #include "globals.hh"
00007 #include "G4Material.hh"
00008
00009 class G4UserLimits;
00010
00029 class BDSBeamPipeFactoryBase
00030 {
00031 public:
00032
00033
00034
00035
00036
00037
00038
00040 virtual BDSBeamPipe* CreateBeamPipe(G4String nameIn,
00041 G4double lengthIn,
00042 G4double aper1 = 0,
00043 G4double aper2 = 0,
00044 G4double aper3 = 0,
00045 G4double aper4 = 0,
00046 G4Material* vacuumMaterialIn = NULL,
00047 G4double beamPipeThicknessIn = 0,
00048 G4Material* beamPipeMaterialIn = NULL
00049 ) = 0;
00050
00052 virtual BDSBeamPipe* CreateBeamPipeAngledIn( G4String nameIn,
00053 G4double lengthIn,
00054 G4double angleInIn,
00055 G4double aper1 = 0,
00056 G4double aper2 = 0,
00057 G4double aper3 = 0,
00058 G4double aper4 = 0,
00059 G4Material* vacuumMaterialIn = NULL,
00060 G4double beamPipeThicknessIn = 0,
00061 G4Material* beamPipeMaterialIn = NULL
00062 );
00063
00065 virtual BDSBeamPipe* CreateBeamPipeAngledOut( G4String nameIn,
00066 G4double lengthIn,
00067 G4double angleOutIn,
00068 G4double aper1 = 0,
00069 G4double aper2 = 0,
00070 G4double aper3 = 0,
00071 G4double aper4 = 0,
00072 G4Material* vacuumMaterialIn = NULL,
00073 G4double beamPipeThicknessIn = 0,
00074 G4Material* beamPipeMaterialIn = NULL
00075 );
00076
00078 virtual BDSBeamPipe* CreateBeamPipeAngledInOut(G4String nameIn,
00079 G4double lengthIn,
00080 G4double angleInIn,
00081 G4double angleOutIn,
00082 G4double aper1 = 0,
00083 G4double aper2 = 0,
00084 G4double aper3 = 0,
00085 G4double aper4 = 0,
00086 G4Material* vacuumMaterialIn = NULL,
00087 G4double beamPipeThicknessIn = 0,
00088 G4Material* beamPipeMaterialIn = NULL
00089 ) = 0;
00090
00091 protected:
00093 BDSBeamPipeFactoryBase();
00094
00096 virtual void CleanUp();
00097
00099 void CommonConstruction(G4String nameIn,
00100 G4Material* vacuumMaterialIn,
00101 G4Material* beamPipeMaterialIn,
00102 G4double lengthIn);
00103
00105 BDSBeamPipe* BuildBeamPipeAndRegisterVolumes(std::pair<double,double> extX,
00106 std::pair<double,double> extY,
00107 std::pair<double,double> extZ,
00108 G4double containerRadius);
00109
00111 std::pair<G4ThreeVector,G4ThreeVector> CalculateFaces(G4double angleInIn,
00112 G4double angleOutIn);
00113
00114 void TestInputParameters(G4Material*& vacuumMaterialIn,
00115 G4double& beamPipeThicknessIn,
00116 G4Material*& beamPipeMaterialIn);
00117
00118
00119
00121 virtual void BuildLogicalVolumes(G4String nameIn,
00122 G4Material* vacuumMaterialIn,
00123 G4Material* beamPipeMaterialIn);
00125 virtual void SetVisAttributes();
00126
00128 virtual G4UserLimits* SetUserLimits(G4double lengthIn);
00129
00131 virtual void PlaceComponents(G4String nameIn);
00132
00133 protected:
00134 G4double lengthSafety;
00135 G4bool checkOverlaps;
00136 G4double maxStepFactor;
00137 G4double nSegmentsPerCircle;
00138 G4VSolid* vacuumSolid;
00139 G4VSolid* beamPipeSolid;
00140 G4VSolid* containerSolid;
00142 G4VSolid* containerSubtractionSolid;
00143 G4LogicalVolume* vacuumLV;
00144 G4LogicalVolume* beamPipeLV;
00145 G4LogicalVolume* containerLV;
00146
00147 };
00148
00149 #endif