OpenStructure
Loading...
Searching...
No Matches
renumber.py
Go to the documentation of this file.
1from ost import seq, mol
2
3def _RenumberSeq(seq_handle, old_number_label=None):
4 if not seq_handle.HasAttachedView():
5 raise RuntimeError("Sequence Handle has no attached view")
6 ev = seq_handle.attached_view.CreateEmptyView()
7 new_numbers = mol.ResNumList()
8 for pos in range(len(seq_handle)):
9 if seq_handle[pos] != '-':
10 r = seq_handle.GetResidue(pos)
11 if r.IsValid():
12 ev.AddResidue(r, mol.INCLUDE_ALL)
13 new_numbers.append(pos+1)
14 if old_number_label is not None:
15 r.SetIntProp(old_number_label, r.number.GetNum())
16 else:
17 raise RuntimeError('Error: renumbering failed at position %s' % pos)
18 return ev, new_numbers
19
20def _RenumberAln(aln, seq_index, old_number_label=None):
21 if not aln.sequences[seq_index].HasAttachedView():
22 raise RuntimeError("Sequence Handle has no attached view")
23 counter=0
24 ev = aln.sequences[seq_index].attached_view.CreateEmptyView()
25 new_numbers = mol.ResNumList()
26 for col in aln:
27 if col[0] != '-' and col[seq_index] != '-':
28 if col[0] != col[seq_index]:
29 raise RuntimeError("residue mismatch at position %d (%s vs %s) "\
30 "(renumbering failed)" % (counter, col[0],
31 col[seq_index]))
32 rnum = aln.GetSequence(seq_index).GetResidueIndex(counter)
33 r = aln.GetSequence(seq_index).GetResidue(counter)
34 if not r.IsValid():
35 raise RuntimeError("invalid residue at postion %s (renumbering failed)"\
36 % (counter))
37 ev.AddResidue(r, mol.INCLUDE_ALL)
38 new_numbers.append(counter+1)
39 if old_number_label is not None:
40 r.SetIntProp(old_number_label, r.number.GetNum())
41 counter += 1
42 return ev, new_numbers
43
44
45def Renumber(seq_handle, sequence_number_with_attached_view=1, old_number_label=None):
46 """
47 Function to renumber an entity according to an alignment between the model
48 sequence and the full-length target sequence. The aligned model sequence or
49 the alignment itself with an attached view needs to be provided. Upon
50 succcess, the renumbered entity is returned.
51 If an alignment is given, the first sequence of the alignment is considered
52 the full-length sequence and it must match the model sequence wherever it is
53 aligned (i.e. excluding gaps).
54
55 .. code-block:: python
56
57 from ost.seq.alg import renumber
58 from ost.bindings.clustalw import *
59 ent = io.LoadPDB("path_to_model")
60 s = io.LoadSequence("path_to_full_length_fasta_seqeunce")
61 pdb_seq = seq.SequenceFromChain("model", ent.chains[0])
62 aln = ClustalW(s, pdb_seq)
63 aln.AttachView(1, ent.chains[0].Select(""))
64 e = Renumber(aln.sequences[1])
65 io.SavePDB(e, "renum.pdb")
66
67 :param seq_handle: Sequence or alignment handle with attached view.
68 :type seq_handle: :class:`SequenceHandle` / :class:`AlignmentHandle`
69 :param sequence_number_with_attached_view: Sequence number for the aln. handle
70 (not used if seq. handle given)
71 :type sequence_number_with_attached_view: :class:`int`
72 :raises: :exc:`RuntimeError` if unknown type of *seq_handle* or if attached
73 view is missing or if the given alignment sequence is inconsistent.
74 """
75 if isinstance(seq_handle, seq.SequenceHandle) \
76 or isinstance(seq_handle, seq.ConstSequenceHandle):
77 ev, new_numbers = _RenumberSeq(seq_handle, old_number_label)
78 elif isinstance(seq_handle, seq.AlignmentHandle):
79 ev, new_numbers = _RenumberAln(seq_handle, sequence_number_with_attached_view, old_number_label)
80 else:
81 raise RuntimeError("Unknown input type " + str(type(seq_handle)))
82
83 ev.AddAllInclusiveBonds()
84 new_ent = mol.CreateEntityFromView(ev, False);
85 new_ent.EditXCS().RenumberChain(new_ent.chains[0], new_numbers)
86 return new_ent
87
88# choose visible interface
89__all__ = ('Renumber', )
representation of a multiple sequence alignemnt consisting of two or more sequences
mutable sequence handle.
_RenumberAln(aln, seq_index, old_number_label=None)
Definition renumber.py:20
_RenumberSeq(seq_handle, old_number_label=None)
Definition renumber.py:3