diff --git a/.github/workflows/python-package.yml b/.github/workflows/python-package.yml index fab839fb..04c4909a 100644 --- a/.github/workflows/python-package.yml +++ b/.github/workflows/python-package.yml @@ -5,9 +5,9 @@ name: Python package on: push: - branches: [ master ] + branches: [ master, "call-pedigree"] pull_request: - branches: [ master ] + branches: [ master, "call-pedigree"] jobs: build: @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.8", "3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11"] steps: - uses: actions/checkout@v2 @@ -32,8 +32,7 @@ jobs: uses: pre-commit/action@v2.0.0 - name: Build and install mchap run: | - python setup.py sdist - pip install dist/mchap-*.tar.gz + pip install . - name: Test with pytest (bounds checked) env: NUMBA_BOUNDSCHECK: 1 diff --git a/CHANGELOG.md b/CHANGELOG.md index b1c75c71..8b7e5e85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,24 @@ ## Unreleased +## Beta v0.10.0 + +New Features: +- New experimental `atomize` tool for splitting haplotypes into basis SNVs #72. +- New experimental `call-pedigree` tool fo pedigree informed genotype calling. +- Optionally specify just the `INFO` or `FORMAT` variant of a optional VCF field. +- Use `setuptools_scm` for versioning #179. + +VCF Changes: +- Renamed `PHQ` and `PHPM` to `SQ` and `SPM` for clarity. +- Added `INFO/UAN` field for number of unique alleles called #174. +- Added `INFO/MCI` field for proportion of sample with Markov Chain incongruence. +- Added optional fields #174: + * `INFO/AOPSUM` (sum of `FORMAT/AOP`). + * `INFO/ACP` and `FORMAT/ACP`. + * `INFO/SNVDP` and `FORMAT/SNVDP`. + + ## Beta v0.9.3 Bug Fixes: diff --git a/README.rst b/README.rst index 7d3b7d57..f6d57f04 100644 --- a/README.rst +++ b/README.rst @@ -66,7 +66,17 @@ frequencies (estimated from the mean of individual frequencies), but no genotype Example notebook ---------------- -An `example notebook`_ demonstrating genotype calling with MCHap in a bi-parental population. +See the `example notebook`_ demonstrating genotype calling with MCHap in a bi-parental population. + +Experimental features +--------------------- + + \:warning: **WARNING: The following tools are highly experimental!!!** :warning: + +- ``mchap call-pedigree``: for pedigree informed genotype calling. +- ``mchap atomize``: for converting micro-haplotype calls to phased sets of SNVs. + +See the `experimental notebook`_ demonstrating the `call-pedigree` tool as presented at the 2024 `Tools for Polyploids`_ workshop. Funding ------- @@ -80,3 +90,5 @@ The development of MCHap was partially funded by the "Tools for Polyploids" Spec .. _`MCHap assemble documentation`: docs/assemble.rst .. _`MCHap call documentation`: docs/call.rst .. _`example notebook`: docs/example/bi-parental.ipynb +.. _`experimental notebook`: docs/example/bi-parental-pedigree.ipynb +.. _`Tools for Polyploids`: https://www.polyploids.org/ diff --git a/cli-assemble-help.txt b/cli-assemble-help.txt index 14ca7c7f..0c80f28c 100644 --- a/cli-assemble-help.txt +++ b/cli-assemble-help.txt @@ -115,11 +115,21 @@ options: The chosen field determines tha sample ids required in other input files e.g. the --sample-list argument. --report [REPORT ...] - Extra fields to report within the output VCF: AFPRIOR - = prior allele frequencies; AFP = posterior mean - allele frequencies; AOP = posterior probability of - allele occurring at any copy number; GP = genotype - posterior probabilities; GL = genotype likelihoods. + Extra fields to report within the output VCF. The + INFO/FORMAT prefix may be omitted to return both + variations of the named field. Options include: + INFO/AFPRIOR = Prior allele frequencies; INFO/ACP = + Posterior allele counts; INFO/AFP = Posterior mean + allele frequencies; INFO/AOP = Posterior probability + of allele occurring across all samples; INFO/AOPSUM = + Posterior estimate of the number of samples containing + an allele; INFO/SNVDP = Read depth at each SNV + position; FORMAT/ACP: Posterior allele counts; + FORMAT/AFP: Posterior mean allele frequencies; + FORMAT/AOP: Posterior probability of allele occurring; + FORMAT/GP: Genotype posterior probabilities; + FORMAT/GL: Genotype likelihoods; FORMAT/SNVDP: Read + depth at each SNV position --cores CORES Number of cpu cores to use (default = 1). --mcmc-chains MCMC_CHAINS Number of independent MCMC chains per assembly @@ -133,9 +143,8 @@ options: --mcmc-seed MCMC_SEED Random seed for MCMC (default = 42). --mcmc-chain-incongruence-threshold MCMC_CHAIN_INCONGRUENCE_THRESHOLD - Posterior phenotype probability threshold for - identification of incongruent posterior modes (default - = 0.60). + Posterior probability threshold for identification of + incongruent posterior modes (default = 0.60). --mcmc-fix-homozygous MCMC_FIX_HOMOZYGOUS Fix alleles that are homozygous with a probability greater than or equal to the specified value (default diff --git a/cli-atomize-help.txt b/cli-atomize-help.txt new file mode 100644 index 00000000..5daea3ab --- /dev/null +++ b/cli-atomize-help.txt @@ -0,0 +1,15 @@ +usage: Split MCHap haplotype calls into phased blocks of basis SNVs. + [-h] haplotypes + +positional arguments: + haplotypes VCF file containing haplotype variants to be atomized. This file + must contain INFO/SNVPOS. The INFO/DP and FORMAT/DP fields will + be calculated from FORMAT/SNVDP if present in the input VCF + file. The INFO/ACP and FORMAT/DS fields will be calculated from + FORMAT/ACP or FORMAT/AFP if either is present in the input VCF + file. Note that the FORMAT/ACP or FORMAT/AFP fields from the + input VCF file will be normalized in the event that they do not + sum to ploidy or one respectively. + +options: + -h, --help show this help message and exit diff --git a/cli-call-exact-help.txt b/cli-call-exact-help.txt index 99fdd5aa..2c14e5b2 100644 --- a/cli-call-exact-help.txt +++ b/cli-call-exact-help.txt @@ -102,9 +102,19 @@ options: The chosen field determines tha sample ids required in other input files e.g. the --sample-list argument. --report [REPORT ...] - Extra fields to report within the output VCF: AFPRIOR - = prior allele frequencies; AFP = posterior mean - allele frequencies; AOP = posterior probability of - allele occurring at any copy number; GP = genotype - posterior probabilities; GL = genotype likelihoods. + Extra fields to report within the output VCF. The + INFO/FORMAT prefix may be omitted to return both + variations of the named field. Options include: + INFO/AFPRIOR = Prior allele frequencies; INFO/ACP = + Posterior allele counts; INFO/AFP = Posterior mean + allele frequencies; INFO/AOP = Posterior probability + of allele occurring across all samples; INFO/AOPSUM = + Posterior estimate of the number of samples containing + an allele; INFO/SNVDP = Read depth at each SNV + position; FORMAT/ACP: Posterior allele counts; + FORMAT/AFP: Posterior mean allele frequencies; + FORMAT/AOP: Posterior probability of allele occurring; + FORMAT/GP: Genotype posterior probabilities; + FORMAT/GL: Genotype likelihoods; FORMAT/SNVDP: Read + depth at each SNV position --cores CORES Number of cpu cores to use (default = 1). diff --git a/cli-call-help.txt b/cli-call-help.txt index 4d1dd3d2..ab06c5ca 100644 --- a/cli-call-help.txt +++ b/cli-call-help.txt @@ -106,11 +106,21 @@ options: The chosen field determines tha sample ids required in other input files e.g. the --sample-list argument. --report [REPORT ...] - Extra fields to report within the output VCF: AFPRIOR - = prior allele frequencies; AFP = posterior mean - allele frequencies; AOP = posterior probability of - allele occurring at any copy number; GP = genotype - posterior probabilities; GL = genotype likelihoods. + Extra fields to report within the output VCF. The + INFO/FORMAT prefix may be omitted to return both + variations of the named field. Options include: + INFO/AFPRIOR = Prior allele frequencies; INFO/ACP = + Posterior allele counts; INFO/AFP = Posterior mean + allele frequencies; INFO/AOP = Posterior probability + of allele occurring across all samples; INFO/AOPSUM = + Posterior estimate of the number of samples containing + an allele; INFO/SNVDP = Read depth at each SNV + position; FORMAT/ACP: Posterior allele counts; + FORMAT/AFP: Posterior mean allele frequencies; + FORMAT/AOP: Posterior probability of allele occurring; + FORMAT/GP: Genotype posterior probabilities; + FORMAT/GL: Genotype likelihoods; FORMAT/SNVDP: Read + depth at each SNV position --cores CORES Number of cpu cores to use (default = 1). --mcmc-chains MCMC_CHAINS Number of independent MCMC chains per assembly @@ -124,6 +134,5 @@ options: --mcmc-seed MCMC_SEED Random seed for MCMC (default = 42). --mcmc-chain-incongruence-threshold MCMC_CHAIN_INCONGRUENCE_THRESHOLD - Posterior phenotype probability threshold for - identification of incongruent posterior modes (default - = 0.60). + Posterior probability threshold for identification of + incongruent posterior modes (default = 0.60). diff --git a/cli-call-pedigree-help.txt b/cli-call-pedigree-help.txt new file mode 100644 index 00000000..758eaf0d --- /dev/null +++ b/cli-call-pedigree-help.txt @@ -0,0 +1,187 @@ +usage: MCMC haplotype calling via pedigree-annealing. [-h] + [--haplotypes HAPLOTYPES] + [--prior-frequencies PRIOR_FREQUENCIES] + [--filter-input-haplotypes FILTER_INPUT_HAPLOTYPES] + [--bam BAM [BAM ...]] + [--ploidy PLOIDY] + [--sample-parents SAMPLE_PARENTS] + [--gamete-ploidy GAMETE_PLOIDY] + [--gamete-ibd GAMETE_IBD] + [--gamete-error GAMETE_ERROR] + [--sample-pool SAMPLE_POOL] + [--reference REFERENCE] + [--base-error-rate BASE_ERROR_RATE] + [--use-base-phred-scores] + [--mapping-quality MAPPING_QUALITY] + [--keep-duplicate-reads] + [--keep-qcfail-reads] + [--keep-supplementary-reads] + [--read-group-field READ_GROUP_FIELD] + [--report [REPORT ...]] + [--cores CORES] + [--mcmc-chains MCMC_CHAINS] + [--mcmc-steps MCMC_STEPS] + [--mcmc-burn MCMC_BURN] + [--mcmc-seed MCMC_SEED] + [--mcmc-chain-incongruence-threshold MCMC_CHAIN_INCONGRUENCE_THRESHOLD] + +options: + -h, --help show this help message and exit + --haplotypes HAPLOTYPES + Tabix indexed VCF file containing haplotype/MNP/SNP + variants to be re-called among input samples. + --prior-frequencies PRIOR_FREQUENCIES + Optionally specify an INFO field within the input VCF + file to designate as prior allele frequencies for the + input haplotypes. This can be any numerical field of + length 'R' and these values will automatically be + normalized. + --filter-input-haplotypes FILTER_INPUT_HAPLOTYPES + Optionally filter input haplotypes using a string of + the form '' where is a + numerical INFO field with length 'A' or 'R', + is one of =|>|<|>=|<=|!=, and is a + numerical value. + --bam BAM [BAM ...] Bam file(s) to use in analysis. This may be (1) a list + of one or more bam filepaths, (2) a plain-text file + containing a single bam filepath on each line, (3) a + plain-text file containing a sample identifier and its + corresponding bam filepath on each line separated by a + tab. If options (1) or (2) are used then all samples + within each bam will be used within the analysis. If + option (3) is used then only the specified sample will + be extracted from each bam file and An error will be + raised if a sample is not found within its specified + bam file. + --ploidy PLOIDY Specify sample ploidy (default = 2).This may be (1) a + single integer used to specify the ploidy of all + samples or (2) a file containing a list of all samples + and their ploidy. If option (2) is used then each line + of the plaintext file must contain a single sample + identifier and the ploidy of that sample separated by + a tab. + --sample-parents SAMPLE_PARENTS + A file containing a list of samples and their parents + used to indicate pedigree structure. Each line should + contain a sample identifier followed by both parent + identifiers separated by tabs. A period '.' is used to + indicate unknown parents. + --gamete-ploidy GAMETE_PLOIDY + Ploidy of the gametes contributing to each sample. By + default it is assumed that the ploidy of each gamete + is equal to half the ploidy of the sample derived from + that gamete. If all gametes have the same ploidy then + a single number can be specified. If gametic ploidy is + variable then these values must be specified with a + file containing a list of samples and the ploidy of + the gametes they were derived from. Each line of this + file should contain a sample identifier followed by + the ploidy of gametes derived from each parent in the + same order as specified using the --sample-parents + argument. For each sample, the ploidy of the two + gametes must sum to the ploidy of that sample. + --gamete-ibd GAMETE_IBD + Excess IBD/homozygosity due to meiotic processes. By + default this variable is 0.0 for all gametes and non- + zero values may only be specified for gametes with a + ploidy of 2. This value must be in the interval [0, 1] + with a value of 0.0 indicating no excess + ibd/homozygosity and a value of 1.0 indicating that + the gamete must be fully homozygous.If a single value + is specified then this will be applied to all gametes. + If this value varies between gametes then it must be + specified with a file containing a list of samples and + the value associated with each gamete those samples + are derived from. Each line should contain a sample + identifier followed by value of each gamete in the + same order as specified using the --sample-parents + argument. + --gamete-error GAMETE_ERROR + An error term associated with each parent-child pair + indicating the probability that that gamete was not + derived from the specified parent. By default this + variable is 0.01 for all parent-child pairs. This + value must be in the interval [0, 1] and should + generally be > 0 and < 1.If a single value is + specified then this will be applied to all parent- + child pairs. If this value varies between gametes then + it must be specified with a file containing a list of + samples and the value associated with each gamete + those samples are derived from. Each line should + contain a sample identifier followed by value of each + gamete in the same order as specified using the + --sample-parents argument. + --sample-pool SAMPLE_POOL + WARNING: this is an experimental feature!!! Pool + samples together into a single genotype. This may be + (1) the name of a single pool for all samples or (2) a + file containing a list of all samples and their + assigned pool. If option (2) is used then each line of + the plaintext file must contain a single sample + identifier and the name of a pool separated by a + tab.Samples may be assigned to multiple pools by using + the same sample name on multiple lines.Each pool will + treated as a single genotype by combining all reads + from its constituent samples. Note that the pool names + should be used in place of the samples names when + assigning other per-sample parameters such as ploidy + or inbreeding coefficients. + --reference REFERENCE + Indexed fasta file containing the reference genome. + --base-error-rate BASE_ERROR_RATE + Expected base error rate of read sequences (default = + 0.0024). The default value comes from Pfeiffer et al + 2018 and is a general estimate for Illumina short + reads. + --use-base-phred-scores + Flag: use base phred-scores as a source of base error + rate. This will use the phred-encoded per base scores + in addition to the general error rate specified by the + --base-error-rate argument. Using this option can slow + down assembly speed. + --mapping-quality MAPPING_QUALITY + Minimum mapping quality of reads used in assembly + (default = 20). + --keep-duplicate-reads + Flag: Use reads marked as duplicates in the assembly + (these are skipped by default). + --keep-qcfail-reads Flag: Use reads marked as qcfail in the assembly + (these are skipped by default). + --keep-supplementary-reads + Flag: Use reads marked as supplementary in the + assembly (these are skipped by default). + --read-group-field READ_GROUP_FIELD + Read group field to use as sample id (default = "SM"). + The chosen field determines tha sample ids required in + other input files e.g. the --sample-list argument. + --report [REPORT ...] + Extra fields to report within the output VCF. The + INFO/FORMAT prefix may be omitted to return both + variations of the named field. Options include: + INFO/AFPRIOR = Prior allele frequencies; INFO/ACP = + Posterior allele counts; INFO/AFP = Posterior mean + allele frequencies; INFO/AOP = Posterior probability + of allele occurring across all samples; INFO/AOPSUM = + Posterior estimate of the number of samples containing + an allele; INFO/SNVDP = Read depth at each SNV + position; FORMAT/ACP: Posterior allele counts; + FORMAT/AFP: Posterior mean allele frequencies; + FORMAT/AOP: Posterior probability of allele occurring; + FORMAT/GP: Genotype posterior probabilities; + FORMAT/GL: Genotype likelihoods; FORMAT/SNVDP: Read + depth at each SNV position + --cores CORES Number of cpu cores to use (default = 1). + --mcmc-chains MCMC_CHAINS + Number of independent MCMC chains per assembly + (default = 2). + --mcmc-steps MCMC_STEPS + Number of steps to simulate in each MCMC chain + (default = 2000). + --mcmc-burn MCMC_BURN + Number of initial steps to discard from each MCMC + chain (default = 1000). + --mcmc-seed MCMC_SEED + Random seed for MCMC (default = 42). + --mcmc-chain-incongruence-threshold MCMC_CHAIN_INCONGRUENCE_THRESHOLD + Posterior probability threshold for identification of + incongruent posterior modes (default = 0.60). diff --git a/docs/assemble.rst b/docs/assemble.rst index 67fbe2fb..fe86e220 100644 --- a/docs/assemble.rst +++ b/docs/assemble.rst @@ -3,7 +3,7 @@ MCHap assemble De novo assembly of micro-haplotypes. -*(Last updated for MCHap version 0.9.3)* +*(Last updated for MCHap version 0.10.0)* Background ---------- @@ -254,17 +254,31 @@ Output parameters Output parameters are used to determine which data are reported by MCHap. These parameters have no effect on the assembly process itself, but may be important for -downstream analysis. - -- ``--report``: Specify one or more optional fields to report in the output VCF file. - The available options include: - - * ``AFP``: Posterior mean allele frequencies (One value per unique allele for each sample). +downstream analysis. MCHap has a range of optional ``INFO`` and ``FORMAT`` parameters that +can be reported with the ``--report`` argument: + +- Optional fields: + + * ``INFO/AFPRIOR``: The prior allele frequencies used for genotype calls. + * ``INFO/ACP``: Posterior mean allele counts of the population (One value per unique allele). + * ``INFO/AFP``: Posterior mean allele frequencies of the population (One value per unique allele). + * ``INFO/AOP``: Posterior probability of allele occurring in the population (One value per unique allele). + * ``INFO/AOPSUM``: Posterior estimate of the number of samples containing an allele (One value per unique allele). + * ``INFO/SNVDP``: Total read depth at each SNV position withing the assembled locus (One value per SNV). + * ``FORMAT/ACP``: Posterior mean allele counts (One value per unique allele for each sample). + * ``FORMAT/AFP``: Posterior mean allele frequencies (One value per unique allele for each sample). The mean posterior allele frequency across all samples will be reported as an INFO field. - * ``AOP``: Posterior probability of allele occurring in a sample (One value per unique allele for each sample). + * ``FORMAT/AOP``: Posterior probability of allele occurring in a sample (One value per unique allele for each sample). The probability of each allele occurring across all samples will be reported as an INFO field. - * ``GP``: Genotype posterior probabilities (One value per possible genotype per sample). - * ``GL``: Genotype Likelihoods (One value per possible genotype per sample). + * ``FORMAT/GP``: Genotype posterior probabilities (One value per possible genotype per sample). + * ``FORMAT/GL``: Genotype Likelihoods (One value per possible genotype per sample). + * ``FORMAT/SNVDP``: Read depth at each SNV position withing the assembled locus (One value per SNV). + +- Examples: + + * ``--report INFO/AFP``: will report the ``INFO/AFP`` field. + * ``--report AFP``: will report the ``INFO/AFP`` and ``FORMAT/AFP`` fields. + * ``--report INFO/AOP FORMAT/AFP``: will report the ``INFO/AOP`` and ``FORMAT/AFP`` fields. Note that reporting the ``GP`` or ``GL`` fields can result in exceptionally large VCF files! diff --git a/docs/call.rst b/docs/call.rst index 53be6636..f1071d79 100644 --- a/docs/call.rst +++ b/docs/call.rst @@ -3,7 +3,7 @@ MCHap call Calling genotypes from known haplotypes. -*(Last updated for MCHap version 0.9.3)* +*(Last updated for MCHap version 0.10.0)* Background ---------- @@ -220,17 +220,31 @@ Output parameters Output parameters are used to determine which data are reported by MCHap. These parameters have no effect on the assembly process itself, but may be important for -downstream analysis. - -- ``--report``: Specify one or more optional fields to report in the output VCF file. - The available options include: - - * ``AFP``: Posterior mean allele frequencies (One value per unique allele for each sample). +downstream analysis. MCHap has a range of optional ``INFO`` and ``FORMAT`` parameters that +can be reported with the ``--report`` argument: + +- Optional fields: + + * ``INFO/AFPRIOR``: The prior allele frequencies used for genotype calls. + * ``INFO/ACP``: Posterior mean allele counts of the population (One value per unique allele). + * ``INFO/AFP``: Posterior mean allele frequencies of the population (One value per unique allele). + * ``INFO/AOP``: Posterior probability of allele occurring in the population (One value per unique allele). + * ``INFO/AOPSUM``: Posterior estimate of the number of samples containing an allele (One value per unique allele). + * ``INFO/SNVDP``: Total read depth at each SNV position withing the assembled locus (One value per SNV). + * ``FORMAT/ACP``: Posterior mean allele counts (One value per unique allele for each sample). + * ``FORMAT/AFP``: Posterior mean allele frequencies (One value per unique allele for each sample). The mean posterior allele frequency across all samples will be reported as an INFO field. - * ``AOP``: Posterior probability of allele occurring in a sample (One value per unique allele for each sample). + * ``FORMAT/AOP``: Posterior probability of allele occurring in a sample (One value per unique allele for each sample). The probability of each allele occurring across all samples will be reported as an INFO field. - * ``GP``: Genotype posterior probabilities (One value per possible genotype per sample). - * ``GL``: Genotype Likelihoods (One value per possible genotype per sample). + * ``FORMAT/GP``: Genotype posterior probabilities (One value per possible genotype per sample). + * ``FORMAT/GL``: Genotype Likelihoods (One value per possible genotype per sample). + * ``FORMAT/SNVDP``: Read depth at each SNV position withing the assembled locus (One value per SNV). + +- Examples: + + * ``--report INFO/AFP``: will report the ``INFO/AFP`` field. + * ``--report AFP``: will report the ``INFO/AFP`` and ``FORMAT/AFP`` fields. + * ``--report INFO/AOP FORMAT/AFP``: will report the ``INFO/AOP`` and ``FORMAT/AFP`` fields. Note that reporting the ``GP`` or ``GL`` fields can result in exceptionally large VCF files! diff --git a/docs/example/bi-parental-pedigree.ipynb b/docs/example/bi-parental-pedigree.ipynb new file mode 100644 index 00000000..4e8badd2 --- /dev/null +++ b/docs/example/bi-parental-pedigree.ipynb @@ -0,0 +1,769 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "8bbf4feb-901d-4c5d-bcde-00d6d3be5f8e", + "metadata": {}, + "source": [ + "# Pedigree informed micro-haplotype calling in an autopolyploid bi-parental cross\n", + "\n", + "*(Last updated for MCHap version 0.10.0)*\n", + "\n", + "This notebook demonstrates pedigree informed micro-haplotype calling in a small bi-parental cross.\n", + "\n", + "**WARNING: The `call-pedigree` tool is considered highly experimental**!!!\n", + "\n", + "The following topics are introduced:\n", + "\n", + "- **Pooled de novo haplotype assembly with `mchap assemble`**\n", + " - Input files\n", + " - Sample pooling\n", + "- **Re-calling genotypes with `mchap call`**\n", + " - Specifying a population prior on allele frequencies\n", + "- **Re-calling genotypes with `mchap call-pedigree`**\n", + " - Specifying pedigree to inform haplotype calling\n", + "\n", + "**Software requirements:**\n", + "\n", + "This notebook uses the [bash-kernel](https://github.com/takluyver/bash_kernel) for Jupyter which can be installed with `pip install bash_kernel`.\n", + "Alternatively, the code from this notebook may be run in a unix-like bash environment.\n", + "\n", + "In addition to using the MCHap software, these examples also require the `bgzip` and `tabix` tools which are part of [`htslib`](https://github.com/samtools/htslib).\n", + "\n", + "**Data sources:**\n", + "\n", + "The bi-parental population used within this notebook is a small subset of the population published by:\n", + "J Tahir, C Brendolise, S Hoyte, M Lucas, S Thomson, K Hoeata, C McKenzie, A Wotton, K Funnell, E Morgan, D Hedderley, D Chagné, P M Bourke, J McCallum, S E Gardiner,* and L Gea \n", + "“QTL Mapping for Resistance to Cankers Induced by Pseudomonas syringae pv. actinidiae (Psa) in a Tetraploid Actinidia chinensis Kiwifruit Population” \n", + "Pathogens 2020, 9, 967; doi:10.3390/pathogens9110967\n", + "\n", + "- Raw sequences: [10.5281/zenodo.4285665](https://zenodo.org/record/4285666) and [10.5281/zenodo.4287636](https://zenodo.org/record/4287637)\n", + "- Reference genome: DOI [10.5281/zenodo.5717386](https://zenodo.org/record/5717387) (chromosome 1 only)\n" + ] + }, + { + "cell_type": "markdown", + "id": "6917e307-5ed1-4fd5-8fbe-3df393e24c5c", + "metadata": {}, + "source": [ + "## De novo haplotype assembly with `mchap assemble`\n", + "\n", + "*For more background information on* `mchap assemble` *see the online [documentation](https://github.com/PlantandFoodResearch/MCHap/blob/master/docs/assemble.rst).*" + ] + }, + { + "cell_type": "markdown", + "id": "ef434b09-0305-49b2-9ec1-6190a604fa76", + "metadata": {}, + "source": [ + "### Input files\n", + "\n", + "The required input files have been organised by file type:\n", + "\n", + "- `input/bam` BAM alignment files for the parents and progeny samples\n", + "- `input/bed` Target loci for haplotype assembly\n", + "- `input/vcf` VCF file of \"basis\" SNVs\n", + "- `input/fasta`: Reference genome" + ] + }, + { + "cell_type": "markdown", + "id": "7a3a629d-6067-4375-bea0-d81a9f80de3d", + "metadata": {}, + "source": [ + "In this example we use one BAM file per sample:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "3dda15df-9fa3-4b38-9b0c-c16df023dd99", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "convert_to_cram.sh \u001b[0m\u001b[01;32mprogeny006.loci.bam\u001b[0m \u001b[01;32mprogeny013.loci.bam.bai\u001b[0m\n", + "\u001b[01;32mparent1.loci.bam\u001b[0m \u001b[01;32mprogeny006.loci.bam.bai\u001b[0m \u001b[01;32mprogeny014.loci.bam\u001b[0m\n", + "\u001b[01;32mparent1.loci.bam.bai\u001b[0m \u001b[01;32mprogeny007.loci.bam\u001b[0m \u001b[01;32mprogeny014.loci.bam.bai\u001b[0m\n", + "\u001b[01;32mparent2.loci.bam\u001b[0m \u001b[01;32mprogeny007.loci.bam.bai\u001b[0m \u001b[01;32mprogeny015.loci.bam\u001b[0m\n", + "\u001b[01;32mparent2.loci.bam.bai\u001b[0m \u001b[01;32mprogeny008.loci.bam\u001b[0m \u001b[01;32mprogeny015.loci.bam.bai\u001b[0m\n", + "\u001b[01;32mprogeny001.loci.bam\u001b[0m \u001b[01;32mprogeny008.loci.bam.bai\u001b[0m \u001b[01;32mprogeny016.loci.bam\u001b[0m\n", + "\u001b[01;32mprogeny001.loci.bam.bai\u001b[0m \u001b[01;32mprogeny009.loci.bam\u001b[0m \u001b[01;32mprogeny016.loci.bam.bai\u001b[0m\n", + "\u001b[01;32mprogeny002.loci.bam\u001b[0m \u001b[01;32mprogeny009.loci.bam.bai\u001b[0m \u001b[01;32mprogeny017.loci.bam\u001b[0m\n", + "\u001b[01;32mprogeny002.loci.bam.bai\u001b[0m \u001b[01;32mprogeny010.loci.bam\u001b[0m \u001b[01;32mprogeny017.loci.bam.bai\u001b[0m\n", + "\u001b[01;32mprogeny003.loci.bam\u001b[0m \u001b[01;32mprogeny010.loci.bam.bai\u001b[0m \u001b[01;32mprogeny018.loci.bam\u001b[0m\n", + "\u001b[01;32mprogeny003.loci.bam.bai\u001b[0m \u001b[01;32mprogeny011.loci.bam\u001b[0m \u001b[01;32mprogeny018.loci.bam.bai\u001b[0m\n", + "\u001b[01;32mprogeny004.loci.bam\u001b[0m \u001b[01;32mprogeny011.loci.bam.bai\u001b[0m \u001b[01;32mprogeny019.loci.bam\u001b[0m\n", + "\u001b[01;32mprogeny004.loci.bam.bai\u001b[0m \u001b[01;32mprogeny012.loci.bam\u001b[0m \u001b[01;32mprogeny019.loci.bam.bai\u001b[0m\n", + "\u001b[01;32mprogeny005.loci.bam\u001b[0m \u001b[01;32mprogeny012.loci.bam.bai\u001b[0m \u001b[01;32mprogeny020.loci.bam\u001b[0m\n", + "\u001b[01;32mprogeny005.loci.bam.bai\u001b[0m \u001b[01;32mprogeny013.loci.bam\u001b[0m \u001b[01;32mprogeny020.loci.bam.bai\u001b[0m\n" + ] + } + ], + "source": [ + "ls input/bam" + ] + }, + { + "cell_type": "markdown", + "id": "872b7113-9697-4b89-9d9b-ff2b17bdd6aa", + "metadata": {}, + "source": [ + "The BED file specifies the genomic coordinates of assembly targets. The fourth column (loci ID) of the BED file is optional but, if present, the loci IDs will be included in the output VCF file:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e0990cdb-39a8-4c2c-bd6f-ff5056f6243f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "chr1\t17590\t17709\tlocus001\n", + "chr1\t568848\t568967\tlocus012\n", + "chr1\t684808\t684927\tlocus016\n", + "chr1\t809104\t809223\tlocus019\n" + ] + } + ], + "source": [ + "cat input/bed/targets4.bed" + ] + }, + { + "cell_type": "markdown", + "id": "c86c9d66-930d-4d91-8fca-4bd38574312a", + "metadata": {}, + "source": [ + "The input VCF file is used to specify basis SNVs for haplotype alleles. These may be multi-allelic SNVs. Any sample data within this VCF file will be ignored:" + ] + }, + { + "cell_type": "markdown", + "id": "ae59e2e6-5892-4eda-b571-4c0df85ca3e1", + "metadata": {}, + "source": [ + "### Identify putative SNVs\n", + "\n", + "MCHap includes the `find-snvs` tool for identifying putative SNVs.\n", + "This is a fast but simplistic approach to identifying potential basis variants for assembling into haplotypes." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1442f65e-2749-4879-b819-aa9646dd12d0", + "metadata": {}, + "outputs": [], + "source": [ + "mchap find-snvs \\\n", + " --bam input/bam/*.bam \\\n", + " --reference input/fasta/chr1.fa.gz \\\n", + " --targets input/bed/targets4.bed \\\n", + " --ind-maf 0.1 \\\n", + " --ind-mad 3 \\\n", + " --min-ind 2 \\\n", + " | bgzip > putative_snvs.vcf.gz\n", + "tabix -p vcf putative_snvs.vcf.gz" + ] + }, + { + "cell_type": "markdown", + "id": "15dc29b1-0e25-4408-a003-84f20b6d8e5b", + "metadata": {}, + "source": [ + "Notes:\n", + "- The `--targets` parameter should be a bed file defining genomic interval to search for putative SNVs\n", + "- The `--ind-mad` parameter specifies a (per sample) minor allele depths \n", + "- The `--ind-maf` parameter specifies a (per sample) minor allele frequency (calculated from allele depths)\n", + "- The `--min-ind` parameter specifies the minimum number of sample required to meet the above conditions" + ] + }, + { + "cell_type": "markdown", + "id": "a9b6230e-42a3-4b20-b020-d101670ca7a0", + "metadata": {}, + "source": [ + "The output of `mchap find-snvs` is a VCF without genotype calls.\n", + "Instead, sample allele depths are reported.\n", + "The total allele depths and mean of individual frequencies are also reported in an `INFO` field:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4ff6bbf6-5705-4a6f-ab6b-8728da8ea211", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "##fileformat=VCFv4.3\n", + "##fileDate=20240910\n", + "##source=mchap v0.9.4.dev72+g719498f.d20240710\n", + "##commandline=\"/home/cfltxm/mambaforge/envs/mchap/bin/mchap find-snvs --bam input/bam/parent1.loci.bam input/bam/parent2.loci.bam input/bam/progeny001.loci.bam input/bam/progeny002.loci.bam input/bam/progeny003.loci.bam input/bam/progeny004.loci.bam input/bam/progeny005.loci.bam input/bam/progeny006.loci.bam input/bam/progeny007.loci.bam input/bam/progeny008.loci.bam input/bam/progeny009.loci.bam input/bam/progeny010.loci.bam input/bam/progeny011.loci.bam input/bam/progeny012.loci.bam input/bam/progeny013.loci.bam input/bam/progeny014.loci.bam input/bam/progeny015.loci.bam input/bam/progeny016.loci.bam input/bam/progeny017.loci.bam input/bam/progeny018.loci.bam input/bam/progeny019.loci.bam input/bam/progeny020.loci.bam --reference input/fasta/chr1.fa.gz --targets input/bed/targets4.bed --ind-maf 0.1 --ind-mad 3 --min-ind 2\"\n", + "##reference=file:input/fasta/chr1.fa.gz\n", + "##contig=\n", + "##INFO=\n", + "##INFO=\n", + "##INFO=\n", + "##FORMAT=\n", + "##FORMAT=\n", + "#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tparent1\tparent2\tprogeny001\tprogeny002\tprogeny003\tprogeny004\tprogeny005\tprogeny006\tprogeny007\tprogeny008\tprogeny009\tprogeny010\tprogeny011\tprogeny012\tprogeny013\tprogeny014\tprogeny015\tprogeny016\tprogeny017\tprogeny018\tprogeny019\tprogeny020\n", + "chr1\t17591\t.\tG\tA\t.\t.\tAD=449,81;ADMF=0.842,0.158\tGT:AD\t.:16,7\t.:17,3\t.:25,4\t.:6,4\t.:18,3\t.:20,8\t.:17,1\t.:15,2\t.:26,4\t.:26,5\t.:18,6\t.:17,2\t.:18,1\t.:25,3\t.:32,5\t.:19,3\t.:16,6\t.:20,3\t.:23,6\t.:30,2\t.:21,1\t.:24,2\n", + "chr1\t17602\t.\tG\tA\t.\t.\tAD=478,78;ADMF=0.849,0.151\tGT:AD\t.:18,9\t.:17,3\t.:25,4\t.:4,4\t.:19,3\t.:21,7\t.:16,1\t.:16,2\t.:28,4\t.:29,5\t.:22,6\t.:15,2\t.:19,1\t.:29,3\t.:32,2\t.:19,3\t.:18,6\t.:23,3\t.:24,6\t.:33,2\t.:25,1\t.:26,1\n", + "chr1\t17612\t.\tA\tG\t.\t.\tAD=483,81;ADMF=0.846,0.154\tGT:AD\t.:18,8\t.:18,3\t.:28,3\t.:4,4\t.:19,3\t.:22,8\t.:18,1\t.:15,3\t.:29,4\t.:27,5\t.:22,7\t.:17,1\t.:18,1\t.:29,4\t.:35,2\t.:19,3\t.:18,7\t.:23,2\t.:21,6\t.:34,3\t.:23,1\t.:26,2\n", + "chr1\t17616\t.\tA\tG\t.\t.\tAD=479,81;ADMF=0.843,0.157\tGT:AD\t.:17,8\t.:16,3\t.:27,3\t.:4,4\t.:18,3\t.:23,8\t.:17,2\t.:13,3\t.:31,4\t.:27,5\t.:21,5\t.:17,2\t.:20,1\t.:28,3\t.:34,2\t.:20,3\t.:18,7\t.:23,2\t.:24,6\t.:34,3\t.:22,1\t.:25,3\n", + "chr1\t17624\t.\tC\tT\t.\t.\tAD=536,60;ADMF=0.895,0.103\tGT:AD\t.:24,4\t.:20,0\t.:24,7\t.:7,2\t.:20,5\t.:26,3\t.:19,0\t.:13,4\t.:30,7\t.:36,0\t.:28,0\t.:20,0\t.:22,4\t.:32,0\t.:37,0\t.:18,7\t.:19,6\t.:26,0\t.:30,1\t.:30,10\t.:27,0\t.:28,0\n", + "chr1\t17625\t.\tG\tC\t.\t.\tAD=519,79;ADMF=0.856,0.144\tGT:AD\t.:18,8\t.:17,3\t.:29,3\t.:5,4\t.:22,3\t.:21,8\t.:17,2\t.:16,2\t.:37,4\t.:30,5\t.:21,4\t.:16,2\t.:23,1\t.:30,3\t.:36,2\t.:22,3\t.:19,7\t.:25,2\t.:26,6\t.:36,3\t.:27,1\t.:26,3\n", + "chr1\t17629\t.\tG\tT\t.\t.\tAD=534,74;ADMF=0.865,0.135\tGT:AD\t.:20,8\t.:17,3\t.:30,3\t.:5,4\t.:22,3\t.:21,8\t.:19,1\t.:16,3\t.:36,2\t.:29,4\t.:23,5\t.:17,1\t.:26,1\t.:29,3\t.:41,2\t.:23,3\t.:18,7\t.:27,2\t.:26,5\t.:34,3\t.:27,1\t.:28,2\n", + "chr1\t17655\t.\tG\tA\t.\t.\tAD=537,89;ADMF=0.849,0.15\tGT:AD\t.:22,10\t.:18,3\t.:28,3\t.:9,5\t.:25,3\t.:18,6\t.:25,3\t.:17,3\t.:35,3\t.:23,4\t.:20,6\t.:15,3\t.:28,3\t.:28,4\t.:36,4\t.:25,2\t.:22,5\t.:24,2\t.:27,8\t.:33,3\t.:30,1\t.:29,5\n" + ] + } + ], + "source": [ + "zcat putative_snvs.vcf.gz | head -n 20" + ] + }, + { + "cell_type": "markdown", + "id": "ee86267b-e05f-47e1-878e-56ab416eb3c9", + "metadata": { + "tags": [] + }, + "source": [ + "### Pooled assembly\n", + "\n", + "For this tutorial we will jump straight into a pooled assembly. A more beginner friendly example can be found in the standard MCHap [bi-parental example notebook](https://github.com/PlantandFoodResearch/MCHap/blob/master/docs/example/bi-parental.ipynb).\n", + "\n", + "Sample pools can be defined using a tabular file:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "599ec80a-e0ea-4c96-9d29-300fa7666299", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "parent1\tPOOL\n", + "parent2\tPOOL\n", + "progeny001\tPOOL\n", + "progeny002\tPOOL\n", + "progeny003\tPOOL\n", + "progeny004\tPOOL\n", + "progeny005\tPOOL\n", + "progeny006\tPOOL\n", + "progeny007\tPOOL\n", + "progeny008\tPOOL\n", + "progeny009\tPOOL\n", + "progeny010\tPOOL\n", + "progeny011\tPOOL\n", + "progeny012\tPOOL\n", + "progeny013\tPOOL\n", + "progeny014\tPOOL\n", + "progeny015\tPOOL\n", + "progeny016\tPOOL\n", + "progeny017\tPOOL\n", + "progeny018\tPOOL\n", + "progeny019\tPOOL\n", + "progeny020\tPOOL\n" + ] + } + ], + "source": [ + "cat input/pools/sample-pools.txt" + ] + }, + { + "cell_type": "markdown", + "id": "2198a916-264f-4215-8ebe-272c538df7b1", + "metadata": {}, + "source": [ + "In the file shown above we assign all of the samples to a pool called \"POOL\".\n", + "However, you can imagine a more complex scheme if out example data contained more than one bi-parental cross.\n", + "\n", + "We can then run the pooled assembly with:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "f9abbbf8-f143-482c-a26b-65fa92f9cc10", + "metadata": {}, + "outputs": [], + "source": [ + "mchap assemble \\\n", + " --bam input/bam/*.bam \\\n", + " --targets input/bed/targets4.bed \\\n", + " --variants putative_snvs.vcf.gz \\\n", + " --reference input/fasta/chr1.fa.gz \\\n", + " --sample-pool input/pools/sample-pools.txt \\\n", + " --ploidy 8 \\\n", + " --report AFP AOP \\\n", + " | bgzip > pooled_assembly.vcf.gz\n", + "tabix -p vcf pooled_assembly.vcf.gz" + ] + }, + { + "cell_type": "markdown", + "id": "05f4350d-9ca9-4949-a787-a9022aad6558", + "metadata": {}, + "source": [ + "Notes:\n", + "- The `--bam` argument may be file with a list of BAM paths ([documentation](https://github.com/PlantandFoodResearch/MCHap/blob/master/docs/assemble.rst#analyzing-many-samples))\n", + "- The `--ploidy` and `--inbreeding` values can be specified per sample using a simple tabular file ([documentation](https://github.com/PlantandFoodResearch/MCHap/blob/master/docs/assemble.rst#sample-parameters))\n", + "- The `--inbreeding` argument will default to `0` which may be unrealistic and it's often better to guess a \"sensible\" value ([documentation](https://github.com/PlantandFoodResearch/MCHap/blob/master/docs/assemble.rst#sample-parameters))\n", + "- The `--sample-pool` argument is (optionally) used to define sample pools ([documentation](https://github.com/PlantandFoodResearch/MCHap/blob/master/docs/assemble.rst#sample-pooling))\n", + "- The `--report AFP AOP` line tells MCHap to report posterior allele frequencies (`AFP`) and posterior allele occurance (`AOP`)\n", + "- The output of `mchap assemble` is piped into `bgzip` and the resulting compressed VCF file is saved as `assemble.vcf.gz`\n", + "- The `tabix` tool is then used to index the compressed VCF file" + ] + }, + { + "cell_type": "markdown", + "id": "30af9ce0-fb91-44ed-a52f-437c66dcd98b", + "metadata": {}, + "source": [ + "Look at the VCF header information:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "364bad0c-ff38-491d-bd6d-86d8e723ada1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#fileformat=VCFv4.3\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#fileDate=20240910\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#source=mchap v0.9.4.dev72+g719498f.d20240710\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#phasing=None\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#commandline=\"/home/cfltxm/mambaforge/envs/mchap/bin/mchap assemble --bam input/bam/parent1.loci.bam input/bam/parent2.loci.bam input/bam/progeny001.loci.bam input/bam/progeny002.loci.bam input/bam/progeny003.loci.bam input/bam/progeny004.loci.bam input/bam/progeny005.loci.bam input/bam/progeny006.loci.bam input/bam/progeny007.loci.bam input/bam/progeny008.loci.bam input/bam/progeny009.loci.bam input/bam/progeny010.loci.bam input/bam/progeny011.loci.bam input/bam/progeny012.loci.bam input/bam/progeny013.loci.bam input/bam/progeny014.loci.bam input/bam/progeny015.loci.bam input/bam/progeny016.loci.bam input/bam/progeny017.loci.bam input/bam/progeny018.loci.bam input/bam/progeny019.loci.bam input/bam/progeny020.loci.bam --targets input/bed/targets4.bed --variants putative_snvs.vcf.gz --reference input/fasta/chr1.fa.gz --sample-pool input/pools/sample-pools.txt --ploidy 8 --report AFP AOP\"\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#randomseed=42\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#contig=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FILTER=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FILTER=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FILTER=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[KCHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tPOOL\n" + ] + } + ], + "source": [ + "zcat pooled_assembly.vcf.gz | grep \"^#\"" + ] + }, + { + "cell_type": "markdown", + "id": "274d7199-45ca-44aa-b312-deca02e811b7", + "metadata": {}, + "source": [ + "Note that the above VCF contains a single sample named \"POOL\"" + ] + }, + { + "cell_type": "markdown", + "id": "d1a303b1-74d6-4565-b20e-7a91068414d2", + "metadata": {}, + "source": [ + "Look at `locus001`:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "0bc2a7d8-e364-4571-86f4-5c39d345dd07", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC\t.\tPASS\tAN=8;UAN=3;AC=1,1;NS=1;MCI=0;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116;AFP=0.75,0.125,0.125;AOP=1,1,1\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:AOP\t0/0/0/0/0/0/1/2:60:60:619:847:8019:17:0.002:1:1:0:0.75,0.125,0.125:1,1,1\n" + ] + } + ], + "source": [ + "zcat pooled_assembly.vcf.gz | grep \"locus001\"" + ] + }, + { + "cell_type": "markdown", + "id": "559d087d-b500-42d3-8989-b083126c4d2c", + "metadata": {}, + "source": [ + "### Individual genotype calling\n", + "\n", + "We will start by calling genotypes using a prior on allele frequencies derived from the population" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "84e164f5-fa39-4881-801c-6d856ae24de9", + "metadata": {}, + "outputs": [], + "source": [ + "mchap call \\\n", + " --bam input/bam/*.loci.bam \\\n", + " --haplotypes pooled_assembly.vcf.gz \\\n", + " --ploidy 4 \\\n", + " --inbreeding 0.01 \\\n", + " --prior-frequencies AFP \\\n", + " | bgzip > individual_calling.vcf.gz\n", + "tabix -p vcf individual_calling.vcf.gz" + ] + }, + { + "cell_type": "markdown", + "id": "1c56b657-c879-4808-8b06-5b6527d2f388", + "metadata": {}, + "source": [ + "Notes:\n", + "- The `--prior-frequencies AFP` command tells MCHap to use the posterior allele frequencies from the assembly (`AFP`) as the priors for calling genotypes" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "08f9a746-cf8f-4aa2-a42e-553f99511ef5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC\t.\tPASS\tAN=88;UAN=3;AC=22,12;NS=22;MCI=0;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI\t0/0/1/2:60:60:30:43:383:2:0.005:1:1:0\t0/0/0/1:60:60:22:28:280:2:0.007:1:1:0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0\t0/0/1/2:23:60:14:26:176:0:0:0.995:1:0\t0/0/1/2:60:60:25:31:320:0:0:1:1:0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0\t0/0/0/1:60:60:22:33:291:0:0:1:1:0\t0/0/1/2:30:60:21:26:272:1:0.004:0.999:1:0\t0/0/1/2:60:60:38:50:497:1:0.002:1:1:0\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0\t0/0/0/1:24:60:28:41:358:4:0.011:0.996:1:0\t0/0/0/1:28:60:19:27:251:0:0:0.998:1:0\t0/0/1/2:60:60:27:35:347:0:0:1:1:0\t0/0/0/1:60:60:30:37:387:3:0.008:1:1:0\t0/0/0/1:60:60:39:58:511:0:0:1:1:0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0\t0/0/1/2:60:60:25:34:326:1:0.003:1:1:0\t0/0/0/1:60:60:26:35:341:0:0:1:1:0\t0/0/1/2:60:60:34:45:441:0:0:1:1:0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0\t0/0/0/1:7:7:30:39:386:3:0.008:0.786:0.786:0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0\n" + ] + } + ], + "source": [ + "zcat individual_calling.vcf.gz | grep \"locus001\"" + ] + }, + { + "cell_type": "markdown", + "id": "c81e397a-87e2-4881-8224-d536156f9a22", + "metadata": {}, + "source": [ + "## Pedigree informed genotype calling\n", + "\n", + "**WARNING: This the `call-pedigree` program is highly experimental!**\n", + "\n", + "Next we look at pedigree informed genotype calling.\n", + "In MCHap, a pedigree is defined with a simple tabular format:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "378412d6-e4e4-441b-b37b-3ddef7eb53e6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "parent1\t.\t.\n", + "parent2\t.\t.\n", + "progeny001\tparent1\tparent2\n", + "progeny002\tparent1\tparent2\n", + "progeny003\tparent1\tparent2\n", + "progeny004\tparent1\tparent2\n", + "progeny005\tparent1\tparent2\n", + "progeny006\tparent1\tparent2\n", + "progeny007\tparent1\tparent2\n", + "progeny008\tparent1\tparent2\n", + "progeny009\tparent1\tparent2\n", + "progeny010\tparent1\tparent2\n", + "progeny011\tparent1\tparent2\n", + "progeny012\tparent1\tparent2\n", + "progeny013\tparent1\tparent2\n", + "progeny014\tparent1\tparent2\n", + "progeny015\tparent1\tparent2\n", + "progeny016\tparent1\tparent2\n", + "progeny017\tparent1\tparent2\n", + "progeny018\tparent1\tparent2\n", + "progeny019\tparent1\tparent2\n", + "progeny020\tparent1\tparent2\n" + ] + } + ], + "source": [ + "cat input/pedigree/pedigree.txt" + ] + }, + { + "cell_type": "markdown", + "id": "8eef38c1-ac25-4f77-9a35-0c7991fe7561", + "metadata": {}, + "source": [ + "We can run `mchap call-pedigree` with:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "8c892051-df00-4389-a3e8-313115773b17", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/cfltxm/Repo/MCHap/mchap/application/call_pedigree.py:45: ExperimentalFeatureWarning: THIS PROGRAM IS HIGHLY EXPERIMENTAL!!!\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "mchap call-pedigree \\\n", + " --bam input/bam/*.loci.bam \\\n", + " --haplotypes pooled_assembly.vcf.gz \\\n", + " --ploidy 4 \\\n", + " --sample-parents input/pedigree/pedigree.txt \\\n", + " --gamete-error 0.1 \\\n", + " --prior-frequencies AFP \\\n", + " | bgzip > pedigree_calling.vcf.gz\n", + "tabix -p vcf pedigree_calling.vcf.gz" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "77763113-9a7e-4cca-adb0-d01c0c855d6b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[01;31m\u001b[K#CHROM\u001b[m\u001b[K\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tparent1\tparent2\tprogeny001\tprogeny002\tprogeny003\tprogeny004\tprogeny005\tprogeny006\tprogeny007\tprogeny008\tprogeny009\tprogeny010\tprogeny011\tprogeny012\tprogeny013\tprogeny014\tprogeny015\tprogeny016\tprogeny017\tprogeny018\tprogeny019\tprogeny020\n", + "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC\t.\tPASS\tAN=88;UAN=3;AC=22,12;NS=22;MCI=0;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR\t0/0/1/2:60:60:30:43:383:2:0.005:1:1:0:0\t0/0/0/1:60:60:22:28:280:2:0.007:1:1:0:0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0:0\t0/0/1/2:33:60:14:26:176:0:0:1:1:0:0\t0/0/1/2:60:60:25:31:320:0:0:1:1:0:0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0:0\t0/0/0/1:60:60:22:33:291:0:0:1:1:0:0\t0/0/1/2:60:60:21:26:272:1:0.004:1:1:0:0\t0/0/1/2:60:60:38:50:497:1:0.002:1:1:0:0\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0:0\t0/0/0/1:24:60:28:41:358:4:0.011:0.996:1:0:0\t0/0/0/1:25:60:19:27:251:0:0:0.996:1:0:0\t0/0/1/2:60:60:27:35:347:0:0:1:1:0:0\t0/0/0/1:60:60:30:37:387:3:0.008:1:1:0:0\t0/0/0/1:60:60:39:58:511:0:0:1:1:0:0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0:0\t0/0/1/2:60:60:25:34:326:1:0.003:1:1:0:0\t0/0/0/1:60:60:26:35:341:0:0:1:1:0:0\t0/0/1/2:60:60:34:45:441:0:0:1:1:0:0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0:0\t0/0/0/1:5:5:30:39:386:3:0.008:0.683:0.683:0:0\t0/0/0/1:33:60:30:38:390:0:0:1:1:0:0\n" + ] + } + ], + "source": [ + "zcat pedigree_calling.vcf.gz | grep \"#CHROM\"\n", + "zcat pedigree_calling.vcf.gz | grep \"locus001\"" + ] + }, + { + "cell_type": "markdown", + "id": "d7cbb074-6857-4205-813f-eef9302d99d6", + "metadata": {}, + "source": [ + "### Pedigree imputation\n", + "\n", + "If the pedigree names an individual that does not have an alignment file then MCHap will attempt to impute that individuals genotype.\n", + "\n", + "We can create a list of alingment files that does not include `parent1`:" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "1539e88b-b5bb-4a18-a4a2-2127071a4218", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "input/bam/parent2.loci.bam\n", + "input/bam/progeny001.loci.bam\n", + "input/bam/progeny002.loci.bam\n", + "input/bam/progeny003.loci.bam\n", + "input/bam/progeny004.loci.bam\n", + "input/bam/progeny005.loci.bam\n", + "input/bam/progeny006.loci.bam\n", + "input/bam/progeny007.loci.bam\n", + "input/bam/progeny008.loci.bam\n", + "input/bam/progeny009.loci.bam\n", + "input/bam/progeny010.loci.bam\n", + "input/bam/progeny011.loci.bam\n", + "input/bam/progeny012.loci.bam\n", + "input/bam/progeny013.loci.bam\n", + "input/bam/progeny014.loci.bam\n", + "input/bam/progeny015.loci.bam\n", + "input/bam/progeny016.loci.bam\n", + "input/bam/progeny017.loci.bam\n", + "input/bam/progeny018.loci.bam\n", + "input/bam/progeny019.loci.bam\n", + "input/bam/progeny020.loci.bam\n" + ] + } + ], + "source": [ + "ls input/bam/*.bam | tail -n 21 > bams.txt\n", + "cat bams.txt" + ] + }, + { + "cell_type": "markdown", + "id": "6e18bbd4-cde3-4900-bf55-2eb0b46180c6", + "metadata": {}, + "source": [ + "We then run `mchap call-pedigree` using that list of BAM files:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "c64875bc-a781-4f57-975e-0acc1b937b0d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/home/cfltxm/Repo/MCHap/mchap/application/call_pedigree.py:45: ExperimentalFeatureWarning: THIS PROGRAM IS HIGHLY EXPERIMENTAL!!!\n", + " warnings.warn(\n" + ] + } + ], + "source": [ + "mchap call-pedigree \\\n", + " --bam bams.txt \\\n", + " --haplotypes pooled_assembly.vcf.gz \\\n", + " --ploidy 4 \\\n", + " --sample-parents input/pedigree/pedigree.txt \\\n", + " --gamete-error 0.1 \\\n", + " --prior-frequencies AFP \\\n", + " | bgzip > pedigree_imputing.vcf.gz\n", + "tabix -p vcf pedigree_imputing.vcf.gz" + ] + }, + { + "cell_type": "markdown", + "id": "e0df7d27-7070-40a2-9435-ad82fbd5f56a", + "metadata": {}, + "source": [ + "We can see that `parent1` has been added as the last sample on the list:" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "722e11c6-3bd1-4b23-942c-8110e33f387d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[01;31m\u001b[K#CHROM\u001b[m\u001b[K\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tparent2\tprogeny001\tprogeny002\tprogeny003\tprogeny004\tprogeny005\tprogeny006\tprogeny007\tprogeny008\tprogeny009\tprogeny010\tprogeny011\tprogeny012\tprogeny013\tprogeny014\tprogeny015\tprogeny016\tprogeny017\tprogeny018\tprogeny019\tprogeny020\tparent1\n", + "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC\t.\tPASS\tAN=88;UAN=3;AC=22,12;NS=22;MCI=0;DP=589;RCOUNT=804;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR\t0/0/0/1:16:60:22:28:280:2:0.007:0.976:1:0:0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0:0\t0/0/1/2:28:60:14:26:176:0:0:0.998:1:0:0\t0/0/1/2:60:60:25:31:320:0:0:1:1:0:0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0:0\t0/0/0/1:60:60:22:33:291:0:0:1:1:0:0\t0/0/1/2:60:60:21:26:272:1:0.004:1:1:0:0\t0/0/1/2:60:60:38:50:497:1:0.002:1:1:0:0\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0:0\t0/0/0/1:25:60:28:41:358:4:0.011:0.997:1:0:0\t0/0/0/1:28:60:19:27:251:0:0:0.998:1:0:0\t0/0/1/2:60:60:27:35:347:0:0:1:1:0:0\t0/0/0/1:60:60:30:37:387:3:0.008:1:1:0:0\t0/0/0/1:60:60:39:58:511:0:0:1:1:0:0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0:0\t0/0/1/2:33:60:25:34:326:1:0.003:1:1:0:0\t0/0/0/1:60:60:26:35:341:0:0:1:1:0:0\t0/0/1/2:60:60:34:45:441:0:0:1:1:0:0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0:0\t0/0/0/1:5:5:30:39:386:3:0.008:0.664:0.664:0:0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0:0\t0/0/1/2:3:3:0:0:0:0:.:0.528:0.537:0:0\n" + ] + } + ], + "source": [ + "zcat pedigree_imputing.vcf.gz | grep \"#CHROM\"\n", + "zcat pedigree_imputing.vcf.gz | grep \"locus001\"" + ] + }, + { + "cell_type": "markdown", + "id": "b3864bb6-408d-452a-952e-44d6fc486305", + "metadata": {}, + "source": [ + "Note that the genotype for `parent1` is the same as above, but the quality scores are much lower:" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "4e3fcfc0-d33a-4acc-8b82-d0132782f1fe", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "individual_calling.vcf.gz\n", + "parent1\n", + "0/0/1/2:60:60:30:43:383:2:0.005:1:1:0\n", + "pedigree_calling.vcf.gz\n", + "parent1\n", + "0/0/1/2:60:60:30:43:383:2:0.005:1:1:0:0\n", + "pedigree_imputing.vcf.gz\n", + "parent1\n", + "0/0/1/2:3:3:0:0:0:0:.:0.528:0.537:0:0\n" + ] + } + ], + "source": [ + "echo individual_calling.vcf.gz\n", + "zcat individual_calling.vcf.gz | grep \"#CHROM\" | cut -f10\n", + "zcat individual_calling.vcf.gz | grep \"locus001\" | cut -f10\n", + "echo pedigree_calling.vcf.gz\n", + "zcat pedigree_calling.vcf.gz | grep \"#CHROM\" | cut -f10\n", + "zcat pedigree_calling.vcf.gz | grep \"locus001\" | cut -f10\n", + "echo pedigree_imputing.vcf.gz\n", + "zcat pedigree_imputing.vcf.gz | grep \"#CHROM\" | cut -f31\n", + "zcat pedigree_imputing.vcf.gz | grep \"locus001\" | cut -f31" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "22c1a82c-a190-4786-85b2-a5b556a555d1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Bash", + "language": "bash", + "name": "bash" + }, + "language_info": { + "codemirror_mode": "shell", + "file_extension": ".sh", + "mimetype": "text/x-sh", + "name": "bash" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/docs/example/bi-parental.ipynb b/docs/example/bi-parental.ipynb index 88ae8844..afa352c6 100644 --- a/docs/example/bi-parental.ipynb +++ b/docs/example/bi-parental.ipynb @@ -7,7 +7,7 @@ "source": [ "# Micro-haplotype assembly in an autopolyploid bi-parental cross\n", "\n", - "*(Last updated for MCHap version 0.9.3)*\n", + "*(Last updated for MCHap version 0.10.0)*\n", "\n", "This notebook demonstrates micro-haplotype assembly and genotype re-calling in a small bi-parental cross.\n", "It introduces the following topics:\n", @@ -83,7 +83,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "\u001b[0m\u001b[01;32mparent1.loci.bam\u001b[0m \u001b[01;32mprogeny006.loci.bam.bai\u001b[0m \u001b[01;32mprogeny014.loci.bam\u001b[0m\n", + "convert_to_cram.sh \u001b[0m\u001b[01;32mprogeny006.loci.bam\u001b[0m \u001b[01;32mprogeny013.loci.bam.bai\u001b[0m\n", + "\u001b[01;32mparent1.loci.bam\u001b[0m \u001b[01;32mprogeny006.loci.bam.bai\u001b[0m \u001b[01;32mprogeny014.loci.bam\u001b[0m\n", "\u001b[01;32mparent1.loci.bam.bai\u001b[0m \u001b[01;32mprogeny007.loci.bam\u001b[0m \u001b[01;32mprogeny014.loci.bam.bai\u001b[0m\n", "\u001b[01;32mparent2.loci.bam\u001b[0m \u001b[01;32mprogeny007.loci.bam.bai\u001b[0m \u001b[01;32mprogeny015.loci.bam\u001b[0m\n", "\u001b[01;32mparent2.loci.bam.bai\u001b[0m \u001b[01;32mprogeny008.loci.bam\u001b[0m \u001b[01;32mprogeny015.loci.bam.bai\u001b[0m\n", @@ -96,8 +97,7 @@ "\u001b[01;32mprogeny004.loci.bam\u001b[0m \u001b[01;32mprogeny011.loci.bam.bai\u001b[0m \u001b[01;32mprogeny019.loci.bam\u001b[0m\n", "\u001b[01;32mprogeny004.loci.bam.bai\u001b[0m \u001b[01;32mprogeny012.loci.bam\u001b[0m \u001b[01;32mprogeny019.loci.bam.bai\u001b[0m\n", "\u001b[01;32mprogeny005.loci.bam\u001b[0m \u001b[01;32mprogeny012.loci.bam.bai\u001b[0m \u001b[01;32mprogeny020.loci.bam\u001b[0m\n", - "\u001b[01;32mprogeny005.loci.bam.bai\u001b[0m \u001b[01;32mprogeny013.loci.bam\u001b[0m \u001b[01;32mprogeny020.loci.bam.bai\u001b[0m\n", - "\u001b[01;32mprogeny006.loci.bam\u001b[0m \u001b[01;32mprogeny013.loci.bam.bai\u001b[0m\n" + "\u001b[01;32mprogeny005.loci.bam.bai\u001b[0m \u001b[01;32mprogeny013.loci.bam\u001b[0m \u001b[01;32mprogeny020.loci.bam.bai\u001b[0m\n" ] } ], @@ -286,19 +286,21 @@ "output_type": "stream", "text": [ "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#fileformat=VCFv4.3\n", - "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#fileDate=20240315\n", - "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#source=mchap v0.9.3\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#fileDate=20240910\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#source=mchap v0.9.4.dev72+g719498f.d20240710\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#phasing=None\n", - "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#commandline=\"/home/cfltxm/Software/miniconda3/envs/mchap/bin/mchap assemble --bam input/bam/parent1.loci.bam input/bam/parent2.loci.bam input/bam/progeny001.loci.bam input/bam/progeny002.loci.bam input/bam/progeny003.loci.bam input/bam/progeny004.loci.bam input/bam/progeny005.loci.bam input/bam/progeny006.loci.bam input/bam/progeny007.loci.bam input/bam/progeny008.loci.bam input/bam/progeny009.loci.bam input/bam/progeny010.loci.bam input/bam/progeny011.loci.bam input/bam/progeny012.loci.bam input/bam/progeny013.loci.bam input/bam/progeny014.loci.bam input/bam/progeny015.loci.bam input/bam/progeny016.loci.bam input/bam/progeny017.loci.bam input/bam/progeny018.loci.bam input/bam/progeny019.loci.bam input/bam/progeny020.loci.bam --targets input/bed/targets4.bed --variants input/vcf/snvs.vcf.gz --reference input/fasta/chr1.fa.gz --ploidy 4 --inbreeding 0.01\"\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#commandline=\"/home/cfltxm/mambaforge/envs/mchap/bin/mchap assemble --bam input/bam/parent1.loci.bam input/bam/parent2.loci.bam input/bam/progeny001.loci.bam input/bam/progeny002.loci.bam input/bam/progeny003.loci.bam input/bam/progeny004.loci.bam input/bam/progeny005.loci.bam input/bam/progeny006.loci.bam input/bam/progeny007.loci.bam input/bam/progeny008.loci.bam input/bam/progeny009.loci.bam input/bam/progeny010.loci.bam input/bam/progeny011.loci.bam input/bam/progeny012.loci.bam input/bam/progeny013.loci.bam input/bam/progeny014.loci.bam input/bam/progeny015.loci.bam input/bam/progeny016.loci.bam input/bam/progeny017.loci.bam input/bam/progeny018.loci.bam input/bam/progeny019.loci.bam input/bam/progeny020.loci.bam --targets input/bed/targets4.bed --variants input/vcf/snvs.vcf.gz --reference input/fasta/chr1.fa.gz --ploidy 4 --inbreeding 0.01\"\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#randomseed=42\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#contig=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FILTER=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FILTER=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FILTER=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", @@ -306,14 +308,14 @@ "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#INFO=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", - "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", - "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", + "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[K#FORMAT=\n", "\u001b[01;31m\u001b[K#\u001b[m\u001b[KCHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tparent1\tparent2\tprogeny001\tprogeny002\tprogeny003\tprogeny004\tprogeny005\tprogeny006\tprogeny007\tprogeny008\tprogeny009\tprogeny010\tprogeny011\tprogeny012\tprogeny013\tprogeny014\tprogeny015\tprogeny016\tprogeny017\tprogeny018\tprogeny019\tprogeny020\n" ] @@ -341,7 +343,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC\t.\tPASS\tAN=88;AC=22,12,0;NS=22;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116\tGT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI\t0/0/1/2:28:28:30:43:383:2:0.005:0.998:0.998:0\t0/0/0/1:3:3:22:28:280:2:0.007:0.48:0.48:0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0\t0/0/1/2:6:6:14:26:176:0:0:0.752:0.761:0\t0/0/1/2:17:18:25:31:320:0:0:0.982:0.983:0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0\t0/0/0/1:28:28:22:33:291:0:0:0.998:0.998:0\t0/0/1/2:27:60:21:26:272:1:0.004:0.998:1:0\t0/0/1/2:3:3:38:50:497:1:0.002:0.502:0.502:0\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0\t0/0/0/1:9:9:28:41:358:4:0.011:0.864:0.867:0\t0/0/0/1:16:17:19:27:251:0:0:0.976:0.98:0\t0/0/1/2:25:25:27:35:347:0:0:0.996:0.996:0\t0/0/0/1:25:25:30:37:387:3:0.008:0.996:0.996:0\t0/0/0/1:60:60:39:58:511:0:0:1:1:0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0\t0/0/1/2:33:60:25:34:326:1:0.003:1:1:0\t0/0/0/1:26:26:26:35:341:0:0:0.998:0.998:0\t0/0/1/2:20:20:34:45:441:0:0:0.991:0.991:0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0\t0/0/0/1:10:10:30:39:386:3:0.008:0.91:0.91:0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0\n" + "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC\t.\tPASS\tAN=88;UAN=3;AC=22,12,0;NS=22;MCI=0;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI\t0/0/1/2:28:28:30:43:383:2:0.005:0.998:0.998:0\t0/0/0/1:3:3:22:28:280:2:0.007:0.48:0.48:0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0\t0/0/1/2:6:6:14:26:176:0:0:0.752:0.761:0\t0/0/1/2:17:18:25:31:320:0:0:0.982:0.983:0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0\t0/0/0/1:28:28:22:33:291:0:0:0.998:0.998:0\t0/0/1/2:27:60:21:26:272:1:0.004:0.998:1:0\t0/0/1/2:3:3:38:50:497:1:0.002:0.502:0.502:0\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0\t0/0/0/1:9:9:28:41:358:4:0.011:0.864:0.867:0\t0/0/0/1:16:17:19:27:251:0:0:0.976:0.98:0\t0/0/1/2:25:25:27:35:347:0:0:0.996:0.996:0\t0/0/0/1:25:25:30:37:387:3:0.008:0.996:0.996:0\t0/0/0/1:60:60:39:58:511:0:0:1:1:0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0\t0/0/1/2:33:60:25:34:326:1:0.003:1:1:0\t0/0/0/1:26:26:26:35:341:0:0:0.998:0.998:0\t0/0/1/2:20:20:34:45:441:0:0:0.991:0.991:0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0\t0/0/0/1:10:10:30:39:386:3:0.008:0.91:0.91:0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0\n" ] } ], @@ -379,7 +381,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chr1\t568849\t\u001b[01;31m\u001b[Klocus012\u001b[m\u001b[K\tTTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\tTTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTGTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\t.\tPASS\tAN=84;AC=24,12,10,9,8,5,4,3,3,1,3,1,0,1,0,0;REFMASKED;NS=22;DP=1596;RCOUNT=2447;END=568967;NVAR=13;SNVPOS=6,8,23,29,37,39,53,54,56,59,86,92,114\tGT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI\t1/4/6/9:60:60:83:131:1077:32:0.03:1:1:0\t1/2/5/7:7:7:127:189:1643:18:0.011:0.818:0.818:0\t1/3/5/.:0:0:95:141:1238:0:0:0.088:0.088:0\t1/2/4/5:3:3:69:101:896:40:0.045:0.5:0.5:2\t1/2/14/.:0:0:57:88:733:6:0.008:0.08:0.08:0\t1/4/5/12:3:3:62:110:806:14:0.017:0.503:0.503:0\t1/1/2/7:2:2:62:85:806:4:0.005:0.333:0.333:0\t1/2/3/6:28:28:36:51:469:0:0:0.998:0.998:0\t1/3/5/.:0:0:87:130:1123:0:0:0.044:0.044:0\t1/2/4/9:3:3:76:117:984:23:0.023:0.5:0.5:2\t1/2/3/4:7:7:57:100:739:14:0.019:0.792:0.792:0\t1/3/4/5:60:60:70:98:908:4:0.004:1:1:0\t1/3/6/11:0:0:64:94:830:0:0:0.102:0.102:0\t1/5/7/8:11:11:90:150:1165:17:0.015:0.916:0.916:0\t1/2/3/4:23:23:56:84:732:14:0.019:0.995:0.995:0\t1/2/3/.:0:0:61:98:785:0:0:0.106:0.106:0\t1/2/6/9:3:3:66:103:851:29:0.034:0.5:0.5:2\t1/2/8/10:3:3:58:91:754:23:0.031:0.498:0.498:2\t1/3/5/8:60:60:116:180:1502:19:0.013:1:1:0\t1/1/7/11:1:1:81:116:1050:8:0.008:0.212:0.212:0\t1/3/4/6:22:22:55:84:710:30:0.042:0.994:0.994:0\t1/2/4/11:2:2:68:106:883:28:0.032:0.413:0.413:2\n" + "chr1\t568849\t\u001b[01;31m\u001b[Klocus012\u001b[m\u001b[K\tTTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\tTTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTGTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\t.\tPASS\tAN=84;UAN=13;AC=24,12,10,9,8,5,4,3,3,1,3,1,0,1,0,0;REFMASKED;NS=22;MCI=5;DP=1596;RCOUNT=2447;END=568967;NVAR=13;SNVPOS=6,8,23,29,37,39,53,54,56,59,86,92,114\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI\t1/4/6/9:60:60:83:131:1077:32:0.03:1:1:0\t1/2/5/7:7:7:127:189:1643:18:0.011:0.818:0.818:0\t1/3/5/.:0:0:95:141:1238:0:0:0.088:0.088:0\t1/2/4/5:3:3:69:101:896:40:0.045:0.5:0.5:2\t1/2/14/.:0:0:57:88:733:6:0.008:0.08:0.08:0\t1/4/5/12:3:3:62:110:806:14:0.017:0.503:0.503:0\t1/1/2/7:2:2:62:85:806:4:0.005:0.333:0.333:0\t1/2/3/6:28:28:36:51:469:0:0:0.998:0.998:0\t1/3/5/.:0:0:87:130:1123:0:0:0.044:0.044:0\t1/2/4/9:3:3:76:117:984:23:0.023:0.5:0.5:2\t1/2/3/4:7:7:57:100:739:14:0.019:0.792:0.792:0\t1/3/4/5:60:60:70:98:908:4:0.004:1:1:0\t1/3/6/11:0:0:64:94:830:0:0:0.102:0.102:0\t1/5/7/8:11:11:90:150:1165:17:0.015:0.916:0.916:0\t1/2/3/4:23:23:56:84:732:14:0.019:0.995:0.995:0\t1/2/3/.:0:0:61:98:785:0:0:0.106:0.106:0\t1/2/6/9:3:3:66:103:851:29:0.034:0.5:0.5:2\t1/2/8/10:3:3:58:91:754:23:0.031:0.498:0.498:2\t1/3/5/8:60:60:116:180:1502:19:0.013:1:1:0\t1/1/7/11:1:1:81:116:1050:8:0.008:0.212:0.212:0\t1/3/4/6:22:22:55:84:710:30:0.042:0.994:0.994:0\t1/2/4/11:2:2:68:106:883:28:0.032:0.413:0.413:2\n" ] } ], @@ -398,7 +400,7 @@ "- Highly heterozygous genotypes\n", "- Some genotypes have unknown alleles (e.g., `1/2/14/.`) resulting from genotype calls with un-reported alleles\n", "- Progeny containing alleles that are not present in their parents\n", - "- Low `GQ` and `PHQ` scores (also `GPM` and `PHPM`)\n", + "- Low `GQ` and `SQ` scores (also `GPM` and `SPM`)\n", "- Several `MCI` values of `2` indicating incongruence between MCMC replicates (putative CNV))\n", "\n", "There are two main reasons of bad assemblies:\n", @@ -434,7 +436,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chr1\t809105\t\u001b[01;31m\u001b[Klocus019\u001b[m\u001b[K\tGGGTGTGAAAATTGGGCTATTAGTTCTATTTATTATGGGTGCTAGCTGGACTTGTGATGCCAGAGAAGTAATGACCACCAGTCTCTCTAGTGGAGAAACCATGATCTCTGATGTTTCAG\t.\t.\tNOA\tAN=0;AC=.;REFMASKED;NS=0;DP=0;RCOUNT=0;END=809223;NVAR=12;SNVPOS=8,9,10,19,44,48,52,62,70,77,85,104\tGT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\n" + "chr1\t809105\t\u001b[01;31m\u001b[Klocus019\u001b[m\u001b[K\tGGGTGTGAAAATTGGGCTATTAGTTCTATTTATTATGGGTGCTAGCTGGACTTGTGATGCCAGAGAAGTAATGACCACCAGTCTCTCTAGTGGAGAAACCATGATCTCTGATGTTTCAG\t.\t.\tNOA\tAN=0;UAN=0;AC=.;REFMASKED;NS=0;MCI=0;DP=0;RCOUNT=0;END=809223;NVAR=12;SNVPOS=8,9,10,19,44,48,52,62,70,77,85,104\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\t./././.:0:0:0:0:0:0:.:0.002:0.002:0\n" ] } ], @@ -515,7 +517,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC\t.\tPASS\tAN=88;AC=22,12,0;NS=22;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116;AFP=0.602,0.244,0.137,0.006\tGT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP\t0/0/1/2:28:28:30:43:383:2:0.005:0.998:0.998:0:0.5,0.25,0.25,0\t0/0/0/1:3:3:22:28:280:2:0.007:0.48:0.48:0:0.62,0.25,0,0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0:0.5,0.25,0.25,0\t0/0/1/2:6:6:14:26:176:0:0:0.752:0.761:0:0.438,0.251,0.252,0\t0/0/1/2:17:18:25:31:320:0:0:0.982:0.983:0:0.5,0.25,0.246,0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0:0.5,0.25,0.25,0\t0/0/0/1:28:28:22:33:291:0:0:0.998:0.998:0:0.75,0.25,0,0\t0/0/1/2:27:60:21:26:272:1:0.004:0.998:1:0:0.5,0.25,0.25,0\t0/0/1/2:3:3:38:50:497:1:0.002:0.502:0.502:0:0.5,0.126,0.25,0.124\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0:0.75,0.25,0,0\t0/0/0/1:9:9:28:41:358:4:0.011:0.864:0.867:0:0.716,0.251,0,0\t0/0/0/1:16:17:19:27:251:0:0:0.976:0.98:0:0.744,0.251,0,0\t0/0/1/2:25:25:27:35:347:0:0:0.996:0.996:0:0.5,0.249,0.25,0\t0/0/0/1:25:25:30:37:387:3:0.008:0.996:0.996:0:0.75,0.249,0,0.001\t0/0/0/1:60:60:39:58:511:0:0:1:1:0:0.75,0.25,0,0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0:0.5,0.25,0.25,0\t0/0/1/2:33:60:25:34:326:1:0.003:1:1:0:0.5,0.25,0.25,0\t0/0/0/1:26:26:26:35:341:0:0:0.998:0.998:0:0.75,0.249,0,0\t0/0/1/2:20:20:34:45:441:0:0:0.991:0.991:0:0.5,0.25,0.248,0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0:0.5,0.25,0.25,0\t0/0/0/1:10:10:30:39:386:3:0.008:0.91:0.91:0:0.73,0.247,0.019,0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0:0.75,0.25,0,0\n" + "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC\t.\tPASS\tAN=88;UAN=3;AC=22,12,0;NS=22;MCI=0;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116;AFP=0.602,0.244,0.137,0.006\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP\t0/0/1/2:28:28:30:43:383:2:0.005:0.998:0.998:0:0.5,0.25,0.25,0\t0/0/0/1:3:3:22:28:280:2:0.007:0.48:0.48:0:0.62,0.25,0,0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0:0.5,0.25,0.25,0\t0/0/1/2:6:6:14:26:176:0:0:0.752:0.761:0:0.438,0.251,0.252,0\t0/0/1/2:17:18:25:31:320:0:0:0.982:0.983:0:0.5,0.25,0.246,0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0:0.5,0.25,0.25,0\t0/0/0/1:28:28:22:33:291:0:0:0.998:0.998:0:0.75,0.25,0,0\t0/0/1/2:27:60:21:26:272:1:0.004:0.998:1:0:0.5,0.25,0.25,0\t0/0/1/2:3:3:38:50:497:1:0.002:0.502:0.502:0:0.5,0.126,0.25,0.124\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0:0.75,0.25,0,0\t0/0/0/1:9:9:28:41:358:4:0.011:0.864:0.867:0:0.716,0.251,0,0\t0/0/0/1:16:17:19:27:251:0:0:0.976:0.98:0:0.744,0.251,0,0\t0/0/1/2:25:25:27:35:347:0:0:0.996:0.996:0:0.5,0.249,0.25,0\t0/0/0/1:25:25:30:37:387:3:0.008:0.996:0.996:0:0.75,0.249,0,0.001\t0/0/0/1:60:60:39:58:511:0:0:1:1:0:0.75,0.25,0,0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0:0.5,0.25,0.25,0\t0/0/1/2:33:60:25:34:326:1:0.003:1:1:0:0.5,0.25,0.25,0\t0/0/0/1:26:26:26:35:341:0:0:0.998:0.998:0:0.75,0.249,0,0\t0/0/1/2:20:20:34:45:441:0:0:0.991:0.991:0:0.5,0.25,0.248,0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0:0.5,0.25,0.25,0\t0/0/0/1:10:10:30:39:386:3:0.008:0.91:0.91:0:0.73,0.247,0.019,0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0:0.75,0.25,0,0\n" ] } ], @@ -533,7 +535,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chr1\t568849\t\u001b[01;31m\u001b[Klocus012\u001b[m\u001b[K\tTTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\tTTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTGTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\t.\tPASS\tAN=84;AC=24,12,10,9,8,5,4,3,3,1,3,1,0,1,0,0;REFMASKED;NS=22;DP=1596;RCOUNT=2447;END=568967;NVAR=13;SNVPOS=6,8,23,29,37,39,53,54,56,59,86,92,114;AFP=0,0.273,0.134,0.121,0.102,0.091,0.051,0.039,0.034,0.029,0.013,0.009,0.006,0.006,0.005,0.005,0.003\tGT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP\t1/4/6/9:60:60:83:131:1077:32:0.03:1:1:0:0,0.25,0,0,0.25,0,0.25,0,0,0.25,0,0,0,0,0,0,0\t1/2/5/7:7:7:127:189:1643:18:0.011:0.818:0.818:0:0,0.25,0.25,0,0,0.25,0,0.204,0,0,0.005,0,0,0,0,0,0\t1/3/5/.:0:0:95:141:1238:0:0:0.088:0.088:0:0,0.25,0,0.25,0,0.25,0,0,0,0,0,0.001,0,0,0,0,0\t1/2/4/5:3:3:69:101:896:40:0.045:0.5:0.5:2:0,0.25,0.25,0,0.25,0.125,0,0,0,0,0.124,0,0,0,0,0,0\t1/2/14/.:0:0:57:88:733:6:0.008:0.08:0.08:0:0,0.25,0.25,0.041,0,0,0,0,0,0,0,0,0,0,0.101,0.099,0\t1/4/5/12:3:3:62:110:806:14:0.017:0.503:0.503:0:0,0.25,0,0,0.25,0.25,0,0,0,0,0,0,0.126,0,0,0,0.075\t1/1/2/7:2:2:62:85:806:4:0.005:0.333:0.333:0:0,0.5,0.25,0,0,0,0,0.083,0,0,0.034,0,0,0,0,0,0\t1/2/3/6:28:28:36:51:469:0:0:0.998:0.998:0:0,0.25,0.25,0.25,0,0,0.25,0,0,0,0,0,0,0,0,0,0\t1/3/5/.:0:0:87:130:1123:0:0:0.044:0.044:0:0,0.25,0,0.249,0,0.25,0,0,0,0.002,0,0.005,0,0.001,0.001,0.001,0\t1/2/4/9:3:3:76:117:984:23:0.023:0.5:0.5:2:0,0.25,0.25,0.124,0.125,0,0,0,0.12,0.125,0,0,0,0,0,0,0\t1/2/3/4:7:7:57:100:739:14:0.019:0.792:0.792:0:0,0.25,0.198,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0\t1/3/4/5:60:60:70:98:908:4:0.004:1:1:0:0,0.25,0,0.25,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0\t1/3/6/11:0:0:64:94:830:0:0:0.102:0.102:0:0,0.25,0,0.25,0,0,0.25,0,0,0.003,0,0.026,0,0.002,0.005,0.003,0\t1/5/7/8:11:11:90:150:1165:17:0.015:0.916:0.916:0:0,0.25,0,0,0,0.25,0,0.229,0.25,0,0.001,0,0,0,0,0,0\t1/2/3/4:23:23:56:84:732:14:0.019:0.995:0.995:0:0,0.25,0.25,0.249,0.25,0,0,0,0,0,0,0,0,0,0,0,0\t1/2/3/.:0:0:61:98:785:0:0:0.106:0.106:0:0,0.25,0.25,0.249,0,0,0,0,0,0,0,0.001,0,0,0.002,0.001,0\t1/2/6/9:3:3:66:103:851:29:0.034:0.5:0.5:2:0,0.25,0.25,0,0,0.125,0.125,0,0,0.25,0,0,0,0,0,0,0\t1/2/8/10:3:3:58:91:754:23:0.031:0.498:0.498:2:0,0.25,0.25,0,0.125,0,0,0,0.125,0,0.125,0,0,0.123,0,0,0\t1/3/5/8:60:60:116:180:1502:19:0.013:1:1:0:0,0.25,0,0.25,0,0.25,0,0,0.25,0,0,0,0,0,0,0,0\t1/1/7/11:1:1:81:116:1050:8:0.008:0.212:0.212:0:0,0.5,0,0,0,0,0,0.25,0,0,0,0.053,0,0,0,0,0\t1/3/4/6:22:22:55:84:710:30:0.042:0.994:0.994:0:0,0.25,0,0.248,0.25,0,0.25,0,0,0,0,0,0,0,0,0,0\t1/2/4/11:2:2:68:106:883:28:0.032:0.413:0.413:2:0,0.25,0.25,0,0.25,0,0,0.102,0,0,0.002,0.103,0,0.001,0,0,0\n" + "chr1\t568849\t\u001b[01;31m\u001b[Klocus012\u001b[m\u001b[K\tTTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\tTTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTGTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\t.\tPASS\tAN=84;UAN=13;AC=24,12,10,9,8,5,4,3,3,1,3,1,0,1,0,0;REFMASKED;NS=22;MCI=5;DP=1596;RCOUNT=2447;END=568967;NVAR=13;SNVPOS=6,8,23,29,37,39,53,54,56,59,86,92,114;AFP=0,0.273,0.134,0.121,0.102,0.091,0.051,0.039,0.034,0.029,0.013,0.009,0.006,0.006,0.005,0.005,0.003\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP\t1/4/6/9:60:60:83:131:1077:32:0.03:1:1:0:0,0.25,0,0,0.25,0,0.25,0,0,0.25,0,0,0,0,0,0,0\t1/2/5/7:7:7:127:189:1643:18:0.011:0.818:0.818:0:0,0.25,0.25,0,0,0.25,0,0.204,0,0,0.005,0,0,0,0,0,0\t1/3/5/.:0:0:95:141:1238:0:0:0.088:0.088:0:0,0.25,0,0.25,0,0.25,0,0,0,0,0,0.001,0,0,0,0,0\t1/2/4/5:3:3:69:101:896:40:0.045:0.5:0.5:2:0,0.25,0.25,0,0.25,0.125,0,0,0,0,0.124,0,0,0,0,0,0\t1/2/14/.:0:0:57:88:733:6:0.008:0.08:0.08:0:0,0.25,0.25,0.041,0,0,0,0,0,0,0,0,0,0,0.101,0.099,0\t1/4/5/12:3:3:62:110:806:14:0.017:0.503:0.503:0:0,0.25,0,0,0.25,0.25,0,0,0,0,0,0,0.126,0,0,0,0.075\t1/1/2/7:2:2:62:85:806:4:0.005:0.333:0.333:0:0,0.5,0.25,0,0,0,0,0.083,0,0,0.034,0,0,0,0,0,0\t1/2/3/6:28:28:36:51:469:0:0:0.998:0.998:0:0,0.25,0.25,0.25,0,0,0.25,0,0,0,0,0,0,0,0,0,0\t1/3/5/.:0:0:87:130:1123:0:0:0.044:0.044:0:0,0.25,0,0.249,0,0.25,0,0,0,0.002,0,0.005,0,0.001,0.001,0.001,0\t1/2/4/9:3:3:76:117:984:23:0.023:0.5:0.5:2:0,0.25,0.25,0.124,0.125,0,0,0,0.12,0.125,0,0,0,0,0,0,0\t1/2/3/4:7:7:57:100:739:14:0.019:0.792:0.792:0:0,0.25,0.198,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0\t1/3/4/5:60:60:70:98:908:4:0.004:1:1:0:0,0.25,0,0.25,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0\t1/3/6/11:0:0:64:94:830:0:0:0.102:0.102:0:0,0.25,0,0.25,0,0,0.25,0,0,0.003,0,0.026,0,0.002,0.005,0.003,0\t1/5/7/8:11:11:90:150:1165:17:0.015:0.916:0.916:0:0,0.25,0,0,0,0.25,0,0.229,0.25,0,0.001,0,0,0,0,0,0\t1/2/3/4:23:23:56:84:732:14:0.019:0.995:0.995:0:0,0.25,0.25,0.249,0.25,0,0,0,0,0,0,0,0,0,0,0,0\t1/2/3/.:0:0:61:98:785:0:0:0.106:0.106:0:0,0.25,0.25,0.249,0,0,0,0,0,0,0,0.001,0,0,0.002,0.001,0\t1/2/6/9:3:3:66:103:851:29:0.034:0.5:0.5:2:0,0.25,0.25,0,0,0.125,0.125,0,0,0.25,0,0,0,0,0,0,0\t1/2/8/10:3:3:58:91:754:23:0.031:0.498:0.498:2:0,0.25,0.25,0,0.125,0,0,0,0.125,0,0.125,0,0,0.123,0,0,0\t1/3/5/8:60:60:116:180:1502:19:0.013:1:1:0:0,0.25,0,0.25,0,0.25,0,0,0.25,0,0,0,0,0,0,0,0\t1/1/7/11:1:1:81:116:1050:8:0.008:0.212:0.212:0:0,0.5,0,0,0,0,0,0.25,0,0,0,0.053,0,0,0,0,0\t1/3/4/6:22:22:55:84:710:30:0.042:0.994:0.994:0:0,0.25,0,0.248,0.25,0,0.25,0,0,0,0,0,0,0,0,0,0\t1/2/4/11:2:2:68:106:883:28:0.032:0.413:0.413:2:0,0.25,0.25,0,0.25,0,0,0.102,0,0,0.002,0.103,0,0.001,0,0,0\n" ] } ], @@ -614,7 +616,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC\t.\tPASS\tAN=88;AC=22,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;NS=22;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116;AFP=0.602,0.244,0.137,0.006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\tGT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP\t0/0/1/2:28:28:30:43:383:2:0.005:0.998:0.998:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:3:3:22:28:280:2:0.007:0.48:0.48:0:0.62,0.25,0,0,0,0,0,0,0,0.003,0.003,0,0.003,0.003,0.003,0.002,0.002,0.002,0.002,0.002,0.002,0,0,0.002,0.002,0.002,0.002,0,0.002,0.001,0.001,0.001,0.001,0,0.001,0,0,0,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0,0.001,0.001,0.001,0.001,0,0.001,0,0.001,0.001,0,0.001,0.001,0.001,0.001,0.001,0,0,0,0.001,0,0,0,0,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0,0,0.001,0.001,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:6:6:14:26:176:0:0:0.752:0.761:0:0.438,0.251,0.252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0,0,0,0,0.001,0,0,0,0,0,0.001,0,0.001,0.001,0.001,0,0,0,0,0,0,0,0,0.001,0,0,0,0,0.001,0,0.001,0,0,0.001,0,0,0,0,0,0,0.001,0,0,0.001,0.001,0.001,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0.001,0.001,0.001,0.001,0,0.001,0,0,0,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:17:18:25:31:320:0:0:0.982:0.983:0:0.5,0.25,0.246,0,0,0,0,0,0.003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:28:28:22:33:291:0:0:0.998:0.998:0:0.75,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:27:60:21:26:272:1:0.004:0.998:1:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:3:3:38:50:497:1:0.002:0.502:0.502:0:0.5,0.126,0.25,0.124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0:0.75,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:9:9:28:41:358:4:0.011:0.864:0.867:0:0.716,0.251,0,0,0.008,0.004,0.004,0.004,0,0,0,0.003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:16:17:19:27:251:0:0:0.976:0.98:0:0.744,0.251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:25:25:27:35:347:0:0:0.996:0.996:0:0.5,0.249,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:25:25:30:37:387:3:0.008:0.996:0.996:0:0.75,0.249,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:60:60:39:58:511:0:0:1:1:0:0.75,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:33:60:25:34:326:1:0.003:1:1:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:26:26:26:35:341:0:0:0.998:0.998:0:0.75,0.249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:20:20:34:45:441:0:0:0.991:0.991:0:0.5,0.25,0.248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:10:10:30:39:386:3:0.008:0.91:0.91:0:0.73,0.247,0.019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0:0.75,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n" + "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCGCAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,GTTATTGGACAATGACGATGGGGTGATTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGTGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAGTGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAATGACGATGGAGTGATTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGGTTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGTACAC,GTTATTGGACAATGACGATGGAGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAATGACGATGGAGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTGCAC,GTTATTGGACAGTGACGATGGGGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTCCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGCTCACAAATGGCGCAC,ATTATTGGACAATGACGATGGGGTGATTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGATCACAAATGGTACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCGCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC,ATTATTGGACAGTGACGATGGGGTGGTTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCACAC\t.\tPASS\tAN=88;UAN=3;AC=22,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;NS=22;MCI=0;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116;AFP=0.602,0.244,0.137,0.006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP\t0/0/1/2:28:28:30:43:383:2:0.005:0.998:0.998:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:3:3:22:28:280:2:0.007:0.48:0.48:0:0.62,0.25,0,0,0,0,0,0,0,0.003,0.003,0.003,0,0.003,0.003,0.002,0.002,0.002,0.002,0.002,0.002,0,0.002,0,0.002,0.002,0,0.002,0.002,0.001,0.001,0,0.001,0.001,0.001,0,0,0,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0,0.001,0.001,0.001,0.001,0,0,0.001,0.001,0.001,0.001,0.001,0,0.001,0.001,0,0,0.001,0.001,0,0,0,0,0,0,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,0,0,0,0,0,0,0,0,0.001,0,0.001,0,0,0.001,0.001,0.001,0.001,0,0,0.001,0.001,0.001,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:6:6:14:26:176:0:0:0.752:0.761:0:0.438,0.251,0.252,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0,0,0.001,0,0,0,0,0.001,0,0,0,0.001,0.001,0.001,0,0,0,0,0,0,0,0,0,0.001,0,0,0,0,0.001,0.001,0,0,0,0,0,0.001,0,0,0,0,0,0,0,0.001,0.001,0.001,0.001,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0.001,0.001,0.001,0.001,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:17:18:25:31:320:0:0:0.982:0.983:0:0.5,0.25,0.246,0,0,0,0,0,0.003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:28:28:22:33:291:0:0:0.998:0.998:0:0.75,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:27:60:21:26:272:1:0.004:0.998:1:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:3:3:38:50:497:1:0.002:0.502:0.502:0:0.5,0.126,0.25,0.124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0:0.75,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:9:9:28:41:358:4:0.011:0.864:0.867:0:0.716,0.251,0,0,0.008,0.004,0.004,0.004,0,0,0,0,0.003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:16:17:19:27:251:0:0:0.976:0.98:0:0.744,0.251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:25:25:27:35:347:0:0:0.996:0.996:0:0.5,0.249,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:25:25:30:37:387:3:0.008:0.996:0.996:0:0.75,0.249,0,0.001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:60:60:39:58:511:0:0:1:1:0:0.75,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:33:60:25:34:326:1:0.003:1:1:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:26:26:26:35:341:0:0:0.998:0.998:0:0.75,0.249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:20:20:34:45:441:0:0:0.991:0.991:0:0.5,0.25,0.248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.002,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0:0.5,0.25,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:10:10:30:39:386:3:0.008:0.91:0.91:0:0.73,0.247,0.019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0:0.75,0.25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\n" ] } ], @@ -697,7 +699,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC\t.\tPASS\tAN=88;AC=21,13,1;NS=22;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116\tGT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI\t0/0/1/2:60:60:30:43:383:2:0.005:1:1:0\t0/0/0/1:8:8:22:28:280:2:0.007:0.824:0.824:0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0\t0/0/1/2:17:25:14:26:176:0:0:0.979:0.997:0\t0/0/1/2:60:60:25:31:320:0:0:1:1:0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0\t0/0/0/1:60:60:22:33:291:0:0:1:1:0\t0/0/1/2:13:13:21:26:272:1:0.004:0.952:0.954:0\t0/0/2/3:3:3:38:50:497:1:0.002:0.507:0.507:0\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0\t0/0/0/1:6:6:28:41:358:4:0.011:0.76:0.77:0\t0/0/0/1:20:26:19:27:251:0:0:0.991:0.997:0\t0/0/1/2:60:60:27:35:347:0:0:1:1:0\t0/0/0/1:18:18:30:37:387:3:0.008:0.982:0.982:0\t0/0/0/1:60:60:39:58:511:0:0:1:1:0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0\t0/0/1/2:17:17:25:34:326:1:0.003:0.98:0.98:0\t0/0/0/1:60:60:26:35:341:0:0:1:1:0\t0/0/1/2:60:60:34:45:441:0:0:1:1:0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0\t0/0/1/2:4:4:30:39:386:1:0.003:0.614:0.614:0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0\n" + "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC\t.\tPASS\tAN=88;UAN=4;AC=21,13,1;NS=22;MCI=0;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI\t0/0/1/2:60:60:30:43:383:2:0.005:1:1:0\t0/0/0/1:8:8:22:28:280:2:0.007:0.824:0.824:0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0\t0/0/1/2:17:25:14:26:176:0:0:0.979:0.997:0\t0/0/1/2:60:60:25:31:320:0:0:1:1:0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0\t0/0/0/1:60:60:22:33:291:0:0:1:1:0\t0/0/1/2:13:13:21:26:272:1:0.004:0.952:0.954:0\t0/0/2/3:3:3:38:50:497:1:0.002:0.507:0.507:0\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0\t0/0/0/1:6:6:28:41:358:4:0.011:0.76:0.77:0\t0/0/0/1:20:26:19:27:251:0:0:0.991:0.997:0\t0/0/1/2:60:60:27:35:347:0:0:1:1:0\t0/0/0/1:18:18:30:37:387:3:0.008:0.982:0.982:0\t0/0/0/1:60:60:39:58:511:0:0:1:1:0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0\t0/0/1/2:17:17:25:34:326:1:0.003:0.98:0.98:0\t0/0/0/1:60:60:26:35:341:0:0:1:1:0\t0/0/1/2:60:60:34:45:441:0:0:1:1:0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0\t0/0/1/2:4:4:30:39:386:1:0.003:0.614:0.614:0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0\n" ] } ], @@ -774,7 +776,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC\t.\tPASS\tAN=88;AC=22,12,0;NS=22;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116\tGT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI\t0/0/1/2:60:60:30:43:383:2:0.005:1:1:0\t0/0/0/1:24:24:22:28:280:2:0.007:0.996:0.996:0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0\t0/0/1/2:23:60:14:26:176:0:0:0.994:1:0\t0/0/1/2:60:60:25:31:320:0:0:1:1:0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0\t0/0/0/1:60:60:22:33:291:0:0:1:1:0\t0/0/1/2:27:28:21:26:272:1:0.004:0.998:0.998:0\t0/0/1/2:16:16:38:50:497:1:0.002:0.976:0.976:0\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0\t0/0/0/1:20:24:28:41:358:4:0.011:0.989:0.996:0\t0/0/0/1:25:60:19:27:251:0:0:0.996:1:0\t0/0/1/2:60:60:27:35:347:0:0:1:1:0\t0/0/0/1:60:60:30:37:387:3:0.008:1:1:0\t0/0/0/1:60:60:39:58:511:0:0:1:1:0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0\t0/0/1/2:60:60:25:34:326:1:0.003:1:1:0\t0/0/0/1:60:60:26:35:341:0:0:1:1:0\t0/0/1/2:60:60:34:45:441:0:0:1:1:0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0\t0/0/0/1:6:6:30:39:386:3:0.008:0.731:0.731:0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0\n" + "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC,ATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGTGCAC\t.\tPASS\tAN=88;UAN=3;AC=22,12,0;NS=22;MCI=0;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI\t0/0/1/2:60:60:30:43:383:2:0.005:1:1:0\t0/0/0/1:24:24:22:28:280:2:0.007:0.996:0.996:0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0\t0/0/1/2:23:60:14:26:176:0:0:0.994:1:0\t0/0/1/2:60:60:25:31:320:0:0:1:1:0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0\t0/0/0/1:60:60:22:33:291:0:0:1:1:0\t0/0/1/2:27:28:21:26:272:1:0.004:0.998:0.998:0\t0/0/1/2:16:16:38:50:497:1:0.002:0.976:0.976:0\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0\t0/0/0/1:20:24:28:41:358:4:0.011:0.989:0.996:0\t0/0/0/1:25:60:19:27:251:0:0:0.996:1:0\t0/0/1/2:60:60:27:35:347:0:0:1:1:0\t0/0/0/1:60:60:30:37:387:3:0.008:1:1:0\t0/0/0/1:60:60:39:58:511:0:0:1:1:0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0\t0/0/1/2:60:60:25:34:326:1:0.003:1:1:0\t0/0/0/1:60:60:26:35:341:0:0:1:1:0\t0/0/1/2:60:60:34:45:441:0:0:1:1:0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0\t0/0/0/1:6:6:30:39:386:3:0.008:0.731:0.731:0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0\n" ] } ], @@ -898,7 +900,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC\t.\tPASS\tAN=88;AC=22,12;NS=22;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116\tGT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI\t0/0/1/2:60:60:30:43:383:2:0.005:1:1:0\t0/0/0/1:60:60:22:28:280:2:0.007:1:1:0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0\t0/0/1/2:23:60:14:26:176:0:0:0.995:1:0\t0/0/1/2:60:60:25:31:320:0:0:1:1:0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0\t0/0/0/1:60:60:22:33:291:0:0:1:1:0\t0/0/1/2:30:60:21:26:272:1:0.004:0.999:1:0\t0/0/1/2:60:60:38:50:497:1:0.002:1:1:0\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0\t0/0/0/1:24:60:28:41:358:4:0.011:0.996:1:0\t0/0/0/1:28:60:19:27:251:0:0:0.998:1:0\t0/0/1/2:60:60:27:35:347:0:0:1:1:0\t0/0/0/1:60:60:30:37:387:3:0.008:1:1:0\t0/0/0/1:60:60:39:58:511:0:0:1:1:0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0\t0/0/1/2:60:60:25:34:326:1:0.003:1:1:0\t0/0/0/1:60:60:26:35:341:0:0:1:1:0\t0/0/1/2:60:60:34:45:441:0:0:1:1:0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0\t0/0/0/1:7:7:30:39:386:3:0.008:0.786:0.786:0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0\n" + "chr1\t17591\t\u001b[01;31m\u001b[Klocus001\u001b[m\u001b[K\tGTTATTGGACAGTGACGATGGAGTGATTGCTGGCGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGTACAC\tATTATTGGACAATGACGATGGGGTGGTTGCTGGCCCAGTCCGCCAGCACCACCACCACCAAGTCAACATGTCGGACATTTATGGGGTGGTGCCACGAAACCTGATCACAAATGGCGCAC,GTTATTGGACAGTGACGATGGAGTGATTGCTGGTGCAGGCCGCCAGCACCACCACCACCAAGTCGACATGTCCGACATTTATGGGGTGGTGCCACAAAACCTGCTCACAAATGGCACAC\t.\tPASS\tAN=88;UAN=3;AC=22,12;NS=22;MCI=0;DP=619;RCOUNT=847;END=17709;NVAR=13;SNVPOS=1,12,22,26,34,35,39,65,73,96,104,115,116\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI\t0/0/1/2:60:60:30:43:383:2:0.005:1:1:0\t0/0/0/1:60:60:22:28:280:2:0.007:1:1:0\t0/0/1/2:60:60:31:41:401:1:0.002:1:1:0\t0/0/1/2:23:60:14:26:176:0:0:0.995:1:0\t0/0/1/2:60:60:25:31:320:0:0:1:1:0\t0/0/1/2:60:60:31:46:408:0:0:1:1:0\t0/0/0/1:60:60:22:33:291:0:0:1:1:0\t0/0/1/2:30:60:21:26:272:1:0.004:0.999:1:0\t0/0/1/2:60:60:38:50:497:1:0.002:1:1:0\t0/0/0/1:60:60:33:46:424:1:0.002:1:1:0\t0/0/0/1:24:60:28:41:358:4:0.011:0.996:1:0\t0/0/0/1:28:60:19:27:251:0:0:0.998:1:0\t0/0/1/2:60:60:27:35:347:0:0:1:1:0\t0/0/0/1:60:60:30:37:387:3:0.008:1:1:0\t0/0/0/1:60:60:39:58:511:0:0:1:1:0\t0/0/1/2:60:60:27:38:346:0:0:1:1:0\t0/0/1/2:60:60:25:34:326:1:0.003:1:1:0\t0/0/0/1:60:60:26:35:341:0:0:1:1:0\t0/0/1/2:60:60:34:45:441:0:0:1:1:0\t0/0/1/2:60:60:37:50:483:0:0:1:1:0\t0/0/0/1:7:7:30:39:386:3:0.008:0.786:0.786:0\t0/0/0/1:60:60:30:38:390:0:0:1:1:0\n" ] } ], @@ -934,7 +936,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chr1\t684809\t\u001b[01;31m\u001b[Klocus016\u001b[m\u001b[K\tTCACATATGTTAAGCTATCGACCAATTGGCCAACAACAGGACCAAACAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGCAAGGAGTCTGGAAAAATATGAATC\tTCACATATGTTAAGCTATCGACAAATTGGCCAACAACAGGACCAAACAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGTAAGGAGTCTGGGAAAATATGAATC,TCACATATGTTAAGCTATCAACCCATTGTCCAACAAGGGGCCCAAACAATGCCGTGGAAGCAGATTCCACCACACCATAAACAGCAGCTAAGAGTAATGAGTCTGGACAAATATCAATC,TCACATATGTTAAGCTATCGACCAATTGGCCAACAACAGGACCAAACAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGCAAGGAGTCTAGAAAAATATGAATC,TCACATATGTTAAGCTATCGACCAATTGGCCAACAACGGGACCAAACAATGCAGTAGAGTCAGATTCAACCACACCGTAAACGGCAGGTAGGAGTAAGGAGTCTGGAAAAATATGAATC,TCACATATGTTAAGCTATCGACAAATTGGCCAACAACAGGACCAAGCAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGTAAGGAGTCTGGAAAAATATGAATC,TCACATATGTTAAGCTATCAACCCATTGTCCAACAAGAGGCCCAAACAATGCCGTGGAAGCAGATTCCACCACACCATAAACAGCAGCTAAGAGTAATGAGTCTGGACAAATATCAATC,TCACATATGTTAAGCTATCAACCCATTGTCCAACAAGGGGCCCAAACAATGCCGTGGAAGCAGATTCCACCACACCATAAACAGCAGCTAGGAGTAAGGAGTCTGGACAAATATCAATC\t.\tPASS\tAN=88;AC=22,21,11,10,13,1,0;NS=22;DP=3067;RCOUNT=3820;END=684927;NVAR=23;SNVPOS=20,23,24,29,37,38,41,46,53,56,59,60,68,77,83,88,91,95,98,105,107,108,115\tGT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI\t1/2/3/5:60:60:144:188:3309:7:0.002:1:1:0\t0/1/2/4:60:60:216:271:4963:4:0.001:1:1:0\t0/1/2/5:60:60:184:225:4211:44:0.01:1:1:0\t0/1/2/5:60:60:118:148:2709:50:0.018:1:1:0\t3/4/5/6:60:60:138:164:3158:39:0.012:1:1:0\t0/1/2/5:60:60:167:214:3828:2:0.001:1:1:0\t1/2/3/4:60:60:103:130:2365:52:0.022:1:1:0\t1/2/4/5:60:60:74:94:1698:5:0.003:1:1:0\t1/2/3/5:60:60:133:162:3047:41:0.013:1:1:0\t1/2/3/4:60:60:126:169:2883:12:0.004:1:1:0\t1/2/3/4:60:60:115:142:2626:5:0.002:1:1:0\t0/1/2/3:9:9:110:141:2530:13:0.005:0.876:0.876:0\t1/1/2/5:60:60:134:170:3079:0:0:1:1:0\t0/1/2/3:60:60:203:250:4645:4:0.001:1:1:0\t0/2/4/5:60:60:91:113:2082:35:0.017:1:1:0\t1/2/3/5:60:60:122:152:2801:56:0.02:1:1:0\t0/1/2/5:60:60:141:170:3228:44:0.014:1:1:0\t0/1/2/4:60:60:139:171:3178:32:0.01:1:1:0\t0/1/2/5:60:60:235:280:5397:24:0.004:1:1:0\t1/2/3/5:60:60:149:188:3421:5:0.001:1:1:0\t1/1/2/4:60:60:103:128:2354:9:0.004:1:1:0\t1/2/3/4:60:60:122:150:2814:1:0:1:1:0\n" + "chr1\t684809\t\u001b[01;31m\u001b[Klocus016\u001b[m\u001b[K\tTCACATATGTTAAGCTATCGACCAATTGGCCAACAACAGGACCAAACAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGCAAGGAGTCTGGAAAAATATGAATC\tTCACATATGTTAAGCTATCGACAAATTGGCCAACAACAGGACCAAACAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGTAAGGAGTCTGGGAAAATATGAATC,TCACATATGTTAAGCTATCAACCCATTGTCCAACAAGGGGCCCAAACAATGCCGTGGAAGCAGATTCCACCACACCATAAACAGCAGCTAAGAGTAATGAGTCTGGACAAATATCAATC,TCACATATGTTAAGCTATCGACCAATTGGCCAACAACAGGACCAAACAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGCAAGGAGTCTAGAAAAATATGAATC,TCACATATGTTAAGCTATCGACCAATTGGCCAACAACGGGACCAAACAATGCAGTAGAGTCAGATTCAACCACACCGTAAACGGCAGGTAGGAGTAAGGAGTCTGGAAAAATATGAATC,TCACATATGTTAAGCTATCGACAAATTGGCCAACAACAGGACCAAGCAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGTAAGGAGTCTGGAAAAATATGAATC,TCACATATGTTAAGCTATCAACCCATTGTCCAACAAGAGGCCCAAACAATGCCGTGGAAGCAGATTCCACCACACCATAAACAGCAGCTAAGAGTAATGAGTCTGGACAAATATCAATC,TCACATATGTTAAGCTATCAACCCATTGTCCAACAAGGGGCCCAAACAATGCCGTGGAAGCAGATTCCACCACACCATAAACAGCAGCTAGGAGTAAGGAGTCTGGACAAATATCAATC\t.\tPASS\tAN=88;UAN=7;AC=22,21,11,10,13,1,0;NS=22;MCI=0;DP=3067;RCOUNT=3820;END=684927;NVAR=23;SNVPOS=20,23,24,29,37,38,41,46,53,56,59,60,68,77,83,88,91,95,98,105,107,108,115\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI\t1/2/3/5:60:60:144:188:3309:7:0.002:1:1:0\t0/1/2/4:60:60:216:271:4963:4:0.001:1:1:0\t0/1/2/5:60:60:184:225:4211:44:0.01:1:1:0\t0/1/2/5:60:60:118:148:2709:50:0.018:1:1:0\t3/4/5/6:60:60:138:164:3158:39:0.012:1:1:0\t0/1/2/5:60:60:167:214:3828:2:0.001:1:1:0\t1/2/3/4:60:60:103:130:2365:52:0.022:1:1:0\t1/2/4/5:60:60:74:94:1698:5:0.003:1:1:0\t1/2/3/5:60:60:133:162:3047:41:0.013:1:1:0\t1/2/3/4:60:60:126:169:2883:12:0.004:1:1:0\t1/2/3/4:60:60:115:142:2626:5:0.002:1:1:0\t0/1/2/3:9:9:110:141:2530:13:0.005:0.876:0.876:0\t1/1/2/5:60:60:134:170:3079:0:0:1:1:0\t0/1/2/3:60:60:203:250:4645:4:0.001:1:1:0\t0/2/4/5:60:60:91:113:2082:35:0.017:1:1:0\t1/2/3/5:60:60:122:152:2801:56:0.02:1:1:0\t0/1/2/5:60:60:141:170:3228:44:0.014:1:1:0\t0/1/2/4:60:60:139:171:3178:32:0.01:1:1:0\t0/1/2/5:60:60:235:280:5397:24:0.004:1:1:0\t1/2/3/5:60:60:149:188:3421:5:0.001:1:1:0\t1/1/2/4:60:60:103:128:2354:9:0.004:1:1:0\t1/2/3/4:60:60:122:150:2814:1:0:1:1:0\n" ] } ], @@ -960,7 +962,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chr1\t684809\t\u001b[01;31m\u001b[Klocus016\u001b[m\u001b[K\tTCACATATGTTAAGCTATCGACCAATTGGCCAACAACAGGACCAAACAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGCAAGGAGTCTGGAAAAATATGAATC\tTCACATATGTTAAGCTATCGACAAATTGGCCAACAACAGGACCAAACAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGTAAGGAGTCTGGGAAAATATGAATC,TCACATATGTTAAGCTATCAACCCATTGTCCAACAAGGGGCCCAAACAATGCCGTGGAAGCAGATTCCACCACACCATAAACAGCAGCTAAGAGTAATGAGTCTGGACAAATATCAATC,TCACATATGTTAAGCTATCGACAAATTGGCCAACAACAGGACCAAGCAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGTAAGGAGTCTGGAAAAATATGAATC,TCACATATGTTAAGCTATCGACCAATTGGCCAACAACGGGACCAAACAATGCAGTAGAGTCAGATTCAACCACACCGTAAACGGCAGGTAGGAGTAAGGAGTCTGGAAAAATATGAATC,TCACATATGTTAAGCTATCGACCAATTGGCCAACAACAGGACCAAACAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGCAAGGAGTCTAGAAAAATATGAATC\t.\tPASS\tAN=88;AC=22,22,13,10,11;NS=22;DP=3067;RCOUNT=3820;END=684927;NVAR=23;SNVPOS=20,23,24,29,37,38,41,46,53,56,59,60,68,77,83,88,91,95,98,105,107,108,115\tGT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI\t1/2/3/5:60:60:144:188:3309:7:0.002:1:1:0\t0/1/2/4:60:60:216:271:4963:4:0.001:1:1:0\t0/1/2/3:60:60:184:225:4211:44:0.01:1:1:0\t0/1/2/3:60:60:118:148:2709:50:0.018:1:1:0\t2/3/4/5:60:60:138:164:3158:42:0.013:1:1:0\t0/1/2/3:60:60:167:214:3828:2:0.001:1:1:0\t1/2/4/5:60:60:103:130:2365:52:0.022:1:1:0\t1/2/3/4:60:60:74:94:1698:5:0.003:1:1:0\t1/2/3/5:60:60:133:162:3047:41:0.013:1:1:0\t1/2/4/5:60:60:126:169:2883:12:0.004:1:1:0\t1/2/4/5:60:60:115:142:2626:5:0.002:1:1:0\t0/1/2/5:60:60:110:141:2530:13:0.005:1:1:0\t1/1/2/3:60:60:134:170:3079:0:0:1:1:0\t0/1/2/5:60:60:203:250:4645:4:0.001:1:1:0\t0/2/3/4:60:60:91:113:2082:35:0.017:1:1:0\t1/2/3/5:60:60:122:152:2801:56:0.02:1:1:0\t0/1/2/3:60:60:141:170:3228:44:0.014:1:1:0\t0/1/2/4:60:60:139:171:3178:32:0.01:1:1:0\t0/1/2/3:60:60:235:280:5397:24:0.004:1:1:0\t1/2/3/5:60:60:149:188:3421:5:0.001:1:1:0\t1/1/2/4:60:60:103:128:2354:9:0.004:1:1:0\t1/2/4/5:60:60:122:150:2814:1:0:1:1:0\n" + "chr1\t684809\t\u001b[01;31m\u001b[Klocus016\u001b[m\u001b[K\tTCACATATGTTAAGCTATCGACCAATTGGCCAACAACAGGACCAAACAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGCAAGGAGTCTGGAAAAATATGAATC\tTCACATATGTTAAGCTATCGACAAATTGGCCAACAACAGGACCAAACAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGTAAGGAGTCTGGGAAAATATGAATC,TCACATATGTTAAGCTATCAACCCATTGTCCAACAAGGGGCCCAAACAATGCCGTGGAAGCAGATTCCACCACACCATAAACAGCAGCTAAGAGTAATGAGTCTGGACAAATATCAATC,TCACATATGTTAAGCTATCGACAAATTGGCCAACAACAGGACCAAGCAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGTAAGGAGTCTGGAAAAATATGAATC,TCACATATGTTAAGCTATCGACCAATTGGCCAACAACGGGACCAAACAATGCAGTAGAGTCAGATTCAACCACACCGTAAACGGCAGGTAGGAGTAAGGAGTCTGGAAAAATATGAATC,TCACATATGTTAAGCTATCGACCAATTGGCCAACAACAGGACCAAACAATGCAGTAGAGGCAGATTCGACCACACCGTAAACGGCAGGTAGGAGCAAGGAGTCTAGAAAAATATGAATC\t.\tPASS\tAN=88;UAN=6;AC=22,22,13,10,11;NS=22;MCI=0;DP=3067;RCOUNT=3820;END=684927;NVAR=23;SNVPOS=20,23,24,29,37,38,41,46,53,56,59,60,68,77,83,88,91,95,98,105,107,108,115\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI\t1/2/3/5:60:60:144:188:3309:7:0.002:1:1:0\t0/1/2/4:60:60:216:271:4963:4:0.001:1:1:0\t0/1/2/3:60:60:184:225:4211:44:0.01:1:1:0\t0/1/2/3:60:60:118:148:2709:50:0.018:1:1:0\t2/3/4/5:60:60:138:164:3158:42:0.013:1:1:0\t0/1/2/3:60:60:167:214:3828:2:0.001:1:1:0\t1/2/4/5:60:60:103:130:2365:52:0.022:1:1:0\t1/2/3/4:60:60:74:94:1698:5:0.003:1:1:0\t1/2/3/5:60:60:133:162:3047:41:0.013:1:1:0\t1/2/4/5:60:60:126:169:2883:12:0.004:1:1:0\t1/2/4/5:60:60:115:142:2626:5:0.002:1:1:0\t0/1/2/5:60:60:110:141:2530:13:0.005:1:1:0\t1/1/2/3:60:60:134:170:3079:0:0:1:1:0\t0/1/2/5:60:60:203:250:4645:4:0.001:1:1:0\t0/2/3/4:60:60:91:113:2082:35:0.017:1:1:0\t1/2/3/5:60:60:122:152:2801:56:0.02:1:1:0\t0/1/2/3:60:60:141:170:3228:44:0.014:1:1:0\t0/1/2/4:60:60:139:171:3178:32:0.01:1:1:0\t0/1/2/3:60:60:235:280:5397:24:0.004:1:1:0\t1/2/3/5:60:60:149:188:3421:5:0.001:1:1:0\t1/1/2/4:60:60:103:128:2354:9:0.004:1:1:0\t1/2/4/5:60:60:122:150:2814:1:0:1:1:0\n" ] } ], @@ -997,7 +999,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chr1\t568849\t\u001b[01;31m\u001b[Klocus012\u001b[m\u001b[K\tTTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\tTTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTGTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\t.\tPASS\tAN=88;AC=24,12,21,10,7,4,0,4,2,0,3,0,0,1,0,0;REFMASKED;NS=22;DP=1596;RCOUNT=2447;END=568967;NVAR=13;SNVPOS=6,8,23,29,37,39,53,54,56,59,86,92,114\tGT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI\t1/3/4/6:60:60:83:131:1077:22:0.02:1:1:0\t1/2/3/5:60:60:127:189:1643:15:0.009:1:1:0\t1/3/5/11:3:3:95:141:1238:1:0.001:0.48:0.48:0\t1/2/3/4:60:60:69:101:896:22:0.025:1:1:0\t1/2/3/14:3:3:57:88:733:6:0.008:0.502:0.502:0\t1/3/4/5:14:14:62:110:806:11:0.014:0.964:0.964:0\t1/1/2/3:3:3:62:85:806:4:0.005:0.473:0.473:0\t1/2/3/6:60:60:36:51:469:0:0:1:1:0\t1/3/5/11:2:2:87:130:1123:0:0:0.362:0.362:0\t1/2/4/9:60:60:76:117:984:23:0.023:1:1:0\t1/2/3/4:60:60:57:100:739:14:0.019:1:1:0\t1/3/4/5:60:60:70:98:908:4:0.004:1:1:0\t1/3/6/11:4:4:64:94:830:0:0:0.614:0.614:0\t1/3/5/8:28:28:90:150:1165:15:0.013:0.998:0.998:0\t1/2/3/4:60:60:56:84:732:14:0.019:1:1:0\t1/2/3/8:5:5:61:98:785:0:0:0.654:0.654:0\t1/2/3/8:3:3:66:103:851:17:0.02:0.494:0.494:0\t1/2/3/4:30:30:58:91:754:18:0.024:0.999:0.999:0\t1/3/5/8:60:60:116:180:1502:19:0.013:1:1:0\t1/1/3/9:1:1:81:116:1050:6:0.006:0.277:0.277:0\t1/3/4/6:60:60:55:84:710:30:0.042:1:1:0\t1/2/3/4:18:18:68:106:883:23:0.026:0.984:0.984:0\n" + "chr1\t568849\t\u001b[01;31m\u001b[Klocus012\u001b[m\u001b[K\tTTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\tTTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTGTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATACTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\t.\tPASS\tAN=88;UAN=10;AC=24,12,21,10,7,4,0,4,2,0,3,0,0,1,0,0;REFMASKED;NS=22;MCI=0;DP=1596;RCOUNT=2447;END=568967;NVAR=13;SNVPOS=6,8,23,29,37,39,53,54,56,59,86,92,114\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI\t1/3/4/6:60:60:83:131:1077:22:0.02:1:1:0\t1/2/3/5:60:60:127:189:1643:15:0.009:1:1:0\t1/3/5/11:3:3:95:141:1238:1:0.001:0.48:0.48:0\t1/2/3/4:60:60:69:101:896:22:0.025:1:1:0\t1/2/3/14:3:3:57:88:733:6:0.008:0.502:0.502:0\t1/3/4/5:14:14:62:110:806:11:0.014:0.964:0.964:0\t1/1/2/3:3:3:62:85:806:4:0.005:0.473:0.473:0\t1/2/3/6:60:60:36:51:469:0:0:1:1:0\t1/3/5/11:2:2:87:130:1123:0:0:0.362:0.362:0\t1/2/4/9:60:60:76:117:984:23:0.023:1:1:0\t1/2/3/4:60:60:57:100:739:14:0.019:1:1:0\t1/3/4/5:60:60:70:98:908:4:0.004:1:1:0\t1/3/6/11:4:4:64:94:830:0:0:0.614:0.614:0\t1/3/5/8:28:28:90:150:1165:15:0.013:0.998:0.998:0\t1/2/3/4:60:60:56:84:732:14:0.019:1:1:0\t1/2/3/8:5:5:61:98:785:0:0:0.654:0.654:0\t1/2/3/8:3:3:66:103:851:17:0.02:0.494:0.494:0\t1/2/3/4:30:30:58:91:754:18:0.024:0.999:0.999:0\t1/3/5/8:60:60:116:180:1502:19:0.013:1:1:0\t1/1/3/9:1:1:81:116:1050:6:0.006:0.277:0.277:0\t1/3/4/6:60:60:55:84:710:30:0.042:1:1:0\t1/2/3/4:18:18:68:106:883:23:0.026:0.984:0.984:0\n" ] } ], @@ -1015,7 +1017,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "chr1\t568849\t\u001b[01;31m\u001b[Klocus012\u001b[m\u001b[K\tTTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\tTTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTGTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\t.\tPASS\tAN=88;AC=23,22,6,11,4,12,10;REFMASKED;NS=22;DP=1596;RCOUNT=2447;END=568967;NVAR=13;SNVPOS=6,8,23,29,37,39,53,54,56,59,86,92,114\tGT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI\t1/2/4/5:60:60:83:131:1077:22:0.02:1:1:0\t1/2/3/6:60:60:127:189:1643:15:0.009:1:1:0\t1/2/3/7:60:60:95:141:1238:1:0.001:1:1:0\t1/2/4/6:60:60:69:101:896:22:0.025:1:1:0\t1/2/6/7:60:60:57:88:733:8:0.011:1:1:0\t1/2/3/4:60:60:62:110:806:11:0.014:1:1:0\t1/2/6/7:5:5:62:85:806:0:0:0.658:0.658:0\t1/2/5/6:60:60:36:51:469:0:0:1:1:0\t1/2/3/7:60:60:87:130:1123:0:0:1:1:0\t1/2/6/7:12:12:76:117:984:27:0.027:0.93:0.93:0\t1/2/4/6:60:60:57:100:739:14:0.019:1:1:0\t1/2/3/4:60:60:70:98:908:4:0.004:1:1:0\t1/2/5/7:60:60:64:94:830:0:0:1:1:0\t1/2/3/4:60:60:90:150:1165:20:0.017:1:1:0\t1/2/4/6:60:60:56:84:732:14:0.019:1:1:0\t1/2/6/7:60:60:61:98:785:0:0:1:1:0\t1/2/6/7:60:60:66:103:851:17:0.02:1:1:0\t1/2/4/6:60:60:58:91:754:18:0.024:1:1:0\t1/2/4/7:33:33:116:180:1502:22:0.015:1:1:0\t1/1/2/7:60:60:81:116:1050:6:0.006:1:1:0\t1/2/4/5:8:8:55:84:710:30:0.042:0.858:0.858:0\t1/2/4/6:60:60:68:106:883:23:0.026:1:1:0\n" + "chr1\t568849\t\u001b[01;31m\u001b[Klocus012\u001b[m\u001b[K\tTTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\tTTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATGGATTGGAAATGAGAGGTGTGAAGGTGCATACTCTCAACATAACACAGTTCTCCGAGTATCGAAAAGACGGTCACCCCTCAATTTACAGAAGGCAATGGGTGGCTTTACCAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTGTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAATGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGATTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAGCTCTCAGAGTATCGAAAAGACGGTCACCCCTCCATTTACAGAAGGCAATGGGTGGCTTTAACAGAA,TTGATAGGTTGGAAATGAGAGGGGTGAAGGTGCATATTCTCAACATAACACAACTTTCAGAGTATCGAAAAGACGGTCACCCCTCGATTTATAGAAGGCAATGGGTGGCTTTAACAGAA\t.\tPASS\tAN=88;UAN=7;AC=23,6,22,4,11,12,10;REFMASKED;NS=22;MCI=0;DP=1596;RCOUNT=2447;END=568967;NVAR=13;SNVPOS=6,8,23,29,37,39,53,54,56,59,86,92,114\tGT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI\t1/3/4/5:60:60:83:131:1077:22:0.02:1:1:0\t1/2/3/6:60:60:127:189:1643:15:0.009:1:1:0\t1/2/3/7:60:60:95:141:1238:1:0.001:1:1:0\t1/3/5/6:60:60:69:101:896:22:0.025:1:1:0\t1/3/6/7:60:60:57:88:733:8:0.011:1:1:0\t1/2/3/5:60:60:62:110:806:11:0.014:1:1:0\t1/3/6/7:5:5:62:85:806:0:0:0.658:0.658:0\t1/3/4/6:60:60:36:51:469:0:0:1:1:0\t1/2/3/7:60:60:87:130:1123:0:0:1:1:0\t1/3/6/7:12:12:76:117:984:27:0.027:0.93:0.93:0\t1/3/5/6:60:60:57:100:739:14:0.019:1:1:0\t1/2/3/5:60:60:70:98:908:4:0.004:1:1:0\t1/3/4/7:60:60:64:94:830:0:0:1:1:0\t1/2/3/5:60:60:90:150:1165:20:0.017:1:1:0\t1/3/5/6:60:60:56:84:732:14:0.019:1:1:0\t1/3/6/7:60:60:61:98:785:0:0:1:1:0\t1/3/6/7:60:60:66:103:851:17:0.02:1:1:0\t1/3/5/6:60:60:58:91:754:18:0.024:1:1:0\t1/3/5/7:33:33:116:180:1502:22:0.015:1:1:0\t1/1/3/7:60:60:81:116:1050:6:0.006:1:1:0\t1/3/4/5:8:8:55:84:710:30:0.042:0.858:0.858:0\t1/3/5/6:60:60:68:106:883:23:0.026:1:1:0\n" ] } ], diff --git a/docs/example/input/pedigree/pedigree.txt b/docs/example/input/pedigree/pedigree.txt new file mode 100644 index 00000000..5244b5aa --- /dev/null +++ b/docs/example/input/pedigree/pedigree.txt @@ -0,0 +1,22 @@ +parent1 . . +parent2 . . +progeny001 parent1 parent2 +progeny002 parent1 parent2 +progeny003 parent1 parent2 +progeny004 parent1 parent2 +progeny005 parent1 parent2 +progeny006 parent1 parent2 +progeny007 parent1 parent2 +progeny008 parent1 parent2 +progeny009 parent1 parent2 +progeny010 parent1 parent2 +progeny011 parent1 parent2 +progeny012 parent1 parent2 +progeny013 parent1 parent2 +progeny014 parent1 parent2 +progeny015 parent1 parent2 +progeny016 parent1 parent2 +progeny017 parent1 parent2 +progeny018 parent1 parent2 +progeny019 parent1 parent2 +progeny020 parent1 parent2 diff --git a/docs/example/input/pools/sample-pools.txt b/docs/example/input/pools/sample-pools.txt new file mode 100644 index 00000000..6197feef --- /dev/null +++ b/docs/example/input/pools/sample-pools.txt @@ -0,0 +1,22 @@ +parent1 POOL +parent2 POOL +progeny001 POOL +progeny002 POOL +progeny003 POOL +progeny004 POOL +progeny005 POOL +progeny006 POOL +progeny007 POOL +progeny008 POOL +progeny009 POOL +progeny010 POOL +progeny011 POOL +progeny012 POOL +progeny013 POOL +progeny014 POOL +progeny015 POOL +progeny016 POOL +progeny017 POOL +progeny018 POOL +progeny019 POOL +progeny020 POOL diff --git a/mchap/application/arguments.py b/mchap/application/arguments.py index be4a748d..73b376fe 100644 --- a/mchap/application/arguments.py +++ b/mchap/application/arguments.py @@ -5,6 +5,8 @@ from mchap.constant import PFEIFFER_ERROR from mchap.io import extract_sample_ids +import mchap.io.vcf.infofields as INFO +import mchap.io.vcf.formatfields as FORMAT @dataclass @@ -183,6 +185,88 @@ def add_to(self, parser): ), ) +sample_parents = Parameter( + "--sample-parents", + dict( + type=str, + nargs=1, + default=[None], + help=( + "A file containing a list of samples and their parents " + "used to indicate pedigree structure. " + "Each line should contain a sample identifier followed by both " + "parent identifiers separated by tabs. " + "A period '.' is used to indicate unknown parents." + ), + ), +) + +gamete_ploidy = Parameter( + "--gamete-ploidy", + dict( + type=str, + nargs=1, + default=[None], + help=( + "Ploidy of the gametes contributing to each sample. " + "By default it is assumed that the ploidy of each gamete " + "is equal to half the ploidy of the sample derived from that gamete. " + "If all gametes have the same ploidy then a single number can be specified. " + "If gametic ploidy is variable then these values must be specified with a " + "file containing a list of samples and the ploidy of the gametes they were " + "derived from. " + "Each line of this file should contain a sample identifier followed by the ploidy " + "of gametes derived from each parent in the same order as specified " + "using the --sample-parents argument. " + "For each sample, the ploidy of the two gametes must sum to the ploidy " + "of that sample. " + ), + ), +) + +gamete_ibd = Parameter( + "--gamete-ibd", + dict( + type=str, + nargs=1, + default=["0.0"], + help=( + "Excess IBD/homozygosity due to meiotic processes. " + "By default this variable is 0.0 for all gametes and non-zero values " + "may only be specified for gametes with a ploidy of 2. " + "This value must be in the interval [0, 1] with a value of 0.0 indicating " + "no excess ibd/homozygosity and a value of 1.0 indicating that the gamete " + "must be fully homozygous." + "If a single value is specified then this will be applied to all gametes. " + "If this value varies between gametes then it must be specified with a " + "file containing a list of samples and the value associated with each gamete " + "those samples are derived from. " + "Each line should contain a sample identifier followed by value of each " + "gamete in the same order as specified using the --sample-parents argument. " + ), + ), +) + +gamete_error = Parameter( + "--gamete-error", + dict( + type=str, + nargs=1, + default=["0.01"], + help=( + "An error term associated with each parent-child pair indicating the " + "probability that that gamete was not derived from the specified parent. " + "By default this variable is 0.01 for all parent-child pairs. " + "This value must be in the interval [0, 1] and should generally be > 0 and < 1." + "If a single value is specified then this will be applied to all parent-child pairs. " + "If this value varies between gametes then it must be specified with a " + "file containing a list of samples and the value associated with each gamete " + "those samples are derived from. " + "Each line should contain a sample identifier followed by value of each " + "gamete in the same order as specified using the --sample-parents argument. " + ), + ), +) sample_pool = Parameter( "--sample-pool", @@ -288,6 +372,14 @@ def add_to(self, parser): ), ) + +_optional_field_descriptions = [ + "INFO/{} = {}".format(f.id, f.descr) for f in INFO.OPTIONAL_FIELDS +] +_optional_field_descriptions += [ + "FORMAT/{}: {}".format(f.id, f.descr) for f in FORMAT.OPTIONAL_FIELDS +] + report = Parameter( "--report", dict( @@ -295,13 +387,11 @@ def add_to(self, parser): nargs="*", default=[], help=( - "Extra fields to report within the output VCF: " - "AFPRIOR = prior allele frequencies; " - "AFP = posterior mean allele frequencies; " - "AOP = posterior probability of allele occurring at any copy number; " - "GP = genotype posterior probabilities; " - "GL = genotype likelihoods." - ), + "Extra fields to report within the output VCF. " + "The INFO/FORMAT prefix may be omitted to return both " + "variations of the named field. Options include: " + ) + + "; ".join(_optional_field_descriptions), ), ) @@ -472,7 +562,7 @@ def add_to(self, parser): nargs=1, default=[0.60], help=( - "Posterior phenotype probability threshold for identification of " + "Posterior probability threshold for identification of " "incongruent posterior modes (default = 0.60)." ), ), @@ -653,8 +743,24 @@ def add_to(self, parser): mcmc_chain_incongruence_threshold, ] +PEDIGREE_PARSER_ARGUMENTS = [ + sample_parents, + gamete_ploidy, + gamete_ibd, + gamete_error, +] + CALL_MCMC_PARSER_ARGUMENTS = KNOWN_HAPLOTYPES_ARGUMENTS + DEFAULT_MCMC_PARSER_ARGUMENTS +# insert pedigree arguments in appropriate place and remove inbreeding which is currently unsupported +assert CALL_MCMC_PARSER_ARGUMENTS[5] == inbreeding +CALL_PEDIGREE_MCMC_PARSER_ARGUMENTS = ( + CALL_MCMC_PARSER_ARGUMENTS[0:5] + + PEDIGREE_PARSER_ARGUMENTS + + CALL_MCMC_PARSER_ARGUMENTS[6:] +) + + ASSEMBLE_MCMC_PARSER_ARGUMENTS = ( [ region, @@ -818,22 +924,155 @@ def parse_sample_value_map(argument, samples, type): return data +def parse_pedigree_arguments( + samples, + sample_bams, + ploidy_argument, + sample_parents_argument, + gamete_ploidy_argument, + gamete_ibd_argument, + gamete_error_argument, +): + """Parse arguments related to pedigree specification. + + Parameters + ---------- + samples : list + List of ordered samples. + sample_bams : dict[str, str] + Dict mapping sample names to bam filepaths. + ploidy_argument : str + Filepath or default value for for ploidy. + inbreeding_argument : str + Filepath or default value for for inbreeding. + sample_parents_argument : str + Filepath to tab-separated values describing pedigree. + gamete_ploidy_argument : str + Filepath or default value for for gametic ploidy. + gamete_ibd_argument, + Filepath or default value for for gametic IBD excess. + gamete_error_argument, + Filepath or default value for for gametic error. + + Returns + ------- + data : dict + A dictionary containing the following: + - 'samples': list of ordered samples. + - 'sample_bams': dict mapping sample names to bam filepaths. + - 'sample_ploidy' dict mapping sample names to ploidy. + - 'sample_inbreeding' dict mapping sample names to inbreeding. + - 'sample_parents': dict mapping sample names to parent sample names. + - 'gamete_ploidy': dict mapping sample names to ploidy of contributing gametes. + - 'gamete_ibd': dict mapping sample names to excess IBD of contributing gametes. + - 'gamete_error': dict mapping sample names to parental error of contributing gametes. + + Note + ---- + Samples listed in the 'sample_parents_argument' file will be appended + to the 'samples' list and 'sample_bams' dict if they are not already present. + A None value is used to indicate that no bam file is available for that sample. + """ + # parse pedigree, inserting new samples as required + known_samples = set(samples) + sample_parents = dict() + with open(sample_parents_argument) as f: + for line in f.readlines(): + sample, p, q = line.strip().split("\t") + if sample not in known_samples: + # add a dummy sample + samples.append(sample) + sample_bams[sample] = [] + known_samples.add(sample) + p = None if p == "." else p + q = None if q == "." else q + sample_parents[sample] = (p, q) + + # parse ploidy and inbreeding to ensure any additional samples are included + sample_ploidy = parse_sample_value_map( + ploidy_argument, + samples, + type=int, + ) + sample_inbreeding = {s: 0.0 for s in samples} + + # gamete ploidy + gamete_ploidy = dict() + if gamete_ploidy_argument is None: + # assume it is half the individuals ploidy + for sample in samples: + ploidy = sample_ploidy[sample] + if ploidy % 2: + raise ValueError( + "Gamete ploidy must be specified for individuals with odd ploidy" + ) + tau = ploidy // 2 + gamete_ploidy[sample] = (tau, tau) + elif gamete_ploidy_argument.isdigit(): + # constant for all samples + tau = int(gamete_ploidy_argument) + for sample in samples: + gamete_ploidy[sample] = (tau, tau) + else: + # must be a file + with open(gamete_ploidy_argument) as f: + for line in f.readlines(): + sample, tau_p, tau_q = line.strip().split("\t") + gamete_ploidy[sample] = (int(tau_p), int(tau_q)) + + # gamete ibd + gamete_ibd = dict() + if gamete_ibd_argument.replace(".", "", 1).isdigit(): + # constant for all samples + lambda_ = float(gamete_ibd_argument) + for sample in samples: + gamete_ibd[sample] = (lambda_, lambda_) + else: + # must be a file + with open(gamete_ibd_argument) as f: + for line in f.readlines(): + sample, lambda_p, lambda_q = line.strip().split("\t") + gamete_ibd[sample] = (float(lambda_p), float(lambda_q)) + + # gamete error + gamete_error = dict() + if gamete_error_argument.replace(".", "", 1).isdigit(): + # constant for all samples + err = float(gamete_error_argument) + for sample in samples: + gamete_error[sample] = (err, err) + else: + # must be a file + with open(gamete_error_argument) as f: + for line in f.readlines(): + sample, err_p, err_q = line.strip().split("\t") + gamete_error[sample] = (float(err_p), float(err_q)) + + return dict( + samples=samples, + sample_bams=sample_bams, + sample_ploidy=sample_ploidy, + sample_inbreeding=sample_inbreeding, + sample_parents=sample_parents, + gamete_ploidy=gamete_ploidy, + gamete_ibd=gamete_ibd, + gamete_error=gamete_error, + ) + + def parse_sample_temperatures(mcmc_temperatures_argument, samples): """Parse inverse temperatures for MCMC simulation with parallel-tempering. - Parameters ---------- mcmc_temperatures_argument : str Value(s) for mcmc_temperatures. samples : list List of samples. - Returns ------- sample_temperatures : dict Dict mapping each sample to a list of temperatures (floats). - """ if len(mcmc_temperatures_argument) > 1: # must be a list of temps @@ -868,7 +1107,26 @@ def parse_sample_temperatures(mcmc_temperatures_argument, samples): return data -def collect_default_program_arguments(arguments): +def parse_report_fields(report_argument): + if report_argument is None: + report_argument = set() + else: + report_argument = set(report_argument) + info_fields = INFO.DEFAULT_FIELDS.copy() + for f in INFO.OPTIONAL_FIELDS: + id = f.id + if (id in report_argument) or (f"INFO/{id}" in report_argument): + info_fields.append(f) + + format_fields = FORMAT.DEFAULT_FIELDS.copy() + for f in FORMAT.OPTIONAL_FIELDS: + id = f.id + if (id in report_argument) or (f"FORMAT/{id}" in report_argument): + format_fields.append(f) + return info_fields, format_fields + + +def collect_default_program_arguments(arguments, skip_inbreeding=False): # must have some source of error in reads if arguments.ignore_base_phred_scores: if arguments.base_error_rate[0] == 0.0: @@ -887,11 +1145,15 @@ def collect_default_program_arguments(arguments): samples, type=int, ) - sample_inbreeding = parse_sample_value_map( - arguments.inbreeding[0], - samples, - type=float, - ) + if skip_inbreeding: + sample_inbreeding = None + else: + sample_inbreeding = parse_sample_value_map( + arguments.inbreeding[0], + samples, + type=float, + ) + info_fields, format_fields = parse_report_fields(arguments.report) return dict( samples=samples, sample_bams=sample_bams, @@ -905,7 +1167,8 @@ def collect_default_program_arguments(arguments): skip_duplicates=arguments.skip_duplicates, skip_qcfail=arguments.skip_qcfail, skip_supplementary=arguments.skip_supplementary, - report_fields=arguments.report, + info_fields=info_fields, + format_fields=format_fields, n_cores=arguments.cores[0], ) @@ -920,24 +1183,44 @@ def collect_call_exact_program_arguments(arguments): def collect_default_mcmc_program_arguments(arguments): - data = collect_default_program_arguments(arguments) - data.update( - dict( - mcmc_chains=arguments.mcmc_chains[0], - mcmc_steps=arguments.mcmc_steps[0], - mcmc_burn=arguments.mcmc_burn[0], - mcmc_incongruence_threshold=arguments.mcmc_chain_incongruence_threshold[0], - random_seed=arguments.mcmc_seed[0], - ) + return dict( + mcmc_chains=arguments.mcmc_chains[0], + mcmc_steps=arguments.mcmc_steps[0], + mcmc_burn=arguments.mcmc_burn[0], + mcmc_incongruence_threshold=arguments.mcmc_chain_incongruence_threshold[0], + random_seed=arguments.mcmc_seed[0], ) - return data def collect_call_mcmc_program_arguments(arguments): - data = collect_default_mcmc_program_arguments(arguments) + data = collect_default_program_arguments(arguments) + data.update(collect_default_mcmc_program_arguments(arguments)) + data["vcf"] = arguments.haplotypes[0] + data["prior_frequencies_tag"] = arguments.prior_frequencies[0] + data["filter_input_haplotypes"] = arguments.filter_input_haplotypes[0] + return data + + +def collect_call_pedigree_mcmc_program_arguments(arguments): + # TODO: re-add the inbreeding option when supported + data = collect_default_program_arguments(arguments, skip_inbreeding=True) + data["format_fields"] += FORMAT.PEDIGREE_FIELDS + data.update(collect_default_mcmc_program_arguments(arguments)) data["vcf"] = arguments.haplotypes[0] data["prior_frequencies_tag"] = arguments.prior_frequencies[0] data["filter_input_haplotypes"] = arguments.filter_input_haplotypes[0] + assert data["sample_inbreeding"] is None + data.update( + parse_pedigree_arguments( + samples=data["samples"], + sample_bams=data["sample_bams"], + ploidy_argument=arguments.ploidy[0], + sample_parents_argument=arguments.sample_parents[0], + gamete_ploidy_argument=arguments.gamete_ploidy[0], + gamete_ibd_argument=arguments.gamete_ibd[0], + gamete_error_argument=arguments.gamete_error[0], + ) + ) return data @@ -945,7 +1228,8 @@ def collect_assemble_mcmc_program_arguments(arguments): # target and regions cant be combined if (arguments.targets[0] is not None) and (arguments.region[0] is not None): raise ValueError("Cannot combine --targets and --region arguments.") - data = collect_default_mcmc_program_arguments(arguments) + data = collect_default_program_arguments(arguments) + data.update(collect_default_mcmc_program_arguments(arguments)) sample_mcmc_temperatures = parse_sample_temperatures( arguments.mcmc_temperatures, samples=data["samples"] ) diff --git a/mchap/application/assemble.py b/mchap/application/assemble.py index fc602e84..0a06c1cf 100644 --- a/mchap/application/assemble.py +++ b/mchap/application/assemble.py @@ -4,9 +4,13 @@ from dataclasses import dataclass import pysam +import mchap.io.vcf.infofields as INFO +import mchap.io.vcf.formatfields as FORMAT +import mchap.io.vcf.columns as COLUMN from mchap import mset from mchap.application import baseclass from mchap.application.baseclass import SampleAssemblyError, SAMPLE_ASSEMBLY_ERROR +from mchap.encoding.integer import minimum_error_correction from mchap import combinatorics from mchap.assemble import ( @@ -94,37 +98,21 @@ def call_sample_genotypes(self, data): Parameters ---------- data : LocusAssemblyData - With sampledata fields: "read_dists_unique", "read_dist_counts". Returns ------- data : LocusAssemblyData - With columndata fields REF and ALTS, sampledata fields: "alleles", - "haplotypes", "GQ", "GPM", "PHPM", "PHQ", "MCI" - and "GL", "GP", "AFP" if specified and infodata flag "REFMASKED". """ - for field in [ - "alleles", - "haplotypes", - "GQ", - "GPM", - "PHPM", - "PHQ", - "MCI", - "GL", - "GP", - "AFP", - "AOP", - ]: - data.sampledata[field] = dict() # dict to temporarily store posteriors + sample_modes = dict() sample_posteriors = dict() for sample in data.samples: # wrap in try clause to pass sample info back with any exception try: # assembly MCMC - reads = data.sampledata["read_dists_unique"][sample] - read_counts = data.sampledata["read_dist_counts"][sample] + read_calls = data.read_calls[sample] + read_dists = data.read_dists[sample] + read_counts = data.read_counts[sample] trace = ( DenovoMCMC( ploidy=data.sample_ploidy[sample], @@ -141,7 +129,7 @@ def call_sample_genotypes(self, data): llk_cache_threshold=self.mcmc_llk_cache_threshold, ) .fit( - reads=reads, + reads=read_dists, read_counts=read_counts, ) .burn(self.mcmc_burn) @@ -149,25 +137,30 @@ def call_sample_genotypes(self, data): posterior = trace.posterior() sample_posteriors[sample] = posterior - # phenotype results - phenotype = posterior.mode_phenotype() - phenotype_prob = phenotype.probabilities.sum() - data.sampledata["PHPM"][sample] = np.round( - phenotype_prob, self.precision - ) - data.sampledata["PHQ"][sample] = qual_of_prob(phenotype_prob) + # genotype support results + genotype_support = posterior.mode_genotype_support() + genotype_support_prob = genotype_support.probabilities.sum() + data.sampledata[FORMAT.SPM][sample] = genotype_support_prob + data.sampledata[FORMAT.SQ][sample] = qual_of_prob(genotype_support_prob) # genotype results - genotype, genotype_prob = phenotype.mode_genotype() - data.sampledata["haplotypes"][sample] = genotype - data.sampledata["GQ"][sample] = qual_of_prob(genotype_prob) - data.sampledata["GPM"][sample] = np.round(genotype_prob, self.precision) + genotype, genotype_prob = genotype_support.mode_genotype() + sample_modes[sample] = genotype + data.sampledata[FORMAT.GQ][sample] = qual_of_prob(genotype_prob) + data.sampledata[FORMAT.GPM][sample] = genotype_prob + + # MEC + mec = np.sum(minimum_error_correction(read_calls, genotype)) + mec_denom = np.sum(read_calls >= 0) + mecp = mec / mec_denom if mec_denom > 0 else np.nan + data.sampledata[FORMAT.MEC][sample] = mec + data.sampledata[FORMAT.MECP][sample] = mecp # chain incongruence incongruence = trace.replicate_incongruence( threshold=self.mcmc_incongruence_threshold ) - data.sampledata["MCI"][sample] = incongruence + data.sampledata[FORMAT.MCI][sample] = incongruence # end of try clause for specific sample except Exception as e: @@ -183,21 +176,21 @@ def call_sample_genotypes(self, data): haplotype_labels = {h.tobytes(): i for i, h in enumerate(haplotypes)} # record if reference allele was not observed - data.infodata["REFMASKED"] = not ref_called + data.infodata[INFO.REFMASKED] = not ref_called if not ref_called: # remove from labeling haplotype_labels.pop(haplotypes[0].tobytes()) # filter for no observed alleles if len(haplotypes) == 1: - data.columndata["FILTER"].append(vcf.filters.NOA.id) + data.columndata[COLUMN.FILTER].append(vcf.filters.NOA.id) # decode and save alt alleles if len(haplotypes) > 1: alts = data.locus.format_haplotypes(haplotypes[1:]) else: alts = [] - data.columndata["REF"] = data.locus.sequence - data.columndata["ALTS"] = alts + data.columndata[COLUMN.REF] = data.locus.sequence + data.columndata[COLUMN.ALT] = alts # encode sample haplotypes as alleles for sample in data.samples: @@ -205,49 +198,43 @@ def call_sample_genotypes(self, data): try: # encode sample haplotypes as alleles alleles = _genotype_as_alleles( - data.sampledata["haplotypes"][sample], + sample_modes[sample], haplotype_labels, ) - data.sampledata["alleles"][sample] = alleles + data.sampledata[FORMAT.GT][sample] = alleles # posterior allele frequencies/occurrences if requested - if ("AFP" in data.formatfields) or ("AOP" in data.formatfields): + if self.require_AFP(): frequencies = np.zeros(len(haplotypes)) occurrences = np.zeros(len(haplotypes)) haps, freqs, occur = sample_posteriors[sample].allele_frequencies() idx = mset.categorize(haplotypes, haps) frequencies[idx >= 0] = freqs[idx[idx >= 0]] occurrences[idx >= 0] = occur[idx[idx >= 0]] - data.sampledata["AFP"][sample] = np.round( - frequencies, self.precision - ) - data.sampledata["AOP"][sample] = np.round( - occurrences, self.precision + data.sampledata[FORMAT.AFP][sample] = frequencies + data.sampledata[FORMAT.AOP][sample] = occurrences + data.sampledata[FORMAT.ACP][sample] = ( + frequencies * data.sample_ploidy[sample] ) # encode posterior probabilities if requested - if "GP" in data.formatfields: + if FORMAT.GP in data.formatfields: probabilities = _genotype_posterior_as_array( sample_posteriors[sample], haplotype_labels, ) - data.sampledata["GP"][sample] = np.round( - probabilities, self.precision - ) - + data.sampledata[FORMAT.GP][sample] = probabilities # genotype likelihoods if requested - if "GL" in data.formatfields: - reads = data.sampledata["read_dists_unique"][sample] - read_counts = data.sampledata["read_dist_counts"][sample] + if FORMAT.GL in data.formatfields: + read_dists = data.read_dists[sample] + read_counts = data.read_counts[sample] llks = genotype_likelihoods( - reads=reads, + reads=read_dists, read_counts=read_counts, ploidy=data.sample_ploidy[sample], haplotypes=haplotypes, ) - data.sampledata["GL"][sample] = np.round( - natural_log_to_log10(llks), self.precision - ) + data.sampledata[FORMAT.GL][sample] = natural_log_to_log10(llks) # end of try clause for specific sample except Exception as e: diff --git a/mchap/application/atomize.py b/mchap/application/atomize.py new file mode 100644 index 00000000..914d2ebc --- /dev/null +++ b/mchap/application/atomize.py @@ -0,0 +1,315 @@ +import sys +import argparse +import pysam +import numpy as np +import pandas as pd +import warnings + +from mchap.io.vcf import headermeta as HEADER +from mchap.io.vcf import columns as COLUMN +from mchap.io.vcf import infofields as INFO +from mchap.io.vcf import formatfields as FORMAT +from mchap.application import arguments + + +class ExperimentalFeatureWarning(UserWarning): + pass + + +def get_haplotype_snvs(vcf_record): + snv_pos = np.array(vcf_record.info[INFO.SNVPOS.id]) - 1 + n_pos = len(snv_pos) + n_hap = len(vcf_record.alts) + 1 + haplotype_snvs = np.zeros((n_hap, n_pos), dtype="U") + haplotype_snvs[0] = np.array(list(vcf_record.ref))[snv_pos] + for i, alt in enumerate(vcf_record.alts): + alt = np.array(list(alt)) + haplotype_snvs[i + 1] = alt[snv_pos] + return haplotype_snvs + + +def format_snv_alleles(haplotype_snvs): + ref = haplotype_snvs[0] + _, n_pos = haplotype_snvs.shape + alts = [] + n_alts = [] + for i in range(n_pos): + _, idx = np.unique(haplotype_snvs[:, i], return_index=True) + idx.sort() + assert idx[0] == 0 + idx = idx[1:] + n_alts.append(len(idx)) + alts.append(",".join(haplotype_snvs[:, i][idx])) + return ref, np.array(alts), np.array(n_alts) + + +def get_haplotype_snv_indices(haplotype_snvs): + n_hap, n_pos = haplotype_snvs.shape + haplotype_idxs = np.zeros((n_hap, n_pos), dtype=int) + for i in range(n_pos): + d = {} + next_allel = 0 + for h in range(n_hap): + char = haplotype_snvs[h, i] + a = d.get(char) + if a is None: + a = next_allel + d[char] = a + next_allel += 1 + haplotype_idxs[h, i] = a + return haplotype_idxs + + +def get_sample_snv_ACP(vcf_record, haplotype_idxs, sample_ploidy): + _, n_pos = haplotype_idxs.shape + n_samples = len(vcf_record.samples) + out = np.zeros((n_pos, n_samples, 4)) + for i, s in enumerate(vcf_record.samples): + ploidy = sample_ploidy[i] + counts = vcf_record.samples[s].get(FORMAT.ACP.id) + if counts is None: + freqs = vcf_record.samples[s].get(FORMAT.AFP.id) + if freqs is None: + out[:, i, :] = np.nan + continue + else: + counts = np.array(freqs) * ploidy + else: + counts = np.array(counts) + for h, c in enumerate(counts): + for p, a in enumerate(haplotype_idxs[h]): + out[p, i, a] += c + # normalise + denom = np.sum(out, axis=-1, keepdims=True) + denom = np.where(denom == 0.0, np.nan, denom) + out /= denom + out *= sample_ploidy[None, :, None] + return out + + +def format_allele_floats(array, alts_number, length="R", precision=3): + input_dims = array.ndim + if input_dims == 2: + array = array[:, None, :] + elif input_dims == 3: + pass + else: + raise ValueError("Number of dimensions not supported.") + assert length in ("R", "A") + formatted = [] + for limit, freqs in zip(alts_number, array): + if length == "R": + limit += 1 + freqs = freqs[:, 0:limit] + freqs = freqs.round(precision) + missing = np.isnan(freqs) + freqs = freqs.astype("U") + freqs = np.char.rstrip(freqs, "0") + freqs = np.char.rstrip(freqs, ".") + freqs[missing] = "." + head = freqs[:, 0] + tail = freqs[:, 1:] + for t in tail.T: + head = np.char.add(head, ",") + head = np.char.add(head, t) + formatted.append(head) + formatted = np.array(formatted) + if input_dims == 2: + formatted = np.squeeze(formatted, 1) + return formatted + + +def get_sample_snv_GT(vcf_record, haplotype_idxs, sep="|"): + n_haps, n_pos = haplotype_idxs.shape + haplotype_counts = np.zeros(n_haps) + sample_ploidy = [] + out = [] + for s in vcf_record.samples: + haplotype_gt = vcf_record.samples[s][FORMAT.GT.id] + ploidy = len(haplotype_gt) + sample_ploidy.append(ploidy) + snv_gts = np.full((ploidy, n_pos), -1, int) + for i, a in enumerate(haplotype_gt): + if a is not None: + haplotype_counts[a] += 1 + snv_gts[i] = haplotype_idxs[a] + snv_gts = snv_gts.T + out.append( + [sep.join([str(a) if a >= 0 else "." for a in call]) for call in snv_gts] + ) + out = np.array(out) + snv_counts = np.zeros((n_pos, haplotype_idxs.max() + 1)) + for hap, c in enumerate(haplotype_counts): + for p, a in enumerate(haplotype_idxs[hap]): + snv_counts[p, a] += c + return snv_counts, np.array(sample_ploidy), out.T # variants * samples + + +def get_sample_snv_PQ(vcf_record): + n_pos = len(vcf_record.info[INFO.SNVPOS.id]) + pq = np.array([d[FORMAT.SQ.id] for d in vcf_record.samples.values()]).astype("U") + return np.tile(pq, (n_pos, 1)) + + +def get_sample_snv_depth(vcf_record): + p = len(vcf_record.info[INFO.SNVPOS.id]) + null = np.full(p, np.nan) + out = [] + for s in vcf_record.samples: + dp = vcf_record.samples[s].get(FORMAT.SNVDP.id, null) + out.append(list(dp)) + return np.array(out).T + + +def format_vcf_snv_block(vcf_record): + # check if there are any SNVs in this block + if vcf_record.info[INFO.SNVPOS.id] == (None,): + return None + + # allele basics + haplotype_snvs = get_haplotype_snvs(vcf_record) + haplotype_idxs = get_haplotype_snv_indices(haplotype_snvs) + _, n_pos = haplotype_snvs.shape + + # column data + ref_column, alts_column, alts_number = format_snv_alleles(haplotype_snvs) + pos_column = np.array(vcf_record.info[INFO.SNVPOS.id]) - 1 + vcf_record.pos + contig_column = np.repeat(vcf_record.contig, n_pos) + rec_id = vcf_record.id + if rec_id: + id_column = [rec_id + "_SNV{}".format(i + 1) for i in range(n_pos)] + else: + id_column = "." + block_data = pd.DataFrame() + block_data[COLUMN.CHROM] = contig_column + block_data[COLUMN.POS] = pos_column + block_data[COLUMN.ID] = id_column + block_data[COLUMN.REF] = ref_column + block_data[COLUMN.ALT] = alts_column + block_data[COLUMN.QUAL] = "." + block_data[COLUMN.FILTER] = "." + + # sample data + info_snv_count, sample_ploidy, format_GT = get_sample_snv_GT( + vcf_record, haplotype_idxs + ) + sample_snv_ACP = get_sample_snv_ACP( + vcf_record, haplotype_idxs, sample_ploidy=sample_ploidy + ) + format_DS = format_allele_floats(sample_snv_ACP[:, :, 1:], alts_number, length="A") + format_PQ = get_sample_snv_PQ(vcf_record) + format_GQ = np.full_like(format_PQ, ".") + sample_depth = get_sample_snv_depth(vcf_record) + format_DP = sample_depth.astype("U") + format_DP[format_DP == "nan"] = "." + sample_data = format_GT + for field in [format_GQ, format_PQ, format_DP, format_DS]: + sample_data = np.char.add(sample_data, ":") + sample_data = np.char.add(sample_data, field) + sample_data = pd.DataFrame(sample_data) + sample_data.columns = list(vcf_record.samples) + + # info data + info_DP = sample_depth.sum(axis=1).astype("U") + info_DP[info_DP == "nan"] = "." + info_DP = ["{}={}".format(INFO.DP.id, counts) for counts in info_DP] + info_AC = format_allele_floats(info_snv_count[:, 1:], alts_number, length="A") + info_AC = ["{}={}".format(INFO.AC.id, counts) for counts in info_AC] + population_snv_ACP = sample_snv_ACP.sum(axis=1) + info_ACP = format_allele_floats(population_snv_ACP, alts_number, length="R") + info_ACP = ["{}={}".format(INFO.ACP.id, counts) for counts in info_ACP] + info_PS = np.tile("{}={}".format(INFO.PS.id, vcf_record.pos), n_pos) + info_column = [";".join(tup) for tup in zip(info_AC, info_ACP, info_DP, info_PS)] + block_data[COLUMN.INFO] = info_column + + # add sample data last + format_column = np.tile( + ":".join( + [FORMAT.GT.id, FORMAT.GQ.id, FORMAT.PQ.id, FORMAT.DP.id, FORMAT.DS.id] + ), + n_pos, + ) + block_data[COLUMN.FORMAT] = format_column + + # merge + block_data = pd.concat([block_data, sample_data], axis=1) + return block_data + + +def atomize_vcf(path, command=None): + if command is None: + command = "atomize {}".format(path) + vcf = pysam.VariantFile(path) + + # header metadata + sys.stdout.write(str(HEADER.fileformat("v4.3")) + "\n") + sys.stdout.write(str(HEADER.filedate()) + "\n") + sys.stdout.write(str(HEADER.source()) + "\n") + sys.stdout.write(str(HEADER.commandline(command)) + "\n") + + # write contigs + for contig in vcf.header.contigs.values(): + sys.stdout.write(str(contig.header_record)) + + # write info fields + for field in [ + INFO.AC, + INFO.ACP, + INFO.DP, + INFO.PS, + ]: + sys.stdout.write(str(field) + "\n") + + # write format fields + for field in [ + FORMAT.GT, + FORMAT.GQ, + FORMAT.PQ, + FORMAT.DP, + FORMAT.DS, + ]: + sys.stdout.write(str(field) + "\n") + + # write columns + columns_header = COLUMN.COLUMNS.copy() + columns_header += list(vcf.header.samples) + columns_header = "#" + "\t".join(columns_header) + sys.stdout.write(columns_header + "\n") + + # write blocks + for record in vcf: + block = format_vcf_snv_block(record) + if block is not None: + block.to_csv(sys.stdout, sep="\t", index=False, header=False) + + vcf.close() + + +def main(command): + warnings.warn("THIS PROGRAM IS EXPERIMENTAL!!!", ExperimentalFeatureWarning) + parser = argparse.ArgumentParser( + "Split MCHap haplotype calls into phased blocks of basis SNVs." + ) + arguments.Parameter( + "haplotypes", + dict( + type=str, + nargs=1, + default=[None], + help=( + "VCF file containing haplotype variants to be atomized. " + "This file must contain INFO/SNVPOS. " + "The INFO/DP and FORMAT/DP fields will be calculated from FORMAT/SNVDP if present in the input VCF file. " + "The INFO/ACP and FORMAT/DS fields will be calculated from FORMAT/ACP or FORMAT/AFP if either is " + "present in the input VCF file. " + "Note that the FORMAT/ACP or FORMAT/AFP fields from the input VCF file will be normalized in the event " + "that they do not sum to ploidy or one respectively." + ), + ), + ).add_to(parser) + if len(command) < 3: + parser.print_help() + sys.exit(1) + args = parser.parse_args(command[2:]) + path = args.haplotypes[0] + atomize_vcf(path, command=command) diff --git a/mchap/application/baseclass.py b/mchap/application/baseclass.py index e273a49e..38374e98 100644 --- a/mchap/application/baseclass.py +++ b/mchap/application/baseclass.py @@ -3,11 +3,10 @@ from dataclasses import dataclass import pysam import multiprocessing as mp -from collections import OrderedDict from mchap import mset from mchap.constant import PFEIFFER_ERROR -from mchap.encoding import character, integer +from mchap.encoding import character from mchap.io import ( Locus, extract_read_variants, @@ -15,8 +14,9 @@ encode_read_distributions, vcf, ) -from mchap.io.vcf.infofields import HEADER_INFO_FIELDS -from mchap.io.vcf.formatfields import HEADER_FORMAT_FIELDS +import mchap.io.vcf.infofields as INFO +import mchap.io.vcf.formatfields as FORMAT +import mchap.io.vcf.columns as COLUMN import warnings @@ -28,6 +28,8 @@ ) SAMPLE_ASSEMBLY_ERROR = "Exception encountered when assembling sample '{sample}'." +KILL_SIGNAL = "MCHAP_KILL_SIGNAL" + class LocusAssemblyError(Exception): pass @@ -52,7 +54,8 @@ class program(object): skip_duplicates: bool = True skip_qcfail: bool = True skip_supplementary: bool = True - report_fields: list = () + info_fields: list = None + format_fields: list = None n_cores: int = 1 precision: int = 3 random_seed: int = 42 @@ -66,35 +69,12 @@ def cli(cls, command): """ raise NotImplementedError() - def info_fields(self): - infofields = [ - "AN", - "AC", - "REFMASKED", - "NS", - "DP", - "RCOUNT", - "END", - "NVAR", - "SNVPOS", - ] + [f for f in ["AFPRIOR", "AFP", "AOP"] if f in self.report_fields] - return infofields - - def format_fields(self): - formatfields = [ - "GT", - "GQ", - "PHQ", - "DP", - "RCOUNT", - "RCALLS", - "MEC", - "MECP", - "GPM", - "PHPM", - "MCI", - ] + [f for f in ["AFP", "AOP", "DS", "GP", "GL"] if f in self.report_fields] - return formatfields + def require_AFP(self): + if {INFO.ACP, INFO.AFP, INFO.AOP, INFO.AOPSUM} & set(self.info_fields): + return True + if {FORMAT.ACP, FORMAT.AFP, FORMAT.AOP} & set(self.format_fields): + return True + return False def loci(self): raise NotImplementedError() @@ -119,29 +99,36 @@ def header(self): vcf.filters.NOA, vcf.filters.AF0, ] - info_fields = [HEADER_INFO_FIELDS[field] for field in self.info_fields()] - format_fields = [HEADER_FORMAT_FIELDS[field] for field in self.format_fields()] columns = [vcf.headermeta.columns(self.samples)] - header = meta_fields + contigs + filters + info_fields + format_fields + columns + header = ( + meta_fields + + contigs + + filters + + self.info_fields + + self.format_fields + + columns + ) return [str(line) for line in header] def _locus_data(self, locus, sample_bams): """Generate a LocusAssemblyData object for a given locus to be populated with data relating to a single vcf record. """ - infofields = self.info_fields() - formatfields = self.format_fields() return LocusAssemblyData( locus=locus, samples=self.samples, sample_bams=sample_bams, sample_ploidy=self.sample_ploidy, sample_inbreeding=self.sample_inbreeding, - infofields=infofields, - formatfields=formatfields, + read_calls=dict(), + read_dists=dict(), + read_counts=dict(), + infofields=self.info_fields.copy(), + formatfields=self.format_fields.copy(), columndata=dict(FILTER=list()), - infodata=dict(), - sampledata=dict(), + infodata={f: {} for f in INFO.ALL_FIELDS}, + sampledata={f: {} for f in FORMAT.ALL_FIELDS}, + precision=self.precision, ) def encode_sample_reads(self, data): @@ -150,23 +137,12 @@ def encode_sample_reads(self, data): Parameters ---------- data : LocusAssemblyData - With relevant locus, samples, sample_bams, and sample_inbreeding attributes. Returns ------- data : LocusAssemblyData - With sampledata fields: "read_calls", "read_dists_unique", "read_dist_counts", - "DP", "RCOUNT", "RCALLS". + With sample read data. """ - for field in [ - "DP", - "RCOUNT", - "RCALLS", - "read_calls", - "read_dists_unique", - "read_dist_counts", - ]: - data.sampledata[field] = dict() locus = data.locus for sample in data.samples: # wrap in try clause to pass sample info back with any exception @@ -192,24 +168,31 @@ def encode_sample_reads(self, data): )[name] read_chars.append(chars) read_quals.append(quals) - read_chars = np.concatenate(read_chars) - read_quals = np.concatenate(read_quals) + # merge bams + if len(pairs) > 0: + # one or more bam files + read_chars = np.concatenate(read_chars) + read_quals = np.concatenate(read_quals) + else: + # handle case of no bams (empty list) + shape = (0, len(locus.variants)) + read_chars = np.empty(shape, dtype="U1") + read_quals = np.empty(shape, dtype=np.int16) # get read stats read_count = read_chars.shape[0] - data.sampledata["RCOUNT"][sample] = read_count + data.sampledata[FORMAT.RCOUNT][sample] = read_count read_variant_depth = character.depth(read_chars) if len(read_variant_depth) == 0: - # no variants to score depth - data.sampledata["DP"][sample] = np.nan - else: - data.sampledata["DP"][sample] = np.round( - np.mean(read_variant_depth) - ) + read_variant_depth = np.array(np.nan) + data.sampledata[FORMAT.DP][sample] = np.round( + np.mean(read_variant_depth) + ) + data.sampledata[FORMAT.SNVDP][sample] = np.round(read_variant_depth) # encode reads as alleles and probabilities read_calls = encode_read_alleles(locus, read_chars) - data.sampledata["read_calls"][sample] = read_calls + data.read_calls[sample] = read_calls if self.ignore_base_phred_scores: read_quals = None read_dists = encode_read_distributions( @@ -218,12 +201,12 @@ def encode_sample_reads(self, data): read_quals, error_rate=self.base_error_rate, ) - data.sampledata["RCALLS"][sample] = np.sum(read_calls >= 0) + data.sampledata[FORMAT.RCALLS][sample] = np.sum(read_calls >= 0) # de-duplicate reads read_dists_unique, read_dist_counts = mset.unique_counts(read_dists) - data.sampledata["read_dists_unique"][sample] = read_dists_unique - data.sampledata["read_dist_counts"][sample] = read_dist_counts + data.read_dists[sample] = read_dists_unique + data.read_counts[sample] = read_dist_counts # end of try clause for specific sample except Exception as e: @@ -234,106 +217,88 @@ def encode_sample_reads(self, data): def call_sample_genotypes(self, data): raise NotImplementedError() - def sumarise_sample_genotypes(self, data): - """Computes some statistics comparing called genotypes and haplotypes - to initial read sequences. - - Parameters - ---------- - data : LocusAssemblyData - With sampledata fields: "alleles", "haplotypes", "read_calls". - - Returns - ------- - data : LocusAssemblyData - With sampledata fields: "GT" "MEC" "MECP". - """ - for field in ["GT", "MEC", "MECP"]: - data.sampledata[field] = dict() - for sample in data.samples: - # wrap in try clause to pass sample info back with any exception - try: - alleles = data.sampledata["alleles"][sample] - genotype = data.sampledata["haplotypes"][sample] - read_calls = data.sampledata["read_calls"][sample] - gt = "/".join([str(a) if a >= 0 else "." for a in alleles]) - mec = np.sum(integer.minimum_error_correction(read_calls, genotype)) - mec_denom = np.sum(read_calls >= 0) - mecp = ( - np.round(mec / mec_denom, self.precision) - if mec_denom > 0 - else np.nan - ) - data.sampledata["GT"][sample] = gt - data.sampledata["MEC"][sample] = mec - data.sampledata["MECP"][sample] = mecp - except Exception as e: - message = SAMPLE_ASSEMBLY_ERROR.format(sample=sample) - raise SampleAssemblyError(message) from e - return data - def sumarise_vcf_record(self, data): """Generate VCF record fields. Parameters ---------- data : LocusAssemblyData - With sampledata fields: . Returns ------- data : LocusAssemblyData - With infodata fields: - "END", "NVAR", "SNVPOS", "AC", "AN", "NS", "DP", "RCOUNT" - and "AFP" or "AOP" if specified. """ + data.columndata[COLUMN.CHROM] = data.locus.contig + data.columndata[COLUMN.POS] = data.locus.start + 1 # 0-based BED to 1-based VCF + data.columndata[COLUMN.ID] = data.locus.name + data.columndata[COLUMN.QUAL] = np.nan # TODO: calculate locus level QUAL # postions - data.infodata["END"] = data.locus.stop - data.infodata["NVAR"] = len(data.locus.variants) - data.infodata["SNVPOS"] = ( + data.infodata[INFO.END] = data.locus.stop + data.infodata[INFO.NVAR] = len(data.locus.variants) + data.infodata[INFO.SNVPOS] = ( np.subtract(data.locus.positions, data.locus.start) + 1 ) # if no filters applied then locus passed - if len(data.columndata["FILTER"]) == 0: - data.columndata["FILTER"] = vcf.filters.PASS.id + if len(data.columndata[COLUMN.FILTER]) == 0: + data.columndata[COLUMN.FILTER] = vcf.filters.PASS.id # alt allele counts - allele_counts = np.zeros(len(data.columndata["ALTS"]) + 1, int) - for array in data.sampledata["alleles"].values(): + allele_counts = np.zeros(len(data.columndata[COLUMN.ALT]) + 1, int) + for array in data.sampledata[FORMAT.GT].values(): for a in array: # don't count null alleles if a >= 0: allele_counts[a] += 1 - data.infodata["AC"] = allele_counts[1:] # skip ref count + data.infodata[INFO.AC] = allele_counts[1:] # skip ref count # total number of alleles in called genotypes - data.infodata["AN"] = np.sum(allele_counts) + data.infodata[INFO.AN] = np.sum(allele_counts) + # total number of unique alleles in called genotypes + data.infodata[INFO.UAN] = np.sum(allele_counts > 0) # number of called samples - data.infodata["NS"] = sum( - np.any(a >= 0) for a in data.sampledata["alleles"].values() + data.infodata[INFO.NS] = sum( + np.any(a >= 0) for a in data.sampledata[FORMAT.GT].values() + ) + # number of samples with Markov chain incongruence + data.infodata[INFO.MCI] = sum( + mci > 0 for mci in data.sampledata[FORMAT.MCI].values() ) # total read depth and allele depth if len(data.locus.variants) == 0: # it will be misleading to return a depth of 0 in this case - data.infodata["DP"] = np.nan + data.infodata[INFO.DP] = np.nan else: - data.infodata["DP"] = np.nansum(list(data.sampledata["DP"].values())) + data.infodata[INFO.DP] = np.nansum( + list(data.sampledata[FORMAT.DP].values()) + ) # total read count - data.infodata["RCOUNT"] = np.nansum(list(data.sampledata["RCOUNT"].values())) - # population mean posterior allele frequencies - if "AFP" in data.infofields: - # need to weight frequencies of each individual by ploidy - pop_ploidy = 0 - pop_total = np.zeros(len(data.columndata["ALTS"]) + 1, float) - for sample, freqs in data.sampledata["AFP"].items(): - ploidy = self.sample_ploidy[sample] - pop_ploidy += ploidy - pop_total += freqs * ploidy - data.infodata["AFP"] = (pop_total / pop_ploidy).round(self.precision) - if "AOP" in data.infofields: - prob_not_occurring = np.ones(len(data.columndata["ALTS"]) + 1, float) - for occur in data.sampledata["AOP"].values(): + data.infodata[INFO.RCOUNT] = np.nansum( + list(data.sampledata[FORMAT.RCOUNT].values()) + ) + n_allele = len(data.columndata[COLUMN.ALT]) + 1 + null_length_R = np.full(n_allele, np.nan) + if INFO.ACP in data.infofields: + _ACP = sum(data.sampledata[FORMAT.ACP].values()) + _ACP = null_length_R if np.isnan(_ACP).all() else _ACP + data.infodata[INFO.ACP] = _ACP + if INFO.AFP in data.infofields: + # use ACP to weight frequencies of each individual by ploidy + _AFP = sum(data.sampledata[FORMAT.ACP].values()) / sum( + data.sample_ploidy.values() + ) + _AFP = null_length_R if np.isnan(_AFP).all() else _AFP + data.infodata[INFO.AFP] = _AFP + if INFO.AOPSUM in data.infofields: + _AOPSUM = sum(data.sampledata[FORMAT.AOP].values()) + _AOPSUM = null_length_R if np.isnan(_AOPSUM).all() else _AOPSUM + data.infodata[INFO.AOPSUM] = _AOPSUM + if INFO.AOP in data.infofields: + prob_not_occurring = np.ones(len(data.columndata[COLUMN.ALT]) + 1, float) + for occur in data.sampledata[FORMAT.AOP].values(): prob_not_occurring = prob_not_occurring * (1 - occur) prob_occurring = 1 - prob_not_occurring - data.infodata["AOP"] = prob_occurring.round(self.precision) + data.infodata[INFO.AOP] = prob_occurring + if INFO.SNVDP in data.infofields: + _SNVDP = sum(data.sampledata[FORMAT.SNVDP].values()) + data.infodata[INFO.SNVDP] = _SNVDP return data def call_locus(self, locus, sample_bams): @@ -344,14 +309,8 @@ def call_locus(self, locus, sample_bams): ---------- locus Assembly target locus. - samples : list - Sample identifiers. sample_bams : dict Map for sample identifiers to bam path. - sample_ploidy : dict - Map of sample identifiers to ploidy. - sample_inbreeding : dict - Map of sample identifiers to inbreeding. Returns ------- @@ -362,7 +321,6 @@ def call_locus(self, locus, sample_bams): data = self._locus_data(locus, sample_bams) self.encode_sample_reads(data) self.call_sample_genotypes(data) - self.sumarise_sample_genotypes(data) self.sumarise_vcf_record(data) return data.format_vcf_record() @@ -394,7 +352,7 @@ def _worker(self, loci, queue): def _writer(self, queue): while True: line = queue.get() - if line == "KILL": + if line == KILL_SIGNAL: break sys.stdout.write(line + "\n") sys.stdout.flush() @@ -426,7 +384,7 @@ def _run_stdout_multi_core(self): for job in jobs: job.get() - queue.put("KILL") + queue.put(KILL_SIGNAL) pool.close() pool.join() @@ -444,33 +402,34 @@ class LocusAssemblyData(object): sample_bams: dict sample_ploidy: dict sample_inbreeding: dict + read_calls: dict + read_dists: dict + read_counts: dict infofields: list formatfields: list columndata: dict infodata: dict sampledata: dict + precision: float = 3 def _sampledata_as_list(self, field): - data = self.sampledata.get(field, dict()) + data = self.sampledata[field] return [data.get(s) for s in self.samples] def format_vcf_record(self): - info_data = OrderedDict() - for field in self.infofields: - info_data[field] = self.infodata.get(field) - info_string = vcf.format_info_field(**info_data) - format_data = OrderedDict() - for field in self.formatfields: - format_data[field] = self._sampledata_as_list(field) - format_string = vcf.format_sample_field(**format_data) + kwargs = {f.id: self.infodata[f] for f in self.infofields} + info_string = vcf.format_info_field(precision=self.precision, **kwargs) + kwargs = {f.id: self._sampledata_as_list(f) for f in self.formatfields} + format_string = vcf.format_sample_field(precision=self.precision, **kwargs) return vcf.format_record( - chrom=self.locus.contig, - pos=self.locus.start + 1, # 0-based BED to 1-based VCF - id=self.locus.name, - ref=self.columndata.get("REF"), - alt=self.columndata.get("ALTS"), - qual=self.columndata.get("QUAL"), - filter=self.columndata.get("FILTER"), + chrom=self.columndata[COLUMN.CHROM], + pos=self.columndata[COLUMN.POS], + id=self.columndata[COLUMN.ID], + ref=self.columndata[COLUMN.REF], + alt=self.columndata[COLUMN.ALT], + qual=self.columndata[COLUMN.QUAL], + filter=self.columndata[COLUMN.FILTER], info=info_string, format=format_string, + precision=self.precision, ) diff --git a/mchap/application/call.py b/mchap/application/call.py index fd033832..124622da 100644 --- a/mchap/application/call.py +++ b/mchap/application/call.py @@ -3,6 +3,9 @@ import numpy as np from dataclasses import dataclass +import mchap.io.vcf.infofields as INFO +import mchap.io.vcf.formatfields as FORMAT +import mchap.io.vcf.columns as COLUMN from mchap.application import call_baseclass from mchap.application.baseclass import SampleAssemblyError, SAMPLE_ASSEMBLY_ERROR from mchap.application.arguments import ( @@ -13,6 +16,7 @@ from mchap.calling.exact import genotype_likelihoods from mchap.jitutils import natural_log_to_log10 +from mchap.encoding.integer import minimum_error_correction from mchap.io import qual_of_prob, vcf @@ -48,29 +52,11 @@ def call_sample_genotypes(self, data): Parameters ---------- data : LocusAssemblyData - With sampledata fields: "read_dists_unique", "read_dist_counts". Returns ------- data : LocusAssemblyData - With columndata fields REF and ALTS, sampledata fields: - "alleles", "haplotypes", "GQ", "GPM", "PHPM", "PHQ", "MCI" - and "GL", "GP" if specified and infodata flag "REFMASKED". """ - for field in [ - "alleles", - "haplotypes", - "GQ", - "GPM", - "PHPM", - "PHQ", - "MCI", - "GL", - "GP", - "AFP", - "AOP", - ]: - data.sampledata[field] = dict() # get haplotypes and metadata haplotypes = data.locus.encode_haplotypes() prior_frequencies = data.locus.frequencies @@ -79,10 +65,10 @@ def call_sample_genotypes(self, data): mask[0] = mask_reference_allele # save allele sequences - data.columndata["REF"] = data.locus.sequence - data.columndata["ALTS"] = data.locus.alts - data.infodata["REFMASKED"] = mask_reference_allele - data.infodata["AFPRIOR"] = np.round(prior_frequencies, self.precision) + data.columndata[COLUMN.REF] = data.locus.sequence + data.columndata[COLUMN.ALT] = data.locus.alts + data.infodata[INFO.REFMASKED] = mask_reference_allele + data.infodata[INFO.AFPRIOR] = prior_frequencies # mask zero frequency haplotypes mask |= prior_frequencies == 0 @@ -90,70 +76,67 @@ def call_sample_genotypes(self, data): # remove masked haplotypes from mcmc if np.any(mask): mcmc_haplotypes = haplotypes[~mask] + mcmc_prior_frequencies = prior_frequencies[~mask] mcmc_haplotype_labels = np.where(~mask)[0] else: # use all haplotypes mcmc_haplotype_labels = None + mcmc_prior_frequencies = prior_frequencies mcmc_haplotypes = haplotypes # must have one or more haplotypes for MCMC invalid_scenario = len(mcmc_haplotypes) == 0 - # get prior for allele frequencies - if self.prior_frequencies_tag: - prior_frequencies = prior_frequencies[~mask] - else: - prior_frequencies = None - # handle invalid scenarios # TODO: handle this more elegantly? if len(mcmc_haplotypes) == 0: # must have one or more haplotypes for MCMC invalid_scenario = True - data.columndata["FILTER"].append(vcf.filters.NOA.id) + data.columndata[COLUMN.FILTER].append(vcf.filters.NOA.id) elif (prior_frequencies is not None) and np.any(np.isnan(prior_frequencies)): # nan caused by zero freq invalid_scenario = True - data.columndata["FILTER"].append(vcf.filters.AF0.id) + data.columndata[COLUMN.FILTER].append(vcf.filters.AF0.id) else: invalid_scenario = False if invalid_scenario: for sample in data.samples: ploidy = data.sample_ploidy[sample] - data.sampledata["alleles"][sample] = np.full(ploidy, -1, int) - data.sampledata["haplotypes"][sample] = np.full( - (ploidy, len(haplotypes[0])), -1, int - ) - data.sampledata["GQ"][sample] = np.nan - data.sampledata["GPM"][sample] = np.nan - data.sampledata["PHPM"][sample] = np.nan - data.sampledata["PHQ"][sample] = np.nan - data.sampledata["MCI"][sample] = np.nan - data.sampledata["AFP"][sample] = np.array([np.nan]) - data.sampledata["AOP"][sample] = np.array([np.nan]) - data.sampledata["GP"][sample] = np.array([np.nan]) - data.sampledata["GL"][sample] = np.array([np.nan]) + data.sampledata[FORMAT.GT][sample] = np.full(ploidy, -1, int) + data.sampledata[FORMAT.GQ][sample] = np.nan + data.sampledata[FORMAT.GPM][sample] = np.nan + data.sampledata[FORMAT.SPM][sample] = np.nan + data.sampledata[FORMAT.SQ][sample] = np.nan + data.sampledata[FORMAT.MCI][sample] = np.nan + data.sampledata[FORMAT.ACP][sample] = np.array([np.nan]) + data.sampledata[FORMAT.AFP][sample] = np.array([np.nan]) + data.sampledata[FORMAT.AOP][sample] = np.array([np.nan]) + data.sampledata[FORMAT.GP][sample] = np.array([np.nan]) + data.sampledata[FORMAT.GL][sample] = np.array([np.nan]) + data.sampledata[FORMAT.MEC][sample] = np.nan + data.sampledata[FORMAT.MECP][sample] = np.nan return data # iterate of samples for sample in data.samples: # wrap in try clause to pass sample info back with any exception try: - reads = data.sampledata["read_dists_unique"][sample] - read_counts = read_counts = data.sampledata["read_dist_counts"][sample] + read_calls = data.read_calls[sample] + read_dists = data.read_dists[sample] + read_counts = data.read_counts[sample] # call haplotypes trace = ( CallingMCMC( ploidy=data.sample_ploidy[sample], haplotypes=mcmc_haplotypes, inbreeding=data.sample_inbreeding[sample], - frequencies=prior_frequencies, + frequencies=mcmc_prior_frequencies, steps=self.mcmc_steps, chains=self.mcmc_chains, random_seed=self.random_seed, ) .fit( - reads=reads, + reads=read_dists, read_counts=read_counts, ) .burn(self.mcmc_burn) @@ -165,55 +148,44 @@ def call_sample_genotypes(self, data): threshold=self.mcmc_incongruence_threshold ) posterior = trace.posterior() - alleles, genotype_prob, phenotype_prob = posterior.mode(phenotype=True) - - # store variables - data.sampledata["alleles"][sample] = alleles - data.sampledata["haplotypes"][sample] = haplotypes[alleles] - data.sampledata["GQ"][sample] = qual_of_prob(genotype_prob) - data.sampledata["GPM"][sample] = np.round(genotype_prob, self.precision) - data.sampledata["PHPM"][sample] = np.round( - phenotype_prob, self.precision + alleles, genotype_prob, genotype_support_prob = posterior.mode( + genotype_support=True ) - data.sampledata["PHQ"][sample] = qual_of_prob(phenotype_prob) - data.sampledata["MCI"][sample] = incongruence - - # posterior allele frequencies if requested - if "AFP" in data.formatfields: - frequencies = np.zeros(len(haplotypes)) - alleles, counts = np.unique(trace.genotypes, return_counts=True) - frequencies[alleles] = counts / counts.sum() - data.sampledata["AFP"][sample] = np.round( - frequencies, self.precision - ) - # posterior allele occurrence if requested - if "AOP" in data.formatfields: - occurrences = np.zeros(len(haplotypes)) - alleles, _, occur = posterior.allele_frequencies() - occurrences[alleles] = occur - data.sampledata["AOP"][sample] = np.round( - occurrences, self.precision - ) + # store variables + data.sampledata[FORMAT.GT][sample] = alleles + data.sampledata[FORMAT.GQ][sample] = qual_of_prob(genotype_prob) + data.sampledata[FORMAT.GPM][sample] = genotype_prob + data.sampledata[FORMAT.SPM][sample] = genotype_support_prob + data.sampledata[FORMAT.SQ][sample] = qual_of_prob(genotype_support_prob) + data.sampledata[FORMAT.MCI][sample] = incongruence + mec = np.sum(minimum_error_correction(read_calls, haplotypes[alleles])) + mec_denom = np.sum(read_calls >= 0) + mecp = mec / mec_denom if mec_denom > 0 else np.nan + data.sampledata[FORMAT.MEC][sample] = mec + data.sampledata[FORMAT.MECP][sample] = mecp + + # posterior allele frequencies/occurrence if requested + if self.require_AFP(): + frequencies, counts, occurrence = trace.posterior_frequencies() + data.sampledata[FORMAT.ACP][sample] = counts + data.sampledata[FORMAT.AFP][sample] = frequencies + data.sampledata[FORMAT.AOP][sample] = occurrence # genotype posteriors if requested - if "GP" in data.formatfields: + if FORMAT.GP in data.formatfields: probabilities = posterior.as_array(len(haplotypes)) - data.sampledata["GP"][sample] = np.round( - probabilities, self.precision - ) + data.sampledata[FORMAT.GP][sample] = probabilities # genotype likelihoods if requested - if "GL" in data.formatfields: + if FORMAT.GL in data.formatfields: llks = genotype_likelihoods( - reads=reads, + reads=read_dists, read_counts=read_counts, ploidy=data.sample_ploidy[sample], haplotypes=haplotypes, ) - data.sampledata["GL"][sample] = np.round( - natural_log_to_log10(llks), self.precision - ) + data.sampledata[FORMAT.GL][sample] = natural_log_to_log10(llks) # end of try clause for specific sample except Exception as e: diff --git a/mchap/application/call_exact.py b/mchap/application/call_exact.py index 5c439872..976c4bb5 100644 --- a/mchap/application/call_exact.py +++ b/mchap/application/call_exact.py @@ -3,6 +3,9 @@ import numpy as np from dataclasses import dataclass +import mchap.io.vcf.infofields as INFO +import mchap.io.vcf.formatfields as FORMAT +import mchap.io.vcf.columns as COLUMN from mchap.application import call_baseclass from mchap.application.baseclass import SampleAssemblyError, SAMPLE_ASSEMBLY_ERROR from mchap.application.arguments import ( @@ -21,6 +24,7 @@ index_as_genotype_alleles, ) +from mchap.encoding.integer import minimum_error_correction from mchap.io import qual_of_prob, vcf @@ -51,38 +55,20 @@ def call_sample_genotypes(self, data): Parameters ---------- data : LocusAssemblyData - With sampledata fields: "read_dists_unique", "read_dist_counts". Returns ------- data : LocusAssemblyData - With columndata fields REF and ALTS, sampledata fields: - "alleles", "haplotypes", "GQ", "GPM", "PHPM", "PHQ", "MCI" - and "GL", "GP" if specified and infodata flag "REFMASKED". """ - for field in [ - "alleles", - "haplotypes", - "GQ", - "GPM", - "PHPM", - "PHQ", - "MCI", - "GL", - "GP", - "AFP", - "AOP", - ]: - data.sampledata[field] = dict() haplotypes = data.locus.encode_haplotypes() mask_reference_allele = data.locus.mask_reference_allele prior_frequencies = data.locus.frequencies # save allele sequences - data.columndata["REF"] = data.locus.sequence - data.columndata["ALTS"] = data.locus.alts - data.infodata["REFMASKED"] = mask_reference_allele - data.infodata["AFPRIOR"] = np.round(prior_frequencies, self.precision) + data.columndata[COLUMN.REF] = data.locus.sequence + data.columndata[COLUMN.ALT] = data.locus.alts + data.infodata[INFO.REFMASKED] = mask_reference_allele + data.infodata[INFO.AFPRIOR] = prior_frequencies # check prior frequencies arguments if mask_reference_allele: @@ -93,11 +79,11 @@ def call_sample_genotypes(self, data): if mask_reference_allele and len(haplotypes) == 1: # only allele is masked invalid_scenario = True - data.columndata["FILTER"].append(vcf.filters.NOA.id) + data.columndata[COLUMN.FILTER].append(vcf.filters.NOA.id) elif np.any(np.isnan(prior_frequencies)): # nan caused by zero freq invalid_scenario = True - data.columndata["FILTER"].append(vcf.filters.AF0.id) + data.columndata[COLUMN.FILTER].append(vcf.filters.AF0.id) else: invalid_scenario = False @@ -105,19 +91,19 @@ def call_sample_genotypes(self, data): if invalid_scenario: for sample in data.samples: ploidy = data.sample_ploidy[sample] - data.sampledata["alleles"][sample] = np.full(ploidy, -1, int) - data.sampledata["haplotypes"][sample] = np.full( - (ploidy, len(haplotypes[0])), -1, int - ) - data.sampledata["GQ"][sample] = np.nan - data.sampledata["GPM"][sample] = np.nan - data.sampledata["PHPM"][sample] = np.nan - data.sampledata["PHQ"][sample] = np.nan - data.sampledata["MCI"][sample] = np.nan - data.sampledata["AFP"][sample] = np.array([np.nan]) - data.sampledata["AOP"][sample] = np.array([np.nan]) - data.sampledata["GP"][sample] = np.array([np.nan]) - data.sampledata["GL"][sample] = np.array([np.nan]) + data.sampledata[FORMAT.GT][sample] = np.full(ploidy, -1, int) + data.sampledata[FORMAT.GQ][sample] = np.nan + data.sampledata[FORMAT.GPM][sample] = np.nan + data.sampledata[FORMAT.SPM][sample] = np.nan + data.sampledata[FORMAT.SQ][sample] = np.nan + data.sampledata[FORMAT.MCI][sample] = np.nan + data.sampledata[FORMAT.ACP][sample] = np.array([np.nan]) + data.sampledata[FORMAT.AFP][sample] = np.array([np.nan]) + data.sampledata[FORMAT.AOP][sample] = np.array([np.nan]) + data.sampledata[FORMAT.GP][sample] = np.array([np.nan]) + data.sampledata[FORMAT.GL][sample] = np.array([np.nan]) + data.sampledata[FORMAT.MEC][sample] = np.nan + data.sampledata[FORMAT.MECP][sample] = np.nan return data for sample in data.samples: @@ -125,15 +111,16 @@ def call_sample_genotypes(self, data): try: ploidy = data.sample_ploidy[sample] inbreeding = data.sample_inbreeding[sample] - reads = data.sampledata["read_dists_unique"][sample] - read_counts = read_counts = data.sampledata["read_dist_counts"][sample] + read_calls = data.read_calls[sample] + read_dists = data.read_dists[sample] + read_counts = data.read_counts[sample] # call haplotypes - if ("GL" in data.formatfields) or ("GP" in data.formatfields): + if (FORMAT.GL in data.formatfields) or (FORMAT.GP in data.formatfields): # calculate full arrays llks = genotype_likelihoods( - reads=reads, + reads=read_dists, read_counts=read_counts, haplotypes=haplotypes, ploidy=ploidy, @@ -148,59 +135,57 @@ def call_sample_genotypes(self, data): idx = np.argmax(probabilities) alleles = index_as_genotype_alleles(idx, ploidy) genotype_prob = probabilities[idx] - _, phenotype_probs = alternate_dosage_posteriors( + _, genotype_support_probs = alternate_dosage_posteriors( alleles, probabilities ) - phenotype_prob = phenotype_probs.sum() + genotype_support_prob = genotype_support_probs.sum() # store specified arrays - if ("AFP" in data.formatfields) or ("AOP" in data.formatfields): - freqs, occur = posterior_allele_frequencies( + if self.require_AFP(): + freqs, counts, occur = posterior_allele_frequencies( probabilities, ploidy, len(haplotypes) ) - data.sampledata["AFP"][sample] = np.round(freqs, self.precision) - data.sampledata["AOP"][sample] = np.round(occur, self.precision) - if "GL" in data.formatfields: - data.sampledata["GL"][sample] = np.round( - natural_log_to_log10(llks), self.precision - ) - if "GP" in data.formatfields: - data.sampledata["GP"][sample] = np.round( - probabilities, self.precision - ) + data.sampledata[FORMAT.ACP][sample] = counts + data.sampledata[FORMAT.AFP][sample] = freqs + data.sampledata[FORMAT.AOP][sample] = occur + if FORMAT.GL in data.formatfields: + data.sampledata[FORMAT.GL][sample] = natural_log_to_log10(llks) + if FORMAT.GP in data.formatfields: + data.sampledata[FORMAT.GP][sample] = probabilities else: # use low memory calculation mode_results = posterior_mode( - reads=reads, + reads=read_dists, read_counts=read_counts, haplotypes=haplotypes, ploidy=ploidy, inbreeding=inbreeding, frequencies=prior_frequencies, - return_phenotype_prob=True, - return_posterior_frequencies="AFP" in data.formatfields, - return_posterior_occurrence="AOP" in data.formatfields, + return_support_prob=True, + return_posterior_frequencies=True, + return_posterior_occurrence=True, ) - alleles, _, genotype_prob, phenotype_prob = mode_results[0:4] - if "AOP" in data.formatfields: - occur = np.round(mode_results[-1], self.precision) - data.sampledata["AOP"][sample] = occur - mode_results = mode_results[0:-1] - if "AFP" in data.formatfields: - freqs = np.round(mode_results[-1], self.precision) - data.sampledata["AFP"][sample] = freqs + alleles, _, genotype_prob, genotype_support_prob = mode_results[0:4] + + freqs = mode_results[-2] + occur = mode_results[-1] + data.sampledata[FORMAT.ACP][sample] = freqs * ploidy + data.sampledata[FORMAT.AFP][sample] = freqs + data.sampledata[FORMAT.AOP][sample] = occur # store variables - data.sampledata["alleles"][sample] = alleles - data.sampledata["haplotypes"][sample] = haplotypes[alleles] - data.sampledata["GQ"][sample] = qual_of_prob(genotype_prob) - data.sampledata["GPM"][sample] = np.round(genotype_prob, self.precision) - data.sampledata["PHPM"][sample] = np.round( - phenotype_prob, self.precision - ) - data.sampledata["PHQ"][sample] = qual_of_prob(phenotype_prob) - data.sampledata["MCI"][sample] = None + data.sampledata[FORMAT.GT][sample] = alleles + data.sampledata[FORMAT.GQ][sample] = qual_of_prob(genotype_prob) + data.sampledata[FORMAT.GPM][sample] = genotype_prob + data.sampledata[FORMAT.SPM][sample] = genotype_support_prob + data.sampledata[FORMAT.SQ][sample] = qual_of_prob(genotype_support_prob) + data.sampledata[FORMAT.MCI][sample] = np.nan + mec = np.sum(minimum_error_correction(read_calls, haplotypes[alleles])) + mec_denom = np.sum(read_calls >= 0) + mecp = mec / mec_denom if mec_denom > 0 else np.nan + data.sampledata[FORMAT.MEC][sample] = mec + data.sampledata[FORMAT.MECP][sample] = mecp # end of try clause for specific sample except Exception as e: diff --git a/mchap/application/call_pedigree.py b/mchap/application/call_pedigree.py new file mode 100644 index 00000000..83181d9f --- /dev/null +++ b/mchap/application/call_pedigree.py @@ -0,0 +1,263 @@ +import sys +import argparse +import numpy as np +from dataclasses import dataclass +import warnings + +import mchap.io.vcf.infofields as INFO +import mchap.io.vcf.formatfields as FORMAT +import mchap.io.vcf.columns as COLUMN +from mchap.application import call_baseclass +from mchap.application.baseclass import SampleAssemblyError, SAMPLE_ASSEMBLY_ERROR +from mchap.application.arguments import ( + CALL_PEDIGREE_MCMC_PARSER_ARGUMENTS, + collect_call_pedigree_mcmc_program_arguments, +) +from mchap.pedigree.classes import PedigreeCallingMCMC +from mchap.calling.exact import genotype_likelihoods +from mchap.jitutils import natural_log_to_log10 + +from mchap.encoding.integer import minimum_error_correction +from mchap.io import qual_of_prob, vcf + + +class ExperimentalFeatureWarning(UserWarning): + pass + + +@dataclass +class program(call_baseclass.program): + sample_parents: dict = None + gamete_ploidy: dict = None + gamete_ibd: dict = None + gamete_error: dict = None + mcmc_chains: int = 1 + mcmc_steps: int = 2000 + mcmc_burn: int = 1000 + mcmc_incongruence_threshold: float = 0.60 + + @classmethod + def cli(cls, command): + """Program initialization from cli command + + e.g. `program.cli(sys.argv)` + """ + warnings.warn( + "THIS PROGRAM IS HIGHLY EXPERIMENTAL!!!", ExperimentalFeatureWarning + ) + parser = argparse.ArgumentParser( + "MCMC haplotype calling via pedigree-annealing. " + ) + for arg in CALL_PEDIGREE_MCMC_PARSER_ARGUMENTS: + arg.add_to(parser) + + if len(command) < 3: + parser.print_help() + sys.exit(1) + args = parser.parse_args(command[2:]) + + # sort argument details + arguments = collect_call_pedigree_mcmc_program_arguments(args) + return cls(cli_command=command, **arguments) + + def call_sample_genotypes(self, data): + """Pedigree based genotype calling. + + Parameters + ---------- + data : LocusAssemblyData + With sampledata fields: "read_dists_unique", "read_dist_counts". + + Returns + ------- + data : LocusAssemblyData + With columndata fields REF and ALTS, sampledata fields: + "alleles", "haplotypes", "GQ", "GPM", "PHPM", "PHQ", "MCI" + and "GL", "GP" if specified and infodata flag "REFMASKED". + """ + # get haplotypes and metadata + haplotypes = data.locus.encode_haplotypes() + prior_frequencies = data.locus.frequencies + mask_reference_allele = data.locus.mask_reference_allele + mask = np.zeros(len(haplotypes), bool) + mask[0] = mask_reference_allele + + # save allele sequences + data.columndata[COLUMN.REF] = data.locus.sequence + data.columndata[COLUMN.ALT] = data.locus.alts + data.infodata[INFO.REFMASKED] = mask_reference_allele + data.infodata[INFO.AFPRIOR] = prior_frequencies + + # mask zero frequency haplotypes if using prior + mask |= prior_frequencies == 0 + + # remove masked haplotypes from mcmc + if np.any(mask): + mcmc_haplotypes = haplotypes[~mask] + mcmc_prior_frequencies = prior_frequencies[~mask] + mcmc_haplotype_labels = np.where(~mask)[0] + else: + # use all haplotypes + mcmc_haplotype_labels = None + mcmc_prior_frequencies = prior_frequencies + mcmc_haplotypes = haplotypes + + # must have one or more haplotypes for MCMC + invalid_scenario = len(mcmc_haplotypes) == 0 + + # handle invalid scenarios + # TODO: handle this more elegantly? + if len(mcmc_haplotypes) == 0: + # must have one or more haplotypes for MCMC + invalid_scenario = True + data.columndata[COLUMN.FILTER].append(vcf.filters.NOA.id) + elif (prior_frequencies is not None) and np.any(np.isnan(prior_frequencies)): + # nan caused by zero freq + invalid_scenario = True + data.columndata[COLUMN.FILTER].append(vcf.filters.AF0.id) + else: + invalid_scenario = False + if invalid_scenario: + for sample in data.samples: + ploidy = data.sample_ploidy[sample] + data.sampledata[FORMAT.GT][sample] = np.full(ploidy, -1, int) + data.sampledata[FORMAT.GQ][sample] = np.nan + data.sampledata[FORMAT.GPM][sample] = np.nan + data.sampledata[FORMAT.SPM][sample] = np.nan + data.sampledata[FORMAT.SQ][sample] = np.nan + data.sampledata[FORMAT.MCI][sample] = np.nan + data.sampledata[FORMAT.ACP][sample] = np.array([np.nan]) + data.sampledata[FORMAT.AFP][sample] = np.array([np.nan]) + data.sampledata[FORMAT.AOP][sample] = np.array([np.nan]) + data.sampledata[FORMAT.GP][sample] = np.array([np.nan]) + data.sampledata[FORMAT.GL][sample] = np.array([np.nan]) + data.sampledata[FORMAT.MEC][sample] = np.nan + data.sampledata[FORMAT.MECP][sample] = np.nan + return data + + # combine samples reads into a single array + n_samples = len(data.samples) + max_reads = max(len(data.read_dists[s]) for s in data.samples) + n_pos = len(data.locus.positions) + max_nucl = max([len(a) for a in data.locus.alleles] + [0]) + sample_reads = np.full((n_samples, max_reads, n_pos, max_nucl), np.nan) + sample_read_counts = np.zeros((n_samples, max_reads), np.int64) + for i, sample in enumerate(data.samples): + _reads = data.read_dists[sample] + _counts = data.read_counts[sample] + assert len(_reads) == len(_counts) + sample_reads[i, 0 : len(_reads)] = _reads + sample_read_counts[i, 0 : len(_counts)] = _counts + + # convert pedigree data to arrays, TODO: do this once when parsing arguments? + pedigree_position = {s: i for i, s in enumerate(data.samples)} + pedigree_position[None] = -1 + n_samples = len(data.samples) + sample_ploidy = np.array([data.sample_ploidy[s] for s in data.samples]) + parent_indices = np.full((n_samples, 2), -1, dtype=int) + gamete_tau = np.full((n_samples, 2), -1, dtype=int) + gamete_lambda = np.full((n_samples, 2), np.nan, dtype=float) + gamete_error = np.full((n_samples, 2), np.nan, dtype=float) + for i, s in enumerate(data.samples): + for j, p in enumerate(self.sample_parents[s]): + try: + parent_indices[i, j] = pedigree_position[p] + except KeyError as e: + raise KeyError( + "Parent identifier '{}' is not a sample identifier".format(p) + ) from e + gamete_tau[i] = self.gamete_ploidy[s] + gamete_lambda[i] = self.gamete_ibd[s] + gamete_error[i] = self.gamete_error[s] + + # pedigree based assembly + pedigree_trace = ( + PedigreeCallingMCMC( + sample_ploidy=sample_ploidy, + sample_inbreeding=np.array( + [data.sample_inbreeding[s] for s in data.samples] + ), + sample_parents=parent_indices, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + haplotypes=mcmc_haplotypes, + frequencies=mcmc_prior_frequencies, + steps=self.mcmc_steps, + annealing=self.mcmc_burn, # anneal over full burn-in period + chains=self.mcmc_chains, + random_seed=self.random_seed, + ) + .fit( + sample_reads=sample_reads, + sample_read_counts=sample_read_counts, + ) + .burn(self.mcmc_burn) + ) # burn all annealing + pedigree_posterior_error = pedigree_trace.incongruence( + sample_ploidy=sample_ploidy, + sample_parents=parent_indices, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + ) + + # iterate of samples to summarize + for i, sample in enumerate(data.samples): + # wrap in try clause to pass sample info back with any exception + try: + trace = pedigree_trace.individual(i) + if mcmc_haplotype_labels is not None: + # need to relabel alleles within subset + trace = trace.relabel(mcmc_haplotype_labels) + incongruence = trace.replicate_incongruence( + threshold=self.mcmc_incongruence_threshold + ) + posterior = trace.posterior() + alleles, genotype_prob, support_prob = posterior.mode( + genotype_support=True + ) + + # store variables + data.sampledata[FORMAT.GT][sample] = alleles + # data.sampledata["haplotypes"][sample] = haplotypes[alleles] + data.sampledata[FORMAT.GQ][sample] = qual_of_prob(genotype_prob) + data.sampledata[FORMAT.GPM][sample] = genotype_prob + data.sampledata[FORMAT.SPM][sample] = support_prob + data.sampledata[FORMAT.SQ][sample] = qual_of_prob(support_prob) + data.sampledata[FORMAT.MCI][sample] = incongruence + data.sampledata[FORMAT.PEDERR][sample] = pedigree_posterior_error[i] + _read_calls = data.read_calls[sample] + mec = np.sum(minimum_error_correction(_read_calls, haplotypes[alleles])) + mec_denom = np.sum(_read_calls >= 0) + mecp = mec / mec_denom if mec_denom > 0 else np.nan + data.sampledata[FORMAT.MEC][sample] = mec + data.sampledata[FORMAT.MECP][sample] = mecp + + # posterior allele frequencies/occurrence if requested + if self.require_AFP(): + frequencies, counts, occurrence = trace.posterior_frequencies() + data.sampledata[FORMAT.ACP][sample] = counts + data.sampledata[FORMAT.AFP][sample] = frequencies + data.sampledata[FORMAT.AOP][sample] = occurrence + + # genotype posteriors if requested + if FORMAT.GP in data.formatfields: + probabilities = posterior.as_array(len(haplotypes)) + data.sampledata[FORMAT.GP][sample] = probabilities + + # genotype likelihoods if requested + if FORMAT.GL in data.formatfields: + llks = genotype_likelihoods( + reads=data.read_dists[sample], + read_counts=data.read_counts[sample], + ploidy=data.sample_ploidy[sample], + haplotypes=haplotypes, + ) + data.sampledata[FORMAT.GL][sample] = natural_log_to_log10(llks) + + # end of try clause for specific sample + except Exception as e: + path = data.sample_bams.get(sample) + message = SAMPLE_ASSEMBLY_ERROR.format(sample=sample, bam=path) + raise SampleAssemblyError(message) from e + return data diff --git a/mchap/application/cli.py b/mchap/application/cli.py index 64df4051..0ab878db 100644 --- a/mchap/application/cli.py +++ b/mchap/application/cli.py @@ -5,15 +5,32 @@ from mchap.application import call from mchap.application import call_exact from mchap.application import find_snvs +from mchap.application import call_pedigree +from mchap.application import atomize + from mchap import __version__ def main(): parser = argparse.ArgumentParser( - "Bayesian assemby of micro-haplotypes in polyploids" + "Bayesian assembly of micro-haplotypes in polyploids" + ) + parser.add_argument( + "-v", + "--version", + action="version", + version=f"mchap {__version__}", ) - subprograms = ["assemble", "call", "call-exact", "version", "find-snvs"] + subprograms = [ + "assemble", + "call", + "call-exact", + "call-pedigree", + "find-snvs", + "atomize", + ] + parser.add_argument( "program", nargs=1, choices=subprograms, help="Specify sub-program" ) @@ -34,7 +51,10 @@ def main(): prog.cli(sys.argv).run_stdout() elif prog == "find-snvs": find_snvs.main(sys.argv) - elif prog == "version": - print(__version__) + elif prog == "call-pedigree": + prog = call_pedigree.program + prog.cli(sys.argv).run_stdout() + elif prog == "atomize": + atomize.main(sys.argv) else: assert False diff --git a/mchap/application/find_snvs.py b/mchap/application/find_snvs.py index 111bcac4..f51e0fe2 100644 --- a/mchap/application/find_snvs.py +++ b/mchap/application/find_snvs.py @@ -200,7 +200,7 @@ def _ord_to_index(a): def bases_to_indices(alleles): - alleles = np.array(alleles, copy=False, dtype="|S1") + alleles = np.asarray(alleles, dtype="|S1") alleles.dtype = np.int8 return _ord_to_index(alleles) diff --git a/mchap/assemble/classes.py b/mchap/assemble/classes.py index e2e7a63a..9d3a9c98 100644 --- a/mchap/assemble/classes.py +++ b/mchap/assemble/classes.py @@ -8,7 +8,7 @@ __all__ = [ "PosteriorGenotypeDistribution", - "PhenotypeDistribution", + "GenotypeSupportDistribution", "GenotypeMultiTrace", ] @@ -84,49 +84,48 @@ def mode(self): idx = np.argmax(self.probabilities) return self.genotypes[idx], self.probabilities[idx] - def mode_phenotype(self): - """Return genotypes congruent with the posterior mode phenotype. + def mode_genotype_support(self): + """Return genotypes congruent with the posterior mode support. Returns ------- mode_genotypes : ndarray, int, shape (n_genotypes, ploidy, n_positions) Genotypes which contain only the haplotypes found in the posterior - mode phenotype (at variable dosage levels). + mode support (at variable dosage levels). probabilities : ndarray, float, shape (n_genotypes, ) The posterior probabilities asociated with each genotype which is congruent with the posterior - mode phenotype. + mode support. Notes ----- - The term 'phenotype' is used here to describe a set of unique haplotypes + The term 'support' is used here to describe a set of unique haplotypes without dosage information. - Hence for a given phenotype and ploidy > 2 their are one or more congruent + Hence for a given support and ploidy > 2 their are one or more congruent genotypes that consist of the haplotypes of that genotype. """ labels = np.zeros(len(self.genotypes), dtype=int) - phenotype_labels = {} # string: int + support_labels = {} # string: int probs = {} # int: float - # phenotypes = {} # int: array + # support = {} # int: array for i, gen in enumerate(self.genotypes): - phenotype = mset.unique(gen) - string = phenotype.tobytes() - if string not in phenotype_labels: + support = mset.unique(gen) + string = support.tobytes() + if string not in support_labels: label = i - phenotype_labels[string] = label + support_labels[string] = label probs[label] = self.probabilities[i] - # phenotypes[label] = phenotype else: - label = phenotype_labels[string] + label = support_labels[string] probs[label] += self.probabilities[i] labels[i] = label - phenotype_labels, probs = zip(*probs.items()) - mode = phenotype_labels[np.argmax(probs)] + support_labels, probs = zip(*probs.items()) + mode = support_labels[np.argmax(probs)] idx = labels == mode - return PhenotypeDistribution(self.genotypes[idx], self.probabilities[idx]) + return GenotypeSupportDistribution(self.genotypes[idx], self.probabilities[idx]) def allele_frequencies(self, dosage=False): """Calculate posterior frequency of haplotype alleles. @@ -168,7 +167,7 @@ def allele_frequencies(self, dosage=False): @dataclass -class PhenotypeDistribution(object): +class GenotypeSupportDistribution(object): """Distribution of genotypes with identical alleles differing only by dosage. @@ -205,11 +204,11 @@ def mode_genotype(self): idx = np.argmax(self.probabilities) return self.genotypes[idx], self.probabilities[idx] - def call_phenotype(self, threshold=0.95): + def call_genotype_support(self, threshold=0.95): """Identifies the most complete set of alleles that exceeds a probability threshold. If the probability threshold cannot be exceeded the - phenotype will be returned with a probability of None + genotype support will be returned with a probability of None """ # check mode genotype if np.max(self.probabilities) >= threshold: @@ -361,7 +360,7 @@ def replicate_incongruence(self, threshold=0.6): """ out = 0 posteriors = [trace.posterior() for trace in self.split()] - chain_modes = [dist.mode_phenotype() for dist in posteriors] + chain_modes = [dist.mode_genotype_support() for dist in posteriors] alleles = [ mode.alleles() for mode in chain_modes diff --git a/mchap/assemble/structural.py b/mchap/assemble/structural.py index 1e00a36b..91a9dc82 100644 --- a/mchap/assemble/structural.py +++ b/mchap/assemble/structural.py @@ -49,7 +49,7 @@ def random_breaks(breaks, n): if breaks >= n: raise ValueError("breaks must be smaller then n") - indicies = np.ones(n + 1, np.bool8) + indicies = np.ones(n + 1, np.bool_) indicies[0] = False indicies[-1] = False @@ -383,9 +383,9 @@ def _interval_inverse_mask(interval, n): """ if interval is None: - mask = np.zeros(n, np.bool8) + mask = np.zeros(n, np.bool_) else: - mask = np.ones(n, np.bool8) + mask = np.ones(n, np.bool_) mask[interval[0] : interval[1]] = 0 return mask diff --git a/mchap/calling/classes.py b/mchap/calling/classes.py index 6d3ba94c..7ea8495c 100644 --- a/mchap/calling/classes.py +++ b/mchap/calling/classes.py @@ -1,4 +1,5 @@ import numpy as np +from numba import njit from dataclasses import dataclass from mchap.assemble.classes import Assembler from mchap.combinatorics import count_unique_genotypes @@ -82,7 +83,7 @@ def fit(self, reads, read_counts=None, initial=None): assert len(self.haplotypes) == 1 genotypes = np.zeros((self.chains, self.steps, self.ploidy), dtype=np.int8) llks = np.full((self.chains, self.steps), np.nan) - return GenotypeAllelesMultiTrace(genotypes, llks) + return GenotypeAllelesMultiTrace(genotypes, llks, len(self.haplotypes)) # set random seed once for all chains if self.random_seed is not None: @@ -124,7 +125,7 @@ def fit(self, reads, read_counts=None, initial=None): genotype_traces.append(genotypes) llk_traces.append(llks) return GenotypeAllelesMultiTrace( - np.array(genotype_traces), np.array(llk_traces) + np.array(genotype_traces), np.array(llk_traces), len(self.haplotypes) ) @@ -140,10 +141,13 @@ class GenotypeAllelesMultiTrace(object): llks : ndarray, float, shape (n_chains, n_steps) The log-likelihood calculated for the genotype at each step of the Markov chain Monte Carlo simulation. + n_allele : int + Maximum number of alleles """ genotypes: np.ndarray llks: np.ndarray + n_allele: int def relabel(self, labels): """Returns a new GenotypeTrace object with relabeled alleles. @@ -161,6 +165,7 @@ def relabel(self, labels): new = type(self)( labels[self.genotypes], self.llks, + labels.max() + 1, ) return new @@ -184,6 +189,7 @@ def burn(self, n): new = type(self)( self.genotypes[:, n:], self.llks[:, n:], + self.n_allele, ) return new @@ -218,7 +224,11 @@ def split(self): An iterable of multitraces each containing a single chain. """ for genotypes, llks in zip(self.genotypes, self.llks): - yield type(self)(genotypes[None, ...], llks[None, ...]) + yield type(self)( + genotypes[None, ...], + llks[None, ...], + self.n_allele, + ) def replicate_incongruence(self, threshold=0.6): """Identifies incongruence between replicate Markov chains. @@ -239,7 +249,9 @@ def replicate_incongruence(self, threshold=0.6): A non-replicated MCMC will always return 0. """ out = 0 - chain_modes = [chain.posterior().mode(phenotype=True) for chain in self.split()] + chain_modes = [ + chain.posterior().mode(genotype_support=True) for chain in self.split() + ] alleles = [mode[0] for mode in chain_modes if mode[-1] >= threshold] # check for more than one mode mode_count = len({array.tobytes() for array in alleles}) @@ -252,6 +264,43 @@ def replicate_incongruence(self, threshold=0.6): out = 2 return out + def posterior_frequencies(self): + """Calculate posterior frequency of haplotype alleles. + + Returns + ------- + frequencies : ndarray, float, shape (n_alleles, ) + Posterior frequencies of haplotype alleles. + counts : ndarray, float, shape (n_alleles, ) + Posterior allele counts. + occurrence : ndarray, float, shape (n_alleles, ) + Posterior probabilities of haplotype occurrence. + """ + return _posterior_frequencies(self.genotypes, self.n_allele) + + +@njit +def _posterior_frequencies(genotypes, n_allele): + n_chain, n_step, ploidy = genotypes.shape + counts = np.zeros(n_allele) + occurrence = np.zeros(n_allele) + for c in range(n_chain): + for s in range(n_step): + for i in range(ploidy): + a = genotypes[c, s, i] + counts[a] += 1 + first = True + for j in range(i): + b = genotypes[c, s, j] + if b == a: + first = False + if first: + occurrence[a] += 1 + n_obs = n_chain * n_step + counts /= n_obs + occurrence /= n_obs + return counts / ploidy, counts, occurrence + @dataclass class PosteriorGenotypeAllelesDistribution(object): @@ -270,15 +319,15 @@ class PosteriorGenotypeAllelesDistribution(object): genotypes: np.ndarray probabilities: np.ndarray - def mode(self, phenotype=False): - """Return the posterior mode genotype or allelic phenotype. + def mode(self, genotype_support=False): + """Return the posterior mode genotype or genotype support. Parameters ---------- - phenotype : bool + genotype_support : bool If true then the most probable genotype of the mode - phenotype will be returned in addition with that - genotypes probability and the mode phenotype probability. + genotype support will be returned in addition with that + genotypes probability and the mode genotype support probability. Returns ------- @@ -286,34 +335,32 @@ def mode(self, phenotype=False): The genotype with the highest posterior probability. genotype_probability : float The posterior probability of the posterior mode genotype - phenotype_probability : float + genotype_support_probability : float The posterior probability of the posterior mode genotype """ - if phenotype is False: + if genotype_support is False: idx = np.argmax(self.probabilities) return self.genotypes[idx], self.probabilities[idx] else: labels = np.zeros(len(self.genotypes), dtype=int) - phenotype_labels = {} # string: int + support_labels = {} # string: int probs = {} # int: float - # phenotypes = {} # int: array for i, gen in enumerate(self.genotypes): - phenotype = mset.unique(gen) - string = phenotype.tobytes() - if string not in phenotype_labels: + genotype_support = mset.unique(gen) + string = genotype_support.tobytes() + if string not in support_labels: label = i - phenotype_labels[string] = label + support_labels[string] = label probs[label] = self.probabilities[i] - # phenotypes[label] = phenotype else: - label = phenotype_labels[string] + label = support_labels[string] probs[label] += self.probabilities[i] labels[i] = label - phenotype_labels, probs = zip(*probs.items()) - mode = phenotype_labels[np.argmax(probs)] + support_labels, probs = zip(*probs.items()) + mode = support_labels[np.argmax(probs)] idx = labels == mode genotypes = self.genotypes[idx] probs = self.probabilities[idx] @@ -324,26 +371,3 @@ def as_array(self, n_alleles): _, ploidy = self.genotypes.shape u_genotypes = count_unique_genotypes(n_alleles, ploidy) return posterior_as_array(self.genotypes, self.probabilities, u_genotypes) - - def allele_frequencies(self): - """Calculate posterior frequency of haplotype alleles. - - Returns - ------- - alleles : ndarray, int, shape (n_alleles, n_base) - Unique haplotypes. - frequencies : ndarray, float, shape (n_alleles, ) - Posterior frequencies of haplotype alleles. - occurrence : ndarray, float, shape (n_alleles, ) - Posterior probabilities of haplotype occurrence. - """ - _, ploidy = self.genotypes.shape - n_allele = self.genotypes.max() + 1 - alleles = np.arange(n_allele) - frequencies = np.zeros(n_allele) - occurrence = np.zeros(n_allele) - for gen, prob in zip(self.genotypes, self.probabilities): - idx, count = np.unique(gen, return_counts=True) - frequencies[idx] += (count / ploidy) * prob - occurrence[idx] += prob - return alleles, frequencies, occurrence diff --git a/mchap/calling/exact.py b/mchap/calling/exact.py index 2f363998..7b8a8d08 100644 --- a/mchap/calling/exact.py +++ b/mchap/calling/exact.py @@ -59,24 +59,24 @@ def _call_posterior_mode( return mode_genotype, mode_llk, mode_ljoint, total_ljoint -def _phenotype_log_joint( +def _genotype_support_log_joint( genotype, reads, haplotypes, read_counts=None, inbreeding=0, frequencies=None ): - """Calculate phenotype posterior probability from a genotype and a set of known haplotypes.""" + """Calculate genotype support posterior probability from a genotype and a set of known haplotypes.""" ploidy = len(genotype) # unique alleles - phenotype = np.unique(genotype) - n_genotype_alleles = len(phenotype) + support = np.unique(genotype) + n_genotype_alleles = len(support) remainder = ploidy - n_genotype_alleles # possible dosage configurations - options = list(combinations_with_replacement(phenotype, remainder)) + options = list(combinations_with_replacement(support, remainder)) tmp_genotype = np.zeros(ploidy, dtype=genotype.dtype) - phenotype_ljoint = -np.inf + support_ljoint = -np.inf for opt in options: # get sorted genotype alleles - tmp_genotype[0:n_genotype_alleles] = phenotype + tmp_genotype[0:n_genotype_alleles] = support tmp_genotype[n_genotype_alleles:ploidy] = opt tmp_genotype = np.sort(tmp_genotype) # log likelihood @@ -95,9 +95,9 @@ def _phenotype_log_joint( # scaled log posterior ljoint = llk + lpr - # phenotype posterior is sum of its genotype posteriors - phenotype_ljoint = add_log_prob(phenotype_ljoint, ljoint) - return phenotype_ljoint + # support posterior is sum of its genotype posteriors + support_ljoint = add_log_prob(support_ljoint, ljoint) + return support_ljoint @njit(cache=True) @@ -153,7 +153,7 @@ def posterior_mode( read_counts=None, inbreeding=0, frequencies=None, - return_phenotype_prob=False, + return_support_prob=False, return_posterior_frequencies=False, return_posterior_occurrence=False, ): @@ -176,8 +176,8 @@ def posterior_mode( Expected inbreeding coefficient of genotype. frequencies : ndarray, float , shape (n_haplotypes, ) Optional prior frequencies for each haplotype allele. - return_phenotype_prob : bool - Return the mode phenotype probability (default = false). + return_support_prob : bool + Return the mode genotype support probability (default = false). return_posterior_frequencies : bool Return posterior mean allele frequencies (default = false). return_posterior_occurrence : bool @@ -191,8 +191,8 @@ def posterior_mode( Log likelihood of the mode genotype. mode_probability : float Posterior probability of the mode genotype. - mode_phenotype_probability : float - Sum posterior probability of all genotypes within the mode phenotype. + mode_support_probability : float + Sum posterior probability of all genotypes within the mode genotype support. mean_allele_frequencies : ndarray, float, shape (n_alleles, ) Posterior mean allele frequencies. allele_occurrence_probability : ndarray, float, shape (n_alleles, ) @@ -217,8 +217,8 @@ def posterior_mode( result = [mode_genotype, mode_llk, mode_genotype_prob] - if return_phenotype_prob: - phenotype_ljoint = _phenotype_log_joint( + if return_support_prob: + support_ljoint = _genotype_support_log_joint( genotype=mode_genotype, reads=reads, haplotypes=haplotypes, @@ -226,8 +226,8 @@ def posterior_mode( inbreeding=inbreeding, frequencies=frequencies, ) - mode_phenotype_prob = np.exp(phenotype_ljoint - total_ljoint) - result.append(mode_phenotype_prob) + mode_support_prob = np.exp(support_ljoint - total_ljoint) + result.append(mode_support_prob) if return_posterior_frequencies or return_posterior_occurrence: mean_frequencies, occurrence = _posterior_allele_frequencies( @@ -331,7 +331,7 @@ def genotype_posteriors( @njit(cache=True) -def posterior_allele_frequencies(posteriors, ploidy, n_alleles, dosage=False): +def posterior_allele_frequencies(posteriors, ploidy, n_alleles): """Calculate posterior mean allele frequencies of every allele for a given posteriors distribution. @@ -343,37 +343,35 @@ def posterior_allele_frequencies(posteriors, ploidy, n_alleles, dosage=False): Ploidy of organism. n_alleles : int Total number of possible (haplotype) alleles at this locus. - dosage : bool - If true returns the posterior mean dosage rather than allele frequencies. Returns ------- mean_allele_frequencies : ndarray, float, shape (n_alleles, ) Posterior mean allele frequencies. + posterior_allele_counts : ndarray, float, shape (n_alleles, ) + Posterior allele counts allele_occurrence_probability : ndarray, float, shape (n_alleles, ) Posterior probability of alleles occurring at any dosage. """ n_genotypes = len(posteriors) - freqs = np.zeros(n_alleles, dtype=np.float64) + counts = np.zeros(n_alleles, dtype=np.float64) occur = np.zeros(n_alleles, dtype=np.float64) genotype = np.zeros(ploidy, np.int64) for i in range(n_genotypes): p = posteriors[i] for j in range(ploidy): a = genotype[j] - freqs[a] += p + counts[a] += p if j == 0: occur[a] += p elif a != genotype[j - 1]: occur[a] += p increment_genotype(genotype) - if dosage is False: - freqs /= ploidy - return freqs, occur + return counts / ploidy, counts, occur def alternate_dosage_posteriors(genotype_alleles, probabilities): - """Extract alternate dosage probabilities based on allelic phenotype. + """Extract alternate dosage probabilities based on genotype support. Parameters ---------- @@ -384,22 +382,22 @@ def alternate_dosage_posteriors(genotype_alleles, probabilities): Returns ------- - phenotype_posteriors : ndarray, float, shape (n_alternate_dosages, ) + support_posteriors : ndarray, float, shape (n_alternate_dosages, ) Posterior probability of each alternate dosage in order. """ ploidy = len(genotype_alleles) - phenotype = np.unique(genotype_alleles) - n_alleles = len(phenotype) + support = np.unique(genotype_alleles) + n_alleles = len(support) array = np.zeros(ploidy, dtype=genotype_alleles.dtype) remainder = ploidy - n_alleles - options = list(combinations_with_replacement(phenotype, remainder)) + options = list(combinations_with_replacement(support, remainder)) n_options = len(options) probs = np.zeros(n_options, float) indices = np.zeros(n_options, int) genotypes = np.zeros((n_options, ploidy), int) for i, opt in enumerate(options): - array[0:n_alleles] = phenotype + array[0:n_alleles] = support array[n_alleles:ploidy] = opt array = np.sort(array) genotypes[i] = array.copy() diff --git a/mchap/calling/mcmc.py b/mchap/calling/mcmc.py index f2a8e2fb..0fff40da 100644 --- a/mchap/calling/mcmc.py +++ b/mchap/calling/mcmc.py @@ -233,7 +233,7 @@ def compound_step( llk_cache=None, step_type=0, ): - """MCMC sampler compound step for calling sample alleles from a set of known genotypes. + """MCMC sampler compound step for calling sample alleles from a set of known haplotypes. Parameters ---------- @@ -337,7 +337,7 @@ def mcmc_sampler( cache=False, step_type=0, ): - """MCMC simulation for calling sample alleles from a set of known genotypes. + """MCMC simulation for calling sample alleles from a set of known haplotypes. Parameters ---------- diff --git a/mchap/calling/prior.py b/mchap/calling/prior.py index fec35534..40a90a2d 100644 --- a/mchap/calling/prior.py +++ b/mchap/calling/prior.py @@ -90,8 +90,7 @@ def log_genotype_allele_prior( @numba.njit(cache=True) def log_genotype_prior(genotype, unique_haplotypes, inbreeding=0, frequencies=None): - """Prior probability of a dosage for an individual genotype - assuming all haplotypes are equally probable. + """Prior probability of an individual genotype Parameters ---------- @@ -107,7 +106,7 @@ def log_genotype_prior(genotype, unique_haplotypes, inbreeding=0, frequencies=No Returns ------- lprior : float - Log-prior probability of dosage. + Log-prior probability of genotype. """ assert 0 <= inbreeding < 1 diff --git a/mchap/encoding/character/transcode.py b/mchap/encoding/character/transcode.py index 2d4315a8..b84b1610 100644 --- a/mchap/encoding/character/transcode.py +++ b/mchap/encoding/character/transcode.py @@ -23,7 +23,7 @@ def as_allelic(array, alleles=None, dtype=np.int8): """ if not isinstance(array, np.ndarray): - array = np.array(array, copy=False) + array = np.asarray(array) if np.ndim(array) == 1: n_seq, n_pos = 1, len(array) diff --git a/mchap/encoding/integer/transcode.py b/mchap/encoding/integer/transcode.py index b6bf0188..d3b2dbdc 100644 --- a/mchap/encoding/integer/transcode.py +++ b/mchap/encoding/integer/transcode.py @@ -49,10 +49,10 @@ def as_probabilistic(array, n_alleles=4, p=1.0, error_factor=3, dtype=float): will sum to less than 1. """ # check inputs - array = np.array(array, copy=False) - n_alleles = np.array(n_alleles, copy=False) - error_factor = np.array(error_factor, copy=False) - p = np.array(p, copy=False) + array = np.asarray(array) + n_alleles = np.asarray(n_alleles) + error_factor = np.asarray(error_factor) + p = np.asarray(p) # special case for zero-length reads if array.shape[-1] == 0: @@ -138,7 +138,7 @@ def from_strings(data, gaps="-", length=None, dtype=np.int8): if isinstance(data, np.ndarray): pass else: - data = np.array(data, copy=False) + data = np.asarray(data) sequences = data.ravel() @@ -205,7 +205,7 @@ def as_strings(array, gap="-", alleles=None): """ if not isinstance(array, np.ndarray): - array = np.array(array, copy=False) + array = np.asarray(array) if array.ndim == 1: return vector_as_string(array, gap=gap, alleles=alleles) @@ -273,7 +273,7 @@ def as_characters(array, gap="-", alleles=None): """ if not isinstance(array, np.ndarray): - array = np.array(array, copy=False) + array = np.asarray(array) if array.ndim == 1: return vector_as_characters(array, gap=gap, alleles=alleles) diff --git a/mchap/io/vcf/__init__.py b/mchap/io/vcf/__init__.py index ca3830c3..b340b518 100644 --- a/mchap/io/vcf/__init__.py +++ b/mchap/io/vcf/__init__.py @@ -1,6 +1,7 @@ from mchap.io.vcf import headermeta from mchap.io.vcf import infofields from mchap.io.vcf import formatfields +from mchap.io.vcf import columns from mchap.io.vcf import filters from mchap.io.vcf import util from mchap.io.vcf.records import format_info_field, format_sample_field, format_record @@ -14,4 +15,5 @@ "format_sample_field", "format_record", "util", + "columns", ] diff --git a/mchap/io/vcf/columns.py b/mchap/io/vcf/columns.py new file mode 100644 index 00000000..2cacfa64 --- /dev/null +++ b/mchap/io/vcf/columns.py @@ -0,0 +1,10 @@ +CHROM = "CHROM" +POS = "POS" +ID = "ID" +REF = "REF" +ALT = "ALT" +QUAL = "QUAL" +FILTER = "FILTER" +INFO = "INFO" +FORMAT = "FORMAT" +COLUMNS = [CHROM, POS, ID, REF, ALT, QUAL, FILTER, INFO, FORMAT] diff --git a/mchap/io/vcf/formatfields.py b/mchap/io/vcf/formatfields.py index d757d604..f5c463e4 100644 --- a/mchap/io/vcf/formatfields.py +++ b/mchap/io/vcf/formatfields.py @@ -23,9 +23,11 @@ def __str__(self): # FORMAT fields GT = FormatField(id="GT", number=1, type="String", descr="Genotype") GQ = FormatField(id="GQ", number=1, type="Integer", descr="Genotype quality") -PHQ = FormatField(id="PHQ", number=1, type="Integer", descr="Phenotype quality") +SQ = FormatField(id="SQ", number=1, type="Integer", descr="Genotype support quality") DP = FormatField(id="DP", number=1, type="Integer", descr="Read depth") PS = FormatField(id="PS", number=1, type="Integer", descr="Phase set") +PQ = FormatField(id="PQ", number=1, type="Integer", descr="Phasing quality") +DS = FormatField(id="DS", number="A", type="Float", descr="Posterior mean dosage") FT = FormatField( id="FT", number=1, @@ -47,11 +49,14 @@ def __str__(self): GPM = FormatField( id="GPM", number=1, type="Float", descr="Genotype posterior mode probability" ) -PHPM = FormatField( - id="PHPM", number=1, type="Float", descr="Phenotype posterior mode probability" +SPM = FormatField( + id="SPM", + number=1, + type="Float", + descr="Genotype support posterior mode probability", ) DOSEXP = FormatField( - id="DOSEXP", number=".", type="Float", descr="Mode phenotype expected dosage" + id="DOSEXP", number=".", type="Float", descr="Mode genotype support expected dosage" ) MEC = FormatField(id="MEC", number=1, type="Integer", descr="Minimum error correction") MECP = FormatField( @@ -67,6 +72,7 @@ def __str__(self): GP = FormatField( id="GP", number="G", type="Float", descr="Genotype posterior probabilities" ) +ACP = FormatField(id="ACP", number="R", type="Float", descr="Posterior allele counts") AFP = FormatField( id="AFP", number="R", type="Float", descr="Posterior mean allele frequencies" ) @@ -95,17 +101,31 @@ def __str__(self): descr="Posterior probability of allele-presence from assembly MCMC", ) +SNVDP = FormatField( + id="SNVDP", + number=".", + type="Integer", + descr="Read depth at each SNV position", +) + +PEDERR = FormatField( + id="PEDERR", + number=1, + type="Float", + descr="Posterior probability of pedigree error between an individual and its specified parents", +) + HEADER_FORMAT_FIELDS = dict( GT=GT, GQ=GQ, - PHQ=PHQ, + SQ=SQ, DP=DP, PS=PS, FT=FT, RCOUNT=RCOUNT, RCALLS=RCALLS, GPM=GPM, - PHPM=PHPM, + SPM=SPM, DOSEXP=DOSEXP, MEC=MEC, MECP=MECP, @@ -117,8 +137,29 @@ def __str__(self): MCI=MCI, KMERCOV=KMERCOV, MCAP=MCAP, + PEDERR=PEDERR, ) +DEFAULT_FIELDS = [ + GT, + GQ, + SQ, + DP, + RCOUNT, + RCALLS, + MEC, + MECP, + GPM, + SPM, + MCI, +] + +OPTIONAL_FIELDS = [ACP, AFP, AOP, GP, GL, SNVDP] + +PEDIGREE_FIELDS = [PEDERR] + +ALL_FIELDS = DEFAULT_FIELDS + OPTIONAL_FIELDS + PEDIGREE_FIELDS + def haplotype_depth(variant_depths): if len(variant_depths) == 0: diff --git a/mchap/io/vcf/infofields.py b/mchap/io/vcf/infofields.py index 1c78b404..014ec5f9 100644 --- a/mchap/io/vcf/infofields.py +++ b/mchap/io/vcf/infofields.py @@ -18,6 +18,7 @@ def __str__(self): # INFO fields NS = InfoField(id="NS", number=1, type="Integer", descr="Number of samples with data") DP = InfoField(id="DP", number=1, type="Integer", descr="Combined depth across samples") +PS = InfoField(id="PS", number=1, type="Integer", descr="Phased set for all samples") AC = InfoField( id="AC", number="A", @@ -30,10 +31,23 @@ def __str__(self): type="Integer", descr="Total number of alleles in called genotypes", ) +UAN = InfoField( + id="UAN", + number=1, + type="Integer", + descr="Total number of unique alleles in called genotypes", +) +MCI = InfoField( + id="MCI", + number=1, + type="Integer", + descr="Number of samples with incongruent Markov chain replicates", +) AF = InfoField(id="AF", number="A", type="Float", descr="Allele Frequency") AFP = InfoField( id="AFP", number="R", type="Float", descr="Posterior mean allele frequencies" ) +ACP = InfoField(id="ACP", number="R", type="Float", descr="Posterior allele counts") AFPRIOR = InfoField( id="AFPRIOR", number="R", type="Float", descr="Prior allele frequencies" ) @@ -43,6 +57,12 @@ def __str__(self): type="Float", descr="Posterior probability of allele occurring across all samples", ) +AOPSUM = InfoField( + id="AOPSUM", + number="R", + type="Float", + descr="Posterior estimate of the number of samples containing an allele", +) AA = InfoField(id="AA", number=1, type="String", descr="Ancestral allele") END = InfoField(id="END", number=1, type="Integer", descr="End position on CHROM") NVAR = InfoField( @@ -81,21 +101,27 @@ def __str__(self): type="Flag", descr="Reference allele is masked", ) - -HEADER_INFO_FIELDS = dict( - NS=NS, - DP=DP, - AC=AC, - AN=AN, - AF=AF, - AFP=AFP, - AFPRIOR=AFPRIOR, - AOP=AOP, - AA=AA, - END=END, - NVAR=NVAR, - SNVPOS=SNVPOS, - AD=AD, - RCOUNT=RCOUNT, - REFMASKED=REFMASKED, +SNVDP = InfoField( + id="SNVDP", + number=".", + type="Integer", + descr="Read depth at each SNV position", ) + +DEFAULT_FIELDS = [ + AN, + UAN, + AC, + REFMASKED, + NS, + MCI, + DP, + RCOUNT, + END, + NVAR, + SNVPOS, +] + +OPTIONAL_FIELDS = [AFPRIOR, ACP, AFP, AOP, AOPSUM, SNVDP] + +ALL_FIELDS = DEFAULT_FIELDS + OPTIONAL_FIELDS diff --git a/mchap/io/vcf/records.py b/mchap/io/vcf/records.py index 34923c6c..475e4d0c 100644 --- a/mchap/io/vcf/records.py +++ b/mchap/io/vcf/records.py @@ -2,7 +2,7 @@ from mchap.io.vcf.util import vcfstr -def format_info_field(**kwargs): +def format_info_field(precision=3, **kwargs): """Format key-value pairs into a VCF info field. Parameters @@ -23,11 +23,11 @@ def format_info_field(**kwargs): if v is True: parts.append(k) else: - parts.append(template.format(k, vcfstr(v))) + parts.append(template.format(k, vcfstr(v, precision=precision))) return ";".join(parts) -def format_sample_field(**kwargs): +def format_sample_field(precision=3, **kwargs): """Format key-value pairs into a VCF format field. Parameters @@ -40,6 +40,8 @@ def format_sample_field(**kwargs): string : str VCF format and sample columns. """ + genotypes = kwargs["GT"] + kwargs["GT"] = ["/".join([str(a) if a >= 0 else "." for a in g]) for g in genotypes] fields, arrays = zip(*kwargs.items()) fields = ":".join(fields) lengths = np.array([len(a) for a in arrays]) @@ -47,22 +49,22 @@ def format_sample_field(**kwargs): assert np.all(lengths == length) sample_data = np.empty(length, dtype="O") for i in range(length): - sample_data[i] = ":".join((vcfstr(a[i]) for a in arrays)) + sample_data[i] = ":".join((vcfstr(a[i], precision=precision) for a in arrays)) sample_data = "\t".join(sample_data) return "{}\t{}".format(fields, sample_data) def format_record( - *, - chrom=None, - pos=None, - id=None, - ref=None, - alt=None, - qual=None, - filter=None, - info=None, - format=None, + chrom, + pos, + id, + ref, + alt, + qual, + filter, + info, + format, + precision=3, ): """Format a VCF record line. @@ -93,4 +95,4 @@ def format_record( VCF record line. """ fields = [chrom, pos, id, ref, alt, qual, filter, info, format] - return "\t".join(vcfstr(f) for f in fields) + return "\t".join(vcfstr(f, precision=precision) for f in fields) diff --git a/mchap/io/vcf/util.py b/mchap/io/vcf/util.py index 19fcd8f6..774af935 100644 --- a/mchap/io/vcf/util.py +++ b/mchap/io/vcf/util.py @@ -1,12 +1,13 @@ import numpy as np -def vcfstr(obj): +def vcfstr(obj, precision=3): # handle large int and float arrays if isinstance(obj, np.ndarray): if len(obj) == 0: return "." elif np.issubdtype(obj.dtype, np.floating): + obj = obj.round(precision) # trim any decimal values of 0 and replace nans with '.' string = ",".join(obj.astype("U16")).replace("nan", ".").replace(".0,", ",") if string[-2:] == ".0": @@ -31,6 +32,7 @@ def vcfstr(obj): elif isinstance(obj, float): if np.isnan(obj): return "." + obj = np.round(obj, precision) i = int(obj) if i == obj: return str(i) diff --git a/mchap/jitutils.py b/mchap/jitutils.py index 860729a1..85a33b49 100644 --- a/mchap/jitutils.py +++ b/mchap/jitutils.py @@ -193,7 +193,11 @@ def _greatest_common_denominatior(x: int, y: int) -> int: @numba.njit(cache=True) -def comb(n: int, k: int) -> int: +def _comb(n: int, k: int) -> int: + if n < 0: + raise ValueError("n must be a non-negative integer") + if k < 0: + raise ValueError("k must be a non-negative integer") if k > n: return 0 r = 1 @@ -206,12 +210,46 @@ def comb(n: int, k: int) -> int: return r +_COMB_CACHE = np.zeros((100, 12), np.int64) +for n in range(_COMB_CACHE.shape[0]): + for k in range(_COMB_CACHE.shape[1]): + _COMB_CACHE[n, k] = _comb(n, k) + + @numba.njit(cache=True) -def comb_with_replacement(n: int, k: int) -> int: +def comb(n: int, k: int) -> int: + cache_n, cache_k = _COMB_CACHE.shape + if (n < cache_n) and (k < cache_k): + return _COMB_CACHE[n, k] + else: + return _comb(n, k) + + +@numba.njit(cache=True) +def _comb_with_replacement(n: int, k: int) -> int: + if n < 0: + raise ValueError("n must be a non-negative integer") + if n == 0 and k == 0: + return 0 n = n + k - 1 return comb(n, k) +_COMB_WITH_REPLACEMENT_CACHE = np.zeros((100, 12), np.int64) +for n in range(_COMB_WITH_REPLACEMENT_CACHE.shape[0]): + for k in range(_COMB_WITH_REPLACEMENT_CACHE.shape[1]): + _COMB_WITH_REPLACEMENT_CACHE[n, k] = _comb_with_replacement(n, k) + + +@numba.njit(cache=True) +def comb_with_replacement(n: int, k: int) -> int: + cache_n, cache_k = _COMB_WITH_REPLACEMENT_CACHE.shape + if (n < cache_n) and (k < cache_k): + return _COMB_WITH_REPLACEMENT_CACHE[n, k] + else: + return _comb_with_replacement(n, k) + + @numba.njit(cache=True) def genotype_alleles_as_index(alleles): """Convert genotypes to the index of their array position diff --git a/mchap/pedigree/classes.py b/mchap/pedigree/classes.py new file mode 100644 index 00000000..4d36bb69 --- /dev/null +++ b/mchap/pedigree/classes.py @@ -0,0 +1,162 @@ +import numpy as np +from numba import njit +from dataclasses import dataclass + +from mchap.assemble.classes import Assembler +from mchap.jitutils import seed_numba +from mchap.calling.mcmc import greedy_caller +from mchap.calling.classes import GenotypeAllelesMultiTrace + +from .mcmc import mcmc_sampler +from .validation import duo_valid, trio_valid + + +@dataclass +class PedigreeCallingMCMC(Assembler): + sample_ploidy: np.ndarray + sample_inbreeding: np.ndarray + sample_parents: np.ndarray + gamete_tau: np.ndarray + gamete_lambda: np.ndarray + gamete_error: np.ndarray + haplotypes: np.ndarray + frequencies: np.ndarray = None + steps: int = 2000 + annealing: int = 1000 + chains: int = 2 + random_seed: int = None + step_type: str = "Gibbs" + swap_parental_alleles: bool = True + + def fit(self, sample_reads, sample_read_counts, initial=None): + n_samples = len(self.sample_ploidy) + max_ploidy = self.sample_ploidy.max() + + # set random seed once for all chains + if self.random_seed is not None: + np.random.seed(self.random_seed) + seed_numba(self.random_seed) + + if initial is None: + initial = np.full((n_samples, max_ploidy), -1, np.int16) + for i in range(n_samples): + genotype = greedy_caller( + haplotypes=self.haplotypes, + ploidy=self.sample_ploidy[i], + reads=sample_reads[i], + read_counts=sample_read_counts[i], + inbreeding=self.sample_inbreeding[i], + ) + initial[i][0 : self.sample_ploidy[i]] = genotype + else: + initial = np.array(initial).copy() + + # step type + if self.step_type == "Gibbs": + step_type = 0 + elif self.step_type == "Metropolis-Hastings": + step_type = 1 + else: + raise ValueError('MCMC step type must be "Gibbs" or "Metropolis-Hastings"') + + # prior for haplotype frequencies + if self.frequencies is None: + n_haplotypes = len(self.haplotypes) + log_frequencies = np.log(np.full(n_haplotypes, 1 / n_haplotypes)) + else: + log_frequencies = np.log(self.frequencies) + assert len(log_frequencies) == len(self.haplotypes) + + shape = (self.chains, self.steps, n_samples, max_ploidy) + trace = np.empty(shape=shape, dtype=np.int16) + for i in range(self.chains): + trace[i] = mcmc_sampler( + sample_genotypes=initial, + sample_ploidy=self.sample_ploidy, + sample_parents=self.sample_parents, + gamete_tau=self.gamete_tau, + gamete_lambda=self.gamete_lambda, + gamete_error=self.gamete_error, + sample_read_dists=sample_reads, + sample_read_counts=sample_read_counts, + haplotypes=self.haplotypes, + log_frequencies=log_frequencies, + n_steps=self.steps, + annealing=self.annealing, + step_type=step_type, + swap_parental_alleles=self.swap_parental_alleles, + ) + return PedigreeAllelesMultiTrace(trace, n_allele=len(self.haplotypes)) + + +@njit(cache=True) +def _trace_incongruence( + trace, sample_ploidy, sample_parents, gamete_tau, gamete_lambda +): + n_obs, n_samples, _ = trace.shape + assert sample_ploidy.shape == (n_samples,) + assert sample_parents.shape == (n_samples, 2) + assert gamete_tau.shape == (n_samples, 2) + assert gamete_lambda.shape == (n_samples, 2) + out = np.zeros(n_samples) + + for o in range(n_obs): + for i in range(n_samples): + p, q = sample_parents[i, 0], sample_parents[i, 1] + if (p < 0) and (q < 0): + valid = True + elif p < 0: + valid = duo_valid( + progeny=trace[o, i][0 : sample_ploidy[i]], + parent=trace[o, q][0 : sample_ploidy[q]], + tau=gamete_tau[i, 1], + lambda_=gamete_lambda[i, 1], + ) + elif q < 0: + valid = duo_valid( + progeny=trace[o, i][0 : sample_ploidy[i]], + parent=trace[o, p][0 : sample_ploidy[p]], + tau=gamete_tau[i, 0], + lambda_=gamete_lambda[i, 0], + ) + else: + valid = trio_valid( + progeny=trace[o, i][0 : sample_ploidy[i]], + parent_p=trace[o, p][0 : sample_ploidy[p]], + parent_q=trace[o, q][0 : sample_ploidy[q]], + tau_p=gamete_tau[i, 0], + tau_q=gamete_tau[i, 1], + lambda_p=gamete_lambda[i, 0], + lambda_q=gamete_lambda[i, 1], + ) + if not valid: + out[i] += 1 + out /= n_obs + return out + + +@dataclass +class PedigreeAllelesMultiTrace(object): + genotypes: np.ndarray + n_allele: int + + def burn(self, n): + new = type(self)(self.genotypes[:, n:], n_allele=self.n_allele) + return new + + def individual(self, index): + sample_trace = self.genotypes[:, :, index, :] + ploidy = (sample_trace[0, 0] >= 0).sum() + return GenotypeAllelesMultiTrace( + sample_trace[:, :, 0:ploidy], + np.full(self.genotypes.shape[0:2], np.nan), + n_allele=self.n_allele, + ) + + def incongruence(self, sample_ploidy, sample_parents, gamete_tau, gamete_lambda): + trace = self.genotypes + n_chains, n_steps, n_samples, max_ploidy = trace.shape + trace = trace.reshape(n_chains * n_steps, n_samples, max_ploidy) + return _trace_incongruence( + trace, sample_ploidy, sample_parents, gamete_tau, gamete_lambda + ) diff --git a/mchap/pedigree/likelihood.py b/mchap/pedigree/likelihood.py new file mode 100644 index 00000000..e89372ea --- /dev/null +++ b/mchap/pedigree/likelihood.py @@ -0,0 +1,56 @@ +from numba import njit + +from mchap.assemble.likelihood import log_likelihood +from mchap.jitutils import genotype_alleles_as_index + + +@njit(cache=True) +def log_likelihood_alleles_cached( + reads, read_counts, haplotypes, sample, genotype_alleles, cache=None +): + """ + Cached log-likelihood function for pedigree-based calling of genotypes. + + Parameters + ---------- + reads : ndarray, float, shape (n_reads, n_pos, n_nucl) + Probabilistic reads. + read_counts : ndarray, int, shape (n_reads, ) + Count of each read. + haplotypes : ndarray, int, shape (n_haplotypes, n_pos) + Integer encoded haplotypes. + sample : int + Unique index of sample. + genotype_alleles : ndarray, int, shape (ploidy, ) + Index of each haplotype in the genotype. + cache : dict + Cache of log-likeihoods whith keys of + (sample_index, genotype_index) mapped + to float. + + Returns + ------- + llk : float + Log-likelihood. + """ + genotype_index = genotype_alleles_as_index(genotype_alleles) + if cache is None: + idx = read_counts > 0 + llk = log_likelihood( + reads=reads[idx], + genotype=haplotypes[genotype_alleles], + read_counts=read_counts[idx], + ) + else: + key = (sample, genotype_index) + if key in cache: + llk = cache[key] + else: + idx = read_counts > 0 + llk = log_likelihood( + reads=reads[idx], + genotype=haplotypes[genotype_alleles], + read_counts=read_counts[idx], + ) + cache[key] = llk + return llk diff --git a/mchap/pedigree/mcmc.py b/mchap/pedigree/mcmc.py new file mode 100644 index 00000000..f07cd9f9 --- /dev/null +++ b/mchap/pedigree/mcmc.py @@ -0,0 +1,815 @@ +import numpy as np +from numba import njit + +from mchap.jitutils import random_choice, normalise_log_probs +from mchap.calling.utils import count_allele +from .likelihood import log_likelihood_alleles_cached +from .prior import ( + markov_blanket_log_probability, + markov_blanket_log_allele_probability, + generic_markov_blanket_log_probability, +) + + +@njit(cache=True) +def metropolis_hastings_probabilities( + target_index, + allele_index, + sample_genotypes, + sample_ploidy, + sample_parents, + sample_children, + gamete_tau, + gamete_lambda, + gamete_error, + sample_read_dists, # array (n_samples, n_reads, n_pos, n_nucl) + sample_read_counts, # array (n_samples, n_reads) + haplotypes, # (n_haplotypes, n_pos) + log_frequencies, # (n_haplotypes,) + llk_cache, + dosage, + dosage_p, + dosage_q, + gamete_p, + gamete_q, + constraint_p, + constraint_q, + dosage_log_frequencies, +): + n_alleles = len(haplotypes) + ploidy = sample_ploidy[target_index] + current_allele = sample_genotypes[target_index, allele_index] + allele_copies = count_allele(sample_genotypes[target_index], current_allele) + reads = sample_read_dists[target_index] + read_counts = sample_read_counts[target_index] + idx = read_counts > 0 + reads = reads[idx] + read_counts = read_counts[idx] + + # current likelihood and prior + llk = log_likelihood_alleles_cached( + reads=reads, + read_counts=read_counts, + haplotypes=haplotypes, + sample=target_index, + genotype_alleles=np.sort(sample_genotypes[target_index, 0:ploidy]), + cache=llk_cache, + ) + lprior = markov_blanket_log_probability( + target_index=target_index, + sample_genotypes=sample_genotypes, + sample_ploidy=sample_ploidy, + sample_parents=sample_parents, + sample_children=sample_children, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + log_frequencies=log_frequencies, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + + # store MH acceptance probability for each allele + log_accept = np.empty(n_alleles) + + for i in range(n_alleles): + if i == current_allele: + + # store current likelihood + log_accept[i] = -np.inf # log(0) + else: + sample_genotypes[target_index, allele_index] = i + + # calculate log likelihood ratio: ln(P(G'|R)/P(G|R)) + llk_i = log_likelihood_alleles_cached( + reads=reads, + read_counts=read_counts, + haplotypes=haplotypes, + sample=target_index, + genotype_alleles=np.sort(sample_genotypes[target_index, 0:ploidy]), + cache=llk_cache, + ) + llk_ratio = llk_i - llk + + # calculate ratio of priors: ln(P(G')/P(G)) + lprior_i = markov_blanket_log_probability( + target_index=target_index, + sample_genotypes=sample_genotypes, + sample_ploidy=sample_ploidy, + sample_parents=sample_parents, + sample_children=sample_children, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + log_frequencies=log_frequencies, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + lprior_ratio = lprior_i - lprior + + # calculate proposal ratio = g(G|G') / g(G'|G) + allele_copies_i = count_allele(sample_genotypes[target_index], i) + lproposal_ratio = np.log(allele_copies_i / allele_copies) + + # calculate Metropolis-Hastings acceptance probability + # ln(min(1, (P(G'|R)P(G')g(G|G')) / (P(G|R)P(G)g(G'|G))) + log_accept[i] = np.minimum( + 0.0, llk_ratio + lprior_ratio + lproposal_ratio + ) # max prob of log(1) + + # adjust acceptance probabilities by proposal probabilities + log_accept -= np.log(n_alleles - 1) + + # convert to probability of proposal * probability of acceptance + # then fill in probability that no step is made (i.e. choose the initial state) + probabilities = np.exp(log_accept) + probabilities[current_allele] = 1 - probabilities.sum() + + # reset current allele + sample_genotypes[target_index, allele_index] = current_allele + + return probabilities + + +@njit(cache=True) +def gibbs_probabilities( + target_index, + allele_index, + sample_genotypes, + sample_ploidy, + sample_parents, + sample_children, + gamete_tau, + gamete_lambda, + gamete_error, + sample_read_dists, # array (n_samples, n_reads, n_pos, n_nucl) + sample_read_counts, # array (n_samples, n_reads) + haplotypes, # (n_haplotypes, n_pos) + log_frequencies, # (n_haplotypes,) + llk_cache, + dosage, + dosage_p, + dosage_q, + gamete_p, + gamete_q, + constraint_p, + constraint_q, + dosage_log_frequencies, +): + n_alleles = len(haplotypes) + ploidy = sample_ploidy[target_index] + current_allele = sample_genotypes[target_index, allele_index] + reads = sample_read_dists[target_index] + read_counts = sample_read_counts[target_index] + idx = read_counts > 0 + reads = reads[idx] + read_counts = read_counts[idx] + + # store gibbs probability for each allele + log_probabilities = np.empty(n_alleles) + + for i in range(n_alleles): + sample_genotypes[target_index, allele_index] = i + + # calculate log likelihood ratio: ln(P(G'|R)/P(G|R)) + llk_i = log_likelihood_alleles_cached( + reads=reads, + read_counts=read_counts, + haplotypes=haplotypes, + sample=target_index, + genotype_alleles=np.sort(sample_genotypes[target_index, 0:ploidy]), + cache=llk_cache, + ) + + # calculate ratio of priors: ln(P(G')/P(G)) + lprior_i = markov_blanket_log_allele_probability( + target_index=target_index, + allele_index=allele_index, + sample_genotypes=sample_genotypes, + sample_ploidy=sample_ploidy, + sample_parents=sample_parents, + sample_children=sample_children, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + log_frequencies=log_frequencies, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + log_probabilities[i] = llk_i + lprior_i + + probabilities = normalise_log_probs(log_probabilities) + # reset current allele + sample_genotypes[target_index, allele_index] = current_allele + return probabilities + + +@njit(cache=True) +def allele_step( + target_index, + allele_index, + sample_genotypes, + sample_ploidy, + sample_parents, + sample_children, + gamete_tau, + gamete_lambda, + gamete_error, + sample_read_dists, # array (n_samples, n_reads, n_pos, n_nucl) + sample_read_counts, # array (n_samples, n_reads) + haplotypes, # (n_haplotypes, n_pos) + log_frequencies, + llk_cache, + step_type, # 0=Gibbs, 1=MH + dosage, + dosage_p, + dosage_q, + gamete_p, + gamete_q, + constraint_p, + constraint_q, + dosage_log_frequencies, +): + if step_type == 0: + probabilities = gibbs_probabilities( + target_index=target_index, + allele_index=allele_index, + sample_genotypes=sample_genotypes, + sample_ploidy=sample_ploidy, + sample_parents=sample_parents, + sample_children=sample_children, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + sample_read_dists=sample_read_dists, + sample_read_counts=sample_read_counts, + haplotypes=haplotypes, + log_frequencies=log_frequencies, + llk_cache=llk_cache, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + elif step_type == 1: + probabilities = metropolis_hastings_probabilities( + target_index=target_index, + allele_index=allele_index, + sample_genotypes=sample_genotypes, + sample_ploidy=sample_ploidy, + sample_parents=sample_parents, + sample_children=sample_children, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + sample_read_dists=sample_read_dists, + sample_read_counts=sample_read_counts, + haplotypes=haplotypes, + log_frequencies=log_frequencies, + llk_cache=llk_cache, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + else: + raise ValueError + # random choice of new state using probabilities + choice = random_choice(probabilities) + sample_genotypes[target_index, allele_index] = choice + + +@njit(cache=True) +def sample_step( + target_index, + sample_genotypes, + sample_ploidy, + sample_parents, + sample_children, + gamete_tau, + gamete_lambda, + gamete_error, + sample_read_dists, + sample_read_counts, + haplotypes, + log_frequencies, + llk_cache, + step_type, + dosage, + dosage_p, + dosage_q, + gamete_p, + gamete_q, + constraint_p, + constraint_q, + dosage_log_frequencies, +): + allele_indices = np.arange(sample_ploidy[target_index]) + np.random.shuffle(allele_indices) + for i in range(len(allele_indices)): + allele_step( + target_index=target_index, + allele_index=allele_indices[i], + sample_genotypes=sample_genotypes, + sample_ploidy=sample_ploidy, + sample_parents=sample_parents, + sample_children=sample_children, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + sample_read_dists=sample_read_dists, + sample_read_counts=sample_read_counts, + haplotypes=haplotypes, + log_frequencies=log_frequencies, + llk_cache=llk_cache, + step_type=step_type, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + + +@njit(cache=True) +def compound_step( + sample_genotypes, + sample_ploidy, + sample_parents, + sample_children, + gamete_tau, + gamete_lambda, + gamete_error, + sample_read_dists, + sample_read_counts, + haplotypes, + log_frequencies, + llk_cache, + step_type, + dosage, + dosage_p, + dosage_q, + gamete_p, + gamete_q, + constraint_p, + constraint_q, + dosage_log_frequencies, +): + target_indices = np.arange(len(sample_genotypes)) + np.random.shuffle(target_indices) + for i in range(len(target_indices)): + sample_step( + target_index=target_indices[i], + sample_genotypes=sample_genotypes, + sample_ploidy=sample_ploidy, + sample_parents=sample_parents, + sample_children=sample_children, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + sample_read_dists=sample_read_dists, + sample_read_counts=sample_read_counts, + haplotypes=haplotypes, + log_frequencies=log_frequencies, + llk_cache=llk_cache, + step_type=step_type, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + + +@njit(cache=True) +def sample_children_matrix(sample_parents): + """Identify the children of each sample + + Parameters + ---------- + sample_parents : ndarray, int, shape (n_samples, 2) + Integer indices of parents with -1 indicating unknown. + + Returns + ------- + sample_children : ndarray, int, shape (n_samples, max_children) + Integer indices of children padded by -1. + """ + n_samples, n_parents = sample_parents.shape + assert n_parents == 2 + next_child_index = np.zeros(n_samples, dtype=np.int64) + # first loop through is to count the number of children + # this is 2x iteration but avoids the creation of an n*n matrix + for i in range(n_samples): + for j in range(n_parents): + p = sample_parents[i, j] + assert p != i # can't be your own parent! + if p >= 0: + if j == 1: + # check for selfing + if p == sample_parents[i, 0]: + break + next_child_index[p] += 1 + max_children = next_child_index.max() + sample_children = np.full((n_samples, max_children), -1, dtype=np.int64) + next_child_index[:] = 0 + for i in range(n_samples): + for j in range(n_parents): + p = sample_parents[i, j] + if p >= 0: + if j == 1: + # check for selfing + if p == sample_parents[i, 0]: + break + sample_children[p, next_child_index[p]] = i + next_child_index[p] += 1 + return sample_children + + +@njit(cache=True) +def parental_pair_markov_blankets(sample_parents, sample_children): + n_samples = len(sample_parents) + _, max_children = sample_children.shape + max_blanket_size = 0 + n_pairs = 0 + pairs = {} + for i in range(n_samples): + p, q = sample_parents[i, 0], sample_parents[i, 1] + # ensure ordering + if p > q: + p, q = q, p + if p < 0 or q < 0: + pass + elif (p, q) in pairs: + pass + else: + # new pair + in_blanket = np.zeros(n_samples, dtype=np.bool_) + in_blanket[p] = True + in_blanket[q] = True + for j in range(max_children): + c = sample_children[p, j] + if c >= 0: + in_blanket[c] = True + c = sample_children[q, j] + if c >= 0: + in_blanket[c] = True + blanket = np.where(in_blanket)[0] + max_blanket_size = max(max_blanket_size, len(blanket)) + pairs[(p, q)] = blanket + n_pairs += 1 + parental_pairs = np.zeros((n_pairs, 2), dtype=np.int64) + parental_pair_blankets = np.full((n_pairs, max_blanket_size), -1, dtype=np.int64) + i = 0 + for (p, q), blanket in pairs.items(): + parental_pairs[i, 0] = p + parental_pairs[i, 1] = q + parental_pair_blankets[i, 0 : len(blanket)] = blanket + i += 1 + return parental_pairs, parental_pair_blankets + + +@njit +def pair_allele_swap_step( + p, + q, + markov_blanket, + sample_genotypes, + sample_ploidy, + sample_parents, + gamete_tau, + gamete_lambda, + gamete_error, + sample_read_dists, # array (n_samples, n_reads, n_pos, n_nucl) + sample_read_counts, # array (n_samples, n_reads) + haplotypes, # (n_haplotypes, n_pos) + log_frequencies, # (n_haplotypes,) + llk_cache, + dosage, + dosage_p, + dosage_q, + gamete_p, + gamete_q, + constraint_p, + constraint_q, + dosage_log_frequencies, +): + ploidy_p = sample_ploidy[p] + ploidy_q = sample_ploidy[q] + index_p = np.random.randint(ploidy_p) + index_q = np.random.randint(ploidy_q) + allele_p = sample_genotypes[p, index_p] + allele_q = sample_genotypes[q, index_q] + assert allele_p >= 0 + assert allele_q >= 0 + idx = sample_read_counts[p] > 0 + read_dists_p = sample_read_dists[p][idx] + read_counts_p = sample_read_counts[p][idx] + read_dists_q = sample_read_dists[q][idx] + read_counts_q = sample_read_counts[q][idx] + + # check if a new state is proposed + if allele_p == allele_q: + # return that no decision to make for testing etc + return np.nan, False + + # calculate proposal ratio = g(G|G') / g(G'|G) + proposal = count_allele(sample_genotypes[p], allele_p) * count_allele( + sample_genotypes[q], allele_q + ) + reversal = (1 + count_allele(sample_genotypes[p], allele_q)) * ( + 1 + count_allele(sample_genotypes[q], allele_p) + ) + lproposal_ratio = np.log( + reversal / proposal + ) # denominator is identical in both cases + + # current likelihood + llk_current = 0.0 + llk_current += log_likelihood_alleles_cached( + reads=read_dists_p, + read_counts=read_counts_p, + haplotypes=haplotypes, + sample=p, + genotype_alleles=np.sort(sample_genotypes[p, 0:ploidy_p]), + cache=llk_cache, + ) + llk_current += log_likelihood_alleles_cached( + reads=read_dists_q, + read_counts=read_counts_q, + haplotypes=haplotypes, + sample=q, + genotype_alleles=np.sort(sample_genotypes[q, 0:ploidy_q]), + cache=llk_cache, + ) + + # current prior + lprior_current = generic_markov_blanket_log_probability( + markov_blanket, + sample_genotypes, + sample_ploidy, + sample_parents, + gamete_tau, + gamete_lambda, + gamete_error, + log_frequencies, + dosage, + dosage_p, + dosage_q, + gamete_p, + gamete_q, + constraint_p, + constraint_q, + dosage_log_frequencies, + ) + + # swap alleles + sample_genotypes[p, index_p] = allele_q + sample_genotypes[q, index_q] = allele_p + + # proposal likelihood + llk_proposal = 0.0 + llk_proposal += log_likelihood_alleles_cached( + reads=read_dists_p, + read_counts=read_counts_p, + haplotypes=haplotypes, + sample=p, + genotype_alleles=np.sort(sample_genotypes[p, 0:ploidy_p]), + cache=llk_cache, + ) + llk_proposal += log_likelihood_alleles_cached( + reads=read_dists_q, + read_counts=read_counts_q, + haplotypes=haplotypes, + sample=q, + genotype_alleles=np.sort(sample_genotypes[q, 0:ploidy_q]), + cache=llk_cache, + ) + + # proposal prior + lprior_proposal = generic_markov_blanket_log_probability( + markov_blanket, + sample_genotypes, + sample_ploidy, + sample_parents, + gamete_tau, + gamete_lambda, + gamete_error, + log_frequencies, + dosage, + dosage_p, + dosage_q, + gamete_p, + gamete_q, + constraint_p, + constraint_q, + dosage_log_frequencies, + ) + + # calculate Metropolis-Hastings acceptance probability + # ln(min(1, (P(G'|R)P(G')g(G|G')) / (P(G|R)P(G)g(G'|G))) + llk_ratio = llk_proposal - llk_current + lprior_ratio = lprior_proposal - lprior_current + log_accept = np.minimum(0.0, llk_ratio + lprior_ratio + lproposal_ratio) + prob_accept = np.exp(log_accept) + + # make decision + accept = np.random.rand() < prob_accept + if not accept: + # put things back where you found them! + sample_genotypes[p, index_p] = allele_p + sample_genotypes[q, index_q] = allele_q + + # return the decision made for testing etc + return prob_accept, accept + + +@njit(cache=True) +def mcmc_sampler( + sample_genotypes, + sample_ploidy, + sample_parents, + gamete_tau, + gamete_lambda, + gamete_error, + sample_read_dists, + sample_read_counts, + haplotypes, + log_frequencies, + n_steps=2000, + annealing=1000, + step_type=0, + swap_parental_alleles=True, +): + """MCMC simulation for calling alleles in pedigreed genotypes from a set of known haplotypes. + + Parameters + ---------- + sample_genotypes : ndarray, int, shape (n_samples, ploidy) + Index of each haplotype in each genotype for each sample. + sample_ploidy : ndarray, int, shape (n_samples,) + Ploidy of each samples + sample_parents : ndarray, int, shape (n_samples, 2) + Indices of the parents of each sample with negative values + indicating unknown parents. + gamete_tau : ndarray, int, shape (n_samples, 2) + Number of chromosomal copies contributed by each parent. + gamete_lambda : ndarray, float, shape (n_samples, 2) + Excess IBD caused by miotic processes. + gamete_error : ndarray, float, shape (n_samples, 2) + Error term associated with each gamete. + sample_read_dists : ndarray, float, shape (n_samples, n_reads, n_pos, n_nucl) + Probabilistically encoded reads for each samples. + sample_read_counts : ndarray, int, shape (n_samples, n_reads) + Number of observations of each read for each samples. + haplotypes : ndarray, int, shape (n_haplotypes, n_pos) + Integer encoded haplotypes. + log_frequencies : ndarray, float, shape (n_haplotypes,) + Log of prior frequencies for haplotypes. + n_steps : int + Number of (compound) steps to simulate. + annealing : int + Number of initial steps in which to perform simulated annealing. + step_type : int + Step type with 0 for a Gibbs-step and 1 for a + Metropolis-Hastings step. + swap_parental_alleles : bool + If True (the default), then an allele swap step will be performed + between each parental pairing. + + Notes + ----- + The gamete_lambda variable only supports non-zero values when + gametic ploidy (tau) is 2. + + Returns + ------- + genotype_alleles_trace : ndarray, int, shape (n_samples, n_steps, ploidy) + Genotype alleles trace for each sample. + """ + # copy genotypes + sample_genotypes = sample_genotypes.copy() + + # identify sample children + sample_children = sample_children_matrix(sample_parents) + + # identify parental pairs and their Markov blankets + parental_pairs, parental_pair_blankets = parental_pair_markov_blankets( + sample_parents, sample_children + ) + n_pairs = len(parental_pairs) + + # set up caches + llk_cache = {} + llk_cache[(-1, -1)] = np.nan + + # sample error weighting for annealing burin in + error_weight = np.ones(n_steps, np.float64) + if annealing: + error_weight[0:annealing] = np.linspace(0.0, 1.0, annealing) + + # scratch arrays + n_samples, max_ploidy = sample_genotypes.shape + dosage = np.zeros(max_ploidy, dtype=np.int64) + dosage_p = np.zeros(max_ploidy, dtype=np.int64) + dosage_q = np.zeros(max_ploidy, dtype=np.int64) + gamete_p = np.zeros(max_ploidy, dtype=np.int64) + gamete_q = np.zeros(max_ploidy, dtype=np.int64) + constraint_p = np.zeros(max_ploidy, dtype=np.int64) + constraint_q = np.zeros(max_ploidy, dtype=np.int64) + dosage_log_frequencies = np.zeros(max_ploidy, dtype=np.float64) + + # MCMC iterations + trace = np.empty((n_steps, n_samples, max_ploidy), dtype=sample_genotypes.dtype) + for i in range(n_steps): + compound_step( + sample_genotypes=sample_genotypes, + sample_ploidy=sample_ploidy, + sample_parents=sample_parents, + sample_children=sample_children, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + sample_read_dists=sample_read_dists, + sample_read_counts=sample_read_counts, + haplotypes=haplotypes, + log_frequencies=log_frequencies, + llk_cache=llk_cache, + step_type=step_type, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + if swap_parental_alleles: + for j in range(n_pairs): + pair_allele_swap_step( + p=parental_pairs[j, 0], + q=parental_pairs[j, 1], + markov_blanket=parental_pair_blankets[j], + sample_genotypes=sample_genotypes, + sample_ploidy=sample_ploidy, + sample_parents=sample_parents, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + sample_read_dists=sample_read_dists, + sample_read_counts=sample_read_counts, + haplotypes=haplotypes, + log_frequencies=log_frequencies, + llk_cache=llk_cache, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + trace[i] = sample_genotypes.copy() + + # sort trace allowing for mixed ploidy + for j in range(n_samples): + ploidy = sample_ploidy[j] + for i in range(n_steps): + trace[i, j] = np.sort(trace[i, j]) + if ploidy < max_ploidy: + trace[i, j] = np.roll(trace[i, j], ploidy - max_ploidy) + return trace diff --git a/mchap/pedigree/prior.py b/mchap/pedigree/prior.py new file mode 100644 index 00000000..a5b7e8d7 --- /dev/null +++ b/mchap/pedigree/prior.py @@ -0,0 +1,1454 @@ +import numpy as np +from numba import njit + +from mchap.jitutils import comb, add_log_prob, ln_equivalent_permutations + + +@njit(cache=True) +def set_allelic_dosage(genotype_alleles, out): + """Return the dosage of genotype alleles encoded as integers. + + Parameters + ---------- + genotype_alleles : ndarray, int, shape (ploidy, ) + Genotype alleles encoded as integers. + out : ndarray, int, shape (ploidy, ) + Array to collect dosage. + + Warnings + -------- + Mutates the ``out`` array in place. + """ + max_ploidy = len(genotype_alleles) + out[:] = 0 + for i in range(max_ploidy): + a = genotype_alleles[i] + if a < 0: + continue + searching = True + j = 0 + while searching: + if a == genotype_alleles[j]: + out[j] += 1 + searching = False + else: + j += 1 + + +@njit(cache=True) +def set_parental_copies(parent_alleles, progeny_alleles, out): + """Count the number of parental copies of each allele present + with a progeny genotype. + + Parameters + ---------- + parent_alleles : ndarray, int, shape (ploidy,) + Alleles observed within parent. + progeny_alleles : ndarray, int, shape (ploidy,) + Alleles observed within progeny. + out : ndarray, int, shape (ploidy,) + Array to collect counts + + Notes + ----- + Counts correspond to the first instance of each progeny + allele and subsequent copies of that allele will + correspond to a count of zero. + + Warnings + -------- + Mutates the ``out`` array in place. + """ + out[:] = 0 + for i in range(len(parent_alleles)): + a = parent_alleles[i] + if a < 0: + continue + for j in range(len(progeny_alleles)): + if a == progeny_alleles[j]: + out[j] += 1 + break + + +@njit(cache=True) +def set_complimentary_gamete(dosage, gamete, out): + """Set the complimentary gamete to complete the dosage. + + Parameters + ---------- + dosage : ndarray, int, shape (ploidy,) + Dosage array of genotype. + gamete : ndarray, int, shape (ploidy,) + Dosage array of first gamete. + out : ndarray, int, shape (ploidy,) + Array used to collect dosage of complimentary gamete. + + Warnings + -------- + Mutates the ``out`` array in place. + """ + for i in range(len(dosage)): + out[i] = dosage[i] - gamete[i] + + +@njit(cache=True) +def set_dosage_frequencies(genotype, frequencies, out): + """Store allele frequencies in the same order as alleles in a dosage array. + + Parameters + ---------- + genotype : ndarray, int, shape (ploidy,) + Genotype allele indices padded by negative numbers. + frequencies : ndarray, float, shape (alleles,) + Allele (log) frequencies. + out : ndarray, int, shape (ploidy,) + Array used to collect frequencies corresponding to gamete. + + Warnings + -------- + Mutates the ``out`` array in place. + """ + max_ploidy = len(genotype) + for i in range(max_ploidy): + a = genotype[i] + if a >= 0: + assert a < len(frequencies) + out[i] = frequencies[a] + else: + out[i] = np.nan + + +@njit(cache=True) +def log_unknown_dosage_prior(dosage, log_frequencies): + """Prior for dosage array of unknown origin assuming a multinomial distribution. + + Parameters + ---------- + dosage : ndarray, int, shape (ploidy,) + Dosage array. + log_frequencies : ndarray, float, shape (ploidy,) + Prior frequencies corresponding to dosage. + + Returns + ------- + log_prior : float + Log-transformed prior probability. + """ + lperms = ln_equivalent_permutations(dosage) + assert len(dosage) == len(log_frequencies) + lperm_prob = 0.0 + for i in range(len(dosage)): + d = dosage[i] + if d > 0: + lperm_prob += log_frequencies[i] * d + return lperms + lperm_prob + + +@njit(cache=True) +def log_unknown_const_prior(dosage, allele_index, log_frequencies): + """Prior for the alleles held a s constant in a dosage array of + unknown origin assuming a multinomial distribution. + + Parameters + ---------- + dosage : ndarray, int, shape (ploidy,) + Dosage array. + allele_index : int + Integer idex specify the allele not held as constant in the dosage array. + log_frequencies : ndarray, float, shape (ploidy,) + Prior frequencies corresponding to dosage. + + Returns + ------- + log_prior : float + Log-transformed prior probability. + """ + if dosage[allele_index] > 0: + dosage[allele_index] -= 1 + lprob = log_unknown_dosage_prior(dosage, log_frequencies) + dosage[allele_index] += 1 + else: + lprob = -np.inf + return lprob + + +@njit(cache=True) +def dosage_permutations(gamete_dosage, parent_dosage): + """Count the number of possible permutations in which + the observed gamete dosage can be drawn from a parent dosage + without replacement. + + Parameters + ---------- + gamete_dosage : ndarray, int, shape (ploidy,) + Counts of each unique allele in a gamete. + parent_dosage : ndarray, int, shape (ploidy,) + Counts of each gamete allele in a parent. + + Returns + ------- + n : int + Number of permutations. + + Notes + ----- + This function can be used to determine the number of + possible permutations in which a gametes observed + dosage can be drawn from the parental (constraint) dosage. + """ + n = 1 + for i in range(len(gamete_dosage)): + n *= comb(parent_dosage[i], gamete_dosage[i]) + return n + + +@njit(cache=True) +def set_initial_dosage(ploidy, constraint, out): + """Calculate the initial dosage that fits within a constraint. + + Parameters + ---------- + ploidy : int + Number of alleles in dosage array. + constraint : ndarray, int, shape (ploidy,) + Max count of each allele. + out : ndarray, int, shape (ploidy,) + Array to collect dosage. + + Warnings + -------- + Mutates the ``out`` array in place. + """ + for i in range(len(out)): + count = min(ploidy, constraint[i]) + out[i] = count + ploidy -= count + if ploidy > 0: + raise ValueError("Ploidy does not fit within constraint") + + +@njit(cache=True) +def increment_dosage(dosage, constraint): + """Increment a given dosage to the next possible dosage + within a given constraint. + + Parameters + ---------- + dosage : ndarray, int, shape (ploidy,) + Counts of each unique allele in a genotype. + constraint : ndarray, int, shape (ploidy,) + Max count of each allele. + + Raises + ------ + ValueError + If there are no further dosage options. + + Warnings + -------- + The ``dosage`` array is incremented in place. + """ + max_ploidy = len(dosage) + i = max_ploidy - 1 + change = 0 + # find last non-zero value + while dosage[i] == 0: + i -= 1 + # lower that value + dosage[i] -= 1 + change += 1 + # raise first available value to its right + j = i + 1 + while (j < max_ploidy) and (change > 0): + if dosage[j] < constraint[j]: + dosage[j] += 1 + change -= 1 + j += 1 + # if no value was available to the right + if change > 0: + # zero out last value + change += dosage[i] + dosage[i] = 0 + space = constraint[i] + # find next positive value to its left with enough space remaining + searching = True + while searching: + i -= 1 + if i < 0: + raise ValueError("Final dosage") + if (dosage[i] > 0) and (space > change): + dosage[i] -= 1 + change += 1 + searching = False + else: + space += constraint[i] + change += dosage[i] + dosage[i] = 0 + # fill to the right + j = i + 1 + while change > 0: + value = min(constraint[j] - dosage[j], change) + dosage[j] += value + change -= value + j += 1 + return + + +@njit(cache=True) +def double_reduction_permutations(gamete_dosage, parent_dosage): + """Count the number of possible permutations in which the + observed gamete dosage can be drawn from a parent dosage + assuming double reduction. + + Parameters + ---------- + gamete_dosage : ndarray, int, shape (ploidy,) + Counts of each unique allele in a gamete. + parent_dosage : ndarray, int, shape (ploidy,) + Counts of each gamete allele in a parent. + + Returns + ------- + n : int + Number of permutations. + + Warnings + -------- + This function is only valid for diploid gametes! + """ + n = 0 + for i in range(len(gamete_dosage)): + if gamete_dosage[i] == 2: + assert n == 0 + n = parent_dosage[i] + elif gamete_dosage[i] != 0: + return 0 + return n + + +@njit(cache=True) +def gamete_log_pmf( + gamete_dose, + gamete_ploidy, + parent_dose, + parent_ploidy, + gamete_lambda=0.0, +): + """Log probability of a gamete drawn from a known genotype. + + Parameters + ---------- + gamete_dose : ndarray, int + Counts of each unique allele in the gamete. + gamete_ploidy : int + Ploidy (tau) of the gamete. + parent_dose : ndarray, int + Counts of each unique gamete allele within the parent genotype. + parent_ploidy : int + Ploidy of the parent. + gamete_lambda : float + Excess IBD probability of gamete. + + Returns + ------- + Log-transformed probability of gamete being derived from parental genotype. + + Notes + ----- + A non-zero lambda value is only supported for diploid gametes. + """ + prob = ( + dosage_permutations(gamete_dose, parent_dose) + / comb(parent_ploidy, gamete_ploidy) + ) * (1 - gamete_lambda) + if gamete_lambda > 0.0: + if gamete_ploidy != 2: + raise ValueError("Lambda parameter is only supported for diploid gametes") + prob += ( + double_reduction_permutations(gamete_dose, parent_dose) / parent_ploidy + ) * gamete_lambda + if prob == 0.0: + return -np.inf + else: + return np.log(prob) + + +@njit(cache=True) +def gamete_const_log_pmf( + allele_index, + gamete_dose, + gamete_ploidy, + parent_dose, + parent_ploidy, +): + """Log probability of a the alleles held as constant in a gamete of known origin. + + Parameters + ---------- + allele_index : int + Integer idex specify the allele not held as constant in the dosage array. + gamete_dose : ndarray, int + Counts of each unique allele in the gamete. + gamete_ploidy : int + Ploidy (tau) of the gamete. + parent_dose : ndarray, int + Counts of each unique gamete allele within the parent genotype. + parent_ploidy : int + Ploidy of the parent. + + Returns + ------- + Log-transformed probability of gamete being derived from parental genotype. + + Notes + ----- + This function does not support the lambda parameter as a non-zero lambda + value is only supported for diploid gametes. In the case of a diploid + gamete the ploidy of the constant portion is 1 so lambda has no effect. + """ + if gamete_dose[allele_index] < 1: + # ensure prob is zero in invalid cases + return -np.inf + gamete_dose[allele_index] -= 1 + lprob = gamete_log_pmf( + gamete_dose=gamete_dose, + gamete_ploidy=gamete_ploidy - 1, + parent_dose=parent_dose, + parent_ploidy=parent_ploidy, + ) + gamete_dose[allele_index] += 1 + return lprob + + +@njit(cache=True) +def gamete_allele_log_pmf( + gamete_count, + gamete_ploidy, + parent_count, + parent_ploidy, + gamete_lambda=0.0, +): + """Log probability of allele within a gamete drawn from a known genotype. + + Parameters + ---------- + gamete_count : int + Counts of allele in the gamete. + gamete_ploidy : int + Ploidy (tau) of the gamete. + parent_count : int + Counts of allele within the parent genotype. + parent_ploidy : int + Ploidy of the parent. + gamete_lambda : float + Excess IBD probability of gamete. + + Returns + ------- + Log-transformed probability of allele within gamete being derived from parental genotype. + + Notes + ----- + This function assumes that other alleles of gamete represent a valid partial + gamete given the parental genotype. + + A non-zero lambda value is only supported for diploid gametes. + """ + assert gamete_count <= gamete_ploidy + assert parent_count <= parent_ploidy + if gamete_count < 1: + # ensure prob of zero in invalid cases + return -np.inf + if parent_count == 0: + return -np.inf + const_count = gamete_count - 1 + const_ploidy = gamete_ploidy - 1 + # probability given no dr + available_count = parent_count - const_count + available_total = parent_ploidy - const_ploidy + prob = (available_count / available_total) * (1 - gamete_lambda) + # probability given dr only supports diploid gametes + if gamete_lambda > 0.0: + if gamete_ploidy != 2: + raise ValueError("Lambda parameter is only supported for diploid gametes") + # gamete must have 2+ copies of this allele + if const_count >= 1: + # probability of dr resulting in this specific allelic copy + prob += (const_count / const_ploidy) * gamete_lambda + if prob == 0.0: + return -np.inf + else: + return np.log(prob) + + +@njit(cache=True) +def trio_log_pmf( + progeny, + parent_p, + parent_q, + ploidy_p, + ploidy_q, + tau_p, + tau_q, + lambda_p, + lambda_q, + error_p, + error_q, + log_frequencies, + dosage, + dosage_p, + dosage_q, + gamete_p, + gamete_q, + constraint_p, + constraint_q, + dosage_log_frequencies, +): + """Log probability of a trio of genotypes. + + Parameters + ---------- + progeny : ndarray, int, shape (ploidy,) + Integer encoded alleles in the progeny genotype. + parent_p : ndarray, int, shape (ploidy,) + Integer encoded alleles in the first parental genotype. + parent_q : ndarray, int, shape (ploidy,) + Integer encoded alleles in the second parental genotype. + ploidy_p : int + Ploidy of the first parent (p). + ploidy_q : int + Ploidy of the second parent (q). + tau_p : int + Number of alleles inherited from parent_p. + tau_q : int + Number of alleles inherited from parent_q. + error_p : float + Probability that parent_p is not the correct + parental genotype. + error_q : float + Probability that parent_q is not the correct + parental genotype. + log_frequencies : ndarray, float, shape (n_alleles) + Log of prior for allele frequencies. + dosage : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the progenies dosage. + dosage_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the first parents (p) dosage. + dosage_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the second parents (q) dosage. + gamete_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the first gametes (p) dosage. + gamete_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the second gametes (q) dosage. + constraint_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the dosage limits of first gamete (p). + constraint_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the dosage limits of second gamete (q). + dosage_log_frequencies : ndarray, float, shape (ploidy,) + Scratch array to used to populate with allele frequencies corresponding to dosage. + + Returns + ------- + lprob : float + Log-probability of the trio. + """ + # handle case of clone + error_p = 1.0 if (tau_p == 0) else error_p + error_q = 1.0 if (tau_q == 0) else error_q + + # handel error terms + lerror_p = np.log(error_p) + lerror_q = np.log(error_q) + lcorrect_p = np.log(1 - error_p) if error_p < 1.0 else -np.inf + lcorrect_q = np.log(1 - error_q) if error_q < 1.0 else -np.inf + + # ploidy of 0 indicates unknown parent + set_allelic_dosage(progeny, dosage) + set_dosage_frequencies(progeny, log_frequencies, dosage_log_frequencies) + assert dosage.sum() == tau_p + tau_q # sanity + if ploidy_p == 0: + dosage_p[:] = 0 + else: + set_parental_copies(parent_p, progeny, dosage_p) + if ploidy_q == 0: + dosage_q[:] = 0 + else: + set_parental_copies(parent_q, progeny, dosage_q) + + for i in range(len(progeny)): + constraint_p[i] = min(dosage[i], dosage_p[i]) + constraint_q[i] = min(dosage[i], dosage_q[i]) + + # handle lambda parameter (diploid gametes only) + if lambda_p > 0.0: + if tau_p != 2: + raise ValueError( + "Non-zero lambda is only supported for a gametic ploidy (tau) of 2" + ) + # adjust constraint for double reduction + for i in range(len(dosage)): + if (dosage[i] >= 2) and (constraint_p[i] == 1): + constraint_p[i] = 2 + if lambda_q > 0.0: + if tau_q != 2: + raise ValueError( + "Non-zero lambda is only supported for a gametic ploidy (tau) of 2" + ) + # adjust constraint for double reduction + for i in range(len(dosage)): + if (dosage[i] >= 2) and (constraint_q[i] == 1): + constraint_q[i] = 2 + + # used to prune code paths + valid_p = constraint_p.sum() >= tau_p + valid_q = constraint_q.sum() >= tau_q + valid_p &= tau_p > 0 + valid_q &= tau_q > 0 + valid_p &= error_p < 1.0 + valid_q &= error_q < 1.0 + + # accumulate log-probabilities + lprob = -np.inf + + # assuming both parents are valid + if valid_p and valid_q: + set_initial_dosage(tau_p, constraint_p, gamete_p) + set_complimentary_gamete(dosage, gamete_p, gamete_q) + while True: + # assuming both parents are valid + lprob_p = ( + gamete_log_pmf( + gamete_dose=gamete_p, + gamete_ploidy=tau_p, + parent_dose=dosage_p, + parent_ploidy=ploidy_p, + gamete_lambda=lambda_p, + ) + + lcorrect_p + ) + lprob_q = ( + gamete_log_pmf( + gamete_dose=gamete_q, + gamete_ploidy=tau_q, + parent_dose=dosage_q, + parent_ploidy=ploidy_q, + gamete_lambda=lambda_q, + ) + + lcorrect_q + ) + lprob_pq = lprob_p + lprob_q + lprob = add_log_prob(lprob, lprob_pq) + # assuming p valid and q invalid (avoids iterating gametes of p twice) + # probability of gamete_q + lprob_q = ( + log_unknown_dosage_prior(gamete_q, dosage_log_frequencies) + lerror_q + ) + lprob_pq = lprob_p + lprob_q + lprob = add_log_prob(lprob, lprob_pq) + # increment by gamete of p + try: + increment_dosage(gamete_p, constraint_p) + except: # noqa: E722 + break + else: + for i in range(len(gamete_q)): + gamete_q[i] = dosage[i] - gamete_p[i] + + # assuming p valid and q invalid (unless already done in previous loop) + elif valid_p: + set_initial_dosage(tau_p, constraint_p, gamete_p) + set_complimentary_gamete(dosage, gamete_p, gamete_q) + while True: + lprob_p = ( + gamete_log_pmf( + gamete_dose=gamete_p, + gamete_ploidy=tau_p, + parent_dose=dosage_p, + parent_ploidy=ploidy_p, + gamete_lambda=lambda_p, + ) + + lcorrect_p + ) + # probability of gamete_q + lprob_q = ( + log_unknown_dosage_prior(gamete_q, dosage_log_frequencies) + lerror_q + ) + lprob_pq = lprob_p + lprob_q + lprob = add_log_prob(lprob, lprob_pq) + # increment by gamete of p + try: + increment_dosage(gamete_p, constraint_p) + except: # noqa: E722 + break + else: + for i in range(len(gamete_q)): + gamete_q[i] = dosage[i] - gamete_p[i] + + # assuming p invalid and q valid + if valid_q: + set_initial_dosage(tau_q, constraint_q, gamete_q) + set_complimentary_gamete(dosage, gamete_q, gamete_p) + while True: + # probability of gamete_p + lprob_p = ( + log_unknown_dosage_prior(gamete_p, dosage_log_frequencies) + lerror_p + ) + lprob_q = ( + gamete_log_pmf( + gamete_dose=gamete_q, + gamete_ploidy=tau_q, + parent_dose=dosage_q, + parent_ploidy=ploidy_q, + gamete_lambda=lambda_q, + ) + + lcorrect_q + ) + lprob_pq = lprob_p + lprob_q + lprob = add_log_prob(lprob, lprob_pq) + # increment by gamete of q + try: + increment_dosage(gamete_q, constraint_q) + except: # noqa: E722 + break + else: + for i in range(len(gamete_p)): + gamete_p[i] = dosage[i] - gamete_q[i] + + # assuming both parents are invalid + lprob_pq = ( + log_unknown_dosage_prior(dosage, dosage_log_frequencies) + lerror_p + lerror_q + ) + lprob = add_log_prob(lprob, lprob_pq) + return lprob + + +@njit(cache=True) +def markov_blanket_log_probability( + target_index, + sample_genotypes, + sample_ploidy, + sample_parents, + sample_children, + gamete_tau, + gamete_lambda, + gamete_error, + log_frequencies, + dosage, + dosage_p, + dosage_q, + gamete_p, + gamete_q, + constraint_p, + constraint_q, + dosage_log_frequencies, +): + """Joint probability of pedigree items that fall within the + Markov blanket of the specified target sample. + + Parameters + ---------- + target_index : int + Index of target sample. + sample_genotypes : ndarray, int, shape (n_sample, max_ploidy) + Genotype of each sample padded by negative values. + sample_ploidy : ndarray, int, shape (n_sample,) + Sample ploidy + sample_parents : ndarray, int, shape (n_samples, 2) + Parent indices of each sample with -1 indicating + unknown parents. + gamete_tau : int, shape (n_samples, 2) + Gamete ploidy associated with each pedigree edge. + gamete_lambda : float, shape (n_samples, 2) + Excess IBDy associated with each pedigree edge. + gamete_error : float, shape (n_samples, 2) + Error rate associated with each pedigree edge. + log_frequencies : ndarray, float, shape (n_alleles) + Log of prior for allele frequencies. + dosage : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the progenies dosage. + dosage_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the first parents (p) dosage. + dosage_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the second parents (q) dosage. + gamete_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the first gametes (p) dosage. + gamete_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the second gametes (q) dosage. + constraint_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the dosage limits of first gamete (p). + constraint_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the dosage limits of second gamete (q). + dosage_log_frequencies : ndarray, float, shape (ploidy,) + Scratch array to used to populate with allele frequencies corresponding to dosage. + + Returns + ------- + log_probability : float + Joint log probability of pedigree items that fall within the + Markov blanket of the specified target sample. + + """ + n_samples, max_children = sample_children.shape + assert 0 <= target_index < n_samples + log_joint = 0.0 + for idx in range(-1, max_children): + if idx < 0: + # start with trio in which target is the child + i = target_index + else: + # iterate through children + i = sample_children[target_index, idx] + if i < 0: + # no more children + break + p = sample_parents[i, 0] + q = sample_parents[i, 1] + if p >= 0: + error_p = gamete_error[i, 0] + ploidy_p = sample_ploidy[p] + else: + error_p = 1.0 + ploidy_p = 0 + if q >= 0: + error_q = gamete_error[i, 1] + ploidy_q = sample_ploidy[q] + else: + error_q = 1.0 + ploidy_q = 0 + log_joint += trio_log_pmf( + sample_genotypes[i], + sample_genotypes[p], + sample_genotypes[q], + ploidy_p=ploidy_p, + ploidy_q=ploidy_q, + tau_p=gamete_tau[i, 0], + tau_q=gamete_tau[i, 1], + lambda_p=gamete_lambda[i, 0], + lambda_q=gamete_lambda[i, 1], + error_p=error_p, + error_q=error_q, + log_frequencies=log_frequencies, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + return log_joint + + +# TODO: merge this with `markov_blanket_log_probability` +# and create a similar API for `markov_blanket_log_allele_probability` +@njit(cache=True) +def generic_markov_blanket_log_probability( + markov_blanket, + sample_genotypes, + sample_ploidy, + sample_parents, + gamete_tau, + gamete_lambda, + gamete_error, + log_frequencies, + dosage, + dosage_p, + dosage_q, + gamete_p, + gamete_q, + constraint_p, + constraint_q, + dosage_log_frequencies, +): + """Joint probability of pedigree items that fall within the + Markov blanket of the specified target sample. + + Parameters + ---------- + markov_blanket : nd.array, int + Indices of samples within the Markov blanket. Padded with negative values. + sample_genotypes : ndarray, int, shape (n_sample, max_ploidy) + Genotype of each sample padded by negative values. + sample_ploidy : ndarray, int, shape (n_sample,) + Sample ploidy + sample_parents : ndarray, int, shape (n_samples, 2) + Parent indices of each sample with -1 indicating + unknown parents. + gamete_tau : int, shape (n_samples, 2) + Gamete ploidy associated with each pedigree edge. + gamete_lambda : float, shape (n_samples, 2) + Excess IBDy associated with each pedigree edge. + gamete_error : float, shape (n_samples, 2) + Error rate associated with each pedigree edge. + log_frequencies : ndarray, float, shape (n_alleles) + Log of prior for allele frequencies. + dosage : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the progenies dosage. + dosage_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the first parents (p) dosage. + dosage_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the second parents (q) dosage. + gamete_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the first gametes (p) dosage. + gamete_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the second gametes (q) dosage. + constraint_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the dosage limits of first gamete (p). + constraint_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the dosage limits of second gamete (q). + dosage_log_frequencies : ndarray, float, shape (ploidy,) + Scratch array to used to populate with allele frequencies corresponding to dosage. + + Returns + ------- + log_probability : float + Joint log probability of pedigree items that fall within the + Markov blanket of the specified target sample. + + """ + max_size = len(markov_blanket) + log_joint = 0.0 + for idx in range(max_size): + i = markov_blanket[idx] + if i < 0: + # start of padding + break + p = sample_parents[i, 0] + q = sample_parents[i, 1] + if p >= 0: + error_p = gamete_error[i, 0] + ploidy_p = sample_ploidy[p] + else: + error_p = 1.0 + ploidy_p = 0 + if q >= 0: + error_q = gamete_error[i, 1] + ploidy_q = sample_ploidy[q] + else: + error_q = 1.0 + ploidy_q = 0 + log_joint += trio_log_pmf( + sample_genotypes[i], + sample_genotypes[p], + sample_genotypes[q], + ploidy_p=ploidy_p, + ploidy_q=ploidy_q, + tau_p=gamete_tau[i, 0], + tau_q=gamete_tau[i, 1], + lambda_p=gamete_lambda[i, 0], + lambda_q=gamete_lambda[i, 1], + error_p=error_p, + error_q=error_q, + log_frequencies=log_frequencies, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + return log_joint + + +@njit(cache=True) +def trio_allele_log_pmf( + allele_index, + progeny, + parent_p, + parent_q, + ploidy_p, + ploidy_q, + tau_p, + tau_q, + lambda_p, + lambda_q, + error_p, + error_q, + log_frequencies, + dosage, + dosage_p, + dosage_q, + gamete_p, + gamete_q, + constraint_p, + constraint_q, + dosage_log_frequencies, +): + """Log probability of allele within a trio of genotypes. + + Warning + ------- + This function is proportional, but not equal, to the true PMF. + It is out by a constant which can be computed with some complexity. + In short, this function returns P(a | c, p, q, ...) * P(c | p, q, ...) + where 'c' is the set of progeny alleles held as constant and hence + P(c | p, q, ...) is a constant. + This is easier to calculate than the true PMF of P(a | c, p, q, ...) + due to the implementation details of iterating over gametes. + + + Parameters + ---------- + allele_index : int + Index of allele within progeny treated as variable. + progeny : ndarray, int, shape (ploidy,) + Integer encoded alleles in the progeny genotype. + parent_p : ndarray, int, shape (ploidy,) + Integer encoded alleles in the first parental genotype. + parent_q : ndarray, int, shape (ploidy,) + Integer encoded alleles in the second parental genotype. + ploidy_p : int + Ploidy of the first parent (p). + ploidy_q : int + Ploidy of the second parent (q). + tau_p : int + Number of alleles inherited from parent_p. + tau_q : int + Number of alleles inherited from parent_q. + error_p : float + Probability that parent_p is not the correct + parental genotype. + error_q : float + Probability that parent_q is not the correct + parental genotype. + log_frequencies : ndarray, float, shape (n_alleles) + Log of prior for allele frequencies. + dosage : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the progenies dosage. + dosage_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the first parents (p) dosage. + dosage_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the second parents (q) dosage. + gamete_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the first gametes (p) dosage. + gamete_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the second gametes (q) dosage. + constraint_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the dosage limits of first gamete (p). + constraint_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the dosage limits of second gamete (q). + dosage_log_frequencies : ndarray, float, shape (ploidy,) + Scratch array to used to populate with allele frequencies corresponding to dosage. + + Returns + ------- + lprob : float + Log-probability. + """ + # handle case of clone + error_p = 1.0 if (tau_p == 0) else error_p + error_q = 1.0 if (tau_q == 0) else error_q + + # handel error terms + lerror_p = np.log(error_p) + lerror_q = np.log(error_q) + lcorrect_p = np.log(1 - error_p) if error_p < 1.0 else -np.inf + lcorrect_q = np.log(1 - error_q) if error_q < 1.0 else -np.inf + + # ensure allele_index is index of first occurrence of that allele within progeny + # this is required so that the allele_index can be used on dosage arrays + assert allele_index < len(progeny) + for i in range(len(progeny)): + if progeny[i] == progeny[allele_index]: + allele_index = i + break + + # ploidy of 0 indicates unknown parent + set_allelic_dosage(progeny, dosage) + set_dosage_frequencies(progeny, log_frequencies, dosage_log_frequencies) + assert dosage.sum() == tau_p + tau_q # sanity + if ploidy_p == 0: + dosage_p[:] = 0 + else: + set_parental_copies(parent_p, progeny, dosage_p) + if ploidy_q == 0: + dosage_q[:] = 0 + else: + set_parental_copies(parent_q, progeny, dosage_q) + + for i in range(len(progeny)): + constraint_p[i] = min(dosage[i], dosage_p[i]) + constraint_q[i] = min(dosage[i], dosage_q[i]) + + # handle lambda parameter (diploid gametes only) + if lambda_p > 0.0: + if tau_p != 2: + raise ValueError( + "Non-zero lambda is only supported for a gametic ploidy (tau) of 2" + ) + # adjust constraint for double reduction + for i in range(len(dosage)): + if (dosage[i] >= 2) and (constraint_p[i] == 1): + constraint_p[i] = 2 + if lambda_q > 0.0: + if tau_q != 2: + raise ValueError( + "Non-zero lambda is only supported for a gametic ploidy (tau) of 2" + ) + # adjust constraint for double reduction + for i in range(len(dosage)): + if (dosage[i] >= 2) and (constraint_q[i] == 1): + constraint_q[i] = 2 + + # used to prune code paths + valid_p = constraint_p.sum() >= tau_p + valid_q = constraint_q.sum() >= tau_q + valid_p &= tau_p > 0 + valid_q &= tau_q > 0 + valid_p &= error_p < 1.0 + valid_q &= error_q < 1.0 + + # accumulate log-probabilities + # for Gibbs sampling these are calculated as probability + # of proposed allele given other alleles held as constant + # p(a | c). + # here we actually calculate p(a | c) * p(c | p, q) for simplicity. + # to do this we iterate over all possible gamete combinations + # and model the probability of the allele in question coming from + # each gamete in a pair. + # therefore, the alleles held as constant usually includes alleles + # from both gametes. + # we need to weight for each constant combination by its probability + # of occurring (p(c | p, q)) and then multiply this by the probability + # of the allele given the constant (p(a | c)). + # This effectively involves calculating three probabilities: + # p(gamete_p | parent_p) + # p(gamete_q_constant | parent_q, gamete_p) + # p(gamete_q_allele | parent_q, gamete_q_constant, gamete_p) + lprob = -np.inf + + # assuming both parents are valid + if valid_p and valid_q: + set_initial_dosage(tau_p, constraint_p, gamete_p) + set_complimentary_gamete(dosage, gamete_p, gamete_q) + while True: + # probability of each gamete given parent + lprob_gamete_p = gamete_log_pmf( + gamete_dose=gamete_p, + gamete_ploidy=tau_p, + parent_dose=dosage_p, + parent_ploidy=ploidy_p, + gamete_lambda=lambda_p, + ) + lprob_const_p = gamete_const_log_pmf( + allele_index=allele_index, + gamete_dose=gamete_p, + gamete_ploidy=tau_p, + parent_dose=dosage_p, + parent_ploidy=ploidy_p, + ) + lprob_allele_p = gamete_allele_log_pmf( + gamete_count=gamete_p[allele_index], + gamete_ploidy=tau_p, + parent_count=dosage_p[allele_index], + parent_ploidy=ploidy_p, + gamete_lambda=lambda_p, + ) + lprob_gamete_q = gamete_log_pmf( + gamete_dose=gamete_q, + gamete_ploidy=tau_q, + parent_dose=dosage_q, + parent_ploidy=ploidy_q, + gamete_lambda=lambda_q, + ) + lprob_const_q = gamete_const_log_pmf( + allele_index=allele_index, + gamete_dose=gamete_q, + gamete_ploidy=tau_q, + parent_dose=dosage_q, + parent_ploidy=ploidy_q, + ) + lprob_allele_q = gamete_allele_log_pmf( + gamete_count=gamete_q[allele_index], + gamete_ploidy=tau_q, + parent_count=dosage_q[allele_index], + parent_ploidy=ploidy_q, + gamete_lambda=lambda_q, + ) + lprob_p = lprob_gamete_q + lprob_const_p + lprob_allele_p + lprob_q = lprob_gamete_p + lprob_const_q + lprob_allele_q + lprob_pq = add_log_prob(lprob_p, lprob_q) + lcorrect_p + lcorrect_q + lprob = add_log_prob(lprob, lprob_pq) + + # assuming p valid and q invalid (avoids iterating gametes of p twice) + lprob_gamete_q = log_unknown_dosage_prior(gamete_q, dosage_log_frequencies) + lprob_const_q = log_unknown_const_prior( + gamete_q, allele_index, dosage_log_frequencies + ) + lprob_allele_q = dosage_log_frequencies[allele_index] + lprob_p = lprob_gamete_q + lprob_const_p + lprob_allele_p + lprob_q = lprob_gamete_p + lprob_const_q + lprob_allele_q + lprob_pq = add_log_prob(lprob_p, lprob_q) + lcorrect_p + lerror_q + lprob = add_log_prob(lprob, lprob_pq) + + # increment by gamete of p + try: + increment_dosage(gamete_p, constraint_p) + except: # noqa: E722 + break + else: + for i in range(len(gamete_q)): + gamete_q[i] = dosage[i] - gamete_p[i] + + # assuming p valid and q invalid (unless already done in previous loop) + elif valid_p: + set_initial_dosage(tau_p, constraint_p, gamete_p) + set_complimentary_gamete(dosage, gamete_p, gamete_q) + while True: + # assuming p valid and q invalid + lprob_gamete_p = gamete_log_pmf( + gamete_dose=gamete_p, + gamete_ploidy=tau_p, + parent_dose=dosage_p, + parent_ploidy=ploidy_p, + gamete_lambda=lambda_p, + ) + lprob_const_p = gamete_const_log_pmf( + allele_index=allele_index, + gamete_dose=gamete_p, + gamete_ploidy=tau_p, + parent_dose=dosage_p, + parent_ploidy=ploidy_p, + ) + lprob_allele_p = gamete_allele_log_pmf( + gamete_count=gamete_p[allele_index], + gamete_ploidy=tau_p, + parent_count=dosage_p[allele_index], + parent_ploidy=ploidy_p, + gamete_lambda=lambda_p, + ) + lprob_gamete_q = log_unknown_dosage_prior(gamete_q, dosage_log_frequencies) + lprob_const_q = log_unknown_const_prior( + gamete_q, allele_index, dosage_log_frequencies + ) + lprob_allele_q = dosage_log_frequencies[allele_index] + lprob_p = lprob_gamete_q + lprob_const_p + lprob_allele_p + lprob_q = lprob_gamete_p + lprob_const_q + lprob_allele_q + lprob_pq = add_log_prob(lprob_p, lprob_q) + lcorrect_p + lerror_q + lprob = add_log_prob(lprob, lprob_pq) + # increment by gamete of p + try: + increment_dosage(gamete_p, constraint_p) + except: # noqa: E722 + break + else: + for i in range(len(gamete_q)): + gamete_q[i] = dosage[i] - gamete_p[i] + + # assuming p invalid and q valid + if valid_q: + set_initial_dosage(tau_q, constraint_q, gamete_q) + set_complimentary_gamete(dosage, gamete_q, gamete_p) + while True: + assert gamete_p.sum() == tau_p + assert gamete_q.sum() == tau_q + # assuming q valid and p invalid + lprob_gamete_q = gamete_log_pmf( + gamete_dose=gamete_q, + gamete_ploidy=tau_q, + parent_dose=dosage_q, + parent_ploidy=ploidy_q, + gamete_lambda=lambda_q, + ) + lprob_const_q = gamete_const_log_pmf( + allele_index=allele_index, + gamete_dose=gamete_q, + gamete_ploidy=tau_q, + parent_dose=dosage_q, + parent_ploidy=ploidy_q, + ) + lprob_allele_q = gamete_allele_log_pmf( + gamete_count=gamete_q[allele_index], + gamete_ploidy=tau_q, + parent_count=dosage_q[allele_index], + parent_ploidy=ploidy_q, + gamete_lambda=lambda_q, + ) + lprob_gamete_p = log_unknown_dosage_prior(gamete_p, dosage_log_frequencies) + lprob_const_p = log_unknown_const_prior( + gamete_p, allele_index, dosage_log_frequencies + ) + lprob_allele_p = dosage_log_frequencies[allele_index] + lprob_p = lprob_gamete_q + lprob_const_p + lprob_allele_p + lprob_q = lprob_gamete_p + lprob_const_q + lprob_allele_q + lprob_pq = add_log_prob(lprob_p, lprob_q) + lerror_p + lcorrect_q + lprob = add_log_prob(lprob, lprob_pq) + # increment by gamete of q + try: + increment_dosage(gamete_q, constraint_q) + except: # noqa: E722 + break + else: + for i in range(len(gamete_p)): + gamete_p[i] = dosage[i] - gamete_q[i] + + # assuming both parents are invalid + # p(constant) * p(allele | constant) * 2 + lprob_const = log_unknown_const_prior(dosage, allele_index, dosage_log_frequencies) + lprob_allele = ( + dosage_log_frequencies[allele_index] + 0.6931471805599453 + ) # log frequency of allele * 2 + lprob_pq = lprob_const + lprob_allele + lerror_p + lerror_q + lprob = add_log_prob(lprob, lprob_pq) + assert not np.isnan(lprob) + return lprob + + +@njit(cache=True) +def markov_blanket_log_allele_probability( + target_index, + allele_index, + sample_genotypes, + sample_ploidy, + sample_parents, + sample_children, + gamete_tau, + gamete_lambda, + gamete_error, + log_frequencies, + dosage, + dosage_p, + dosage_q, + gamete_p, + gamete_q, + constraint_p, + constraint_q, + dosage_log_frequencies, +): + """Joint probability of pedigree items that fall within the + Markov blanket of the specified target sample. + + Parameters + ---------- + target_index : int + Index of target sample. + allele_index : int + Index of target allele. + sample_genotypes : ndarray, int, shape (n_sample, max_ploidy) + Genotype of each sample padded by negative values. + sample_ploidy : ndarray, int, shape (n_sample,) + Sample ploidy + sample_parents : ndarray, int, shape (n_samples, 2) + Parent indices of each sample with -1 indicating + unknown parents. + gamete_tau : int, shape (n_samples, 2) + Gamete ploidy associated with each pedigree edge. + gamete_lambda : float, shape (n_samples, 2) + Excess IBDy associated with each pedigree edge. + gamete_error : float, shape (n_samples, 2) + Error rate associated with each pedigree edge. + log_frequencies : ndarray, float, shape (n_alleles) + Log of prior for allele frequencies. + dosage : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the progenies dosage. + dosage_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the first parents (p) dosage. + dosage_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the second parents (q) dosage. + gamete_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the first gametes (p) dosage. + gamete_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the second gametes (q) dosage. + constraint_p : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the dosage limits of first gamete (p). + constraint_q : ndarray, int, shape (ploidy,) + Scratch array to used to populate with the dosage limits of second gamete (q). + dosage_log_frequencies : ndarray, float, shape (ploidy,) + Scratch array to used to populate with allele frequencies corresponding to dosage. + + Returns + ------- + log_probability : float + Joint log probability of pedigree items that fall within the + Markov blanket of the specified target sample. + + """ + n_samples, max_children = sample_children.shape + assert 0 <= target_index < n_samples + + # start with trio where target is progeny + p = sample_parents[target_index, 0] + q = sample_parents[target_index, 1] + if p >= 0: + error_p = gamete_error[target_index, 0] + ploidy_p = sample_ploidy[p] + else: + error_p = 1.0 + ploidy_p = 0 + if q >= 0: + error_q = gamete_error[target_index, 1] + ploidy_q = sample_ploidy[q] + else: + error_q = 1.0 + ploidy_q = 0 + log_joint = trio_allele_log_pmf( + allele_index=allele_index, + progeny=sample_genotypes[target_index], + parent_p=sample_genotypes[p], + parent_q=sample_genotypes[q], + ploidy_p=ploidy_p, + ploidy_q=ploidy_q, + tau_p=gamete_tau[target_index, 0], + tau_q=gamete_tau[target_index, 1], + lambda_p=gamete_lambda[target_index, 0], + lambda_q=gamete_lambda[target_index, 1], + error_p=error_p, + error_q=error_q, + log_frequencies=log_frequencies, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + # loop through children + for idx in range(max_children): + i = sample_children[target_index, idx] + if i < 0: + # no more children + break + p = sample_parents[i, 0] + q = sample_parents[i, 1] + if p >= 0: + error_p = gamete_error[i, 0] + ploidy_p = sample_ploidy[p] + else: + error_p = 1.0 + ploidy_p = 0 + if q >= 0: + error_q = gamete_error[i, 1] + ploidy_q = sample_ploidy[q] + else: + error_q = 1.0 + ploidy_q = 0 + # the target is a parent + log_joint += trio_log_pmf( + sample_genotypes[i], + sample_genotypes[p], + sample_genotypes[q], + ploidy_p=ploidy_p, + ploidy_q=ploidy_q, + tau_p=gamete_tau[i, 0], + tau_q=gamete_tau[i, 1], + lambda_p=gamete_lambda[i, 0], + lambda_q=gamete_lambda[i, 1], + error_p=error_p, + error_q=error_q, + log_frequencies=log_frequencies, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + + return log_joint diff --git a/mchap/pedigree/validation.py b/mchap/pedigree/validation.py new file mode 100644 index 00000000..609dafdf --- /dev/null +++ b/mchap/pedigree/validation.py @@ -0,0 +1,99 @@ +import numpy as np +from numba import njit + +from .prior import ( + set_allelic_dosage, + set_parental_copies, + set_initial_dosage, + increment_dosage, +) + + +@njit(cache=True) +def duo_valid(progeny, parent, tau, lambda_): + ploidy = len(progeny) + dosage = np.zeros(ploidy, dtype=np.int64) + dosage_p = np.zeros(ploidy, dtype=np.int64) + set_allelic_dosage(progeny, dosage) + set_parental_copies(parent, progeny, dosage_p) + constraint_p = np.minimum(dosage, dosage_p) + + # handle lambda parameter (diploid gametes only) + if lambda_ > 0.0: + if tau != 2: + raise ValueError( + "Non-zero lambda is only supported for a gametic ploidy (tau) of 2" + ) + # adjust constraint for double reduction + for i in range(len(dosage)): + if (dosage[i] >= 2) and (constraint_p[i] == 1): + constraint_p[i] = 2 + return constraint_p.sum() >= tau + + +@njit(cache=True) +def trio_valid( + progeny, + parent_p, + parent_q, + tau_p, + tau_q, + lambda_p, + lambda_q, +): + ploidy = len(progeny) + dosage = np.zeros(ploidy, dtype=np.int64) + dosage_p = np.zeros(ploidy, dtype=np.int64) + dosage_q = np.zeros(ploidy, dtype=np.int64) + gamete_p = np.zeros(ploidy, dtype=np.int64) + gamete_q = np.zeros(ploidy, dtype=np.int64) + set_allelic_dosage(progeny, dosage) + set_parental_copies(parent_p, progeny, dosage_p) + set_parental_copies(parent_q, progeny, dosage_q) + + constraint_p = np.minimum(dosage, dosage_p) + constraint_q = np.minimum(dosage, dosage_q) + + # handle lambda parameter (diploid gametes only) + if lambda_p > 0.0: + if tau_p != 2: + raise ValueError( + "Non-zero lambda is only supported for a gametic ploidy (tau) of 2" + ) + # adjust constraint for double reduction + for i in range(len(dosage)): + if (dosage[i] >= 2) and (constraint_p[i] == 1): + constraint_p[i] = 2 + if lambda_q > 0.0: + if tau_q != 2: + raise ValueError( + "Non-zero lambda is only supported for a gametic ploidy (tau) of 2" + ) + # adjust constraint for double reduction + for i in range(len(dosage)): + if (dosage[i] >= 2) and (constraint_q[i] == 1): + constraint_q[i] = 2 + + if (constraint_p.sum() < tau_p) or (constraint_q.sum() < tau_q): + return False + set_initial_dosage(tau_p, constraint_p, gamete_p) + gamete_q[:] = dosage - gamete_p + while True: + match = True + for i in range(len(dosage)): + if gamete_q[i] > constraint_q[i]: + match = False + break + if gamete_p[i] + gamete_q[i] != dosage[i]: + match = False + break + if match: + return True + try: + increment_dosage(gamete_p, constraint_p) + except: # noqa: E722 + break + else: + for i in range(len(gamete_q)): + gamete_q[i] = dosage[i] - gamete_p[i] + return False diff --git a/mchap/tests/test_application_assemble.py b/mchap/tests/test_application_assemble.py index f5bd3762..c6800119 100644 --- a/mchap/tests/test_application_assemble.py +++ b/mchap/tests/test_application_assemble.py @@ -283,7 +283,7 @@ def test_Program__header(): ), ( ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], - [], + ["--report", "SNVDP"], "simple.output.mixed_depth.assemble.vcf", ), ( @@ -293,7 +293,12 @@ def test_Program__header(): ), ( ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], - ["--report", "AOP"], + ["--report", "ACP"], + "simple.output.mixed_depth.assemble.counts.vcf", + ), + ( + ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], + ["--report", "AOP", "AOPSUM"], "simple.output.mixed_depth.assemble.occurrence.vcf", ), ( @@ -398,6 +403,9 @@ def test_Program__run_stdout(bams, cli_extra, output_vcf, cache_threshold, n_cor # file paths will make full line differ if act.startswith("##commandline"): assert exp.startswith("##commandline") + # versions will differ + elif act.startswith("##source=mchap"): + assert exp.startswith("##source=mchap") elif act.startswith("##fileDate"): # new date should be greater than test vcf date assert exp.startswith("##fileDate") @@ -469,6 +477,8 @@ def test_Program__run_stdout__region(region, region_id, cache_threshold): "11", "--mcmc-llk-cache-threshold", str(cache_threshold), + "--report", + "SNVDP", ] prog = program.cli(command) @@ -503,6 +513,9 @@ def test_Program__run_stdout__region(region, region_id, cache_threshold): # file paths will make full line differ if act.startswith("##commandline"): assert exp.startswith("##commandline") + # versions will differ + elif act.startswith("##source=mchap"): + assert exp.startswith("##source=mchap") elif act.startswith("##fileDate"): # new date should be greater than test vcf date assert exp.startswith("##fileDate") diff --git a/mchap/tests/test_application_atomize.py b/mchap/tests/test_application_atomize.py new file mode 100644 index 00000000..187094d4 --- /dev/null +++ b/mchap/tests/test_application_atomize.py @@ -0,0 +1,144 @@ +import pathlib +import tempfile +import os +import sys +import pytest +import numpy as np + +from mchap.application.atomize import ( + main, + format_snv_alleles, + get_haplotype_snv_indices, + format_allele_floats, + ExperimentalFeatureWarning, +) + + +def test_format_snv_alleles(): + haplotype_snvs = np.array( + [ + ["A", "C", "A", "C"], + ["A", "C", "G", "C"], + ["A", "T", "T", "G"], + ] + ) + refs, alts, n_alts = format_snv_alleles(haplotype_snvs) + np.testing.assert_array_equal(refs, ["A", "C", "A", "C"]) + np.testing.assert_array_equal(alts, ["", "T", "G,T", "G"]) + np.testing.assert_array_equal(n_alts, [0, 1, 2, 1]) + + +def test_get_haplotype_snv_indices(): + haplotype_snvs = np.array( + [ + ["A", "C", "A", "C"], + ["A", "C", "G", "C"], + ["A", "T", "T", "G"], + ] + ) + actual = get_haplotype_snv_indices(haplotype_snvs) + expect = [ + [0, 0, 0, 0], + [0, 0, 1, 0], + [0, 1, 2, 1], + ] + np.testing.assert_array_equal(actual, expect) + + +def test_format_allele_floats__R(): + n_alts = np.array([1, 1, 2, 3]) + floats = np.arange(60).reshape(5, 3, 4) / 15 + floats[1] = np.nan + floats[3, 1] = [0.0, 1.0, np.nan, 1.1] + actual = format_allele_floats(floats, n_alts) + expect = np.array( + [ + ["0,0.067", "0.267,0.333", "0.533,0.6"], + [".,.", ".,.", ".,."], + ["1.6,1.667,1.733", "1.867,1.933,2", "2.133,2.2,2.267"], + ["2.4,2.467,2.533,2.6", "0,1,.,1.1", "2.933,3,3.067,3.133"], + ] + ) + np.testing.assert_array_equal(actual, expect) + + +def test_format_allele_floats__A(): + n_alts = np.array([1, 1, 2, 3]) + floats = np.arange(60).reshape(5, 3, 4) / 15 + floats[1] = np.nan + floats[3, 1] = [0.0, 1.0, np.nan, 1.1] + actual = format_allele_floats(floats[:, :, 1:], n_alts, length="A") + expect = np.array( + [ + ["0.067", "0.333", "0.6"], + [".", ".", "."], + ["1.667,1.733", "1.933,2", "2.2,2.267"], + ["2.467,2.533,2.6", "1,.,1.1", "3,3.067,3.133"], + ] + ) + np.testing.assert_array_equal(actual, expect) + + +@pytest.mark.parametrize( + "input_vcf, output_vcf", + [ + ( + "simple.output.mixed_depth.assemble.vcf", + "simple.output.mixed_depth.assemble.atomize.vcf", + ), + ( + "simple.output.mixed_depth.assemble.counts.vcf", + "simple.output.mixed_depth.assemble.counts.atomize.vcf", + ), + ( + "simple.output.mixed_depth.assemble.frequencies.vcf", + "simple.output.mixed_depth.assemble.frequencies.atomize.vcf", + ), + ], +) +def test_main(input_vcf, output_vcf): + path = pathlib.Path(__file__).parent.absolute() + path = path / "test_io/data" + + INPUT = str(path / input_vcf) + OUTPUT = str(path / output_vcf) + + command = ["mchap", "atomize", INPUT] + + # capture stdout in file + _, out_filename = tempfile.mkstemp() + stdout = sys.stdout + sys.stdout = open(out_filename, "w") + with pytest.warns(ExperimentalFeatureWarning): + main(command) + sys.stdout.close() + + # replace stdout + sys.stdout = stdout + + # compare output to expected + with open(out_filename, "r") as f: + actual = f.readlines() + with open(str(OUTPUT), "r") as f: + expected = f.readlines() + + assert len(actual) == len(expected) + + for act, exp in zip(actual, expected): + # file paths will make full line differ + if act.startswith("##commandline"): + assert exp.startswith("##commandline") + # versions will differ + elif act.startswith("##source=mchap"): + assert exp.startswith("##source=mchap") + elif act.startswith("##reference"): + assert exp.startswith("##reference") + elif act.startswith("##fileDate"): + # new date should be greater than test vcf date + assert exp.startswith("##fileDate") + assert act > exp + else: + assert act == exp + + # cleanup + os.remove(out_filename) diff --git a/mchap/tests/test_application_call.py b/mchap/tests/test_application_call.py index aa10d1e9..38397a70 100644 --- a/mchap/tests/test_application_call.py +++ b/mchap/tests/test_application_call.py @@ -35,7 +35,7 @@ def local_file_path(name): ( "simple.output.mixed_depth.assemble.vcf", ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], - [], + ["--report", "SNVDP"], "simple.output.mixed_depth.call.vcf", ), ( @@ -47,12 +47,22 @@ def local_file_path(name): ], "simple.output.mixed_depth.call.frequencies.vcf", ), + ( + "simple.output.mixed_depth.assemble.vcf", + ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], + [ + "--report", + "ACP", + ], + "simple.output.mixed_depth.call.counts.vcf", + ), ( "simple.output.mixed_depth.assemble.vcf", ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], [ "--report", "AOP", + "AOPSUM", ], "simple.output.mixed_depth.call.occurrence.vcf", ), @@ -184,6 +194,9 @@ def test_Program__run_stdout(input_vcf, bams, cli_extra, output_vcf, n_cores): # file paths will make full line differ if act.startswith("##commandline"): assert exp.startswith("##commandline") + # versions will differ + elif act.startswith("##source=mchap"): + assert exp.startswith("##source=mchap") elif act.startswith("##fileDate"): # new date should be greater than test vcf date assert exp.startswith("##fileDate") diff --git a/mchap/tests/test_application_call_exact.py b/mchap/tests/test_application_call_exact.py index 1c2b23ee..2624900f 100644 --- a/mchap/tests/test_application_call_exact.py +++ b/mchap/tests/test_application_call_exact.py @@ -35,7 +35,7 @@ def local_file_path(name): ( "simple.output.mixed_depth.assemble.vcf", ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], - [], + ["--report", "SNVDP"], "simple.output.mixed_depth.call-exact.vcf", ), ( @@ -47,12 +47,22 @@ def local_file_path(name): ], "simple.output.mixed_depth.call-exact.frequencies.vcf", ), + ( + "simple.output.mixed_depth.assemble.vcf", + ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], + [ + "--report", + "ACP", + ], + "simple.output.mixed_depth.call-exact.counts.vcf", + ), ( "simple.output.mixed_depth.assemble.vcf", ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], [ "--report", "AOP", + "AOPSUM", ], "simple.output.mixed_depth.call-exact.occurrence.vcf", ), @@ -192,6 +202,9 @@ def test_Program__run_stdout(input_vcf, bams, cli_extra, output_vcf, n_cores): # file paths will make full line differ if act.startswith("##commandline"): assert exp.startswith("##commandline") + # versions will differ + elif act.startswith("##source=mchap"): + assert exp.startswith("##source=mchap") elif act.startswith("##fileDate"): # new date should be greater than test vcf date assert exp.startswith("##fileDate") diff --git a/mchap/tests/test_application_call_pedigree.py b/mchap/tests/test_application_call_pedigree.py new file mode 100644 index 00000000..090057ef --- /dev/null +++ b/mchap/tests/test_application_call_pedigree.py @@ -0,0 +1,188 @@ +import pathlib +import tempfile +import os +import sys +import pytest + +from mchap.application.call_pedigree import program, ExperimentalFeatureWarning + + +def full_path(file_name): + path = pathlib.Path(__file__).parent.absolute() + path = path / ("test_io/data/" + file_name) + return str(path) + + +@pytest.mark.parametrize( + "input_vcf,bams,pedigree,cli_extra,output_vcf", + [ + ( + "simple.output.mixed_depth.assemble.vcf", + ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], + "simple.pedigree.132.txt", + [], + "simple.output.mixed_depth.call-pedigree.p132.vcf", + ), + ( + "simple.output.mixed_depth.assemble.vcf", + ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], + "simple.pedigree.132.txt", + ["--gamete-error", "0.5"], + "simple.output.mixed_depth.call-pedigree.p132.gamerror0.5.vcf", + ), + ( + "simple.output.mixed_depth.assemble.vcf", + ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], + "simple.pedigree.132.txt", + ["--gamete-ibd", "0.1", "--gamete-error", "0.1"], + "simple.output.mixed_depth.call-pedigree.p132.lambda0.1.vcf", + ), + ( + "simple.output.mixed_depth.assemble.vcf", + ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], + "simple.pedigree.132.txt", + [ + "--gamete-ploidy", + full_path("simple.tau.132.txt"), + "--gamete-error", + "0.1", + ], + "simple.output.mixed_depth.call-pedigree.p132.tau-mixed.vcf", + ), + ( + "simple.output.mixed_depth.assemble.vcf", + ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], + "simple.pedigree.132.txt", + [ + "--gamete-error", + "0.1", + "--report", + "SNVDP", + "AFPRIOR", + "ACP", + "AFP", + "AOP", + "AOPSUM", + "GL", + "GP", + ], + "simple.output.mixed_depth.call-pedigree.p132.reportall.vcf", + ), + ( + "mock.input.frequencies.vcf", + ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], + "simple.pedigree.132.txt", + ["--gamete-error", "0.1", "--prior-frequencies", "AFP"], + "simple.output.mixed_depth.call-pedigree.p132.prior.vcf", + ), + ( + "mock.input.frequencies.vcf", + ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], + "simple.pedigree.132.txt", + [ + "--gamete-error", + "0.1", + "--prior-frequencies", + "AFP", + "--report", + "AFP", + "AFPRIOR", + ], + "simple.output.mixed_depth.call-pedigree.p132.frequencies.prior.vcf", + ), + ( + "mock.input.frequencies.vcf", + ["simple.sample1.bam", "simple.sample2.deep.bam", "simple.sample3.bam"], + "simple.pedigree.132.txt", + [ + "--gamete-error", + "0.1", + "--prior-frequencies", + "AFP", + "--report", + "AFP", + "AFPRIOR", + "--filter-input-haplotypes", + "AFP>=0.1", + ], + "simple.output.mixed_depth.call-pedigree.p132.frequencies.skiprare.vcf", + ), + ], +) +@pytest.mark.parametrize("n_cores", [1, 2]) +def test_Program__run_stdout(input_vcf, bams, pedigree, cli_extra, output_vcf, n_cores): + path = pathlib.Path(__file__).parent.absolute() + path = path / "test_io/data" + + VCF = str(path / input_vcf) + BAMS = [str(path / bam) for bam in bams] + PEDIGREE = str(path / pedigree) + + command = ( + [ + "mchap", + "call-pedigree", + "--bam", + ] + + BAMS + + [ + "--sample-parents", + PEDIGREE, + "--ploidy", + "4", + "--haplotypes", + VCF, + "--mcmc-steps", + "500", + "--mcmc-burn", + "100", + "--mcmc-seed", + "11", + "--cores", + str(n_cores), + ] + + cli_extra + ) + + with pytest.warns(ExperimentalFeatureWarning): + prog = program.cli(command) + + # capture stdout in file + _, out_filename = tempfile.mkstemp() + stdout = sys.stdout + sys.stdout = open(out_filename, "w") + prog.run_stdout() + sys.stdout.close() + + # replace stdout + sys.stdout = stdout + + # compare output to expected + with open(out_filename, "r") as f: + actual = f.readlines() + with open(str(path / output_vcf), "r") as f: + expected = f.readlines() + + assert len(actual) == len(expected) + + if n_cores > 1: + # output may be in different order + actual.sort() + expected.sort() + + for act, exp in zip(actual, expected): + # file paths will make full line differ + if act.startswith("##commandline"): + assert exp.startswith("##commandline") + # versions will differ + elif act.startswith("##source=mchap"): + assert exp.startswith("##source=mchap") + elif act.startswith("##fileDate"): + # new date should be greater than test vcf date + assert exp.startswith("##fileDate") + assert act > exp + else: + assert act == exp + + # cleanup + os.remove(out_filename) diff --git a/mchap/tests/test_application_find_snvs.py b/mchap/tests/test_application_find_snvs.py index 5c1cd739..e93afc0d 100644 --- a/mchap/tests/test_application_find_snvs.py +++ b/mchap/tests/test_application_find_snvs.py @@ -104,6 +104,9 @@ def test_main(bams, extra, output_vcf): # file paths will make full line differ if act.startswith("##commandline"): assert exp.startswith("##commandline") + # versions will differ + elif act.startswith("##source=mchap"): + assert exp.startswith("##source=mchap") elif act.startswith("##reference"): assert exp.startswith("##reference") elif act.startswith("##fileDate"): diff --git a/mchap/tests/test_assemble/test_classes.py b/mchap/tests/test_assemble/test_classes.py index 0db11d92..b442381a 100644 --- a/mchap/tests/test_assemble/test_classes.py +++ b/mchap/tests/test_assemble/test_classes.py @@ -27,10 +27,10 @@ def test_PosteriorGenotypeDistribution(): np.testing.assert_array_equal(expect_gen, actual_gen) assert expect_prob, actual_prob - # phenotype is combination of genotypes with same haplotypes + # support is combination of genotypes with same haplotypes expect_phen, expect_probs = genotypes[[1, 2]], probabilities[[1, 2]] - phenotype = dist.mode_phenotype() - actual_phen, actual_probs = phenotype.genotypes, phenotype.probabilities + support = dist.mode_genotype_support() + actual_phen, actual_probs = support.genotypes, support.probabilities np.testing.assert_array_equal(expect_phen, actual_phen) np.testing.assert_array_equal(expect_probs, actual_probs) @@ -75,10 +75,10 @@ def test_GenotypeMultiTrace(): @pytest.mark.parametrize("threshold,expect", [(0.99, 0), (0.8, 0), (0.6, 1)]) def test_GenotypeMultiTrace__replicate_incongruence(threshold, expect): haplotypes = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) - g0 = haplotypes[[0, 0, 1, 2]] # phenotype 1 - g1 = haplotypes[[0, 1, 1, 2]] # phenotype 1 - g2 = haplotypes[[0, 1, 2, 2]] # phenotype 1 - g3 = haplotypes[[0, 0, 2, 2]] # phenotype 2 + g0 = haplotypes[[0, 0, 1, 2]] # support 1 + g1 = haplotypes[[0, 1, 1, 2]] # support 1 + g2 = haplotypes[[0, 1, 2, 2]] # support 1 + g3 = haplotypes[[0, 0, 2, 2]] # support 2 genotypes = np.array([g0, g1, g2, g3]) t0 = genotypes[[0, 1, 0, 1, 2, 0, 1, 1, 0, 1]] # 10:0 @@ -105,11 +105,11 @@ def test_GenotypeMultiTrace__replicate_incongruence__cnv(threshold, expect): ] ) - g0 = haplotypes[[0, 0, 1, 2]] # phenotype 1 - g1 = haplotypes[[0, 1, 1, 2]] # phenotype 1 - g2 = haplotypes[[0, 1, 2, 2]] # phenotype 1 - g3 = haplotypes[[0, 0, 2, 3]] # phenotype 2 - g4 = haplotypes[[0, 2, 3, 4]] # phenotype 3 + g0 = haplotypes[[0, 0, 1, 2]] # support 1 + g1 = haplotypes[[0, 1, 1, 2]] # support 1 + g2 = haplotypes[[0, 1, 2, 2]] # support 1 + g3 = haplotypes[[0, 0, 2, 3]] # support 2 + g4 = haplotypes[[0, 2, 3, 4]] # support 3 genotypes = np.array([g0, g1, g2, g3, g4]) t0 = genotypes[[3, 1, 0, 1, 2, 0, 1, 1, 0, 1]] # 9:1 @@ -123,7 +123,7 @@ def test_GenotypeMultiTrace__replicate_incongruence__cnv(threshold, expect): assert actual == expect -def test_PhenotypeDistribution___mode_genotype(): +def test_GenotypeSupportDistribution___mode_genotype(): array = np.array( [ [[0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 1, 1]], @@ -134,7 +134,7 @@ def test_PhenotypeDistribution___mode_genotype(): ) probs = np.array([0.65, 0.2, 0.1]) expect = (array[0], probs[0]) - dist = classes.PhenotypeDistribution(array, probs) + dist = classes.GenotypeSupportDistribution(array, probs) actual = dist.mode_genotype() np.testing.assert_array_equal(expect[0], actual[0]) assert expect[1] == actual[1] @@ -247,7 +247,7 @@ def test_PosteriorGenotypeDistribution__allele_frequencies(): ), ], ) -def test_PhenotypeDistribution___call_phenotype(threshold, expect): +def test_GenotypeSupportDistribution___call_genotype_support(threshold, expect): array = np.array( [ [[0, 0, 0], [0, 0, 0], [0, 0, 0], [1, 1, 1]], @@ -257,7 +257,7 @@ def test_PhenotypeDistribution___call_phenotype(threshold, expect): dtype=np.int8, ) probs = np.array([0.65, 0.2, 0.1]) - dist = classes.PhenotypeDistribution(array, probs) - actual = dist.call_phenotype(threshold=threshold) + dist = classes.GenotypeSupportDistribution(array, probs) + actual = dist.call_genotype_support(threshold=threshold) np.testing.assert_array_equal(expect[0], actual[0]) np.testing.assert_almost_equal(expect[1], actual[1]) diff --git a/mchap/tests/test_calling/test_calling_classes.py b/mchap/tests/test_calling/test_calling_classes.py index 44d57b54..4c7a4c46 100644 --- a/mchap/tests/test_calling/test_calling_classes.py +++ b/mchap/tests/test_calling/test_calling_classes.py @@ -56,8 +56,8 @@ def test_CallingMCMC__gibbs_mh_equivalence(seed): model = CallingMCMC( ploidy=ploidy, haplotypes=haplotypes, inbreeding=inbreeding, steps=10050 ) - gibbs_genotype, gibbs_genotype_prob, gibbs_phenotype_prob = ( - model.fit(reads, read_counts).burn(50).posterior().mode(phenotype=True) + gibbs_genotype, gibbs_genotype_prob, gibbs_genotype_support_prob = ( + model.fit(reads, read_counts).burn(50).posterior().mode(genotype_support=True) ) # MH sampler @@ -68,8 +68,8 @@ def test_CallingMCMC__gibbs_mh_equivalence(seed): steps=10050, step_type="Metropolis-Hastings", ) - mh_genotype, mh_genotype_prob, mh_phenotype_prob = ( - model.fit(reads, read_counts).burn(50).posterior().mode(phenotype=True) + mh_genotype, mh_genotype_prob, mh_genotype_support_prob = ( + model.fit(reads, read_counts).burn(50).posterior().mode(genotype_support=True) ) # check results are equivalent @@ -77,7 +77,9 @@ def test_CallingMCMC__gibbs_mh_equivalence(seed): # the random seed values is required np.testing.assert_array_equal(gibbs_genotype, mh_genotype) np.testing.assert_allclose(gibbs_genotype_prob, mh_genotype_prob, atol=0.01) - np.testing.assert_allclose(gibbs_phenotype_prob, mh_phenotype_prob, atol=0.01) + np.testing.assert_allclose( + gibbs_genotype_support_prob, mh_genotype_support_prob, atol=0.01 + ) @pytest.mark.parametrize( @@ -122,13 +124,16 @@ def generate_haplotypes(pos): inbreeding=inbreeding, fix_homozygous=1, ) - denovo_phenotype = ( - model.fit(reads, read_counts=read_counts).burn(500).posterior().mode_phenotype() + denovo_genotype_support = ( + model.fit(reads, read_counts=read_counts) + .burn(500) + .posterior() + .mode_genotype_support() ) - denovo_phen_prob = denovo_phenotype.probabilities.sum() - idx = np.argmax(denovo_phenotype.probabilities) - denovo_gen_prob = denovo_phenotype.probabilities[idx] - denovo_genotype = denovo_phenotype.genotypes[idx] + denovo_phen_prob = denovo_genotype_support.probabilities.sum() + idx = np.argmax(denovo_genotype_support.probabilities) + denovo_gen_prob = denovo_genotype_support.probabilities[idx] + denovo_genotype = denovo_genotype_support.genotypes[idx] denovo_alleles = [haplotype_labels[h.tobytes()] for h in denovo_genotype] denovo_alleles = np.sort(denovo_alleles) @@ -136,8 +141,8 @@ def generate_haplotypes(pos): model = CallingMCMC( ploidy=ploidy, haplotypes=haplotypes, inbreeding=inbreeding, steps=10500 ) - call_alleles, call_genotype_prob, call_phenotype_prob = ( - model.fit(reads, read_counts).burn(500).posterior().mode(phenotype=True) + call_alleles, call_genotype_prob, call_genotype_support_prob = ( + model.fit(reads, read_counts).burn(500).posterior().mode(genotype_support=True) ) # check results are equivalent @@ -145,7 +150,7 @@ def generate_haplotypes(pos): # the random seed values is required np.testing.assert_array_equal(call_alleles, denovo_alleles) np.testing.assert_allclose(call_genotype_prob, denovo_gen_prob, atol=0.01) - np.testing.assert_allclose(call_phenotype_prob, denovo_phen_prob, atol=0.01) + np.testing.assert_allclose(call_genotype_support_prob, denovo_phen_prob, atol=0.01) def test_CallingMCMC__zero_reads(): @@ -180,14 +185,14 @@ def test_CallingMCMC__zero_reads(): chains=n_chains, ) trace = model.fit(reads, read_counts) - _, call_genotype_prob, call_phenotype_prob = ( - trace.burn(n_burn).posterior().mode(phenotype=True) + _, call_genotype_prob, call_genotype_support_prob = ( + trace.burn(n_burn).posterior().mode(genotype_support=True) ) assert trace.genotypes.shape == (n_chains, n_steps, ploidy) assert trace.genotypes.max() < n_haps assert call_genotype_prob < 0.05 - assert call_phenotype_prob < 0.05 + assert call_genotype_support_prob < 0.05 def test_CallingMCMC__zero_snps(): @@ -213,15 +218,15 @@ def test_CallingMCMC__zero_snps(): chains=n_chains, ) trace = model.fit(reads, read_counts) - _, call_genotype_prob, call_phenotype_prob = ( - trace.burn(n_burn).posterior().mode(phenotype=True) + _, call_genotype_prob, call_genotype_support_prob = ( + trace.burn(n_burn).posterior().mode(genotype_support=True) ) assert trace.genotypes.shape == (n_chains, n_steps, ploidy) assert np.all(trace.genotypes == 0) assert np.all(np.isnan(trace.llks)) assert call_genotype_prob == 1 - assert call_phenotype_prob == 1 + assert call_genotype_support_prob == 1 def test_CallingMCMC__many_haplotype(): @@ -247,8 +252,8 @@ def test_CallingMCMC__many_haplotype(): chains=n_chains, ) trace = model.fit(reads, read_counts) - alleles, call_genotype_prob, call_phenotype_prob = ( - trace.burn(n_burn).posterior().mode(phenotype=True) + alleles, call_genotype_prob, call_genotype_support_prob = ( + trace.burn(n_burn).posterior().mode(genotype_support=True) ) # test dtype inherited from greedy_caller function assert trace.genotypes.dtype == np.int32 @@ -256,7 +261,7 @@ def test_CallingMCMC__many_haplotype(): assert np.all(trace.genotypes < n_haps) np.testing.assert_array_equal(true_alleles, alleles) assert call_genotype_prob > 0.1 - assert call_phenotype_prob > 0.1 + assert call_genotype_support_prob > 0.1 def test_PosteriorGenotypeAllelesDistribution__as_array(): @@ -305,39 +310,20 @@ def test_PosteriorGenotypeAllelesDistribution__mode(): np.testing.assert_array_equal(genotype, observed_genotypes[3]) assert genotype_prob == observed_probabilities[3] - genotype, genotype_prob, phenotype_prob = posterior.mode(phenotype=True) + genotype, genotype_prob, genotype_support_prob = posterior.mode( + genotype_support=True + ) np.testing.assert_array_equal(genotype, observed_genotypes[3]) assert genotype_prob == observed_probabilities[3] - assert phenotype_prob == observed_probabilities[1:4].sum() - - -def test_PosteriorGenotypeAllelesDistribution__allele_frequencies(): - observed_genotypes = np.array( - [ - [0, 0, 0, 0], - [0, 0, 0, 2], - [0, 0, 2, 2], - [0, 2, 2, 2], - [0, 0, 1, 2], - [0, 1, 2, 2], - ] - ) - observed_probabilities = np.array([0.05, 0.08, 0.22, 0.45, 0.05, 0.15]) - posterior = PosteriorGenotypeAllelesDistribution( - observed_genotypes, observed_probabilities - ) - actual_alleles, actual_freqs, actual_occur = posterior.allele_frequencies() - np.testing.assert_array_equal(actual_alleles, [0, 1, 2]) - np.testing.assert_array_almost_equal(actual_freqs, [0.395, 0.05, 0.555]) - np.testing.assert_array_almost_equal(actual_occur, [1.0, 0.2, 0.95]) + assert genotype_support_prob == observed_probabilities[1:4].sum() @pytest.mark.parametrize("threshold,expect", [(0.99, 0), (0.8, 0), (0.6, 1)]) def test_GenotypeAllelesMultiTrace__replicate_incongruence_1(threshold, expect): - g0 = [0, 0, 1, 2] # phenotype 1 - g1 = [0, 1, 1, 2] # phenotype 1 - g2 = [0, 1, 2, 2] # phenotype 1 - g3 = [0, 0, 2, 2] # phenotype 2 + g0 = [0, 0, 1, 2] # support 1 + g1 = [0, 1, 1, 2] # support 1 + g2 = [0, 1, 2, 2] # support 1 + g3 = [0, 0, 2, 2] # support 2 genotypes = np.array([g0, g1, g2, g3]) t0 = genotypes[[0, 1, 0, 1, 2, 0, 1, 1, 0, 1]] # 10:0 @@ -345,7 +331,7 @@ def test_GenotypeAllelesMultiTrace__replicate_incongruence_1(threshold, expect): t2 = genotypes[[0, 1, 0, 1, 2, 0, 1, 1, 0, 1]] # 10:0 t3 = genotypes[[3, 3, 3, 3, 3, 3, 3, 2, 1, 2]] # 3:7 trace = GenotypeAllelesMultiTrace( - genotypes=np.array([t0, t1, t2, t3]), llks=np.ones((4, 10)) + genotypes=np.array([t0, t1, t2, t3]), llks=np.ones((4, 10)), n_allele=3 ) actual = trace.replicate_incongruence(threshold) @@ -355,11 +341,11 @@ def test_GenotypeAllelesMultiTrace__replicate_incongruence_1(threshold, expect): @pytest.mark.parametrize("threshold,expect", [(0.99, 0), (0.8, 0), (0.6, 2)]) def test_GenotypeAllelesMultiTrace__replicate_incongruence_2(threshold, expect): - g0 = [0, 0, 1, 2] # phenotype 1 - g1 = [0, 1, 1, 2] # phenotype 1 - g2 = [0, 1, 2, 2] # phenotype 1 - g3 = [0, 0, 2, 3] # phenotype 2 - g4 = [0, 2, 3, 4] # phenotype 3 + g0 = [0, 0, 1, 2] # support 1 + g1 = [0, 1, 1, 2] # support 1 + g2 = [0, 1, 2, 2] # support 1 + g3 = [0, 0, 2, 3] # support 2 + g4 = [0, 2, 3, 4] # support 3 genotypes = np.array([g0, g1, g2, g3, g4]) t0 = genotypes[[3, 1, 0, 1, 2, 0, 1, 1, 0, 1]] # 9:1 @@ -367,7 +353,31 @@ def test_GenotypeAllelesMultiTrace__replicate_incongruence_2(threshold, expect): t2 = genotypes[[0, 3, 0, 1, 2, 0, 1, 1, 0, 1]] # 9:1 t3 = genotypes[[3, 3, 4, 4, 4, 3, 4, 4, 4, 4]] # 3:7 trace = GenotypeAllelesMultiTrace( - genotypes=np.array([t0, t1, t2, t3]), llks=np.ones((4, 10)) + genotypes=np.array([t0, t1, t2, t3]), llks=np.ones((4, 10)), n_allele=5 ) actual = trace.replicate_incongruence(threshold) assert actual == expect + + +def test_GenotypeAllelesMultiTrace__posterior_frequencies(): + observed_genotypes = np.array( + [ + [0, 0, 0, 0], + [0, 0, 0, 2], + [0, 0, 2, 2], + [0, 2, 2, 2], + [0, 0, 1, 2], + [0, 1, 2, 2], + ] + ) + observed_counts = np.array([5, 8, 22, 45, 5, 15]) + idx = np.repeat(np.arange(len(observed_counts)), observed_counts) + genotypes = observed_genotypes[idx][None, ...] + llks = np.ones(genotypes.shape[0:2]) + trace = GenotypeAllelesMultiTrace(genotypes, llks, 3) + actual_freqs, actual_counts, actual_occur = trace.posterior_frequencies() + np.testing.assert_array_almost_equal(actual_freqs, [0.395, 0.05, 0.555]) + np.testing.assert_array_almost_equal( + actual_counts, [4 * 0.395, 4 * 0.05, 4 * 0.555] + ) + np.testing.assert_array_almost_equal(actual_occur, [1.0, 0.2, 0.95]) diff --git a/mchap/tests/test_calling/test_calling_exact.py b/mchap/tests/test_calling/test_calling_exact.py index b1bb7693..c97c7c62 100644 --- a/mchap/tests/test_calling/test_calling_exact.py +++ b/mchap/tests/test_calling/test_calling_exact.py @@ -161,7 +161,7 @@ def test_genotype_posteriors(): actual = exact.genotype_posteriors( log_likelihoods, ploidy, n_alleles, inbreeding=inbreeding ) - np.testing.assert_almost_equal(expect, actual) + np.testing.assert_almost_equal(expect, actual, decimal=6) def test_alternate_dosage_posteriors(): @@ -260,22 +260,22 @@ def test_call_posterior_mode(): mode_genotype, mode_llk, mode_genotype_prob, - mode_phenotype_prob, + mode_support_prob, ) = exact.posterior_mode( reads, 4, haplotypes, read_counts=counts, inbreeding=inbreeding, - return_phenotype_prob=True, + return_support_prob=True, ) np.testing.assert_array_equal(genotype, mode_genotype) np.testing.assert_almost_equal(llks[idx_0], mode_llk, 5) np.testing.assert_almost_equal(probs[idx_0], mode_genotype_prob, 5) - np.testing.assert_almost_equal(phen_probs.sum(), mode_phenotype_prob, 5) + np.testing.assert_almost_equal(phen_probs.sum(), mode_support_prob, 5) np.testing.assert_almost_equal( - np.sum(probs[[idx_0, idx_1, idx_2]]), mode_phenotype_prob, 5 + np.sum(probs[[idx_0, idx_1, idx_2]]), mode_support_prob, 5 ) @@ -319,7 +319,7 @@ def test_call_posterior_mode__fuzz( inbreeding=inbreeding, frequencies=prior_frequencies, ) - freqs, occur = exact.posterior_allele_frequencies( + freqs, counts, occur = exact.posterior_allele_frequencies( post, ploidy=ploidy, n_alleles=n_haps ) mode = np.argmax(post) @@ -331,7 +331,7 @@ def test_call_posterior_mode__fuzz( ploidy=ploidy, haplotypes=haplotypes, inbreeding=inbreeding, - return_phenotype_prob=False, + return_support_prob=False, return_posterior_frequencies=True, return_posterior_occurrence=True, frequencies=prior_frequencies, @@ -341,6 +341,7 @@ def test_call_posterior_mode__fuzz( np.testing.assert_almost_equal(llks[mode], mode_llk, 5) np.testing.assert_almost_equal(post[mode], mode_post, 5) np.testing.assert_array_almost_equal(freqs, mean_freqs, 5) + np.testing.assert_array_almost_equal(counts, mean_freqs * ploidy, 5) np.testing.assert_array_almost_equal(occur, mean_occur, 5) @@ -375,7 +376,7 @@ def test_call_posterior_mode__flat_frequencies( ploidy=ploidy, haplotypes=haplotypes, inbreeding=inbreeding, - return_phenotype_prob=False, + return_support_prob=False, return_posterior_frequencies=True, return_posterior_occurrence=True, frequencies=None, @@ -392,7 +393,7 @@ def test_call_posterior_mode__flat_frequencies( ploidy=ploidy, haplotypes=haplotypes, inbreeding=inbreeding, - return_phenotype_prob=False, + return_support_prob=False, return_posterior_frequencies=True, return_posterior_occurrence=True, frequencies=np.ones(n_haps) / n_haps, diff --git a/mchap/tests/test_docs.py b/mchap/tests/test_docs.py index d1d83175..37cd475f 100644 --- a/mchap/tests/test_docs.py +++ b/mchap/tests/test_docs.py @@ -4,7 +4,9 @@ import subprocess -@pytest.mark.skipif(sys.version_info != (3, 9), reason="argparse formatting changed") +@pytest.mark.skipif( + sys.version_info[0:2] < (3, 11), reason="argparse formatting changed" +) @pytest.mark.parametrize( "subtool", [ diff --git a/mchap/tests/test_io/data/mock.input.frequencies.vcf b/mchap/tests/test_io/data/mock.input.frequencies.vcf index a5564e55..713b6b80 100644 --- a/mchap/tests/test_io/data/mock.input.frequencies.vcf +++ b/mchap/tests/test_io/data/mock.input.frequencies.vcf @@ -20,14 +20,14 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 diff --git a/mchap/tests/test_io/data/simple.output.assemble.vcf b/mchap/tests/test_io/data/simple.output.assemble.vcf index 72e9e872..91f2c39e 100644 --- a/mchap/tests/test_io/data/simple.output.assemble.vcf +++ b/mchap/tests/test_io/data/simple.output.assemble.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -21,17 +23,17 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=39;RCOUNT=60;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/1/2:7:8:13:20:40:0:0:0.785:0.835:0 0/0/1/1:4:5:13:20:40:0:0:0.636:0.678:0 0/0/0/2:4:5:13:20:40:0:0:0.619:0.698:0 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=72;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=42;RCOUNT=72;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/2:6:8:14:24:28:0:0:0.72:0.84:0 0/0/1/2:7:11:14:24:28:0:0:0.815:0.929:0 0/1/1/3:7:13:14:24:28:0:0:0.801:0.949:0 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=39;RCOUNT=60;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/1/2:7:8:13:20:40:0:0:0.785:0.835:0 0/0/1/1:4:5:13:20:40:0:0:0.636:0.678:0 0/0/0/2:4:5:13:20:40:0:0:0.619:0.698:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=72;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=42;RCOUNT=72;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/2:6:8:14:24:28:0:0:0.72:0.84:0 0/0/1/2:7:11:14:24:28:0:0:0.815:0.929:0 0/1/1/3:7:13:14:24:28:0:0:0.801:0.949:0 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 diff --git a/mchap/tests/test_io/data/simple.output.call-exact.vcf b/mchap/tests/test_io/data/simple.output.call-exact.vcf index b7748e9c..9255e615 100644 --- a/mchap/tests/test_io/data/simple.output.call-exact.vcf +++ b/mchap/tests/test_io/data/simple.output.call-exact.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -21,17 +23,17 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=39;RCOUNT=60;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/1/2:12:60:13:20:40:0:0:0.941:1:. 0/0/1/1:11:24:13:20:40:0:0:0.926:0.996:. 0/0/0/2:10:22:13:20:40:0:0:0.896:0.994:. -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=72;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:24:0:0:.:1:1:. 0/0/0/0:60:60:.:24:0:0:.:1:1:. 0/0/0/0:60:60:.:24:0:0:.:1:1:. -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=42;RCOUNT=72;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/2:7:14:14:24:28:0:0:0.812:0.962:. 0/0/1/2:9:19:14:24:28:0:0:0.876:0.986:. 0/1/1/3:8:21:14:24:28:0:0:0.827:0.992:. -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0:60:60:.:0:0:0:.:1:1:. +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=39;RCOUNT=60;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/1/2:12:60:13:20:40:0:0:0.941:1:. 0/0/1/1:11:24:13:20:40:0:0:0.926:0.996:. 0/0/0/2:10:22:13:20:40:0:0:0.896:0.994:. +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=72;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:24:0:0:.:1:1:. 0/0/0/0:60:60:.:24:0:0:.:1:1:. 0/0/0/0:60:60:.:24:0:0:.:1:1:. +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=42;RCOUNT=72;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/2:7:14:14:24:28:0:0:0.812:0.962:. 0/0/1/2:9:19:14:24:28:0:0:0.876:0.986:. 0/1/1/3:8:21:14:24:28:0:0:0.827:0.992:. +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0:60:60:.:0:0:0:.:1:1:. diff --git a/mchap/tests/test_io/data/simple.output.call.vcf b/mchap/tests/test_io/data/simple.output.call.vcf index 9d354705..14380350 100644 --- a/mchap/tests/test_io/data/simple.output.call.vcf +++ b/mchap/tests/test_io/data/simple.output.call.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -21,17 +23,17 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=39;RCOUNT=60;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/1/2:13:60:13:20:40:0:0:0.952:1:0 0/0/1/1:11:26:13:20:40:0:0:0.928:0.998:0 0/0/0/2:10:19:13:20:40:0:0:0.894:0.989:0 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=72;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=42;RCOUNT=72;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/2:7:15:14:24:28:0:0:0.821:0.969:0 0/0/1/2:10:21:14:24:28:0:0:0.9:0.991:0 0/1/1/3:7:21:14:24:28:0:0:0.806:0.992:0 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=39;RCOUNT=60;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/1/2:13:60:13:20:40:0:0:0.952:1:0 0/0/1/1:11:26:13:20:40:0:0:0.928:0.998:0 0/0/0/2:10:19:13:20:40:0:0:0.894:0.989:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=72;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=42;RCOUNT=72;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/2:7:15:14:24:28:0:0:0.821:0.969:0 0/0/1/2:10:21:14:24:28:0:0:0.9:0.991:0 0/1/1/3:7:21:14:24:28:0:0:0.806:0.992:0 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 diff --git a/mchap/tests/test_io/data/simple.output.deep.assemble.pools.vcf b/mchap/tests/test_io/data/simple.output.deep.assemble.pools.vcf index 3a9d9352..0fa0c2e9 100644 --- a/mchap/tests/test_io/data/simple.output.deep.assemble.pools.vcf +++ b/mchap/tests/test_io/data/simple.output.deep.assemble.pools.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -21,17 +23,17 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT POOL1 POOL2 POOL3 POOL13 POOL123 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=22;AC=6,4;NS=5;DP=1066;RCOUNT=1600;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/1/2:60:60:133:200:400:0:0:1:1:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0 0/0/0/2:60:60:133:200:400:0:0:1:1:0 0/0/1/2:60:60:267:400:800:0:0:1:1:0 0/0/0/1/1/2:23:60:400:600:1200:0:0:0.995:1:0 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=22;AC=.;NS=5;DP=.;RCOUNT=1920;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:480:0:0:.:1:1:0 0/0/0/0/0/0:60:60:.:720:0:0:.:1:1:0 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=22;AC=5,4,3;NS=5;DP=1120;RCOUNT=1920;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/2:60:60:140:240:280:0:0:1:1:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0 0/1/1/3:60:60:140:240:280:0:0:1:1:0 0/1/2/3:3:3:280:480:560:0:0:0.5:0.5:2 0/0/0/1/2/3:60:60:420:720:840:0:0:1:1:0 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=22;AC=.;NS=5;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0/0/0:60:60:.:0:0:0:.:1:1:0 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=22;UAN=3;AC=6,4;NS=5;MCI=0;DP=1066;RCOUNT=1600;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/1/2:60:60:133:200:400:0:0:1:1:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0 0/0/0/2:60:60:133:200:400:0:0:1:1:0 0/0/1/2:60:60:267:400:800:0:0:1:1:0 0/0/0/1/1/2:23:60:400:600:1200:0:0:0.995:1:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=22;UAN=1;AC=.;NS=5;MCI=0;DP=.;RCOUNT=1920;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:480:0:0:.:1:1:0 0/0/0/0/0/0:60:60:.:720:0:0:.:1:1:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=22;UAN=4;AC=5,4,3;NS=5;MCI=1;DP=1120;RCOUNT=1920;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/2:60:60:140:240:280:0:0:1:1:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0 0/1/1/3:60:60:140:240:280:0:0:1:1:0 0/1/2/3:3:3:280:480:560:0:0:0.5:0.5:2 0/0/0/1/2/3:60:60:420:720:840:0:0:1:1:0 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=22;UAN=1;AC=.;NS=5;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0/0/0:60:60:.:0:0:0:.:1:1:0 diff --git a/mchap/tests/test_io/data/simple.output.deep.assemble.vcf b/mchap/tests/test_io/data/simple.output.deep.assemble.vcf index 98c481b6..19cd6c76 100644 --- a/mchap/tests/test_io/data/simple.output.deep.assemble.vcf +++ b/mchap/tests/test_io/data/simple.output.deep.assemble.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -21,17 +23,17 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=399;RCOUNT=600;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/1/2:60:60:133:200:400:0:0:1:1:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0 0/0/0/2:60:60:133:200:400:0:0:1:1:0 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=720;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=420;RCOUNT=720;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/2:60:60:140:240:280:0:0:1:1:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0 0/1/1/3:60:60:140:240:280:0:0:1:1:0 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=399;RCOUNT=600;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/1/2:60:60:133:200:400:0:0:1:1:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0 0/0/0/2:60:60:133:200:400:0:0:1:1:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=720;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=420;RCOUNT=720;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/2:60:60:140:240:280:0:0:1:1:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0 0/1/1/3:60:60:140:240:280:0:0:1:1:0 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 diff --git a/mchap/tests/test_io/data/simple.output.deep.call-exact.pools.vcf b/mchap/tests/test_io/data/simple.output.deep.call-exact.pools.vcf index 4fba4221..e615b023 100644 --- a/mchap/tests/test_io/data/simple.output.deep.call-exact.pools.vcf +++ b/mchap/tests/test_io/data/simple.output.deep.call-exact.pools.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -21,17 +23,17 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT POOL1 POOL2 POOL3 POOL13 POOL123 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=22;AC=6,4;NS=5;DP=1066;RCOUNT=1600;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/1/2:60:60:133:200:400:0:0:1:1:. 0/0/1/1:60:60:133:200:400:0:0:1:1:. 0/0/0/2:60:60:133:200:400:0:0:1:1:. 0/0/1/2:60:60:267:400:800:0:0:1:1:. 0/0/0/1/1/2:17:60:400:600:1200:0:0:0.98:1:. -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=22;AC=.;NS=5;DP=.;RCOUNT=1920;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:240:0:0:.:1:1:. 0/0/0/0:60:60:.:240:0:0:.:1:1:. 0/0/0/0:60:60:.:240:0:0:.:1:1:. 0/0/0/0:60:60:.:480:0:0:.:1:1:. 0/0/0/0/0/0:60:60:.:720:0:0:.:1:1:. -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=22;AC=5,4,3;NS=5;DP=1120;RCOUNT=1920;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/2:60:60:140:240:280:0:0:1:1:. 0/0/1/2:60:60:140:240:280:0:0:1:1:. 0/1/1/3:60:60:140:240:280:0:0:1:1:. 0/1/2/3:60:60:280:480:560:0:0:1:1:. 0/0/0/1/2/3:60:60:420:720:840:0:0:1:1:. -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=22;AC=.;NS=5;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0/0/0:60:60:.:0:0:0:.:1:1:. +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=22;UAN=3;AC=6,4;NS=5;MCI=0;DP=1066;RCOUNT=1600;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/1/2:60:60:133:200:400:0:0:1:1:. 0/0/1/1:60:60:133:200:400:0:0:1:1:. 0/0/0/2:60:60:133:200:400:0:0:1:1:. 0/0/1/2:60:60:267:400:800:0:0:1:1:. 0/0/0/1/1/2:17:60:400:600:1200:0:0:0.98:1:. +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=22;UAN=1;AC=.;NS=5;MCI=0;DP=.;RCOUNT=1920;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:240:0:0:.:1:1:. 0/0/0/0:60:60:.:240:0:0:.:1:1:. 0/0/0/0:60:60:.:240:0:0:.:1:1:. 0/0/0/0:60:60:.:480:0:0:.:1:1:. 0/0/0/0/0/0:60:60:.:720:0:0:.:1:1:. +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=22;UAN=4;AC=5,4,3;NS=5;MCI=0;DP=1120;RCOUNT=1920;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/2:60:60:140:240:280:0:0:1:1:. 0/0/1/2:60:60:140:240:280:0:0:1:1:. 0/1/1/3:60:60:140:240:280:0:0:1:1:. 0/1/2/3:60:60:280:480:560:0:0:1:1:. 0/0/0/1/2/3:60:60:420:720:840:0:0:1:1:. +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=22;UAN=1;AC=.;NS=5;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0/0/0:60:60:.:0:0:0:.:1:1:. diff --git a/mchap/tests/test_io/data/simple.output.deep.call.pools.vcf b/mchap/tests/test_io/data/simple.output.deep.call.pools.vcf index faba77a2..5a3a45d5 100644 --- a/mchap/tests/test_io/data/simple.output.deep.call.pools.vcf +++ b/mchap/tests/test_io/data/simple.output.deep.call.pools.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -21,17 +23,17 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT POOL1 POOL2 POOL3 POOL13 POOL123 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=22;AC=6,4;NS=5;DP=1066;RCOUNT=1600;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/1/2:60:60:133:200:400:0:0:1:1:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0 0/0/0/2:60:60:133:200:400:0:0:1:1:0 0/0/1/2:60:60:267:400:800:0:0:1:1:0 0/0/0/1/1/2:18:60:400:600:1200:0:0:0.982:1:0 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=22;AC=.;NS=5;DP=.;RCOUNT=1920;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:480:0:0:.:1:1:0 0/0/0/0/0/0:60:60:.:720:0:0:.:1:1:0 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=22;AC=5,4,3;NS=5;DP=1120;RCOUNT=1920;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/2:60:60:140:240:280:0:0:1:1:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0 0/1/1/3:60:60:140:240:280:0:0:1:1:0 0/1/2/3:60:60:280:480:560:0:0:1:1:0 0/0/0/1/2/3:60:60:420:720:840:0:0:1:1:0 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=22;AC=.;NS=5;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0/0/0:60:60:.:0:0:0:.:1:1:0 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=22;UAN=3;AC=6,4;NS=5;MCI=0;DP=1066;RCOUNT=1600;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/1/2:60:60:133:200:400:0:0:1:1:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0 0/0/0/2:60:60:133:200:400:0:0:1:1:0 0/0/1/2:60:60:267:400:800:0:0:1:1:0 0/0/0/1/1/2:18:60:400:600:1200:0:0:0.982:1:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=22;UAN=1;AC=.;NS=5;MCI=0;DP=.;RCOUNT=1920;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:480:0:0:.:1:1:0 0/0/0/0/0/0:60:60:.:720:0:0:.:1:1:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=22;UAN=4;AC=5,4,3;NS=5;MCI=0;DP=1120;RCOUNT=1920;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/2:60:60:140:240:280:0:0:1:1:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0 0/1/1/3:60:60:140:240:280:0:0:1:1:0 0/1/2/3:60:60:280:480:560:0:0:1:1:0 0/0/0/1/2/3:60:60:420:720:840:0:0:1:1:0 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=22;UAN=1;AC=.;NS=5;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0/0/0:60:60:.:0:0:0:.:1:1:0 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.atomize.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.atomize.vcf new file mode 100644 index 00000000..3926e26e --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.atomize.vcf @@ -0,0 +1,22 @@ +##fileformat=VCFv4.3 +##fileDate=20240512 +##source=mchap v0.9.x +##commandline="mchap atomize simple.output.mixed_depth.assemble.vcf" +##contig= +##contig= +##contig= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 7 CHR1_05_25_SNV1 A C . . AC=2;ACP=.,.;DP=96;PS=6 GT:GQ:PQ:DP:DS 0|0|0|1:.:8:8:. 0|0|0|0:.:60:80:. 0|0|0|1:.:5:8:. +CHR1 16 CHR1_05_25_SNV2 A G . . AC=5;ACP=.,.;DP=192;PS=6 GT:GQ:PQ:DP:DS 0|0|1|1:.:8:16:. 0|0|1|1:.:60:160:. 0|0|0|1:.:5:16:. +CHR1 23 CHR1_05_25_SNV3 A T,C . . AC=3,2;ACP=.,.,.;DP=192;PS=6 GT:GQ:PQ:DP:DS 0|0|1|2:.:8:16:.,. 0|0|1|1:.:60:160:.,. 0|0|0|2:.:5:16:.,. +CHR2 15 CHR2_10_30_SNV1 A T . . AC=1;ACP=.,.;DP=144;PS=11 GT:GQ:PQ:DP:DS 0|0|0|0:.:8:12:. 0|0|0|0:.:60:120:. 0|0|0|1:.:13:12:. +CHR2 20 CHR2_10_30_SNV2 A G,T . . AC=4,2;ACP=.,.,.;DP=192;PS=11 GT:GQ:PQ:DP:DS 0|0|0|2:.:8:16:.,. 0|0|1|2:.:60:160:.,. 0|1|1|1:.:13:16:.,. diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.counts.atomize.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.counts.atomize.vcf new file mode 100644 index 00000000..9eca2a55 --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.counts.atomize.vcf @@ -0,0 +1,22 @@ +##fileformat=VCFv4.3 +##fileDate=20240512 +##source=mchap v0.9.x +##commandline="mchap atomize simple.output.mixed_depth.assemble.counts.vcf" +##contig= +##contig= +##contig= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 7 CHR1_05_25_SNV1 A C . . AC=2;ACP=9.767,2.233;DP=.;PS=6 GT:GQ:PQ:DP:DS 0|0|0|1:.:8:.:1.065 0|0|0|0:.:60:.:0 0|0|0|1:.:5:.:1.169 +CHR1 16 CHR1_05_25_SNV2 A G . . AC=5;ACP=6.687,5.313;DP=.;PS=6 GT:GQ:PQ:DP:DS 0|0|1|1:.:8:.:2.138 0|0|1|1:.:60:.:2 0|0|0|1:.:5:.:1.175 +CHR1 23 CHR1_05_25_SNV3 A T,C . . AC=3,2;ACP=6.687,3.08,2.233;DP=.;PS=6 GT:GQ:PQ:DP:DS 0|0|1|2:.:8:.:1.073,1.065 0|0|1|1:.:60:.:2,0 0|0|0|2:.:5:.:0.006,1.169 +CHR2 15 CHR2_10_30_SNV1 A T . . AC=1;ACP=10.866,1.134;DP=.;PS=11 GT:GQ:PQ:DP:DS 0|0|0|0:.:8:.:0.026 0|0|0|0:.:60:.:0 0|0|0|1:.:13:.:1.108 +CHR2 20 CHR2_10_30_SNV2 A G,T . . AC=4,2;ACP=5.864,3.967,2.17;DP=.;PS=11 GT:GQ:PQ:DP:DS 0|0|0|2:.:8:.:0.041,1.155 0|0|1|2:.:60:.:1,1 0|1|1|1:.:13:.:2.925,0.015 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.counts.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.counts.vcf new file mode 100644 index 00000000..596e6ea2 --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.counts.vcf @@ -0,0 +1,41 @@ +##fileformat=VCFv4.3 +##fileDate=20220406 +##source=mchap v0.9.3 +##phasing=None +##commandline="mchap assemble --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --targets simple.bed.gz --variants simple.vcf.gz --reference simple.fasta --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11 --report ACP" +##randomseed=11 +##contig= +##contig= +##contig= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;ACP=6.396,3.035,2.101 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP 0/0/1/2:7:8:13:20:40:0:0:0.785:0.835:0:1.785,1.029,1.021 0/0/1/1:60:60:133:200:400:0:0:1:1:0:2,2,0 0/0/0/2:4:5:13:20:40:0:0:0.619:0.698:0:2.611,0.006,1.08 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;ACP=12 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:4 0/0/0/0:60:60:.:240:0:0:.:1:1:0:4 0/0/0/0:60:60:.:24:0:0:.:1:1:0:4 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;ACP=5.77,2.816,2.135,1.122 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP 0/0/0/2:6:8:14:24:28:0:0:0.72:0.84:0:2.72,0.015,1.12,0.025 0/0/1/2:60:60:140:240:280:0:0:1:1:0:2,1,1,0 0/1/1/3:7:13:14:24:28:0:0:0.801:0.949:0:1.05,1.801,0.015,1.098 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;ACP=12 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:4 0/0/0/0:60:60:.:0:0:0:.:1:1:0:4 0/0/0/0:60:60:.:0:0:0:.:1:1:0:4 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.frequencies.atomize.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.frequencies.atomize.vcf new file mode 100644 index 00000000..44ddc354 --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.frequencies.atomize.vcf @@ -0,0 +1,22 @@ +##fileformat=VCFv4.3 +##fileDate=20240512 +##source=mchap v0.9.x +##commandline="mchap atomize simple.output.mixed_depth.assemble.frequencies.vcf" +##contig= +##contig= +##contig= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 7 CHR1_05_25_SNV1 A C . . AC=2;ACP=9.768,2.232;DP=.;PS=6 GT:GQ:PQ:DP:DS 0|0|0|1:.:8:.:1.065 0|0|0|0:.:60:.:0 0|0|0|1:.:5:.:1.168 +CHR1 16 CHR1_05_25_SNV2 A G . . AC=5;ACP=6.686,5.314;DP=.;PS=6 GT:GQ:PQ:DP:DS 0|0|1|1:.:8:.:2.138 0|0|1|1:.:60:.:2 0|0|0|1:.:5:.:1.176 +CHR1 23 CHR1_05_25_SNV3 A T,C . . AC=3,2;ACP=6.686,3.082,2.232;DP=.;PS=6 GT:GQ:PQ:DP:DS 0|0|1|2:.:8:.:1.073,1.065 0|0|1|1:.:60:.:2,0 0|0|0|2:.:5:.:0.009,1.168 +CHR2 15 CHR2_10_30_SNV1 A T . . AC=1;ACP=10.868,1.132;DP=.;PS=11 GT:GQ:PQ:DP:DS 0|0|0|0:.:8:.:0.025 0|0|0|0:.:60:.:0 0|0|0|1:.:13:.:1.107 +CHR2 20 CHR2_10_30_SNV2 A G,T . . AC=4,2;ACP=5.863,3.966,2.171;DP=.;PS=11 GT:GQ:PQ:DP:DS 0|0|0|2:.:8:.:0.041,1.155 0|0|1|2:.:60:.:1,1 0|1|1|1:.:13:.:2.925,0.016 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.frequencies.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.frequencies.vcf index 013632f1..7c2a9331 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.frequencies.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.frequencies.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -22,18 +24,18 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFP=0.533,0.253,0.175 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/1/2:7:8:13:20:40:0:0:0.785:0.835:0:0.446,0.257,0.255 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0.5,0.5,0 0/0/0/2:4:5:13:20:40:0:0:0.619:0.698:0:0.653,0.002,0.27 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFP=0.481,0.235,0.178,0.093 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/2:6:8:14:24:28:0:0:0.72:0.84:0:0.68,0.004,0.28,0.006 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0.5,0.25,0.25,0 0/1/1/3:7:13:14:24:28:0:0:0.801:0.949:0:0.262,0.45,0.004,0.274 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFP=0.533,0.253,0.175 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/1/2:7:8:13:20:40:0:0:0.785:0.835:0:0.446,0.257,0.255 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0.5,0.5,0 0/0/0/2:4:5:13:20:40:0:0:0.619:0.698:0:0.653,0.002,0.27 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFP=0.481,0.235,0.178,0.094 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/2:6:8:14:24:28:0:0:0.72:0.84:0:0.68,0.004,0.28,0.006 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0.5,0.25,0.25,0 0/1/1/3:7:13:14:24:28:0:0:0.801:0.949:0:0.262,0.45,0.004,0.274 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.occurrence.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.occurrence.vcf index 2fe481bc..d176985e 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.occurrence.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.occurrence.vcf @@ -2,7 +2,7 @@ ##fileDate=20220406 ##source=mchap v0.9.3 ##phasing=None -##commandline="mchap assemble --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --targets simple.bed.gz --variants simple.vcf.gz --reference simple.fasta --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11 --report AOP" +##commandline="mchap assemble --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --targets simple.bed.gz --variants simple.vcf.gz --reference simple.fasta --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11 --report AOP AOPSUM" ##randomseed=11 ##contig= ##contig= @@ -11,29 +11,32 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AOP=1,1,1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AOP 0/0/1/2:7:8:13:20:40:0:0:0.785:0.835:0:1,1,1 0/0/1/1:60:60:133:200:400:0:0:1:1:0:1,1,0 0/0/0/2:4:5:13:20:40:0:0:0.619:0.698:0:1,0.006,1 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AOP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AOP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AOP=1,1,1,1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AOP 0/0/0/2:6:8:14:24:28:0:0:0.72:0.84:0:1,0.015,1,0.025 0/0/1/2:60:60:140:240:280:0:0:1:1:0:1,1,1,0 0/1/1/3:7:13:14:24:28:0:0:0.801:0.949:0:1,1,0.015,1 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AOP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AOP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AOP=1,1,1;AOPSUM=3,2.006,2 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AOP 0/0/1/2:7:8:13:20:40:0:0:0.785:0.835:0:1,1,1 0/0/1/1:60:60:133:200:400:0:0:1:1:0:1,1,0 0/0/0/2:4:5:13:20:40:0:0:0.619:0.698:0:1,0.006,1 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AOP=1;AOPSUM=3 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AOP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AOP=1,1,1,1;AOPSUM=3,2.015,2.015,1.025 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AOP 0/0/0/2:6:8:14:24:28:0:0:0.72:0.84:0:1,0.015,1,0.025 0/0/1/2:60:60:140:240:280:0:0:1:1:0:1,1,1,0 0/1/1/3:7:13:14:24:28:0:0:0.801:0.949:0:1,1,0.015,1 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AOP=1;AOPSUM=3 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AOP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.pool.frequencies.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.pool.frequencies.vcf index b3659997..23bb0225 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.pool.frequencies.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.pool.frequencies.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -22,18 +24,18 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT POOL -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA ACAAAAAAAAGAAAAAACAA,AAAAAAAAAAGAAAAAATAA . PASS AN=4;AC=1,1;NS=1;DP=160;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFP=0.5,0.25,0.25 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/1/2:60:60:160:240:480:0:0:1:1:0:0.5,0.25,0.25 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=4;AC=.;NS=1;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:288:0:0:.:1:1:0:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAATAAAAAAAAAA,AAAAAAAAAGAAAAAAAAAA . PASS AN=4;AC=1,1;NS=1;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFP=0.5,0.25,0.25 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/1/2:60:60:168:288:336:3:0.009:1:1:0:0.5,0.25,0.25 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=4;AC=.;NS=1;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA ACAAAAAAAAGAAAAAACAA,AAAAAAAAAAGAAAAAATAA . PASS AN=4;UAN=3;AC=1,1;NS=1;MCI=0;DP=160;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFP=0.5,0.25,0.25 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/1/2:60:60:160:240:480:0:0:1:1:0:0.5,0.25,0.25 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=4;UAN=1;AC=.;NS=1;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:288:0:0:.:1:1:0:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAATAAAAAAAAAA,AAAAAAAAAGAAAAAAAAAA . PASS AN=4;UAN=3;AC=1,1;NS=1;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFP=0.5,0.25,0.25 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/1/2:60:60:168:288:336:3:0.009:1:1:0:0.5,0.25,0.25 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=4;UAN=1;AC=.;NS=1;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.vcf index 17189f43..a5b06f7d 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.assemble.vcf @@ -2,7 +2,7 @@ ##fileDate=20210420 ##source=mchap v0.9.3 ##phasing=None -##commandline="mchap assemble --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --targets simple.bed.gz --variants simple.vcf.gz --reference simple.fasta --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11" +##commandline="mchap assemble --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --targets simple.bed.gz --variants simple.vcf.gz --reference simple.fasta --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11 --report SNVDP" ##randomseed=11 ##contig= ##contig= @@ -11,27 +11,31 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= +##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/1/2:7:8:13:20:40:0:0:0.785:0.835:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0 0/0/0/2:4:5:13:20:40:0:0:0.619:0.698:0 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/2:6:8:14:24:28:0:0:0.72:0.84:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0 0/1/1/3:7:13:14:24:28:0:0:0.801:0.949:0 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;SNVDP=96,192,192 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:SNVDP 0/0/1/2:7:8:13:20:40:0:0:0.785:0.835:0:8,16,16 0/0/1/1:60:60:133:200:400:0:0:1:1:0:80,160,160 0/0/0/2:4:5:13:20:40:0:0:0.619:0.698:0:8,16,16 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;SNVDP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:SNVDP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:. 0/0/0/0:60:60:.:240:0:0:.:1:1:0:. 0/0/0/0:60:60:.:24:0:0:.:1:1:0:. +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;SNVDP=144,192 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:SNVDP 0/0/0/2:6:8:14:24:28:0:0:0.72:0.84:0:12,16 0/0/1/2:60:60:140:240:280:0:0:1:1:0:120,160 0/1/1/3:7:13:14:24:28:0:0:0.801:0.949:0:12,16 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;SNVDP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:SNVDP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:. 0/0/0/0:60:60:.:0:0:0:.:1:1:0:. 0/0/0/0:60:60:.:0:0:0:.:1:1:0:. diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.counts.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.counts.vcf new file mode 100644 index 00000000..5db1d877 --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.counts.vcf @@ -0,0 +1,41 @@ +##fileformat=VCFv4.3 +##fileDate=20220406 +##source=mchap v0.9.3 +##phasing=None +##commandline="mchap call-exact --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --haplotypes simple.output.mixed_depth.assemble.vcf --report ACP" +##randomseed=None +##contig= +##contig= +##contig= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;ACP=6.837,3.036,2.128 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP 0/0/1/2:12:60:13:20:40:0:0:0.941:1:.:1.941,1.03,1.029 0/0/1/1:60:60:133:200:400:0:0:1:1:.:2,2,0 0/0/0/2:10:22:13:20:40:0:0:0.896:0.994:.:2.896,0.006,1.098 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;ACP=12 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:4 0/0/0/0:60:60:.:240:0:0:.:1:1:.:4 0/0/0/0:60:60:.:24:0:0:.:1:1:.:4 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;ACP=5.873,2.846,2.158,1.123 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP 0/0/0/2:7:14:14:24:28:0:0:0.812:0.962:.:2.812,0.019,1.151,0.019 0/0/1/2:60:60:140:240:280:0:0:1:1:.:2,1,1,0 0/1/1/3:8:21:14:24:28:0:0:0.827:0.992:.:1.061,1.827,0.008,1.104 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;ACP=12 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:4 0/0/0/0:60:60:.:0:0:0:.:1:1:.:4 0/0/0/0:60:60:.:0:0:0:.:1:1:.:4 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.posteriors.skiprare.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.posteriors.skiprare.vcf index 549aace9..e4b134d6 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.posteriors.skiprare.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.posteriors.skiprare.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -22,21 +24,21 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=8,4;REFMASKED;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFP=0,0.721,0.279 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP:GP 1/1/2/2:3:60:13:20:40:16:0.4:0.503:1:.:0,0.622,0.378:0,0,0,0,0,0,0,0,0.493,0,0,0.503,0,0.004,0 1/1/1/1:60:60:133:200:400:160:0.4:1:1:.:0,1,0:0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 1/1/2/2:6:60:13:20:40:24:0.6:0.738:1:.:0,0.541,0.459:0,0,0,0,0,0,0,0,0.214,0,0,0.738,0,0.048,0 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP:GP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1:1 0/0/0/0:60:60:.:240:0:0:.:1:1:.:1:1 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA . PASS AN=12;AC=4,2;NS=3;DP=192;RCOUNT=288;END=30;NVAR=1;SNVPOS=10;AFP=0.517,0.311,0.173 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP:GP 0/0/0/2:11:20:16:24:16:0:0:0.926:0.989:.:0.732,0.003,0.266:0,0,0,0,0,0.926,0.011,0,0,0.063,0,0,0,0,0 0/0/1/2:60:60:160:240:160:0:0:1:1:.:0.5,0.25,0.25:0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 0/1/1/1:5:19:16:24:16:0:0:0.716:0.987:.:0.318,0.679,0.003:0,0,0.271,0.716,0,0,0,0.013,0,0,0,0,0,0,0 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP:GP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1:1 -CHR1 31 CHR1_30_50_MASK AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;AC=.;REFMASKED;NS=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFP=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP:GP ./././.:.:.:.:24:0:0:.:.:.:.:.:. ./././.:.:.:.:240:0:0:.:.:.:.:.:. ./././.:.:.:.:24:0:0:.:.:.:.:.:. -CHR1 6 CHR1_05_25_ZERO AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;AC=.;REFMASKED;NS=0;DP=.;RCOUNT=240;END=25;NVAR=0;SNVPOS=.;AFP=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP:GP ./././.:.:.:.:20:0:0:.:.:.:.:.:. ./././.:.:.:.:200:0:0:.:.:.:.:.:. ./././.:.:.:.:20:0:0:.:.:.:.:.:. +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=2;AC=8,4;REFMASKED;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFP=0,0.721,0.279 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:GP 1/1/2/2:3:60:13:20:40:16:0.4:0.503:1:.:0,0.622,0.378:0,0,0,0,0,0,0,0,0.493,0,0,0.503,0,0.004,0 1/1/1/1:60:60:133:200:400:160:0.4:1:1:.:0,1,0:0,0,0,0,1,0,0,0,0,0,0,0,0,0,0 1/1/2/2:6:60:13:20:40:24:0.6:0.738:1:.:0,0.541,0.459:0,0,0,0,0,0,0,0,0.214,0,0,0.738,0,0.048,0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:GP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1:1 0/0/0/0:60:60:.:240:0:0:.:1:1:.:1:1 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA . PASS AN=12;UAN=3;AC=4,2;NS=3;MCI=0;DP=192;RCOUNT=288;END=30;NVAR=1;SNVPOS=10;AFP=0.517,0.31,0.173 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:GP 0/0/0/2:11:20:16:24:16:0:0:0.926:0.989:.:0.732,0.003,0.266:0,0,0,0,0,0.926,0.011,0,0,0.063,0,0,0,0,0 0/0/1/2:60:60:160:240:160:0:0:1:1:.:0.5,0.25,0.25:0,0,0,0,0,0,1,0,0,0,0,0,0,0,0 0/1/1/1:5:19:16:24:16:0:0:0.716:0.987:.:0.318,0.679,0.003:0,0,0.271,0.716,0,0,0,0.013,0,0,0,0,0,0,0 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:GP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1:1 +CHR1 31 CHR1_30_50_MASK AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;UAN=0;AC=.;REFMASKED;NS=0;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:GP ./././.:.:.:.:24:0:.:.:.:.:.:.:. ./././.:.:.:.:240:0:.:.:.:.:.:.:. ./././.:.:.:.:24:0:.:.:.:.:.:.:. +CHR1 6 CHR1_05_25_ZERO AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;UAN=0;AC=.;REFMASKED;NS=0;MCI=0;DP=.;RCOUNT=240;END=25;NVAR=0;SNVPOS=.;AFP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:GP ./././.:.:.:.:20:0:.:.:.:.:.:.:. ./././.:.:.:.:200:0:.:.:.:.:.:.:. ./././.:.:.:.:20:0:.:.:.:.:.:.:. diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.prior.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.prior.vcf index e1b8259e..20856b54 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.prior.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.prior.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -23,20 +25,20 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=0.09,0.5,0.41;AFP=0.534,0.263,0.203 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/1/2:6:60:13:20:40:0:0:0.759:1:.:0.44,0.283,0.277 0/0/1/1:60:60:133:200:400:0:0:1:1:.:0.5,0.5,0 0/0/0/2:5:16:13:20:40:0:0:0.65:0.975:.:0.662,0.006,0.331 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 0/0/0/0:60:60:.:240:0:0:.:1:1:.:1 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFPRIOR=0.487,0.238,0.18,0.094;AFP=0.504,0.237,0.172,0.087 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/2:11:18:14:24:28:0:0:0.922:0.985:.:0.731,0.003,0.266,0.001 0/0/1/2:60:60:140:240:280:0:0:1:1:.:0.5,0.25,0.25,0 0/1/1/3:8:22:14:24:28:0:0:0.827:0.994:.:0.281,0.457,0.001,0.26 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 -CHR1 31 CHR1_30_50_MASK AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;AC=.;REFMASKED;NS=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP ./././.:.:.:.:24:0:0:.:.:.:.:. ./././.:.:.:.:240:0:0:.:.:.:.:. ./././.:.:.:.:24:0:0:.:.:.:.:. -CHR1 6 CHR1_05_25_ZERO AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . AF0 AN=0;AC=0,0;NS=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=.,.,.;AFP=.,.,. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP ./././.:.:.:13:20:40:40:1:.:.:.:. ./././.:.:.:133:200:400:400:1:.:.:.:. ./././.:.:.:13:20:40:40:1:.:.:.:. +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=0.09,0.5,0.41;AFP=0.534,0.263,0.203 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/1/2:6:60:13:20:40:0:0:0.759:1:.:0.44,0.283,0.277 0/0/1/1:60:60:133:200:400:0:0:1:1:.:0.5,0.5,0 0/0/0/2:5:16:13:20:40:0:0:0.65:0.975:.:0.662,0.006,0.331 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 0/0/0/0:60:60:.:240:0:0:.:1:1:.:1 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFPRIOR=0.487,0.238,0.18,0.094;AFP=0.504,0.236,0.172,0.087 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/2:11:18:14:24:28:0:0:0.922:0.985:.:0.731,0.003,0.266,0.001 0/0/1/2:60:60:140:240:280:0:0:1:1:.:0.5,0.25,0.25,0 0/1/1/3:8:22:14:24:28:0:0:0.827:0.994:.:0.281,0.457,0.001,0.26 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 +CHR1 31 CHR1_30_50_MASK AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;UAN=0;AC=.;REFMASKED;NS=0;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP ./././.:.:.:.:24:0:.:.:.:.:.:. ./././.:.:.:.:240:0:.:.:.:.:.:. ./././.:.:.:.:24:0:.:.:.:.:.:. +CHR1 6 CHR1_05_25_ZERO AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . AF0 AN=0;UAN=0;AC=0,0;NS=0;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=.,.,.;AFP=.,.,. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP ./././.:.:.:13:20:40:.:.:.:.:.:. ./././.:.:.:133:200:400:.:.:.:.:.:. ./././.:.:.:13:20:40:.:.:.:.:.:. diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.skiprare.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.skiprare.vcf index af2c3c43..47cebe09 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.skiprare.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.skiprare.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -23,20 +25,20 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=8,4;REFMASKED;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=0,0.549,0.451;AFP=0,0.721,0.279 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 1/1/2/2:3:60:13:20:40:16:0.4:0.503:1:.:0,0.622,0.378 1/1/1/1:60:60:133:200:400:160:0.4:1:1:.:0,1,0 1/1/2/2:6:60:13:20:40:24:0.6:0.738:1:.:0,0.541,0.459 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 0/0/0/0:60:60:.:240:0:0:.:1:1:.:1 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA . PASS AN=12;AC=4,2;NS=3;DP=192;RCOUNT=288;END=30;NVAR=1;SNVPOS=10;AFPRIOR=0.538,0.263,0.199;AFP=0.517,0.311,0.173 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/2:11:20:16:24:16:0:0:0.926:0.989:.:0.732,0.003,0.266 0/0/1/2:60:60:160:240:160:0:0:1:1:.:0.5,0.25,0.25 0/1/1/1:5:19:16:24:16:0:0:0.716:0.987:.:0.318,0.679,0.003 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 -CHR1 31 CHR1_30_50_MASK AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;AC=.;REFMASKED;NS=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP ./././.:.:.:.:24:0:0:.:.:.:.:. ./././.:.:.:.:240:0:0:.:.:.:.:. ./././.:.:.:.:24:0:0:.:.:.:.:. -CHR1 6 CHR1_05_25_ZERO AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;AC=.;REFMASKED;NS=0;DP=.;RCOUNT=240;END=25;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP ./././.:.:.:.:20:0:0:.:.:.:.:. ./././.:.:.:.:200:0:0:.:.:.:.:. ./././.:.:.:.:20:0:0:.:.:.:.:. +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=2;AC=8,4;REFMASKED;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=0,0.549,0.451;AFP=0,0.721,0.279 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 1/1/2/2:3:60:13:20:40:16:0.4:0.503:1:.:0,0.622,0.378 1/1/1/1:60:60:133:200:400:160:0.4:1:1:.:0,1,0 1/1/2/2:6:60:13:20:40:24:0.6:0.738:1:.:0,0.541,0.459 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 0/0/0/0:60:60:.:240:0:0:.:1:1:.:1 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA . PASS AN=12;UAN=3;AC=4,2;NS=3;MCI=0;DP=192;RCOUNT=288;END=30;NVAR=1;SNVPOS=10;AFPRIOR=0.538,0.263,0.199;AFP=0.517,0.31,0.173 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/2:11:20:16:24:16:0:0:0.926:0.989:.:0.732,0.003,0.266 0/0/1/2:60:60:160:240:160:0:0:1:1:.:0.5,0.25,0.25 0/1/1/1:5:19:16:24:16:0:0:0.716:0.987:.:0.318,0.679,0.003 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 +CHR1 31 CHR1_30_50_MASK AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;UAN=0;AC=.;REFMASKED;NS=0;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP ./././.:.:.:.:24:0:.:.:.:.:.:. ./././.:.:.:.:240:0:.:.:.:.:.:. ./././.:.:.:.:24:0:.:.:.:.:.:. +CHR1 6 CHR1_05_25_ZERO AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;UAN=0;AC=.;REFMASKED;NS=0;MCI=0;DP=.;RCOUNT=240;END=25;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP ./././.:.:.:.:20:0:.:.:.:.:.:. ./././.:.:.:.:200:0:.:.:.:.:.:. ./././.:.:.:.:20:0:.:.:.:.:.:. diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.vcf index 15a9b218..0c8c2a16 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.frequencies.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -22,18 +24,18 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFP=0.57,0.253,0.177 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/1/2:12:60:13:20:40:0:0:0.941:1:.:0.485,0.257,0.257 0/0/1/1:60:60:133:200:400:0:0:1:1:.:0.5,0.5,0 0/0/0/2:10:22:13:20:40:0:0:0.896:0.994:.:0.724,0.002,0.275 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 0/0/0/0:60:60:.:240:0:0:.:1:1:.:1 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFP=0.489,0.237,0.18,0.094 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/2:7:14:14:24:28:0:0:0.812:0.962:.:0.703,0.005,0.288,0.005 0/0/1/2:60:60:140:240:280:0:0:1:1:.:0.5,0.25,0.25,0 0/1/1/3:8:21:14:24:28:0:0:0.827:0.992:.:0.265,0.457,0.002,0.276 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFP=0.57,0.253,0.177 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/1/2:12:60:13:20:40:0:0:0.941:1:.:0.485,0.257,0.257 0/0/1/1:60:60:133:200:400:0:0:1:1:.:0.5,0.5,0 0/0/0/2:10:22:13:20:40:0:0:0.896:0.994:.:0.724,0.002,0.275 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 0/0/0/0:60:60:.:240:0:0:.:1:1:.:1 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFP=0.489,0.237,0.18,0.094 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/2:7:14:14:24:28:0:0:0.812:0.962:.:0.703,0.005,0.288,0.005 0/0/1/2:60:60:140:240:280:0:0:1:1:.:0.5,0.25,0.25,0 0/1/1/3:8:21:14:24:28:0:0:0.827:0.992:.:0.265,0.457,0.002,0.276 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.likelihoods.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.likelihoods.vcf index 10182c44..f31115f5 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.likelihoods.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.likelihoods.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -21,18 +23,18 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GL 0/0/1/2:12:60:13:20:40:0:0:0.941:1:.:-98.588,-39.531,-38.582,-40.008,-120.497,-38.327,-9.031,-10.536,-91.769,-37.98,-10.536,-91.848,-39.758,-93.677,-142.405 0/0/1/1:60:60:133:200:400:0:0:1:1:.:-876.34,-72.701,-60.208,-72.701,-876.34,-693.832,-90.31,-90.311,-893.832,-699.4,-120.413,-918.484,-722.459,-960.628,-1752.679 0/0/0/2:10:22:13:20:40:0:0:0.896:0.994:.:-54.771,-37.145,-38.582,-42.394,-164.314,-4.885,-7.526,-12.041,-135.211,-6.021,-10.536,-134.762,-9.656,-135.688,-164.314 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GL 0/0/0/0:60:60:.:24:0:0:.:1:1:.:0 0/0/0/0:60:60:.:240:0:0:.:1:1:.:0 0/0/0/0:60:60:.:24:0:0:.:1:1:.:0 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GL 0/0/0/2:7:14:14:24:28:0:0:0.812:0.962:.:-21.909,-23.408,-25.521,-29.133,-87.634,-3.908,-6.021,-9.633,-68.134,-4.817,-8.429,-66.93,-7.725,-66.225,-65.726,-23.783,-25.896,-29.508,-89.133,-6.021,-9.633,-69.258,-8.429,-68.054,-67.35,-26.424,-30.036,-91.246,-9.633,-70.843,-69.639,-30.939,-94.859,-73.552,-153.359 0/0/1/2:60:60:140:240:280:0:0:1:1:.:-438.171,-253.163,-255.209,-272.248,-657.255,-253.163,-72.248,-84.289,-467.25,-255.209,-84.289,-462.253,-272.248,-467.25,-657.255,-403.163,-267.988,-281.279,-672.248,-218.5,-93.32,-480.029,-230.541,-478.78,-620.998,-419.523,-295.592,-693.379,-239.572,-499.626,-635.597,-450.875,-729.502,-663.939,-1314.509 0/1/1/3:8:21:14:24:28:0:0:0.828:0.992:.:-82.157,-24.156,-21.248,-20.339,-38.34,-82.657,-24.86,-22.452,-39.839,-83.361,-26.064,-41.952,-84.565,-45.565,-104.065,-36.975,-7.526,-6.396,-24.839,-37.679,-8.73,-26.271,-38.883,-28.605,-58.758,-35.873,-7.299,-25.521,-37.077,-27.702,-57.481,-36.021,-27.702,-57.327,-71.203 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GL 0/0/0/0:60:60:.:0:0:0:.:1:1:.:0 0/0/0/0:60:60:.:0:0:0:.:1:1:.:0 0/0/0/0:60:60:.:0:0:0:.:1:1:.:0 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GL 0/0/1/2:12:60:13:20:40:0:0:0.941:1:.:-98.588,-39.531,-38.582,-40.008,-120.497,-38.327,-9.031,-10.536,-91.769,-37.98,-10.536,-91.848,-39.758,-93.677,-142.405 0/0/1/1:60:60:133:200:400:0:0:1:1:.:-876.34,-72.701,-60.208,-72.701,-876.34,-693.832,-90.31,-90.311,-893.832,-699.4,-120.413,-918.484,-722.459,-960.628,-1752.679 0/0/0/2:10:22:13:20:40:0:0:0.896:0.994:.:-54.771,-37.145,-38.582,-42.394,-164.314,-4.885,-7.526,-12.041,-135.211,-6.021,-10.536,-134.762,-9.656,-135.688,-164.314 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GL 0/0/0/0:60:60:.:24:0:0:.:1:1:.:0 0/0/0/0:60:60:.:240:0:0:.:1:1:.:0 0/0/0/0:60:60:.:24:0:0:.:1:1:.:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GL 0/0/0/2:7:14:14:24:28:0:0:0.812:0.962:.:-21.909,-23.408,-25.521,-29.133,-87.634,-3.908,-6.021,-9.633,-68.134,-4.817,-8.429,-66.93,-7.725,-66.225,-65.726,-23.783,-25.896,-29.508,-89.133,-6.021,-9.633,-69.258,-8.429,-68.054,-67.35,-26.424,-30.036,-91.246,-9.633,-70.843,-69.639,-30.939,-94.859,-73.552,-153.359 0/0/1/2:60:60:140:240:280:0:0:1:1:.:-438.171,-253.163,-255.209,-272.248,-657.255,-253.163,-72.248,-84.289,-467.25,-255.209,-84.289,-462.253,-272.248,-467.25,-657.255,-403.163,-267.988,-281.279,-672.248,-218.5,-93.32,-480.029,-230.541,-478.78,-620.998,-419.523,-295.592,-693.379,-239.572,-499.626,-635.597,-450.875,-729.502,-663.939,-1314.509 0/1/1/3:8:21:14:24:28:0:0:0.828:0.992:.:-82.157,-24.156,-21.248,-20.339,-38.34,-82.657,-24.86,-22.452,-39.839,-83.361,-26.064,-41.952,-84.565,-45.565,-104.065,-36.975,-7.526,-6.396,-24.839,-37.679,-8.73,-26.271,-38.883,-28.605,-58.758,-35.873,-7.299,-25.521,-37.077,-27.702,-57.481,-36.021,-27.702,-57.327,-71.203 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GL 0/0/0/0:60:60:.:0:0:0:.:1:1:.:0 0/0/0/0:60:60:.:0:0:0:.:1:1:.:0 0/0/0/0:60:60:.:0:0:0:.:1:1:.:0 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.occurrence.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.occurrence.vcf index e3dca075..c2acee0a 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.occurrence.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.occurrence.vcf @@ -2,7 +2,7 @@ ##fileDate=20220406 ##source=mchap v0.9.3 ##phasing=None -##commandline="mchap call-exact --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --haplotypes simple.output.mixed_depth.assemble.vcf --report AOP" +##commandline="mchap call-exact --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --haplotypes simple.output.mixed_depth.assemble.vcf --report AOP AOPSUM" ##randomseed=None ##contig= ##contig= @@ -11,29 +11,32 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AOP=1,1,1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AOP 0/0/1/2:12:60:13:20:40:0:0:0.941:1:.:1,1,1 0/0/1/1:60:60:133:200:400:0:0:1:1:.:1,1,0 0/0/0/2:10:22:13:20:40:0:0:0.896:0.994:.:1,0.006,1 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AOP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AOP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 0/0/0/0:60:60:.:240:0:0:.:1:1:.:1 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AOP=1,1,1,1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AOP 0/0/0/2:7:14:14:24:28:0:0:0.812:0.962:.:1,0.019,1,0.019 0/0/1/2:60:60:140:240:280:0:0:1:1:.:1,1,1,0 0/1/1/3:8:21:14:24:28:0:0:0.827:0.992:.:1,1,0.008,1 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AOP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AOP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AOP=1,1,1;AOPSUM=3,2.006,2 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AOP 0/0/1/2:12:60:13:20:40:0:0:0.941:1:.:1,1,1 0/0/1/1:60:60:133:200:400:0:0:1:1:.:1,1,0 0/0/0/2:10:22:13:20:40:0:0:0.896:0.994:.:1,0.006,1 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AOP=1;AOPSUM=3 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AOP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 0/0/0/0:60:60:.:240:0:0:.:1:1:.:1 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AOP=1,1,1,1;AOPSUM=3,2.019,2.008,1.019 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AOP 0/0/0/2:7:14:14:24:28:0:0:0.812:0.962:.:1,0.019,1,0.019 0/0/1/2:60:60:140:240:280:0:0:1:1:.:1,1,1,0 0/1/1/3:8:21:14:24:28:0:0:0.827:0.992:.:1,1,0.008,1 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AOP=1;AOPSUM=3 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AOP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.posteriors.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.posteriors.vcf index a96facde..40dbbb7d 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.posteriors.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.posteriors.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -21,18 +23,18 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GP 0/0/1/2:12:60:13:20:40:0:0:0.941:1:.:0,0,0,0,0,0,0.941,0.029,0,0,0.029,0,0,0,0 0/0/1/1:60:60:133:200:400:0:0:1:1:.:0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 0/0/0/2:10:22:13:20:40:0:0:0.896:0.994:.:0,0,0,0,0,0.896,0.006,0,0,0.098,0,0,0,0,0 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 0/0/0/0:60:60:.:240:0:0:.:1:1:.:1 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GP 0/0/0/2:7:14:14:24:28:0:0:0.812:0.962:.:0,0,0,0,0,0.812,0.019,0,0,0.15,0,0,0,0,0,0,0,0,0,0.019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0/0/1/2:60:60:140:240:280:0:0:1:1:.:0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0/1/1/3:8:21:14:24:28:0:0:0.828:0.992:.:0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.061,0.828,0,0,0.008,0,0,0,0,0,0.103,0,0,0,0,0,0,0,0 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GP 0/0/1/2:12:60:13:20:40:0:0:0.941:1:.:0,0,0,0,0,0,0.941,0.029,0,0,0.029,0,0,0,0 0/0/1/1:60:60:133:200:400:0:0:1:1:.:0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 0/0/0/2:10:22:13:20:40:0:0:0.896:0.994:.:0,0,0,0,0,0.896,0.006,0,0,0.098,0,0,0,0,0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 0/0/0/0:60:60:.:240:0:0:.:1:1:.:1 0/0/0/0:60:60:.:24:0:0:.:1:1:.:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GP 0/0/0/2:7:14:14:24:28:0:0:0.812:0.962:.:0,0,0,0,0,0.812,0.019,0,0,0.15,0,0,0,0,0,0,0,0,0,0.019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0/0/1/2:60:60:140:240:280:0:0:1:1:.:0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0/1/1/3:8:21:14:24:28:0:0:0.828:0.992:.:0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.061,0.828,0,0,0.008,0,0,0,0,0,0.103,0,0,0,0,0,0,0,0 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 0/0/0/0:60:60:.:0:0:0:.:1:1:.:1 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.vcf index ec62b652..5fc6cdc0 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-exact.vcf @@ -2,7 +2,7 @@ ##fileDate=20210420 ##source=mchap v0.9.3 ##phasing=None -##commandline="mchap call-exact --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --haplotypes simple.output.mixed_depth.assemble.vcf" +##commandline="mchap call-exact --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --haplotypes simple.output.mixed_depth.assemble.vcf --report SNVDP" ##randomseed=None ##contig= ##contig= @@ -11,27 +11,31 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= +##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/1/2:12:60:13:20:40:0:0:0.941:1:. 0/0/1/1:60:60:133:200:400:0:0:1:1:. 0/0/0/2:10:22:13:20:40:0:0:0.896:0.994:. -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:24:0:0:.:1:1:. 0/0/0/0:60:60:.:240:0:0:.:1:1:. 0/0/0/0:60:60:.:24:0:0:.:1:1:. -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/2:7:14:14:24:28:0:0:0.812:0.962:. 0/0/1/2:60:60:140:240:280:0:0:1:1:. 0/1/1/3:8:21:14:24:28:0:0:0.827:0.992:. -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0:60:60:.:0:0:0:.:1:1:. 0/0/0/0:60:60:.:0:0:0:.:1:1:. +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;SNVDP=96,192,192 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:SNVDP 0/0/1/2:12:60:13:20:40:0:0:0.941:1:.:8,16,16 0/0/1/1:60:60:133:200:400:0:0:1:1:.:80,160,160 0/0/0/2:10:22:13:20:40:0:0:0.896:0.994:.:8,16,16 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;SNVDP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:SNVDP 0/0/0/0:60:60:.:24:0:0:.:1:1:.:. 0/0/0/0:60:60:.:240:0:0:.:1:1:.:. 0/0/0/0:60:60:.:24:0:0:.:1:1:.:. +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;SNVDP=144,192 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:SNVDP 0/0/0/2:7:14:14:24:28:0:0:0.812:0.962:.:12,16 0/0/1/2:60:60:140:240:280:0:0:1:1:.:120,160 0/1/1/3:8:21:14:24:28:0:0:0.827:0.992:.:12,16 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;SNVDP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:SNVDP 0/0/0/0:60:60:.:0:0:0:.:1:1:.:. 0/0/0/0:60:60:.:0:0:0:.:1:1:.:. 0/0/0/0:60:60:.:0:0:0:.:1:1:.:. diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.frequencies.prior.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.frequencies.prior.vcf new file mode 100644 index 00000000..047f0208 --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.frequencies.prior.vcf @@ -0,0 +1,45 @@ +##fileformat=VCFv4.3 +##fileDate=20210420 +##source=mchap v0.9.3 +##phasing=None +##commandline="mchap call-pedigree --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --sample-parents simple.pedigree.132.txt --gamete-error 0.1 --ploidy 4 --haplotypes mock.input.frequencies.vcf --prior-frequencies AFP --report AFP AFPRIOR --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11" +##randomseed=11 +##contig= +##contig= +##contig= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=0.09,0.5,0.41;AFP=0.559,0.262,0.179 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:PEDERR 0/0/1/2:11:60:13:20:40:0:0:0.92:1:0:0.48,0.264,0.256:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0.5,0.5,0:0.859 0/0/0/2:7:11:13:20:40:0:0:0.794:0.915:0:0.698,0.021,0.281:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:PEDERR 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFPRIOR=0.487,0.238,0.18,0.094;AFP=0.521,0.22,0.173,0.086 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:PEDERR 0/0/0/2:10:13:14:24:28:0:0:0.892:0.955:0:0.723,0.008,0.266,0.003:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0.5,0.25,0.25,0:0 0/1/1/3:4:17:14:24:28:0:0:0.604:0.981:0:0.341,0.401,0.005,0.253:0.578 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:PEDERR 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1:0 +CHR1 31 CHR1_30_50_MASK AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;UAN=0;AC=.;REFMASKED;NS=0;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:PEDERR ./././.:.:.:.:24:0:.:.:.:.:.:.:. ./././.:.:.:.:240:0:.:.:.:.:.:.:. ./././.:.:.:.:24:0:.:.:.:.:.:.:. +CHR1 6 CHR1_05_25_ZERO AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . AF0 AN=0;UAN=0;AC=0,0;NS=0;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=.,.,.;AFP=.,.,. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:PEDERR ./././.:.:.:13:20:40:.:.:.:.:.:.:. ./././.:.:.:133:200:400:.:.:.:.:.:.:. ./././.:.:.:13:20:40:.:.:.:.:.:.:. diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.frequencies.skiprare.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.frequencies.skiprare.vcf new file mode 100644 index 00000000..90f62d65 --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.frequencies.skiprare.vcf @@ -0,0 +1,45 @@ +##fileformat=VCFv4.3 +##fileDate=20210420 +##source=mchap v0.9.3 +##phasing=None +##commandline="mchap call-pedigree --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --sample-parents simple.pedigree.132.txt --gamete-error 0.1 --ploidy 4 --haplotypes mock.input.frequencies.vcf --prior-frequencies AFP --report AFP AFPRIOR --filter-input-haplotypes AFP>=0.1 --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11" +##randomseed=11 +##contig= +##contig= +##contig= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=2;AC=9,3;REFMASKED;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=0,0.549,0.451;AFP=0,0.768,0.232 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:PEDERR 1/1/1/2:6:60:13:20:40:16:0.4:0.739:1:0:0,0.685,0.315:0 1/1/1/1:60:60:133:200:400:160:0.4:1:1:0:0,1,0:0.002 1/1/2/2:3:60:13:20:40:24:0.6:0.524:1:0:0,0.618,0.382:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:PEDERR 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=192;RCOUNT=288;END=30;NVAR=1;SNVPOS=10;AFPRIOR=0.538,0.263,0.199;AFP=0.543,0.281,0.176 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:PEDERR 0/0/0/2:11:16:16:24:16:0:0:0.919:0.974:0:0.73,0.007,0.264:0 0/0/1/2:60:60:160:240:160:0:0:1:1:0:0.5,0.25,0.25:0 0/0/1/1:4:13:16:24:16:0:0:0.591:0.949:0:0.4,0.587,0.013:0.335 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:PEDERR 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1:0 +CHR1 31 CHR1_30_50_MASK AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;UAN=0;AC=.;REFMASKED;NS=0;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:PEDERR ./././.:.:.:.:24:0:.:.:.:.:.:.:. ./././.:.:.:.:240:0:.:.:.:.:.:.:. ./././.:.:.:.:24:0:.:.:.:.:.:.:. +CHR1 6 CHR1_05_25_ZERO AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;UAN=0;AC=.;REFMASKED;NS=0;MCI=0;DP=.;RCOUNT=240;END=25;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP:PEDERR ./././.:.:.:.:20:0:.:.:.:.:.:.:. ./././.:.:.:.:200:0:.:.:.:.:.:.:. ./././.:.:.:.:20:0:.:.:.:.:.:.:. diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.gamerror0.5.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.gamerror0.5.vcf new file mode 100644 index 00000000..0e5ab0b9 --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.gamerror0.5.vcf @@ -0,0 +1,40 @@ +##fileformat=VCFv4.3 +##fileDate=20210420 +##source=mchap v0.9.3 +##phasing=None +##commandline="mchap call-pedigree --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --sample-parents simple.pedigree.132.txt --gamete-error 0.5 --ploidy 4 --haplotypes simple.output.mixed_depth.assemble.vcf --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11" +##randomseed=11 +##contig= +##contig= +##contig= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/1/2:15:60:13:20:40:0:0:0.965:1:0:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0.975 0/0/0/2:11:24:13:20:40:0:0:0.921:0.996:0:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/2:7:13:14:24:28:0:0:0.799:0.949:0:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0 0/1/1/3:7:20:14:24:28:0:0:0.781:0.99:0:0.809 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.lambda0.1.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.lambda0.1.vcf new file mode 100644 index 00000000..46582af3 --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.lambda0.1.vcf @@ -0,0 +1,40 @@ +##fileformat=VCFv4.3 +##fileDate=20210420 +##source=mchap v0.9.3 +##phasing=None +##commandline="mchap call-pedigree --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --sample-parents simple.pedigree.132.txt --gamete-error 0.1 --gamete-ibd 0.1 --ploidy 4 --haplotypes simple.output.mixed_depth.assemble.vcf --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11" +##randomseed=11 +##contig= +##contig= +##contig= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/1/2:14:60:13:20:40:0:0:0.956:1:0:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0 0/0/0/2:11:17:13:20:40:0:0:0.915:0.98:0:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/2:7:11:14:24:28:0:0:0.79:0.922:0:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0 0/1/1/3:3:15:14:24:28:0:0:0.475:0.97:0:0.455 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.prior.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.prior.vcf new file mode 100644 index 00000000..52f4f93c --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.prior.vcf @@ -0,0 +1,42 @@ +##fileformat=VCFv4.3 +##fileDate=20210420 +##source=mchap v0.9.3 +##phasing=None +##commandline="mchap call-pedigree --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --sample-parents simple.pedigree.132.txt --gamete-error 0.1 --ploidy 4 --haplotypes mock.input.frequencies.vcf --prior-frequencies AFP --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11" +##randomseed=11 +##contig= +##contig= +##contig= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/1/2:11:60:13:20:40:0:0:0.92:1:0:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0.859 0/0/0/2:7:11:13:20:40:0:0:0.794:0.915:0:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/2:10:13:14:24:28:0:0:0.892:0.955:0:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0 0/1/1/3:4:17:14:24:28:0:0:0.604:0.981:0:0.578 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 +CHR1 31 CHR1_30_50_MASK AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;UAN=0;AC=.;REFMASKED;NS=0;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR ./././.:.:.:.:24:0:.:.:.:.:.:. ./././.:.:.:.:240:0:.:.:.:.:.:. ./././.:.:.:.:24:0:.:.:.:.:.:. +CHR1 6 CHR1_05_25_ZERO AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . AF0 AN=0;UAN=0;AC=0,0;NS=0;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR ./././.:.:.:13:20:40:.:.:.:.:.:. ./././.:.:.:133:200:400:.:.:.:.:.:. ./././.:.:.:13:20:40:.:.:.:.:.:. diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.reportall.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.reportall.vcf new file mode 100644 index 00000000..64c09051 --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.reportall.vcf @@ -0,0 +1,52 @@ +##fileformat=VCFv4.3 +##fileDate=20210420 +##source=mchap v0.9.3 +##phasing=None +##commandline="mchap call-pedigree --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --sample-parents simple.pedigree.132.txt --gamete-error 0.1 --ploidy 4 --haplotypes simple.output.mixed_depth.assemble.vcf --report SNVDP AFPRIOR ACP AFP AOP AOPSUM GL GP --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11" +##randomseed=11 +##contig= +##contig= +##contig= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=0.333,0.333,0.333;ACP=6.834,3.078,2.089;AFP=0.569,0.256,0.174;AOP=1,1,1;AOPSUM=3,2.035,2;SNVDP=96,192,192 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP:AFP:AOP:GP:GL:SNVDP:PEDERR 0/0/1/2:13:60:13:20:40:0:0:0.945:1:0:1.945,1.042,1.012:0.486,0.261,0.253:1,1,1:0,0,0,0,0,0,0.945,0.042,0,0,0.012,0,0,0,0:-55.767,-25.278,-24.333,-25.757,-68.151,-24.077,-9.067,-10.57,-53.705,-23.733,-10.571,-53.786,-25.51,-55.61,-80.534:8,16,16:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0:2,2,0:0.5,0.5,0:1,1,0:0,0,1,0,0,0,0,0,0,0,0,0,0,0,0:-495.756,-73.071,-60.596,-73.071,-495.756,-408.454,-90.66,-90.671,-513.234,-414.045,-120.732,-537.859,-437.099,-579.919,-991.095:80,160,160:0.924 0/0/0/2:10:15:13:20:40:0:0:0.889:0.965:0:2.889,0.035,1.076:0.722,0.009,0.269:1,0.035,1:0,0,0,0,0,0.889,0.035,0,0,0.076,0,0,0,0,0:-31,-22.894,-24.333,-28.141,-92.918,-4.925,-7.564,-12.075,-78.098,-6.061,-10.573,-77.65,-9.694,-78.573,-92.918:8,16,16:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=1;ACP=12;AFP=1;AOP=1;AOPSUM=3;SNVDP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP:AFP:AOP:GP:GL:SNVDP:PEDERR 0/0/0/0:60:60:.:24:0:0:.:1:1:0:4:1:1:1:0:.:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0:4:1:1:1:0:.:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0:4:1:1:1:0:.:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=1;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFPRIOR=0.25,0.25,0.25,0.25;ACP=6.235,2.538,2.164,1.064;AFP=0.52,0.211,0.18,0.089;AOP=1,1,1,1;AOPSUM=3,2.05,2.027,1.032;SNVDP=144,192 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP:AFP:AOP:GP:GL:SNVDP:PEDERR 0/0/0/2:7:11:14:24:28:0:0:0.784:0.917:0:2.781,0.05,1.136,0.032:0.695,0.012,0.284,0.008:1,0.05,1,0.032:0,0,0,0,0,0.784,0.05,0,0,0.131,0,0,0.002,0,0,0,0,0,0,0.032,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0:-12.413,-13.911,-16.021,-19.625,-49.563,-3.931,-6.041,-9.645,-39.584,-4.84,-8.444,-38.382,-7.741,-37.679,-37.18,-14.286,-16.397,-20.002,-51.061,-6.044,-9.65,-40.708,-8.448,-39.506,-38.803,-16.926,-20.533,-53.171,-9.654,-42.292,-41.09,-21.437,-56.775,-44.996,-86.713:12,16:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0:2,1,1,0:0.5,0.25,0.25,0:1,1,1,0:0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0:-247.962,-158.153,-160.209,-177.201,-371.796,-158.153,-72.428,-84.441,-276.995,-160.209,-84.441,-272.016,-177.201,-276.995,-371.796,-236.75,-172.974,-186.242,-386.775,-147.294,-93.483,-289.771,-159.313,-288.521,-359.333,-253.106,-200.549,-407.878,-168.36,-309.343,-373.923,-284.425,-443.918,-402.219,-743.3:120,160:0 0/1/1/3:3:16:14:24:28:0:0:0.488:0.972:1:1.454,1.488,0.028,1.031:0.363,0.372,0.007,0.258:1,1,0.028,1:0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.454,0.488,0,0,0.028,0,0,0,0,0,0.031,0,0,0,0,0,0,0,0:-46.467,-17.028,-14.128,-13.219,-21.7,-46.967,-17.732,-15.329,-23.198,-47.67,-18.933,-25.308,-48.871,-28.912,-58.851,-22.713,-7.546,-6.417,-15.339,-23.417,-8.748,-16.77,-24.619,-19.1,-34.972,-21.613,-7.319,-16.021,-22.816,-18.198,-33.695,-21.761,-18.196,-33.54,-40.275:12,16:0.454 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFPRIOR=1;ACP=12;AFP=1;AOP=1;AOPSUM=3;SNVDP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP:AFP:AOP:GP:GL:SNVDP:PEDERR 0/0/0/0:60:60:.:0:0:0:.:1:1:0:4:1:1:1:0:.:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:4:1:1:1:0:.:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:4:1:1:1:0:.:0 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.tau-mixed.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.tau-mixed.vcf new file mode 100644 index 00000000..9030bcf8 --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.tau-mixed.vcf @@ -0,0 +1,40 @@ +##fileformat=VCFv4.3 +##fileDate=20210420 +##source=mchap v0.9.3 +##phasing=None +##commandline="mchap call-pedigree --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --sample-parents simple.pedigree.132.txt --gamete-error 0.1 --gamete-ploidy simple.tau.132.txt --ploidy 4 --haplotypes simple.output.mixed_depth.assemble.vcf --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11" +##randomseed=11 +##contig= +##contig= +##contig= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/1/2:10:60:13:20:40:0:0:0.904:1:0:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0.889 0/0/0/2:11:17:13:20:40:0:0:0.921:0.979:0:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/2:7:9:14:24:28:0:0:0.785:0.878:0:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0 0/1/1/3:4:16:14:24:28:0:0:0.641:0.978:0:0.572 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.vcf new file mode 100644 index 00000000..cfb561c4 --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call-pedigree.p132.vcf @@ -0,0 +1,40 @@ +##fileformat=VCFv4.3 +##fileDate=20210420 +##source=mchap v0.9.3 +##phasing=None +##commandline="mchap call-pedigree --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --sample-parents simple.pedigree.132.txt --ploidy 4 --haplotypes simple.output.mixed_depth.assemble.vcf --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11" +##randomseed=11 +##contig= +##contig= +##contig= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/1/2:6:60:13:20:40:0:0:0.772:1:0:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0.555 0/0/0/2:5:6:13:20:40:0:0:0.718:0.769:0:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=2,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/2:6:7:14:24:28:0:0:0.722:0.8:0:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0 0/0/1/3:5:12:14:24:28:0:0:0.674:0.941:0:0.092 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:PEDERR 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call.counts.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call.counts.vcf new file mode 100644 index 00000000..348258bb --- /dev/null +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call.counts.vcf @@ -0,0 +1,41 @@ +##fileformat=VCFv4.3 +##fileDate=20220406 +##source=mchap v0.9.3 +##phasing=None +##commandline="mchap call --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --haplotypes simple.output.deep.assemble.vcf --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11 --report ACP" +##randomseed=11 +##contig= +##contig= +##contig= +##FILTER= +##FILTER= +##FILTER= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##INFO= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +##FORMAT= +#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;ACP=6.846,3.035,2.119 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP 0/0/1/2:13:60:13:20:40:0:0:0.952:1:0:1.952,1.024,1.024 0/0/1/1:60:60:133:200:400:0:0:1:1:0:2,2,0 0/0/0/2:10:19:13:20:40:0:0:0.894:0.989:0:2.894,0.011,1.095 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;ACP=12 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:4 0/0/0/0:60:60:.:240:0:0:.:1:1:0:4 0/0/0/0:60:60:.:24:0:0:.:1:1:0:4 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;ACP=5.891,2.821,2.156,1.131 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP 0/0/0/2:7:15:14:24:28:0:0:0.821:0.969:0:2.82,0.015,1.149,0.016 0/0/1/2:60:60:140:240:280:0:0:1:1:0:2,1,1,0 0/1/1/3:7:21:14:24:28:0:0:0.806:0.992:0:1.071,1.806,0.008,1.115 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;ACP=12 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:ACP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:4 0/0/0/0:60:60:.:0:0:0:.:1:1:0:4 0/0/0/0:60:60:.:0:0:0:.:1:1:0:4 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call.frequencies.prior.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call.frequencies.prior.vcf index b88f47ad..fb703bfa 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call.frequencies.prior.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call.frequencies.prior.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -23,20 +25,20 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=0.09,0.5,0.41;AFP=0.534,0.263,0.202 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/1/2:6:60:13:20:40:0:0:0.77:1:0:0.442,0.282,0.275 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0.5,0.5,0 0/0/0/2:4:16:13:20:40:0:0:0.645:0.972:0:0.661,0.007,0.332 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFPRIOR=0.487,0.238,0.18,0.094;AFP=0.504,0.236,0.172,0.088 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/2:11:18:14:24:28:0:0:0.924:0.984:0:0.731,0.003,0.265,0.001 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0.5,0.25,0.25,0 0/1/1/3:8:24:14:24:28:0:0:0.825:0.996:0:0.281,0.456,0.001,0.262 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 -CHR1 31 CHR1_30_50_MASK AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;AC=.;REFMASKED;NS=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP ./././.:.:.:.:24:0:0:.:.:.:.:. ./././.:.:.:.:240:0:0:.:.:.:.:. ./././.:.:.:.:24:0:0:.:.:.:.:. -CHR1 6 CHR1_05_25_ZERO AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . AF0 AN=0;AC=0,0;NS=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=.,.,.;AFP=.,.,. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP ./././.:.:.:13:20:40:40:1:.:.:.:. ./././.:.:.:133:200:400:400:1:.:.:.:. ./././.:.:.:13:20:40:40:1:.:.:.:. +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=0.09,0.5,0.41;AFP=0.534,0.263,0.202 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/1/2:6:60:13:20:40:0:0:0.77:1:0:0.442,0.282,0.275 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0.5,0.5,0 0/0/0/2:4:16:13:20:40:0:0:0.645:0.972:0:0.661,0.007,0.332 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFPRIOR=0.487,0.238,0.18,0.094;AFP=0.504,0.237,0.172,0.088 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/2:11:18:14:24:28:0:0:0.924:0.984:0:0.731,0.003,0.265,0.001 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0.5,0.25,0.25,0 0/1/1/3:8:24:14:24:28:0:0:0.825:0.996:0:0.281,0.456,0.001,0.262 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 +CHR1 31 CHR1_30_50_MASK AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;UAN=0;AC=.;REFMASKED;NS=0;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP ./././.:.:.:.:24:0:.:.:.:.:.:. ./././.:.:.:.:240:0:.:.:.:.:.:. ./././.:.:.:.:24:0:.:.:.:.:.:. +CHR1 6 CHR1_05_25_ZERO AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . AF0 AN=0;UAN=0;AC=0,0;NS=0;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=.,.,.;AFP=.,.,. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP ./././.:.:.:13:20:40:.:.:.:.:.:. ./././.:.:.:133:200:400:.:.:.:.:.:. ./././.:.:.:13:20:40:.:.:.:.:.:. diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call.frequencies.skiprare.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call.frequencies.skiprare.vcf index 7f9d1023..88cefd91 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call.frequencies.skiprare.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call.frequencies.skiprare.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -23,20 +25,20 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=8,4;REFMASKED;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=0,0.549,0.451;AFP=0,0.721,0.279 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 1/1/2/2:3:60:13:20:40:16:0.4:0.507:1:1:0,0.622,0.378 1/1/1/1:60:60:133:200:400:160:0.4:1:1:0:0,1,0 1/1/2/2:6:60:13:20:40:24:0.6:0.749:1:0:0,0.542,0.458 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA . PASS AN=12;AC=4,2;NS=3;DP=192;RCOUNT=288;END=30;NVAR=1;SNVPOS=10;AFPRIOR=0.538,0.263,0.199;AFP=0.517,0.31,0.173 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/2:11:18:16:24:16:0:0:0.924:0.985:0:0.731,0.004,0.265 0/0/1/2:60:60:160:240:160:0:0:1:1:0:0.5,0.25,0.25 0/1/1/1:5:17:16:24:16:0:0:0.705:0.981:0:0.319,0.676,0.005 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 -CHR1 31 CHR1_30_50_MASK AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;AC=.;REFMASKED;NS=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP ./././.:.:.:.:24:0:0:.:.:.:.:. ./././.:.:.:.:240:0:0:.:.:.:.:. ./././.:.:.:.:24:0:0:.:.:.:.:. -CHR1 6 CHR1_05_25_ZERO AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;AC=.;REFMASKED;NS=0;DP=.;RCOUNT=240;END=25;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP ./././.:.:.:.:20:0:0:.:.:.:.:. ./././.:.:.:.:200:0:0:.:.:.:.:. ./././.:.:.:.:20:0:0:.:.:.:.:. +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=2;AC=8,4;REFMASKED;NS=3;MCI=1;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFPRIOR=0,0.549,0.451;AFP=0,0.722,0.278 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 1/1/2/2:3:60:13:20:40:16:0.4:0.507:1:1:0,0.622,0.378 1/1/1/1:60:60:133:200:400:160:0.4:1:1:0:0,1,0 1/1/2/2:6:60:13:20:40:24:0.6:0.749:1:0:0,0.542,0.458 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA . PASS AN=12;UAN=3;AC=4,2;NS=3;MCI=0;DP=192;RCOUNT=288;END=30;NVAR=1;SNVPOS=10;AFPRIOR=0.538,0.263,0.199;AFP=0.517,0.31,0.173 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/2:11:18:16:24:16:0:0:0.924:0.985:0:0.731,0.004,0.265 0/0/1/2:60:60:160:240:160:0:0:1:1:0:0.5,0.25,0.25 0/1/1/1:5:17:16:24:16:0:0:0.705:0.981:0:0.319,0.676,0.005 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFPRIOR=1;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 +CHR1 31 CHR1_30_50_MASK AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;UAN=0;AC=.;REFMASKED;NS=0;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP ./././.:.:.:.:24:0:.:.:.:.:.:. ./././.:.:.:.:240:0:.:.:.:.:.:. ./././.:.:.:.:24:0:.:.:.:.:.:. +CHR1 6 CHR1_05_25_ZERO AAAAAAAAAAAAAAAAAAAA . . NOA AN=0;UAN=0;AC=.;REFMASKED;NS=0;MCI=0;DP=.;RCOUNT=240;END=25;NVAR=0;SNVPOS=.;AFPRIOR=.;AFP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP ./././.:.:.:.:20:0:.:.:.:.:.:. ./././.:.:.:.:200:0:.:.:.:.:.:. ./././.:.:.:.:20:0:.:.:.:.:.:. diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call.frequencies.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call.frequencies.vcf index 5ad2f768..7260721b 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call.frequencies.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call.frequencies.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -22,18 +24,18 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFP=0.57,0.253,0.177 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/1/2:13:60:13:20:40:0:0:0.952:1:0:0.488,0.256,0.256 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0.5,0.5,0 0/0/0/2:10:19:13:20:40:0:0:0.894:0.989:0:0.723,0.003,0.274 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFP=0.491,0.235,0.18,0.094 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/2:7:15:14:24:28:0:0:0.821:0.969:0:0.705,0.004,0.287,0.004 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0.5,0.25,0.25,0 0/1/1/3:7:21:14:24:28:0:0:0.806:0.992:0:0.268,0.452,0.002,0.279 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AFP=0.571,0.253,0.177 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/1/2:13:60:13:20:40:0:0:0.952:1:0:0.488,0.256,0.256 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0.5,0.5,0 0/0/0/2:10:19:13:20:40:0:0:0.894:0.989:0:0.723,0.003,0.274 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AFP=0.491,0.235,0.18,0.094 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/2:7:15:14:24:28:0:0:0.821:0.969:0:0.705,0.004,0.287,0.004 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0.5,0.25,0.25,0 0/1/1/3:7:21:14:24:28:0:0:0.806:0.992:0:0.268,0.452,0.002,0.279 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AFP=1 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AFP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call.likelihoods.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call.likelihoods.vcf index f1ed9fbf..e0776465 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call.likelihoods.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call.likelihoods.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -21,18 +23,18 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GL 0/0/1/2:13:60:13:20:40:0:0:0.954:1:0:-98.588,-39.531,-38.582,-40.008,-120.497,-38.327,-9.031,-10.536,-91.769,-37.98,-10.536,-91.848,-39.758,-93.677,-142.405 0/0/1/1:60:60:133:200:400:0:0:1:1:0:-876.34,-72.701,-60.208,-72.701,-876.34,-693.832,-90.31,-90.311,-893.832,-699.4,-120.413,-918.484,-722.459,-960.628,-1752.679 0/0/0/2:10:19:13:20:40:0:0:0.894:0.989:0:-54.771,-37.145,-38.582,-42.394,-164.314,-4.885,-7.526,-12.041,-135.211,-6.021,-10.536,-134.762,-9.656,-135.688,-164.314 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GL 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GL 0/0/0/2:7:15:14:24:28:0:0:0.821:0.969:0:-21.909,-23.408,-25.521,-29.133,-87.634,-3.908,-6.021,-9.633,-68.134,-4.817,-8.429,-66.93,-7.725,-66.225,-65.726,-23.783,-25.896,-29.508,-89.133,-6.021,-9.633,-69.258,-8.429,-68.054,-67.35,-26.424,-30.036,-91.246,-9.633,-70.843,-69.639,-30.939,-94.859,-73.552,-153.359 0/0/1/2:60:60:140:240:280:0:0:1:1:0:-438.171,-253.163,-255.209,-272.248,-657.255,-253.163,-72.248,-84.289,-467.25,-255.209,-84.289,-462.253,-272.248,-467.25,-657.255,-403.163,-267.988,-281.279,-672.248,-218.5,-93.32,-480.029,-230.541,-478.78,-620.998,-419.523,-295.592,-693.379,-239.572,-499.626,-635.597,-450.875,-729.502,-663.939,-1314.509 0/1/1/3:7:21:14:24:28:0:0:0.808:0.991:0:-82.157,-24.156,-21.248,-20.339,-38.34,-82.657,-24.86,-22.452,-39.839,-83.361,-26.064,-41.952,-84.565,-45.565,-104.065,-36.975,-7.526,-6.396,-24.839,-37.679,-8.73,-26.271,-38.883,-28.605,-58.758,-35.873,-7.299,-25.521,-37.077,-27.702,-57.481,-36.021,-27.702,-57.327,-71.203 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GL 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GL 0/0/1/2:13:60:13:20:40:0:0:0.954:1:0:-98.588,-39.531,-38.582,-40.008,-120.497,-38.327,-9.031,-10.536,-91.769,-37.98,-10.536,-91.848,-39.758,-93.677,-142.405 0/0/1/1:60:60:133:200:400:0:0:1:1:0:-876.34,-72.701,-60.208,-72.701,-876.34,-693.832,-90.31,-90.311,-893.832,-699.4,-120.413,-918.484,-722.459,-960.628,-1752.679 0/0/0/2:10:19:13:20:40:0:0:0.894:0.989:0:-54.771,-37.145,-38.582,-42.394,-164.314,-4.885,-7.526,-12.041,-135.211,-6.021,-10.536,-134.762,-9.656,-135.688,-164.314 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GL 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GL 0/0/0/2:7:15:14:24:28:0:0:0.821:0.969:0:-21.909,-23.408,-25.521,-29.133,-87.634,-3.908,-6.021,-9.633,-68.134,-4.817,-8.429,-66.93,-7.725,-66.225,-65.726,-23.783,-25.896,-29.508,-89.133,-6.021,-9.633,-69.258,-8.429,-68.054,-67.35,-26.424,-30.036,-91.246,-9.633,-70.843,-69.639,-30.939,-94.859,-73.552,-153.359 0/0/1/2:60:60:140:240:280:0:0:1:1:0:-438.171,-253.163,-255.209,-272.248,-657.255,-253.163,-72.248,-84.289,-467.25,-255.209,-84.289,-462.253,-272.248,-467.25,-657.255,-403.163,-267.988,-281.279,-672.248,-218.5,-93.32,-480.029,-230.541,-478.78,-620.998,-419.523,-295.592,-693.379,-239.572,-499.626,-635.597,-450.875,-729.502,-663.939,-1314.509 0/1/1/3:7:21:14:24:28:0:0:0.808:0.991:0:-82.157,-24.156,-21.248,-20.339,-38.34,-82.657,-24.86,-22.452,-39.839,-83.361,-26.064,-41.952,-84.565,-45.565,-104.065,-36.975,-7.526,-6.396,-24.839,-37.679,-8.73,-26.271,-38.883,-28.605,-58.758,-35.873,-7.299,-25.521,-37.077,-27.702,-57.481,-36.021,-27.702,-57.327,-71.203 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GL 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0:0 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call.occurrence.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call.occurrence.vcf index c97220f0..0401875e 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call.occurrence.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call.occurrence.vcf @@ -2,7 +2,7 @@ ##fileDate=20220406 ##source=mchap v0.9.3 ##phasing=None -##commandline="mchap call --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --haplotypes simple.output.deep.assemble.vcf --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11 --report AOP" +##commandline="mchap call --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --haplotypes simple.output.deep.assemble.vcf --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11 --report AOP AOPSUM" ##randomseed=11 ##contig= ##contig= @@ -11,29 +11,32 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AOP=1,1,1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AOP 0/0/1/2:13:60:13:20:40:0:0:0.952:1:0:1,1,1 0/0/1/1:60:60:133:200:400:0:0:1:1:0:1,1,0 0/0/0/2:10:19:13:20:40:0:0:0.894:0.989:0:1,0.011,1 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AOP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AOP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AOP=1,1,1,1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AOP 0/0/0/2:7:15:14:24:28:0:0:0.821:0.969:0:1,0.015,1,0.016 0/0/1/2:60:60:140:240:280:0:0:1:1:0:1,1,1,0 0/1/1/3:7:21:14:24:28:0:0:0.806:0.992:0:1,1,0.008,1 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AOP=1 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:AOP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;AOP=1,1,1;AOPSUM=3,2.011,2 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AOP 0/0/1/2:13:60:13:20:40:0:0:0.952:1:0:1,1,1 0/0/1/1:60:60:133:200:400:0:0:1:1:0:1,1,0 0/0/0/2:10:19:13:20:40:0:0:0.894:0.989:0:1,0.011,1 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;AOP=1;AOPSUM=3 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AOP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;AOP=1,1,1,1;AOPSUM=3,2.015,2.007,1.016 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AOP 0/0/0/2:7:15:14:24:28:0:0:0.821:0.969:0:1,0.015,1,0.016 0/0/1/2:60:60:140:240:280:0:0:1:1:0:1,1,1,0 0/1/1/3:7:21:14:24:28:0:0:0.806:0.992:0:1,1,0.008,1 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;AOP=1;AOPSUM=3 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:AOP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call.posteriors.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call.posteriors.vcf index 665b41de..dcd9df19 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call.posteriors.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call.posteriors.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -21,18 +23,18 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GP 0/0/1/2:13:60:13:20:40:0:0:0.954:1:0:0,0,0,0,0,0,0.954,0.022,0,0,0.024,0,0,0,0 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 0/0/0/2:10:19:13:20:40:0:0:0.894:0.989:0:0,0,0,0,0,0.894,0.011,0,0,0.095,0,0,0,0,0 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GP 0/0/0/2:7:15:14:24:28:0:0:0.821:0.969:0:0,0,0,0,0,0.821,0.015,0,0,0.146,0,0,0.001,0,0,0,0,0,0,0.016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0/1/1/3:7:21:14:24:28:0:0:0.808:0.991:0:0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.07,0.808,0,0,0.009,0,0,0,0,0,0.114,0,0,0,0,0,0,0,0 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI:GP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GP 0/0/1/2:13:60:13:20:40:0:0:0.954:1:0:0,0,0,0,0,0,0.954,0.022,0,0,0.024,0,0,0,0 0/0/1/1:60:60:133:200:400:0:0:1:1:0:0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 0/0/0/2:10:19:13:20:40:0:0:0.894:0.989:0:0,0,0,0,0,0.894,0.011,0,0,0.095,0,0,0,0,0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 0/0/0/0:60:60:.:240:0:0:.:1:1:0:1 0/0/0/0:60:60:.:24:0:0:.:1:1:0:1 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GP 0/0/0/2:7:15:14:24:28:0:0:0.821:0.969:0:0,0,0,0,0,0.821,0.015,0,0,0.146,0,0,0.001,0,0,0,0,0,0,0.016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0/0/1/2:60:60:140:240:280:0:0:1:1:0:0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 0/1/1/3:7:21:14:24:28:0:0:0.808:0.991:0:0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.07,0.808,0,0,0.009,0,0,0,0,0,0.114,0,0,0,0,0,0,0,0 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:GP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 0/0/0/0:60:60:.:0:0:0:.:1:1:0:1 diff --git a/mchap/tests/test_io/data/simple.output.mixed_depth.call.vcf b/mchap/tests/test_io/data/simple.output.mixed_depth.call.vcf index 83029899..a10f0d35 100644 --- a/mchap/tests/test_io/data/simple.output.mixed_depth.call.vcf +++ b/mchap/tests/test_io/data/simple.output.mixed_depth.call.vcf @@ -2,7 +2,7 @@ ##fileDate=20210420 ##source=mchap v0.9.3 ##phasing=None -##commandline="mchap call --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --haplotypes simple.output.mixed_depth.assemble.vcf --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11" +##commandline="mchap call --bam simple.sample1.bam simple.sample2.deep.bam simple.sample3.bam --ploidy 4 --haplotypes simple.output.mixed_depth.assemble.vcf --mcmc-steps 500 --mcmc-burn 100 --mcmc-seed 11 --report SNVDP" ##randomseed=11 ##contig= ##contig= @@ -11,27 +11,31 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= +##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/1/2:13:60:13:20:40:0:0:0.952:1:0 0/0/1/1:60:60:133:200:400:0:0:1:1:0 0/0/0/2:10:19:13:20:40:0:0:0.894:0.989:0 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:240:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;AC=3,2,1;NS=3;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/2:7:15:14:24:28:0:0:0.821:0.969:0 0/0/1/2:60:60:140:240:280:0:0:1:1:0 0/1/1/3:7:21:14:24:28:0:0:0.806:0.992:0 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=159;RCOUNT=240;END=25;NVAR=3;SNVPOS=2,11,18;SNVDP=96,192,192 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:SNVDP 0/0/1/2:13:60:13:20:40:0:0:0.952:1:0:8,16,16 0/0/1/1:60:60:133:200:400:0:0:1:1:0:80,160,160 0/0/0/2:10:19:13:20:40:0:0:0.894:0.989:0:8,16,16 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=288;END=50;NVAR=0;SNVPOS=.;SNVDP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:SNVDP 0/0/0/0:60:60:.:24:0:0:.:1:1:0:. 0/0/0/0:60:60:.:240:0:0:.:1:1:0:. 0/0/0/0:60:60:.:24:0:0:.:1:1:0:. +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAGAAAAAAAAAA,AAAAAAAAATAAAAAAAAAA,AAAATAAAAGAAAAAAAAAA . PASS AN=12;UAN=4;AC=3,2,1;NS=3;MCI=0;DP=168;RCOUNT=288;END=30;NVAR=2;SNVPOS=5,10;SNVDP=144,192 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:SNVDP 0/0/0/2:7:15:14:24:28:0:0:0.821:0.969:0:12,16 0/0/1/2:60:60:140:240:280:0:0:1:1:0:120,160 0/1/1/3:7:21:14:24:28:0:0:0.806:0.992:0:12,16 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=.;SNVDP=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI:SNVDP 0/0/0/0:60:60:.:0:0:0:.:1:1:0:. 0/0/0/0:60:60:.:0:0:0:.:1:1:0:. 0/0/0/0:60:60:.:0:0:0:.:1:1:0:. diff --git a/mchap/tests/test_io/data/simple.output.nullallele.assemble.vcf b/mchap/tests/test_io/data/simple.output.nullallele.assemble.vcf index 34df1147..6f9bea6a 100644 --- a/mchap/tests/test_io/data/simple.output.nullallele.assemble.vcf +++ b/mchap/tests/test_io/data/simple.output.nullallele.assemble.vcf @@ -11,9 +11,11 @@ ##FILTER= ##FILTER= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= +##INFO= ##INFO= ##INFO= ##INFO= @@ -21,17 +23,17 @@ ##INFO= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= ##FORMAT= -##FORMAT= +##FORMAT= ##FORMAT= #CHROM POS ID REF ALT QUAL FILTER INFO FORMAT SAMPLE1 SAMPLE2 SAMPLE3 -CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;AC=3,2;NS=3;DP=39;RCOUNT=60;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/1/2:7:8:13:20:40:0:0:0.785:0.835:0 0/0/1/1:4:5:13:20:40:0:0:0.639:0.68:0 0/0/0/2:4:5:13:20:40:0:0:0.619:0.698:0 -CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=72;END=50;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 -CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAATAAAAAAAAAA,AAAAAAAAAGAAAAAAAAAA . PASS AN=11;AC=2,3;NS=3;DP=42;RCOUNT=72;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/1:6:8:14:24:28:0:0:0.72:0.84:0 0/0/1/2:7:11:14:24:28:0:0:0.806:0.925:0 0/2/2/.:7:13:14:24:28:0:0:0.802:0.95:0 -CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;AC=.;NS=3;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:PHQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:PHPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 +CHR1 6 CHR1_05_25 AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAGAAAAAATAA,ACAAAAAAAAGAAAAAACAA . PASS AN=12;UAN=3;AC=3,2;NS=3;MCI=0;DP=39;RCOUNT=60;END=25;NVAR=3;SNVPOS=2,11,18 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/1/2:7:8:13:20:40:0:0:0.785:0.835:0 0/0/1/1:4:5:13:20:40:0:0:0.639:0.68:0 0/0/0/2:4:5:13:20:40:0:0:0.619:0.698:0 +CHR1 31 CHR1_30_50 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=72;END=50;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 0/0/0/0:60:60:.:24:0:0:.:1:1:0 +CHR2 11 CHR2_10_30 AAAAAAAAAAAAAAAAAAAA AAAAAAAAATAAAAAAAAAA,AAAAAAAAAGAAAAAAAAAA . PASS AN=11;UAN=3;AC=2,3;NS=3;MCI=0;DP=42;RCOUNT=72;END=30;NVAR=2;SNVPOS=5,10 GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/1:6:8:14:24:28:0:0:0.72:0.84:0 0/0/1/2:7:11:14:24:28:0:0:0.806:0.925:0 0/2/2/.:7:13:14:24:28:0:0:0.802:0.95:0 +CHR3 21 CHR3_20_40 AAAAAAAAAAAAAAAAAAAA . . PASS AN=12;UAN=1;AC=.;NS=3;MCI=0;DP=.;RCOUNT=0;END=40;NVAR=0;SNVPOS=. GT:GQ:SQ:DP:RCOUNT:RCALLS:MEC:MECP:GPM:SPM:MCI 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 0/0/0/0:60:60:.:0:0:0:.:1:1:0 diff --git a/mchap/tests/test_io/data/simple.pedigree.132.txt b/mchap/tests/test_io/data/simple.pedigree.132.txt new file mode 100644 index 00000000..7e43b9ca --- /dev/null +++ b/mchap/tests/test_io/data/simple.pedigree.132.txt @@ -0,0 +1,3 @@ +SAMPLE1 . . +SAMPLE2 SAMPLE1 SAMPLE3 +SAMPLE3 SAMPLE1 . diff --git a/mchap/tests/test_io/data/simple.tau.132.txt b/mchap/tests/test_io/data/simple.tau.132.txt new file mode 100644 index 00000000..8efb3d39 --- /dev/null +++ b/mchap/tests/test_io/data/simple.tau.132.txt @@ -0,0 +1,3 @@ +SAMPLE1 2 2 +SAMPLE2 3 1 +SAMPLE3 2 2 diff --git a/mchap/tests/test_io/test_vcf/test_vcf_util.py b/mchap/tests/test_io/test_vcf/test_vcf_util.py index d392e83d..a26fcdc6 100644 --- a/mchap/tests/test_io/test_vcf/test_vcf_util.py +++ b/mchap/tests/test_io/test_vcf/test_vcf_util.py @@ -17,7 +17,9 @@ pytest.param([1, None, 3], "1,.,3", id="list-mixed"), pytest.param([1.3, 0.7, 1.0], "1.3,0.7,1", id="list-floats"), pytest.param( - np.array([0.0321, np.nan, 1.0, 0.0]), "0.0321,.,1,0", id="array-floats" + np.array([0.0321, np.nan, 1.0, 0.0]), + "0.032,.,1,0", + id="array-floats", # default precision of 3 ), ], ) diff --git a/mchap/tests/test_jitutils.py b/mchap/tests/test_jitutils.py index 8adb72ea..d3aaa723 100644 --- a/mchap/tests/test_jitutils.py +++ b/mchap/tests/test_jitutils.py @@ -8,7 +8,18 @@ @pytest.mark.parametrize( "n,k", - [(0, 0), (20, 4), (100, 3), (30, 20), (1, 1), (2, 7), (7, 2), (87, 4)], + [ + (0, 0), + (20, 4), + (100, 3), + (111, 5), + (30, 20), + (30, 21), + (1, 1), + (2, 7), + (7, 2), + (87, 4), + ], ) def test_comb(n, k): assert jitutils.comb(n, k) == comb(n, k, exact=True) diff --git a/mchap/tests/test_pedigree/test_pedigree_classes.py b/mchap/tests/test_pedigree/test_pedigree_classes.py new file mode 100644 index 00000000..00f91376 --- /dev/null +++ b/mchap/tests/test_pedigree/test_pedigree_classes.py @@ -0,0 +1,589 @@ +import numpy as np +import pytest + +from mchap.testing import simulate_reads +from mchap.jitutils import ( + increment_genotype, + comb_with_replacement, + sum_log_probs, + genotype_alleles_as_index, + add_log_prob, +) +from mchap.pedigree.prior import trio_log_pmf +from mchap.pedigree.likelihood import log_likelihood_alleles_cached +from mchap.pedigree.classes import PedigreeCallingMCMC, PedigreeAllelesMultiTrace + + +@pytest.mark.parametrize( + "read_depth, step_type, seed, tolerance", + [ + (0, "Gibbs", 0, 0.02), + (0, "Metropolis-Hastings", 0, 0.03), + (4, "Gibbs", 0, 0.02), + (4, "Metropolis-Hastings", 0, 0.03), + (10, "Gibbs", 0, 0.015), + (10, "Metropolis-Hastings", 0, 0.015), + (40, "Gibbs", 0, 0.01), + (40, "Metropolis-Hastings", 0, 0.015), + (100, "Gibbs", 0, 0.002), + (100, "Metropolis-Hastings", 0, 0.003), + ], +) +def test_PedigreeCallingMCMC__exact(read_depth, step_type, seed, tolerance): + """Test that MCMC approximates the true posterior as calculated for a tractable example. + + Note + ---- + Lower read depth results in more genotypes to check and greater variability. + Metropolis-Hastings is less statistically efficient resulting in greater variability for + same number of steps, especially with sparse posteriors resulting from higher read depths. + """ + # pedigree details + sample_parent = np.array( + [ + [-1, -1], + [-1, -1], + [0, 1], + [-1, 2], # unknown parent + ] + ) + gamete_tau = np.array( + [ + [1, 1], + [2, 2], + [2, 2], + [2, 2], + ] + ) + gamete_lambda = np.array([[0.0, 0.0], [0.01, 0.01], [0.345, 0.01], [0.01, 0.01]]) + gamete_error = np.array([[0.01, 0.01], [0.01, 0.01], [0.01, 0.01], [0.01, 0.01]]) + true_genotype = np.array( + [ + [0, 1, -2, -2], + [0, 0, 0, 2], + [0, 1, 1, 2], + [0, 0, 1, 2], + ] + ) + sample_ploidy = gamete_tau.sum(axis=-1) + + # haplotypes (few to limit complexity) + haplotypes = np.array( + [ + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 1], + [0, 1, 1, 0, 0, 1, 1], + ] + ) + np.random.seed(seed) + frequencies = np.random.rand(len(haplotypes)) + frequencies /= frequencies.sum() + print("Frequencies:", frequencies) + + # simulate reads from genotypes + n_samples = len(sample_parent) + n_alleles, n_pos = haplotypes.shape + sample_read_dists = np.empty((n_samples, read_depth, n_pos, 2)) + for i, g in enumerate(true_genotype): + sample_read_dists[i] = simulate_reads( + haplotypes[g], + n_alleles=2, + n_reads=read_depth, + errors=False, + uniform_sample=False, + ) + sample_read_counts = np.ones((n_samples, read_depth), dtype=int) + + # arrays for storing exact posterior + n_diploid_genotypes = comb_with_replacement(n_alleles, 2) + n_tetraploid_genotypes = comb_with_replacement(n_alleles, 4) + genotype_exact_posterior = np.full((4, n_tetraploid_genotypes), -np.inf) + pedigree_exact_posterior = np.full( + ( + n_diploid_genotypes, + n_tetraploid_genotypes, + n_tetraploid_genotypes, + n_tetraploid_genotypes, + ), + -np.inf, + ) + + # scratch variables + _, max_ploidy = true_genotype.shape + dosage = np.zeros(max_ploidy, dtype=np.int64) + dosage_p = np.zeros(max_ploidy, dtype=np.int64) + dosage_q = np.zeros(max_ploidy, dtype=np.int64) + gamete_p = np.zeros(max_ploidy, dtype=np.int64) + gamete_q = np.zeros(max_ploidy, dtype=np.int64) + constraint_p = np.zeros(max_ploidy, dtype=np.int64) + constraint_q = np.zeros(max_ploidy, dtype=np.int64) + dosage_log_frequencies = np.zeros(max_ploidy, dtype=np.float64) + + # brute force exact posterior by iteration over all combinations of genotypes + current_genotype = np.zeros((4, 4), int) + current_genotype[0, 2:] = -2 # first sample is diploid + for i_0 in range(n_diploid_genotypes): + for i_1 in range(n_tetraploid_genotypes): + for i_2 in range(n_tetraploid_genotypes): + for i_3 in range(n_tetraploid_genotypes): + # calculate un-normalized posterior prob + log_prior = np.log(1.0) + log_like = np.log(1.0) + for j in range(n_samples): + # prior + p, q = sample_parent[j] + if p >= 0: + error_p = gamete_error[j, 0] + ploidy_p = sample_ploidy[p] + else: + error_p = 1.0 + ploidy_p = 0 + if q >= 0: + error_q = gamete_error[j, 1] + ploidy_q = sample_ploidy[q] + else: + error_q = 1.0 + ploidy_q = 0 + log_prior += trio_log_pmf( + current_genotype[j], + current_genotype[p], + current_genotype[q], + ploidy_p=ploidy_p, + ploidy_q=ploidy_q, + tau_p=gamete_tau[j, 0], + tau_q=gamete_tau[j, 1], + lambda_p=gamete_lambda[j, 0], + lambda_q=gamete_lambda[j, 1], + error_p=error_p, + error_q=error_q, + log_frequencies=np.log(frequencies), + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + # likelihood + log_like += log_likelihood_alleles_cached( + reads=sample_read_dists[j], + read_counts=sample_read_counts[j], + haplotypes=haplotypes, + sample=j, + genotype_alleles=current_genotype[j, 0 : sample_ploidy[j]], + cache=None, + ) + log_post = log_like + log_prior + # store un-normalized posterior per sample and total + genotype_exact_posterior[0, i_0] = add_log_prob( + genotype_exact_posterior[0, i_0], log_post + ) + genotype_exact_posterior[1, i_1] = add_log_prob( + genotype_exact_posterior[1, i_1], log_post + ) + genotype_exact_posterior[2, i_2] = add_log_prob( + genotype_exact_posterior[2, i_2], log_post + ) + genotype_exact_posterior[3, i_3] = add_log_prob( + genotype_exact_posterior[3, i_3], log_post + ) + pedigree_exact_posterior[i_0, i_1, i_2, i_3] = log_post + # increment/reset genotypes + increment_genotype(current_genotype[3]) + current_genotype[3] = 0 + increment_genotype(current_genotype[2]) + current_genotype[2] = 0 + increment_genotype(current_genotype[1]) + current_genotype[1] = 0 + increment_genotype(current_genotype[0, 0:2]) + + # normalize posteriors + denominator = sum_log_probs(pedigree_exact_posterior.ravel()) + genotype_exact_posterior = np.exp(genotype_exact_posterior - denominator) + pedigree_exact_posterior = np.exp(pedigree_exact_posterior - denominator) + + # approximate with MCMC model + model = PedigreeCallingMCMC( + sample_ploidy=sample_ploidy, + sample_inbreeding=np.zeros(n_samples), + sample_parents=sample_parent, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + haplotypes=haplotypes, + frequencies=frequencies, + steps=3000, + annealing=1000, + chains=2, + random_seed=seed, + step_type=step_type, + ) + trace = model.fit(sample_read_dists, sample_read_counts).burn(1000) + + # compare posteriors for individual genotypes + for i in range(n_samples): + post = trace.individual(i).posterior() + for g, actual in zip(post.genotypes, post.probabilities): + j = genotype_alleles_as_index(g) + expect = genotype_exact_posterior[i, j] + print( + "Sample:", + i, + g, + "tolerance:", + tolerance, + "expected:", + expect.round(5), + "actual:", + actual.round(5), + ) + assert np.allclose(expect, actual, atol=tolerance) + + +def test_PedigreeAllelesMultiTrace_burn(): + trace_0 = [ + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + ] + trace_1 = [ + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 3]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 3]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 3]], + ] + trace = PedigreeAllelesMultiTrace(np.array([trace_0, trace_1]), n_allele=4) + actual = trace.burn(2).genotypes + expect = [trace_0[2:], trace_1[2:]] + np.testing.assert_array_equal(expect, actual) + + +def test_PedigreeAllelesMultiTrace_individual(): + trace_0 = [ + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + ] + trace_1 = [ + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 3]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 3]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 3]], + ] + trace = PedigreeAllelesMultiTrace(np.array([trace_0, trace_1]), n_allele=4) + actual = trace.individual(2).genotypes + expect = [np.array(trace_0)[:, 2], np.array(trace_1)[:, 2]] + np.testing.assert_array_equal(expect, actual) + + +def test_PedigreeAllelesMultiTrace_incongruence(): + sample_ploidy = np.array([4, 4, 4]) + sample_parents = np.array( + [ + [-1, -1], + [0, -1], + [0, 1], + ] + ) + gamete_tau = np.full((3, 2), 2, int) + gamete_lambda = np.zeros((3, 2), float) + trace_0 = [ + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + ] + trace_1 = [ + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 2]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 3]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 3]], + [[0, 0, 0, 1], [0, 0, 0, 2], [0, 0, 1, 3]], + ] + trace = PedigreeAllelesMultiTrace(np.array([trace_0, trace_1]), n_allele=4) + expect = [0.0, 0.0, 3 / 10] + actual = trace.incongruence( + sample_ploidy, sample_parents, gamete_tau, gamete_lambda + ) + np.testing.assert_array_equal(expect, actual) + + +def test_PedigreeCallingMCMC__swap_parental_alleles_example(): + read_depth = 50 + steps = 1000 + annealing = 0 + step_type = "Gibbs" + seed = 0 + + # pedigree details + n_samples = 43 + sample_parent = np.full((n_samples, 2), -1, int) + sample_parent[3:23] = [0, 1] + sample_parent[23:43] = [1, 2] + gamete_tau = np.full_like(sample_parent, 2, dtype=int) + gamete_lambda = np.zeros_like(sample_parent, dtype=float) + gamete_error = np.full_like(sample_parent, 0.00001, dtype=float) + sample_ploidy = gamete_tau.sum(axis=-1) + + # we want + true_genotype = np.array( + [ + [0, 0, 1, 1], # parent 0 + [0, 0, 1, 1], # parent 1 + [0, 0, 1, 2], # parent 2 is source of unique allele + [0, 0, 1, 1], # progeny of 0 and 1 + [0, 1, 1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1], + [0, 0, 1, 1], + [0, 0, 0, 0], + [0, 1, 1, 1], + [0, 0, 1, 1], + [0, 0, 1, 1], + [0, 0, 1, 1], + [0, 0, 1, 1], + [0, 1, 1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1], + [0, 0, 1, 1], + [0, 0, 0, 0], + [0, 1, 1, 1], + [0, 0, 1, 1], + [0, 0, 1, 1], + [0, 0, 1, 1], + [0, 0, 1, 2], # progeny of 1 and 2 + [0, 1, 1, 2], + [0, 0, 0, 1], + [0, 0, 1, 1], + [0, 0, 1, 2], + [0, 0, 0, 0], + [0, 1, 1, 2], + [0, 0, 1, 1], + [0, 0, 1, 2], + [0, 0, 1, 1], + [0, 0, 1, 2], + [0, 1, 1, 1], + [0, 0, 0, 1], + [0, 0, 1, 1], + [0, 0, 1, 2], + [0, 0, 0, 0], + [0, 1, 1, 2], + [0, 0, 1, 1], + [0, 0, 1, 2], + [0, 0, 1, 2], + ] + ) + assert len(true_genotype) == n_samples + assert np.sum(true_genotype[np.any(sample_parent == 2, axis=-1)] == 2) == 10 + assert np.sum(true_genotype[np.any(sample_parent == 0, axis=-1)] == 2) == 0 + + # start in an incorrect sub_mode + initial_genotype = true_genotype.copy() + initial_genotype[1] = true_genotype[2] + initial_genotype[2] = true_genotype[1] + + # haplotypes (few to limit complexity) + haplotypes = np.array( + [ + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 1], + [0, 1, 1, 0, 0, 1, 1], + [1, 0, 0, 0, 1, 1, 1], + ] + ) + frequencies = np.ones(len(haplotypes)) + frequencies /= frequencies.sum() + + # simulate reads from genotypes + n_samples = len(sample_parent) + n_alleles, n_pos = haplotypes.shape + sample_read_dists = np.empty((n_samples, read_depth, n_pos, 2)) + for i, g in enumerate(true_genotype): + sample_read_dists[i] = simulate_reads( + haplotypes[g], + n_alleles=2, + n_reads=read_depth, + errors=False, + uniform_sample=False, + ) + sample_read_counts = np.ones((n_samples, read_depth), dtype=int) * 10 + sample_read_counts[0:3] = 0 # parents have zero count + + # check that disabling the parental allele swap results in being stuck in the incorrect mode + model_a = PedigreeCallingMCMC( + sample_ploidy=sample_ploidy, + sample_inbreeding=np.zeros(n_samples), + sample_parents=sample_parent, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + haplotypes=haplotypes, + frequencies=frequencies, + steps=steps, + annealing=annealing, + chains=2, + random_seed=seed, + step_type=step_type, + swap_parental_alleles=False, + ) + trace_a = model_a.fit( + sample_read_dists, sample_read_counts, initial=initial_genotype + ).burn(annealing) + genotype_1a, prob_1a = trace_a.individual(1).posterior().mode() + np.testing.assert_array_equal(genotype_1a, [0, 0, 1, 2]) + assert prob_1a > 0.9 + genotype_2a, prob_2a = trace_a.individual(2).posterior().mode() + np.testing.assert_array_equal(genotype_2a, [0, 0, 1, 1]) + assert prob_2a > 0.9 + + # check that enabling the parental allele swap has allowed a transition to the correct genotypes + model_b = PedigreeCallingMCMC( + sample_ploidy=sample_ploidy, + sample_inbreeding=np.zeros(n_samples), + sample_parents=sample_parent, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + haplotypes=haplotypes, + frequencies=frequencies, + steps=steps, + annealing=annealing, # no annealing ! + chains=2, + random_seed=seed, + step_type=step_type, + swap_parental_alleles=True, + ) + trace_b = model_b.fit( + sample_read_dists, sample_read_counts, initial=initial_genotype + ).burn(annealing) + genotype_1b, prob_1b = trace_b.individual(1).posterior().mode() + np.testing.assert_array_equal(genotype_1b, [0, 0, 1, 1]) + assert prob_1b > 0.9 + genotype_2b, prob_2b = trace_b.individual(2).posterior().mode() + np.testing.assert_array_equal(genotype_2b, [0, 0, 1, 2]) + assert prob_2b > 0.9 + + +@pytest.mark.parametrize( + "read_depth, step_type, seed, tolerance", + [ + (0, "Gibbs", 0, 0.02), + (4, "Gibbs", 0, 0.035), + (10, "Gibbs", 0, 0.02), + (10, "Metropolis-Hastings", 0, 0.02), + (40, "Gibbs", 0, 0.01), + ], +) +def test_PedigreeCallingMCMC__swap_parental_alleles_bias( + read_depth, step_type, seed, tolerance +): + # pedigree details + sample_parent = np.array( + [ + [-1, -1], + [-1, -1], + [0, 1], + [-1, 2], # unknown parent + ] + ) + gamete_tau = np.array( + [ + [1, 1], + [2, 2], + [2, 2], + [2, 2], + ] + ) + gamete_lambda = np.array([[0.0, 0.0], [0.01, 0.01], [0.345, 0.01], [0.01, 0.01]]) + gamete_error = np.array([[0.01, 0.01], [0.01, 0.01], [0.01, 0.01], [0.01, 0.01]]) + true_genotype = np.array( + [ + [0, 1, -2, -2], + [0, 0, 0, 2], + [0, 1, 1, 2], + [0, 0, 1, 2], + ] + ) + sample_ploidy = gamete_tau.sum(axis=-1) + + # haplotypes (few to limit complexity) + haplotypes = np.array( + [ + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 1], + [0, 1, 1, 0, 0, 1, 1], + [1, 0, 0, 0, 1, 1, 1], + ] + ) + np.random.seed(seed) + frequencies = np.random.rand(len(haplotypes)) + frequencies /= frequencies.sum() + print("Frequencies:", frequencies) + + # simulate reads from genotypes + n_samples = len(sample_parent) + n_alleles, n_pos = haplotypes.shape + sample_read_dists = np.empty((n_samples, read_depth, n_pos, 2)) + for i, g in enumerate(true_genotype): + sample_read_dists[i] = simulate_reads( + haplotypes[g], + n_alleles=2, + n_reads=read_depth, + errors=False, + uniform_sample=False, + ) + sample_read_counts = np.ones((n_samples, read_depth), dtype=int) + + # without allele swapping + model_1 = PedigreeCallingMCMC( + sample_ploidy=sample_ploidy, + sample_inbreeding=np.zeros(n_samples), + sample_parents=sample_parent, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + haplotypes=haplotypes, + frequencies=frequencies, + steps=3000, + annealing=1000, + chains=2, + random_seed=seed, + step_type=step_type, + swap_parental_alleles=False, + ) + trace_1 = model_1.fit(sample_read_dists, sample_read_counts).burn(1000) + + # with allele swapping + model_2 = PedigreeCallingMCMC( + sample_ploidy=sample_ploidy, + sample_inbreeding=np.zeros(n_samples), + sample_parents=sample_parent, + gamete_tau=gamete_tau, + gamete_lambda=gamete_lambda, + gamete_error=gamete_error, + haplotypes=haplotypes, + frequencies=frequencies, + steps=3000, + annealing=1000, + chains=2, + random_seed=seed, + step_type=step_type, + swap_parental_alleles=True, + ) + trace_2 = model_2.fit(sample_read_dists, sample_read_counts).burn(1000) + + for i in range(n_samples): + print("Tolerance:", tolerance) + post_1 = trace_1.individual(i).posterior().as_array(n_alleles) + post_2 = trace_2.individual(i).posterior().as_array(n_alleles) + print("Max absolute difference:", np.max(np.abs(post_1 - post_2))) + assert np.allclose(post_1, post_2, atol=tolerance) diff --git a/mchap/tests/test_pedigree/test_pedigree_mcmc.py b/mchap/tests/test_pedigree/test_pedigree_mcmc.py new file mode 100644 index 00000000..407bdfe3 --- /dev/null +++ b/mchap/tests/test_pedigree/test_pedigree_mcmc.py @@ -0,0 +1,487 @@ +import pytest +import numpy as np + +from mchap.testing import simulate_reads +from mchap.pedigree.mcmc import ( + metropolis_hastings_probabilities, + gibbs_probabilities, + sample_children_matrix, + parental_pair_markov_blankets, +) + + +SINGLETON_PEDIGREE = { + "parent": [ + [-1, -1], + ], + "tau": [ + [1, 1], + ], + "lambda": [ + [0, 0], + ], + "genotype": [ + [0, 0], + ], +} + + +SINGLETON_CLONE_PEDIGREE = { + "parent": [[-1, -1]], + "tau": [[2, 0]], + "lambda": [ + [0.0, 0.0], + ], + "genotype": [ + [0, 2], + ], +} + + +DIPLOID_TRIO_PEDIGREE = { + "parent": [ + [-1, -1], + [-1, -1], + [0, 1], + ], + "tau": [ + [1, 1], + [1, 1], + [1, 1], + ], + "lambda": [ + [0, 0], + [0, 0], + [0, 0], + ], + "genotype": [ + [0, 0], + [1, 2], + [0, 2], + ], +} + + +TETRAPLOID_DUO_PEDIGREE = { + "parent": [ + [-1, -1], + [0, -1], # unknown parent + ], + "tau": [ + [2, 2], + [2, 2], + ], + "lambda": [ + [0.1, 0.1], + [0.1, 0.1], + ], + "genotype": [ + [1, 1, 2, 3], + [1, 1, 2, 1], + ], +} + + +TETRAPLOID_DUO_PEDIGREE_INCONGRUENT = TETRAPLOID_DUO_PEDIGREE.copy() +TETRAPLOID_DUO_PEDIGREE_INCONGRUENT["genotype"] = [ + [1, 1, 2, 3], + [0, 0, 2, 4], # incongruent progeny +] + + +TETRAPLOID_TRIO_PEDIGREE = { + "parent": [ + [-1, -1], + [-1, -1], + [0, 1], + ], + "tau": [ + [2, 2], + [2, 2], + [2, 2], + ], + "lambda": [ + [0.1, 0.1], + [0.1, 0.1], + [0.1, 0.1], + ], + "genotype": [ + [0, 0, 1, 2], + [1, 1, 2, 3], + [1, 1, 2, 1], + ], +} + + +TETRAPLOID_TRIO_PEDIGREE_INCONGRUENT = TETRAPLOID_TRIO_PEDIGREE.copy() +TETRAPLOID_TRIO_PEDIGREE_INCONGRUENT["genotype"] = [ + [0, 0, 1, 2], + [1, 1, 2, 3], + [0, 0, 0, 4], # incongruent progeny +] + + +UNBALANCED_TRIO_PEDIGREE = { + "parent": [ + [-1, -1], + [-1, -1], + [0, 1], + ], + "tau": [ + [1, 1], + [3, 3], + [1, 3], + ], + "lambda": [ + [0, 0], + [0, 0], + [0, 0], + ], + "genotype": [ + [0, 1, -2, -2, -2, -2], + [1, 1, 2, 2, 3, 4], + [1, 1, 2, 4, -2, -2], + ], +} + + +MIXED_QUARTET_PEDIGREE = { + "parent": [ + [-1, -1], + [-1, -1], + [0, 1], + [-1, 2], # unknown parent + ], + "tau": [ + [1, 1], + [2, 2], + [2, 2], + [2, 2], + ], + "lambda": [ + [0.0, 0.0], + [0.01, 0.01], + [0.345, 0.01], + [0.01, 0.01], + ], + "genotype": [ + [0, 1, -2, -2], + [0, 0, 0, 2], + [0, 1, 1, 2], + [0, 0, 1, 2], + ], +} + + +HAMILTON_KERR_PEDIGREE = { + "parent": [[-1, -1], [-1, -1], [-1, 1], [0, -1], [0, 2], [0, 2], [5, 1], [5, 1]], + "tau": [[1, 1], [2, 2], [0, 2], [2, 0], [1, 1], [2, 2], [2, 2], [2, 2]], + "lambda": [ + [0, 0], + [0.167, 0.167], + [0, 0.167], + [0.041, 0], + [0, 0], + [0.918, 0.041], + [0.167, 0.167], + [0.167, 0.167], + ], + "genotype": [ + [0, 1, -2, -2], + [0, 2, 2, 3], + [0, 2, -2, -2], + [0, 1, -2, -2], + [1, 2, -2, -2], + [0, 0, 0, 2], + [0, 0, 2, 2], + [0, 2, 2, 3], + ], +} + + +# The same pedigree but with some incongruent genotypes +HAMILTON_KERR_PEDIGREE_INCONGRUENT = HAMILTON_KERR_PEDIGREE.copy() +HAMILTON_KERR_PEDIGREE_INCONGRUENT["genotype"] = [ + [0, 1, -2, -2], + [0, 2, 2, 3], + [0, 2, -2, -2], + [0, 1, -2, -2], + [1, 1, -2, -2], # only one parent has a '1' + [0, 0, 0, 2], + [0, 0, 2, 5], # novel allele + [0, 2, 2, 3], +] + + +@pytest.mark.parametrize("gamete_error", [0.001, 0.1, 0.5, 1.0, "random"]) +@pytest.mark.parametrize("read_depth", [4, 8]) +@pytest.mark.parametrize( + "pedigree", + [ + SINGLETON_PEDIGREE, + SINGLETON_CLONE_PEDIGREE, + DIPLOID_TRIO_PEDIGREE, + TETRAPLOID_DUO_PEDIGREE, + TETRAPLOID_DUO_PEDIGREE_INCONGRUENT, + TETRAPLOID_TRIO_PEDIGREE, + TETRAPLOID_TRIO_PEDIGREE_INCONGRUENT, + UNBALANCED_TRIO_PEDIGREE, + MIXED_QUARTET_PEDIGREE, + HAMILTON_KERR_PEDIGREE, + HAMILTON_KERR_PEDIGREE_INCONGRUENT, + ], +) +def test_gibbs_mh_probabilities_equivalence(pedigree, read_depth, gamete_error): + + haplotypes = np.array( + [ + [0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 1], + [0, 0, 0, 0, 1, 0, 1], + [0, 0, 0, 1, 1, 0, 1], + [0, 1, 1, 0, 0, 0, 0], + [0, 1, 1, 0, 0, 1, 1], + [1, 0, 0, 0, 0, 1, 1], + ] + ) + n_alleles, n_pos = haplotypes.shape + np.random.seed(0) + frequencies = np.random.rand(n_alleles) + print("Freqs:", frequencies) + + # pedigree and genotype data + genotypes = np.array(pedigree["genotype"]) + sample_parents = np.array(pedigree["parent"], int) + sample_children = sample_children_matrix(sample_parents) + print(sample_children) + gamete_tau = np.array(pedigree["tau"], int) + gamete_lambda = np.array(pedigree["lambda"], float) + n_samples, max_ploidy = genotypes.shape + assert sample_parents.shape == (n_samples, 2) + assert gamete_tau.shape == (n_samples, 2) + assert gamete_lambda.shape == (n_samples, 2) + if gamete_error == "random": + gamete_error = np.random.rand(n_samples * 2).reshape(n_samples, 2) + else: + gamete_error = np.full((n_samples, 2), gamete_error, float) + sample_ploidy = gamete_tau.sum(axis=-1) + + # simulate reads from genotypes + sample_read_dists = np.empty((n_samples, read_depth, n_pos, 2)) + np.random.seed(0) + for i, g in enumerate(genotypes): + sample_read_dists[i] = simulate_reads( + haplotypes[g], + n_alleles=2, + n_reads=read_depth, + errors=False, + uniform_sample=False, + ) + sample_read_counts = np.ones((n_samples, read_depth), dtype=int) + + # scratch variables + dosage = np.zeros(max_ploidy, dtype=np.int64) + dosage_p = np.zeros(max_ploidy, dtype=np.int64) + dosage_q = np.zeros(max_ploidy, dtype=np.int64) + gamete_p = np.zeros(max_ploidy, dtype=np.int64) + gamete_q = np.zeros(max_ploidy, dtype=np.int64) + constraint_p = np.zeros(max_ploidy, dtype=np.int64) + constraint_q = np.zeros(max_ploidy, dtype=np.int64) + dosage_log_frequencies = np.zeros(max_ploidy, dtype=np.float64) + + # test over all alleles of all samples + for target_index in range(n_samples): + for allele_index in range(sample_ploidy[target_index]): + print(target_index, allele_index) + + # gibbs probs + gibbs = gibbs_probabilities( + target_index, + allele_index, + genotypes, + sample_ploidy, + sample_parents, + sample_children, + gamete_tau, + gamete_lambda, + gamete_error, + sample_read_dists, # array (n_samples, n_reads, n_pos, n_nucl) + sample_read_counts, # array (n_samples, n_reads) + haplotypes, # (n_haplotypes, n_pos) + log_frequencies=np.log(frequencies), + llk_cache=None, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + + # MH probs + mtx = [] + for i in range(n_alleles): + genotypes[target_index, allele_index] = i + probs = metropolis_hastings_probabilities( + target_index, + allele_index, + genotypes, + sample_ploidy, + sample_parents, + sample_children, + gamete_tau, + gamete_lambda, + gamete_error, + sample_read_dists, # array (n_samples, n_reads, n_pos, n_nucl) + sample_read_counts, # array (n_samples, n_reads) + haplotypes, # (n_haplotypes, n_pos) + log_frequencies=np.log(frequencies), + llk_cache=None, + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + mtx.append(probs) + mtx = np.array(mtx) + longrun = np.linalg.matrix_power(mtx, 100)[0] + assert not np.isnan(gibbs).any() + np.testing.assert_almost_equal(longrun, gibbs) + + +@pytest.mark.parametrize( + "parent, children", + [ + ( + [ + [-1, -1], + [-1, -1], + [0, 1], + [-1, 2], + ], + [ + [2], + [2], + [3], + [-1], + ], + ), + ( + [ + [-1, -1], + [-1, -1], + [-1, -1], + [-1, -1], + [0, 1], + [0, 1], + [0, 1], + [0, 1], + [0, 1], + [2, 3], + [2, 3], + [3, 2], + [2, 3], + [2, 3], + [2, 3], + [0, 3], + [0, 3], + [3, 0], + [0, 3], + [0, 3], + ], + [ + [4, 5, 6, 7, 8, 15, 16, 17, 18, 19, -1], + [4, 5, 6, 7, 8, -1, -1, -1, -1, -1, -1], + [9, 10, 11, 12, 13, 14, -1, -1, -1, -1, -1], + [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1], + ], + ), + ], +) +def test_sample_children_matrix(parent, children): + parent = np.array(parent) + children = np.array(children) + np.testing.assert_array_equal(sample_children_matrix(parent), children) + + +@pytest.mark.parametrize( + "parent, pairs, blankets", + [ + ( + [ + [-1, -1], + [-1, -1], + [0, 1], + [-1, 2], + ], + [ + [0, 1], + ], + [[0, 1, 2]], + ), + ( + [ + [-1, -1], + [-1, -1], + [-1, -1], + [-1, -1], + [0, 1], + [0, 1], + [0, 1], + [0, 1], + [0, 1], + [2, 3], + [2, 3], + [3, 2], + [2, 3], + [2, 3], + [2, 3], + [0, 3], + [0, 3], + [3, 0], + [0, 3], + [0, 3], + ], + [ + [0, 1], + [2, 3], + [0, 3], + ], + [ + [0, 1, 4, 5, 6, 7, 8, 15, 16, 17, 18, 19, -1, -1, -1, -1, -1, -1], + [2, 3, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, -1, -1, -1, -1, -1], + [0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], + ], + ), + ], +) +def test_parental_pair_markov_blankets(parent, pairs, blankets): + parent = np.array(parent) + pairs = np.array(pairs) + blankets = np.array(blankets) + children = sample_children_matrix(parent) + actual_pairs, actual_blankets = parental_pair_markov_blankets(parent, children) + np.testing.assert_array_equal(pairs, actual_pairs) + np.testing.assert_array_equal(blankets, actual_blankets) diff --git a/mchap/tests/test_pedigree/test_pedigree_prior.py b/mchap/tests/test_pedigree/test_pedigree_prior.py new file mode 100644 index 00000000..31ce0c1b --- /dev/null +++ b/mchap/tests/test_pedigree/test_pedigree_prior.py @@ -0,0 +1,698 @@ +import numpy as np +import pytest + +from mchap.jitutils import increment_genotype, comb_with_replacement +from mchap.calling.utils import count_allele +from mchap.pedigree.prior import ( + set_allelic_dosage, + set_parental_copies, + dosage_permutations, + set_initial_dosage, + set_complimentary_gamete, + increment_dosage, + double_reduction_permutations, + gamete_log_pmf, + gamete_allele_log_pmf, + gamete_const_log_pmf, + trio_log_pmf, + log_unknown_dosage_prior, + log_unknown_const_prior, +) + + +@pytest.mark.parametrize( + "parent, progeny, expect", + [ + ([0, 0, 0, 0], [0, 0, -2, -2], [4, 0, 0, 0]), + ([0, 1, 1, 2], [0, 2, -2, -2], [1, 1, 0, 0]), + ([0, 1, 2, 3, 4, 5], [6, 7, 8, -2, -2, -2], [0, 0, 0, 0, 0, 0]), + ([0, 1], [1, 1], [1, 0]), + ], +) +def test_set_parental_copies(parent, progeny, expect): + progeny = np.array(progeny) + parent = np.array(parent) + expect = np.array(expect) + observed = np.zeros_like(progeny) + set_parental_copies(parent, progeny, observed) + np.testing.assert_array_equal(observed, expect) + + +@pytest.mark.parametrize( + "gamete_dosage, parent_dosage, expect", + [ + ([2, 0], [2, 0], 1), + ([2, 0], [3, 0], 3), + ([2, 0], [4, 0], 6), + ([1, 1], [1, 0], 0), + ([1, 1], [1, 1], 1), + ([1, 1], [2, 1], 2), + ([1, 1], [2, 2], 4), + ([2, 1, 0], [2, 2, 0], 2), + ([2, 1, 0], [3, 2, 0], 6), + ], +) +def test_dosage_permutations(gamete_dosage, parent_dosage, expect): + gamete_dosage = np.array(gamete_dosage) + parent_dosage = np.array(parent_dosage) + observed = dosage_permutations(gamete_dosage, parent_dosage) + assert observed == expect + + +@pytest.mark.parametrize( + "ploidy, constraint, expect", + [ + (2, [2, 0, 2, 0], [2, 0, 0, 0]), + (2, [1, 2, 1, 0], [1, 1, 0, 0]), + (3, [1, 2, 1, 0], [1, 2, 0, 0]), + ], +) +def test_set_initial_dosage(ploidy, constraint, expect): + constraint = np.array(constraint) + expect = np.array(expect) + observed = np.zeros_like(constraint) + set_initial_dosage(ploidy, constraint, observed) + np.testing.assert_array_equal(observed, expect) + + +def test_initial_dosage__raise_on_ploidy(): + ploidy = 2 + constraint = np.array([1, 0, 0, 0]) + observed = np.zeros_like(constraint) + with pytest.raises(ValueError, match="Ploidy does not fit within constraint"): + set_initial_dosage(ploidy, constraint, observed) + + +@pytest.mark.parametrize( + "dosage, constraint, expect", + [ + ([2, 0, 0, 0], [2, 0, 2, 0], [1, 0, 1, 0]), + ([1, 0, 1, 0], [2, 0, 2, 0], [0, 0, 2, 0]), + ([1, 1, 0, 0], [3, 1, 2, 0], [1, 0, 1, 0]), + ([1, 0, 1, 0], [3, 1, 2, 0], [0, 1, 1, 0]), + ], +) +def test_increment_dosage(dosage, constraint, expect): + dosage = np.array(dosage) + expect = np.array(expect) + constraint = np.array(constraint) + increment_dosage(dosage, constraint) + np.testing.assert_array_equal(dosage, expect) + + +def test_increment_dosage__raise_on_final(): + dosage = np.array([0, 0, 2, 0]) + constraint = np.array([2, 0, 2, 0]) + with pytest.raises(ValueError, match="Final dosage"): + increment_dosage(dosage, constraint) + + +@pytest.mark.parametrize( + "dosage, gamete, expect", + [ + ([2, 0, 2, 0], [1, 0, 1, 0], [1, 0, 1, 0]), + ([1, 0, 1, 0], [0, 0, 1, 0], [1, 0, 0, 0]), + ([1, 2, 1, 0], [1, 1, 0, 0], [0, 1, 1, 0]), + ([1, 0, 1, 0, 1, 3], [1, 0, 1, 0, 0, 1], [0, 0, 0, 0, 1, 2]), + ], +) +def test_set_complimentary_gamete(dosage, gamete, expect): + dosage = np.array(dosage) + gamete = np.array(gamete) + expect = np.array(expect) + compliment = np.zeros_like(dosage) + set_complimentary_gamete(dosage, gamete, compliment) + np.testing.assert_array_equal(dosage, gamete + compliment) + np.testing.assert_array_equal(compliment, expect) + + +@pytest.mark.parametrize( + "gamete_dosage, parent_dosage, expect", + [ + ([1, 1], [1, 1], 0), + ([1, 1], [2, 0], 0), + ([2, 0], [1, 0], 1), + ([2, 0], [2, 0], 2), + ], +) +def test_double_reduction_permutations(gamete_dosage, parent_dosage, expect): + gamete_dosage = np.array(gamete_dosage) + parent_dosage = np.array(parent_dosage) + observed = double_reduction_permutations(gamete_dosage, parent_dosage) + assert expect == observed + + +@pytest.mark.parametrize( + "parent_dosage, parent_ploidy, gamete_dosage, gamete_ploidy, lambda_, expect", + [ + ([2, 0], 2, [1, 0], 1, 0.0, 1.0), + ([1, 1], 2, [1, 0], 1, 0.0, 0.5), + ([1, 0], 2, [1, 0], 1, 0.0, 0.5), + ([0, 2], 2, [1, 0], 1, 0.0, 0.0), + ([1, 1], 2, [1, 1], 2, 0.0, 1.0), # WGD + ([0, 2], 2, [0, 2], 2, 0.0, 1.0), # WGD + ([1, 1], 2, [1, 1], 2, 0.2, 0.8), # S/FDR + ([1, 1], 2, [0, 2], 2, 1.0, 0.5), # PMR + ([1, 1], 2, [0, 2], 2, 0.5, 0.25), # PMR + ([4, 0, 0, 0], 4, [2, 0, 0, 0], 2, 0.0, 1.0), + ([0, 0, 4, 0], 4, [0, 0, 2, 0], 2, 0.0, 1.0), + ([0, 1, 3, 0], 4, [0, 0, 2, 0], 2, 0.0, 0.5), + ([0, 0, 3, 0], 4, [0, 0, 2, 0], 2, 0.0, 0.5), + ([0, 2, 2, 0], 4, [0, 1, 1, 0], 2, 0.0, 8 / 12), + ([0, 2, 0, 1], 4, [0, 1, 1, 0], 2, 0.0, 0.0), + ([0, 1, 1, 1], 4, [0, 0, 2, 0], 2, 0.0, 0.0), + ([4, 0, 0, 0], 4, [2, 0, 0, 0], 2, 0.5, 1.0), + ([1, 1, 1, 1], 4, [2, 0, 0, 0], 2, 0.5, 0.125), + ([2, 0, 0, 0], 4, [2, 0, 0, 0], 2, 0.5, (2 / 12 + 0.5 * 4 / 12)), + ([2, 0, 0, 0], 4, [2, 0, 0, 0], 2, 0.1, (2 / 12 + 0.1 * 4 / 12)), + ([1, 3, 0, 0], 4, [0, 2, 0, 0], 2, 0.5, (6 / 12 + 0.5 * 3 / 12)), + ([1, 1, 1, 1, 1, 1], 6, [0, 0, 0, 1, 1, 1], 3, 0.0, 6 / 120), + ([2, 2, 1, 1, 0, 0], 6, [1, 1, 1, 0, 0, 0], 3, 0.0, 24 / 120), + ([2, 2, 1, 1, 0, 0], 6, [2, 0, 1, 0, 0, 0], 3, 0.0, 6 / 120), + ([2, 2, 1, 1, 0, 0], 6, [2, 1, 0, 0, 0, 0], 3, 0.0, 12 / 120), + ], +) +def test_gamete_log_pmf( + parent_dosage, parent_ploidy, gamete_dosage, gamete_ploidy, lambda_, expect +): + gamete_dosage = np.array(gamete_dosage) + parent_dosage = np.array(parent_dosage) + actual = gamete_log_pmf( + gamete_dose=gamete_dosage, + gamete_ploidy=gamete_ploidy, + parent_dose=parent_dosage, + parent_ploidy=parent_ploidy, + gamete_lambda=lambda_, + ) + np.testing.assert_almost_equal(expect, np.exp(actual)) + + +@pytest.mark.parametrize( + "seed", + np.arange(10), +) +def test_gamete_log_pmf__sum_to_one(seed): + np.random.seed(seed) + n_alleles = np.random.randint(1, 10) + gamete_ploidy = np.random.randint(1, 3) + parent_ploidy = np.random.randint(2, 4) + parent_genotype = np.random.randint(n_alleles, size=parent_ploidy) + n_gametes = comb_with_replacement(n_alleles, gamete_ploidy) + total_prob = 0.0 + gamete_genotype = np.zeros(gamete_ploidy, int) + gamete_dosage = np.zeros_like(gamete_genotype) + parent_dosage = np.zeros_like(gamete_genotype) + for _ in range(n_gametes): + set_allelic_dosage(gamete_genotype, gamete_dosage) + set_parental_copies(parent_genotype, gamete_genotype, parent_dosage) + prob = np.exp( + gamete_log_pmf( + gamete_dose=gamete_dosage, + gamete_ploidy=gamete_ploidy, + parent_dose=parent_dosage, + parent_ploidy=parent_ploidy, + gamete_lambda=0.0, + ) + ) + total_prob += prob + increment_genotype(gamete_genotype) + np.testing.assert_almost_equal(total_prob, 1.0) + + +@pytest.mark.parametrize( + "seed", + np.arange(10), +) +def test_gamete_log_pmf__sum_to_one_lambda(seed): + np.random.seed(seed) + n_alleles = np.random.randint(1, 10) + gamete_ploidy = 2 + parent_ploidy = np.random.randint(2, 4) + parent_genotype = np.random.randint(n_alleles, size=parent_ploidy) + n_gametes = comb_with_replacement(n_alleles, gamete_ploidy) + total_prob = 0.0 + lambda_ = np.random.rand() + gamete_genotype = np.zeros(gamete_ploidy, int) + gamete_dosage = np.zeros_like(gamete_genotype) + parent_dosage = np.zeros_like(gamete_genotype) + for _ in range(n_gametes): + set_allelic_dosage(gamete_genotype, gamete_dosage) + set_parental_copies(parent_genotype, gamete_genotype, parent_dosage) + prob = np.exp( + gamete_log_pmf( + gamete_dose=gamete_dosage, + gamete_ploidy=gamete_ploidy, + parent_dose=parent_dosage, + parent_ploidy=parent_ploidy, + gamete_lambda=lambda_, + ) + ) + total_prob += prob + increment_genotype(gamete_genotype) + np.testing.assert_almost_equal(total_prob, 1.0) + + +def test_gamete_log_pmf__raise_on_non_diploid_lambda(): + with pytest.raises( + ValueError, match="Lambda parameter is only supported for diploid gametes" + ): + gamete_log_pmf( + gamete_dose=np.array([2, 1, 0]), + gamete_ploidy=3, + parent_dose=np.array([2, 2, 2]), + parent_ploidy=6, + gamete_lambda=0.01, + ) + + +@pytest.mark.parametrize( + "parent_count, parent_ploidy, gamete_count, gamete_ploidy, lambda_, expect", + [ + (2, 2, 1, 1, 0.0, 1.0), + (1, 2, 1, 1, 0.0, 0.5), + (0, 2, 1, 1, 0.0, 0.0), + (1, 2, 1, 2, 0.0, 1.0), # WGD + (1, 2, 1, 2, 0.5, 0.5), # FDR/SDR + (2, 2, 2, 2, 0.5, 1.0), # FDR/SDR + (1, 2, 1, 2, 1.0, 0.0), # PMR + (4, 4, 2, 2, 0.0, 1.0), + (1, 4, 1, 2, 0.0, 1 / 3), + (2, 4, 1, 2, 0.0, 2 / 3), + (3, 4, 1, 2, 0.0, 3 / 3), + (1, 4, 2, 2, 0.0, 0 / 3), + (2, 4, 2, 2, 0.0, 1 / 3), + (3, 4, 2, 2, 0.0, 2 / 3), + (4, 4, 2, 2, 0.0, 3 / 3), + (0, 4, 2, 2, 0.5, 0.0), # DR + (1, 4, 2, 2, 0.5, 0.5), # DR + (2, 4, 2, 2, 0.5, (1 / 3 * 0.5 + 0.5)), # DR + (2, 4, 2, 2, 0.1, (1 / 3 * 0.9 + 0.1)), # DR + (3, 4, 2, 2, 0.1, (2 / 3 * 0.9 + 0.1)), # DR + (4, 4, 2, 2, 0.1, 1.0), # DR + ], +) +def test_gamete_allele_log_pmf( + parent_count, parent_ploidy, gamete_count, gamete_ploidy, lambda_, expect +): + actual = gamete_allele_log_pmf( + gamete_count=gamete_count, + gamete_ploidy=gamete_ploidy, + parent_count=parent_count, + parent_ploidy=parent_ploidy, + gamete_lambda=lambda_, + ) + np.testing.assert_almost_equal(expect, np.exp(actual)) + + +@pytest.mark.parametrize( + "seed", + np.arange(20), +) +def test_gamete_allele_log_pmf__sum_to_one(seed): + np.random.seed(seed) + n_alleles = np.random.randint(15) + parent_ploidy = np.random.randint(2, 7) + gamete_ploidy = np.random.randint(1, parent_ploidy) + parent_genotype = np.random.randint(n_alleles, size=parent_ploidy) + gamete_genotype = np.random.choice( + parent_genotype, size=gamete_ploidy, replace=False + ) + variable_index = np.random.randint(gamete_ploidy) + total = 0.0 + for i in range(n_alleles): + gamete_genotype[variable_index] = i + gamete_count = count_allele(gamete_genotype, i) + parent_count = count_allele(parent_genotype, i) + prob = np.exp( + gamete_allele_log_pmf( + gamete_count=gamete_count, + gamete_ploidy=gamete_ploidy, + parent_count=parent_count, + parent_ploidy=parent_ploidy, + gamete_lambda=0.0, + ) + ) + total += prob + np.testing.assert_almost_equal(total, 1.0) + + +@pytest.mark.parametrize( + "seed", + np.arange(20), +) +def test_gamete_allele_log_pmf__sum_to_one_lambda(seed): + np.random.seed(seed) + n_alleles = np.random.randint(15) + gamete_lambda = np.random.rand() + parent_ploidy = np.random.randint(2, 7) + gamete_ploidy = 2 + parent_genotype = np.random.randint(n_alleles, size=parent_ploidy) + gamete_genotype = np.random.choice( + parent_genotype, size=gamete_ploidy, replace=False + ) + variable_index = np.random.randint(gamete_ploidy) + total = 0.0 + for i in range(n_alleles): + gamete_genotype[variable_index] = i + gamete_count = count_allele(gamete_genotype, i) + parent_count = count_allele(parent_genotype, i) + prob = np.exp( + gamete_allele_log_pmf( + gamete_count=gamete_count, + gamete_ploidy=gamete_ploidy, + parent_count=parent_count, + parent_ploidy=parent_ploidy, + gamete_lambda=gamete_lambda, + ) + ) + total += prob + np.testing.assert_almost_equal(total, 1.0) + + +def test_gamete_allele_log_pmf__raise_on_count_greater_than_tau(): + with pytest.raises(AssertionError): + gamete_allele_log_pmf( + gamete_count=2, + gamete_ploidy=1, + parent_count=2, + parent_ploidy=2, + gamete_lambda=0.0, + ) + + +def test_gamete_allele_log_pmf__raise_on_count_greater_than_ploidy(): + with pytest.raises(AssertionError): + gamete_allele_log_pmf( + gamete_count=1, + gamete_ploidy=1, + parent_count=3, + parent_ploidy=2, + gamete_lambda=0.0, + ) + + +def test_gamete_allele_log_pmf__raise_on_diploid_lambda(): + with pytest.raises(ValueError): + gamete_allele_log_pmf( + gamete_count=1, + gamete_ploidy=1, + parent_count=1, + parent_ploidy=2, + gamete_lambda=0.1, + ) + + +def test_gamete_allele_log_pmf__raise_on_hexaploid_lambda(): + with pytest.raises(ValueError): + gamete_allele_log_pmf( + gamete_count=1, + gamete_ploidy=3, + parent_count=1, + parent_ploidy=6, + gamete_lambda=0.1, + ) + + +@pytest.mark.parametrize( + "index, parent_dosage, parent_ploidy, gamete_dosage, gamete_ploidy, expect", + [ + (0, [2, 0], 2, [1, 0], 1, 1.0), # haploid gamete has no constant + (0, [1, 1], 2, [1, 0], 1, 1.0), # haploid gamete has no constant + (0, [0, 0], 2, [1, 0], 1, 1.0), # haploid gamete has no constant + (0, [4, 0, 0, 0], 4, [2, 0, 0, 0], 2, 1.0), + (0, [2, 2, 0, 0], 4, [2, 0, 0, 0], 2, 2 / 4), + (0, [1, 1, 0, 0], 4, [1, 1, 0, 0], 2, 0.25), + (1, [1, 1, 0, 0], 4, [1, 1, 0, 0], 2, 0.25), + (1, [1, 1, 0, 0], 4, [1, 1, 0, 0], 2, 0.25), + ( + 0, + [1, 1, 0, 0], + 4, + [2, 0, 0, 0], + 2, + 0.25, + ), # invalid gamete with valid constant + (1, [1, 1, 1, 0, 0, 0], 6, [1, 1, 1, 0, 0, 0], 3, (2 * 1 / 6 * 1 / 5)), + (1, [1, 4, 1, 0, 0, 0], 6, [1, 1, 1, 0, 0, 0], 3, (2 * 1 / 6 * 1 / 5)), + ( + 1, + [2, 1, 1, 0, 0, 0], + 6, + [1, 1, 1, 0, 0, 0], + 3, + (2 / 6 * 1 / 5 + 1 / 6 * 2 / 5), + ), + (1, [2, 1, 1, 0, 0, 0], 6, [2, 1, 0, 0, 0, 0], 3, (2 / 6 * 1 / 5)), + ], +) +def test_gamete_const_log_pmf( + index, parent_dosage, parent_ploidy, gamete_dosage, gamete_ploidy, expect +): + gamete_dosage = np.array(gamete_dosage) + parent_dosage = np.array(parent_dosage) + actual = gamete_const_log_pmf( + allele_index=index, + gamete_dose=gamete_dosage, + gamete_ploidy=gamete_ploidy, + parent_dose=parent_dosage, + parent_ploidy=parent_ploidy, + ) + np.testing.assert_almost_equal(expect, np.exp(actual)) + + +@pytest.mark.parametrize( + "dosage, frequencies, expect", + [ + ([4, 0, 0, 0], [1 / 4, 1 / 4, 1 / 4, 1 / 4], 1 / (4**4)), + ([3, 0, 1, 0], [1 / 4, 1 / 4, 1 / 4, 1 / 4], 4 / (4**4)), + ([1, 0, 1, 0], [1 / 4, 1 / 4, 1 / 4, 1 / 4], 2 / (4**2)), + ([1, 0, 1, 0], [0.6, 0.1, 0.1, 0.2], 2 * 0.6 * 0.1), + ], +) +def test_log_unknown_dosage_prior(dosage, frequencies, expect): + dosage = np.array(dosage) + frequencies = np.array(frequencies) + log_frequencies = np.log(frequencies) + actual = log_unknown_dosage_prior(dosage, log_frequencies) + np.testing.assert_almost_equal(np.exp(actual), expect) + + +@pytest.mark.parametrize( + "dosage, allele_index, frequencies, expect", + [ + ([4, 0, 0, 0], 0, [1 / 4, 1 / 4, 1 / 4, 1 / 4], 1 / (4**3)), + ([4, 0, 0, 0], 1, [1 / 4, 1 / 4, 1 / 4, 1 / 4], 0.0), # imposable const + ([3, 0, 1, 0], 0, [1 / 4, 1 / 4, 1 / 4, 1 / 4], 3 / (4**3)), + ([1, 0, 1, 0], 2, [1 / 4, 1 / 4, 1 / 4, 1 / 4], 1 / 4), + ([0, 0, 1, 1], 2, [0.6, 0.1, 0.1, 0.2], 0.2), + ], +) +def test_log_unknown_const_prior(dosage, allele_index, frequencies, expect): + dosage = np.array(dosage) + frequencies = np.array(frequencies) + log_frequencies = np.log(frequencies) + actual = log_unknown_const_prior(dosage, allele_index, log_frequencies) + np.testing.assert_almost_equal(np.exp(actual), expect) + + +def test_trio_log_pmf__sum_to_one__tetraploid(): + np.random.seed(0) + max_ploidy = 4 + n_alleles = 3 + ploidy_p = 4 + ploidy_q = 4 + parent_p = np.random.randint(n_alleles, size=max_ploidy) + parent_q = np.random.randint(n_alleles, size=max_ploidy) + tau_p = 2 + tau_q = 2 + error_p = 0.1 + error_q = 0.1 + frequencies = np.random.rand(n_alleles) + frequencies /= frequencies.sum() + + # scratch variables + dosage = np.zeros(max_ploidy, dtype=np.int64) + dosage_p = np.zeros(max_ploidy, dtype=np.int64) + dosage_q = np.zeros(max_ploidy, dtype=np.int64) + gamete_p = np.zeros(max_ploidy, dtype=np.int64) + gamete_q = np.zeros(max_ploidy, dtype=np.int64) + constraint_p = np.zeros(max_ploidy, dtype=np.int64) + constraint_q = np.zeros(max_ploidy, dtype=np.int64) + dosage_log_frequencies = np.zeros(max_ploidy, dtype=np.float64) + + ploidy = tau_p + tau_q + n_genotypes = comb_with_replacement(n_alleles, ploidy) + + total_prob = 0.0 + genotype = np.zeros(max_ploidy, dtype=np.int64) + for _ in range(n_genotypes): + prob = np.exp( + trio_log_pmf( + progeny=genotype, + parent_p=parent_p, + parent_q=parent_q, + ploidy_p=ploidy_p, + ploidy_q=ploidy_q, + tau_p=tau_p, + tau_q=tau_q, + lambda_p=0.0, + lambda_q=0.0, + error_p=error_p, + error_q=error_q, + log_frequencies=np.log(frequencies), + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + ) + total_prob += prob + increment_genotype(genotype) + np.testing.assert_almost_equal(total_prob, 1.0) + + +@pytest.mark.parametrize( + "seed", + np.arange(50), +) +def test_trio_log_pmf__sum_to_one(seed): + np.random.seed(seed) + max_ploidy = 7 + n_alleles = np.random.randint(1, 10) + ploidy_p = np.random.randint(2, max_ploidy) + ploidy_q = np.random.randint(2, max_ploidy) + tau_p = np.random.randint(1, ploidy_p) + tau_q = np.random.randint(1, ploidy_q) + + # adjust max ploidy if exceeded by progeny ploidy + ploidy = tau_p + tau_q + max_ploidy = max(max_ploidy, ploidy) + + parent_p = np.random.randint(n_alleles, size=max_ploidy) + parent_q = np.random.randint(n_alleles, size=max_ploidy) + parent_p[ploidy_p:] = -2 + parent_q[ploidy_q:] = -2 + error_p = np.random.rand() + error_q = np.random.rand() + frequencies = np.random.rand(n_alleles) + frequencies /= frequencies.sum() + + # scratch variables + dosage = np.zeros(max_ploidy, dtype=np.int64) + dosage_p = np.zeros(max_ploidy, dtype=np.int64) + dosage_q = np.zeros(max_ploidy, dtype=np.int64) + gamete_p = np.zeros(max_ploidy, dtype=np.int64) + gamete_q = np.zeros(max_ploidy, dtype=np.int64) + constraint_p = np.zeros(max_ploidy, dtype=np.int64) + constraint_q = np.zeros(max_ploidy, dtype=np.int64) + dosage_log_frequencies = np.zeros(max_ploidy, dtype=np.float64) + + n_genotypes = comb_with_replacement(n_alleles, ploidy) + + total_prob = 0.0 + genotype = np.zeros(max_ploidy, dtype=np.int64) + genotype[ploidy:] = -2 + for _ in range(n_genotypes): + prob = np.exp( + trio_log_pmf( + progeny=genotype, + parent_p=parent_p, + parent_q=parent_q, + ploidy_p=ploidy_p, + ploidy_q=ploidy_q, + tau_p=tau_p, + tau_q=tau_q, + lambda_p=0.0, + lambda_q=0.0, + error_p=error_p, + error_q=error_q, + log_frequencies=np.log(frequencies), + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + ) + total_prob += prob + increment_genotype(genotype[0:ploidy]) + np.testing.assert_almost_equal(total_prob, 1.0) + + +@pytest.mark.parametrize( + "use_lambda_p,use_lambda_q", + [[True, False], [False, True], [True, True]], +) +@pytest.mark.parametrize( + "seed", + np.arange(50), +) +def test_trio_log_pmf__sum_to_one_lambda(seed, use_lambda_p, use_lambda_q): + np.random.seed(seed) + max_ploidy = 4 + n_alleles = np.random.randint(1, 10) + ploidy_p = np.random.randint(2, max_ploidy) + ploidy_q = np.random.randint(2, max_ploidy) + parent_p = np.random.randint(n_alleles, size=max_ploidy) + parent_q = np.random.randint(n_alleles, size=max_ploidy) + parent_p[ploidy_p:] = -2 + parent_q[ploidy_q:] = -2 + tau_p, tau_q = 2, 2 # progeny ploidy = max_ploidy + lambda_p = np.random.rand() if use_lambda_p else 0.0 + lambda_q = np.random.rand() if use_lambda_q else 0.0 + error_p = np.random.rand() + error_q = np.random.rand() + frequencies = np.random.rand(n_alleles) + frequencies /= frequencies.sum() + + # scratch variables + dosage = np.zeros(max_ploidy, dtype=np.int64) + dosage_p = np.zeros(max_ploidy, dtype=np.int64) + dosage_q = np.zeros(max_ploidy, dtype=np.int64) + gamete_p = np.zeros(max_ploidy, dtype=np.int64) + gamete_q = np.zeros(max_ploidy, dtype=np.int64) + constraint_p = np.zeros(max_ploidy, dtype=np.int64) + constraint_q = np.zeros(max_ploidy, dtype=np.int64) + dosage_log_frequencies = np.zeros(max_ploidy, dtype=np.float64) + + ploidy = tau_p + tau_q + n_genotypes = comb_with_replacement(n_alleles, ploidy) + + total_prob = 0.0 + genotype = np.zeros(max_ploidy, int) + genotype[ploidy:] = -2 + for _ in range(n_genotypes): + prob = np.exp( + trio_log_pmf( + progeny=genotype, + parent_p=parent_p, + parent_q=parent_q, + ploidy_p=ploidy_p, + ploidy_q=ploidy_q, + tau_p=tau_p, + tau_q=tau_q, + lambda_p=lambda_p, + lambda_q=lambda_q, + error_p=error_p, + error_q=error_q, + log_frequencies=np.log(frequencies), + dosage=dosage, + dosage_p=dosage_p, + dosage_q=dosage_q, + gamete_p=gamete_p, + gamete_q=gamete_q, + constraint_p=constraint_p, + constraint_q=constraint_q, + dosage_log_frequencies=dosage_log_frequencies, + ) + ) + total_prob += prob + increment_genotype(genotype[0:ploidy]) + np.testing.assert_almost_equal(total_prob, 1.0) diff --git a/mchap/tests/test_pedigree/test_pedigree_validation.py b/mchap/tests/test_pedigree/test_pedigree_validation.py new file mode 100644 index 00000000..c9e18178 --- /dev/null +++ b/mchap/tests/test_pedigree/test_pedigree_validation.py @@ -0,0 +1,70 @@ +import numpy as np +import pytest + + +from mchap.pedigree.validation import duo_valid, trio_valid + + +@pytest.mark.parametrize( + "progeny, parent, tau, lambda_, expect", + [ + ([0, 0, 0, 0], [0, 0, 0, 0], 2, 0.0, True), + ([0, 0, 0, 0], [0, 0], 2, 0.0, True), + ([1, 1, 1, 1], [0, 0, 0, 1], 2, 0.0, False), + ([1, 1, 1, 1], [0, 0, 0, 1], 2, 0.1, True), + ([0, 0, 0, 0], [1, 2, 3, 4], 2, 0.0, False), + ([0, 0, 0, 0], [1, 2, 3, 4], 2, 0.1, False), + ([0, 0, 0, 0], [0, 0, 3, 4], 3, 0.0, False), + ([0, 0, 0, 0], [0, 0, 0, 4], 3, 0.0, True), + ], +) +def test_duo_valid(progeny, parent, tau, lambda_, expect): + progeny = np.array(progeny) + parent = np.array(parent) + assert duo_valid(progeny, parent, tau, lambda_) == expect + + +@pytest.mark.parametrize( + "progeny, parent_p, parent_q, tau_p, tau_q, lambda_p, lambda_q, expect", + [ + ([0, 0], [0, 0], [0, 0], 1, 1, 0, 0, True), + ([0, 1], [0, 0], [1, 1], 1, 1, 0, 0, True), + ([0, 1], [0, 3], [1, 2], 1, 1, 0, 0, True), + ([0, 1], [0, 1], [2, 3], 1, 1, 0, 0, False), + ([0, 3], [0, 1], [0, 2], 1, 1, 0, 0, False), + ([0, 1, 2, 3], [0, 1], [2, 3], 2, 2, 0, 0, True), + ([1, 1, 2, 3], [0, 1], [2, 3], 2, 2, 0, 0, False), + ([1, 1, 2, 3], [0, 1], [2, 3], 2, 2, 0.5, 0, True), + ([0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], 2, 2, 0, 0, True), + ([0, 0, 1, 1], [0, 0, 0, 0], [1, 1, 1, 1], 2, 2, 0, 0, True), + ([0, 0, 0, 1], [0, 0, 0, 0], [1, 1, 1, 1], 2, 2, 0, 0, False), + ([0, 1, 1, 1], [0, 0, 0, 0], [1, 1, 1, 1], 2, 2, 0, 0, False), + ([0, 1, 1, 1], [0, 0, 0, 0], [1, 1, 1, 1], 2, 2, 0.1, 0.1, False), + ([1, 1, 1, 1], [0, 0, 0, 1], [1, 1, 2, 2], 2, 2, 0.1, 0.0, True), + ([1, 1, 1, 1], [0, 0, 0, 1], [1, 1, 2, 2], 2, 2, 0.0, 0.1, False), + ([1, 1, 1, 3], [0, 0, 1, 2], [1, 1, 2, 3], 2, 2, 0.0, 0.0, False), + ([1, 1, 1, 3], [0, 0, 1, 2], [1, 1, 2, 3], 2, 2, 0.1, 0.0, True), + ([0, 0, 0, 3], [0, 0, 0, 1], [0, 0, 0, 2], 2, 2, 0, 0, False), + ([0, 0, 0, 3], [0, 0, 0, 1], [0, 0, 0, 2], 2, 2, 0.1, 0.1, False), + ([0, 1, 1, 2, 2, 3], [0, 0, 1, 2, 2, 2], [1, 1, 1, 1, 2, 3], 3, 3, 0, 0, True), + ([0, 1, 2, 2, 2, 3], [0, 0, 1, 2, 2, 2], [0, 0, 0, 3, 3, 3], 3, 3, 0, 0, False), + ], +) +def test_trio_valid( + progeny, parent_p, parent_q, tau_p, tau_q, lambda_p, lambda_q, expect +): + progeny = np.array(progeny) + parent_p = np.array(parent_p) + parent_q = np.array(parent_q) + assert ( + trio_valid( + progeny, + parent_p, + parent_q, + tau_p, + tau_q, + lambda_p, + lambda_q, + ) + == expect + ) diff --git a/mchap/version.py b/mchap/version.py index c5981731..7efea9ea 100644 --- a/mchap/version.py +++ b/mchap/version.py @@ -1 +1,7 @@ -__version__ = "0.9.3" +from importlib.metadata import version, PackageNotFoundError + +try: + __version__ = version("mchap") +except PackageNotFoundError: + # package is not installed + pass diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 00000000..aebf538b --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,3 @@ +pytest +pre-commit +setuptools_scm \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index d9426f66..dcfde99e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ -numpy +numpy < 2.0.0 pandas scipy numba pysam -pytest diff --git a/setup.cfg b/setup.cfg index 93a2b70e..89138f24 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,3 +1,43 @@ +[metadata] +name = mchap +author = Tim Millar +author_email = tim.millar@plantandfood.co.nz +license = MIT +description = Polyploid micro-haplotype assembly +long_description_content_type=text/x-rst +long_description = + Polyploid micro-haplotype assembly +url = https://github.com/PlantandFoodResearch/MCHap +classifiers = + Development Status :: 4 - Beta + Environment :: Console + Intended Audience :: Science/Research + Natural Language :: English + Operating System :: POSIX :: Linux + Programming Language :: Python :: 3.8 + Programming Language :: Python :: 3.9 + Programming Language :: Python :: 3.10 + Topic :: Scientific/Engineering :: Bio-Informatics + +[options] +packages = mchap +include_package_data = True +python_requires = >=3.9 +install_requires = + numpy < 2.0.0 + pandas + scipy + numba + pysam + setuptools >= 41.2 +setup_requires = + setuptools >= 41.2 + setuptools_scm + +[options.entry_points] +console_scripts = + mchap=mchap.application.cli:main + [flake8] ignore = # whitespace before ':' - doesn't work well with black diff --git a/setup.py b/setup.py index 50cd6092..b793603d 100644 --- a/setup.py +++ b/setup.py @@ -1,48 +1,3 @@ -#! /usr/bin/env python3 - -import os from setuptools import setup - -def read_file(file_name): - path = os.path.join(os.path.dirname(__file__), file_name) - with open(path) as f: - lines = f.readlines() - return "\n".join(lines) - - -VERSION = read_file("mchap/version.py").split('"')[1] - -setup( - name="mchap", - version=VERSION, - author="Tim Millar", - author_email="tim.millar@plantandfood.co.nz", - description="Polyploid micro-haplotype assembly", - long_description=read_file("README.rst"), - entry_points={"console_scripts": ["mchap=mchap.application.cli:main"]}, - packages=[ - "mchap", - "mchap/application", - "mchap/assemble", - "mchap/calling", - "mchap/encoding", - "mchap/encoding/integer", - "mchap/encoding/character", - "mchap/io", - "mchap/io/vcf", - ], - python_requires=">3.7.0", - keywords=["biology", "bioinformatics", "genetics", "genomics"], - classifiers=[ - "Development Status :: 4 - Beta", - "Environment :: Console", - "Intended Audience :: Science/Research", - "Natural Language :: English", - "Operating System :: POSIX :: Linux", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Topic :: Scientific/Engineering :: Bio-Informatics", - ], -) +setup(name="mchap", use_scm_version=True)