BDSIM
BDSIM is a Geant4 extension toolkit for simulation of particle transport in accelerator beamlines.
Loading...
Searching...
No Matches
BDSFieldType.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 "BDSFieldType.hh"
20#include "BDSDebug.hh"
21#include "BDSException.hh"
22#include "BDSUtilities.hh"
23
24#include "globals.hh"
25#include "G4String.hh"
26
27#include <map>
28#include <string>
29
30// dictionary for BDSFieldType for reflexivity
31template<>
32std::map<BDSFieldType, std::string>* BDSFieldType::dictionary =
33 new std::map<BDSFieldType, std::string> ({
34 {BDSFieldType::none, "none"},
35 {BDSFieldType::bfieldzero, "bfieldzero"},
36 {BDSFieldType::efieldzero, "efieldzero"},
37 {BDSFieldType::ebfieldzero, "ebfieldzero"},
38 {BDSFieldType::teleporter, "teleporter"},
39 {BDSFieldType::bmap1d, "bmap1d"},
40 {BDSFieldType::bmap2d, "bmap2d"},
41 {BDSFieldType::bmap3d, "bmap3d"},
42 {BDSFieldType::bmap4d, "bmap4d"},
43 {BDSFieldType::emap1d, "emap1d"},
44 {BDSFieldType::emap2d, "emap2d"},
45 {BDSFieldType::emap3d, "emap3d"},
46 {BDSFieldType::emap4d, "emap4d"},
47 {BDSFieldType::ebmap1d, "ebmap1d"},
48 {BDSFieldType::ebmap2d, "ebmap2d"},
49 {BDSFieldType::ebmap3d, "ebmap3d"},
50 {BDSFieldType::ebmap4d, "ebmap4d"},
51 {BDSFieldType::mokka, "mokka"},
52 {BDSFieldType::solenoid, "solenoid"},
53 {BDSFieldType::solenoidsheet, "solenoidsheet"},
54 {BDSFieldType::solenoidloop, "solenoidloop"},
55 {BDSFieldType::solenoidblock, "solenoidblock"},
56 {BDSFieldType::gaborlens, "gaborlens"},
57 {BDSFieldType::dipole, "dipole"},
58 {BDSFieldType::dipoleenge, "dipoleenge"},
59 {BDSFieldType::quadrupole, "quadrupole"},
60 {BDSFieldType::dipolequadrupole, "dipolequadrupole"},
61 {BDSFieldType::sextupole, "sextupole"},
62 {BDSFieldType::octupole, "octupole"},
63 {BDSFieldType::decapole, "decapole"},
64 {BDSFieldType::multipole, "multipole"},
65 {BDSFieldType::muonspoiler, "muonspoiler"},
66 {BDSFieldType::muoncooler, "muoncooler"},
67 {BDSFieldType::skewquadrupole, "skewquadrupole"},
68 {BDSFieldType::skewsextupole, "skewsextupole"},
69 {BDSFieldType::skewoctupole, "skewoctupole"},
70 {BDSFieldType::skewdecapole, "skewdecapole"},
71 {BDSFieldType::rfpillbox, "rfpillbox"},
72 {BDSFieldType::rfconstantinx, "rfconstantinx"},
73 {BDSFieldType::rfconstantiny, "rfconstantiny"},
74 {BDSFieldType::rfconstantinz, "rfconstantinz"},
75 {BDSFieldType::undulator, "undulator"},
76 {BDSFieldType::rmatrix, "rmatrix"},
77 {BDSFieldType::paralleltransporter, "paralleltransporter"},
78 {BDSFieldType::cavityfringe, "cavityfringe"},
79 {BDSFieldType::dipole3d, "dipole3d"},
80 {BDSFieldType::multipoleouterdipole, "multipoleouterdipole"},
81 {BDSFieldType::multipoleouterquadrupole, "multipoleouterquadrupole"},
82 {BDSFieldType::multipoleoutersextupole, "multipoleoutersextupole"},
83 {BDSFieldType::multipoleouteroctupole, "multipoleouteroctupole"},
84 {BDSFieldType::multipoleouterdecapole, "multipoleouterdecapole"},
85 {BDSFieldType::skewmultipoleouterquadrupole, "skewmultipoleouterquadrupole"},
86 {BDSFieldType::skewmultipoleoutersextupole, "skewmultipoleoutersextupole"},
87 {BDSFieldType::skewmultipoleouteroctupole, "skewmultipoleouteroctupole"},
88 {BDSFieldType::skewmultipoleouterdecapole, "skewmultipoleouterdecapole"},
89 {BDSFieldType::multipoleouterdipole3d, "multipoleouterdipole3d"},
90 {BDSFieldType::multipoleouterdipolelhc, "multipoleouterdipolelhc"},
91 {BDSFieldType::multipoleouterquadrupolelhc, "multipoleouterquadrupolelhc"},
92 {BDSFieldType::multipoleoutersextupolelhc, "multipoleoutersextupolelhc"}
93});
94
96{
97 std::map<G4String, BDSFieldType> types;
98 types["none"] = BDSFieldType::none;
99 types["bfieldzero"] = BDSFieldType::bfieldzero;
100 types["efieldzero"] = BDSFieldType::efieldzero;
101 types["ebfieldzero"] = BDSFieldType::ebfieldzero;
102 types["teleporter"] = BDSFieldType::teleporter;
103 types["bmap1d"] = BDSFieldType::bmap1d;
104 types["bmap2d"] = BDSFieldType::bmap2d;
105 types["bmap3d"] = BDSFieldType::bmap3d;
106 types["bmap4d"] = BDSFieldType::bmap4d;
107 types["emap1d"] = BDSFieldType::emap1d;
108 types["emap2d"] = BDSFieldType::emap2d;
109 types["emap3d"] = BDSFieldType::emap3d;
110 types["emap4d"] = BDSFieldType::emap4d;
111 types["ebmap1d"] = BDSFieldType::ebmap1d;
112 types["ebmap2d"] = BDSFieldType::ebmap2d;
113 types["ebmap3d"] = BDSFieldType::ebmap3d;
114 types["ebmap4d"] = BDSFieldType::ebmap4d;
115 types["mokka"] = BDSFieldType::mokka;
116 types["solenoid"] = BDSFieldType::solenoid;
117 types["solenoidsheet"] = BDSFieldType::solenoidsheet;
118 types["solenoidloop"] = BDSFieldType::solenoidloop;
119 types["solenoidblock"] = BDSFieldType::solenoidblock;
120 types["gaborlens"] = BDSFieldType::gaborlens;
121 types["dipole"] = BDSFieldType::dipole;
122 types["dipoleenge"] = BDSFieldType::dipoleenge;
123 types["quadrupole"] = BDSFieldType::quadrupole;
124 types["dipolequadrupole"] = BDSFieldType::dipolequadrupole;
125 types["sextupole"] = BDSFieldType::sextupole;
126 types["octupole"] = BDSFieldType::octupole;
127 types["decapole"] = BDSFieldType::decapole;
128 types["multipole"] = BDSFieldType::multipole;
129 types["muonspoiler"] = BDSFieldType::muonspoiler;
130 types["muoncooler"] = BDSFieldType::muoncooler;
131 types["skewquadrupole"] = BDSFieldType::skewquadrupole;
132 types["skewsextupole"] = BDSFieldType::skewsextupole;
133 types["skewoctupole"] = BDSFieldType::skewoctupole;
134 types["skewdecapole"] = BDSFieldType::skewdecapole;
135 types["rfpillbox"] = BDSFieldType::rfpillbox;
136 types["rfconstantinx"] = BDSFieldType::rfconstantinx;
137 types["rfconstantiny"] = BDSFieldType::rfconstantiny;
138 types["rfconstantinz"] = BDSFieldType::rfconstantinz;
139 types["undulator"] = BDSFieldType::undulator;
140 types["rmatrix"] = BDSFieldType::rmatrix;
141 types["paralleltransporter"] = BDSFieldType::paralleltransporter;
142 types["cavityfringe"] = BDSFieldType::cavityfringe;
143 types["dipole3d"] = BDSFieldType::dipole3d;
144 types["multipoleouterdipole"] = BDSFieldType::multipoleouterdipole;
145 types["multipoleouterquadrupole"] = BDSFieldType::multipoleouterquadrupole;
146 types["multipoleoutersextupole"] = BDSFieldType::multipoleoutersextupole;
147 types["multipoleouteroctupole"] = BDSFieldType::multipoleouteroctupole;
148 types["multipoleouterdecapole"] = BDSFieldType::multipoleouterdecapole;
149 types["skewmultipoleouterquadrupole"] = BDSFieldType::skewmultipoleouterquadrupole;
150 types["skewmultipoleoutersextupole"] = BDSFieldType::skewmultipoleoutersextupole;
151 types["skewmultipoleouteroctupole"] = BDSFieldType::skewmultipoleouteroctupole;
152 types["skewmultipoleouterdecapole"] = BDSFieldType::skewmultipoleouterdecapole;
153 types["multipoleouterdipole3d"] = BDSFieldType::multipoleouterdipole3d;
154 types["multipoleouterdipolelhc"] = BDSFieldType::multipoleouterdipolelhc;
155 types["multipoleouterquadrupolelhc"] = BDSFieldType::multipoleouterquadrupolelhc;
156 types["multipoleoutersextupolelhc"] = BDSFieldType::multipoleoutersextupolelhc;
157
158 bType = BDS::LowerCase(bType);
159
160 auto result = types.find(bType);
161 if (result == types.end())
162 {// it's not a valid key
163 G4String msg = "\"" + bType + "\" is not a valid field type\n";
164 msg += "Available field types are:\n";
165 for (const auto& it : types)
166 {msg += "\"" + it.first + "\"\n";}
167 throw BDSException(__METHOD_NAME__, msg);
168 }
169
170#ifdef BDSDEBUG
171 G4cout << __METHOD_NAME__ << "determined field type to be " << result->second << G4endl;
172#endif
173 return result->second;
174}
General exception with possible name of object and message.
static std::map< BDSTypeSafeEnum< fieldtypes_def, int >, std::string > * dictionary
BDSFieldType DetermineFieldType(G4String fieldType)
Function that gives corresponding enum value for string (case-insensitive)
G4String LowerCase(const G4String &str)
Utility function to simplify lots of syntax changes for pedantic g4 changes.