diff --git a/modules/seq/base/pymod/export_hmm.cc b/modules/seq/base/pymod/export_hmm.cc index 8ca85193958010d44d02c1b6506268ee7b2e7f1b..72a072215b33285509424a35e8f80dcb9db8265b 100644 --- a/modules/seq/base/pymod/export_hmm.cc +++ b/modules/seq/base/pymod/export_hmm.cc @@ -52,6 +52,7 @@ void export_hmm() class_<HMM, HMMPtr>("HMM", init<>()) .def("Load", &HMM::Load).staticmethod("Load") .def("AddColumn", &HMM::push_back) + .def("Extract", &HMM::Extract) .add_property("null_model", make_function(&HMM::GetNullModel, return_value_policy<copy_const_reference>())) .add_property("columns", diff --git a/modules/seq/base/src/hmm.cc b/modules/seq/base/src/hmm.cc index 390a55b82eb556ced56dbda62bf97de31dc8cb35..fd953d5f5f5e5126864b373bc28e7a212118ae30 100644 --- a/modules/seq/base/src/hmm.cc +++ b/modules/seq/base/src/hmm.cc @@ -159,6 +159,27 @@ String HMM::GetSequence() const{ return ss.str(); } +HMMPtr HMM::Extract(uint from, uint to){ + + if(to <= from){ + throw std::runtime_error("Second index must be bigger than first one!"); + } + + if(to >= this->size()){ + throw std::runtime_error("Invalid index!"); + } + + HMMPtr return_hmm(new HMM); + return_hmm->SetNullModel(null_model_); + for(uint i = from; i < to; ++i){ + return_hmm->push_back(columns_[i]); + } + + return return_hmm; +} + + + Real HMM::GetAverageEntropy() const { Real n_eff=0.0; diff --git a/modules/seq/base/src/hmm.hh b/modules/seq/base/src/hmm.hh index 82826948e6a81e4d96d815357196dd0bfa5d2bdd..68b83db1e666c15e4761a4c682ae3833b1287fa5 100644 --- a/modules/seq/base/src/hmm.hh +++ b/modules/seq/base/src/hmm.hh @@ -194,6 +194,8 @@ class HMM { String GetSequence() const; + HMMPtr Extract(uint from, uint to); + //some functions to make it behave like a vector size_t size() const { return columns_.size(); }