From be05142746b47702dccd637e26ecb740002aaf75 Mon Sep 17 00:00:00 2001 From: Zilong-Li Date: Thu, 23 May 2024 17:50:48 +0200 Subject: [PATCH] update pkgdown --- Makefile | 2 +- README.Rmd | 10 +- README.md | 10 +- docs/index.html | 92 +++++++----------- docs/pkgdown.yml | 2 +- docs/reference/figures/README-dp-1.png | Bin 0 -> 22912 bytes .../reference/figures/README-summary_sm-1.png | Bin 14661 -> 14187 bytes docs/search.json | 2 +- man/figures/README-summary_sm-1.png | Bin 14661 -> 14187 bytes 9 files changed, 40 insertions(+), 78 deletions(-) create mode 100644 docs/reference/figures/README-dp-1.png diff --git a/Makefile b/Makefile index b9606b2..592354b 100644 --- a/Makefile +++ b/Makefile @@ -8,9 +8,9 @@ rd: Rscript -e 'roxygen2::roxygenise(".")' readme: + Rscript -e 'rmarkdown::render("README.Rmd")' Rscript -e 'pkgdown::build_site()' Rscript -e 'pkgdown::build_articles()' - Rscript -e 'rmarkdown::render("README.Rmd")' readme2: Rscript -e 'rmarkdown::render("README.Rmd", "html_document")' diff --git a/README.Rmd b/README.Rmd index f295856..891b272 100644 --- a/README.Rmd +++ b/README.Rmd @@ -93,14 +93,6 @@ par(mar=c(5,5,2,2), cex.lab = 2) vcfplot(res, col = 2,cex = 2, lwd = 3, type = "b") ``` -```r -res <- vcfcomp(test = rawvcf, truth = phasedvcf, - stats = "f1", region = "chr21:5100000-6000000", - by.sample = T) -par(mar=c(5,5,2,2), cex.lab = 2) -vcfplot(res, cex = 2, lwd = 3, type = "b", which.sample = 1:3) -``` - ```{r pse} res <- vcfcomp(test = rawvcf, truth = phasedvcf, stats = "pse", @@ -120,7 +112,7 @@ Want to summarize variants discovered by genotype caller e.g. GATK? `vcfsummary` ```{r summary_sm} res <- vcfsummary(rawvcf,"chr21:10000000-10010000") -vcfplot(res, pop = popfile, col = 1:5, main = "Number of SNP & INDEL variants per population") +vcfplot(res, pop = popfile, col = 1:5, main = "Number of SNP & INDEL variants") ``` **Complex structure variants** diff --git a/README.md b/README.md index 2edd679..aa17402 100644 --- a/README.md +++ b/README.md @@ -104,14 +104,6 @@ vcfplot(res, col = 2,cex = 2, lwd = 3, type = "b") -``` r -res <- vcfcomp(test = rawvcf, truth = phasedvcf, - stats = "f1", region = "chr21:5100000-6000000", - by.sample = T) -par(mar=c(5,5,2,2), cex.lab = 2) -vcfplot(res, cex = 2, lwd = 3, type = "b", which.sample = 1:3) -``` - ``` r res <- vcfcomp(test = rawvcf, truth = phasedvcf, stats = "pse", @@ -136,7 +128,7 @@ Want to summarize variants discovered by genotype caller e.g. GATK? ``` r res <- vcfsummary(rawvcf,"chr21:10000000-10010000") -vcfplot(res, pop = popfile, col = 1:5, main = "Number of SNP & INDEL variants per population") +vcfplot(res, pop = popfile, col = 1:5, main = "Number of SNP & INDEL variants") ``` diff --git a/docs/index.html b/docs/index.html index 7a93980..fc007f2 100644 --- a/docs/index.html +++ b/docs/index.html @@ -106,25 +106,46 @@

URL as filenamepopfile <- "https://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data_collections/1000G_2504_high_coverage/20130606_g1k_3202_samples_ped_population.txt"
+

+vcftable: read VCF as tabular data +

+

vcftable gives you fine control over what you want to extract from VCF/BCF files.

+

Read SNP variants with GT format and two samples

+
+library(vcfppR)
+res <- vcftable(phasedvcf, "chr21:1-5100000", samples = "HG00673,NA10840", vartype = "snps")
+str(res)
+#> List of 10
+#>  $ samples: chr [1:2] "HG00673" "NA10840"
+#>  $ chr    : chr [1:194] "chr21" "chr21" "chr21" "chr21" ...
+#>  $ pos    : int [1:194] 5030578 5030588 5030596 5030673 5030957 5030960 5031004 5031031 5031194 5031224 ...
+#>  $ id     : chr [1:194] "21:5030578:C:T" "21:5030588:T:C" "21:5030596:A:G" "21:5030673:G:A" ...
+#>  $ ref    : chr [1:194] "C" "T" "A" "G" ...
+#>  $ alt    : chr [1:194] "T" "C" "G" "A" ...
+#>  $ qual   : num [1:194] 2.14e+09 2.14e+09 2.14e+09 2.14e+09 2.14e+09 ...
+#>  $ filter : chr [1:194] "." "." "." "." ...
+#>  $ info   : chr [1:194] "AC=74;AF=0.0115553;CM=0;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_unrel=1006;AN"| __truncated__ "AC=53;AF=0.00827608;CM=1.78789e-05;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_un"| __truncated__ "AC=2;AF=0.000312305;CM=3.21821e-05;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_un"| __truncated__ "AC=2;AF=0.000312305;CM=0.00016985;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_unr"| __truncated__ ...
+#>  $ gt     : int [1:194, 1:2] 0 0 0 0 0 0 0 0 0 0 ...
+#>  - attr(*, "class")= chr "vcftable"
+

Read INDEL variants with DP format and QUAL>100

+
+res <- vcftable(rawvcf, "chr21:1-5100000", vartype = "indels", format = "DP", qual=100)
+vcfplot(res, which.sample = 10, ylim=c(0,60), col = 3, pch=19)
+

+
+

vcfcomp: compare two VCF files and report concordance

Want to investigate the concordance between two VCF files? vcfcomp is the utility function you need! For example, in benchmarkings, we intend to calculate the genotype correlation between the test and the truth.

-
-library(vcfppR)
-res <- vcfcomp(test = rawvcf, truth = phasedvcf,
+
+res <- vcfcomp(test = rawvcf, truth = phasedvcf,
                stats = "r2", region = "chr21:1-5100000", 
                formats = c("GT","GT"))
 par(mar=c(5,5,2,2), cex.lab = 2)
 vcfplot(res, col = 2,cex = 2, lwd = 3, type = "b")

-
-res <- vcfcomp(test = rawvcf, truth = phasedvcf,
-               stats = "f1", region = "chr21:5100000-6000000", 
-               by.sample = T)
-par(mar=c(5,5,2,2), cex.lab = 2)
-vcfplot(res, cex = 2, lwd = 3, type = "b", which.sample = 1:3)
-
+
 res <- vcfcomp(test = rawvcf, truth = phasedvcf,
                stats = "pse",
                region = "chr21:5000000-5500000",
@@ -141,64 +162,21 @@ 

Want to summarize variants discovered by genotype caller e.g. GATK? vcfsummary is the utility function you need!

Small variants

-
+
 res <- vcfsummary(rawvcf,"chr21:10000000-10010000")
-vcfplot(res, pop = popfile, col = 1:5, main = "Number of SNP & INDEL variants per population")
+vcfplot(res, pop = popfile, col = 1:5, main = "Number of SNP & INDEL variants")

Complex structure variants

-
+
 res <- vcfsummary(svfile, svtype = TRUE, region = "chr20")
 vcfplot(res, main = "Structure Variant Counts", col = 1:7)

-

-vcftable: read VCF as tabular data -

-

vcftable gives you fine control over what you want to extract from VCF/BCF files.

-

Read SNP variants with GT format and two samples

-
-res <- vcftable(phasedvcf, "chr21:1-5100000", samples = "HG00673,NA10840", vartype = "snps")
-str(res)
-#> List of 10
-#>  $ samples: chr [1:2] "HG00673" "NA10840"
-#>  $ chr    : chr [1:194] "chr21" "chr21" "chr21" "chr21" ...
-#>  $ pos    : int [1:194] 5030578 5030588 5030596 5030673 5030957 5030960 5031004 5031031 5031194 5031224 ...
-#>  $ id     : chr [1:194] "21:5030578:C:T" "21:5030588:T:C" "21:5030596:A:G" "21:5030673:G:A" ...
-#>  $ ref    : chr [1:194] "C" "T" "A" "G" ...
-#>  $ alt    : chr [1:194] "T" "C" "G" "A" ...
-#>  $ qual   : num [1:194] 2.14e+09 2.14e+09 2.14e+09 2.14e+09 2.14e+09 ...
-#>  $ filter : chr [1:194] "." "." "." "." ...
-#>  $ info   : chr [1:194] "AC=74;AF=0.0115553;CM=0;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_unrel=1006;AN"| __truncated__ "AC=53;AF=0.00827608;CM=1.78789e-05;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_un"| __truncated__ "AC=2;AF=0.000312305;CM=3.21821e-05;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_un"| __truncated__ "AC=2;AF=0.000312305;CM=0.00016985;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_unr"| __truncated__ ...
-#>  $ gt     : int [1:194, 1:2] 0 0 0 0 0 0 0 0 0 0 ...
-#>  - attr(*, "class")= chr "vcftable"
-

Read SNP variants with PL format and drop the INFO column

-
-res <- vcftable(rawvcf, "chr21:1-5100000", vartype = "snps", format = "PL", info = FALSE)
-str(res)
-#> List of 10
-#>  $ samples: chr [1:3202] "HG00096" "HG00097" "HG00099" "HG00100" ...
-#>  $ chr    : chr [1:1383] "chr21" "chr21" "chr21" "chr21" ...
-#>  $ pos    : int [1:1383] 5030082 5030088 5030105 5030253 5030278 5030347 5030356 5030357 5030391 5030446 ...
-#>  $ id     : chr [1:1383] "." "." "." "." ...
-#>  $ ref    : chr [1:1383] "G" "C" "C" "G" ...
-#>  $ alt    : chr [1:1383] "A" "T" "A" "T" ...
-#>  $ qual   : num [1:1383] 70.1 2773.1 3897.8 102.6 868.9 ...
-#>  $ filter : chr [1:1383] "VQSRTrancheSNP99.80to100.00" "VQSRTrancheSNP99.80to100.00" "VQSRTrancheSNP99.80to100.00" "VQSRTrancheSNP99.80to100.00" ...
-#>  $ info   : chr(0) 
-#>  $ PL     : int [1:1383, 1:9606] NA 64 64 0 0 0 0 0 0 0 ...
-#>  - attr(*, "class")= chr "vcftable"
-

Read INDEL variants with DP format and QUAL>100

-
-res <- vcftable(rawvcf, "chr21:1-5100000", vartype = "indels", format = "DP", qual=100)
-vcfplot(res, which.sample = 10, ylim=c(0,100))
-

-
-

R API of vcfpp.h

There are two classes i.e. vcfreader and vcfwriter offering the full R-bindings of vcfpp.h. Check out the examples in the tests folder or refer to the manual.

-
+
 ?vcfppR::vcfreader
diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index ad2981c..ac0732d 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -3,5 +3,5 @@ pkgdown: 2.0.9 pkgdown_sha: ~ articles: concordance-of-two-vcf-files: concordance-of-two-vcf-files.html -last_built: 2024-05-22T16:52Z +last_built: 2024-05-23T15:50Z diff --git a/docs/reference/figures/README-dp-1.png b/docs/reference/figures/README-dp-1.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2f7c6dff2896901df821cb1e8a778d0ed0a6a GIT binary patch literal 22912 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%0A~ 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 Wi|Jk0zyR(|HAPt!nUAPP&;AEK`FQC7 literal 14661 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 wcO5B9-e|H1t#rDL$qM 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 stats F1 or NRC or PSE only uses GT format vcfplot(res, which=1:2, main = \"Phasing switch error\", ylab = \"HG00673,NA10840\")"},{"path":"/index.html","id":"vcfsummary-variants-characterization","dir":"","previous_headings":"","what":"vcfsummary: variants characterization","title":"Rapid Manipulation of the Variant Call Format (VCF)","text":"Want summarize variants discovered genotype caller e.g. GATK? vcfsummary utility function need! Small variants Complex structure variants","code":"res <- vcfsummary(rawvcf,\"chr21:10000000-10010000\") vcfplot(res, pop = popfile, col = 1:5, main = \"Number of SNP & INDEL variants per population\") res <- vcfsummary(svfile, svtype = TRUE, region = \"chr20\") vcfplot(res, main = \"Structure Variant Counts\", col = 1:7)"},{"path":"/index.html","id":"vcftable-read-vcf-as-tabular-data","dir":"","previous_headings":"","what":"vcftable: read VCF as tabular data","title":"Rapid Manipulation of the Variant Call Format (VCF)","text":"vcftable gives fine control want extract VCF/BCF files. Read SNP variants GT format two samples Read SNP variants PL format drop INFO column Read INDEL variants DP format QUAL>100","code":"res <- vcftable(phasedvcf, \"chr21:1-5100000\", samples = \"HG00673,NA10840\", vartype = \"snps\") str(res) #> List of 10 #> $ samples: chr [1:2] \"HG00673\" \"NA10840\" #> $ chr : chr [1:194] \"chr21\" \"chr21\" \"chr21\" \"chr21\" ... #> $ pos : int [1:194] 5030578 5030588 5030596 5030673 5030957 5030960 5031004 5031031 5031194 5031224 ... #> $ id : chr [1:194] \"21:5030578:C:T\" \"21:5030588:T:C\" \"21:5030596:A:G\" \"21:5030673:G:A\" ... #> $ ref : chr [1:194] \"C\" \"T\" \"A\" \"G\" ... #> $ alt : chr [1:194] \"T\" \"C\" \"G\" \"A\" ... #> $ qual : num [1:194] 2.14e+09 2.14e+09 2.14e+09 2.14e+09 2.14e+09 ... #> $ filter : chr [1:194] \".\" \".\" \".\" \".\" ... #> $ info : chr [1:194] \"AC=74;AF=0.0115553;CM=0;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_unrel=1006;AN\"| __truncated__ \"AC=53;AF=0.00827608;CM=1.78789e-05;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_un\"| __truncated__ \"AC=2;AF=0.000312305;CM=3.21821e-05;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_un\"| __truncated__ \"AC=2;AF=0.000312305;CM=0.00016985;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_unr\"| __truncated__ ... #> $ gt : int [1:194, 1:2] 0 0 0 0 0 0 0 0 0 0 ... #> - attr(*, \"class\")= chr \"vcftable\" res <- vcftable(rawvcf, \"chr21:1-5100000\", vartype = \"snps\", format = \"PL\", info = FALSE) str(res) #> List of 10 #> $ samples: chr [1:3202] \"HG00096\" \"HG00097\" \"HG00099\" \"HG00100\" ... #> $ chr : chr [1:1383] \"chr21\" \"chr21\" \"chr21\" \"chr21\" ... #> $ pos : int [1:1383] 5030082 5030088 5030105 5030253 5030278 5030347 5030356 5030357 5030391 5030446 ... #> $ id : chr [1:1383] \".\" \".\" \".\" \".\" ... #> $ ref : chr [1:1383] \"G\" \"C\" \"C\" \"G\" ... #> $ alt : chr [1:1383] \"A\" \"T\" \"A\" \"T\" ... #> $ qual : num [1:1383] 70.1 2773.1 3897.8 102.6 868.9 ... #> $ filter : chr [1:1383] \"VQSRTrancheSNP99.80to100.00\" \"VQSRTrancheSNP99.80to100.00\" \"VQSRTrancheSNP99.80to100.00\" \"VQSRTrancheSNP99.80to100.00\" ... #> $ info : chr(0) #> $ PL : int [1:1383, 1:9606] NA 64 64 0 0 0 0 0 0 0 ... #> - attr(*, \"class\")= chr \"vcftable\" res <- vcftable(rawvcf, \"chr21:1-5100000\", vartype = \"indels\", format = \"DP\", qual=100) vcfplot(res, which.sample = 10, ylim=c(0,100))"},{"path":"/index.html","id":"r-api-of-vcfpph","dir":"","previous_headings":"","what":"R API of vcfpp.h","title":"Rapid Manipulation of the Variant Call Format (VCF)","text":"two classes .e. vcfreader vcfwriter offering full R-bindings vcfpp.h. Check examples tests folder refer manual.","code":"?vcfppR::vcfreader"},{"path":"/reference/heterozygosity.html","id":null,"dir":"Reference","previous_headings":"","what":"calculate the number of heterozygous SNPs for each sample — heterozygosity","title":"calculate the number of heterozygous SNPs for each sample — heterozygosity","text":"calculate number heterozygous SNPs sample","code":""},{"path":"/reference/heterozygosity.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"calculate the number of heterozygous SNPs for each sample — heterozygosity","text":"","code":"heterozygosity(vcffile, region = \"\", samples = \"-\", pass = FALSE, qual = 0)"},{"path":"/reference/heterozygosity.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"calculate the number of heterozygous SNPs for each sample — heterozygosity","text":"vcffile path VCF file index region region extract, default \"\" samples samples extract, default \"-\" pass restrict variants FILTER==PASS qual restrict variants QUAL > qual.","code":""},{"path":"/reference/heterozygosity.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"calculate the number of heterozygous SNPs for each sample — heterozygosity","text":"list heterozygosity couts sample along id vcf header","code":""},{"path":"/reference/vcfcomp.html","id":null,"dir":"Reference","previous_headings":"","what":"Compare two VCF/BCF files reporting various statistics — vcfcomp","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"Compare two VCF/BCF files reporting various statistics","code":""},{"path":"/reference/vcfcomp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"","code":"vcfcomp( test, truth, formats = c(\"DS\", \"GT\"), stats = \"r2\", by.sample = FALSE, by.variant = FALSE, flip = FALSE, names = NULL, bins = NULL, af = NULL, out = NULL, choose_random_start = FALSE, return_pse_sites = FALSE, ... )"},{"path":"/reference/vcfcomp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"test path first VCF/BCF file referred test, saved RDS file. truth path second VCF/BCF file referred truth, saved RDS file. formats character vector. FORMAT tags extract test truth respectively. default c(\"DS\", \"GT\") extracts 'DS' target 'GT' truth. stats statistics calculated. supports following. \"r2\": pearson correlation coefficient ** 2. \"f1\": F1-score, good balance sensitivity precision. \"nrc\": Non-Reference Concordance rate \"pse\": Phasing Switch Error rate .sample logical. calculate concordance samples, average bins. .variant logical. calculate concordance variant, average bins. bysample variant TRUE, average samples first. bysample variant FALSE, average samples variants. flip logical. flip ref alt variants names character vector. reset samples' names test VCF. bins numeric vector. break statistics allele frequency bins. af file path allele frequency text file saved RDS file. output prefix saving objects RDS file choose_random_start choose random start stats=\"pse\" return_pse_sites boolean. return phasing switch error sites ... options passed vcftable","code":""},{"path":"/reference/vcfcomp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"list various statistics","code":""},{"path":"/reference/vcfcomp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"vcfcomp implements various statisitcs compare two VCF/BCF files, e.g. report genotype concocrdance, correlation stratified allele frequency.","code":""},{"path":"/reference/vcfcomp.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"Zilong Li zilong.dk@gmail.com","code":""},{"path":"/reference/vcfcomp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"","code":"library('vcfppR') test <- system.file(\"extdata\", \"imputed.gt.vcf.gz\", package=\"vcfppR\") truth <- system.file(\"extdata\", \"imputed.gt.vcf.gz\", package=\"vcfppR\") samples <- \"HG00133,HG00143,HG00262\" res <- vcfcomp(test, truth, stats=\"f1\", format=c('GT','GT'), samples=samples) #> Warning: F1 should be used only for a sample with genotypes of all types, hom ref(0), het(1) and hom alt(2) str(res) #> List of 2 #> $ samples: chr [1:3] \"HG00133\" \"HG00143\" \"HG00262\" #> $ f1 : int [1:17, 1:3] 15 NA NA NA NA NA NA NA NA NA ... #> ..- attr(*, \"dimnames\")=List of 2 #> .. ..$ : chr [1:17] \"[0,1e-05]\" \"(1e-05,2e-05]\" \"(2e-05,5e-05]\" \"(5e-05,0.0001]\" ... #> .. ..$ : chr [1:3] \"n\" \"nA\" \"concordance\" #> - attr(*, \"class\")= chr \"vcfcomp\""},{"path":"/reference/vcfplot.html","id":null,"dir":"Reference","previous_headings":"","what":"Make sensible and beautiful plots based on various objects in vcfppR — vcfplot","title":"Make sensible and beautiful plots based on various objects in vcfppR — vcfplot","text":"Make sensible beautiful plots based various objects vcfppR","code":""},{"path":"/reference/vcfplot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Make sensible and beautiful plots based on various objects in vcfppR — vcfplot","text":"","code":"vcfplot(obj, which.sample = NULL, variant = c(\"SNP\", \"INDEL\"), pop = NULL, ...)"},{"path":"/reference/vcfplot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Make sensible and beautiful plots based on various objects in vcfppR — vcfplot","text":"obj object returned vcftable, vcfcomp, vcfsummary .sample sample plotted. NULL aggregate samples. variant types variant desired pop file contains population information ... parameters passed graphics","code":""},{"path":"/reference/vcfpopgen.html","id":null,"dir":"Reference","previous_headings":"","what":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","title":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","text":"count heterozygous sites per sample VCF/BCF","code":""},{"path":"/reference/vcfpopgen.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","text":"","code":"vcfpopgen( vcffile, region = \"\", samples = \"-\", pass = FALSE, qual = 0, fun = \"heterozygosity\" )"},{"path":"/reference/vcfpopgen.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","text":"vcffile path VCF/BCF file region region subset like bcftools samples samples subset like bcftools pass restrict variants FILTER==PASS qual restrict variants QUAL > qual. fun popgen function run. available functions \"heterozygosity\".","code":""},{"path":"/reference/vcfpopgen.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","text":"vcfpopgen list containing following components: samples : character vector; samples ids VCF file subsetting hets : integer vector; counts heterozygous sites sample order samples","code":""},{"path":"/reference/vcfpopgen.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","text":"Zilong Li zilong.dk@gmail.com","code":""},{"path":"/reference/vcfpopgen.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","text":"","code":"library('vcfppR') vcffile <- system.file(\"extdata\", \"raw.gt.vcf.gz\", package=\"vcfppR\") res <- vcfpopgen(vcffile) str(res) #> List of 2 #> $ samples: chr [1:3202] \"HG00096\" \"HG00097\" \"HG00099\" \"HG00100\" ... #> $ hets : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ..."},{"path":"/reference/vcfppR-package.html","id":null,"dir":"Reference","previous_headings":"","what":"vcfppR: Rapid Manipulation of the Variant Call Format (VCF) — vcfppR-package","title":"vcfppR: Rapid Manipulation of the Variant Call Format (VCF) — vcfppR-package","text":"'vcfpp.h' (https://github.com/Zilong-Li/vcfpp) provides easy--use 'C++' 'API' 'htslib', offering full functionality manipulating Variant Call Format (VCF) files. 'vcfppR' package serves R bindings 'vcfpp.h' library, enabling rapid processing compressed uncompressed VCF files. Explore range powerful features efficient VCF data manipulation.","code":""},{"path":[]},{"path":"/reference/vcfppR-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"vcfppR: Rapid Manipulation of the Variant Call Format (VCF) — vcfppR-package","text":"Maintainer: Zilong Li zilong.dk@gmail.com (ORCID) contributors: Bonfield, James K Marshall, John Danecek, Petr Li, Heng Ohan, Valeriu Whitwham, Andrew Keane, Thomas Davies, Robert M (Authors included htslib library) [copyright holder]","code":""},{"path":"/reference/vcfreader.html","id":null,"dir":"Reference","previous_headings":"","what":"API for manipulating the VCF/BCF. — vcfreader","title":"API for manipulating the VCF/BCF. — vcfreader","text":"Type name class see details methods","code":""},{"path":"/reference/vcfreader.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"API for manipulating the VCF/BCF. — vcfreader","text":"C++ class following fields/methods manipulating VCF/BCF","code":""},{"path":"/reference/vcfreader.html","id":"fields","dir":"Reference","previous_headings":"","what":"Fields","title":"API for manipulating the VCF/BCF. — vcfreader","text":"new Constructor given vcf file Parameter: vcffile - path vcf file new Constructor given vcf file region Parameter: vcffile - path vcf file Parameter: region - region constrained new Constructor given vcf file, region samples Parameter: vcffile - path vcf file Parameter: region - region constrained Parameter: samples - samples constrained. Comma separated list samples include (exclude \"^\" prefix). variant Try get next variant record. return FALSE variants hit end file, otherwise TRUE. chr Return CHROM field current variant pos Return POS field current variant id Return CHROM field current variant ref Return REF field current variant alt Return ALT field current variant qual Return QUAL field current variant filter Return FILTER field current variant info Return INFO field current variant infoInt Return tag value integer type INFO field current variant Parameter: tag - tag name retrieve INFO infoFloat Return tag value float type INFO field current variant Parameter: tag - tag name retrieve INFO infoStr Return tag value string type INFO field current variant Parameter: tag - tag name retrieve INFO infoIntVec Return tag value vector integer type INFO field current variant Parameter: tag - tag name retrieve INFO infoFloatVec Return tag value vector float type INFO field current variant Parameter: tag - tag name retrieve INFO genotypes Return genotype values vector integers Parameter: collapse - Boolean value indicates wheather collapse size genotypes, eg, return diploid genotypes. formatInt Return tag value integer type sample FORAMT field current variant Parameter: tag - tag name retrieve FORAMT formatFloat Return tag value float type sample FORAMT field current variant Parameter: tag - tag name retrieve FORAMT formatStr Return tag value string type sample FORAMT field current variant Parameter: tag - tag name retrieve FORAMT isSNP Test current variant exculsively SNP isIndel Test current variant exculsively INDEL isSV Test current variant exculsively SV isMultiAllelics Test current variant exculsively Multi Allelics isMultiAllelicSNP Test current variant exculsively Multi Biallelics (SNPs) hasSNP Test current variant SNP hasINDEL Test current variant INDEL hasINS Test current variant INS hasDEL Test current variant DEL hasMNP Test current variant MNP hasBND Test current variant BND hasOTHER Test current variant hasOVERLAP Test current variant OVERLAP nsamples Return number samples samples Return vector samples id header Return raw string vcf header string Return raw string current variant including newline line Return raw string current variant without newline output Init output object streaming variants another vcf write Streaming current variant output vcf close Close connection output vcf setCHR Modify CHR current variant Parameter: s - string CHR setID Modify ID current variant Parameter: s - string ID setPOS Modify POS current variant Parameter: pos - integer POS setRefAlt Modify REF ALT current variant Parameter: s - string reperated comma setInfoInt Modify given tag INT type INFO current variant Parameter: tag - string tag name Parameter: v - integer tag value setInfoFloat Modify given tag FLOAT type INFO current variant Parameter: tag - string tag name Parameter: v - double tag value setInfoStr Modify given tag STRING type INFO current variant Parameter: tag - string tag name Parameter: s - string tag value setPhasing Modify phasing status sample Parameter: v - integer vector size number samples. 1s 0s valid. setGenotypes Modify genotypes current variant Parameter: v - integer vector genotypes. Use NA -9 missing value. setFormatInt Modify given tag INT type FORMAT current variant Parameter: tag - string tag name Parameter: v - integer tag value setFormatFloat Modify given tag FLOAT type FORMAT current variant Parameter: tag - string tag name Parameter: v - double tag value setFormatStr Modify given tag STRING type FORMAT current variant Parameter: tag - string tag name Parameter: s - string tag value rmInfoTag Remove given tag INFO current variant Parameter: s - string tag name rmFormatTag Remove given tag FORMAT current variant Parameter: s - string tag name setVariant Modify current variant adding vcf line Parameter: s - string one line VCF addINFO Add INFO header vcf Parameter: id - string tag name Parameter: number - string number Parameter: type - string type Parameter: desc - string description means addFORMAT Add FORMAT header vcf Parameter: id - string tag name Parameter: number - string number Parameter: type - string type Parameter: desc - string description means","code":""},{"path":"/reference/vcfreader.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"API for manipulating the VCF/BCF. — vcfreader","text":"","code":"vcffile <- system.file(\"extdata\", \"raw.gt.vcf.gz\", package=\"vcfppR\") br <- vcfreader$new(vcffile) res <- rep(0L, br$nsamples()) while(br$variant()) { if(br$isSNP()) { gt <- br$genotypes(TRUE) == 1 gt[is.na(gt)] <- FALSE res <- res + gt } }"},{"path":"/reference/vcfsummary.html","id":null,"dir":"Reference","previous_headings":"","what":"summarize the various variant types at both variant level and sample level. — vcfsummary","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"summarize various variant types variant level sample level.","code":""},{"path":"/reference/vcfsummary.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"","code":"vcfsummary( vcffile, region = \"\", samples = \"-\", pass = FALSE, qual = 0, svtype = FALSE )"},{"path":"/reference/vcfsummary.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"vcffile path VCF/BCF file region region subset like bcftools samples samples subset like bcftools pass restrict variants FILTER==PASS qual restrict variants QUAL > qual. svtype summarize variants SVTYPE","code":""},{"path":"/reference/vcfsummary.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"vcfsummary list containing following components: summary : named integer vector; summarize counts variant type samples : character vector; samples ids VCF file subsetting vartype : integer vector; counts variant type sample level order samples","code":""},{"path":"/reference/vcfsummary.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"bcftools view -s \"id01,id02\" input.bcf.gz chr1:100000-20000","code":""},{"path":"/reference/vcfsummary.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"Zilong Li zilong.dk@gmail.com","code":""},{"path":"/reference/vcfsummary.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"","code":"library('vcfppR') svfile <- system.file(\"extdata\", \"sv.vcf.gz\", package=\"vcfppR\") res <- vcfsummary(svfile, region = \"chr21:1-10000000\", svtype = TRUE) str(res) #> List of 10 #> $ summary: Named int [1:10] 9 9 0 0 0 0 2 4 3 0 #> ..- attr(*, \"names\")= chr [1:10] \"ALL\" \"SV\" \"BND\" \"CNV\" ... #> $ samples: chr [1:3202] \"HG00096\" \"HG00097\" \"HG00099\" \"HG00100\" ... #> $ BND : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> $ CNV : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> $ CPX : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> $ CTX : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> $ DEL : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> $ DUP : int [1:3202] 0 1 0 0 0 0 0 0 0 0 ... #> $ INS : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> $ INV : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> - attr(*, \"class\")= chr \"vcfsummary\""},{"path":"/reference/vcftable.html","id":null,"dir":"Reference","previous_headings":"","what":"read VCF/BCF contents into R data structure — vcftable","title":"read VCF/BCF contents into R data structure — vcftable","text":"swiss army knife reading VCF/BCF R data types rapidly easily.","code":""},{"path":"/reference/vcftable.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"read VCF/BCF contents into R data structure — vcftable","text":"","code":"vcftable( vcffile, region = \"\", samples = \"-\", vartype = \"all\", format = \"GT\", ids = NULL, qual = 0, pass = FALSE, info = TRUE, collapse = TRUE, setid = FALSE, mac = 0 )"},{"path":"/reference/vcftable.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"read VCF/BCF contents into R data structure — vcftable","text":"vcffile path VCF/BCF file region region subset bcftools-like style: \"chr1\", \"chr1:1-10000000\" samples samples subset bcftools-like style. comma separated list samples include (exclude \"^\" prefix). e.g. \"id01,id02\", \"^id01,id02\". vartype restrict specific type variants. supports \"snps\",\"indels\", \"sv\", \"multisnps\",\"multiallelics\" format FORMAT tag extract. default \"GT\" extracted. ids character vector. restrict sites ID given vector. default NULL filter sites. qual numeric. restrict variants QUAL > qual. pass logical. restrict variants FILTER = \"PASS\". info logical. drop INFO column returned list. collapse logical. acts FORMAT. FORMAT extract \"GT\", dim raw genotypes matrix diploid (M, 2 * N), M #markers N #samples. default TRUE collapse genotypes sample matrix (M, N). Set FALSE one wants maintain phasing order, e.g. \"1|0\" parsed c(1, 0) collapse=FALSE. FORMAT extract \"GT\", collapse=TRUE try turn list extracted vector matrix. However, raises issues one variant mutliallelic resulting vaules others. setid logical. reset ID column CHR_POS_REF_ALT. mac integer. restrict variants minor allele count higher value.","code":""},{"path":"/reference/vcftable.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"read VCF/BCF contents into R data structure — vcftable","text":"Return list containing following components: samples : character vector; samples ids VCF file subsetting chr : character vector; CHR column VCF file pos : character vector; POS column VCF file id : character vector; ID column VCF file ref : character vector; REF column VCF file alt : character vector; ALT column VCF file qual : character vector; QUAL column VCF file filter : character vector; FILTER column VCF file info : character vector; INFO column VCF file format : matrix either integer numberic values depending tag extract; specifiy tag FORMAT column extracted","code":""},{"path":"/reference/vcftable.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"read VCF/BCF contents into R data structure — vcftable","text":"vcftable uses C++ API vcfpp, wrapper htslib, read VCF/BCF files. Thus, full functionalities htslib, restrict specific variant types, samples regions. memory efficiency reason, vcftable designed parse one tag time FORMAT column VCF. default, matrix genotypes, .e. \"GT\" tag, returned vcftable, many tags supported format option.","code":""},{"path":"/reference/vcftable.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"read VCF/BCF contents into R data structure — vcftable","text":"Zilong Li zilong.dk@gmail.com","code":""},{"path":"/reference/vcftable.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"read VCF/BCF contents into R data structure — vcftable","text":"","code":"library('vcfppR') vcffile <- system.file(\"extdata\", \"raw.gt.vcf.gz\", package=\"vcfppR\") res <- vcftable(vcffile, \"chr21:1-5050000\", vartype = \"snps\") str(res) #> List of 10 #> $ samples: chr [1:3202] \"HG00096\" \"HG00097\" \"HG00099\" \"HG00100\" ... #> $ chr : chr [1:12] \"chr21\" \"chr21\" \"chr21\" \"chr21\" ... #> $ pos : int [1:12] 5030082 5030088 5030105 5030253 5030278 5030347 5030356 5030357 5030391 5030446 ... #> $ id : chr [1:12] \"chr21:5030082:G:A\" \"chr21:5030088:C:T\" \"chr21:5030105:C:A\" \"chr21:5030253:G:T\" ... #> $ ref : chr [1:12] \"G\" \"C\" \"C\" \"G\" ... #> $ alt : chr [1:12] \"A\" \"T\" \"A\" \"T\" ... #> $ qual : num [1:12] 70.1 2773.1 3897.8 102.6 868.9 ... #> $ filter : chr [1:12] \"VQSRTrancheSNP99.80to100.00\" \"VQSRTrancheSNP99.80to100.00\" \"VQSRTrancheSNP99.80to100.00\" \"VQSRTrancheSNP99.80to100.00\" ... #> $ info : chr [1:12] \"AC=2;AF=0.000616523;AN=3244;DP=2498;FS=0;MLEAC=1;MLEAF=0.0003083;MQ=17.07;MQ0=0;QD=17.52;SOR=3.258;VQSLOD=-32.6\"| __truncated__ \"AC=127;AF=0.0400126;AN=3174;BaseQRankSum=0.736;ClippingRankSum=0.736;DP=2750;FS=0;InbreedingCoeff=0.0015;MLEAC=\"| __truncated__ \"AC=128;AF=0.0352811;AN=3628;BaseQRankSum=0.736;ClippingRankSum=0.727;DP=3476;FS=0;InbreedingCoeff=-0.0015;MLEAC\"| __truncated__ \"AC=1;AF=0.000165837;AN=6030;BaseQRankSum=-0.583;ClippingRankSum=-0.259;DP=19530;FS=0;InbreedingCoeff=-0.0274;ML\"| __truncated__ ... #> $ gt : int [1:12, 1:3202] NA 2 2 0 0 0 0 0 0 0 ... #> - attr(*, \"class\")= chr \"vcftable\""},{"path":"/reference/vcfwriter.html","id":null,"dir":"Reference","previous_headings":"","what":"API for writing the VCF/BCF. — vcfwriter","title":"API for writing the VCF/BCF. — vcfwriter","text":"Type name class see details methods","code":""},{"path":"/reference/vcfwriter.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"API for writing the VCF/BCF. — vcfwriter","text":"C++ class following fields/methods writing VCF/BCF","code":""},{"path":"/reference/vcfwriter.html","id":"fields","dir":"Reference","previous_headings":"","what":"Fields","title":"API for writing the VCF/BCF. — vcfwriter","text":"new Constructor given vcf file Parameter: vcffile - path vcf file. start \"~\" Parameter: version - version VCF specification addContig Add Contig header vcf Parameter: str - string CONTIG name addFILTER Add FILTER header vcf Parameter: id - string FILTER name Parameter: desc - string description means addINFO Add INFO header vcf Parameter: id - string tag name Parameter: number - string number Parameter: type - string type Parameter: desc - string description means addFORMAT Add FORMAT header vcf Parameter: id - string tag name Parameter: number - string number Parameter: type - string type Parameter: desc - string description means addSample Add SAMPLE header vcf Parameter: str - string SAMPLE name addLine Add line header vcf Parameter: str - string line header VCF writeline Write variant record given line Parameter: line - string line variant VCF. ended \"newline\" close Close save vcf file","code":""},{"path":"/reference/vcfwriter.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"API for writing the VCF/BCF. — vcfwriter","text":"","code":"outvcf <- file.path(paste0(tempfile(), \".vcf.gz\")) bw <- vcfwriter$new(outvcf, \"VCF4.1\") bw$addContig(\"chr20\") bw$addFORMAT(\"GT\", \"1\", \"String\", \"Genotype\"); bw$addSample(\"NA12878\") s1 <- \"chr20\\t2006060\\t.\\tG\\tC\\t100\\tPASS\\t.\\tGT\\t1|0\" bw$writeline(s1) bw$close()"},{"path":"/news/index.html","id":"vcfppr-045","dir":"Changelog","previous_headings":"","what":"vcfppR 0.4.5","title":"vcfppR 0.4.5","text":"CRAN release: 2024-04-08 add vcfcomp function fix memory leaks pass ASAN check","code":""},{"path":"/news/index.html","id":"vcfppr-040","dir":"Changelog","previous_headings":"","what":"vcfppR 0.4.0","title":"vcfppR 0.4.0","text":"CRAN release: 2024-02-26 add setid option vcftable patches upcoming Rtools windows","code":""},{"path":"/news/index.html","id":"vcfppr-038","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.8","title":"vcfppR 0.3.8","text":"CRAN release: 2024-01-14 fix issues M1 Mac","code":""},{"path":"/news/index.html","id":"vcfppr-037","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.7","title":"vcfppR 0.3.7","text":"add vcfreader@rmFormatTag() add vcfreader@samples() vcftable supports vartype = ‘sv’","code":""},{"path":"/news/index.html","id":"vcfppr-036","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.6","title":"vcfppR 0.3.6","text":"add vcfreader::line remove vcfreader::setVariant bug fix setFormatStr units tests","code":""},{"path":"/news/index.html","id":"vcfppr-035","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.5","title":"vcfppR 0.3.5","text":"CRAN release: 2023-12-14 add vcfreader vcfwriter","code":""},{"path":"/news/index.html","id":"vcfppr-034","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.4","title":"vcfppR 0.3.4","text":"support filters variant ID","code":""},{"path":"/news/index.html","id":"vcfppr-033","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.3","title":"vcfppR 0.3.3","text":"use API vcfpp.h v0.3.1 set missing vaules FORMAT NA support filters QUAL, FILTER INFO","code":""},{"path":"/news/index.html","id":"vcfppr-030","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.0","title":"vcfppR 0.3.0","text":"First release using vcfpp.h v0.3.0 add vcftable function add vcfsummary function add vcfpopgen function","code":""}] +[{"path":"/CONTRIBUTING.html","id":"contributing-to-vcfppr","dir":"","previous_headings":"","what":"Contributing to vcfppR","title":"NA","text":"Please see file Contributing details report issue: Minimally Complete () Verifiable Example (MCVE) helps lot; submit pull request: post issue first, get consensus ; follow (informal) coding style: simply files invent new style; nice NEWS.Rd","code":""},{"path":"/PULL_REQUEST_TEMPLATE.html","id":"pull-request-template-for-rcpp","dir":"","previous_headings":"","what":"Pull Request Template for Rcpp","title":"NA","text":"Please explain changes want apply Rcpp, preferably issue ticket create pull request. See file Contributing templates details.","code":""},{"path":"/PULL_REQUEST_TEMPLATE.html","id":"checklist","dir":"","previous_headings":"Pull Request Template for Rcpp","what":"Checklist","title":"NA","text":"Code compiles correctly R CMD check still passes tests Preferably, new tests added fail without change Document changes file ChangeLog","code":""},{"path":"/articles/concordance-of-two-vcf-files.html","id":"background","dir":"Articles","previous_headings":"","what":"Background","title":"Assess the concordance between VCFs","text":"benchmarking, ’s often need calculate concordance rate test set truth set. truth VCF file, always true genotypes GT otherwise can’t validate test VCF. test VCF may variant caller genotype imputation program, format can variable, e.g GP, DS GT. Hence, article guides use vcfppR::vcfcomp function rapidly examine various statistics different scenarios formats, Pearson correlation genotyping (stats=“r2”), Non-Reference Concordance (stats=“nrc”), F1-score (stats=“f1”) Phasing Switch Error (stats=“pse”).","code":""},{"path":"/articles/concordance-of-two-vcf-files.html","id":"case-1-genotype-imputation-accuracy","dir":"Articles","previous_headings":"","what":"Case 1: Genotype imputation accuracy","title":"Assess the concordance between VCFs","text":"normally get genotype posterior GP genotype dosage DS diploid imputation software, eg QUILT GLIMPSE. examine imputation accuracy, calculate Pearson correlation imputed genotype dosage true genotypes. vcfcomp, need specify desired stats=\"r2\" formats=c(\"DS\",\"GT\"), extract respective FORMAT items testvcf truthvcf. Besides, QUILT2-nipt method outputs MDS FDS maternal fetal genotype dosages constract DS diploid mode. assess imputation accuracy maternal fetal, need specify corresponding formats. Note: absence DS format testvcf, one can either fill DS tag using vcf_addDS command line tool manipulate testvcf R using vcftable.","code":"vcfcomp(testvcf, truthvcf, formats = c(\"DS\", \"GT\"), stats = \"r2\") vcfcomp(testvcf, truthvcf, formats = c(\"MDS\", \"GT\"), stats = \"r2\") vcfcomp(testvcf, truthvcf, formats = c(\"FDS\", \"GT\"), stats = \"r2\")"},{"path":"/articles/concordance-of-two-vcf-files.html","id":"case-2-genotype-concordance","dir":"Articles","previous_headings":"","what":"Case 2: Genotype concordance","title":"Assess the concordance between VCFs","text":"case, interested called genotype concordance sensitivity / specificity genotype calling. contrast stats=\"r2\", choose stats=\"f1\" stats=\"nrc\" specify formats=c(\"GT\", \"GT\"). Normally, want results sample, can achieved using .sample=TRUE.","code":"vcfcomp(testvcf, truthvcf, formats = c(\"GT\",\"GT\"), stats=\"nrc\", by.sample=TRUE) vcfcomp(testvcf, truthvcf, formats = c(\"GT\",\"GT\"), stats=\"f1\", by.sample=TRUE)"},{"path":"/articles/concordance-of-two-vcf-files.html","id":"case-3-phasing-switch-error","dir":"Articles","previous_headings":"","what":"Case 3: Phasing switch error","title":"Assess the concordance between VCFs","text":"case, look functionality assess phasing switch error. First , need two VCF files contain phased GT, represented ‘|’. can choose return sites pse. Note: Currently, pse statatics simple form doesn’t take completeness quality account.","code":"vcfcomp(testvcf, truthvcf, stats=\"pse\", return_pse_sites=TRUE)"},{"path":"/articles/concordance-of-two-vcf-files.html","id":"case-4-multiple-testing-repetitively","dir":"Articles","previous_headings":"","what":"Case 4: Multiple testing repetitively","title":"Assess the concordance between VCFs","text":"comprehensive benchmarking, often run many tests true sets. scenario, can save truth RDS object reuse . Actually, test truth can take RDS file input. RDS file stores object returned vcftable.","code":"saveRDS(vcftable(truthvcf), \"truth.rds\") vcfcomp(test=testvcf1, truth=\"truth.rds\") vcfcomp(test=testvcf2, truth=\"truth.rds\") vcfcomp(test=testvcf3, truth=\"truth.rds\")"},{"path":"/articles/concordance-of-two-vcf-files.html","id":"qa-how-to-fix-the-error-inconsistent-samples-name","dir":"Articles","previous_headings":"","what":"Q&A: How to fix the error “inconsistent samples name”","title":"Assess the concordance between VCFs","text":"one certain samples name testvcf can replaced names can match samples truthvcf. One can use names option specify vector new names can found truthvcf.","code":""},{"path":"/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Zilong Li. Author, maintainer. Bonfield, James K Marshall, John Danecek, Petr Li, Heng Ohan, Valeriu Whitwham, Andrew Keane, Thomas Davies, Robert M. Copyright holder. Authors included htslib library","code":""},{"path":"/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Li Z (2024). “vcfpp: C++ API rapid processing variant call format.” Bioinformatics, 40(2), btae049. ISSN 1367-4811, doi:10.1093/bioinformatics/btae049.","code":"@Article{, title = {vcfpp: a C++ API for rapid processing of the variant call format}, author = {Zilong Li}, journal = {Bioinformatics}, volume = {40}, number = {2}, pages = {btae049}, year = {2024}, month = {01}, issn = {1367-4811}, abstract = {Given the widespread use of the variant call format (VCF/BCF) coupled with continuous surge in big data, there remains a perpetual demand for fast and flexible methods to manipulate these comprehensive formats across various programming languages.This work presents vcfpp, a C++ API of HTSlib in a single file, providing an intuitive interface to manipulate VCF/BCF files rapidly and safely, in addition to being portable. Moreover, this work introduces the vcfppR package to demonstrate the development of a high-performance R package with vcfpp, allowing for rapid and straightforward variants analyses.vcfpp is available from https://github.com/Zilong-Li/vcfpp under MIT license. vcfppR is available from https://cran.r-project.org/web/packages/vcfppR.}, doi = {10.1093/bioinformatics/btae049}, }"},{"path":"/index.html","id":"vcfppr-rapid-manipulation-of-the-vcfbcf-file","dir":"","previous_headings":"","what":"Rapid Manipulation of the Variant Call Format (VCF)","title":"Rapid Manipulation of the Variant Call Format (VCF)","text":"vcfppR package implements various powerful functions fast genomics analyses VCF/BCF files using C++ API vcfpp.h. Load/save content VCF/BCF R objects highly customizable options Visualize chracterize variants Compare two VCF/BCF files report various statistics Streaming read/write VCF/BCF files fine control everything Paper shows vcfppR 20x faster vcfR. Also, much faster cyvcf2","code":""},{"path":"/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Rapid Manipulation of the Variant Call Format (VCF)","text":"","code":"## install.package(\"vcfppR\") ## from CRAN remotes::install_github(\"Zilong-Li/vcfppR\") ## from latest github"},{"path":"/index.html","id":"cite-the-work","dir":"","previous_headings":"","what":"Cite the work","title":"Rapid Manipulation of the Variant Call Format (VCF)","text":"find useful, please cite paper","code":"library(vcfppR) citation(\"vcfppR\")"},{"path":"/index.html","id":"url-as-filename","dir":"","previous_headings":"","what":"URL as filename","title":"Rapid Manipulation of the Variant Call Format (VCF)","text":"functions vcfppR support URL filename VCF/BCF files.","code":"phasedvcf <- \"https://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data_collections/1000G_2504_high_coverage/working/20220422_3202_phased_SNV_INDEL_SV/1kGP_high_coverage_Illumina.chr21.filtered.SNV_INDEL_SV_phased_panel.vcf.gz\" rawvcf <- \"https://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data_collections/1000G_2504_high_coverage/working/20201028_3202_raw_GT_with_annot/20201028_CCDG_14151_B01_GRM_WGS_2020-08-05_chr21.recalibrated_variants.vcf.gz\" svfile <- \"https://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data_collections/1000G_2504_high_coverage/working/20210124.SV_Illumina_Integration/1KGP_3202.gatksv_svtools_novelins.freeze_V3.wAF.vcf.gz\" popfile <- \"https://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data_collections/1000G_2504_high_coverage/20130606_g1k_3202_samples_ped_population.txt\""},{"path":"/index.html","id":"vcftable-read-vcf-as-tabular-data","dir":"","previous_headings":"","what":"vcftable: read VCF as tabular data","title":"Rapid Manipulation of the Variant Call Format (VCF)","text":"vcftable gives fine control want extract VCF/BCF files. Read SNP variants GT format two samples Read INDEL variants DP format QUAL>100","code":"library(vcfppR) res <- vcftable(phasedvcf, \"chr21:1-5100000\", samples = \"HG00673,NA10840\", vartype = \"snps\") str(res) #> List of 10 #> $ samples: chr [1:2] \"HG00673\" \"NA10840\" #> $ chr : chr [1:194] \"chr21\" \"chr21\" \"chr21\" \"chr21\" ... #> $ pos : int [1:194] 5030578 5030588 5030596 5030673 5030957 5030960 5031004 5031031 5031194 5031224 ... #> $ id : chr [1:194] \"21:5030578:C:T\" \"21:5030588:T:C\" \"21:5030596:A:G\" \"21:5030673:G:A\" ... #> $ ref : chr [1:194] \"C\" \"T\" \"A\" \"G\" ... #> $ alt : chr [1:194] \"T\" \"C\" \"G\" \"A\" ... #> $ qual : num [1:194] 2.14e+09 2.14e+09 2.14e+09 2.14e+09 2.14e+09 ... #> $ filter : chr [1:194] \".\" \".\" \".\" \".\" ... #> $ info : chr [1:194] \"AC=74;AF=0.0115553;CM=0;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_unrel=1006;AN\"| __truncated__ \"AC=53;AF=0.00827608;CM=1.78789e-05;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_un\"| __truncated__ \"AC=2;AF=0.000312305;CM=3.21821e-05;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_un\"| __truncated__ \"AC=2;AF=0.000312305;CM=0.00016985;AN=6404;AN_EAS=1170;AN_AMR=980;AN_EUR=1266;AN_AFR=1786;AN_SAS=1202;AN_EUR_unr\"| __truncated__ ... #> $ gt : int [1:194, 1:2] 0 0 0 0 0 0 0 0 0 0 ... #> - attr(*, \"class\")= chr \"vcftable\" res <- vcftable(rawvcf, \"chr21:1-5100000\", vartype = \"indels\", format = \"DP\", qual=100) vcfplot(res, which.sample = 10, ylim=c(0,60), col = 3, pch=19)"},{"path":"/index.html","id":"vcfcomp-compare-two-vcf-files-and-report-concordance","dir":"","previous_headings":"","what":"vcfcomp: compare two VCF files and report concordance","title":"Rapid Manipulation of the Variant Call Format (VCF)","text":"Want investigate concordance two VCF files? vcfcomp utility function need! example, benchmarkings, intend calculate genotype correlation test truth. Check vignettes !","code":"res <- vcfcomp(test = rawvcf, truth = phasedvcf, stats = \"r2\", region = \"chr21:1-5100000\", formats = c(\"GT\",\"GT\")) par(mar=c(5,5,2,2), cex.lab = 2) vcfplot(res, col = 2,cex = 2, lwd = 3, type = \"b\") res <- vcfcomp(test = rawvcf, truth = phasedvcf, stats = \"pse\", region = \"chr21:5000000-5500000\", samples = \"HG00673,NA10840\", return_pse_sites = TRUE) #> stats F1 or NRC or PSE only uses GT format vcfplot(res, which=1:2, main = \"Phasing switch error\", ylab = \"HG00673,NA10840\")"},{"path":"/index.html","id":"vcfsummary-variants-characterization","dir":"","previous_headings":"","what":"vcfsummary: variants characterization","title":"Rapid Manipulation of the Variant Call Format (VCF)","text":"Want summarize variants discovered genotype caller e.g. GATK? vcfsummary utility function need! Small variants Complex structure variants","code":"res <- vcfsummary(rawvcf,\"chr21:10000000-10010000\") vcfplot(res, pop = popfile, col = 1:5, main = \"Number of SNP & INDEL variants\") res <- vcfsummary(svfile, svtype = TRUE, region = \"chr20\") vcfplot(res, main = \"Structure Variant Counts\", col = 1:7)"},{"path":"/index.html","id":"r-api-of-vcfpph","dir":"","previous_headings":"","what":"R API of vcfpp.h","title":"Rapid Manipulation of the Variant Call Format (VCF)","text":"two classes .e. vcfreader vcfwriter offering full R-bindings vcfpp.h. Check examples tests folder refer manual.","code":"?vcfppR::vcfreader"},{"path":"/reference/heterozygosity.html","id":null,"dir":"Reference","previous_headings":"","what":"calculate the number of heterozygous SNPs for each sample — heterozygosity","title":"calculate the number of heterozygous SNPs for each sample — heterozygosity","text":"calculate number heterozygous SNPs sample","code":""},{"path":"/reference/heterozygosity.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"calculate the number of heterozygous SNPs for each sample — heterozygosity","text":"","code":"heterozygosity(vcffile, region = \"\", samples = \"-\", pass = FALSE, qual = 0)"},{"path":"/reference/heterozygosity.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"calculate the number of heterozygous SNPs for each sample — heterozygosity","text":"vcffile path VCF file index region region extract, default \"\" samples samples extract, default \"-\" pass restrict variants FILTER==PASS qual restrict variants QUAL > qual.","code":""},{"path":"/reference/heterozygosity.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"calculate the number of heterozygous SNPs for each sample — heterozygosity","text":"list heterozygosity couts sample along id vcf header","code":""},{"path":"/reference/vcfcomp.html","id":null,"dir":"Reference","previous_headings":"","what":"Compare two VCF/BCF files reporting various statistics — vcfcomp","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"Compare two VCF/BCF files reporting various statistics","code":""},{"path":"/reference/vcfcomp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"","code":"vcfcomp( test, truth, formats = c(\"DS\", \"GT\"), stats = \"r2\", by.sample = FALSE, by.variant = FALSE, flip = FALSE, names = NULL, bins = NULL, af = NULL, out = NULL, choose_random_start = FALSE, return_pse_sites = FALSE, ... )"},{"path":"/reference/vcfcomp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"test path first VCF/BCF file referred test, saved RDS file. truth path second VCF/BCF file referred truth, saved RDS file. formats character vector. FORMAT tags extract test truth respectively. default c(\"DS\", \"GT\") extracts 'DS' target 'GT' truth. stats statistics calculated. supports following. \"r2\": pearson correlation coefficient ** 2. \"f1\": F1-score, good balance sensitivity precision. \"nrc\": Non-Reference Concordance rate \"pse\": Phasing Switch Error rate .sample logical. calculate concordance samples, average bins. .variant logical. calculate concordance variant, average bins. bysample variant TRUE, average samples first. bysample variant FALSE, average samples variants. flip logical. flip ref alt variants names character vector. reset samples' names test VCF. bins numeric vector. break statistics allele frequency bins. af file path allele frequency text file saved RDS file. output prefix saving objects RDS file choose_random_start choose random start stats=\"pse\" return_pse_sites boolean. return phasing switch error sites ... options passed vcftable","code":""},{"path":"/reference/vcfcomp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"list various statistics","code":""},{"path":"/reference/vcfcomp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"vcfcomp implements various statisitcs compare two VCF/BCF files, e.g. report genotype concocrdance, correlation stratified allele frequency.","code":""},{"path":"/reference/vcfcomp.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"Zilong Li zilong.dk@gmail.com","code":""},{"path":"/reference/vcfcomp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Compare two VCF/BCF files reporting various statistics — vcfcomp","text":"","code":"library('vcfppR') test <- system.file(\"extdata\", \"imputed.gt.vcf.gz\", package=\"vcfppR\") truth <- system.file(\"extdata\", \"imputed.gt.vcf.gz\", package=\"vcfppR\") samples <- \"HG00133,HG00143,HG00262\" res <- vcfcomp(test, truth, stats=\"f1\", format=c('GT','GT'), samples=samples) #> Warning: F1 should be used only for a sample with genotypes of all types, hom ref(0), het(1) and hom alt(2) str(res) #> List of 2 #> $ samples: chr [1:3] \"HG00133\" \"HG00143\" \"HG00262\" #> $ f1 : int [1:17, 1:3] 15 NA NA NA NA NA NA NA NA NA ... #> ..- attr(*, \"dimnames\")=List of 2 #> .. ..$ : chr [1:17] \"[0,1e-05]\" \"(1e-05,2e-05]\" \"(2e-05,5e-05]\" \"(5e-05,0.0001]\" ... #> .. ..$ : chr [1:3] \"n\" \"nA\" \"concordance\" #> - attr(*, \"class\")= chr \"vcfcomp\""},{"path":"/reference/vcfplot.html","id":null,"dir":"Reference","previous_headings":"","what":"Make sensible and beautiful plots based on various objects in vcfppR — vcfplot","title":"Make sensible and beautiful plots based on various objects in vcfppR — vcfplot","text":"Make sensible beautiful plots based various objects vcfppR","code":""},{"path":"/reference/vcfplot.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Make sensible and beautiful plots based on various objects in vcfppR — vcfplot","text":"","code":"vcfplot(obj, which.sample = NULL, variant = c(\"SNP\", \"INDEL\"), pop = NULL, ...)"},{"path":"/reference/vcfplot.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Make sensible and beautiful plots based on various objects in vcfppR — vcfplot","text":"obj object returned vcftable, vcfcomp, vcfsummary .sample sample plotted. NULL aggregate samples. variant types variant desired pop file contains population information ... parameters passed graphics","code":""},{"path":"/reference/vcfpopgen.html","id":null,"dir":"Reference","previous_headings":"","what":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","title":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","text":"count heterozygous sites per sample VCF/BCF","code":""},{"path":"/reference/vcfpopgen.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","text":"","code":"vcfpopgen( vcffile, region = \"\", samples = \"-\", pass = FALSE, qual = 0, fun = \"heterozygosity\" )"},{"path":"/reference/vcfpopgen.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","text":"vcffile path VCF/BCF file region region subset like bcftools samples samples subset like bcftools pass restrict variants FILTER==PASS qual restrict variants QUAL > qual. fun popgen function run. available functions \"heterozygosity\".","code":""},{"path":"/reference/vcfpopgen.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","text":"vcfpopgen list containing following components: samples : character vector; samples ids VCF file subsetting hets : integer vector; counts heterozygous sites sample order samples","code":""},{"path":"/reference/vcfpopgen.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","text":"Zilong Li zilong.dk@gmail.com","code":""},{"path":"/reference/vcfpopgen.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"count the heterozygous sites per sample in the VCF/BCF — vcfpopgen","text":"","code":"library('vcfppR') vcffile <- system.file(\"extdata\", \"raw.gt.vcf.gz\", package=\"vcfppR\") res <- vcfpopgen(vcffile) str(res) #> List of 2 #> $ samples: chr [1:3202] \"HG00096\" \"HG00097\" \"HG00099\" \"HG00100\" ... #> $ hets : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ..."},{"path":"/reference/vcfppR-package.html","id":null,"dir":"Reference","previous_headings":"","what":"vcfppR: Rapid Manipulation of the Variant Call Format (VCF) — vcfppR-package","title":"vcfppR: Rapid Manipulation of the Variant Call Format (VCF) — vcfppR-package","text":"'vcfpp.h' (https://github.com/Zilong-Li/vcfpp) provides easy--use 'C++' 'API' 'htslib', offering full functionality manipulating Variant Call Format (VCF) files. 'vcfppR' package serves R bindings 'vcfpp.h' library, enabling rapid processing compressed uncompressed VCF files. Explore range powerful features efficient VCF data manipulation.","code":""},{"path":[]},{"path":"/reference/vcfppR-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"vcfppR: Rapid Manipulation of the Variant Call Format (VCF) — vcfppR-package","text":"Maintainer: Zilong Li zilong.dk@gmail.com (ORCID) contributors: Bonfield, James K Marshall, John Danecek, Petr Li, Heng Ohan, Valeriu Whitwham, Andrew Keane, Thomas Davies, Robert M (Authors included htslib library) [copyright holder]","code":""},{"path":"/reference/vcfreader.html","id":null,"dir":"Reference","previous_headings":"","what":"API for manipulating the VCF/BCF. — vcfreader","title":"API for manipulating the VCF/BCF. — vcfreader","text":"Type name class see details methods","code":""},{"path":"/reference/vcfreader.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"API for manipulating the VCF/BCF. — vcfreader","text":"C++ class following fields/methods manipulating VCF/BCF","code":""},{"path":"/reference/vcfreader.html","id":"fields","dir":"Reference","previous_headings":"","what":"Fields","title":"API for manipulating the VCF/BCF. — vcfreader","text":"new Constructor given vcf file Parameter: vcffile - path vcf file new Constructor given vcf file region Parameter: vcffile - path vcf file Parameter: region - region constrained new Constructor given vcf file, region samples Parameter: vcffile - path vcf file Parameter: region - region constrained Parameter: samples - samples constrained. Comma separated list samples include (exclude \"^\" prefix). variant Try get next variant record. return FALSE variants hit end file, otherwise TRUE. chr Return CHROM field current variant pos Return POS field current variant id Return CHROM field current variant ref Return REF field current variant alt Return ALT field current variant qual Return QUAL field current variant filter Return FILTER field current variant info Return INFO field current variant infoInt Return tag value integer type INFO field current variant Parameter: tag - tag name retrieve INFO infoFloat Return tag value float type INFO field current variant Parameter: tag - tag name retrieve INFO infoStr Return tag value string type INFO field current variant Parameter: tag - tag name retrieve INFO infoIntVec Return tag value vector integer type INFO field current variant Parameter: tag - tag name retrieve INFO infoFloatVec Return tag value vector float type INFO field current variant Parameter: tag - tag name retrieve INFO genotypes Return genotype values vector integers Parameter: collapse - Boolean value indicates wheather collapse size genotypes, eg, return diploid genotypes. formatInt Return tag value integer type sample FORAMT field current variant Parameter: tag - tag name retrieve FORAMT formatFloat Return tag value float type sample FORAMT field current variant Parameter: tag - tag name retrieve FORAMT formatStr Return tag value string type sample FORAMT field current variant Parameter: tag - tag name retrieve FORAMT isSNP Test current variant exculsively SNP isIndel Test current variant exculsively INDEL isSV Test current variant exculsively SV isMultiAllelics Test current variant exculsively Multi Allelics isMultiAllelicSNP Test current variant exculsively Multi Biallelics (SNPs) hasSNP Test current variant SNP hasINDEL Test current variant INDEL hasINS Test current variant INS hasDEL Test current variant DEL hasMNP Test current variant MNP hasBND Test current variant BND hasOTHER Test current variant hasOVERLAP Test current variant OVERLAP nsamples Return number samples samples Return vector samples id header Return raw string vcf header string Return raw string current variant including newline line Return raw string current variant without newline output Init output object streaming variants another vcf write Streaming current variant output vcf close Close connection output vcf setCHR Modify CHR current variant Parameter: s - string CHR setID Modify ID current variant Parameter: s - string ID setPOS Modify POS current variant Parameter: pos - integer POS setRefAlt Modify REF ALT current variant Parameter: s - string reperated comma setInfoInt Modify given tag INT type INFO current variant Parameter: tag - string tag name Parameter: v - integer tag value setInfoFloat Modify given tag FLOAT type INFO current variant Parameter: tag - string tag name Parameter: v - double tag value setInfoStr Modify given tag STRING type INFO current variant Parameter: tag - string tag name Parameter: s - string tag value setPhasing Modify phasing status sample Parameter: v - integer vector size number samples. 1s 0s valid. setGenotypes Modify genotypes current variant Parameter: v - integer vector genotypes. Use NA -9 missing value. setFormatInt Modify given tag INT type FORMAT current variant Parameter: tag - string tag name Parameter: v - integer tag value setFormatFloat Modify given tag FLOAT type FORMAT current variant Parameter: tag - string tag name Parameter: v - double tag value setFormatStr Modify given tag STRING type FORMAT current variant Parameter: tag - string tag name Parameter: s - string tag value rmInfoTag Remove given tag INFO current variant Parameter: s - string tag name rmFormatTag Remove given tag FORMAT current variant Parameter: s - string tag name setVariant Modify current variant adding vcf line Parameter: s - string one line VCF addINFO Add INFO header vcf Parameter: id - string tag name Parameter: number - string number Parameter: type - string type Parameter: desc - string description means addFORMAT Add FORMAT header vcf Parameter: id - string tag name Parameter: number - string number Parameter: type - string type Parameter: desc - string description means","code":""},{"path":"/reference/vcfreader.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"API for manipulating the VCF/BCF. — vcfreader","text":"","code":"vcffile <- system.file(\"extdata\", \"raw.gt.vcf.gz\", package=\"vcfppR\") br <- vcfreader$new(vcffile) res <- rep(0L, br$nsamples()) while(br$variant()) { if(br$isSNP()) { gt <- br$genotypes(TRUE) == 1 gt[is.na(gt)] <- FALSE res <- res + gt } }"},{"path":"/reference/vcfsummary.html","id":null,"dir":"Reference","previous_headings":"","what":"summarize the various variant types at both variant level and sample level. — vcfsummary","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"summarize various variant types variant level sample level.","code":""},{"path":"/reference/vcfsummary.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"","code":"vcfsummary( vcffile, region = \"\", samples = \"-\", pass = FALSE, qual = 0, svtype = FALSE )"},{"path":"/reference/vcfsummary.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"vcffile path VCF/BCF file region region subset like bcftools samples samples subset like bcftools pass restrict variants FILTER==PASS qual restrict variants QUAL > qual. svtype summarize variants SVTYPE","code":""},{"path":"/reference/vcfsummary.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"vcfsummary list containing following components: summary : named integer vector; summarize counts variant type samples : character vector; samples ids VCF file subsetting vartype : integer vector; counts variant type sample level order samples","code":""},{"path":"/reference/vcfsummary.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"bcftools view -s \"id01,id02\" input.bcf.gz chr1:100000-20000","code":""},{"path":"/reference/vcfsummary.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"Zilong Li zilong.dk@gmail.com","code":""},{"path":"/reference/vcfsummary.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"summarize the various variant types at both variant level and sample level. — vcfsummary","text":"","code":"library('vcfppR') svfile <- system.file(\"extdata\", \"sv.vcf.gz\", package=\"vcfppR\") res <- vcfsummary(svfile, region = \"chr21:1-10000000\", svtype = TRUE) str(res) #> List of 10 #> $ summary: Named int [1:10] 9 9 0 0 0 0 2 4 3 0 #> ..- attr(*, \"names\")= chr [1:10] \"ALL\" \"SV\" \"BND\" \"CNV\" ... #> $ samples: chr [1:3202] \"HG00096\" \"HG00097\" \"HG00099\" \"HG00100\" ... #> $ BND : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> $ CNV : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> $ CPX : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> $ CTX : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> $ DEL : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> $ DUP : int [1:3202] 0 1 0 0 0 0 0 0 0 0 ... #> $ INS : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> $ INV : int [1:3202] 0 0 0 0 0 0 0 0 0 0 ... #> - attr(*, \"class\")= chr \"vcfsummary\""},{"path":"/reference/vcftable.html","id":null,"dir":"Reference","previous_headings":"","what":"read VCF/BCF contents into R data structure — vcftable","title":"read VCF/BCF contents into R data structure — vcftable","text":"swiss army knife reading VCF/BCF R data types rapidly easily.","code":""},{"path":"/reference/vcftable.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"read VCF/BCF contents into R data structure — vcftable","text":"","code":"vcftable( vcffile, region = \"\", samples = \"-\", vartype = \"all\", format = \"GT\", ids = NULL, qual = 0, pass = FALSE, info = TRUE, collapse = TRUE, setid = FALSE, mac = 0 )"},{"path":"/reference/vcftable.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"read VCF/BCF contents into R data structure — vcftable","text":"vcffile path VCF/BCF file region region subset bcftools-like style: \"chr1\", \"chr1:1-10000000\" samples samples subset bcftools-like style. comma separated list samples include (exclude \"^\" prefix). e.g. \"id01,id02\", \"^id01,id02\". vartype restrict specific type variants. supports \"snps\",\"indels\", \"sv\", \"multisnps\",\"multiallelics\" format FORMAT tag extract. default \"GT\" extracted. ids character vector. restrict sites ID given vector. default NULL filter sites. qual numeric. restrict variants QUAL > qual. pass logical. restrict variants FILTER = \"PASS\". info logical. drop INFO column returned list. collapse logical. acts FORMAT. FORMAT extract \"GT\", dim raw genotypes matrix diploid (M, 2 * N), M #markers N #samples. default TRUE collapse genotypes sample matrix (M, N). Set FALSE one wants maintain phasing order, e.g. \"1|0\" parsed c(1, 0) collapse=FALSE. FORMAT extract \"GT\", collapse=TRUE try turn list extracted vector matrix. However, raises issues one variant mutliallelic resulting vaules others. setid logical. reset ID column CHR_POS_REF_ALT. mac integer. restrict variants minor allele count higher value.","code":""},{"path":"/reference/vcftable.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"read VCF/BCF contents into R data structure — vcftable","text":"Return list containing following components: samples : character vector; samples ids VCF file subsetting chr : character vector; CHR column VCF file pos : character vector; POS column VCF file id : character vector; ID column VCF file ref : character vector; REF column VCF file alt : character vector; ALT column VCF file qual : character vector; QUAL column VCF file filter : character vector; FILTER column VCF file info : character vector; INFO column VCF file format : matrix either integer numberic values depending tag extract; specifiy tag FORMAT column extracted","code":""},{"path":"/reference/vcftable.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"read VCF/BCF contents into R data structure — vcftable","text":"vcftable uses C++ API vcfpp, wrapper htslib, read VCF/BCF files. Thus, full functionalities htslib, restrict specific variant types, samples regions. memory efficiency reason, vcftable designed parse one tag time FORMAT column VCF. default, matrix genotypes, .e. \"GT\" tag, returned vcftable, many tags supported format option.","code":""},{"path":"/reference/vcftable.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"read VCF/BCF contents into R data structure — vcftable","text":"Zilong Li zilong.dk@gmail.com","code":""},{"path":"/reference/vcftable.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"read VCF/BCF contents into R data structure — vcftable","text":"","code":"library('vcfppR') vcffile <- system.file(\"extdata\", \"raw.gt.vcf.gz\", package=\"vcfppR\") res <- vcftable(vcffile, \"chr21:1-5050000\", vartype = \"snps\") str(res) #> List of 10 #> $ samples: chr [1:3202] \"HG00096\" \"HG00097\" \"HG00099\" \"HG00100\" ... #> $ chr : chr [1:12] \"chr21\" \"chr21\" \"chr21\" \"chr21\" ... #> $ pos : int [1:12] 5030082 5030088 5030105 5030253 5030278 5030347 5030356 5030357 5030391 5030446 ... #> $ id : chr [1:12] \"chr21:5030082:G:A\" \"chr21:5030088:C:T\" \"chr21:5030105:C:A\" \"chr21:5030253:G:T\" ... #> $ ref : chr [1:12] \"G\" \"C\" \"C\" \"G\" ... #> $ alt : chr [1:12] \"A\" \"T\" \"A\" \"T\" ... #> $ qual : num [1:12] 70.1 2773.1 3897.8 102.6 868.9 ... #> $ filter : chr [1:12] \"VQSRTrancheSNP99.80to100.00\" \"VQSRTrancheSNP99.80to100.00\" \"VQSRTrancheSNP99.80to100.00\" \"VQSRTrancheSNP99.80to100.00\" ... #> $ info : chr [1:12] \"AC=2;AF=0.000616523;AN=3244;DP=2498;FS=0;MLEAC=1;MLEAF=0.0003083;MQ=17.07;MQ0=0;QD=17.52;SOR=3.258;VQSLOD=-32.6\"| __truncated__ \"AC=127;AF=0.0400126;AN=3174;BaseQRankSum=0.736;ClippingRankSum=0.736;DP=2750;FS=0;InbreedingCoeff=0.0015;MLEAC=\"| __truncated__ \"AC=128;AF=0.0352811;AN=3628;BaseQRankSum=0.736;ClippingRankSum=0.727;DP=3476;FS=0;InbreedingCoeff=-0.0015;MLEAC\"| __truncated__ \"AC=1;AF=0.000165837;AN=6030;BaseQRankSum=-0.583;ClippingRankSum=-0.259;DP=19530;FS=0;InbreedingCoeff=-0.0274;ML\"| __truncated__ ... #> $ gt : int [1:12, 1:3202] NA 2 2 0 0 0 0 0 0 0 ... #> - attr(*, \"class\")= chr \"vcftable\""},{"path":"/reference/vcfwriter.html","id":null,"dir":"Reference","previous_headings":"","what":"API for writing the VCF/BCF. — vcfwriter","title":"API for writing the VCF/BCF. — vcfwriter","text":"Type name class see details methods","code":""},{"path":"/reference/vcfwriter.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"API for writing the VCF/BCF. — vcfwriter","text":"C++ class following fields/methods writing VCF/BCF","code":""},{"path":"/reference/vcfwriter.html","id":"fields","dir":"Reference","previous_headings":"","what":"Fields","title":"API for writing the VCF/BCF. — vcfwriter","text":"new Constructor given vcf file Parameter: vcffile - path vcf file. start \"~\" Parameter: version - version VCF specification addContig Add Contig header vcf Parameter: str - string CONTIG name addFILTER Add FILTER header vcf Parameter: id - string FILTER name Parameter: desc - string description means addINFO Add INFO header vcf Parameter: id - string tag name Parameter: number - string number Parameter: type - string type Parameter: desc - string description means addFORMAT Add FORMAT header vcf Parameter: id - string tag name Parameter: number - string number Parameter: type - string type Parameter: desc - string description means addSample Add SAMPLE header vcf Parameter: str - string SAMPLE name addLine Add line header vcf Parameter: str - string line header VCF writeline Write variant record given line Parameter: line - string line variant VCF. ended \"newline\" close Close save vcf file","code":""},{"path":"/reference/vcfwriter.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"API for writing the VCF/BCF. — vcfwriter","text":"","code":"outvcf <- file.path(paste0(tempfile(), \".vcf.gz\")) bw <- vcfwriter$new(outvcf, \"VCF4.1\") bw$addContig(\"chr20\") bw$addFORMAT(\"GT\", \"1\", \"String\", \"Genotype\"); bw$addSample(\"NA12878\") s1 <- \"chr20\\t2006060\\t.\\tG\\tC\\t100\\tPASS\\t.\\tGT\\t1|0\" bw$writeline(s1) bw$close()"},{"path":"/news/index.html","id":"vcfppr-045","dir":"Changelog","previous_headings":"","what":"vcfppR 0.4.5","title":"vcfppR 0.4.5","text":"CRAN release: 2024-04-08 add vcfcomp function fix memory leaks pass ASAN check","code":""},{"path":"/news/index.html","id":"vcfppr-040","dir":"Changelog","previous_headings":"","what":"vcfppR 0.4.0","title":"vcfppR 0.4.0","text":"CRAN release: 2024-02-26 add setid option vcftable patches upcoming Rtools windows","code":""},{"path":"/news/index.html","id":"vcfppr-038","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.8","title":"vcfppR 0.3.8","text":"CRAN release: 2024-01-14 fix issues M1 Mac","code":""},{"path":"/news/index.html","id":"vcfppr-037","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.7","title":"vcfppR 0.3.7","text":"add vcfreader@rmFormatTag() add vcfreader@samples() vcftable supports vartype = ‘sv’","code":""},{"path":"/news/index.html","id":"vcfppr-036","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.6","title":"vcfppR 0.3.6","text":"add vcfreader::line remove vcfreader::setVariant bug fix setFormatStr units tests","code":""},{"path":"/news/index.html","id":"vcfppr-035","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.5","title":"vcfppR 0.3.5","text":"CRAN release: 2023-12-14 add vcfreader vcfwriter","code":""},{"path":"/news/index.html","id":"vcfppr-034","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.4","title":"vcfppR 0.3.4","text":"support filters variant ID","code":""},{"path":"/news/index.html","id":"vcfppr-033","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.3","title":"vcfppR 0.3.3","text":"use API vcfpp.h v0.3.1 set missing vaules FORMAT NA support filters QUAL, FILTER INFO","code":""},{"path":"/news/index.html","id":"vcfppr-030","dir":"Changelog","previous_headings":"","what":"vcfppR 0.3.0","title":"vcfppR 0.3.0","text":"First release using vcfpp.h v0.3.0 add vcftable function add vcfsummary function add vcfpopgen function","code":""}] diff --git a/man/figures/README-summary_sm-1.png b/man/figures/README-summary_sm-1.png index d15409dd5e7f20e202c12321f3d91228877234fc..d1161973d7b8534e4d6c2a4f0d18852e572759b8 100644 GIT binary patch literal 14187 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 Wi|Jk0zyR(|HAPt!nUAPP&;AEK`FQC7 literal 14661 zcmdUW2T)X7yJagVppt`#1RGG1AVHFnv;j#YHNFVBAPSCLI;(U;u_FJ#0_g$uAl561xVJ2G5 zvdAjql%Cx!!hi>Pv@~Y4e7+&iq`ogT#rj-irzo`$=sBdmBXF(f&cmnt(a{$k(7%F5 zA&wx!!5;|0B;sR;n;oiHcoH-R3W1;yq(Q>V4E_`d1R<#`F#_TBij@$7xFt<_9PvEy zzu4{i{(gRxelo0~Gd7rA{Q#fauNmqk9ky2|7lX#e$Jwa-0s{lf-ELcLuY6r4>RN-4NOMBZ)q_L-($a2H$^ZFmUdU{HVisElL&h-^o(8}#?)*KGG zcGA$EJxh&p!u8i5l-rJdUDVZeY<(vY+p3|fD=&7s@I!`&jbyv$|gcdSkI_Rf4R7v`ad2duX;GBPqFV>SdS?X)Xfq6m`o-k3KfH44tGU2xgXW{fZ^QhGb@DDn(v3tnrLDiQ>^OCL|(Ki4jy- ziLUh_PY^IyoWBwk9qoA0LWJb>>9y5WR_vd}A^n%(5sE3~ERyWlUtL|6w)q`N!aeRH zRn3D~R?SPiyf!^KhOouVu*3@yihV45dwb&I;{9&@85(KC$nNfLom?X!5fKZbt45VB zGaX6m>+5nsjFyI2&YbDbpFgWe?Q0&)$6dE)ry@bJv#}*tu~s_FQVn?JR&D4xIQ+>s zZ+S9Un&-SUe3dTA|HZf0=hNt2`tr?VMQko%-S<|$@%YPSQt5>+V0{s1-K7E>>pC2Rqn8EEr*VpjNDy(d5I2?}X4E=JO*b+nlr=*^? zcJci$$Bm7Rsi~<|RN7ONA|*ZdbPv+^WONJ-hsqu27Zw&aa05NV`Fv;A)_aU0$oksa z+8P=zad6D6wM#`Nbipc&&}fd`HF$!dp`l!ZvLCLjT3TAPw6s`?^XJb$J57Ze92y!Q zA2-JAuZM($&|#Lc^4|>zK3g^0@Y&s5D%oV*U_6gB+uK?RzjT*D%!wQMp}N{A`&?1S z>}L`Z5@BIsY{eXuxzc)5EhDg;^;nG?Q|eE!V$ z)(_O&fvbPv5ET$`*m-5@2+S(qD=+a&n6`h!#E>O8IC2tn#y>HU~ zPU7)ZM<^z$s;cv?rggrQk3RTOUoLi;+1p-wtegq4yg)tG79SfL+S$?3QNLd4gwxyT z+1hfczw)T}Q&Q`gKRh8f4-W}aTU#4a^WrX9{?p0kjd#44jU89(H6=cY_pVO1=-=6h zcOEujQB+obNI%uWTVsYXEJTNf@vWN9oH$MA5ET~@9o-Zp;I{E-`{wrUPz09_{VTNv z`Rfo^*DTr!bxC-N6Ydo}%&Qr$a1QoJoePhFiWHC*Fa9jdBq}|f19sg>9?FTKfk8}6 z4E?L?cE7Pf$}KfL^$%8Nf2IxSJ2~YF3JADPM(EId6A%*G-=0qBn?~D?sF^!4EgEww z%SDJVIvU4sbi2>brsvZzRd+zXKT!ot1=)zcx7*edPitlVk_30FZevz^In9TOT3S=5hi6^`+B~>E=vE7j*4fzwV+nycp2`WCco7tXR7O~1I?+4In z6sy0IAWxsYYPM-V`G&^C=S2iflDkB%am_n5j<3Q^0mam^jeKX^s7m0hd5tRX)8D=n zo);UPmBqE26%j#;tZQsUPq)Q?3u1CR+~4dg!+Luc9UTXqO{mq~=DNCxm*kRLe}1Y= zV#e;i6OZ<2a~|>dMz+0B&_1EWkM6jD^3~-&SZ(2jgzm|$-touD+Sn{@(8UdLksxo} zxDi0dvon{K+YorJmh7DHBl_f7kF?r8{!E;4=AATZ+4SbDpHne5hS*GQZ%$r8q9kH{ zb@v*#)d>*N;t|8_Z3=Fi^&*avvhJF`iNr= z;)XuRu&Uj<^`*>yTF<6pm23CfwQJ|RUq4+OEK|=Ytdf0VW%WR65q`+U#brtabvz#< z5K#X+O(j8q^DMHK4~kFZQkVaoyLX{BXD_^4SuJ;j3H=q(wB42dLaiWpZsd1_1u#L>l$?2g_ zp{E!?fQM)*joed+%QTw{O&_Aja#gH3=Voz9K!}a4t>-3DP;f@7Jz|-v&0FX;4=+mDT*ma6daO2GUKK!RfBF-rJV_cR&yF*!x~Hdi!}ZS$bk9Ha0cRKbzIb_g!DkAJh+x)QMPNq` zLfPbg>E+}Q<$U~Th6!P5%YQ}A!aSlF%Oahjd~j<9sv0p84)Y<#+*q57D+>?+K#!iG zArD-CQDr>-NV&MU{J{-Ga!8nGB`4Q1Q%bu2L3bqH zVrFJO-1;UJ7Z*oGMOD4^`*c0QzHrrgxBddTtE($NKmS5IJW$2SO(v~}X^RJ4!w#BF z9Wi>jK~!^Bz4dqn9ZRhW2@dzBrJNTB@9FApeIa6TC>_7jv$L>M!?FpZVO`#rU{zh(5?mPe26zJ%+y?e@arNDZ%zUDx#+H}Wz5R47Fy zrR3z~_PFb8;Y~rz63w1`De@8P+%+Cv6b~LgoSL8CZRX15coyy-5K!SbPv<6ig^$m6 zxbhjmD|sa)*nLSi%dFtw;PTTc+N0gQ0l!F)Jj&$G-?WlFJw4yOdj~7qg-8{7++RmG z_WT&ZgpSt2K*`en=7>eE;ZuA2^CC|M$))x>rm{~rm#`FFN-1r1F5Ra_9qf)AHZ(N6 zlk_MrE8AWig0?ig4+$Lj`nA--mgzRqCKh_%?m!hvIG<3jnQ2kgTC-2=YvoZ0Z;K zXe+B5P7CzA1%PhTEV9deeSL+jy9WVyw8e`pJdRu#S;B?@UW5W!0(+1WX{4y2U@|g9 z!}~|;gZr+UwffxZ>MD=}&1cV^xw`JaHe&$sL5HIy~5{S*>`<#>(pM;ZY&r;Yg5cR25To69do#mrd9jhPlCT z_H0i_$4z1qa&ikFgHqcUubJrR8mg~Dj209Z7gO7Jj(*Txr6#<7{rbYj9#p*Ba&j0T z2Ei;+p5w1YdgUVAn^=_WMz-5A2hzkq_ar4H83vs-qvOkWb=-a;<6Udj=DRGH=HL6? z9=Rw=EQjUnD|fWMdGqFcO(j72ULJf;fGj2@C1p4adLJxxP+D2(4tY;R&iuWp35mtN zdIfpz>f*AsyK7wG^cX70+qZ9dtN#1|qVkse-s;}Ay^c-~fS63l(|Nj;kNWZ<4#Yin z90p76pjq{Fb^@Y5y=(a$Dz)aJC$*AN3!tlHxnONg&8_WiSvfg37Z*W6L7;daQc@^U zuIqEOR8&8PXK>lmZ6v2oHGlu^zOiuc{{7Lgi%R&6a@%~eO=Ju^;^^qevuLRnx%&C+ zRRi6Ehos04<>fn2VOI-OvxBVxaDSC7@P=a8%*(`%HK=keTK{=FkiK(gUge&Vkr5zX z5u0Ig*FPM{x}QJo8$*x_(sXom3*;3}xCc@J;c4p5`_@+KtK=P54NCb;8_tlElZVRx zX}X+1fnuj>sySHab#vSO`t>XHh60uO;B|u* z9~~{NqSE`{AYZCzy1#$_SY94uiP^QZlQ2oUT+f^cT^3+$nZ2BywFU3Vw=9Q6iKPts z_sO@;kdjV1Gv*l>7#wVklW$!AD`+`)BRPMnO_HWj=PJiqSFhu!|3*S%$!c2J`XxbC zuDYFosP}+<6A}^vp?&7&#tWwd*|xr46aNs6jtUK>WMq8w_%ZJH@71YT8>1>$Ezjcn zKqDby)}~t5Ha37aZLF^9Rl3+ID=S}?bh;)eh%a$LOk&VzcQ$a==H^14ds~kOiVe#h z6o#b!d~a=q%yk8V3stJ3qT)OQ!^V7%&7YZ02yk9bPW7jvjaK#&&Ou2@CeU^OGZP#? z4sVK&i$h6EUlR}r3lHzp-aXh|qIG+3uSvp97x4JeBd?b)p>wVEStK~x1zCkA&^%fx z@b<0;1P{#)kC7J_@%YBNCnpc%+11^>*jFI8eh+P>4vop!eZ@OGJRD?!J;picFXT)& zXlQ6ACML}8-@k8dEe4VT;0h;b8qH~!=mJ#YL@BAMO>J!27sYgP3_>xta{g-AI|nK5 zH{xAt)h4?v?ORJyzc`cRQ1TD089zcG(w8?js_mzPGBPZ6+B7!y7F&gPUTc`nQ9}+t=GxHrp zBRJ(>$2(&9Wiv7|&Ye5=_lt3W)OMF@(&%sc%3-k~B-EEa8dkh@f+b#9Sy^!)AYSnW zRq!U+|3noebnW6mAR;ebytoe^WAz%U=Gy!Btbl-u8mI#5)zs96hlj0RrM!#xfO%nm5l^x~#m< z$nbMIWrX?HGH=q6sjV!`zyKn1BB5;js^Fvj2(;$v+$0aZ*S~=;+k`e&~tG$?T)E z_)iag0S!`JzwQ3cdSzwh+?*8?Q@rQ?&UG=d-R`OyXFR^jg5 z_07%Tpdd;2Ek0Zz0+IMw)Ip~7+1gZ8R1_cw4zj}H;*CFl;`mKpy?j{<>Jb|on`J!# zVpQOj34k0P9v(}gF%~i=N;(=E!jmV9H_@O}01zc_IEEMv2f=A{^ge8bpR^qI;NXDD zkNw6CJ!9jVdTD{^1>nW-Gfl5!4kdtZq-#Us-E5YT$e!f9Z3Uj zIv*?+_#xo)md@tc2e@MY|%ei5SFS6Wt{_?)D>3kY+XoIG&2SFgTp zGIMfr+Su5DgE_qFa{@6+VQ;?%xb&y;7o|Z?6iQw}!LO{W z48*?JSbYTr1wB2zd-wX5$7<8=M8DsW0sblqRepmRuc3mBEJ#U*c+Pc_l)+(f@cPkS z$m;6r?`{m(D6xkDu;1F*IoMlk2ha`i2H3B)wG~vj8=iZmP<1)OK}3YhYN@lXPNp^G zWMad>K&%rX;_>ICfyZ0b?}Ph{vVD0 zb3#*%p=|Hp2>=Z44>&!<3g^Yi>F;!k)ZWn%7rl>y<6V!`eZglpKlJ2vct;?`v(XGzvA<8r#DZ>hd8cC&-CVnIfPb!T|a~u-%Md5s)X?Qs~37u!nnJ z+u%s4P`87bJ?4Jl`LqV9yfH|YRaFu=8pI$K9i6bJ1cLq3r=WK#i4iZ;`aDVZA%m2srK9_ye9XYa%nTbVLxRL_a7G4vxQ>QK zcvu(;Iud@&Rd~zDi1~n4VLFlc1qS9ocD$rWcBo%GJg=c84#Pa`kOpQTZ{PkcoHG!G!uLNTwtHw!gCu9| z;v$OgAi=j^U>qDAmLv2KJiYz>4fXY%knp0c6X5_nfI5r{&)tm`hG6JazBK|lVJSC? zg`)H}G7{g0oG3=Q7%5j_AHEk^_n^}f+nbu2dV8asPVE3GgUd24aj7@YluP?#V!W3m z6k<+J^ic;*Xf%WRbzAHNq6Gftc$ku+-Q3m&yZu)m`z!?oSV}4ZKFI&*LZ=~eV9a!4 zm$&tnAqQ$S;mw;jK({;KsQ^`MEc8jkM=d20Z<~Q=4U!uKl5GGWy^0Dk{0@{_y-^`! z7MB-0j+iEd2t9EE){{_H_6(vM-_jYOA){a3dU-Nl%sB}9BLJ~w6&IJ%;9znb%^!fl zKZ5`Q*vd3sMk0}=dSMg-*4^BIFCgY%BwpUlzMhNu8zvXn!NGJ;qS7c60IbMp{}cYk4<}(!*+A%2& zFV=qn35}OQPYewW1&CkxQnlD|UK_sJ1PEv$n=K0DLuKVQ04XH z`vL<>lai7WYzr?)t1xZCr$cSMfIHRs^YfFFviN8UJa?_($B!_lQ=|Me$b|2)BEir% z+RpLahe}I;kI=3zA#w3I{29w7f0hE-cuSGzIUP`%@!!Aku?g|qgc~T45Er*Szn*$G z7DhnuHX8^rSmjr!AT2E|P{~#Bc^yQ&4ZU}&zsMS%bsG4=qepkdPIy3#fD3*EbKX2! zE^UZXmRdeg*6{~$HkcSMnMX##s4F`;`Dd=N6wE87q@?0y%f%W zMp{g^LK)_(z?GPz)E+;6?CE*nOUdSX-{|)3+t9~%c6KEAa+yD8v%ZmMhmjR_g9PX|du{qRsECnc7&DU>cz)t%$z4pB~bb#{~7_&wo=;!fX zfYR31@8kK^8&1I$Znv=^&WD$Ci;K0buXazWQYx~Cfk?Wyzk~rnZ*yhEM90qDd=j#S zol3#Mp-`UPKQQnE6ZMReffTaf9 z1UWc3U|>NsZrl0gC6QeX&CS!GxxxC6x<@)OpskBk3Z|x}^FC$*eK4@x+uwJSq(vam zB4i$dC)KgbiH!$E1ZvyBE6E?_)u9!B!#MQft6&uVv+}snhn_*Drb#!!K13vRW z_yn_T)=3Z~W|wMVxdGjZ99^hJ;G%RaED3ROAG>K785yBqbPp$k&L_mjH)Exk2vw%B zzrVk(4hyZjyMN)}oXgwI?Mkl>t&r*m}9Xv7jXsDk~4mLOo`bK9i$B&rd{ZIH~P zA~`fLWF-gItw(NyMqj}8_Vwk}fP$SaXKEJ+&0hC=L}Vaq^qua(L45dwas;X3rOVxb zVSAA?+FX(O`gQBC42@0P!1UA<9RmX=m0#}|&>aboI1e@~Qc_d<2L_H733w31!VmGs zT>`me({poc;4VO5_&p(K7Vj;x)`7_vF%m{dcoGf>!jfo$5bOi}lnBvpAbfRngy1uu zY)Dmw7$)&8pxuCAgk-Mur@W(kM=AGP=85zEA%rH(R+S6w9UZ-*k=j9qg2@E~(hSb1@FimT{8=f66RJ7TWC{!4K%0b_J6zBv zMRR&H@v4KTor4mrLS*oW0PyXxmNA6@&JG9p{1K$AvG^RJ-k; z&}rx%sIV?O!G(g>M+KJSC+M|Pm8gc@A7t;ZM--9H*Q7BW7bKS@-W#8okP-6|03gf@ zCV;#?!)o_3qN(3wW8kFeCAfBc<{7w%NMY8+WhEe#|LYy^i*RjmC(0gBnf#n6o%pe#F)Yr#?=KKb}~Dhg^`DAJnfz22dbe2t|Go z{0H-qs2uSg^}iJe1e$~fiT)0QBqc>f*M~+>f#H(iO9oyI5REyC64BwsO87b&=KERo z)C3a!*9E85XwRMBb5&QT!d*agyjH~~@&m=pI`P4n1zxo{y#Cb31kUmKqIZBfh#vnJ zEmHhA#N$%WeOCw^N5>+dAOM!*;^X)C_Rv1yCc^{3r~U@^CVgdC&wT=!w80_Ci{AW@(8xR37|P`cmxS zO<+oySXvrc%YaR*u$xKl1SWdo_>WY)YZTcV+3cmK|&=|QC5Ddm;yz# zzP?@{`a3KaLh9Eq&Foo&atBMu8JvWkt}fct^ylO!SOO{3Ybft&%JJnMyTw4C(dcwo z>s}IAOWuL<1p_Y~^BW*B@9%EfEU5t|Gc+_Ltvi80901V*A^%SNjrHaTu7zBf8!4)& zINRFZ$5es63zP;eZWIgtO4wlDAM;@;e@6#2k@H#jc@&p=CR(7@o5Ma=QMxhnTG~ zAM5Uq896zrQJ~8eo`*gTVxC+uvpM~3Nl2^V!NI+%&Ee#KUj5>A0*)Q%JfNlA?CgtJ z`t#>6U%co6vwu)dVGO{4dk&A{4UYnfPhXk61=P=Z5U5}flTQG1TxS?kK~whF-ROJ` zC$8rwU7|vP8ur*6f(ktitPW~*DEXOFr^+#ho}dg@xovVhB!D6camtSMm0=YVtDqxr zbZ`Ji00b62XDBQy03t&Tfq4GT=l`|2Feb_glu;gMw&~evV~NCgR5(CC62Vil>E|XV zCjlyjX>z789lPmfP_1Xrp9M_fE>(am9zyx662!#Dg4C=a=6z{)X68<`fHy$l=kK1g z5_e?VOF)`qU65}_*oE?8*bcrEYy3>y(p(7|!0gB}e9hgQm#V^vT zSQ2%zM=MzDJo-V{f(<4@i=UA#CTRP4bQ@_$SJzOUDG`n)=1pAOpkE&Ss|=6ZR%Zm6 zeHdo#ztZzTkGZ*tqV#G2Z-o0EXFpQ#@x~(qkzWcYPo6Z3BR@BR67!wg2&2YH)kPVC2$y zuU%W~&emUQ^C%&j>MF4@c9a9xDX5@}L3}iKiG}Be^xdu!QSb+jE}mt^+uJ6<+gSKA zy|umF25dNB3j4rB_*{BpX$14Tj>Jy}B}VL^?(Qy*G=nK*;qg)55DUUBpVP$6qhDS^ zcl*VVl9#svoer{2&6+z@9+bT@r1YzFAv!cj;>+zYoCctcZx%#J3jp`9AvOCr8))@E zz@a)n_e+fBN_Z0(H~y@zcQGh|?XR;_En7`=5fXWK0|$*enF)(2)y4MY8n?H!z=W;4 zvlHw`2?YfO8 wcO5B9-e|H1t#rDL$qM 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