BDSIM
BDSIM is a Geant4 extension toolkit for simulation of particle transport in accelerator beamlines.
BDSFieldType.cc
1/*
2Beam Delivery Simulation (BDSIM) Copyright (C) Royal Holloway,
3University of London 2001 - 2022.
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::dipole, "dipole"},
55 {BDSFieldType::quadrupole, "quadrupole"},
56 {BDSFieldType::dipolequadrupole, "dipolequadrupole"},
57 {BDSFieldType::sextupole, "sextupole"},
58 {BDSFieldType::octupole, "octupole"},
59 {BDSFieldType::decapole, "decapole"},
60 {BDSFieldType::multipole, "multipole"},
61 {BDSFieldType::muonspoiler, "muonspoiler"},
62 {BDSFieldType::skewquadrupole, "skewquadrupole"},
63 {BDSFieldType::skewsextupole, "skewsextupole"},
64 {BDSFieldType::skewoctupole, "skewoctupole"},
65 {BDSFieldType::skewdecapole, "skewdecapole"},
66 {BDSFieldType::rfcavity, "rfcavity"},
67 {BDSFieldType::rf, "rf"},
68 {BDSFieldType::undulator, "undulator"},
69 {BDSFieldType::rmatrix, "rmatrix"},
70 {BDSFieldType::paralleltransporter, "paralleltransporter"},
71 {BDSFieldType::cavityfringe, "cavityfringe"},
72 {BDSFieldType::dipole3d, "dipole3d"},
73 {BDSFieldType::multipoleouterdipole, "multipoleouterdipole"},
74 {BDSFieldType::multipoleouterquadrupole, "multipoleouterquadrupole"},
75 {BDSFieldType::multipoleoutersextupole, "multipoleoutersextupole"},
76 {BDSFieldType::multipoleouteroctupole, "multipoleouteroctupole"},
77 {BDSFieldType::multipoleouterdecapole, "multipoleouterdecapole"},
78 {BDSFieldType::skewmultipoleouterquadrupole, "skewmultipoleouterquadrupole"},
79 {BDSFieldType::skewmultipoleoutersextupole, "skewmultipoleoutersextupole"},
80 {BDSFieldType::skewmultipoleouteroctupole, "skewmultipoleouteroctupole"},
81 {BDSFieldType::skewmultipoleouterdecapole, "skewmultipoleouterdecapole"},
82 {BDSFieldType::multipoleouterdipole3d, "multipoleouterdipole3d"},
83 {BDSFieldType::multipoleouterdipolelhc, "multipoleouterdipolelhc"},
84 {BDSFieldType::multipoleouterquadrupolelhc, "multipoleouterquadrupolelhc"},
85 {BDSFieldType::multipoleoutersextupolelhc, "multipoleoutersextupolelhc"}
86});
87
89{
90 std::map<G4String, BDSFieldType> types;
91 types["none"] = BDSFieldType::none;
92 types["bfieldzero"] = BDSFieldType::bfieldzero;
93 types["efieldzero"] = BDSFieldType::efieldzero;
94 types["ebfieldzero"] = BDSFieldType::ebfieldzero;
95 types["teleporter"] = BDSFieldType::teleporter;
96 types["bmap1d"] = BDSFieldType::bmap1d;
97 types["bmap2d"] = BDSFieldType::bmap2d;
98 types["bmap3d"] = BDSFieldType::bmap3d;
99 types["bmap4d"] = BDSFieldType::bmap4d;
100 types["emap1d"] = BDSFieldType::emap1d;
101 types["emap2d"] = BDSFieldType::emap2d;
102 types["emap3d"] = BDSFieldType::emap3d;
103 types["emap4d"] = BDSFieldType::emap4d;
104 types["ebmap1d"] = BDSFieldType::ebmap1d;
105 types["ebmap2d"] = BDSFieldType::ebmap2d;
106 types["ebmap3d"] = BDSFieldType::ebmap3d;
107 types["ebmap4d"] = BDSFieldType::ebmap4d;
108 types["mokka"] = BDSFieldType::mokka;
109 types["solenoid"] = BDSFieldType::solenoid;
110 types["solenoidsheet"] = BDSFieldType::solenoidsheet;
111 types["dipole"] = BDSFieldType::dipole;
112 types["quadrupole"] = BDSFieldType::quadrupole;
113 types["dipolequadrupole"] = BDSFieldType::dipolequadrupole;
114 types["sextupole"] = BDSFieldType::sextupole;
115 types["octupole"] = BDSFieldType::octupole;
116 types["decapole"] = BDSFieldType::decapole;
117 types["multipole"] = BDSFieldType::multipole;
118 types["muonspoiler"] = BDSFieldType::muonspoiler;
119 types["skewquadrupole"] = BDSFieldType::skewquadrupole;
120 types["skewsextupole"] = BDSFieldType::skewsextupole;
121 types["skewoctupole"] = BDSFieldType::skewoctupole;
122 types["skewdecapole"] = BDSFieldType::skewdecapole;
123 types["rfcavity"] = BDSFieldType::rfcavity;
124 types["rf"] = BDSFieldType::rf;
125 types["undulator"] = BDSFieldType::undulator;
126 types["rmatrix"] = BDSFieldType::rmatrix;
127 types["paralleltransporter"] = BDSFieldType::paralleltransporter;
128 types["cavityfringe"] = BDSFieldType::cavityfringe;
129 types["dipole3d"] = BDSFieldType::dipole3d;
130 types["multipoleouterdipole"] = BDSFieldType::multipoleouterdipole;
131 types["multipoleouterquadrupole"] = BDSFieldType::multipoleouterquadrupole;
132 types["multipoleoutersextupole"] = BDSFieldType::multipoleoutersextupole;
133 types["multipoleouteroctupole"] = BDSFieldType::multipoleouteroctupole;
134 types["multipoleouterdecapole"] = BDSFieldType::multipoleouterdecapole;
135 types["skewmultipoleouterquadrupole"] = BDSFieldType::skewmultipoleouterquadrupole;
136 types["skewmultipoleoutersextupole"] = BDSFieldType::skewmultipoleoutersextupole;
137 types["skewmultipoleouteroctupole"] = BDSFieldType::skewmultipoleouteroctupole;
138 types["skewmultipoleouterdecapole"] = BDSFieldType::skewmultipoleouterdecapole;
139 types["multipoleouterdipole3d"] = BDSFieldType::multipoleouterdipole3d;
140 types["multipoleouterdipolelhc"] = BDSFieldType::multipoleouterdipolelhc;
141 types["multipoleouterquadrupolelhc"] = BDSFieldType::multipoleouterquadrupolelhc;
142 types["multipoleoutersextupolelhc"] = BDSFieldType::multipoleoutersextupolelhc;
143
144 bType = BDS::LowerCase(bType);
145
146 auto result = types.find(bType);
147 if (result == types.end())
148 {// it's not a valid key
149 G4String msg = "\"" + bType + "\" is not a valid field type\n";
150 msg += "Available field types are:\n";
151 for (const auto& it : types)
152 {msg += "\"" + it.first + "\"\n";}
153 throw BDSException(__METHOD_NAME__, msg);
154 }
155
156#ifdef BDSDEBUG
157 G4cout << __METHOD_NAME__ << "determined field type to be " << result->second << G4endl;
158#endif
159 return result->second;
160}
General exception with possible name of object and message.
Definition: BDSException.hh:35
static std::map< BDSTypeSafeEnum< fieldtypes_def, int >, std::string > * dictionary
BDSFieldType DetermineFieldType(G4String fieldType)
Function that gives corresponding enum value for string (case-insensitive)
Definition: BDSFieldType.cc:88
G4String LowerCase(const G4String &str)
Utility function to simplify lots of syntax changes for pedantic g4 changes.