diff --git a/modules/io/src/mol/mmcif_reader.cc b/modules/io/src/mol/mmcif_reader.cc index d3f43064f995988df12c3d4e0279de2b201e960f..587cc670c505edf8b43c9bc7a3e3627b3a20b782 100644 --- a/modules/io/src/mol/mmcif_reader.cc +++ b/modules/io/src/mol/mmcif_reader.cc @@ -52,11 +52,12 @@ void MMCifParser::Init() { warned_name_mismatch_ = false; category_ = DONT_KNOW; + memset(category_counts_, 0, DONT_KNOW * sizeof(int)); chain_count_ = 0; atom_count_ = 0; residue_count_ = 0; auth_chain_id_ = false; - go_on_ = true; + has_model_ = false; //memset(indices_, -1, MAX_ITEMS_IN_ROW * sizeof(int)); restrict_chains_ = ""; subst_res_id_ = ""; @@ -103,8 +104,6 @@ bool MMCifParser::OnBeginData(const StringRef& data_name) this->ClearState(); - go_on_ = true; - return true; } @@ -115,6 +114,7 @@ bool MMCifParser::OnBeginLoop(const StarLoopDesc& header) // walk through possible categories if (header.GetCategory() == "atom_site") { category_ = ATOM_SITE; + category_counts_[category_]++; // mandatory items this->TryStoreIdx(AUTH_ASYM_ID, "auth_asym_id", header); this->TryStoreIdx(ID, "id", header); @@ -130,11 +130,22 @@ bool MMCifParser::OnBeginLoop(const StarLoopDesc& header) this->TryStoreIdx(CARTN_Y, "Cartn_y", header); this->TryStoreIdx(CARTN_Z, "Cartn_z", header); // optional - indices_[OCCUPANCY] = header.GetIndex("occupancy"); - indices_[B_ISO_OR_EQUIV] = header.GetIndex("B_iso_or_equiv"); - indices_[GROUP_PDB] = header.GetIndex("group_PDB"); - indices_[AUTH_SEQ_ID] = header.GetIndex("auth_seq_id"); - indices_[PDBX_PDB_INS_CODE] = header.GetIndex("pdbx_PDB_ins_code"); + indices_[OCCUPANCY] = header.GetIndex("occupancy"); + indices_[B_ISO_OR_EQUIV] = header.GetIndex("B_iso_or_equiv"); + indices_[GROUP_PDB] = header.GetIndex("group_PDB"); + indices_[AUTH_SEQ_ID] = header.GetIndex("auth_seq_id"); + indices_[PDBX_PDB_INS_CODE] = header.GetIndex("pdbx_PDB_ins_code"); + indices_[PDBX_PDB_MODEL_NUM] = header.GetIndex("pdbx_PDB_model_num"); + + // post processing + if (category_counts_[category_] > 1) { + if ((has_model_ && (indices_[PDBX_PDB_MODEL_NUM] == -1))|| + (!has_model_ && (indices_[PDBX_PDB_MODEL_NUM] != -1))) { // unit test + throw IOException(this->FormatDiagnostic(STAR_DIAG_ERROR, + "Not all atom_site entries carry a model number.", + this->GetCurrentLinenum())); + } + } return true; } /*else if (header.GetCategory()=="entity_poly") { @@ -211,13 +222,26 @@ void MMCifParser::ParseAndAddAtom(const std::vector<StringRef>& columns) StringRef res_name, atom_name; mol::ResNum res_num(0); bool valid_res_num = false; + if (indices_[PDBX_PDB_MODEL_NUM] != -1) { + if (has_model_) { + if (curr_model_ != TryGetInt(columns[indices_[PDBX_PDB_MODEL_NUM]], + "atom_site.pdbx_PDB_model_num")) { + return; + } + } else { + has_model_ = true; + curr_model_ = TryGetInt(columns[indices_[PDBX_PDB_MODEL_NUM]], + "atom_site.pdbx_PDB_model_num"); + } + } + if (!this->ParseAtomIdent(columns, chain_name, res_name, res_num, valid_res_num, atom_name, - alt_loc)) { + alt_loc)) {// unit test return; } Real occ = 1.00f, temp = 0; @@ -451,7 +475,7 @@ void PDBReader::Import(mol::EntityHandle& ent, continue; LOG_TRACE("processing HETATM entry"); this->ParseAndAddAtom(curr_line, line_num_, ent, - StringRef("HETATM", 6)); + StringRef("HETATM", 6)); } else if (IEquals(curr_line.substr(0, 6), StringRef("HELIX ", 6))) { if (!charmm_style_) { this->ParseHelixEntry(curr_line); diff --git a/modules/io/src/mol/mmcif_reader.hh b/modules/io/src/mol/mmcif_reader.hh index df7393968218c4e2ce44d40ce839400b52019811..41e586a1471c0fc6c972c43ac1591986a984cad4 100644 --- a/modules/io/src/mol/mmcif_reader.hh +++ b/modules/io/src/mol/mmcif_reader.hh @@ -83,7 +83,7 @@ public: /// \param header categories of the upcoming loop block /// /// \return bool - virtual bool OnBeginLoop(const StarLoopDesc& header); + virtual bool OnBeginLoop(const StarLoopDesc& header); // tested /// \brief read a row of data /// @@ -116,18 +116,21 @@ public: "' header", this->GetCurrentLinenum())); } - } + } // tested /// \brief Check a PDB id to be of length 4 and start with a digit /// /// \param pdbid putative PDB id /// /// \return true for a valid id, false otherwise - bool IsValidPDBIdent(const StringRef& pdbid); + bool IsValidPDBIdent(const StringRef& pdbid); // tested - /// \brief ... + /// \brief fetch values identifying atoms /// - /// \param columns data row + /// \param[in] columns data row + /// \param[out] chain_name takes atom_site.label_asym_id or, if + /// auth_chain_id_ is set, atom_site.auth_asym_id as a chain name + /// \param atom_name corresponds to label_atom_id bool ParseAtomIdent(const std::vector<StringRef>& columns, String& chain_name, @@ -145,8 +148,8 @@ public: private: /// \enum magic numbers of this class typedef enum { - PDBID_LEN=4, ///< length of a PDB id - MAX_ITEMS_IN_ROW=17 ///< count for possible items in a loop row + PDBID_LEN=4, ///< length of a PDB id + MAX_ITEMS_IN_ROW=18, ///< count for possible items in a loop row } MMCifMagicNos; /// \enum items of the atom_site category @@ -167,7 +170,8 @@ private: OCCUPANCY, B_ISO_OR_EQUIV, PDBX_PDB_INS_CODE, - GROUP_PDB ///< record name + GROUP_PDB, ///< record name + PDBX_PDB_MODEL_NUM ///< model no. (especially NMR structures) } AtomSiteItems; /// \enum categories of the mmcif format @@ -178,7 +182,8 @@ private: // members MMCifCategory category_; - int indices_[MAX_ITEMS_IN_ROW]; ///< map items to values in loops + int category_counts_[DONT_KNOW]; ///< overall no. of atom_site loops + int indices_[MAX_ITEMS_IN_ROW]; ///< map items to values in loops const IOProfile& profile_; mol::EntityHandle& ent_handle_; String restrict_chains_; @@ -189,8 +194,9 @@ private: int residue_count_; int atom_count_; bool warned_name_mismatch_; - bool go_on_; ///< flow control within the parser hooks String subst_res_id_; ///< work around for missing label_seq_id's + bool has_model_; ///< keep track of models through different atom_sites + int curr_model_; ///< if we have pdbx_PDB_model_num, store no. //from pdbdreader //entity als member, fill in ondatarow //import function diff --git a/modules/io/tests/test_mmcif_reader.cc b/modules/io/tests/test_mmcif_reader.cc index d14008fcb5a38f9f9cbc576c71f08a561aed5ee8..524ad6bc625521148d41ff7f8f349ca969c52e6a 100644 --- a/modules/io/tests/test_mmcif_reader.cc +++ b/modules/io/tests/test_mmcif_reader.cc @@ -47,12 +47,12 @@ public: BOOST_AUTO_TEST_SUITE( io ); -BOOST_AUTO_TEST_CASE(mmcif_isvalidpdbid) +BOOST_AUTO_TEST_CASE(mmcif_isvalidpdbident) { mol::EntityHandle eh=mol::CreateEntity(); // on changing the tests for a PDB id in mmcif files, extend this unit test - BOOST_MESSAGE(" Running mmcif_isvalidpdbid tests..."); + BOOST_MESSAGE(" Running mmcif_isvalidpdbident tests..."); std::ifstream s("testfiles/mmcif/atom_site.mmcif"); TestMMCifParserProtected tmmcif_p(s, eh); StringRef id = StringRef("1FOO", 4); @@ -85,11 +85,12 @@ BOOST_AUTO_TEST_CASE(mmcif_trystoreidx) BOOST_CHECK_NO_THROW(tmmcif_p.TryStoreIdx(0, "bar", mmcif_h)); } -BOOST_AUTO_TEST_CASE(mmcif_atom_site_header) +BOOST_AUTO_TEST_CASE(mmcif_onbeginloop) { mol::EntityHandle eh=mol::CreateEntity(); - BOOST_MESSAGE(" Running mmcif_atom_site_header tests..."); + // add more tests on new mandatory items + BOOST_MESSAGE(" Running mmcif_onbeginloop tests..."); std::ifstream s("testfiles/mmcif/atom_site.mmcif"); MMCifParser mmcif_p(s, eh, IOProfile()); StarLoopDesc mmcif_h; @@ -133,6 +134,50 @@ BOOST_AUTO_TEST_CASE(mmcif_atom_site_header) BOOST_MESSAGE(" done."); } +BOOST_AUTO_TEST_CASE(mmcif_parse_models) +{ + BOOST_MESSAGE(" Running mmcif_parse_models tests..."); + IOProfile profile; + + // positive w models + BOOST_MESSAGE(" true positive test for models..."); + { + mol::EntityHandle eh = mol::CreateEntity(); + MMCifParser mmcif_p("testfiles/mmcif/model_truepos.mmcif", eh, profile); + BOOST_CHECK_NO_THROW(mmcif_p.Parse()); + BOOST_REQUIRE_EQUAL(eh.GetChainCount(), 2); + BOOST_REQUIRE_EQUAL(eh.GetResidueCount(), 2); + BOOST_REQUIRE_EQUAL(eh.GetAtomCount(), 26); + } + BOOST_MESSAGE(" done."); + + // positive wo models atom_site.mmcif + BOOST_MESSAGE(" test absent atom_site.pdbx_PDB_model_num entry..."); + { + mol::EntityHandle eh = mol::CreateEntity(); + MMCifParser mmcif_p("testfiles/mmcif/atom_site.mmcif", eh, profile); + BOOST_CHECK_NO_THROW(mmcif_p.Parse()); + } + BOOST_MESSAGE(" done."); + // negative, more than 1 atom_site category + BOOST_MESSAGE(" testing more than one atom_site block..."); + { + mol::EntityHandle eh = mol::CreateEntity(); + MMCifParser mmcif_p("testfiles/mmcif/model_multi_atom_site.mmcif", eh, + profile); + BOOST_CHECK_THROW(mmcif_p.Parse(), IOException); + } + { + mol::EntityHandle eh = mol::CreateEntity(); + MMCifParser mmcif_p("testfiles/mmcif/model_multi_atom_site_inverted.mmcif", + eh, profile); + BOOST_CHECK_THROW(mmcif_p.Parse(), IOException); + } + BOOST_MESSAGE(" done."); + + BOOST_MESSAGE(" done."); +} + BOOST_AUTO_TEST_CASE(mmcif_parseatomident) { mol::EntityHandle eh = mol::CreateEntity(); @@ -141,14 +186,16 @@ BOOST_AUTO_TEST_CASE(mmcif_parseatomident) std::ifstream s("testfiles/mmcif/atom_site.mmcif"); IOProfile profile; TestMMCifParserProtected tmmcif_p(s, eh, profile); - std::vector<StringRef> cols; - String chain_name; - StringRef res_name; - mol::ResNum resnum(0); - StringRef atom_name; + //std::vector<StringRef> cols; + //String chain_name; + //StringRef res_name; + //mol::ResNum resnum(0); + //StringRef atom_name; //char alt_loc; - //BOOST_MESSAGE(" testing short atom_site entry"); + BOOST_MESSAGE(" testing valid line"); + //tmmcif_p.ParseAtomIdent(); + BOOST_MESSAGE(" done."); // negative //cols.push_back(StringRef("ATOM", 4)); //BOOST_CHECK_THROW(tmmcif_p.ParseAtomIdent(cols, @@ -197,16 +244,36 @@ BOOST_AUTO_TEST_CASE(mmcif_parseandaddatom) BOOST_AUTO_TEST_CASE(mmcif_testreader) { + BOOST_MESSAGE(" Running mmcif_testreader tests..."); mol::EntityHandle eh = mol::CreateEntity(); std::ifstream s("testfiles/mmcif/atom_site.mmcif"); IOProfile profile; MMCifParser mmcif_p(s, eh, profile); - mmcif_p.Parse(); + BOOST_MESSAGE(" testing Parse()..."); + BOOST_CHECK_NO_THROW(mmcif_p.Parse()); + + BOOST_REQUIRE_EQUAL(eh.GetChainCount(), 3); + BOOST_REQUIRE_EQUAL(eh.GetResidueCount(), 14); + BOOST_REQUIRE_EQUAL(eh.GetAtomCount(), 35); + + mol::ChainHandle ch = eh.FindChain("A"); + BOOST_CHECK(ch.IsValid()); + BOOST_MESSAGE(" done."); - BOOST_REQUIRE_EQUAL(eh.GetChainCount(), 2); - BOOST_REQUIRE_EQUAL(eh.GetResidueCount(), 4); - BOOST_REQUIRE_EQUAL(eh.GetAtomCount(), 25); + BOOST_MESSAGE(" testing numbering water..."); + ch = eh.FindChain("O"); + BOOST_CHECK(ch.IsValid()); + mol::ResidueHandleList rl = ch.GetResidueList(); + mol::ResidueHandleList::const_iterator rs; + int i = 1; + for (rs = rl.begin(); rs != rl.end(); ++rs, ++i) { + BOOST_CHECK_EQUAL(rs->GetNumber().GetNum(), i); + } + + BOOST_MESSAGE(" done."); + + BOOST_MESSAGE(" done."); } BOOST_AUTO_TEST_SUITE_END(); diff --git a/modules/io/tests/testfiles/mmcif/atom_site.mmcif b/modules/io/tests/testfiles/mmcif/atom_site.mmcif index 6c9a29637ee0f3fa0bd6187531821cab98f12d6a..f2568fe3bde7bae0e9883af2986f50f9a352317e 100644 --- a/modules/io/tests/testfiles/mmcif/atom_site.mmcif +++ b/modules/io/tests/testfiles/mmcif/atom_site.mmcif @@ -1,5 +1,8 @@ data_1BAR +# this file is also used in the mmcif_parse_models tests for a true negative +# test, hence it is not allowed to carry atom_site.pdbx_PDB_model_num entries + loop_ _atom_site.group_PDB _atom_site.type_symbol @@ -17,33 +20,45 @@ _atom_site.B_iso_or_equiv _atom_site.footnote_id _atom_site.auth_seq_id _atom_site.id +_atom_site.pdbx_PDB_ins_code _atom_site.auth_asym_id -ATOM N N VAL A 11 . 1 25.369 30.691 11.795 1.00 17.93 . 11 1 A -ATOM C CA VAL A 11 . 1 25.970 31.965 12.332 1.00 17.75 . 11 2 A -ATOM C C VAL A 11 . 1 25.569 32.010 13.808 1.00 17.83 . 11 3 A -ATOM O O VAL A 11 . 1 24.735 31.190 14.167 1.00 17.53 . 11 4 A -ATOM C CB VAL A 11 . 1 25.379 33.146 11.540 1.00 17.66 . 11 5 A -ATOM C CG1 VAL A 11 . 1 25.584 33.034 10.030 1.00 18.86 . 11 6 A -ATOM C CG2 VAL A 11 . 1 23.933 33.309 11.872 1.00 17.12 . 11 7 A -ATOM N N THR A 12 . 1 26.095 32.930 14.590 1.00 18.97 4 12 8 A -ATOM C CA THR A 12 . 1 25.734 32.995 16.032 1.00 19.80 4 12 9 A -ATOM C C THR A 12 . 1 24.695 34.106 16.113 1.00 20.92 4 12 10 A -ATOM O O THR A 12 . 1 24.869 35.118 15.421 1.00 21.84 4 12 11 A -ATOM C CB THR A 12 . 1 26.911 33.346 17.018 1.00 20.51 4 12 12 A -ATOM O OG1 THR A 12 3 1 27.946 33.921 16.183 0.50 20.29 4 12 13 A -ATOM O OG1 THR A 12 4 1 27.769 32.142 17.103 0.50 20.59 4 12 14 A -ATOM C CG2 THR A 12 3 1 27.418 32.181 17.878 0.50 20.47 4 12 15 A -ATOM C CG2 THR A 12 4 1 26.489 33.778 18.426 0.50 20.00 4 12 16 A -ATOM N N ILE A 13 . 1 23.664 33.855 16.884 1.00 22.08 . 13 17 A -ATOM C CA ILE A 13 . 1 22.623 34.850 17.093 1.00 23.44 . 13 18 A -ATOM C C ILE A 13 . 1 22.657 35.113 18.610 1.00 25.77 . 13 19 A -ATOM O O ILE A 13 . 1 23.123 34.250 19.406 1.00 26.28 . 13 20 A -ATOM C CB ILE A 13 . 1 21.236 34.463 16.492 1.00 22.67 . 13 21 A -ATOM C CG1 ILE A 13 . 1 20.478 33.469 17.371 1.00 22.14 . 13 22 A -ATOM C CG2 ILE A 13 . 1 21.357 33.986 15.016 1.00 21.75 . 13 23 A +ATOM N N VAL A 11 . 1 25.369 30.691 11.795 1.00 17.93 . 11 1 ? A +ATOM C CA VAL A 11 . 1 25.970 31.965 12.332 1.00 17.75 . 11 2 ? A +ATOM C C VAL A 11 . 1 25.569 32.010 13.808 1.00 17.83 . 11 3 ? A +ATOM O O VAL A 11 . 1 24.735 31.190 14.167 1.00 17.53 . 11 4 ? A +ATOM C CB VAL A 11 . 1 25.379 33.146 11.540 1.00 17.66 . 11 5 ? A +ATOM C CG1 VAL A 11 . 1 25.584 33.034 10.030 1.00 18.86 . 11 6 ? A +ATOM C CG2 VAL A 11 . 1 23.933 33.309 11.872 1.00 17.12 . 11 7 ? A +ATOM N N THR A 12 . 1 26.095 32.930 14.590 1.00 18.97 4 12 8 ? A +ATOM C CA THR A 12 . 1 25.734 32.995 16.032 1.00 19.80 4 12 9 ? A +ATOM C C THR A 12 . 1 24.695 34.106 16.113 1.00 20.92 4 12 10 ? A +ATOM O O THR A 12 . 1 24.869 35.118 15.421 1.00 21.84 4 12 11 ? A +ATOM C CB THR A 12 . 1 26.911 33.346 17.018 1.00 20.51 4 12 12 ? A +ATOM O OG1 THR A 12 3 1 27.946 33.921 16.183 0.50 20.29 4 12 13 ? A +ATOM O OG1 THR A 12 4 1 27.769 32.142 17.103 0.50 20.59 4 12 14 ? A +ATOM C CG2 THR A 12 3 1 27.418 32.181 17.878 0.50 20.47 4 12 15 ? A +ATOM C CG2 THR A 12 4 1 26.489 33.778 18.426 0.50 20.00 4 12 16 ? A +ATOM N N ILE A 13 . 1 23.664 33.855 16.884 1.00 22.08 . 13 17 ? A +ATOM C CA ILE A 13 . 1 22.623 34.850 17.093 1.00 23.44 . 13 18 ? A +ATOM C C ILE A 13 . 1 22.657 35.113 18.610 1.00 25.77 . 13 19 ? A +ATOM O O ILE A 13 . 1 23.123 34.250 19.406 1.00 26.28 . 13 20 ? A +ATOM C CB ILE A 13 . 1 21.236 34.463 16.492 1.00 22.67 . 13 21 ? A +ATOM C CG1 ILE A 13 . 1 20.478 33.469 17.371 1.00 22.14 . 13 22 ? A +ATOM C CG2 ILE A 13 . 1 21.357 33.986 15.016 1.00 21.75 . 13 23 ? A # - - - - data truncated for brevity - - - - -HETATM C C1 APS C 14 1 1 4.171 29.012 7.116 0.58 17.27 1 300 101 A -HETATM C C2 APS C 14 1 1 4.949 27.758 6.793 0.58 16.95 1 300 102 A -HETATM O O3 APS C 14 1 1 4.800 26.678 7.393 0.58 16.85 1 300 103 A -HETATM N N4 APS C 14 1 1 5.930 27.841 5.869 0.58 16.43 1 300 104 A +HETATM C C1 APS C 14 1 1 4.171 29.012 7.116 0.58 17.27 1 300 101 ? A +HETATM C C2 APS C 14 1 1 4.949 27.758 6.793 0.58 16.95 1 300 102 ? A +HETATM O O3 APS C 14 1 1 4.800 26.678 7.393 0.58 16.85 1 300 103 ? A +HETATM N N4 APS C 14 1 1 5.930 27.841 5.869 0.58 16.43 1 300 104 ? A # - - - - data truncated for brevity - - - - +# H2O +HETATM O O HOH O . . 5 -5.322 10.972 9.720 0.95 7.25 . 2001 2731 ? B +HETATM O O HOH O . . 5 4.148 4.008 12.383 0.64 14.61 . 2002 2732 ? B +HETATM O O HOH O . . 5 -2.238 5.875 8.525 0.92 15.43 . 2003 2733 ? B +HETATM O O HOH O . . 5 0.114 4.343 8.960 0.45 20.65 . 2004 2734 ? B +HETATM O O HOH O . . 5 1.045 9.537 8.846 0.98 4.03 . 2005 2735 ? B +HETATM O O HOH O . . 5 -0.532 11.899 9.196 1.00 4.09 . 2006 2736 ? B +HETATM O O HOH O . . 5 0.936 18.270 7.581 0.97 5.52 . 2007 2737 ? B +HETATM O O HOH O . . 5 -6.561 13.498 9.629 1.00 8.03 . 2008 2738 ? B +HETATM O O HOH O . . 5 -11.465 18.494 11.144 0.81 14.02 . 2009 2739 ? B +HETATM O O HOH O . . 5 12.795 11.508 13.991 0.90 35.55 . 2010 2740 ? B diff --git a/modules/io/tests/testfiles/mmcif/model_multi_atom_site.mmcif b/modules/io/tests/testfiles/mmcif/model_multi_atom_site.mmcif new file mode 100644 index 0000000000000000000000000000000000000000..760e7556496ab0d41268fe46f8aaab2d6418b3b0 --- /dev/null +++ b/modules/io/tests/testfiles/mmcif/model_multi_atom_site.mmcif @@ -0,0 +1,120 @@ +data_1MBA +# derived from 2JSP + +loop_ +_atom_site.group_PDB +_atom_site.id +_atom_site.type_symbol +_atom_site.label_atom_id +_atom_site.label_alt_id +_atom_site.label_comp_id +_atom_site.label_asym_id +_atom_site.label_entity_id +_atom_site.label_seq_id +_atom_site.pdbx_PDB_ins_code +_atom_site.Cartn_x +_atom_site.Cartn_y +_atom_site.Cartn_z +_atom_site.auth_seq_id +_atom_site.auth_comp_id +_atom_site.auth_asym_id +_atom_site.auth_atom_id +_atom_site.pdbx_PDB_model_num +ATOM 1 N N . ALA A 1 1 ? 13.847 16.632 5.806 1 ALA A N 1 +ATOM 2 C CA . ALA A 1 1 ? 14.050 15.239 5.351 1 ALA A CA 1 +ATOM 3 C C . ALA A 1 1 ? 15.057 15.051 4.185 1 ALA A C 1 +ATOM 4 O O . ALA A 1 1 ? 16.242 14.860 4.448 1 ALA A O 1 +ATOM 5 C CB . ALA A 1 1 ? 12.682 14.599 5.070 1 ALA A CB 1 +ATOM 6 H H1 . ALA A 1 1 ? 14.344 17.346 5.293 1 ALA A H1 1 +ATOM 7 H HA . ALA A 1 1 ? 14.425 14.660 6.196 1 ALA A HA 1 +ATOM 8 H HB1 . ALA A 1 1 ? 12.168 15.166 4.295 1 ALA A HB1 1 +ATOM 9 H HB2 . ALA A 1 1 ? 12.824 13.571 4.734 1 ALA A HB2 1 +ATOM 10 H HB3 . ALA A 1 1 ? 12.085 14.603 5.981 1 ALA A HB3 1 +ATOM 11 N N . VAL B 1 2 ? 14.602 15.209 2.935 2 VAL A N 1 +ATOM 12 C CA . VAL B 1 2 ? 15.402 15.012 1.699 2 VAL A CA 1 +ATOM 13 C C . VAL B 1 2 ? 14.579 15.343 0.431 2 VAL A C 1 +ATOM 14 O O . VAL B 1 2 ? 14.518 16.503 0.039 2 VAL A O 1 +ATOM 15 C CB . VAL B 1 2 ? 16.165 13.656 1.685 2 VAL A CB 1 +ATOM 16 C CG1 . VAL B 1 2 ? 15.292 12.399 1.812 2 VAL A CG1 1 +ATOM 17 C CG2 . VAL B 1 2 ? 17.136 13.551 0.504 2 VAL A CG2 1 +ATOM 18 H H . VAL B 1 2 ? 13.617 15.489 2.821 2 VAL A H 1 +ATOM 19 H HA . VAL B 1 2 ? 16.285 15.650 1.689 2 VAL A HA 1 +ATOM 20 H HB . VAL B 1 2 ? 16.859 13.653 2.526 2 VAL A HB 1 +ATOM 21 H HG11 . VAL B 1 2 ? 15.925 11.512 1.791 2 VAL A HG11 1 +ATOM 22 H HG12 . VAL B 1 2 ? 14.743 12.431 2.754 2 VAL A HG12 1 +ATOM 23 H HG13 . VAL B 1 2 ? 14.586 12.361 0.982 2 VAL A HG13 1 +ATOM 24 H HG21 . VAL B 1 2 ? 17.872 14.353 0.565 2 VAL A HG21 1 +ATOM 25 H HG22 . VAL B 1 2 ? 17.645 12.588 0.536 2 VAL A HG22 1 +ATOM 26 H HG23 . VAL B 1 2 ? 16.583 13.637 -0.431 2 VAL A HG23 1 +# +ATOM 1 N N . ALA A 1 1 ? 13.847 16.632 5.806 1 ALA A N 2 +ATOM 2 C CA . ALA A 1 1 ? 14.050 15.239 5.351 1 ALA A CA 2 +ATOM 3 C C . ALA A 1 1 ? 15.057 15.051 4.185 1 ALA A C 2 +ATOM 4 O O . ALA A 1 1 ? 16.242 14.860 4.448 1 ALA A O 2 +ATOM 5 C CB . ALA A 1 1 ? 12.682 14.599 5.070 1 ALA A CB 2 +ATOM 6 H H1 . ALA A 1 1 ? 14.344 17.346 5.293 1 ALA A H1 2 +ATOM 7 H HA . ALA A 1 1 ? 14.425 14.660 6.196 1 ALA A HA 2 +ATOM 8 H HB1 . ALA A 1 1 ? 12.168 15.166 4.295 1 ALA A HB1 2 +ATOM 9 H HB2 . ALA A 1 1 ? 12.824 13.571 4.734 1 ALA A HB2 2 +ATOM 10 H HB3 . ALA A 1 1 ? 12.085 14.603 5.981 1 ALA A HB3 2 +ATOM 11 N N . VAL B 1 2 ? 14.602 15.209 2.935 2 VAL A N 2 +ATOM 12 C CA . VAL B 1 2 ? 15.402 15.012 1.699 2 VAL A CA 2 +ATOM 13 C C . VAL B 1 2 ? 14.579 15.343 0.431 2 VAL A C 2 +ATOM 14 O O . VAL B 1 2 ? 14.518 16.503 0.039 2 VAL A O 2 +ATOM 15 C CB . VAL B 1 2 ? 16.165 13.656 1.685 2 VAL A CB 2 +ATOM 16 C CG1 . VAL B 1 2 ? 15.292 12.399 1.812 2 VAL A CG1 2 +ATOM 17 C CG2 . VAL B 1 2 ? 17.136 13.551 0.504 2 VAL A CG2 2 +ATOM 18 H H . VAL B 1 2 ? 13.617 15.489 2.821 2 VAL A H 2 +ATOM 19 H HA . VAL B 1 2 ? 16.285 15.650 1.689 2 VAL A HA 2 +ATOM 20 H HB . VAL B 1 2 ? 16.859 13.653 2.526 2 VAL A HB 2 +ATOM 21 H HG11 . VAL B 1 2 ? 15.925 11.512 1.791 2 VAL A HG11 2 +ATOM 22 H HG12 . VAL B 1 2 ? 14.743 12.431 2.754 2 VAL A HG12 2 +ATOM 23 H HG13 . VAL B 1 2 ? 14.586 12.361 0.982 2 VAL A HG13 2 +ATOM 24 H HG21 . VAL B 1 2 ? 17.872 14.353 0.565 2 VAL A HG21 2 +ATOM 25 H HG22 . VAL B 1 2 ? 17.645 12.588 0.536 2 VAL A HG22 2 +ATOM 26 H HG23 . VAL B 1 2 ? 16.583 13.637 -0.431 2 VAL A HG23 2 +# additional atom_site block +loop_ +_atom_site.group_PDB +_atom_site.id +_atom_site.type_symbol +_atom_site.label_atom_id +_atom_site.label_alt_id +_atom_site.label_comp_id +_atom_site.label_asym_id +_atom_site.label_entity_id +_atom_site.label_seq_id +_atom_site.pdbx_PDB_ins_code +_atom_site.Cartn_x +_atom_site.Cartn_y +_atom_site.Cartn_z +_atom_site.auth_seq_id +_atom_site.auth_comp_id +_atom_site.auth_asym_id +_atom_site.auth_atom_id +ATOM 1 N N . ALA A 1 1 ? 13.847 16.632 5.806 1 ALA A N +ATOM 2 C CA . ALA A 1 1 ? 14.050 15.239 5.351 1 ALA A CA +ATOM 3 C C . ALA A 1 1 ? 15.057 15.051 4.185 1 ALA A C +ATOM 4 O O . ALA A 1 1 ? 16.242 14.860 4.448 1 ALA A O +ATOM 5 C CB . ALA A 1 1 ? 12.682 14.599 5.070 1 ALA A CB +ATOM 6 H H1 . ALA A 1 1 ? 14.344 17.346 5.293 1 ALA A H1 +ATOM 7 H HA . ALA A 1 1 ? 14.425 14.660 6.196 1 ALA A HA +ATOM 8 H HB1 . ALA A 1 1 ? 12.168 15.166 4.295 1 ALA A HB1 +ATOM 9 H HB2 . ALA A 1 1 ? 12.824 13.571 4.734 1 ALA A HB2 +ATOM 10 H HB3 . ALA A 1 1 ? 12.085 14.603 5.981 1 ALA A HB3 +ATOM 11 N N . VAL B 1 2 ? 14.602 15.209 2.935 2 VAL A N +ATOM 12 C CA . VAL B 1 2 ? 15.402 15.012 1.699 2 VAL A CA +ATOM 13 C C . VAL B 1 2 ? 14.579 15.343 0.431 2 VAL A C +ATOM 14 O O . VAL B 1 2 ? 14.518 16.503 0.039 2 VAL A O +ATOM 15 C CB . VAL B 1 2 ? 16.165 13.656 1.685 2 VAL A CB +ATOM 16 C CG1 . VAL B 1 2 ? 15.292 12.399 1.812 2 VAL A CG1 +ATOM 17 C CG2 . VAL B 1 2 ? 17.136 13.551 0.504 2 VAL A CG2 +ATOM 18 H H . VAL B 1 2 ? 13.617 15.489 2.821 2 VAL A H +ATOM 19 H HA . VAL B 1 2 ? 16.285 15.650 1.689 2 VAL A HA +ATOM 20 H HB . VAL B 1 2 ? 16.859 13.653 2.526 2 VAL A HB +ATOM 21 H HG11 . VAL B 1 2 ? 15.925 11.512 1.791 2 VAL A HG11 +ATOM 22 H HG12 . VAL B 1 2 ? 14.743 12.431 2.754 2 VAL A HG12 +ATOM 23 H HG13 . VAL B 1 2 ? 14.586 12.361 0.982 2 VAL A HG13 +ATOM 24 H HG21 . VAL B 1 2 ? 17.872 14.353 0.565 2 VAL A HG21 +ATOM 25 H HG22 . VAL B 1 2 ? 17.645 12.588 0.536 2 VAL A HG22 +ATOM 26 H HG23 . VAL B 1 2 ? 16.583 13.637 -0.431 2 VAL A HG23 diff --git a/modules/io/tests/testfiles/mmcif/model_multi_atom_site_inverted.mmcif b/modules/io/tests/testfiles/mmcif/model_multi_atom_site_inverted.mmcif new file mode 100644 index 0000000000000000000000000000000000000000..58d22a61f34a1fe561bd2881d7db5211e7a148f3 --- /dev/null +++ b/modules/io/tests/testfiles/mmcif/model_multi_atom_site_inverted.mmcif @@ -0,0 +1,124 @@ +data_1MBA +# derived from 2JSP + +loop_ +_atom_site.group_PDB +_atom_site.id +_atom_site.type_symbol +_atom_site.label_atom_id +_atom_site.label_alt_id +_atom_site.label_comp_id +_atom_site.label_asym_id +_atom_site.label_entity_id +_atom_site.label_seq_id +_atom_site.pdbx_PDB_ins_code +_atom_site.Cartn_x +_atom_site.Cartn_y +_atom_site.Cartn_z +_atom_site.auth_seq_id +_atom_site.auth_comp_id +_atom_site.auth_asym_id +_atom_site.auth_atom_id +ATOM 1 N N . ALA A 1 1 ? 13.847 16.632 5.806 1 ALA A N +ATOM 2 C CA . ALA A 1 1 ? 14.050 15.239 5.351 1 ALA A CA +ATOM 3 C C . ALA A 1 1 ? 15.057 15.051 4.185 1 ALA A C +ATOM 4 O O . ALA A 1 1 ? 16.242 14.860 4.448 1 ALA A O +ATOM 5 C CB . ALA A 1 1 ? 12.682 14.599 5.070 1 ALA A CB +ATOM 6 H H1 . ALA A 1 1 ? 14.344 17.346 5.293 1 ALA A H1 +ATOM 7 H HA . ALA A 1 1 ? 14.425 14.660 6.196 1 ALA A HA +ATOM 8 H HB1 . ALA A 1 1 ? 12.168 15.166 4.295 1 ALA A HB1 +ATOM 9 H HB2 . ALA A 1 1 ? 12.824 13.571 4.734 1 ALA A HB2 +ATOM 10 H HB3 . ALA A 1 1 ? 12.085 14.603 5.981 1 ALA A HB3 +ATOM 11 N N . VAL B 1 2 ? 14.602 15.209 2.935 2 VAL A N +ATOM 12 C CA . VAL B 1 2 ? 15.402 15.012 1.699 2 VAL A CA +ATOM 13 C C . VAL B 1 2 ? 14.579 15.343 0.431 2 VAL A C +ATOM 14 O O . VAL B 1 2 ? 14.518 16.503 0.039 2 VAL A O +ATOM 15 C CB . VAL B 1 2 ? 16.165 13.656 1.685 2 VAL A CB +ATOM 16 C CG1 . VAL B 1 2 ? 15.292 12.399 1.812 2 VAL A CG1 +ATOM 17 C CG2 . VAL B 1 2 ? 17.136 13.551 0.504 2 VAL A CG2 +ATOM 18 H H . VAL B 1 2 ? 13.617 15.489 2.821 2 VAL A H +ATOM 19 H HA . VAL B 1 2 ? 16.285 15.650 1.689 2 VAL A HA +ATOM 20 H HB . VAL B 1 2 ? 16.859 13.653 2.526 2 VAL A HB +ATOM 21 H HG11 . VAL B 1 2 ? 15.925 11.512 1.791 2 VAL A HG11 +ATOM 22 H HG12 . VAL B 1 2 ? 14.743 12.431 2.754 2 VAL A HG12 +ATOM 23 H HG13 . VAL B 1 2 ? 14.586 12.361 0.982 2 VAL A HG13 +ATOM 24 H HG21 . VAL B 1 2 ? 17.872 14.353 0.565 2 VAL A HG21 +ATOM 25 H HG22 . VAL B 1 2 ? 17.645 12.588 0.536 2 VAL A HG22 +ATOM 26 H HG23 . VAL B 1 2 ? 16.583 13.637 -0.431 2 VAL A HG23 + +# additional atom_site block + +loop_ +_atom_site.group_PDB +_atom_site.id +_atom_site.type_symbol +_atom_site.label_atom_id +_atom_site.label_alt_id +_atom_site.label_comp_id +_atom_site.label_asym_id +_atom_site.label_entity_id +_atom_site.label_seq_id +_atom_site.pdbx_PDB_ins_code +_atom_site.Cartn_x +_atom_site.Cartn_y +_atom_site.Cartn_z +_atom_site.auth_seq_id +_atom_site.auth_comp_id +_atom_site.auth_asym_id +_atom_site.auth_atom_id +_atom_site.pdbx_PDB_model_num +ATOM 1 N N . ALA A 1 1 ? 13.847 16.632 5.806 1 ALA A N 1 +ATOM 2 C CA . ALA A 1 1 ? 14.050 15.239 5.351 1 ALA A CA 1 +ATOM 3 C C . ALA A 1 1 ? 15.057 15.051 4.185 1 ALA A C 1 +ATOM 4 O O . ALA A 1 1 ? 16.242 14.860 4.448 1 ALA A O 1 +ATOM 5 C CB . ALA A 1 1 ? 12.682 14.599 5.070 1 ALA A CB 1 +ATOM 6 H H1 . ALA A 1 1 ? 14.344 17.346 5.293 1 ALA A H1 1 +ATOM 7 H HA . ALA A 1 1 ? 14.425 14.660 6.196 1 ALA A HA 1 +ATOM 8 H HB1 . ALA A 1 1 ? 12.168 15.166 4.295 1 ALA A HB1 1 +ATOM 9 H HB2 . ALA A 1 1 ? 12.824 13.571 4.734 1 ALA A HB2 1 +ATOM 10 H HB3 . ALA A 1 1 ? 12.085 14.603 5.981 1 ALA A HB3 1 +ATOM 11 N N . VAL B 1 2 ? 14.602 15.209 2.935 2 VAL A N 1 +ATOM 12 C CA . VAL B 1 2 ? 15.402 15.012 1.699 2 VAL A CA 1 +ATOM 13 C C . VAL B 1 2 ? 14.579 15.343 0.431 2 VAL A C 1 +ATOM 14 O O . VAL B 1 2 ? 14.518 16.503 0.039 2 VAL A O 1 +ATOM 15 C CB . VAL B 1 2 ? 16.165 13.656 1.685 2 VAL A CB 1 +ATOM 16 C CG1 . VAL B 1 2 ? 15.292 12.399 1.812 2 VAL A CG1 1 +ATOM 17 C CG2 . VAL B 1 2 ? 17.136 13.551 0.504 2 VAL A CG2 1 +ATOM 18 H H . VAL B 1 2 ? 13.617 15.489 2.821 2 VAL A H 1 +ATOM 19 H HA . VAL B 1 2 ? 16.285 15.650 1.689 2 VAL A HA 1 +ATOM 20 H HB . VAL B 1 2 ? 16.859 13.653 2.526 2 VAL A HB 1 +ATOM 21 H HG11 . VAL B 1 2 ? 15.925 11.512 1.791 2 VAL A HG11 1 +ATOM 22 H HG12 . VAL B 1 2 ? 14.743 12.431 2.754 2 VAL A HG12 1 +ATOM 23 H HG13 . VAL B 1 2 ? 14.586 12.361 0.982 2 VAL A HG13 1 +ATOM 24 H HG21 . VAL B 1 2 ? 17.872 14.353 0.565 2 VAL A HG21 1 +ATOM 25 H HG22 . VAL B 1 2 ? 17.645 12.588 0.536 2 VAL A HG22 1 +ATOM 26 H HG23 . VAL B 1 2 ? 16.583 13.637 -0.431 2 VAL A HG23 1 +# +ATOM 1 N N . ALA A 1 1 ? 13.847 16.632 5.806 1 ALA A N 2 +ATOM 2 C CA . ALA A 1 1 ? 14.050 15.239 5.351 1 ALA A CA 2 +ATOM 3 C C . ALA A 1 1 ? 15.057 15.051 4.185 1 ALA A C 2 +ATOM 4 O O . ALA A 1 1 ? 16.242 14.860 4.448 1 ALA A O 2 +ATOM 5 C CB . ALA A 1 1 ? 12.682 14.599 5.070 1 ALA A CB 2 +ATOM 6 H H1 . ALA A 1 1 ? 14.344 17.346 5.293 1 ALA A H1 2 +ATOM 7 H HA . ALA A 1 1 ? 14.425 14.660 6.196 1 ALA A HA 2 +ATOM 8 H HB1 . ALA A 1 1 ? 12.168 15.166 4.295 1 ALA A HB1 2 +ATOM 9 H HB2 . ALA A 1 1 ? 12.824 13.571 4.734 1 ALA A HB2 2 +ATOM 10 H HB3 . ALA A 1 1 ? 12.085 14.603 5.981 1 ALA A HB3 2 +ATOM 11 N N . VAL B 1 2 ? 14.602 15.209 2.935 2 VAL A N 2 +ATOM 12 C CA . VAL B 1 2 ? 15.402 15.012 1.699 2 VAL A CA 2 +ATOM 13 C C . VAL B 1 2 ? 14.579 15.343 0.431 2 VAL A C 2 +ATOM 14 O O . VAL B 1 2 ? 14.518 16.503 0.039 2 VAL A O 2 +ATOM 15 C CB . VAL B 1 2 ? 16.165 13.656 1.685 2 VAL A CB 2 +ATOM 16 C CG1 . VAL B 1 2 ? 15.292 12.399 1.812 2 VAL A CG1 2 +ATOM 17 C CG2 . VAL B 1 2 ? 17.136 13.551 0.504 2 VAL A CG2 2 +ATOM 18 H H . VAL B 1 2 ? 13.617 15.489 2.821 2 VAL A H 2 +ATOM 19 H HA . VAL B 1 2 ? 16.285 15.650 1.689 2 VAL A HA 2 +ATOM 20 H HB . VAL B 1 2 ? 16.859 13.653 2.526 2 VAL A HB 2 +ATOM 21 H HG11 . VAL B 1 2 ? 15.925 11.512 1.791 2 VAL A HG11 2 +ATOM 22 H HG12 . VAL B 1 2 ? 14.743 12.431 2.754 2 VAL A HG12 2 +ATOM 23 H HG13 . VAL B 1 2 ? 14.586 12.361 0.982 2 VAL A HG13 2 +ATOM 24 H HG21 . VAL B 1 2 ? 17.872 14.353 0.565 2 VAL A HG21 2 +ATOM 25 H HG22 . VAL B 1 2 ? 17.645 12.588 0.536 2 VAL A HG22 2 +ATOM 26 H HG23 . VAL B 1 2 ? 16.583 13.637 -0.431 2 VAL A HG23 2 + + diff --git a/modules/io/tests/testfiles/mmcif/model_truepos.mmcif b/modules/io/tests/testfiles/mmcif/model_truepos.mmcif new file mode 100644 index 0000000000000000000000000000000000000000..6138544667831d8d296ffcf728429254bcbfae12 --- /dev/null +++ b/modules/io/tests/testfiles/mmcif/model_truepos.mmcif @@ -0,0 +1,75 @@ +data_1TPM +# derived from 2JSP + +loop_ +_atom_site.group_PDB +_atom_site.id +_atom_site.type_symbol +_atom_site.label_atom_id +_atom_site.label_alt_id +_atom_site.label_comp_id +_atom_site.label_asym_id +_atom_site.label_entity_id +_atom_site.label_seq_id +_atom_site.pdbx_PDB_ins_code +_atom_site.Cartn_x +_atom_site.Cartn_y +_atom_site.Cartn_z +_atom_site.auth_seq_id +_atom_site.auth_comp_id +_atom_site.auth_asym_id +_atom_site.auth_atom_id +_atom_site.pdbx_PDB_model_num +ATOM 1 N N . ALA A 1 1 ? 13.847 16.632 5.806 1 ALA A N 1 +ATOM 2 C CA . ALA A 1 1 ? 14.050 15.239 5.351 1 ALA A CA 1 +ATOM 3 C C . ALA A 1 1 ? 15.057 15.051 4.185 1 ALA A C 1 +ATOM 4 O O . ALA A 1 1 ? 16.242 14.860 4.448 1 ALA A O 1 +ATOM 5 C CB . ALA A 1 1 ? 12.682 14.599 5.070 1 ALA A CB 1 +ATOM 6 H H1 . ALA A 1 1 ? 14.344 17.346 5.293 1 ALA A H1 1 +ATOM 7 H HA . ALA A 1 1 ? 14.425 14.660 6.196 1 ALA A HA 1 +ATOM 8 H HB1 . ALA A 1 1 ? 12.168 15.166 4.295 1 ALA A HB1 1 +ATOM 9 H HB2 . ALA A 1 1 ? 12.824 13.571 4.734 1 ALA A HB2 1 +ATOM 10 H HB3 . ALA A 1 1 ? 12.085 14.603 5.981 1 ALA A HB3 1 +ATOM 11 N N . VAL B 1 2 ? 14.602 15.209 2.935 2 VAL A N 1 +ATOM 12 C CA . VAL B 1 2 ? 15.402 15.012 1.699 2 VAL A CA 1 +ATOM 13 C C . VAL B 1 2 ? 14.579 15.343 0.431 2 VAL A C 1 +ATOM 14 O O . VAL B 1 2 ? 14.518 16.503 0.039 2 VAL A O 1 +ATOM 15 C CB . VAL B 1 2 ? 16.165 13.656 1.685 2 VAL A CB 1 +ATOM 16 C CG1 . VAL B 1 2 ? 15.292 12.399 1.812 2 VAL A CG1 1 +ATOM 17 C CG2 . VAL B 1 2 ? 17.136 13.551 0.504 2 VAL A CG2 1 +ATOM 18 H H . VAL B 1 2 ? 13.617 15.489 2.821 2 VAL A H 1 +ATOM 19 H HA . VAL B 1 2 ? 16.285 15.650 1.689 2 VAL A HA 1 +ATOM 20 H HB . VAL B 1 2 ? 16.859 13.653 2.526 2 VAL A HB 1 +ATOM 21 H HG11 . VAL B 1 2 ? 15.925 11.512 1.791 2 VAL A HG11 1 +ATOM 22 H HG12 . VAL B 1 2 ? 14.743 12.431 2.754 2 VAL A HG12 1 +ATOM 23 H HG13 . VAL B 1 2 ? 14.586 12.361 0.982 2 VAL A HG13 1 +ATOM 24 H HG21 . VAL B 1 2 ? 17.872 14.353 0.565 2 VAL A HG21 1 +ATOM 25 H HG22 . VAL B 1 2 ? 17.645 12.588 0.536 2 VAL A HG22 1 +ATOM 26 H HG23 . VAL B 1 2 ? 16.583 13.637 -0.431 2 VAL A HG23 1 +# +ATOM 1 N N . ALA A 1 1 ? 13.847 16.632 5.806 1 ALA A N 2 +ATOM 2 C CA . ALA A 1 1 ? 14.050 15.239 5.351 1 ALA A CA 2 +ATOM 3 C C . ALA A 1 1 ? 15.057 15.051 4.185 1 ALA A C 2 +ATOM 4 O O . ALA A 1 1 ? 16.242 14.860 4.448 1 ALA A O 2 +ATOM 5 C CB . ALA A 1 1 ? 12.682 14.599 5.070 1 ALA A CB 2 +ATOM 6 H H1 . ALA A 1 1 ? 14.344 17.346 5.293 1 ALA A H1 2 +ATOM 7 H HA . ALA A 1 1 ? 14.425 14.660 6.196 1 ALA A HA 2 +ATOM 8 H HB1 . ALA A 1 1 ? 12.168 15.166 4.295 1 ALA A HB1 2 +ATOM 9 H HB2 . ALA A 1 1 ? 12.824 13.571 4.734 1 ALA A HB2 2 +ATOM 10 H HB3 . ALA A 1 1 ? 12.085 14.603 5.981 1 ALA A HB3 2 +ATOM 11 N N . VAL B 1 2 ? 14.602 15.209 2.935 2 VAL A N 2 +ATOM 12 C CA . VAL B 1 2 ? 15.402 15.012 1.699 2 VAL A CA 2 +ATOM 13 C C . VAL B 1 2 ? 14.579 15.343 0.431 2 VAL A C 2 +ATOM 14 O O . VAL B 1 2 ? 14.518 16.503 0.039 2 VAL A O 2 +ATOM 15 C CB . VAL B 1 2 ? 16.165 13.656 1.685 2 VAL A CB 2 +ATOM 16 C CG1 . VAL B 1 2 ? 15.292 12.399 1.812 2 VAL A CG1 2 +ATOM 17 C CG2 . VAL B 1 2 ? 17.136 13.551 0.504 2 VAL A CG2 2 +ATOM 18 H H . VAL B 1 2 ? 13.617 15.489 2.821 2 VAL A H 2 +ATOM 19 H HA . VAL B 1 2 ? 16.285 15.650 1.689 2 VAL A HA 2 +ATOM 20 H HB . VAL B 1 2 ? 16.859 13.653 2.526 2 VAL A HB 2 +ATOM 21 H HG11 . VAL B 1 2 ? 15.925 11.512 1.791 2 VAL A HG11 2 +ATOM 22 H HG12 . VAL B 1 2 ? 14.743 12.431 2.754 2 VAL A HG12 2 +ATOM 23 H HG13 . VAL B 1 2 ? 14.586 12.361 0.982 2 VAL A HG13 2 +ATOM 24 H HG21 . VAL B 1 2 ? 17.872 14.353 0.565 2 VAL A HG21 2 +ATOM 25 H HG22 . VAL B 1 2 ? 17.645 12.588 0.536 2 VAL A HG22 2 +ATOM 26 H HG23 . VAL B 1 2 ? 16.583 13.637 -0.431 2 VAL A HG23 2