Escrevendo um script collate personalizado
Os arquivos resultantes de cada execução individual são armazenados por padrão em arquivos json (terminando em .results.json). Estes podem ser agrupados em um arquivo mesclado para exibir as mutações de resistência às drogas usando o tb-profiler collate
. No entanto, você pode querer personalizar quais informações são extraídas dos arquivos resultantes e exibidas no output agrupado (collated). Esta página fornecerá um esboço de como escrever seu próprio analisador.
Esqueleto do script
Abra seu editor favorito, cole o código a seguir e salve o arquivo como tbprofiler_custom_script.py
Isso formará a estrutura básica do analisador. Vamos ver o que cada seção faz.
Linhas 3-11: Aqui importamos bibliotecas que são úteis no script.
Linhas 13: esta linha inicia a definição da função principal (main
function). Recebe um argumento na forma de um objeto de argumentos que é construído usando o analisador de argumentos.
Linha 14: A localização do arquivo bed é armazenada na variável bed_file
. Isso é construído usando o prefixo do banco de dados fornecido nos argumentos da linha de comando (tbdb por padrão).
Linha 15: Usamos a função tbprofiler.get_lt2drugs
para extrair o locus_tag para o mapeamento de droga associado em um dicionário com o seguinte formato:
Linha 17-20: Se o argumento --samples
foi fornecido, o arquivo é lido e armazenado como uma lista. Caso contrário, a lista é derivada da procura do diretório de resultados (especificado com --dir
).
Linhas 22-23: Um loop é construído para percorrer as amostras. Para cada iteração, o arquivo resultante json é carregado em uma estrutura de dicionário. A estrutura de valor-chave é explicada abaixo.
Linhas 26-34: Essas linhas analisam os argumentos fornecidos ao script (por exemplo ---samples
). Você pode adicionar novos argumentos e eles aparecerão como propriedades do objeto args
na função principal (main
function).
Estrutura de dados do resultado
Os arquivos de resultados individuais são lidos em um dicionário na linha 23. Aqui estão algumas (mas não todas) as chaves interessantes no dicionário:
As mutações são divididas em duas listas “dr_variants” e “other_variants”. As “dr_variants” estão todas associadas à resistência às drogas. As outras variantes (“other_variants”) são mutações em genes resistentes às drogas, mas que não foram (ainda!) associadas à resistência. Algumas das outras mutações podem ser mutações filogenéticas que não têm nada a ver com resistência, enquanto outras podem ser, mas podem não ter evidências suficientes ainda.
No momento, se você executar o script e apontar para um diretório com alguns arquivos de resultado usando --dir
ele lerá todos os dados, mas não fará nada com eles.
Roteiro de exemplo de trabalho
Como exemplo, estenderei sua funcionalidade para gerar um arquivo CSV simples com o nome da amostra e o tipo de resistência à droga.
Primeiro, criarei um objeto de gravação CSV. Adicione o seguinte código antes do for loop.
Feche o identificador de arquivo após o término do loop usando
Usamos a propriedade args.out
ao criar o filehandle. Para que isso funcione, temos que adicionar um argumento extra ao analisador de argumentos. Adicione o seguinte para o código junto com os outros argumentos:
Agora vamos adicionar naquele código que determina a classe de resistência às drogas. Por padrão, o tb-profiler classifica apenas as amostras em: sensível, MDR, XDR e droga resistente. Vamos estender isso para encontrar pré-MDR e pré-XDR.
Primeiro, podemos criar um conjunto contendo uma lista dos medicamentos aos quais a amostra é resistente. Podemos fazer isso usando uma compreensão de lista que é convertida em um conjunto. Adicione o seguinte código dentro do for loop:
Definições das classes de drogas
As amostras podem ser classificadas em diferentes tipos usando as seguintes definições
Codificando isso
Podemos ver imediatamente que as definições são apenas algumas operações booleanas. Podemos armazenar os valores booleanos procurando as drogas no conjunto resistant_drugs
que criamos antes. Primeiro, criaremos uma lista de fluoroquinolonas (FLQ) e de segunda linha injetáveis (SLI). Adicione este código em qualquer lugar na função principal, mas antes do loop:
Em seguida, crie os valores booleanos. Coloque-os dentro do loop depois de criar a variável de data
:
Para testar a rifampicina e a isoniazida, verificamos simplesmente se elas existem no resistant_drugs
. Para verificar a resistência FLQ e SLI, encontramos as interseções entre FLQ_set
e resistant_drugs
e count. Se o valor for maior que 0, então temos resistência nessa categoria.
Agora estamos prontos para realizar a construção das classes usando nossas variáveis booleanas. Podemos percorrer a tabela acima usando uma série de instruções if-else.
Armazenamos a classe de resistência aos medicamentos na variável drtype
. Agora, tudo o que resta fazer é gravar isso no arquivo CSV. Podemos fazer isso usando:
Seu script agora deve ter a seguinte aparência:
Tente executá-lo e verifique se o output parece como deveria:
Se estiver funcionando conforme o esperado, tente adicionar outras informações ao output. Por exemplo, você pode extrair a sublinhagem acessando data["sublin"]
. Dê uma olhada na estrutura do arquivo de resultado (você pode abri-lo com o Firefox para direcioná-lo a um formato mais legível). Esperançosamente, você pode usar este modelo como um padrão para seus próprios usos. Existem alguns exemplos disponíveis aqui se você estiver interessado. Se você tiver alguma dúvida ou se tiver um script legal que gostaria de disponibilizar para a comunidade, não hesite em me contatar por e-mail ou pelo GitHub. Obrigado por ler!
Last updated