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