Skip to content
This repository has been archived by the owner on Dec 26, 2024. It is now read-only.

Latest commit

 

History

History
103 lines (65 loc) · 9 KB

dicas-desenvolvimento.md

File metadata and controls

103 lines (65 loc) · 9 KB

Dicas para desenvolvimento

Ilustração Mendelics

Acesso rápido:


📌 Controle de versão

Utilize algum serviço para controle de versão. Exemplos comuns são: GitHub e GitLab.

Este documento que você está lendo está armazenado no GitHub, de forma que toda alteração que ele venha a ter ficará registrada. Dessa forma, fica fácil verificar quais foram as mudanças e quem foram os responsáveis.

Também fica fácil voltarmos para uma versão anterior, caso isso seja necessário.

Explicar o funcionamento do Git foge um pouco ao escopo deste material, mas existem excelente materiais em que vocês podem estudar:

📌 Workflow de análise

Existem diversas maneira de você organizar seu workflow (também chamado de pipeline). A mais simples delas é organizar tudo em um bash script junto com as instruções para a instalação das dependências, como neste exemplo:

Existem também repositórios em que organizam as etapas utilizando uma outra linguagem ao invés de Bash, como o FunGAP que organiza cada uma das etapas em scripts em Python. As instruções para a instalação das dependências ficam em um segundo documento, e como usam diversos programas a configuração do ambiente é um pouco difícil. Exemplos:

  • run_augustus.py - Encapsula a chamada do programa de predição de genes Augustus utilizando Python.
  • INSTALL.md - Instruções sobre como instalar as dependências.

As linguagens dedicadas a construção de workflows visam facilitar esse processo. Nextflow, WDL e CWL são exemplos desse tipo de linguagem. Com elas você pode focar em escrever os processos que deseja separadamente, e então liga-los em um workflow completo de análise. Geralmente elas acompanham recursos como: reaproveitamento dos resultados que já foram obtidos anteriormente, portabilidade para infraestrutura de cluster ou de cloud (Google, Amazon, etc) e medidas a respeito do tempo que cada tarefa levou e também dos recursos computacionais consumidos.

Note que essas linguagens acabam adicionando uma camada a mais na complexidade de seu projeto e por isso você precisa avaliar se é algo que lhe será útil. Faça-se as perguntas: vou executar esta análise mais do que uma vez na vida? é importante que outras pessoas consigam reproduzir meu workflow? estou disposto a investir algumas horas no aprendizado disto?

Resumindo: essas linguagens te oferecem reprodutibilidade, portabilidade e escalabilidade. Se tiver interesse consulte as documentações para aprender mais ou veja o trabalho Practical guide for managing large-scale human genome data in research (2020) para conhecer os cenários em que essas ferramentas brilham.

Para aprender mais sobre bioinformática visite a página github.com/lmigueel/Bioinformatica, existem muitas dicas e pipelines que podem ser úteis em suas análises.

📌 Dependências do projeto

Os workflows de análise costumam ter várias etapas de processamento. Imagine uma analise em que as leituras de sequenciamento primeiro passam por um programa para controle de qualidade (QC), posteriormente passam por uma etapa de alinhamento e depois algumas métricas deste alinhamento são extraidas.

Uma opção para esse fluxo seria realizar o controle de qualidade com o programa FastQC, posteriormente o alinhamento com BWA e a extração de métricas do alinhamento com o programa Samtools. Dependendo do sistema operacional (Ubuntu, fedora, Windows, MacOS) cada uma delas pode ter uma maneira diferente de ser instalada, pode até mesmo não estar disponivel.

Caso fosse optado por resolver o problema das dependências com miniconda a solução ficaria semelhante a este arquivo, nomeado environment.yml:

name: nome-arbitrario-do-ambiente
channels:
    - conda-forge
    - defaults
    - bioconda
dependencies:
    - bwa=0.7.17
    - samtools=1.14
    - fastqc=0.11.9

Para instalar suas dependências poderia ser usado o comando conda env create -f environment.yml, e depois conda activate nome-arbitrario-do-ambiente.

Caso fosse optado pelo uso de uma imagem Docker, poderíamos ter um arquivo Dockerfile com:

FROM mambaorg/micromamba:0.15.3

RUN micromamba install -c bioconda -c conda-forge -c defaults -y -n base \
        bwa=0.7.17 \
        samtools=1.14 \
        fastqc=0.11.9 && \
    micromamba clean --all --yes

Para usa-lo, poderia-se gerar a imagem com docker build -t minha-imagem . no mesmo diretório do Dockerfile. Posteriormente poderia rodar com docker run -it --rm -v /caminho/que/quiser:/work minha-imagem bash. Dessa forma você teria acesso a todos seus arquivos do diretorio /caminho/que/quiser dentro do container, bem como as dependências.

Cada vez mais, ferramentas como Miniconda e Docker vem sendo usadas para contornar o problema das dependências (e o famoso "funciona na minha máquina"). Para mais informações sobre como usar essas ferramentas consulte:

📌 Scripts customizados

Algumas vezes precisaremos escrever instruções e optamos pela linguagem que mais nos sentimos confortáveis, geralmente para tarefas simples como organizar o dado de output de algum programa de controle de qualidade ou mesmo transformar um formato de arquivo em um outro.

Aqui podemos sofrer do mesmo mal que faz com que a maior parte dos acidentes de carro ocorram próximos a residência do motorista - excesso de confiança. Para evitar cometer erros por minimizar a complexidade do problema sempre verifique todos os possiveis formatos que o dado pode se apresentar, por exemplo:

Arquivos no formato VCF podem ter muitos alelos alternativos descritos em uma mesma posição. Caso isso ocorra as colunas INFO (coluna 7) e os dados de cada amostra (coluna 9 para frente) terão campos que comportam cada um dos alelos. Se você assumir que sempre terá apenas um alelo alternativo por linha estará próximo a um acidente grave.

Sempre pense também a respeito de possiveis testes automáticos que você possa elaborar. Normalmente executamos sucessivas vezes o script até que o codigo esteja bom. Para ver se está bom inspecionamos manualmente alguns aspectos do output. Seus testes automáticos podem começar por delegar ao computador a tarefa de inspecionar os outputs.

Para quem já veio da computação isso é um pouco "chover no molhado", mas é importante destacar para os candidatos que vem de biológicas e estão embarcando agora na bioinformática. Uma biblioteca que facilita um pouco esta tarefa é a pytest-workflows. Para os testes mais simples você nem irá precisar escrever em Python.