From b63721f2362427ed830056be8b01757090c64bd8 Mon Sep 17 00:00:00 2001
From: Gabriel Studer <gabriel.studer@unibas.ch>
Date: Wed, 10 May 2023 09:23:10 +0200
Subject: [PATCH] Bugfix: SDFReader - only add new chain when first of its
 atoms is parsed

Previously, a new chain got added at the first newline after $$$$.
So if an sdf file ends with a newline, you got an unwanted empty chain.
---
 modules/io/src/mol/sdf_reader.cc | 24 +++++++++++++++++-------
 modules/io/src/mol/sdf_reader.hh |  2 ++
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/modules/io/src/mol/sdf_reader.cc b/modules/io/src/mol/sdf_reader.cc
index 7f3a7f560..42e15e9b3 100644
--- a/modules/io/src/mol/sdf_reader.cc
+++ b/modules/io/src/mol/sdf_reader.cc
@@ -125,6 +125,8 @@ void SDFReader::NextMolecule()
   atom_count_=0;
   bond_count_=0;
   line_num=0;
+  curr_residue_ = ost::mol::ResidueHandle();
+  curr_chain_ = ost::mol::ChainHandle();
 }
 
 void SDFReader::ParseAndAddHeader(const String& line, int line_num,
@@ -145,13 +147,10 @@ void SDFReader::ParseAndAddHeader(const String& line, int line_num,
         String msg="Bad molecule name line %d: Line is empty";
         throw IOException(str(format(msg) % line_num));
       }
-      curr_chain_=editor.InsertChain(s_chain);
-      LOG_DEBUG("new chain " << s_chain);
-
-      mol::ResidueKey rkey=boost::trim_copy(s_title);
-      mol::ResNum rnum(++residue_count_);
-      curr_residue_=editor.AppendResidue(curr_chain_, rkey, rnum);
-      LOG_DEBUG("new residue " << rkey << "(" << rnum << ")");
+      // prepeare required variables to add new chain and residue
+      // once we parse the first atom
+      curr_chain_name_ = s_chain;
+      curr_res_key_ = boost::trim_copy(s_title);
       break;
     }
     case 2:  // user information line
@@ -228,6 +227,17 @@ void SDFReader::ParseAndAddAtom(const String& line, int line_num,
     throw IOException(str(format(msg) % line_num % s_charge));
   }
 
+  if(!curr_chain_.IsValid()) {
+      curr_chain_=editor.InsertChain(curr_chain_name_);
+      LOG_DEBUG("new chain " << curr_chain_name_);
+  }
+
+  if(!curr_residue_.IsValid()) {
+      mol::ResNum rnum(++residue_count_);
+      curr_residue_=editor.AppendResidue(curr_chain_, curr_res_key_, rnum);
+      LOG_DEBUG("new residue " << rkey << "(" << rnum << ")");
+  }
+
   LOG_DEBUG("adding atom " << aname << " (" << s_ele << ") @" << apos);
 
   mol::AtomHandle atom=editor.InsertAtom(curr_residue_, aname, apos, upper_ele);
diff --git a/modules/io/src/mol/sdf_reader.hh b/modules/io/src/mol/sdf_reader.hh
index 04d05a2d6..f786f4e54 100644
--- a/modules/io/src/mol/sdf_reader.hh
+++ b/modules/io/src/mol/sdf_reader.hh
@@ -53,6 +53,8 @@ private:
   void ParseAndAddBond(const String& line, int line_num, mol::EntityHandle& ent,
                        mol::XCSEditor& editor);
 
+  String curr_chain_name_;
+  mol::ResidueKey curr_res_key_;
   mol::ChainHandle curr_chain_;
   mol::ResidueHandle curr_residue_;
   int chain_count_;
-- 
GitLab