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