3
$\begingroup$

A typical VCF file has:

##contig=<ID=chr1,length=248956422>
##contig=<ID=chr2,length=242193529>

I would like to use htslib in C++ to read it. My attempt:

htsFile *fp = bcf_open("my.vcf", "r");
bcf_hdr_t *hdr = bcf_hdr_read(fp); 

In https://github.com/samtools/htslib/blob/develop/htslib/vcf.h, I'm not able to find a function that can do that for me.

How to read chr1 and 248956422 in C++?

$\endgroup$
4
  • $\begingroup$ As far as I can tell, the (internal) function bcf_hdr_parse_line does that. It returns an object x of type bcf_hrec_t*, for which strcmp(x->key, "contig") == 0) for your lines. You can then access the x->keys and x->vals. Untested. $\endgroup$ – Konrad Rudolph Feb 28 '18 at 10:49
  • $\begingroup$ @KonradRudolph Can I use it externally properly? Without hacking? $\endgroup$ – SmallChess Feb 28 '18 at 11:03
  • $\begingroup$ Depends on what you mean by “properly”. Since the API isn’t properly documented anyway, the distinction between external and internal functions is somewhat fluid. It might break with future versions of htslib, if that’s what you’re concerned about. $\endgroup$ – Konrad Rudolph Feb 28 '18 at 11:13
  • $\begingroup$ @KonradRudolph Yeah. Breaking with future versions is my concern. If I see don't any other alternative, I might go with that or just parse the file myself. $\endgroup$ – SmallChess Feb 28 '18 at 11:14
3
$\begingroup$
#include "htslib/vcf.h"

int main(int argc, char *argv[])
{
    htsFile *fp;
    bcf_hdr_t *hdr;
    bcf_idpair_t *ctg;
    int i;
    if (argc == 1) {
        fprintf(stderr, "Usage: print-ctg <in.vcf>\n");
        return 1;
    }
    fp = vcf_open(argv[1], "r");
    hdr = vcf_hdr_read(fp);
    ctg = hdr->id[BCF_DT_CTG];
    for (i = 0; i < hdr->n[BCF_DT_CTG]; ++i)
        printf("%s\t%d\n", ctg[i].key, ctg[i].val->info[0]);
    bcf_hdr_destroy(hdr);
    vcf_close(fp);
    return 0;
}

On stability: this use has been in htslib forever. In general, functions/structs/variables in the public headers are meant to be stable. However, there is no guarantee that future versions will always keep the same APIs.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.