diff --git a/modules/io/src/mol/pdb_reader.cc b/modules/io/src/mol/pdb_reader.cc index 942aa17b1be2ff43fb997d7c96b37579ccd056f5..5d5f121dd18d1b6b1a4bf0773231c5fcc2785a8c 100644 --- a/modules/io/src/mol/pdb_reader.cc +++ b/modules/io/src/mol/pdb_reader.cc @@ -82,6 +82,7 @@ PDBReader::PDBReader(const boost::filesystem::path& loc, void PDBReader::Init(const boost::filesystem::path& loc) { + warned_name_mismatch_=false; charmm_style_=profile_.dialect=="CHARMM"; num_model_records_=0; if (boost::iequals(".gz", boost::filesystem::extension(loc))) { @@ -531,6 +532,7 @@ void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num, if (!curr_residue_.IsValid()) { LOG_DEBUG("new residue " << res_name << " " << res_num); curr_residue_=editor.AppendResidue(curr_chain_, res_name.str(), res_num); + warned_name_mismatch_=false; ++residue_count_; } assert(curr_residue_.IsValid()); @@ -538,6 +540,20 @@ void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num, // finally add atom LOG_DEBUG("adding atom " << aname << " (" << s_ele << ") @" << apos); mol::AtomHandle ah; + if (curr_residue_.GetName()!=res_name.str()) { + if (!profile_.fault_tolerant) { + std::stringstream ss; + ss << "error on line " << line_num << ": " + << "residue with number " << res_num << " has more than one name."; + throw IOException(ss.str()); + } + if (!warned_name_mismatch_) { + LOG_INFO("Residue with number " << res_num << " has more than one name." + "Ignoring atoms for everything but the first"); + } + warned_name_mismatch_=true; + return; + } if (alt_loc!=' ') { // Check if there is already a atom with the same name. mol::AtomHandle me=curr_residue_.FindAtom(aname); diff --git a/modules/io/src/mol/pdb_reader.hh b/modules/io/src/mol/pdb_reader.hh index 71ecde7edc41fb5218a18125394e435d003a94eb..9e087c96200069c21587fd3f15e72f56656b91b0 100644 --- a/modules/io/src/mol/pdb_reader.hh +++ b/modules/io/src/mol/pdb_reader.hh @@ -93,6 +93,7 @@ private: bool is_pqr_; IOProfile profile_; bool charmm_style_; + bool warned_name_mismatch_; }; }} diff --git a/modules/io/tests/test_io_pdb.cc b/modules/io/tests/test_io_pdb.cc index 139b109664716ce30db6b4496d43d0f531c35e7a..78dab44682593cda43e79a9bb45ea6edce29b723 100644 --- a/modules/io/tests/test_io_pdb.cc +++ b/modules/io/tests/test_io_pdb.cc @@ -423,6 +423,30 @@ BOOST_AUTO_TEST_CASE(res_name_too_long) BOOST_CHECK_THROW(writer.Write(ent), IOException); } + +BOOST_AUTO_TEST_CASE(res_name_mismatch_tolerant) +{ + String fname("testfiles/pdb/arg-glu-gln.pdb"); + IOProfile profile; + profile.fault_tolerant=true; + PDBReader reader(fname, profile); + mol::EntityHandle ent=mol::CreateEntity(); + reader.Import(ent); + BOOST_CHECK_EQUAL(ent.GetChainCount(), 1); + BOOST_CHECK_EQUAL(ent.GetResidueCount(), 1); + BOOST_CHECK_EQUAL(ent.GetAtomCount(), 11); +} + +BOOST_AUTO_TEST_CASE(res_name_mismatch_pedantic) +{ + String fname("testfiles/pdb/arg-glu-gln.pdb"); + IOProfile profile; + PDBReader reader(fname, profile); + mol::EntityHandle ent=mol::CreateEntity(); + BOOST_CHECK_THROW(reader.Import(ent), IOException); +} + + BOOST_AUTO_TEST_CASE(chain_name_too_long) { std::stringstream out; diff --git a/modules/io/tests/testfiles/pdb/arg-glu-gln.pdb b/modules/io/tests/testfiles/pdb/arg-glu-gln.pdb new file mode 100644 index 0000000000000000000000000000000000000000..08051b8c3e40259f80ee5524061a86f58039ea85 --- /dev/null +++ b/modules/io/tests/testfiles/pdb/arg-glu-gln.pdb @@ -0,0 +1,29 @@ +ATOM 134 N AARG A 15 8.286 13.769 40.774 0.50 60.53 N +ATOM 135 CA AARG A 15 8.903 14.440 41.922 0.50 64.64 C +ATOM 136 C AARG A 15 7.867 15.000 42.911 0.50 65.25 C +ATOM 137 O AARG A 15 8.174 15.244 44.080 0.50 60.65 O +ATOM 138 CB AARG A 15 9.857 15.549 41.457 0.50 65.83 C +ATOM 139 CG AARG A 15 10.863 15.121 40.391 0.50 64.71 C +ATOM 140 CD AARG A 15 11.814 16.270 40.051 0.50 69.97 C +ATOM 141 NE AARG A 15 12.505 16.084 38.775 0.50 69.52 N +ATOM 142 CZ AARG A 15 12.236 16.774 37.670 0.50 69.32 C +ATOM 143 NH1AARG A 15 11.291 17.706 37.674 0.50 55.65 N +ATOM 144 NH2AARG A 15 12.919 16.538 36.559 0.50 76.31 N +ATOM 145 N CGLU A 15 8.306 13.754 40.761 0.17 60.57 N +ATOM 146 CA CGLU A 15 8.887 14.450 41.904 0.17 64.60 C +ATOM 147 C CGLU A 15 7.813 14.816 42.928 0.17 64.89 C +ATOM 148 O CGLU A 15 8.037 14.735 44.137 0.17 61.75 O +ATOM 149 CB CGLU A 15 9.635 15.707 41.448 0.17 65.94 C +ATOM 150 CG CGLU A 15 10.877 15.425 40.613 0.17 65.71 C +ATOM 151 CD CGLU A 15 11.545 16.692 40.105 0.17 68.96 C +ATOM 152 OE1CGLU A 15 10.877 17.748 40.063 0.17 67.85 O +ATOM 153 OE2CGLU A 15 12.740 16.631 39.744 0.17 68.13 O +ATOM 154 N BGLN A 15 8.327 13.744 40.756 0.33 60.56 N +ATOM 155 CA BGLN A 15 8.877 14.452 41.907 0.33 64.61 C +ATOM 156 C BGLN A 15 7.769 14.698 42.924 0.33 64.96 C +ATOM 157 O BGLN A 15 7.924 14.416 44.116 0.33 61.27 O +ATOM 158 CB BGLN A 15 9.492 15.793 41.487 0.33 66.08 C +ATOM 159 CG BGLN A 15 10.726 15.695 40.597 0.33 65.69 C +ATOM 160 CD BGLN A 15 11.327 17.061 40.276 0.33 69.35 C +ATOM 161 OE1BGLN A 15 11.616 17.369 39.119 0.33 66.62 O +ATOM 162 NE2BGLN A 15 11.511 17.885 41.303 0.33 67.16 N \ No newline at end of file