You signed in with another tab or window.Reload to refresh your session.You signed out in another tab or window.Reload to refresh your session.You switched accounts on another tab or window.Reload to refresh your session.Dismiss alert
Pierre Lindenbaum PhD. Institut du Thorax. Nantes, France.@yokofakun
Examples
Show Htslib and Rbcf versions
Code:
# load the librarylibrary(rbcf)#print the version of the associated htslib paste("HTSLIB:",htslib.version())#print the version of rbcfpaste("RBCF:",rcbf.version())
Output:
[1] "HTSLIB: 1.10.2"[1] "RBCF: 0.0-1"
Open and close a VCF file
Code:
# load rbcflibrary(rbcf)# we don't need the index for this filefp <- bcf.open("./data/rotavirus_rf.01.vcf",FALSE)# error (exit 0 for tests)if(is.null(fp)) quit(save="no",status=0,runLast=FALSE)# dispose the vcf readerbcf.close(fp)print("Done.")
Output:
[1] TRUE[1] "Done."
Print the INFOs in the VCF header
Code:
# load rbcflibrary(rbcf)# we don't need the index for this filefp <- bcf.open("./data/rotavirus_rf.01.vcf",FALSE)# error on opening (exit 0 for tests)if(is.null(fp)) quit(save="no",status=0,runLast=FALSE)# print INFObcf.infos(fp)# dispose the vcf readerbcf.close(fp)# print the table
Output:
ID Number TypeINDEL INDEL 0 FlagIDV IDV 1 IntegerIMF IMF 1 FloatDP DP 1 IntegerVDB VDB 1 FloatRPB RPB 1 FloatMQB MQB 1 FloatBQB BQB 1 FloatMQSB MQSB 1 FloatSGB SGB 1 FloatMQ0F MQ0F 1 FloatICB ICB 1 FloatHOB HOB 1 FloatAC AC A IntegerAN AN 1 IntegerDP4 DP4 4 IntegerMQ MQ 1 Integer Descri(...)INDEL "Indicates that the variant is an IN(...)IDV "Maximum number of reads supporting an i(...)IMF "Maximum fraction of reads supporting an i(...)DP "Raw read d(...)VDB "Variant Distance Bias for filtering splice-site artefacts in RNA-seq data (bigger is bet(...)RPB "Mann-Whitney U test of Read Position Bias (bigger is bet(...)MQB "Mann-Whitney U test of Mapping Quality Bias (bigger is bet(...)BQB "Mann-Whitney U test of Base Quality Bias (bigger is bet(...)MQSB "Mann-Whitney U test of Mapping Quality vs Strand Bias (bigger is bet(...)SGB "Segregation based met(...)MQ0F "Fraction of MQ0 reads (smaller is bet(...)ICB "Inbreeding Coefficient Binomial test (bigger is bet(...)HOB "Bias in the number of HOMs number (smaller is bet(...)AC "Allele count in genotypes for each ALT allele, in the same order as li(...)AN "Total number of alleles in called genot(...)DP4 "Number of high-quality ref-forward , ref-reverse, alt-forward and alt-reverse b(...)MQ "Average mapping qua(...)[1] TRUE
Print the FORMATs in the VCF header
Code:
# load rbcflibrary(rbcf)# we don't need the index for this filefp <- bcf.open("./data/rotavirus_rf.01.vcf",FALSE)# error on opening (exit 0 for tests)if(is.null(fp)) quit(save="no",status=0,runLast=FALSE)# print FORMATbcf.formats(fp)# dispose the vcf readerbcf.close(fp)
Output:
ID Number Type DescriptionPL PL G Integer "List of Phred-scaled genotype likelihoods"GT GT 1 String "Genotype"[1] TRUE
Print the FILTERs in the VCF header
Code:
# load rbcflibrary(rbcf)# we don't need the index for this filefp <- bcf.open("./data/gnomad.exomes.r2.0.1.sites.bcf",FALSE)# error on opening (exit 0 for tests)if(is.null(fp)) quit(save="no",status=0,runLast=FALSE)# print FILTERsbcf.filters(fp)# dispose the vcf readerbcf.close(fp)
Output:
IDPASS PASSAC0 AC0InbreedingCoeff InbreedingCoeffLCR LCRRF RFSEGDUP SEGDUP (...)PASS (...)AC0 "Allele Count is zero (i.e. no high-confidence genotype (GQ >= 20, DP >= 10, AB(...)InbreedingCoeff (...)LCR "In (...)RF "Failed random forests filters (SNV cutoff (...)SEGDUP "In a segme(...)[1] TRUE
Print the Samples in the VCF header
The samples are defined in the '#CHROM' line of the VCF
Code:
# load rbcflibrary(rbcf)# we don't need the index for this filefp <- bcf.open("./data/rotavirus_rf.01.vcf",FALSE)# error on opening (exit 0 for tests)if(is.null(fp)) quit(save="no",status=0,runLast=FALSE)# print the number of samplespaste("Number of samples:",bcf.nsamples(fp))# get the name for the 1st samplepaste("First sample:",bcf.sample.at(fp,1))# get the 1-based index for the samplesbcf.sample2index(fp,c("S1","S2","S3","missing"))# get all the samplesbcf.samples(fp)# dispose the vcf readerbcf.close(fp)
# load rbcflibrary(rbcf)# we don't need the index for this filefp <- bcf.open("./data/rotavirus_rf.01.vcf",FALSE)# error on opening (exit 0 for tests)if(is.null(fp)) quit(save="no",status=0,runLast=FALSE)# print the dictionarybcf.dictionary(fp)# dispose the vcf readerbcf.close(fp)
# load rbcflibrary(rbcf)# Open the indexed VCFfp <- bcf.open("./data/rotavirus_rf.02.vcf.gz")# error on opening (exit 0 for tests)if(is.null(fp)) quit(save="no",status=0,runLast=FALSE)# get the indexed contigsbcf.contigs(fp)# dispose the vcf readerbcf.close(fp)
# load rbcflibrary(rbcf)# create a function counting variants in a VCFcount.variants<-function(filename) {# we don't need the index for this filefp <- bcf.open(filename,FALSE)# error on openingif(is.null(fp)) return(-1)# number of variantsn<-0# loop while we can read a variantwhile(!is.null(vc<-bcf.next(fp))) {# increment the countn<-n+1}# dispose the vcf readerbcf.close(fp)# return the number of variantn}# filenamesvcfs<-c("./data/gnomad.exomes.r2.0.1.sites.bcf","./data/rotavirus_rf.01.vcf","./data/rotavirus_rf.02.vcf.gz","./data/rotavirus_rf.03.vcf.gz","./data/rotavirus_rf.04.bcf")# print the number of variants for each vcffor(f in vcfs) {cat(paste(f," ",count.variants(f),"\n"))}
# load rbcflibrary(rbcf)# create a function counting variants in a VCFcount.variants<-function(filename,predicate) {# we don't need the index for this filefp <- bcf.open(filename,FALSE)# error on openingif(is.null(fp)) return(-1)# number of variantsn<-0# loop while we can read a variantwhile(!is.null(vc<-bcf.next(fp))) {# test the variantif(predicate(vc)) {# increment the countn<-n+1}}# dispose the vcf readerbcf.close(fp)# return the number of variantn}# A vcffilename <- "./data/gnomad.exomes.r2.0.1.sites.bcf"# filtersfilters<-list(list("desc"="accept all","predicate"=function(ctx) {TRUE} ),list("desc"="accept none","predicate"=function(ctx) {FALSE} ),list("desc"="CHROM is '1'","predicate"=function(ctx) { variant.contig(ctx)=="1"} ),list("desc"="POS is even","predicate"=function(ctx) { (variant.pos(ctx)%%2)==1} ),list("desc"="PASS filter","predicate"=function(ctx) {!variant.is.filtered(ctx)} ),list("desc"="count(FILTER)>1","predicate"=function(ctx) {length(variant.filters(ctx))>1} ),list("desc"="FILTER contains SEGDUP","predicate"=function(ctx) {variant.has.filter(ctx,"SEGDUP")} ),list("desc"="SNP","predicate"=function(ctx) {variant.is.snp(ctx)} ),list("desc"="POS!=END","predicate"=function(ctx) { variant.pos(ctx)!=variant.end(ctx)} ),list("desc"="not diallelic","predicate"=function(ctx) {variant.nalleles(ctx)!=2} ),list("desc"="REF is 'A'","predicate"=function(ctx) {variant.reference(ctx)=="A"} ),list("desc"="any allele is 'A'","predicate"=function(ctx) {"A" %in% variant.alleles(ctx)} ),list("desc"="any ALT allele is 'A'","predicate"=function(ctx) {"A" %in% variant.alt.alleles(ctx)} ),list("desc"="No QUAL","predicate"=function(ctx) {!variant.has.qual(ctx)} ),list("desc"="variant has ID","predicate"=function(ctx) {variant.has.id(ctx)}),list("desc"="variant ID match 'rs1*' ","predicate"=function(ctx) {grepl("^rs1",variant.id(ctx))}),list("desc"="variant has INFO/AF_NFE","predicate"=function(ctx) {variant.has.attribute(ctx,"AF_NFE")}),list("desc"="variant has INFO/AF_NFE > 1E-5","predicate"=function(ctx) {variant.has.attribute(ctx,"AF_NFE") && length(which(variant.float.attribute(ctx,"AF_NFE") > 1E-5))>0}),list("desc"="Missense in PLEKHN1 (VEP)","predicate"=function(ctx) {# NO VEP annotation ?if(!variant.has.attribute(ctx,"CSQ")) return(FALSE);# get VEP annotationpredictions <- variant.vep(ctx)# In SCN5Apredictions <- predictions[which(predictions$SYMBOL=="PLEKHN1"),]# Consequence must contain missensepredictions <- predictions[grep("missense_variant",predictions$Consequence),]nrow(predictions)>0}))# count the variant for each filterfor(flt in filters) {print(paste(basename(filename)," filter:",flt[["desc"]]," count:",count.variants(filename,flt[["predicate"]]),"\n"))}
Output:
[1] "gnomad.exomes.r2.0.1.sites.bcf filter: accept all count: 50 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: accept none count: 0 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: CHROM is '1' count: 50 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: POS is even count: 24 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: PASS filter count: 48 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: count(FILTER)>1 count: 2 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: FILTER contains SEGDUP count: 1 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: SNP count: 47 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: POS!=END count: 3 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: not diallelic count: 8 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: REF is 'A' count: 6 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: any allele is 'A' count: 27 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: any ALT allele is 'A' count: 21 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: No QUAL count: 1 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: variant has ID count: 34 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: variant ID match 'rs1*' count: 2 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: variant has INFO/AF_NFE count: 50 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: variant has INFO/AF_NFE > 1E-5 count: 14 \n"[1] "gnomad.exomes.r2.0.1.sites.bcf filter: Missense in PLEKHN1 (VEP) count: 13 \n"
Print a VEP table for a Variant
Code:
# load rbcflibrary(rbcf)# A vcffilename <- "./data/gnomad.exomes.r2.0.1.sites.bcf"# we don't need the index for this filefp <- bcf.open(filename,FALSE)# error on opening (exit 0 for tests)if(is.null(fp)) quit(save="no",status=0,runLast=FALSE)# current variantvc <- NULLwhile(!is.null(vc<-bcf.next(fp))) {#find the first variant having an INFO/CSQ attributeif(variant.has.attribute(vc,"CSQ")) break;}if(!is.null(vc)) {# get the VEP table for the variantpredictions<-variant.vep(vc)}# dispose the vcf readerbcf.close(fp)# showpredictions
# load rbcflibrary(rbcf)# A vcffilename <- "./data/rotavirus_rf.ann.vcf.gz"# we don't need the index for this filefp <- bcf.open(filename,FALSE)# error on opening (exit 0 for tests)if(is.null(fp)) quit(save="no",status=0,runLast=FALSE)# current variantvc <- NULLwhile(!is.null(vc<-bcf.next(fp))) {#find the first variant having an INFO/ANN attributeif(variant.has.attribute(vc,"ANN")) break;}if(!is.null(vc)) {# get SNPEFF tablepredictions<-variant.snpeff(vc)}# dispose the vcf readerbcf.close(fp)# showpredictions
# load rbcflibrary(rbcf)# create a function counting variants in a VCF, in some intervalscount.variants<-function(filename,intervals) {# open the indexed VCFfp <- bcf.open(filename)# error on openingif(is.null(fp)) return(-1)# loop over the intervalsfor(interval in intervals) {# try query the intervalif(bcf.query(fp,interval)) {# number of variantsn<-0# loop while we can read a variantwhile(!is.null(vc<-bcf.next(fp))) {# increment the countn<-n+1}print(paste("Number of variants in ",basename(filename),"/'",interval,"' :",n,sep=""))}# query failedelse {print(paste("Cannot query ",basename(filename),"/'",interval,"'",sep=""))}}# dispose the vcf readerbcf.close(fp)}some_intervals <-c("","RF03","RF03:2000-3000","1:1-10000000","chr1")count.variants("./data/rotavirus_rf.02.vcf.gz",some_intervals)count.variants("./data/1000G.ALL.2of4intersection.20100804.genotypes.bcf",some_intervals)# another way to query is set collect=TRUE to return a vector of variantfp <- bcf.open("./data/rotavirus_rf.02.vcf.gz")if(!is.null(fp)) {print(paste("Number of variants using collect:",length(bcf.query(fp,"RF03",collect=TRUE))))bcf.close(fp)}
Output:
[1] "Cannot query rotavirus_rf.02.vcf.gz/''"[1] "Number of variants in rotavirus_rf.02.vcf.gz/'RF03' :8"[1] "Number of variants in rotavirus_rf.02.vcf.gz/'RF03:2000-3000' :4"[1] "Cannot query rotavirus_rf.02.vcf.gz/'1:1-10000000'"[1] "Cannot query rotavirus_rf.02.vcf.gz/'chr1'"[1] TRUE[1] "Cannot query 1000G.ALL.2of4intersection.20100804.genotypes.bcf/''"[1] "Cannot query 1000G.ALL.2of4intersection.20100804.genotypes.bcf/'RF03'"[1] "Cannot query 1000G.ALL.2of4intersection.20100804.genotypes.bcf/'RF03:2000-3000'"[1] "Number of variants in 1000G.ALL.2of4intersection.20100804.genotypes.bcf/'1:1-10000000' :11"[1] "Cannot query 1000G.ALL.2of4intersection.20100804.genotypes.bcf/'chr1'"[1] TRUE[1] "Number of variants using collect: 8"[1] TRUE
Attribute in INFO
Code:
# load rbcflibrary(rbcf)# find given variantfind.variant<-function(fp,contig,pos) {if(!bcf.query(fp,paste(contig,":",pos,"-",pos,sep=""))) return(NULL)# loop while we can read a variantwhile(!is.null(vc<-bcf.next(fp))) {return(vc)}return(NULL)}filename<-"./data/gnomad.exomes.r2.0.1.sites.bcf"# open the VCF with indexfp <- bcf.open(filename)# error on opening (exit 0 for tests)if(is.null(fp)) quit(save="no",status=0,runLast=FALSE)ctx <-find.variant(fp,"1",905608)stopifnot(variant.has.attribute(ctx,"CSQ"))print(paste("CSQ(no split) ",variant.string.attribute(ctx,"CSQ",split=FALSE)))print(paste("CSQ(split) ",variant.string.attribute(ctx,"CSQ")))stopifnot(variant.has.attribute(ctx,"AN_POPMAX"))print(paste("AN_POPMAX:",variant.int.attribute(ctx,"AN_POPMAX")))stopifnot(variant.has.attribute(ctx,"AF_POPMAX"))print(paste("AF_POPMAX:",variant.float.attribute(ctx,"AF_POPMAX")))print(paste("flag:VQSR_NEGATIVE_TRAIN_SITE:",variant.flag.attribute(ctx,"VQSR_NEGATIVE_TRAIN_SITE")))# dispose the vcf readerbcf.close(fp)
# load rbcflibrary(rbcf)# find given variantfind.variant<-function(fp,contig,pos) {if(!bcf.query(fp,paste(contig,":",pos,"-",pos,sep=""))) return(NULL)# loop while we can read a variantwhile(!is.null(vc<-bcf.next(fp))) {return(vc)}return(NULL)}filename<-"./data/1000G.ALL.2of4intersection.20100804.genotypes.bcf"# open the VCF with indexfp <- bcf.open(filename)# error on opening (exit 0 for tests)if(is.null(fp)) quit(save="no",status=0,runLast=FALSE)# find a variantctx <-find.variant(fp,"1",10583)print(paste("Number of genotypes ",variant.nsamples(ctx)))# get 10-th genotypegt<-variant.genotype(ctx,10)print(paste("sample ",genotype.sample(gt)))# get genotype by namegt<-variant.genotype(ctx,"NA18997")print(paste("sample ",genotype.sample(gt)))print(paste("alleles ",genotype.alleles.idx0(gt)))print(paste("genotype ploidy ? ",genotype.ploidy(gt)))print(paste("genotype is hom ref ? ",genotype.homref(gt)))print(paste("genotype is het ? ",genotype.het(gt)))print(paste("genotype is het-non-ref ? ",genotype.hetnonref(gt)))print(paste("genotype is phased ? ",genotype.phased(gt)))print(paste("genotype is no call ? ",genotype.nocall(gt)))print(paste("genotype FORMAT/OG ? ",genotype.string.attribute(gt,"OG")))print(paste("genotype FORMAT/GQ ? ",genotype.int.attribute(gt,"GQ")))# hum spec says gt should be integerprint(paste("genotype has GQ ? ",genotype.has.gq(gt)))print(paste("genotype GQ ",genotype.gq(gt)))print(paste("genotype has DP ? ",genotype.has.dp(gt)))print(paste("genotype DP ",genotype.int.attribute(gt,"DP")))print(paste("genotype DP ",genotype.dp(gt)))print(paste("genotype has PL ? ",genotype.has.pl(gt)))print(paste("genotype PL ",genotype.pl(gt)))print(paste("genotype has AD ? ",genotype.has.ad(gt)))print(paste("genotype AD ",genotype.ad(gt)))# dispose the vcf readerbcf.close(fp)
Output:
[1] "Number of genotypes 629"[1] "sample HG00120"[1] "sample NA18997"[1] "alleles 0" "alleles 1"[1] "genotype ploidy ? 2"[1] "genotype is hom ref ? FALSE"[1] "genotype is het ? TRUE"[1] "genotype is het-non-ref ? FALSE"[1] "genotype is phased ? TRUE"[1] "genotype is no call ? FALSE"[1] "genotype FORMAT/OG ? 1/1"[1] "genotype FORMAT/GQ ? "[1] "genotype has GQ ? FALSE"[1] "genotype GQ -1"[1] "genotype has DP ? TRUE"[1] "genotype DP 1"[1] "genotype DP 1"[1] "genotype has PL ? FALSE"[1] "genotype PL "[1] "genotype has AD ? TRUE"[1] "genotype AD 4" "genotype AD 1"[1] TRUE
Working with vectorized Genotypes
Code:
# load rbcflibrary(rbcf)# find given variantfind.variant<-function(fp,contig,pos) {if(!bcf.query(fp,paste(contig,":",pos,"-",pos,sep=""))) return(NULL)# loop while we can read a variantwhile(!is.null(vc<-bcf.next(fp))) {return(vc)}return(NULL)}filename<-"./data/1000G.ALL.2of4intersection.20100804.genotypes.bcf"# open the VCF with indexfp <- bcf.open(filename)# error on opening (exit 0 for tests)if(is.null(fp)) quit(save="no",status=0,runLast=FALSE)# find a variantctx <-find.variant(fp,"1",10583)print(paste("Number of genotypes ",variant.nsamples(ctx)))# Retrieve the DP for all genotypes (length of vector equals to number of samples)dp <- variant.genotypes.int.attribute(ctx, "DP")stopifnot(length(dp) == variant.nsamples(ctx))stopifnot(is.integer(dp))cat("DP: ", paste(dp, collapse = ", "), "\n")# Retrieve the AD for all genotypes (length of vector equals to 2x number of samples)# The first two number contain the AD for REF and ALT for the first sample respectively.ad <- variant.genotypes.int.attribute(ctx, "AD")stopifnot(length(ad) == 2*variant.nsamples(ctx))stopifnot(is.integer(ad))cat("AD: ", paste(ad, collapse = ", "), "\n")# Helper function to get all the GT indizesgt <- variant.genotypes.allele.idx0(ctx)stopifnot(length(gt) == 2*variant.nsamples(ctx))stopifnot(is.integer(gt))cat("GT - Integers: ", paste(gt, collapse = ", "), "\n")# Helper function to get all the GT allele-countsgt <- variant.genotypes.allele.counts(ctx, 0)stopifnot(length(gt) == variant.nsamples(ctx))stopifnot(is.integer(gt))cat("GT - Allele Counts (Reference): ", paste(gt, collapse = ", "), "\n")gt <- variant.genotypes.allele.counts(ctx, 1)stopifnot(length(gt) == variant.nsamples(ctx))stopifnot(is.integer(gt))cat("GT - Allele Counts (Alternative): ", paste(gt, collapse = ", "), "\n")# Helper function to get all the GT stringsgt <- variant.genotypes.allele.strings(ctx)stopifnot(length(gt) == variant.nsamples(ctx))stopifnot(is.character(gt))cat("GT - Strings: ", paste(gt, collapse = ", "), "\n")# dispose the vcf readerbcf.close(fp)
# load rbcflibrary(rbcf)# vcf input filenamefilenamein = "./data/rotavirus_rf.01.vcf"# output vcf filename. "-" is standard outputfilenameout = "-"fp <- bcf.open(filenamein,FALSE)# error on opening (exit 0 for tests)if(is.null(fp)) quit(save="no",status=0,runLast=FALSE)# create a new VCF writer using the header from 'fp'out <- bcf.new.writer(fp,filenameout)# error on opening (exit 0 for tests)if(is.null(out)) quit(save="no",status=0,runLast=FALSE)# loop while we can read a variantwhile(!is.null(vc<-bcf.next(fp))) {# only write POS%10==0if(variant.pos(vc)%%10==0) { # write variantbcf.write.variant(out,vc);}}# dispose the vcf readerbcf.close(fp)# dispose the vcf rwriterbcf.close(out);
Output:
[1] TRUE##fileformat=VCFv4.2##FILTER=<ID=PASS,Description="All filters passed">##samtoolsVersion=1.3.1+htslib-1.3.1##samtoolsCommand=samtools mpileup -Ou -f rotavirus_rf.fa S1.bam S2.bam S3.bam S4.bam S5.bam##reference=file://rotavirus_rf.fa##contig=<ID=RF01,length=3302>##contig=<ID=RF02,length=2687>##contig=<ID=RF03,length=2592>##contig=<ID=RF04,length=2362>##contig=<ID=RF05,length=1579>##contig=<ID=RF06,length=1356>##contig=<ID=RF07,length=1074>##contig=<ID=RF08,length=1059>##contig=<ID=RF09,length=1062>##contig=<ID=RF10,length=751>##contig=<ID=RF11,length=666>##ALT=<ID=*,Description="Represents allele(s) other than observed.">##INFO=<ID=INDEL,Number=0,Type=Flag,Description="Indicates that the variant is an INDEL.">##INFO=<ID=IDV,Number=1,Type=Integer,Description="Maximum number of reads supporting an indel">##INFO=<ID=IMF,Number=1,Type=Float,Description="Maximum fraction of reads supporting an indel">##INFO=<ID=DP,Number=1,Type=Integer,Description="Raw read depth">##INFO=<ID=VDB,Number=1,Type=Float,Description="Variant Distance Bias for filtering splice-site(...)##INFO=<ID=RPB,Number=1,Type=Float,Description="Mann-Whitney U test of Read Position Bias (bigg(...)##INFO=<ID=MQB,Number=1,Type=Float,Description="Mann-Whitney U test of Mapping Quality Bias (bi(...)##INFO=<ID=BQB,Number=1,Type=Float,Description="Mann-Whitney U test of Base Quality Bias (bigge(...)##INFO=<ID=MQSB,Number=1,Type=Float,Description="Mann-Whitney U test of Mapping Quality vs Stra(...)##INFO=<ID=SGB,Number=1,Type=Float,Description="Segregation based metric.">##INFO=<ID=MQ0F,Number=1,Type=Float,Description="Fraction of MQ0 reads (smaller is better)">##FORMAT=<ID=PL,Number=G,Type=Integer,Description="List of Phred-scaled genotype likelihoods">##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">##INFO=<ID=ICB,Number=1,Type=Float,Description="Inbreeding Coefficient Binomial test (bigger is(...)##INFO=<ID=HOB,Number=1,Type=Float,Description="Bias in the number of HOMs number (smaller is b(...)##INFO=<ID=AC,Number=A,Type=Integer,Description="Allele count in genotypes for each ALT allele,(...)##INFO=<ID=AN,Number=1,Type=Integer,Description="Total number of alleles in called genotypes">##INFO=<ID=DP4,Number=4,Type=Integer,Description="Number of high-quality ref-forward , ref-reve(...)##INFO=<ID=MQ,Number=1,Type=Integer,Description="Average mapping quality">##bcftools_callVersion=1.3-10-g820e1d6+htslib-1.2.1-267-g87141ea##bcftools_callCommand=call -vm -Oz -o rotavirus_rf.vcf.gz -##bcftools_viewVersion=1.10-6-g2782d9f+htslib-1.2.1-1336-g7c16b56-dirty##bcftools_viewCommand=view /home/lindenb/src/jvarkit/src/test/resources/rotavirus_rf.vcf.gz; D(...)#CHROMPOSIDREFALTQUALFILTERINFOFORMATS1S2S3S4S5RF01970.AC48.6696.DP=36;VDB=0.693968;SGB=10.3229;RPB=0.658863;MQB=1;MQSB=1;BQB=0.572843;(...)RF032150.TA6.90687.DP=37;VDB=0.557348;SGB=-1.00336;RPB=0.579851;MQB=1;MQSB=1;BQB=1;MQ0F=(...)RF041900.AC36.8224.DP=39;VDB=0.706942;SGB=7.10992;RPB=0.81363;MQB=1;MQSB=1;BQB=1;MQ0F=0;(...)RF041920.AT42.014.DP=39;VDB=0.966939;SGB=0.816387;RPB=0.864752;MQB=1;MQSB=1;BQB=0.864752(...)