diff --git a/modules/io/src/mol/mmcif_reader.cc b/modules/io/src/mol/mmcif_reader.cc index 0fb3c18d540bc935797498799125095437b748ca..de1dbf8c6678263aecbb3a1a2ab4bb9671ac5f82 100644 --- a/modules/io/src/mol/mmcif_reader.cc +++ b/modules/io/src/mol/mmcif_reader.cc @@ -498,9 +498,11 @@ void MMCifReader::ParseAndAddAtom(const std::vector<StringRef>& columns) if (indices_[OCCUPANCY] != -1) { // unit test occ = this->TryGetReal(columns[indices_[OCCUPANCY]], "atom_site.occupancy"); } - if (indices_[B_ISO_OR_EQUIV] != -1) { // unit test - temp = this->TryGetReal(columns[indices_[B_ISO_OR_EQUIV]], - "atom_site.B_iso_or_equiv"); + if (indices_[B_ISO_OR_EQUIV] != -1) { + if (!is_undef(columns[indices_[B_ISO_OR_EQUIV]])) { + temp = this->TryGetReal(columns[indices_[B_ISO_OR_EQUIV]], + "atom_site.B_iso_or_equiv"); + } } // determine element @@ -521,7 +523,7 @@ void MMCifReader::ParseAndAddAtom(const std::vector<StringRef>& columns) update_residue=true; } - if(!curr_residue_) { // unit test + if(!curr_residue_) { update_residue=true; subst_res_id_ = cif_chain_name + columns[indices_[AUTH_SEQ_ID]].str() + diff --git a/modules/io/tests/test_mmcif_reader.cc b/modules/io/tests/test_mmcif_reader.cc index dd0f40fbb05d3dd2dcb1da55180d435111b0ff46..57fb3d3e0c629a0830f0450f3845b1702d7aef99 100644 --- a/modules/io/tests/test_mmcif_reader.cc +++ b/modules/io/tests/test_mmcif_reader.cc @@ -1521,4 +1521,88 @@ BOOST_AUTO_TEST_CASE(mmcif_pdbx_entity_branch_link_tests) BOOST_TEST_MESSAGE(" done."); } +BOOST_AUTO_TEST_CASE(mmcif_atom_site_B_iso_or_equiv_tests) +{ + BOOST_TEST_MESSAGE(" Running mmcif_atom_site_B_iso_or_equiv_tests..."); + mol::EntityHandle eh = mol::CreateEntity(); + std::ifstream s("testfiles/mmcif/atom_site.mmcif"); + IOProfile profile; + StarLoopDesc tmmcif_h; + TestMMCifReaderProtected tmmcif_p(s, eh, profile); + std::vector<StringRef> columns; + + // set up dummy header to pre-set indices + SetAtomSiteHeader(&tmmcif_h); + // atom_site.auth_seq_id is not mandatory by standard but the reader, + // appears in 100% of PDB entries. + tmmcif_h.Add(StringRef("auth_seq_id", 11)); + // atom_site.pdbx_PDB_ins_code is not mandatory by standard but the reader, + // but seems to be appear and set to '?' in PDB entries + tmmcif_h.Add(StringRef("pdbx_PDB_ins_code", 17)); + tmmcif_h.Add(StringRef("B_iso_or_equiv", 14)); + tmmcif_p.OnBeginLoop(tmmcif_h); + + mol::AtomHandle a; + + // check that the right values are read + BOOST_TEST_MESSAGE(" testing correct B-factors..."); + { + // create dummy line to fetch B-factor + columns.push_back(StringRef("A", 1)); + columns.push_back(StringRef("2", 1)); + columns.push_back(StringRef(".", 1)); + columns.push_back(StringRef("A", 1)); + columns.push_back(StringRef("CA", 2)); + columns.push_back(StringRef("VAL", 3)); + columns.push_back(StringRef("1", 1)); // label_entity_id + columns.push_back(StringRef("1", 1)); // label_seq_id + columns.push_back(StringRef("C", 1)); // type_symbol + 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 + columns.push_back(StringRef("1", 1)); // auth_seq_id + columns.push_back(StringRef("?", 1)); // pdbx_PDB_ins_code + columns.push_back(StringRef("1.0", 3)); // B_iso_or_equiv + + tmmcif_p.ParseAndAddAtom(columns); + + a = eh.FindAtom("A", mol::ResNum(1), "CA"); + BOOST_CHECK_EQUAL(a.GetBFactor(), 1.0); + } + BOOST_TEST_MESSAGE(" done."); + BOOST_TEST_MESSAGE(" testing blank B-factors..."); + { + columns.pop_back(); + columns.pop_back(); + columns.pop_back(); + columns.pop_back(); + columns.pop_back(); + columns.pop_back(); + columns.pop_back(); + columns.pop_back(); + columns.pop_back(); + columns.pop_back(); + columns.pop_back(); + columns.push_back(StringRef("C", 1)); + columns.push_back(StringRef("VAL", 3)); + columns.push_back(StringRef("1", 1)); // label_entity_id + columns.push_back(StringRef("1", 1)); // label_seq_id + columns.push_back(StringRef("C", 1)); // type_symbol + 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 + columns.push_back(StringRef("1", 1)); // auth_seq_id + columns.push_back(StringRef("?", 1)); // pdbx_PDB_ins_code + columns.push_back(StringRef(".", 1)); // B_iso_or_equiv + + tmmcif_p.ParseAndAddAtom(columns); + + a = eh.FindAtom("A", mol::ResNum(1), "C"); + BOOST_CHECK_EQUAL(a.GetBFactor(), 0.0); + } + BOOST_TEST_MESSAGE(" done."); + BOOST_TEST_MESSAGE(" done."); +} + + BOOST_AUTO_TEST_SUITE_END();