BDSIM
BDSIM is a Geant4 extension toolkit for simulation of particle transport in accelerator beamlines.
Loading...
Searching...
No Matches
BDSBeamPipeFactory.cc
1/*
2Beam Delivery Simulation (BDSIM) Copyright (C) Royal Holloway,
3University of London 2001 - 2024.
4
5This file is part of BDSIM.
6
7BDSIM is free software: you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published
9by the Free Software Foundation version 3 of the License.
10
11BDSIM is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with BDSIM. If not, see <http://www.gnu.org/licenses/>.
18*/
19#include "BDSBeamPipeFactory.hh"
20#include "BDSBeamPipeFactoryBase.hh"
21#include "BDSBeamPipeFactoryCircular.hh"
22#include "BDSBeamPipeFactoryCircularVacuum.hh"
23#include "BDSBeamPipeFactoryClicPCL.hh"
24#include "BDSBeamPipeFactoryElliptical.hh"
25#include "BDSBeamPipeFactoryRectangular.hh"
26#include "BDSBeamPipeFactoryLHC.hh"
27#include "BDSBeamPipeFactoryLHCDetailed.hh"
28#include "BDSBeamPipeFactoryOctagonal.hh"
29#include "BDSBeamPipeFactoryPointsFile.hh"
30#include "BDSBeamPipeFactoryRaceTrack.hh"
31#include "BDSBeamPipeFactoryRectEllipse.hh"
32#include "BDSBeamPipeFactoryRhombus.hh"
33#include "BDSBeamPipeInfo.hh"
34#include "BDSBeamPipeType.hh"
35#include "BDSDebug.hh"
36#include "BDSGlobalConstants.hh"
37
38#include "globals.hh" // geant4 globals / types
39
41
48
64
65BDSBeamPipeFactory::~BDSBeamPipeFactory()
66{
67 delete circular;
68 delete elliptical;
69 delete rectangular;
70 delete lhc;
71 delete lhcdetailed;
72 delete rectellipse;
73 delete racetrack;
74 delete rhombus;
75 delete octagonal;
76 delete circularvacuum;
77 delete clicpcl;
78 delete pointsfile;
79 instance = nullptr;
80}
81
83{
84 switch(type.underlying())
85 {
86 case BDSBeamPipeType::circular:
87 {return circular; break;}
88 case BDSBeamPipeType::elliptical:
89 {return elliptical; break;}
90 case BDSBeamPipeType::rectangular:
91 {return rectangular; break;}
92 case BDSBeamPipeType::lhc:
93 {return lhc; break;}
94 case BDSBeamPipeType::lhcdetailed:
95 {return lhcdetailed; break;}
96 case BDSBeamPipeType::rectellipse:
97 {return rectellipse; break;}
98 case BDSBeamPipeType::racetrack:
99 {return racetrack; break;}
100 case BDSBeamPipeType::octagonal:
101 {return octagonal; break;}
102 case BDSBeamPipeType::circularvacuum:
103 {return circularvacuum; break;}
104 case BDSBeamPipeType::clicpcl:
105 {return clicpcl; break;}
106 case BDSBeamPipeType::pointsfile:
107 {return pointsfile; break;}
108 case BDSBeamPipeType::rhombus:
109 {return rhombus; break;}
110 default:
111#ifdef BDSDEBUG
112 G4cout << __METHOD_NAME__ << "unknown type \"" << type << "\" - circular beampipe factory by default" << G4endl;
113#endif
114 return circular;
115 break;
116 }
117}
118
120 G4double length,
121 BDSBeamPipeInfo* bpi)
122{
123 BDSBeamPipeInfo copy = BDSBeamPipeInfo(*bpi);
124 copy.ShrinkBy(BDSGlobalConstants::Instance()->LengthSafetyLarge());
125 return CreateBeamPipe(BDSBeamPipeType::circularvacuum,
126 name,
127 length,
128 bpi->aper1,
129 bpi->aper2,
130 bpi->aper3,
131 bpi->aper4,
132 bpi->vacuumMaterial,
134 bpi->beamPipeMaterial);
135}
136
137BDSBeamPipe* BDSBeamPipeFactory::CreateBeamPipe(const G4String& name,
138 G4double length,
139 BDSBeamPipeInfo* bpi)
140{
141 if ((bpi->inputFaceNormal.z() > -1) || (bpi->outputFaceNormal.z() < 1))
142 {
143 return CreateBeamPipe(bpi->beamPipeType,
144 name,
145 length,
146 bpi->inputFaceNormal,
147 bpi->outputFaceNormal,
148 bpi->aper1,
149 bpi->aper2,
150 bpi->aper3,
151 bpi->aper4,
152 bpi->vacuumMaterial,
154 bpi->beamPipeMaterial,
155 bpi->pointsFileName,
156 bpi->pointsUnit);
157 }
158 else
159 {
160 return CreateBeamPipe(bpi->beamPipeType,
161 name,
162 length,
163 bpi->aper1,
164 bpi->aper2,
165 bpi->aper3,
166 bpi->aper4,
167 bpi->vacuumMaterial,
169 bpi->beamPipeMaterial,
170 bpi->pointsFileName,
171 bpi->pointsUnit);
172 }
173}
174
175BDSBeamPipe* BDSBeamPipeFactory::CreateBeamPipe(BDSBeamPipeType beamPipeType,
176 const G4String& name,
177 G4double length,
178 G4double aper1,
179 G4double aper2,
180 G4double aper3,
181 G4double aper4,
182 G4Material* vacuumMaterial,
183 G4double beamPipeThickness,
184 G4Material* beamPipeMaterial,
185 const G4String& pointsFileIn,
186 const G4String& pointsUnitIn)
187{
188 BDSBeamPipeFactoryBase* factory = GetAppropriateFactory(beamPipeType);
189 return factory->CreateBeamPipe(name,length,aper1,aper2,aper3,aper4,
190 vacuumMaterial,beamPipeThickness,beamPipeMaterial,
191 pointsFileIn,pointsUnitIn);
192}
193
194BDSBeamPipe* BDSBeamPipeFactory::CreateBeamPipe(BDSBeamPipeType beamPipeType,
195 const G4String& name,
196 G4double length,
197 const G4ThreeVector& inputFaceNormal,
198 const G4ThreeVector& outputFaceNormal,
199 G4double aper1,
200 G4double aper2,
201 G4double aper3,
202 G4double aper4,
203 G4Material* vacuumMaterial,
204 G4double beamPipeThickness,
205 G4Material* beamPipeMaterial,
206 const G4String& pointsFileIn,
207 const G4String& pointsUnitIn)
208{
209 BDSBeamPipeFactoryBase* factory = GetAppropriateFactory(beamPipeType);
210 return factory->CreateBeamPipe(name,length,inputFaceNormal,outputFaceNormal,aper1,
211 aper2,aper3,aper4,vacuumMaterial,beamPipeThickness,
212 beamPipeMaterial,pointsFileIn,pointsUnitIn);
213}
Abstract base class for beampipe factory classes.
virtual BDSBeamPipe * CreateBeamPipe(const G4String &nameIn, G4double lengthIn, G4double aper1=0, G4double aper2=0, G4double aper3=0, G4double aper4=0, G4Material *vacuumMaterialIn=nullptr, G4double beamPipeThicknessIn=0, G4Material *beamPipeMaterialIn=nullptr, const G4String &pointsFileIn="", const G4String &pointsUnitIn="")=0
create a flat ended beampipe
Factory for vacuum-only circular volumes.
Factory for circular beam pipes.
Factory for CLIC post collision line beam pipes.
Factory for elliptical beam pipes.
Factory for detailed lhc aperture model beam pipes.
Factory for simple lhc aperture model beam pipes.
Factory for octagonal aperture model beampipes.
Factory for beam pipe made from an list of x,y points in a file.
Factory for racetrack aperture model beampipes.
Factory for rectellipse aperture model beampipes.
Factory for rectangular beam pipes.
Factory for rhombus aperture model beampipes.
The main interface for using the beam pipe factories.
BDSBeamPipeFactoryBase * racetrack
Factory instance.
BDSBeamPipeFactoryBase * rhombus
Factory instance.
BDSBeamPipeFactoryBase * elliptical
Factory instance.
static BDSBeamPipeFactory * instance
Singleton instance pointer.
BDSBeamPipe * CreateBeamPipeForVacuumIntersection(const G4String &name, G4double length, BDSBeamPipeInfo *info)
BDSBeamPipeFactoryBase * circularvacuum
Factory instance.
BDSBeamPipeFactoryBase * GetAppropriateFactory(BDSBeamPipeType beamPipeTypeIn)
Return the appropriate factory singleton pointer given a type.
static BDSBeamPipeFactory * Instance()
Singleton accessor.
BDSBeamPipeFactoryBase * rectellipse
Factory instance.
BDSBeamPipeFactoryBase * lhc
Factory instance.
BDSBeamPipeFactoryBase * clicpcl
Factory instance.
BDSBeamPipeFactoryBase * pointsfile
Factory instance.
BDSBeamPipeFactoryBase * lhcdetailed
Factory instance.
BDSBeamPipeFactory()
Private constructor as singleton pattern.
BDSBeamPipeFactoryBase * rectangular
Factory instance.
BDSBeamPipeFactoryBase * octagonal
Factory instance.
BDSBeamPipeFactoryBase * circular
Factory instance.
Holder class for all information required to describe a beam pipe model.
G4Material * beamPipeMaterial
Public member for direct access.
G4double aper3
Public member for direct access.
G4String pointsUnit
Public member for direct access.
BDSBeamPipeInfo ShrinkBy(G4double margin) const
Return a copy that's shrunk by value margin.
G4double aper1
Public member for direct access.
G4ThreeVector outputFaceNormal
Public member for direct access.
G4Material * vacuumMaterial
Public member for direct access.
G4double beamPipeThickness
Public member for direct access.
G4String pointsFileName
Public member for direct access.
G4double aper4
Public member for direct access.
G4double aper2
Public member for direct access.
BDSBeamPipeType beamPipeType
Public member for direct access.
G4ThreeVector inputFaceNormal
Public member for direct access.
A holder class for a piece of beam pipe geometry.
static BDSGlobalConstants * Instance()
Access method.
type underlying() const
return underlying value (can be used in switch statement)