diff --git a/modules/io/src/mol/mmcif_reader.cc b/modules/io/src/mol/mmcif_reader.cc index f04e15f375931d8a722f6f47fd8b894b65513a40..ee1bdc506f0a9ff63d1f265b60a2e2a0d34bba8f 100644 --- a/modules/io/src/mol/mmcif_reader.cc +++ b/modules/io/src/mol/mmcif_reader.cc @@ -517,7 +517,10 @@ void MMCifReader::ParseAndAddAtom(const std::vector<StringRef>& columns) } if (indices_[OCCUPANCY] != -1) { // unit test - occ = this->TryGetReal(columns[indices_[OCCUPANCY]], "atom_site.occupancy"); + occ = this->GetRealOrDefault(columns[indices_[OCCUPANCY]], + "atom_site.occupancy", + 1.0, + is_undef); } if (indices_[B_ISO_OR_EQUIV] != -1) { if (!is_undef(columns[indices_[B_ISO_OR_EQUIV]])) { diff --git a/modules/io/src/mol/star_parser.cc b/modules/io/src/mol/star_parser.cc index c16bc24831c4b1ab5128e7606544f0100a1b470b..9c240a179312cdf0610f066018156268775b5770 100644 --- a/modules/io/src/mol/star_parser.cc +++ b/modules/io/src/mol/star_parser.cc @@ -98,6 +98,18 @@ Real StarParser::TryGetReal(const StringRef& data, const String& name) const return value.second; } +Real StarParser::GetRealOrDefault(const StringRef& data, + const String& name, + Real alt, + bool (*is_default)(StringRef)) const +{ + if(is_default(data)) { + return alt; + } + + return TryGetReal(data, name); +} + float StarParser::TryGetFloat(const StringRef& data, const String& name) const { std::pair<bool, float> value = data.to_float(); diff --git a/modules/io/src/mol/star_parser.hh b/modules/io/src/mol/star_parser.hh index bc6a3947a6694ec83e8e3fd699d30223cc87359f..ba00f43980d4aa6346b74119ceef2dd4b3b1cc73 100644 --- a/modules/io/src/mol/star_parser.hh +++ b/modules/io/src/mol/star_parser.hh @@ -160,6 +160,19 @@ public: /// \return converted value Real TryGetReal(const StringRef& data, const String& name) const; + /// \brief try to convert a value to Real, on failure return default value. + /// + /// \param data value to be converted + /// \param name to be included in the message + /// \param alt value + /// \param is_default a function to check if data is a default value. + /// + /// \return converted or alt value + Real GetRealOrDefault(const StringRef& data, + const String& name, + Real alt, + bool (*is_default)(StringRef)) const; + /// \brief try to convert a value to float, on failure raise an exception. /// /// \param data value to be converted