diff --git a/modules/io/src/mol/pdb_writer.cc b/modules/io/src/mol/pdb_writer.cc index 670cf20893f4276076948addfb215372862a49fe..580c40752b8deaecdb279bdd421c52798e82d567 100644 --- a/modules/io/src/mol/pdb_writer.cc +++ b/modules/io/src/mol/pdb_writer.cc @@ -200,6 +200,19 @@ public: return true; } + virtual bool VisitChain(const mol::ChainHandle& chain) + { + if (peptide_) { + this->WriteTer(prev_); + } + return true; + } + virtual void OnExit() + { + if (peptide_) { + this->WriteTer(prev_); + } + } void WriteTer(mol::ResidueHandle res) { counter_++; diff --git a/modules/io/tests/test_io_pdb.cc b/modules/io/tests/test_io_pdb.cc index 8207dd7689bed17a1d50440680cc05513a29610b..df8ff5295dc686bbcf12c281b649a66a7218ff0c 100644 --- a/modules/io/tests/test_io_pdb.cc +++ b/modules/io/tests/test_io_pdb.cc @@ -305,6 +305,48 @@ BOOST_AUTO_TEST_CASE(write_ter) "testfiles/pdb/ter-out.pdb")); } +BOOST_AUTO_TEST_CASE(write_ter2) +{ + String fname("testfiles/pdb/ter2.pdb"); + // this scope is required to force the writer stream to be closed before + // opening the file again in compare_files. Avoids a race condition. + { + PDBReader reader(fname); + PDBWriter writer(String("testfiles/pdb/ter2-out.pdb")); + + mol::EntityHandle ent=mol::CreateEntity(); + reader.Import(ent); + // we use conopology to mark amino acids as peptide-linking. this is + // require for proper TER output + conop::Conopology& conop_inst=conop::Conopology::Instance(); + conop_inst.ConnectAll(conop_inst.GetBuilder(), ent); + writer.Write(ent); + } + BOOST_CHECK(compare_files("testfiles/pdb/ter2.pdb", + "testfiles/pdb/ter2-out.pdb")); +} + +BOOST_AUTO_TEST_CASE(write_ter3) +{ + String fname("testfiles/pdb/ter3.pdb"); + // this scope is required to force the writer stream to be closed before + // opening the file again in compare_files. Avoids a race condition. + { + PDBReader reader(fname); + PDBWriter writer(String("testfiles/pdb/ter3-out.pdb")); + + mol::EntityHandle ent=mol::CreateEntity(); + reader.Import(ent); + // we use conopology to mark amino acids as peptide-linking. this is + // require for proper TER output + conop::Conopology& conop_inst=conop::Conopology::Instance(); + conop_inst.ConnectAll(conop_inst.GetBuilder(), ent); + writer.Write(ent); + } + BOOST_CHECK(compare_files("testfiles/pdb/ter3.pdb", + "testfiles/pdb/ter3-out.pdb")); +} + BOOST_AUTO_TEST_CASE(write_conect) { // this scope is required to force the writer stream to be closed before diff --git a/modules/io/tests/testfiles/pdb/ter2.pdb b/modules/io/tests/testfiles/pdb/ter2.pdb new file mode 100644 index 0000000000000000000000000000000000000000..8b460b70eb2e9cb6aab59d21e87dfd8c5801585d --- /dev/null +++ b/modules/io/tests/testfiles/pdb/ter2.pdb @@ -0,0 +1,41 @@ +ATOM 1 N GLN A 153 27.125 29.174 32.121 1.00 27.40 N +ATOM 2 CA GLN A 153 28.561 29.394 32.241 1.00 30.81 C +ATOM 3 C GLN A 153 29.250 29.251 30.888 1.00 35.59 C +ATOM 4 O GLN A 153 28.979 28.314 30.130 1.00 33.20 O +ATOM 5 CB GLN A 153 29.210 28.461 33.272 1.00 30.18 C +ATOM 6 CG GLN A 153 30.694 28.783 33.468 1.00 34.18 C +ATOM 7 CD GLN A 153 31.213 28.442 34.849 1.00 34.20 C +ATOM 8 OE1 GLN A 153 31.095 27.308 35.304 1.00 34.26 O +ATOM 9 NE2 GLN A 153 31.808 29.430 35.522 1.00 40.83 N +ATOM 10 OXT GLN A 153 30.094 30.079 30.532 1.00 45.02 O +TER 11 GLN A 153 +ATOM 12 N ALA B 1 13.054 45.273 35.363 1.00 44.31 N +ATOM 13 CA ALA B 1 12.088 44.308 35.884 1.00 39.90 C +ATOM 14 C ALA B 1 11.751 44.590 37.349 1.00 35.09 C +ATOM 15 O ALA B 1 12.633 44.881 38.156 1.00 39.85 O +ATOM 16 CB ALA B 1 12.616 42.890 35.717 1.00 36.61 C +TER 17 ALA B 1 +TER 18 ALA B 1 +HETATM 19 S SO4 z 1 25.896 25.925 48.976 0.60 29.86 S +HETATM 20 O1 SO4 z 1 25.480 27.268 48.589 0.60 30.25 O +HETATM 21 O2 SO4 z 1 25.611 24.961 47.915 0.60 34.83 O +HETATM 22 O3 SO4 z 1 27.332 25.943 49.244 0.60 34.94 O +HETATM 23 O4 SO4 z 1 25.183 25.525 50.189 0.60 32.47 O +HETATM 24 ZN ZN z 2 23.332 26.722 48.256 0.66 22.52 ZN +HETATM 25 ZN ZN z 3 4.294 31.320 20.337 0.28 33.21 ZN +HETATM 26 S SO4 z 4 0.081 30.633 21.315 0.63 40.84 S +HETATM 27 O1 SO4 z 4 -1.116 31.446 21.507 0.63 45.94 O +HETATM 28 O2 SO4 z 4 1.268 31.440 21.578 0.63 33.61 O +HETATM 29 O3 SO4 z 4 0.032 29.503 22.239 0.63 29.10 O +HETATM 30 O4 SO4 z 4 0.115 30.163 19.934 0.63 40.96 O +CONECT 19 20 21 22 23 +CONECT 20 19 +CONECT 21 19 +CONECT 22 19 +CONECT 23 19 +CONECT 26 27 28 29 30 +CONECT 27 26 +CONECT 28 26 +CONECT 29 26 +CONECT 30 26 +END \ No newline at end of file diff --git a/modules/io/tests/testfiles/pdb/ter3.pdb b/modules/io/tests/testfiles/pdb/ter3.pdb new file mode 100644 index 0000000000000000000000000000000000000000..b1c12618a3d7ca8786e99c61e2a6de8c6f4d84d0 --- /dev/null +++ b/modules/io/tests/testfiles/pdb/ter3.pdb @@ -0,0 +1,12 @@ +ATOM 1 N GLN A 153 27.125 29.174 32.121 1.00 27.40 N +ATOM 2 CA GLN A 153 28.561 29.394 32.241 1.00 30.81 C +ATOM 3 C GLN A 153 29.250 29.251 30.888 1.00 35.59 C +ATOM 4 O GLN A 153 28.979 28.314 30.130 1.00 33.20 O +ATOM 5 CB GLN A 153 29.210 28.461 33.272 1.00 30.18 C +ATOM 6 CG GLN A 153 30.694 28.783 33.468 1.00 34.18 C +ATOM 7 CD GLN A 153 31.213 28.442 34.849 1.00 34.20 C +ATOM 8 OE1 GLN A 153 31.095 27.308 35.304 1.00 34.26 O +ATOM 9 NE2 GLN A 153 31.808 29.430 35.522 1.00 40.83 N +ATOM 10 OXT GLN A 153 30.094 30.079 30.532 1.00 45.02 O +TER 11 GLN A 153 +END \ No newline at end of file