19#include "BDSBeamPipeFactoryBase.hh"
20#include "BDSBeamPipeFactoryLHC.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"
39BDSBeamPipeFactoryLHC::BDSBeamPipeFactoryLHC()
48 G4Material* vacuumMaterialIn,
49 G4double beamPipeThicknessIn,
50 G4Material* beamPipeMaterialIn,
59 G4VSolid* vacCylSolid =
new G4Tubs(nameIn +
"_vacuum_cylinder",
66 G4VSolid* vacRectSolid =
new G4Box(nameIn +
"_vacuum_box",
70 allSolids.insert(vacCylSolid);
71 allSolids.insert(vacRectSolid);
73 vacuumSolid =
new G4IntersectionSolid(nameIn +
"_vacuum_solid",
79 G4VSolid* bpInnerCylSolid =
new G4Tubs(nameIn +
"_pipe_inner_cylinder",
86 G4VSolid* bpInnerRectSolid =
new G4Box(nameIn +
"_pipe_inner_box",
91 G4VSolid* bpInnerSolid =
new G4IntersectionSolid(nameIn +
"_pipe_inner_solid",
97 G4VSolid* bpOuterCylSolid =
new G4Tubs(nameIn +
"_pipe_inner_cylinder",
104 G4VSolid* bpOuterRectSolid =
new G4Box(nameIn +
"_pipe_inner_box",
105 aper1In + extraWidth,
106 aper2In + extraWidth,
108 G4VSolid* bpOuterSolid =
new G4IntersectionSolid(nameIn +
"_pipe_inner_solid",
111 allSolids.insert(bpInnerCylSolid);
112 allSolids.insert(bpInnerRectSolid);
113 allSolids.insert(bpInnerSolid);
114 allSolids.insert(bpOuterCylSolid);
115 allSolids.insert(bpOuterRectSolid);
116 allSolids.insert(bpOuterSolid);
118 beamPipeSolid =
new G4SubtractionSolid(nameIn +
"_pipe_solid",
123 G4VSolid* contCylSolid =
new G4Tubs(nameIn +
"_vacuum_cylinder",
130 G4VSolid* contRectSolid =
new G4Box(nameIn +
"_vacuum_box",
135 allSolids.insert(contCylSolid);
136 allSolids.insert(contRectSolid);
138 containerSolid =
new G4IntersectionSolid(nameIn +
"_vacuum_solid",
152 const G4ThreeVector& inputFaceNormalIn,
153 const G4ThreeVector& outputFaceNormalIn,
158 G4Material* vacuumMaterialIn,
159 G4double beamPipeThicknessIn,
160 G4Material* beamPipeMaterialIn,
176 aper1In, aper2In, aper3In);
179 lengthIn, width, height);
183 G4Material* vacuumMaterialIn,
184 G4Material* beamPipeMaterialIn,
186 G4double containerWidthIn,
187 G4double containerHeightIn)
190 beamPipeMaterialIn, lengthIn);
207 G4double beamPipeThicknessIn,
208 const G4ThreeVector& inputfaceIn,
209 const G4ThreeVector& outputfaceIn)
216 G4VSolid* vacCylSolid =
new G4CutTubs(nameIn +
"_vacuum_cylinder",
225 G4VSolid* vacRectSolid =
new G4Box(nameIn +
"_vacuum_box",
229 allSolids.insert(vacCylSolid);
230 allSolids.insert(vacRectSolid);
232 vacuumSolid =
new G4IntersectionSolid(nameIn +
"_vacuum_solid",
238 G4VSolid* bpInnerCylSolid =
new G4CutTubs(nameIn +
"_pipe_inner_cylinder",
248 G4VSolid* bpInnerRectSolid =
new G4Box(nameIn +
"_pipe_inner_box",
253 G4VSolid* bpInnerSolid =
new G4IntersectionSolid(nameIn +
"_pipe_inner_solid",
259 G4VSolid* bpOuterCylSolid =
new G4CutTubs(nameIn +
"_pipe_inner_cylinder",
261 aper3In + extraWidth,
269 G4VSolid* bpOuterRectSolid =
new G4Box(nameIn +
"_pipe_inner_box",
270 aper1In + beamPipeThicknessIn,
271 aper2In + beamPipeThicknessIn,
273 G4VSolid* bpOuterSolid =
new G4IntersectionSolid(nameIn +
"_pipe_inner_solid",
277 allSolids.insert(bpInnerCylSolid);
278 allSolids.insert(bpInnerRectSolid);
279 allSolids.insert(bpInnerSolid);
280 allSolids.insert(bpOuterCylSolid);
281 allSolids.insert(bpOuterRectSolid);
282 allSolids.insert(bpOuterSolid);
284 beamPipeSolid =
new G4SubtractionSolid(nameIn +
"_pipe_solid",
289 G4VSolid* contCylSolid =
new G4CutTubs(nameIn +
"_vacuum_cylinder",
299 G4VSolid* contRectSolid =
new G4Box(nameIn +
"_vacuum_box",
304 allSolids.insert(contCylSolid);
305 allSolids.insert(contRectSolid);
307 containerSolid =
new G4IntersectionSolid(nameIn +
"_vacuum_solid",
314 G4double& beamPipeThicknessIn,
320 G4VSolid* contSubCylSolid =
new G4Tubs(nameIn +
"_subtraction_cylinder",
327 G4VSolid* contSubRectSolid =
new G4Box(nameIn +
"_subtraction_box",
331 allSolids.insert(contSubCylSolid);
332 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.