Informática para Ciências e Engenharias (B) 2015/16 Teórica 9
Na aua de hoje Estruturas e vectores de estruturas. Cácuo da massa moecuar Cácuo da fracção de um resíduo em sequências de proteínas
Estruturas Estruturas
Estruturas Vectores e matrizes guardam vaores de um só tipo. Uma estrutura contém campos que podem ser de tipos diferentes incuindo estrutura Sintaxe: variave.campo
Estruturas Exempo: octave:3> prato.nome="fietes"; octave:4> prato.preco=12.5; octave:5> prato.pedidos=[10,2,3,5,9,5,9]; octave:6> prato prato = scaar structure containing the fieds: nome = fietes preco = 12.500 pedidos = 10 2 3 5 9 5 9
Estruturas prato = nome = fietes preco = 12.500 pedidos = 10 2 3 5 9 5 9 Estrutura guardada na variáve prato
Estruturas prato = nome = fietes preco = 12.500 pedidos = 10 2 3 5 9 5 9 Vaores dos campos
Estruturas Recapituando variave.campo1 = va1 variave.campo2 = va2 variave.campo3 = va3 etc... Cada campo pode ter um vaor de tipo diferente, incuindo ser outra estrutura.
Estruturas Estruturas de estruturas octave:7> ciente.nome="vitor Meirees"; octave:8> ciente.prato=prato ciente = scaar structure containing the fieds: nome = Vitor Meirees prato = scaar structure containing the fieds: nome = fietes preco = 12.500 pedidos = 10 2 3 5 9 5 9
Estruturas Não podemos criar vectores de estruturas se os campos tiverem nomes diferentes octave:20> x.campo1=[1,2,3] x = campo1 = 1 2 3 octave:21> y.campo2=[1,2,3] y = campo2 = 1 2 3 octave:22> vec2=[x,y] error: orderfieds: structs must have same fieds up to order error: cat: fied names mismatch in concatenating structs
Estruturas Em gera, um vector de estruturas funciona como quaquer vector octave:31> for f=1:10 octave:33> vec2(4:end).quant > vec2(f).nome=['x',int2str(f)]; ans = 8 > vec2(f).quant=f*2; ans = 10 > end ans = 12 ans = 14 ans = 16 ans = 18 octave:32> vec2(1) ans = 20 ans = nome = x1 quant = 2 octave:34> ength(vec2) ans = 10
Estruturas Um vector de estruturas funciona como quaquer vector No entanto o probema de pré-dimensionar não é tão sério Quanto poderia parecer assumindo que a dimensão dos eementos pode ser variáve O vector em si Não guarda os vaores dos campos Guarda apenas os endereços de memória onde estão guardados os vaores dos campos,
Estruturas Exempo: vec2.nome for f=1:10 vec2(f).nome=['x',int2str(f)]; vec2(f).quant=f*2; end 102 130 160 198 102... 130... 160... 198 'x1' 'x2' 'x3' 'x4'
Estruturas Ainda assim, podemos pré-dimensionar atribuindo vaores ao útimo eemento do vector: octave:35> vecp(100).campo1=[] vecp = 1x100 struct array containing the fieds: campo1 octave:36> vecp(100).campo2=[] vecp = 1x100 struct array containing the fieds: campo1 campo2
Massa Moecuar Exempo 1: Massa Moecuar
Massa Moecuar Objectivo: programa que recebe uma fórmua química; e devove a massa moecuar octave:37> massamo('chc3') ans = 119.38
Massa Moecuar Dados: Ficheiro com as massas atómicas: massas.txt --------------------- Ac;227 Ag;107.8682 A;26.9815386 Am;243 Ar;39.948 As;74.9216 At;210 Au;196.966569...
Massa Moecuar Probemas principais: Ler o ficheiro com as massas e guardar os vaores em memória (vector de estruturas) Interpretar a fórmua para determinar o número de átomos de cada eemento e.g. C3 são 3 átomos de C (vector de estruturas) Encontrar a massa dado o símboo químico Cacuar o tota
Massa Moecuar Ler o ficheiro com as massas e organizar esses dados num vector de estruturas com símboo químico e massa atómica: function eementos=emassas(nomefich)
Massa Moecuar Decompor a fórmua química num vector de estruturas com o símboo químico e o número de átomos de cada eemento: function eementos=emassas(nomefich) function atoms=decompor(formua)
Massa Moecuar Encontrar a massa dado o símboo químico e o vector de estruturas com as massas todas: function eementos=emassas(nomefich) function atoms=decompor(formua) function massa=massae(simbq, eementos)
Massa Moecuar Juntar tudo na função que resove o nosso probema: ê as massas decompõe a fórmua soma as massas atómicas mutipicadas peo número de átomos de cada eemento function m=massamo(formua) function eementos=emassas(nomefich) function atoms=decompor(formua) function massa=massae(simbq, eementos)
Massa Moecuar Se ago correr ma devovemos o vector vazio
Massa Moecuar Ler cada inha e encontrar a posição do separador ;
Massa Moecuar Acrescentar uma estrutura ao vector com os dois campos (convertendo a massa em número)
Massa Moecuar Testar octave:39> es=emassas('massas.txt') es = 1x117 struct array containing the fieds: simbq massa octave:40> es(1) ans = simbq = Ac massa = 227 octave:41> es(2) ans = simbq = Ag massa = 107.87
Massa Moecuar Decompor a fórmua química: function atoms = decompor(formua) Identificar a posição do próximo eemento começa por maiúscua Converter o eemento corrente, que acaba antes do próximo, numa estrutura com símboo químico e quantidade.
Massa Moecuar Decompor a fórmua química: function atoms = decompor(formua) Exempo Corrente Próximo CaC2 atom = simbq = Ca numero = 1
Massa Moecuar Decompor a fórmua química: function atoms = decompor(formua) Exempo CaC2 Corrente atom = simbq = C numero = 2 Próximo
Massa Moecuar Decompor a fórmua química: function atoms = decompor(formua) Requer encontrar a posição da próxima maiúscua (ou ength+1 se não há mais) começando da posição dada, function ix=proxima(formua,ix) e converter em estrutura function atomo=converte(parteformua)
Massa Moecuar Encontrar a posição da próxima maiúscua (ou ength+1 se não há mais) começando da posição dada
Massa Moecuar Testar octave:7> proxima('cac2',1) ans = 1 octave:8> proxima('cac2',2) ans = 3 octave:9> proxima('cac2',4) ans = 6 octave:10>
Massa Moecuar Peo menos uma etra sem número.
Massa Moecuar A seguir procuramos etra(s) minúscua(s) (ex Ununpentium Uup) ou números
Massa Moecuar Finamente, se não há nada no número, então a quantidade é um.
Massa Moecuar Testar octave:11> atom=converte('ca') atom = simbq = Ca numero = 1 octave:12> atom=converte('c2') atom = simbq = C numero = 2
Massa Moecuar Começamos com o vector vazio e procuramos a maiúscua a partir do início da fórmua para o caso de haver vaores anómaos.
Massa Moecuar Enquanto não sairmos do fina da fórmua, vamos procurar o eemento seguinte (a posição da próxima maiúscua) e converter o fragmento desde o carácter corrente ao carácter anterior ao seguinte.
Massa Moecuar Avançamos na fórmua iguaando o corrente à posição seguinte.
Massa Moecuar Testar octave:14> atoms=decompor('cac2') atoms = 1x2 struct array containing the fieds: simbq numero octave:15> atoms(1) ans = simbq = Ca numero = 1
Massa Moecuar Para juntar tudo só fata massae function m=massamo(formua) function eementos=emassas(nomefich) function atoms=decompor(formua) function massa=massae(simbq, eementos)
Massa Moecuar
Massa Moecuar Percorremos o vector de estruturas com as massas até encontrar um com eemento com o mesmo símboo químico.
Massa Moecuar Percorrer do fim para o princípio tem a (pequena) vantagem de não estar sempre a perguntar o comprimento do vector. Mas também se podia fazer o cico a começar em 1 e ix<=ength(...)
Massa Moecuar Se encontra devove a massa. Caso contrário devove zero.
Massa Moecuar Testar octave:17> eementos=emassas('massas.txt'); octave:18> massae('c',eementos) ans = 35.453 octave:19> massae('zn',eementos) ans = 65.409 octave:20> Importante: seria má ideia que a função massae esse o ficheiro porque isso obrigaria a er o ficheiro várias vezes. É mehor er só uma vez e fornecer os vaores como argumento
Massa Moecuar Podemos agora estruturar a função massamo usando as funções mais simpes já desenvovidas e testadas. function m=massamo(formua) function eementos=emassas(nomefich) function atoms=decompor(formua) function massa=massae(simbq, eementos)
Massa Moecuar Lê as massas atómicas para o vector de estruturas com simbq e massa para cada eemento
Massa Moecuar Decompõe a fórmua num vector de estruturas com simbq e número
Massa Moecuar Cacua a massa tota somando o produto da massa de cada átomo peo seu número em cada parte da fórmua.
Massa Moecuar Testar octave:20> massamo('ch3cooh') ans = 60.052 octave:21> massamo('caco3') ans = 100.09 octave:22> massamo('c7h5n3o6') ans = 227.13 octave:23>
FASTA Exempo 2: Sequência de Proteínas
FASTA O formato FASTA é muito usado para guardar sequências A inha que começa com > é o nome O resto é a sequência >NP_061820.1_Homo_sapiens MGDVEKGKKIFIMKCSQCHTVEKGGKHKTGPNLHGLFGRKTGQAPGYS YTAANKNKGIIWGEDTLMEYLENPKKYIPGTKMIFVGIKKKEERADLI AYLKKATNE >XP_002803395.1_Macaca_muatta MGDVEKGKKIFIMKCSQCHTVEKGGKHKTGPNLHGLFGRKTGQAPGYS YTAANKNKGITWGEDTLMEYLENPKKYIPGTKMIFVGIKKKEERADLI AYLKKATNE
FASTA Pretendemos Ler o ficheiro e guardar os dados Nome e sequência para cada sequência Cacuar a fracção de um resíduo numa sequência Juntar tudo para gerar o reatório function sequencias=efasta(ficheiro)
FASTA Agoritmo Lemos o ficheiro, uma inha de cada vez Mantemos uma estrutura com nome e sequência Se a inha começa por > é uma nova sequência Se emos uma sequência antes, acrescentar ao resutado Atribuir o nome, impar a sequência No fim, não esquecer de acrescentar a útima function sequencias=efasta(ficheiro)
Massa Moecuar Iniciaizar variáveis e abrir o ficheiro
Massa Moecuar Ler o ficheiro, inha a inha, até ao fim
Massa Moecuar Se é uma nova sequência
Massa Moecuar Acrescentar ao resutado a anterior, se houver aguma
Massa Moecuar Guardar o nome na corrente e impar a sequência
Massa Moecuar Se não é uma sequência nova, juntar à sequência corrente
Massa Moecuar se houver uma útima acrescentar essa útima, e fechar o ficheiro
FASTA Testar octave:24> seqs=efasta('cytochromes.fa') seqs = 1x15 struct array containing the fieds: nome sequencia
FASTA Testar octave:25> seqs(1) ans = scaar structure containing the fieds: nome = NP_061820.1_Homo_sapiens sequencia = MGDVEKGKKIFIMKCSQCHTVEKGGKHKTGPNLHGLFGRKTGQAPGYSYTAANKN KGIIWGEDTLMEYLENPKKYIPGTKMIFVGIKKKEERADLIAYLKKATNE
FASTA
FASTA Testar octave:30> fracresiduo('aakk','k') ans = 0.50000 Octave:31> fracresiduo('akkk','k') ans = 0.75000 octave:32>
FASTA
FASTA Testar octave-3.6.4.exe:32> escrevereatorio('cytochromes.fa','l') NP_061820.1_Homo_sapiens contem 0.06% de L XP_002803395.1_Macaca_muatta contem 0.06% de L AEP27210.1_Papio_hamadryas contem 0.06% de L XP_003914483.1_Papio_anubis contem 0.07% de L XP_003919830.1_Saimiri_boiviensis_boiviensis contem 0.06% de L XP_002760914.1_Caithrix_jacchus contem 0.05% de L AEP27227.1_Cacajao_rubicundus contem 0.05% de L AEP27233.1_Lemur_catta contem 0.06% de L XP_004091919.1_Nomascus_eucogenys contem 0.06% de L BAC40143.1_Mus_muscuus contem 0.06% de L EAW72790.1_Homo_sapiens contem 0.06% de L NP_001039526.1_Bos_taurus contem 0.06% de L AEP27241.1_Nycticebus_coucang contem 0.06% de L EHB17946.1_Heterocephaus_gaber contem 0.07% de L XP_002720254.1_Oryctoagus_cunicuus contem 0.09% de L
Resumindo Estruturas: Servem para organizar dados heterogéneos Podem ser agrupadas em vectores, desde que tenham os mesmos campos. Nota: Normamente é mehor er todos os dados para um vector de estruturas e depois processar essa informação.
Para estudar a aua de hoje Para consutar: Manua do Octave, Secção 6.1
Dúvidas?