Programação para as Ciências Experimentais 2006/7 Teórica 8 Ludwig Krippahl, 2007 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 2 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 3 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> prato prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } Ludwig Krippahl, 2007 4 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 5 Estruturas Estrutura de estrutura... octave:13> cliente.nome="Vitor Meireles"; octave:14> cliente.prato=prato cliente = { nome = Vitor Meireles prato = { nome = filetes pedidos = 10 2 3 5 9 5 9 preco = 12.500 } } Ludwig Krippahl, 2007 6 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 7 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 8 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 9 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 10 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 11 Listas append(x,y) octave:21> l=list l = () octave:22> l=append(l,1) l= ( [1] = 1 ) octave:23> l=append(l,"abc") l= ( [1] = 1 [2] = abc ) Ludwig Krippahl, 2007 12 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 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. 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 14 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 15 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 16 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 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. • No final fechamos o ficheiro: octave:8> fclose(teste) ans = 0 Ludwig Krippahl, 2007 18 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 19 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 20 Ficheiros Sabemos que o ficheiro chegou ao fim com a função feof: • feof( identificador ) • Ludwig Krippahl, 2007 Devolve true se o ficheiro estiver no fim. 21 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 22 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 23 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 24 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 25 Exemplo: ler sequências de proteínas. function l=lefasta(nome) id=fopen(nome,”r”); Abre o ficheiro e guarda o identificador l=list; (Ciclo de leitura do ficheiro) fclose(id); endfunction Ludwig Krippahl, 2007 26 Exemplo: ler sequências de proteínas. function l=lefasta(nome) id=fopen(nome); l=list; Cria uma lista vazia (Ciclo de leitura do ficheiro) fclose(id); endfunction 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 Ludwig Krippahl, 2007 Depois de ler o ficheiro, fecha e termina a função 28 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); endif r.id=s; r.seq=''; else r.seq=[r.seq,s]; endif endwhile if !strcmp(r.seq,'') l=append(l,r); endif Ludwig Krippahl, 2007 Ciclo enquanto o ficheiro não chegou ao fim. 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); endif r.id=s; r.seq=''; else r.seq=[r.seq,s]; endif endwhile if !strcmp(r.seq,'') l=append(l,r); endif Ludwig Krippahl, 2007 Lê uma linha e compara o primeiro caracter com “>” (quer dizer que encontrou uma proteína nova) 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); endif r.id=s; r.seq=''; else r.seq=[r.seq,s]; endif endwhile if !strcmp(r.seq,'') l=append(l,r); endif Ludwig Krippahl, 2007 Se há uma sequência guardada, então acrescenta r à lista l É por isto que a sequência em r começa vazia 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); endif r.id=s; r.seq=''; else r.seq=[r.seq,s]; endif endwhile if !strcmp(r.seq,'') l=append(l,r); endif Ludwig Krippahl, 2007 Quando encontra nova proteína guarda o identificador da proteína e limpa a sequência. 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); endif r.id=s; r.seq=''; else r.seq=[r.seq,s]; endif endwhile if !strcmp(r.seq,'') l=append(l,r); endif Ludwig Krippahl, 2007 Se não é uma proteína nova então é outra linha da sequência, para juntar à sequência lida até agora 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); endif r.id=s; r.seq=''; else r.seq=[r.seq,s]; endif endwhile if !strcmp(r.seq,'') l=append(l,r); endif Ludwig Krippahl, 2007 No final do ciclo acrescentar a última proteína lida, se houver 34 Exemplo: centros Fe S Ludwig Krippahl, 2007 35 Desulforedoxin, 1DXG Dímero Ludwig Krippahl, 2007 36 Ludwig Krippahl, 2007 37 Ludwig Krippahl, 2007 38 Ludwig Krippahl, 2007 39 Exemplo: centros Fe S >...Desulforedoxin ANEGDVYKCELCGQVVKVLEEGGGTLV CCGEDMVKQ Padrão do centro: ...C-[até 4]-C- ... -C-[até 4]-C-... Ludwig Krippahl, 2007 40 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 41 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 42 Alinhar Sequências: Needleman-Wunsch De duas sequências: • ABBCD e ABCED Obter o alinhamento: ABBC-D | || | A-BCED Ludwig Krippahl, 2007 43 Alinhar Sequências: Needleman-Wunsch Duas sequências: Construir uma matriz com tantas linhas quanto o comprimento da primeira e colunas quanto o comprimento da segunda (todas as combinações) • Exemplo: ABBCD e ABCED Ludwig Krippahl, 2007 44 Alinhar Sequências: Needleman-Wunsch Matriz A A B B C D Ludwig Krippahl, 2007 B 0 0 0 0 0 C 0 0 0 0 0 E 0 0 0 0 0 D 0 0 0 0 0 0 0 0 0 0 45 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 46 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 A B B C D Ludwig Krippahl, 2007 B 1 C 0 E 0 D 0 0 47 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 A B B C D Ludwig Krippahl, 2007 B 1 0 C 0 1 E 0 0 D 0 0 0 0 48 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 A B B C D Ludwig Krippahl, 2007 B 1 0 C 0 2 E 0 1 D 0 1 0 1 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 A B B C D Ludwig Krippahl, 2007 B 1 0 0 0 0 C 0 2 2 1 1 E 0 1 2 3 2 D 0 1 2 2 3 0 1 2 2 4 50 Alinhar Sequências: Needleman-Wunsch O alinhamento é dado pelo máximo, depois o máximo das sub-matrizes à esquerda e acima. Ludwig Krippahl, 2007 51 Alinhar Sequências: Needleman-Wunsch Máximo, depois o máximo das submatrizes à esquerda e acima. A A B B C D Ludwig Krippahl, 2007 B 1 0 0 0 0 C 0 2 2 1 1 E 0 1 2 3 2 D | D D 0 1 2 2 3 0 1 2 2 4 52 Alinhar Sequências: Needleman-Wunsch Máximo, depois o máximo das submatrizes à esquerda e acima. A A B B C D Ludwig Krippahl, 2007 B 1 0 0 0 0 C 0 2 2 1 1 E 0 1 2 3 2 D 0 1 2 2 3 0 1 2 2 4 C-D | | CED 53 Alinhar Sequências: Needleman-Wunsch Máximo, depois o máximo das submatrizes à esquerda e acima. BC-D A B C E D || | A 1 0 0 0 0 BCED B B C D Ludwig Krippahl, 2007 0 0 0 0 2 2 1 1 1 2 3 2 1 2 2 3 1 2 2 4 54 Alinhar Sequências: Needleman-Wunsch Máximo, depois o máximo das submatrizes à esquerda e acima. ABBC-D A B C E D | || | A 1 0 0 0 0 A-BCED B B C D Ludwig Krippahl, 2007 0 0 0 0 2 2 1 1 1 2 3 2 1 2 2 3 1 2 2 4 55 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 Ludwig Krippahl, 2007 A B B C D A B 1 0 0 0 0 C 0 2 2 1 1 E 0 1 2 3 2 D 0 1 2 2 3 56 0 1 2 2 4 Alinhar Sequências: Needleman-Wunsch Calcular os valores: function mat=nwcriamatriz(seq1,seq2) Ludwig Krippahl, 2007 57 Alinhar Sequências: Needleman-Wunsch function mat=nwcriamatriz(seq1,seq2) l1=length(seq1); Cria a matriz a zeros, e l2=length(seq2); guarda os mat=zeros(l1,l2); comprimentos das for f=1:l1 for g=1:l2 sequências. a=(seq1(f)==seq2(g)); if (f>1) & (g>1) m=max(max(mat(f-1,1:g-1))); else m=0; endif ... Ludwig Krippahl, 2007 58 Alinhar Sequências: Needleman-Wunsch ... for f=1:l1 Ciclo para percorrer for g=1:l2 linhas e colunas a=(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 endfor endfunction Ludwig Krippahl, 2007 59 Alinhar Sequências: Needleman-Wunsch ... for f=1:l1 a é 0 ou 1 conforme os for g=1:l2 elementos são a=(seq1(f)==seq2(g)); diferentes ou iguais. 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 endfor endfunction Ludwig Krippahl, 2007 60 Alinhar Sequências: Needleman-Wunsch ... for f=1:l1 for g=1:l2 a=(seq1(f)==seq2(g)); if (f>1) & (g>1) m=max(max(mat(1:f-1,1:g-1))); else m=0; endif Se não estamos nem na mat(f,g)=a+m; linha 1 nem na coluna endfor 1, m fica com o máximo endfor endfunction da sub-matriz anterior. Ludwig Krippahl, 2007 61 Alinhar Sequências: Needleman-Wunsch ... for f=1:l1 for g=1:l2 a=(seq1(f)==seq2(g)); if (f>1) & (g>1) m=max(max(mat(1:f-1,1:g-1))); else m=0; endif O valor da célula f,g é o mat(f,g)=a+m; máximo do anterior endfor mais 1 se iguais endfor endfunction Ludwig Krippahl, 2007 62 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 63 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; endif endfunction Ludwig Krippahl, 2007 Começar por assumir que l e c estão na última linha e coluna 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; endif endfunction Ludwig Krippahl, 2007 Pelo algoritmo, sabemos que o máximo tem que estar ou na última linha ou na última coluna 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; endif endfunction Ludwig Krippahl, 2007 ml e mc são os valores máximo, il e ic os indices da linha e da coluna. Ver help max. 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; endif endfunction Ludwig Krippahl, 2007 Ajustamos c e l conforme o máximo da linha é maior que o máximo da coluna 67 Alinhar Sequências: Needleman-Wunsch Construir alinhamento: • Percorrer a matriz, e criar uma matriz com os pares que alinham: ABBC-D | || | A-BCED Ludwig Krippahl, 2007 1,1 3,2 4,3 5,5 68 Alinhar Sequências: Needleman-Wunsch Construir alinhamento: • Percorrer a matriz, e criar uma matriz com os pares que alinham: ABBC-D | || | A-BCED 1,1 3,2 4,3 5,5 • Construir o texto a partir dessa matriz. Ludwig Krippahl, 2007 69 Alinhar Sequências: Needleman-Wunsch Construir o texto ABBC-D | || | A-BCED 1,1 3,2 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 70 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 71 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 72 Alinhar Sequências: Needleman-Wunsch ... sm=""; while length(s1)!=length(s2) if length(s1)<length(s2) s1=["-",s1] else s2=["-",s2] endif sm=[sm," "]; endwhile sm=[sm,"|"]; mat=[s1;sm;s2]; ... Ludwig Krippahl, 2007 O sm começa vazio (é a do meio), e enquanto os comprimentos de s1 e s2 diferirem acrescentamos “-” à mais pequena e “ “ a sm 73 Alinhar Sequências: Needleman-Wunsch ... sm=""; while length(s1)!=length(s2) if length(s1)<length(s2) s1=["-",s1] else s2=["-",s2] endif sm=[sm," "]; endwhile sm=[sm,"|"]; mat=[s1;sm;s2]; ... Ludwig Krippahl, 2007 Acrescentamos “|” no final de sm, correspondendo ao alinhamento, e criamos a matriz com as 3 linhas. 74 Alinhar Sequências: Needleman-Wunsch ... if rows(alinhamento)>1 alinhamento(:,1)=alinhamento(:,1)-p1; Se ainda há mais para alinhar 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)]; endif endfunction Ludwig Krippahl, 2007 75 Alinhar Sequências: Needleman-Wunsch ... Subtraímos p1 e p2 aos índices 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)]; endif endfunction Ludwig Krippahl, 2007 76 Alinhar Sequências: Needleman-Wunsch ... Eliminamos os primeiros p1 e if rows(alinhamento)>1 p2 elementos das sequências alinhamento(:,1)=alinhamento(:,1)-p1; (já estão alinhados) 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)]; endif endfunction Ludwig Krippahl, 2007 77 Alinhar Sequências: Needleman-Wunsch ... if rows(alinhamento)>1 alinhamento(:,1)=alinhamento(:,1)-p1; Eliminamos o primeiros par do alinhamento(:,2)=alinhamento(:,2)-p2; alinhamento (já está alinhado) seq1=seq1(p1+1:length(seq1)); seq2=seq2(p2+1:length(seq2)); alinhamento=alinhamento(2:rows(alinhamento),:); mat=[mat,alinhaseqs(seq1,seq2,alinhamento)]; endif endfunction Ludwig Krippahl, 2007 78 Alinhar Sequências: Needleman-Wunsch ... if rows(alinhamento)>1 alinhamento(:,1)=alinhamento(:,1)-p1; E acrescentamos à matriz o alinhamento(:,2)=alinhamento(:,2)-p2; resultado de alinhar o resto de seq1=seq1(p1+1:length(seq1)); acordo com o alinhamento seq2=seq2(p2+1:length(seq2)); ajustado. alinhamento=alinhamento(2:rows(alinhamento),:); mat=[mat,alinhaseqs(seq1,seq2,alinhamento)]; endif endfunction Ludwig Krippahl, 2007 79 Alinhar Sequências: Needleman-Wunsch O que acontece • Recebe • Cria: ABBCD, ABCED 1,1 3,2 4,3 5,5 A | A Ludwig Krippahl, 2007 80 Alinhar Sequências: Needleman-Wunsch Chama novamente com BBCD, BCED • Cria: BB | -B Ludwig Krippahl, 2007 2,1 3,2 4,4 (posição 2) (posição 1) 81 Alinhar Sequências: Needleman-Wunsch Chama novamente com CD, CED 1,1 2,3 • Cria: C | C Ludwig Krippahl, 2007 82 Alinhar Sequências: Needleman-Wunsch Chama novamente com D, ED 1,2 • Cria: -D | ED • Termina, e devolve o que criou. Ludwig Krippahl, 2007 83 Alinhar Sequências: Needleman-Wunsch A chamada anterior tinha criado C e recebe -D | | C ED Devolve C-D | | CED Ludwig Krippahl, 2007 84 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 85 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 86 Alinhar Sequências: Needleman-Wunsch Percorrer a matriz, e criar uma matriz com os pares que alinham: ABBC-D 1,1 | || | 3,2 A-BCED 4,3 5,5 Função principal function [amat,score]=nwalinha(seq1,seq2) Ludwig Krippahl, 2007 87 Alinhar Sequências: Needleman-Wunsch function [amat,score]=nwalinha(seq1,seq2) amat=nwcriamatriz(seq1,seq2); al=[]; Cria a matriz com as [l,c]=maxmatriz(amat); score=amat(l,c); pontuações e o alinhamento while (l>1) & (c>1) vazio al=[l,c;al]; [l,c]=maxmatriz(amat(1:l-1,1:c-1)); endwhile al=[l,c;al]; amat=alinhaseqs(seq1,seq2,al); endfunction Ludwig Krippahl, 2007 88 Alinhar Sequências: Needleman-Wunsch function [amat,score]=nwalinha(seq1,seq2) amat=nwcriamatriz(seq1,seq2); al=[]; Coordenadas do máximo. O [l,c]=maxmatriz(amat); score=amat(l,c); valor nessa célula é a while (l>1) & (c>1) pontuação total do al=[l,c;al]; alinhamento (número de [l,c]=maxmatriz(amat(1:l-1,1:c-1)); elementos iguais). endwhile al=[l,c;al]; amat=alinhaseqs(seq1,seq2,al); endfunction Ludwig Krippahl, 2007 89 Alinhar Sequências: Needleman-Wunsch function [amat,score]=nwalinha(seq1,seq2) amat=nwcriamatriz(seq1,seq2); Enquanto não chega à al=[]; primeira linha ou primeira [l,c]=maxmatriz(amat); coluna, vai acrescentando ao score=amat(l,c); while (l>1) & (c>1) alinhamento (do fim para o al=[l,c;al]; princípio). [l,c]=maxmatriz(amat(1:l-1,1:c-1)); endwhile al=[l,c;al]; amat=alinhaseqs(seq1,seq2,al); endfunction Ludwig Krippahl, 2007 90 Alinhar Sequências: Needleman-Wunsch function [amat,score]=nwalinha(seq1,seq2) amat=nwcriamatriz(seq1,seq2); al=[]; Acrescenta o último valor ao [l,c]=maxmatriz(amat); score=amat(l,c); alinhamento (no princípio) e while (l>1) & (c>1) constrói a matriz. al=[l,c;al]; [l,c]=maxmatriz(amat(1:l-1,1:c-1)); endwhile al=[l,c;al]; amat=alinhaseqs(seq1,seq2,al); endfunction Ludwig Krippahl, 2007 91 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 92 Dúvidas Ludwig Krippahl, 2007 93