diff --git a/modules/mol/base/pymod/export_chain.cc b/modules/mol/base/pymod/export_chain.cc index 56bdf94ad66b184b34e592a0710f45c1cc505dda..45823447129d8e4b90d08829578ab1ee6323cbe3 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 6e534a4dc529dcb7a653a677a6e8bb47df6369ac..bbf0cfdad68397971844ba49fb5e2ba4b378d953 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 525ad36583e516250047bdb8d49db4abc15f411d..984c948fd94b934656f4920baf3e1da739efd89a 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 546a2ae8d9977b423ec26237553b0fd8ddecb736..1f871d504768d260daac80b4e9239b98f76e95e6 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 b0ffc3087eeaa0817c5a1be51311bcd48c171939..3b7bbd85b15bee45ec61832548dfc97541893257 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);