18#include "BDSMagnetOuterFactoryCylindrical.hh"
20#include "BDSBeamPipe.hh"
21#include "BDSColours.hh"
23#include "BDSExtent.hh"
24#include "BDSGeometryComponent.hh"
25#include "BDSGlobalConstants.hh"
26#include "BDSMagnetOuter.hh"
27#include "BDSMagnetOuterInfo.hh"
28#include "BDSMaterials.hh"
29#include "BDSSDType.hh"
30#include "BDSUtilities.hh"
33#include "G4CutTubs.hh"
34#include "G4LogicalVolume.hh"
35#include "G4Material.hh"
36#include "G4PVPlacement.hh"
37#include "G4SubtractionSolid.hh"
38#include "G4ThreeVector.hh"
40#include "G4VisAttributes.hh"
48BDSMagnetOuterFactoryCylindrical::BDSMagnetOuterFactoryCylindrical():
49 magnetContainerRadius(0)
55 magnetContainerRadius = 0;
61 G4double containerLength,
64 G4double horizontalWidth = recipe->horizontalWidth;
65 G4double angleIn = recipe->angleIn;
66 G4double angleOut = recipe->angleOut;
83 inputFaceNormal = faces.first;
84 outputFaceNormal = faces.second;
86 CreateCylindricalSolidsAngled(name, length, beamPipe, containerLength, horizontalWidth);
95 G4double containerLength,
98 G4double horizontalWidth = recipe->horizontalWidth;
99 G4double angleIn = recipe->angleIn;
100 G4double angleOut = recipe->angleOut;
118 inputFaceNormal = faces.first;
119 outputFaceNormal = faces.second;
121 CreateCylindricalSolidsAngled(name, length, beamPipe, containerLength, horizontalWidth);
131 G4double containerLength,
134 G4double horizontalWidth = recipe->horizontalWidth;
143 G4double containerLength,
146 G4double horizontalWidth = recipe->horizontalWidth;
155 G4double containerLength,
158 G4double horizontalWidth = recipe->horizontalWidth;
167 G4double containerLength,
170 G4double horizontalWidth = recipe->horizontalWidth;
179 G4double containerLength,
182 G4double horizontalWidth = recipe->horizontalWidth;
189 G4double outerRadius = horizontalWidth * 0.5;
191 if ( ((outerRadius - innerRadius)/outerRadius) < 0.05 )
196 G4double coilRadius = innerRadius + 0.25*(outerRadius - innerRadius);
197 G4double coilThickness = 0.05*coilRadius;
198 G4VSolid* sheetSolid =
new G4Tubs(name +
"_sheet_solid",
199 coilRadius-coilThickness,
200 coilRadius+coilThickness,
203 G4LogicalVolume* sheetLV =
new G4LogicalVolume(sheetSolid,
204 recipe->outerMaterial,
206 yokeLV = result->GetContainerLogicalVolume()->GetDaughter(0)->GetLogicalVolume();
208 auto sheetVis =
new G4VisAttributes(*sheetColour);
209 sheetLV->SetVisAttributes(sheetVis);
210 auto pv =
new G4PVPlacement(
nullptr,
218 result->RegisterSolid(sheetSolid);
219 result->RegisterLogicalVolume(sheetLV);
220 result->RegisterPhysicalVolume(pv);
221 result->RegisterVisAttributes(sheetVis);
228 G4double containerLength,
231 G4double horizontalWidth = recipe->horizontalWidth;
240 G4double containerLength,
243 G4double horizontalWidth = recipe->horizontalWidth;
252 G4double containerLength,
255 G4double horizontalWidth = recipe->horizontalWidth;
264 G4double containerLength,
268 G4double horizontalWidth = recipe->horizontalWidth;
280 G4double magnetContainerLength,
281 G4double horizontalWidth)
291 yokeSolid =
new G4Tubs(name +
"_yoke_solid",
301 containerSolid =
new G4Tubs(name +
"_container_solid",
310 G4VSolid* yokeSolidCylinder =
new G4Tubs(name +
"_yoke_solid_cylinder",
316 allSolids.insert(yokeSolidCylinder);
317 yokeSolid =
new G4SubtractionSolid(name +
"_yoke_solid",
322 G4VSolid* containerSolidCylinder =
new G4Tubs(name +
"_container_solid_cylinder",
328 allSolids.insert(containerSolidCylinder);
329 containerSolid =
new G4SubtractionSolid(name +
"_container_solid",
330 containerSolidCylinder,
337void BDSMagnetOuterFactoryCylindrical::CreateCylindricalSolidsAngled(G4String name,
340 G4double magnetContainerLength,
341 G4double horizontalWidth)
345 magnetContainerRadius = (0.5 * horizontalWidth) +
lengthSafety;
351 yokeSolid =
new G4CutTubs(name +
"_yoke_solid",
361 containerSolid =
new G4CutTubs(name +
"_container_solid",
372 G4VSolid* yokeSolidCylinder =
new G4CutTubs(name +
"_yoke_solid_cylinder",
380 allSolids.insert(yokeSolidCylinder);
381 yokeSolid =
new G4SubtractionSolid(name +
"_yoke_solid",
386 G4VSolid* containerSolidCylinder =
new G4CutTubs(name +
"_container_solid_cylinder",
394 allSolids.insert(containerSolidCylinder);
395 containerSolid =
new G4SubtractionSolid(name +
"_container_solid",
396 containerSolidCylinder,
403 G4double& horizontalWidth)
418 if ( (horizontalWidth < extentX) || (horizontalWidth < extentY) )
421 horizontalWidth = std::max(extentX,extentY) + 1*CLHEP::mm;
430 G4Material* outerMaterial = recipe->outerMaterial;
433 G4Colour* colour = recipe->colour;
437 CreateMagnetContainerComponent();
442 yokePV =
new G4PVPlacement(
nullptr,
A holder class for a piece of beam pipe geometry.
G4VSolid * GetContainerSubtractionSolid() const
default destructor sufficient as G4 manages solids and LVs
G4double GetContainerRadius() const
If it is circular, we need the radius.
G4bool ContainerIsCircular() const
G4Colour * GetColour(G4double red, G4double green, G4double blue, G4double alpha=1)
Get a cached anonymous colour by values.
static BDSColours * Instance()
singleton pattern
Holder for +- extents in 3 dimensions.
G4double DX() const
The difference in a dimension.
G4double DY() const
The difference in a dimension.
G4bool checkOverlaps
Cache of global constants variable.
G4double lengthSafety
Cache of global constants variable.
G4double lengthSafetyLarge
Cache of global constants variable.
BDSExtent GetExtent() const
Accessor - see member for more info.
void RegisterLogicalVolume(G4LogicalVolume *logicalVolume)
void RegisterPhysicalVolume(G4VPhysicalVolume *physicalVolume)
void RegisterVisAttributes(G4VisAttributes *visAttribute)
void RegisterSolid(G4VSolid *solid)
void RegisterSensitiveVolume(G4LogicalVolume *sensitiveVolume, BDSSDType sensitivityType)
static BDSGlobalConstants * Instance()
Access method.
virtual void CleanUp()
Empty containers for next use - factories are never deleted so can't rely on scope.
virtual void CreateLogicalVolumes(const G4String &name, G4Colour *colour, G4Material *outerMaterial)
void SetFaceNormals(BDSMagnetOuter *outer)
Copy face normals from members to an instance of outer.
virtual void SetUserLimits()
Attach default user limits to all logical volumes.
G4bool sensitiveOuter
Cache of global constants variable.
G4VSolid * yokeSolid
Solid for outer part that connects all poles.
void BuildMagnetContainerSolidStraight(const G4String &name, G4double magnetContainerLength, G4double magnetContainerRadius)
void BuildMagnetContainerSolidAngled(const G4String &name, G4double magnetContainerLength, G4double magnetContainerRadius, G4bool flatFaces=false)
virtual BDSMagnetOuter * CreateKicker(G4String name, G4double length, const BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe, G4bool vertical)
horizontal and vertical kicker outer volume
virtual BDSMagnetOuter * CreateMuonSpoiler(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)
muon spoiler outer volume
virtual BDSMagnetOuter * CreateSextupole(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)
sextupole outer volume
void CreateCylindricalSolids(G4String name, G4double length, const BDSBeamPipe *beamPipe, G4double magnetContainerLength, G4double boxSize)
Only really one function needed for this factory private to this factory only.
virtual BDSMagnetOuter * CreateRectangularBend(G4String name, G4double length, const BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)
rectangular bend outer volume
virtual BDSMagnetOuter * CreateMultipole(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)
general multipole outer volume - could be any 2N order multipole
virtual BDSMagnetOuter * CreateSectorBend(G4String name, G4double length, const BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)
sector bend outer volume
virtual BDSMagnetOuter * CreateDecapole(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)
decapole outer volume
BDSMagnetOuter * CommonFinalConstructor(G4String name, G4double length, const BDSMagnetOuterInfo *recipe)
virtual BDSMagnetOuter * CreateSolenoid(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)
solenoid outer volume
virtual BDSMagnetOuter * CreateQuadrupole(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)
quadrupole outer volume
virtual BDSMagnetOuter * CreateOctupole(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)
octupole outer volume
virtual BDSMagnetOuter * CreateRfCavity(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)
RF cavity outer volume.
virtual void CleanUp()
Empty containers for next use - factories are never deleted so can't rely on scope.
void TestInputParameters(const BDSBeamPipe *beamPipe, G4double &horizontalWidthIn)
test inputs for no null pointers or overlapping volumes due to poorly defined sizes
Holder struct of all information required to create the outer geometry of a magnet.
An object for both the returned magnet outer body but also a tight fitting container for the whole ma...
static BDSMaterials * Instance()
Singleton pattern access.
G4Material * GetMaterial(G4String material) const
Get material by name.
G4bool IsFinite(G4double value, G4double tolerance=std::numeric_limits< double >::epsilon())
std::pair< G4ThreeVector, G4ThreeVector > CalculateFaces(G4double angleInIn, G4double angleOutIn)
Calculate input and output normal vector.