diff --git a/modules/io/src/mol/mmcif_reader.cc b/modules/io/src/mol/mmcif_reader.cc index c58c14c8dc433bbfc6c2948b8fa97dc57fa358d6..d4a9e31407089213cd006bf7bb87847ceda48079 100644 --- a/modules/io/src/mol/mmcif_reader.cc +++ b/modules/io/src/mol/mmcif_reader.cc @@ -342,7 +342,8 @@ mol::ResNum to_res_num(int num, char ins_code) } bool MMCifReader::ParseAtomIdent(const std::vector<StringRef>& columns, - String& chain_name, + String& auth_chain_name, + String& cif_chain_name, StringRef& res_name, mol::ResNum& resnum, bool& valid_res_num, @@ -357,13 +358,11 @@ bool MMCifReader::ParseAtomIdent(const std::vector<StringRef>& columns, } } // CHAIN ID - if (auth_chain_id_) { // unit test different IDs - chain_name = columns[indices_[AUTH_ASYM_ID]].str(); - } else { - chain_name = columns[indices_[LABEL_ASYM_ID]].str(); - } + auth_chain_name = columns[indices_[AUTH_ASYM_ID]].str(); + cif_chain_name = columns[indices_[LABEL_ASYM_ID]].str(); + if (restrict_chains_.size() > 0 && - restrict_chains_.find(chain_name) == String::npos) { + restrict_chains_.find(cif_chain_name) == String::npos) { return false; } @@ -398,7 +397,8 @@ void MMCifReader::ParseAndAddAtom(const std::vector<StringRef>& columns) { mol::XCSEditor editor=ent_handle_.EditXCS(mol::BUFFERED_EDIT); // potbl char alt_loc=0; - String chain_name; + String auth_chain_name; + String cif_chain_name; StringRef res_name, atom_name; mol::ResNum res_num(0); bool valid_res_num = false; @@ -416,7 +416,8 @@ void MMCifReader::ParseAndAddAtom(const std::vector<StringRef>& columns) } if (!this->ParseAtomIdent(columns, - chain_name, + auth_chain_name, + cif_chain_name, res_name, res_num, valid_res_num, @@ -460,7 +461,7 @@ void MMCifReader::ParseAndAddAtom(const std::vector<StringRef>& columns) if(!curr_chain_) { // unit test update_chain=true; update_residue=true; - } else if(curr_chain_.GetName() != chain_name) { // unit test + } else if(curr_chain_.GetName() != cif_chain_name) { // unit test update_chain=true; update_residue=true; } @@ -471,12 +472,12 @@ void MMCifReader::ParseAndAddAtom(const std::vector<StringRef>& columns) if (indices_[AUTH_SEQ_ID] != -1 && indices_[PDBX_PDB_INS_CODE] != -1) { if (subst_res_id_ != - chain_name + + cif_chain_name + columns[indices_[AUTH_SEQ_ID]].str() + columns[indices_[PDBX_PDB_INS_CODE]].str()) { update_residue=true; - subst_res_id_ = chain_name + + subst_res_id_ = cif_chain_name + columns[indices_[AUTH_SEQ_ID]].str() + columns[indices_[PDBX_PDB_INS_CODE]].str(); } @@ -490,10 +491,11 @@ void MMCifReader::ParseAndAddAtom(const std::vector<StringRef>& columns) } if(update_chain) { // unit test - curr_chain_ = ent_handle_.FindChain(chain_name); + curr_chain_ = ent_handle_.FindChain(cif_chain_name); if(!curr_chain_.IsValid()) { // unit test - LOG_DEBUG("new chain " << chain_name); - curr_chain_=editor.InsertChain(chain_name); + LOG_DEBUG("new chain " << cif_chain_name); + curr_chain_=editor.InsertChain(cif_chain_name); + curr_chain_.SetStringProp("pdb_auth_chain_name", auth_chain_name); ++chain_count_; // store entity id chain_id_pairs_.push_back(std::pair<mol::ChainHandle,String>(curr_chain_, diff --git a/modules/io/src/mol/mmcif_reader.hh b/modules/io/src/mol/mmcif_reader.hh index 06215f56b9c0006843700921ef66b02c9e1dd0ad..e9ff3b893f0e8ade4cce29838b79fb8ab89cf871 100644 --- a/modules/io/src/mol/mmcif_reader.hh +++ b/modules/io/src/mol/mmcif_reader.hh @@ -202,7 +202,8 @@ protected: /// \param[out] atom_name corresponds to label_atom_id /// \param[out] alt_loc gets first letter of atom_site.label_alt_id bool ParseAtomIdent(const std::vector<StringRef>& columns, - String& chain_name, + String& auth_chain_name, + String& cif_chain_name, StringRef& res_name, mol::ResNum& resnum, bool& valid_res_num, diff --git a/modules/io/tests/test_mmcif_reader.cc b/modules/io/tests/test_mmcif_reader.cc index b2294ba90707ce4607cc82fad2ad194ff188e4f4..fff6bbb2e6d6d2596f69f6a223aeeb957f84a50d 100644 --- a/modules/io/tests/test_mmcif_reader.cc +++ b/modules/io/tests/test_mmcif_reader.cc @@ -644,7 +644,7 @@ BOOST_AUTO_TEST_CASE(mmcif_struct_ref) BOOST_CHECK_EQUAL(seqs[1]->GetDBEnd(), 49); MMCifInfoStructRefSeqDifs diffs=seqs[0]->GetDifs(); BOOST_CHECK_EQUAL(diffs.size(), 1); - BOOST_CHECK_EQUAL(diffs[0]->GetRNum(), 91); + BOOST_CHECK_EQUAL(diffs[0]->GetSeqRNum(), 91); BOOST_CHECK_EQUAL(diffs[0]->GetDetails(), "ENGINEERED MUTATION"); } @@ -1091,7 +1091,8 @@ BOOST_AUTO_TEST_CASE(mmcif_parseatomident) StarLoopDesc tmmcif_h; TestMMCifReaderProtected tmmcif_p(s, eh, profile); std::vector<StringRef> columns; - String chain_name; + String cif_chain_name; + String auth_chain_name; StringRef res_name; mol::ResNum resnum(0); bool valid_res_num = false; @@ -1099,7 +1100,6 @@ BOOST_AUTO_TEST_CASE(mmcif_parseatomident) StringRef atom_name; BOOST_MESSAGE(" testing valid line"); - //tmmcif_p.ParseAtomIdent(); BOOST_MESSAGE(" done."); // negative //cols.push_back(StringRef("ATOM", 4)); @@ -1148,7 +1148,8 @@ BOOST_AUTO_TEST_CASE(mmcif_parseatomident) columns.push_back(StringRef("25.369", 6)); // Cartn_x columns.push_back(StringRef("30.691", 6)); // Cartn_y columns.push_back(StringRef("11.795", 6)); // Cartn_z - BOOST_CHECK_EQUAL(tmmcif_p.ParseAtomIdent(columns, chain_name, res_name, + BOOST_CHECK_EQUAL(tmmcif_p.ParseAtomIdent(columns, auth_chain_name, + cif_chain_name, res_name, resnum, valid_res_num, atom_name, alt_loc), true); columns.pop_back(); @@ -1167,7 +1168,8 @@ BOOST_AUTO_TEST_CASE(mmcif_parseatomident) columns.push_back(StringRef("25.369", 6)); // Cartn_x columns.push_back(StringRef("30.691", 6)); // Cartn_y columns.push_back(StringRef("11.795", 6)); // Cartn_z - BOOST_CHECK_EQUAL(tmmcif_p.ParseAtomIdent(columns, chain_name, res_name, + BOOST_CHECK_EQUAL(tmmcif_p.ParseAtomIdent(columns, auth_chain_name, + cif_chain_name, res_name, resnum, valid_res_num, atom_name, alt_loc), false); }