Как извлечь информацию о генотипе для каждого образца в виде строки из файла VCF с помощью htslib?

Я использую htslib для извлечения всей информации, содержащейся в файле VCF на C++.

В настоящее время, благодаря спецификации VCF и документации в файле , я успешно извлек всю информацию метаданных в заголовке ( строки метаинформации ) и большую часть информации, содержащейся в каждой строке тела файла. (Строки данных).

Однако я не знаю, как извлечь информацию о генотипе (столбцы образцов).

Я использую файлы примеров из проекта 1000G. Это пример двух строк файла, в нем показаны поле Формат и два образца (в файле более 1000 образцов на каждую строку, я хотел бы извлечь данные для всех):

      FORMAT      HG00096                         HG00097
GT:DS:GL    0|0:0.050:-0.48,-0.48,-0.48     0|0:0.050:-0.24,-0.40,-1.49
GT:DS:GL    0|0:0.000:-0.10,-0.69,-4.70     0|0:0.000:-0.05,-0.94,-5.00

Я знаю, что это сложная задача, которая потребует некоторого времени вычислений. Я извлек имена каждого столбца (HG00096, HG00077...), но я не знаю, как извлечь информацию из каждого образца в виде полной строки (например, «0 |0: 0,050: -0,48, - 0,48, -0,48 "), как набор (массив, карта, вектор ...) пар" ключ-значение "(например, [("GT "," 0 | 0 "), ("DS "," 0,050 ") , («GL», «-0,48, -0,48, -0,48»)) или просто как массив значений (например, [«0 | 0», «0,050», «-0,48, -0,48, -0,48» ]. Я бы хотел сделать это для каждого образца.

Я читал документацию в файле vcf.h и думаю, что функция bcf_get_genotypes(hdr,line,dst,ndst) может подойти для этого, но я не знаю точно, как ее использовать для извлечения значений как струны. Кроме того, я думаю, что эта информация может храниться внутри указателя p на bcf_fmt_t, но я не знаю наверняка, он просто содержит набор массивов значений uint8_t, и я не знаю, является ли строка (или char array) можно извлечь так, как я хочу.

      typedef struct bcf_fmt_t {
    int id;             
    int n, size, type;  
    uint8_t *p;        
    uint32_t p_len;
    uint32_t p_off:31, p_free:1;
} bcf_fmt_t;

Есть ли способ сделать то, что я пытаюсь сделать?

1 ответ

Решение

Я наконец-то понял. Есть некоторые функции для этого, в зависимости от типа , указанного в заголовке для формата ID: функции находятся внутри vcf.h файла в htslib:

      #define bcf_get_format_int32(hdr,line,tag,dst,ndst)  
bcf_get_format_values(hdr,line,tag,(void**)(dst),ndst,BCF_HT_INT)
#define bcf_get_format_float(hdr,line,tag,dst,ndst)  
bcf_get_format_values(hdr,line,tag,(void**)(dst),ndst,BCF_HT_REAL)
#define bcf_get_format_char(hdr,line,tag,dst,ndst)   
bcf_get_format_values(hdr,line,tag,(void**)(dst),ndst,BCF_HT_STR)
#define bcf_get_genotypes(hdr,line,dst,ndst)         
bcf_get_format_values(hdr,line,"GT",(void**)(dst),ndst,BCF_HT_INT)

HTSLIB_EXPORT
int bcf_get_format_string(const bcf_hdr_t *hdr, bcf1_t *line, const char *tag, char ***dst, int *ndst);

HTSLIB_EXPORT
int bcf_get_format_values(const bcf_hdr_t *hdr, bcf1_t *line, const char *tag, void **dst, int *ndst, int type);
Другие вопросы по тегам