ludwig krippahl, 2007 programação para as ciências experimentais 2006/7 teórica 8
TRANSCRIPT
Ludwig Krippahl, 2007
Programação para as Ciências Experimentais
2006/7
Teórica 8
Ludwig Krippahl, 2007 2
Na aula de hoje...
Estruturas. Listas. Ficheiros, leitura e escrita simples. Comparação de sequências. Exemplo de uma função recursiva.
Ludwig Krippahl, 2007 3
Estruturas
Vectores e matrizes guardam valores de um só tipo.
Estruturas podem guardar valores de vários tipos.
Sintaxe:• variável.campo
Ludwig Krippahl, 2007 4
Estruturas Exemplo:
octave:7> prato.nome="filetes";octave:8> prato.preco=12.5;octave:9> prato.pedidos=[10,2,3,5,9,5,9];octave:10> pratoprato ={ nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500}
Ludwig Krippahl, 2007 5
Estruturas
Recapitulando• nome_da_variavel.campo1=val1
• nome_da_variavel.campo2=val2
• nome_da_variavel.campo2=val2
• Cada campo pode ter um valor de tipo diferente, incluindo ser outra estrutura.
Ludwig Krippahl, 2007 6
Estruturas Estrutura de estrutura...
octave:13> cliente.nome="Vitor Meireles";octave:14> cliente.prato=pratocliente ={ nome = Vitor Meireles prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 }}
Ludwig Krippahl, 2007 7
Listas
Não podemos criar vectores de estruturas:
octave:15> v=[prato,cliente]
error: octave_base_value::matrix_value(): wrong type argument `struct'
error: evaluating assignment expression near line 15, column 2
Ludwig Krippahl, 2007 8
Listas
Para agrupar estruturas ou variáveis de vários tipos temos que criar uma lista.
Usamos a função list, que recebe em cada argumento um valor e devolve uma lista com esses valores.
Ex:
octave:17> l=list(1,"abc",prato)
Ludwig Krippahl, 2007 9
Listas
l =( [1] = 1 1º elemento: escalar [2] = abc 2º elemento: string [3] = 3º elemento: estrutura { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 })
Ludwig Krippahl, 2007 10
Listas
Podemos criar a lista incrementalmente, partindo da lista vazia:• l=list;
E acrescentando um valor de cada vez:• l=append(l,1)
• l=append(l,"abc")
• l=append(l,prato)
Ludwig Krippahl, 2007 11
Listas
append(x,y)• Devolve a lista resultante de acrescentar y
no final de x. Se y for uma lista acrescenta todos os elementos de y no final de x.
Ludwig Krippahl, 2007 12
Listas append(x,y)
octave:21> l=listl = ()octave:22> l=append(l,1)l =( [1] = 1)octave:23> l=append(l,"abc")l =( [1] = 1 [2] = abc)
Ludwig Krippahl, 2007 13
Listas
Aceder a um elemento da lista:• como um vector ou usar a função nth, que devolve o
n-ésimo elemento da lista.octave:42> l(1:2)ans =( [1] = 1 [2] = abc)octave:43> nth(l,2)ans = abc
Ludwig Krippahl, 2007 14
Listas
Aceder a um elemento da lista:• como um vector ou usar a função nth, que
devolve o n-ésimo elemento da lista.
Atenção:• Ao aceder à lista como um vector o
resultado é uma lista. Ex: l(1) não é o primeiro elemento, mas uma lista com o primeiro elemento.
• Para obter o elemento n usar nth(l,n).
Ludwig Krippahl, 2007 15
Ficheiros
Para aceder a um ficheiro temos que o identificar com uma estrutura com informação acerca do ficheiro.
Usamos a função fopen para abrir o ficheiro (e obter o identificador), fclose para fechar e deixar livre o ficheiro para outras aplicações.
Ludwig Krippahl, 2007 16
Ficheiros fopen(nome,modo [, arquitectura])
• normalmente usamos só os primeiros dois argumentos:
octave:7> teste=fopen("teste.txt","w")teste ={ id = 3 name = teste.txt mode = w arch = native status = 1}
Ludwig Krippahl, 2007 17
Ficheiros
fopen(nome, modo, arquitectura)• normalmente usamos só os primeiros dois
argumentos:
octave:7> teste=fopen("teste.txt","w")
• Guarda na variável teste a estrutura que identifica o ficheiro.
Ludwig Krippahl, 2007 18
Ficheiros
fopen(nome, modo, arquitectura)• normalmente usamos só os primeiros dois
argumentos:
octave:7> teste=fopen("teste.txt","w")
• Guarda na variável teste a estrutura que identifica o ficheiro.
• No final fechamos o ficheiro:
octave:8> fclose(teste)
ans = 0
Ludwig Krippahl, 2007 19
Ficheiros
fopen(“teste.txt”, “w”)• Modo “w”, write, para escrita. Apaga o
conteúdo original.
• Modo “r”, read, para leitura.
• Modo “a”, append, para acrescentar ao ficheiro. Preserva o conteúdo original
• (Ver outros modos no manual)
Ludwig Krippahl, 2007 20
Ficheiros
Ler dados de um ficheiro:• fgetl( identificador, comprimento)
• Lê uma linha do ficheiro identificado, ou o número de caracteres no comprimento.
• Se o comprimento é omitido, lê todos os caracteres até ao final da linha.
• Se não há mais linhas devolve -1.
Ludwig Krippahl, 2007 21
Ficheiros
Sabemos que o ficheiro chegou ao fim com a função feof:• feof( identificador )
• Devolve true se o ficheiro estiver no fim.
Ludwig Krippahl, 2007 22
Exemplo: ler sequências de proteínas.
O formato FASTA é um formato de texto para guardar sequências.
As linhas começadas por “>” identificam a molécula (proteína, RNA, ou DNA):
>UniProt/Swiss-Prot|P00273|DE....
Ludwig Krippahl, 2007 23
Exemplo: ler sequências de proteínas.
O formato FASTA é um formato de texto para guardar sequências.
As restantes linhas contêm a sequência:
ALSAADAGLLAQSWAPVFANSDANGASF...
RDVSSRIFARLNEFVSNAADAGKMGSML...
APAADAAWNSLFGLIISALQSAGK
Ludwig Krippahl, 2007 24
Exemplo: ler sequências de proteínas.
O formato FASTA é um formato de texto para guardar sequências.
Como no máximo este formato usa 80 caracteres por linha a sequência pode estar partida em várias linhas.
ALSAADAGLLAQSWAPVFANSDANGASF...
RDVSSRIFARLNEFVSNAADAGKMGSML...
APAADAAWNSLFGLIISALQSAGK
Ludwig Krippahl, 2007 25
Exemplo: ler sequências de proteínas.
Função lefasta(nome)• Lê o ficheiro cujo nome é fornecido e
devolve uma lista de estruturas.
• Em cada estrutura tem dois campos, id, com a identificação da proteína, e seq, com a sequência da proteína.
Ludwig Krippahl, 2007 26
Exemplo: ler sequências de proteínas.
function l=lefasta(nome)id=fopen(nome,”r”);l=list;
(Ciclo de leitura do ficheiro)
fclose(id);endfunction
Abre o ficheiro e guarda o identificador
Ludwig Krippahl, 2007 27
Exemplo: ler sequências de proteínas.
function l=lefasta(nome)id=fopen(nome);l=list;
(Ciclo de leitura do ficheiro)
fclose(id);endfunction
Cria uma lista vazia
Ludwig Krippahl, 2007 28
Exemplo: ler sequências de proteínas.
function l=lefasta(nome)id=fopen(nome);l=list;
(Ciclo de leitura do ficheiro)
fclose(id);endfunction
Depois de ler o ficheiro, fecha e termina a
função
Ludwig Krippahl, 2007 29
Exemplo: ler sequências de proteínas.r.seq='';while !feof(id)
s=fgetl(id);if strcmp(s(1),'>')
if !strcmp(r.seq,'')l=append(l,r);
endifr.id=s;r.seq='';
else r.seq=[r.seq,s];endif
endwhileif !strcmp(r.seq,'')
l=append(l,r);endif
Ciclo enquanto o ficheiro não chegou ao
fim.
Ludwig Krippahl, 2007 30
Exemplo: ler sequências de proteínas.r.seq='';while !feof(id)
s=fgetl(id);if strcmp(s(1),'>')
if !strcmp(r.seq,'')l=append(l,r);
endifr.id=s;r.seq='';
else r.seq=[r.seq,s];endif
endwhileif !strcmp(r.seq,'')
l=append(l,r);endif
Lê uma linha e compara o primeiro caracter com
“>”
(quer dizer que encontrou uma proteína
nova)
Ludwig Krippahl, 2007 31
Exemplo: ler sequências de proteínas.r.seq='';while !feof(id)
s=fgetl(id);if strcmp(s(1),'>')
if !strcmp(r.seq,'')l=append(l,r);
endifr.id=s;r.seq='';
else r.seq=[r.seq,s];endif
endwhileif !strcmp(r.seq,'')
l=append(l,r);endif
Se há uma sequência guardada, então
acrescenta r à lista l
É por isto que a sequência em r começa
vazia
Ludwig Krippahl, 2007 32
Exemplo: ler sequências de proteínas.r.seq='';while !feof(id)
s=fgetl(id);if strcmp(s(1),'>')
if !strcmp(r.seq,'')l=append(l,r);
endifr.id=s;r.seq='';
else r.seq=[r.seq,s];endif
endwhileif !strcmp(r.seq,'')
l=append(l,r);endif
Quando encontra nova proteína guarda o identificador da
proteína e limpa a sequência.
Ludwig Krippahl, 2007 33
Exemplo: ler sequências de proteínas.r.seq='';while !feof(id)
s=fgetl(id);if strcmp(s(1),'>')
if !strcmp(r.seq,'')l=append(l,r);
endifr.id=s;r.seq='';
else r.seq=[r.seq,s];endif
endwhileif !strcmp(r.seq,'')
l=append(l,r);endif
Se não é uma proteína nova então é outra linha da sequência,
para juntar à sequência lida até agora
Ludwig Krippahl, 2007 34
Exemplo: ler sequências de proteínas.r.seq='';while !feof(id)
s=fgetl(id);if strcmp(s(1),'>')
if !strcmp(r.seq,'')l=append(l,r);
endifr.id=s;r.seq='';
else r.seq=[r.seq,s];endif
endwhileif !strcmp(r.seq,'')
l=append(l,r);endif
No final do ciclo acrescentar a última
proteína lida, se houver
Ludwig Krippahl, 2007 35
Exemplo: centros Fe S
Ludwig Krippahl, 2007 36
Desulforedoxin, 1DXG
Dímero
Ludwig Krippahl, 2007 37
Ludwig Krippahl, 2007 38
Ludwig Krippahl, 2007 39
Ludwig Krippahl, 2007 40
Exemplo: centros Fe S
>...Desulforedoxin
ANEGDVYKCELCGQVVKVLEEGGGTLVCCGEDMVKQ
Padrão do centro: ...C-[até 4]-C- ... -C-[até 4]-C-...
Ludwig Krippahl, 2007 41
Exemplo: centros Fe S
Para fazer na aula prática:• Função vec=contafes(lista)
• A partir da lista de estruturas com seq, a sequência de cada proteína, devolve o número estimado de centros de Fe-S contando as cisteínas no padrão:
...C-[até 4]-C- ... -C-[até 4]-C-...
Ludwig Krippahl, 2007 42
Alinhar Sequências: Needleman-Wunsch
Saul Needleman e Christian Wunsch A general method applicable to the
search for similarities in the amino acid sequence of two proteins, J Mol Biol. 48(3):443-53.
Ludwig Krippahl, 2007 43
Alinhar Sequências: Needleman-Wunsch
De duas sequências:• ABBCD e ABCED
Obter o alinhamento:ABBC-D| || |A-BCED
Ludwig Krippahl, 2007 44
Alinhar Sequências: Needleman-Wunsch
Duas sequências:• Exemplo: ABBCD e ABCED
Construir uma matriz com tantas linhas quanto o comprimento da primeira e colunas quanto o comprimento da segunda (todas as combinações)
Ludwig Krippahl, 2007 45
Alinhar Sequências: Needleman-Wunsch
Matriz
A B C E D A 0 0 0 0 0 B 0 0 0 0 0 B 0 0 0 0 0 C 0 0 0 0 0 D 0 0 0 0 0
Ludwig Krippahl, 2007 46
Alinhar Sequências: Needleman-Wunsch
Em cada célula contamos 1 se os elementos da sequência forem iguais.
E somamos o máximo obtido por alinhar os elementos anteriores.
Regra: Cada célula é o máximo da matriz acima e à esquerda, +1 se os elementos forem iguais.
Ludwig Krippahl, 2007 47
Alinhar Sequências: Needleman-Wunsch
Máximo da matriz acima e à esquerda, +1 se os elementos forem iguais.
• Alinhar o 1º elemento com todos os outros
A B C E DA 1 0 0 0 0BBCD
Ludwig Krippahl, 2007 48
Alinhar Sequências: Needleman-Wunsch
Máximo da matriz acima e à esquerda, +1 se os elementos forem iguais.
• Alinhar o 2º elemento com todos os outros
A B C E DA 1 0 0 0 0B 0 1 0 0 0BCD
Ludwig Krippahl, 2007 49
Alinhar Sequências: Needleman-Wunsch
Máximo da matriz acima e à esquerda, +1 se os elementos forem iguais.
• Somar em o melhor alinhamento anterior
A B C E DA 1 0 0 0 0B 0 2 1 1 1BCD
Ludwig Krippahl, 2007 50
Alinhar Sequências: Needleman-Wunsch
Máximo da matriz acima e à esquerda, +1 se os elementos forem iguais.
• Somar em o melhor alinhamento anterior
A B C E DA 1 0 0 0 0B 0 2 1 1 1B 0 2 2 2 2C 0 1 3 2 2D 0 1 2 3 4
Ludwig Krippahl, 2007 51
Alinhar Sequências: Needleman-Wunsch
O alinhamento é dado pelo máximo, depois o máximo das sub-matrizes à esquerda e acima.
Ludwig Krippahl, 2007 52
Alinhar Sequências: Needleman-Wunsch
Máximo, depois o máximo das sub-matrizes à esquerda e acima.
D
|
D
A B C E D A 1 0 0 0 0 B 0 2 1 1 1 B 0 2 2 2 2 C 0 1 3 2 2 D 0 1 2 3 4
Ludwig Krippahl, 2007 53
Alinhar Sequências: Needleman-Wunsch
Máximo, depois o máximo das sub-matrizes à esquerda e acima.
C-D
| |
CED
A B C E D A 1 0 0 0 0 B 0 2 1 1 1 B 0 2 2 2 2 C 0 1 3 2 2 D 0 1 2 3 4
Ludwig Krippahl, 2007 54
Alinhar Sequências: Needleman-Wunsch
Máximo, depois o máximo das sub-matrizes à esquerda e acima.
BC-D
|| |
BCED
A B C E D A 1 0 0 0 0 B 0 2 1 1 1 B 0 2 2 2 2 C 0 1 3 2 2 D 0 1 2 3 4
Ludwig Krippahl, 2007 55
Alinhar Sequências: Needleman-Wunsch
Máximo, depois o máximo das sub-matrizes à esquerda e acima.
ABBC-D
| || |
A-BCED
A B C E D A 1 0 0 0 0 B 0 2 1 1 1 B 0 2 2 2 2 C 0 1 3 2 2 D 0 1 2 3 4
Ludwig Krippahl, 2007 56
Alinhar Sequências: Needleman-Wunsch
Precisamos:•Calcular os valores.
•Calcular a linha e coluna do máximo de uma matriz.
•Construir o alinhamento:ABBC-D| || |A-BCED
A B C E D A 1 0 0 0 0 B 0 2 1 1 1 B 0 2 2 2 2 C 0 1 3 2 2 D 0 1 2 3 4
Ludwig Krippahl, 2007 57
Alinhar Sequências: Needleman-Wunsch
Calcular os valores:
function mat=nwcriamatriz(seq1,seq2)
Ludwig Krippahl, 2007 58
Alinhar Sequências: Needleman-Wunschfunction mat=nwcriamatriz(seq1,seq2)l1=length(seq1);l2=length(seq2);mat=zeros(l1,l2);for f=1:l1
for g=1:l2a=(seq1(f)==seq2(g));if (f>1) & (g>1)
m=max(max(mat(f-1,1:g-1))); else
m=0;endif
...
Cria a matriz a zeros, e guarda os
comprimentos das sequências.
Ludwig Krippahl, 2007 59
Alinhar Sequências: Needleman-Wunsch...for f=1:l1
for g=1:l2a=(seq1(f)==seq2(g));if (f>1) & (g>1)
m=max(max(mat(1:f-1,1:g-1))); else
m=0;endif
mat(f,g)=a+m;endfor
endforendfunction
Ciclo para percorrer linhas e colunas
Ludwig Krippahl, 2007 60
Alinhar Sequências: Needleman-Wunsch...for f=1:l1
for g=1:l2a=(seq1(f)==seq2(g));if (f>1) & (g>1)
m=max(max(mat(1:f-1,1:g-1)));else
m=0;endif
mat(f,g)=a+m;endfor
endforendfunction
a é 0 ou 1 conforme os elementos são
diferentes ou iguais.
Ludwig Krippahl, 2007 61
Alinhar Sequências: Needleman-Wunsch...for f=1:l1
for g=1:l2a=(seq1(f)==seq2(g));if (f>1) & (g>1)
m=max(max(mat(1:f-1,1:g-1)));else
m=0;endif
mat(f,g)=a+m;endfor
endforendfunction
Se não estamos nem na linha 1 nem na coluna
1, m fica com o máximo da sub-matriz anterior.
Ludwig Krippahl, 2007 62
Alinhar Sequências: Needleman-Wunsch...for f=1:l1
for g=1:l2a=(seq1(f)==seq2(g));if (f>1) & (g>1)
m=max(max(mat(1:f-1,1:g-1))); else
m=0;endif
mat(f,g)=a+m;endfor
endforendfunction
O valor da célula f,g é o máximo do anterior
mais 1 se iguais
Ludwig Krippahl, 2007 63
Alinhar Sequências: Needleman-Wunsch
Calcular os valores:function mat=nwcriamatriz(seq1,seq2) Linha e coluna do máximo da matriz:
function [l,c]=maxmatriz(t)
Ludwig Krippahl, 2007 64
Alinhar Sequências: Needleman-Wunsch
function [l,c]=maxmatriz(t)l=rows(t);c=columns(t);[ml,il]=max(t(:,columns(t)));[mc,ic]=max(t(rows(t),:));if ml>mc
l=il;else
c=ic;endifendfunction
Começar por assumir que l e c estão na
última linha e coluna
Ludwig Krippahl, 2007 65
Alinhar Sequências: Needleman-Wunsch
function [l,c]=maxmatriz(t)l=rows(t);c=columns(t);[ml,il]=max(t(:,columns(t)));[mc,ic]=max(t(rows(t),:));if ml>mc
l=il;else
c=ic;endifendfunction
Pelo algoritmo, sabemos que o máximo
tem que estar ou na última linha ou na
última coluna
Ludwig Krippahl, 2007 66
Alinhar Sequências: Needleman-Wunsch
function [l,c]=maxmatriz(t)l=rows(t);c=columns(t);[ml,il]=max(t(:,columns(t)));[mc,ic]=max(t(rows(t),:));if ml>mc
l=il;else
c=ic;endifendfunction
ml e mc são os valores máximo, il e ic os
indices da linha e da coluna.
Ver help max.
Ludwig Krippahl, 2007 67
Alinhar Sequências: Needleman-Wunsch
function [l,c]=maxmatriz(t)l=rows(t);c=columns(t);[ml,il]=max(t(:,columns(t)));[mc,ic]=max(t(rows(t),:));if ml>mc
l=il;else
c=ic;endifendfunction
Ajustamos c e l conforme o máximo da
linha é maior que o máximo da coluna
Ludwig Krippahl, 2007 68
Alinhar Sequências: Needleman-Wunsch
Construir alinhamento:• Percorrer a matriz, e criar uma matriz com os
pares que alinham:ABBC-D 1,1| || | 3,2A-BCED 4,3
5,5
Ludwig Krippahl, 2007 69
Alinhar Sequências: Needleman-Wunsch
Construir alinhamento:• Percorrer a matriz, e criar uma matriz com os
pares que alinham:ABBC-D 1,1| || | 3,2A-BCED 4,3
5,5• Construir o texto a partir dessa matriz.
Ludwig Krippahl, 2007 70
Alinhar Sequências: Needleman-Wunsch
Construir o textoABBC-D 1,1| || | 3,2A-BCED 4,3
5,5 Equivale a alinhar o primeiro (A-A),e processar
o resto, subtraindo 1 aos índices do vector:BBC-D 2,1 era 3,2 || | 3,2 era 4,3-BCED 4,4 era 4,4
Ludwig Krippahl, 2007 71
Alinhar Sequências: Needleman-Wunsch
Recursividade: a função chama-se a si mesma.
function mat=alinhaseqs(seq1,seq2,alinhamento);
Alinha o 1º par do vector alinhamento. Se há mais, chama novamente alinhaseq
com o que sobra das sequências e alinhamento, e acrescenta à matriz.
Ludwig Krippahl, 2007 72
Alinhar Sequências: Needleman-Wunsch
function mat=alinhaseqs(seq1,seq2,alinhamento);
p1=alinhamento(1,1);p2=alinhamento(1,2);
s1=seq1(1:p1);s2=seq2(1:p2);
...
Guardamos o primeiro par a alinhar, p1 e p2, e
criamos s1 e s2 com esses caracteres da
sequência
Ludwig Krippahl, 2007 73
Alinhar Sequências: Needleman-Wunsch...sm="";while length(s1)!=length(s2)
if length(s1)<length(s2)s1=["-",s1]
elses2=["-",s2]
endifsm=[sm," "];
endwhilesm=[sm,"|"];mat=[s1;sm;s2];...
O sm começa vazio (é a do meio), e enquanto
os comprimentos de s1 e s2 diferirem
acrescentamos “-” à mais pequena e “ “ a
sm
Ludwig Krippahl, 2007 74
Alinhar Sequências: Needleman-Wunsch...sm="";while length(s1)!=length(s2)
if length(s1)<length(s2)s1=["-",s1]
elses2=["-",s2]
endifsm=[sm," "];
endwhilesm=[sm,"|"];mat=[s1;sm;s2];...
Acrescentamos “|” no final de sm,
correspondendo ao alinhamento, e criamos
a matriz com as 3 linhas.
Ludwig Krippahl, 2007 75
Alinhar Sequências: Needleman-Wunsch
...if rows(alinhamento)>1
alinhamento(:,1)=alinhamento(:,1)-p1;alinhamento(:,2)=alinhamento(:,2)-p2;seq1=seq1(p1+1:length(seq1));seq2=seq2(p2+1:length(seq2));alinhamento=alinhamento(2:rows(alinhamento),:);mat=[mat,alinhaseqs(seq1,seq2,alinhamento)];
endifendfunction
Se ainda há mais para alinhar
Ludwig Krippahl, 2007 76
Alinhar Sequências: Needleman-Wunsch
...if rows(alinhamento)>1
alinhamento(:,1)=alinhamento(:,1)-p1;alinhamento(:,2)=alinhamento(:,2)-p2;seq1=seq1(p1+1:length(seq1));seq2=seq2(p2+1:length(seq2));alinhamento=alinhamento(2:rows(alinhamento),:);mat=[mat,alinhaseqs(seq1,seq2,alinhamento)];
endifendfunction
Subtraímos p1 e p2 aos índices
Ludwig Krippahl, 2007 77
Alinhar Sequências: Needleman-Wunsch
...if rows(alinhamento)>1
alinhamento(:,1)=alinhamento(:,1)-p1;alinhamento(:,2)=alinhamento(:,2)-p2;seq1=seq1(p1+1:length(seq1));seq2=seq2(p2+1:length(seq2));alinhamento=alinhamento(2:rows(alinhamento),:);mat=[mat,alinhaseqs(seq1,seq2,alinhamento)];
endifendfunction
Eliminamos os primeiros p1 e p2 elementos das sequências
(já estão alinhados)
Ludwig Krippahl, 2007 78
Alinhar Sequências: Needleman-Wunsch
...if rows(alinhamento)>1
alinhamento(:,1)=alinhamento(:,1)-p1;alinhamento(:,2)=alinhamento(:,2)-p2;seq1=seq1(p1+1:length(seq1));seq2=seq2(p2+1:length(seq2));alinhamento=alinhamento(2:rows(alinhamento),:);mat=[mat,alinhaseqs(seq1,seq2,alinhamento)];
endifendfunction
Eliminamos o primeiros par do alinhamento (já está alinhado)
Ludwig Krippahl, 2007 79
Alinhar Sequências: Needleman-Wunsch
...if rows(alinhamento)>1
alinhamento(:,1)=alinhamento(:,1)-p1;alinhamento(:,2)=alinhamento(:,2)-p2;seq1=seq1(p1+1:length(seq1));seq2=seq2(p2+1:length(seq2));alinhamento=alinhamento(2:rows(alinhamento),:);mat=[mat,alinhaseqs(seq1,seq2,alinhamento)];
endifendfunction
E acrescentamos à matriz o resultado de alinhar o resto de
acordo com o alinhamento ajustado.
Ludwig Krippahl, 2007 80
Alinhar Sequências: Needleman-Wunsch
O que acontece• Recebe
ABBCD, ABCED 1,13,24,35,5
• Cria:A|A
Ludwig Krippahl, 2007 81
Alinhar Sequências: Needleman-Wunsch
Chama novamente comBBCD, BCED 2,1
3,24,4
• Cria:BB (posição 2) |-B (posição 1)
Ludwig Krippahl, 2007 82
Alinhar Sequências: Needleman-Wunsch
Chama novamente comCD, CED 1,1
2,3
• Cria:C|C
Ludwig Krippahl, 2007 83
Alinhar Sequências: Needleman-Wunsch
Chama novamente comD, ED 1,2
• Cria:-D |ED
• Termina, e devolve o que criou.
Ludwig Krippahl, 2007 84
Alinhar Sequências: Needleman-Wunsch
A chamada anterior tinha criado
C e recebe -D| |C ED
Devolve
C-D| |CED
Ludwig Krippahl, 2007 85
Alinhar Sequências: Needleman-Wunsch
A anterior a essa tinha criado
BB e recebe C-D | | |-B CED
Devolve à primeira
BBC-D || |-BCED
Ludwig Krippahl, 2007 86
Alinhar Sequências: Needleman-Wunsch
A primeira tinha criado
A e recebe BBC-D| || |A -BCED
Resultado final:
ABBC-D| || |A-BCED
Ludwig Krippahl, 2007 87
Alinhar Sequências: Needleman-Wunsch
Percorrer a matriz, e criar uma matriz com os pares que alinham:
ABBC-D 1,1| || | 3,2A-BCED 4,3
5,5 Função principalfunction
[amat,score]=nwalinha(seq1,seq2)
Ludwig Krippahl, 2007 88
Alinhar Sequências: Needleman-Wunschfunction [amat,score]=nwalinha(seq1,seq2)amat=nwcriamatriz(seq1,seq2);al=[];[l,c]=maxmatriz(amat);score=amat(l,c);while (l>1) & (c>1)
al=[l,c;al];[l,c]=maxmatriz(amat(1:l-1,1:c-1));
endwhileal=[l,c;al];amat=alinhaseqs(seq1,seq2,al);endfunction
Cria a matriz com as pontuações e o alinhamento
vazio
Ludwig Krippahl, 2007 89
Alinhar Sequências: Needleman-Wunschfunction [amat,score]=nwalinha(seq1,seq2)amat=nwcriamatriz(seq1,seq2);al=[];[l,c]=maxmatriz(amat);score=amat(l,c);while (l>1) & (c>1)
al=[l,c;al];[l,c]=maxmatriz(amat(1:l-1,1:c-1));
endwhileal=[l,c;al];amat=alinhaseqs(seq1,seq2,al);endfunction
Coordenadas do máximo. O valor nessa célula é a
pontuação total do alinhamento (número de
elementos iguais).
Ludwig Krippahl, 2007 90
Alinhar Sequências: Needleman-Wunschfunction [amat,score]=nwalinha(seq1,seq2)amat=nwcriamatriz(seq1,seq2);al=[];[l,c]=maxmatriz(amat);score=amat(l,c);while (l>1) & (c>1)
al=[l,c;al];[l,c]=maxmatriz(amat(1:l-1,1:c-1));
endwhileal=[l,c;al];amat=alinhaseqs(seq1,seq2,al);endfunction
Enquanto não chega à primeira linha ou primeira
coluna, vai acrescentando ao alinhamento (do fim para o
princípio).
Ludwig Krippahl, 2007 91
Alinhar Sequências: Needleman-Wunschfunction [amat,score]=nwalinha(seq1,seq2)amat=nwcriamatriz(seq1,seq2);al=[];[l,c]=maxmatriz(amat);score=amat(l,c);while (l>1) & (c>1)
al=[l,c;al];[l,c]=maxmatriz(amat(1:l-1,1:c-1));
endwhileal=[l,c;al];amat=alinhaseqs(seq1,seq2,al);endfunction
Acrescenta o último valor ao alinhamento (no princípio) e
constrói a matriz.
Ludwig Krippahl, 2007 92
Recapitulando
Estruturas e listas• Perceber como criar. Acrescentar, e aceder
a elementos da lista
Ficheiros: fopen, fclose, fgetl, feof.• Importância do identificador
Recursividade• Função chama-se a si própria e vai juntando
os valores. Atenção: tem que terminar.
Ludwig Krippahl, 2007 93
Dúvidas