Escolar Documentos
Profissional Documentos
Cultura Documentos
Índice
Sequências biológicas............................................................................................................4
Transcrição...............................................................................................................................5
Complemento Inverso.............................................................................................................5
Tradução.......................................................................................................................................6
Open Reading Frames – ORFs............................................................................................8
Expressões Regulares............................................................................................................21
MOTIF............................................................................................................................................23
Classes...........................................................................................................................................25
Classe MySeq...........................................................................................................................26
Classe SubstMatrix.............................................................................................................31
Classe MyAlign......................................................................................................................33
BioPython......................................................................................................................................36
Alfabetos..................................................................................................................................37
Manipulação de sequências............................................................................................38
Complemento (ADN)...............................................................................................................39
Transcrição e Tradução (ADN).....................................................................................40
Tradução (RNA)......................................................................................................................40
Tabelas de Tradução...........................................................................................................41
Anotação de sequências: objecto SeqRecord.......................................................41
Formatos de sequências: objeto SeqIO...................................................................42
Função read: Ficheiro Fasta....................................................................................43
Função read: Ficheiro Genbank...............................................................................43
2
Parse........................................................................................................................................44
Sequências retiradas da net....................................................................................46
Escrita de sequências..................................................................................................47
Conversão de Formatos..................................................................................................48
Objetos SeqFeature.............................................................................................................49
Localização..........................................................................................................................50
Features: Ficheiro Genbank......................................................................................51
3
Clustering............................................................................................................................72
Sequências biológicas
import re
Transcrição
Representa a conversão de uma sequência de ADN numa sequência de RNA.
Como todas as sequências de ADN guardadas nas bases de dados são de
sequências de ADN lidas na direção 5’-> 3’, basta alterar todos os T’s
para U’s.
4
def transcricao (adn):
return (adn.upper (). replace ('T', 'U'))
Complemento Inverso
Para se obter a sequência complementar de uma sequência de ADN devem-
se fazer as seguintes conversões, posição a posição: A-> T; T-> A; C-> G e
G-> C. Para manter a leitura na mesma direção a sequência complementar
deverá ser invertida, obtendo-se assim o complemento inverso. Este
processo permite verificar qual será a outra banda do ADN, a que não está
guardada nas bases de dados, ou seja, a banda do ADN lida na direção 3’->
5’.
5
Tradução
Consiste na conversão de uma sequência de mRNA numa sequência de
aminoácidos. O processo passa por identificar cada codão, converte-lo no
aminoácido respetivo e juntar os aminoácidos resultantes pela ordem dada.
6
else: aa = 'X' #X = erro
return (aa)
def traduzseq (adn, iniPos = 0):
ADN = adn.upper ()
AA = ''
for pos in range (0, len (ADN) - 2, 3):
'''range (0, len (ADN) - 1, 3) - seleciona o 1º nucleótido dos codões.
Tem de se subtrair menos 1 porque nas strings começa-se a contar do 0.
Se o tamanho da sequência não for múltiplo de 3, ex: ACT GT, o método
anterior selecionaria A e G, no entanto, GT não é um codão, pelo que se
tem de usar range (0, len (ADN) - 2, 3), para desta forma não se
seleccionarem nucleótidos que não representem o início de um codão'''
codao = ADN [pos: pos + 3] # seleciona os codões
AA += traduzcodao (codao)
return (AA)
7
Open Reading Frames – ORFs
Cada sequência de ADN poderá ter 6 frames de leitura, na procura de
possíveis proteínas codificadas:
Na sequência original podemos começar a ler nas posições 1, 2 ou
3, tendo assim 3 sequências distintas de aminoácidos
Na sequência complementar inversa podemos começar a ler nas
posições 1, 2 ou 3
Assim de uma sequência de ADN podem extrair-se 6 possíveis sequências
de aminoácidos.
8
Todas as possíveis proteínas iniciam-se pelo aminoácido Metionina (M)
e terminam com stop (representado por_): M……_. O stop não pode ocorrer no
interior de uma proteína; a Metionina por sua vez pode ocorrer dentro de
uma proteína.
9
Alinhamento de Sequências Biológicas
10
Função objetivo/mérito
Permite avaliar a “qualidade” de um alinhamento, atribuindo-lhe um
valor numérico.
Tipicamente, a função objectivo adotada é aditiva, isto é,
corresponde à soma dos termos associados a cada par de carateres ou
espaçamentos, sendo definida a partir de:
11
Os valores correspondem ao logaritmo da divisão das
probabilidades de substituição em sequências relacionadas, sobre
a probabilidade de substituição em sequências não relacionadas
(logaritmos tornam coerente a sua soma na função objetivo;
s1 = 'ATGAAGG'
s2 = 'AAGAGAG'
sm = matrizSubs (1, 0, 'ACTG')
print (sm)
12
No caso da matriz de substituição estiver num ficheiro tem
de se ler esse ficheiro, pelo que utiliza-se outro algoritmo:
sm = readFile ('blosum62.mat')
s1 = 'LGPS-GC'
s2 = 'TGPSGG-'
print (sm)
13
return (res)
Matrizes de pontos
Método para comparar duas sequências de forma visual, o que permite
procurar zonas de alinhamento e repetições de carateres (diretas ou
invertidas), para além de zonas complementares.
Representa as duas sequências, uma na horizontal (colunas) e outra na
vertical (linhas).
Os pontos representam caracteres coincidentes e as diagonais
representam regiões de similaridade nas sequências.
14
Algoritmo de Needleman/Wunsch
É um método de Programação Dinâmica (PD), método exato que garante
solução óptima. Faz o alinhamento global de duas sequências A e B.
Define-se uma matriz S, onde os elementos de A são colocados nas
linhas (i) e os de B são colocados nas colunas (j). Os elementos da matriz
S representam o mérito do melhor alinhamento percorrendo a sequência A até
à posição i e a sequência B até à posição j:
15
def max3t (v1, v2, v3):
'''Direção das setas'''
if v1 > v2:
if v1 > v3:
return (1) # se s1 for o valor máximo a seta é diagonal
else:
return (3) # se s3 for o valor máximo a seta é horizontal
else:
if v2 > v3:
return (2) # se s2 for o valor máximo a seta é vertical
else:
return (3)
16
def recoverAlign (T, seq1, seq2):
'''Alinhamento global de duas sequências'''
res = ['', '']
i = len (seq1)
j = len (seq2)
while i > 0 or j >0:
if T [i][j] == 1: # diagonal
res [0] = seq1 [i-1] + res[0]
res [1] = seq2 [j-1] + res[1]
i -= 1
j -= 1
elif T[i][j] == 3: # horizontal -> vertical na transposta
res [0] = '-' + res[0]
res [1] = seq2 [j-1] + res[1]
j -= 1
else: # vertical -> horizontal na transposta
res [0] = seq1 [i-1] + res[0]
res [1] = '-' + res[1]
i -= 1
return (res)
17
Algoritmo de Smith/Waterman
É um método de Programação Dinâmica (PD), método exato que garante
solução óptima. Faz o alinhamento local de duas sequências.
Difere do algoritmo anterior no cálculo de S (i, j), pois quando o
valor obtido é negativo, substituiu-se por zero, neste caso, o alinhamento
é reiniciado: S ( i, j ) =max [S ( i−1 , j−1 )+ score ( ai ,b j ) ¿ , S ( i−1 , j )+ g , S ( i , j−1 ) + g , 0]¿.
O melhor alinhamento é obtido pelo maior valor em toda a matriz.
18
else:
S [i+1].append (b)
T [i+1].append (max (s1, s2, s3))
if b > maxscore:
maxscore = b
return (S, T, maxscore)
19
Métodos Heurísticos - BLAST
São rápidos que os algoritmos de Programação Dinâmica, mas não
garantem solução ótima. São ideais para comparar sequências similares.
Se as sequências a comparar forem pouco similares, o ideal será
utilizar a PD, pois tem maior sensibilidade.
O BLAST procura bons alinhamentos locais entre uma sequência query e
sequências de uma base de dados definida. Usa pequenas “palavras”, por
exemplo, 3 aminoácidos, ou 5-15 bases de DNA.O match entre as “palavras”
comuns formam a base de um alinhamento local que é posteriormente
estendido nas duas direções. A extensão ocorre até o alinhamento baixar de
um score pré-definido.
20
Expressões Regulares
São strings usadas como padrões usadas para procura noutras strings.
Permitem definir de uma forma flexível padrões que se podem procurar em
sequências.
O resultado de um processo de procura (match) pode consistir apenas
num valor lógico (existe ou não), a posição da primeira ocorrência ou
todas as ocorrências.
Para além dos caraters “normais”, as expressões regulares incluem um
conjunto de “meta-carateres” com significados especiais.
Meta-carateres Descrição
. Qualquer caratere
$ Final da linha
^ Início da linha
\d Dígitos
\D Não digito
21
Funções de procura em Python – Package re
re.search (padrao, seq): verifica se o padrão faz match na string
seq; apenas retorna o resultado da primeira ocorrência
group (): retorna o padrão que fez match
span (): retorna as posições onde ocorreu o match
re.match (padrao, seq): faz match se o padrão estiver no início da
seq
re.findall (padrao, seq): retorna os resultados de todas as
ocorrências
re.finditer (padrao, seq): retorna um iterador que permite recorrer
os resultados
22
MOTIF
Designa um padrão existente numa sequência biológica e que é
partilhado por várias sequências dada a função biológica associada.
Exemplos de motifs em sequências de ADN incluem, entre muitos outros,
locais de ligação de proteínas (ou outros elementos) regulatórios ao DNA,
controlando a transcrição.
Exemplos em RNA inclui, entre outros, a representação de padrões de
microRNas.
Exemplos de motifs em sequências de proteínas incluem, entre outros,
representação de domínios conservados de proteínas com funções biológicas
determinadas (e.g. locais de ligação de enzimas a substratos ou outras
moléculas).
23
Os Patterns são expressões regulares que representam zonas
conservadas de proteínas. O domínio “Zinc finger RING-type signature”
(PS00518) da Prosite é representado pela expressão: "C-x-H-x-[LIVMFY]-C-
x(2)-C-[LIVMYA]". Em que:
- x: representa qualquer aminoácido
- []: representa lista de aminoácidos alternativos
- x (2): representa dois aa’s quaisquer
- os “-” são usados para separar as várias posições
24
Classes
class Funcionario:
'Classe para guardar informação de funcionários -> Documentação opcional'
# Usando objetos
emp1.mostrarInformacao ()
emp2.mostrarInformacao ()
# Criando/Modificando objetos
emp1.idade = 20
emp2.salario = 4500
del emp1.idade
25
Classe MySeq
import re
class MySeq:
def __init__(self, seq, tipo = "dna"):
self.seq = seq.upper()
self.tipo = tipo
def __len__(self):
'''Aplicação da função len sobre um objetos desta classe'''
return (len (self.seq))
def printseq(self):
print (self.seq)
26
else: i += 1
return (res)
def validaER (self):
if self.tipo == "dna":
if re.search ("[^ACTGactg]", self.seq) != None: return False
else: return True
elif self.tipo == "rna":
if re.search ("[^ACUGacug]", self.seq) != None: return False
else: return True
elif self.tipo == "protein":
if re.search ("[^ACDEFGHIKLMNPQRSTVWY_acdefghiklmnpqrstvwy]", self.seq) !=
None:
return False
else: return True
else: return False
def compInverso(self):
if self.tipo != "dna":
return None
comp = ""
for c in self.seq:
if (c == 'A'): comp = "T" + comp
elif (c == "T"): comp = "A" + comp
elif (c == "G"): comp = "C" + comp
elif (c== "C"): comp = "G" + comp
return (MySeq(comp))
27
for pos in range (iniPos, len (self.seq) - 2, 3):
cod = self.seq [pos : pos + 3]
seqAA += self.traduzCodao (cod)
return (MySeq (seqAA, "protein"))
def traduzCodao (self, cod):
tc = {'GCT':'A', 'GCC':'A', 'GCA':'A', 'GCG':'A', 'TGT':'C', 'TGC':'C',
'GAT':'D', 'GAC':'D', 'GAA':'E', 'GAG':'E', 'TTT':'F', 'TTC':'F',
'GGT':'G', 'GGC':'G', 'GGA':'G', 'GGG':'G', 'CAT':'H', 'CAC':'H',
'ATA':'I', 'ATT':'I', 'ATC':'I', 'AAA':'K', 'AAG':'K', 'TTA':'L',
'TTG':'L', 'CTT':'L', 'CTC':'L', 'CTA':'L', 'CTG':'L', 'ATG':'M',
'AAT':'N', 'ACC':'N', 'CCT':'P', 'CCC':'P', 'CGA':'R', 'CGG':'R',
'AGA':'R', 'AGG':'R', 'TCT':'S', 'TCC':'S', 'TCA':'S', 'TCG':'S',
'AGT':'S', 'AGC':'S', 'ACT':'T', 'ACC':'T', 'ACA':'T', 'ACG':'T',
'GTT':'V', 'GTC':'V', 'GTA':'V', 'GTG':'V', 'TGG':'W', 'TAT':'Y',
'TAC':'Y', 'TAA':'_', 'TAG':'_', 'TGA':'_'}
cod = cod.upper ()
if cod in tc: aa = tc [cod]
else: aa = 'X' #X = erro
return (aa)
28
elif re.search("TA[TC]", cod): aa = "Y"
elif re.search("TA[AG]|TGA", cod): aa = "_";
else: aa = None
return (aa)
def orfs (self):
if self.tipo != "dna": return None
res = []
res.append(self.traduzSeq(0))
res.append(self.traduzSeq(1))
res.append(self.traduzSeq(2))
compinv = self.compInverso()
res.append(compinv.traduzSeq(0))
res.append(compinv.traduzSeq(1))
res.append(compinv.traduzSeq(2))
return (res)
29
if s > sizem:
lprot = x.group()
sizem = s
return (MySeq (lprot, "protein"))
def todasProteinas (self):
if self.tipo != "protein": return None
seqAA = self.seq
protsAtuais = []
proteinas = []
for aa in seqAA:
if aa == "_":
if protsAtuais:
for p in protsAtuais: proteinas.append (MySeq (p, "protein"))
protsAtuais = []
else:
if aa == "M": protsAtuais.append ("")
for i in range (len (protsAtuais)): protsAtuais[i] += aa
return (proteinas)
def teste():
seq_dna = input ("Sequencia:") # ATAATGATAGATAGATGAT
s1 = MySeq (seq_dna.upper ())
if s1.validaER():
print ("Sequencia valida")
print ("Transcricao: ")
s1.transcricao().printseq()
print("Complemento inverso:")
s1.compInverso().printseq()
print("Traducao: ")
s1.traduzSeq().printseq()
print("ORFs:")
30
for orf in s1.orfs(): orf.printseq()
print("Maior proteina nas ORFs:")
s1.maiorProteinaORFs().printseq()
else: print("Sequencia invalida")
Classe SubstMatrix
class SubstMatrix:
def __init__(self):
self.alphabet = ""
self.sm = {}
31
def scorePair (self, c1, c2):
if c1 not in self.alphabet or c2 not in self.alphabet: return None
return (self.sm [c1 + c2])
32
Classe MyAlign
class MyAlign:
def __str__(self):
'''Define como se imprime o alinhamento'''
res = ""
for seq in self.listseqs:
res += "\n" + seq
return (res)
33
def removeGap (self, seq, pos):
self.listseqs[seq] = self.listseqs[seq][:pos] + self.listseqs[seq][pos+1:]
maximum = 0
cmax = None
for ke in cont.keys():
# ke: A,| T, A,| -, G,| A,| T, -,| A, -|
# cont.keys (): pares de elementos das sequencias'''
34
def column (self, indice):
'''Lista com simbolos da coluna indice'''
res = []
for k in range (len (self.listseqs)):
res.append (self.listseqs[k][indice])
return (res)
def scoreColumn (self, charsCol, alignpars):
sc = 0;
for i in range (len (charsCol)):
for j in range (i + 1, len (charsCol)):
if charsCol[i] != '-' or charsCol[j] != '-':
sc += alignpars.scorePos (charsCol[i], charsCol[j])
return (sc)
if __name__ == "__main__":
alig = MyAlign (["ATGA-A","AA-AT-"], "dna")
print (alig)
# ATGA-A
# AA-AT-
print (len (alig)) # 6
print (alig.column (2)) # ['G', '-']
print (alig [1, 1]) # A
print (alig [0, 2]) # G
print (alig.consensus()) # AAGATA
35
BioPython
36
Alfabetos
Um dos principais objectos no BioPython é o objecto Seq. Este
permite guardar sequências e trabalhar sobre elas. Os objectos desta
classe são imutáveis.
O objecto alfabeto é o que faz o objecto Seq mais do que uma string.
Vamos usar os alfabetos IUPAC para trabalhar com o ADN, RNA e Proteínas.
Alfabeto para ADN: my_seq = Seq (‘sequência’, IUPAC.unambiguous_dna)
Alfabeto para Proteínas: my_seq = Seq (‘sequência’, IUPAC.protein)
37
print (IUPAC.unambiguous_dna.letters) # GATC
print (IUPAC.ambiguous_dna.letters) # GATCRYWSMKHBVDN
print (IUPAC.IUPACProtein.letters) # ACDEFGHIKLMNPQRSTVWY
print (IUPAC.ExtendedIUPACProtein.letters) # ACDEFGHIKLMNPQRSTVWYBXZJUO
Manipulação de sequências
from Bio.Seq import Seq
from Bio.Alphabet import IUPAC
from Bio.Alphabet import generic_nucleotide
'''Iteração'''
my_seq = Seq ('GATCG', IUPAC.unambiguous_dna)
for i in my_seq:
print (i) # imprime uma letra por linha
'''Concatenação de sequências'''
# Mesmo alfabeto
seq1 = Seq ('EVRNAK', IUPAC.protein)
seq2 = Seq ('GHERW', IUPAC.protein)
seq1 + seq2 # Seq ('EVRNAKGHERW', IUPACprotein())
38
# Alfabetos compatíveis
nuc_seq = Seq ('GATCGATGC', generic_nucleotide)
dna_seq = Seq ('ACGT', IUPAC.unambiguous_dna)
nuc_seq + dna_seq # Seq ('GATCGATGCACGT', generic_nucleotide)
Complemento (ADN)
menssenger_rna = coding_dna.transcribe ()
# Seq ('AUGGCCAUUGUAAUGGGCCGC', IUPACUnambiguousRNA())
39
coding_dna.translate (table = 'Vertebrate Mitochondrial')
# Seq ('MAIVMGRWKGAR*, HasStopCodon (IUPACProtein (), '*'))
Tradução (RNA)
Tabelas de Tradução
from Bio.Data import CodonTable
40
mito_table.stop_codons # ['TAA', 'TAG', 'AGA', 'AGG'] -> codões stop
mito_table.start_codons # ['ATT', 'ATC', 'ATA', 'ATG', 'GTG'] -> codões start
mito_table.forward_table ['ACG'] # T -> aminoácido correspondente
41
Formatos de sequências: objeto SeqIO
O objeto SeqIO fornece um conjunto de interfaces para trabalhar com
vários formatos de sequências biológicas.
As funções disponíveis permitem ler e escrever ficheiros com
sequências em diversos formatos distintos. Normalmente, ao ler as
sequências o resultado será um objeto SeqIO, ou um iterador que retorna
estes objetos se o ficheiro tiver mais do que uma sequência.
record = SeqIO.read (‘ficheiro’, ‘formato’)
record.função
record
'''SeqRecord (seq = Seq (’TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGA...CTG’, Sin-
gleLetterAlphabet ()), id = ’gi|45478711|ref|NC_005816.1|’, name= ’gi|45478711|
ref|NC_005816.1|’, description = ’gi|45478711|ref|NC_005816.1| Yersinia pestis
biovar Microtus ... sequence’, dbxrefs = [])'''
record.seq
'''Seq (’TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATCAGATCCAGG...CTG’, Sin-
gleLetterAlphabet ())''' -> Default: alfabeto genérico
record.description
'''gi|45478711|ref|NC_005816.1| Yersinia pestis biovar Microtus ... pPCP1,
complete sequence''' -> linha do titulo
42
# Não existe mais nenhum dos outros campos:
record.dbxrefs # []
record.annotations # {}
record.letter_annotations # {}
record.features # []
Função read: Ficheiro Genbank
record = SeqIO.read ("NC_005816.gb", "genbank")
record
'''SeqRecord (seq = Seq (’TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGA...CTG’, IU-
PACAmbiguousDNA ()), id = ’NC_005816.1’, name = ’NC_005816’, description =
’Yersinia pestis biovar Microtus str. 91001 plasmid pPCP1, complete sequence.’,
dbxrefs = [’Project:10638’])''' -> Alfabeto definido automaticamente
record.seq
# Seq (’TGTAACGAACGGTGCAATAGTGATCCACACCCAACGCCTGAAATC...CTG’,IUPACAmbiguousDNA())
len (record.annotations) # 11
record.annotations ["source"] # ’Yersinia pestis biovar Microtus str. 91001’
record.dbxrefs # [’Project: 10638’] -> PROJECT e DBLINK
len (record.features) # 29 -> tabela de features (ex: genes, CDS)
43
Parse
É usado para ler informação de sequências como objectos SeqRecord e
é normalmente usado num loop. Esta função tem dois argumentos:
Handle: é o primeiro argumento, usado para ler a informação.
Tipicamente é um ficheiro aberto para leitura, mas também pode
ser o output de uma linha de comando do programa, ou informação
downloaded da net.
Lower case string: é o segundo argumento e especifica o
formato da sequência. Os formatos suportados podem ser
encontrados em: http://biopython.org/wiki/SeqIO
Alfabeto: argumento opcional usado para especificar o
alfabeto. É útil para os ficheiros em formatos FASTA que por
default usam o alfabeto genérico.
all_species = []
for seq_record in SeqIO.parse ('ls_orchid.gbk', 'genbank'):
print (seq_record.id)
print (seq_record.seq)
print (len (seq_record))
all_species.append (seq_record.annotations ['organism'])
print (all_species)
44
Em vez de se usar o loop for, pode-se usar a função next () num
iterador para passar ordenadamente pelas entradas:
record_iterator = SeqIO.parse ('ls_orchid.gbk', 'genbank')
first_record = next (record_iterator)
print (first_record)
print (first_record.annotations ['source'])
45
Sequências retiradas da net
Como já vimos anteriormente a sequência (handle) usada pode ser
retirada da net usando a interface Entrez EFetch.
Se o handle for uma só sequência, usar a função Bio.SeqIO.read ().
Se o handle tiver vários records, usar a função Bio.SeqIO.parse ().
Entrez.email = '...@example.com'
handle = Entrez.efetch (db ='nucleotide', rettype ='fasta', retmode ='text', id
='6273291') # se o formato usado for o genbank: rettype = ‘gb’
seq_record = SeqIO.read (handle, 'fasta')
handle.close ()
print (seq_record.id, 'com', len (seq_record.features), 'features') # AF191665.1
com 0 features
Entrez.email = '...@example.com'
handle = Entrez.efetch (db = 'nucleotide', rettype = 'gb', retmode = 'text', id =
'6273291, 6273290, 6273289')
for seq_record in SeqIO.parse (handle, 'gb'):
print (seq_record.id, seq_record.description [:100], '...')
print ('Tamanho da sequência:', len (seq_record))
print (len (seq_record.features), 'features')
print ('from:', seq_record.annotations ['source'])
handle.close ()
46
Escrita de sequências
Falou-se de Bio.SeqIO.parse () para o input de sequências, agora
vai-se falar de Bio.SeqIO.write () para o output de sequências (escrever
ficheiros).
Esta função tem três argumentos:
Lista de objectos SeqRecord: representam as sequências e as
anotações que se pretende escrever
Handle ou nome do ficheiro
Formato (string)
lr = [s1, s2]
SeqIO.write(lr, 'ex.faa', 'fasta') # cria um ficheiro fasta de nome ex.faa que
contém as sequências s1 e s2 e respectiva informação
47
Conversão de Formatos
A função Bio.Seq.write () também aceita iteradores, como o que
obtemos de Bio.SeqIO.parse (), isto permite nos converter ficheiros
combinando estas duas funções.
48
Objetos SeqFeature
Permite guardar informação sobre features (anotações) das sequências
de forma estruturada.
Estrutura baseada no formato GenBank / EMBL, na sua tabela de
features.
Principais atributos de um objeto SeqFeature:
location: localização da feature na sequência (pode ser uma
posição, um intervalo, etc.)
type: (string) diz o tipo da feature, ex.: ‘gene’, ‘CDS’
qualifiers: informação adicional (dicionário)
Localização
ExactPosition: é um número que representa a posição exata na sequência
BeforePosition: representa uma posição imprecisa que ocorre antes de um
local específico. Ex.: `<13', significa que a posição real está localizada
numa posição menor que 13
AfterPosition: representa uma posição imprecisa que ocorre depois de um
local específico. Ex.: `>13', significa que a posição real está localizada
numa posição menor que 13
OneOfPosition: existem várias possibilidades para a posição
49
A partir de uma sequência mãe e tendo a localização da feature pode-
se extrair a sequência da feature.
featcds = []
for i in range (len (record.features)):
if record.features[i].type == 'CDS':
# Identifica features do tipo CDS
featcds.append (i)
for k in featcds:
print (record.features[k].location) # Identifica a sua localização
print (record.features[k].extract (record.seq), '\n') # Identifica a
subsequência do ADN afetada pela feature
50
Alinhamento Múltiplo de Sequências
51
Programação Dinâmica
A matriz de mérito (S) passa a ser N-dimensional:
1
2 2
Exemplo de alinhamento de
três sequências
52
Algoritmos Progressivos
Inicialmente calculam-se os alinhamentos para todos os pares de
sequências possíveis. Constrói-se uma árvore filogenética de acordo com o
mérito dos alinhamentos anteriores. Escolhem-se as duas sequências mais
similares e faz-se o seu alinhamento. Seguindo a estrutura da árvore vão
se adicionando as restantes sequências ao alinhamento múltiplo.
Um exemplo de um algoritmo progressivo eficiente é o CLUSTAL-W.
Uma das etapas de qualquer algoritmo progressivo é a combinação de
(pelo menos) dois alinhamentos num único. Existem várias alternativas para
realizar este processo:
Calcular consensos dos alinhamentos e alinhar estes consensos
Adaptar a PD para trabalhar com matrizes de ocorrência/perifis
Ter uma sequência base em todos os MAs e basear a combinação
nas posições dessa sequência.
53
def scoreSP (self, alinhamento):
sp = 0
ncols = len (alinhamento[0])
for j in range (ncols):
charsCol = alinhamento.column (j)
scoreCol = self.scoreColumn (charsCol)
sp += scoreCol
return sp
align2 = self.alignpars.recoverAlignment()
54
def alignConsensus (self):
'''Alinha as duas primeiras sequências da lista. Depois, adiciona uma a
uma as restantes sequências com a função addSeqAlignment'''
self.alignpars.needlemanWunsch (self.seqs[0], self.seqs[1])
res = self.alignpars.recoverAlignment ()
for i in range (2, len (self.seqs)):
res = self.addSeqAlignment (res, self.seqs[i])
return res
# -PHWAS-
# --HWASW
# HPHWA--
CLUSTAL-W
Numa primeira fase faz o alinhamento de pares de sequências usando
um algoritmo de PD, para o cálculo da similaridade entre cada par.
Similaridade = nº de carateres iguais/tamanho da sequência * 100
55
alinhamento (alinhando sequências com os alinhamentos prévios – profiles).
Gaps são introduzidos sempre que necessário.
# Guardar o resultado
save_file = open ("my_blast.xml", "w")
save_file.write (result_handle.read ())
56
save_file.close ()
result_handle.close ()
57
Classe BlastRecord
Um objeto BlastRecord contém toda a informação que se pode querer
retirar do resultado de um Blast, incluindo: todos os parâmetros usados e
os resultados completos. Os resultados de cada alinhamento estão
organizados pelos seus HSPs.
E_VALUE_THRESH = 0.05
for blast_record in blast_records:
# record: matriz de substituição, gap penalties, database e alignment
for alignment in blast_record.alignments:
# alignment: accession, hit_id, hit_def, alignment.length, hsps
for hsp in alignment.hsps:
# hsp: expext (e-value), score, align_length, query, match, sbjct
if hsp.expect < E_VALUE_THRESH:
print ('****Alignment****’)
print ('sequence:', alignment.title)
print ('length:', alignment.length)
print ('e value:', hsp.expect)
print (hsp.query [0:75] + '...' )
print (hsp.match [0:75] + '...' )
print (hsp.sbjct [0:75] + '...' )
58
Representação de Alinhamentos
O objeto MultipleSeqAlignment contém objetos e funções que permitem
lidar com alinhamentos (com duas ou mais sequências); vem substituir o
objecto Align que está deprecated.
Estes objetos são usados para guardar a estrutura dos alinhamentos e
não métodos para a sua criação.
seq1 = 'MHQAIFIYQIGYPLKSGTIQSIRSPEYDNW'
seq2 = 'MH--IFIYQIGYALKSGYIQSIRSPEY-NW'
print (alin)
'''IUPACProtein() alignment with 2 rows and 30 columns
MHQAIFIYQIGYPLKSGTIQSIRSPEYDNW seq1
MH--IFIYQIGYALKSGYIQSIRSPEY-NW seq2'''
59
Objeto AlignIO
O objeto AlignIO funciona para os alinhamentos de forma semelhante
ao SeqIO para sequências, isto é, permite ler e escrever alinhamentos em
diversos formatos
60
AEPNAATNYATEAMDSLKTQAIDLISQTWPVVTTVVVAGLVIRLFKKFSSKA - CAPSD_BPIKE/30-81'''
first_align = record[0]
print (first_align)
'''ID: Alpha
Name: Alpha
Description: Alpha
Number of features: 0
61
Seq ('AACAAC', SingleLetterAlphabet())'''
62
AlignIO.write (my_alignments, "my_example.faa", "fasta")
'''>A <unknown description>
ACTGCTAGC...
>F <unknown description>
TCAGCTAG'''
Conversão de Formatos
from Bio import AlignIO
count = AlignIO.convert ("PF05371_seed.sth", "stockholm", "PF05371_seed.aln", "clustal")
print ("Convertidos %i alinhamentos" % count )
63
Manipulação dos Alinhamentos
alignment = AlignIO.read ("Ficheiro", "Formato")
print (alignment [sequências : colunas]
64
Módulo Bio.pairwise2
Este módulo faz os alinhamentos de pares locais e globais.
65
Análise de Dados Ómicos
66
Identificação de vias metabólicas
Estudo da regulação
Determinar a função de genes/anotação
Estrutura
Independentemente da técnica usada, dados de são normalmente
transformados numa matriz de quantidades/ concentrações (e.g. expressão
genes, proteínas, metabolitos) x condições.
Permite que os biólogos cheguem a correlações entre genes/
proteínas/ compostos diferentes e que tentem perceber como as suas funções
podem estar ligadas.
67
Dados de expressão genética
Nos pontos seguintes, iremos usar essencialmente expressão genética
como exemplos dos dados a analisar, mas problemas semelhantes ocorrem com
outros tipos de dados ómicos.
Técnicas como DNA microarrays e RNA sequencing medem o nível de
expressão de todos os genes numa célula, em diversas condições/ instantes
de tempo.
O nível de expressão de um dado gene é estimado pela medição da
quantidade de mRNA respectivo.
• Um gene está ativo se está a ser transcrito.
• Mais mRNA indica mais atividade do gene (embora em termos
biológicos isto nem sempre seja verdade)
68
Passos do pré-processamento a este nível incluem tratamento de
valores omissos, normalização, filtros de flat patterns, transformações
logarítmicas, etc.
Estes passos permitem que os dados sejam de dimensões mais tratáveis
e que estejam em gamas de valores adequadas para análise posterior.
Transformação logarítmica
COMO DETECTAR?
• Desvio padrão/ desvio absoluto médio / IQR
• Valor dos picos mínimos e máximos (e.g. max/min)
SOLUÇÃO
• Remover estes genes da análise
• Remover apenas os que têm valores médios próximos de 0
69
Standardização entre diferentes amostras
Tipicamente, os valores são re-escalonadas para ficarem dentro de
limites normalizados (distribuição normal com média 0 e variância 1) em
cada variável. Como:
• Subtrair cada valor pela média (ou mediana) dos valores de
expressão desse gene
• Dividir pelo desvio padrão (ou desvio absoluto médio)
• Por vezes faz-se apenas a primeira
Análise de dados
Expressão diferencial
Em termos de investigação biológica é muito importante identificar o
conjunto de genes que têm níveis diferentes de expressão comparando duas
condições experimentais (e.g. célula normal vs cancerígena, wild
type vs mutante).
A identificação dos genes que são diferencialmente expressos assenta
em testes estatísticos de hipóteses:
Paired t-test: se as amostras são emparelhadas (e.g. duas
condições por paciente, um com o tratamento A e outro com o
tratamento B)
Unpaired t-test: as amostras dos dois grupos não são
relacionadas
70
Testes múltiplos: ao testar R genes em simultâneo, mesmo com
uma probabilidade baixa de erro (p) o nº esperado de erros
(falsos positivos) é R.p, que pode ser alto pois R pode ser de
vários milhares. Solução típica: fixar valor do p-value para
garantir uma taxa de falsos-positivos aceitável.
One way ANOVA (analysis of variance): quando temos 3 ou +
grupos de condições (amostras)
Multifactor ANOVA: quando temos 2 ou + factores (variáveis)
General linear models: podem incorporar análise da influência
de variáveis contínuas
Clustering
Genes co-regulados deverão mostrar comportamentos (níveis de
expressão) “similares”.
“Guilt by Association”, isto é, se um gene desconhecido i é similar
em termos de expressão a um gene conhecido j, é muito provável que estejam
envolvidos na mesma via metabólica.
71
Medindo semelhança de formas: coeficientes de correlação (e.g.
Pearson).
Medindo distâncias: euclidiana, Manhattan
K-mean Clustering
Determina K clusters que englobam todos os pontos, de forma a
minimizar a média do quadrado das distâncias de cada ponto para o centro
do cluster a que pertence d(V,X): d(V,X) = Σd(vi, X)2 / n, 1 < i < n, d(vi,
X) refere-se à distância Euclideana entre o ponto vi e o centro de
gravidade do cluster X, a que pertence
Clustering Hierárquico
Vai agrupando os genes, iteração a iteração, criando uma árvore
Critério de junção baseado na distância entre genes/ clusters.
72
73