18#include "BDSBeamPipe.hh"
19#include "BDSColours.hh"
21#include "BDSException.hh"
22#include "BDSExtent.hh"
23#include "BDSGeometryComponent.hh"
24#include "BDSGeometryExternal.hh"
25#include "BDSGeometryFactory.hh"
26#include "BDSGlobalConstants.hh"
27#include "BDSMagnetOuter.hh"
28#include "BDSMagnetOuterFactory.hh"
29#include "BDSMagnetOuterFactoryBase.hh"
30#include "BDSMagnetOuterFactoryCylindrical.hh"
31#include "BDSMagnetOuterFactoryPolesCircular.hh"
32#include "BDSMagnetOuterFactoryPolesFacet.hh"
33#include "BDSMagnetOuterFactoryPolesFacetCrop.hh"
34#include "BDSMagnetOuterFactoryPolesSquare.hh"
35#include "BDSMagnetOuterFactoryLHCLeft.hh"
36#include "BDSMagnetOuterFactoryLHCRight.hh"
37#include "BDSMagnetOuterFactoryNone.hh"
38#include "BDSMagnetOuterInfo.hh"
39#include "BDSMagnetGeometryType.hh"
40#include "BDSMaterials.hh"
41#include "BDSWarning.hh"
45#include "G4CutTubs.hh"
46#include "G4LogicalVolume.hh"
47#include "G4ThreeVector.hh"
63BDSMagnetOuterFactory::BDSMagnetOuterFactory()
77BDSMagnetOuterFactory::~BDSMagnetOuterFactory()
94 case BDSMagnetGeometryType::none:
96 case BDSMagnetGeometryType::cylindrical:
98 case BDSMagnetGeometryType::polescircular:
100 case BDSMagnetGeometryType::polessquare:
102 case BDSMagnetGeometryType::polesfacet:
104 case BDSMagnetGeometryType::polesfacetcrop:
106 case BDSMagnetGeometryType::lhcleft:
108 case BDSMagnetGeometryType::lhcright:
110 case BDSMagnetGeometryType::external:
111 {
return nullptr;
break;}
114 throw BDSException(__METHOD_NAME__,
"unknown type \"" + magnetTypeIn.ToString() +
"\"");
122 G4double outerLength,
123 G4double containerLength,
128 G4String name = outerInfo->name;
131 if (geometryType == BDSMagnetGeometryType::external)
133 outer =
CreateExternal(name, outerInfo, outerLength, containerLength, beamPipe);
135 if (loadedLength > outerLength)
137 BDS::Warning(__METHOD_NAME__,
"External geometry of length " + std::to_string(loadedLength/CLHEP::m)
138 +
"m\nappears to be too long for magnet of length " + std::to_string(outerLength/CLHEP::m) +
"m. ");
144 if (geometryType != BDSMagnetGeometryType::none)
145 {CheckOuterBiggerThanBeamPipe(name, outerInfo, beamPipe);}
151 case BDSMagnetType::decapole:
153 outer = factory->
CreateDecapole(name, outerLength, beamPipe, containerLength, outerInfo);
156 case BDSMagnetType::vkicker:
158 outer = factory->
CreateKicker(name, outerLength, beamPipe, containerLength, outerInfo,
true);
161 case BDSMagnetType::hkicker:
163 outer = factory->
CreateKicker(name, outerLength, beamPipe, containerLength, outerInfo,
false);
166 case BDSMagnetType::muonspoiler:
168 outer = factory->
CreateMuonSpoiler(name, outerLength, beamPipe, containerLength, outerInfo);
171 case BDSMagnetType::octupole:
173 outer = factory->
CreateOctupole(name, outerLength, beamPipe, containerLength, outerInfo);
176 case BDSMagnetType::quadrupole:
178 outer = factory->
CreateQuadrupole(name, outerLength, beamPipe, containerLength, outerInfo);
181 case BDSMagnetType::rfcavity:
183 outer = factory->
CreateRfCavity(name, outerLength, beamPipe, containerLength, outerInfo);
186 case BDSMagnetType::sectorbend:
189 containerLength, outerInfo);
192 case BDSMagnetType::rectangularbend:
195 containerLength, outerInfo);
198 case BDSMagnetType::sextupole:
200 outer = factory->
CreateSextupole(name, outerLength, beamPipe, containerLength, outerInfo);
203 case BDSMagnetType::solenoid:
205 outer = factory->
CreateSolenoid(name, outerLength, beamPipe, containerLength, outerInfo);
208 case BDSMagnetType::multipole:
210 outer = factory->
CreateMultipole(name, outerLength, beamPipe, containerLength, outerInfo);
213 case BDSMagnetType::thinmultipole:
214 case BDSMagnetType::dipolefringe:
215 case BDSMagnetType::undulator:
216 case BDSMagnetType::rmatrix:
217 case BDSMagnetType::paralleltransporter:
220 G4cout << __METHOD_NAME__ <<
"unknown magnet type " << magnetType <<
" - no outer volume built" << G4endl;
229 G4double magnetContainerLength,
232 std::map<G4String, G4Colour*> defaultMap = {
242 info->geometryTypeAndPath,
254 std::stringstream ss, ss2, ss3;
255 ss << info->geometryTypeAndPath;
258 std::string sss = ss.str();
259 sss +=
" will not fit around beam pipe\nin element \"" + name +
"\" and could potentially overlap with it\n";
260 sss +=
"Determined extents to be:\n";
261 sss +=
"External geometry inner: " + ss2.str() +
"\n";
262 sss +=
"Beam pipe outer : " + ss3.str() +
"\n";
263 sss +=
"Check for overlaps with /geometry/test/run";
264 BDS::Warning(__METHOD_NAME__, sss);
282 G4VSolid* containerSolid;
284 if ((inputFace.z() > -1) || (outputFace.z() < 1))
286 G4double posR = std::hypot(outer.
XPos(),outer.
YPos());
287 G4double negR = std::hypot(outer.
XNeg(),outer.
YNeg());
288 G4double magnetContainerRadius = std::max(posR, negR) + 1*CLHEP::mm;
289 containerSolid =
new G4CutTubs(name +
"_container_solid",
291 magnetContainerRadius,
297 containerExt =
BDSExtent(magnetContainerRadius, magnetContainerRadius, 0.5*length);
302 containerSolid =
new G4Box(name +
"_container_solid",
306 containerExt =
BDSExtent(radius, radius, length*0.5);
310 G4LogicalVolume* containerLV =
new G4LogicalVolume(containerSolid,
312 name +
"_container_lv");
323void BDSMagnetOuterFactory::CheckOuterBiggerThanBeamPipe(
const G4String& name,
327 G4double outerHorizontal = outerInfo->horizontalWidth;
328 G4double outerVertical = outerInfo->horizontalWidth * outerInfo->vhRatio;
334 if (outerHorizontal < bpExtent.
DX()+margin || outerVertical < bpExtent.
DY()+margin)
336 std::string msg =
"Magnet outer dimensions too small to encompass beam pipe for element " + name +
"\n";
337 msg +=
"magnet horizontal full width -> " + std::to_string(outerHorizontal) +
"mm\n";
338 msg +=
"magnet vertical full width -> " + std::to_string(outerVertical) +
"mm\n";
339 msg +=
"Beam pipe width (mm): " + std::to_string(bpExtent.
DX()) +
", height : ";
340 msg += std::to_string(bpExtent.
DY());
A holder class for a piece of beam pipe geometry.
G4ThreeVector InputFaceNormal() const
Accessor.
G4ThreeVector OutputFaceNormal() const
Accessor.
G4Colour * GetColour(G4double red, G4double green, G4double blue, G4double alpha=1)
Get a cached anonymous colour by values.
static BDSColours * Instance()
singleton pattern
General exception with possible name of object and message.
Holder for +- extents in 3 dimensions.
G4double XPos() const
Accessor.
G4double MaximumAbsTransverse() const
Return the maximum absolute value considering only x,y.
G4double XNeg() const
Accessor.
G4double DZ() const
The difference in a dimension.
G4double YNeg() const
Accessor.
G4double DX() const
The difference in a dimension.
G4double DY() const
The difference in a dimension.
G4bool TransverselyLessThan(const BDSExtent &r) const
Comparison operator for x,y only. Ignores z (length).
G4double YPos() const
Accessor.
A generic geometry component for a bdsim model.
BDSExtent GetExtent() const
Accessor - see member for more info.
BDSExtent GetInnerExtent() const
Accessor - see member for more info.
A loaded piece of externally provided geometry.
BDSGeometryExternal * BuildGeometry(G4String componentName, const G4String &formatAndFilePath, std::map< G4String, G4Colour * > *colourMapping=nullptr, G4bool autoColour=true, G4double suggestedLength=0, G4double suggestedHorizontalWidth=0, std::vector< G4String > *namedVacuumVolumes=nullptr, G4bool makeSensitive=true, BDSSDType sensitivityType=BDSSDType::energydep, BDSSDType vacuumSensitivityType=BDSSDType::energydepvacuum, G4bool stripOuterVolumeAndMakeAssembly=false, G4UserLimits *userLimitsToAttachToAllLVs=nullptr, G4bool dontReloadGeometry=false)
static BDSGeometryFactory * Instance()
Singleton accessor.
static BDSGlobalConstants * Instance()
Access method.
Abstract base class for magnet outer volume factories.
virtual BDSMagnetOuter * CreateQuadrupole(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)=0
quadrupole outer volume
virtual BDSMagnetOuter * CreateSolenoid(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)=0
solenoid outer volume
virtual BDSMagnetOuter * CreateKicker(G4String name, G4double length, const BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe, G4bool vertical)=0
horizontal and vertical kicker outer volume
virtual BDSMagnetOuter * CreateRectangularBend(G4String name, G4double length, const BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)=0
rectangular bend outer volume
virtual BDSMagnetOuter * CreateDecapole(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)=0
decapole outer volume
virtual BDSMagnetOuter * CreateSectorBend(G4String name, G4double length, const BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)=0
sector bend outer volume
virtual BDSMagnetOuter * CreateMuonSpoiler(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)=0
muon spoiler outer volume
virtual BDSMagnetOuter * CreateMultipole(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)=0
general multipole outer volume - could be any 2N order multipole
virtual BDSMagnetOuter * CreateOctupole(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)=0
octupole outer volume
virtual BDSMagnetOuter * CreateRfCavity(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)=0
RF cavity outer volume.
virtual BDSMagnetOuter * CreateSextupole(G4String name, G4double length, BDSBeamPipe *beamPipe, G4double containerLength, const BDSMagnetOuterInfo *recipe)=0
sextupole outer volume
Factory that produces cylindrical magnet geometry.
LHC outer magnet geometry offset to the left.
LHC outer magnet geometry offset to the right.
Factory that produces null outer geometry.
Factory class for outer volume of magnets. Produces magnets with 2N-poles around the beampipe with a ...
Factory class for outer volume of magnets.
Factory class for outer volume of magnets.
Factory class for outer volume of magnets.
The main interface for using the magnet outer factories.
static BDSMagnetOuterFactory * Instance()
Singleton accessor.
BDSMagnetOuterFactoryBase * lhcleft
Factory instance.
BDSMagnetOuterFactoryBase * polesfacetcrop
Factory instance.
BDSMagnetOuterFactoryBase * lhcright
Factory instance.
static BDSMagnetOuterFactory * instance
Singleton instance.
BDSGeometryComponent * CreateContainerForExternal(const G4String &name, G4double length, BDSGeometryExternal *external, BDSBeamPipe *beampipe)
BDSMagnetOuter * CreateExternal(const G4String &name, BDSMagnetOuterInfo *info, G4double length, G4double magnetContainerLength, BDSBeamPipe *beampipe)
BDSMagnetOuterFactoryBase * cylindrical
Factory instance.
BDSMagnetOuterFactoryBase * polessquare
Factory instance.
BDSMagnetOuter * CreateMagnetOuter(BDSMagnetType magnetType, BDSMagnetOuterInfo *outerInfo, G4double outerLength, G4double chordLength, BDSBeamPipe *beampipe)
G4double lengthSafetyLarge
BDSMagnetOuterFactoryBase * polescircular
Factory instance.
BDSMagnetOuterFactoryBase * GetAppropriateFactory(BDSMagnetGeometryType magnetTypeIn)
Get the appropriate derived factory for the required magnet style.
G4bool sensitiveOuter
Cache of global option.
BDSMagnetOuterFactoryBase * none
Factory instance.
BDSMagnetOuterFactoryBase * polesfacet
Factory instance.
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.
type underlying() const
return underlying value (can be used in switch statement)