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