Estou confuso sobre como várias bibliotecas de software lidam com campos opcionais em um BAM:
Com base na especificação BAM, existem 11 campos obrigatórios para um BAM:
QNAME, FLAG, RNAME, POS, MAPQ, CIGAR, RNEXT, PNEXT, TLEN, SEQ, QUAL
Os arquivos BAM de hoje normalmente têm muitos campos opcionais também, que deve estar no formato TAG: TYPE: VALUE
, em que TAG
é uma string de dois caracteres que corresponde a / [A-Za-z] [A-Za-z0-9] /
e TYPE
são uma única letra com distinção entre maiúsculas e minúsculas que define o formato de VALUE
. Cada TAG
só pode aparecer uma vez em uma linha de alinhamento.
Certos BAMs podem não ter campos opcionais, enquanto outros têm vários.
Meu entendimento é que as tags opcionais podem estar em uma ordem diferente de linha para linha e, às vezes, simplesmente não existem.
Minhas perguntas:
-
Como o htslib / samtools (por exemplo,
visualização do samtools
) acessar esses campos opcionais, que diferem em número de BAM para BAM (possível linha para linha)?Em
htslib / sam.h
, uma estrutura de alinhamento BAM é definido da seguinte forma:/ *! @typedef @abstract Estrutura para um alinhamento. @field core core information sobre o alinhamento @field l_data comprimento atual de bam1_t :: data @field m_data comprimento máximo de bam1_t :: data @field data todos os dados de comprimento variável, concatenados; estrutura: qname-cigar-seq-qual-auxtypedef struct {bam1_core_t core; int l_data; uint32_t m_data; uint8_t * data; #ifndef BAM_NO_ID uint64_t id; #endif} bam1_t;
e seguido por vários métodos que acessam campos BAM obrigatórios, por exemplo,
/ *! @function @abstract Pega o nome da consulta @param b ponteiro para um alinhamento @return ponteiro para a string de nome, terminado em nulo * / # define bam_get_qname (b) ((char *) (b) ->data)
-
Como o htslib acessa cada um dos campos opcionais, dada esta
estrutura
? Mantém a ordem dos campos opcionais ou essa informação não está disponível? -
Quando um usuário executa htslib ou mesmo
samtools view
, como a linha BAM "termina", ou seja, qual estrutura de dados existe para mostrar que o BAM linha não tem mais campos opcionais e que o algoritmo deve "mover-se" para a próxima linha BAM.
Qualquer esclarecimento sobre como o código-fonte funciona neste caso é muito apreciado.