snps


Namesnps JSON
Version 2.9.0 PyPI version JSON
download
home_pagehttps://github.com/apriha/snps
Summarytools for reading, writing, merging, and remapping SNPs
upload_time2024-08-26 05:03:24
maintainerNone
docs_urlNone
authorAndrew Riha
requires_python>=3.8
licenseBSD 3-Clause License
keywords snps dna chromosomes bioinformatics vcf
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            .. image:: https://raw.githubusercontent.com/apriha/snps/master/docs/images/snps_banner.png

|ci| |codecov| |docs| |pypi| |python| |downloads| |ruff|

snps
====
tools for reading, writing, merging, and remapping SNPs 🧬

``snps`` *strives to be an easy-to-use and accessible open-source library for working with
genotype data*

Features
--------
Input / Output
``````````````
- Read raw data (genotype) files from a variety of direct-to-consumer (DTC) DNA testing
  sources with a `SNPs <https://snps.readthedocs.io/en/stable/snps.html#snps.snps.SNPs>`_
  object
- Read and write VCF files (e.g., convert `23andMe <https://www.23andme.com>`_ to VCF)
- Merge raw data files from different DNA tests, identifying discrepant SNPs in the process
- Read data in a variety of formats (e.g., files, bytes, compressed with `gzip` or `zip`)
- Handle several variations of file types, validated via
  `openSNP parsing analysis <https://github.com/apriha/snps/tree/master/analysis/parse-opensnp-files>`_

Build / Assembly Detection and Remapping
````````````````````````````````````````
- Detect the build / assembly of SNPs (supports builds 36, 37, and 38)
- Remap SNPs between builds / assemblies

Data Cleaning
`````````````
- Perform quality control (QC) / filter low quality SNPs based on `chip clusters <https://doi.org/10.1016/j.csbj.2021.06.040>`_
- Fix several common issues when loading SNPs
- Sort SNPs based on chromosome and position
- Deduplicate RSIDs
- Deduplicate alleles in the non-PAR regions of the X and Y chromosomes for males
- Deduplicate alleles on MT
- Assign PAR SNPs to the X or Y chromosome

Analysis
````````
- Derive sex from SNPs
- Detect deduced genotype / chip array and chip version based on `chip clusters <https://doi.org/10.1016/j.csbj.2021.06.040>`_
- Predict ancestry from SNPs (when installed with `ezancestry <https://github.com/arvkevi/ezancestry>`_)

Supported Genotype Files
------------------------
``snps`` supports `VCF <https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3137218/>`_ files and
genotype files from the following DNA testing sources:

- `23andMe <https://www.23andme.com>`_
- `Ancestry <https://www.ancestry.com>`_
- `CircleDNA <https://circledna.com/>`_
- `Código 46 <https://codigo46.com.mx>`_
- `DNA.Land <https://dna.land>`_
- `Family Tree DNA <https://www.familytreedna.com>`_
- `Genes for Good <https://genesforgood.sph.umich.edu>`_
- `LivingDNA <https://livingdna.com>`_
- `Mapmygenome <https://mapmygenome.in>`_
- `MyHeritage <https://www.myheritage.com>`_
- `PLINK <https://www.cog-genomics.org/plink/>`_
- `Sano Genetics <https://sanogenetics.com>`_
- `tellmeGen <https://www.tellmegen.com>`_

Additionally, ``snps`` can read a variety of "generic" CSV and TSV files.

Dependencies
------------
``snps`` requires `Python <https://www.python.org>`_ 3.8+ and the following Python
packages:

- `numpy <http://www.numpy.org>`_
- `pandas <http://pandas.pydata.org>`_
- `atomicwrites <https://github.com/untitaker/python-atomicwrites>`_

Installation
------------
``snps`` is `available <https://pypi.org/project/snps/>`_ on the
`Python Package Index <https://pypi.org>`_. Install ``snps`` (and its required
Python dependencies) via ``pip``::

    $ pip install snps

For `ancestry prediction <https://snps.readthedocs.io/en/stable/snps.html#snps.snps.SNPs.predict_ancestry>`_
capability, ``snps`` can be installed with `ezancestry <https://github.com/arvkevi/ezancestry>`_::

    $ pip install snps[ezancestry]

Examples
--------
Download Example Data
`````````````````````
First, let's setup logging to get some helpful output:

>>> import logging, sys
>>> logger = logging.getLogger()
>>> logger.setLevel(logging.INFO)
>>> logger.addHandler(logging.StreamHandler(sys.stdout))

Now we're ready to download some example data from `openSNP <https://opensnp.org>`_:

>>> from snps.resources import Resources
>>> r = Resources()
>>> paths = r.download_example_datasets()
Downloading resources/662.23andme.340.txt.gz
Downloading resources/662.ftdna-illumina.341.csv.gz

Load Raw Data
`````````````
Load a `23andMe <https://www.23andme.com>`_ raw data file:

>>> from snps import SNPs
>>> s = SNPs("resources/662.23andme.340.txt.gz")
>>> s.source
'23andMe'
>>> s.count
991786

The ``SNPs`` class accepts a path to a file or a bytes object. A ``Reader`` class attempts to
infer the data source and load the SNPs. The loaded SNPs are
`normalized <https://snps.readthedocs.io/en/stable/snps.html#snps.snps.SNPs.snps>`_ and
available via a ``pandas.DataFrame``:

>>> df = s.snps
>>> df.columns.values
array(['chrom', 'pos', 'genotype'], dtype=object)
>>> df.index.name
'rsid'
>>> df.chrom.dtype.name
'object'
>>> df.pos.dtype.name
'uint32'
>>> df.genotype.dtype.name
'object'
>>> len(df)
991786

``snps`` also attempts to detect the build / assembly of the data:

>>> s.build
37
>>> s.build_detected
True
>>> s.assembly
'GRCh37'

Merge Raw Data Files
````````````````````
The dataset consists of raw data files from two different DNA testing sources - let's combine
these files. Specifically, we'll update the ``SNPs`` object with SNPs from a
`Family Tree DNA <https://www.familytreedna.com>`_ file.

>>> merge_results = s.merge([SNPs("resources/662.ftdna-illumina.341.csv.gz")])
Merging SNPs('662.ftdna-illumina.341.csv.gz')
SNPs('662.ftdna-illumina.341.csv.gz') has Build 36; remapping to Build 37
Downloading resources/NCBI36_GRCh37.tar.gz
27 SNP positions were discrepant; keeping original positions
151 SNP genotypes were discrepant; marking those as null
>>> s.source
'23andMe, FTDNA'
>>> s.count
1006960
>>> s.build
37
>>> s.build_detected
True

If the SNPs being merged have a build that differs from the destination build, the SNPs to merge
will be remapped automatically. After this example merge, the build is still detected, since the
build was detected for all ``SNPs`` objects that were merged.

As the data gets added, it's compared to the existing data, and SNP position and genotype
discrepancies are identified. (The discrepancy thresholds can be tuned via parameters.) These
discrepant SNPs are available for inspection after the merge via properties of the ``SNPs`` object.

>>> len(s.discrepant_merge_genotypes)
151

Additionally, any non-called / null genotypes will be updated during the merge, if the file
being merged has a called genotype for the SNP.

Moreover, ``merge`` takes a ``chrom`` parameter - this enables merging of only SNPs associated
with the specified chromosome (e.g., "Y" or "MT").

Finally, ``merge`` returns a list of ``dict``, where each ``dict`` has information corresponding
to the results of each merge (e.g., SNPs in common).

>>> sorted(list(merge_results[0].keys()))
['common_rsids', 'discrepant_genotype_rsids', 'discrepant_position_rsids', 'merged']
>>> merge_results[0]["merged"]
True
>>> len(merge_results[0]["common_rsids"])
692918

Remap SNPs
``````````
Now, let's remap the merged SNPs to change the assembly / build:

>>> s.snps.loc["rs3094315"].pos
752566
>>> chromosomes_remapped, chromosomes_not_remapped = s.remap(38)
Downloading resources/GRCh37_GRCh38.tar.gz
>>> s.build
38
>>> s.assembly
'GRCh38'
>>> s.snps.loc["rs3094315"].pos
817186

SNPs can be remapped between Build 36 (``NCBI36``), Build 37 (``GRCh37``), and Build 38
(``GRCh38``).

Save SNPs
`````````
Ok, so far we've merged the SNPs from two files (ensuring the same build in the process and
identifying discrepancies along the way). Then, we remapped the SNPs to Build 38. Now, let's save
the merged and remapped dataset consisting of 1M+ SNPs to a tab-separated values (TSV) file:

>>> saved_snps = s.to_tsv("out.txt")
Saving output/out.txt
>>> print(saved_snps)
output/out.txt

Moreover, let's get the reference sequences for this assembly and save the SNPs as a VCF file:

>>> saved_snps = s.to_vcf("out.vcf")
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.1.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.2.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.3.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.4.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.5.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.6.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.7.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.8.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.9.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.10.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.11.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.12.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.13.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.14.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.15.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.16.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.17.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.18.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.19.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.20.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.21.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.22.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.X.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.Y.fa.gz
Downloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.MT.fa.gz
Saving output/out.vcf
1 SNP positions were found to be discrepant when saving VCF

When saving a VCF, if any SNPs have positions outside of the reference sequence, they are marked
as discrepant and are available via a property of the ``SNPs`` object.

All `output files <https://snps.readthedocs.io/en/stable/output_files.html>`_ are saved to the
output directory.

Documentation
-------------
Documentation is available `here <https://snps.readthedocs.io/>`_.

Acknowledgements
----------------
Thanks to Mike Agostino, Padma Reddy, Kevin Arvai, `openSNP <https://opensnp.org>`_,
`Open Humans <https://www.openhumans.org>`_, and `Sano Genetics <https://sanogenetics.com>`_.

``snps`` incorporates code and concepts generated with the assistance of
`OpenAI's <https://openai.com>`_ `ChatGPT <https://chatgpt.com>`_. ✨

License
-------
``snps`` is licensed under the `BSD 3-Clause License <https://github.com/apriha/snps/blob/master/LICENSE.txt>`_.

.. https://github.com/rtfd/readthedocs.org/blob/master/docs/badges.rst
.. |ci| image:: https://github.com/apriha/snps/actions/workflows/ci.yml/badge.svg?branch=master
   :target: https://github.com/apriha/snps/actions/workflows/ci.yml
.. |codecov| image:: https://codecov.io/gh/apriha/snps/branch/master/graph/badge.svg
   :target: https://codecov.io/gh/apriha/snps
.. |docs| image:: https://readthedocs.org/projects/snps/badge/?version=stable
   :target: https://snps.readthedocs.io/
.. |pypi| image:: https://img.shields.io/pypi/v/snps.svg
   :target: https://pypi.python.org/pypi/snps
.. |python| image:: https://img.shields.io/pypi/pyversions/snps.svg
   :target: https://www.python.org
.. |downloads| image:: https://pepy.tech/badge/snps
   :target: https://pepy.tech/project/snps
.. |ruff| image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json
   :target: https://github.com/astral-sh/ruff
   :alt: Ruff

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/apriha/snps",
    "name": "snps",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "snps dna chromosomes bioinformatics vcf",
    "author": "Andrew Riha",
    "author_email": "apriha@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/60/52/14eb275ca6e383bad61d5e1b54579865e08fb432f5341dfa15484a264f94/snps-2.9.0.tar.gz",
    "platform": "any",
    "description": ".. image:: https://raw.githubusercontent.com/apriha/snps/master/docs/images/snps_banner.png\n\n|ci| |codecov| |docs| |pypi| |python| |downloads| |ruff|\n\nsnps\n====\ntools for reading, writing, merging, and remapping SNPs \ud83e\uddec\n\n``snps`` *strives to be an easy-to-use and accessible open-source library for working with\ngenotype data*\n\nFeatures\n--------\nInput / Output\n``````````````\n- Read raw data (genotype) files from a variety of direct-to-consumer (DTC) DNA testing\n  sources with a `SNPs <https://snps.readthedocs.io/en/stable/snps.html#snps.snps.SNPs>`_\n  object\n- Read and write VCF files (e.g., convert `23andMe <https://www.23andme.com>`_ to VCF)\n- Merge raw data files from different DNA tests, identifying discrepant SNPs in the process\n- Read data in a variety of formats (e.g., files, bytes, compressed with `gzip` or `zip`)\n- Handle several variations of file types, validated via\n  `openSNP parsing analysis <https://github.com/apriha/snps/tree/master/analysis/parse-opensnp-files>`_\n\nBuild / Assembly Detection and Remapping\n````````````````````````````````````````\n- Detect the build / assembly of SNPs (supports builds 36, 37, and 38)\n- Remap SNPs between builds / assemblies\n\nData Cleaning\n`````````````\n- Perform quality control (QC) / filter low quality SNPs based on `chip clusters <https://doi.org/10.1016/j.csbj.2021.06.040>`_\n- Fix several common issues when loading SNPs\n- Sort SNPs based on chromosome and position\n- Deduplicate RSIDs\n- Deduplicate alleles in the non-PAR regions of the X and Y chromosomes for males\n- Deduplicate alleles on MT\n- Assign PAR SNPs to the X or Y chromosome\n\nAnalysis\n````````\n- Derive sex from SNPs\n- Detect deduced genotype / chip array and chip version based on `chip clusters <https://doi.org/10.1016/j.csbj.2021.06.040>`_\n- Predict ancestry from SNPs (when installed with `ezancestry <https://github.com/arvkevi/ezancestry>`_)\n\nSupported Genotype Files\n------------------------\n``snps`` supports `VCF <https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3137218/>`_ files and\ngenotype files from the following DNA testing sources:\n\n- `23andMe <https://www.23andme.com>`_\n- `Ancestry <https://www.ancestry.com>`_\n- `CircleDNA <https://circledna.com/>`_\n- `C\u00f3digo 46 <https://codigo46.com.mx>`_\n- `DNA.Land <https://dna.land>`_\n- `Family Tree DNA <https://www.familytreedna.com>`_\n- `Genes for Good <https://genesforgood.sph.umich.edu>`_\n- `LivingDNA <https://livingdna.com>`_\n- `Mapmygenome <https://mapmygenome.in>`_\n- `MyHeritage <https://www.myheritage.com>`_\n- `PLINK <https://www.cog-genomics.org/plink/>`_\n- `Sano Genetics <https://sanogenetics.com>`_\n- `tellmeGen <https://www.tellmegen.com>`_\n\nAdditionally, ``snps`` can read a variety of \"generic\" CSV and TSV files.\n\nDependencies\n------------\n``snps`` requires `Python <https://www.python.org>`_ 3.8+ and the following Python\npackages:\n\n- `numpy <http://www.numpy.org>`_\n- `pandas <http://pandas.pydata.org>`_\n- `atomicwrites <https://github.com/untitaker/python-atomicwrites>`_\n\nInstallation\n------------\n``snps`` is `available <https://pypi.org/project/snps/>`_ on the\n`Python Package Index <https://pypi.org>`_. Install ``snps`` (and its required\nPython dependencies) via ``pip``::\n\n    $ pip install snps\n\nFor `ancestry prediction <https://snps.readthedocs.io/en/stable/snps.html#snps.snps.SNPs.predict_ancestry>`_\ncapability, ``snps`` can be installed with `ezancestry <https://github.com/arvkevi/ezancestry>`_::\n\n    $ pip install snps[ezancestry]\n\nExamples\n--------\nDownload Example Data\n`````````````````````\nFirst, let's setup logging to get some helpful output:\n\n>>> import logging, sys\n>>> logger = logging.getLogger()\n>>> logger.setLevel(logging.INFO)\n>>> logger.addHandler(logging.StreamHandler(sys.stdout))\n\nNow we're ready to download some example data from `openSNP <https://opensnp.org>`_:\n\n>>> from snps.resources import Resources\n>>> r = Resources()\n>>> paths = r.download_example_datasets()\nDownloading resources/662.23andme.340.txt.gz\nDownloading resources/662.ftdna-illumina.341.csv.gz\n\nLoad Raw Data\n`````````````\nLoad a `23andMe <https://www.23andme.com>`_ raw data file:\n\n>>> from snps import SNPs\n>>> s = SNPs(\"resources/662.23andme.340.txt.gz\")\n>>> s.source\n'23andMe'\n>>> s.count\n991786\n\nThe ``SNPs`` class accepts a path to a file or a bytes object. A ``Reader`` class attempts to\ninfer the data source and load the SNPs. The loaded SNPs are\n`normalized <https://snps.readthedocs.io/en/stable/snps.html#snps.snps.SNPs.snps>`_ and\navailable via a ``pandas.DataFrame``:\n\n>>> df = s.snps\n>>> df.columns.values\narray(['chrom', 'pos', 'genotype'], dtype=object)\n>>> df.index.name\n'rsid'\n>>> df.chrom.dtype.name\n'object'\n>>> df.pos.dtype.name\n'uint32'\n>>> df.genotype.dtype.name\n'object'\n>>> len(df)\n991786\n\n``snps`` also attempts to detect the build / assembly of the data:\n\n>>> s.build\n37\n>>> s.build_detected\nTrue\n>>> s.assembly\n'GRCh37'\n\nMerge Raw Data Files\n````````````````````\nThe dataset consists of raw data files from two different DNA testing sources - let's combine\nthese files. Specifically, we'll update the ``SNPs`` object with SNPs from a\n`Family Tree DNA <https://www.familytreedna.com>`_ file.\n\n>>> merge_results = s.merge([SNPs(\"resources/662.ftdna-illumina.341.csv.gz\")])\nMerging SNPs('662.ftdna-illumina.341.csv.gz')\nSNPs('662.ftdna-illumina.341.csv.gz') has Build 36; remapping to Build 37\nDownloading resources/NCBI36_GRCh37.tar.gz\n27 SNP positions were discrepant; keeping original positions\n151 SNP genotypes were discrepant; marking those as null\n>>> s.source\n'23andMe, FTDNA'\n>>> s.count\n1006960\n>>> s.build\n37\n>>> s.build_detected\nTrue\n\nIf the SNPs being merged have a build that differs from the destination build, the SNPs to merge\nwill be remapped automatically. After this example merge, the build is still detected, since the\nbuild was detected for all ``SNPs`` objects that were merged.\n\nAs the data gets added, it's compared to the existing data, and SNP position and genotype\ndiscrepancies are identified. (The discrepancy thresholds can be tuned via parameters.) These\ndiscrepant SNPs are available for inspection after the merge via properties of the ``SNPs`` object.\n\n>>> len(s.discrepant_merge_genotypes)\n151\n\nAdditionally, any non-called / null genotypes will be updated during the merge, if the file\nbeing merged has a called genotype for the SNP.\n\nMoreover, ``merge`` takes a ``chrom`` parameter - this enables merging of only SNPs associated\nwith the specified chromosome (e.g., \"Y\" or \"MT\").\n\nFinally, ``merge`` returns a list of ``dict``, where each ``dict`` has information corresponding\nto the results of each merge (e.g., SNPs in common).\n\n>>> sorted(list(merge_results[0].keys()))\n['common_rsids', 'discrepant_genotype_rsids', 'discrepant_position_rsids', 'merged']\n>>> merge_results[0][\"merged\"]\nTrue\n>>> len(merge_results[0][\"common_rsids\"])\n692918\n\nRemap SNPs\n``````````\nNow, let's remap the merged SNPs to change the assembly / build:\n\n>>> s.snps.loc[\"rs3094315\"].pos\n752566\n>>> chromosomes_remapped, chromosomes_not_remapped = s.remap(38)\nDownloading resources/GRCh37_GRCh38.tar.gz\n>>> s.build\n38\n>>> s.assembly\n'GRCh38'\n>>> s.snps.loc[\"rs3094315\"].pos\n817186\n\nSNPs can be remapped between Build 36 (``NCBI36``), Build 37 (``GRCh37``), and Build 38\n(``GRCh38``).\n\nSave SNPs\n`````````\nOk, so far we've merged the SNPs from two files (ensuring the same build in the process and\nidentifying discrepancies along the way). Then, we remapped the SNPs to Build 38. Now, let's save\nthe merged and remapped dataset consisting of 1M+ SNPs to a tab-separated values (TSV) file:\n\n>>> saved_snps = s.to_tsv(\"out.txt\")\nSaving output/out.txt\n>>> print(saved_snps)\noutput/out.txt\n\nMoreover, let's get the reference sequences for this assembly and save the SNPs as a VCF file:\n\n>>> saved_snps = s.to_vcf(\"out.vcf\")\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.1.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.2.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.3.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.4.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.5.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.6.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.7.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.8.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.9.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.10.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.11.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.12.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.13.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.14.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.15.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.16.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.17.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.18.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.19.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.20.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.21.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.22.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.X.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.Y.fa.gz\nDownloading resources/fasta/GRCh38/Homo_sapiens.GRCh38.dna.chromosome.MT.fa.gz\nSaving output/out.vcf\n1 SNP positions were found to be discrepant when saving VCF\n\nWhen saving a VCF, if any SNPs have positions outside of the reference sequence, they are marked\nas discrepant and are available via a property of the ``SNPs`` object.\n\nAll `output files <https://snps.readthedocs.io/en/stable/output_files.html>`_ are saved to the\noutput directory.\n\nDocumentation\n-------------\nDocumentation is available `here <https://snps.readthedocs.io/>`_.\n\nAcknowledgements\n----------------\nThanks to Mike Agostino, Padma Reddy, Kevin Arvai, `openSNP <https://opensnp.org>`_,\n`Open Humans <https://www.openhumans.org>`_, and `Sano Genetics <https://sanogenetics.com>`_.\n\n``snps`` incorporates code and concepts generated with the assistance of\n`OpenAI's <https://openai.com>`_ `ChatGPT <https://chatgpt.com>`_. \u2728\n\nLicense\n-------\n``snps`` is licensed under the `BSD 3-Clause License <https://github.com/apriha/snps/blob/master/LICENSE.txt>`_.\n\n.. https://github.com/rtfd/readthedocs.org/blob/master/docs/badges.rst\n.. |ci| image:: https://github.com/apriha/snps/actions/workflows/ci.yml/badge.svg?branch=master\n   :target: https://github.com/apriha/snps/actions/workflows/ci.yml\n.. |codecov| image:: https://codecov.io/gh/apriha/snps/branch/master/graph/badge.svg\n   :target: https://codecov.io/gh/apriha/snps\n.. |docs| image:: https://readthedocs.org/projects/snps/badge/?version=stable\n   :target: https://snps.readthedocs.io/\n.. |pypi| image:: https://img.shields.io/pypi/v/snps.svg\n   :target: https://pypi.python.org/pypi/snps\n.. |python| image:: https://img.shields.io/pypi/pyversions/snps.svg\n   :target: https://www.python.org\n.. |downloads| image:: https://pepy.tech/badge/snps\n   :target: https://pepy.tech/project/snps\n.. |ruff| image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json\n   :target: https://github.com/astral-sh/ruff\n   :alt: Ruff\n",
    "bugtrack_url": null,
    "license": "BSD 3-Clause License",
    "summary": "tools for reading, writing, merging, and remapping SNPs",
    "version": "2.9.0",
    "project_urls": {
        "Changelog": "https://github.com/apriha/snps/releases",
        "Documentation": "https://snps.readthedocs.io/",
        "Homepage": "https://github.com/apriha/snps",
        "Issue Tracker": "https://github.com/apriha/snps/issues"
    },
    "split_keywords": [
        "snps",
        "dna",
        "chromosomes",
        "bioinformatics",
        "vcf"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "36427c7331a4c4c1c7d83a9dd08e3446c868bba8d66a1ffbb0db4d380f8a446a",
                "md5": "875f7aa1ad88be73558e3fc04dc0ad83",
                "sha256": "05fe6f059e2376235853c70e2143b5c55effbda2024b2ab9fca7a55e5737a905"
            },
            "downloads": -1,
            "filename": "snps-2.9.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "875f7aa1ad88be73558e3fc04dc0ad83",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 53107,
            "upload_time": "2024-08-26T05:03:21",
            "upload_time_iso_8601": "2024-08-26T05:03:21.823532Z",
            "url": "https://files.pythonhosted.org/packages/36/42/7c7331a4c4c1c7d83a9dd08e3446c868bba8d66a1ffbb0db4d380f8a446a/snps-2.9.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "605214eb275ca6e383bad61d5e1b54579865e08fb432f5341dfa15484a264f94",
                "md5": "363d3f41cec6923dacb7a60a7f4470ca",
                "sha256": "22481a03c50e1799ae9e1d180929e35d71f46d551c191b22faafc497a80b0ec2"
            },
            "downloads": -1,
            "filename": "snps-2.9.0.tar.gz",
            "has_sig": false,
            "md5_digest": "363d3f41cec6923dacb7a60a7f4470ca",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 149761,
            "upload_time": "2024-08-26T05:03:24",
            "upload_time_iso_8601": "2024-08-26T05:03:24.312771Z",
            "url": "https://files.pythonhosted.org/packages/60/52/14eb275ca6e383bad61d5e1b54579865e08fb432f5341dfa15484a264f94/snps-2.9.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-08-26 05:03:24",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "apriha",
    "github_project": "snps",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "snps"
}
        
Elapsed time: 0.60144s