diff --git a/modules/seq/base/pymod/export_sequence.cc b/modules/seq/base/pymod/export_sequence.cc index ee33b6125cd8fe63b8b5f390b72e0f6c4318ca45..e0104a51cd53ac3cbae14452bc2fd737f502a69d 100644 --- a/modules/seq/base/pymod/export_sequence.cc +++ b/modules/seq/base/pymod/export_sequence.cc @@ -250,6 +250,8 @@ void export_sequence() const_seq_handle_def<SequenceHandle>(seq_handle); generic_prop_def<SequenceHandle>(seq_handle); seq_handle + .def("__setitem__", &SequenceHandle::SetOneLetterCode) + .def("SetOneLetterCode", &SequenceHandle::SetOneLetterCode) .def("SetSequenceOffset", &SequenceHandle::SetSequenceOffset) .def("AttachView", attach_one) .def("AttachView", attach_two) diff --git a/modules/seq/base/src/impl/sequence_impl.cc b/modules/seq/base/src/impl/sequence_impl.cc index 9539dd20c5e3968edb285ef26ae6adcaa03c314f..877aef0133a9599d80d6de9967a6117fccfe5db0 100644 --- a/modules/seq/base/src/impl/sequence_impl.cc +++ b/modules/seq/base/src/impl/sequence_impl.cc @@ -105,6 +105,27 @@ void SequenceImpl::ShiftsFromSequence() } } +void SequenceImpl::SetOneLetterCode(int position, char new_char) +{ + if (position<0 || position>=static_cast<int>(seq_string_.length())) + throw std::out_of_range("Position is not covered in sequence"); + if (new_char=='-') { + if (seq_string_[position]!='-') { + seq_string_[position]=new_char; + this->ShiftsFromSequence(); + return; + } + } else { + if (seq_string_[position]=='-') { + seq_string_[position]=new_char; + this->ShiftsFromSequence(); + return; + } else { + seq_string_[position]=new_char; + } + } +} + int SequenceImpl::GetResidueIndex(int pos) const { if (pos<0 || pos>=static_cast<int>(seq_string_.length())) diff --git a/modules/seq/base/src/impl/sequence_impl.hh b/modules/seq/base/src/impl/sequence_impl.hh index d6159402b7c8505c25078bb0ee7208f6ea03f8a6..f7d1110c98a0bbb315ceaf4e3b2d7f5c925a547c 100644 --- a/modules/seq/base/src/impl/sequence_impl.hh +++ b/modules/seq/base/src/impl/sequence_impl.hh @@ -106,6 +106,7 @@ public: /// \brief get one letter code of residue at position char GetOneLetterCode(int position) const; + void SetOneLetterCode(int position, char new_char); /// \brief get residue at position /// /// will return the residue view at the given sequence position or an invalid diff --git a/modules/seq/base/src/sequence_handle.cc b/modules/seq/base/src/sequence_handle.cc index a7f5347e1f36521635b28d4ef6076b0c876ef8a0..8bf31de26f6cb75396e27f3a61f3c3e6eaa32eae 100644 --- a/modules/seq/base/src/sequence_handle.cc +++ b/modules/seq/base/src/sequence_handle.cc @@ -57,6 +57,7 @@ char ConstSequenceHandle::operator[](int index) const return this->GetOneLetterCode(index); } + void ConstSequenceHandle::CheckValidity() const { if (!impl_) { @@ -291,6 +292,12 @@ char SequenceHandle::GetOneLetterCode(int position) const return Impl()->GetOneLetterCode(position); } +void SequenceHandle::SetOneLetterCode(int position, char new_char) +{ + this->CheckValidity(); + Impl()->SetOneLetterCode(position, new_char); +} + mol::ResidueView SequenceHandle::GetResidue(int position) const { this->CheckValidity(); diff --git a/modules/seq/base/src/sequence_handle.hh b/modules/seq/base/src/sequence_handle.hh index de03a505be77b43ad87b9c5d97edf2a9a681a01b..46004d0a85502c59930652f2d8ea80142cf1e61d 100644 --- a/modules/seq/base/src/sequence_handle.hh +++ b/modules/seq/base/src/sequence_handle.hh @@ -118,6 +118,7 @@ public: char operator[](int index) const; + /// \brief whether the sequence is valid bool IsValid() const; /// \internal @@ -251,7 +252,9 @@ public: /// /// \throw IntegrityError when the view contains more than one chain void AttachView(const mol::EntityView& view); - + + void SetOneLetterCode(int position, char new_char); + operator ConstSequenceHandle() const; /// \brief attach entity view to sequence ///