20bool mirror_field_is_unset(
const std::string& value) {
27 const std::shared_ptr<GLogger>& logger) :
GBase(logger),
31 "Incorrect number of mirror parameters for ", pars[0],
". Expected ",
47 for (
const auto& [field, value] : std::initializer_list<std::pair<const char*, const std::string&>>{
48 {
"type", type}, {
"finish", finish}, {
"model", model}, {
"border", border}}) {
49 if (mirror_field_is_unset(value)) {
56 if (mirror_field_is_unset(matOptProps)) { matOptProps.clear(); }
58 getMirrorPropertyFromString(pars[i++],
"photonEnergy");
59 getMirrorPropertyFromString(pars[i++],
"indexOfRefraction");
60 getMirrorPropertyFromString(pars[i++],
"reflectivity");
61 getMirrorPropertyFromString(pars[i++],
"efficiency");
62 getMirrorPropertyFromString(pars[i++],
"specularlobe");
63 getMirrorPropertyFromString(pars[i++],
"specularspike");
64 getMirrorPropertyFromString(pars[i++],
"backscatter");
65 getMirrorPropertyFromString(pars[i++],
"transmittance");
69 if (!mirror_field_is_unset(sigmaAlphaPar) && sigmaAlphaPar !=
"-1") {
71 sigmaAlpha = std::stod(sigmaAlphaPar);
74 catch (
const std::exception&) {
80 if (matOptProps.empty() && photonEnergy.empty()) {
82 ">: no optical properties. Set matOptProps or photonEnergy with the properties tables");
86 for (
const auto& [property, values] : std::initializer_list<std::pair<const char*, const std::vector<double>&>>{
87 {
"indexOfRefraction", indexOfRefraction}, {
"reflectivity", reflectivity},
88 {
"efficiency", efficiency}, {
"specularlobe", specularlobe},
89 {
"specularspike", specularspike}, {
"backscatter", backscatter},
90 {
"transmittance", transmittance}}) {
91 if (!values.empty() && values.size() != photonEnergy.size()) {
93 values.size(),
" entries but photonEnergy has ", photonEnergy.size());
100void GMirror::getMirrorPropertyFromString(
const std::string& parameter,
const std::string& propertyName) {
102 if (mirror_field_is_unset(parameter)) {
return; }
105 std::stringstream parameterComponents(parameter);
107 while (!parameterComponents.eof()) {
108 std::string component;
109 parameterComponents >> component;
112 if (trimmedComponent.empty()) {
continue; }
115 else if (propertyName ==
"indexOfRefraction") {
118 else if (propertyName ==
"reflectivity") { reflectivity.push_back(
gutilities::getG4Number(trimmedComponent)); }
120 else if (propertyName ==
"specularlobe") { specularlobe.push_back(
gutilities::getG4Number(trimmedComponent)); }
121 else if (propertyName ==
"specularspike") {
125 else if (propertyName ==
"transmittance") {
133 stream <<
" - Mirror: " << gMir.name <<
" in system " << gMir.system <<
": " << std::endl;
134 stream <<
" Type / Finish / Model: " << gMir.type <<
" / " << gMir.finish <<
" / " << gMir.model << std::endl;
135 stream <<
" Border: " << gMir.border << std::endl;
136 if (!gMir.matOptProps.empty()) {
137 stream <<
" Optical properties from material: " << gMir.matOptProps << std::endl;
139 else { stream <<
" Optical properties at " << gMir.photonEnergy.size() <<
" photon energies" << std::endl; }
140 if (gMir.sigmaAlphaSet) { stream <<
" Sigma Alpha: " << gMir.sigmaAlpha << std::endl; }
141 stream <<
" Description: " << gMir.description << std::endl;
std::shared_ptr< GLogger > log
void error(int exit_code, Args &&... args) const
Optical boundary (surface) definition belonging to a detector system.
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.
#define GMIRRORSKINSURFACE
Border value marking an optical surface applied to the whole volume skin.
#define ERR_GMIRRORINVALID
#define GMIRRORNUMBEROFPARS
Number of database parameters defining a gmirror entry.
#define ERR_GWRONGNUMBEROFPARS
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)