diff --git a/modules/seq/alg/src/merge_pairwise_alignments.cc b/modules/seq/alg/src/merge_pairwise_alignments.cc index 9d60859a07b99b7dda1724f54306f91a7605690b..c522869cfa50c64a6609d59fb856b733aa6288cf 100644 --- a/modules/seq/alg/src/merge_pairwise_alignments.cc +++ b/modules/seq/alg/src/merge_pairwise_alignments.cc @@ -87,7 +87,8 @@ SequenceHandle shift_reference(const ConstSequenceHandle& ref_seq, } new_sequence << ref_str.substr(last); SequenceHandle s=CreateSequence(ref_seq.GetName(), - new_sequence.str()); + new_sequence.str(), + ref_seq.GetRole()); if (ref_seq.HasAttachedView()) s.AttachView(ref_seq.GetAttachedView()); s.SetOffset(ref_seq.GetOffset()); @@ -122,7 +123,8 @@ SequenceHandle realign_sequence(const AlignmentHandle& aln, } new_sequence << s2.GetOneLetterCode(i); } - SequenceHandle s=CreateSequence(s2.GetName(), new_sequence.str()); + SequenceHandle s=CreateSequence(s2.GetName(), new_sequence.str(), + s2.GetRole()); if (s2.HasAttachedView()) s.AttachView(s2.GetAttachedView()); s.SetOffset(s2.GetOffset()); diff --git a/modules/seq/alg/tests/test_merge_pairwise_alignments.cc b/modules/seq/alg/tests/test_merge_pairwise_alignments.cc index 851f5c9f163911f1166492a25fd94ebcf4c5ea5a..25f9b836bd361560531922e2215bd3001cc909f0 100644 --- a/modules/seq/alg/tests/test_merge_pairwise_alignments.cc +++ b/modules/seq/alg/tests/test_merge_pairwise_alignments.cc @@ -34,15 +34,15 @@ BOOST_AUTO_TEST_SUITE(ost_seq_alg) BOOST_AUTO_TEST_CASE(merge_pairwise_alignments_one) { - SequenceHandle ref=CreateSequence("REF", "abcdefghijklmn"); + SequenceHandle ref=CreateSequence("REF", "abcdefghijklmn", "R"); SequenceHandle s1=CreateSequence("S1", "abcd---efghijklmn"); - SequenceHandle s2=CreateSequence("S2", "abcdxyzefghijklmn"); + SequenceHandle s2=CreateSequence("S2", "abcdxyzefghijklmn", "X"); AlignmentHandle aln1=CreateAlignment(); aln1.AddSequence(s1); aln1.AddSequence(s2); SequenceHandle s3=CreateSequence("S1", "abcdefghij---klmn"); - SequenceHandle s4=CreateSequence("S2", "abcdefghijxyzklmn"); + SequenceHandle s4=CreateSequence("S2", "abcdefghijxyzklmn", "Y"); AlignmentHandle aln2=CreateAlignment(); aln2.AddSequence(s3); @@ -55,6 +55,9 @@ BOOST_AUTO_TEST_CASE(merge_pairwise_alignments_one) BOOST_CHECK_EQUAL(seqs[0].GetString(), "abcd---efghij---klmn"); BOOST_CHECK_EQUAL(seqs[1].GetString(), "abcdxyzefghij---klmn"); BOOST_CHECK_EQUAL(seqs[2].GetString(), "abcd---efghijxyzklmn"); + BOOST_CHECK_EQUAL(seqs[0].GetRole(), "R"); + BOOST_CHECK_EQUAL(seqs[1].GetRole(), "X"); + BOOST_CHECK_EQUAL(seqs[2].GetRole(), "Y"); } BOOST_AUTO_TEST_CASE(merge_pairwise_alignments_two) diff --git a/modules/seq/base/pymod/export_sequence.cc b/modules/seq/base/pymod/export_sequence.cc index b278676fd5f537527d04f13e18780a25ee1fc670..269ce3a7cb584704d5074505180d653ffe93539c 100644 --- a/modules/seq/base/pymod/export_sequence.cc +++ b/modules/seq/base/pymod/export_sequence.cc @@ -257,6 +257,8 @@ void const_seq_handle_def(O& bp_class) .add_property("last_non_gap", &C::GetLastNonGap) .def("GetAttachedView", &C::GetAttachedView) .def("GetGaplessString", &C::GetGaplessString) + .add_property("role", make_function(&C::GetRole, + return_value_policy<copy_const_reference>())) .def("GetString", &C::GetString, return_value_policy<copy_const_reference>()) .def("GetName", &C::GetName, @@ -299,6 +301,9 @@ void export_sequence() make_function(&SequenceHandle::GetString, return_value_policy<copy_const_reference>()), &SequenceHandle::SetString) + .add_property("role", make_function(&SequenceHandle::GetRole, + return_value_policy<copy_const_reference>()), + &SequenceHandle::SetRole) .def("SetName", &SequenceHandle::SetName) .add_property("name", make_function(&SequenceHandle::GetName, @@ -312,7 +317,8 @@ void export_sequence() implicitly_convertible<SequenceHandle, ConstSequenceHandle>(); - def("CreateSequence", &CreateSequence); + def("CreateSequence", &CreateSequence, + (arg("name"), arg("seq"), arg("role")="UNKNOWN")); /*class_<SequenceHandleList>("SequenceHandleList", init<>()) .def(vector_indexing_suite<SequenceHandleList>()) ;*/ @@ -348,6 +354,9 @@ void export_sequence() .def("GetSequences", &AlignmentHandle::GetSequences) .def("GetCoverage", &AlignmentHandle::GetCoverage) .def("AttachView", attach_view_a) + .def("SetSequenceRole", &AlignmentHandle::SetSequenceRole) + .def("GetSequenceRole", &AlignmentHandle::GetSequenceRole, + return_value_policy<copy_const_reference>()) .def("AttachView", attach_view_b) .def("Cut", &AlignmentHandle::Cut) .def("MakeRegion", &AlignmentHandle::MakeRegion) diff --git a/modules/seq/base/src/alignment_handle.cc b/modules/seq/base/src/alignment_handle.cc index 8432d3c9035e7bfacce6d77f2244df05c4d37358..47a4fd0dd371747b35761519f15c696751fa3a4a 100644 --- a/modules/seq/base/src/alignment_handle.cc +++ b/modules/seq/base/src/alignment_handle.cc @@ -313,4 +313,20 @@ mol::EntityViewPair AlignmentHandle::GetMatchingBackboneViews(int idx0, int idx1 return mol::EntityViewPair(v1, v2); } + +const String& AlignmentHandle::GetSequenceRole(int seq_index) +{ + this->CheckValidity(); + return impl_->GetSequence(seq_index)->GetRole(); + +} + +void AlignmentHandle::SetSequenceRole(int seq_index, const String& role) +{ + this->CheckValidity(); + impl_->GetSequence(seq_index)->SetRole(role); + +} + + }} diff --git a/modules/seq/base/src/alignment_handle.hh b/modules/seq/base/src/alignment_handle.hh index 5a59cef72240dcce57f6ba5f28b24e3663dc33dc..9990e170570d4c19f4c0f4a9eaf5129ea1b2f60f 100644 --- a/modules/seq/base/src/alignment_handle.hh +++ b/modules/seq/base/src/alignment_handle.hh @@ -170,6 +170,10 @@ public: /// between 0 (no coverage) and 1 (full coverage) Real GetCoverage(int seq_index) const; + + const String& GetSequenceRole(int seq_index); + + void SetSequenceRole(int seq_index, const String& role); private: void CheckValidity() const; impl::SequenceListImplPtr impl_; diff --git a/modules/seq/base/src/impl/sequence_impl.cc b/modules/seq/base/src/impl/sequence_impl.cc index 05da39c29b5f167ea6f8e4452da516b69c0610bb..733eaf1b8e17f765581a4cb1e527beb2bf3483ef 100644 --- a/modules/seq/base/src/impl/sequence_impl.cc +++ b/modules/seq/base/src/impl/sequence_impl.cc @@ -55,11 +55,12 @@ bool SequenceImpl::IsSequenceStringSane(const String& seq_string) } SequenceImplPtr SequenceImpl::FromString(const String& seq_name, - const String& seq_string) + const String& seq_string, + const String& role) { if (SequenceImpl::IsSequenceStringSane(seq_string)) { - return SequenceImplPtr(new SequenceImpl(seq_name, seq_string)); + return SequenceImplPtr(new SequenceImpl(seq_name, seq_string, role)); } throw InvalidSequence(); } @@ -102,15 +103,15 @@ void SequenceImpl::SetString(const String& seq) } SequenceImpl::SequenceImpl(const String& seq_name, - const String& seq_string) - : seq_name_(seq_name), seq_string_(seq_string), offset_(0) + const String& seq_string, const String& role) + : seq_name_(seq_name), seq_string_(seq_string), seq_role_(role), offset_(0) { this->ShiftsFromSequence(); } SequenceImplPtr SequenceImpl::Copy() const { - SequenceImplPtr new_seq(new SequenceImpl(seq_name_, seq_string_)); + SequenceImplPtr new_seq(new SequenceImpl(seq_name_, seq_string_, seq_role_)); new_seq->offset_=offset_; new_seq->shifts_=shifts_; new_seq->attached_view_=attached_view_; diff --git a/modules/seq/base/src/impl/sequence_impl.hh b/modules/seq/base/src/impl/sequence_impl.hh index 50f722eaeaa2483ce1eb0bbbdc33403352e9bd4f..fecad2ca921599ecd85c58ee33e6c184bdbd5a52 100644 --- a/modules/seq/base/src/impl/sequence_impl.hh +++ b/modules/seq/base/src/impl/sequence_impl.hh @@ -50,7 +50,8 @@ class DLLEXPORT_OST_SEQ SequenceImpl : public GenericPropContainerImpl { public: /// \brief Construct new sequence object from sequence_string. static SequenceImplPtr FromString(const String& seq_name, - const String& sequence_string); + const String& sequence_string, + const String& role="UNKNOWN"); /// \brief Get residue index corresponding to given sequence position /// \param pos zero-based index @@ -105,7 +106,8 @@ public: /// /// If you want to check whether the sequence String does only contain /// valid characters use \c CreateSequence instead. - SequenceImpl(const String& seq_name, const String& sequence_string); + SequenceImpl(const String& seq_name, const String& sequence_string, + const String& role); /// \brief get one letter code of residue at position char GetOneLetterCode(int position) const; @@ -148,7 +150,15 @@ public: { return seq_string_[index]; } + const String& GetRole() const + { + return seq_role_; + } + void SetRole(const String& role) + { + seq_role_=role; + } private: /// \brief Recalculates gap shifts from sequence. @@ -169,6 +179,7 @@ private: } Shift; String seq_name_; String seq_string_; + String seq_role_; std::list<Shift> shifts_; bool editing_; int offset_; diff --git a/modules/seq/base/src/sequence_handle.cc b/modules/seq/base/src/sequence_handle.cc index f14758d803963bcbaba26cbf9507f78d031517af..54cc19589bfb045f045d4f414f26a573cd2e4136 100644 --- a/modules/seq/base/src/sequence_handle.cc +++ b/modules/seq/base/src/sequence_handle.cc @@ -59,6 +59,25 @@ char ConstSequenceHandle::operator[](int index) const +const String& ConstSequenceHandle::GetRole() const +{ + this->CheckValidity(); + return Impl()->GetRole(); +} + + +const String& SequenceHandle::GetRole() const +{ + this->CheckValidity(); + return Impl()->GetRole(); +} + +void SequenceHandle::SetRole(const String& role) const +{ + this->CheckValidity(); + Impl()->SetRole(role); +} + void ConstSequenceHandle::CheckValidity() const { @@ -78,9 +97,10 @@ impl::SequenceImplPtr& ConstSequenceHandle::Impl() const } -SequenceHandle CreateSequence(const String& name, const String& seq) +SequenceHandle CreateSequence(const String& name, const String& seq, + const String& role) { - return SequenceHandle(impl::SequenceImpl::FromString(name, seq)); + return SequenceHandle(impl::SequenceImpl::FromString(name, seq, role)); } @@ -222,6 +242,7 @@ SequenceHandle SequenceFromInfo(info::InfoGroup& group) } #endif + std::ostream& operator<<(std::ostream& os, const ConstSequenceHandle& sequence) { if (sequence.IsValid()) { diff --git a/modules/seq/base/src/sequence_handle.hh b/modules/seq/base/src/sequence_handle.hh index e08c005e40eea176521a8290a5e3a0e88216d316..8117d7117b1da68d377e94ed418b5310846ad41b 100644 --- a/modules/seq/base/src/sequence_handle.hh +++ b/modules/seq/base/src/sequence_handle.hh @@ -122,6 +122,8 @@ public: /// \sa SequenceHandle::AttachView(const mol::EntityView&, const String&) bool HasAttachedView() const; + const String& GetRole() const; + bool operator==(const ConstSequenceHandle& rhs) const; bool operator!=(const ConstSequenceHandle& rhs) const; @@ -286,6 +288,10 @@ public: /// \internal SequenceHandle(const impl::SequenceImplPtr& impl); + const String& GetRole() const; + + void SetRole(const String& role) const; + impl::SequenceImplPtr& Impl() const; GenericPropContainerImpl* GpImpl(); @@ -297,9 +303,9 @@ private: }; SequenceHandle DLLEXPORT_OST_SEQ CreateSequence(const String& name, - const String& seq); - -#if(OST_INFO_ENABLED) + const String& seq, + const String& role="UNKNOWN"); + /// \brief export sequence to info void DLLEXPORT_OST_SEQ SequenceToInfo(const ConstSequenceHandle& sequence, info::InfoGroup& group);