00001 #include "BDSBeamPipeFactoryBase.hh"
00002 #include "BDSBeamPipeFactoryCircular.hh"
00003 #include "BDSBeamPipe.hh"
00004
00005 #include "BDSDebug.hh"
00006 #include "BDSExecOptions.hh"
00007 #include "BDSGlobalConstants.hh"
00008 #include "BDSSDManager.hh"
00009
00010 #include "globals.hh"
00011 #include "G4CutTubs.hh"
00012 #include "G4LogicalVolume.hh"
00013 #include "G4Material.hh"
00014 #include "G4ThreeVector.hh"
00015 #include "G4Tubs.hh"
00016 #include "G4VSolid.hh"
00017
00018 #include <cmath>
00019 #include <utility>
00020
00021
00022 BDSBeamPipeFactoryCircular* BDSBeamPipeFactoryCircular::_instance = 0;
00023
00024 BDSBeamPipeFactoryCircular* BDSBeamPipeFactoryCircular::Instance()
00025 {
00026 if (_instance == 0)
00027 {_instance = new BDSBeamPipeFactoryCircular();}
00028 return _instance;
00029 }
00030
00031 BDSBeamPipeFactoryCircular::BDSBeamPipeFactoryCircular():BDSBeamPipeFactoryBase()
00032 {
00033 }
00034
00035 BDSBeamPipeFactoryCircular::~BDSBeamPipeFactoryCircular()
00036 {
00037 _instance = 0;
00038 }
00039
00040 BDSBeamPipe* BDSBeamPipeFactoryCircular::CreateBeamPipe(G4String nameIn,
00041 G4double lengthIn,
00042 G4double aper1In,
00043 G4double ,
00044 G4double ,
00045 G4double ,
00046 G4Material* vacuumMaterialIn,
00047 G4double beamPipeThicknessIn,
00048 G4Material* beamPipeMaterialIn
00049 )
00050 {
00051 #ifdef BDSDEBUG
00052 G4cout << __METHOD_NAME__ << G4endl;
00053 #endif
00054
00055 CleanUp();
00056
00057
00058 TestInputParameters(vacuumMaterialIn,beamPipeThicknessIn,beamPipeMaterialIn,aper1In);
00059
00060
00061 vacuumSolid = new G4Tubs(nameIn + "_vacuum_solid",
00062 0,
00063 aper1In,
00064 lengthIn*0.5-2*lengthSafety,
00065 0,
00066 CLHEP::twopi);
00067
00068 beamPipeSolid = new G4Tubs(nameIn + "_pipe_solid",
00069 aper1In + lengthSafety,
00070 aper1In + beamPipeThicknessIn,
00071 (lengthIn*0.5)-2*lengthSafety,
00072 0,
00073 CLHEP::twopi);
00074
00075 G4double containerRadius = aper1In + beamPipeThicknessIn + lengthSafety;
00076 containerSolid = new G4Tubs(nameIn + "_container_solid",
00077 0,
00078 containerRadius,
00079 (lengthIn*0.5)-lengthSafety,
00080 0,
00081 CLHEP::twopi);
00082
00083 return CommonFinalConstruction(nameIn, vacuumMaterialIn, beamPipeMaterialIn, lengthIn, containerRadius);
00084 }
00085
00086 BDSBeamPipe* BDSBeamPipeFactoryCircular::CreateBeamPipeAngledInOut(G4String nameIn,
00087 G4double lengthIn,
00088 G4double angleInIn,
00089 G4double angleOutIn,
00090 G4double aper1In,
00091 G4double ,
00092 G4double ,
00093 G4double ,
00094 G4Material* vacuumMaterialIn,
00095 G4double beamPipeThicknessIn,
00096 G4Material* beamPipeMaterialIn
00097 )
00098 {
00099 #ifdef BDSDEBUG
00100 G4cout << __METHOD_NAME__ << G4endl;
00101 #endif
00102
00103 CleanUp();
00104
00105
00106 TestInputParameters(vacuumMaterialIn,beamPipeThicknessIn,beamPipeMaterialIn,aper1In);
00107
00108 std::pair<G4ThreeVector,G4ThreeVector> faces = CalculateFaces(angleInIn, angleOutIn);
00109 G4ThreeVector inputface = faces.first;
00110 G4ThreeVector outputface = faces.second;
00111
00112 G4double containerRadius = aper1In + beamPipeThicknessIn + lengthSafety;
00113
00114 CreateGeneralAngledSolids(nameIn, lengthIn, aper1In, beamPipeThicknessIn, inputface, outputface);
00115
00116 return CommonFinalConstruction(nameIn, vacuumMaterialIn, beamPipeMaterialIn, lengthIn, containerRadius);
00117 }
00118
00120
00122 void BDSBeamPipeFactoryCircular::TestInputParameters(G4Material*& vacuumMaterialIn,
00123 G4double& beamPipeThicknessIn,
00124 G4Material*& beamPipeMaterialIn,
00125 G4double& aper1In)
00126 {
00127 BDSBeamPipeFactoryBase::TestInputParameters(vacuumMaterialIn,beamPipeThicknessIn,beamPipeMaterialIn);
00128
00129 if (aper1In < 1e-10)
00130 {aper1In = BDSGlobalConstants::Instance()->GetBeamPipeRadius();}
00131 }
00132
00135 BDSBeamPipe* BDSBeamPipeFactoryCircular::CommonFinalConstruction(G4String nameIn,
00136 G4Material* vacuumMaterialIn,
00137 G4Material* beamPipeMaterialIn,
00138 G4double lengthIn,
00139 G4double containerRadiusIn)
00140 {
00141 #ifdef BDSDEBUG
00142 G4cout << __METHOD_NAME__ << G4endl;
00143 #endif
00144
00145
00146 containerSubtractionSolid = new G4Tubs(nameIn + "_container_sub_solid",
00147 0,
00148 containerRadiusIn,
00149 lengthIn,
00150 0,
00151 CLHEP::twopi);
00152
00153 BDSBeamPipeFactoryBase::CommonConstruction(nameIn,
00154 vacuumMaterialIn,
00155 beamPipeMaterialIn,
00156 lengthIn);
00157
00158
00159
00160
00161 std::pair<double,double> extX = std::make_pair(-containerRadiusIn,containerRadiusIn);
00162 std::pair<double,double> extY = std::make_pair(-containerRadiusIn,containerRadiusIn);
00163 std::pair<double,double> extZ = std::make_pair(-lengthIn*0.5,lengthIn*0.5);
00164
00165 return BDSBeamPipeFactoryBase::BuildBeamPipeAndRegisterVolumes(extX,extY,extZ,
00166 containerRadiusIn);
00167
00168 }
00169
00172 void BDSBeamPipeFactoryCircular::CreateGeneralAngledSolids(G4String nameIn,
00173 G4double lengthIn,
00174 G4double aper1In,
00175 G4double beamPipeThicknessIn,
00176 G4ThreeVector inputfaceIn,
00177 G4ThreeVector outputfaceIn)
00178 {
00179
00180 vacuumSolid = new G4CutTubs(nameIn + "_vacuum_solid",
00181 0,
00182 aper1In,
00183 lengthIn*0.5-2*lengthSafety,
00184 0,
00185 CLHEP::twopi,
00186 inputfaceIn,
00187 outputfaceIn );
00188
00189
00190 beamPipeSolid = new G4CutTubs(nameIn + "_pipe_solid",
00191 aper1In + lengthSafety,
00192 aper1In + beamPipeThicknessIn,
00193 lengthIn*0.5-2*lengthSafety,
00194 0,
00195 CLHEP::twopi,
00196 inputfaceIn,
00197 outputfaceIn );
00198
00199
00200 containerSolid = new G4CutTubs(nameIn + "_container_solid",
00201 0,
00202 aper1In + beamPipeThicknessIn + lengthSafety,
00203 lengthIn*0.5-lengthSafety,
00204 0,
00205 CLHEP::twopi,
00206 inputfaceIn,
00207 outputfaceIn);
00208 }