.. cyvcf2 documentation master file, created by
sphinx-quickstart on Mon Nov 14 08:40:54 2016.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
cyvcf2
======
cyvcf2 is a fast VCF parser for python (2 and 3) released under the MIT license.
It is a `cython` wrapper for `htslib `_ developed in
the `Quinlan lab `_.
See the :ref:`api` for detailed documentation, but the most common usage is summarized in the snippet below:
.. code-block:: python
from cyvcf2 import VCF
for variant in VCF('some.vcf.gz'): # or VCF('some.bcf')
variant.REF, variant.ALT # e.g. REF='A', ALT=['C', 'T']
variant.CHROM, variant.start, variant.end, variant.ID, \
variant.FILTER, variant.QUAL
# numpy arrays of specific things we pull from the sample fields.
# gt_types is array of 0,1,2,3==HOM_REF, HET, UNKNOWN, HOM_ALT
variant.gt_types, variant.gt_ref_depths, variant.gt_alt_depths # numpy arrays
variant.gt_phases, variant.gt_quals, variant.gt_bases # numpy array
## INFO Field.
## extract from the info field by it's name:
variant.INFO.get('DP') # int
variant.INFO.get('FS') # float
variant.INFO.get('AC') # float
# convert back to a string.
str(variant)
## per-sample info...
# Get a numpy array of the depth per sample:
dp = variant.format('DP')
# or of any other format field:
sb = variant.format('SB')
assert sb.shape == (n_samples, 4) # 4-values per
# to do a region-query:
vcf = VCF('some.vcf.gz')
for v in vcf('11:435345-556565'):
if v.INFO["AF"] > 0.1: continue
print(str(v))
# single sample of 0|1 in vcf becomes [[0, 1, True]]
# 2 samples of 0/0 and 1|1 would be [[0, 0, False], [1, 1, True]]
print v.genotypes
Modifying Existing Records
==========================
.. this example is also in the writing.rst page
`cyvcf2` is optimized for fast reading and extraction from existing files.
However, it also offers some means of modifying existing VCFs. Here, we
show an example of how to modify the INFO field at a locus to annotate
variants with the genes that they overlap.
.. code-block:: python
from cyvcf2 import VCF, Writer
vcf = VCF(VCF_PATH)
# adjust the header to contain the new field
# the keys 'ID', 'Description', 'Type', and 'Number' are required.
vcf.add_info_to_header({'ID': 'gene', 'Description': 'overlapping gene',
'Type':'Character', 'Number': '1'})
# create a new vcf Writer using the input vcf as a template.
fname = "out.vcf"
w = Writer(fname, vcf)
for v in vcf:
# The get_gene_intersections function is not shown.
# This could be any operation to find intersections
# or any manipulation required by the user.
genes = get_gene_intersections(v)
if genes is not None:
v.INFO["gene"] = ",".join(genes)
w.write_record(v)
w.close(); vcf.close()
More info on writing vcfs can be found :doc:`here `
Setting Genotyping Strictness
=============================
By default, genotypes containing a single missing allele (e.g. genotypes such
as ``0/.``, ``./0``, ``1/.``, or ``./1``) are classified as heterozygous ("HET"
or id: 1) instead of "UNKNOWN" (or id: 2). A case can be made for either
classification on these partially missing genotypes depending on the situation.
A better way to explicitly control the genotype classification for these cases,
is to use the "strict genotype", or ``strict_gt``, feature. Here's an example
usage:
.. code-block:: python
from cyvcf2 import VCF
vcf = VCF("/path/to/vcf/file", strict_gt=True)
for variant in vcf:
# do something
When the ``strict_gt`` flag is enabled, `cyvcf2` will treat any genotype
containing a missing allele (containing a '.') as an UNKNOWN genotype;
otherwise, genotypes like ``0/.``, ``./0``, ``1/.``, or ``./1`` will be
classified as heterozygous ("HET").
The "strict genotype" feature is not enabled by default (i.e. ``strict_gt`` is
set to `False` by default) to preserve backwards compatibility.
Installation
============
.. code-block:: bash
pip install cyvcf2
or via bioconda.
Testing
=======
Install `pytest`, then tests can be run with:
.. code-block:: bash
pytest
Known Limitations
=================
* `cyvcf2` currently does not support reading VCFs encoded with UTF-8 with non-ASCII characters in the contents of string-typed FORMAT fields.
For limitations on writing VCFs, see :ref:`here `
See Also
========
Pysam also `has a cython wrapper to htslib `_ and one block of code here is taken directly from that library. But, the optimizations that we want for gemini are very specific so we have chosen to create a separate project.
.. toctree::
:maxdepth: 1
docstrings
writing