programação para as ciências experimentais 2006/7

93
Ludwig Krippahl, 2007 Programação para as Ciências Experimentais 2006/7 Teórica 8

Upload: nika

Post on 20-Jan-2016

20 views

Category:

Documents


0 download

DESCRIPTION

Programação para as Ciências Experimentais 2006/7. Teórica 8. Na aula de hoje. Estruturas. Listas. Ficheiros, leitura e escrita simples. Comparação de sequências. Exemplo de uma função recursiva. Estruturas. Vectores e matrizes guardam valores de um só tipo. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007

Programação para as Ciências Experimentais

2006/7

Teórica 8

Page 2: Programação para as Ciências Experimentais 2006/7

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.

Page 3: Programação para as Ciências Experimentais 2006/7

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

Page 4: Programação para as Ciências Experimentais 2006/7

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}

Page 5: Programação para as Ciências Experimentais 2006/7

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.

Page 6: Programação para as Ciências Experimentais 2006/7

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 }}

Page 7: Programação para as Ciências Experimentais 2006/7

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

Page 8: Programação para as Ciências Experimentais 2006/7

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)

Page 9: Programação para as Ciências Experimentais 2006/7

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 })

Page 10: Programação para as Ciências Experimentais 2006/7

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)

Page 11: Programação para as Ciências Experimentais 2006/7

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.

Page 12: Programação para as Ciências Experimentais 2006/7

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)

Page 13: Programação para as Ciências Experimentais 2006/7

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

Page 14: Programação para as Ciências Experimentais 2006/7

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).

Page 15: Programação para as Ciências Experimentais 2006/7

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.

Page 16: Programação para as Ciências Experimentais 2006/7

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}

Page 17: Programação para as Ciências Experimentais 2006/7

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.

Page 18: Programação para as Ciências Experimentais 2006/7

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

Page 19: Programação para as Ciências Experimentais 2006/7

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)

Page 20: Programação para as Ciências Experimentais 2006/7

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.

Page 21: Programação para as Ciências Experimentais 2006/7

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.

Page 22: Programação para as Ciências Experimentais 2006/7

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....

Page 23: Programação para as Ciências Experimentais 2006/7

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

Page 24: Programação para as Ciências Experimentais 2006/7

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

Page 25: Programação para as Ciências Experimentais 2006/7

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.

Page 26: Programação para as Ciências Experimentais 2006/7

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

Page 27: Programação para as Ciências Experimentais 2006/7

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

Page 28: Programação para as Ciências Experimentais 2006/7

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

Page 29: Programação para as Ciências Experimentais 2006/7

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.

Page 30: Programação para as Ciências Experimentais 2006/7

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)

Page 31: Programação para as Ciências Experimentais 2006/7

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

Page 32: Programação para as Ciências Experimentais 2006/7

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.

Page 33: Programação para as Ciências Experimentais 2006/7

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

Page 34: Programação para as Ciências Experimentais 2006/7

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

Page 35: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007 35

Exemplo: centros Fe S

Page 36: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007 36

Desulforedoxin, 1DXG

Dímero

Page 37: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007 37

Page 38: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007 38

Page 39: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007 39

Page 40: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007 40

Exemplo: centros Fe S

>...Desulforedoxin

ANEGDVYKCELCGQVVKVLEEGGGTLVCCGEDMVKQ

Padrão do centro: ...C-[até 4]-C- ... -C-[até 4]-C-...

Page 41: Programação para as Ciências Experimentais 2006/7

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-...

Page 42: Programação para as Ciências Experimentais 2006/7

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.

Page 43: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007 43

Alinhar Sequências: Needleman-Wunsch

De duas sequências:• ABBCD e ABCED

Obter o alinhamento:ABBC-D| || |A-BCED

Page 44: Programação para as Ciências Experimentais 2006/7

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)

Page 45: Programação para as Ciências Experimentais 2006/7

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

Page 46: Programação para as Ciências Experimentais 2006/7

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.

Page 47: Programação para as Ciências Experimentais 2006/7

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

Page 48: Programação para as Ciências Experimentais 2006/7

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

Page 49: Programação para as Ciências Experimentais 2006/7

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

Page 50: Programação para as Ciências Experimentais 2006/7

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

Page 51: Programação para as Ciências Experimentais 2006/7

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.

Page 52: Programação para as Ciências Experimentais 2006/7

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

Page 53: Programação para as Ciências Experimentais 2006/7

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

Page 54: Programação para as Ciências Experimentais 2006/7

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

Page 55: Programação para as Ciências Experimentais 2006/7

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

Page 56: Programação para as Ciências Experimentais 2006/7

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

Page 57: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007 57

Alinhar Sequências: Needleman-Wunsch

Calcular os valores:

function mat=nwcriamatriz(seq1,seq2)

Page 58: Programação para as Ciências Experimentais 2006/7

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.

Page 59: Programação para as Ciências Experimentais 2006/7

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

Page 60: Programação para as Ciências Experimentais 2006/7

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.

Page 61: Programação para as Ciências Experimentais 2006/7

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.

Page 62: Programação para as Ciências Experimentais 2006/7

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

Page 63: Programação para as Ciências Experimentais 2006/7

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)

Page 64: Programação para as Ciências Experimentais 2006/7

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

Page 65: Programação para as Ciências Experimentais 2006/7

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

Page 66: Programação para as Ciências Experimentais 2006/7

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.

Page 67: Programação para as Ciências Experimentais 2006/7

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

Page 68: Programação para as Ciências Experimentais 2006/7

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

Page 69: Programação para as Ciências Experimentais 2006/7

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.

Page 70: Programação para as Ciências Experimentais 2006/7

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

Page 71: Programação para as Ciências Experimentais 2006/7

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.

Page 72: Programação para as Ciências Experimentais 2006/7

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

Page 73: Programação para as Ciências Experimentais 2006/7

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

Page 74: Programação para as Ciências Experimentais 2006/7

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.

Page 75: Programação para as Ciências Experimentais 2006/7

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

Page 76: Programação para as Ciências Experimentais 2006/7

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

Page 77: Programação para as Ciências Experimentais 2006/7

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)

Page 78: Programação para as Ciências Experimentais 2006/7

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)

Page 79: Programação para as Ciências Experimentais 2006/7

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.

Page 80: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007 80

Alinhar Sequências: Needleman-Wunsch

O que acontece• Recebe

ABBCD, ABCED 1,13,24,35,5

• Cria:A|A

Page 81: Programação para as Ciências Experimentais 2006/7

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)

Page 82: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007 82

Alinhar Sequências: Needleman-Wunsch

Chama novamente comCD, CED 1,1

2,3

• Cria:C|C

Page 83: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007 83

Alinhar Sequências: Needleman-Wunsch

Chama novamente comD, ED 1,2

• Cria:-D |ED

• Termina, e devolve o que criou.

Page 84: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007 84

Alinhar Sequências: Needleman-Wunsch

A chamada anterior tinha criado

C e recebe -D| |C ED

Devolve

C-D| |CED

Page 85: Programação para as Ciências Experimentais 2006/7

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

Page 86: Programação para as Ciências Experimentais 2006/7

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

Page 87: Programação para as Ciências Experimentais 2006/7

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)

Page 88: Programação para as Ciências Experimentais 2006/7

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

Page 89: Programação para as Ciências Experimentais 2006/7

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).

Page 90: Programação para as Ciências Experimentais 2006/7

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).

Page 91: Programação para as Ciências Experimentais 2006/7

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.

Page 92: Programação para as Ciências Experimentais 2006/7

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.

Page 93: Programação para as Ciências Experimentais 2006/7

Ludwig Krippahl, 2007 93

Dúvidas