diff --git a/modules/io/src/mol/sdf_reader.cc b/modules/io/src/mol/sdf_reader.cc index 7f3a7f56030b7c3584bfd8b9f52c16bc0a90f4e0..42e15e9b3c1a1b034eb07ffeafcf148d4ad4a715 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 04d05a2d6d2f2f9fd54c76b775f3224f22f71a8c..f786f4e5426bf5068022ef0f8ed3657c8481be2c 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_;