19#include "BDSArrayReflectionType.hh"
21#include "BDSException.hh"
22#include "BDSUtilities.hh"
35 new std::map<BDSArrayReflectionType, std::string> ({
36 {BDSArrayReflectionType::flipx,
"flipx"},
37 {BDSArrayReflectionType::flipy,
"flipy"},
38 {BDSArrayReflectionType::flipz,
"flipz"},
39 {BDSArrayReflectionType::flipt,
"flipt"},
40 {BDSArrayReflectionType::reflectx,
"reflectx"},
41 {BDSArrayReflectionType::reflecty,
"reflecty"},
42 {BDSArrayReflectionType::reflectz,
"reflectz"},
43 {BDSArrayReflectionType::reflectt,
"reflectt"},
44 {BDSArrayReflectionType::reflectxydipole,
"reflectxydipole"},
45 {BDSArrayReflectionType::reflectxzdipole,
"reflectxzdipole"},
46 {BDSArrayReflectionType::reflectyzdipole,
"reflectyzdipole"},
47 {BDSArrayReflectionType::reflectzsolenoid,
"reflectzsolenoid"},
48 {BDSArrayReflectionType::reflectxyquadrupole,
"reflectxyquadrupole"}
53 std::map<G4String, BDSArrayReflectionType> types;
54 types[
"flipx"] = BDSArrayReflectionType::flipx;
55 types[
"flipy"] = BDSArrayReflectionType::flipy;
56 types[
"flipz"] = BDSArrayReflectionType::flipz;
57 types[
"flipt"] = BDSArrayReflectionType::flipt;
58 types[
"reflectx"] = BDSArrayReflectionType::reflectx;
59 types[
"reflecty"] = BDSArrayReflectionType::reflecty;
60 types[
"reflectz"] = BDSArrayReflectionType::reflectz;
61 types[
"reflectt"] = BDSArrayReflectionType::reflectt;
62 types[
"reflectxydipole"] = BDSArrayReflectionType::reflectxydipole;
63 types[
"reflectxzdipole"] = BDSArrayReflectionType::reflectxzdipole;
64 types[
"reflectyzdipole"] = BDSArrayReflectionType::reflectyzdipole;
65 types[
"reflectzsolenoid"] = BDSArrayReflectionType::reflectzsolenoid;
66 types[
"reflectxyquadrupole"] = BDSArrayReflectionType::reflectxyquadrupole;
70 auto result = types.find(arrayReflectionType);
71 if (result == types.end())
73 G4String msg =
"\"" + arrayReflectionType +
"\" is not a valid array reflection type\n";
74 msg +=
"Available array reflection types are:\n";
75 for (
const auto& it : types)
76 {msg +=
"\"" + it.first +
"\"\n";}
81 G4cout << __METHOD_NAME__ <<
"determined array reflection type to be " << result->second << G4endl;
83 return result->second;
88 BDSArrayReflectionTypeSet result;
90 for (
const auto& word : words)
101 const std::map<BDSArrayReflectionType, BDSArrayReflectionType> substitutions = {
102 {BDSArrayReflectionType::flipx, BDSArrayReflectionType::flipsimple},
103 {BDSArrayReflectionType::flipy, BDSArrayReflectionType::flipsimple},
104 {BDSArrayReflectionType::flipz, BDSArrayReflectionType::flipsimple},
105 {BDSArrayReflectionType::flipt, BDSArrayReflectionType::flipsimple},
106 {BDSArrayReflectionType::reflectx, BDSArrayReflectionType::reflectsimple},
107 {BDSArrayReflectionType::reflecty, BDSArrayReflectionType::reflectsimple},
108 {BDSArrayReflectionType::reflectz, BDSArrayReflectionType::reflectsimple},
109 {BDSArrayReflectionType::reflectt, BDSArrayReflectionType::reflectsimple},
110 {BDSArrayReflectionType::reflectxydipole, BDSArrayReflectionType::reflectadvanced},
111 {BDSArrayReflectionType::reflectxzdipole, BDSArrayReflectionType::reflectadvanced},
112 {BDSArrayReflectionType::reflectyzdipole, BDSArrayReflectionType::reflectadvanced},
113 {BDSArrayReflectionType::reflectzsolenoid, BDSArrayReflectionType::reflectadvanced},
114 {BDSArrayReflectionType::reflectxyquadrupole, BDSArrayReflectionType::reflectadvanced}
117 BDSArrayReflectionTypeSet test;
118 BDSArrayReflectionTypeSet testAdvanced;
119 for (
const auto& reflection : setIn)
121 auto sub = substitutions.at(reflection);
123 if (sub == BDSArrayReflectionType::reflectadvanced)
124 {testAdvanced.insert(reflection);}
126 auto testSize = test.size();
127 auto testAdvancedSize = testAdvanced.size();
128 if (testSize <= 1 && testAdvancedSize <= 1)
130 else if (testAdvancedSize > 1)
133 {(*details) +=
"more than one 'specific' type of reflection - only one allowed";}
140std::ostream& operator<< (std::ostream &out, BDSArrayReflectionTypeSet
const& t)
142 for (
const auto& v : t)
General exception with possible name of object and message.
Improve type-safety of native enum data type in C++.
static std::map< BDSTypeSafeEnum< def, inner >, std::string > * dictionary
BDSArrayReflectionTypeSet DetermineArrayReflectionTypeSet(const G4String &arrayReflectionType)
Return a std::set of reflection types. Split string on white space.
G4String LowerCase(const G4String &str)
Utility function to simplify lots of syntax changes for pedantic g4 changes.
BDSArrayReflectionType DetermineArrayReflectionType(G4String arrayReflectionType)
Function that gives corresponding enum value for string (case-insensitive)
G4bool ProblemWithArrayReflectionCombination(const BDSArrayReflectionTypeSet &setIn, G4String *details=nullptr)
Return true if there's a conceptual conflict with the set of field reflections requested.
std::vector< G4String > SplitOnWhiteSpace(const G4String &input)
Split a string on whitespace and return a vector of these 'words'.