From ec25b68e4bc25a5b6990b8a3293ab9d01ea9bc3e Mon Sep 17 00:00:00 2001
From: Tobias Schmidt <tobias.schmidt@unibas.ch>
Date: Fri, 1 Jul 2011 15:30:04 +0200
Subject: [PATCH] fixed writing TER for empty chains, added testcase
 (BZDNG-276)

---
 modules/io/src/mol/pdb_writer.cc              |  8 +++-
 modules/io/tests/test_io_pdb.cc               | 42 +++++++++++++++++++
 .../io/tests/testfiles/pdb/ter_emptychain.pdb |  4 ++
 .../testfiles/pdb/ter_view-emptychain.pdb     |  4 ++
 4 files changed, 56 insertions(+), 2 deletions(-)
 create mode 100644 modules/io/tests/testfiles/pdb/ter_emptychain.pdb
 create mode 100644 modules/io/tests/testfiles/pdb/ter_view-emptychain.pdb

diff --git a/modules/io/src/mol/pdb_writer.cc b/modules/io/src/mol/pdb_writer.cc
index ffbd145fa..45115e9a7 100644
--- a/modules/io/src/mol/pdb_writer.cc
+++ b/modules/io/src/mol/pdb_writer.cc
@@ -233,17 +233,21 @@ public:
   
   virtual bool VisitChain(const mol::ChainHandle& chain)
   {
-    if (peptide_) {
-      this->WriteTer(prev_);
+    if (chain.GetResidueCount()!=0) {
+      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 982bd2f46..4c69702bf 100644
--- a/modules/io/tests/test_io_pdb.cc
+++ b/modules/io/tests/test_io_pdb.cc
@@ -373,6 +373,48 @@ BOOST_AUTO_TEST_CASE(write_ter3)
                             "testfiles/pdb/ter3-out.pdb"));
 }
 
+BOOST_AUTO_TEST_CASE(write_ter4)
+{
+  {
+    PDBWriter writer(String("testfiles/pdb/ter_emptychain-out.pdb"), IOProfile());
+
+    mol::EntityHandle ent=mol::CreateEntity();
+    mol::XCSEditor edi=ent.EditXCS();
+    mol::ChainHandle ch=edi.InsertChain("A");
+    mol::ResidueHandle r=edi.AppendResidue(ch, "ALA");
+    mol::AtomHandle a=edi.InsertAtom(r, "N", geom::Vec3(32.0, -128.0, -2.5));
+    mol::ResidueHandle r2=edi.AppendResidue(ch, "GLY");
+    mol::AtomHandle a2=edi.InsertAtom(r2, "N", geom::Vec3(35.0, -99.0, -10.5));
+    mol::ChainHandle ch2=edi.InsertChain("B");
+    conop::Conopology& conop_inst=conop::Conopology::Instance();
+    conop_inst.ConnectAll(conop_inst.GetBuilder(), ent);
+    writer.Write(ent);
+  }
+  BOOST_CHECK(compare_files("testfiles/pdb/ter_emptychain.pdb",
+                            "testfiles/pdb/ter_emptychain-out.pdb"));
+}
+
+BOOST_AUTO_TEST_CASE(write_ter5)
+{
+  {
+    PDBWriter writer(String("testfiles/pdb/ter_view-emptychain-out.pdb"), IOProfile());
+
+    mol::EntityHandle ent=mol::CreateEntity();
+    mol::XCSEditor edi=ent.EditXCS();
+    mol::ChainHandle ch=edi.InsertChain("A");
+    mol::ResidueHandle r=edi.AppendResidue(ch, "ALA");
+    mol::AtomHandle a=edi.InsertAtom(r, "N", geom::Vec3(32.0, -128.0, -2.5));
+    mol::ResidueHandle r2=edi.AppendResidue(ch, "GLY");
+    mol::AtomHandle a2=edi.InsertAtom(r2, "N", geom::Vec3(35.0, -99.0, -10.5));
+    mol::ChainHandle ch2=edi.InsertChain("B");
+    conop::Conopology& conop_inst=conop::Conopology::Instance();
+    conop_inst.ConnectAll(conop_inst.GetBuilder(), ent);
+    writer.Write(ent.Select(""));
+  }
+  BOOST_CHECK(compare_files("testfiles/pdb/ter_view-emptychain.pdb",
+                            "testfiles/pdb/ter_view-emptychain-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/ter_emptychain.pdb b/modules/io/tests/testfiles/pdb/ter_emptychain.pdb
new file mode 100644
index 000000000..129e5225f
--- /dev/null
+++ b/modules/io/tests/testfiles/pdb/ter_emptychain.pdb
@@ -0,0 +1,4 @@
+ATOM      1  N   ALA A   1      32.000-128.000  -2.500  1.00  0.00           N  
+ATOM      2  N   GLY A   2      35.000 -99.000 -10.500  1.00  0.00           N  
+TER       3      GLY A   2                                                      
+END   
diff --git a/modules/io/tests/testfiles/pdb/ter_view-emptychain.pdb b/modules/io/tests/testfiles/pdb/ter_view-emptychain.pdb
new file mode 100644
index 000000000..129e5225f
--- /dev/null
+++ b/modules/io/tests/testfiles/pdb/ter_view-emptychain.pdb
@@ -0,0 +1,4 @@
+ATOM      1  N   ALA A   1      32.000-128.000  -2.500  1.00  0.00           N  
+ATOM      2  N   GLY A   2      35.000 -99.000 -10.500  1.00  0.00           N  
+TER       3      GLY A   2                                                      
+END   
-- 
GitLab