// reads property maps from data files bool get_fileprops(const char* pcFile, t_map& mapProps) { std::ifstream ifstr(pcFile); if(!ifstr) { tl::log_err("Cannot open file \"", pcFile, "\"."); return 0; } std::string strLine; while(std::getline(ifstr, strLine)) { tl::trim(strLine); // only collect lines starting with "#" if(!strLine.size() || strLine[0] != '#') continue; // ignore comments starting with "##" if(strLine.size()>=2 && strLine[0]=='#' && strLine[1]=='#') continue; strLine = strLine.substr(1); std::pair<std::string, std::string> strKeyVal = tl::split_first(strLine, std::string("="), 1); std::string& strKey = strKeyVal.first; std::string& _strVal = strKeyVal.second; if(!strKey.size()) continue; std::vector<t_real> vecHKLE; tl::get_tokens<t_real>(_strVal, std::string(" \t"), vecHKLE); // value & error pair if(_strVal.find("+-") != std::string::npos) { std::pair<std::string, std::string> strValErr = tl::split_first(_strVal, std::string("+-"), 1, 1); std::string& strVal = strValErr.first; std::string& strErr = strValErr.second; //std::cout << strKey << ": " << strVal << ", " << strErr << std::endl; if(strVal.length()) { t_real dVal = tl::str_to_var<t_real>(strVal); t_real dErr = tl::str_to_var<t_real>(strErr); mapProps.insert(t_map::value_type(strKey, {dVal, dErr})); } } // hklE values -> split them, e.g. "scan_dir = 0 0 0 1" -> "scan_dir_h = 0", ... else if(vecHKLE.size()==3 || vecHKLE.size()==4) { std::vector<std::string> vecSuffixes = {"_h", "_k", "_l", "_E"}; std::size_t iNumCoords = std::min(vecSuffixes.size(), vecHKLE.size()); for(std::size_t iCoord=0; iCoord<iNumCoords; ++iCoord) { std::string strNewKey = strKey + vecSuffixes[iCoord]; mapProps.insert(t_map::value_type(strNewKey, {vecHKLE[iCoord], 0.})); } } else { tl::log_warn("Unknown key: \"", strKey, "\"."); continue; } } return 1; }