18#include "BDSBeamPipeFactoryBase.hh"
19#include "BDSBeamPipeFactoryRectangular.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"
36BDSBeamPipeFactoryRectangular::BDSBeamPipeFactoryRectangular()
45 G4Material* vacuumMaterialIn,
46 G4double beamPipeThicknessIn,
47 G4Material* beamPipeMaterialIn,
55 vacuumSolid =
new G4Box(nameIn +
"_vacuum_solid",
60 G4VSolid* beamPipeSolidInner;
61 G4VSolid* beamPipeSolidOuter;
64 beamPipeSolidInner =
new G4Box(nameIn +
"_pipe_solid_inner",
71 beamPipeSolidOuter =
new G4Box(nameIn +
"_pipe_solid_outer",
75 allSolids.insert(beamPipeSolidInner);
76 allSolids.insert(beamPipeSolidOuter);
77 beamPipeSolid =
new G4SubtractionSolid(nameIn +
"_pipe_solid",
83 containerSolid =
new G4Box(nameIn +
"_container_solid",
89 lengthIn, containerHalfWidthX, containerHalfWidthY);
94 const G4ThreeVector& inputFaceNormalIn,
95 const G4ThreeVector& outputFaceNormalIn,
100 G4Material* vacuumMaterialIn,
101 G4double beamPipeThicknessIn,
102 G4Material* beamPipeMaterialIn,
112 G4double containerHalfWidthX = 0;
113 G4double containerHalfWidthY = 0;
118 lengthIn, containerHalfWidthX, containerHalfWidthY);
123 G4Material* vacuumMaterialIn,
124 G4Material* beamPipeMaterialIn,
126 G4double containerHalfWidthX,
127 G4double containerHalfWidthY)
136 beamPipeMaterialIn, lengthIn);
142 G4double containerRadius = std::hypot(containerHalfWidthX, containerHalfWidthY);
153 G4double beamPipeThicknessIn,
154 const G4ThreeVector& inputfaceIn,
155 const G4ThreeVector& outputfaceIn,
156 G4double& containerHalfWidthX,
157 G4double& containerHalfWidthY)
169 G4VSolid* vacuumSolidLong;
170 G4VSolid* beamPipeSolidLong;
171 G4VSolid* angledFaceSolid;
172 G4VSolid* containerSolidLong;
173 G4VSolid* angledFaceSolidContainer;
176 G4double angledFaceRadius = (std::max(aper1In,aper2In) + beamPipeThicknessIn)*2.0;
184 angledFaceSolid =
new G4CutTubs(nameIn +
"_angled_face",
193 vacuumSolidLong =
new G4Box(nameIn +
"_vacuum_solid_long",
198 allSolids.insert(angledFaceSolid);
199 allSolids.insert(vacuumSolidLong);
201 vacuumSolid =
new G4IntersectionSolid(nameIn +
"_vacuum_solid",
205 G4VSolid* beamPipeSolidInner;
206 G4VSolid* beamPipeSolidOuter;
209 beamPipeSolidInner =
new G4Box(nameIn +
"_pipe_solid_inner",
216 beamPipeSolidOuter =
new G4Box(nameIn +
"_pipe_solid_outer",
217 aper1In + extraWidth,
218 aper2In + extraWidth,
220 beamPipeSolidLong =
new G4SubtractionSolid(nameIn +
"_pipe_solid_long",
223 beamPipeSolid =
new G4IntersectionSolid(nameIn +
"_pipe_solid",
227 allSolids.insert(beamPipeSolidInner);
228 allSolids.insert(beamPipeSolidOuter);
229 allSolids.insert(beamPipeSolidLong);
233 containerSolidLong =
new G4Box(nameIn +
"_container_solid_long",
237 angledFaceSolidContainer =
new G4CutTubs(nameIn +
"_angled_face_container",
245 allSolids.insert(containerSolidLong);
246 allSolids.insert(angledFaceSolidContainer);
247 containerSolid =
new G4IntersectionSolid(nameIn +
"_container_solid",
249 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.