18#include "BDSBeamPipeFactoryBase.hh"
19#include "BDSBeamPipeFactoryCircular.hh"
20#include "BDSBeamPipeFactoryElliptical.hh"
21#include "BDSBeamPipe.hh"
22#include "BDSExtent.hh"
23#include "BDSUtilities.hh"
26#include "G4EllipticalTube.hh"
27#include "G4CutTubs.hh"
28#include "G4IntersectionSolid.hh"
29#include "G4SubtractionSolid.hh"
30#include "G4ThreeVector.hh"
36BDSBeamPipeFactoryElliptical::BDSBeamPipeFactoryElliptical()
45 G4Material* vacuumMaterialIn,
46 G4double beamPipeThicknessIn,
47 G4Material* beamPipeMaterialIn,
54 if (aper1In == aper2In)
57 auto result = cf->
CreateBeamPipe(nameIn, lengthIn, aper2In, aper2In, aper3In, aper4In,
58 vacuumMaterialIn, beamPipeThicknessIn, beamPipeMaterialIn);
64 vacuumSolid =
new G4EllipticalTube(nameIn +
"_vacuum_solid",
69 G4VSolid* beamPipeSolidInner;
70 G4VSolid* beamPipeSolidOuter;
73 beamPipeSolidInner =
new G4EllipticalTube(nameIn +
"_pipe_solid_inner",
80 beamPipeSolidOuter =
new G4EllipticalTube(nameIn +
"_pipe_solid_outer",
84 beamPipeSolid =
new G4SubtractionSolid(nameIn +
"_pipe_solid",
90 containerSolid =
new G4EllipticalTube(nameIn +
"_container_solid",
96 lengthIn, containerXHalfWidth, containerYHalfWidth);
101 const G4ThreeVector& inputFaceNormalIn,
102 const G4ThreeVector& outputFaceNormalIn,
107 G4Material* vacuumMaterialIn,
108 G4double beamPipeThicknessIn,
109 G4Material* beamPipeMaterialIn,
116 if (aper1In == aper2In)
119 auto result = cf->
CreateBeamPipe(nameIn, lengthIn, inputFaceNormalIn, outputFaceNormalIn,
120 aper2In, aper2In, aper3In, aper4In,
121 vacuumMaterialIn, beamPipeThicknessIn, beamPipeMaterialIn);
129 G4double containerRadiusX = 0;
130 G4double containerRadiusY = 0;
135 lengthIn, containerRadiusX, containerRadiusY);
139 G4Material* vacuumMaterialIn,
140 G4Material* beamPipeMaterialIn,
142 G4double containerRadiusX,
143 G4double containerRadiusY)
153 beamPipeMaterialIn, lengthIn);
159 G4double containerRadius = std::max(containerRadiusX, containerRadiusY);
170 G4double beamPipeThicknessIn,
171 const G4ThreeVector& inputfaceIn,
172 const G4ThreeVector& outputfaceIn,
173 G4double& containerRadiusX,
174 G4double& containerRadiusY)
186 G4VSolid* vacuumSolidLong;
187 G4VSolid* beamPipeSolidLong;
188 G4VSolid* angledFaceSolid;
189 G4VSolid* containerSolidLong;
190 G4VSolid* angledFaceSolidContainer;
193 G4double angledFaceRadius = (std::max(aper1In,aper2In) + beamPipeThicknessIn)*2.0;
198 angledFaceSolid =
new G4CutTubs(nameIn +
"_angled_face",
210 vacuumSolidLong =
new G4EllipticalTube(nameIn +
"_vacuum_solid_long",
214 vacuumSolid =
new G4IntersectionSolid(nameIn +
"_vacuum_solid",
218 allSolids.insert(angledFaceSolid);
219 allSolids.insert(vacuumSolidLong);
221 G4VSolid* beamPipeSolidInner;
222 G4VSolid* beamPipeSolidOuter;
225 beamPipeSolidInner =
new G4EllipticalTube(nameIn +
"_pipe_solid_inner",
232 beamPipeSolidOuter =
new G4EllipticalTube(nameIn +
"_pipe_solid_outer",
233 aper1In + extraWidth,
234 aper2In + extraWidth,
236 beamPipeSolidLong =
new G4SubtractionSolid(nameIn +
"_pipe_solid_long",
239 allSolids.insert(beamPipeSolidInner);
240 allSolids.insert(beamPipeSolidOuter);
241 allSolids.insert(beamPipeSolidLong);
243 beamPipeSolid =
new G4IntersectionSolid(nameIn +
"_pipe_solid",
249 containerSolidLong =
new G4EllipticalTube(nameIn +
"_container_solid_long",
253 angledFaceSolidContainer =
new G4CutTubs(nameIn +
"_angled_face_container",
261 allSolids.insert(containerSolidLong);
262 allSolids.insert(angledFaceSolidContainer);
264 containerSolid =
new G4IntersectionSolid(nameIn +
"_container_solid",
266 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.