20bool mirror_field_is_unset(
const std::string& value) {
27 const std::shared_ptr<GLogger>& logger) :
GBase(logger),
31 gsystem::ERR_GWRONGNUMBEROFPARS,
32 "Incorrect number of mirror parameters for %1. Expected %2 but we got %3", pars[0],
33 gsystem::GMIRRORNUMBEROFPARS, pars.size());
48 for (
const auto& [field, value] : std::initializer_list<std::pair<const char*, const std::string&>>{
49 {
"type", type}, {
"finish", finish}, {
"model", model}, {
"border", border}}) {
50 if (mirror_field_is_unset(value)) {
58 if (mirror_field_is_unset(matOptProps)) { matOptProps.clear(); }
60 getMirrorPropertyFromString(pars[i++],
"photonEnergy");
61 getMirrorPropertyFromString(pars[i++],
"indexOfRefraction");
62 getMirrorPropertyFromString(pars[i++],
"reflectivity");
63 getMirrorPropertyFromString(pars[i++],
"efficiency");
64 getMirrorPropertyFromString(pars[i++],
"specularlobe");
65 getMirrorPropertyFromString(pars[i++],
"specularspike");
66 getMirrorPropertyFromString(pars[i++],
"backscatter");
67 getMirrorPropertyFromString(pars[i++],
"transmittance");
71 if (!mirror_field_is_unset(sigmaAlphaPar) && sigmaAlphaPar !=
"-1") {
73 sigmaAlpha = std::stod(sigmaAlphaPar);
76 catch (
const std::exception&) {
84 if (matOptProps.empty() && photonEnergy.empty()) {
87 "mirror <%1>: no optical properties. Set matOptProps or photonEnergy with the properties tables",
92 for (
const auto& [property, values] : std::initializer_list<std::pair<
const char*,
const std::vector<double>&>>{
93 {
"indexOfRefraction", indexOfRefraction}, {
"reflectivity", reflectivity},
94 {
"efficiency", efficiency}, {
"specularlobe", specularlobe},
95 {
"specularspike", specularspike}, {
"backscatter", backscatter},
96 {
"transmittance", transmittance}}) {
97 if (!values.empty() && values.size() != photonEnergy.size()) {
100 "mirror <%1>: property <%2> has %3 entries but photonEnergy has %4", name, property,
101 values.size(), photonEnergy.size());
108void GMirror::getMirrorPropertyFromString(
const std::string& parameter,
const std::string& propertyName) {
110 if (mirror_field_is_unset(parameter)) {
return; }
113 std::stringstream parameterComponents(parameter);
115 while (!parameterComponents.eof()) {
116 std::string component;
117 parameterComponents >> component;
120 if (trimmedComponent.empty()) {
continue; }
123 else if (propertyName ==
"indexOfRefraction") {
126 else if (propertyName ==
"reflectivity") { reflectivity.push_back(
gutilities::getG4Number(trimmedComponent)); }
128 else if (propertyName ==
"specularlobe") { specularlobe.push_back(
gutilities::getG4Number(trimmedComponent)); }
129 else if (propertyName ==
"specularspike") {
133 else if (propertyName ==
"transmittance") {
141 stream <<
" - Mirror: " << gMir.name <<
" in system " << gMir.system <<
": " << std::endl;
142 stream <<
" Type / Finish / Model: " << gMir.type <<
" / " << gMir.finish <<
" / " << gMir.model << std::endl;
143 stream <<
" Border: " << gMir.border << std::endl;
144 if (!gMir.matOptProps.empty()) {
145 stream <<
" Optical properties from material: " << gMir.matOptProps << std::endl;
147 else { stream <<
" Optical properties at " << gMir.photonEnergy.size() <<
" photon energies" << std::endl; }
148 if (gMir.sigmaAlphaSet) { stream <<
" Sigma Alpha: " << gMir.sigmaAlpha << std::endl; }
149 stream <<
" Description: " << gMir.description << std::endl;
GBase(const std::shared_ptr< GOptions > &gopt, std::string logger_name="")
std::shared_ptr< GLogger > log
GMirror(const std::string &system, std::vector< std::string > pars, const std::shared_ptr< GLogger > &logger)
Construct a mirror from a serialized parameter list.
bool isSkinSurface() const
std::ostream & operator<<(std::ostream &stream, const GMirror &gMir)
Conventions and shared constants for the detector-system module.
constexpr char GMIRRORSKINSURFACE[]
Border value marking an optical surface applied to the whole volume skin.
constexpr int GMIRRORNUMBEROFPARS
Number of database parameters defining a gmirror entry.
constexpr int ERR_GMIRRORINVALID
double getG4Number(const string &v, bool warnIfNotUnit=false)
string removeAllSpacesFromString(const std::string &str)
bool is_unset(std::string_view s)
string removeLeadingAndTrailingSpacesFromString(const std::string &input)