curl -s ' http://bgtdemo.herokuapp.com/ '
curl -s ' http://bgtdemo.herokuapp.com/?a=(impact=="HIGH")&s=(population=="FIN")&f=(AC>0) '
curl -s ' http://bgtdemo.herokuapp.com/?t=CHROM,POS,END,REF,ALT,AC/AN&f=(AC>1)&r=20 '
Para a última consulta, a última linha é “*”, indicando que o resultado está incompleto. Observe que este aplicativo da web está usando o nível gratuito do Heroku. Ele é restrito a apenas uma CPU e colocado em suspensão quando o aplicativo está ocioso. Há uma sobrecarga de ativação. Heroku também força os aplicativos gratuitos a hibernarem por “6 horas em um período de 24 horas”. Não sei exatamente como isso funciona.
# Installation
git clone https://github.com/lh3/bgt.git
cd bgt ; make
# Download demo BCF (1st 1Mbp of chr11 from 1000g), and convert to BGT
wget -O- http://bit.ly/BGTdemo | tar xf -
./bgt import 1kg11-1M.bgt 1kg11-1M.raw.bcf
gzip -dc 1kg11-1M.raw.samples.gz > 1kg11-1M.bgt.spl # sample meta data
# Get all sample genotypes
./bgt view -C 1kg11-1M.bgt | less -S
# Get genotypes of HG00171 and HG00173 in region 11:100,000-200,000
./bgt view -s,HG00171,HG00173 -f ' AC>0 ' -r 11:100000-200000 1kg11-1M.bgt
# Get alleles high-frequency in CEU but absent from YRI
./bgt view -s ' population=="CEU" ' -s ' population=="YRI" ' -f ' AC1/AN1>=0.1&&AC2==0 ' -G 1kg11-1M.bgt
# Select high-impact sites (var annotation provided with -d)
./bgt view -d anno11-1M.fmf.gz -a ' impact=="HIGH" ' -CG 1kg11-1M.bgt
# Compile the server; Go compiler required
make bgt-server
GOMAXPROCS=4 ./bgt-server -d anno11-1M.fmf.gz 1kg11-1M.bgt 2> server.log &
curl -s ' 0.0.0.0:8000 ' | less -S # help
curl -s ' 0.0.0.0:8000/?a=(impact=="HIGH")&s=(population=="FIN")&f=(AC>0) '
BGT é um formato de arquivo compacto para armazenar e consultar com eficiência genótipos de todo o genoma de dezenas a centenas de milhares de amostras. Pode ser considerado uma alternativa ao BCFv2 apenas com genótipo. O BGT é mais compacto em tamanho, mais eficiente no processamento e mais flexível na consulta.
O BGT vem com uma ferramenta de linha de comando e um aplicativo da web que reflete amplamente os usos da linha de comando. A ferramenta oferece suporte a sintaxe de consulta expressiva e poderosa. A seção "Primeiros passos" mostra alguns exemplos.
O BGT modela um conjunto de dados genotípicos como uma matriz de genótipos com linhas indexadas por local e colunas por amostra. Cada banco de dados BGT mantém uma matriz de tipo genético e um arquivo de anotação de amostra. As anotações do site são mantidas em um arquivo separado que deve ser compartilhado em vários bancos de dados BGT. Este modelo é diferente do VCF porque o VCF 1) mantém informações de amostra no cabeçalho e 2) armazena anotações do site em INFO junto com genótipos que não devem ser compartilhados entre VCFs.
Um banco de dados BGT sempre possui uma matriz de genótipos e nomes de amostras, que são adquiridos do VCF/BCF. As anotações do local e os fenótipos das amostras são opcionais, mas são recomendados. A consulta flexível de metadados é uma característica distintiva do BGT.
# Import BCFv2
bgt import prefix.bgt in.bcf
# Import VCF with "##contig" header lines
bgt import -S prefix.bgt in.vcf.gz
# Import VCF without "##contig" header lines
bgt import -St ref.fa.fai prefix.bgt in.vcf.gz
Durante a importação, o BGT separa vários alelos em uma linha VCF. Ele descarta todos os campos INFO e FORMAT, exceto GT. Consulte a seção 2.3 sobre como usar anotações de variante com BGT.
Após importar VCF/BCF, o BGT gera o arquivo de texto prefix.bgt.spl
, que por enquanto possui apenas uma coluna de nomes de amostra. Você pode adicionar dados de feótipo a este arquivo em um formato como (campos delimitados por TAB):
sample1 gender:Z:M height:f:1.73 region:Z:WestEurasia foo:i:10
sample2 gender:Z:F height:f:1.64 region:Z:WestEurasia bar:i:20
onde cada meta anotação assume um formato key:type:value
com type
sendo Z
para uma string, f
para um número real e i
para um número inteiro. Chamamos esse formato de Flat Metadata Format ou FMF, em resumo. Você pode obter amostras que correspondam a determinadas condições com:
bgt fmf prefix.bgt.spl ' height>1.7&®ion=="WestEurasia" '
bgt fmf prefix.bgt.spl ' mass/height**2>25&®ion=="WestEurasia" '
Você pode usar os operadores aritméticos e lógicos mais comuns na condição.
As anotações do site também são mantidas em um arquivo FMF como:
11:209621:1:T effect:Z:missense_variant gene:Z:RIC8A CCDS:Z:CCDS7690.1 CDSpos:i:347
11:209706:1:T effect:Z:synonymous_variant gene:Z:RIC8A CCDS:Z:CCDS7690.1 CDSpos:i:432
Fornecemos um script misc/vep2fmf.pl
para converter a saída VEP com a opção --pick
para FMF.
Observe que devido a uma limitação de implementação, recomendamos usar um subconjunto de variantes "importantes" com BGT, por exemplo:
gzip -dc vep-all.fmf.gz | grep -v " effect:Z:MODIFIER " | gzip > vep-important.fmf.gz
Usar o conjunto completo de variantes é bom, mas é muito mais lento com a implementação atual.
Uma consulta BGT é composta de resultados e condições. A saída é VCF por padrão ou pode ser uma tabela delimitada por TAB, se necessário. As condições incluem seleção de local independente de genótipo com opção -r
e -a
(por exemplo, variantes em uma região), seleção de amostra independente de genótipo com opção -s
(por exemplo, uma lista de amostras) e seleção de local dependente de genótipo com opção -f
( por exemplo, frequência alélica entre amostras selecionadas acima de um limite). O BGT tem suporte limitado à seleção de amostras dependentes do genótipo (por exemplo, amostras com um alelo).
O BGT possui um importante conceito de “grupo amostral”. Na linha de comando, cada opção -s
cria um grupo de amostra. A #-ésima opção -s
preenche um par de variáveis agregadas AC#
e AN#
. Essas variáveis podem ser usadas na seleção de locais dependentes de genótipo ou de saída.
# Select by a region
bgt view -r 11:100,000-200,000 1kg11-1M.bgt > out.vcf
# Select by regions in a BED (BGT will read through the entire BGT)
bgt view -B regions.bed 1kg11-1M.bgt > out.vcf
# Select a list of alleles (if on same chr, use random access)
bgt view -a,11:151344:1:G,11:110992:AACTT:A,11:160513::G 1kg11-1M.bgt
# Select by annotations (-d specifies the site annotation database)
bgt view -d anno11-1M.fmf.gz -a ' impact=="HIGH" ' -CG 1kg11-1M.bgt
Deve-se observar que na última linha de comando, o BGT lerá todo o arquivo de anotação para encontrar a lista de alelos correspondentes. Pode levar vários minutos se os arquivos de anotação do site contiverem 100 milhões de linhas. É por isso que recomendamos usar um subconjunto de alelos importantes (seção 2.3).
# Select a list of samples
bgt view -s,HG00171,HG00173 1kg11-1M.bgt
# Select by phenotypes (see also section 2.2)
bgt view -s ' population=="CEU" ' 1kg11-1M.bgt
# Create sample groups (there will be AC1/AN1 and AC2/AN2 in VCF INFO)
bgt view -s ' population=="CEU" ' -s ' population=="YRI" ' -G 1kg11-1M.bgt
# Select by allele frequency
bgt view -f ' AN>0&&AC/AN>.05 ' 1kg11-1M.bgt
# Select by group frequnecy
bgt view -s ' population=="CEU" ' -s ' population=="YRI" ' -f ' AC1>10&&AC2==0 ' -G 1kg11-1M.bgt
Claro, podemos misturar todos os três tipos de condições em uma linha de comando:
bgt view -G -s ' population=="CEU" ' -s ' population=="YRI" ' -f ' AC1/AN1>.1&&AC2==0 '
-r 11:100,000-500,000 -d anno11-1M.fmf.gz -a ' CDSpos>0 ' 1kg11-1M.bgt
# Output position, sequence and allele counts
bgt view -t CHROM,POS,REF,ALT,AC1,AC2 -s ' population=="CEU" ' -s ' population=="YRI" ' 1kg11-1M.bgt
# Get samples having a set of alleles (option -S)
bgt view -S -a,11:151344:1:G,11:110992:AACTT:A,11:160513::G -s ' population=="CEU" ' 1kg11-1M.bgt
# Count haplotypes
bgt view -Hd anno11-1M.fmf.gz -a ' gene=="SIRT3" ' -f ' AC/AN>.01 ' 1kg11-1M.bgt
# Count haplotypes in multiple populations
bgt view -Hd anno11-1M.fmf.gz -a ' gene=="SIRT3" ' -f ' AC/AN>.01 '
-s ' region=="Africa" ' -s ' region=="EastAsia" ' 1kg11-1M.bgt
Além de uma ferramenta de linha de comando, também fornecemos um protótipo de aplicativo web para consulta de genótipos. A sintaxe da consulta é semelhante à bgt view
mostrada em "Primeiros passos", mas com algumas diferenças notáveis:
.and.
para o operador lógico AND &&
(já que &
é um caractere especial para HTML).g
necessária para o servidor). O servidor BGT implementa um mecanismo simples para manter a privacidade das amostras ou de um subconjunto de amostras. É controlado por um único parâmetro: tamanho mínimo do grupo amostral ou MGS. O servidor se recusa a criar um grupo de amostras se o tamanho do grupo for menor que o MGS de uma das amostras do grupo. Em particular, se MGS estiver acima de um, o servidor não relata o nome da amostra ou os genótipos da amostra. Cada amostra pode ter um MGS diferente, conforme marcado pela tag de número inteiro _mgs
em prefix.bgt.spl
. Para amostras sem esta tag, um MGS padrão é aplicado.
BGT versus PBWT. O BGT usa a mesma estrutura de dados do PBWT e é inspirado no PBWT. O PBWT oferece suporte a consultas avançadas, como correspondência de haplótipos, faseamento e imputação, enquanto o BGT dá mais ênfase ao acesso aleatório rápido e à recuperação de dados.
BGT versus BCF2. BCF é mais versátil. Ele é capaz de manter metainformações por genótipo (por exemplo, profundidade de leitura por genótipo e probabilidade de genótipo). O BGT é geralmente mais eficiente e vezes menor. É melhor dimensionado para muitas amostras. O BGT também suporta consultas mais flexíveis, embora tecnicamente nada nos impeça de implementar funcionalidades semelhantes em cima do BCF.
BGT versus GQT. O GQT deve ser muito mais rápido ao percorrer locais em cromossomos inteiros sem considerar o LD. No entanto, é ineficiente recuperar dados em pequenas regiões ou obter informações de haplótipos devido ao seu design. Por esta razão, o GQT é considerado um complemento ao BCF ou BGT, e não um substituto. No tamanho do arquivo, o GQT é geralmente maior que o BCF somente do genótipo e, portanto, maior que o BGT.
O teste é executado na primeira versão dos dados do Haplotype Reference Consortium (HRC). Existem aproximadamente 39 milhões de SNPs em fases em 32.488 amostras. Geramos o BGT para todo o conjunto de dados, mas estamos executando ferramentas apenas na região chr11:10.000.001-20.000.000. A tabela a seguir mostra a hora e a linha de comando. Observe que a tabela omite a opção -r 11:10,000,001-20,000,000
que foi aplicada a todas as linhas de comando abaixo.
Tempo | Linha de comando |
---|---|
11s | visualização bgt -G HRC-r1.bgt |
13s | visualização bcftools -Gu HRC-r1.bcf |
30 anos | visualização bgt -GC HRC-r1.bgt |
4s | visualização bgt -GC -s'source=="1000G"' |
19 anos | visualização bcftools -Gu -S 1000G.txt HRC-r1.bcf |
8s | bgt view -G -s 'fonte=="UK10K"' -s 'fonte=="1000G"&&população!="GBK"' |
Em tamanhos de arquivo, o banco de dados BGT para HRC-r1 é de 7,4 GB (1 GB = 1024*1024*1024 bytes). Em comparação, BCFv2 para os mesmos dados leva 65 GB, GQT 93 GB e PBWT 4,4 GB. O BGT e o PBWT, que se baseiam na mesma estrutura de dados, são muito mais compactos. O BGT é maior que o PBWT principalmente porque o BGT mantém um bit extra por haplótipo para distinguir referência e multi-alelos, e armazena marcadores para permitir acesso aleatório rápido.