19#include "BDSBeamPipeFactoryBase.hh"
20#include "BDSBeamPipeFactoryCircular.hh"
21#include "BDSBeamPipeFactoryElliptical.hh"
22#include "BDSBeamPipe.hh"
23#include "BDSExtent.hh"
24#include "BDSUtilities.hh"
27#include "G4EllipticalTube.hh"
28#include "G4CutTubs.hh"
29#include "G4IntersectionSolid.hh"
30#include "G4SubtractionSolid.hh"
31#include "G4ThreeVector.hh"
37BDSBeamPipeFactoryElliptical::BDSBeamPipeFactoryElliptical()
46 G4Material* vacuumMaterialIn,
47 G4double beamPipeThicknessIn,
48 G4Material* beamPipeMaterialIn,
55 if (aper1In == aper2In)
58 auto result = cf->
CreateBeamPipe(nameIn, lengthIn, aper2In, aper2In, aper3In, aper4In,
59 vacuumMaterialIn, beamPipeThicknessIn, beamPipeMaterialIn);
65 vacuumSolid =
new G4EllipticalTube(nameIn +
"_vacuum_solid",
70 G4VSolid* beamPipeSolidInner;
71 G4VSolid* beamPipeSolidOuter;
74 beamPipeSolidInner =
new G4EllipticalTube(nameIn +
"_pipe_solid_inner",
81 beamPipeSolidOuter =
new G4EllipticalTube(nameIn +
"_pipe_solid_outer",
85 beamPipeSolid =
new G4SubtractionSolid(nameIn +
"_pipe_solid",
91 containerSolid =
new G4EllipticalTube(nameIn +
"_container_solid",
97 lengthIn, containerXHalfWidth, containerYHalfWidth);
102 const G4ThreeVector& inputFaceNormalIn,
103 const G4ThreeVector& outputFaceNormalIn,
108 G4Material* vacuumMaterialIn,
109 G4double beamPipeThicknessIn,
110 G4Material* beamPipeMaterialIn,
117 if (aper1In == aper2In)
120 auto result = cf->
CreateBeamPipe(nameIn, lengthIn, inputFaceNormalIn, outputFaceNormalIn,
121 aper2In, aper2In, aper3In, aper4In,
122 vacuumMaterialIn, beamPipeThicknessIn, beamPipeMaterialIn);
130 G4double containerRadiusX = 0;
131 G4double containerRadiusY = 0;
136 lengthIn, containerRadiusX, containerRadiusY);
140 G4Material* vacuumMaterialIn,
141 G4Material* beamPipeMaterialIn,
143 G4double containerRadiusX,
144 G4double containerRadiusY)
154 beamPipeMaterialIn, lengthIn);
160 G4double containerRadius = std::max(containerRadiusX, containerRadiusY);
171 G4double beamPipeThicknessIn,
172 const G4ThreeVector& inputfaceIn,
173 const G4ThreeVector& outputfaceIn,
174 G4double& containerRadiusX,
175 G4double& containerRadiusY)
187 G4VSolid* vacuumSolidLong;
188 G4VSolid* beamPipeSolidLong;
189 G4VSolid* angledFaceSolid;
190 G4VSolid* containerSolidLong;
191 G4VSolid* angledFaceSolidContainer;
194 G4double angledFaceRadius = (std::max(aper1In,aper2In) + beamPipeThicknessIn)*2.0;
199 angledFaceSolid =
new G4CutTubs(nameIn +
"_angled_face",
211 vacuumSolidLong =
new G4EllipticalTube(nameIn +
"_vacuum_solid_long",
215 vacuumSolid =
new G4IntersectionSolid(nameIn +
"_vacuum_solid",
219 allSolids.insert(angledFaceSolid);
220 allSolids.insert(vacuumSolidLong);
222 G4VSolid* beamPipeSolidInner;
223 G4VSolid* beamPipeSolidOuter;
226 beamPipeSolidInner =
new G4EllipticalTube(nameIn +
"_pipe_solid_inner",
233 beamPipeSolidOuter =
new G4EllipticalTube(nameIn +
"_pipe_solid_outer",
234 aper1In + extraWidth,
235 aper2In + extraWidth,
237 beamPipeSolidLong =
new G4SubtractionSolid(nameIn +
"_pipe_solid_long",
240 allSolids.insert(beamPipeSolidInner);
241 allSolids.insert(beamPipeSolidOuter);
242 allSolids.insert(beamPipeSolidLong);
244 beamPipeSolid =
new G4IntersectionSolid(nameIn +
"_pipe_solid",
250 containerSolidLong =
new G4EllipticalTube(nameIn +
"_container_solid_long",
254 angledFaceSolidContainer =
new G4CutTubs(nameIn +
"_angled_face_container",
262 allSolids.insert(containerSolidLong);
263 allSolids.insert(angledFaceSolidContainer);
265 containerSolid =
new G4IntersectionSolid(nameIn +
"_container_solid",
267 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.
Factory for circular beam pipes.
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 &containerRadiusX, G4double &containerRadiusY)
BDSBeamPipe * CommonFinalConstruction(const G4String &nameIn, G4Material *vacuumMaterialIn, G4Material *beamPipeMaterialIn, G4double lengthIn, G4double containerRadiusX, G4double containerRadiusY)
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
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.