BDSIM
BDSIM is a Geant4 extension toolkit for simulation of particle transport in accelerator beamlines.
Loading...
Searching...
No Matches
BDSComponentFactory.hh
1/*
2Beam Delivery Simulation (BDSIM) Copyright (C) BDSIM Collaboration, 2001 - 2026.
3
4This file is part of BDSIM.
5
6BDSIM is free software: you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published
8by the Free Software Foundation version 3 of the License.
9
10BDSIM is distributed in the hope that it will be useful, but
11WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with BDSIM. If not, see <http://www.gnu.org/licenses/>.
17*/
18#ifndef BDSCOMPONENTFACTORY_H
19#define BDSCOMPONENTFACTORY_H
20
21#include "BDSBeamlineIntegral.hh"
22#include "BDSFieldType.hh"
23#include "BDSMagnetGeometryType.hh"
24#include "BDSMagnetStrength.hh"
25#include "BDSMagnetType.hh"
26#include "BDSIntegratorType.hh"
27#include "BDSIntegratorSetType.hh"
28#include "BDSParticleDefinition.hh"
29
30#include "globals.hh"
31#include "G4ThreeVector.hh"
32#include "G4Transform3D.hh"
33
34#include "CLHEP/Units/PhysicalConstants.h"
35
36#include <map>
37
38class G4Colour;
39class G4Material;
40
41namespace GMAD
42{
43 struct Element;
44}
46class BDSBeamPipeInfo;
47class BDSCavityInfo;
49class BDSCrystalInfo;
50class BDSFieldInfo;
52class BDSLaser;
53class BDSMagnet;
56class BDSTiltOffset;
57
78{
79public:
80 explicit BDSComponentFactory(BDSComponentFactoryUser* userComponentFactoryIn = nullptr,
81 G4bool usualPrintOut = true);
83
90 GMAD::Element const* prevElementIn,
91 GMAD::Element const* nextElementIn,
92 BDSBeamlineIntegral& integral);
93
97
100 BDSAcceleratorComponent* CreateTeleporter(const G4double teleporterLength,
101 const G4double teleporterWidth,
102 const G4Transform3D& transformIn);
103
106
108 static G4Transform3D CreateFieldTransform(const BDSTiltOffset* tiltOffset);
109
112 static G4Transform3D CreateFieldTransform(GMAD::Element const* el);
113
117 const G4ThreeVector& inputFaceNormal = G4ThreeVector(0,0,-1),
118 const G4ThreeVector& outputFaceNormal = G4ThreeVector(0,0,1));
119
123 G4double angleIn,
124 G4double angleOut);
125
128 static G4bool YokeOnLeft(const GMAD::Element* el,
129 const BDSMagnetStrength* st);
130
132 static G4double PrepareHorizontalWidth(GMAD::Element const* el,
133 G4double defaultHorizontalWidth = -1);
134
136 static G4double ScalingFieldOuter(const GMAD::Element* ele);
137
140 const BDSFieldType& fieldType,
141 const BDSBeamPipeInfo* bpInfo,
142 const BDSMagnetOuterInfo* outerInfo,
143 const G4Transform3D& fieldTransform,
144 const BDSIntegratorSet* integratorSetIn,
145 G4double brhoIn,
146 G4double outerFieldScaling = 1.0,
147 BDSModulatorInfo* modulatorInfo = nullptr);
148
152 static BDSMagnetOuterInfo* PrepareMagnetOuterInfo(const G4String& elementNameIn,
153 const GMAD::Element* el,
154 const BDSMagnetStrength* st,
155 const BDSBeamPipeInfo* beamPipe,
156 G4double defaultHorizontalWidth = -1,
157 G4double defaultVHRatio = 1.0,
158 G4double defaultCoilWidthFraction = -1,
159 G4double defaultCoilHeightFraction = -1);
160
164
168 static BDSMagnetOuterInfo* PrepareMagnetOuterInfo(const G4String& elementNameIn,
169 const GMAD::Element* el,
170 const G4double angleIn,
171 const G4double angleOut,
172 const BDSBeamPipeInfo* beamPipe,
173 const G4bool yokeOnLeft = false,
174 G4double defaultHorizontalWidth = -1,
175 G4double defaultVHRatio = -1,
176 G4double defaultCoilWidthFraction = -1,
177 G4double defaultCoilHeightFraction = -1);
178
182 static G4Colour* PrepareColour(GMAD::Element const* element, const G4Material* material = nullptr);
183
185 static G4Material* PrepareMaterial(GMAD::Element const* element,
186 const G4String& defaultMaterialName);
187
189 static G4Material* PrepareMaterial(GMAD::Element const* element);
190
192 static G4Material* PrepareTipMaterial(GMAD::Element const* element,
193 const G4String& defaultMaterialName);
194
196 static G4Material* PrepareTipMaterial(GMAD::Element const* element);
197
200 static void CheckBendLengthAngleWidthCombo(G4double arcLength,
201 G4double angle,
202 G4double horizontalWidth,
203 const G4String& name = "not given");
204
206 static void PoleFaceRotationsNotTooLarge(const GMAD::Element* el,
207 G4double maxAngle = 0.5*CLHEP::halfpi);
208
213 static G4double EFieldFromElement(GMAD::Element const* el,
214 BDSFieldType fieldType,
215 G4double cavityLength,
216 const BDSParticleDefinition& incomingParticle);
217
222 static void CalculateAngleAndFieldRBend(const GMAD::Element* el,
223 G4double brhoIn,
224 G4double& arcLength,
225 G4double& chordLength,
226 G4double& field,
227 G4double& angle);
228
231 BDSCrystalInfo* PrepareCrystalInfo(const G4String& crystalName) const;
232
233private:
236
238 G4double lengthSafety;
241 G4bool yokeFields;
244 G4double synchronousTAtMiddleOfThisComponent;
245
247 inline void SetBeta0(BDSMagnetStrength* stIn) const {(*stIn)["beta0"] = integralUpToThisComponent->designParticle.Beta();}
249 inline G4double BRho() const {return integralUpToThisComponent->designParticle.BRho();}
250
252 GMAD::Element const* element = nullptr;
254 GMAD::Element const* prevElement = nullptr;
256 GMAD::Element const* nextElement = nullptr;
257
259 enum class KickerType {horizontal, vertical, general};
260
262 enum class RFFieldDirection {x, y, z};
263
264 BDSAcceleratorComponent* CreateDrift(G4double angleIn, G4double angleOut);
265 BDSAcceleratorComponent* CreateRF(RFFieldDirection direction);
266 BDSAcceleratorComponent* CreateSBend();
267 BDSAcceleratorComponent* CreateRBend();
268 BDSAcceleratorComponent* CreateKicker(KickerType type);
269 BDSAcceleratorComponent* CreateQuad();
270 BDSAcceleratorComponent* CreateSextupole();
271 BDSAcceleratorComponent* CreateOctupole();
272 BDSAcceleratorComponent* CreateDecapole();
273 BDSAcceleratorComponent* CreateMultipole();
274 BDSAcceleratorComponent* CreateThinMultipole(G4double angleIn);
275 BDSAcceleratorComponent* CreateElement();
276 BDSAcceleratorComponent* CreateSolenoid();
277 BDSAcceleratorComponent* CreateParallelTransporter();
278 BDSAcceleratorComponent* CreateRectangularCollimator();
279 BDSAcceleratorComponent* CreateBeamMaskCollimator();
280 BDSAcceleratorComponent* CreateGasCapillary();
281 BDSAcceleratorComponent* CreateGasJet();
282 BDSAcceleratorComponent* CreateTarget();
283 BDSAcceleratorComponent* CreateEllipticalCollimator();
284 BDSAcceleratorComponent* CreateJawCollimator();
285 BDSAcceleratorComponent* CreateTipJawCollimator();
286 BDSAcceleratorComponent* CreateMuonCooler();
287 BDSAcceleratorComponent* CreateMuonSpoiler();
288 BDSAcceleratorComponent* CreateShield();
289 BDSAcceleratorComponent* CreateDegrader();
290 BDSAcceleratorComponent* CreateGap();
291 BDSAcceleratorComponent* CreateCrystalCollimator();
292 BDSAcceleratorComponent* CreateLaser();
293 BDSAcceleratorComponent* CreateScreen();
294 BDSAcceleratorComponent* CreateTransform3D();
295 BDSAcceleratorComponent* CreateWireScanner();
296 BDSAcceleratorComponent* CreateRMatrix();
297 BDSAcceleratorComponent* CreateThinRMatrix(G4double angleIn,
298 const G4String& name);
299 BDSAcceleratorComponent* CreateThinRMatrix(G4double angleIn,
300 BDSMagnetStrength* stIn,
301 const G4String& name,
302 BDSIntegratorType intType = BDSIntegratorType::rmatrixthin,
303 BDSFieldType fieldType = BDSFieldType::rmatrix,
304 G4double beamPipeRadius = 0,
305 BDSModulatorInfo* fieldModulator = nullptr);
306 BDSAcceleratorComponent* CreateUndulator();
307 BDSAcceleratorComponent* CreateDump();
308 BDSAcceleratorComponent* CreateLaserwire(G4double currentArcLength);
309
310#ifdef USE_DICOM
311 BDSAcceleratorComponent* CreateCT();
312#endif
313 BDSAcceleratorComponent* CreateCavityFringe(G4double angleIn,
314 BDSMagnetStrength* stIn,
315 const G4String& name,
316 G4double irisRadius,
317 BDSModulatorInfo* fieldModulator = nullptr);
318 BDSAcceleratorComponent* CreateGaborLens();
319#ifdef USE_AWAKE
320 BDSAcceleratorComponent* CreateAwakeScreen();
321 BDSAcceleratorComponent* CreateAwakeSpectrometer();
322#endif
323
327 BDSFieldType fieldType,
328 BDSMagnetType magnetType,
329 G4double angle = 0.0,
330 const G4String& nameSuffix = "") const;
331
334 G4bool printWarning = true);
335
337 G4Material* PrepareVacuumMaterial(GMAD::Element const* el) const;
338
341 void PrepareCavityModels();
342
344 void PrepareColours();
345
347 void PrepareCrystals();
348
350 void PrepareLasers();
351
354 BDSLaser* PrepareLaser(GMAD::Element const* el) const;
355
362 G4double frequency) const;
363
367 G4double frequency) const;
368
372 BDSFieldType fieldType,
373 G4double cavityLength,
374 BDSMagnetStrength*& fringeIn,
375 BDSMagnetStrength*& fringeOut) const;
376
380 void SetFieldDefinitions(GMAD::Element const* el,
381 BDSAcceleratorComponent* component) const;
382
386 BDSFieldInfo* info) const;
387
390
393
395 std::map<G4String, BDSCavityInfo*> cavityInfos;
396
398 std::map<G4String, BDSCrystalInfo*> crystalInfos;
399
401 std::map<G4String, BDSLaser*> lasers;
402
405
408
411 G4double FieldFromAngle(const G4double angle,
412 const G4double arcLength) const;
413
416 G4double AngleFromField(const G4double field,
417 const G4double arcLength) const;
418
422 G4double& angle,
423 G4double& field) const;
424
426 G4double BendAngle(const GMAD::Element* el) const;
427
433 G4double OutgoingFaceAngle(const GMAD::Element* el) const;
434
440 G4double IncomingFaceAngle(const GMAD::Element* el) const;
441
444 BDSModulatorInfo* ModulatorDefinition(const GMAD::Element* el, G4bool inDevelopment=false) const; // TBC
445
447 void INDEVELOPMENTERROR() const;
448
451 void GetKickValue(G4double& hkick,
452 G4double& vkick,
453 const KickerType type) const;
454
457
463 std::map<G4String, G4int> modifiedElements;
464
466 G4String elementName;
467
470 static G4bool coloursInitialised;
471};
472#endif
Abstract class that represents a component of an accelerator.
Holder class for all information required to describe a beam pipe model.
A class that holds the current integrated quantities along a beam line.
Holder for all Geometrical information required to create an RF cavity.
Factory for user specified accelerator components.
Factory to produce all types of BDSAcceleratorComponents.
static G4bool YokeOnLeft(const GMAD::Element *el, const BDSMagnetStrength *st)
std::map< G4String, BDSCrystalInfo * > crystalInfos
Maps of crystal info instances by name.
G4double OutgoingFaceAngle(const GMAD::Element *el) const
G4double AngleFromField(const G4double field, const G4double arcLength) const
void INDEVELOPMENTERROR() const
TBC - remove when modulators are implemented fully.
BDSComponentFactoryUser * userComponentFactory
User component factory if any.
KickerType
Private enum for kicker types.
BDSAcceleratorComponent * CreateComponent(GMAD::Element const *elementIn, GMAD::Element const *prevElementIn, GMAD::Element const *nextElementIn, BDSBeamlineIntegral &integral)
G4double FieldFromAngle(const G4double angle, const G4double arcLength) const
static G4double PrepareHorizontalWidth(GMAD::Element const *el, G4double defaultHorizontalWidth=-1)
Prepare the element horizontal width in Geant4 units - if not set, use the global default.
void CalculateGaborLensStrength(BDSMagnetStrength *st) const
Calculate the electric field strength of the confined plasma in a Gabor lens.
BDSComponentFactory()=delete
No default constructor.
BDSAcceleratorComponent * CreateTeleporter(const G4double teleporterLength, const G4double teleporterWidth, const G4Transform3D &transformIn)
BDSModulatorInfo * defaultModulator
Default modulator for all components.
G4Material * PrepareVacuumMaterial(GMAD::Element const *el) const
Prepare the vacuum material from the element or resort to default in options.
static G4Transform3D CreateFieldTransform(const BDSTiltOffset *tiltOffset)
Create a transform from a tilt offset. If nullptr, returns identity transform.
BDSMagnet * CreateMagnet(const GMAD::Element *el, BDSMagnetStrength *st, BDSFieldType fieldType, BDSMagnetType magnetType, G4double angle=0.0, const G4String &nameSuffix="") const
Helper method for common magnet construction.
BDSMagnetStrength * PrepareMagnetStrengthForMultipoles(GMAD::Element const *el) const
Prepare magnet strength for multipoles.
GMAD::Element const * element
element for storing instead of passing around
static void PoleFaceRotationsNotTooLarge(const GMAD::Element *el, G4double maxAngle=0.5 *CLHEP::halfpi)
Check whether the pole face rotation angles are too big for practical construction.
G4double thinElementLength
Length of a thin element.
static void CalculateAngleAndFieldRBend(const GMAD::Element *el, G4double brhoIn, G4double &arcLength, G4double &chordLength, G4double &field, G4double &angle)
BDSCavityInfo * PrepareCavityModelInfoForElement(GMAD::Element const *el, G4double frequency) const
GMAD::Element const * nextElement
element access to previous element (can be nullptr)
BDSCavityInfo * PrepareCavityModelInfo(GMAD::Element const *el, G4double frequency) const
BDSLaser * PrepareLaser(GMAD::Element const *el) const
const BDSIntegratorSetType integratorSetType
Local copy of enum of the integrator set, i.e. which one it is specifically.
G4bool yokeFields
Cache of whether to include yoke magnetic fields.
static G4double EFieldFromElement(GMAD::Element const *el, BDSFieldType fieldType, G4double cavityLength, const BDSParticleDefinition &incomingParticle)
static BDSFieldInfo * PrepareMagnetOuterFieldInfo(const BDSMagnetStrength *vacuumSt, const BDSFieldType &fieldType, const BDSBeamPipeInfo *bpInfo, const BDSMagnetOuterInfo *outerInfo, const G4Transform3D &fieldTransform, const BDSIntegratorSet *integratorSetIn, G4double brhoIn, G4double outerFieldScaling=1.0, BDSModulatorInfo *modulatorInfo=nullptr)
Prepare the field definition for the yoke of a magnet.
void PrepareColours()
Prepare all colours defined in the parser.
static BDSMagnetOuterInfo * PrepareMagnetOuterInfo(const G4String &elementNameIn, const GMAD::Element *el, const BDSMagnetStrength *st, const BDSBeamPipeInfo *beamPipe, G4double defaultHorizontalWidth=-1, G4double defaultVHRatio=1.0, G4double defaultCoilWidthFraction=-1, G4double defaultCoilHeightFraction=-1)
BDSAcceleratorComponent * CreateTerminator(G4double witdth)
BDSMagnetStrength * PrepareMagnetStrengthForRMatrix(GMAD::Element const *el) const
Prepare magnet strength for rmatrix.
G4bool includeFringeFields
Cache of whether to include fringe fields.
void SetFieldDefinitions(GMAD::Element const *el, BDSAcceleratorComponent *component) const
static void CheckBendLengthAngleWidthCombo(G4double arcLength, G4double angle, G4double horizontalWidth, const G4String &name="not given")
void PrepareCrystals()
Prepare all crystals in defined the parser.
static G4Colour * PrepareColour(GMAD::Element const *element, const G4Material *material=nullptr)
G4double lengthSafety
Length safety from global constants.
BDSMagnetStrength * PrepareCavityStrength(GMAD::Element const *el, BDSFieldType fieldType, G4double cavityLength, BDSMagnetStrength *&fringeIn, BDSMagnetStrength *&fringeOut) const
G4String elementName
Variable used to pass around the possibly modified name of an element.
std::map< G4String, BDSLaser * > lasers
Map of laser instances by name. Owned by this class.
static G4Material * PrepareTipMaterial(GMAD::Element const *element, const G4String &defaultMaterialName)
Checks if a material is named in Element::tipMaterial, else uses the supplied default.
std::map< G4String, G4int > modifiedElements
void GetKickValue(G4double &hkick, G4double &vkick, const KickerType type) const
BDSBeamlineIntegral * integralUpToThisComponent
To save passing it through many functions arguments.
G4double BendAngle(const GMAD::Element *el) const
Calculate the angle of a bend whether it's an rbend or an sbend.
G4double IncomingFaceAngle(const GMAD::Element *el) const
void CalculateAngleAndFieldSBend(GMAD::Element const *el, G4double &angle, G4double &field) const
static G4Material * PrepareMaterial(GMAD::Element const *element, const G4String &defaultMaterialName)
Checks if a material is named in Element::material, else uses the supplied default.
static BDSTiltOffset * CreateTiltOffset(GMAD::Element const *el)
Create the tilt and offset information object by inspecting the parser element.
void SetModulatorDefinition(GMAD::Element const *el, BDSFieldInfo *info) const
void PrepareLasers()
Prepare all lasers defined in the parser.
const BDSIntegratorSet * integratorSet
Local copy of reference to integrator set to use.
BDSModulatorInfo * ModulatorDefinition(const GMAD::Element *el, G4bool inDevelopment=false) const
RFFieldDirection
Private enum for RF cavity principle accelerating direction.
void SetBeta0(BDSMagnetStrength *stIn) const
Simple setter used to add Beta0 to a strength instance.
BDSCrystalInfo * PrepareCrystalInfo(const G4String &crystalName) const
static BDSBeamPipeInfo * PrepareBeamPipeInfo(GMAD::Element const *el, const G4ThreeVector &inputFaceNormal=G4ThreeVector(0, 0,-1), const G4ThreeVector &outputFaceNormal=G4ThreeVector(0, 0, 1))
static BDSMagnetGeometryType MagnetGeometryType(const GMAD::Element *el)
G4double BRho() const
Simple accessor to simplify repetitive code.
std::map< G4String, BDSCavityInfo * > cavityInfos
Map of cavity model info instances by name.
G4bool HasSufficientMinimumLength(GMAD::Element const *el, G4bool printWarning=true)
Test the component length is sufficient for practical construction.
static G4double ScalingFieldOuter(const GMAD::Element *ele)
Get the scaling factor for a particular outer field depending on the global and individual setting.
GMAD::Element const * prevElement
element access to previous element (can be nullptr)
Holder for all information required to create a crystal.
All info required to build complete field of any type.
Which integrator to use for each type of magnet / field object.
Class to provide laser intensity at any point.
Definition BDSLaser.hh:35
Holder struct of all information required to create the outer geometry of a magnet.
Efficient storage of magnet strengths.
Abstract base class that implements features common to all magnets.
Definition BDSMagnet.hh:44
Holder class for all information required to describe a modulator.
Wrapper for particle definition.
G4double BRho() const
Accessor.
G4double Beta() const
Accessor.
A holder for any placement offsets and rotations for a BDSAcceleratorComponent.
Parser namespace for GMAD language. Combination of Geant4 and MAD.
Element class.
Definition element.h:47