950 likes | 1.07k Views
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.
E N D
Programação para as Ciências Experimentais2006/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.
Estruturas • Vectores e matrizes guardam valores de um só tipo. • Estruturas podem guardar valores de vários tipos. • Sintaxe: • variável.campo
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 }
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.
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 } }
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
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)
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 } )
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)
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.
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 )
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
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).
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.
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 }
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.
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
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)
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.
Ficheiros • Sabemos que o ficheiro chegou ao fim com a função feof: • feof( identificador ) • Devolve true se o ficheiro estiver no fim.
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....
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
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
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.
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
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
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
Exemplo: ler sequências de proteínas. Ciclo enquanto o ficheiro não chegou ao fim. r.seq=''; while!feof(id) s=fgetl(id); ifstrcmp(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
Exemplo: ler sequências de proteínas. Lê uma linha e compara o primeiro caracter com “>” (quer dizer que encontrou uma proteína nova) r.seq=''; while!feof(id) s=fgetl(id); ifstrcmp(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
Exemplo: ler sequências de proteínas. Se há uma sequência guardada, então acrescenta r à lista l É por isto que a sequência em r começa vazia r.seq=''; while!feof(id) s=fgetl(id); ifstrcmp(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
Exemplo: ler sequências de proteínas. r.seq=''; while!feof(id) s=fgetl(id); ifstrcmp(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 Quando encontra nova proteína guarda o identificador da proteína e limpa a sequência.
Exemplo: ler sequências de proteínas. r.seq=''; while!feof(id) s=fgetl(id); ifstrcmp(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 Se não é uma proteína nova então é outra linha da sequência, para juntar à sequência lida até agora
Exemplo: ler sequências de proteínas. r.seq=''; while!feof(id) s=fgetl(id); ifstrcmp(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 No final do ciclo acrescentar a última proteína lida, se houver
Desulforedoxin, 1DXG Dímero
Exemplo: centros Fe S • >...Desulforedoxin ANEGDVYKCELCGQVVKVLEEGGGTLVCCGEDMVKQ • Padrão do centro: • ...C-[até 4]-C- ... -C-[até 4]-C-...
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-...
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.
Alinhar Sequências:Needleman-Wunsch • De duas sequências: • ABBCD e ABCED • Obter o alinhamento: ABBC-D | || | A-BCED
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)
Alinhar Sequências:Needleman-Wunsch • Matriz
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.
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
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
Alinhar Sequências:Needleman-Wunsch • Máximo da matriz acima e à esquerda, +1 se os elementos forem iguais. • Somar em o melhor alinhamento anterior
Alinhar Sequências:Needleman-Wunsch • Máximo da matriz acima e à esquerda, +1 se os elementos forem iguais. • Somar em o melhor alinhamento anterior