UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR CURSO DE CIÊNCIA DA COMPUTAÇÃO SISTEMA PARA ESTRUTURAÇÃO DE INFORMAÇÕES SOBRE PROTEÍNAS Área de Bioinformática por Thomas Basten Rafael Luiz Cancian, MSc. Orientador Itajaí (SC), julho de 2006 UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR CURSO DE CIÊNCIA DA COMPUTAÇÃO SISTEMA PARA BUSCA E ESTRUTURAÇÃO DE INFORMAÇÕES SOBRE PROTEÍNAS Área de Bioinformática por Thomas Basten Relatório apresentado à Banca Examinadora do Trabalho de Conclusão do Curso de Ciência da Computação para análise e aprovação. Orientador: Rafael Luiz Cancian, MSc. Itajaí (SC), julho de 2006 SUMÁRIO LISTA DE ABREVIATURAS................................................................... v LISTA DE FIGURAS................................................................................vi LISTA DE TABELAS ..............................................................................vii RESUMO..................................................................................................viii ABSTRACT................................................................................................ix 1. INTRODUÇÃO ...................................................................................... 1 1.1. OBJETIVOS ........................................................................................................ 3 1.1.1. Objetivo Geral ................................................................................................... 3 1.1.2. Objetivos Específicos ........................................................................................ 3 1.2. METODOLOGIA................................................................................................ 4 1.3. ESTRUTURA DO TRABALHO ....................................................................... 6 2. FUNDAMENTAÇÃO TEÓRICA ........................................................ 7 2.1. BIOLOGIA MOLECUAR.................................................................................. 7 2.1.1. DNA .................................................................................................................... 8 2.1.2. NUCLEOTÍDEOS ............................................................................................ 9 2.1.3. ESTRUTURA DO DNA ................................................................................. 10 2.1.4. Genes ................................................................................................................ 12 2.1.4.1. FUNCIONAMENTO DOS GENES ........................................................... 12 2.1.5. RNA .................................................................................................................. 13 2.1.6. AminoácidoS.................................................................................................... 15 2.1.7. PROTEÍNAS ................................................................................................... 15 2.1.7.1. Estrutura das proteínas ................................................................................... 15 2.1.7.1.1. 2.1.7.1.2. 2.1.7.1.3. 2.1.7.1.4. Estrutura Primária ............................................................................................................17 Estrutura Secundária ........................................................................................................17 Estrutura Terciária............................................................................................................21 Estrutura Quaternária .......................................................................................................22 2.1.7.2. Funções das Proteínas .................................................................................... 22 2.1.7.3. Bancos de Dados Biológicos.......................................................................... 24 2.1.7.3.1. Banco de Dados Primários ...............................................................................................24 2.1.7.3.2. Banco de Dados Secundários ...........................................................................................24 2.2. PROTEÔMICA ................................................................................................. 27 2.2.1.1. Ferramentas para Proteômica ......................................................................... 28 2.3. TECNOLOGIA APLICADA ........................................................................... 31 2.3.1. PROCESSAMENTO PARALELO E DISTRIBUÍDO ............................... 31 2.3.2. BANCO DE DADOS....................................................................................... 33 2.3.3. ACESSO A BANCO DE DADOS BIOLÓGICOS ...................................... 34 2.3.4. LINGUAGEM DE PROGRAMAÇÃO DELPHI ........................................ 38 3. DESENVOLVIMENTO ...................................................................... 40 3.1. INTRODUÇÃO ................................................................................................. 40 3.2. MODELAGEM.................................................................................................. 40 3.2.1. Casos de Uso .................................................................................................... 41 3.2.2. Diagrama de Classes ....................................................................................... 46 3.2.3. Diagrama de Seqüências................................................................................. 47 3.2.4. Diagrama de Entidades e Relacionamentos ................................................. 49 3.3. PROJETO .......................................................................................................... 50 3.3.1. Janela de Login................................................................................................ 51 3.3.2. Tela Informações de Escravos ....................................................................... 52 3.3.3. Tela de Busca por Proteínas........................................................................... 53 3.3.4. Tela de Progresso da Busca............................................................................ 54 3.3.5. Tela de Banco de Dados Protéico .................................................................. 55 3.3.6. Tela Aplicação Escrava de Busca por Proteínas.......................................... 58 3.4. IMPLEMENTAÇÃO ........................................................................................ 58 3.4.1. Componentes e Funções Utilizadas ............................................................... 59 3.4.1.1. Função de Leitura de Arquivo .ini ................................................................. 59 3.4.1.2. Função de Criação de Lista com IPs da Rede ................................................ 59 3.4.1.3. Função de Download de Arquivos na Internet............................................... 60 3.4.2. Busca em Banco de Dados Protéico............................................................... 60 3.4.3. Comunicação entre a Aplicação Principal e a Aplicação Servidora.......... 61 3.4.4. Inclusão de Resultados no Banco de Dados.................................................. 62 3.5. VALIDAÇÃO E TESTES................................................................................. 63 4. CONSIDERAÇÕES FINAIS ...................Erro! Indicador não definido. REFERÊNCIAS BIBLIOGRÁFICAS ................................................... 72 APÊNDICE A – DICIONÁRIO DE DADOS ........................................ 76 ANEXO I – CÓDIGO FONTE DA APLICAÇÃO PRINCIPAL........ 79 ANEXO II – CÓDIGO FONTE DA APLICAÇÃO ESCRAVA ......... 85 iv LISTA DE ABREVIATURAS DDBJ DNA EBI EMBOSS ExPASy FK HTML IP PDB PK RNA RNAm RNAt SQL TCC TCP UML UNIVALI URL W3C XML DNA Data Bank of Japan DesoxirriboNucleic Acid, ou Ácido Desoxirribonucléico European Bioinformatics Institute European Molecular Biology Open Software Suíte EXpert Protein Analysis System Foreign Key HyperText Markup Language Internet Protocol Protein Data Bank Primary Key Ácido Ribonucléico RNA Mensageiro RNA Transportador Structured Query Language Trabalho de Conclusão de Curso Transmission Control Protocol Unified Modeling Language Universidade do Vale do Itajaí Uniform Resource Locator World Wide Web Consortium Extensible Markup Language LISTA DE FIGURAS Figura 1. Estrutura de um cromossomo, da dupla hélice do DNA e das bases nitrogenadas. .............8 Figura 2. Nucleotídeo Timina. .............................................................................................................9 Figura 3. Bases nitrogenadas que compõe o DNA.............................................................................10 Figura 4. A Dupla hélice do DNA......................................................................................................11 Figura 5. Nucleotídeo Uracila. ...........................................................................................................13 Figura 6. Bases nitrogenadas que compõe o RNA.............................................................................14 Figura 7. Exemplo de estrutura primária de uma proteína. ................................................................17 Figura 8. Exemplo de Estrutura Secundária.......................................................................................17 Figura 10. Estrutura Secundária Folha- ............................................................................................19 Figura 11. Estrutura Secundária Laço (Turn).....................................................................................20 Figura 13. Estrutura terciária..............................................................................................................21 Figura 14. Estrutura quaternária.........................................................................................................22 Figura 15. Sistema de busca no banco de dados PROSITE. ..............................................................26 Figura 16. Resultados obtidos pela busca no banco de dados PROSITE. .........................................27 Figura 16. Página inicial do sistema de busca de domínios PFam.....................................................29 Figura 17. Resultados obtidos pelo sistema de busca de domínios PFam. ........................................30 Figura 18. Sistema de busca no banco de dados Swiss-Prot..............................................................35 Figura 19. Tela de resultados obtidos pelo Sistema de busca no banco de dados Swiss-Prot. ..........35 Figura 20. Tela de resultados obtidos pelo acesso direto as informações do UniProt. ......................36 Figura 21. Diagrama do Caso de Uso Login no Sistema. ..................................................................42 Figura 22. Diagrama do Caso de Uso Servidores na Rede. ...............................................................43 Figura 23. Diagrama do Caso de Uso Buscar, Visualizar Proteínas e Gravar Dados ........................45 Figura 24. Diagrama de classes Aplicação Principal .........................................................................46 Figura 25. Diagrama de classes Aplicação Escrava ...........................................................................47 Figura 26. Diagrama de Seqüência Inclusão Manual de Escravo. .....................................................48 Figura 27. Diagrama de Seqüência Solicitação de Informações ........................................................49 Figura 28. Modelo de entidades e relacionamentos. ..........................................................................50 Figura 29. Janela de Login .................................................................................................................51 Figura 30. Janela Cadastro de Novo Usuário .....................................................................................52 Figura 31. Tela de Informações de Escravos .....................................................................................53 Figura 32. Tela de Busca por Proteínas..............................................................................................54 Figura 33. Tela de Progresso de Busca ..............................................................................................55 Figura 34. Tela de Informações Básicas da Proteína .........................................................................56 Figura 35. Tela de Estrutura da Proteína............................................................................................57 Figura 36. Escravo de Busca por Proteínas........................................................................................58 Figura 37. Busca por ABC Transporters através da ferramenta UniProt Knowledgebase ................63 Figura 38. Resultado da busca por ABC Transporters através da aplicação......................................64 Figura 39. Arquivo no formato Flat da proteína ABCCD_HUMAN. ...............................................65 Figura 40. Tela informações básicas da proteína ABCCD_HUMAN. ..............................................65 Figura 41. Estrutura secundária fornecida pelo banco de dados Uniprot...........................................66 Figura 42. Motivos na proteína ABCCD_HUMAN, conforme a ferramenta PrositeScan. ...............67 Figura 43. Domínios na proteína ABCCD_HUMAN conforme banco de dados PFam....................67 Figura 44. Estrutura secundária, motivos e domínios encontrados através da aplicação...................68 LISTA DE TABELAS Tabela 1. Lista de aminoácidos que podem compor uma proteína. ...................................................16 Tabela 3. Descrição do Caso de Uso Login no Sistema.....................................................................42 Tabela 4. Descrição do Caso de Uso Inclusão de Novo Escravo.......................................................43 Tabela 4. Descrição do Caso de Uso Solicitação de Informação.......................................................44 Tabela 5. Descrição do Caso de Uso Visualizar Proteínas. ...............................................................44 Tabela 6. Descrição do Caso de Uso Gravar Dados. .........................................................................45 Tabela 7. Dicionário de Dados da Tabela Autor ................................................................................76 Tabela 8. Dicionário de Dados da Tabela Datas ................................................................................76 Tabela 9. Dicionário de Dados da Tabela Domínio. ..........................................................................76 Tabela 10. Dicionário de Dados da Tabela EstruturaSecundária.......................................................76 Tabela 11. Dicionário de Dados da Tabela Gene...............................................................................77 Tabela 12. Dicionário de Dados da Tabela Motivo. ..........................................................................77 Tabela 13. Dicionário de Dados da Tabela Organismo. ....................................................................77 Tabela 14. Dicionário de Dados da Tabela Organismo_Proteína. .....................................................77 Tabela 15. Dicionário de Dados da Tabela Proteína. .........................................................................77 Tabela 16. Dicionário de Dados da Tabela Referência. .....................................................................78 Tabela 17. Dicionário de Dados da Tabela Seqüência.......................................................................78 Tabela 18. Dicionário de Dados da Tabela Taxonomia. ....................................................................78 RESUMO BASTEN, Thomas. Sistema para busca e estruturação de informações sobre proteínas. Itajaí, 2006. 115 f. Trabalho de Conclusão de Curso (Graduação em Ciência da Computação)–Centro de Ciências Tecnológicas da Terra e do Mar, Universidade do Vale do Itajaí, Itajaí, 2006. Esse trabalho tem por objetivo o desenvolvimento de uma ferramenta computacional que, numa primeira etapa, busque todos os dados disponíveis em bancos de dados públicos sobre uma proteína, gerando um banco de dados local estruturado. Numa segunda etapa, tal ferramenta deve utilizar ferramentas de proteômica já desenvolvidas para extrair diversas informações que podem não estar contidas em um único banco de dados público, como estruturas secundárias e terciárias, motivos e domínios conservados, incluindo tais informações pós-processadas também no banco de dados. A realização deste projeto pode servir de base a outros projetos que pretendem identificar novas proteínas com base nas características próprias de grupos protéicos já conhecidos. Tal feito pode ser de grande relevância a pesquisadores da área de biologia molecular, uma vez que pode auxiliar a identificação de proteínas hipotéticas e proteínas sem função biológica conhecida. Palavras-chave: Bioinformática; Proteômica; Banco de dados ABSTRACT This work goals the development of a computational tool that, in a first step, retrieves available data about certain protein from public databases and generates a structured local primary protein database. In a second step it will use already developed proteomic tools to extract several information from the primary database that may not exist in just one public database, such as secondary structures, motifs and conserved domains, and then including these extracted information in the local database. Based on this local database one can search for existent patterns in that proteic group that fully characterizes it and allow to identify hypothetic proteins. The development of this works may have great relevance to molecular biology’s researchers because it can help identifying proteins with biologic function still unknown. Keywords: Bioinformatic, Proteomic, Database. 1. INTRODUÇÃO O uso da bioinformática é imprescindível para atender os desafios científicos relacionados ao grande volume de dados produzidos pelos atuais projetos na área biológica. Um dos desafios é determinar a função e o papel biológico das proteínas identificadas nas últimas décadas. Se os genes, contidos no DNA (DesoxirriboNucleic Acid, ou Ácido Desoxirribonucléico), são os portadores das instruções que permitem o desenvolvimento de um determinado organismo, as proteínas são as responsáveis por executarem essas instruções. São essas moléculas que formam os ossos, músculos e os demais tecidos e comandam o metabolismo (FALCÃO, 2004). As macromoléculas de DNA são compostas por seqüências de apenas quatro diferentes nucleotídeos, numa ordem específica. Apesar de serem seqüências muito grandes (milhões a trilhões de nucleotídeos), apenas alguns trechos do DNA possuem informações que serão traduzidas em proteínas. Esses trechos são chamados de genes. Por isso diz-se que o DNA é o código genético (ibidem). Num gene, uma seqüência de três nucleotídeos que podem codificar uma proteína forma um códon. Cada códon é o código para sua tradução num aminoácido, e vários aminoácidos ligados em seqüência linear formam uma proteína. Muitos consideram o conhecimento sobre os genes apenas o primeiro passo da bioinformática, sendo necessária ainda uma compreensão mais aprofundada dos processos que ocorrem após o armazenamento, a duplicação e a tradução do material genético. A chamada “era pós-genômica” começou com a constatação de que os dados trazidos pelo seqüenciamento das moléculas de DNA, embora relevantes, são limitados. É imprescindível investigar tanto os processos de transcrição das informações contidas no genoma quanto os seus produtos, as proteínas (PIMENTA, 2004). O proteoma é o conjunto de todas as proteínas de um dado organismo, do mesmo modo como genoma é um conjunto de genes de um dado organismo (CATES, 2004). O ser humano, por exemplo, tem cerca de meio milhão de proteínas (EXPASY, 2004). O termo “proteoma” foi originalmente usado por Mark Wilkins para descrever “PROTEIn complement of the genOME”. Atualmente, esse termo é usado para descrever qualquer técnica usada para analisar as proteínas expressas por uma célula ou organismo sob determinadas condições. O Instituto Suíço de Bioinformática (Swiss Institute of Bioinformatics) define proteômica como comparação qualitativa e quantitativa de proteomas sob diferentes condições para posterior resolução de processos biológicos (CATES, 2004). Considerando-se que uma célula desempenha suas funções de acordo com as enzimas ali presentes; que as enzimas atuam em substratos específicos segundo a forma de suas moléculas e que a forma da molécula de uma enzima é definida pela seqüência de aminoácidos presentes na cadeia polipeptídica, e que a seqüência de aminoácidos é definida pelos genes, então pode-se afirmar que os processos vitais que ocorrem na célula dependem, em última instância, do DNA (FARAH, 1997). As proteínas contêm uma estrutura em quatro níveis. A seqüência linear dos aminoácidos em uma cadeia polipeptídica é chamada estrutura primária da proteína. A estrutura secundária refere-se a inter-relações de aminoácidos que estão unidos em seqüência linear. Essa disposição especial resulta do fato de que os polipeptídeos podem se dobrar em estruturas que se repetem. Uma proteína também tem uma arquitetura tridimensional, chamada de estrutura terciária, que é a maneira pela qual a cadeia polipeptídica encurva-se ou dobra-se em três dimensões, formando a estrutura compacta firmemente enovelada das proteínas globulares. Em muitos casos, os aminoácidos que estão distantes na seqüência linear são aproximados na estrutura terciária. Além disso, geralmente, duas ou mais cadeias polipeptídicas dobradas se ligam para formar uma estrutura quaternária (GRIFFITHS, MILLER, JSUZIKI, 2001). A análise proteômica vai muito além da simples anotação de proteínas e pode fornecer indícios substanciais quanto à organização e à dinâmica dos processos metabólicos, regulatórios e de sinalização através dos quais a célula se desenvolve. Mais ainda, a análise proteômica pode mostrar como esses processos se tornam disfuncionais nos estados patológicos e como podem ser manipulados, mediante, por exemplo, a administração de medicamentos ou a terapia gênica (PIMENTA, 2004). Portanto, uma das grandes inovações prometidas pelo conhecimento dos proteomas, além do mapeamento de intrincados caminhos metabólicos celulares, é a possibilidade de identificar novos alvos farmacológicos, novas moléculas bioativas e marcadores biológicos que podem ser usados para diagnósticos clínicos. Pesquisas em bioinformática já produziram inúmeros resultados e ferramentas, que hoje formam a base necessária a novas pesquisas, resultados e ferramentas mais avançadas (ibidem). 2 Este projeto objetiva fornecer uma ferramenta que concentre todos os dados a respeito de um grupo protéico, de forma estruturada, incluíndo as informações geradas por ferramentas de proteômica e que não estão disponíveis em bancos de dados. Com base nessas informações estruturadas, pode-se buscar padrões existentes em um grupo protéico de forma a caracterizá-lo, e possibilitar também a identificação de outras proteínas descobertas, mas ainda não anotadas. A realização deste projeto pode servir de base a outros projetos que pretendem identificar novas proteínas com base nas características próprias de grupos protéicos já conhecidos. Tal feito pode ser de grande relevância a pesquisadores da área de biologia molecular, uma vez que pode permitir identificar proteínas hipotéticas e proteínas sem função biológica conhecida. Em relação à Ciência da Computação, este projeto é significante por combinar diversas técnicas estudadas, como processamento distribuído, banco de dados e soluções para Web. Além disso, este projeto possui um componente forte de pesquisa científica, por tratar de aspectos avançados de uma nova área (proteômica) e dar suporte a análises que podem produzir conhecimentos científicos relevantes. 1.1. OBJETIVOS 1.1.1. Objetivo Geral O objetivo geral deste trabalho é desenvolver uma ferramenta computacional que, numa primeira etapa, busque todos os dados disponíveis em bancos de dados públicos sobre proteínas de determinado grupo e que já tenham função biológica conhecida e comprovada, gerando um banco de dados local estruturado com dados relacionados a esse grupo protéico. Numa segunda etapa, tal ferramenta deve utilizar ferramentas de proteômica já desenvolvidas para extrair diversas informações que podem não estar contidas em bancos de dados públicos, como estruturas secundárias e terciárias, alinhamentos entre as proteínas do grupo, motivos, domínios conservados, etc, incluindo tais informações pós-processadas também no banco de dados. 1.1.2. Objetivos Específicos 3 Os objetivos específicos deste projeto de pesquisa são: • Pesquisar e compreender a formação, estruturas, propriedades físico-químicas, características e funções de proteínas; • Pesquisar e compreender o funcionamento de ferramentas para proteômica já desenvolvidas; • Pesquisar o acesso a bancos de dados biológicos e ferramentas para proteômica públicos; • Modelar o banco de dados estruturado de informações proteicas; • Modelar o sistema para busca, processamento e geração do banco de dados de proteínas; • Implementar tal sistema; e • Testar e validar o funcionamento do sistema para estruturação de informações sobre proteínas; 1.2. METODOLOGIA Para que este trabalho fosse realizado com sucesso, as tarefas foram divididas em etapas bem definidas, conforme a metodologia científica hipotetico-dedutiva, que foram seguidas para a sua realização. A etapa inicial foi a pesquisa e compreensão de proteínas quanto à sua formação, estrutura, propriedades, características e funções, pesquisa essa que pode ocorrer em diversas fontes de informação, tais como livros, artigos, dissertações, anais, periódicos e internet. Após a coleta de materiais encontrados nas fontes citadas acima, foi feita uma seleção daqueles que são considerados mais importantes, dando início à confecção da revisão bibliográfica. Paralelamente a essa etapa ocorria a pesquisa de soluções existentes para a classificação e busca de padrões em proteínas. Após o término das duas primeiras etapas, foi realizada a pesquisa por ferramentas de proteômica existentes de maneira que possa se compreender o seu funcionamento. Obteve-se como resultado uma tabela com suas vantagens e desvantagens. 4 Na quarta, iniciou-se os processos de pesquisa de formas de acesso à banco de dados biológicos e o uso das ferramentas de proteômica. Essas últimas contaram com a implementação de protótipo na linguagem de programação escolhida para desenvolvimento. Ao final das etapas de pesquisa, foi realizada a modelagem do banco de dados protéico, bem como a definição do banco de dados a ser utilizado e as ferramentas de criação. Em seguida teve-se o início da modelagem do sistema de busca, processamento e armazenamento das informações recolhidas, modelagem esta seguindo a metodologia UML. Como conclusão do trabalho foram desenvolvidas as aplicações principal e escrava com base no estudo realizado. 5 1.3. ESTRUTURA DO TRABALHO INTRODUÇÃO. Esse capítulo objetiva introduzir o leitor nos aspectos que serão obordados nesse trabalho alem de contém os objetivos gerais e específicos e a metodologia utilizada para a realização do trabalho. FUNDAMENTAÇÃO TEÓRICA. A fundamentação teórica é composta por três sessões: Biologia Molecular, Proteômica e Tecnologia Aplicada. Na sessão Biologia Molecular é descrito o que são as proteínas, como se formam, os tipos de estruturas que as compõe, o que são os seus motivos e domínios funcionais, assim como o modo que informações sobre proteínas são armazenadas em bancos de dados públicos e sua forma de acesso. Na sessão de Proteômica é descrito é que é proteômica e suas ferramentas. Já na sessão Tecnologia Aplicada são descritas as tecnologias necessárias e aplicadas para o desenvolvimento do trabalho, bem como a justificativa para o uso de tais tecnologias. DESENVOLVIMENTO. Esse capítulo contém a análise modelagem e projeto do sistema, bem como suas características e aspectos de implementação. CONCLUSÕES. Nas conclusões são feitos comentários sobre os objetivos alcançados com este trabalho; são apresentados pontos fortes e fracos do mesmo; algumas considerações e uma relação de possíveis trabalhos futuros. [FIM DE SEÇÃO. Não remova esta quebra de seção] 6 2. FUNDAMENTAÇÃO TEÓRICA 2.1. BIOLOGIA MOLECUAR Em 1869, o bioquímico suíço Friedtich Mieschner constatou pela primeira vez que todos os núcleos celulares provavelmente possuíam uma química específica. Em anos subseqüentes, ele descobriu várias substâncias do núcleo, as quais separou em proteínas e moléculas ácidas, daí o termo “ácidos nucléicos” (FARAH, 1997; GRIFFITHS, MILLER, JSUZIKI, 2001). Phoebus A. T. Levene, um químico natural da Rússia, também foi um pioneiro no estudo de ácidos nucléicos. Em 1909, Levene identificou corretamente a ribose como açúcar de um dos dois tipos de ácido nucléico, o ácido ribonucléico, e certos componentes do outro ácido nucléico, o ácido desoxirribonucléico. Ele e muitos de seus colaboradores estavam convencidos de que, com os ácidos nucléicos armazenavam todas as informações genéticas nos cromossomos. A teoria de Levene sobre o propósito do DNA (meramente manter unidas as moléculas de proteína) revelou-se incorreta (ibidem). O trabalho que levou à correção dessa suposição equivocada teve início em 1928 com bacteriologista inglês Fredrick Griffith (ibidem). Outro bacteriologista, Oswald T. Avery, juntamente com sua equipe, percebeu a importância do trabalho de Griffith e passou dez anos tentando identificar o agente que era a essência da transformação genética na bactéria. Finalmente, em 1944, Avery publicou os resultados de suas extensas pesquisas, os quais mostraram claramente que era o DNA, e não a proteína ou RNA, que armazena e transporte as informações hereditárias. Esse trabalho inaugurou a ciência da genética molecular. Na década de 1940, Alfred D. Hershey confirmou a conclusão do grupo de Avery de que o DNA, e não a proteína, é o material genético (ibidem). Segundo Amabis (2002 apud BIBLIOMED, 2002) os ácidos nucléicos são as maiores e as mais importantes moléculas orgânicas. Existem dois tipos de ácidos nucléicos, que são: • DNA (que significa, em inglês, DesoxirriboNucleic Acid, ou ácido desoxirribonucléico). Ele tem esse nome porque o açúcar que o forma é a desoxirribose. • RNA (que significa, em inglês, RiboNucleic Acid, ou ácido ribonucléico). O seu nome vem do açúcar que o compõe, que é a ribose. 2.1.1. DNA O DNA é a molécula na qual estão contidas todas as características de um ser vivo, ou seja, é o portador da informação que caracteriza qualquer indivíduo (MELEIRO & FONSECA, 2001). O material responsável pelo comando e coordenação de toda a atividade celular e pelas divisões celulares e transmissões das características hereditárias são os cromossomos. Os cromossomos contêm os genes que por sua vez são formados por DNA, ilustrado na Figura 1. Estes genes permitem a transmissão das informações genéticas de geração a geração (BIOMANIA, 2002). Figura 1. Estrutura de um cromossomo, da dupla hélice do DNA e das bases nitrogenadas. Fonte: Adaptado de Yangene (2000). Nas células eucarióticas, o cromossomo é formado por DNA associado a moléculas de histona, que são proteínas básicas. É na molécula de DNA que estão contidos os genes, responsáveis pelo comando da atividade celular e pelas características hereditárias. Cada molécula de DNA contém vários genes dispostos linearmente ao longo da molécula. Cada gene, quando em atividade, é transcrito em moléculas de outros ácidos nucléicos denominados ribonucléicos ou RNA, que comandarão a síntese de proteínas (ibidem). 8 Nas células procarióticas, o cromossomo é uma única molécula de um ácido nucléico, e encontram-se imersos no próprio citoplasma formando uma estrutura denominada nucleóide. Nas células eucarióticas os cromossomos encontram-se separados do citoplasma pela membrana nuclear ou carioteca, em uma estrutura denominada núcleo. A presença de carioteca é uma característica típica das células eucarióticas, que as distingue das procarióticas. Além disso, as células procarióticas não apresentam organelas membranosas, como ocorre com as eucarióticas (BIOMANIA, 2002). 2.1.2. NUCLEOTÍDEOS O DNA é uma molécula de ácido nucléico polimérica, como mostra a Figura 2. É composta de três tipos de unidades: um açúcar de cinco carbonos, a desoxorribose; uma base contendo nitrogênio; e um grupo fosfato. As bases são de dois tipos: purinas (formadas por dois anéis de carbono) e pirimidinas (formadas por um simples anel de carbono). No DNA existem duas bases purínicas, adenina (A) e guanina (G), e duas bases pirimidínicas, timina (T) e citosina (C), como ilustrado na Figura 3 (THOMPSON, 2000). Figura 2. Nucleotídeo Timina. Fonte: Adaptado de Thompson (2000). 9 Figura 3. Bases nitrogenadas que compõe o DNA. Fonte: Adaptado de Thompson (2000). A molécula de açúcar e o fosfato são componentes invariáveis nos nucleotídeos e apresentam uma função unicamente estrutural na molécula de DNA. A fim de evitar qualquer tipo de confusão, quando os números referem-se a moléculas de desoxirribose eles são seguidos pelo sinal linha (‘) (ibidem). Milhares de nucleotídeos empilham-se em forma linear para construir uma cadeia de DNA. O grupo fosfato liga o carbono 3’ da desoxirribose de um nucleotídeo ao carbono 5’ da desoxirribose do nucleotídeo seguinte, por meio de uma ligação fosfodiéster. A quantidade de T é sempre igual à quantidade de A, e a quantidade de C é sempre igual à quantidade de G. Mas a quantidade de A + T não é necessariamente igual à quantidade de G + C. Essa proporção varia entre os organismos diferentes (GRIFFITHS, MILLER, JSUZIKI, 2001). 2.1.3. ESTRUTURA DO DNA Na dupla hélice do DNA, descrita pela primeira vez por Watson e Crick em 1953, as cadeias da molécula se dobram em torno de um eixo comum e de modo antiparalelo, ou seja, enquanto uma vai na direção 5’ para 3’ a outra está orientada na direção oposta, de 3’ para 5’. Cada metade é uma cadeia de nucleotídeos (ocupando a parte interna da hélice) mantidos juntos por ligações de 10 fosfodiéster, nas quais um grupo fosfato forma uma ponte entre os grupos –OH em duas desoxirriboses adjacentes (ocupam a parte externa da hélice). As duas hélices são mantidas unidas por pontes de hidrogênio (GRIFFITHS, MILLER, JSUZIKI, 2001). As pontes de hidrogênio são formadas entre pares de bases nitrogenadas, uma base purina e outra pirimidina, combinadas de acordo com a seguinte regra: G combina com C e A combina com T. A ilustração da dupla hélice do DNA pode ser visto na Figura 4 (FARAH, 1997). Figura 4. A Dupla hélice do DNA Fonte: (Access, 2001). xxx 11 2.1.4. Genes Até o final da década de 1970, o gene era considerado simplesmente como um segmento de uma molécula de DNA que continha o código para a seqüência de aminoácidos de uma cadeia polipeptídica (proteína) (FARAH, 1997). Segundo Thompson, Mcinnes e Willard (1998), atualmente sabe-se que a descrição acima é incompleta. Na verdade, bem poucos genes existem como seqüências codificadas contínuas. Em eucariontes, por exemplo, essas seqüências são interrompidas por íntrons, seqüências intercalares, que são inicialmente transcritas em RNA no núcleo mas não estão presentes no mRNA processado, portanto não são representadas no produto protéico final. Os íntrons alternam-se com as seqüências codificadoras, ou éxons, que codificam a seqüência de aminoácidos de uma proteína. Embora alguns genes no genoma humano não possuam íntrons, a maioria dos genes em eucariontes contém pelo menos um e, em geral, vários (ibidem). Os genes estão localizados nos cromossomos no núcleo celular e se alinham ao longo de cada um deles. O material genético é o DNA, uma molécula que representa a "coluna vertebral" do cromossomo. Como em cada cromossomo o DNA é uma molécula contínua, alongada, simples e delgada, os genes devem ser parte dela e exercem seus efeitos através das moléculas às quais dão origem, em sua maioria das proteínas (FARAH, 1997). 2.1.4.1. Funcionamento dos Genes Os genes controlam a síntese de proteínas que, quando atuam no organismo, determinam as características fenotípicas dos seres vivos. Cada gene ocupa um lugar certo no cromossomo e este lugar é chamado de locus. Os genes que ocupam o mesmo lócus em cromossomos homólogos são denominados alelos (FARAH, 1997; GRIFFITHS, MILLER, JSUZIKI, 2001; THOMPSON, MCINNES, WILLARD, 1998). Os genes provêem as instruções para as células produzirem as proteínas essenciais à vida do organismo. Embora cada célula do corpo contenha genes idênticos, alguns genes somente estão 12 ativados ou "ligados" em certas células ou em certos momentos (por exemplo, não há necessidade de um gene responsável pela cor dos olhos estar ligado em uma célula do coração, mesmo que esse gene esteja presente na célula do coração). Alguns genes são ligados somente durante o tempo que um órgão ou tecido está sendo formado, ou somente durante a puberdade, ou somente durante períodos de estresse (FARAH, 1997; GRIFFITHS, MILLER, JSUZIKI, 2001; THOMPSON, MCINNES, WILLARD, 1998). 2.1.5. RNA A composição do RNA é muito semelhante ao do DNA, ilustrado na Figura 5, contudo apresenta algumas diferenças: o RNA possui uracila no lugar da timina na seqüência de bases; ao invés de conter a desoxirribose ele contém a ribose; o RNA é formado por uma fita única, com eventual pareamento de bases intracadeia; a molécula do RNA é muito menor que a do DNA (THOMPSON, MCINNES, WILLARD, 2000). A síntese de uma molécula de RNA a partir de um molde de DNA chama-se transcrição. Essa transcrição ocorre quando uma molécula de DNA abre-se em um determinado ponto. Nucleotídios livres na célula vão se pareando a esse segmento aberto. Completado o pareamento a esse segmento aberto, está pronta a molécula do RNA, o DNA que serviu de molde reconstitui a molécula original (WIKIPEDIA, 2006). Figura 5. Nucleotídeo Uracila. Fonte: Adaptado de Thompson, Mcinnes, Willard (2000). 13 A Figura 6 mostra os quatro tipos de bases nitrogenadas encontradas em uma cadeia de RNA. Figura 6. Bases nitrogenadas que compõe o RNA. Fonte: Adaptado de Thompson, Mcinnes, Willard (2000). Existem 3 tipos de RNA, cada um com características estruturais e funcionais próprias: RNA Ribossômico: ou RNAr é encontrado, em associação com várias proteínas diferentes, na estrutura dos ribossomos, as organelas responsáveis pela síntese protéica. Corresponde a até 80% do total de RNA da célula (THOMPSON, MCINNES, WILLARD, 2000). RNA de Transferência: ou RNA Transportador, ou ainda RNAt é a menor molécula dos 3 tipos de RNA. Pode se ligar de forma específica a cada um dos 20 aminoácidos encontrados nas proteínas. Corresponde a 15% do RNA total da célula. Fazem um extenso pareamento de bases intracadeia, e atua no posicionamento dos aminoácidos na seqüência prevista pelo código genético, no momento da síntese protéica (ibidem). RNA Mensageiro: ou mRNA, corresponde a apenas 5% do total de RNA da célula. Atua transportando a informação genética do núcleo da célula eucariótica ao citosol, onde ocorrerá a biossíntese protéica. É utilizado como molde nesta biossíntese. (ibidem). 14 2.1.6. AminoácidoS Um aminoácido (aa) é molécula composta por um radical amino (NH2), um radical ácido orgânico (COOH) e uma cadeia lateral, cujas propriedades lhes darão suas características particulares (GENTIL, 2002). Os aminoácidos podem se unir em cadeias e combinações químicas, produzindo peptídeos e proteínas, daí a famosa afirmação de que os aas são os blocos formadores de proteínas. Ao todo existem 20 tipos básicos de aminoácidos, dentre os quais nove (Isoleucina, Leucina, Valina, Histadina, Lisina, Metionina, Fenilalanina, Treonina e Triptofano) são considerados essenciais e devem ser obtidos pela alimentação, pois nosso corpo não é capaz de produzí-los. Todas as proteínas encontradas em nosso corpo (tecidos, enzimas, alguns hormônios....) são combinações destes 20 aminoácidos (ibidem). 2.1.7. PROTEÍNAS As proteínas são as macromoléculas mais abundantes nas células vivas, constituíndo cerca de 50% de seu peso seco. São encontradas em todas as células do organismo e em todas as partes das células. Possuem grande diversidade sendo que podem existir centenas de tipos diferentes em uma única célula. Um organismo biológico possui milhares de diferentes tipos de proteínas, as quais são constituídas basicamente de aminoácidos ligados em cadeias lineares por meio de ligações peptídicas. Forças intramoleculares ativas fazem com que a proteína assuma uma estrutura tridimensional específica que está diretamente relacionada às suas funções biológicas (LEHNINGER, NELSON, COX, 1998; FARAH, 1997). 2.1.7.1. Estrutura das proteínas A estrutura das proteínas é extraordinariamente complexa e seu estudo requer o conhecimento de vários níveis de organização. Destingem-se quatro níveis de organização 15 existentes nas proteínas, os quais são chamados de estrutura primária, secundária, terciária e quaternária. Uma proteína nascente pode ser composta pelos aminoácidos listados na Tabela 1. Tabela 1. Lista de aminoácidos que podem compor uma proteína. Símbolo 3 letras Símbolo de 1 letra Nome do Aminoácido Ala A Alanina Asx R Asparagina Cis ou Cys C Cisteína Asp D Aspartato Glu Q Glutamato Fen ou Phe F Fenilalanina Gli ou Gly G Glicina His H Histidina Ile I Isoleucina Lis ou Lys K Lisina Leu L Leucina Met M Metionina Pro P Prolina Gln E Glutamina Arg R Arginina Ser S Serina Ter ou Thr T Treonina Val V Valina Trp W Triptofano Tir ou Tyr Y Tirosina 16 2.1.7.1.1. Estrutura Primária A estrutura primária de uma proteína é a seqüência linear dos aminoácidos em uma cadeia polipeptídica (GRIFFITHS, MILLER, JSUZIKI, 2001; MOTTA, 2004; ALBERTS, BRAY, LEWIS, 1997). A Figura 7 aponta um exemplo de estrutura primária de uma proteína. Figura 7. Exemplo de estrutura primária de uma proteína. Fonte: Adaptado de Horton, Moram, Ochs (1995). 2.1.7.1.2. Estrutura Secundária A estrutura secundária refere-se a inter-relações de aminoácidos que estão unidos em seqüência linear. Essa disposição especial resulta do fato de que os polipeptídicos podem se dobrar em estruturas que se repetem. Neste nível de estrutura encontram-se arranjos regulares chamados de -hélice e folha- conforme ilustrado na Figura 8, e outros arranjos não regulares (GRIFFITHS, MILLER, JSUZIKI, 2001; MOTTA, 2004; ALBERTS, BRAY, LEWIS, 1997). As estruturas secundárias mais comuns são as hélices e os planos apresentados a seguir. Figura 8. Exemplo de Estrutura Secundária. Fonte: Adaptado de Horton, Moram, Ochs (1995). 17 -hélice Na estrutura -hélice, ilustrada na Figura 9, a molécula polipeptídica apresenta-se como uma hélice orientada para a direita como se estivesse em torno de um cilindro, mantida por pontes de hidrogênio arranjadas entre os grupos C=O e o H-N das ligações peptídicas. Cada volta da hélice corresponde a 3,6 resíduos de aminoácidos (MOTTA, 2004). Uma -hélice pode ser composta pelos aminoácidos Alanina (Ala), Leucina (Leu) e pelo ácido glutâmico (Glu). A presença dos aminoácidos prolina e hidroxiprolina, cujas estruturas cíclicas relativamente rígidas não se encaixam à hélice (Figura 9), forçam a cadeia a dobrar-se rompendo a estrutura secundária regular. Esse dois aminoácidos, também como a glicina, favorecem a formações de conformação folha- . Seqüências polipeptídicas com grande número de aminoácidos com carga e grupos R volumosos são incompatíveis com a estrutura helicoidal pelos efeitos provocados por suas cadeias laterais (ibidem). Figura 9. Estrutura Secundária -hélice Fonte: Adaptado de Alberts, Bray, Lewis (1997). folhaA estrutura de folha- resulta da formação de pontes de hidrogênio entre duas ou mais cadeias polipeptídicas adjacentes. As pontes de hidrogênio ocorrem entre os grupos C=0 e N-H de ligações peptídicas pertencentes a cadeias polipeptídicas vizinhas em vez de no interior da cadeia. 18 Diferentemente das -hélices, as cadeias polipeptídicas da folha- estão quase inteiramente estendidas, como pode ser observado na Figura 10 (MOTTA, 2004). Uma folha- pode ser composta pelos aminoácidos Valina (Val), Isoleucina (Ile), Cisteína (Cys) e pelo aminoácido Fenilalanina (Phe). Figura 10. Estrutura Secundária FolhaFonte: Adaptado de Alberts, Bray, Lewis (1997). Laço (Turn) Os laços, ilustrados na Figura 11, são o terceiro tipo das estruturas secundárias clássicas, e são responsáveis pela reversão da direção da cadeia polipeptídica. Eles são localizados na superfície polar da proteína, e contêm resíduos com carga (QMCWEB, 2004). Os laços podem ser compostos pelos aminoácidos Glicina (Gli), Aspartato (Asp) e pelo aminoácido Prolina (Pro). 19 Figura 11. Estrutura Secundária Laço (Turn). Fonte: Adaptado de Horton, Moram, Ochs (1995). As -hélices e as folhas- são classificadas como estruturas secundárias regulares, pois seus componentes exibem conformações estruturais periódicas. Dependendo da natureza das cadeias laterais dos aminoácidos presentes, as -hélices e as folhas- podem apresentar-se levemente distorcidas em sua conformação específica. Muitas proteínas apresentam combinações de estruturas -hélice e folha- em proporções variadas. As combinações produzem vários arranjos denominados de estruturas supersecundárias ou motivos. Alguns exemplos destas formações podem ser observados na Figura 12, os quais são: unidade , grampo , meandro; chave grega; sanduíche. Figura 12. Exemplo de Estrutura Supersecundárias. (a) Motivo ; (b) Motivo Grampo ; (c) Motivo Meandro; (d) Motivo Chave grega; (e) Motivo Sanduíche. Fonte: Motta (2004). 20 2.1.7.1.3. Estrutura Terciária A maneira pela qual a cadeia polipeptídica encurva-se ou dobra-se em três dimensões, formando a estrutura compacta firmemente enovelada das proteínas globulares é chamada estrutura terciária (GRIFFITHS, MILLER, JSUZIKI, 2001; MOTTA, 2004; ALBERTS, BRAY, LEWIS, 1997). A Figura 13 ilustra um exemplo de estrutura terciária de uma proteína. Figura 13. Estrutura terciária Fonte: Adaptado de Horton, Moram, Ochs (1995). Por existir apenas um número limitado de maneiras de se combinar -hélices e folhas- , certas combinações destes elementos ocorrem repetidamente no centro de muitas proteínas nãorelacionadas. Várias combinações de motivos formam um domínio protéico, que é tipicamente uma estrutura compacta, cuja superfície é coberta por alças salientes e tem um formato irregular, geralmente formando sítios de ligação para outras moléculas (LODISH, BERK, ZIPURSKY, 1999; ALBERTS, BRAY, LEWIS, 1997). Um domínio protéico geralmente contém de 40 a 350 aminoácidos e leva a crer que são as unidades modulares, a partir das quais as proteínas são constituídas. Embora pequenas proteínas possam conter apenas um domínio, a maioria possui de 2 a 4 domínios, que são geralmente conectados por regiões de cadeia polipeptídica sem função específica (ibidem). 21 2.1.7.1.4. Estrutura Quaternária Geralmente, duas ou mais cadeias polipeptídicas dobradas se ligam para formar uma estrutura quaternária (GRIFFITHS, MILLER, JSUZIKI, 2001; MOTTA, 2004; ALBERTS, BRAY, LEWIS, 1997). Um exemplo de estrutura quaternária pode ser visto na Figura 14. Figura 14. Estrutura quaternária Fonte: Adaptado de Horton, Moram, Ochs (1995). 2.1.7.2. Funções das Proteínas Segundo BIOMANIA (2002) e Farah (1997), as proteínas podem ser classificadas de acordo com a sua função no organismo, tais como: • Função Estrutural - As proteínas estruturais participam como matéria-prima na construção de estruturas celulares. • Função Hormonal - Muitos hormônios são, na verdade, proteínas especializadas na função de estimular ou inibir a atividade de determinados órgãos. 22 • Função de Defesa - No sistema imunológico do ser humano, existem células especializadas na identificação de proteínas presentes nos organismos invasores, que serão consideradas "estranhas". Estas proteínas invasoras denominam-se antígenos e estimulam o organismo a produzir outras proteínas especializadas no combate às invasoras. Estas proteínas de defesa são denominadas anticorpos e combinam-se quimicamente aos antígenos com o objetivo de neutralizá-los. Deve-se salientar o fato de que existe uma determinada especificidade entre antígeno e anticorpo. Ou seja, um anticorpo só neutralizará o antígeno que estimulou a formação desse anticorpo. Os anticorpos são produzidos em células especializadas do sistema imunológico denominadas plasmócitos. • Função Nutritiva - Todos os alimentos ricos em proteína, como as carnes em geral, são fontes naturais de aminoácidos indispensáveis aos seres vivos para a produção de outras proteínas. • Função Reguladora - Esta função é desempenhada por um grupo especial de proteínas denominadas vitaminas. As células dos vegetais clorofilados e certos microrganismos, como bactérias, possuem a capacidade de produzirem vitaminas. Nos animais se dá através do processo de nutrição. Cada vitamina tem um papel biológico próprio, por isso não pode ser substituída por outra. A carência de uma determinada vitamina faz surgir um quadro de distúrbios orgânicos denominado hipovitaminose. O excesso de vitaminas pode acarretar uma hipervitaminose. As vitaminas são classificadas de acordo com a sua solubilidade em água ou em lipídios. Existem as vitaminas hidrossolúveis, como as do complexo B (B1, B2, B6 e B12) e a vitamina C. As lipossolúveis são as vitaminas A, D, E, K. • Função Enzimática - As enzimas são proteínas especiais com função catalítica, ou seja, aceleram reações bioquímicas que ocorrem nas células. Assim como os anticorpos, apresentam especificidade em relação à reação ou substância em que atuam. Isso se deve ao fato de cada enzima possuir em sua estrutura um ou mais pontos que se encaixam perfeitamente no seu substrato que sofrerá sua ação. 23 • Coagulação sangüínea - vários são os fatores da coagulação que possuem natureza protéica. • Transporte - pode-se citar como exemplo a hemoglobina, proteína responsável pelo transporte de oxigênio no sangue (BIOMANIA, 2002). 2.1.7.3. Bancos de Dados Biológicos Os bancos de dados envolvendo seqüências de nucleotídeos, de aminoácidos ou estruturas de proteínas podem ser classificados em bancos de seqüências primários e secundários (BIOESFERA, 2001). 2.1.7.3.1. Banco de Dados Primários Os bancos de dados primários são formados pela deposição direta de seqüências de nucleotídeos, aminoácidos ou estruturas protéicas, sem qualquer processamento ou análise. Os principais bancos de dados primários são o GenBank, o EBI (European Bioinformatics Institute), o DDBJ (DNA Data Bank of Japan) e o PDB (Protein Data Bank). Atualmente a maioria das revistas científicas exige que as seqüências identificadas pelos laboratórios sejam submetidas a um destes bancos antes mesmo da publicação do artigo (PROSDOCIMI, CERQUEIRA, BINNECK, 2004). 2.1.7.3.2. Banco de Dados Secundários Os bancos de dados secundários são aqueles que derivam dos primários, ou seja, são formados usando as informações depositadas nos bancos primários. Por exemplo, o Swiss-Prot é um dos principais bancos de dados sobre proteínas, onde as informações sobre seqüências de proteínas foram anotadas e associadas a informações sobre função, domínios funcionais, proteínas homólogas e outros (PROSDOCIMI, CERQUEIRA, BINNECK, 2004). Outro exemplo de banco de dados secundário é o PRODOM, que é um banco de dados de proteínas e consiste de uma compilação automática de domínios homólogos (PRODOM, 2004). 24 O Swiss-Prot foi criado em 1986 pelo Departamento de Bioquímica Médica da Universidade de Genebra e EMBL. Atualmente é mantido pelo Swiss Institute of Bioinformatics (SIB) e EBI/EMBL. Este banco mantém um alto nível de anotações, como a descrição e a função da proteína, estrutura dos seus domínios, modificações pós-tradução, além de ter uma estrutura que facilita o acesso computacional a diferentes campos de informações. TrEMBL é um suplemento do Swiss-Prot que contém todas as traduções das entradas de seqüências de nucleotídeos do EMBL, ainda integradas ao Swiss-Prot (SWISS-PROT, 2004). O PROSITE foi o primeiro banco de estruturas a ser desenvolvido e é mantido atualmente pelo Swiss Institute of Bioinformatics. É baseado na filosofia de que famílias de proteínas podem ser agrupadas através de motivos, o que pode ser obtido através do alinhamento múltiplo de seqüências já conhecidas. Esses motivos geralmente estão associados à sua função biológica. No PROSITE, os motivos são codificados como expressões regulares ou "padrões". O processo usado para obter estes padrões envolve a construção de alinhamentos múltiplos e a inspeção manual para a identificação de regiões conservadas. A informação assim obtida é transformada em expressões de consenso e o resultado é usado como dados de entradas para buscas no Swiss-Prot (LBMP, 2004). Um exemplo do uso desse banco de dados pode ser visto na Figura 15. 25 Figura 15. Sistema de busca no banco de dados PROSITE. Como resultado da busca tem-se a Figura 16, que ilustra os motivos encontrados na proteína 3MG_HUMAN. 26 Figura 16. Resultados obtidos pela busca no banco de dados PROSITE. 2.2. PROTEÔMICA Apenas um número pequeno de proteínas possui sua função bem caracterizada e, devido a isso, os anotadores de seqüências geralmente classificam-nas em grupos ou famílias a partir de similaridades encontradas com proteínas de outras espécies, sendo essa uma rica fonte para a anotação funcional. É bom lembrar, entretanto, que devido à forma como a evolução acontece, nem sempre proteínas da mesma família possuem funções similares (ALBERTS, BRAY, LEWIS, 1997). Apesar do fato de várias técnicas recentes terem sido desenvolvidas para identificar automaticamente as proteínas pertencentes a diferentes grupos ortólogos (proteínas com a mesma função em diferentes organismos), muitas delas podem ter classificações ambíguas. Na prática, o que é normalmente feito é a classificação das proteínas preditas com base em domínios funcionais, configurações espaciais e presença de padrões conservados, além de pesquisa ampla de similaridade e identidade contra proteínas bem caracterizadas. 27 O desenvolvimento de técnicas para o seqüênciamento de moléculas de DNA permitiu determinar seqüências de aminoácidos de milhares de proteínas a partir da seqüência de nucleotídeos de seus genes. Bancos de dados de proteínas estão disponíveis para pesquisa de possíveis seqüências homólogas entre proteínas “recém-seqüenciadas” e outras previamente estudadas com estrutura e funções definidas. Como resultado dessa pesquisa é comum encontrar uma proteína recém-seqüenciada que é homóloga a uma parte de outra proteína, indicando que a maioria das proteínas devem descender de ancestrais comuns. O campo de análises de seqüências tornou-se importante, pois a seqüência da biomolécula, DNA ou proteína, possui grande quantidade de informação sobre sua função e história (LOURENÇO, 2004). A comparação de seqüências biológicas é baseada no critério de evolução. Quando seqüências são comparadas ou alinhadas, algumas vezes duas ou mais seqüências mostram-se similares. Essa similaridade pode ser devida a uma homologia (implica ancestral comum) ou apenas acaso, sem que as seqüências tenham tido uma origem comum. Comparações entre proteínas são importantes porque estruturas relacionadas geralmente implicam funções relacionadas. Anos de pesquisa podem ser poupados pelo descobrimento de uma seqüência de aminoácidos homóloga a uma proteína de função conhecida. 2.2.1.1. Ferramentas para Proteômica Segundo EXPASY (2006) em 2006 existiam cerca de 230.000 estruturas de proteínas disponíveis no banco de dados Swiss-Prot, e este número está aumentando a cada ano. Uma maneira simples e rápida de acessar toda a informação contida nos bancos de dados de proteínas é fundamental para trabalhar com esse enorme volume de dados estruturais. O EMBOSS (European Molecular Biology Open Software Suíte) é um conjunto de programas com ferramentas para a visualização e análise estrutural de proteínas. Através de um dos seus diversos módulos disponíveis é possível determinar a estrutura secundária de uma proteína. Esse módulo é chamado de Garnier, que utiliza como parâmetros de entrada a seqüência da proteína a ser analisada (EMBOSS, 2004). O ExPASy (EXpert Protein Analysis System) é um servidor de ferramentas para proteômica e é dedicado à análise de seqüências e estruturas de proteínas, disponibilizando bancos de dados, ferramentas computacionais, cursos e serviços educacionais, documentações, hiperlinks diversos e 28 ferramentas de busca em diversos bancos de dados, dentre eles o Swiss-Prot e o PROSITE, os quais que serão utilizados nesse trabalho (EXPASY, 2004). O Pfam Search Engine é uma ferramenta de busca de domínios de proteínas nos mais respeitados bancos de dados, tais como o Prosite, Swiss-Prot e o Protein Data Bank. A busca se dá através do número do registro. As Figuras 16 a 19 mostram o acesso a essa ferramenta em busca de domínios da proteína com nome de registro 3MG_HUMAN. Figura 16. Página inicial do sistema de busca de domínios PFam. 29 Após preenchimento dos campos necessários e executar a busca, o sistema apresenta uma tela de resultados como a da Figura 17. Figura 17. Resultados obtidos pelo sistema de busca de domínios PFam. A Figura 17 mostra os dois domínios encontrados na proteína 3MG_HUMAN representados por barras horizontais com padrões distintos. 30 2.3. TECNOLOGIA APLICADA Esta seção descreve as tecnologias a serem utilizadas para desenvolvimento do sistema proposto. 2.3.1. PROCESSAMENTO PARALELO E DISTRIBUÍDO Quando se avalia o custo de micros pessoais PC, encontra-se ótima relação preço/performance. Porém, quando se coloca uma máquina, independente para cada usuário, tem-se a dificuldade de compartilhar os dados. Além da comunicação necessária entre os usuários, é desejável o compartilhamento de recursos oferecidos por cada máquina. Este compartilhamento é possível se as máquinas estiverem interligadas em rede. Assim um sistema distribuído pode ser implementado com computadores pessoais ligados em rede a servidores, os quais executariam os processos mais pesados de forma distribuída (LaCPaD, 2006). Segundo Buyya (1999), “a principal razão para a criação e o uso de computadores paralelos é que o paralelismo é uma das melhores formas de resolver o problema de gargalo de processamento em sistemas de um único processador”. A relação preço/performance de um pequeno sistema de processamento distribuído em rede é muito melhor se comparado com um minicomputador. O grande objetivo do processamento paralelo/distribuído é aumentar o desempenho de aplicações que necessitam de grande poder computacional e que são pouco eficientes quando executadas seqüencialmente. Para tanto, o aumento de desempenho é obtido particionando-se uma tarefa em tarefas menores e executando-as em diferentes processadores, paralelamente. Um conjunto de processadores interconectados é a definição mais simples de um ambiente paralelo/distribuído (LaCPaD, 2006). Vários fatores explicam a necessidade do processamento paralelo. O principal deles trata-se da busca por maior desempenho. As diversas áreas nas quais a computação se aplica, sejam científicas, industriais ou militares, requerem cada vez mais poder computacional, em virtude dos 31 algoritmos complexos que são utilizados, do tamanho do conjunto de dados a ser processado, ou a existência de algum tipo de “gargalo” (Kirner apud SANTANA, SOUZA, PIEKARSKI, 1997). Os sistemas com vários processadores podem ser classificados em função do grau de integração e acoplamento dos seus componentes: Multiprocessadores que possuem espaço de endereçamento compartilhado por um pequeno número de processadores; Multicomputadores, onde cada processador possui sua própria memória privativa e canais de comunicação ligados através de redes compostas por múltiplos canais bipontuais e Redes de computadores que são formadas por computadores independentes interconectados através de redes entendidas como canais de comunicação compartilhados (LaCPaD, 2006). Aplicações paralelas/distribuídas tem como propósito a execução de uma tarefa em comum possibilitando o aumento do desempenho. Para a execução de um tarefa em comum, a cooperação entre processos que compõe um programa paralelo é essencial. Basicamente, a comunicação entre processos pode ser feita de duas formas: através da troca de mensagens e/ou através de memória compartilhada. Na comunicação entre processos através de memória compartilhada, os processos compartilham uma área de memória comum onde dados podem ser lidos e escritos por processos em execução. Existem mecanismos de sincronização para controlar o acesso a um mesmo dado na memória. Na comunicação através de troca de mensagens, os processos não compartilham memória, a troca de dados é feita através de mensagens. Esta troca pode ser síncrona (o processo emissor é bloqueado até que o receptor aceite a mensagem) ou assíncrona (o processo emissor continua sua execução, independente do receptor aceitar a mensagem) (ibidem). A forma mais elementar de interação entre processos baseada em troca de mensagens é a comunicação ponto a ponto, onde um processo origem envia uma mensagem para um processo destino. Entretanto, por questões de desempenho e até facilidade de programação, muitas aplicações paralelas/distribuídas tem como requisito um sistema de passagem de mensagens que suporte comunicação em grupo. Por exemplo, considere um grupo de servidores de arquivos que tem como tarefa comum oferecer um serviço de arquivos tolerante a falhas. Neste caso, espera-se que as requisições de serviço emitidas por clientes sejam recebidas por todos os servidores de arquivos. Assim, mesmo que um servidor de arquivos não possa atender outros poderão atender o pedido. Para que isso seja possível é necessário que exista um mecanismo de comunicação alternativo, 32 diferente da comunicação envolvendo apenas dois processos, onde é possível a recepção de uma mesma mensagem por vários recebedores. Outro conceito importante é o balanceamento de carga (Load Balancing). A distribuição das tarefas entre os computadores deve ser realizada de forma que o tempo da execução distribuída seja eficiente. Se as tarefas não forem bem distribuídas, é possível que ocorra a espera pelo término do processamento de uma única tarefa por todo o sistema (JACINTO, 2006). Em relação ao presente trabalho, o uso de processamento distribuído é justificável pela existência de um “gargalo”, que é o acesso à web já que o volume de dados a ser recuperado é muito grande. Assim, esse volume pode ser distribuído em diversas estações de trabalho que retornariam os dados recuperados para uma única estação. Por exemplo: existe a necessidade de se buscar informações sobre “p” proteínas, a estação do usuário solicitaria a outras “n” estações que cada uma delas recupere dados sobre “p/n” proteínas e envie-os para a estação solicitante, desta forma o tempo necessário para a busca é reduzido significativamente. 2.3.2. BANCO DE DADOS Por se tratar de um sistema onde há a necessidade de armazenamento em um banco de dados nos quais os dados são organizados em um conjunto de tabelas inter-relacionadas. São dois os principais tipos de banco de dados a serem utilizados nesse trabalho: servidores de bancos de dados remotos e sistema com banco de dados local (CARVALHO, 2001). Os servidores remotos tipicamente ficam instalados em uma ou mais máquinas separadas, e são capazes de atender a múltiplos clientes conectados a ele simultaneamente. Podem armazenar grandes volumes de dados e possuem recursos de administração e segurança que nos sistemas locais são mais simplificados ou até mesmo inexistentes. São também chamados de servidores SQL, pois todos oferecem como forma de acesso e manipulação de dados, uma interface baseada na Structured Query Language. Um servidor remoto pode ser instalado numa rede local ou numa rede de longa distância. As partes que compõe um servidor SQL e os clientes comunicam-se entre si por meio de mensagens (ibidem). 33 Os sistemas locais de banco de dados ficam tipicamente instalados no mesmo computador em que a aplicação é executada. Podem, às vezes, ser instalados numa rede local e também admitem o acesso a múltiplos clientes simultaneamente, usando, nesse caso, recursos do próprio sistema de arquivos para o controle de eventuais conflitos entre as operações dos clientes. Em relação os presente trabalho, foi escolhido como banco de dados o MySQL, por se tratar de um banco de dados, gratuito, robusto, de fácil instalação e configuração. Existem várias formas de se acessar o MySQL, sendo a mais comum através da linguagem SQL, que foi definida como a forma de acesso a banco de dados neste trabalho. 2.3.3. ACESSO A BANCO DE DADOS BIOLÓGICOS O acesso aos principais bancos de dados biológicos na internet se dá através de sistemas de busca construídos e mantidos pelos próprios bancos de dados. Esses sistemas de busca são constituídos basicamente de um formulário onde o usuário preenche os campos necessários com dados do seu interesse, feito isso, o sistema retorna ao usuário uma página web com os dados resultantes da busca. A Figura 18 retrata o acesso ao banco de dados Swiss-Prot onde o usuário realiza a busca pela palavra-chave “kinase”. Na Figura 19 é ilustrado resultado de tal busca. 34 Figura 18. Sistema de busca no banco de dados Swiss-Prot. Figura 19. Tela de resultados obtidos pelo Sistema de busca no banco de dados Swiss-Prot. 35 Embora os principais bancos de dados biológicos permitam o acesso aos seus dados via formulários, alguns disponibilizam o acesso direto por meio de URLs. Esse tipo de acesso é ideal para ser utilizado em ferramentas que necessitam desses dados. Em bom exemplo de um banco de dados que dispõe de tal recurso é o Unitprot, que também permite a escolha do formato dos dados. O formato de arquivo escolhido foi o formato Flat. Os registros de uma proteína em formato Flat são estruturados de modo que sua leitura de utilização possa ser feita tanto por pessoas ou quanto por programas de computador. Cada registro é composto por linhas. Diferentes tipos de linhas, cada uma com seu próprio formato são usados para armazenar dados pertinentes a um registro. A Figura 20 mostra a estrutura de um arquivo Flat. Figura 20. Tela de resultados obtidos pelo acesso direto as informações do UniProt. 36 Cada linha em um arquivo no formato Flat começa por dois caracteres que identificam o tipo de registro armazenado nessa linha, podendo ser dos seguintes tipos: • Linha ID (IDentification): Essa sempre é a primeira linha do registro, pois é a responsável identificar a proteína. Contém os seguinte itens: nome do registro, classe do registro, tipo de molécula e tamanho da seqüência; • Linha AC (ACcession number): Contém os números de acesso a essa proteína, pode contem mais que um registro separados por “;”; • Linha DT (DaTe): Contém informações sobre as datas de criação do registro e sua última modificação. As datas são representados no formato dia-mês-ano; • Linha DE (DEscription): Contém a descrição sobre a proteína do registro, geralmente é suficiente para identificar o registro; • Linha GE (Gene Names): Contém os nomes dos genes codificados na seqüência da proteína. Pode conter nomes e sinônimos para o gene; • Linha OS (Organism Species): Contém informações a respeito do organismo que foi ou é a origem do registro. Possui nome científico do organismo e pode conter o nome vulgar do mesmo; • Linha OG (OrGanelle): Contém informações a respeito da origem do gene que codificou a proteína. Pode e geralmente contém mais que um registro; • Linha OC (Organism Classification): Contém as classificações taxonômicas do organismo fonte da proteína. Pode e geralmente contém mais que um registro; • Linha OX (Organism taxonomy cross-reference): É usada para indicar o identificador do organismo especifico em uma base de dados taxonômica. Contém o nome da base de dados e o(s) identificador(es); • Linhas de Referencia RN, RP, RC, RX, RG, RA, RT, RL: Contém informações sobre publicações a respeito do registro; • Linhas CC: São utilizadas para armazenas informações úteis sobre o registro, função, similiaridade e descrição de domínios; • Linha DR (Database cross-Reference): Contém identificadores desse registro em outras bases de dados. Pode conter identificadores primários, secundários e terciários; e 37 • Linha SQ (SeQuence header): Essa linha marca o início dos dados sobre a seqüência da proteína do registro, contém em seu cabeçalho, o tamanho e peso molecular aproximado. 2.3.4. LINGUAGEM DE PROGRAMAÇÃO DELPHI Neste projeto é desenvolvido um sistema que necessita das tecnologias já apresentadas. Sendo assim, é importante escolher uma ferramenta de desenvolvimento que permita o uso de todas elas de forma facilitada. Para a implementação deste trabalho foi escolhida a ferramenta Delphi 7.0, que dispõe de vários tipos de componentes que serão úteis para o desenvolvimento da aplicação. Em relação ao desenvolvimento dessa ferramenta, o Delphi dispõe de todos os recursos necessários para tal, já que disponibiliza acesso a web, acesso a banco de dados, permite desenvolvimento voltado para web, dentre outras utilidades, como a criação de aplicativos multithread e que se comuniquem através de sockets, possibilitando o processamento paralelo e distribuído. Possui também componentes que permitem o acesso e manipulação fácil de bancos de dados. Após o levantamento das tecnologias a serem aplicadas nesse trabalho, a ferramenta escolhida e utilizada para desenvolvimento foi o Delphi por ser enquadrar no perfil desejado. O Delphi 7.0 já dispõe alguns componentes que foram utilizados no desenvolvimento do trabalho são eles: • IdAntiFreeze: Um dos grandes problemas no uso de TCP em Delphi é o congelamento (Freeze) da aplicação em diversos momentos: na conexão, desconexão, entre outros, invariavelmente. A biblioteca Indy traz um componente que trata especificamente desse problema: IdAntiFreeze. Sua principal função é priorizar as tarefas da aplicação, evitando o efeito freeze; • IdTcpServer: Servidor responsável por receber as conexões de clientes (IdTcpClient), pode receber e enviar dados a clientes conectados a ele; • IdTcpClient: Responsável por estabelecer a conexão com servidor (IdTcpServer), pode enviar e receber dados de servidor a qual estão conectado; 38 • IdThreadMgr: Componente que quando associado ao IdTcpServer, cria uma thread para cada nova conexão efetuada; e • Timer: Tem a função de repetir uma determinada ação de tempo em tempo. Além de componentes já disponibilizados pelo Delphi outros são necessários: • IEHttp3: Componente que recebe uma URL como parâmetro e salva o seu conteúdo do documento referenciado por essa URL em um StringList; • SUIPack: Suíte de componentes de interface; • HtmlParser: Classe que divide um documento HTML em tag’s da linguagem HTML e objetos de texto; e • TextFormatter: Classe que elimina os tag’s de documentos gerados pelo HtmlParser, restando somente os objetos de texto. 39 3. DESENVOLVIMENTO 3.1. INTRODUÇÃO Neste capítulo são apresentadas as etapas do desenvolvimento deste trabalho, como a modelagem, projeto, e aspectos importantes da implementação, incluíndo as características do sistema. 3.2. MODELAGEM O Sistema de Busca e Estruturação de Dados de Proteínas, também chamada de aplicação principal, é uma ferramenta que foi desenvolvida para a criação de um banco de dados com informações de proteínas selecionadas pelo usuário. Informações essas que podem ser retiradas de bancos de dados públicos ou através de ferramentas de proteômica já desenvolvidas. Para a coleta das informações necessárias é utilizada a ferramenta de proteômica (Emboss) e são acessados os seguintes banco de dados protéicos: • Swiss-Prot: Fonte de informações básicas sobre proteínas; • Prosite: Fonte de informações sobre motivos de proteínas; e • PFam: Fonte de dados sobre domínios de proteínas. O desenvolvimento do sistema iniciou-se a partir de métodos de acesso a banco de dados públicos, através de uma URL padrão para cada banco de dados. A partir desse momento foi dado início ao desenvolvimento da aplicação escrava que auxiliará a principal na busca pelas informações. O principal motivo para a o desenvolvimento dessa aplicação é o aumento de desempenho na busca por informações de proteínas. 40 Essa aplicação Escrava de Busca por Proteínas deve ser executada em computadores conectados na mesma rede em que o computador da aplicação principal. Para que essa aplicação entre em funcionamento basta que ela seja executada. As aplicações foram desenvolvidas em uma estrutura cliente-servidor, onde a aplicação principal possuiu a tarefa de controlar as aplicações escravas que estão conectadas a ela. A partir do momento que o usuário executa a aplicação principal e escolhe o método de inclusão de escravos (manual ou automática) uma porta TCP é aberta, aguardando a conexão de novos escravos. À medida que os escravos vão conectando-se, é exibida uma lista de quais estão ativos na rede. Caso a aplicação principal tenha apenas o acesso a internet, e não esteja conectada a uma rede de computadores, basta que o Escravo de Busca por Proteínas seja executado juntamente com a aplicação principal. O Escravo de Busca por Proteínas possui informações como: endereço IP local, lista de proteínas solicitadas, status da busca, nome do computador que solicitou a busca e um log de comunicação. A modelagem do sistema pretende mostrar os aspectos lógicos e de projeto do sistema em estudo, não levando em consideração o produto final. A modelagem do presente projeto deu-se através da metodologia de orientação a objetos, utilizando-se a UML como meio de representação. Após estudo dos diagramas disponíveis pela UML foram considerados utilizáveis os diagramas de Casos de Uso, Diagrama de Classes, Diagrama de Seqüências e Diagrama de Entidades e Relacionamentos. 3.2.1. Casos de Uso Um Caso de Uso descreve uma seqüência de ações que representam um cenário principal e cenários alternativos com o objetivo de demonstrar o comportamento de um sistema (ou parte dele), através de interações com atores (MELO, 2004). Como referência ao projeto atual, tem-se a necessidade de descrever os seguintes casos de uso: login no sistema, busca e visualização de proteínas e gravação de dados. A Tabela 3 descreve as seqüências de ações com a interação do usuário, em um cenário em que o ator (usuário) faz o login no sistema (aplicação principal), a representação gráfica é ilustrada na Figura 21. 41 Tabela 3. Descrição do Caso de Uso Login no Sistema. Objetivo Permitir que o usuário tenha acesso aos recursos oferecidos pelo mesmo. Ator Usuário Cenário Principal 1. O usuário digita o seu login e sua senha de acesso. 2. O usuário clica no botão “Login” e aguarda a liberação do acesso. Cenários Alternativos 1a. Caso seja a primeira vez que o usuário acesse o sistema é necessário o preenchimento de um cadastro com alguns dados pessoais. 1b. Caso a senha ou o nome do usuário estejam incorretos o sistema retorna a tela de login, solicitando ao usuário que preencha novamente os campos necessários. Figura 21. Diagrama do Caso de Uso Login no Sistema. A Tabela 4 descreve as seqüências de ações com a interação do usuário, em um cenário em que o ator (usuário) faz a escolha do modo com que sistema tratará os servidores da rede, podendo ser por inserção manual ou automática. 42 Tabela 4. Descrição do Caso de Uso Inclusão de Novo Escravo Objetivo Optar por inserção manual ou busca automática por servidores na rede Ator Usuário Cenário Principal 1. O usuário informa o endereço IP do servidor e clica no botão incluir. 2. O usuário opta por uma busca automática de servidores na rede. Cenários Alternativos 1a. O usuário informa o endereço IP do servidor e clica no botão incluir. 1b. O sistema solicita uma confirmação de atividade para o servidor. 1c. Caso o sistema receba a mensagem de confirmação, o servidor será incluído na lista de ativos. Caso contrário o servidor é considerado inativo. A Figura 22 ilustra o Caso de Uso Inclusão de Novo Escravo. Figura 22. Diagrama do Caso de Uso Servidores na Rede. 43 A Tabela 4 descreve as seqüências de ações com a interação do usuário, em um cenário em que o ator (usuário) faz a busca de proteínas. Tabela 4. Descrição do Caso de Uso Solicitação de Informação. Objetivo Realiza a buscar por informações sobre proteínas em banco de dados a partir de argumentos de busca escolhidos pelo usuário. Ator Usuário Cenário Principal 3. O usuário informa os argumentos que lhe interessam para a busca de proteínas. 4. O usuário clica no botão prosseguir e aguarda que a busca seja concluída. 5. O sistema informa ao usuário uma lista de proteína com uma breve descrição. Cenários Alternativos 1. Caso as proteínas que o sistema retornou ao usuário não sejam de interesse do usuário o mesmo pode voltar a tela anterior e realizar uma nova busca. A Tabela 5 descreve as seqüências de ações com a interação do usuário, em um cenário em que o ator (usuário) faz a visualização de proteínas. Tabela 5. Descrição do Caso de Uso Visualizar Proteínas. Objetivo Permite que o usuário visualize as proteínas contidas no seu banco de dados local. Ator Usuário Cenário Principal 1. O usuário informa quais proteínas ele deseja visualizar e clica em mostrar proteínas. 2. O sistema retorna as informações sobre as proteínas selecionadas. 44 A Tabela 6 descreve as seqüências de ações com a interação do usuário, em um cenário em que o ator (usuário) faz a gravação dos dados obtidos com a busca de proteínas. Tabela 6. Descrição do Caso de Uso Gravar Dados. Objetivo Permite que o usuário grave os dados obtidos pela busca de informações sobre proteínas. Ator Usuário Cenário Principal 1. O sistema dá a opção ao usuário de gravar ou não os dados obtidos pela busca. 2. O usuário clica no botão gravar e aguarda a confirmação do sistema. Cenários Alternativos 2a. Caso não seja de interesse do usuário gravar os dados obtidos ele pode cancelar a gravar e fazer uma nova busca. O diagrama dos casos de uso Solicitação de Informação, Visualizar Proteínas e Gravar Dados está exposto na Figura 23. Busca e Visualização Buscar Proteínas «extend» Selecionar Proteínas «extend» Usuário Visualizar Proteínas «extend» Grav ar Dados Figura 23. Diagrama do Caso de Uso Buscar, Visualizar Proteínas e Gravar Dados 45 3.2.2. Diagrama de Classes Por se tratar de um sistema a ser desenvolvido orientado a objetos, faz-se necessário a criação de um diagrama onde são detalhadas as classes e seus relacionamentos. Nesse diagrama também são visíveis outros elementos como interface e pacotes. Para a criação dos modelos e diagrama foi utilizada a ferramenta CASE Enterprise Architect 4.1. Na Figura 24 é apresentado o diagrama de classes da aplicação principal contendo as classes e seus relacionamentos. Figura 24. Diagrama de classes Aplicação Principal Na Figura 25 é apresentado o diagrama de classes da aplicação escrava contendo as classes e seus relacionamentos. 46 Figura 25. Diagrama de classes Aplicação Escrava 3.2.3. Diagrama de Seqüências Um Diagrama de Seqüências enfatiza o comportamento dos objetos em um sistema incluindo suas operações, interações, colaborações e histórias de estado em seqüência temporal de mensagem e representação explícita de ativação de operações. Os objetos são desenhados como linhas verticais, as mensagens como linhas horizontais, a seqüência de mensagens é lida de cima para baixo (MELO, 2004). No Diagrama de Seqüências para o caso de uso Inclusão de Novo Escravo, onde o usuário opta por incluir manualmente um novo escravo a partir de seu endereço IP a aplicação principal após a solicitação de inclusão, envia uma mensagem do tipo “1” (solicitação de conexão) para o endereço IP informado. Uma vez recebida uma mensagem do tipo “1”, a aplicação escrava efetua uma conexão com a aplicação solicitante. 47 A Figura 26 ilustra o diagrama de seqüências para o Caso de Uso Inclusão de Novo Escravo. Figura 26. Diagrama de Seqüência Inclusão Manual de Escravo. No diagrama de seqüências do caso de uso Solicitação de Informação, onde o usuário realiza a busca por informação a aplicação principal envia uma mensagem do tipo “3” a aplicação escrava informando o nome de registro da proteína a ser buscada. Uma vez recebida uma mensagem do tipo “3”, a aplicação escrava inicia a busca por informações e em seguida as envia a aplicação principal como uma mensagem do tipo “4”, e aguarda a confirmação de recebimento da mesma. Mensagens do tipo “4” ao serem recebidas pela aplicação principal geram automaticamente uma mensagem de confirmação de recebimento de registros, tipo “5”, que quando recebida pela aplicação escrava, encerra a busca por essa proteína. A Figura 27 ilustra um diagrama de seqüências para o caso de uso Solicitação de Informações. 48 Figura 27. Diagrama de Seqüência Solicitação de Informações 3.2.4. Diagrama de Entidades e Relacionamentos Para o armazenamento das informações recuperadas pelo usuário, será necessária a criação de um banco de dados onde as informações serão armazenados em diferentes tabelas de acordo com a sua estruturação. O banco de dados escolhido é o MySQL. O modelo lógico do banco de dados modelado pode ser visto no diagrama de entidades e relacionamento ilustrado na Figura 28. 49 Figura 28. Modelo de entidades e relacionamentos. O dicionário de dados, onde estão os atributos existentes em suas respectivas tabelas (entidades), com o indicador para chave primária (PK) e chave estrangeira (FK) e o tipo de dado, pode ser visto no Apêndice A. 3.3. PROJETO Nessa seção são apresentadas algumas funcionalidades que foram desenvolvidas para facilitar a interação entre o sistema e o usuário. O sistema será apresentado a seguir onde serão descritas suas principais características e funcionalidades. 50 3.3.1. Janela de Login Na janela login o usuário digita o seu nome e sua senha de acesso ao sistema. Caso o usuário ainda não esteja cadastrado deve-se clicar no botão “Novo Usuário” onde serão preenchidas algumas informações básicas sobre o mesmo. A Figura 29 apresenta a janela de login com as opções acima descritas. Figura 29. Janela de Login Na Figura 30 é apresentada a tela de cadastro de novo usuário, onde é necessário o preenchimento de nome completo, e-mail, login, senha e a confirmação da senha. 51 Figura 30. Janela Cadastro de Novo Usuário 3.3.2. Tela Informações de Escravos A Tela Informações de Escravos foi desenvolvida com o intuito de dar ao usuário a possibilidade de gerenciamento dos escravos na rede, desde a inclusão manual até a busca automática de escravos ativos na rede ao qual o sistema principal está operando. As informações de escravos já ativos e conectados no sistema são mostradas nessa tela, assim como um histórico de conexões já realizadas a partir do momento em que o sistema é executado. A tela de informações de escravos é ilustrada na Figura 31. 52 Figura 31. Tela de Informações de Escravos 3.3.3. Tela de Busca por Proteínas Uma vez feita a inclusão de escravos, o usuário tem a opção de buscar por informações de novas proteínas para inclusão em seu banco de dados. Desenvolvida com esse propósito, a Tela de Busca por Proteínas dá ao usuário um campo onde deve ser digitada uma palavra-chave a respeito de uma proteína, podendo ser o grupo protéico a que essa proteína pertença. Uma vez digitada a palavra-chave o usuário deve clicar no botão buscar, para que o sistema exiba uma lista de proteínas com o nome e uma breve descrição das mesmas. Com a lista completa o usuário deve selecionar quais proteínas devem ser buscadas pelo sistema e em seguida clicar no botão avançar. A Tela de Busca por Proteínas pode ser vista na Figura 32. 53 Figura 32. Tela de Busca por Proteínas 3.3.4. Tela de Progresso da Busca Uma vez selecionadas as proteínas para buscar e iniciada a busca, o usuário é levado à Tela de Progresso de Busca onde pode ser feito um acompanhamento da busca. O usuário tem disponível nessa tela informações como: proteínas a serem buscadas, status individual por proteína, qual escravo esta cooperando com a busca, inicio e término e tempo gasto na busca. 54 A Tela de Progresso de Busca pode ser vista na Figura 33. Figura 33. Tela de Progresso de Busca 3.3.5. Tela de Banco de Dados Protéico A Tela de Banco de Dados Protéico é divida em duas partes: Tela com Informações Básicas e Tela de Estrutura da Proteína. Na Tela de Informações Básicas são mostrados: • Nome do Registro; • Accession Number (código de acesso); • Informações sobre a origem da proteína (Gene, Sinônimos, Organismo e Taxonomia); e 55 • Descrição da Proteína com Nome, Sinônimos e Função. Na Tela de Estrutura da Proteína são mostrados: • Estrutura Primária; • Estrutura Secundária; • Motivos; e • Domínios da Proteína. A Tela de Informações Básicas pode ser vista na Figura 34. Figura 34. Tela de Informações Básicas da Proteína 56 A Figura 35 apresenta a Tela de Estrutura da Proteína. Figura 35. Tela de Estrutura da Proteína. 57 3.3.6. Tela Aplicação Escrava de Busca por Proteínas A Figura 36 mostra a única tela disponível na aplicação Escrava de Busca por Proteínas. Onde são mostrados dados sobre a proteína que está sendo buscada, nome de quem solicitou a informação e status da busca. Na mesma tela é apresentado um pequeno histórico de conexões e ações da aplicação escrava. Figura 36. Escravo de Busca por Proteínas. 3.4. IMPLEMENTAÇÃO Tanto a aplicação principal, o Sistema de Busca por Informações de Proteínas, como o Escravo de Busca por Proteínas foram desenvolvidos em Delphi 7.0. A fase de implementação foi dividida em rotinas de busca em banco de dados protéicos e uso remoto de ferramentas de proteômica, inclusão de resultados no banco de dados e comunicação entre a aplicação principal e a aplicação escrava. 58 O código fonte das principais funções e procedimentos de ambas as aplicações podem ser vistos no Anexo I e II deste mesmo documento. 3.4.1. Componentes e Funções Utilizadas Na implementação das aplicações principal e escrava, além dos componentes já citados anteriormente, foram utilizados: ClientDataSet: O componente ClientDataSet permite trazer na memória um conjunto de registros de cada vez, não importa tão grande seja o resultado da consulta. É utilizado na armazenagem dos resultados obtidos pela busca e criação da lista de proteínas a serem buscadas. Zeos: Suíte de componentes para comunicação entre o banco de dados MySQL e o Delphi. Na implementação das aplicações foram utilizadas funções já desenvolvidas por terceiros, a fim de se evitar o re-trabalho. 3.4.1.1. Função de Leitura de Arquivo .ini A função LeIni( ) faz a leitura de um arquivo .ini, atribuindo os valores lidos a variáveis do sistema. A função LeIni( ) é utilizada na inicialização do sistema, após o login do usuário. É através dela que o banco de dados do usuário é selecionado. 3.4.1.2. Função de Criação de Lista com IPs da Rede A função GetIPs quando executada retorna uma lista com os IPs dos computadores conectados a rede em que a aplicação principal está sendo executada. Na busca automática por escravos na rede é utilizada a função GetIPs para a criação da lista de IPs que serão verificados afim de se identificar os escravos ativos na rede. 59 3.4.1.3. Função de Download de Arquivos na Internet A função URLDownloadToCacheFile, desenvolvida pela Microsoft, parte componente da biblioteca UrlMon.dll efetua o download de um documento ou arquivo na internet e o armazena em cache (MICROSOFT, 2004). Essa função é amplamente utilizada nas classes de busca de informações de básicas de proteínas, domínios e motivos. 3.4.2. Busca em Banco de Dados Protéico Para a criação da lista de proteínas a serem buscadas, foi desenvolvida uma rotina que de acordo com a palavra-chave que o usuário informou é criada uma lista contendo Nome do Registro, Accession Number (código de acesso) e uma breve descrição das proteínas a serem buscadas. Essa lista é gerada através de acesso e uso remoto da ferramenta de busca UniProt Knowledgebase que pode ser acessada através da URL http://www.expasy.org/cgi-bin/sprot-search- ful?SEARCH=*&S=on onde o caractere “*” é substituído pela palavra-chave. Como resultado do acesso a essa URL tem-se um documento Html que através do uso do componente HtmlParser é convertido em um documento texto sem as Tag`s da linguagem HTML, ou seja, somente o texto visto quando se acessa a URL pelo browser. De posse desse documento texto é realizada uma busca, onde cada linha corresponde a um registro. Sabe-se que por padrão desse documento o Nome de Registro da proteína é a primeira palavra de cada linha, Acession Number é a primeira palavra entre colchetes e a descrição se inicia após o Acession Number e termina no final da linha. Para a busca de domínios e motivos segue-se o mesmo conceito, mudando-se apenas a URL padrão e a localização dos registros necessários. 60 Para busca no banco de dados PFam (domínios) a URL passa a ser: http://pfam.wustl.edu/cgi-bin/getswisspfam?key=*, onde o caractere “*” é substituído pelo nome de registro da proteína e a localização dos registros inicia-se na linha “Pfam-A Domains” onde as próximas linhas são o nome do domínio, inicio e término. Para busca no banco de dados Prosite (motivos) a URL passa a ser: http://us.expasy.org/cgibin/prosite/PSScan.cgi?form=theForm&seq=* onde o caractere “*” é substituído pelo nome de registro da proteína e a localização dos registros inicia-se na linha com nome de registro onde as próximas linhas são o nome do motivo, inicio e término. 3.4.3. Comunicação entre a Aplicação Principal e a Aplicação Servidora A partir do momento que o usuário executa o sistema e escolhe o método de inclusão de clientes (manual ou automática) uma porta TCP é aberta através do componente IdTcpServer aguardando a conexão de novos clientes. À medida que os clientes vão conectando-se, é exibida uma lista com os clientes ativos na rede. A comunicação entre a aplicação principal e a aplicação escrava é feita através de troca de mensagens via TCP, onde a mensagem é identificada de acordo com o seu tipo. Os campos das mensagens são separados pelo caractere “|“ e são formatadas de acordo com o seu tipo, que pode ser: mensagem de solicitação de conexão, solicitação de desconexão, solicitação de busca, retorno com informações de busca e confirmação de recebimento de registros. Ao se inserir manualmente ou de forma automática uma nova aplicação escrava, através de um endereço IP, é criada uma mensagem do tipo: 1|ip_do_servidor, onde o campo tipo de mensagem é definido como “1” é o segundo campo é o endereço IP que quem solicitou a conexão. Na aplicação escrava a responsabilidade de recepção de mensagens fica por conta do componente TcpServer que ao receber uma mensagem do tipo “1” (solicitação de conexão) deve verificar se ela já não esta conectada a outra aplicação, caso não esteja, a aplicação escrava se conecta a aplicação servidora através do componente IdTcpClient, dando inicio à comunicação entre as aplicações. 61 Uma vez iniciada a comunicação a aplicação escrava está pronta para receber mensagens do tipo solicitação de registros, que são formatadas da seguinte forma: 3|nome_de_registro, onde o campo “3” identifica o tipo de mensagem e o campo nome_de_registro identifica o nome de registro da proteína solicitada. Após o recebimento e leitura da mensagem é iniciada a busca pela proteína através do nome de registro da mesma, e que quando concluída, as informações sobre a proteína são armazenadas em um StringList e enviadas a aplicação principal que solicitou o registro. Ao concluir o recebimento de registros enviados pela aplicação escrava, a aplicação principal envia uma mensagem do tipo confirmação de recebimento de registros a aplicação escrava que efetuou a busca, essa mensagem é formata da seguinte forma: 5|nome_de_registro, onde o campo “5” identifica o tipo de mensagem e o campo nome_de_registro identifica o nome de registro da proteína recebida. A aplicação escrava ao receber uma mensagem do tipo “5” encerra as atividades de busca pela proteína “nome_de_registro”. Caso a aplicação escrava não receba uma confirmação de recebimento de registros a mensagem contendo as informações sobre a proteína é enviada novamente a aplicação principal. O tempo entre o envio e o recebimento da confirmação de recebimento é configurado através de um campo de timeout na aplicação escrava. O número de tentativas de envio de registro até que a operação seja considerada não concluída é configurado através do campo tentativas de envio de registro. 3.4.4. Inclusão de Resultados no Banco de Dados A partir do momento em que a aplicação principal envia a mensagem de confirmação de recebimento de registro à aplicação escrava, inicia-se o processo de inclusão dos registros no banco de dados. A rotina de inclusão de resultados no banco de dados recebe como parâmetro um StringList, onde cada elemento dessa StringList é uma instrução SQL pronta para ser executada por uma Query, ao término da execução os dados estão gravados no banco de dados local. 62 3.5. VALIDAÇÃO E TESTES A validação da aplicação se deu através da escolha de um grupo protéico, onde o nome do mesmo serviu de palavra-chave para a busca. O grupo protéico escolhido e indicado pelo Prof. André Lima foi o “ABC Transporters”. A validação foi dividida em cinco partes, que são: criação da lista com proteínas a serem buscadas; busca de informações básicas da proteína, busca por motivos, busca por domínios e busca por estrutura secundária. Conforme a ferramenta de busca UniProt Knowledgebase (EXPASY, 2004), a busca pela palavra-chave “ABC Transporters” deverá resultar em uma lista com 80 (oitenta proteínas), conforme Figura 37. Figura 37. Busca por ABC Transporters através da ferramenta UniProt Knowledgebase Executando-se a mesma consulta através da aplicação tem-se como resultado o mesmo número de proteínas, ou seja, 80 (oitenta). A Figura 38 exibe o resultado da consulta. 63 Figura 38. Resultado da busca por ABC Transporters através da aplicação. Após a criação da lista de proteínas resultantes da busca através de palavra-chave. Escolheuse a proteína ABCCD_HUMAN. A validação se dá através da comparação entre os dados do arquivo no formato Flat disponibilizado pelo banco de dados UniProt e os dados obtidos pela aplicação. A Figura 39 mostra o arquivo no formato Flat da proteína ABCCD_HUMAN e a Figura 40 mostra a tela Sistema de Busca de Informações de Proteínas com o resultado a busca pela mesma proteína. 64 Figura 39. Arquivo no formato Flat da proteína ABCCD_HUMAN. Figura 40. Tela informações básicas da proteína ABCCD_HUMAN. 65 Após a visualização das informações básicas da proteína se faz necessária a validação da estrutura da proteína, ou seja, estrutura primária, estrutura secundária, motivos e domínios da proteína. A Figura 41 mostra o arquivo em formato Flat disponibilizado pelo banco de dados UniProt onde se encontram as estruturas primárias e secundárias da proteína ABCCD_HUMAN. Figura 41. Estrutura secundária fornecida pelo banco de dados Uniprot. A Figura 42 mostra os resultados obtidos pela ferramenta PrositeScan, que tem como objetivo disponibilizar os motivos da proteína. 66 Figura 42. Motivos na proteína ABCCD_HUMAN, conforme a ferramenta PrositeScan. A Figura 43 mostra o resultados obtidos na busca pelos domínios da proteína através da ferramenta de busca do banco de dados PFam. Figura 43. Domínios na proteína ABCCD_HUMAN conforme banco de dados PFam. 67 A Figura 44 mostra os resultados obtidos pelo Sistema de Busca e Estruturação de Informações de Proteínas, onde são exibidas as estruturas primária e secundária, os motivos e domínios da proteína ABCCD_HUMAN. Figura 44. Estrutura secundária, motivos e domínios encontrados através da aplicação. Após a visualização dos resultados obtidos através das ferramentas citadas acima e análise dos resultados obtidos pelo sistema apresentado, pode-se chegar a conclusão que os resultados obtidos são positivos, ou seja, os dados disponibilizados pelas ferramentas utilizadas são iguais aos obtidos pelo sistema apresentado. [FIM DE SEÇÃO. Não remova esta quebra de seção] 68 4. CONCLUSÕES Ao se definir o tema para o desenvolvimento deste trabalho levou-se em consideração que o mesmo possa servir de base para projetos futuros que objetivam identificar novas proteínas com base em características já conhecidas, fazendo uso de novas ferramentas a serem desenvolvidas nos dados obtidos por esse trabalho. Apesar de existirem ferramentas que acessem banco de dados biológicos, não foi encontrada uma ferramenta que reunisse todas as etapas, desde a busca de dados protéicos (informações básicas, motivos, domínios, etc.) até sua manipulação através de ferramentas de proteômica. Os fatores a favor do desenvolvimento de tal ferramenta são: • O uso das informações armazenadas de um banco de dados local, o que torna mais rápido o seu acesso e manipulação. • Possibilidade de se utilizar o banco de dados criado em outras aplicações. • Criação de um banco de dados exclusivo para cada usuário. Os objetivos deste trabalho iam desde pesquisa e compreensão de proteínas no que se diz respeito a sua formação, estrutura, propriedades físico-químicas, características e suas funções até o uso ferramentas de proteômica já desenvolvidas, bem como o acesso a banco de dados biológicos fazendo uso da ferramenta desenvolvida para a criação de um banco de dados local com informações sobre proteínas. O uso da ferramenta de busca do banco de dados Swiss-Prot é o primeiro passo para a busca de informações sobre proteínas, pois é através dela que é gerada a lista de proteínas a serem pesquisadas, de acordo com as palavras-chave que o usuário informou. A princípio o acesso a essa ferramenta seria feito através do preenchimento remoto de formulários em páginas web (rotina essa desenvolvida durante a primeira etapa desse trabalho) onde por meio de rotinas era obtida a lista de proteínas para busca. Esse método se comportou de maneira adequada durante os primeiros testes, onde o número de proteínas era consideravelmente pequeno, mas com o incremento do número de proteínas o sistema simplesmente deixava de responder, onde foi constatado que o componente que estava sendo utilizado, o TWebBrowser que é distribuído juntamente com a linguagem de programação escolhida, não suportava a navegação em uma página com tamanho número de registros. Com a constatação da origem do problema, o preenchimento remoto de formulários e o componente o TWebBrowser foram dispensados, chegando-se a um novo método de acesso a formulários em páginas web, o uso direto da ferramenta de busca, onde as palavras chave são passadas como parâmetros, tendo como resultado, uma página web em formato HTML, é processado através de uma biblioteca chamada HTMLParser que gera um documento texto sem os tags da linguagem HTML. Depois disso o documento é novamente processado, tendo como resultado a lista de proteínas para busca. Durante a fase de implementação sugiram novas barreiras que tiveram que ser superadas, sendo necessário algumas modificações no que foi planejado na primeira etapa do desenvolvimento. Uma delas é o uso de documentos XML para captura de informações, já que o componente que seria utilizado para realizar o processamento XML, o XMLTransformProvider, possui algumas restrições quanto ao número de possíveis valores que um campo possa ter. Esse componente da forma que estava sendo usada admite que um campo possa ter apenas um valor, restringindo campos a exemplo da tabela proteínas, onde uma proteína pode ter mais de um nome cadastrado, ou da tabela referencias, onde uma publicação pode ter mais que um autor. Com o surgimento do problema do uso de XML, iniciou-se a busca de novas alternativas, chegando-se ao uso de documentos em formato Flat (texto plano), sendo necessária a criação de uma rotina que identificasse cada tipo de registro. Inicialmente o banco de dados de domínio de proteínas escolhido foi o Prodom. Embora tenham sido desenvolvidas e testadas as rotinas para recuperação de seus dados, o uso desse banco de dados foi descartado devido o seu baixo desempenho na recuperação de dados. Novas alternativas foram necessárias, onde foi encontrado o banco de dados Pfam, que além de ter um maior número de registro se sobressaiu ao Prodom em relação ao desempenho na recuperação de seus dados. Durante o desenvolvimento desse trabalho verificou-se estar construindo uma ferramenta que cumpriu os objetivos propostos e que seria de grande utilidade. Como se trata de um projeto que objetiva servir de base para trabalhos futuros, tem suas limitações, dentre elas podem ser citadas: atualização dos dados já existentes no banco de dados; possibilidade de criação de mais de 70 um banco de dados por usuário, onde o mesmo possa gerenciar projetos divididos por grupo protéico; a não existência de relatórios; dependência de ferramentas desenvolvidas mantidas por terceiros. Diante das limitações citadas, sugere-se a continuidade do desenvolvimento da ferramenta considerando os avanços alcançados durante o desenvolvimento do trabalho, ficando como sugestão a correção das limitações já citadas e melhorias, tais como: • Acesso direto a bancos de dados biológicos, sem o uso de ferramentas disponibilizadas pelos mesmos; • Uso de ferramentas que façam alinhamentos entre as proteínas; e • Possibilidade de criação de projetos do usuário, onde os projetos seriam divididos de acordo com a proteína ou grupo protéico estudado; [FIM DE SEÇÃO. Não remova esta quebra de seção] 71 REFERÊNCIAS BIBLIOGRÁFICAS ALBERTS, B., BRAY, D., LEWIS, J. Biologia Molecular da Célula. 3ª ed., Porto Alegre, Ed. Artes Médicas, 1997. BIBLIOMED. DNA: A Linguagem da vida. São Paulo, 2002. Disponível em: <http://boasaude.uol.com.br/lib/ShowDoc.cfm?LibDocID=3831&ReturnCatID=1798>. Acesso em 10 nov. 2002. BIOESFERA. DNA Goes to School: Os Banco de Dados Genéticos, 2001. Disponível em: <http://www.eldnavaalaescuela.com/banco.htm>. Acesso em: 01 nov. 2004. BIOMANIA. 1998-2002. Apresenta conteúdo sobre ciências biológicas. Disponível em: <http://www.biomania.com.br>. Acesso em: 23 out. 2002. BUYYA, R. High Performance Cluster Computing: Architecture and Systems, vol 1. pags 345, New Jersey: Prentice Hall, 1999. CARVALHO, F. F. Delphi 6: Programação Orientada a Objetos. 1ª ed., São Paulo: Érica, 2001. CATES, S. Expasy Proteonics Tools 1, Mar. 2004. Disponível em: <http://cnx.rice.edu/content/m11082/latest/>. Acesso em: 02 mar. 2004. EMBOSS. European Molecular Biology Open Software Suíte. Disponível em: <http://bioinfo.pbi.nrc.ca:8090/EMBOSS/>. Acesso em: 12 out. 2004. EXPASY. Molecular Biology Server. Disponível em: <http://us.expasy.org>. Acesso em: 25 jul. 2006. FALCÃO, P. K., et al. Sting Millennium Suite: ferramentas para análise estrutural de proteínas. Disponível em: <http://www.comciencia.br/>. Acesso em: 23 mar 2004. FARAH, S. B. DNA Segredos & Mistérios. São Paulo: SARVIER, 1997. 276p. GENTIL, P. Ingestão de Proteínas. GEASE – Grupo de Estudo Avançados em Exercícios e Saúde, Brasília, jan 2002. GRIFFITHS, A., MILLER, J., SUZIKI, D. Introdução a Genética. 7a ed., Rio de janeiro: Guanabara Koogan, 2001. HORTON, H. R., MORAN, L. A., OCHS, R. S. Principles of Biochemistry. 3a ed., Toronto: Prentice Hall, 1995. JACINTO, D. S. Conceitos básicos para o desenvolvimento de algoritmos paralelos utilizando bibliotecas de passagem de mensagem. Linuxchix Brasil. Disponível em: <http://midia.linuxchix.org.br/artigos/programacao.pdf>. Acesso em 15 de mai. 2006. LaCPaD. Laboratório de Computação Paralela e Distribuída. Florianópolis: UFSC. Disponível em: <http://www.lacpad.inf.ufsc.br/>. Acesso em: 15 mai. 2006. LBMP. Laboratório de Bioquímica de Microrganismos e Plantas. Departamento de Tecnologia FCAV/UNESP. Jaboticabal. Disponível em: <http://lbmp.fcav.unesp.br/>. Acesso em 29 set. 2004. LEHNINGER, A. L, NELSON, D. L., COX, M. M. Principles of Biochemistry, 2a ed., New York: Worth Publishers, 1998. LODISH, H., BERK, A., ZIPURSKY, S. L. Molecular Cell Biology. 4a ed., New York: W H Freeman & Co., 1999. LOURENÇO, A. P. Two Sequence Alignment. Disponível em: <http://www.rge.fmrp.usp.br/cursos/topicosiii/paginas/web25/trabalho25.html>. Acesso em: 12 de out. de 2004. MELEIRO, R., FONSECA, C. O Genoma Humano. CiênciaJ, n. 23, set. 2001. Disponível em: <http://www.ajc.pt/cienciaj/n23/avulvo9.php> MELO, A. C. Desenvolvendo aplicações com UML 2.0: do conceitual à implementação. 2a ed., Rio de Janeiro: Brasport, 2004. 73 MICROSOFT. URLDownloadToCacheFile Function. Disponível em: <http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/moniker/reference/functi ons/urldownloadtocachefile.asp>. Acesso em: 20 set. 2004. MOTTA, V. T. Bioquímica Básica: Aminoácidos e Proteínas. Porto Alegre, 2004. PIMENTA, A. M de C. Desafio do Proteona. Ciência Hoje, Belo Horizonte, n. 192. Disponível em: <http://www2.uol.com.br/cienciahoje/chmais/pass/ch192/proteoma.pdf>. Acesso em: 19 mar. 2004. PRODOM. The ProDom Database. Disponível em: <http://prodes.toulouse.inra.fr/prodom/current/html/home.php>. Acesso em: 30 set. 2004. PROSDOCIMI, F., CERQUEIRA, G. C. BINNECK, E. Bioinformática: O manual do usuário. Disponível em: <http://www.bionet.pucpr.br/tutoriais.php> . Acesso em: 18 out. 2004. QMCWEB. O Mundo das Proteínas. QMCWEB Revista eletrônica. Florianópolis, Universidade Federal de Santa Catarina, Departamento de Química, 1998. Diponível em: <http://www.qmc.ufsc.br/qmcweb/artigos/proteinas.html/>. Acesso em: 29 out. 2004. SANTANA, R., SOUZA, M., PIEKARSKI, A. E. Computação Paralela. São Carlos, 1997. STAUFFER, A. O., FRANCO, J. M. CGI e Formulários HTML. [S.l., 2000]. Disponível em: <http://equipe.nce.ufrj.br/adriano/c/apostila/cgi/#form>. Acesso em: 29 out. 2004. SWISS-PROT. Swiss-Prot Protein Knowledgebase. Disponível em: <http://www.expasy.org/sprot/>. Acesso em: 20 ago. 2004. TANENBAUM A. S. Sistemas Operacionais Modernos, Rio de Janeiro: Prentice-Hall do Brasil Ltda, 1995. THOMPSON, M., MCINNES, R., WILLARD, H. Genética Médica. [ca 2000]. Rio de Janeiro: GUANABARA KOOGAN, 1998. p. 23-25. W3 CONSORTIUM. Extensible Markup Language (XML): activity statement. Disponível em: <http://www.w3c.org.>. Acesso em: 25 set. 2001. 74 _______. Extensible Markup Language (XML): W3C recommendation 6. 2ª ed., 2000. Disponível em: <http://www.w3c.org.>. Acesso em: 24 set. 2001. WIKIPEDIA. Wikipédia, a enciclopédia livre. RNA. Disponível em: <http://pt.wikipedia.org/wiki/RNA>. Acesso em: 18 out. 2006. YANGENE BIOTECNOLOGIC COMPANY. Biotech Molecular Biology. [nl.] 2000. Dispinivel em: <www.yangene.com/ content22_10.htm>. Acesso em 19 nov. 2002. [FIM DE SEÇÃO. Não remova esta quebra de seção] 75 APÊNDICE A – DICIONÁRIO DE DADOS Tabela 7. Dicionário de Dados da Tabela Autor NOME DO ATRIBUTO TIPO/TAMANHO DESCRIÇÃO refid inteiro Código identificador da referência (FK) idautor inteiro Código identificador do autor (PK) nome char(50) Nome do autor Tabela 8. Dicionário de Dados da Tabela Datas NOME DO ATRIBUTO TIPO/TAMANHO iddata Inteiro DESCRIÇÃO Código identificador da referência (PK) nomeregistro char(20) Código identificador da proteína (FK) comentario char(100) Comentário da data data char(50) Data Tabela 9. Dicionário de Dados da Tabela Domínio. NOME DO ATRIBUTO TIPO/TAMANHO DESCRIÇÃO iddominio inteiro Código identificador do domínio (PK) tamanho inteiro Tamanho do domínio inicio inteiro Inicio do domínio fim inteiro Fim do domínio nomeregistro char(20) Nome de registro da proteína (FK) nome char(20) Nome do dominio Tabela 10. Dicionário de Dados da Tabela EstruturaSecundária. NOME DO ATRIBUTO TIPO/TAMANHO idestruturasecundaria nomeregistro inteiro char(20) DESCRIÇÃO Código identificador da estrutura secundária (PK) Código identificador da proteína (FK) inicio inteiro Início da estrutura secundária fim inteiro Fim da estrutura secundária char(20) Tipo da estrutura secundaria tipoestrutura 76 Tabela 11. Dicionário de Dados da Tabela Gene NOME DO ATRIBUTO TIPO/TAMANHO idgene DESCRIÇÃO Inteiro Código identificador do Gene (PK) nomeregistro char(20) Nome de Registro da proteína (FK) tipo char(32) Tipo do Gene gene char(32) Gene Tabela 12. Dicionário de Dados da Tabela Motivo. NOME DO ATRIBUTO TIPO/TAMANHO idmotivo inteiro DESCRIÇÃO Código identificador do motivo (PK) nomeregistro char(20) Nome de Registro da proteína (PK) acmotivo char(20) Accession number do motivo nome char(50) Nome do motivo inicio char(5) Inicio do motivo fim char(5) Fim do motivo descricao char(150) Descrição do motivo Tabela 13. Dicionário de Dados da Tabela Organismo. NOME DO ATRIBUTO TIPO/TAMANHO DESCRIÇÃO nomecientifico char(50) Nome científico do organismo (PK) nomevulgar char(50) Nome vulgar do organismo Tabela 14. Dicionário de Dados da Tabela Organismo_Proteína. NOME DO ATRIBUTO TIPO/TAMANHO DESCRIÇÃO nomecientifico char(50) Nome científico do organismo (FK) nomeregistro char(20) Nome de registro da proteína (FK) Tabela 15. Dicionário de Dados da Tabela Proteína. NOME DO ATRIBUTO TIPO/TAMANHO DESCRIÇÃO nomeregistro char(20) Nome do registro da proteína (PK) funcao char(250) Função da proteína 77 Tabela 16. Dicionário de Dados da Tabela Referência. NOME DO ATRIBUTO TIPO/TAMANHO refid inteiro DESCRIÇÃO Código identificador da referencia (PK) nomeregistro char(20) Nome de registro da proteína (FK) titulo char(250) Título da referência tissue char(25) Tissue da referência publicacao char(50) Publicação da referência citacao char(50) Citação da referência escopo char(250) Escopo da referência Tabela 17. Dicionário de Dados da Tabela Seqüência. NOME DO ATRIBUTO TIPO/TAMANHO DESCRIÇÃO idsequencia inteiro Código identificador da seqüência (PK) idproteina inteiro Código identificador da proteína (FK) tamanho inteiro Tamanho da seqüência peso char(10) sequencia texto Peso da seqüência Seqüência da proteína Tabela 18. Dicionário de Dados da Tabela Taxonomia. NOME DO ATRIBUTO TIPO/TAMANHO DESCRIÇÃO nomecientifico char(50) Código identificador do organismo (PK) taxonomia char(50) Nome da taxonomia (PK) [FIM DE SEÇÃO. Não remova 78 esta quebra de seção] ANEXO I – CÓDIGO FONTE DA APLICAÇÃO PRINCIPAL PClient = ^TClient; TClient = record PeerIP : string[15]; HostName : String[40]; Busca : boolean; NumeroProteina : integer; EntryName : string[20]; Connected, LastAction : TDateTime; Thread : Pointer; end; { Ip do client (servidor) } { Nome do Client } { Tempo conectado } { Ultima atividade } { Ponteiro para a thread } type TBuscaEN = class ListaEN: TStrings; ListaAC: TStrings; procedure BuscaSP(var Argumento: string); procedure AtualizaLista; procedure CriaLista; end; function LeIni: Boolean; var ArqIni : TIniFile; begin ArqIni := tIniFile.Create('c:\windows\temp\proteina.Ini'); Try hostname := ArqIni.ReadString('Dados', 'HostName', 'Main'); database := ArqIni.ReadString('Dados', 'database', 'Main' ); usuariodb := ArqIni.ReadString('Dados', 'usuario', 'Main' ); senha := ArqIni.ReadString('Dados', 'senha', 'Main' ); Finally ArqIni.Free; end; result := true; end; function getIPs: Tstrings; type TaPInAddr = array[0..10] of PInAddr; PaPInAddr = ^TaPInAddr; var phe: PHostEnt; pptr: PaPInAddr; Buffer: array[0..63] of Char; I: Integer; GInitData: TWSAData; begin WSAStartup($101, GInitData); Result := TstringList.Create; Result.Clear; GetHostName(Buffer, SizeOf(Buffer)); phe := GetHostByName(buffer); if phe = nil then Exit; pPtr := PaPInAddr(phe^.h_addr_list); I := 0; while pPtr^[i] <> nil do begin Result.Add(inet_ntoa(pptr^[i]^)); Inc(I); end; WSACleanup; end; procedure TBuscaEN.BuscaSP(var Argumento: string); var HTML : TStrings; Server, EN : String; i, j, inicio, k : integer; temp, temp2, DESCtemp, Base, AC : string; flag : integer; FileName: string; HtmlParser: THtmlParser; HtmlDoc: TDocument; Formatter: TBaseFormatter; primeiro, segundo : integer; begin HTML := TStringList.Create; inicio := 0; primeiro := 0; Server := 'http://www.expasy.org/cgi-bin/sprot-search-ful?SEARCH=*&S=on'; Server := AnsiReplaceStr(Server,'*',Argumento); Server := AnsiReplaceStr(Server,' ','+'); SetLength(FileName, MAX_PATH + 1); if URLDownloadToCacheFile(nil, pchar(Server), PChar(FileName), MAX_PATH, 0, bsc) = S_OK then begin SetLength(FileName, StrLen(PChar(FileName))); HTML.LoadFromFile(FileName); end; HtmlParser := THtmlParser.Create; try HtmlDoc := HtmlParser.parseString(HTML.Text) finally HtmlParser.Free end; Formatter := TTextFormatter.Create; try HTML.Text := Formatter.getText(HtmlDoc) finally Formatter.Free end; Base := 'Search in Swiss-Prot: There are matches to'; for i := 0 to HTML.Count-1 do begin temp := HTML.Strings[i]; if copy(temp, 0, length(base)) = base then begin inicio := i+1; break; end; end; flag := 0; for i := inicio to HTML.count-1 do begin temp := HTML.Strings[i]; for j := 0 to length(temp)-1 do begin if temp[j] = ' ' then begin temp2 := copy(temp, j+1, 4); if temp2 = 'http' then begin for k := j+1 to length(temp)-1 do begin if temp[k] = '?' then primeiro := k; if temp[k] = '(' then begin segundo := k; EN := copy(temp, 0, j-1); ac := copy(temp, k+1, length(temp)-k-1); flag := 1; break; end; end; break; end else begin if flag = 0 then DESCtemp := DESCtemp + temp; if flag = 1 then begin DESCtemp := DESCtemp + temp; frmMain.CDS.insert; frmMain.Cds.Fields[2].Value := true; frmMain.Cds.Fields[0].Value := en; frmMain.Cds.Fields[1].Value := desctemp; frmMain.Cds.Fields[3].Value := false; frmMain.Cds.Fields[4].Value := ac; frmMain.CDS.Post; DESCtemp := ''; flag := 0; end; break; end; end; end; end; frmMain.Cds.IndexFieldNames := 'EN'; CriaLista; frmMain.lb_numeroproteinas.Caption := 'Foram encontradas '+inttostr(ENList.Count)+' proteínas através da palavra-chave: '+frmMain.Edit1.text; frmMain.pnl_avancar.Visible := true; end; procedure TBuscaEN.AtualizaLista; var i : integer; begin frmMain.CDS.First; for i := 0 to ENLIst.Count-1 do ENList.Delete(0); while not frmMain.CDS.Eof do begin for i := 0 to frmMain.CDS.RecordCount-1 do begin if frmMain.CDS.fields[2].Value then begin ENList.Add(frmMain.CDS.fields[0].Value); frmMain.CDS.Next; end else frmMain.CDS.Next; end end; end; procedure TBuscaEN.CriaLista; begin frmMain.CDS.First; while not frmMain.CDS.Eof do begin if frmMain.CDS.fields[2].Value then begin ENList.Add(frmMain.CDS.fields[0].Value); ACList.Add(frmMain.CDS.fields[4].Value); frmMain.CDS.Next; end else frmMain.CDS.Next; end; end; procedure TFrmMain.btn_avancarClick(Sender: TObject); var ListItem: TListItem; begin btn_avancar.Enabled := false; pnl_avancar.Visible := false; PaginaControle.ActivePageIndex := 2; BuscaEN.AtualizaLista; ProgressBar.MaxValue := ENList.Count; lb_total.Caption := 'Buscando por '+inttostr(ENList.count)+' proteínas.'; NumThreads := 0; CDS.First; while not CDS.Eof do begin if CDS.fields[2].Value = False then CDS.Delete else CDS.Next; end; CDS.First; with lv_progresso do begin ViewStyle := vsReport; while not CDS.Eof do begin ListItem := Items.Add; ListItem.Caption := CDS.fields[0].Value; ListItem.SubItems.Add(CDS.fields[4].Value); ListItem.SubItems.Add('Não Iniciado'); ListItem.SubItems.Add(' '); ListItem.SubItems.Add(' '); CDS.Next; end; end; CDS.EmptyDataSet; if ENList.Count > 0 then Busca; end; procedure TFrmMain.btn_buscaClick(Sender: TObject); var BuscaEN: TBuscaEN; Argumento: string; begin // se existir dados no ClientDataSet - CDS, os dados são excluídos if CDS.DataSize <> 0 then begin CDS.First; while not CDS.Eof do begin CDS.First; CDS.Delete; CDS.First; end; end else begin CDS.CreateDataSet; CDS.Open; end; BuscaEN := TBuscaEN.Create; ACList := TStringList.Create; Argumento := Edit1.Text; Label3.Caption := ''; BuscaEN.BuscaSP(Argumento); ProgressBar.MaxValue := 0; ProgressBar.Progress := 0; btn_avancar.Enabled := true; pnl_avancar.Visible := true; t := 0; end; procedure TFrmMain.Busca; var EntryName : string; NumeroHosts : integer; SelClient : PClient; ListItem : TListItem; begin NumeroHosts := LBIPAtivos.count-1; MaxThreads := LBIPAtivos.count; while (NumThreads < MaxThreads) and (t <= ENList.Count-1) do begin if HostN = NumeroHosts then HostN := 0 else inc(HostN); EntryName := ENList[t]; LBIPAtivos.ItemIndex := HostN; if LBIPAtivos.ItemIndex = -1 then begin Exit; end; try SelClient := PClient(Clients.LockList.Items[HostN]); SelClient.Busca := True; SelClient.EntryName := EntryName; SelClient.NumeroProteina := t; inc(NumThreads); with lv_progresso do begin ListItem := Items.Item[SelClient.NumeroProteina]; ListItem.SubItems.Strings[1] := 'Iniciado'; ListItem.SubItems.Strings[2] := SelClient.HostName; ListItem.SubItems.Strings[3] := SelClient.PeerIP; ListItem.SubItems.Strings[4] := TimeToStr(SelClient.LastAction); end; finally Clients.UnLockList end; inc(t); end; end; function TFrmMain.VerificaAtividade(ip: string) : boolean; var connec : boolean; msg : string; begin msg := Concat('1|',lbl_meuip.caption); // msg enviada para o client. 1 = código para teste de atividade. TCPClient.RemoteHost := ip; TCPClient.RemotePort := '1000'; Connec := TcpClient.Connect; if not Connec then begin lbl_atividade.Caption := 'Servidor não ativo.'; lbl_atividade.Caption := ''; end else begin TcpClient.SendLn(msg); TcpClient.Disconnect; end; result := true; end; procedure TFrmMain.TCPServerConnect(AThread: TIdPeerThread); var NewClient: PClient; begin GetMem(NewClient, SizeOf(TClient)); NewClient.PeerIP := AThread.Connection.Socket.Binding.PeerIP; NewClient.HostName := GStack.WSGetHostByAddr(NewClient.PeerIP); NewClient.Busca := False; NewClient.EntryName := ''; NewClient.Connected := Now; NewClient.LastAction := NewClient.Connected; NewClient.Thread := AThread; AThread.Data := TObject(NewClient); try Clients.LockList.Add(NewClient); finally Clients.UnlockList; end; Protocol.Lines.Add(TimeToStr(Time)+' Conexão com "' + NewClient.HostName + '" com o IP ' + NewClient.PeerIP); RefreshListDisplay; if ENList.Count > 0 then Busca; end; procedure TFrmMain.TCPServerExecute(AThread: TIdPeerThread); var Client : PClient; Command, TempPathName, Msg, Ha, Hi, a3, NroMsg : string; Size : integer; ftmpStream : TFileStream; sql : Tstrings; ListItem : TListItem; HoraAtual, a1, a2 : TDateTime; Gravador : TGravador; connected: boolean; begin if not AThread.Terminated and AThread.Connection.Connected then begin Client := PClient(AThread.Data); Client.LastAction := Now; Gravador := TGravador.Create; if Client.Busca = True then begin Client.Busca := False; sql := tstringlist.Create; msg := concat('3|',Client.EntryName); AThread.Connection.WriteLn(msg); TempPathName := ExtractFileDir(ParamStr(0)) + '\' + Client.HostName + '_' + Client.EntryName +'.txt'; if FileExists (TempPathName) then DeleteFile(TempPathName); ftmpStream := TFileStream.Create(TempPathName,fmCreate); Size := AThread.Connection.ReadInteger; AThread.Connection.ReadStream(fTmpStream,Size,False); FreeAndNil(fTmpStream); sql.LoadFromFile(TempPathName); NroMsg := SQL.Strings[0]; EnviaMsg(NroMsg, Client.PeerIP); Gravador.GravaSQL(sql); if FileExists (TempPathName) then DeleteFile(TempPathName); with lv_progresso do begin ListItem := Items.Item[Client.NumeroProteina]; HoraAtual := Time; Ha := timetostr(HoraAtual); Hi := ListItem.SubItems.Strings[4]; a1 := StrToTime(Ha); a2 := StrToTime(Hi); a3 := TimeToStr(a2-a1); ListItem.SubItems.Strings[1] := 'Concluído'; ListItem.SubItems.Strings[5] := TimeToStr(HoraAtual); ListItem.SubItems.Strings[6] := a3; ProgressBar.Progress := ProgressBar.Progress + 1; end; AThread.Connection.WriteLn('DONE'); ClientsListBoxClick(nil); dec(NumThreads); Busca; end end; end; ANEXO II – CÓDIGO FONTE DA APLICAÇÃO ESCRAVA type TBuscaDOMINIO = class ListaEN: TStrings; function Busca(var EN: string): TStrings; public HtmlParser, HtmlParser2 : THtmlParser; end; type TBuscaPROSITE = class ListaEN: TStrings; function Busca(var EN: string): TStrings; end; type TGravador = class function ParserFlat(FlatProt : WideString): TStrings; function GravaSQL(SQL: TStrings): Boolean; end; type TBuscaESTRUTURASEC = class ListaEN: TStrings; function Busca(var EN: string; SEQ: string; proteina: TStrings ): TStrings; end; function lemsg(campo : integer; msg: string): string; var npv, pvant, pvatual, i : integer; c : string; begin pvant := 0; npv := 0; for i := 1 to length(msg) do begin c := msg[i]; if (c = '|') or (i = length(msg)) then begin inc(npv); pvatual := i; if i = length(msg) then begin result := copy(msg,pvant+1,pvatual-pvant); break; end; if npv = campo then begin result := copy(msg,pvant+1,pvatual-pvant-1); break; end; pvant := pvatual; end; end; end; function GetLocalIPAddress : string; var wsdata : TWSAData; he : PHostEnt; ss : pchar; ip : TInAddr; i : cardinal; co : string; begin i := MAX_COMPUTERNAME_LENGTH + 1; SetLength(co,i); GetComputerName(PChar(co),i); WSAStartup(MakeWord(1, 1), wsdata); he := gethostbyname(pchar(co)); if he <> nil then begin ip.S_addr := integer(pointer(he^. h_addr_list^)^); ss := inet_ntoa(ip); Result := string(ss); end; WSACleanup(); end; function BuscaInformacao(var EntryName: string): Tstrings; var Gravador : TGravador; BuscaDOMINIO : TBuscaDOMINIO; BuscaPROSITE : TBuscaProsite; BuscaESTRUTURASEC : TBuscaESTRUTURASEC; Argumento, Seq: string; FlatProt : widestring; HTTP: TIEHTTP; SQL, SQLDOMINIO, SQLPROSITE, SQLPROT, SQLSEC, Proteina : TStrings; Temp: TStrings; begin HTTP := TIEHTTP.Create(nil); Proteina := TStringList.Create; SQL := TStringList.Create; SQLPROT := TStringList.Create; SQLPROSITE := TStringList.Create; SQLDOMINIO := TStringList.Create; SQLSEC := TStringList.Create; BuscaDOMINIO := TBuscaDOMINIO.Create; BuscaPROSITE := TBuscaProsite.Create; BuscaESTRUTURASEC := TBuscaESTRUTURASEC.Create; HTTP.URL := 'http://www.ebi.uniprot.org/entry/'+EntryName+'?format=flat&ascii'; HTTP.Execute; FlatProt := AdjustLineBreaks(HTTP.sl.text); HTTP.Free; Proteina.Text := FlatProt; SQLPROT := Gravador.ParserFlat(FlatProt); SQLPROSITE := BuscaPROSITE.Busca(EntryName); SQLDOMINIO := BuscaDOMINIO.Busca(EntryName); SQLSEC := BuscaESTRUTURASEC.Busca(EntryName, Seq, Proteina); SQL.AddStrings(SQLPROT); SQL.AddStrings(SQLPROSITE); SQL.AddStrings(SQLDOMINIO); SQL.AddStrings(SQLSEC); result := SQL; end; procedure TfrmMain.TimerTimer(Sender: TObject); var Stream : TMemoryStream; pic : TBitmap; sCommand : string; proteina, tipo, en : string; buffer : pchar; sql : tstrings; ListItem: TListItem; Msg : PMsg; begin if not idTCPClient.Connected then Exit; Timer.Enabled := False; sCommand := idTCPClient.ReadLn; if SCommand = 'BYE' then idTCPClient.Disconnect; Tipo := LeMsg(1,sCommand); if Tipo = '3' then begin sql := tstringlist.create; EN := lemsg(2,sCommand); with lv_progresso do begin ViewStyle := vsReport; begin ListItem := Items.Add; ListItem.Caption := idTCPClient.LocalName; ListItem.SubItems.Add(EN); ListItem.SubItems.Add('Não Iniciado'); end; end; Log.Lines.Insert(0,'Iniciando busca por:' + EN + ' às: ' + DateTimeToStr(Now)); sql := buscainformacao(EN); ListItem.SubItems.Add('Concluído'); Stream := TMemoryStream.Create; sql.SaveToStream(Stream); Log.Lines.Insert(0,'Enviando dados...'); idTCPClient.WriteInteger(Stream.Size); idTCPClient.OpenWriteBuffer; idTCPClient.WriteStream(Stream); idTCPClient.CloseWriteBuffer; FreeAndNil(Stream); Log.Lines.Insert(0,'Concluído'); end; Timer.Enabled := True; end; {**************************************************************** Function AllTrim Remove os espaços em branco de ambos os lados da string ****************************************************************} function Alltrim(const Search: string): string; const blackspace = [#33..#126]; var index : byte; begin index := 1; while (index <= length(search)) and not (search[index] in blackspace) do begin index := index + 1; end; result := copy(search, index, 255); index := length(result); while (index > 0) and not (result[Index] in blackspace) do begin index := index - 1; end; result := copy(result, 1, index); end; { Fim Function AllTrim } {**************************************************************** Function Busca da Classe TBuscaProsite Função que recebe como parametro o nome de registro da proteína e que através de acesso a ferramenta PrositeScan retorna uma StringList com instruções SQL para inclusão dos motivos dessa proteína no banco de dados. *****************************************************************} function TBuscaPROSITE.Busca(var EN: string): TStrings; var Html, Lista : TStrings; final, i, j, l, k, inicio, flag, primeiro, segundo: integer; scan, linha, Base, Server, temp, temp2, iniciomotivo, fimmotivo, nomemotivo, idmotivo, descricao : string; SQL : TStrings; HtmlDoc: TDocument; Formatter: TBaseFormatter; HtmlParser: THtmlParser; FileName: string; begin SQL := TStringList.Create; HTML := TStringList.Create; Lista := TStringList.Create; flag := 0; inicio := 0; primeiro := 0; // inicialização de variáveis server := 'http://us.expasy.org/cgi-bin/prosite/PSScan.cgi?form=theForm&seq='+EN; SetLength(FileName, MAX_PATH + 1); if URLDownloadToCacheFile(nil, pchar(Server), PChar(FileName), MAX_PATH, 0, nil) = S_OK then begin SetLength(FileName, StrLen(PChar(FileName))); HTML.LoadFromFile(FileName); HtmlParser := THtmlParser.Create; try HtmlDoc := HtmlParser.parseString(HTML.Text) finally HtmlParser.Free end; Formatter := TTextFormatter.Create; try HTML.Text := Formatter.getText(HtmlDoc) finally Formatter.Free end; end; HtmlDoc.Free; Base := 'document.getElementById'; for i := 0 to HTML.Count-1 do begin linha := HTML.strings[i]; temp := copy(linha,0, length(base)); if temp = base then for j:=0 to length(linha)-1 do if linha[j] = '?' then begin scan := copy(linha,j+1, length(linha)-j-2); break; end; end; Server := 'http://us.expasy.org/cgi-bin/prosite/ScanView.cgi?'+scan; SetLength(FileName, MAX_PATH + 1); if URLDownloadToCacheFile(nil, pchar(Server), PChar(FileName), MAX_PATH, 0, nil) = S_OK then begin SetLength(FileName, StrLen(PChar(FileName))); HTML.LoadFromFile(FileName); HtmlParser := THtmlParser.Create; try HtmlDoc := HtmlParser.parseString(HTML.Text) finally HtmlParser.Free end; Formatter := TTextFormatter.Create; try HTML.Text := Formatter.getText(HtmlDoc) finally Formatter.Free end; for i := 0 to Html.Count-1 do begin temp := Html.Strings[i]; temp2 := copy(temp, 0, 2); if temp2 = 'PS' then begin inicio := i; break; end; end; for i := inicio to Html.Count-1 do begin temp := Html.Strings[i]; for j:=0 to length(temp) do if copy(temp, j, 3) = 'PS0' then begin Lista.add(copy(temp, j, 7)); break; end end; for i := inicio to HTML.count-1 do begin temp := Html.Strings[i]; for j := 0 to length(temp)-1 do begin if (temp[j] = ' ') and (flag = 1) then begin segundo := j; Html.Strings[i] := copy(temp, 0, primeiro-1) + ' ' + copy(temp, segundo+1, length(temp)-segundo-1); flag := 0; break; end; if (temp[j] = ' ') and (temp[j] <> '') then begin flag := 1; primeiro := j; end; end; end; j := 0; final := HTML.Count-1; for i := 0 to Lista.Count-1 do while (j <= HTML.Count-1) do begin if j > final then begin inc(j); break; end; temp := Html.Strings[j]; if copy(temp,0,2) = 'PS' then begin for k := 9 to length(temp)-1 do begin idmotivo := copy(temp,0,7); if (temp[k] = ' ') and (temp[k] <> '') then begin primeiro := k; nomemotivo := copy(temp, 9, primeiro-9); descricao := copy(temp, primeiro+1, length(temp)-primeiro-1); break; end; end; inc(j); temp := Html.Strings[j]; while copy(Html.Strings[j],0,2) <> 'PS' do begin inc(j); temp := Html.Strings[j]; if copy(temp, 0, 10) = 'horizontal' then begin final := j; break; end; for l := 0 to length(temp)-1 do begin if temp[l] = ' ' then begin iniciomotivo := copy(temp, 0, l-1); fimmotivo := copy(temp, l+1, length(temp)); SQL.ADD('insert into motivo (acmotivo, nome, inicio, nomeregistro, descricao, fim) values("' + idmotivo + '","' + nomemotivo + '","' + iniciomotivo + '","' + EN + '","' + descricao + '","' + fimmotivo + '")'+';'); inc(j); break; end; end; inc(j); inc(j); inc(j); if copy(Html.Strings[j],0,2) = 'PS' then begin dec(j); break; end; dec(j); end; end; inc(j); end; end; Html.free; lista.free; result := SQL; end; {**************************************************************** Function Busca da Classe TBuscaDominio Função que recebe como parametro o nome de registro da proteína e que através de acesso ao banco de dados PFam retorna uma StringList com instruções SQL para inclusão dos domínios dessa proteína no banco de dados. *****************************************************************} function TBuscaDOMINIO.Busca(var EN: string): TStrings; var Base, temp,tempo, temp2, dominio, iniciodom, fimdom, server, nome: String; HtmlDoc,HtmlDoc2: TDocument; Html,Html2 : TStrings; Formatter,Formatter2: TBaseFormatter; i, j, k, inicio, fim, aux, tamanho : integer; HTTP2: TIEHTTP; Buffer: pchar; SQL : TStrings; FileName : string; begin SQL := TStringlist.Create; HTML := TStringList.Create; inicio := 0; fim := 0; tamanho := 0; Server := 'http://pfam.wustl.edu/cgi-bin/getswisspfam?key=*'; Server := AnsiReplaceStr(server,'*',EN); SetLength(FileName, MAX_PATH + 1); if URLDownloadToCacheFile(nil, pchar(Server), PChar(FileName), MAX_PATH, 0, nil) = S_OK then begin SetLength(FileName, StrLen(PChar(FileName))); HTML.LoadFromFile(FileName); HtmlParser := THtmlParser.Create; try HtmlDoc := HtmlParser.parseString(HTML.Text) finally HtmlParser.Free end; Formatter := TTextFormatter.Create; try HTML.Text := Formatter.getText(HtmlDoc) finally Formatter.Free end; HtmlDoc.Free; Base := 'Accession number:'; for i := 0 to Html.Count-1 do begin if (Html.Strings[i] = 'Pfam-A Domains') and (Html.Strings[i+2] = 'Domain') and (Html.Strings[i+4] = 'Start') then inicio := i+8; if (Html.Strings[i] = 'Pfam-B Domains') or (Html.Strings[i] = 'Other Regions') then fim := i-2; end; if fim = 0 then fim := html.count-5; aux := 0; for i := inicio to fim do begin temp := html.Strings[i]; inicio := 0; if html.Strings[i] <> '' then begin temp2 := copy(temp,inicio, length(temp)); for j := 0 to length(temp)-1 do if (temp[j] = '/') then begin inicio := j+2; break; end; temp2 := copy(temp,inicio, length(temp)); inc(aux); case aux of 1: dominio := temp2; 2: iniciodom := temp2; 3: begin fimdom := temp2; aux := 0; Server := 'http://pfam.wustl.edu/cgi-bin/getdesc?name=*'; Server := AnsiReplaceStr(server,'*',dominio); HTTP2 := TIEHTTP.Create(nil); HTTP2.URL := Server; HTTP2.Execute; tempo := PChar(AdjustLineBreaks(HTTP2.sl.text)); Buffer := PChar(tempo); HtmlParser2 := THtmlParser.Create; try HtmlDoc2 := HtmlParser2.parseString(Buffer) finally HtmlParser2.Free end; Formatter2 := TTextFormatter.Create; try HTML2 := TStringList.Create; HTML2.Text := Formatter2.getText(HtmlDoc2); finally Formatter2.Free end; for k:= 0 to HTML2.Count-1 do begin nome := HTML2.Strings[k]; tempo := copy(nome, 0, 17); if tempo = Base then begin nome := copy(HTML2.Strings[k+1], 0,length(HTML2.Strings[k+1])); HTTP2.Free; HTML2.Free; SQL.ADD('insert into dominio (nomeregistro, dominio, nome, fim, inicio, tamanho) values("' + EN + '","' + dominio + '","' + nome + '","' + FimDom + '","' + InicioDom + '","' + inttostr(tamanho) + '")'+';'); break; end; end; end; end; end; end; end; HTML.Free; result := SQL; end; {**************************************************************** Function ParserFlat da Classe TGravador Função que recebe uma string contendo as informações básicas de uma proteína no formato Flat. Retorna uma StringList contendo as instruções para inclusão das informações básicas da proteína no banco de dados. *****************************************************************} function TGravador.ParserFlat(FlatProt: WideString): TStrings; var flag, i, j, k, l, q, m, ultimo, fim, inicio, indice, aux2 : integer; funcao,ultimochar, funcaotemp, temp5, tipo, dominio, valor, nome, accession, comentario, pesoseq, gene,taxonomia,tamanhoseq, Sequencia, citacao, autor, CCtemp, OCtemp, RTtemp, RLtemp, SQtemp, titulo, temp2,publicacao, temp3, temp4, aux, DEtemp, scopo, tissue, temp, refid, EN, nomecientifico, nomevulgar,nomegene, data : string; ListaTitulo, ListaAutores, ListaPublicacoes, ListaIndices, ListaAC, ListaNomes, ListaSinonimo, ListaSynonimsGene, ListaTaxonomia : TStrings; TempQuery : string; Proteina, SQL : TStrings; F : textfile; datasql : string; begin Proteina := TStringList.Create; SQL := TStringList.Create; ListaIndices := TStringList.Create; flag := 0; //inicialização de variáveis Proteina.Text := FlatProt; for i:= 0 to Proteina.Count-1 do begin temp := Proteina.Strings[i]; if copy(temp,0,2) = 'CC' then begin ultimochar := copy(temp,length(temp), 1); if (ultimochar = '.') and (flag = 1) then begin funcao := funcaotemp + copy(temp, 9, length(temp)-2); for l := 0 to length(funcao)-1 do begin if (funcao[l] = #39) or (funcao[l] = #34) then funcao[l] := ' '; end; break; end else if copy(temp,0, 17) = 'CC -!- FUNCTION' then begin funcaotemp := funcaotemp + copy(temp, 20, length(temp)-1); flag := 1; end else begin funcaotemp := funcaotemp + copy(temp, 9, length(temp)-1); end; end; end; for i:=0 to Proteina.Count-1 do begin temp := Proteina.Strings[i]; if copy(temp,0,2) = 'ID' then begin for j := 6 to length(temp) do if temp[j] = ' ' then begin break; end; EN := copy(temp, 6, j-6); SQL.ADD('insert into proteina (nomeregistro, funcao) values("' + EN + '","' + funcao + '")'+';'); end; if copy(temp,0,2) = 'AC' then begin inicio := 4; for j := inicio to length(temp) do if temp[j] = ';' then begin fim := j; accession := copy(temp, inicio+2, fim-inicio-2); SQL.ADD('insert into ac (nomeregistro, accession) values("' + EN + '","' + accession + '")'+';'); inicio := fim; end; end; if copy(temp,0,2) = 'DT' then begin for j := 0 to length(temp) do begin if temp[j] = ',' then begin data := copy(temp, 6, j-6); comentario := copy(temp, j+2, length(temp)); SQL.ADD('insert into datas (nomeregistro, data, comentario) values("' + EN + '","' + data + '","' + comentario + '")'+';'); end; end; end; if copy(temp,0,2) = 'DE' then begin flag := 0; inicio := 0; if temp[length(temp)] = '-' then temp := copy(temp,6, length(temp)-1) else temp := copy(temp,6, length(temp)); DEtemp := DEtemp + temp; if temp[length(temp)] = '.' then for j := inicio to length(DEtemp) do begin if (DEtemp[j] = '(') and (flag = 0) then begin inicio := j; nome := copy(DEtemp, 0, inicio-2); tipo := 'Name'; SQL.ADD('insert into nome (nomeregistro, nome, tipo) values("' + EN + '","' + nome + '","' + tipo + '")'+';'); flag := 1; end; if (DEtemp[j] = '(') and (flag = 1) then begin inicio := j; end; if DEtemp[j] = ')' then begin fim := j; nome := copy(DEtemp, inicio+1, fim-inicio-1); tipo := 'Synonyms'; SQL.ADD('insert into nome (nomeregistro, nome, tipo) values("' + EN + '","' + nome + '","' + tipo + '")'+';'); end; end; end; if copy(temp,0,2) = 'GN' then begin inicio := 4; flag := 0; for j := inicio to length(temp) do if temp[j] = ';' then begin fim := j; temp2 := copy(temp, inicio+2, fim-inicio-1); for k := 0 to length(temp2) do begin if temp2[k] = '=' then begin if copy(temp2, 0, k-1) = 'Name' then begin gene := copy(temp2, k+1, length(temp2)-k-1); nomegene := 'Name'; SQL.ADD('insert into gene (nomeregistro, tipo, gene) values("' + EN + '","' + nomegene + '","' + gene + '")'+';'); end; if copy(temp2, 0, k-1) = 'Synonyms' then begin temp3 := copy(temp2,k+1, length(temp2)-k); inicio := 0; for l := 0 to length(temp3) do begin temp4 := temp3[l]; if temp4 = ',' then begin fim := l; nomegene := 'Synonyms'; gene := copy(temp3, inicio+1, fim-inicio-1); SQL.ADD('insert into gene (nomeregistro, tipo, gene) values("' + EN + '","' + nomegene + '","' + gene + '")'+';'); inicio := fim+1; flag := 1; end; if (temp4 = ';') and (flag = 1) then begin nomegene := 'Synonyms'; gene := copy(temp3,fim+3,length(temp3)-fim-3); SQL.ADD('insert into gene (nomeregistro, tipo, gene) values("' + EN + '","' + nomegene + '","' + gene + '")'+';'); end; if (temp4 = ';') and (flag = 0) then begin nomegene := 'Synonyms'; gene := copy(temp3,0,length(temp3)-1); SQL.ADD('insert into gene (nomeregistro, tipo, gene) values("' + EN + '","' + nomegene + '","' + gene + '")'+';'); end; end; end; end; end; inicio := fim; end; end; if copy(temp,0,2) = 'OS' then begin for j := 0 to length(temp) do begin if temp[j] = '(' then begin nomecientifico := copy(temp, 6, j-7); nomevulgar := copy(temp, j+1, length(temp)-j-2); break; end; if temp[j] = '.' then begin nomecientifico := copy(temp, 6, length(temp)-2); nomevulgar := ''; end; end; SQL.ADD('insert into organismo (nomecientifico, nomevulgar) values("' + nomecientifico + '","' + nomevulgar + '")'+';'); SQL.ADD('insert into organismo_has_proteina (nomecientifico, nomeregistro) values("' + nomecientifico + '","' + EN + '")'+';'); end; if copy(temp,0,2) = 'OC' then begin temp := copy(temp,6, length(temp)); OCtemp := OCtemp + temp; if temp[length(temp)] = '.' then begin inicio := 0; for j := 0 to length(OCtemp) do begin if OCtemp[j] = ';' then begin fim := j; taxonomia := alltrim(copy(OCtemp, inicio+1, fim-inicio-1)); SQL.ADD('insert into organismo_has_taxonomia (nomecientifico, taxonomia) values("' + nomecientifico + '","' + taxonomia + '")'+';'); inicio := fim; end; if OCtemp[j] = '.' then begin taxonomia := alltrim(copy(OCtemp, inicio+1, length(OCtemp)-inicio-1)); SQL.ADD('insert into organismo_has_taxonomia (nomecientifico, taxonomia) values("' + nomecientifico + '","' + taxonomia + '")'+';'); end; end; end; end; end; i := 0; while i < Proteina.Count-1 do begin temp := Proteina.Strings[i]; if copy(temp,0,2) = 'RN' then begin ListaIndices.Add(inttostr(i)); end; if copy(temp,0,2) = 'CC' then begin ListaIndices.Add(inttostr(i)); Break; end; inc(i); end; i := 0; while i < Proteina.Count do begin temp := Proteina.Strings[i]; inicio := 16; flag := 0; if copy(temp,0,2) = 'SQ' then begin for m := 0 to length(temp) do begin if (temp[m] = ';') and (flag = 1) then begin pesoseq := copy(temp, inicio+2, m-inicio-2); end; if (temp[m] = ';') and (flag = 0) then begin tamanhoseq := copy(temp, inicio, m-inicio); inicio := m; flag := 1; end; end; end; if copy(temp,0,2) = ' ' then begin temp2 := copy(Proteina.strings[i], 6, length(Proteina.strings[i])); temp2 := copy(temp2, 1, length(temp)); SQtemp := SQtemp + temp2; end; if copy(temp,0,2) = '//' then begin Sequencia := copy(SQtemp, 1, length(SQtemp)-1); Sequencia := AllTrim(Sequencia); SQL.ADD('insert into sequencia (nomeregistro, tamanho, peso, sequencia) values("' + EN + '","' + tamanhoseq + '","' + pesoseq + '","' + sequencia + '")'+';'); RTtemp := ''; end; inc(i); end; for i:=0 to ListaIndices.Count-2 do begin indice := strtoint(ListaIndices.Strings[i]); j := indice; refid := copy(Proteina.strings[j], 7, length(Proteina.strings[j])-7); while j < strtoint(ListaIndices.Strings[i+1]) do begin temp := Proteina.strings[j]; if copy(temp,0,2) = 'RP' then begin scopo := copy(Proteina.strings[j], 6, length(Proteina.strings[j])-6); end; if copy(temp,0,2) = 'RC' then begin tissue := copy(Proteina.strings[j], 13, length(Proteina.strings[j])-13); end; if copy(temp,0,2) = 'RX' then begin publicacao := copy(Proteina.strings[j], 6, length(Proteina.strings[j])-6); end; if copy(temp,0,2) = 'RA' then begin temp2 := copy(Proteina.strings[j], 6, length(Proteina.strings[j])-5); inicio := 0; for k := inicio to length(temp2) do begin if temp2[k] = ',' then begin fim := k; autor := copy(temp2, inicio+1, fim-inicio-1); SQL.ADD('insert into referencia_has_autor (nomeregistro, refid, nome) values("' + EN + '","' + refid + '","' + autor + '")'+';'); inicio := fim; end; end; end; if copy(temp,0,2) = 'RL' then begin temp2 := copy(Proteina.strings[j], 6, length(Proteina.strings[j])); if temp2[length(temp)] = '-' then temp2 := copy(temp2,1, length(temp)-1) else temp2 := copy(temp2,1, length(temp)); RLtemp := RLtemp + ' ' + temp2; if temp2[length(temp2)] = '.' then begin citacao := copy(RTtemp, 1, length(RTtemp)-1); RLtemp := ''; end; end; if copy(temp,0,2) = 'RT' then begin temp2 := copy(Proteina.strings[j], 6, length(Proteina.strings[j])); if temp2[length(temp)] = '-' then temp2 := copy(temp2,1, length(temp)-1) else temp2 := copy(temp2,1, length(temp)); RTtemp := RTtemp + ' ' + temp2; if temp2[length(temp2)] = ';' then begin Titulo := copy(RTtemp, 3, length(RTtemp)-4); for l :=0 to length(Titulo)-1 do begin if titulo[l] = #39 then titulo[l] := ' '; end; SQL.ADD('insert into referencia (nomeregistro, refid, escopo, tissue, titulo, citacao, publicacao) values("' + EN + '","' + refid + '","' + scopo + '","' + tissue + '","' + titulo + '","' + citacao + '","' + publicacao + '")'+';'); tissue := ''; RTtemp := ''; end; end; inc(j); end; end; ListaTitulo.free; ListaAutores.free; ListaPublicacoes.free; ListaIndices.free; ListaAC.free; ListaNomes.free; ListaSinonimo.free; ListaSynonimsGene.free; ListaTaxonomia.free; Proteina.Free; result := SQL; end; {**************************************************************** Function GravaSQL da Classe TGravador Função que recebe como parametro uma StringList com instruções SQL resultante das funções TBuscaProsite.Busca, TBuscaDominio.Busca, TGravador.ParseFlat e TBuscaESTRUTURASEC.Busca Antes da execução de cada instrução, realiza a uma consulta a fim de verificar se existe duplicidade de registros. *****************************************************************} function TGravador.GravaSQL(SQL: TStrings): Boolean; var flag, aux2, i, fim, inicio, q : integer; TempQuery, valor : string; inicio_sec, final_sec, tipo, gene, dominio, acmotivo, iniciomotivo, EN, refid, nome, nomecientifico, taxonomia, sequencia, accession : string; ZQuery : TZQuery; Connection : TZConnection; begin Leini; Connection := TZConnection.Create(nil); Connection.Protocol := 'mysql'; Connection.HostName := HostName; Connection.Database := Database; Connection.User := Usuario; Connection.Password := senha; ZQuery := TZQuery.Create(nil); Zquery.Connection := Connection; inicio := 0; //inicialização de variáveis for q := 0 to SQL.Count-1 do begin TempQuery := SQL.Strings[q]; flag := 0; // verificação da existencia ou não do registro no banco // verificação para cada tipo de registro, // após verificação, registro é inserido no banco. if copy(TempQuery, 0, 32) = 'insert into referencia_has_autor' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; inicio := i; end; case flag of 1 : EN := valor; 3 : refid := valor; 5 : nome := valor; end; end; flag := 0; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from referencia_has_autor'); zQuery.sql.ADD('where nomeregistro like "' + EN + '" and refid like "' + refid + '" and nome like "' + nome + '"'); zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; if copy(TempQuery, 0, 21) = 'insert into taxonomia' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; inicio := i; end; case flag of 1 : taxonomia := valor; end; end; flag := 0; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from taxonomia'); zQuery.sql.ADD('where taxonomia like "' + taxonomia + '"'); zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; if copy(TempQuery, 0, 35) = 'insert into organismo_has_taxonomia' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; inicio := i; end; case flag of 1 : nomecientifico := valor; 3 : taxonomia := valor; end; end; flag := 0; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from organismo_has_taxonomia'); zQuery.sql.ADD('where taxonomia like "' + taxonomia + '" and nomecientifico like "' + nomecientifico + '"'); zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; if copy(TempQuery, 0, 21) = 'insert into sequencia' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; '"'); inicio := i; end; case flag of 1 : EN := valor; 7 : sequencia := valor; end; end; flag := 0; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from sequencia'); zQuery.sql.ADD('where nomeregistro like "' + EN + '" and sequencia like "' + sequencia + zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; if copy(TempQuery, 0, 20) = 'insert into proteina' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; inicio := i; end; case flag of 1 : EN := valor; end; end; flag := 0; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from proteina'); zQuery.sql.ADD('where nomeregistro like "' + EN + '"'); zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; if copy(TempQuery, 0, 23) = 'insert into organismo (' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; inicio := i; end; case flag of 1 : nomecientifico := valor; end; end; flag := 0; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from organismo'); zQuery.SQL.ADD('where nomecientifico = "' + nomecientifico + '"'); zQuery.ExecSQL; zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; if copy(TempQuery, 0, 34) = 'insert into organismo_has_proteina' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; inicio := i; end; case flag of 1 : nomecientifico := valor; 3 : EN := valor; end; end; flag := 0; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from organismo_has_proteina'); zQuery.sql.ADD('where nomecientifico like "' + nomecientifico + '" and nomeregistro like "' + EN + '"'); zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; if copy(TempQuery, 0, 16) = 'insert into nome' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; inicio := i; end; case flag of 1 : EN := valor; 3 : nome := valor; end; end; flag := 0; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from nome'); zQuery.sql.ADD('where nomeregistro like "' + EN + '" and nome like "' + nome + '"'); zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; if copy(TempQuery, 0, 17) = 'insert into datas' then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; if copy(TempQuery, 0, 14) = 'insert into ac' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin '"'); fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; inicio := i; end; case flag of 1 : EN := valor; 3 : accession := valor; end; end; flag := 0; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from ac'); zQuery.sql.ADD('where nomeregistro like "' + EN + '" and accession like "' + accession + zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; if copy(TempQuery, 0, 24) = 'insert into referencia (' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; inicio := i; end; case flag of 1 : EN := valor; 3 : refid := valor; end; end; flag := 0; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from referencia'); zQuery.sql.ADD('where nomeregistro = "' + EN + '" and refid = "' + refid + '";'); zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; if copy(TempQuery, 0, 18) = 'insert into motivo' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; inicio := i; end; case flag of 1 : acmotivo := valor; 3 : nome := valor; 5 : iniciomotivo := valor; 7 : EN := valor; end; end; flag := 0; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from motivo'); zQuery.sql.ADD('where nomeregistro like "' + EN + '" and acmotivo like "' + acmotivo + '" and nome like "' + nome + '" and inicio like "' + iniciomotivo + '"'); zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; if copy(TempQuery, 0, 19) = 'insert into dominio' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; inicio := i; end; case flag of 1 : EN := valor; 3 : dominio := valor; 5 : nome := valor; end; end; flag := 0; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from dominio'); zQuery.sql.ADD('where nomeregistro like "' + EN + '" and dominio like "' + dominio + '" and nome like "' + nome + '"'); zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; if copy(TempQuery, 0, 16) = 'insert into gene' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; inicio := i; end; case flag of 1 : EN := valor; 3 : tipo := valor; 5 : gene := valor; end; end; flag := 0; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from gene'); zQuery.sql.ADD('where nomeregistro like "' + EN + '" and gene like "' + gene + '" and tipo like "' + tipo + '";'); zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; if copy(TempQuery, 0, 31) = 'insert into estruturasecundaria' then begin aux2 := 0; for i := 0 to length(TempQuery)-1 do begin if (TempQuery[i] = #34) and (aux2 = 1) then begin fim := i; valor := copy(TempQuery, inicio+1, fim-inicio-1); inc(flag); aux2 := 0; end; if (TempQuery[i] = #34) then begin aux2 := 1; inicio := i; end; case flag of 1 : EN := valor; 3 : tipo := valor; 5 : inicio_sec := valor; 7 : final_sec := valor; end; end; zQuery.SQL.Clear; zQuery.SQL.ADD('select * from estruturasecundaria'); zQuery.sql.ADD('where nomeregistro = "' + EN + '" and tipoestrutura = "' + tipo + '" and inicio = "' + inicio_sec + '" and fim = "' + final_sec + '";'); zQuery.Open; if zQuery.IsEmpty then begin zQuery.SQL.Clear; zQuery.SQL.Add(TempQuery); zQuery.ExecSQL; end; end; end; result := true; end; {**************************************************************** Function Busca da Classe TBuscaESTRUTURASEC Função que recebe como parametro o nome de registro da proteína, Sequencia a proteína e uma string contendo informações da proteina no formato Flat. Verifica se existe estrutura secundaria para essa proteína nas informações básicas, senão utiliza a ferramenta EMBOSS para a predição da mesma. *****************************************************************} function TBuscaESTRUTURASEC.Busca(var EN: string; SEQ: string; proteina: TStrings ): TStrings; var Html : TStrings; i, j, flag, inicio, fim: integer; linha, Server, temp: string; SQL : TStrings; HtmlDoc: TDocument; Formatter: TBaseFormatter; HtmlParser: THtmlParser; ieHTTP: TIEHTTP; sec, tipo : string; FT, inicio_sec, final_sec : string; begin ieHttp := TIEHTTP.Create(nil); SQL := TStringList.Create; html := TStringList.Create; Server := 'http://npsa-pbil.ibcp.fr/cgi-bin/secpred_gor4.pl?notice='+SEQ; html.Text := iehttp.get_url(Server); HtmlParser := THtmlParser.Create; try HtmlDoc := HtmlParser.parseString(HTML.Text) finally HtmlParser.Free end; Formatter := TTextFormatter.Create; try HTML.Text := Formatter.getText(HtmlDoc) finally Formatter.Free end; i := 0; while i <= HTML.Count-1 do begin linha := HTML.Strings[i]; if length(linha) >= 10 then if linha[10] = '|' then begin i := i + 2; seq := HTML.Strings[i]; break; end; inc(i); end; inicio := 0; flag := 1; while i <= length(seq)-1 do begin if (seq[i] = ' ') and (flag = 0) then begin flag := 1; inicio := i; inc(i); end; if (seq[i] = ' ') and (flag = 1) then begin flag := 0; sec := sec + copy(seq, inicio, i-inicio); inicio := i; end; inc(i); end; sec := sec + copy(seq, inicio, i-inicio); i:=0; while i <= length(sec)-1 do begin if tipo = copy(sec,i,1) then else inicio := i; tipo := copy(sec,i,1); if (sec[i+1] <> tipo) and (tipo <> ' ') then begin fim := i; if tipo = 'c' then tipo := 'RANDOM COIL'; if tipo = 'e' then tipo := 'EXTENDED STRAND'; if tipo = 'b' then tipo := 'BETA'; if tipo = 'h' then tipo := 'ALFA HELIX'; if tipo = 'i' then tipo := 'PI HELIX'; if tipo = 's' then tipo := 'BRAND REGION'; if tipo = 't' then tipo := 'BETA TURN'; if tipo = '?' then tipo := 'AMBIGOUS STATES'; if tipo = 'g' then tipo := '30x10 HELIX'; SQL.ADD('insert into estruturasecundaria (nomeregistro, tipoestrutura, inicio, fim) values("' + EN + '","' + tipo + '","' + inttostr(inicio) + '","' + inttostr(fim) + '");'); end; inc(i); end; for i := 0 to proteina.count-1 do begin linha := copy(proteina.Strings[i], 0, length(proteina.Strings[i])); linha := linha; FT := copy(linha, 0, 2); if FT = 'FT' then begin // FT CHAIN j := 7; tipo := ''; temp := ''; while j <= length(linha) do begin if (linha[j] = ' ') and (tipo = '') then begin tipo := copy(linha, 5, j-5); end; if (linha[j] <> ' ') and (tipo <> '') then begin temp := temp + copy(linha, j, 1); flag := 1; end; if (linha[j] = ' ') or (j = length(linha)) and (tipo <> '') and (flag = 1) then begin if (final_sec = '') and (inicio_sec <> '') then begin final_sec := temp; end; if (inicio_sec = '') then begin inicio_sec := temp; temp := ''; end; end; inc(j); end; end; alltrim(tipo); if (copy(tipo, 2, 1) <> ' ') then if (final_sec <> '') and (inicio_sec <> '') then SQL.ADD('insert into estruturasecundaria (nomeregistro, tipoestrutura, inicio, fim) values("' + EN + '","' + tipo + '","' + inicio_sec + '","' + final_sec + '");'); inicio_sec := ''; final_sec := ''; tipo := ''; end; result := SQL; end; [FIM DE SEÇÃO. Não remova esta quebra de se