diff --git a/modules/io/src/mol/sdf_writer.cc b/modules/io/src/mol/sdf_writer.cc index 8089d7ac146db63b4c603f60ad6be668f1827e15..be5d7245c2f4ad3d70115f5791659b95c1a327be 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_;