Tutorial prático de Snakemake (WSL)
Workflow com Snakemake (WSL) — baixando SRA e gerando FASTQ
Fala, pessoal! Se você já cansou de rodar comandos soltos no terminal e quer organizar sua análise em etapas reprodutíveis, o Snakemake é exatamente o que você precisa. Ele transforma sua pipeline em um arquivo declarativo Descreve o que fazer, não como fazer. (o Snakemake) e cuida de dependências, paralelismo e repetição automática só do que falta. Ele é maravilhosoo!! 🥹🥹🥹
Neste guia, vamos montar um workflow básico para:
- Baixar dados do SRA (via
sra-tools
); - Converter para FASTQ (
fasterq-dump
); - Compactar e contar reads (para QC simples);
- Fazer tudo isso no WSL.
- No final tenho um desafio!!
A ideia é: você define as regras e deixa o Snakemake fazer o trabalho pesado.
O que é o Snakemake?
- O Snakemake é inspirado no make GNU Make é um programa para automatizar processos. , mas foi pensado para ciência de dados e bioinformática.
- Você descreve alvos finais Arquivos ou resultados finais que você quer gerar, como um FASTQ processado ou uma tabela. e regras Instruções que explicam como transformar arquivos de entrada em saída. usando inputs Arquivos de entrada necessários para executar a regra. e outputs Arquivos de saída produzidos pela regra. .
- O Snakemake resolve a ordem certa, executa em paralelo e evita retrabalho.
- É perfeito para garantir reprodutibilidade Capacidade de repetir a análise e obter os mesmos resultados em qualquer computador. e organização Estrutura clara dos arquivos e etapas, sem precisar relembrar comandos manuais. .
O que você vai precisar antes:
- WSL (Linux no Windows) — tutorial
- sra-tools (prefetch / fasterq-dump) — sra-tools
- Conda (opcional, mas recomendado) para instalar o Snakemake — Conda
Você pode instalar o Snakemake via conda (recomendado) ou pip. Aqui vamos de conda.
Passo a passo
- Instalação do Snakemake
- Estrutura do projeto
- Configuração (config.yaml)
- Snakefile (regras)
- Executar e atualizar o workflow
- Explicação do código
1. Instalação do Snakemake
Com o Conda instalado no WSL, crie um ambiente dedicado:
conda create -n smk -c conda-forge -c bioconda snakemake=8.* sra-tools pigz -y
conda activate smk
Incluímos sra-tools e pigz (compactação paralela). Se preferir, dá pra instalar Snakemake via pip install snakemake
, mas o ecossistema bio costuma ficar mais estável via conda.
Elemento | Descrição |
---|---|
conda create | Cria um novo ambiente Conda. |
-n smk | Define o nome do ambiente como "smk". |
-c conda-forge | Usa o canal conda-forge (repositório comunitário). |
-c bioconda | Usa o canal bioconda (bioinformática). |
snakemake=8.* | Instala o Snakemake versão 8. |
sra-tools | Ferramentas do SRA (download/convert). |
pigz | gzip paralelo (compactação rápida). |
-y | Aceita confirmações automaticamente. |
2. Estrutura do projeto
Crie uma pastinha para o workflow:
mkdir -p ~/smk_demo/smk-sra-demo/{config,fastq,logs,sra,tmp}
cd smk_demo/smk-sra-demo
mkdir -p ~/smk_demo/smk-sra-demo/{config,fastq,logs,sra,tmp}
Esse comando cria a estrutura de pastas necessária para o projeto Snakemake:A opção
- config → onde ficam os arquivos de configuração (ex: YAML com parâmetros).
- fastq → diretório para armazenar os arquivos FASTQ brutos.
- logs → registros de execução (logs de cada regra).
- sra → downloads originais do SRA (formato .sra).
- tmp → arquivos temporários usados durante o workflow.
-p
garante que as pastas sejam criadas de forma recursiva, sem erro caso já existam.
3. Configuração (config.yaml
)
Vamos listar os acessos SRA que queremos baixar. Crie o arquivo:
nano config/config.yaml
Cole o conteúdo abaixo e salve:
# config/config.yaml samples: - SRR34840432 # <-- troque por seus SRRs # Opções para fasterq-dump fasterq: threads: 4 tmpdir: "tmp" # Gzip paralelo (pigz) pigz_threads: 4
Dicas rápidas donano
Onano
é um editor de texto simples no terminal. Alguns atalhos úteis:Dica: a barra inferior do
Ctrl + O
→ Salvar (escrever alterações no arquivo).Ctrl + X
→ Sair donano
(pede para salvar antes, se houve mudanças).Ctrl + W
→ Buscar texto dentro do arquivo.Ctrl + K
→ Cortar a linha atual.Ctrl + U
→ Colar a linha cortada.Ctrl + G
→ Ajuda (mostra todos os comandos).nano
mostra os principais atalhos — o símbolo^
significa “Ctrl”.
4. Snakefile (regras)
Crie o Snakefile na raiz do projeto:
nano Snakefile
Cole o conteúdo:
# Snakefile configfile: "config/config.yaml" SAMPLES = config["samples"] FASTERQ_THREADS = int(config.get("fasterq", {}).get("threads", 4)) TMPDIR = config.get("fasterq", {}).get("tmpdir", "tmp") PIGZ_THREADS = int(config.get("pigz_threads", 4)) # (Opcional) Validar wildcards: SRR + dígitos wildcard_constraints: s = r"SRR[0-9]+" # Alvo final: FASTQ compactados + contagem simples de reads rule all: input: expand("fastq/{s}_1.fastq.gz", s=SAMPLES), expand("fastq/{s}_2.fastq.gz", s=SAMPLES), expand("logs/{s}.reads.txt", s=SAMPLES) # 1) Baixar o .sra (cache local em ./sra/{s}/{s}.sra) rule prefetch: output: "sra/{s}/{s}.sra" # se quiser economizar espaço: temp("sra/{s}/{s}.sra") log: "logs/{s}.prefetch.log" shell: "prefetch {wildcards.s} -O sra &> {log}" # 2) Converter .sra em FASTQ pareado (sem compressão) rule fasterq_dump: input: "sra/{s}/{s}.sra" output: temp("fastq/{s}_1.fastq"), temp("fastq/{s}_2.fastq") threads: FASTERQ_THREADS params: tmp = TMPDIR log: "logs/{s}.fasterq.log" benchmark: "logs/{s}.fasterq.benchmark.tsv" shell: r""" mkdir -p {params.tmp} fastq fasterq-dump --split-files --threads {threads} --temp {params.tmp} -O fastq {input} &> {log} """ # 3) Compactar com pigz rule gzip_fastq: input: r1 = "fastq/{s}_1.fastq", r2 = "fastq/{s}_2.fastq" output: r1_gz = "fastq/{s}_1.fastq.gz", r2_gz = "fastq/{s}_2.fastq.gz" threads: PIGZ_THREADS log: "logs/{s}.pigz.log" benchmark: "logs/{s}.pigz.benchmark.tsv" shell: r""" ( pigz -p {threads} -f {input.r1} pigz -p {threads} -f {input.r2} ) &> {log} """ # 4) QC simples: contar reads (linhas/4) rule count_reads: input: r1 = "fastq/{s}_1.fastq.gz", r2 = "fastq/{s}_2.fastq.gz" output: "logs/{s}.reads.txt" log: "logs/{s}.count_reads.log" shell: r""" set -euo pipefail mkdir -p logs r1=$(( $(pigz -dc {input.r1} | wc -l) / 4 )) r2=$(( $(pigz -dc {input.r2} | wc -l) / 4 )) ( printf "Sample\tR1_reads\tR2_reads\n" > {output} printf "%s\t%s\t%s\n" "{wildcards.s}" "$r1" "$r2" >> {output} ) &> {log} """
5. Executar e atualizar o workflow
Ative o ambiente (se ainda não estiver ativo) e rode:
conda activate smk snakemake -j 4
-j 4
→ Define que o Snakemake pode executar até 4 tarefas em paralelo.
Ajuste esse número de acordo com a quantidade de núcleos da sua CPU para aproveitar melhor o desempenho da máquina.
Você deverá ter algo assim:
Você poderá ver os seus resultados aqui:
Re-executar somente o que está faltando (Snakemake já faz isso!):
snakemake -j 4
Limpar outputs gerados (cuidado!):
snakemake --delete-all-output
Onde ficam os arquivos?
SRA: sra/SRRxxxxx/SRRxxxxx.sra FASTQ gz: fastq/SRRxxxxx_1.fastq.gz e fastq/SRRxxxxx_2.fastq.gz Leituras contadas: logs/SRRxxxxx.reads.txt
Abra o .reads.txt para ver um resumo rápido:
column -t logs/*.reads.txt | less -S
Dicas (WSL + SRA-Tools) Se faltar espaço em /tmp, use o tmpdir do config.yaml (já configurado para tmp/)
Se o prefetch estiver lento, configure o cache do SRA na sua home (vdb-config --interactive)
Para testar rápido, use um SRR e depois aumente a lista
Personalizando Edite config/config.yaml e adicione/remova SRRs.
Quer rodar apenas um sample?
snakemake -j 4 fastq/SRR34840432_1.fastq.gz fastq/SRR34840432_2.fastq.gz
- Ver o que seria executado (sem rodar):
snakemake -n -p
- Ver o DAG:
snakemake --dag | dot -Tsvg > dag.svg
- Resumo/estado:
snakemake --summary
- Relatório reproduzível:
snakemake --report report.zip
- Reexecutar alvos incompletos:
snakemake --rerun-incomplete
- FS lento?
snakemake -j 4 --latency-wait 60
- Lembrete:
-j
= jobs concorrentes;threads:
= CPUs por job.
6. Explicação do código
1. configfile: “config/config.yaml”
- Diz ao Snakemake para ler um arquivo YAML Formato de configuração simples e legível, usado para organizar parâmetros. de configuração.
- Isso mantém os parâmetros Valores como lista de amostras (SRRs), número de threads ou diretórios temporários. fora do código, deixando o workflow mais limpo e fácil de ajustar.
Exemplo de config/config.yaml:
samples: - SRR34840432 # pode ter 1 ou várias entradas fasterq: threads: 4 # Núcleos a serem utilizados tmpdir: "tmp" pigz_threads: 4
2. Variáveis Python lidas do YAML
SAMPLES = config["samples"] FASTERQ_THREADS = int(config.get("fasterq", {}).get("threads", 4)) TMPDIR = config.get("fasterq", {}).get("tmpdir", "tmp") PIGZ_THREADS = int(config.get("pigz_threads", 4))
Elemento | Descrição |
---|---|
YAML | Formato de arquivo usado para guardar informações de configuração de forma organizada e fácil de ler. |
SAMPLES | Lista de acessos
SRA
Repositório Sequence Read Archive, onde ficam armazenados dados públicos de sequenciamento.
(ex.: ["SRR34840432"] ).
|
FASTERQ_THREADS | Número de threads para o fasterq-dump . |
TMPDIR | Pasta para arquivos temporários do SRA-tools (evita encher /tmp ). |
PIGZ_THREADS | Número de threads do pigz (gzip paralelo). |
Observação | Essas variáveis podem ser usadas dentro das regras (como em threads: ou params: ). |
3. rule all — o alvo agregado
rule all: input: expand("fastq/{s}_1.fastq.gz", s=SAMPLES), expand("fastq/{s}_2.fastq.gz", s=SAMPLES), expand("logs/{s}.reads.txt", s=SAMPLES)
Elemento | Descrição |
---|---|
rule all | Define os alvos finais Arquivos ou resultados finais que você quer gerar. que o workflow precisa gerar. |
expand |
Cria automaticamente a lista desses resultados para todas as amostras, substituindo
{s} pelos nomes em SAMPLES
(ex.: 1 amostra gera 3 arquivos, 100 amostras geram 300).
|
O Snakemake então monta a sequência lógica de etapas ( DAG Mapa que mostra a ordem e dependências das etapas. ) para chegar nesses resultados e executa apenas o que ainda não foi feito ou está desatualizado.
4. rule prefetch — baixar o .sra
rule prefetch: output: "sra/{s}/{s}.sra" shell: """ prefetch {wildcards.s} -O sra """
Elemento | Descrição |
---|---|
output | Indica onde o arquivo final deve existir ao término da regra. |
{s} |
É um wildcard Um curinga que assume valores diferentes, como os nomes das amostras (ex.: SRR34840432). , substituído automaticamente por cada SRR da lista. |
prefetch |
Baixa o acesso e cria uma subpasta (sra/SRR.../SRR....sra ). |
Dependência | O Snakemake entende que, se fastq/... depende de sra/{s}/{s}.sra , esta regra precisa rodar primeiro. |
Se sua versão do SRA-tools não criasse subpastas, bastaria apontar para sra/{s}.sra. Aqui usamos o comportamento mais comum/estável.
5. rule fasterq_dump — converter .sra em FASTQ
rule fasterq_dump: input: "sra/{s}/{s}.sra" output: temp("fastq/{s}_1.fastq"), temp("fastq/{s}_2.fastq") threads: FASTERQ_THREADS params: tmp=TMPDIR log: "logs/{s}.fasterq.log" benchmark: "logs/{s}.fasterq.benchmark.tsv" shell: r""" mkdir -p {params.tmp} fastq fasterq-dump --split-files --threads {threads} --temp {params.tmp} -O fastq {input} &> {log} """
Elemento | Descrição |
---|---|
input | Exige o arquivo .sra já baixado. Assim o Snakemake garante a ordem de execução. |
output | Produz R1 e R2 não compactados. |
temp(...) |
Marca os arquivos como intermediários Gerados no meio do processo; são removidos automaticamente quando o pipeline termina com sucesso. ; mantém o projeto limpo e economiza espaço. |
threads | Informa ao Snakemake quantas CPUs Número de núcleos alocados para a regra; útil para paralelizar e escalar. a regra pode usar. |
params.tmp |
Pasta temporária do
SRA-tools
Conjunto de utilitários do NCBI (ex.: prefetch, fasterq-dump) para baixar e converter dados do SRA.
(evita gargalos em /tmp ).
|
--split-files |
Separa leituras
paired-end
Biblioteca com duas leituras por fragmento (R1 e R2), uma de cada extremidade.
em R1/R2 .
|
{input} |
Passa o caminho do .sra explicitamente para o comando (também funciona passando apenas o acesso). |
Se for single-end, troque a regra para gerar um FASTQ e ajuste as regras seguintes.
6. rule gzip_fastq — compactar com pigz
rule gzip_fastq: input: r1="fastq/{s}_1.fastq", r2="fastq/{s}_2.fastq" output: r1_gz="fastq/{s}_1.fastq.gz", r2_gz="fastq/{s}_2.fastq.gz" threads: PIGZ_THREADS shell: r""" pigz -p {threads} -f {input.r1} pigz -p {threads} -f {input.r2} """
Elemento | Descrição |
---|---|
pigz |
É um gzip paralelo. Comprime arquivos usando várias
CPUs
Quantidade de núcleos: executa várias tarefas.
, ficando bem mais rápido que o gzip tradicional.
|
threads | Comunica ao escalonador do Snakemake quantas CPUs reservar para essa regra. |
-f |
Força a sobrescrita de arquivos existentes (útil ao relançar trechos do workflow). |
7. rule count_reads — QC simples
rule count_reads: input: r1="fastq/{s}_1.fastq.gz", r2="fastq/{s}_2.fastq.gz" output: "logs/{s}.reads.txt" shell: r""" mkdir -p logs r1=$(( $(pigz -dc {input.r1} | wc -l) / 4 )) r2=$(( $(pigz -dc {input.r2} | wc -l) / 4 )) echo -e "Sample\tR1_reads\tR2_reads" > {output} echo -e "{wildcards.s}\t$r1\t$r2" >> {output} """
Elemento | Descrição |
---|---|
zcat | wc -l |
Conta o número de linhas de um arquivo FASTQ compactado; como cada
read
Read individual produzida pelo sequenciador; em FASTQ cada read ocupa 4 linhas.
ocupa 4 linhas, o total de reads é linhas ÷ 4 .
|
Relatório TSV | Gera um relatório tabular simples por amostra no formato TSV (valores separados por tabulação). |
mkdir -p logs |
Garante que a pasta logs exista (cria se não existir). |
Como o Snakemake decide a ordem (DAG)
-
Ao rodar
snakemake -j 4
, o Snakemake olha os alvos finais Arquivos ou resultados finais que você quer gerar, como um FASTQ processado ou uma tabela. definidos emrule all
. - Para cada arquivo que ainda não existe, ele rastreia para trás qual regra produz aquela saída.
-
Monta um
DAG
Mapa que mostra a ordem e dependências das etapas.
(grafo acíclico dirigido) e executa as regras na ordem correta, em paralelo até o limite de jobs definido por
-j
. - Se você relançar o workflow, ele pula o que já está pronto — evitando retrabalho.
-
Quer trocar o número de threads? Ajuste
FASTERQ_THREADS
ePIGZ_THREADS
noconfig.yaml
.
Vamos de novos desafios? Eu não vou ensinar aqui quero que você aprenda sozinho a como adicionar FastQC/MultiQC como novas regras.
Cada ferramenta extra que você incluir pode ter o respectivo tutorial nos seus guias. Ex.: sra-tools, Conda, WSL.
Qualquer dúvida que você tiver, pode me chamar no linkedin ou qualquer outra rede social ou até por e-mail ou sinal de fumaça! Que os jogos comecem!
Até a próxima!
Dê um suporte ao meu projeto. Doe um cafézinho ☕.
Pix: biologolee@gmail.com
Bitcoin: bc1qg7qrfhclzt3sm60en53qv8fmwpuacfaxt5v55k
Referências: