19#include "BDSMagnetOuterFactoryCylindrical.hh"
21#include "BDSBeamPipe.hh"
22#include "BDSColours.hh"
24#include "BDSExtent.hh"
25#include "BDSGeometryComponent.hh"
26#include "BDSGlobalConstants.hh"
27#include "BDSMagnetOuter.hh"
28#include "BDSMagnetOuterInfo.hh"
29#include "BDSMaterials.hh"
30#include "BDSSDType.hh"
31#include "BDSUtilities.hh"
34#include "G4CutTubs.hh"
35#include "G4LogicalVolume.hh"
36#include "G4Material.hh"
37#include "G4PVPlacement.hh"
38#include "G4SubtractionSolid.hh"
39#include "G4ThreeVector.hh"
41#include "G4VisAttributes.hh"
49BDSMagnetOuterFactoryCylindrical::BDSMagnetOuterFactoryCylindrical():
50 magnetContainerRadius(0)
56 magnetContainerRadius = 0;
62 G4double containerLength,
65 G4double horizontalWidth = recipe->horizontalWidth;
66 G4double angleIn = recipe->angleIn;
67 G4double angleOut = recipe->angleOut;
84 inputFaceNormal = faces.first;
85 outputFaceNormal = faces.second;
87 CreateCylindricalSolidsAngled(name, length, beamPipe, containerLength, horizontalWidth);
96 G4double containerLength,
99 G4double horizontalWidth = recipe->horizontalWidth;
100 G4double angleIn = recipe->angleIn;
101 G4double angleOut = recipe->angleOut;
119 inputFaceNormal = faces.first;
120 outputFaceNormal = faces.second;
122 CreateCylindricalSolidsAngled(name, length, beamPipe, containerLength, horizontalWidth);
132 G4double containerLength,
135 G4double horizontalWidth = recipe->horizontalWidth;
144 G4double containerLength,
147 G4double horizontalWidth = recipe->horizontalWidth;
156 G4double containerLength,
159 G4double horizontalWidth = recipe->horizontalWidth;
168 G4double containerLength,
171 G4double horizontalWidth = recipe->horizontalWidth;
180 G4double containerLength,
183 G4double horizontalWidth = recipe->horizontalWidth;
190 G4double outerRadius = horizontalWidth * 0.5;
192 if ( ((outerRadius - innerRadius)/outerRadius) < 0.05 )
197 G4double coilRadius = innerRadius + 0.25*(outerRadius - innerRadius);
198 G4double coilThickness = 0.05*coilRadius;
199 G4VSolid* sheetSolid =
new G4Tubs(name +
"_sheet_solid",
200 coilRadius-coilThickness,
201 coilRadius+coilThickness,
204 G4LogicalVolume* sheetLV =
new G4LogicalVolume(sheetSolid,
205 recipe->outerMaterial,
207 yokeLV = result->GetContainerLogicalVolume()->GetDaughter(0)->GetLogicalVolume();
209 auto sheetVis =
new G4VisAttributes(*sheetColour);
210 sheetLV->SetVisAttributes(sheetVis);
211 auto pv =
new G4PVPlacement(
nullptr,
219 result->RegisterSolid(sheetSolid);
220 result->RegisterLogicalVolume(sheetLV);
221 result->RegisterPhysicalVolume(pv);
222 result->RegisterVisAttributes(sheetVis);
229 G4double containerLength,
232 G4double horizontalWidth = recipe->horizontalWidth;
241 G4double containerLength,
244 G4double horizontalWidth = recipe->horizontalWidth;
253 G4double containerLength,
256 G4double horizontalWidth = recipe->horizontalWidth;
265 G4double containerLength,
269 G4double horizontalWidth = recipe->horizontalWidth;
281 G4double magnetContainerLength,
282 G4double horizontalWidth)
292 yokeSolid =
new G4Tubs(name +
"_yoke_solid",
302 containerSolid =
new G4Tubs(name +
"_container_solid",
311 G4VSolid* yokeSolidCylinder =
new G4Tubs(name +
"_yoke_solid_cylinder",
317 allSolids.insert(yokeSolidCylinder);
318 yokeSolid =
new G4SubtractionSolid(name +
"_yoke_solid",
323 G4VSolid* containerSolidCylinder =
new G4Tubs(name +
"_container_solid_cylinder",
329 allSolids.insert(containerSolidCylinder);
330 containerSolid =
new G4SubtractionSolid(name +
"_container_solid",
331 containerSolidCylinder,
338void BDSMagnetOuterFactoryCylindrical::CreateCylindricalSolidsAngled(G4String name,
341 G4double magnetContainerLength,
342 G4double horizontalWidth)
346 magnetContainerRadius = (0.5 * horizontalWidth) +
lengthSafety;
352 yokeSolid =
new G4CutTubs(name +
"_yoke_solid",
362 containerSolid =
new G4CutTubs(name +
"_container_solid",
373 G4VSolid* yokeSolidCylinder =
new G4CutTubs(name +
"_yoke_solid_cylinder",
381 allSolids.insert(yokeSolidCylinder);
382 yokeSolid =
new G4SubtractionSolid(name +
"_yoke_solid",
387 G4VSolid* containerSolidCylinder =
new G4CutTubs(name +
"_container_solid_cylinder",
395 allSolids.insert(containerSolidCylinder);
396 containerSolid =
new G4SubtractionSolid(name +
"_container_solid",
397 containerSolidCylinder,
404 G4double& horizontalWidth)
419 if ( (horizontalWidth < extentX) || (horizontalWidth < extentY) )
422 horizontalWidth = std::max(extentX,extentY) + 1*CLHEP::mm;
431 G4Material* outerMaterial = recipe->outerMaterial;
434 G4Colour* colour = recipe->colour;
438 CreateMagnetContainerComponent();
443 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
static BDSColours * Instance()
singleton pattern
G4Colour * GetColour(const G4String &type, G4bool normaliseTo255=true)
Get colour from name.
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.