-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFicha4.py
333 lines (275 loc) · 8.55 KB
/
Ficha4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
fich_vaz = "Ficheiro vazio"
def ler_seq(FileHandle):
""" Funcao que devolve a sequencia contida numa linha do ficheiro
Parameters
----------
FileHandle : _io.TextIOWrapper
Um ficheiro .txt aberto que contém uma sequência de DNA por linha
Returns
-------
seq : str
Sequência de DNA que está contida numa linha
"""
seq = FileHandle.readline()
assert seq != '', fich_vaz
seq= seq.upper()
return seq
def ler_FASTA_seq(file):
"""Função que devolve a primeira sequência contida num ficheiro FASTA
Se o ficheiro apresentar mais do que uma sequência, devolve apenas a primeira
Parameters
----------
FileHandle : _io.TextIOWrapper
Um ficheiro FASTA
Returns
-------
seq : str
Primeira sequência contida num ficheiro FASTA, sem o cabeçalho
"""
import re
linhas = file.readlines()
assert linhas != [], fich_vaz
seq = ''
a = ''.join(linhas)
header = re.findall('>.+[\n]',a)
for l in linhas:
if l == header[0]:
continue
elif l not in header:
seq+=l.replace('\n','')
elif l in header: break
return seq
def complemento_inverso(seq):
'''
Definição que introduzida uma sequência devolve o seu complemento inverso.
Parameters
----------
seq: str
Returns
-------
comple_inv : str or ValueError
'''
seq=seq.upper()
if determina_dna(seq)==True:
comple_inv= seq[::-1].lower().replace('a','T').replace('t','A').replace('g','C').replace('c','G')
return comple_inv
else: raise TypeError
def transcricao(seq):
'''
Função que introduzida uma sequência de DNA devolve a sua sequência de RNA.
Parameters
----------
seq : str
Returns
-------
rna : str or ValueError
'''
seq=seq.upper()
if determina_dna(seq)==True:
rna = seq.replace('T', 'U')
return rna
else: raise TypeError
def traducao(seq):
'''
Função que introduzida uma sequência DNA devolve uma sequência de aminoácidos.
Parameters
----------
seq : str
Returns
-------
amino : str or ValueError
'''
gencode = {
'ATA':'I', 'ATC':'I', 'ATT':'I', 'ATG':'M', 'ACA':'T', 'ACC':'T', 'ACG':'T', 'ACT':'T',
'AAC':'N', 'AAT':'N', 'AAA':'K', 'AAG':'K', 'AGC':'S', 'AGT':'S', 'AGA':'R', 'AGG':'R',
'CTA':'L', 'CTC':'L', 'CTG':'L', 'CTT':'L', 'CCA':'P', 'CCC':'P', 'CCG':'P', 'CCT':'P',
'CAC':'H', 'CAT':'H', 'CAA':'Q', 'CAG':'Q', 'CGA':'R', 'CGC':'R', 'CGG':'R', 'CGT':'R',
'GTA':'V', 'GTC':'V', 'GTG':'V', 'GTT':'V', 'GCA':'A', 'GCC':'A', 'GCG':'A', 'GCT':'A',
'GAC':'D', 'GAT':'D', 'GAA':'E', 'GAG':'E', 'GGA':'G', 'GGC':'G', 'GGG':'G', 'GGT':'G',
'TCA':'S', 'TCC':'S', 'TCG':'S', 'TCT':'S', 'TTC':'F', 'TTT':'F', 'TTA':'L', 'TTG':'L',
'TAC':'Y', 'TAT':'Y', 'TAA':'_', 'TAG':'_', 'TGC':'C', 'TGT':'C', 'TGA':'_', 'TGG':'W'}
seq = seq.upper()
if determina_rna(seq)==True:
seq = seq.replace('U','T')
if determina_dna(seq)==True:
for i in range(0, len(seq), 3):
codao = seq[i : i + 3]
if i==0:
amino=gencode[codao]
elif len(codao)==3:
amino += gencode[codao]
else: pass
return amino
else: raise TypeError
def valida(seq):
'''
Função que verifica se a sequência introduzida é uma sequência de DNA.
Parameters
----------
seq : str
Returns
-------
True/False
'''
seq = seq.upper()
if determina_amino(seq)!=True and determina_rna(seq)!=True and determina_amino(seq)!=True:
return False
else: return True
def determina_dna(seq):
'''
Função que dada uma sequência determina se é uma sequência de dna ou não
Parameters
----------
seq : str
sequência de dna
Returns
-------
bool
se seq é cadeia de dna retorna True senão retorna False
'''
seq=seq.upper()
x = seq.strip()
for i in x:
if i!='A' and i!='T' and i!='C' and i!='G':
return False
break
else: pass
return True
def determina_rna(seq):
'''
Função que determina se a cadeia introduzida é ou não uma cadeia de rna.
Parameters
----------
seq : str
cadeia de rna
Returns
-------
bool
True or False
'''
seq = seq.upper()
x = seq.strip()
for i in x:
if i!='A' and i!='U' and i!='G' and i!='C':
return False
break
else: pass
return True
def determina_amino(seq):
'''
Função que determina se a sequência introduzida é ou não uma sequência de aminoácidos.
Parameters
----------
seq : str
sequência de aminoácidos
Returns
-------
bool
True or False
'''
gencode = {
'ATA':'I', 'ATC':'I', 'ATT':'I', 'ATG':'M', 'ACA':'T', 'ACC':'T', 'ACG':'T', 'ACT':'T',
'AAC':'N', 'AAT':'N', 'AAA':'K', 'AAG':'K', 'AGC':'S', 'AGT':'S', 'AGA':'R', 'AGG':'R',
'CTA':'L', 'CTC':'L', 'CTG':'L', 'CTT':'L', 'CCA':'P', 'CCC':'P', 'CCG':'P', 'CCT':'P',
'CAC':'H', 'CAT':'H', 'CAA':'Q', 'CAG':'Q', 'CGA':'R', 'CGC':'R', 'CGG':'R', 'CGT':'R',
'GTA':'V', 'GTC':'V', 'GTG':'V', 'GTT':'V', 'GCA':'A', 'GCC':'A', 'GCG':'A', 'GCT':'A',
'GAC':'D', 'GAT':'D', 'GAA':'E', 'GAG':'E', 'GGA':'G', 'GGC':'G', 'GGG':'G', 'GGT':'G',
'TCA':'S', 'TCC':'S', 'TCG':'S', 'TCT':'S', 'TTC':'F', 'TTT':'F', 'TTA':'L', 'TTG':'L',
'TAC':'Y', 'TAT':'Y', 'TAA':'_', 'TAG':'_', 'TGC':'C', 'TGT':'C', 'TGA':'_', 'TGG':'W'}
seq = seq.upper()
x = seq.strip()
for i in x:
if i not in gencode.values():
return False
break
else: pass
return True
def contar_bases(seq):
'''
Função que introduzida uma sequência devolve o número de bases dessa sequência.
Parameters
----------
seq : str
Returns
-------
nbases : int or ValueError
'''
if valida(seq)==True:
nbases={}
seq= seq.strip()
for base in seq:
base = base.upper()
nbases[base]= nbases.get(base, 0) + 1
return nbases
else:
raise TypeError
def reading_frames(seq):
'''
Função que dada uma sequência devolve uma lista com todas as reading frames.
Parameters
----------
seq : str
Returns
-------
lst_read_frame : list or ValueError
'''
seq=seq.upper()
if valida(seq)==True:
lst_read_frame=[]
lst_read_frame.append(seq)
lst_read_frame.append(seq[1:])
lst_read_frame.append(seq[2:])
return lst_read_frame
else:
raise TypeError
def complemento_proteina_dna(seq):
'''
Função que dada uma sequência de dna devolve uma lista de todas as traduções.
Parameters
----------
seq : str
Cadeia de DNA.
Returns
-------
lista : list
Lista da tradução da sequência de DNA.
'''
if determina_dna(seq)==True:
import re
seq1 = complemento_inverso(seq)
lst_all_reading_frames = reading_frames(seq) + reading_frames(seq1)
translation_lst = [traducao(frames) for frames in lst_all_reading_frames]
seq1 = complemento_inverso(seq)
lst_all_reading_frames = reading_frames(seq) + reading_frames(seq1)
translation_lst = [traducao(frames) for frames in lst_all_reading_frames]
lista = [re.findall('M[A-Z]*_',orf) for orf in translation_lst]
return lista
else:
raise TypeError
def get_proteins(seq):
'''
Função que dada uma sequência devolve numa lista todas as proteínas ordenadas por tamanho e por ordem alfabética para as do mesmo tamanho.
Parameters
----------
seq : str
Returns
-------
result : list or ValueError
'''
import re
seq= seq.upper()
if valida(seq)==True:
if determina_dna(seq)==True:
lista = complemento_proteina_dna(seq)
result = sorted({p for lp in lista for p in lp}, key = lambda x: (-len(x), x))
elif determina_rna(seq)==True:
rna = seq.replace('U','T')
amino = traducao(rna)
lista = re.findall('M[A-Z]*_',amino)
result = sorted({p for p in lista}, key = lambda x: (-len(x), x))
elif determina_amino(seq)=='True':
lista = re.findall('M[A-Z]*_',seq)
result = sorted({p for p in lista}, key = lambda x: (-len(x), x))
return result
else:
raise TypeError