From a157470bbd72c077e162c7ff03b77a763ee024a5 Mon Sep 17 00:00:00 2001
From: Gabriel Studer <gabriel.studer@unibas.ch>
Date: Wed, 27 Jul 2022 18:09:40 +0200
Subject: [PATCH] Force SDF writer to write elements with capital first char
 and rest lower case

---
 modules/io/src/mol/sdf_writer.cc | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/modules/io/src/mol/sdf_writer.cc b/modules/io/src/mol/sdf_writer.cc
index 8089d7ac1..be5d7245c 100644
--- a/modules/io/src/mol/sdf_writer.cc
+++ b/modules/io/src/mol/sdf_writer.cc
@@ -49,11 +49,23 @@ namespace {
         ostr_ << format("%10.4f") % atom.GetPos()[0]
               << format("%10.4f") % atom.GetPos()[1]
               << format("%10.4f ") % atom.GetPos()[2]
-              << format("%-3s") % atom.GetElement()
+              << format("%-3s") % SDFAtomWriter::FormatEle(atom.GetElement())
               << " 0  0  0  0  0  0"
               << std::endl;
         return true;
       }
+
+      static String FormatEle(const String& ele) {
+        // OpenStructure has no strict requirements on lower or upper case
+        // for elements. However, some sdf readers (read: rdkit) want the first
+        // character to upper case, the rest in lower case.
+        String return_ele = ele;
+        if(!return_ele.empty()) return_ele[0] = toupper(return_ele[0]);
+        for(size_t i = 1; i < return_ele.size(); ++i) {
+          return_ele[i] = tolower(return_ele[i]);
+        }
+        return return_ele;
+      }
     private:
       std::ostream&      ostr_;
       std::map<long, int>& atom_indices_;
-- 
GitLab