00001 #include "BDSBeamPipeFactoryBase.hh"
00002 #include "BDSBeamPipeFactoryLHC.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 "G4Box.hh"
00012 #include "G4CutTubs.hh"
00013 #include "G4IntersectionSolid.hh"
00014 #include "G4LogicalVolume.hh"
00015 #include "G4Material.hh"
00016 #include "G4SubtractionSolid.hh"
00017 #include "G4ThreeVector.hh"
00018 #include "G4Tubs.hh"
00019 #include "G4VSolid.hh"
00020
00021 #include <cmath>
00022 #include <utility>
00023
00024
00025 BDSBeamPipeFactoryLHC* BDSBeamPipeFactoryLHC::_instance = 0;
00026
00027 BDSBeamPipeFactoryLHC* BDSBeamPipeFactoryLHC::Instance()
00028 {
00029 if (_instance == 0)
00030 {_instance = new BDSBeamPipeFactoryLHC();}
00031 return _instance;
00032 }
00033
00034 BDSBeamPipeFactoryLHC::BDSBeamPipeFactoryLHC():BDSBeamPipeFactoryBase()
00035 {
00036 }
00037
00038 BDSBeamPipeFactoryLHC::~BDSBeamPipeFactoryLHC()
00039 {
00040 _instance = 0;
00041 }
00042
00043 BDSBeamPipe* BDSBeamPipeFactoryLHC::CreateBeamPipe(G4String nameIn,
00044 G4double lengthIn,
00045 G4double aper1In,
00046 G4double aper2In,
00047 G4double aper3In,
00048 G4double ,
00049 G4Material* vacuumMaterialIn,
00050 G4double beamPipeThicknessIn,
00051 G4Material* beamPipeMaterialIn)
00052 {
00053 #ifdef BDSDEBUG
00054 G4cout << __METHOD_NAME__ << G4endl;
00055 #endif
00056
00057 CleanUp();
00058
00059
00060 TestInputParameters(vacuumMaterialIn,beamPipeThicknessIn,beamPipeMaterialIn,aper1In,aper2In,aper3In);
00061
00062
00063
00064 G4VSolid* vacCylSolid = new G4Tubs(nameIn + "_vacuum_cylinder",
00065 0,
00066 aper3In,
00067 lengthIn*0.5-2*lengthSafety,
00068 0,
00069 CLHEP::twopi);
00070
00071 G4VSolid* vacRectSolid = new G4Box(nameIn + "_vacuum_box",
00072 aper1In,
00073 aper2In,
00074 lengthIn);
00075
00076 vacuumSolid = new G4IntersectionSolid(nameIn + "_vacuum_solid",
00077 vacCylSolid,
00078 vacRectSolid);
00079
00080
00081
00082 G4VSolid* bpInnerCylSolid = new G4Tubs(nameIn + "_pipe_inner_cylinder",
00083 0,
00084 aper3In + lengthSafety,
00085 1.5*lengthIn,
00086 0,
00087 CLHEP::twopi);
00088
00089 G4VSolid* bpInnerRectSolid = new G4Box(nameIn + "_pipe_inner_box",
00090 aper1In + lengthSafety,
00091 aper2In + lengthSafety,
00092 1.7*lengthIn);
00093
00094 G4VSolid* bpInnerSolid = new G4IntersectionSolid(nameIn + "_pipe_inner_solid",
00095 bpInnerCylSolid,
00096 bpInnerRectSolid);
00097
00098
00099 G4VSolid* bpOuterCylSolid = new G4Tubs(nameIn + "_pipe_inner_cylinder",
00100 0,
00101 aper3In + beamPipeThicknessIn,
00102 (lengthIn*0.5)-2*lengthSafety,
00103 0,
00104 CLHEP::twopi);
00105
00106 G4VSolid* bpOuterRectSolid = new G4Box(nameIn + "_pipe_inner_box",
00107 aper1In + beamPipeThicknessIn,
00108 aper2In + beamPipeThicknessIn,
00109 lengthIn);
00110 G4VSolid* bpOuterSolid = new G4IntersectionSolid(nameIn + "_pipe_inner_solid",
00111 bpOuterCylSolid,
00112 bpOuterRectSolid);
00113
00114
00115 beamPipeSolid = new G4SubtractionSolid(nameIn + "_pipe_solid",
00116 bpOuterSolid,
00117 bpInnerSolid);
00118
00119
00120 G4VSolid* contCylSolid = new G4Tubs(nameIn + "_vacuum_cylinder",
00121 0,
00122 aper3In + beamPipeThicknessIn + lengthSafety,
00123 lengthIn*0.5,
00124 0,
00125 CLHEP::twopi);
00126
00127 G4VSolid* contRectSolid = new G4Box(nameIn + "_vacuum_box",
00128 aper1In + beamPipeThicknessIn + lengthSafety,
00129 aper2In + beamPipeThicknessIn + lengthSafety,
00130 lengthIn);
00131
00132 containerSolid = new G4IntersectionSolid(nameIn + "_vacuum_solid",
00133 contCylSolid,
00134 contRectSolid);
00135
00136 G4double width = aper3In + beamPipeThicknessIn + lengthSafety;
00137 G4double height = aper2In + beamPipeThicknessIn + lengthSafety;
00138
00139 CreateContainerSubtractionSolid(nameIn, lengthIn, beamPipeThicknessIn, aper1In, aper2In, aper3In);
00140
00141 return CommonFinalConstruction(nameIn, vacuumMaterialIn, beamPipeMaterialIn, lengthIn, width, height);
00142 }
00143
00144 BDSBeamPipe* BDSBeamPipeFactoryLHC::CreateBeamPipeAngledInOut(G4String nameIn,
00145 G4double lengthIn,
00146 G4double angleInIn,
00147 G4double angleOutIn,
00148 G4double aper1In,
00149 G4double aper2In,
00150 G4double aper3In,
00151 G4double ,
00152 G4Material* vacuumMaterialIn,
00153 G4double beamPipeThicknessIn,
00154 G4Material* beamPipeMaterialIn)
00155 {
00156 #ifdef BDSDEBUG
00157 G4cout << __METHOD_NAME__ << G4endl;
00158 #endif
00159
00160 CleanUp();
00161
00162
00163 TestInputParameters(vacuumMaterialIn,beamPipeThicknessIn,beamPipeMaterialIn,aper1In,aper2In,aper3In);
00164
00165 std::pair<G4ThreeVector,G4ThreeVector> faces = CalculateFaces(angleInIn, angleOutIn);
00166 G4ThreeVector inputface = faces.first;
00167 G4ThreeVector outputface = faces.second;
00168
00169 G4double width = aper3In + beamPipeThicknessIn + lengthSafety;
00170 G4double height = aper2In + beamPipeThicknessIn + lengthSafety;
00171
00172 CreateGeneralAngledSolids(nameIn, lengthIn, aper1In, aper2In, aper3In, beamPipeThicknessIn, inputface, outputface);
00173 CreateContainerSubtractionSolid(nameIn, lengthIn, beamPipeThicknessIn, aper1In, aper2In, aper3In);
00174
00175 return CommonFinalConstruction(nameIn, vacuumMaterialIn, beamPipeMaterialIn, lengthIn, width, height);
00176 }
00177
00179
00181 void BDSBeamPipeFactoryLHC::TestInputParameters(G4Material*& vacuumMaterialIn,
00182 G4double& beamPipeThicknessIn,
00183 G4Material*& beamPipeMaterialIn,
00184 G4double& aper1In,
00185 G4double& aper2In,
00186 G4double& aper3In)
00187 {
00188 BDSBeamPipeFactoryBase::TestInputParameters(vacuumMaterialIn,beamPipeThicknessIn,beamPipeMaterialIn);
00189
00190 if (aper1In < 1e-10)
00191 {aper1In = BDSGlobalConstants::Instance()->GetBeamPipeRadius();}
00192
00193 if (aper2In < 1e-10)
00194 {aper2In = BDSGlobalConstants::Instance()->GetAper2();}
00195
00196 if (aper3In < 1e-10)
00197 {aper3In = BDSGlobalConstants::Instance()->GetAper3();}
00198 }
00199
00202 BDSBeamPipe* BDSBeamPipeFactoryLHC::CommonFinalConstruction(G4String nameIn,
00203 G4Material* vacuumMaterialIn,
00204 G4Material* beamPipeMaterialIn,
00205 G4double lengthIn,
00206 G4double containerWidthIn,
00207 G4double containerHeightIn)
00208 {
00209 #ifdef BDSDEBUG
00210 G4cout << __METHOD_NAME__ << G4endl;
00211 #endif
00212
00213 BDSBeamPipeFactoryBase::CommonConstruction(nameIn,
00214 vacuumMaterialIn,
00215 beamPipeMaterialIn,
00216 lengthIn);
00217
00218
00219 std::pair<double,double> extX = std::make_pair(-containerWidthIn,containerWidthIn);
00220 std::pair<double,double> extY = std::make_pair(-containerHeightIn,containerHeightIn);
00221 std::pair<double,double> extZ = std::make_pair(-lengthIn*0.5,lengthIn*0.5);
00222
00223
00224 return BuildBeamPipeAndRegisterVolumes(extX,extY,extZ,containerWidthIn);
00225 }
00226
00227
00230 void BDSBeamPipeFactoryLHC::CreateGeneralAngledSolids(G4String nameIn,
00231 G4double lengthIn,
00232 G4double aper1In,
00233 G4double aper2In,
00234 G4double aper3In,
00235 G4double beamPipeThicknessIn,
00236 G4ThreeVector inputfaceIn,
00237 G4ThreeVector outputfaceIn)
00238 {
00239
00240
00241 G4VSolid* vacCylSolid = new G4CutTubs(nameIn + "_vacuum_cylinder",
00242 0,
00243 aper3In,
00244 lengthIn*0.5-2*lengthSafety,
00245 0,
00246 CLHEP::twopi,
00247 inputfaceIn,
00248 outputfaceIn);
00249
00250 G4VSolid* vacRectSolid = new G4Box(nameIn + "_vacuum_box",
00251 aper1In,
00252 aper2In,
00253 lengthIn);
00254
00255 vacuumSolid = new G4IntersectionSolid(nameIn + "_vacuum_solid",
00256 vacCylSolid,
00257 vacRectSolid);
00258
00259
00260
00261 G4VSolid* bpInnerCylSolid = new G4CutTubs(nameIn + "_pipe_inner_cylinder",
00262 0,
00263 aper3In + lengthSafety,
00264 1.5*lengthIn,
00265 0,
00266 CLHEP::twopi,
00267 inputfaceIn,
00268 outputfaceIn);
00269
00270
00271 G4VSolid* bpInnerRectSolid = new G4Box(nameIn + "_pipe_inner_box",
00272 aper1In + lengthSafety,
00273 aper2In + lengthSafety,
00274 1.7*lengthIn);
00275
00276 G4VSolid* bpInnerSolid = new G4IntersectionSolid(nameIn + "_pipe_inner_solid",
00277 bpInnerCylSolid,
00278 bpInnerRectSolid);
00279
00280
00281 G4VSolid* bpOuterCylSolid = new G4CutTubs(nameIn + "_pipe_inner_cylinder",
00282 0,
00283 aper3In + beamPipeThicknessIn,
00284 (lengthIn*0.5)-2*lengthSafety,
00285 0,
00286 CLHEP::twopi,
00287 inputfaceIn,
00288 outputfaceIn);
00289
00290
00291 G4VSolid* bpOuterRectSolid = new G4Box(nameIn + "_pipe_inner_box",
00292 aper1In + beamPipeThicknessIn,
00293 aper2In + beamPipeThicknessIn,
00294 lengthIn);
00295 G4VSolid* bpOuterSolid = new G4IntersectionSolid(nameIn + "_pipe_inner_solid",
00296 bpOuterCylSolid,
00297 bpOuterRectSolid);
00298
00299
00300 beamPipeSolid = new G4SubtractionSolid(nameIn + "_pipe_solid",
00301 bpOuterSolid,
00302 bpInnerSolid);
00303
00304
00305 G4VSolid* contCylSolid = new G4CutTubs(nameIn + "_vacuum_cylinder",
00306 0,
00307 aper3In + beamPipeThicknessIn + lengthSafety,
00308 lengthIn*0.5,
00309 0,
00310 CLHEP::twopi,
00311 inputfaceIn,
00312 outputfaceIn);
00313
00314
00315 G4VSolid* contRectSolid = new G4Box(nameIn + "_vacuum_box",
00316 aper1In + beamPipeThicknessIn + lengthSafety,
00317 aper2In + beamPipeThicknessIn + lengthSafety,
00318 lengthIn);
00319
00320 containerSolid = new G4IntersectionSolid(nameIn + "_vacuum_solid",
00321 contCylSolid,
00322 contRectSolid);
00323 }
00324
00325 void BDSBeamPipeFactoryLHC::CreateContainerSubtractionSolid(G4String& nameIn,
00326 G4double& lengthIn,
00327 G4double& beamPipeThicknessIn,
00328 G4double& aper1In,
00329 G4double& aper2In,
00330 G4double& aper3In)
00331 {
00332
00333 G4VSolid* contSubCylSolid = new G4Tubs(nameIn + "_subtraction_cylinder",
00334 0,
00335 aper3In + beamPipeThicknessIn + lengthSafety,
00336 2*lengthIn,
00337 0,
00338 CLHEP::twopi);
00339
00340 G4VSolid* contSubRectSolid = new G4Box(nameIn + "_subtraction_box",
00341 aper1In + beamPipeThicknessIn + lengthSafety,
00342 aper2In + beamPipeThicknessIn + lengthSafety,
00343 1.7*lengthIn);
00344
00345 containerSubtractionSolid = new G4IntersectionSolid(nameIn + "_subtraction_solid",
00346 contSubCylSolid,
00347 contSubRectSolid);
00348 }