From c1b689f9a63f513872aec59fe68f7fbfec939eac Mon Sep 17 00:00:00 2001
From: Marco Biasini <marco.biasini@unibas.ch>
Date: Tue, 9 Aug 2011 10:16:47 +0200
Subject: [PATCH] added convenience predicates for chain types

---
 modules/mol/base/pymod/export_chain.cc  |  8 +++++
 modules/mol/base/src/chain_base.cc      | 27 +++++++++++++++
 modules/mol/base/src/chain_base.hh      | 15 +++++++++
 modules/mol/base/src/impl/chain_impl.hh | 23 +++++++++++++
 modules/mol/base/tests/test_chain.cc    | 44 +++++++++++++++++++++++++
 5 files changed, 117 insertions(+)

diff --git a/modules/mol/base/pymod/export_chain.cc b/modules/mol/base/pymod/export_chain.cc
index 56bdf94ad..458234471 100644
--- a/modules/mol/base/pymod/export_chain.cc
+++ b/modules/mol/base/pymod/export_chain.cc
@@ -55,6 +55,14 @@ void export_Chain()
     .def("IsValid", &ChainBase::IsValid)
     .def("GetType", &ChainBase::GetType)
     .def("GetDescription", &ChainBase::GetDescription)
+    .def("IsPolypeptide", &ChainBase::IsPolypeptide)
+    .def("IsPolynucleotide", &ChainBase::IsPolynucleotide)
+    .def("IsPolysaccharide", &ChainBase::IsPolysaccharide)
+    .def("IsPolymer", &ChainBase::IsPolymer)
+    .add_property("is_polypeptide", &ChainBase::IsPolypeptide)
+    .add_property("is_polynucleotide", &ChainBase::IsPolynucleotide)
+    .add_property("is_polysaccharide", &ChainBase::IsPolysaccharide)
+    .add_property("is_polymer", &ChainBase::IsPolymer)
   ;
   generic_prop_def<ChainBase>(chain_base);
   class_<ChainHandle, bases<ChainBase> >("ChainHandle", init<>())
diff --git a/modules/mol/base/src/chain_base.cc b/modules/mol/base/src/chain_base.cc
index 6e534a4dc..bbf0cfdad 100644
--- a/modules/mol/base/src/chain_base.cc
+++ b/modules/mol/base/src/chain_base.cc
@@ -67,5 +67,32 @@ std::ostream& operator<<(std::ostream& os, const ChainBase& chain)
   return os;
 }
 
+bool ChainBase::IsPolymer() const
+{
+  this->CheckValidity();
+  return impl_->IsPolymer();
+  
+}
+
+bool ChainBase::IsPolysaccharide() const
+{
+  this->CheckValidity();
+  return impl_->IsPolysaccharide();
+  
+}
+
+bool ChainBase::IsPolypeptide() const
+{
+  this->CheckValidity();
+  return impl_->IsPolypeptide();
+  
+}
+
+bool ChainBase::IsPolynucleotide() const
+{
+  this->CheckValidity();
+  return impl_->IsPolynucleotide();
+}
+
 }} // ns
 
diff --git a/modules/mol/base/src/chain_base.hh b/modules/mol/base/src/chain_base.hh
index 525ad3658..984c948fd 100644
--- a/modules/mol/base/src/chain_base.hh
+++ b/modules/mol/base/src/chain_base.hh
@@ -74,6 +74,21 @@ public:
     return impl_;
   }
 
+  /// \brief whether the chain is a polymer
+  ///
+  /// True if one of IsPolysaccharide(), IsPolynucleotide(), IsPolypeptide() is 
+  /// true or the chain is of type CHAINTYPE_POLYMER.
+  bool IsPolymer() const;
+  
+  /// \brief whether the chain is a polysaccharide
+  bool IsPolysaccharide() const;
+  
+  /// \brief whether the chain is a polypeptide
+  bool IsPolypeptide() const;
+  
+  /// \brief whether the chain is a polynucleotide
+  bool IsPolynucleotide() const;
+  
   impl::ChainImplPtr& Impl() {
     return impl_;
   }
diff --git a/modules/mol/base/src/impl/chain_impl.hh b/modules/mol/base/src/impl/chain_impl.hh
index 546a2ae8d..1f871d504 100644
--- a/modules/mol/base/src/impl/chain_impl.hh
+++ b/modules/mol/base/src/impl/chain_impl.hh
@@ -63,6 +63,29 @@ public:
   {
     return type_;
   }
+  
+  /// \brief whether the chain is a polymer
+  bool IsPolymer() const
+  {
+    return type_==CHAINTYPE_POLY || this->IsPolypeptide() || 
+          this->IsPolynucleotide() || this->IsPolysaccharide();
+  }
+  /// \brief whether the chain is a polysaccharide
+  bool IsPolysaccharide() const
+  {
+    return type_==CHAINTYPE_POLY_SAC_D || type_==CHAINTYPE_POLY_SAC_L;
+  }
+  /// \brief whether the chain is a polypeptide
+  bool IsPolypeptide() const
+  {
+    return type_==CHAINTYPE_POLY_PEPTIDE_D || type_==CHAINTYPE_POLY_PEPTIDE_L;
+  }
+  /// \brief whether the chain is a polynucleotide
+  bool IsPolynucleotide() const
+  {
+    return type_==CHAINTYPE_POLY_DN || type_==CHAINTYPE_POLY_RN || 
+           type_==CHAINTYPE_POLY_DN_RN;
+  }
 
   /// \brief Assign a description to a chain.
   ///
diff --git a/modules/mol/base/tests/test_chain.cc b/modules/mol/base/tests/test_chain.cc
index b0ffc3087..3b7bbd85b 100644
--- a/modules/mol/base/tests/test_chain.cc
+++ b/modules/mol/base/tests/test_chain.cc
@@ -210,26 +210,70 @@ BOOST_AUTO_TEST_CASE(chain_type)
 
    // setting/ getting
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_UNKNOWN);
+   BOOST_CHECK(!ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    e.SetChainType(ch1, CHAINTYPE_POLY);
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    e.SetChainType(ch1, CHAINTYPE_NON_POLY);
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_NON_POLY);
+   BOOST_CHECK(!ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    e.SetChainType(ch1, CHAINTYPE_WATER);
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_WATER);
+   BOOST_CHECK(!ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    e.SetChainType(ch1, CHAINTYPE_POLY_PEPTIDE_D);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_PEPTIDE_D);
    e.SetChainType(ch1, CHAINTYPE_POLY_PEPTIDE_L);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_PEPTIDE_L);
    e.SetChainType(ch1, CHAINTYPE_POLY_DN);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(ch1.IsPolynucleotide());
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_DN);
    e.SetChainType(ch1, CHAINTYPE_POLY_RN);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(ch1.IsPolynucleotide());
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_RN);
    e.SetChainType(ch1, CHAINTYPE_POLY_SAC_D);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_SAC_D);
    e.SetChainType(ch1, CHAINTYPE_POLY_SAC_L);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(!ch1.IsPolynucleotide());
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_SAC_L);
    e.SetChainType(ch1, CHAINTYPE_POLY_DN_RN);
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_POLY_DN_RN);
+   BOOST_CHECK(ch1.IsPolymer());
+   BOOST_CHECK(!ch1.IsPolysaccharide());
+   BOOST_CHECK(!ch1.IsPolypeptide());
+   BOOST_CHECK(ch1.IsPolynucleotide());
    e.SetChainType(ch1, CHAINTYPE_N_CHAINTYPES);
    BOOST_CHECK(ch1.GetType() == CHAINTYPE_N_CHAINTYPES);
    e.SetChainType(ch1, CHAINTYPE_UNKNOWN);
-- 
GitLab