Tutorial prático para compreender uma chamada de variantes somáticas com dados tumor–normal, estimativa de contaminação, filtragem e anotação funcional.
Finalidade educacional. Os arquivos são pequenos recortes genômicos preparados para aula. Este repositório não constitui um pipeline clínico validado e seus resultados não devem ser usados para diagnóstico.
Ao concluir o exercício, você será capaz de:
- reconhecer os arquivos necessários para uma análise tumor–normal;
- verificar a compatibilidade entre os contigs do BAM, FASTA e VCF;
- executar
Mutect2,GetPileupSummaries,CalculateContaminationeFilterMutectCalls; - comparar uma análise pareada com uma análise tumor-only usando Panel of Normals (PoN);
- identificar variantes que passaram pelos filtros e preparar o VCF para anotação com VEP.
| Componente | Configuração deste exercício | Observação |
|---|---|---|
| Referência | GRCh37/hg19, somente os contigs usados nos exemplos | Mantida por compatibilidade com os BAMs e VCFs didáticos |
| Nomes dos contigs | 9, 13 e 19, sem o prefixo chr |
Todos os arquivos de entrada precisam usar a mesma convenção |
| GATK | 4.6.2.0 | Versão fixada para reprodutibilidade |
| VEP | imagem Docker release_116.0 |
Executado em modo database; requer internet |
Para projetos novos, escolha a montagem de referência e os recursos populacionais de forma explícita. Não misture GRCh37/hg19 com GRCh38, nem arquivos com e sem o prefixo chr.
- Preparar e indexar a referência FASTA.
- Confirmar o identificador da amostra normal no read group do BAM.
- Chamar SNVs e indels somáticos com Mutect2.
- Estimar contaminação com os sítios populacionais do gnomAD.
- Filtrar as chamadas.
- Inspecionar variantes
PASSe, opcionalmente, anotar com VEP.
| Arquivo | Papel no exercício |
|---|---|
tumor_JAK2.bam / .bai |
Recorte tumoral da região de JAK2 no cromossomo 9 |
normal_JAK2.bam / .bai |
Normal pareado do exemplo JAK2 |
tumor_wp017.bam e tumor_wp018.bam |
Par tumor–normal adicional |
tumor_wp190.bam e tumor_wp191.bam |
Par tumor–normal adicional |
af-only-gnomad-*.vcf.gz / .tbi |
Sítios populacionais usados pelo Mutect2 e pela estimativa de contaminação |
somatic.Pon.vcf |
Pequeno VCF de exemplo; não substitui o PoN oficial usado na atividade |
run.chr13-chr19.sh |
Pipeline tumor–normal para os exemplos dos cromossomos 13 e 19 |
run.chr13-chr19.pon.sh |
Pipeline tumor-only com PoN |
vep-docker.sh |
Anotação do VCF filtrado com VEP em Docker |
somatico_google_colab.ipynb |
Aula guiada para Google Colab |
Para a execução local, instale:
- Bash;
wget,gzipeunzip;- samtools;
- Java compatível com a versão do GATK;
- Docker, apenas para a etapa opcional com VEP.
Clone o repositório:
git clone https://github.com/renatopuga/somatico.git
cd somaticoAlternativamente, abra o notebook no Colab:
wget -c https://github.com/broadinstitute/gatk/releases/download/4.6.2.0/gatk-4.6.2.0.zip
unzip gatk-4.6.2.0.zip
./gatk-4.6.2.0/gatk --versionOs BAMs do exercício usam o contig 9, enquanto o FASTA da UCSC usa chr9. O comando abaixo remove o prefixo somente do cabeçalho FASTA.
wget -c https://hgdownload.soe.ucsc.edu/goldenPath/hg19/chromosomes/chr9.fa.gz
zcat chr9.fa.gz | sed '/^>/ s/^>chr/>/' > chr9.fa
samtools faidx chr9.fa
./gatk-4.6.2.0/gatk CreateSequenceDictionary \
-R chr9.fa \
-O chr9.dict
./gatk-4.6.2.0/gatk ScatterIntervalsByNs \
-R chr9.fa \
-O chr9.interval_list \
-OT ACGTVerifique se os três recursos usam o mesmo contig:
samtools view -H tumor_JAK2.bam | grep '^@SQ' | head
grep '^>' chr9.fa | head
bcftools view -h af-only-gnomad-chr9.vcf.gz | grep '^##contig' | headO valor informado em -normal deve ser exatamente igual ao campo SM do read group:
samtools view -H normal_JAK2.bam \
| awk -F '\t' '$1=="@RG" {for (i=1; i<=NF; i++) if ($i ~ /^SM:/) {sub(/^SM:/,"",$i); print $i}}'Para os arquivos deste exemplo, o identificador esperado é WP044.
./gatk-4.6.2.0/gatk Mutect2 \
-R chr9.fa \
-I tumor_JAK2.bam \
-I normal_JAK2.bam \
-normal WP044 \
--germline-resource af-only-gnomad-chr9.vcf.gz \
-L chr9.interval_list \
-O somatic.vcf.gz
./gatk-4.6.2.0/gatk GetPileupSummaries \
-R chr9.fa \
-I tumor_JAK2.bam \
-V af-only-gnomad-chr9.vcf.gz \
-L chr9.interval_list \
-O tumor_JAK2.table
./gatk-4.6.2.0/gatk GetPileupSummaries \
-R chr9.fa \
-I normal_JAK2.bam \
-V af-only-gnomad-chr9.vcf.gz \
-L chr9.interval_list \
-O normal_JAK2.table
./gatk-4.6.2.0/gatk CalculateContamination \
-I tumor_JAK2.table \
-matched normal_JAK2.table \
-O contamination.table./gatk-4.6.2.0/gatk FilterMutectCalls \
-R chr9.fa \
-V somatic.vcf.gz \
--contamination-table contamination.table \
-O filtered.vcf.gz
bcftools view -f PASS filtered.vcf.gzO VCF bruto preserva evidências candidatas; o VCF filtrado adiciona decisões no campo FILTER. Em uma análise real, revise também profundidade, VAF, qualidade, orientação das reads, artefatos técnicos e evidência clínica.
Prepare uma referência combinada com nomes de contig compatíveis:
wget -c https://hgdownload.soe.ucsc.edu/goldenPath/hg19/chromosomes/chr13.fa.gz
wget -c https://hgdownload.soe.ucsc.edu/goldenPath/hg19/chromosomes/chr19.fa.gz
zcat chr13.fa.gz chr19.fa.gz | sed '/^>/ s/^>chr/>/' > hg19.fa
samtools faidx hg19.fa
./gatk-4.6.2.0/gatk CreateSequenceDictionary -R hg19.fa -O hg19.dict
./gatk-4.6.2.0/gatk ScatterIntervalsByNs -R hg19.fa -O hg19.interval_list -OT ACGTPipeline tumor–normal:
bash run.chr13-chr19.sh tumor_wp017.bam tumor_wp018.bam WP017 WP018
bash run.chr13-chr19.sh tumor_wp190.bam tumor_wp191.bam WP190 WP191Os resultados são gravados em results/. Você pode alterar os caminhos por variáveis de ambiente:
GATK_CMD=/caminho/para/gatk \
GENOME=/referencias/hg19.fa \
GNOMAD=/referencias/af-only-gnomad-chr13-chr19.vcf.gz \
INTERVALS=/referencias/hg19.interval_list \
OUTPUT_DIR=results \
bash run.chr13-chr19.sh tumor.bam normal.bam TUMOR_ID NORMAL_IDBaixe o PoN compatível com GRCh37/b37:
wget -c https://storage.googleapis.com/gatk-best-practices/somatic-b37/Mutect2-exome-panel.vcf
wget -c https://storage.googleapis.com/gatk-best-practices/somatic-b37/Mutect2-exome-panel.vcf.idxExecute informando apenas o BAM tumoral e seu identificador:
bash run.chr13-chr19.pon.sh tumor_wp190.bam WP190O PoN ajuda a remover artefatos recorrentes, mas não substitui um normal pareado. Para uso real, o PoN deve ser construído e validado com amostras normais processadas de modo comparável à coorte analisada.
Com Docker instalado, o script aceita o VCF de entrada e o TSV de saída:
bash vep-docker.sh filtered.vcf.gz vep_output/filtered.vep.tsvPor padrão, o script usa GRCh37, RefSeq e a imagem ensemblorg/ensembl-vep:release_116.0. Como o modo database consulta serviços externos, a execução requer internet e pode variar conforme a disponibilidade do Ensembl.
| Saída | Conteúdo |
|---|---|
*.somatic.vcf.gz |
Chamadas candidatas produzidas pelo Mutect2 |
*.pileups.table |
Contagens usadas para estimar contaminação |
*.contamination.table |
Fração estimada de contaminação |
*.filtered.vcf.gz |
Chamadas com os filtros do Mutect2 |
*.vep.tsv |
Consequências anotadas pelo VEP |
- Contigs incompatíveis: compare os cabeçalhos do BAM, FASTA e VCF.
9echr9são nomes diferentes. - Normal sample not found: confirme o campo
SMcomsamtools view -He use exatamente esse valor em-normal. - Arquivo sem índice: BAM requer
.bai; FASTA requer.faie.dict; VCF compactado requer.tbiou.csi. - Recurso de montagem incorreta: todos os arquivos devem pertencer à mesma montagem e à mesma convenção de contigs.
- VEP sem conexão: repita mais tarde ou configure cache/FASTA local para uma execução offline reprodutível.
- GATK: somatic short variant discovery
- GATK Mutect2
- Diferenças entre GRCh37, hg19 e b37
- Ensembl Variant Effect Predictor
Distribuído sob a licença MIT. Consulte LICENSE.