18#include "BDSBeamPipeFactoryBase.hh"
19#include "BDSColours.hh"
20#include "BDSColourFromMaterial.hh"
22#include "BDSException.hh"
23#include "BDSGlobalConstants.hh"
24#include "BDSMaterials.hh"
25#include "BDSSDType.hh"
26#include "BDSUtilities.hh"
29#include "G4LogicalVolume.hh"
30#include "G4Material.hh"
31#include "G4PVPlacement.hh"
32#include "G4ThreeVector.hh"
33#include "G4UserLimits.hh"
34#include "G4VisAttributes.hh"
48void BDSBeamPipeFactoryBase::CleanUp()
56 vacuumSolid =
nullptr;
57 beamPipeSolid =
nullptr;
58 containerSolid =
nullptr;
62 containerLV =
nullptr;
71 G4Material* vacuumMaterialIn,
72 G4Material* beamPipeMaterialIn,
75 allSolids.insert(vacuumSolid);
76 allSolids.insert(beamPipeSolid);
88 G4Material* vacuumMaterialIn,
89 G4Material* beamPipeMaterialIn)
92 vacuumLV =
new G4LogicalVolume(vacuumSolid,
94 nameIn +
"_vacuum_lv");
96 beamPipeLV =
new G4LogicalVolume(beamPipeSolid,
98 nameIn +
"_beampipe_lv");
101 containerLV =
new G4LogicalVolume(containerSolid,
103 nameIn +
"_container_lv");
104 allLogicalVolumes.insert(vacuumLV);
105 allLogicalVolumes.insert(beamPipeLV);
109 G4Material* vacuumMaterialIn)
112 G4Colour* c = cfm->GetColourWithDefault(beamPipeMaterialIn,
BDSColours::Instance()->GetColour(
"beampipe"));
113 G4VisAttributes* pipeVisAttr =
new G4VisAttributes(*c);
114 pipeVisAttr->SetVisibility(
true);
116 allVisAttributes.insert(pipeVisAttr);
117 beamPipeLV->SetVisAttributes(pipeVisAttr);
119 if (vacuumMaterialIn->GetDensity() > (1e-3*CLHEP::gram/CLHEP::cm3))
121 G4Colour* cv = cfm->GetColour(vacuumMaterialIn);
122 G4VisAttributes* vacVisAttr =
new G4VisAttributes(*cv);
123 vacVisAttr->SetVisibility(
true);
125 allVisAttributes.insert(vacVisAttr);
126 vacuumLV->SetVisAttributes(vacVisAttr);
140 {allUserLimits.insert(ul);}
141 vacuumLV->SetUserLimits(ul);
142 containerLV->SetUserLimits(ul);
144 G4UserLimits* beamPipeUL = ul;
147 beamPipeUL =
new G4UserLimits(*ul);
148 beamPipeUL->SetUserMinEkine(std::numeric_limits<double>::max());
149 allUserLimits.insert(beamPipeUL);
151 beamPipeLV->SetUserLimits(beamPipeUL);
159 vacuumPV =
new G4PVPlacement(
nullptr,
162 nameIn +
"_vacuum_pv",
168 beamPipePV =
new G4PVPlacement(
nullptr,
171 nameIn +
"_beampipe_pipe_pv",
176 allPhysicalVolumes.insert(vacuumPV);
177 allPhysicalVolumes.insert(beamPipePV);
181 G4double containerRadius,
182 G4bool containerIsCircular)
187 vacuumLV,containerIsCircular,containerRadius,
212 const G4ThreeVector &inputface,
213 const G4ThreeVector &outputface,
214 G4double beampipeRadius,
215 const G4String& name)
217 G4bool intersects =
BDS::WillIntersect(inputface.angle(), outputface.angle(), beampipeRadius*2, length);
220 {
throw BDSException(__METHOD_NAME__,
"a volume in the \"" + name +
"\" beam pipe geometry cannot be constructed as it's angled faces intersect within it's extent");}
G4ThreeVector outputFaceNormal
For recording the face normals in the finished pipe component.
G4bool storeApertureImpacts
Whether to store aperture impacts.
BDSBeamPipeFactoryBase()
base constructor
virtual void BuildLogicalVolumes(const G4String &nameIn, G4Material *vacuumMaterialIn, G4Material *beamPipeMaterialIn)
build logical volumes
virtual void SetVisAttributes(G4Material *beamPipeMaterialIn, G4Material *vacuumMaterialIn)
Set visual attributes.
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
G4bool sensitiveVacuum
Whether the vacuum will record any energy deposition.
BDSBeamPipe * BuildBeamPipeAndRegisterVolumes(BDSExtent extent, G4double containerRadius, G4bool containerIsCircular=false)
build beampipe and register logical volumes
virtual void PlaceComponents(const G4String &nameIn)
Place volumes.
G4bool sensitiveBeamPipe
Whether the beam pipe will record energy deposition.
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 void SetUserLimits(G4double length)
Set user limits.
A holder class for a piece of beam pipe geometry.
static BDSColourFromMaterial * Instance()
Singleton pattern.
static BDSColours * Instance()
singleton pattern
General exception with possible name of object and message.
Holder for +- extents in 3 dimensions.
G4bool checkOverlaps
Cache of global constants variable.
G4int nSegmentsPerCircle
Cache of global constants variable.
virtual void FactoryBaseCleanUp()
Empty containers for next use - factories are never deleted so can't rely on scope.
void RegisterLogicalVolume(G4LogicalVolume *logicalVolume)
void RegisterPhysicalVolume(G4VPhysicalVolume *physicalVolume)
void RegisterUserLimits(G4UserLimits *userLimit)
void RegisterVisAttributes(G4VisAttributes *visAttribute)
void RegisterSolid(G4VSolid *solid)
void RegisterSensitiveVolume(G4LogicalVolume *sensitiveVolume, BDSSDType sensitivityType)
A class that holds global options and constants.
static BDSGlobalConstants * Instance()
Access method.
static BDSMaterials * Instance()
Singleton pattern access.
G4Material * GetMaterial(G4String material) const
Get material by name.
G4bool WillIntersect(const G4ThreeVector &incomingNormal, const G4ThreeVector &outgoingNormal, const G4double &zSeparation, const BDSExtent &incomingExtent, const BDSExtent &outgoingExtent)
G4UserLimits * CreateUserLimits(G4UserLimits *defaultUL, G4double length, G4double fraction=1.6)