18#include "BDSArrayReflectionType.hh"
20#include "BDSException.hh"
21#include "BDSUtilities.hh"
34 new std::map<BDSArrayReflectionType, std::string> ({
35 {BDSArrayReflectionType::flipx,
"flipx"},
36 {BDSArrayReflectionType::flipy,
"flipy"},
37 {BDSArrayReflectionType::flipz,
"flipz"},
38 {BDSArrayReflectionType::flipt,
"flipt"},
39 {BDSArrayReflectionType::reflectx,
"reflectx"},
40 {BDSArrayReflectionType::reflecty,
"reflecty"},
41 {BDSArrayReflectionType::reflectz,
"reflectz"},
42 {BDSArrayReflectionType::reflectt,
"reflectt"},
43 {BDSArrayReflectionType::reflectxydipole,
"reflectxydipole"},
44 {BDSArrayReflectionType::reflectxzdipole,
"reflectxzdipole"},
45 {BDSArrayReflectionType::reflectyzdipole,
"reflectyzdipole"},
46 {BDSArrayReflectionType::reflectzsolenoid,
"reflectzsolenoid"},
47 {BDSArrayReflectionType::reflectxyquadrupole,
"reflectxyquadrupole"}
52 std::map<G4String, BDSArrayReflectionType> types;
53 types[
"flipx"] = BDSArrayReflectionType::flipx;
54 types[
"flipy"] = BDSArrayReflectionType::flipy;
55 types[
"flipz"] = BDSArrayReflectionType::flipz;
56 types[
"flipt"] = BDSArrayReflectionType::flipt;
57 types[
"reflectx"] = BDSArrayReflectionType::reflectx;
58 types[
"reflecty"] = BDSArrayReflectionType::reflecty;
59 types[
"reflectz"] = BDSArrayReflectionType::reflectz;
60 types[
"reflectt"] = BDSArrayReflectionType::reflectt;
61 types[
"reflectxydipole"] = BDSArrayReflectionType::reflectxydipole;
62 types[
"reflectxzdipole"] = BDSArrayReflectionType::reflectxzdipole;
63 types[
"reflectyzdipole"] = BDSArrayReflectionType::reflectyzdipole;
64 types[
"reflectzsolenoid"] = BDSArrayReflectionType::reflectzsolenoid;
65 types[
"reflectxyquadrupole"] = BDSArrayReflectionType::reflectxyquadrupole;
69 auto result = types.find(arrayReflectionType);
70 if (result == types.end())
72 G4String msg =
"\"" + arrayReflectionType +
"\" is not a valid array reflection type\n";
73 msg +=
"Available array reflection types are:\n";
74 for (
const auto& it : types)
75 {msg +=
"\"" + it.first +
"\"\n";}
80 G4cout << __METHOD_NAME__ <<
"determined array reflection type to be " << result->second << G4endl;
82 return result->second;
87 BDSArrayReflectionTypeSet result;
89 for (
const auto& word : words)
100 const std::map<BDSArrayReflectionType, BDSArrayReflectionType> substitutions = {
101 {BDSArrayReflectionType::flipx, BDSArrayReflectionType::flipsimple},
102 {BDSArrayReflectionType::flipy, BDSArrayReflectionType::flipsimple},
103 {BDSArrayReflectionType::flipz, BDSArrayReflectionType::flipsimple},
104 {BDSArrayReflectionType::flipt, BDSArrayReflectionType::flipsimple},
105 {BDSArrayReflectionType::reflectx, BDSArrayReflectionType::reflectsimple},
106 {BDSArrayReflectionType::reflecty, BDSArrayReflectionType::reflectsimple},
107 {BDSArrayReflectionType::reflectz, BDSArrayReflectionType::reflectsimple},
108 {BDSArrayReflectionType::reflectt, BDSArrayReflectionType::reflectsimple},
109 {BDSArrayReflectionType::reflectxydipole, BDSArrayReflectionType::reflectadvanced},
110 {BDSArrayReflectionType::reflectxzdipole, BDSArrayReflectionType::reflectadvanced},
111 {BDSArrayReflectionType::reflectyzdipole, BDSArrayReflectionType::reflectadvanced},
112 {BDSArrayReflectionType::reflectzsolenoid, BDSArrayReflectionType::reflectadvanced},
113 {BDSArrayReflectionType::reflectxyquadrupole, BDSArrayReflectionType::reflectadvanced}
116 BDSArrayReflectionTypeSet test;
117 BDSArrayReflectionTypeSet testAdvanced;
118 for (
const auto& reflection : setIn)
120 auto sub = substitutions.at(reflection);
122 if (sub == BDSArrayReflectionType::reflectadvanced)
123 {testAdvanced.insert(reflection);}
125 auto testSize = test.size();
126 auto testAdvancedSize = testAdvanced.size();
127 if (testSize <= 1 && testAdvancedSize <= 1)
129 else if (testAdvancedSize > 1)
132 {(*details) +=
"more than one 'specific' type of reflection - only one allowed";}
139std::ostream& operator<< (std::ostream &out, BDSArrayReflectionTypeSet
const& t)
141 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'.