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