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) 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#include "BDSBeamPipeFactory.hh"
19#include "BDSBeamPipeFactoryBase.hh"
20#include "BDSBeamPipeFactoryCircular.hh"
21#include "BDSBeamPipeFactoryCircularVacuum.hh"
22#include "BDSBeamPipeFactoryClicPCL.hh"
23#include "BDSBeamPipeFactoryElliptical.hh"
24#include "BDSBeamPipeFactoryRectangular.hh"
25#include "BDSBeamPipeFactoryLHC.hh"
26#include "BDSBeamPipeFactoryLHCDetailed.hh"
27#include "BDSBeamPipeFactoryOctagonal.hh"
28#include "BDSBeamPipeFactoryPointsFile.hh"
29#include "BDSBeamPipeFactoryRaceTrack.hh"
30#include "BDSBeamPipeFactoryRectEllipse.hh"
31#include "BDSBeamPipeFactoryRhombus.hh"
32#include "BDSBeamPipeInfo.hh"
33#include "BDSBeamPipeType.hh"
34#include "BDSDebug.hh"
35#include "BDSGlobalConstants.hh"
36
37#include "globals.hh" // geant4 globals / types
38
40
47
63
64BDSBeamPipeFactory::~BDSBeamPipeFactory()
65{
66 delete circular;
67 delete elliptical;
68 delete rectangular;
69 delete lhc;
70 delete lhcdetailed;
71 delete rectellipse;
72 delete racetrack;
73 delete rhombus;
74 delete octagonal;
75 delete circularvacuum;
76 delete clicpcl;
77 delete pointsfile;
78 instance = nullptr;
79}
80
82{
83 switch(type.underlying())
84 {
85 case BDSBeamPipeType::circular:
86 {return circular; break;}
87 case BDSBeamPipeType::elliptical:
88 {return elliptical; break;}
89 case BDSBeamPipeType::rectangular:
90 {return rectangular; break;}
91 case BDSBeamPipeType::lhc:
92 {return lhc; break;}
93 case BDSBeamPipeType::lhcdetailed:
94 {return lhcdetailed; break;}
95 case BDSBeamPipeType::rectellipse:
96 {return rectellipse; break;}
97 case BDSBeamPipeType::racetrack:
98 {return racetrack; break;}
99 case BDSBeamPipeType::octagonal:
100 {return octagonal; break;}
101 case BDSBeamPipeType::circularvacuum:
102 {return circularvacuum; break;}
103 case BDSBeamPipeType::clicpcl:
104 {return clicpcl; break;}
105 case BDSBeamPipeType::pointsfile:
106 {return pointsfile; break;}
107 case BDSBeamPipeType::rhombus:
108 {return rhombus; break;}
109 default:
110#ifdef BDSDEBUG
111 G4cout << __METHOD_NAME__ << "unknown type \"" << type << "\" - circular beampipe factory by default" << G4endl;
112#endif
113 return circular;
114 break;
115 }
116}
117
119 G4double length,
120 BDSBeamPipeInfo* bpi)
121{
122 BDSBeamPipeInfo copy = BDSBeamPipeInfo(*bpi);
123 copy.ShrinkBy(BDSGlobalConstants::Instance()->LengthSafetyLarge());
124 return CreateBeamPipe(BDSBeamPipeType::circularvacuum,
125 name,
126 length,
127 bpi->aper1,
128 bpi->aper2,
129 bpi->aper3,
130 bpi->aper4,
131 bpi->vacuumMaterial,
133 bpi->beamPipeMaterial);
134}
135
136BDSBeamPipe* BDSBeamPipeFactory::CreateBeamPipe(const G4String& name,
137 G4double length,
138 BDSBeamPipeInfo* bpi)
139{
140 if ((bpi->inputFaceNormal.z() > -1) || (bpi->outputFaceNormal.z() < 1))
141 {
142 return CreateBeamPipe(bpi->beamPipeType,
143 name,
144 length,
145 bpi->inputFaceNormal,
146 bpi->outputFaceNormal,
147 bpi->aper1,
148 bpi->aper2,
149 bpi->aper3,
150 bpi->aper4,
151 bpi->vacuumMaterial,
153 bpi->beamPipeMaterial,
154 bpi->pointsFileName,
155 bpi->pointsUnit);
156 }
157 else
158 {
159 return CreateBeamPipe(bpi->beamPipeType,
160 name,
161 length,
162 bpi->aper1,
163 bpi->aper2,
164 bpi->aper3,
165 bpi->aper4,
166 bpi->vacuumMaterial,
168 bpi->beamPipeMaterial,
169 bpi->pointsFileName,
170 bpi->pointsUnit);
171 }
172}
173
174BDSBeamPipe* BDSBeamPipeFactory::CreateBeamPipe(BDSBeamPipeType beamPipeType,
175 const G4String& name,
176 G4double length,
177 G4double aper1,
178 G4double aper2,
179 G4double aper3,
180 G4double aper4,
181 G4Material* vacuumMaterial,
182 G4double beamPipeThickness,
183 G4Material* beamPipeMaterial,
184 const G4String& pointsFileIn,
185 const G4String& pointsUnitIn)
186{
187 BDSBeamPipeFactoryBase* factory = GetAppropriateFactory(beamPipeType);
188 return factory->CreateBeamPipe(name,length,aper1,aper2,aper3,aper4,
189 vacuumMaterial,beamPipeThickness,beamPipeMaterial,
190 pointsFileIn,pointsUnitIn);
191}
192
193BDSBeamPipe* BDSBeamPipeFactory::CreateBeamPipe(BDSBeamPipeType beamPipeType,
194 const G4String& name,
195 G4double length,
196 const G4ThreeVector& inputFaceNormal,
197 const G4ThreeVector& outputFaceNormal,
198 G4double aper1,
199 G4double aper2,
200 G4double aper3,
201 G4double aper4,
202 G4Material* vacuumMaterial,
203 G4double beamPipeThickness,
204 G4Material* beamPipeMaterial,
205 const G4String& pointsFileIn,
206 const G4String& pointsUnitIn)
207{
208 BDSBeamPipeFactoryBase* factory = GetAppropriateFactory(beamPipeType);
209 return factory->CreateBeamPipe(name,length,inputFaceNormal,outputFaceNormal,aper1,
210 aper2,aper3,aper4,vacuumMaterial,beamPipeThickness,
211 beamPipeMaterial,pointsFileIn,pointsUnitIn);
212}
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)