18#include "BDSBeamPipeFactoryBase.hh"
19#include "BDSBeamPipeFactoryLHC.hh"
20#include "BDSBeamPipe.hh"
21#include "BDSExtent.hh"
22#include "BDSUtilities.hh"
26#include "G4CutTubs.hh"
27#include "G4IntersectionSolid.hh"
28#include "G4LogicalVolume.hh"
29#include "G4SubtractionSolid.hh"
30#include "G4ThreeVector.hh"
38BDSBeamPipeFactoryLHC::BDSBeamPipeFactoryLHC()
47 G4Material* vacuumMaterialIn,
48 G4double beamPipeThicknessIn,
49 G4Material* beamPipeMaterialIn,
58 G4VSolid* vacCylSolid =
new G4Tubs(nameIn +
"_vacuum_cylinder",
65 G4VSolid* vacRectSolid =
new G4Box(nameIn +
"_vacuum_box",
69 allSolids.insert(vacCylSolid);
70 allSolids.insert(vacRectSolid);
72 vacuumSolid =
new G4IntersectionSolid(nameIn +
"_vacuum_solid",
78 G4VSolid* bpInnerCylSolid =
new G4Tubs(nameIn +
"_pipe_inner_cylinder",
85 G4VSolid* bpInnerRectSolid =
new G4Box(nameIn +
"_pipe_inner_box",
90 G4VSolid* bpInnerSolid =
new G4IntersectionSolid(nameIn +
"_pipe_inner_solid",
96 G4VSolid* bpOuterCylSolid =
new G4Tubs(nameIn +
"_pipe_inner_cylinder",
103 G4VSolid* bpOuterRectSolid =
new G4Box(nameIn +
"_pipe_inner_box",
104 aper1In + extraWidth,
105 aper2In + extraWidth,
107 G4VSolid* bpOuterSolid =
new G4IntersectionSolid(nameIn +
"_pipe_inner_solid",
110 allSolids.insert(bpInnerCylSolid);
111 allSolids.insert(bpInnerRectSolid);
112 allSolids.insert(bpInnerSolid);
113 allSolids.insert(bpOuterCylSolid);
114 allSolids.insert(bpOuterRectSolid);
115 allSolids.insert(bpOuterSolid);
117 beamPipeSolid =
new G4SubtractionSolid(nameIn +
"_pipe_solid",
122 G4VSolid* contCylSolid =
new G4Tubs(nameIn +
"_vacuum_cylinder",
129 G4VSolid* contRectSolid =
new G4Box(nameIn +
"_vacuum_box",
134 allSolids.insert(contCylSolid);
135 allSolids.insert(contRectSolid);
137 containerSolid =
new G4IntersectionSolid(nameIn +
"_vacuum_solid",
151 const G4ThreeVector& inputFaceNormalIn,
152 const G4ThreeVector& outputFaceNormalIn,
157 G4Material* vacuumMaterialIn,
158 G4double beamPipeThicknessIn,
159 G4Material* beamPipeMaterialIn,
175 aper1In, aper2In, aper3In);
178 lengthIn, width, height);
182 G4Material* vacuumMaterialIn,
183 G4Material* beamPipeMaterialIn,
185 G4double containerWidthIn,
186 G4double containerHeightIn)
189 beamPipeMaterialIn, lengthIn);
206 G4double beamPipeThicknessIn,
207 const G4ThreeVector& inputfaceIn,
208 const G4ThreeVector& outputfaceIn)
215 G4VSolid* vacCylSolid =
new G4CutTubs(nameIn +
"_vacuum_cylinder",
224 G4VSolid* vacRectSolid =
new G4Box(nameIn +
"_vacuum_box",
228 allSolids.insert(vacCylSolid);
229 allSolids.insert(vacRectSolid);
231 vacuumSolid =
new G4IntersectionSolid(nameIn +
"_vacuum_solid",
237 G4VSolid* bpInnerCylSolid =
new G4CutTubs(nameIn +
"_pipe_inner_cylinder",
247 G4VSolid* bpInnerRectSolid =
new G4Box(nameIn +
"_pipe_inner_box",
252 G4VSolid* bpInnerSolid =
new G4IntersectionSolid(nameIn +
"_pipe_inner_solid",
258 G4VSolid* bpOuterCylSolid =
new G4CutTubs(nameIn +
"_pipe_inner_cylinder",
260 aper3In + extraWidth,
268 G4VSolid* bpOuterRectSolid =
new G4Box(nameIn +
"_pipe_inner_box",
269 aper1In + beamPipeThicknessIn,
270 aper2In + beamPipeThicknessIn,
272 G4VSolid* bpOuterSolid =
new G4IntersectionSolid(nameIn +
"_pipe_inner_solid",
276 allSolids.insert(bpInnerCylSolid);
277 allSolids.insert(bpInnerRectSolid);
278 allSolids.insert(bpInnerSolid);
279 allSolids.insert(bpOuterCylSolid);
280 allSolids.insert(bpOuterRectSolid);
281 allSolids.insert(bpOuterSolid);
283 beamPipeSolid =
new G4SubtractionSolid(nameIn +
"_pipe_solid",
288 G4VSolid* contCylSolid =
new G4CutTubs(nameIn +
"_vacuum_cylinder",
298 G4VSolid* contRectSolid =
new G4Box(nameIn +
"_vacuum_box",
303 allSolids.insert(contCylSolid);
304 allSolids.insert(contRectSolid);
306 containerSolid =
new G4IntersectionSolid(nameIn +
"_vacuum_solid",
313 G4double& beamPipeThicknessIn,
319 G4VSolid* contSubCylSolid =
new G4Tubs(nameIn +
"_subtraction_cylinder",
326 G4VSolid* contSubRectSolid =
new G4Box(nameIn +
"_subtraction_box",
330 allSolids.insert(contSubCylSolid);
331 allSolids.insert(contSubRectSolid);
G4ThreeVector outputFaceNormal
For recording the face normals in the finished pipe component.
G4ThreeVector inputFaceNormal
For recording the face normals in the finished pipe component.
void CommonConstruction(const G4String &nameIn, G4Material *vacuumMaterialIn, G4Material *beamPipeMaterialIn, G4double length)
finalise beampipe construction
BDSBeamPipe * BuildBeamPipeAndRegisterVolumes(BDSExtent extent, G4double containerRadius, G4bool containerIsCircular=false)
build beampipe and register logical volumes
G4VSolid * containerSubtractionSolid
Longer (in length) version of container solid for unambiguous subtraction.
virtual BDSBeamPipe * CreateBeamPipe(const G4String &nameIn, G4double lengthIn, G4double aper1=0, G4double aper2=0, G4double aper3=0, G4double aper4=0, G4Material *vacuumMaterialIn=nullptr, G4double beamPipeThicknessIn=0, G4Material *beamPipeMaterialIn=nullptr, const G4String &pointsFileIn="", const G4String &pointsUnitIn="")
create a flat ended beampipe
BDSBeamPipe * CommonFinalConstruction(const G4String &nameIn, G4Material *vacuumMaterialIn, G4Material *beamPipeMaterialIn, G4double lengthIn, G4double widthIn, G4double heightIn)
void CreateContainerSubtractionSolid(const G4String &nameIn, G4double &lengthIn, G4double &beamPipeThicknessIn, G4double &aper1In, G4double &aper2In, G4double &aper3In)
function to create the container subtraction solid and avoid passing aper1,2,3 around further
void CreateGeneralAngledSolids(const G4String &nameIn, G4double lengthIn, G4double aper1In, G4double aper2In, G4double aper3In, G4double beamPipeThicknessIn, const G4ThreeVector &inputfaceIn, const G4ThreeVector &outputfaceIn)
A holder class for a piece of beam pipe geometry.
Holder for +- extents in 3 dimensions.
G4double lengthSafety
Cache of global constants variable.
G4double lengthSafetyLarge
Cache of global constants variable.
G4double CalculateSafeAngledVolumeLength(G4double angleIn, G4double angleOut, G4double length, G4double containerWidth, G4double containerHeight=0)
Calculate safe length of an angled volume so it fills the length of its container.