Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Project: RNApolys
Views: 491
1
class sec_struct:
2
def __init__(self,ss):
3
self.struct = ss
4
self.length = len(self.struct)
5
self.energy = 0.0
6
self.gen_struct_info()
7
self.accuracy = None
8
self.native = None
9
10
def gen_struct_info(self):
11
self.compute_pairs()
12
self.num_pairs = len(self.pairs)
13
self.density = (2.0*self.num_pairs)/self.length
14
15
def is_canonical( self,x, y ):
16
# GU is the wobble pair.
17
canonical = ['AU', 'CG', 'GC', 'GU', 'UA', 'UG']
18
#canonical = ['AU', 'CG', 'GC', 'UA']
19
return x.upper()+y.upper() in canonical
20
21
def get_pairs(self):
22
return self.pairs[:]
23
24
def get_non_canonical_pairs(self, seq ):
25
if self.length!=seq.get_length():
26
raise ValueError("Secondary struct and sequence length mismatch.")
27
canonical = lambda ij: not self.is_canonical(seq[ij[0]-1],seq[ij[1]-1])
28
return filter(canonical, self.pairs)
29
30
def get_canonical_pairs(self, seq ):
31
if self.length!=seq.get_length():
32
raise ValueError("Secondary struct and sequence length mismatch.")
33
canonical = lambda ij: self.is_canonical(seq[ij[0]-1],seq[ij[1]-1])
34
return filter(canonical, self.pairs)
35
36
def canonical_struct(self, seq ):
37
n = len(self.struct)
38
canonical_struct = list('.'*n)
39
40
for i,j in self.get_canonical_pairs( seq ):
41
canonical_struct[i-1]='('
42
canonical_struct[j-1]=')'
43
return secondary_struct(''.join(canonical_struct))
44
45
def get_num_pairs(self):
46
return self.num_pairs
47
48
def get_dot_bracket(self):
49
return self.struct
50
51
def get_energy(self):
52
return self.energy
53
54
def get_length(self):
55
return self.length
56
57
def get_num_canonical_pairs(self, seq):
58
return len(self.get_canonical_pairs(seq))
59
60
def get_density(self):
61
return self.density
62
63
def get_canonical_density(self,seq):
64
return (2.0*self.get_num_canonical_pairs(seq))/self.length
65
66
def compute_pairs(self):
67
sec_struct = self.struct
68
stack = []
69
pairs = []
70
canon_pairs = []
71
for i,c in enumerate(sec_struct):
72
if c == '(':
73
stack.append(i)
74
elif c == ')':
75
j = stack.pop()
76
pairs.append((j+1,i+1))
77
self.pairs = sorted(pairs)
78
79
80
def relative_accuracy(self, native):
81
if self.accuracy is None or native!=self.native:
82
self._compute_accuracy(native)
83
return self.accuracy
84
85
def _compute_accuracy(self,native,seq=None):
86
# We treat self as the predicted structure and it is going to be
87
# compared against native.
88
89
predicted_pairs = set(self.get_pairs() if seq is None
90
else self.get_canonical_pairs(seq))
91
native_pairs = set(native.get_pairs() if seq is None
92
else native.get_canonical_pairs(seq))
93
94
self.num_canon_pairs = len(predicted_pairs)
95
self.tp = len(native_pairs.intersection(predicted_pairs))
96
self.fn = len(native_pairs.difference(predicted_pairs))
97
self.fp = len(predicted_pairs.difference(native_pairs))
98
99
denom = 2.0*self.tp+self.fn+self.fp
100
self.accuracy = 2*self.tp/denom
101
102
return self.accuracy
103
104
def __eq__(self,other):
105
if isinstance(other, secondary_struct):
106
return self.struct==other.struct
107
return NotImplemented
108
109
def __ne__(self,other):
110
result = self.__eq__(other)
111
if result is NotImplemented:
112
return result
113
return not result
114
115
def __getitem__(self,i):
116
return self.struct[i]
117
118
def __str__(self):
119
return self.struct
120
121