From 489a4de46b9e91292a1febf7a5d1c31d71eb1c40 Mon Sep 17 00:00:00 2001 From: Stefan Bienert <stefan.bienert@unibas.ch> Date: Tue, 11 Jun 2024 16:35:01 +0200 Subject: [PATCH] Allow '.' for occupancy in mmCIF files. --- modules/io/src/mol/mmcif_reader.cc | 5 ++++- modules/io/src/mol/star_parser.cc | 12 ++++++++++++ modules/io/src/mol/star_parser.hh | 13 +++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/modules/io/src/mol/mmcif_reader.cc b/modules/io/src/mol/mmcif_reader.cc index f04e15f37..ee1bdc506 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 c16bc2483..9c240a179 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 bc6a3947a..ba00f4398 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 -- GitLab