我正在使用 c++ 处理 VCF 文件,为此我使用来自 htslib 的 vcf 库(https://github.com/samtools/htslib/blob/develop/htslib/vcf.h)。我知道可能有一些更好的库,但我也在使用 htslib 也有库的其他文件格式,所以我想坚持使用 htslib。
我找到了一些代码示例,可以在文件中打开读取并创建正确的结构。标头并在此处使用 VCF 文件中的一些信息:https ://gist.github.com/gatoravi/cad922bdf2b625a91126和http://wresch.github.io/2014/11/18/process-vcf-file-with -htslib.html
但是,如果我们坚持第一个示例,我已经将代码“解码”为以下代码,并附上我对代码的注释:
int main(int argc,char **argv){
std::cerr << "Usage:subset.vcf " << std::endl;
// htslib internally represents VCF as bcf1_t data structures
htsFile *test_vcf = NULL;
// creates header
bcf_hdr_t *test_header = NULL;
// initialize and allocate bcf1_t object
bcf1_t *test_record = bcf_init();
test_vcf = vcf_open("subset.vcf", "r");
// returning a bcf_hdr_t struct
test_header = bcf_hdr_read(test_vcf);
if(test_header == NULL) {throw std::runtime_error("Unable to read header.");}
while(bcf_read(test_vcf, test_header, test_record) == 0){
// std::cout << "pos " << test_record->pos << std::endl; //column 2 in VCF with the coordinate looks like its -1
// std::cout << "length " << test_record->rlen << std::endl; // I assume its the length of the ALT
// std::cout << "chrom " << test_record->rid; (-1) format or bcf_hdr_id2name(test_header, test_record->rid)
// std::cout << "qual " << test_record->qual; //column 6
// std::cout << "allele " << test_record->n_allele << std::endl; // number of alleles
// std::cout << "info " << test_record->n_info << std::endl; // I dont know what this is
// std::cout << "nfmt " << test_record->n_fmt << std::endl;
// "sample " << test_record->n_sample // i dont know what this is
std::cout << "chr" << bcf_hdr_id2name(test_header, test_record->rid) << ":" <<test_record->pos+1 << std::endl;
std::cout << "------------------" << std::endl;
}
bcf_hdr_destroy(test_header);
bcf_destroy(test_record);
bcf_close(test_vcf);
return 0;
}
在上面的这段代码中,我在 while 循环中对多个 std::cout 进行了注释,以通过我的注释清楚地说明某些功能是什么——即“摆脱”是染色体。据我所知,vcf 库的名称“rid”或“nfmt”都是预定义的。运行此代码,我可以打印多个内容,例如染色体名称、位置等。但我有几个问题:
我的 VCF 文件具有 #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT 的一般结构,其中有几行仅显示前 6 列的小示例:
14 19058352 rs144287685 A G 100
14 19066089 rs374285188 C A,T 100
14 19075627 . G A,T 100
14 19075912 . A C,T 100
14 19237205 . T TATGTTATG 100
我的问题是在使用库时我希望打印出参考(第 4 列)和替代(第 5 列),所以对于第 1 行:REF = A & ALT = G,对于第 5 行:REF = T & ALT = TATGTTATG。
谁能帮助我准确理解提取这两个字段需要做什么?我在库描述中看不到如何使用“test_record->”来提取这些?
我希望我的问题有点道理。感谢您的时间和帮助。