19#include "BDSBeamPipeFactoryBase.hh"
20#include "BDSBeamPipeFactoryRectangular.hh"
21#include "BDSBeamPipe.hh"
22#include "BDSExtent.hh"
23#include "BDSUtilities.hh"
27#include "G4CutTubs.hh"
28#include "G4IntersectionSolid.hh"
29#include "G4LogicalVolume.hh"
30#include "G4SubtractionSolid.hh"
31#include "G4ThreeVector.hh"
37BDSBeamPipeFactoryRectangular::BDSBeamPipeFactoryRectangular()
46 G4Material* vacuumMaterialIn,
47 G4double beamPipeThicknessIn,
48 G4Material* beamPipeMaterialIn,
56 vacuumSolid =
new G4Box(nameIn +
"_vacuum_solid",
61 G4VSolid* beamPipeSolidInner;
62 G4VSolid* beamPipeSolidOuter;
65 beamPipeSolidInner =
new G4Box(nameIn +
"_pipe_solid_inner",
72 beamPipeSolidOuter =
new G4Box(nameIn +
"_pipe_solid_outer",
76 allSolids.insert(beamPipeSolidInner);
77 allSolids.insert(beamPipeSolidOuter);
78 beamPipeSolid =
new G4SubtractionSolid(nameIn +
"_pipe_solid",
84 containerSolid =
new G4Box(nameIn +
"_container_solid",
90 lengthIn, containerHalfWidthX, containerHalfWidthY);
95 const G4ThreeVector& inputFaceNormalIn,
96 const G4ThreeVector& outputFaceNormalIn,
101 G4Material* vacuumMaterialIn,
102 G4double beamPipeThicknessIn,
103 G4Material* beamPipeMaterialIn,
113 G4double containerHalfWidthX = 0;
114 G4double containerHalfWidthY = 0;
119 lengthIn, containerHalfWidthX, containerHalfWidthY);
124 G4Material* vacuumMaterialIn,
125 G4Material* beamPipeMaterialIn,
127 G4double containerHalfWidthX,
128 G4double containerHalfWidthY)
137 beamPipeMaterialIn, lengthIn);
143 G4double containerRadius = std::hypot(containerHalfWidthX, containerHalfWidthY);
154 G4double beamPipeThicknessIn,
155 const G4ThreeVector& inputfaceIn,
156 const G4ThreeVector& outputfaceIn,
157 G4double& containerHalfWidthX,
158 G4double& containerHalfWidthY)
170 G4VSolid* vacuumSolidLong;
171 G4VSolid* beamPipeSolidLong;
172 G4VSolid* angledFaceSolid;
173 G4VSolid* containerSolidLong;
174 G4VSolid* angledFaceSolidContainer;
177 G4double angledFaceRadius = (std::max(aper1In,aper2In) + beamPipeThicknessIn)*2.0;
185 angledFaceSolid =
new G4CutTubs(nameIn +
"_angled_face",
194 vacuumSolidLong =
new G4Box(nameIn +
"_vacuum_solid_long",
199 allSolids.insert(angledFaceSolid);
200 allSolids.insert(vacuumSolidLong);
202 vacuumSolid =
new G4IntersectionSolid(nameIn +
"_vacuum_solid",
206 G4VSolid* beamPipeSolidInner;
207 G4VSolid* beamPipeSolidOuter;
210 beamPipeSolidInner =
new G4Box(nameIn +
"_pipe_solid_inner",
217 beamPipeSolidOuter =
new G4Box(nameIn +
"_pipe_solid_outer",
218 aper1In + extraWidth,
219 aper2In + extraWidth,
221 beamPipeSolidLong =
new G4SubtractionSolid(nameIn +
"_pipe_solid_long",
224 beamPipeSolid =
new G4IntersectionSolid(nameIn +
"_pipe_solid",
228 allSolids.insert(beamPipeSolidInner);
229 allSolids.insert(beamPipeSolidOuter);
230 allSolids.insert(beamPipeSolidLong);
234 containerSolidLong =
new G4Box(nameIn +
"_container_solid_long",
238 angledFaceSolidContainer =
new G4CutTubs(nameIn +
"_angled_face_container",
246 allSolids.insert(containerSolidLong);
247 allSolids.insert(angledFaceSolidContainer);
248 containerSolid =
new G4IntersectionSolid(nameIn +
"_container_solid",
250 angledFaceSolidContainer);
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
static void CheckAngledVolumeCanBeBuilt(G4double length, const G4ThreeVector &inputfaceAngle, const G4ThreeVector &outputfaceAngle, G4double horizontalWidth, const G4String &name)
check if a beam pipe volume with angled faces can be constructed
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
void CreateGeneralAngledSolids(const G4String &nameIn, G4double lengthIn, G4double aper1In, G4double aper2In, G4double beamPipeThicknessIn, const G4ThreeVector &inputfaceIn, const G4ThreeVector &outputfaceIn, G4double &containerHalfWidthX, G4double &containerHalfWidthY)
BDSBeamPipe * CommonFinalConstruction(const G4String &nameIn, G4Material *vacuumMaterialIn, G4Material *beamPipeMaterialIn, G4double lengthIn, G4double containerHalfWidthX, G4double containerHalfWidthY)
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.