From dfbdfcc48f0bb0aa50ac929cfef8770a228fd85c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 16:34:45 +0000 Subject: [PATCH 1/3] Initial plan From dc6f4e31c1afb6bc49c3bf5461d163b455dba8ab Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 16:44:24 +0000 Subject: [PATCH 2/3] Port vcfaz to Python 3 and remove legacy py27 directory Co-authored-by: ecapriotti <5848298+ecapriotti@users.noreply.github.com> --- pyvcfaz-0.6.8-py27_0/bin/vcf_filter.py | 168 -- pyvcfaz-0.6.8-py27_0/bin/vcf_melt | 48 - pyvcfaz-0.6.8-py27_0/bin/vcf_sample_filter.py | 39 - pyvcfaz-0.6.8-py27_0/info/files | 28 - pyvcfaz-0.6.8-py27_0/info/has_prefix | 3 - pyvcfaz-0.6.8-py27_0/info/index.json | 13 - pyvcfaz-0.6.8-py27_0/info/recipe.json | 47 - pyvcfaz-0.6.8-py27_0/info/recipe/build.sh | 2 - pyvcfaz-0.6.8-py27_0/info/recipe/meta.yaml | 27 - .../PyVCF_az-0.6.8-py2.7.egg-info/PKG-INFO | 27 - .../PyVCF_az-0.6.8-py2.7.egg-info/SOURCES.txt | 23 - .../dependency_links.txt | 1 - .../entry_points.txt | 8 - .../requires.txt | 1 - .../top_level.txt | 1 - .../python2.7/site-packages/vcfaz/__init__.py | 15 - .../site-packages/vcfaz/__init__.pyc | Bin 677 -> 0 bytes .../python2.7/site-packages/vcfaz/cparse.pyx | 84 - .../python2.7/site-packages/vcfaz/filters.pyc | Bin 10050 -> 0 bytes .../python2.7/site-packages/vcfaz/model.pyc | Bin 28804 -> 0 bytes .../python2.7/site-packages/vcfaz/parser.pyc | Bin 25670 -> 0 bytes .../site-packages/vcfaz/sample_filter.pyc | Bin 4806 -> 0 bytes .../site-packages/vcfaz/test/__init__.py | 0 .../site-packages/vcfaz/test/__init__.pyc | Bin 157 -> 0 bytes .../site-packages/vcfaz/test/prof.py | 33 - .../site-packages/vcfaz/test/prof.pyc | Bin 1131 -> 0 bytes .../site-packages/vcfaz/test/test_vcf.py | 1594 ----------------- .../site-packages/vcfaz/test/test_vcf.pyc | Bin 60611 -> 0 bytes .../python2.7/site-packages/vcfaz/utils.pyc | Bin 3677 -> 0 bytes src/vcfaz/__init__.py | 16 +- .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 582 bytes src/vcfaz/__pycache__/filters.cpython-312.pyc | Bin 0 -> 10460 bytes src/vcfaz/__pycache__/model.cpython-312.pyc | Bin 0 -> 32779 bytes src/vcfaz/__pycache__/parser.cpython-312.pyc | Bin 0 -> 36469 bytes .../__pycache__/sample_filter.cpython-312.pyc | Bin 0 -> 6302 bytes .../site-packages => src}/vcfaz/filters.py | 0 .../site-packages => src}/vcfaz/model.py | 16 +- .../site-packages => src}/vcfaz/parser.py | 64 +- .../vcfaz/sample_filter.py | 4 +- .../site-packages => src}/vcfaz/utils.py | 2 +- .../test_import.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 12777 bytes tests/test_import.py | 75 + 42 files changed, 119 insertions(+), 2220 deletions(-) delete mode 100755 pyvcfaz-0.6.8-py27_0/bin/vcf_filter.py delete mode 100755 pyvcfaz-0.6.8-py27_0/bin/vcf_melt delete mode 100755 pyvcfaz-0.6.8-py27_0/bin/vcf_sample_filter.py delete mode 100644 pyvcfaz-0.6.8-py27_0/info/files delete mode 100644 pyvcfaz-0.6.8-py27_0/info/has_prefix delete mode 100644 pyvcfaz-0.6.8-py27_0/info/index.json delete mode 100644 pyvcfaz-0.6.8-py27_0/info/recipe.json delete mode 100644 pyvcfaz-0.6.8-py27_0/info/recipe/build.sh delete mode 100644 pyvcfaz-0.6.8-py27_0/info/recipe/meta.yaml delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/PKG-INFO delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/SOURCES.txt delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/dependency_links.txt delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/entry_points.txt delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/requires.txt delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/top_level.txt delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/__init__.py delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/__init__.pyc delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/cparse.pyx delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/filters.pyc delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/model.pyc delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/parser.pyc delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/sample_filter.pyc delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/__init__.py delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/__init__.pyc delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/prof.py delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/prof.pyc delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/test_vcf.py delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/test_vcf.pyc delete mode 100644 pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/utils.pyc create mode 100644 src/vcfaz/__pycache__/__init__.cpython-312.pyc create mode 100644 src/vcfaz/__pycache__/filters.cpython-312.pyc create mode 100644 src/vcfaz/__pycache__/model.cpython-312.pyc create mode 100644 src/vcfaz/__pycache__/parser.cpython-312.pyc create mode 100644 src/vcfaz/__pycache__/sample_filter.cpython-312.pyc rename {pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages => src}/vcfaz/filters.py (100%) rename {pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages => src}/vcfaz/model.py (98%) rename {pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages => src}/vcfaz/parser.py (94%) rename {pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages => src}/vcfaz/sample_filter.py (97%) rename {pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages => src}/vcfaz/utils.py (98%) create mode 100644 tests/__pycache__/test_import.cpython-312-pytest-9.0.2.pyc create mode 100644 tests/test_import.py diff --git a/pyvcfaz-0.6.8-py27_0/bin/vcf_filter.py b/pyvcfaz-0.6.8-py27_0/bin/vcf_filter.py deleted file mode 100755 index 2816588..0000000 --- a/pyvcfaz-0.6.8-py27_0/bin/vcf_filter.py +++ /dev/null @@ -1,168 +0,0 @@ -#!/opt/anaconda1anaconda2anaconda3/bin/python -import sys -import argparse -import pkg_resources - -import vcf -from vcf.parser import _Filter - -def create_filt_parser(name): - parser = argparse.ArgumentParser(description='Parser for %s' % name, - add_help=False - ) - parser.add_argument('rest', nargs=argparse.REMAINDER, help=argparse.SUPPRESS) - - return parser - -def create_core_parser(): - # we have to use custom formatted usage, because of the - # multi-stage argument parsing (otherwise the filter arguments - # are grouped together with the other optionals) - parser = argparse.ArgumentParser(description='Filter a VCF file', - add_help=False, - formatter_class=argparse.ArgumentDefaultsHelpFormatter, - usage="""%(prog)s [-h] [--no-short-circuit] [--no-filtered] - [--output OUTPUT] [--local-script LOCAL_SCRIPT] - input filter [filter_args] [filter [filter_args]] ... - """ - ) - parser.add_argument('-h', '--help', action='store_true', - help='Show this help message and exit.') - parser.add_argument('input', metavar='input', type=argparse.FileType('rb'), nargs='?', default=None, - help='File to process (use - for STDIN)') -# parser.add_argument('filters', metavar='filter', type=str, nargs='*', default=None, -# help='Filters to use') - parser.add_argument('--no-short-circuit', action='store_true', - help='Do not stop filter processing on a site if any filter is triggered') - parser.add_argument('--output', action='store', default=sys.stdout, - help='Filename to output [STDOUT]') - parser.add_argument('--no-filtered', action='store_true', - help='Output only sites passing the filters') - parser.add_argument('--local-script', action='store', default=None, - help='Python file in current working directory with the filter classes') - parser.add_argument('rest', nargs=argparse.REMAINDER, help=argparse.SUPPRESS) - - return parser - -# argument parsing strategy -# loading a script given at the command line poses a difficulty -# for using the argparse in a simple way -- the command line arguments -# are not completely known the first time command line is parsed -# requirements: -# - display all filters with options grouped by the filters in help screen -# - check if only arguments for currently used filters are given -# - to increase legibility when using more filters, arguments should -# follow the filter name -# - it is good to specify the filters explicitly by name, -# because the order of filtering can matter -# solution -# - change the command syntax to -# vcf_filter.py --core-options input filter1 --filter1-args filter2 filter3 -# - parse the core program options with parse_known_args -# - use add_argument_group for filters (subparsers won't work, they require -# the second command in argv[1]) -# - create all-filters parser when displaying the help -# - parse the arguments incrementally on argparse.REMAINDER of the previous - - # TODO: allow filter specification by short name - # TODO: flag that writes filter output into INFO column - # TODO: argument use implies filter use - # TODO: parallelize - # TODO: prevent plugins raising an exception from crashing the script - -def main(): - # dynamically build the list of available filters - filters = {} - - # parse command line args - # (mainly because of local_script) - parser = create_core_parser() - (args, unknown_args) = parser.parse_known_args() - - # add filter to dictionary, extend help message - # with help/arguments of each filter - def addfilt(filt): - filters[filt.name] = filt - arg_group = parser.add_argument_group(filt.name, filt.__doc__) - filt.customize_parser(arg_group) - - # look for global extensions - for p in pkg_resources.iter_entry_points('vcf.filters'): - filt = p.load() - addfilt(filt) - - # add all classes from local script, if present - if args.local_script != None: - import inspect - import os - sys.path.insert(0, os.getcwd()) - module_name = args.local_script.replace('.py', '') - mod = __import__(module_name) - classes = inspect.getmembers(mod, inspect.isclass) - for name, cls in classes: - addfilt(cls) - - # go through the filters on the command line - # one by one, trying to consume only the declared arguments - used_filters = [] - while len(args.rest): - filter_name = args.rest.pop(0) - if filter_name not in filters: - sys.exit("%s is not a known filter (%s)" % (filter_name, str(filters.keys()))) - - # create a parser only for arguments of current filter - filt_parser = create_filt_parser(filter_name) - filters[filter_name].customize_parser(filt_parser) - (known_filt_args, unknown_filt_args) = filt_parser.parse_known_args(args.rest) - if len(unknown_filt_args): - sys.exit("%s has no arguments like %s" % (filter_name, unknown_filt_args)) - - used_filters.append((filter_name, known_filt_args)) - args.rest = known_filt_args.rest - - # print help using the 'help' parser, so it includes - # all possible filters and arguments - if args.help or len(used_filters) == 0 or args.input == None: - parser.print_help() - parser.exit() - - inp = vcf.Reader(args.input) - - # build filter chain - chain = [] - for (name, filter_args) in used_filters: - f = filters[name](filter_args) - chain.append(f) - # add a filter record to the output - short_doc = f.__doc__ or '' - short_doc = short_doc.split('\n')[0].lstrip() - inp.filters[f.filter_name()] = _Filter(f.filter_name(), short_doc) - - # output must be created after all the filter records have been added - output = vcf.Writer(args.output, inp) - - # apply filters - short_circuit = not args.no_short_circuit - drop_filtered = args.no_filtered - - for record in inp: - output_record = True - for filt in chain: - result = filt(record) - if result == None: continue - - # save some work by skipping the rest of the code - if drop_filtered: - output_record = False - break - - record.add_filter(filt.filter_name()) - if short_circuit: break - - if output_record: - # use PASS only if other filter names appear in the FILTER column - #FIXME: is this good idea? - if record.FILTER is None and not drop_filtered: record.FILTER = 'PASS' - output.write_record(record) - -if __name__ == '__main__': main() diff --git a/pyvcfaz-0.6.8-py27_0/bin/vcf_melt b/pyvcfaz-0.6.8-py27_0/bin/vcf_melt deleted file mode 100755 index 7d6d585..0000000 --- a/pyvcfaz-0.6.8-py27_0/bin/vcf_melt +++ /dev/null @@ -1,48 +0,0 @@ -#!/opt/anaconda1anaconda2anaconda3/bin/python -""" Melt a VCF file into a tab delimited set of calls, one per line - -VCF files have all the calls from different samples on one line. This -script reads vcf on stdin and writes all calls to stdout in tab delimited -format with one call in one sample per line. This makes it easy to find -a given sample's genotype with, say, grep. -""" - -import sys -import csv -import vcf - -out = csv.writer(sys.stdout, delimiter='\t') -if len(sys.argv) > 1: - inp = file(sys.argv[1]) -else: - inp = sys.stdin -reader = vcf.VCFReader(inp) - -formats = reader.formats.keys() -infos = reader.infos.keys() - -header = ["SAMPLE"] + formats + ['FILTER', 'CHROM', 'POS', 'REF', 'ALT', 'ID'] \ - + ['info.' + x for x in infos] - - -out.writerow(header) - - -def flatten(x): - if type(x) == type([]): - x = ','.join(map(str, x)) - return x - -for record in reader: - info_row = [flatten(record.INFO.get(x, None)) for x in infos] - fixed = [record.CHROM, record.POS, record.REF, record.ALT, record.ID] - - for sample in record.samples: - row = [sample.sample] - # Format fields not present will simply end up "blank" - # in the output - row += [flatten(getattr(sample.data, x, None)) for x in formats] - row += [record.FILTER or '.'] - row += fixed - row += info_row - out.writerow(row) diff --git a/pyvcfaz-0.6.8-py27_0/bin/vcf_sample_filter.py b/pyvcfaz-0.6.8-py27_0/bin/vcf_sample_filter.py deleted file mode 100755 index d80f357..0000000 --- a/pyvcfaz-0.6.8-py27_0/bin/vcf_sample_filter.py +++ /dev/null @@ -1,39 +0,0 @@ -#!/opt/anaconda1anaconda2anaconda3/bin/python - -# Author: Lenna X. Peterson -# github.com/lennax -# arklenna at gmail dot com - -import argparse -import logging - -from vcf import SampleFilter - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("file", help="VCF file to filter") - parser.add_argument("-o", metavar="outfile", - help="File to write out filtered samples") - parser.add_argument("-f", metavar="filters", - help="Comma-separated list of sample indices or names \ - to filter") - parser.add_argument("-i", "--invert", action="store_true", - help="Keep rather than discard the filtered samples") - parser.add_argument("-q", "--quiet", action="store_true", - help="Less output") - - args = parser.parse_args() - - if args.quiet: - log_level = logging.WARNING - else: - log_level = logging.INFO - logging.basicConfig(format='%(message)s', level=log_level) - - sf = SampleFilter(infile=args.file, outfile=args.o, - filters=args.f, invert=args.invert) - if args.f is None: - print "Samples:" - for idx, val in enumerate(sf.samples): - print "{0}: {1}".format(idx, val) diff --git a/pyvcfaz-0.6.8-py27_0/info/files b/pyvcfaz-0.6.8-py27_0/info/files deleted file mode 100644 index 6182c16..0000000 --- a/pyvcfaz-0.6.8-py27_0/info/files +++ /dev/null @@ -1,28 +0,0 @@ -bin/vcf_filter.py -bin/vcf_melt -bin/vcf_sample_filter.py -lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/PKG-INFO -lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/SOURCES.txt -lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/dependency_links.txt -lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/entry_points.txt -lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/requires.txt -lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/top_level.txt -lib/python2.7/site-packages/vcfaz/__init__.py -lib/python2.7/site-packages/vcfaz/__init__.pyc -lib/python2.7/site-packages/vcfaz/cparse.pyx -lib/python2.7/site-packages/vcfaz/filters.py -lib/python2.7/site-packages/vcfaz/filters.pyc -lib/python2.7/site-packages/vcfaz/model.py -lib/python2.7/site-packages/vcfaz/model.pyc -lib/python2.7/site-packages/vcfaz/parser.py -lib/python2.7/site-packages/vcfaz/parser.pyc -lib/python2.7/site-packages/vcfaz/sample_filter.py -lib/python2.7/site-packages/vcfaz/sample_filter.pyc -lib/python2.7/site-packages/vcfaz/test/__init__.py -lib/python2.7/site-packages/vcfaz/test/__init__.pyc -lib/python2.7/site-packages/vcfaz/test/prof.py -lib/python2.7/site-packages/vcfaz/test/prof.pyc -lib/python2.7/site-packages/vcfaz/test/test_vcf.py -lib/python2.7/site-packages/vcfaz/test/test_vcf.pyc -lib/python2.7/site-packages/vcfaz/utils.py -lib/python2.7/site-packages/vcfaz/utils.pyc diff --git a/pyvcfaz-0.6.8-py27_0/info/has_prefix b/pyvcfaz-0.6.8-py27_0/info/has_prefix deleted file mode 100644 index 06f793c..0000000 --- a/pyvcfaz-0.6.8-py27_0/info/has_prefix +++ /dev/null @@ -1,3 +0,0 @@ -/opt/anaconda1anaconda2anaconda3 text bin/vcf_filter.py -/opt/anaconda1anaconda2anaconda3 text bin/vcf_melt -/opt/anaconda1anaconda2anaconda3 text bin/vcf_sample_filter.py diff --git a/pyvcfaz-0.6.8-py27_0/info/index.json b/pyvcfaz-0.6.8-py27_0/info/index.json deleted file mode 100644 index d6554de..0000000 --- a/pyvcfaz-0.6.8-py27_0/info/index.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "arch": "x86_64", - "build": "py27_0", - "build_number": 0, - "depends": [ - "python 2.7*" - ], - "license": "MIT", - "name": "pyvcfaz", - "platform": "linux", - "subdir": "linux-64", - "version": "0.6.8" -} diff --git a/pyvcfaz-0.6.8-py27_0/info/recipe.json b/pyvcfaz-0.6.8-py27_0/info/recipe.json deleted file mode 100644 index 8471b6d..0000000 --- a/pyvcfaz-0.6.8-py27_0/info/recipe.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "about": { - "home": "https://github.com/jamescasbon/PyVCF", - "license": "BSD", - "summary": "A Variant Call Format reader for Python" - }, - "app": {}, - "build": { - "entry_points": [], - "features": [], - "number": "0", - "pin_depends": "", - "script_env": [], - "string": "", - "track_features": [] - }, - "package": { - "name": "pyvcfaz", - "version": "0.6.8" - }, - "requirements": { - "build": [ - "python", - "setuptools" - ], - "conflicts": [], - "run": [ - "python" - ] - }, - "source": { - "fn": "PyVCF_az-0.6.8.tar.gz", - "git_rev": "", - "patches": [], - "path": "", - "svn_rev": "", - }, - "test": { - "commands": [], - "files": [], - "imports": [ - "vcfaz.test", - "vcfaz" - ], - "requires": [] - } -} diff --git a/pyvcfaz-0.6.8-py27_0/info/recipe/build.sh b/pyvcfaz-0.6.8-py27_0/info/recipe/build.sh deleted file mode 100644 index 8948114..0000000 --- a/pyvcfaz-0.6.8-py27_0/info/recipe/build.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -$PYTHON setup.py install --single-version-externally-managed --record=record.txt diff --git a/pyvcfaz-0.6.8-py27_0/info/recipe/meta.yaml b/pyvcfaz-0.6.8-py27_0/info/recipe/meta.yaml deleted file mode 100644 index f1f2249..0000000 --- a/pyvcfaz-0.6.8-py27_0/info/recipe/meta.yaml +++ /dev/null @@ -1,27 +0,0 @@ -package: - name: pyvcfaz - version: '0.6.8' - -source: - fn: PyVCF_az-0.6.8.tar.gz - -build: - number: 0 - -requirements: - build: - - python - - setuptools - - run: - - python - -test: - imports: - - vcfaz.test - - vcfaz - -about: - home: https://github.com/andreazauli/PyVCF_az - license: MIT - summary: A Variant Call Format reader for Python diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/PKG-INFO b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/PKG-INFO deleted file mode 100644 index f7b1e67..0000000 --- a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/PKG-INFO +++ /dev/null @@ -1,27 +0,0 @@ -Metadata-Version: 1.1 -Name: PyVCF_az -Version: 0.6.8 -Summary: Variant Call Format (VCF) parser for Python -Home-page: https://github.com/andreazauli/PyVCF_az -Author: Andrea Zauli by fork of James Casbon and @jdoughertyii -Author-email: andrea.zauli@gmail.com -License: UNKNOWN -Description: UNKNOWN -Keywords: bioinformatics -Platform: UNKNOWN -Classifier: Development Status :: 4 - Beta -Classifier: Intended Audience :: Developers -Classifier: Intended Audience :: Science/Research -Classifier: License :: OSI Approved :: BSD License -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Cython -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 2 -Classifier: Programming Language :: Python :: 2.6 -Classifier: Programming Language :: Python :: 2.7 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.2 -Classifier: Programming Language :: Python :: 3.3 -Classifier: Programming Language :: Python :: 3.4 -Classifier: Topic :: Scientific/Engineering :: Bio-Informatics diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/SOURCES.txt b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/SOURCES.txt deleted file mode 100644 index 5e73363..0000000 --- a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/SOURCES.txt +++ /dev/null @@ -1,23 +0,0 @@ -MANIFEST.in -README.rst -setup.cfg -setup.py -PyVCF_az.egg-info/PKG-INFO -PyVCF_az.egg-info/SOURCES.txt -PyVCF_az.egg-info/dependency_links.txt -PyVCF_az.egg-info/entry_points.txt -PyVCF_az.egg-info/requires.txt -PyVCF_az.egg-info/top_level.txt -scripts/vcf_filter.py -scripts/vcf_melt -scripts/vcf_sample_filter.py -vcfaz/__init__.py -vcfaz/cparse.pyx -vcfaz/filters.py -vcfaz/model.py -vcfaz/parser.py -vcfaz/sample_filter.py -vcfaz/utils.py -vcfaz/test/__init__.py -vcfaz/test/prof.py -vcfaz/test/test_vcf.py diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/dependency_links.txt b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/entry_points.txt b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/entry_points.txt deleted file mode 100644 index ca0b63c..0000000 --- a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/entry_points.txt +++ /dev/null @@ -1,8 +0,0 @@ -[vcfaz.filters] -avg-dps = vcfaz.filters:AvgDepthPerSample -dps = vcfaz.filters:DepthPerSample -eb = vcfaz.filters:ErrorBiasFilter -site_quality = vcfaz.filters:SiteQuality -snp-only = vcfaz.filters:SnpOnly -vgq = vcfaz.filters:VariantGenotypeQuality - diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/requires.txt b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/requires.txt deleted file mode 100644 index 49fe098..0000000 --- a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/requires.txt +++ /dev/null @@ -1 +0,0 @@ -setuptools diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/top_level.txt b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/top_level.txt deleted file mode 100644 index 907d0f9..0000000 --- a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/PyVCF_az-0.6.8-py2.7.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -vcfaz diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/__init__.py b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/__init__.py deleted file mode 100644 index e1aae58..0000000 --- a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python -""" -A VCFv4.0 and 4.1 parser for Python. - -Online version of PyVCF documentation is available at http://pyvcf.rtfd.org/ -""" - - -from vcf.parser import Reader, Writer -from vcf.parser import VCFReader, VCFWriter -from vcf.filters import Base as Filter -from vcf.parser import RESERVED_INFO, RESERVED_FORMAT -from vcf.sample_filter import SampleFilter - -VERSION = '0.6.8' diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/__init__.pyc b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/__init__.pyc deleted file mode 100644 index 9de2a3b350388758b9f8b01ad338582134963650..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 677 zcmYjOO^?$s5S=7#x6QVET=wi^IFKx81qdNTfmYfBEpkzjapRzC<6zD=6o1NEW`gLx|Vp_-WhS zq}PP&lH8;(NXv~ChE$CqUmx6kqtiIvYbCWHoiJ85nlu%LFprc?aju1S+<97B!aFV% zKPf@DBlpg=Z?mj@=!z;et}4^U+-0%+gD3GTa5DrdcqvS8emBwyGlcwz*kX*1-Y5us z?gZf@w_=d5e5K7{Lyw!!>~^=^yT|`C+dciV{+9HKOAH)%-72w_3j5h964&Xg^vy1L zgr>VdU<}{Jn2XW&;}2V*=mGUrsGpxk2<{TWORAw7^@H`#8Ol>%p8A)%r=!yL-Pw>p zeY?KraYGNc`(1)Q`~$m2H{+TYjV^g6bZ0YmI!je%N}h1L{vW+eUuPDV_q^rB4}K?X lh7)CsNi7{?DT?M;bIVXR-nEV>G=f+zlle*t$8n-%~7 diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/cparse.pyx b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/cparse.pyx deleted file mode 100644 index 8a71d64..0000000 --- a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/cparse.pyx +++ /dev/null @@ -1,84 +0,0 @@ -from model import _Call - -cdef _map(func, iterable, bad='.'): - '''``map``, but make bad values None.''' - return [func(x) if x != bad else None - for x in iterable] - -INTEGER = 'Integer' -FLOAT = 'Float' -NUMERIC = 'Numeric' - -def parse_samples( - list names, list samples, samp_fmt, - list samp_fmt_types, list samp_fmt_nums, site): - - cdef char *name, *fmt, *entry_type, *sample - cdef int i, j - cdef list samp_data = [] - cdef dict sampdict - cdef list sampvals - n_samples = len(samples) - n_formats = len(samp_fmt._fields) - - for i in range(n_samples): - name = names[i] - sample = samples[i] - - # parse the data for this sample - sampdat = [None] * n_formats - - sampvals = sample.split(':') - - for j in range(n_formats): - if j >= len(sampvals): - break - vals = sampvals[j] - - # short circuit the most common - if samp_fmt._fields[j] == 'GT': - sampdat[j] = vals - continue - elif not vals or vals == '.': - sampdat[j] = None - continue - - entry_type = samp_fmt_types[j] - # TODO: entry_num is None for unbounded lists - entry_num = samp_fmt_nums[j] - - # we don't need to split single entries - if entry_num == 1 or ',' not in vals: - - if entry_type == INTEGER: - try: - sampdat[j] = int(vals) - except ValueError: - sampdat[j] = float(vals) - elif entry_type == FLOAT or entry_type == NUMERIC: - sampdat[j] = float(vals) - else: - sampdat[j] = vals - - if entry_num != 1: - sampdat[j] = (sampdat[j]) - - continue - - vals = vals.split(',') - - if entry_type == INTEGER: - try: - sampdat[j] = _map(int, vals) - except ValueError: - sampdat[j] = map(float, vals) - elif entry_type == FLOAT or entry_type == NUMERIC: - sampdat[j] = _map(float, vals) - else: - sampdat[j] = vals - - # create a call object - call = _Call(site, name, samp_fmt(*sampdat)) - samp_data.append(call) - - return samp_data diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/filters.pyc b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/filters.pyc deleted file mode 100644 index dc459ba9bbf3af9314b81bfcd32d151ab086cac8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10050 zcmd5?&2t<_74O+yNtP1DN$e<}KvzE3A1ft>5GuqW{)mDTBHJU!39f|o>`ZHS?Ae+1 z^sHh9`+{@gPI2PGg(@ywxNxB=xp3hCe*$-^I8enA`2Akb?r0^&P9}k#P=XIN=2SZlG^BQBTsxzp*-`D>xOP@W`$o0%?YsSpiSb@jB zj>0Ii2>vhCD1u9Mt^sbzBtF57FnkFNG+22FGz+tr_9=h8Im>x|fkJZ$9VUUbdLzsA zX1LMbh?BzP%Y!ZL-t6+if-ZmFL+_$D8WCloE%G?+>LSyFJll*T*X#!B$k;HC2SuEv z;~4_0<3b06feCWFrjtubw}R5x2+1%Xex1T&DH1Td-ej%)E(+btva4L&TrW%-=^*b8 zFs;#2=KABf=;?51i>%MKVc(>M)oV=*RWgf+*_vddph(;(*UB#T4HPRu8iZLI1uG`q zv@7k-FixVCB<`#Xwu)Ys9$S88#m0qc4TA7$&^2}iLR=Y%4t*ZPB#wso6VrBUaOW-A zQ1vmN{1iSH@d7??DAmSG4Gh;&V~?QFVQzwALdZkQ4H$EN`7&PZ<;yxoceUm;YaXvf zFE_TAC6O@hb4uZ!-KWhmHM!l6)3|82m+I^n8DrIy4o!7GB%&3cr-punX7Xga2?v9YcAW7QoC$RWVA#sOJvHl;Ywc?7W zHfn0Aw1cx~9Z80!nFf962kdbOep3<9#Z#-gXM)J&M`4p2!7xFS)t4``FI43SUdQTz zZ?UxJ>~prV5%%_8_hEKtHf^rtzGitY=y%GJA8_7+GKMNTX>w6>_PN5&^RU_u{|m~BXB;*tc^Q~fPXL8G&<0|xZ9J-hz2rR=IjUQ z zOG5p27@9Erbxw09!)NcE#bc?!%A5C&diy=`rgs234y=fgx9RNLlbD#XhEOCSN^SqX zf>vIus`CrCE}7V`GmpPY60d&%sunRh^D9Q;mk9K}t{r6S-+GE9?M| z{6PDc?P@>Y$zn1lz`m03EdfGb)Oa{Rc@FM_Z87Aj`SCV1w0^2hJQS5-y+;GAQ8g zlHqtXc6P)|M?|wBqJii7Av~SI`2~AdE-b+Q0T7In1(wR_w05Zx(mwMl=&1G}2a_@K zWt|VUjyYFGBQTw@gP=K|qD?%5;!d8d3ZRLVt(NH|xnDW0f8hwoIW4-y38%HqMLFq< z2qO67oVvRc_DN&~`xSgl2RVr99Xz**laHf$9C9K~222C9ukKU%3rq-r@-EQ_mZRwk za*P^l7*yk|igK!BhBZs!oMXI!y{G9R+~8K&e}luZx>M&ihG|G6Zsx&J9pLE}NOI$# zdwlhf{^>+lcF%*h9rpEcjS@o+?dlM0?-1m?3}#R zj-A!JrP)bdyVRj)Nvbs>2ML*ghM@+;^}8$21$-NGZOB?G~R_ar1Ea-lOJSt6I0!PF>Beq)&~q+A+J%_gJo9+(g0NnrjM1u^cVE3S3N(Jo(=VWYE%QU@YMyC z|BaU^Uof;$4gKZq7h%sCN6u&EBD|WJoOl0-&xUaL59v4~830P80#Jb&b*rvEghtG& zn~(+EMUBY;UT(~(4de%Mt>F>_|EwH;%T}H^>wcY%sV&k;4mBj^h@9=vWX`0;MO?ig zE@3)xqQK2Y2XWY&3_3-NV5Us`{llDwTPB{i;KoTj=Rb`%Sqr|Io;Yy7x`kZr(Dsmr zB>oDTrmbB^Fz3(l$YHVap03wxhrMNQk!9^U@5!2+q23|o5T2-~KBucll(*@G5YJ-b zcS$FY`eq+04_Ka>pA(^~2qVK)4UkXv^;Cl@c=AVKz*QLv{}H1e@K~6wrg`c&(O9Mn%{gL8vlS*0>8nMvRP+ zqyo8nk0O5ntzQF0c(e;?IKlr9kmQdfpC+zcyhhRUq3YOIP~Z-mV1j!gL|=$q;r_>Q z>?7`^lhG~WR|In3W+3P8Uj#OMM#6H5C$Ypvk_CkX_-EEu&kA%TW;=Aq#!E2{U?Cjr zb7h>)1PhwqdOA3Z`;ri^^231dBp&-b3bX5PW)MJr zib@H`8v1J@5a4As-f|heEc99|a zu8TGb6OI8h$R=ONhi02I{ zE&N|dmoqI1&G&RfRK&Y?Xa6>4{}ajBhr(U@%{SJX_u)%+hzC!SCb;yH`{({jOK$sp zZn)1wb^lowbY?!4)aSg_R?6E{>{5b+*WBMeyw1&%pug@N#9jSDed(#ChnF5(I=A%b H(t-a19~;FD diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/model.pyc b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/model.pyc deleted file mode 100644 index d76a757635f72164c4dd14db6715f4c88160d8a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28804 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 a<+1Xi=Al0|zjf%TLq`vN{?PED-Tx1(R9Png diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/parser.pyc b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/parser.pyc deleted file mode 100644 index dbc5efe70b7ef6c2a12d1396dd11abc534e70718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25670 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 H(c%3c^yN`^ diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/sample_filter.pyc b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/sample_filter.pyc deleted file mode 100644 index 628b166128469e39154033921d1f8fdc1eaa167d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4806 zcmcIn-EtdA6+S(ZWyz6$;;@SsLKst7qJ<<*Ed`;dkOGoT)h@LH#?*Q-gsHKnC66r4 zIMX912Ky>0HWxeq@4*}J06Yjqal<|EeWyqAl50n$In#5x=k)3G^PMw|f3L3m?Sp@Q zHjw()!2Kt<+^<1W{EbXR_7`I#`)1A$WIxbxAd`kno3h`O>5}X(iAft`TQbDbro0k) zDe{~BWeVHvEkSVhU;O&L0K=*U64@lRr4IMXtirGh?rt(Yp4cbZ1dN4(O-%d@m-`gN zLN!%~inRE*P44olK`qjNd+#s!4S5BXp$0fm3rA^7x}KZ04%&IVR;c-$ro8DbfQ3IZN1sCs+ zaJhehP*0Kbxt{0H3L1j5ES1RFlAN{VWgwN2IFJ!6g+YUK+>|qs7z?mcA72`sZIa?> zX9gBGT+`ypaZAR_`U=*!Ra8g$%YqjlKi!hw1#;e&b8zu*%P^4N2lDJSrzvGc&H^1= zku$${SI!#BS>+%VIqFFH4;8vjZ*%kUhK_QL9q;%4z~JEXYnPUw(YYAz?s1~8RQ(^* zsIfP;=QjC|p2kv^p&E5AWXJaR{qB z$I0L*8Ckajf9`mf)$;FRB|S8WV>>8t%%Tj3vwToxMgFB+tMdzKl}s)1fUnUVyuOOdeFDNPQGdYBkDuOB2Q=gy zF{_EQa1MQd$Ze_*R;kKsjY7IKkUs~DSfrIBMJOJwTIELSfO%MQ`$&C2=co^oa^xb$ zQgj8x2QIZ8=IV({jM#|b5#n-GQOtX0+vpx@)My<%UE+C+E#+OJ2Gtsb`V7@Mfrs01u`Cr;AwyEv;6VEI+~C%J!N&bz8s4ZAFh=M768v-sh}HJ$0z&8F$Wd zii;Tb(bq`cBhg@B<%%{yfW^Q?r6=A4c$UjFK8+j4S)NsKtT`5PhoIBwv^t$l(+Rp} z(`*Lo=6=vYUUp2^toY2NYSi`-F86Ja)3q9fUm}k7@~hH>;zuh|Zi_J{H}ZLUfzXWR zY7-=$D3YJ89^@311v~~cGC{edu z>_O3gpNocsg=p#s#s8y1ukcNBy41`6$ACJozCWd&c)TX@`h4+Py&j#>5k!68)F;q> zp*}&iA>*r(wq?Aj8_eIq9)=t0^RDKJ`!Ov2sL(vCnUNloazH{p8gSV>mNf(VV4QAf6+qhw zFNy5sHx|)+kJ0Q62B)GPV9D<1xWgf2FOfk@f5ORKc)c!AHzD``PsBr@x@PIT_rpo- zi++!h=1Xv1X-n~0GMV{Ih*+p}4sC|sCpK63x@d2JHPbgT=CUD!sP`d|@ndM?2v-s` z%!XMFt~TDefCnb|E>{rwU<~9xn!GPJY0=j)<29!bUi3gNzbk7)=z~czJxG&>{3vnU z#Sw2m&b|F>6u$_IOqXnf_Gi-rTQbgk*+w^Cgh$pMvq%4fEeppp{2UAo%R}qzeC3bA zKi)fE>Gv2`deRG^M~Xp(<4IOU)Gqn}MC;n~q|7167Zg4y97eOe%BFVDPihVFDr*Q# zlVfGQD3g3-eKDiS@%1sZrOgL6Vk@duQj6B47>%%r7A@4F!V4_QX;NwM`F3Pcl@|NO zlZ&B?z6+V&Vf3B8bBS>lU5C(zxU{$k3Q-qrA?WBn-N@@IdMJ?OftJ$XO+ z2DFD-Xdn(8J0E`8YLpe>Eriysm7cZ=3_xupG#cEgQ!lwHMbD!CK1^JKf~x*T+muH? z;2ZZzSnneBA45bxnzUPqOZL*Kerx-1V5g!IVu~e3>B3Ss#W(C*$z3(U0DHN2K?J_< znspxq!6v%ZO`y(z>hoH7opz(mp|F1XLPZQ%fKf`-zBFoI6T*M~dfC>h2%%(SvwFt!MlG53Pk9EIN4B}XEMbYF*GI2KA z=0R?fFn`p15x2PT&ZVD#w$#rW24kz)3O3*GwASD6uJzhfL1XO!M>`~nL>Ty}(>N*) c#ujZi<-9#L)u0c&2_Gu@Qai>|xAAV{e`)CSTL1t6 diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/__init__.py b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/__init__.pyc b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/__init__.pyc deleted file mode 100644 index beaa20a25ce8b722f7417f7ce758517a18844e67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmZSn%*%C1^G#SX0~9allS(slQuK2&lk^KJOEU8FjP%U)i!)17bqf-cvlG)(i}lNr)AUPHi%az5<1_Oz bOXB18fGRnFM%m=%ridN!O zUV!J}#`AFF!VPAoPU!>S*t;{cGv7D!trGrP>;2gM`ECl$)5iTJe(q2JNPGnp0LhIl zAQ8)W07ae}v2D``~dL6bjz}0mPdR9ryz9X#^+O!f{0D2Yv2Gux{z_9PviQ+f2_>Y$+OsLuO8Rg^emez7vC_~wwg^aYZYPY%sQ1~ zFI{vTae>$onwcp?x!AtzlfBH1b{)+{6VN%g=rs=b5Ti3&mE$xmGi}mztjoHxetc8P zRK7ev4hGePO=N*>92H5jdG`@T zi)A5LbgXYCt!ht_O6}?*yZCpX|MgNysOM!R7lnF3ow*4v1JV3~)z-Ec1tT#O8{z@( T9dS<#a36@C2t_~WiS^(w&4%(a diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/test_vcf.py b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/test_vcf.py deleted file mode 100644 index 20b71ad..0000000 --- a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/test_vcf.py +++ /dev/null @@ -1,1594 +0,0 @@ -from __future__ import print_function -import unittest -try: - unittest.skip -except AttributeError: - import unittest2 as unittest -import doctest -import os -import commands -import cPickle -from StringIO import StringIO -import subprocess -import sys - -try: - import pysam -except ImportError: - pysam = None - -import vcf -from vcf import model, utils - -IS_PYTHON2 = sys.version_info[0] == 2 -IS_NOT_PYPY = 'PyPy' not in sys.version - -suite = doctest.DocTestSuite(vcf) - - -def fh(fname, mode='rt'): - return open(os.path.join(os.path.dirname(__file__), fname), mode) - - -class TestVcfSpecs(unittest.TestCase): - - def test_vcf_4_0(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - self.assertEqual(reader.metadata['fileformat'], 'VCFv4.0') - - # test we can walk the file at least - for r in reader: - - if r.POS == 1230237: - assert r.is_monomorphic - else: - assert not r.is_monomorphic - - if 'AF' in r.INFO: - self.assertEqual(type(r.INFO['AF']), type([])) - - for c in r: - assert c - - # issue 19, in the example ref the GQ is length 1 - if c.called: - self.assertEqual(type(c.data.GQ), type(1)) - if 'HQ' in c.data and c.data.HQ is not None: - self.assertEqual(type(c.data.HQ), type([])) - - - - def test_vcf_4_1(self): - reader = vcf.Reader(fh('example-4.1.vcf')) - self.assertEqual(reader.metadata['fileformat'], 'VCFv4.1') - - # contigs were added in vcf4.1 - self.assertEqual(reader.contigs['20'].length, 62435964) - - # test we can walk the file at least - for r in reader: - for c in r: - assert c - - def test_vcf_4_1_sv(self): - reader = vcf.Reader(fh('example-4.1-sv.vcf')) - - assert 'SVLEN' in reader.infos - assert 'fileDate' in reader.metadata - assert 'DEL' in reader.alts - - # test we can walk the file at least - for r in reader: - print(r) - for a in r.ALT: - print(a) - for c in r: - print(c) - assert c - - def test_vcf_4_1_bnd(self): - reader = vcf.Reader(fh('example-4.1-bnd.vcf')) - - # test we can walk the file at least - for r in reader: - print(r) - for a in r.ALT: - print(a) - if r.ID == "bnd1": - self.assertEqual(len(r.ALT), 1) - self.assertEqual(r.ALT[0].type, "BND") - self.assertEqual(r.ALT[0].chr, "2") - self.assertEqual(r.ALT[0].pos, 3) - self.assertEqual(r.ALT[0].orientation, False) - self.assertEqual(r.ALT[0].remoteOrientation, True) - self.assertEqual(r.ALT[0].connectingSequence, "T") - if r.ID == "bnd4": - self.assertEqual(len(r.ALT), 1) - self.assertEqual(r.ALT[0].type, "BND") - self.assertEqual(r.ALT[0].chr, "1") - self.assertEqual(r.ALT[0].pos, 2) - self.assertEqual(r.ALT[0].orientation, True) - self.assertEqual(r.ALT[0].remoteOrientation, False) - self.assertEqual(r.ALT[0].connectingSequence, "G") - for c in r: - print(c) - assert c - - def test_vcf_4_2(self): - reader = vcf.Reader(fh('example-4.2.vcf')) - self.assertEqual(reader.metadata['fileformat'], 'VCFv4.2') - - # If INFO contains no Source and Version keys, they should be None. - self.assertEqual(reader.infos['DP'].source, None) - self.assertEqual(reader.infos['DP'].version, None) - - # According to spec, INFO Version key is required to be double quoted, - # but at least SAMtools 1.0 does not quote it. So we want to be - # forgiving here. - self.assertEqual(reader.infos['VDB'].source, None) - self.assertEqual(reader.infos['VDB'].version, '3') - - # test we can walk the file at least - for r in reader: - for c in r: - assert c - - def test_contig_idonly(self): - """Test VCF inputs with ##contig inputs containing only IDs. produced by bcftools 1.2+ - """ - reader = vcf.Reader(fh("contig_idonly.vcf")) - for cid, contig in reader.contigs.items(): - if cid == "1": - assert contig.length is None - elif cid == "2": - assert contig.length == 2000 - elif cid == "3": - assert contig.length == 3000 - -class TestGatkOutput(unittest.TestCase): - - filename = 'gatk.vcf' - - samples = ['BLANK', 'NA12878', 'NA12891', 'NA12892', - 'NA19238', 'NA19239', 'NA19240'] - formats = ['AD', 'DP', 'GQ', 'GT', 'PL'] - infos = ['AC', 'AF', 'AN', 'BaseQRankSum', 'DB', 'DP', 'DS', - 'Dels', 'FS', 'HRun', 'HaplotypeScore', 'InbreedingCoeff', - 'MQ', 'MQ0', 'MQRankSum', 'QD', 'ReadPosRankSum'] - - n_calls = 37 - - def setUp(self): - self.reader = vcf.Reader(fh(self.filename)) - - def testSamples(self): - self.assertEqual(self.reader.samples, self.samples) - - def testFormats(self): - self.assertEqual(set(self.reader.formats), set(self.formats)) - - def testInfos(self): - self.assertEqual(set(self.reader.infos), set(self.infos)) - - - def testCalls(self): - n = 0 - - for site in self.reader: - n += 1 - self.assertEqual(len(site.samples), len(self.samples)) - - - # check sample name lookup - for s in self.samples: - assert site.genotype(s) - - # check ordered access - self.assertEqual([x.sample for x in site.samples], self.samples) - - self.assertEqual(n, self.n_calls) - - -class TestFreebayesOutput(TestGatkOutput): - - filename = 'freebayes.vcf' - formats = ['AO', 'DP', 'GL', 'GLE', 'GQ', 'GT', 'QA', 'QR', 'RO'] - infos = ['AB', 'ABP', 'AC', 'AF', 'AN', 'AO', 'BVAR', 'CIGAR', - 'DB', 'DP', 'DPRA', 'EPP', 'EPPR', 'HWE', 'LEN', 'MEANALT', - 'NUMALT', 'RPP', 'MQMR', 'ODDS', 'MQM', 'PAIREDR', 'PAIRED', - 'SAP', 'XRM', 'RO', 'REPEAT', 'XRI', 'XAS', 'XAI', 'SRP', - 'XAM', 'XRS', 'RPPR', 'NS', 'RUN', 'CpG', 'TYPE'] - n_calls = 104 - - - def testParse(self): - reader = vcf.Reader(fh('freebayes.vcf')) - print(reader.samples) - self.assertEqual(len(reader.samples), 7) - n = 0 - for r in reader: - n+=1 - for x in r: - assert x - self.assertEqual(n, self.n_calls) - -class TestSamtoolsOutput(unittest.TestCase): - - def testParse(self): - reader = vcf.Reader(fh('samtools.vcf')) - - self.assertEqual(len(reader.samples), 1) - self.assertEqual(sum(1 for _ in reader), 11) - - -class TestBcfToolsOutput(unittest.TestCase): - def testParse(self): - reader = vcf.Reader(fh('bcftools.vcf')) - self.assertEqual(len(reader.samples), 1) - for r in reader: - for s in r.samples: - s.phased - -class TestIssue214(unittest.TestCase): - """ See https://github.com/jamescasbon/PyVCF/issues/214 """ - - def test_issue_214_is_snp(self): - reader=vcf.Reader(fh('issue-214.vcf')) - r=next(reader) - self.assertTrue(r.is_snp) - - def test_issue_214_var_type(self): - reader=vcf.Reader(fh('issue-214.vcf')) - r=next(reader) - self.assertEqual(r.var_type,'snp') - - # Can the ref even be a spanning deletion? - # Note, this does not trigger issue 214, but I've added it here for completeness - def test_issue_214_ref_is_del_is_snp(self): - reader=vcf.Reader(fh('issue-214.vcf')) - next(reader) - r=next(reader) - self.assertTrue(r.is_snp) - - # Can the ref even be a spanning deletion? - # Note, this does not trigger issue 214, but I've added it here for completeness - def test_issue_214_ref_is_del_var_type(self): - reader=vcf.Reader(fh('issue-214.vcf')) - next(reader) - r=next(reader) - self.assertEqual(r.var_type,'snp') - -class Test1kg(unittest.TestCase): - - def testParse(self): - reader = vcf.Reader(fh('1kg.vcf.gz', 'rb')) - - assert 'FORMAT' in reader._column_headers - - self.assertEqual(len(reader.samples), 629) - for _ in reader: - pass - - def test_issue_49(self): - """docstring for test_issue_49""" - reader = vcf.Reader(fh('issue_49.vcf', 'r')) - - self.assertEqual(len(reader.samples), 0) - for _ in reader: - pass - - -class Test1kgSites(unittest.TestCase): - - def test_reader(self): - """The samples attribute should be the empty list.""" - reader = vcf.Reader(fh('1kg.sites.vcf', 'r')) - - assert 'FORMAT' not in reader._column_headers - - self.assertEqual(reader.samples, []) - for record in reader: - self.assertEqual(record.samples, []) - - def test_writer(self): - """FORMAT should not be written if not present in the template and no - extra tab character should be printed if there are no FORMAT fields.""" - reader = vcf.Reader(fh('1kg.sites.vcf', 'r')) - out = StringIO() - writer = vcf.Writer(out, reader, lineterminator='\n') - - for record in reader: - writer.write_record(record) - out.seek(0) - out_str = out.getvalue() - for line in out_str.split('\n'): - if line.startswith('##'): - continue - if line.startswith('#CHROM'): - assert 'FORMAT' not in line - assert not line.endswith('\t') - - -class TestGoNL(unittest.TestCase): - - def testParse(self): - reader = vcf.Reader(fh('gonl.chr20.release4.gtc.vcf')) - for _ in reader: - pass - - def test_contig_line(self): - reader = vcf.Reader(fh('gonl.chr20.release4.gtc.vcf')) - self.assertEqual(reader.contigs['1'].length, 249250621) - - -class TestStringAsFlag(unittest.TestCase): - - def test_string_as_flag(self): - """A flag INFO field is declared as string (not allowed by the spec, - but seen in practice).""" - reader = vcf.Reader(fh('string_as_flag.vcf', 'r')) - for _ in reader: - pass - - -class TestInfoOrder(unittest.TestCase): - - def _assert_order(self, definitions, fields): - """ - Elements common to both lists should be in the same order. Elements - only in `fields` should be last and in alphabetical order. - """ - used_definitions = [d for d in definitions if d in fields] - self.assertEqual(used_definitions, fields[:len(used_definitions)]) - self.assertEqual(fields[len(used_definitions):], - sorted(fields[len(used_definitions):])) - - def test_writer(self): - """ - Order of INFO fields should be compatible with the order of their - definition in the header and undefined fields should be last and in - alphabetical order. - """ - reader = vcf.Reader(fh('1kg.sites.vcf', 'r')) - out = StringIO() - writer = vcf.Writer(out, reader, lineterminator='\n') - - for record in reader: - writer.write_record(record) - out.seek(0) - out_str = out.getvalue() - - definitions = [] - for line in out_str.split('\n'): - if line.startswith('##INFO='): - definitions.append(line.split('ID=')[1].split(',')[0]) - if not line or line.startswith('#'): - continue - fields = [f.split('=')[0] for f in line.split('\t')[7].split(';')] - self._assert_order(definitions, fields) - - -class TestInfoTypeCharacter(unittest.TestCase): - def test_parse(self): - reader = vcf.Reader(fh('info-type-character.vcf')) - record = next(reader) - self.assertEqual(record.INFO['FLOAT_1'], 123.456) - self.assertEqual(record.INFO['CHAR_1'], 'Y') - self.assertEqual(record.INFO['FLOAT_N'], [123.456]) - self.assertEqual(record.INFO['CHAR_N'], ['Y']) - - def test_write(self): - reader = vcf.Reader(fh('info-type-character.vcf')) - out = StringIO() - writer = vcf.Writer(out, reader) - - records = list(reader) - - for record in records: - writer.write_record(record) - out.seek(0) - reader2 = vcf.Reader(out) - - for l, r in zip(records, reader2): - self.assertEquals(l.INFO, r.INFO) - - -class TestParseMetaLine(unittest.TestCase): - def test_parse(self): - reader = vcf.Reader(fh('parse-meta-line.vcf')) - f = reader.metadata['MYFIELD'][0] - self.assertEqual(f['ID'], 'SomeField') - self.assertEqual(f['Version'], '3.4-0-g7e26428') - self.assertEqual(f['Date'], '"Wed Oct 07 09:11:47 CEST 2015"') - self.assertEqual(f['Options'], '"< 4 and > 3"') - next(reader) - - def test_write(self): - reader = vcf.Reader(fh('parse-meta-line.vcf')) - out = StringIO() - writer = vcf.Writer(out, reader) - - records = list(reader) - - for record in records: - writer.write_record(record) - out.seek(0) - reader2 = vcf.Reader(out) - - f = reader2.metadata['MYFIELD'][0] - self.assertEqual(f['ID'], 'SomeField') - self.assertEqual(f['Version'], '3.4-0-g7e26428') - self.assertEqual(f['Date'], '"Wed Oct 07 09:11:47 CEST 2015"') - self.assertEqual(f['Options'], '"< 4 and > 3"') - - for l, r in zip(records, reader2): - self.assertEquals(l.INFO, r.INFO) - - -class TestGatkOutputWriter(unittest.TestCase): - - def testWrite(self): - - reader = vcf.Reader(fh('gatk.vcf')) - out = StringIO() - writer = vcf.Writer(out, reader) - - records = list(reader) - - for record in records: - writer.write_record(record) - out.seek(0) - out_str = out.getvalue() - for line in out_str.split("\n"): - if line.startswith("##contig"): - assert line.startswith('##contig=<'), "Found dictionary in contig line: {0}".format(line) - print (out_str) - reader2 = vcf.Reader(out) - - self.assertEquals(reader.samples, reader2.samples) - self.assertEquals(reader.formats, reader2.formats) - self.assertEquals(reader.infos, reader2.infos) - self.assertEquals(reader.contigs, reader2.contigs) - - for l, r in zip(records, reader2): - self.assertEquals(l.samples, r.samples) - - # test for call data equality, since equality on the sample calls - # may not always mean their data are all equal - for l_call, r_call in zip(l.samples, r.samples): - self.assertEqual(l_call.data, r_call.data) - - -class TestBcfToolsOutputWriter(unittest.TestCase): - - def testWrite(self): - - reader = vcf.Reader(fh('bcftools.vcf')) - out = StringIO() - writer = vcf.Writer(out, reader) - - records = list(reader) - - for record in records: - writer.write_record(record) - out.seek(0) - print (out.getvalue()) - reader2 = vcf.Reader(out) - - self.assertEquals(reader.samples, reader2.samples) - self.assertEquals(reader.formats, reader2.formats) - self.assertEquals(reader.infos, reader2.infos) - - for l, r in zip(records, reader2): - self.assertEquals(l.samples, r.samples) - - # test for call data equality, since equality on the sample calls - # may not always mean their data are all equal - for l_call, r_call in zip(l.samples, r.samples): - self.assertEqual(l_call.data, r_call.data) - - -class TestWriterDictionaryMeta(unittest.TestCase): - - def testWrite(self): - - reader = vcf.Reader(fh('example-4.1-bnd.vcf')) - out = StringIO() - writer = vcf.Writer(out, reader) - - records = list(reader) - - for record in records: - writer.write_record(record) - out.seek(0) - out_str = out.getvalue() - for line in out_str.split("\n"): - if line.startswith("##PEDIGREE"): - self.assertEquals(line, '##PEDIGREE=') - if line.startswith("##SAMPLE"): - assert line.startswith('##SAMPLE=<'), "Found dictionary in meta line: {0}".format(line) - - -class TestSamplesSpace(unittest.TestCase): - filename = 'samples-space.vcf' - samples = ['NA 00001', 'NA 00002', 'NA 00003'] - def test_samples(self): - self.reader = vcf.Reader(fh(self.filename), strict_whitespace=True) - self.assertEqual(self.reader.samples, self.samples) - - -class TestMetadataWhitespace(unittest.TestCase): - filename = 'metadata-whitespace.vcf' - def test_metadata_whitespace(self): - """ - Test parsing metadata header lines with whitespace. - """ - self.reader = vcf.Reader(fh(self.filename)) - - # Pick one INFO line and assert that we parsed it correctly. - info_indel = self.reader.infos['INDEL'] - assert info_indel.id == 'INDEL' - assert info_indel.num == 0 - assert info_indel.type == 'Flag' - assert info_indel.desc == 'Indicates that the variant is an INDEL.' - - # Test we can walk the file at least. - for r in self.reader: - for c in r: - pass - - -class TestMixedFiltering(unittest.TestCase): - filename = 'mixed-filtering.vcf' - def test_mixed_filtering(self): - """ - Test mix of FILTER values (pass, filtered, no filtering). - """ - reader = vcf.Reader(fh(self.filename)) - self.assertEqual(next(reader).FILTER, []) - self.assertEqual(next(reader).FILTER, ['q10']) - self.assertEqual(next(reader).FILTER, []) - self.assertEqual(next(reader).FILTER, None) - self.assertEqual(next(reader).FILTER, ['q10', 'q50']) - - -class TestRecord(unittest.TestCase): - - def test_num_calls(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - num_calls = (var.num_hom_ref + var.num_hom_alt + \ - var.num_het + var.num_unknown) - self.assertEqual(len(var.samples), num_calls) - - def test_dunder_eq(self): - rec = next(vcf.Reader(fh('example-4.0.vcf'))) - self.assertFalse(rec == None) - self.assertFalse(None == rec) - - def test_call_rate(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - call_rate = var.call_rate - if var.POS == 14370: - self.assertEqual(3.0/3.0, call_rate) - if var.POS == 17330: - self.assertEqual(3.0/3.0, call_rate) - if var.POS == 1110696: - self.assertEqual(3.0/3.0, call_rate) - if var.POS == 1230237: - self.assertEqual(3.0/3.0, call_rate) - elif var.POS == 1234567: - self.assertEqual(2.0/3.0, call_rate) - - def test_aaf(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - aaf = var.aaf - if var.POS == 14370: - self.assertEqual([3.0/6.0], aaf) - if var.POS == 17330: - self.assertEqual([1.0/6.0], aaf) - if var.POS == 1110696: - self.assertEqual([2.0/6.0, 4.0/6.0], aaf) - if var.POS == 1230237: - self.assertEqual([0.0/6.0], aaf) - elif var.POS == 1234567: - self.assertEqual([2.0/4.0, 1.0/4.0], aaf) - reader = vcf.Reader(fh('example-4.1-ploidy.vcf')) - for var in reader: - aaf = var.aaf - if var.POS == 60034: - self.assertEqual([4.0/6.0], aaf) - elif var.POS == 60387: - self.assertEqual([1.0/3.0], aaf) - - def test_pi(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - pi = var.nucl_diversity - if var.POS == 14370: - self.assertEqual(6.0/10.0, pi) - if var.POS == 17330: - self.assertEqual(1.0/3.0, pi) - if var.POS == 1110696: - self.assertEqual(None, pi) - if var.POS == 1230237: - self.assertEqual(0.0/6.0, pi) - elif var.POS == 1234567: - self.assertEqual(None, pi) - - def test_heterozygosity(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - het = var.heterozygosity - if var.POS == 14370: - self.assertEqual(0.5, het) - if var.POS == 17330: - self.assertEqual(1-((1.0/6)**2 + (5.0/6)**2), het) - if var.POS == 1110696: - self.assertEqual(4.0/9.0, het) - if var.POS == 1230237: - self.assertEqual(0.0, het) - elif var.POS == 1234567: - self.assertEqual(5.0/8.0, het) - - def test_is_snp(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for r in reader: - print(r) - for c in r: - print(c) - assert c - for var in reader: - is_snp = var.is_snp - if var.POS == 14370: - self.assertEqual(True, is_snp) - if var.POS == 17330: - self.assertEqual(True, is_snp) - if var.POS == 1110696: - self.assertEqual(True, is_snp) - if var.POS == 1230237: - self.assertEqual(False, is_snp) - elif var.POS == 1234567: - self.assertEqual(False, is_snp) - - - def test_is_snp_for_n_alt(self): - record = model._Record( - '1', - 10, - 'id1', - 'C', - [model._Substitution('N')], - None, - None, - {}, - None, - {}, - None - ) - self.assertTrue(record.is_snp) - - - def test_is_indel(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - is_indel = var.is_indel - if var.POS == 14370: - self.assertEqual(False, is_indel) - if var.POS == 17330: - self.assertEqual(False, is_indel) - if var.POS == 1110696: - self.assertEqual(False, is_indel) - if var.POS == 1230237: - self.assertEqual(True, is_indel) - elif var.POS == 1234567: - self.assertEqual(True, is_indel) - - def test_is_transition(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - is_trans = var.is_transition - if var.POS == 14370: - self.assertEqual(True, is_trans) - if var.POS == 17330: - self.assertEqual(False, is_trans) - if var.POS == 1110696: - self.assertEqual(False, is_trans) - if var.POS == 1230237: - self.assertEqual(False, is_trans) - elif var.POS == 1234567: - self.assertEqual(False, is_trans) - - def test_is_deletion(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - is_del = var.is_deletion - if var.POS == 14370: - self.assertEqual(False, is_del) - if var.POS == 17330: - self.assertEqual(False, is_del) - if var.POS == 1110696: - self.assertEqual(False, is_del) - if var.POS == 1230237: - self.assertEqual(True, is_del) - elif var.POS == 1234567: - self.assertEqual(False, is_del) - - def test_var_type(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - type = var.var_type - if var.POS == 14370: - self.assertEqual("snp", type) - if var.POS == 17330: - self.assertEqual("snp", type) - if var.POS == 1110696: - self.assertEqual("snp", type) - if var.POS == 1230237: - self.assertEqual("indel", type) - elif var.POS == 1234567: - self.assertEqual("indel", type) - # SV tests - reader = vcf.Reader(fh('example-4.1-sv.vcf')) - for var in reader: - type = var.var_type - if var.POS == 2827693: - self.assertEqual("sv", type) - if var.POS == 321682: - self.assertEqual("sv", type) - if var.POS == 14477084: - self.assertEqual("sv", type) - if var.POS == 9425916: - self.assertEqual("sv", type) - elif var.POS == 12665100: - self.assertEqual("sv", type) - elif var.POS == 18665128: - self.assertEqual("sv", type) - - - def test_var_subtype(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - subtype = var.var_subtype - if var.POS == 14370: - self.assertEqual("ts", subtype) - if var.POS == 17330: - self.assertEqual("tv", subtype) - if var.POS == 1110696: - self.assertEqual("unknown", subtype) - if var.POS == 1230237: - self.assertEqual("del", subtype) - elif var.POS == 1234567: - self.assertEqual("unknown", subtype) - # SV tests - reader = vcf.Reader(fh('example-4.1-sv.vcf')) - for var in reader: - subtype = var.var_subtype - if var.POS == 2827693: - self.assertEqual("DEL", subtype) - if var.POS == 321682: - self.assertEqual("DEL", subtype) - if var.POS == 14477084: - self.assertEqual("DEL:ME:ALU", subtype) - if var.POS == 9425916: - self.assertEqual("INS:ME:L1", subtype) - elif var.POS == 12665100: - self.assertEqual("DUP", subtype) - elif var.POS == 18665128: - self.assertEqual("DUP:TANDEM", subtype) - - def test_is_sv(self): - reader = vcf.Reader(fh('example-4.1-sv.vcf')) - for var in reader: - is_sv = var.is_sv - if var.POS == 2827693: - self.assertEqual(True, is_sv) - if var.POS == 321682: - self.assertEqual(True, is_sv) - if var.POS == 14477084: - self.assertEqual(True, is_sv) - if var.POS == 9425916: - self.assertEqual(True, is_sv) - elif var.POS == 12665100: - self.assertEqual(True, is_sv) - elif var.POS == 18665128: - self.assertEqual(True, is_sv) - - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - is_sv = var.is_sv - if var.POS == 14370: - self.assertEqual(False, is_sv) - if var.POS == 17330: - self.assertEqual(False, is_sv) - if var.POS == 1110696: - self.assertEqual(False, is_sv) - if var.POS == 1230237: - self.assertEqual(False, is_sv) - elif var.POS == 1234567: - self.assertEqual(False, is_sv) - - def test_is_sv_precise(self): - reader = vcf.Reader(fh('example-4.1-sv.vcf')) - for var in reader: - is_precise = var.is_sv_precise - if var.POS == 2827693: - self.assertEqual(True, is_precise) - if var.POS == 321682: - self.assertEqual(False, is_precise) - if var.POS == 14477084: - self.assertEqual(False, is_precise) - if var.POS == 9425916: - self.assertEqual(False, is_precise) - elif var.POS == 12665100: - self.assertEqual(False, is_precise) - elif var.POS == 18665128: - self.assertEqual(False, is_precise) - - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - is_precise = var.is_sv_precise - if var.POS == 14370: - self.assertEqual(False, is_precise) - if var.POS == 17330: - self.assertEqual(False, is_precise) - if var.POS == 1110696: - self.assertEqual(False, is_precise) - if var.POS == 1230237: - self.assertEqual(False, is_precise) - elif var.POS == 1234567: - self.assertEqual(False, is_precise) - - def test_sv_end(self): - reader = vcf.Reader(fh('example-4.1-sv.vcf')) - for var in reader: - sv_end = var.sv_end - if var.POS == 2827693: - self.assertEqual(2827680, sv_end) - if var.POS == 321682: - self.assertEqual(321887, sv_end) - if var.POS == 14477084: - self.assertEqual(14477381, sv_end) - if var.POS == 9425916: - self.assertEqual(9425916, sv_end) - elif var.POS == 12665100: - self.assertEqual(12686200, sv_end) - elif var.POS == 18665128: - self.assertEqual(18665204, sv_end) - - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - sv_end = var.sv_end - if var.POS == 14370: - self.assertEqual(None, sv_end) - if var.POS == 17330: - self.assertEqual(None, sv_end) - if var.POS == 1110696: - self.assertEqual(None, sv_end) - if var.POS == 1230237: - self.assertEqual(None, sv_end) - elif var.POS == 1234567: - self.assertEqual(None, sv_end) - - def test_qual(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - qual = var.QUAL - qtype = type(qual) - if var.POS == 14370: - expected = 29 - if var.POS == 17330: - expected = 3.0 - if var.POS == 1110696: - expected = 1e+03 - if var.POS == 1230237: - expected = 47 - elif var.POS == 1234567: - expected = None - self.assertEqual(expected, qual) - self.assertEqual(type(expected), qtype) - - def test_info_multiple_values(self): - reader = vcf.Reader(fh('example-4.1-info-multiple-values.vcf')) - var = next(reader) - # check Float type INFO field with multiple values - expected = [19.3, 47.4, 14.0] - actual = var.INFO['RepeatCopies'] - self.assertEqual(expected, actual) - # check Integer type INFO field with multiple values - expected = [42, 14, 56] - actual = var.INFO['RepeatSize'] - self.assertEqual(expected, actual) - # check String type INFO field with multiple values - expected = ['TCTTATCTTCTTACTTTTCATTCCTTACTCTTACTTACTTAC', 'TTACTCTTACTTAC', 'TTACTCTTACTTACTTACTCTTACTTACTTACTCTTACTTACTTACTCTTATCTTC'] - actual = var.INFO['RepeatConsensus'] - self.assertEqual(expected, actual) - - def test_pickle(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - self.assertEqual(cPickle.loads(cPickle.dumps(var)), var) - - - def assert_has_expected_coordinates( - self, - record, - expected_coordinates, - expected_affected_coordinates - ): - self.assertEqual( - (record.start, record.end), - expected_coordinates - ) - self.assertEqual( - (record.affected_start, record.affected_end), - expected_affected_coordinates - ) - - - def test_coordinates_for_snp(self): - record = model._Record( - '1', - 10, - 'id1', - 'C', - [model._Substitution('A')], - None, - None, - {}, - None, - {}, - None - ) - self.assert_has_expected_coordinates(record, (9, 10), (9, 10)) - - - def test_coordinates_for_insertion(self): - record = model._Record( - '1', - 10, - 'id2', - 'C', - [model._Substitution('CTA')], - None, - None, - {}, - None, - {}, - None - ) - self.assert_has_expected_coordinates(record, (9, 10), (10, 10)) - - - def test_coordinates_for_deletion(self): - record = model._Record( - '1', - 10, - 'id3', - 'CTA', - [model._Substitution('C')], - None, - None, - {}, - None, - {}, - None - ) - self.assert_has_expected_coordinates(record, (9, 12), (10, 12)) - - - def test_coordinates_for_None_alt(self): - record = model._Record( - '1', - 10, - 'id4', - 'C', - [None], - None, - None, - {}, - None, - {}, - None - ) - self.assert_has_expected_coordinates(record, (9, 10), (9, 10)) - - - def test_coordinates_for_multiple_snps(self): - record = model._Record( - '1', - 10, - 'id5', - 'C', - [ - model._Substitution('A'), - model._Substitution('G'), - model._Substitution('T') - ], - None, - None, - {}, - None, - {}, - None - ) - self.assert_has_expected_coordinates(record, (9, 10), (9, 10)) - - - def test_coordinates_for_insert_and_snp(self): - record = model._Record( - '1', - 10, - 'id6', - 'C', - [ - model._Substitution('GTA'), - model._Substitution('G'), - ], - None, - None, - {}, - None, - {}, - None - ) - self.assert_has_expected_coordinates(record, (9, 10), (9, 10)) - record = model._Record( - '1', - 10, - 'id7', - 'C', - [ - model._Substitution('G'), - model._Substitution('GTA'), - ], - None, - None, - {}, - None, - {}, - None - ) - self.assert_has_expected_coordinates(record, (9, 10), (9, 10)) - - - def test_coordinates_for_snp_and_deletion(self): - record = model._Record( - '1', - 10, - 'id8', - 'CTA', - [ - model._Substitution('C'), - model._Substitution('CTG'), - ], - None, - None, - {}, - None, - {}, - None - ) - self.assert_has_expected_coordinates(record, (9, 12), (10, 12)) - record = model._Record( - '1', - 10, - 'id9', - 'CTA', - [ - model._Substitution('CTG'), - model._Substitution('C'), - ], - None, - None, - {}, - None, - {}, - None - ) - self.assert_has_expected_coordinates(record, (9, 12), (10, 12)) - - - def test_coordinates_for_insertion_and_deletion(self): - record = model._Record( - '1', - 10, - 'id10', - 'CT', - [ - model._Substitution('CA'), - model._Substitution('CTT'), - ], - None, - None, - {}, - None, - {}, - None - ) - self.assert_has_expected_coordinates(record, (9, 11), (10, 11)) - record = model._Record( - '1', - 10, - 'id11', - 'CT', - [ - model._Substitution('CTT'), - model._Substitution('CA'), - ], - None, - None, - {}, - None, - {}, - None - ) - self.assert_has_expected_coordinates(record, (9, 11), (10, 11)) - - - def test_coordinates_for_breakend(self): - record = model._Record( - '1', - 10, - 'id12', - 'CTA', - [model._Breakend('1', 500, False, True, 'GGTC', True)], - None, - None, - {}, - None, - {}, - None - ) - self.assert_has_expected_coordinates(record, (9, 12), (9, 12)) - - -class TestCall(unittest.TestCase): - - def test_dunder_eq(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - var = next(reader) - example_call = var.samples[0] - self.assertFalse(example_call == None) - self.assertFalse(None == example_call) - - def test_phased(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - phases = [s.phased for s in var.samples] - if var.POS == 14370: - self.assertEqual([True, True, False], phases) - if var.POS == 17330: - self.assertEqual([True, True, False], phases) - if var.POS == 1110696: - self.assertEqual([True, True, False], phases) - if var.POS == 1230237: - self.assertEqual([True, True, False], phases) - elif var.POS == 1234567: - self.assertEqual([False, False, False], phases) - - def test_gt_bases(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - gt_bases = [s.gt_bases for s in var.samples] - if var.POS == 14370: - self.assertEqual(['G|G', 'A|G', 'A/A'], gt_bases) - elif var.POS == 17330: - self.assertEqual(['T|T', 'T|A', 'T/T'], gt_bases) - elif var.POS == 1110696: - self.assertEqual(['G|T', 'T|G', 'T/T'], gt_bases) - elif var.POS == 1230237: - self.assertEqual(['T|T', 'T|T', 'T/T'], gt_bases) - elif var.POS == 1234567: - self.assertEqual([None, 'GTCT/GTACT', 'G/G'], gt_bases) - - def test_gt_types(self): - reader = vcf.Reader(fh('example-4.0.vcf')) - for var in reader: - for s in var: - print(s.data) - gt_types = [s.gt_type for s in var.samples] - if var.POS == 14370: - self.assertEqual([0,1,2], gt_types) - elif var.POS == 17330: - self.assertEqual([0,1,0], gt_types) - elif var.POS == 1110696: - self.assertEqual([1,1,2], gt_types) - elif var.POS == 1230237: - self.assertEqual([0,0,0], gt_types) - elif var.POS == 1234567: - self.assertEqual([None,1,2], gt_types) - - -@unittest.skipUnless(pysam, "test requires installation of PySAM.") -class TestFetch(unittest.TestCase): - - def setUp(self): - self.reader = vcf.Reader(fh('tb.vcf.gz', 'rb')) - - - def assertFetchedExpectedPositions( - self, fetched_variants, expected_positions): - fetched_positions = [var.POS for var in fetched_variants] - self.assertEqual(fetched_positions, expected_positions) - - - def testNoVariantsInRange(self): - fetched_variants = self.reader.fetch('20', 14370, 17329) - self.assertFetchedExpectedPositions(fetched_variants, []) - - - def testNoVariantsForZeroLengthInterval(self): - fetched_variants = self.reader.fetch('20', 14369, 14369) - self.assertFetchedExpectedPositions(fetched_variants, []) - - - def testFetchRange(self): - fetched_variants = self.reader.fetch('20', 14369, 14370) - self.assertFetchedExpectedPositions(fetched_variants, [14370]) - - fetched_variants = self.reader.fetch('20', 14369, 17330) - self.assertFetchedExpectedPositions( - fetched_variants, [14370, 17330]) - - fetched_variants = self.reader.fetch('20', 1110695, 1234567) - self.assertFetchedExpectedPositions( - fetched_variants, [1110696, 1230237, 1234567]) - - - def testFetchesFromStartIfStartOnlySpecified(self): - fetched_variants = self.reader.fetch('20', 1110695) - self.assertFetchedExpectedPositions( - fetched_variants, [1110696, 1230237, 1234567]) - - - def testFetchesAllFromChromIfOnlyChromSpecified(self): - fetched_variants = self.reader.fetch('20') - self.assertFetchedExpectedPositions( - fetched_variants, - [14370, 17330, 1110696, 1230237, 1234567] - ) - - -@unittest.skipUnless(pysam, "test requires installation of PySAM.") -class TestIssue201(unittest.TestCase): - def setUp(self): - # This file contains some non-ASCII characters in a UTF-8 encoding. - # https://github.com/jamescasbon/PyVCF/issues/201 - self.reader = vcf.Reader(fh('issue-201.vcf.gz', 'rb'), - encoding='utf-8') - - def testIterate(self): - for record in self.reader: - # Should not raise decoding errors. - pass - - def testFetch(self): - for record in self.reader.fetch(chrom='17'): - # Should not raise decoding errors. - pass - - -class TestOpenMethods(unittest.TestCase): - - samples = 'NA00001 NA00002 NA00003'.split() - - def fp(self, fname): - return os.path.join(os.path.dirname(__file__), fname) - - - def testOpenFilehandle(self): - r = vcf.Reader(fh('example-4.0.vcf')) - self.assertEqual(self.samples, r.samples) - self.assertEqual('example-4.0.vcf', os.path.split(r.filename)[1]) - - def testOpenFilename(self): - r = vcf.Reader(filename=self.fp('example-4.0.vcf')) - self.assertEqual(self.samples, r.samples) - - def testOpenFilehandleGzipped(self): - r = vcf.Reader(fh('tb.vcf.gz', 'rb')) - self.assertEqual(self.samples, r.samples) - - def testOpenFilenameGzipped(self): - r = vcf.Reader(filename=self.fp('tb.vcf.gz')) - self.assertEqual(self.samples, r.samples) - - -class TestSampleFilter(unittest.TestCase): - @unittest.skipUnless(IS_PYTHON2, "test broken for Python 3") - def testCLIListSamples(self): - proc = subprocess.Popen('python scripts/vcf_sample_filter.py vcf/test/example-4.1.vcf', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out, err = proc.communicate() - self.assertEqual(proc.returncode, 0) - self.assertFalse(err) - expected_out = ['Samples:', '0: NA00001', '1: NA00002', '2: NA00003'] - self.assertEqual(out.splitlines(), expected_out) - - @unittest.skipUnless(IS_PYTHON2, "test broken for Python 3") - def testCLIWithFilter(self): - proc = subprocess.Popen('python scripts/vcf_sample_filter.py vcf/test/example-4.1.vcf -f 1,2 --quiet', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - out, err = proc.communicate() - self.assertEqual(proc.returncode, 0) - self.assertTrue(out) - self.assertFalse(err) - buf = StringIO() - buf.write(out) - buf.seek(0) - #print(buf.getvalue()) - reader = vcf.Reader(buf) - self.assertEqual(reader.samples, ['NA00001']) - rec = next(reader) - self.assertEqual(len(rec.samples), 1) - - @unittest.skipUnless(IS_NOT_PYPY, "test broken for PyPy") - def testSampleFilterModule(self): - # init filter with filename, get list of samples - filt = vcf.SampleFilter('vcf/test/example-4.1.vcf') - self.assertEqual(filt.samples, ['NA00001', 'NA00002', 'NA00003']) - # set filter, check which samples will be kept - filtered = filt.set_filters(filters="0", invert=True) - self.assertEqual(filtered, ['NA00001']) - # write filtered file to StringIO - buf = StringIO() - filt.write(buf) - buf.seek(0) - #print(buf.getvalue()) - # undo monkey patch by destroying instance - del filt - self.assertTrue('sample_filter' not in dir(vcf.Reader)) - # read output - reader = vcf.Reader(buf) - self.assertEqual(reader.samples, ['NA00001']) - rec = next(reader) - self.assertEqual(len(rec.samples), 1) - - -class TestFilter(unittest.TestCase): - - - @unittest.skip("test currently broken") - def testApplyFilter(self): - # FIXME: broken with distribute - s, out = commands.getstatusoutput('python scripts/vcf_filter.py --site-quality 30 test/example-4.0.vcf sq') - #print(out) - self.assertEqual(s, 0) - buf = StringIO() - buf.write(out) - buf.seek(0) - - print(buf.getvalue()) - reader = vcf.Reader(buf) - - - # check filter got into output file - assert 'sq30' in reader.filters - - print(reader.filters) - - # check sites were filtered - n = 0 - for r in reader: - if r.QUAL < 30: - assert 'sq30' in r.FILTER - n += 1 - else: - assert 'sq30' not in r.FILTER - self.assertEqual(n, 2) - - - @unittest.skip("test currently broken") - def testApplyMultipleFilters(self): - # FIXME: broken with distribute - s, out = commands.getstatusoutput('python scripts/vcf_filter.py --site-quality 30 ' - '--genotype-quality 50 test/example-4.0.vcf sq mgq') - self.assertEqual(s, 0) - #print(out) - buf = StringIO() - buf.write(out) - buf.seek(0) - reader = vcf.Reader(buf) - - print(reader.filters) - - assert 'mgq50' in reader.filters - assert 'sq30' in reader.filters - - -class TestRegression(unittest.TestCase): - - def test_issue_16(self): - reader = vcf.Reader(fh('issue-16.vcf')) - n = next(reader) - assert n.QUAL == None - - def test_null_mono(self): - # null qualities were written as blank, causing subsequent parse to fail - print(os.path.abspath(os.path.join(os.path.dirname(__file__), 'null_genotype_mono.vcf') )) - p = vcf.Reader(fh('null_genotype_mono.vcf')) - assert p.samples - out = StringIO() - writer = vcf.Writer(out, p) - for record in p: - writer.write_record(record) - out.seek(0) - print(out.getvalue()) - p2 = vcf.Reader(out) - rec = next(p2) - assert rec.samples - - -class TestUtils(unittest.TestCase): - - def test_walk(self): - # easy case: all same sites - reader1 = vcf.Reader(fh('example-4.0.vcf')) - reader2 = vcf.Reader(fh('example-4.0.vcf')) - reader3 = vcf.Reader(fh('example-4.0.vcf')) - - n = 0 - for x in utils.walk_together(reader1, reader2, reader3): - self.assertEqual(len(x), 3) - self.assertEqual(x[0], x[1]) - self.assertEqual(x[1], x[2]) - n+= 1 - self.assertEqual(n, 5) - - # artificial case 2 from the left, 2 from the right, 2 together, 1 from the right, 1 from the left - expected = 'llrrttrl' - reader1 = vcf.Reader(fh('walk_left.vcf')) - reader2 = vcf.Reader(fh('example-4.0.vcf')) - - for ex, recs in zip(expected, utils.walk_together(reader1, reader2)): - if ex == 'l': - assert recs[0] is not None - assert recs[1] is None - if ex == 'r': - assert recs[1] is not None - assert recs[0] is None - if ex == 't': - assert recs[0] is not None - assert recs[1] is not None - - # test files with many chromosomes, set 'vcf_record_sort_key' to define chromosome order - chr_order = map(str, range(1, 30)) + ['X', 'Y', 'M'] - get_key = lambda r: (chr_order.index(r.CHROM.replace('chr','')), r.POS) - reader1 = vcf.Reader(fh('issue-140-file1.vcf')) - reader2 = vcf.Reader(fh('issue-140-file2.vcf')) - reader3 = vcf.Reader(fh('issue-140-file3.vcf')) - expected = "66642577752767662466" # each char is an integer bit flag - like file permissions - for ex, recs in zip(expected, utils.walk_together(reader1, reader2, reader3, vcf_record_sort_key = get_key)): - ex = int(ex) - for i, flag in enumerate([0x4, 0x2, 0x1]): - if ex & flag: - self.assertNotEqual(recs[i], None) - else: - self.assertEqual(recs[i], None) - - def test_trim(self): - tests = [('TAA GAA', 'T G'), - ('TA TA', 'T T'), - ('AGTTTTTA AGTTTA', 'AGTT AG'), - ('TATATATA TATATA', 'TAT T'), - ('TATATA TATATATA', 'T TAT'), - ('ACCCCCCC ACCCCCCCCCC ACCCCCCCCC ACCCCCCCCCCC', 'A ACCC ACC ACCCC')] - for sequences, expected in tests: - self.assertEqual(utils.trim_common_suffix(*sequences.split()), - expected.split()) - - - -class TestGATKMeta(unittest.TestCase): - - def test_meta(self): - # expect no exceptions raised - reader = vcf.Reader(fh('gatk_26_meta.vcf')) - assert 'GATKCommandLine' in reader.metadata - self.assertEqual(reader.metadata['GATKCommandLine'][0]['CommandLineOptions'], '"analysis_type=LeftAlignAndTrimVariants"') - self.assertEqual(reader.metadata['GATKCommandLine'][1]['CommandLineOptions'], '"analysis_type=VariantAnnotator annotation=[HomopolymerRun, VariantType, TandemRepeatAnnotator]"') - - - -class TestUncalledGenotypes(unittest.TestCase): - """Test the handling of uncalled (., ./.) sample genotypes.""" - - def test_read_uncalled(self): - """Test that uncalled genotypes are properly read into - gt_nums, gt_bases, ploidity, and gt_alleles properties - of _Call objects. For uncalled _Call objects: - - - gt_nums should be None - - gt_bases should be None - - ploidity should match the input ploidity - - gt_alleles should be a list of None's with length - matching the ploidity""" - - reader = vcf.Reader(fh('uncalled_genotypes.vcf')) - for var in reader: - gt_bases = [s.gt_bases for s in var.samples] - gt_nums = [s.gt_nums for s in var.samples] - ploidity = [s.ploidity for s in var.samples] - gt_alleles = [s.gt_alleles for s in var.samples] - - if var.POS == 14370: - self.assertEqual(['0|0', None, '1/1'], gt_nums) - self.assertEqual(['G|G', None, 'A/A'], gt_bases) - self.assertEqual([2,2,2], ploidity) - self.assertEqual([['0','0'], [None,None], ['1','1']], gt_alleles) - elif var.POS == 17330: - self.assertEqual([None, '0|1', '0/0'], gt_nums) - self.assertEqual([None, 'T|A', 'T/T'], gt_bases) - self.assertEqual([3,2,2], ploidity) - self.assertEqual([[None,None,None], ['0','1'], ['0','0']], gt_alleles) - elif var.POS == 1234567: - self.assertEqual(['0/1', '0/2', None], gt_nums) - self.assertEqual(['GTC/G', 'GTC/GTCT', None], gt_bases) - self.assertEqual([2,2,1], ploidity) - self.assertEqual([['0','1'], ['0','2'], [None]], gt_alleles) - reader._reader.close() - - - def test_write_uncalled(self): - """Test that uncalled genotypes are written just as - they were read in the input file.""" - - reader = vcf.Reader(fh('uncalled_genotypes.vcf')) - - # Write all reader records to a stream. - out = StringIO() - writer = vcf.Writer(out, reader, lineterminator='\n') - for record in reader: - writer.write_record(record) - reader._reader.close() - - - # Compare the written stream to the input reader line-by-line. - out.seek(0) - out_lines = out.getvalue().split('\n') - in_file = fh('uncalled_genotypes.vcf') - in_lines = [l.rstrip('\n') for l in in_file] - in_file.close() - for (in_line, out_line) in zip(in_lines, out_lines): - self.assertEqual(in_line,out_line) - -class TestStrelka(unittest.TestCase): - - def test_strelka(self): - reader = vcf.Reader(fh('strelka.vcf')) - n = next(reader) - assert n is not None - - -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestVcfSpecs)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestGatkOutput)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestFreebayesOutput)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestSamtoolsOutput)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestBcfToolsOutput)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestIssue214)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(Test1kg)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(Test1kgSites)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestGoNL)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestStringAsFlag)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestInfoOrder)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestInfoTypeCharacter)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestParseMetaLine)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestGatkOutputWriter)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestBcfToolsOutputWriter)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestWriterDictionaryMeta)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestSamplesSpace)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestMetadataWhitespace)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestMixedFiltering)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestRecord)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestCall)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestFetch)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestIssue201)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestOpenMethods)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestSampleFilter)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestFilter)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestRegression)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestUtils)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestGATKMeta)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestUncalledGenotypes)) -suite.addTests(unittest.TestLoader().loadTestsFromTestCase(TestStrelka)) diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/test_vcf.pyc b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/test/test_vcf.pyc deleted file mode 100644 index de73e7f0f7879f752e416f4e66a73f99aaf2e934..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60611 zcmeHw3v^u9S?(E0mM!@u+wnt*lZ@pgRT@jOWXDe2Jgi8v;#*sGj+8icai?R=kv#Tj zMw&Bn%28mNOn`n>0Jxi+S+IDefHUB@BjV(d!Oe2v$6f7cmCsJlTPrn27iw_8OQ&?TE{8i zf5s^}&P>KRn{hI{ZgNUZ&e5p+0b?Uoj&)Zxr*an5dWX0|$Kw>lYbgL844Q&{74 z7FwN4c*7fnJ83>eE}L)sZt>~RXa5*3|MMVC{!F;Q_-RI%47>`qkN997)r6mCgW+!|Hf?i8|# ziak-q9ZsPuQL#6wc!5*6Em3iMRMG7e?nqR;AgZ|2DRd_)?u;s4=oDU3%?u#l8I)(ca6%RxecRPg#6BS3JibGCeFj4VP zRB_lT3?(Xtql$Z+!bqaxSX6PZQy5KDJRDUValBp5MH}&b#E^>^*?#^ZEUbsx%UCY$% zTc)mOnY!L(>iU+c>tCjBV41oD%hUmlmxRx|m#I6nOx@vS>h4*l?%rkUj)Zk!(Bs|5 z!NrUJfuHUSaTY6F^8cAi!7C{@Un`dU zB8r@%YFm&yedY9(8n3FgN&ew4%ZDg6bR$#4|BQ1{!aZeqZkVe6dvMD;3Z8&0eWpsFVkK5BK@Sn%6U%pS+Zx_WZuf zlT&>)&#x)T;i?xc`La_NZbs@e>tt#hkWQf4W0OAmcd{pb8F& zA*3QmRm?O~oMNWMDKsmy#woNY14(I(GHV@oTyr$Z4qNcc3DacXgAz>k#f*b-p-Y3* zr!>tF%rMOt(Qy+*nr2RTW?@YRWy9yb;XH*!!20NE5O%6(b=m6p7adIW_hg)MM^LgM zD#Cbp&pPK)t5f}PE+w8(YYPe~IpO)Zp2iw$fiq>tS$G}mhtIvrc?tt+hFBRq0QrlM z7vG-f2PNyBiyL@1x`7xLbOSkzt=H?p`!bfl2o~!&m)e{vN}{1y7aM~v;*rel%gnvq z!T&RJ2b?pwalD%_H0Ezc>Mi7FW=mer!QTD7Sms(g$_QIimFi5s<`eK98#;Cw)y21d zY%Ay5aR!eSxg5$r{75&usWl_v{ahc{%NM+=OT??KN0Rq_uUZ?Ko6na7y#V5TAz#bu zrqid!g`!12H&ZEBW-8U$3&lwl4eCB1>`1j*sR|p8j~zRuOzq07r-x1EOC_(MGWE#; zjy~dU<--XuW0kVk&5W*muViDaYK*{8qB7IT)xjBJ2oZ@mlslN)zZcj3ZX`}-duC_z z#-`1gtxX+B?`YbX+0fjU>B{WMOmaXRGiO!MzJSa(1MLPCL;`_%=S88E@Zc`u#_+kl z#Dj$!4MMku5PCL%(7CgKmXiUra7`PbrJvB^cAzE!BmDx2f&IlN-}8ZH0hzlEE!-QJ z5FFg?Om-jBkB?z${d|NVH9&vmmUy0Lj< zW}__$`2&|lOY#9^QkMiohZEmSl=WXoxC2cA6|&V};e%meiwdE0p>QH7TsUV7^e7hy z(*zO%T98?|DIhk(=Q_ArtN~?1&D^|mX5ltl$lcCUU^l30Q5F99ZwUIGdjppArNNT& zO~!m8NlXCxd;H6y0jwN zTebS&Xe~}B*bq1lk$F*#v5vHwcB=HL_pEoo$5U%IQhG|Q*-R4vYry7$*J#sge0rr` zqdon>c#ZYxHF%9B28-8N;sx;q2ZANhW9N(qqy{)fhf1?U4sl6GY$#F)_bpf3AO*dzxS?cRd40oB}Imi6&& zvby8LqN(Z}B-Fi$73_QRLREifAyASDSE@xwn0d;-LdawJlJC{{fT}lBsd=Xo^&I>} zb>6FyK!8Y>J;=@F>2Ysv-YZXfMx;}4*xirztBAs6Hwk9ipTn%Z1Z6&-3mlHHcXOsQ zb7S=H=1k*tgx!48h{=8&7pd4CbJIGJGA@pptYrK^C`+(k+4w?C3RwZgMl$A;Xa1@M*!yW5W*#1`l*o3~U6vh!!{itMg0Kr=4(mKa~D<^|1a=Y3<5CDC@61IV@xM@+FHEM(Q z5aQ8~tgy*`(A63AZj!tI9T+avt}I0JY_U8$U-Pq16l)iiU9l}%GTac(= zbV7elpRnp7mosSjF&RG|%KP3UZoYhJe11mdprB;S!{g%W!(PeP^)b7C*qtwHfgaA! zmMYX?$0sXQug29pUOr#-yaI4_sNzjc>9&)P2s2JTvL7_waZc7f>XBh}MQ!^u1aBKe z@piPEr1ZewX8cN75rqz|CC0ZPU*bRVIjkp*0=!|&MDu#BEm8xB0#eD;Rswts;wuQ< zA{&rS9-aM3j43cSEq*ClqWCVB%Id~Th~8kDiC5w*nC7_$Ijy=ctB1eZ??J(f0?W8P z?x%6t_%GVn!t%KAreFbw&%Ih!Mrd$N&f&l& zDMKZ7C0kS&2>`3nqAuJKTo0eSDG)9oa+rqipCBWpKyd;}qp*0|)UIYoB%7)7Ls@|& z`LZTw?mNSNfdg|LVS9+8ywNm3p$3s+Op1wA6l39IC&8sF8@k?CyS-_%W; zj(d{H7!$s{UeSg2XHez(%z>adZiz{S$t)8Z;Nrn6w}J%EJ%#Rn5WoJ7NLrg(n>Ija zp+y2IuG*UQucb!9Oy+(Jtm1tBisv_QcnV$O@V|nLcQp=gynPyR2jKG|hYxr=U^im# z5Dl)z-oe=65eGjn!2K>Z4hCM>OW$_kb~>^P@N;)Ng*)k@F32A}eTPJe9?1p0;`XiN z_I((-Pwjdtd`Yofu;K6KhW zi-uz4?n`+KY3M_b4Z31FL&rx4UH4pAK7868)O{nTPpcvRx+-}1%!vNdN(N!rIXN;o z2FsRkW9-qB%!=&<_nmy?q^k~24MQ|w4N7$5>A~af$gry$EwAeFK~u>dcTcLy9XUNR zXnj8J9#@mc2d$^a2km;?4Q?4cY4xrN9WKYr*&DO=?xSO>ADSK2kS1PodZc&(_2RIk zYaE|w+Z&Kc)r-&pwcEf%0?M+63Sm?PvL{Z}EF<&XX3*>jm8KTZM6*4Ue!=!E`sL?B zwJ8Th_Fzyq8o*Hgh^(^}Rp9Vq(!%Qe!j2D0_zb)#Hy5_JXL z|0aGlLXarFFRh@=U!j#SD9%9O#aqD&N_Bg*s)NK_M%p4Eas0xD5b z@aH0v3V+5s0lsEqfs_=0Tu=c8Mm|MU52KRxfYneeGzcO)fE=j7lER1&Mq}VOeCkSM zhv@a(da`%`;A5FNP|FMiW;W4HV+I_&7NYg;7q`o;3e5Nf?EAoxy@lE81AmDNi6*U1 zkr*nMs)IJxcKJabm2}TihD#McLhfD;d2{BBw+<=h4?lC zLU?yz(c`nmr0s_`n+RsFWz9MLvlpPP7E--ymr=bc&?*4`38L0Fb+@ zac=&6?__1B?;><)e=_f%uax^vUx5LyugEd@eHcYn)Q2k_K^D78g)HO1AZ%czBzho) zawnn0bYD^D4e2!FG>smJ*mmMm6zLH_J2YR9P@s8){r)fYh#XG$gK*% z)JSj15_1}M4#P%{L--OZLNWsT+~T>qhj(Hsq-iBXLYA7VP)woq!|;n@XWev3QsVn_ zDjKHEeFw`l-gU@b&R26Z>0H05+KHz&OjS6Dub^t#$$F6YE<0J7rKat%pn&O%bFJ=M_NK|3w?w7fGMmQ(@~NcJth(>l&cU{dsi1Jczl!z$S#! zm}R@GhlT8U>1hk0>_5<|ZsHo`RB1T5T%j@vQ#q|D?k_TV7n5H?5>pW6R#NbIJG%cn z{EF|i!W7W9rfqH8I*n)o@X&v0dJ@(8iHJV6?}+F>BiR&mgqdavsZFSk$PNVn38~T| z6QE)14J4twXnK;xg7gHD7$nz`z66s@B%Cg6GNGWAL_G?>F=>_T6JsU`@11^y#LVh> zsfNc+xhDrFit`voY_FoPig=#ra{85pTv70KDB_ni!akT4p{UR^qGZ) zG@AhNgZE0hGOly*UQV>|ODd&BYBtjU=V=0Kb;rS+Ldgn=+}B> zpdi9Bu-1>D$$c-n8cUVf--j9*SWRC`!AYTe)q~3jrZoJl^b#siM1W=CkvBz13b5MV zv@JwZ8Y75MB7f9Cms$--5KlXtVK$J2ibcQ@Ng2<;ht8-rMk8*M5lGJOAns=Fs0Bzt zlUMX~hT<)VCAwSVEKE61uAxzg9r1ny%fbAFO-e95Dt5N|qt4uSIk1ofg(9=nkI}!MnT|ouzKLe}ic=vj|q5pa$Mrp$}he@34{zSD{t9j*Y zaVpD_*{bIw&;}lOK?Ho?vn52&W%K0%>LV9BgzaiRTg#u%PF~1Y^OH5N8up7m6)gu3 zJ^BP#RdF|d%av>}fT^NaD)>u*n7o3eV%bBVGsSYgR;l_}NT*$tOd8PMy^;<04n6Fi zIw_D;i?%Vdk#9rmM9?O07U-S9t0Iz@h7-QEmor$D`rv!srNCEEyPPi}ct|97wuIRs z@A7N;YRzYqf;kb^q0B26RAT6mMTwLP$=sFsnx3f#Ro!1jrFb{Wb0FY)CSP)u5y2jR zI}w4j%4yz}Y0KlhaNkaHJPuXaoCut6s^2?creW zbZt^fD0^?Oa zb_$Qra!*25Bsp93vjuOm1ZrK#=KX9SXm*n?z%^NU!h)_SDfrkfvoGQX5GAr8pkN|p z(0*`(;-q(HuPp7>M=tN@_^?Qh7&COKr_|RCh2)16xYQ5tScFxelN%Qq`TiFsZ56@g zchUVYM?gewZIYNwV4)BHR25rN7DLLl$e#ok@-k8jfy@jt(~vAEcTz7Kn*{3QjU z_dIOWu+2oRVt`peWks+7q~gY;oaW^;0cRZs=&ZRNk;B`}zDUW1I z0cVhG7e3G+@4mx%3ZS+&A@6=nl5V>SAs3rjVV#8$OR#0MF22lj#-Q+I*Zy<>PM);VmOeLsi5^Mq0*a2BQUxIwiz*dq>Efa6SMX?(76oX1A zbDNPvU^`z{HR!IvSvqJ(eJuy#ODS}}#&-i`g!1)TWcThRQ@GzJ={P=oznp{u@qJ47 znzSvCwF+LO^!}yAZ}->Hlgk-&Kgi@mOg_xyBS?g8`B`isEx3P-YYX4bvU(4bXPJDI z3B_plx0uk`?EW?qJ$lOh1hT7wY7&C6|I_gqR_V0X3D9sOQ-ppY($>s&5bgNT5sFkkP} zp_m!Sm_)JA)dS_Xlge?xPom;hwVpQqQFp^y-4N6iD6W#?jrlu~a{E>f{TDrvMoMWz zO4qRyrv@i-{nJl;_{VST`^%Rd6~GNWJm}{71wJoHv>J;m)2(Ljz{AYMLGIfqvk*d8 z1rDW!N@kg5um#60gCB+44Vj(zccan#HjE$=4}TdKORd$@i%c6>3U1AVEyvHX#N4l-cfkaE|B4KUD|p8!2+d#0+3tK zX%Ku+W7{kxavS@ymRVF;0%X@{P{LdStB6gYVEeV0>PRntMR8UJ0OOt7)a$!iNY0!1 zd;`%DY?!6MkM(%7FbxQNN~`F|AP3i~OOwaCIQ|VN;;Oe{>+Oa>mEYX7dlB`aWy}3* zBr!ZHw}Ntr`zdr!ZeY|W0|y0_7g8UE1f9fI=@U@JR*3REgT7Ot8S{cz)PT-(Cdp44 zk%5V=lM+Uf@W8OvNefzCSv$&XyIzD7=A5Pp$u`dk8GE=TyoWkxL~>5Ph@HJkU@s82@C7^oDwj24IP;;R7V9)-Z>BHW@p@ReW2zt3|)xQ;WU1uNwoSLj< z_aDygzxPOg|B-`-vqK}}6WM|N{dae%uT!&E(aa@;>LO~WcP!Q#z3Y0~^2w9ZGaaqtaaQj=# zqF~PbB6EL-Bn8IYzi0V1z?b_EY`76gJz%k9N&4&lZ`Q^VUkq`dWyR;1i0pF7)5xy- zc~+2}x_`xlKMbI%5wJc_#P)A6yw`GgM3L4EJXB-_B)0Kp zsWY;1FQ&Iwu_t-TwrXhX^AJL1HuIYdnAn$_k~&_V!P!isXiSD4dzp! z4+MS>AS*CM8Y6DwK7*(E{|uC5${vtajEV%JiHRRF{$AWH@ndsD_N^4>rvUqKSX{si ztaOV?w=|S)Rq0lhE>s*?mWb5~_Z>d>GKoBG&Qrj3P!RM3e8w}|nX>nVdv!;BX(%co zViWI$`)+Wa#NjI2ohNmoov6W+*vUPdF^aGjYd0p{Kipp?G9V?bUFG4vN_niqi~H~M zZ^NC(Do`@B1)Ny|n?}BRg<7Z?QDKZJdq=Y0x&NtdVQ;;$E*7;KQN3Qdi}zgEmLA&x z{y99kar1&K#-a|g!`zG}-J&sBHr~VJStim1KhK<~!*4P7+e}0!A`&4vzNF0^%2t(K z6~Yn4K@0od1@yte8Ti4W3`rr){4IAOL}zo;4ycUy2THP|rE8I;@yob59;tFG$%em# z?tg)!Y(fT>#$EVBGEyH?`W#6Ktz;1?c>qtjUOXI#4Qc`zPKOxPBRy<7KqR0c1Vx#6 zkcQ}Or9d?ilKN7S5S&*eWCeNyg=3~|=pAV^=m#1NdI#~a-ihA0qrNmm?}#jbAbI;jUNV8%@aYQ)Q4RtPyi$J`|*u$To~hZ+!%t9UJJ zIYKx0pLoYVBZ&cbC1I8*@yCSOEHaIl)e&OU^Mg-c!HE7a1)mIqh9lZab!d{q=MUHE zAx7w5g*C53J2HIPUMRC&Cw!`7&6Nh${IW%?`R9dUfPNSR%%}s{BItv8TS!C1yv3^h z&+}Lls9nG=Gy|KiW8MYIx@~ydCC?~HGC2y7d-t9m89qMhj*RF$jrj8Z`-Z)0@v>LA zziVP12XuAq!(k!Qh%6}G-!+OD1G2fU2LeVpK6vusHtP9(Aa1NY5jw1kLYXeEAP>iC5m$sd7x>=hC?cBZ=21$~22_=JI zsUDwQQm+?;j16Y@ zB7;ohG!um|fp0q|+X_9FleOFv7Z{htp``^)+UC%sxXHjr0u>4VYVSLyc8YN!#>Lj7 z83UKP;$Xj(xzb`#AqE>8`WlCZ-$b&KyyL6vnj@hP6v4Cr+Zsh$0uE_1Pu@EdP3U3@ zy%TL4z~`A{P^}Emqy_A#CteytjlhARKwuONe$On3s_!;7Lo__z(ba=$!CT@?P8wMXg=&&@U`K_-mz4}uV85pdU5w5fioH& zfr9BCocQwmjGZmTCl(OOY4IRgT*K1;tKt2_bi+b`{2>#i+hEAjEszC;m+Qu z2l*@J`uE%4yZ5J`QzXC_eWxi`nyx)grxjh7;Hw+>U=n?;D9`q_6}^?PLyq9I?83ge z-T1}!$uvODfM>2EAb$fxxVa9HDKK({Tty=<2H=etP(<;csozO~rDqAk=bDuPrCxOI zFGOCpQ6vL1Aj|7i0#b}G51<5wt9E4|1naW{_}l@a6J{*w}Q7d3!lE(Q1%SV>RHE#3@1;ZL}b^CPo&qECrmtY))G% z!Zk{RB3#&3q4XK2Kw!J!>g|D=O7p7fY{mxiqq&0@HOBH)nXLjNW~w=F?jUE2V|B2- zKZu6nJn>hMOGP3ba{tsI_Y*PX5=aHSCU8|B5zH!Z7Bpac0It+`t(DHmt3Gj+R(5FK zTd&eeXX#acE4396BzPiD?!zH{xCAa?TykE8<3g(lliKjssq0$ox<|oNsCU*KExu<6 z^3yxN+TrNf?Bc6Gxs{Ps`Z=2BQ4~rL9dcDja4rRA;Zg$zx!gD9lDMui97IF8mvA5r zmRJLG>}Ett)c;0Qjl!v5yZlBa<=QwF?S98MX(Dsp~ifmko=+r41cpAovq^8~{!{6N;h> z=zGy-BA+%B_>K>t@ns4V1vCZ&j%H%+4()~k1Kq5KxHPcE0Dw;Ml%XO1o0o%%{xv{u z0HwPOgoCTEJSbR>AUMc$92Inj#g4#S2P!9z#KlQ>#ez@@7W#JWzlx@g-_Vh ze=Ke3?L^TefdmLH0#w6*h(Kc9*QT_>=L!HuKN5m7$ZI3O+o8=L30pw8ipg;d?fCjY zk~l{F1n@0}M=|xP;I->$04ujOfLBlq!Wq%bdZpRQerVaM1f z7b9VXC-szSJ6l{G`nfg)q1hs$VwWPEH2aZ=MleHc5aFbtoendfH<pCla7n159``rL!YV6mJbTLp>YEb8>^0Ca9JXbP@6LfGp{qgp|uY&vtMUHSs| z(^Xz^Wx7%iXlWc;!WwQ^9Uvpw6rHLc(#&FjBcR=u-#$$_Q5U%)+zQ!>@%06s}PWq)sXfr!lXl7nhuq0fkwtTiPTGjWSXd# zrdFBXUJi<%MTZGWb(EL1aT{06@^TN8E+%`KNbKWns{>JVRtlo*q!p~Squ2&%N^rOH zy!0Ca>5p)f{1r^$28SF#M2rS%BVuOf0Z)M(#S$DOsNh#fC}0}+UreM=>x3;+sGv8Cj}OxQk;@%i(9tysecop3fe1Ge0E zGSPhU4&x9EhFG2HrFAJWy*UJOk`k`u- zM68HlKOd_ftxK#N8M%#CKc&UD)#`J)G1J&)Uk1Y_=Eoqw)i;XExos2>2}|Lfs{;yj zQG}on5AfaJ#_*6rFB;$>rNuW54^baUiExFe0eKu&6&@;VVXT7&vfd>Lf*b;N-|D~u z_3{uF!omIKbAg0UFDc4hJ6`~+Uc?t{okPBm*22~~qzq{-jOvGc0qRCf^#cQ(>8c@L zsB1yK5Hmb&W`txw8~GPZ!u<0zrN|VQ$TWh$nnreJMx2L3<4H;jQ)@0R)50t@uU*t) z4nn8dGEMP$*D@_Sq&%6F3e7AU2l~K&V~NYFMLIvMK@gRzSiH~7GNd_4vy6T0tN4qz z-(@PXf4TUkziV-dyTAAsPVwu1@_MJZVenblF#ix6V^XX&I*%+Ssj0k_r$DR@(nP#8 zJc;a&h%vChnsHxd%0^zg6Vaq*z-+8Z=d{-epR_HEZqk_38n#6E6k$u;!muU6C#Wrr za+ZPrHQfKD2%mN&T15CnSzu|MPBx;NFO0JMWf`WVS_G~x`yM83mY~{KMKSj- zG>j2U@o@;oIC662$l!@bg>O38_xRX2%TDwQ`=sa$KYChNX!ksN`pCo};y6yGA*Fms zL&gjrgzvqqGZZ~_Kl*#4)X&Xm%k-Z>TP zZh@2(^G0l&i2TRPF?}=phL{>FVKFWn`3NyJt%VtdLrhI;VH6|8)VRgm&d_~f{1um` zaz=y>E%4ts-zH(|GTbZ1ss^@|_JLcu=^8ktkT)#~&{!xApS>I-k_5#ibqBY9)zn8B zJ_7a8zq|>A=PLY;Ty1Hdx7e<*G{0L>EQ%I62DS!GBBjN(Y7!9^MSTEA0z7NLqGXGD z3G+X(C@K7X>sS@FCq2=MSaxcSJDf<9G7a4CnL9GOgI|k$&?nRTZLQ-*2Q2@ zaUUjehFmIc5p$`nk|#qhRo5coQuN6z^+9FnSjC@!qGhZq_xGWiHS%|Ly4J#*1BI*j zHE3Pm9OBVR(r5ss+6Iv3u`sdii}vqSZSByiv98FyV1qfaBDhuO#`-30;x$Bx12|zs zKn7|$v~H6IPdUIaoYWD32g(h*rs=q-D>td_m2{ofm78YvLk!wrdH7`qAPkj~U!v0^ zXb+hOJSalfzypN=$?*aI6qQ0^4sNkSNS9Vvii|FlSTl_begaRrT^)VBxjc(~s99Rt zX+iBHj}D$tptnJcoF#N$G`gnbN#_l7^YCLZ@Mn$+hivZnFbO^wjFZ1mYWn|5hN`up zQ`yV-)N)Zw?(9dTS7c@^8Xu$K;bs+HiDc&&+(OR>a<& z9t)3V82I!j{s2EG4ji36z@PVyhQ9B8M|F6M>&<%k+E8V-==sGLqU$32FVcP@o@@2v z#aDPW)=msfObjyNU;H97h+n%3%2+-)q>v0Xii&IOwZ7<@uJk+|ULKCNjDvOkc|T3@ zwSY=`(kyC@E8Sq$cV9&ND5(a{R|M#+4s_DLYt~$DhzOS^XG;SJioQ3W+0e8Z=BSQD zDv_M<8O70^U~d4k#UVud&GOkT%O_gE8LvGrOrb%_Sr7WgOp=N~_f9u^q{Y{0DxtO^ zZuxX^@)GRk99XH6FZjw8=4WR8#NL?}b!L?m-lC3k_&iW98bRX0 zZ{|#E8$v60eyzo!Z9ymr!6|b4pXTccSicpwKlmv~=+n)C=bzL*;rVxWVNqP3c`UF0 zV3GCOqoG`pN^;|+XaPs+@;q~QHxu!-Q^+OucW`-DXO4HFXAy0M2~uqX;As-q2B^u>7}yI%zR!6Hac4DwnW>^%4;7No9UZH-9w zm3+oE^(%EIT4>t*7BBRnn3;@D3~H^l%mLLqd==~?+7|^QeP)Up$>`P$0x5WoJd3Ede-%;ttbI(Bng6rbzTenVY?;_fFVJU zUb`r=^PZUf2{eW#Mq@S@0L#4zU`b<#F|ef7KL5<}_N9OY5F$tkndTlao&N+E3j}Ti z7fcO~DZmzQuJ+J`{jpDW!vJA0BfT+b*q;CzmfNLdsQ8jPg?&s{FcjB5|3GsWhPDia zfn-|;I>%NXbaEWQQj|vL!2>^Gg@E9N^l5xhYx!7j7%R|Vc_|@Sya7>#;@2Q1plin& z9i148$wFdfV}#dI>XK%RSaQ>L%iKdag!mGz<52|Qbyf_Ql<3X}BfG=}Y}5{K2}KC} zZENb55PFiYH^!umQq%?}o0#y^aPBrHJDBWbax)X|{BXON@ask{tsU-uCId|PtpoQk zllzzqGkKT^m1g%5CKF5^WAZo?9`WwJjLCT>7nqcg#45FND`*OKo6!ATz)}AQUK~fa zuf;bWH@EG;@8-7cZCmtrb6d9U*5KdPwvM(|{B8;UZEw4s|DvxZ4PpQ7B)ZZM`nI!= z_95fp!~ntZGsu9;g&&24eV8SQqYSXqpRg$w%?xKywSF9kW#qPGFY(O}y-$u56~c-UJOgH4^rg_aDaaroTVIgitr zA^3HgalKiFdz`%9;_yQi`xg0pN}6bpE9^tkRwU>(fl0q?-C)LTbHoo_OH=b0ee_zI zT3EwBE!{MTUcdm%-(>N880)&=e>_$+jhsa!cIn{2UFxafFQk+W{zHR~pJ7GpK0L}x z(#!a}F1A^Tz~Wv;g>3Bl*0^n;U1_vekeisGebD@S2{uL}8Q^&cys2>rp%z(!6+nGFb44;+=w_<|EktNLC>6{5D;F=@_Y!wCkFChg4keJu|`$d3s z<^}xSX`qXy2Dh27>2iLU|dL+w1ij%{e_>`@B zbMr-fS{0{j!_QX2Csm>A@My5pS8&K^ujKg&G(6_jCNC_O;YP7i-Zjf`0IX-w7~6x_ zC?n`+$vPh7#8nqV!HDBsnWQ*Lxdf;MCnK;CQd~}k(s8*;#}wvWJ5M(~KIHAb2ltuW z#So&zS6BD2f{zdhTNQHUUPSjF;G|R0buyEr=!9JUm9(`V8B!7oR*@j(h>Rfa#bO}v zii)D4Pqh&HP1$8kkz;8=A9++vUQ^-TgL8wziTs#aw} zYQ&P@3?>`lND#|%IvmmmIbHb0d6>H`s)R4f0!#X;~e=xVeW#U&vJc-yN9ssoPSAG^0VvR-B$n>q~jV(dxDo}X30wOF!{QHN@JDBg4H=* zcJt+F@1xPHXLeoVs{;d;es#WO@alUYmd0=GekWe;`n~X8jDtibe&J)4>RBB2aKbB3 z*Df3{l0nH@~=bYsw+>{23-$}-`EtKyMCrjj)dubQEO=fjjchWz!YI_ zNdz!ZrcX?8BKG|qJei7zQpM-3Ja5y#DVTndZUNdKaHcy@>;TZVHSK~ayhEwTF7Yjz z^#NQoOeN+kiEK%EJiVG5 zm#&N>wyube85TanNebg%T4Q`9dlEp>iI$ui@S?hTffYibZD4YQ8(8o|n#3-WG%4jU zv*!(3LJMdxMT4ahXKCmHlH*gHAZ4Rj`YdN@9p1;uY?VhvXQC(0fh7wRsc}J=9Tzj? zxc`;OE17&3l9u4xz>_WEQpr*r8LK@zI<1AkvoeJ7$vC9%K_dcl9EK z=zJjJ9|x;JG}xD;;e+r+M33vJ;opYL!p(KaO>xu7gs-wAcop6;CK&?XVXw@{J<@Mp zRx{d=(O#DqBrA$2+t=dP+uhW7sJRdlw90W`#lhjeM6!~|_uc6JiyR4wC^QbBp2AIu zbf@qwRUB-7p;GWCIRgHmx#8U)G7;WEqI()R2vjkfFmzJ03Cn2sjHwZ(Pk=?6J|Q)N zPu02SV}m*nKWl#ng1-kQ39bB%mOWN6@K8fti~GcEfp~#@*TpQ7in}Czu55eKXCo(< z36b)QpvB4yksSEc?7wq*nRQ|$M3F(Ui%gOL;Vtk#U{PlMhF*c7O^bvlE7L3ko)O~8 z*m=}xuNG#!Gh$wX`P97=TtFlL4XPF;UNd&abM|4D6?q58Z`0MqOZ=|xP)E}&>HX5C%5XBCrSHSk z+0nk2`1aRhMkxLzXQYfTn6Kr05Pof^(E=2K z%5|B9Fq*s`EJpDS)>*HxKAw#P!UYW=6E`8$}~!O!e+v* zD^Pw7;raWS{5K}AMH1t+ax2MbUXAYm4N$5W>Q;Pm7INMi{I`TEOu?&(a@p5Nw^?M{ap}+0$&^%P;lXGLjZC-$?+$7YoyPb9reIv>?2Y;NVLY=o zT7R;N4;1@-u&xE4PzjFH@14DpMPVP`vM;fRhLWr#B>#d}D#>@{*9w*STA1~!Rk8uo zB7(2v9Fd=5|B--K_v^Ahyd2QwKzMmTz^HvSIBa3ITAB2G+dy%;0&?#jMdylVIDP!| zh@4xKm6@6OvcBbEdoakmt6pusN-5iO>9Do_W=qAIJ{gj*uaO?|DeklEm{5dQkU9|= z*zkHWyssdr%Z$ev9y)RSL@|VGe>luIMuoCvFk$?#mK-YBuoplrL=SviKtU}8T*!;ITMyss zwiZBXegujalEfZ+15ZTAgG1g6@r z6Nr@ZaM(BQ-pEF8VsaE?aNo?_4>A!$`|r%XlNAIleVI}?@dQ7H>VA+Fu`nPq`VN*c z?7}tl>4i^90f z9FJ!Jjy10EG1!WogkvZVfNX#=iL}DAL&MK{yy}?dZ7EXe{wSB0Xd9?2iTnZO?dv6e zjq|u)M6_7O>C82QPCBRT(^lbUPS{S{8wFybQ%QChi=85kzE=xw^bL}EyZb+p8kiD@ z1$l*H)to6Yq;gdy$cx%?oHAY5fW3nIR`#-ojaCm@`PD3fUGf!ARtobaua_XJFotFX zFu>fotw{je+>9#&+6JjcqX(a;u|wkrmx{BGmhl-kUzf+nbEjW2@$jj!0r!9K-F^&- zW)T%*rzTK&`X%nqp)kfw?{W$A3%Eg5M+yD3Hv(5n~c6Yr#_(lc5Ghr=A|Th>e9_#qXc%WjHT`v$Lfu2Hg)6_Op1b)4aW@ zBj7>!+-l4Arj5<5;7FUfbG@n4ou!xwz!LEl0I4fv zGXP5foV8%#>%v0H+#KVW|8k_?B*gUeOnc=DBOf9-x_e1D%Fav&u*B!#;_m(KFLQy( zquh6Mz2Cz`@(VIaScxG-P!oYkEF>#X&197bIAS8Wg7if zPxK$6QkS};UBZBf1&yhq9p=f(@^TLol8AU(R}vJWz#I)T*MI00oL=%p3wVuq6N-&D zeFhnf2eK4IM~G`d2KZ|wI;I911SvhBUBug>OUn`+|cguOP9uUHjqVu z$+0nnK?$?y0${6l}uriPUa5H_fn;p+R0Um;JAYw3JcTmQ0jc;xT>`qTM#t2@7 z&#lJV5jYZ_|EIz8wQgMhF?}wkJdY0_g~TB@Qz=)tf?_4z#1A_=pR7s-ZONJW^Z0se z?LvcbJHZ|3Q!}eB&1h0;++SzzH<(DN5kDbJ#B2jI3&Q3;%QhcnLZ^=$C$j^qC>L_D zBojGJ1!v%u1P)VS`oSW2q{&vrZsE`fTy0qNA;1q{WD<>38^cT_5<);n4vNN2Ld3P zFb)ZhA>ofv$f7i4$J|Td2NR@BWTlj+;8WnA7IQ7cOoK*+c-!cv5E{uvPx(pz%W#B9cSen_GzdIax=EziOsAJ04q zT@hmiMqO%i{0C{<0AXY)M#|E4j{kU2S_Z=6RtqhDvu+I<;nr6qZVfubt#7Ws)eiaE z((u&xCvJ^9{KKGhZc7IL&p@sK@qvPef#D-E_FC8rh)*;k2pQV*&eu53tKl{RJ?n5@ z1@Z)yH=4RFF)fP=w}ypDDA*Pj0t#;6{4e}S%B%tw@Nvf{xf4I5>Gk93rFty=`l+?f z!s8AYA3py`jlM`pwM!n2G@vjm2l? zW}D845Ynoh9;}KAr${;(%g{w~2g%T-66|`lYRM;Kc>;$a$h?h+cRMoQhnKLx5%Cx>5mI{*e7;{ZPe}>=M=wHqtOiI9 zyO7CZC|@)tfEhL)(f5G{<@u@8P3GKj56s;UE;Ry3+JY({x`cKXbm2 zf8gDuTX>}7Q$7qtg@gO~0bNf44JqXVoXwQ-11#5BE{6^sIyi9m;lqdT9yomH@S#Hk z2M-;p@d0RnuV+r;y>fn~TFYJXt`s>--5p38*%X&p!Q)!SS_K->1+QwtEu|y(vrHnH zMHY^k{H*@sgXWrVeCPnT30TTC&8vrRUn-u!4yy5a_{CVIHbO0~n-tg0A_&q9x%lWz&PvzSQsETG=!6&J;mbTg-$DJ!FNRj7=S#q}C z$Yni-5(i>4{^4|*-7xX(!oN+K4yafx>juBvfsg0L>CMfzOZDPCt(kt*bm1d6J1yFR zuSaP^27R{|1I9_k{HAxG`tD39MlxiW*glUZD=9_MuFAMWG7 zpqGiP-Cb7~*0QO;42i!W)Cofg zv%WCXM>sn|rm$y)SY@b!_N#*>9NdSAB~mq$n@8b_*|kWH{4_@7{zcueR+=umA42!9 z=a4v;h`s5N-IsFY=-|YQ5qXoJe0{J~oGuTR3lmt)FfhAI zVu5Ti4R-`B2FozG?U&_rK3E z5cpb~YMccrLuGzH*DH($_O2AgD2t{MG^cJU4sF@AhO^TwM1rgWgAixQtuOPzQ?lK? z`?9@#y?18Kvyu%pX}?#P!3m<3LEP-c7-}kJEOa#i1BTDtNN3fwY4%I)pG~V?qg^2{ zrfQW|ZF|oyQXWsMUaPxb<3Qpj)09rbO=R}H3D`0quH!5062NIx2vjvxKrBav0^gx{ zB`Tok=s)*1nmR^A#vO95@k|@sx6@$;g$OplYon!v4)=rych-*s z71CwcN8LDJE=eDU9?ucr-7qGNAR1iSQ0y>c+X086NDi_4>xY6*+T&yP>bQO=HYMBj zo{duyJ${F#1b1VjN^(B9w~jP&y>n64qYR!f-c1XIkKzzS^R*Z*BRI_Ft6ml{3A0`m zo*0~MP{2N}TBSW3{9vaVL{)!ZHrzJ3FRQNx!_}}4l&ipUA{0DZK{qv=TpHaDT*z_n zeztP{BFW;E2ajS9zp8y03@*^1)gELS?>G$e#DIJWH#-f%cXz-69-l*kUG+ ztxdw!Vj0ei=tb%~4c{hya6Vf?#02r0LwJFoeFEO>Y)M;CqI_?kEwBdIDll%3zzpp>ofE#Sx#g<*tFZXR&MLUXz0sp~0)^>lN-8=DQypxy0 zkG4x#%b?f&eFG9Yv5B{DRJ2(+Z0QxRau4FJv2JRtjXIFx3b-}blnPrJX>j3d%5fNj zLcF_7nvrgU%0)#+;?`uT;(NArILqhlVX~Gld6_vr%Ka-QUtsdrNLGhsNk9Yv*VuC5 zGJS@8g953u-nOmZid~tv!qeNSf4$I7EY~09`pij04+w5Hdj4f(Qt3G~!Kcl{3#tbT zm`uEoZe-}nq#1f;xq6z0-un&HVY8JhGZT!vNM>oU`Ip8W@|S3-U?2# zUDO;lVGvBU?L*hk zr?r7^#}y9-xC7IeaA`Hl<6l|b#r!h5zkwq#dA$1pj*h{Tx!lw|!Y934&c&7E{yZAG zzk)=Tu|Zf-i|6NS-bl3yQyuXu467LseibS>&mNA?wY*op=Mi>*U&nnTd*N#PS1hV? z_6o#s!O-!US#+mPZEc7jb_f-3kj|?Q*TZVSqukwJWUr%a^e*r zGv~@*v<~&G9Kz`rF4au;6q74VeuBwQGkH6ccQg4FCLd?=yG(wM$)}k74U;c1`3jSN zVe(Zb|H|YWOqw_}Zqj#ufeCl6x!=v?)l3-W5MSfDZ$_b4Ja5DCNpd%mlytQ*fXM5-Eot>T8&MuT}NBQ>7O`ZSY p{D(8%dGFRtXFqOXXkyL>pLIlT(=wc%IEs;{{bv+JUajY diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/utils.pyc b/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/utils.pyc deleted file mode 100644 index 179d552a0655c188256e0bf9548523318e0d5188..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3677 zcmb_f!EPhR5v>_Y)QY-Y;KcZ!W z=J#n4({rML)eZVQ;=kzZqDvbgrb&y+jG`#2WztQV#pK7h&eA3=H|Q#f!Un5`%*pu< zEjMYgNf4cE)2A_Ae8FqVzeQn_z9bsLu?GDX_L{r^Qzx~}Wm9xC>G>9Y&h9B%ZqZ_k z(hb^OY{<_frt)ik$9lh}8c#Vs-LN)&Fb#&D|GA%0wIg9*G0+iMf8+Qb|5>zJ0? zD?>2C1|CF<+VKYwFKh9daGS!NmA~xr`Hy)SNilA-bWl1fQxH474(&cM;%;})UdS*mf;KkRT=pt25Tw&xitPIo(QdjKN%MgW5 z?Z{I&mgp>lV|fM7b3HN2SBQq#u*I|rUTHjgR|bl!^M`6! z6^X=NJPU9Xj;+EdA!1kRJn+P|GFBL>X|~!@q6@gfKBr2vAe2k25|>Yr&SE5cV!J%% z6x>i%`-O!`={$b2Y@L>lk~G$~>g{=T$*HmktkFm+BNUh14UMbRA?1!etBa;>Mjb3R z96qey^U4({Up(6KMHxb!&ips@)iRt^?0KfM%J}^Q*_6$vnN4hfqSW9ZX~`J% z<-9{yZ}^537>S9uoK2{%V+nsApj==fHw88bE%T}6N)jK{|I$}*-L&C0M3XARIb4;t z4f`Fj9KMU=`z-~KFgNfO<2uFVU&Rer0aWIDM8g<|pCz8OSq4Z-bo@c@!(W63M!)>9 zo&&coOhKk2;N#mP5sO?5KSBjda9 zuv>w7diNkD}sp=hEo^NpVd|v<+s0lO#oe^_D*vJr*VUfbZvZ*Ahtu6=#h@Od&fBsh+v7JP8W;daMvl$P+M?fv&O^YUxtf+o zZ{oqT@g`Z^5%4ik@3;F^;dz>7}i!SCOm)azNdWZ~w zk}=wdrn-Jb64ffd-UP`l@{xNPmAb%wIRKd{+D!QpgBALTp2?*K#E3L|UbGd z#zDN)*#tgex4;FCp?@1U+PM?mjkn`wbT?{5_i?|6aU0_w#qY#-qF3Ub_}%DX%(Jg! zHsLkwH0SDPxcpynLuq>9@zaq!oSg5{Qo1EHN&FYnZyL1AwEY^_Zdey98YJ$Eq)*`n z0%a{d5?YuE&f2G}`Sj`&&Nn8YMoD+@fgFQPLQjJh1bqb>qTNY@N++#R-Dmt!7Ox$G zU2zDKw-r0`Cpx`wbhe(q_hKHc!2Me0D;y!-sPCg>1!JC;Hdp__)qq?kE3XD~fO+m_ zjQossnL}X#=fDj)Sl?H}p}hhuqrntKnE|CSV}J#~=~x22LE$xb0U+UItV^As>X|rE zoTD&aG2SV9l2n7)QA0Ce=yg}YjKg^9)HKt;T=10zTV||Sd@{rE7O*;q2kVaHKnln062h;-^7d`vTY6kRuBLqyn z=n0s`y)E?sL<6oWMAHi%T@%}Z@SeHSpdZ75SWT!Do!CHoZq{WfQ}xl&kqXEU&KAeK zU&p+?_w-Ty-8)dL@!tORqF?bVnb|x4|EeAx^M}Rj(KjA$OdQ{^@@PG``dvRBugyNO z|H8*IHVQIY21fa3rN?wtOK&cF)fE`(NqGU!K9gDl68!zg$? zh9+6hR+1WWFnTFyvjaWAaS1_|b>QUCw| diff --git a/src/vcfaz/__init__.py b/src/vcfaz/__init__.py index 3ab3762..8a1acd8 100644 --- a/src/vcfaz/__init__.py +++ b/src/vcfaz/__init__.py @@ -1,3 +1,15 @@ -# vcfaz __init__.py +#!/usr/bin/env python +""" +A VCFv4.0 and 4.1 parser for Python. -# This is a package for vcfaz +Online version of PyVCF documentation is available at http://pyvcf.rtfd.org/ +""" + + +from .parser import Reader, Writer +from .parser import VCFReader, VCFWriter +from .filters import Base as Filter +from .parser import RESERVED_INFO, RESERVED_FORMAT +from .sample_filter import SampleFilter + +VERSION = '0.6.8' diff --git a/src/vcfaz/__pycache__/__init__.cpython-312.pyc b/src/vcfaz/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03cc7b62a10aa24a69780715cf30d3a795933d22 GIT binary patch literal 582 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 Lb+K5&n)`nN0>r^{ literal 0 HcmV?d00001 diff --git a/src/vcfaz/__pycache__/parser.cpython-312.pyc b/src/vcfaz/__pycache__/parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..19570c0146d809be0ccb48d420b877a75e420ef1 GIT binary patch literal 36469 zcmeIbd3;;feJ6S^_KgHUfcpmS1WA#i_Fbm9Xr~q`vP~~E1%MJMF7gGa1qK}@O+SGg zr3USE1Ul{rO41sBPCsF$OVmlS;o_o&k?C1Q>Z#xHnm6vDW@cg~aOL7sgp1{LhB98|KmYEZ@A>OnPoYX&v!tsT_jtr+Jgbb~sc(~G(22lenN z-KufpglW*klV3faH<3S>KVcp;Pgn*mEKGwi>!5X_V6b4qHfWo$588Qdlyhs{x>tF( z-fe(uberJjF@HYun^~;IZAEwi3%4=X&O!>ATf`uXS$GL^OIfNi7F$j(%Bf&qmCUVT zZZ(5)uoN}Stz~Wv<~o_%!rWHowvqe0yj$lsWc*w6y7qVZ!9tYZ z&Y;9LbTI!~R_{*cU&qQ^&q6jZ|3>C+V(w<N!D!xy=vipX5UP)h}J(E-Iho zE@a1eA0MCaC-!gyJytp`;bQa zk84VBCv6kMXFWqMgt>=(!$ZF5bK@STDw#JlFn!AF8}&{5MyDo|`k_672Y{3Aq<_`8$Z{gXb=X^()9zNETud}`PSZ+}v;=U7tRy?<}l z@uZ?>Pg2!4K8yrCN0Z9l{+^^_-#YxQPbv-{ODYc^Tboq$4dy?9LBZs?A?C(zM zPj(&J-_v!Xw0gs5hxNdI%p!@plZZ$KO#j`Y7JL-NGh}UsBoKkN)WH2U!0xry{A`*L5_h>Vk^_ zHH?godq$>&3G}dz{5``yPf{;hmDG5rrUjQLsXgxzyfh6oeWT+(k05*wwGy6S zRqGn}A($2KREZHMDfV$0#4s>Cfl0**QYE!s_T^3LPWy&V4SPMJk4p6>^$0t6h6QT6 zrzU-)r<0m-&*W*}85gpXpA;_P?jJ|cm$CnNINEct-|&OVAUDFh6<^X}w^4qH!(O9; zt8uI0YTX*RI=2?C-mQacaO>e3-3GX(Aa{`;%p2gG#-x4dylZ4=!s8oetAZ^a!QXzA z7Lmhu#^XpuIYuYh=NZp1)|_K%#4+qR+1=-$acFnZ;*%Z~JcJwWe}vHA=C5%+DTeb& z?coC4SB)I^Rw{<)d|C-;Oegu$Z#VDLNMB=Yua>^Vw}eRp+>i|SDLE=WbB=P&J|#!x zXU;iu%N`ph{>RLZCIqxv)FDEIQG)KT+RYV6VX7*X-L#5uM7!#fc3bluZ+gl%^2 zFgP-v{XILIcOTs`>fZI#vu)3`I@_N1wqybHPfwik2n+~o72aKIc0cWI4Lsc*c&cmf z@n;@QaRTd#!P5fUl|sq^hL7P6pAK}N85V|JSkwU#dq0{*4^V+HdXDyiowZay!VRcl z?K3UT+N|m|@7_jL9$;8QgcUJ}1nu0N3;v{tU3S*)rrcAwMoO}KMVeiH5A|N({zE5v zkN>Lu_t~4W%YTZB={j`c*IC9Nu%;Y2j=gQwV%mQV^B`BAx%;Ml|8O(?b*|Qm%ps8j^@T$&!t`Mt-GBpgY(1V_;5N+ zNws(S9CoDw}p^zsU>4(vC>{tj`YX+L*K7)4rtWv*?gU25SGfOvll z=cCKqU0vRt{MtxQOtWwzzMSzB2ZRNc{)KCp1r zHP^@H#+Er{i}is<0?;a}89@019fusY&20lfQx-r411JH2l!F>M7^EDGYAFYk44?vl zP6E)YBme_fSxuE(XxbOA*dJ8At1G>aws0x^7 zMjt`2C&0gz!n*?*`)hzNMJ)Dpg} z5jBmBddA&DuBquspEs!l#G4Aii_DT*BpmYk1aXWV!ZZb%iD<}3;;+v+ek-6Rk<{A+ z=Q6isEC}vS*oqT*_SX-^@|r)e6@@Omx?{mq{ei7IqK(;_7fj6pnDOjhqFssgk`Jv% zFL7fCSow^}y_Akg_t%Ufpz!AV)KZ)qz3d0oAob@LdE_eZ`4SYz1r%fQE}IT@E2MPN zdq(M#_rX=tC?(i{auo=b43WE3^{2$AcjesawNm=GQuNY{YL%L#>#7=2U}ow3wZ}mM zI))ixxQ1{H5#-o19kkCo#z!YT?f%9ilOCcGiGY-Yy^c|@V`6xmQh40k91Y&2Mx2!* zH7yg;!jtG=VGxc}BTV3xRHF#jnWS;x(xh+rVy_@f2||EHoEE00&wz8-nWh%=Wtll?lt1o7-cSzWYkvwvS)t_&m58&TL!EuZ;n5ZG2<70~ocB=gKtIbZ4juPkR!{&_nnGx~m3{5kDPPIVzOPo)a z;e%u$#Uy?KUtkFty39-Mvl+85siH71@kKQ8#Cd0A^GXEvJ64~0BE*-G)=Rs7YVOs= zEOm<(XUyV^u8CW=r03qYo6p272WajcVsq~hk4?`~9GbrN!t4u?4e{d4NfkHm3aXYY zh5vivI8}bfY7+;PF+*ws4MNs@n4$oNUoOL!R1HByAY@Jk0})x7GeL=f6%#?nCIZ4& zp@F36S5QRe6mY~Wjzvpj%+eU~$1UqJr@&y$vX`d7el`X6(-bhCwHHxK@TcHvI3s7hM60fmSr0&%AePJ^?#1 z)+n`mW?`pvL=NoqB8p$Jd1A{vN1^h(WE&-$mV~iH`BiG8%o8{7%qg1MDk);+R+&Os zEQe1-Sq$QLPzf(h+Fu=Ied2aml!?pg62%n^vu%nOOZ%cG-nJXF-_k|od6Ab5e}^q&X=ZS#A%Yv@uQH-iWP1vlP6fr74hWE+`+9z34 zM7)bzNjzRI9>*?wO~6-*f@B zTY0t_Lzo}Xxq0SOx)n3(tCoN!p!4SeMsu|YPzo033~1eI=F0=Tmicr6Z3+_lN~Bza z7(I(IAx0I@>_DqBYj|~6I>pr<ZBP%Xz30Y9A^0Ds8F@~i;X)Yso%$5F z!Gt5?giWePeVz$0(2(CGm5|#IENLnDvq}DZl6QHDha@VHJt8TX&$f7$3p4^}{B^5S zgEG(`Asg?1heI>DTx3Qfb&==e7H3esly3`lT{-je)Rn2QE1q8qE+fD6D-%Iw!eR}o z6Q=wiFFMwu(DSn;*Q#c#BAU3h=^j_CFAsJtneAczC4a(Z4=Z2UlBlSh?On1LhOM)G zvt0>mQMl%nGKy2YvN`;Gr2Dmt2{AI%#Xu86s`4iTZh{;J#AU_)nG|xEcQfen^%bq)SMz z>s8`qX#nGaH2r=}U0r+Y&K&~n!AaF5WIVzf@Cs2lz{Vsr5wY>_lTRS$o8)`}j#J5| zweY(XKq%Wwa~{(*lV7HJ_(}XS#lKH!iA09X&Y1V|mMdFA`@(1M7+WCrS+q6AY>kl@ z;Se6Pp^UxiNHde2_3F8PN;yk5PDwS?v4LKgBv<3Z1T zVhC3%1@&ZB0tFva4eD2@2J@gCeQIWj?9Ayf$(LT1Gs?-9fI?^nto74jeO4)l0CE=;ZuKOOEjNXpvg?a4S?CDZ zBfdf@?O2iIOTU4hh)G-Vd|MXwW#+Bme6;_wXRJ)}rQZRW2*{nQBtXo}GoTi9ZXH7M zrFss*7+_vi?-Q$dF@t+97Se>M>X z>GBO-I0O9YJvZ#~WR}gSP}U2A+v|X^-8X!S-s6`X&BI=?VbHT>l}ZESbRa+18LH~k z1+U{01`Qp`ly7WYQb}2P;Ne6Y57BVNL1TtmN`vlim52PCFm-;^O{3%(_mG}R9Q2H_ z?g!a{4b(WTf4O_rNUhh}w1CCa|=BcNjdit4XvMfkwgIkZk`_IBT z$nlILf2ILk29SC#9!Z+);12Ac4Dm1cYdp_gZBlWUxZhV^;NRq7NG5y>h$toH|QI{uGv<{LwT55ghZQ`8W9v7J$d1y^iR)!(3 z2XlZnX^|K_OIezRgsBUXmKR?nyp%M=np8?1QFdf01Wt#vDQrZs-+PlP5^ds>34h>8 z@$146Wo;f3=M)qzZqG&7KjjUHYRMti-H3NhjZaTZrb3|@8o~r0y@*<5EJlE_naj+T zsCZ-}mIt#w*BK9W3K|Q7!>JQ_Gc}u-!e3Gy4C!T`G-l>%ePrbce~SbnRY&8LS^<|u z;*JK$Z$8d?Ql1I_5rN(rj6DYZK?SGJzd90f$8_~~bd5i=6wa00Eht~8*dH%AuwXjy zGovL@?g;i=J(MsPFPN*pwKv*3zv)i>HiVKYI;2b3Di>@Gi5ll(&AM34y7`Uqnys@3 z-peaYm`fMTHHpfG#me?rWqWiwUb!)3xLaNw(S5h&&H7vQ@$$Va;}Seeb4k=)19KjDB1|gTWKZL zVX3ebFT+xCIbNnEdkJ28=}Qbuq+Zo^lvPEdvYOsyiRv2hyQmCljERaSR#HM|TGUm< zbQO1WRWc~G_p5m#JBU$`AMz7Axleo>3HAm!;TF7aav5`I6mLTo6=WkZlsUXC zpp8~F(W{ragxMA}K3WjX6IRgQgWQCjI1kwgNP-zY&4C8MOQtpW63&wBXn~bVRa_3a zjUr9n<|bd>N;Mc-GG$KwQPz@$c;SzbM-D945O3pHb&;Y_$CeP3psVAMs z)1WeDR5R*;8a0rKG6@cRwrU4HLj2^8Rmzg3TdXXZ6wAm#u1!{1GMSbEDV3#Jr7W4F z7V6P1nS9I0A$M6aX_o=X%9@O=Qj$z&vyxq6CK;Kth9>A;MX3c+X5tkGm(Ee2z22=V5_7MZuu5N4;Pl1^`JE{jkdg z@}1G%Qr0q=>K+BJ-~(NpBKFBttzDv8o_nqx@~_+I6(LT}9dh0!XOWzr!tpEW>PUb_ zW-ESOUCRE_udX8#Nfy8~a^w?99418W{}5ftIV)iGjkXe%Mw@|XsHXz;=o4c2P8uK$ z7JQ6u6W*f$%`o_(Nw>hHPOM5_p>(WXO#Z|w_uCXkl@ldVtgcKFWgXbxzxQ*8x{eRQ zn7<3B1-it>{TqV)202M`7!9U!gS|-VJutZ;`HV+MAW9NqtEkRN4I{4v;T=jOOAM15 zX6fZk@}o)qVh#zm@NWU{FOo>2Y#ObDwoaTz!PdEK;0g!$dmOLt2=?4H*+M=&1`DA%_lXK7hWu=i0&9gK;x9_C$UGlV!W#&96(CEQ_Y9n5k;f)DSZ@ zMBH~wtxIOx%b&mU`S8U%=H^6sO^UMViI;cI>O#uUK%%xGq`GF9HH6o{YK9``TJ>yo zr0kBhjRCKTm9L4q+tO1NZoCF<5F>1r2dUHH`c_8 zI}&R;!m8_eb9oV0tfVDjFAGTC~>2thI~Q=9slPYL5;_Pen`O)^*TyRX0RVMV=4)MN+M}GCUkU6~fn5 z)7|R2Kh@u=|54l9ZSgHf7VD3`IX%zM*F=V+{5L)quRj{EK1Rln6(7UzCHm|y3-b53 z8(bium&&DJ$P45KRPU;Qk|}v~3XoR;nMi<4jR!Kb0huXgR0D8< zw%`NOQuu41dv0R*+;h*hIZlD6r*lD$Q?O|hIe2Ch+1@Yw9ZHnclB$vENmo+GB%7ze zQz-#1`~msH z9wkA^ysC!_DW3ULu}5>U*mOWql2KBxyVbO%&ZzaY9cPYMs+Iv3pG#eW%}wQ2xiw{+ za2i{hs2)7!*7*p7vPX)Swyg7<_o!R{iSduQ4WAgl_EX{=ZsRAV7Yc9$llwd&^twn#BCX$k8#dR%@Z5uN$daTa&nIAr(lpAER|cuYNbd0>|hDhFbEK_5eyXqO3cLL87#9- zS}W(M*=EfXfr{1;eRI!bFn_cixQVNp2GRop_`c zhiDa7k4axhFSFn%XA70{E6v2pI>J%E0`5Uwlu}KuK1|mGxqLR9_vy1Z=j>vKhu2BR zihVNUgjVASKJ}6tbDKf+rfZco3M!ss@f}jUv(W!Un(bls?TkWBpNjNM`h-h#&SJ_j z49UNX?BjqJtd=&0vOvqZt2({C44Wywmn6{Q`}bU(wd?SG2d` zFYu5L2&88d2q6iCtA!in{7X1Ven_~E_X)_hDcWfjnE}R=FfQY9f>J{8nbaNhTw(_G z$-Lve1HH#j_Vx@>lZ1x=5iSv&;UuXxL?HDDJK?N_iewx*ilkvbNpwYv{F7p)9$!*D zJ&6{RFx~5uSPUI;fMjZz)Kd41LJEvre2gnmvkprtaM;+uyhGG4NfjtEFSA<6!F42! zDQPg}>o1TL7+ zM_k`5{kD64-CJicqwZGKM4F6dzf%Td@yI9o`t3vBhJu&=lRc&N* zblr{Z@v06AdDXa7RU>+qKd+!EzPv|?Ljl43j~* z4}5gDxcVNa0*_2HDtvtQQleqaoMEYo4LVjKOOC0B;vJ~j@nx@bJOs7}7m(}?E zCC>g)JNUf9q{R+lLSErRW_aVu(`%(|hbz=SX(&3hL-mvG zJo$H&94^xSwOtMWUzbzJUsreb+thzkl-J*+{+mXg+!lTRX7%4};^Ahoax!}x1g^qK zdAQ;OHja?>iYIN}A`vJ|BbtN#g7yJAy%`1D)~S>gPe8Q(l()=uG?>AhR&J>jGI^4b zLWSDO%tAVR%$D{`zO-x@8$UlL6P{8$Jzq!i^i%_dnjJ><9b zv)$Nf6sS+xb_><5C^!>EceLd)>v{pC6I7z|ZrjHMilp+St09E{3^*KUgP6`Mi63;N zJsldE@FkUSgnUX5K^|xf2Bt;|Mo)+)diK=5m{Pfl_4k)&Z;)A$caWj?|3ogAxes8L zckzuEZ@f6~iZ^YG+qMUFOSbYwTV2dncaJmb*95zl6}r3@+6AAUdpcSNHRNLD`dH=q zkRegwxPEBvP}CNyShHBs8LQ|F>6i1lyuz1{Tsg96s*RayBirtn+7l-G%l%jS7fm%W zQ%%JAuBmOg7&$MOaF&vw`J)F`wwBc>q{4w56iRE$-I}%Ywph(Z2{G~37N|#GIe?{Z zZTY8VJ%ArFL%X-u?I~8gQ*7+!)$i2l_pDL9)5ep3jd9O*?K@i(ZMjnh6pW?FnQLm!Dtz*q7Ph2yg1N*g zC?m%zhA0fS;<@h1K&ZSH(rv=JOks%u?lg(jxG{MhrJ-ijnZ|3mw0JUJ(xgq*R;!`J zGDGylKLf@}(nPrV(|kbV$E=>w`-psHPe7MT50@5fNhJgGL1xbKGRzp!TA9(2asqR1 zAmL2Prd<;-2J`^~jmg!jfD!DZF~wkNU>_{Sw64-`ETIKte?!0DweM6)kWyMYozLc zA=V6mFK%I}QHZ;-)d|5RogCTEqoHS%vGT$O;zRAeoD$HWblrZZxeW z6ZZjw#2JbfF&V63|B(~D+n6eh&R(CHazjN1YdMFDag+|v^V6f?mry8-aNW?8!9tB0 z=)wNYM>kr@IintDJ)U!{GQJB_socC7Imn>kJFzzi+t8D>cGCh<~NU=ra5QmvmqQ-&^pGhSwmV{->;2Y#zA_r1? zPEe9V=!xx(PP1sBK12b*duDP!WUzv<|Q(UXNK-)Vz!Q;?(dA&ySCCrTT{%|1p9cVkUAZ? zIA8L;>hD(HYW`9C+wBX-PvV@L{Rwu;6Rw6UEDq{npYrmhE0=<*4+;uHXBLYZV?~Ye zf~KJMgNo{i>J8HkQ}lGaV$*$YoxbkMpapu9eE@{Ol&JUw3* zZ`c$s-+YgA<~7c0Lwslh@wpWuEfDE~0e`gqwyix;(-7Jl?wUQ2uvffSS{boNZQm%* z3|y+HzurIB9|b|MCZvb)()FRaq3E$#WrxT)S4Q|(c0~r}RX2u~ifbZI-Y#y(o?p80 zuCpzA;;qu~-bmML2T*ibedNOJ()POzEzu3%d@8Js@UMX%agqm&NwFi+^~#Hh#x>F5 z8)K<3dj$-Q$mlLo_v+_EswG=xq!cU{axdKcUW4=7by43phs2DKe~}}y`8JN%kKNpV zyS?|lnuc$AzzNr^qt?B0U`cEyNR9y>9rEA_o_KzH*mvWJ=!J!b&2ih7U{AtSxM-?~ znJU63erl>+_VDQB?y-!tp-GKPQ%@4ixn3jLOE`M){>W8~6dpD|nR8qWmo%TnaJh>Z7_Z4V=Y~|r* zF&Hv2vj-EB?4NRxGC7GD*^>SXudI@aR``l1``C+{T}P7ZP)&NHt$xKfgEvbX4H^rYGFR46mx~P1@`-F8)w_&McxZ}o*c%uq8V*k=9}~Qk0E{h z$IVUiFoMtu8XS!?Qob|#Nwsv`4unXC_6Ii9ILwAkP@N{4e?l~ZPa7Rfn_QvH0NtT|$}ptQhU z^x#q%*_bOmrZ@+Z-!JX}Y*(NvKje1^hw<(^@sNM&A^(hD@$^$d1OX{Q<}Qf;7VrrK z>=_ndJ^c-eqgf~rD=AbF@->o=s8WGhQ5Zx7|34_;_uwQ=f@fmN=joopMvB9A$R$}o z<{hJxhhbOJ1xxOUQ{y;rcMb-r#wmyvaZ3oh&Cx0*JdzPq0IQ8jScqUl9>A7K7YBN& zCTWZ>B6~v$+0)5sRXsn1CD;AA)F=Jh%J8o=VFm8aQ1xsxjw45Y!n<4{qJ8ze7jdsuTZ}!c*-aH&Uc(#qD_?pRV#@As>Y|74ibEAI(8O8s2si~BQ2G&yQ@HX% zmk^0uGn~s7Rm7B@D}wR5jD zVtzv`zaiqL`%=C+5zpU1XQ*+wdRBvT)C}+6hPgcGz~0%z!QQ+1)=*t&c((B?XK|^D zF+ceHl}(|6mv$zs_Rz7}qAPn~A{N}U1gM%TBghG6ZKGF4VR~hrGZSWgv*ihkK)=Xb9KyI4P92(4Ncq(6MD+EJOSna6@@TQM>)E1+?&)HAJAn6fIW`t zxaK$9w1f2sxrl@5h?RGM+bHM^YCtNR%(%U+sBE#w87p!E*^@n3)BO6Int0Lf;NC=K zeX#Fp|B|^dnD^0xozP7|lc28v*_~H$7wUuosD)0xIy0;K=&r4jg!UECg}tI8v3fSc)&v)p1oys3-@_P#vKeY4Y zFEsYnsekBDkiV8Ef1Q&2%`CRf*t<>n!>v5rESVpz1Gc}w*p2oVe2Nbamr^);($aT! zM;xu96;BqlECpoHDd}2f0`FQMN)w-)GQ6C77jRgPUFX~KQC3*%$~6XT4q2a&2XYSv zTxGyU%m6}7grQpnLYwx>95v0k|B!@HDd9_$DoY{hkcCq_{5m?w(dWUvZ62?Da%}|b z+c8Y1*G4bm@;EvS$Wy$o813$>?Iu21FD66BFv!C zc8GfjM^1Th(I)QG%gTfGr(-Q0!p6Btw2l4*&uOUQ(NC`NY20VaGV(g6A^n*W%^xSH zd@FJxNG7jBa#k+R`B7Hc9n|jV!+}4~MJ89t%Hg@^MrhcZn>IAHIXY3Fb!(ky@&&T& zmMX#yPo5tZMu&0XWLD}aw0az7(Nu$BBp0i2Zg`Xql(V+5NkkRu?8JG_RL^AP;X@xy zpFYECy>6`p)GVHbgx&@X5<9DND~_m+Wb|oPHXGU<`+cc;qnqTqQ`ze}rBP{?b3;4Z z9RnUuRwieBzH{3;I&g>(Lv~^G>}dP6%j;_QxTiZ<9oo;GIoH8h8#eETP6)%3UXl@J zcMC!s6Ljj7OdBLKdpZb;x@1gG$OIpql3Dc;r{{{5uz!S&F1luFViad@-Izo;-6{=` zgLS#MRB%J+sCe#`=EKxTR_0Wjj0q|(Lw0%=QpnUCbU#{l_97(7W$tRAy;)gil`Ucp z&&uot5{%-wujAY$$NJvVv|wMDJy*e@lk-RVK;JOH_8am1fut|uaXn?BHC|C@v1EKZxV&` zRpfS=`^6T{Qpk=W9*h?pS}+|VtNEFiW?0bSctQVy2|Kp!k88`>Z2T`DTO zc6RpcVo_79s41$BPJ^Z?+Qts?$*1R>n*RR&KKx|Du-7#@iqm*UQB9|!zu##Qz6-DL zugLiWa{iEY95!3SMo$r&+5$&fjJ-E!nirfEr-1V^rP1A)_P1!#SphRu!@OQrjj(n&ak{_n3Eyha=?XKk1dydK6s#IS3HyF~I)-md@6%X|{J(A== znt#$a+91zc+%LuiwxA_tU7VPj+!+n(CTj=N;bS#vzvPojg-$n=)(;1?zFG+a#=gpc z?lg&Rb%1(->5Lns*nmE54I&p?1Y=1k`y`P}-k zR>_}!LuhP}Y9ZwSdzPnG$-}Tp9{L=4%&54luc$DWa%sDBoj8Z*5JqI>^J^;KlC%6xD@)IPYBggH9c1k{j%|4~rBJ=v+;UrU z_X~9YDeQcD`gj zT~7he1d--bLQ?RJM)LR5&v zksQ~h=;#uhabiX(8}a^$hq@i(!xN|6!@K-7sohTcnS_k%NKzp0(Dp|{%#SW}U+WI* zuIJC?!=(8#$0!tkU0vM^xT$bv=MMZJ%L{8~+OmEcwoKK6Y??i3sH^DR_bA(&$-bNAZ5NlE`9_*vR0n^WC|EP`4eZ9D33q ze&NG_pQD0}J%;-YswFd=*NFBXVwE-Gt>j519XhU*jvCA3B>tobwHetKtc>1ea8^M} z<~^U(TwoMj(s1l^FdiA|KhobTd=3KwZ5$)kl15mWjFUEOY7(k5w`XK{dYqZ$3;&fW zRt;EoQaY)^Ji#3@v?_d4Q{!I9YU#Hkk_Kkg51|QGiv{+M7c+krLOhK8dz90EfdgQ# zB(F)T#->ImlWMVoP^P0!;xLIel0T(HcgTS?SL%4SoASsTVo6dr#W+o(40)I;N-YzP zQC3Qrwcy%yT(pE+xiL@0Zf4dVQOa(dAm4${OY$*?<2lR=@eyYSF&lpKirI0KrowN* z!D6~wRC;Y}b}Ujfzag=9SE6;zA9}y{;&)$spjH&`#l6Gg{U^A-^h<<#mhYZL#vU#qxEr@^$g@4fi;`zKg$dFgOsZhc@vJ z*e`Qa0=6CJLn=sEVWgec#fOv-x`tif+Hl9#oTzkMe`4+laoQ%fZ2vR;pXk4D1gnQh zexKv3dihY_lD+KOq1i)`>cyJPv6{^{l{ZhuYkJ6)^)Y+Bs7Q_5*H9Kma%9mHE%_7otqnig^7fYR zPu?y){I02=vN*Cz7TeO5C=1)Jm(7*UZ&)bZ64k{@x4diGN=dh&a5^!)Xm5_$o8xw} z-q3G;G@WXpbYoN zO2c(9k<#DLi=vOkmc6l-y@|H9-#Pr|;l;MDSX5z*Oiq*IjnHy zqnzog=7yH)!OkJ%;74)MfHHN_0AiW8zb2ihMRmVQpbtsuHg+m^R-ClT_qD)dClRgh3NO+2z|BU?E z;!7tJ4J`$da3poCqEPLoPBI94C{#Hz;uY#BIjMnHUZG$T7pkb*_1hk26ij<&;D4ai zyM&}zy`m2Fb!B+u`uN;(++F?vt_ZlM9bOv-r3>_P9IV?O_S%%8SS*`n{gGwF79~ z+WB*(!rTePEJUCMFYknA*JOVAz?B1`^Veo(XYQC95P?fV+UMGF%Y&^2I36@2?104E zj?cd_b7N+H#0y>k zgwqt0%kFmQ?A`=|SR4MgV+~@N0!7B$BO_ecI z<-4ZpkM5dDC9Jo;XR^>vYJGU0NVG4ORdTS#E7H%7(8^Z2T%rlD<2#m00M-aV9r?iC*XL0 z({T^GhAI0O;7A<_6S>piXvazU>GKfRB>wQ5K7 zLt{a>{(9?NYs}b?u$2Y-$qa#hZ{`B*mlsSqeoltAGd710!9y435uRjv@W9jF}w*zw2*Y(RH->rG+dqoQ?XD4l02$ zqcFjOb^_+Doqa6FS}bXcm9#~V&8y~*eOJ3!vIRtP$wpBk@*CB)Jd~m&@xY9w`9Z(CEkM~U z{pP@z5GBkaf~j_%doCrb@gqbg1TqN`3)NyH5`BD`d(Ui3*oqz~6#7o=!WJ7X*9TPi z-IA)XFIsx1WIY($l8vCT=GOjHhTQg_k95+W-5I^Ski=B@xUM`6)F_x zhR8+A<3K8YL?ysOb%7sY!97(tiW*RQx42cgOek~bn{f*k76Ci1M|EHEq;JCl8Codb zgq6mVtCXk2;k(?eRg<0iKfh$!ThgVc@8e4QXrXTd6mE^~XlK$`@$``jVIUy?0x$et zJ00*LC=t6~#YjoSCD{Zrx-zLa?aOsNm+%73q?HI!Bv?ynF8vGSOFvgp5ZXk$S44FO z+nKfaTKQ}_{YnZf_{ypxb#tw=h0%4vJwG#BG3BmpncZ@;=+Dakr2MB9z4Kk+6XNlf zcPl$?SM+&D7d^=|#9 z+jU1{6-VQ?V+*EZAK%k*m3{oj_cUDnF`fyk-nN$P>CnBCU$SRI_BClTMt%(q$eOsa z{>6u;i_ePdZyIr5XyzhFL1C*(X)C34^!5?bVh@warqZQ{HNbx%J4>%<@|zfZL|lDxYuR2TkcuHO<6swNb~G6 z8ZhH$AdKnrx|!{FgJjDU^L5Bv(AQMXiihm$0xD>YQ@#9k{&#RikP}joe+fwOf|!@k zBS7t=cqLV*Aed#8j*z)3egWVle<`C=seKN5L}BNv)T>30^eWpnTBvJDe?naglhN1h zcZ^l{+K0n@H_vn3o^uxx|g?{t{IPIDD z`3e7sa)pn`A)+cLs(6S9zftNHT;$h5UD1iqTo?I;cc!lKbH^;}z`x|U#?Mx+qPym4 zYr*!%2)i3p_(2LN%xUw&WbhXW==aF^G9X1e7?NxWFOowXmOyL{WWd$Pp1llwi zzGIU?pg|Tz0)IzYohN6SoWm4B&cDK5=JgympAK2Ab3OnP6OXKQ0~>r3EG4#Xviwc-Y8DK4K>Yp31S4Ly8H3`Z#Hz>+{{d z>2ol{`XYq}$@wZduTZ>kXn@%|?k5AhYZRgpf6Yc1A()%wP=k_s*vp7kSj;QVAvXWg z{SGyr_?tw#gg1}||2gm5m|@^~dH#Ja?|rV|ea`ScXMCTtywB;`f5YE#bzqu#>-#Fp zvJS@B|5jDb&6Sav{OkaR+B)i{x+LG=EX_7ZJ>v^7i1#2OPa0oXmer!Pn6zy_ff?xIEisJ=9cR(0{Z%P|E3S!0S8-tbU`HR;l%u zn5$x70S;jNMjr(hJY)iqsH(4#`+ZH{2JSB!wSAq+zgWwYyFuHxTlp8ec)0%)k+_q9 literal 0 HcmV?d00001 diff --git a/src/vcfaz/__pycache__/sample_filter.cpython-312.pyc b/src/vcfaz/__pycache__/sample_filter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab47e99d81aa7b9b6509dc18ba845ddab0ef2ce1 GIT binary patch literal 6302 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 Y{A(v+0uP)~h6zsX{|`J '3': - self._reader = codecs.getreader(encoding)(self._reader) + self._reader = codecs.getreader(encoding)(self._reader) if strict_whitespace: self._separator = '\t' @@ -275,7 +271,7 @@ def __init__(self, fsock=None, filename=None, compressed=None, prepend_chr=False self._separator = '\t| +' self._row_pattern = re.compile(self._separator) - self._alt_pattern = re.compile('[\[\]]') + self._alt_pattern = re.compile(r'[\[\]]') self.reader = (line.strip() for line in self._reader if line.strip()) @@ -421,7 +417,7 @@ def _parse_info(self, info_str): ##justkeep it and change type into String entry_type == 'String' vals = entry[1].split(',') #commas are reserved characters indicating multiple value - val = self._map(str, val) + val = self._map(str, vals) elif "|" in entry[1]: entry_type == 'String' vals = entry[1].split('|') @@ -433,14 +429,14 @@ def _parse_info(self, info_str): elif entry[1] == '': val = '' else: - ## try to treat as real Flota but it fails switchagain to string + ## try to treat as real Float but if it fails switch to string try: vals = entry[1].split(',') val = self._map(float, vals) except: entry_type == 'String' vals = entry[1].split(',') #commas are reserved characters indicating multiple value - val = self._map(str, val) + val = self._map(str, vals) elif entry_type == 'Flag': val = True #elif entry_type in ('String', 'Character'): @@ -460,7 +456,7 @@ def _parse_info(self, info_str): ## Modify by Zauli (merge multiple effect EFF fileds into a single one) ## merge only if val is a list - if retdict.has_key(ID) and type(val) == type([]): + if ID in retdict and type(val) == type([]): retdict[ID] = set(retdict[ID]) retdict[ID] = retdict[ID].union(val) retdict[ID] = list(retdict[ID]) @@ -510,7 +506,7 @@ def _parse_samples(self, samples, samp_fmt, site): nfields = len(samp_fmt._fields) - for name, sample in itertools.izip(self.samples, samples): + for name, sample in zip(self.samples, samples): # parse the data for this sample sampdat = [None] * nfields @@ -577,7 +573,7 @@ def _parse_alt(self, str): withinMainAssembly = True pos = remoteCoords[1] orientation = (str[0] == '[' or str[0] == ']') - remoteOrientation = (re.search('\[', str) is not None) + remoteOrientation = (re.search(r'\[', str) is not None) if orientation: connectingSequence = items[2] else: @@ -592,7 +588,7 @@ def _parse_alt(self, str): else: return _Substitution(str) - def next(self): + def __next__(self): '''Return the next record in the file.''' line = next(self.reader) row = self._row_pattern.split(line.rstrip()) @@ -643,6 +639,9 @@ def next(self): return record + # backwards compatibility alias + next = __next__ + def fetch(self, chrom, start=None, end=None): """ Fetches records from a tabix-indexed VCF file and returns an iterable of ``_Record`` instances @@ -684,16 +683,6 @@ def fetch(self, chrom, start=None, end=None): if self._prepend_chr and chrom[:3] == 'chr': chrom = chrom[3:] -# # not sure why tabix needs position -1 -# start = start - 1 -# -# if end is None: -# self.reader = self._tabix.fetch(chrom, start, start + 1) -# try: -# return self.next() -# except StopIteration: -# return None - self.reader = self._tabix.fetch(chrom, start, end) return self @@ -702,7 +691,7 @@ class Writer(object): """VCF Writer. On Windows Python 2, open stream with 'wb'.""" # Reverse keys and values in header field count dictionary - counts = dict((v,k) for k,v in field_counts.iteritems()) + counts = dict((v, k) for k, v in field_counts.items()) def __init__(self, stream, template, lineterminator="\n"): self.writer = csv.writer(stream, delimiter="\t", @@ -715,12 +704,12 @@ def __init__(self, stream, template, lineterminator="\n"): # get a maximum key). self.info_order = collections.defaultdict( lambda: len(template.infos), - dict(zip(template.infos.iterkeys(), itertools.count()))) + dict(zip(template.infos.keys(), itertools.count()))) two = '##{key}=\n' four = '##{key}=\n' _num = self._fix_field_count - for (key, vals) in template.metadata.iteritems(): + for (key, vals) in template.metadata.items(): if key in SINGULAR_METADATA: vals = [vals] for val in vals: @@ -730,15 +719,15 @@ def __init__(self, stream, template, lineterminator="\n"): stream.write('##{0}=<{1}>\n'.format(key, values)) else: stream.write('##{0}={1}\n'.format(key, val)) - for line in template.infos.itervalues(): + for line in template.infos.values(): stream.write(four.format(key="INFO", *line, num=_num(line.num))) - for line in template.formats.itervalues(): + for line in template.formats.values(): stream.write(four.format(key="FORMAT", *line, num=_num(line.num))) - for line in template.filters.itervalues(): + for line in template.filters.values(): stream.write(two.format(key="FILTER", *line)) - for line in template.alts.itervalues(): + for line in template.alts.values(): stream.write(two.format(key="ALT", *line)) - for line in template.contigs.itervalues(): + for line in template.contigs.values(): if line.length: stream.write('##contig=\n'.format(*line)) else: @@ -829,11 +818,6 @@ def _map(self, func, iterable, none='.'): for x in iterable] -def __update_readme(): - import sys, vcf - file('README.rst', 'w').write(vcf.__doc__) - - # backwards compatibility VCFReader = Reader VCFWriter = Writer diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/sample_filter.py b/src/vcfaz/sample_filter.py similarity index 97% rename from pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/sample_filter.py rename to src/vcfaz/sample_filter.py index b156b45..7432215 100644 --- a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/sample_filter.py +++ b/src/vcfaz/sample_filter.py @@ -7,7 +7,7 @@ import warnings -from parser import Reader, Writer +from .parser import Reader, Writer class SampleFilter(object): @@ -87,7 +87,7 @@ def filt2idx(item): warnings.warn("Invalid filters, ignoring", RuntimeWarning) if self.invert: - filters = set(xrange(len(self.samples))).difference(filters) + filters = set(range(len(self.samples))).difference(filters) # `sample_filter` setter updates `samples` self.parser.sample_filter = filters diff --git a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/utils.py b/src/vcfaz/utils.py similarity index 98% rename from pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/utils.py rename to src/vcfaz/utils.py index 2881dc2..ad8c2b6 100644 --- a/pyvcfaz-0.6.8-py27_0/lib/python2.7/site-packages/vcfaz/utils.py +++ b/src/vcfaz/utils.py @@ -49,7 +49,7 @@ def walk_together(*readers, **kwargs): for i in min_k_idxs: try: - nexts[i] = readers[i].next() + nexts[i] = next(readers[i]) except StopIteration: nexts[i] = None diff --git a/tests/__pycache__/test_import.cpython-312-pytest-9.0.2.pyc b/tests/__pycache__/test_import.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1db52341d09490aec4c2ce42308c8d4fbb3e9a26 GIT binary patch literal 12777 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 literal 0 HcmV?d00001 diff --git a/tests/test_import.py b/tests/test_import.py new file mode 100644 index 0000000..b132352 --- /dev/null +++ b/tests/test_import.py @@ -0,0 +1,75 @@ +"""Smoke tests to verify the vcfaz Python 3 port imports correctly.""" + +import sys +import os + +# Ensure the src/ layout is on the path when running without install +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src')) + + +def test_import_vcfaz(): + """Test that the vcfaz package can be imported.""" + import vcfaz + assert vcfaz.__file__ is not None + + +def test_import_reader(): + """Test that Reader can be imported from vcfaz.parser.""" + from vcfaz.parser import Reader + assert Reader is not None + + +def test_import_writer(): + """Test that Writer can be imported from vcfaz.parser.""" + from vcfaz.parser import Writer + assert Writer is not None + + +def test_import_vcfreader_alias(): + """Test that VCFReader alias is available.""" + from vcfaz.parser import VCFReader + from vcfaz.parser import Reader + assert VCFReader is Reader + + +def test_import_vcfwriter_alias(): + """Test that VCFWriter alias is available.""" + from vcfaz.parser import VCFWriter + from vcfaz.parser import Writer + assert VCFWriter is Writer + + +def test_import_filter(): + """Test that Filter base class can be imported from vcfaz.""" + import vcfaz + assert vcfaz.Filter is not None + + +def test_import_reserved_constants(): + """Test that RESERVED_INFO and RESERVED_FORMAT are available.""" + import vcfaz + assert isinstance(vcfaz.RESERVED_INFO, dict) + assert isinstance(vcfaz.RESERVED_FORMAT, dict) + assert 'DP' in vcfaz.RESERVED_INFO + assert 'GT' in vcfaz.RESERVED_FORMAT + + +def test_reader_from_stream(): + """Test that Reader can parse a minimal VCF from a StringIO stream.""" + import io + from vcfaz.parser import Reader + + vcf_content = ( + "##fileformat=VCFv4.1\n" + "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n" + "chr1\t100\t.\tA\tG\t50\tPASS\t.\n" + ) + stream = io.StringIO(vcf_content) + reader = Reader(fsock=stream) + records = list(reader) + assert len(records) == 1 + record = records[0] + assert record.CHROM == 'chr1' + assert record.POS == 100 + assert record.REF == 'A' + assert str(record.ALT[0]) == 'G' From fb47daaccdeadf567344c39017509ff649e0fdf4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 6 Mar 2026 16:44:50 +0000 Subject: [PATCH 3/3] Add .gitignore and remove committed pycache files Co-authored-by: ecapriotti <5848298+ecapriotti@users.noreply.github.com> --- .gitignore | 9 +++++++++ src/vcfaz/__pycache__/__init__.cpython-312.pyc | Bin 582 -> 0 bytes src/vcfaz/__pycache__/filters.cpython-312.pyc | Bin 10460 -> 0 bytes src/vcfaz/__pycache__/model.cpython-312.pyc | Bin 32779 -> 0 bytes src/vcfaz/__pycache__/parser.cpython-312.pyc | Bin 36469 -> 0 bytes .../__pycache__/sample_filter.cpython-312.pyc | Bin 6302 -> 0 bytes .../test_import.cpython-312-pytest-9.0.2.pyc | Bin 12777 -> 0 bytes 7 files changed, 9 insertions(+) create mode 100644 .gitignore delete mode 100644 src/vcfaz/__pycache__/__init__.cpython-312.pyc delete mode 100644 src/vcfaz/__pycache__/filters.cpython-312.pyc delete mode 100644 src/vcfaz/__pycache__/model.cpython-312.pyc delete mode 100644 src/vcfaz/__pycache__/parser.cpython-312.pyc delete mode 100644 src/vcfaz/__pycache__/sample_filter.cpython-312.pyc delete mode 100644 tests/__pycache__/test_import.cpython-312-pytest-9.0.2.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b89fbab --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +__pycache__/ +*.pyc +*.pyo +*.pyd +.pytest_cache/ +*.egg-info/ +dist/ +build/ +.eggs/ diff --git a/src/vcfaz/__pycache__/__init__.cpython-312.pyc b/src/vcfaz/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 03cc7b62a10aa24a69780715cf30d3a795933d22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 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 Lb+K5&n)`nN0>r^{ diff --git a/src/vcfaz/__pycache__/parser.cpython-312.pyc b/src/vcfaz/__pycache__/parser.cpython-312.pyc deleted file mode 100644 index 19570c0146d809be0ccb48d420b877a75e420ef1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36469 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 diff --git a/src/vcfaz/__pycache__/sample_filter.cpython-312.pyc b/src/vcfaz/__pycache__/sample_filter.cpython-312.pyc deleted file mode 100644 index ab47e99d81aa7b9b6509dc18ba845ddab0ef2ce1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6302 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