diff --git a/modules/io/src/mol/sdf_reader.cc b/modules/io/src/mol/sdf_reader.cc index 72488aa989ec1bc26e690d211fb39ae25cad4b06..45b6aeca15ae479a8eea927407744ace12edc257 100644 --- a/modules/io/src/mol/sdf_reader.cc +++ b/modules/io/src/mol/sdf_reader.cc @@ -71,11 +71,11 @@ void SDFReader::Import(mol::EntityHandle& ent) } if (line_num<=4) { - ParseAndAddHeader(line, line_num, ent, editor); + ParseHeader(line, line_num, ent, editor); } else if (line_num<=atom_count_+4) { - ParseAndAddAtom(line, line_num, ent, true, editor); + AddAtom(ParseAtom(line, line_num), line_num, ent, true, editor); } else if (line_num<=bond_count_+atom_count_+4) { - ParseAndAddBond(line, line_num, ent, editor); + AddBond(ParseBond(line, line_num), line_num, ent, editor); } else if (boost::iequals(line.substr(0,2), "> ")) { // parse data items int data_header_start = line.find('<'); @@ -129,7 +129,7 @@ void SDFReader::NextMolecule() curr_chain_ = ost::mol::ChainHandle(); } -void SDFReader::ParseAndAddHeader(const String& line, int line_num, +void SDFReader::ParseHeader(const String& line, int line_num, mol::EntityHandle& ent, mol::XCSEditor& editor) { LOG_TRACE( "line: [" << line << "]" ); @@ -190,9 +190,7 @@ void SDFReader::ParseAndAddHeader(const String& line, int line_num, } } -void SDFReader::ParseAndAddAtom(const String& line, int line_num, - mol::EntityHandle& ent, bool hetatm, - mol::XCSEditor& editor) +SDFReader::atom_data SDFReader::ParseAtom(const String& line, int line_num) { LOG_TRACE( "line: [" << line << "]" ); @@ -215,6 +213,16 @@ void SDFReader::ParseAndAddAtom(const String& line, int line_num, String s_ele=line.substr(31,3); String s_charge=line.substr(36,3); + return std::make_tuple(anum, s_posx, s_posy, s_posz, s_ele, s_charge); +} + +void SDFReader::AddAtom(const atom_data& atom_tuple, int line_num, mol::EntityHandle& ent, + bool hetatm, mol::XCSEditor& editor) +{ + int anum; + String s_posx, s_posy, s_posz, s_ele, s_charge; + tie(anum, s_posx, s_posy, s_posz, s_ele, s_charge) = atom_tuple; + geom::Vec3 apos; try { apos=geom::Vec3(boost::lexical_cast<Real>(boost::trim_copy(s_posx)), @@ -262,8 +270,7 @@ void SDFReader::ParseAndAddAtom(const String& line, int line_num, } -void SDFReader::ParseAndAddBond(const String& line, int line_num, - mol::EntityHandle& ent, mol::XCSEditor& editor) +SDFReader::bond_data SDFReader::ParseBond(const String& line, int line_num) { LOG_TRACE( "line: [" << line << "]" ); @@ -283,10 +290,20 @@ void SDFReader::ParseAndAddBond(const String& line, int line_num, String s_first_name=line.substr(0,3); String s_second_name=line.substr(3,3); String s_type=line.substr(6,3); - String first_name, second_name; + + return std::make_tuple(s_first_name, s_second_name, s_type); +} + +void SDFReader::AddBond(const bond_data& bond_tuple, int line_num, mol::EntityHandle& ent, + mol::XCSEditor& editor) +{ + String s_first_name, s_second_name, s_type; + tie(s_first_name, s_second_name, s_type) = bond_tuple; + unsigned char type; mol::BondHandle bond; + String first_name, second_name; first_name=boost::trim_copy(s_first_name); second_name=boost::trim_copy(s_second_name); diff --git a/modules/io/src/mol/sdf_reader.hh b/modules/io/src/mol/sdf_reader.hh index f786f4e5426bf5068022ef0f8ed3657c8481be2c..7863fb7840fda692e60fa5e3a9c6cbc09e396953 100644 --- a/modules/io/src/mol/sdf_reader.hh +++ b/modules/io/src/mol/sdf_reader.hh @@ -22,6 +22,7 @@ #ifndef OST_IO_SDF_READER_HH #define OST_IO_SDF_READER_HH +#include <tuple> #include <boost/iostreams/filtering_stream.hpp> #include <boost/filesystem/fstream.hpp> #include <ost/mol/chain_handle.hh> @@ -30,6 +31,9 @@ namespace ost { namespace io { + + + class DLLEXPORT_OST_IO SDFReader { public: SDFReader(const String& filename); @@ -41,17 +45,22 @@ public: void Import(mol::EntityHandle& ent); private: + typedef std::tuple<int, String, String, String, String, String> atom_data; + typedef std::tuple<String, String, String> bond_data; + void ClearState(const boost::filesystem::path& loc); void NextMolecule(); - void ParseAndAddHeader(const String& line, int line_num, mol::EntityHandle& ent, + void ParseHeader(const String& line, int line_num, mol::EntityHandle& ent, mol::XCSEditor& editor); - void ParseAndAddAtom(const String& line, int line_num, mol::EntityHandle& ent, - bool hetatm, mol::XCSEditor& editor); + void AddAtom(const atom_data& atom_tuple, int line_num, mol::EntityHandle& ent, + bool hetatm, mol::XCSEditor& editor); + atom_data ParseAtom(const String& line, int line_num); - void ParseAndAddBond(const String& line, int line_num, mol::EntityHandle& ent, + void AddBond(const bond_data& bond_tuple, int line_num, mol::EntityHandle& ent, mol::XCSEditor& editor); + bond_data ParseBond(const String& line, int line_num); String curr_chain_name_; mol::ResidueKey curr_res_key_;