From 7d8084b79121c37c028b9a4b3d2bfa150c05318e Mon Sep 17 00:00:00 2001 From: Arjun Biddanda Date: Sun, 29 Jan 2023 11:02:32 -0500 Subject: [PATCH] Updates for v1.0.2 (#10) * setup initial tests * test: updated testing actions and test structure * feat: added in some tests for utils * feat: added in function for reading in population panel files separately * draft: updated some tests * test: population panel testing * feat: new function to add in population handling * test: added in test for verification of samples * feat: vcf2frequency table now uses cyvcf2 * draft: small commit - still needs some fixing on docs * test: some refactoring and some testing * doc: some additional docstrings * feat: updated to include data in installation * feat: finally got cyvcf2 features working * feat: not supporting windows due to cyvcf2 * feat: added update to make custom lists a little bit easier * doc: cleaned up a lot of the original documentation * fix: initial attempt to address issue #8 * test: updated tests for utilities to be more comprehensive * test: added in a test for gzipped frequency files * ci: updated some of the github CI parameters * Gzip streaming + additional tests (#9) * Dev (#6) * setup initial tests * test: updated testing actions and test structure * feat: added in some tests for utils * feat: added in function for reading in population panel files separately * draft: updated some tests * test: population panel testing * feat: new function to add in population handling * test: added in test for verification of samples * feat: vcf2frequency table now uses cyvcf2 * draft: small commit - still needs some fixing on docs * test: some refactoring and some testing * doc: some additional docstrings * feat: updated to include data in installation * feat: finally got cyvcf2 features working * feat: not supporting windows due to cyvcf2 * feat: added update to make custom lists a little bit easier * doc: cleaned up a lot of the original documentation * fix: initial attempt to address issue #8 * test: updated tests for utilities to be more comprehensive * test: added in a test for gzipped frequency files * ci: updated some of the github CI parameters * fix: updated version in setup.cfg * ci: changes * Revert "ci: changes" This reverts commit 19c22eefdd7f9169d3267ddc15b9955a2df91a7a. * fix: added in new commit file due to exclusion * ci: updated precommit and flake8 compliance * ci: removed flake8 from ci --- .github/workflows/macos.yml | 6 +- .github/workflows/ubuntu.yml | 6 +- .gitignore | 2 +- .pre-commit-config.yaml | 45 ++++++------ docsrc/stubs/geovar.GeoVar.rst | 12 +--- docsrc/stubs/geovar.GeoVarPlot.rst | 12 +--- docsrc/stubs/geovar.utils.rst | 25 ++----- geovar/binning.py | 53 ++++++++------ ...hr22.biallelic_snps.filt.n5000.freq.txt.gz | Bin 0 -> 61555 bytes geovar/utils.py | 2 +- setup.cfg | 2 +- tests/test_binning.py | 66 ++++++++++++++++++ tests/test_utils.py | 33 +++++++++ 13 files changed, 172 insertions(+), 92 deletions(-) create mode 100644 geovar/data/new_1kg_nygc.chr22.biallelic_snps.filt.n5000.freq.txt.gz diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 6121c4d..cbea1a3 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - python-version: [3.6, 3.7, 3.8, 3.9] + python-version: [3.7, 3.9, 3.11] steps: - uses: actions/checkout@v2 @@ -36,7 +36,3 @@ jobs: - name: run tests run: | python -m pytest tests/ - - - name: run flake8 - run: | - flake8 diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index ea78be6..f6eefd8 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - python-version: [3.6, 3.7, 3.8, 3.9] + python-version: [3.7, 3.9, 3.11] steps: - uses: actions/checkout@v2 @@ -36,7 +36,3 @@ jobs: - name: run tests run: | python -m pytest tests/ - - - name: run flake8 - run: | - flake8 diff --git a/.gitignore b/.gitignore index f9a2c34..592e524 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,6 @@ geovar/data/*.csv docsrc/_build/* .hypothesis/ *.egg-info/ -*.coverage +*.coverage* *.python-version build/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 92d3ef7..c9dda12 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,23 +1,28 @@ # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks repos: -- repo: https://github.com/pre-commit/pre-commit-hooks - rev: v2.4.0 - hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-yaml - - id: check-added-large-files - args: ['--maxkb=900'] -- repo: https://github.com/psf/black - rev: 19.3b0 - hooks: - - id: black -- repo: https://github.com/pycqa/pydocstyle - rev: 4.0.0 # pick a git hash / tag to point to - hooks: - - id: pydocstyle -- repo: https://gitlab.com/pycqa/flake8 - rev: 3.7.9 - hooks: - - id: flake8 +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.4.0 + hooks: + - id: trailing-whitespace + exclude: '^docs*/' + - id: end-of-file-fixer + exclude: '^docs/' + - id: check-yaml + - id: check-added-large-files + args: ['--maxkb=900'] +- repo: https://github.com/psf/black + rev: 22.12.0 + hooks: + - id: black + exclude: '^docs*/' +- repo: https://github.com/pycqa/pydocstyle + rev: 4.0.0 # pick a git hash / tag to point to + hooks: + - id: pydocstyle + exclude: '^docs*/' +- repo: https://github.com/pycqa/flake8 + rev: 3.7.9 + hooks: + - id: flake8 + exclude: '^docs*/' diff --git a/docsrc/stubs/geovar.GeoVar.rst b/docsrc/stubs/geovar.GeoVar.rst index a2cee60..5eb7314 100644 --- a/docsrc/stubs/geovar.GeoVar.rst +++ b/docsrc/stubs/geovar.GeoVar.rst @@ -5,23 +5,17 @@ .. autoclass:: GeoVar - + .. automethod:: __init__ - + .. rubric:: Methods .. autosummary:: - + ~GeoVar.__init__ ~GeoVar.add_freq_mat ~GeoVar.count_geovar_codes ~GeoVar.generate_bins ~GeoVar.geovar_binning ~GeoVar.geovar_codes_streaming - - - - - - \ No newline at end of file diff --git a/docsrc/stubs/geovar.GeoVarPlot.rst b/docsrc/stubs/geovar.GeoVarPlot.rst index f09536e..e1fd955 100644 --- a/docsrc/stubs/geovar.GeoVarPlot.rst +++ b/docsrc/stubs/geovar.GeoVarPlot.rst @@ -5,14 +5,14 @@ .. autoclass:: GeoVarPlot - + .. automethod:: __init__ - + .. rubric:: Methods .. autosummary:: - + ~GeoVarPlot.__init__ ~GeoVarPlot.add_cmap ~GeoVarPlot.add_data_geovar @@ -26,9 +26,3 @@ ~GeoVarPlot.reorder_pops ~GeoVarPlot.set_colors ~GeoVarPlot.sort_geodist - - - - - - \ No newline at end of file diff --git a/docsrc/stubs/geovar.utils.rst b/docsrc/stubs/geovar.utils.rst index 34b1f61..e1d9863 100644 --- a/docsrc/stubs/geovar.utils.rst +++ b/docsrc/stubs/geovar.utils.rst @@ -3,30 +3,17 @@ .. automodule:: geovar.utils - - - - - + + + + + .. rubric:: Functions .. autosummary:: - + read_pop_panel sep_freq_mat_pops vcf_to_freq_table verify_sample_indices - - - - - - - - - - - - - diff --git a/geovar/binning.py b/geovar/binning.py index c3e18a1..7e08238 100644 --- a/geovar/binning.py +++ b/geovar/binning.py @@ -3,6 +3,8 @@ import numpy as np import pandas as pd from tqdm import tqdm +from pathlib import Path +import gzip from .utils import sep_freq_mat_pops @@ -44,7 +46,7 @@ def add_freq_mat(self, freq_mat_file): (see example notebook for formatting). """ - af_df = pd.read_table(freq_mat_file, sep=r"\s") + af_df = pd.read_table(freq_mat_file, sep=r"\s", engine="python") pops, freq_mat = sep_freq_mat_pops(af_df) self.pops = pops self.freq_mat = freq_mat @@ -58,14 +60,16 @@ def generate_bins(self, bins=[(0, 0), (0, 0.05), (0.05, 1.0)]): bins (:obj:`list`): list of tuples specifying bins of allele frequency. """ - assert np.all(np.array(bins) < 1.0) - b = 0.0 - new_bins = [] - for x in bins: - new_bins.append((b, x)) - b = x - new_bins.append((b, 1.0)) - self.bins = new_bins + assert np.all(np.array(bins) <= 1.0) + assert np.all(np.array(bins) >= 0.0) + min_val = 1.0 + max_val = 0.0 + for (start, end) in bins: + min_val = min(min_val, start) + max_val = max(max_val, end) + assert min_val >= 0 + assert max_val <= 1 + self.bins = bins def geovar_binning(self): """Compute the GeoVar codes for each variant across each population.""" @@ -91,25 +95,30 @@ def geovar_codes_streaming(self, freq_mat_file): """Version of GeoVar code generation algorithm that streams through file to avoid memory overflow. Args: - freq_mat_file (:obj:`string`): filepath to - frequency table file (see example notebook for formatting). + freq_mat_file (:obj:`string`): filepath to a frequency table file (see example notebook for formatting). """ assert self.bins is not None + freq_mat_fp = Path(freq_mat_file) + assert freq_mat_fp.is_file() geovar_codes = [] # Setting up the testing bins test_bins = np.array([x[1] for x in self.bins]) - with open(freq_mat_file, "r") as f: - header = f.readline() - # Take the population labels currently - pops = np.array(header.split()[6:]) - self.pops = pops - for line in tqdm(f): - # Split after the 6th column ... - maf_vector = np.array(line.split()[6:]).astype(np.float64) - cur_geovar = np.digitize(maf_vector, test_bins, right=True) - cur_geovar_code = "".join([str(i) for i in cur_geovar]) - geovar_codes.append(cur_geovar_code) + if ".gz" in freq_mat_fp.suffixes: + f = gzip.open(freq_mat_fp, "rt") + else: + f = open(freq_mat_fp, "r") + header = f.readline() + # Take the population labels currently + pops = np.array(header.split()[6:]) + self.pops = pops + for line in tqdm(f): + # Split after the 6th column ... + maf_vector = np.array(line.split()[6:]).astype(np.float64) + cur_geovar = np.digitize(maf_vector, test_bins, right=True) + cur_geovar_code = "".join([str(i) for i in cur_geovar]) + geovar_codes.append(cur_geovar_code) + f.close() # Setting the variables here self.geovar_codes = np.array(geovar_codes) self.n_variants = self.geovar_codes.size diff --git a/geovar/data/new_1kg_nygc.chr22.biallelic_snps.filt.n5000.freq.txt.gz b/geovar/data/new_1kg_nygc.chr22.biallelic_snps.filt.n5000.freq.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..7530588e7d93db56815f253c4efefd24930b4a37 GIT binary patch literal 61555 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 M4`&E{mg4sW0JMZ4Jpcdz literal 0 HcmV?d00001 diff --git a/geovar/utils.py b/geovar/utils.py index 4d09041..eb3baf6 100644 --- a/geovar/utils.py +++ b/geovar/utils.py @@ -86,7 +86,7 @@ def vcf_to_freq_table(vcf_file, pop_df, outfile=None, minor_allele=True, **kwarg """ vcf_filepath = Path(vcf_file) if not vcf_filepath.is_file(): - raise ValueError(f"{vcf_file} is not a valid VCF file!") + raise FileNotFoundError(f"{vcf_file} is not a valid VCF file!") vcf = VCF(vcf_filepath, **kwargs) unique_pops, pop_idx_dict, pop_dict = verify_sample_indices(pop_df, vcf.samples) chrom = [] diff --git a/setup.cfg b/setup.cfg index c2f0849..1d7b81e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = geovar -version = 1.0.1 +version = 1.0.2 author = Arjun Biddanda description = A library to generate plots of joint allele frequency variation long_description = README.md diff --git a/tests/test_binning.py b/tests/test_binning.py index 23fafc7..628aa28 100644 --- a/tests/test_binning.py +++ b/tests/test_binning.py @@ -16,6 +16,12 @@ def bins_greater_than_one(): return [(0, 0.5), (0.5, 1.1)] +@pytest.fixture +def bins_alt1(): + """Alternative binning structure (4 bins).""" + return [(0, 0), (0, 0.01), (0.01, 0.05), (0.05, 1.0)] + + def test_bin_boundaries(bins_less_than_zero, bins_greater_than_one): """Testing the bin boundaries.""" with pytest.raises(AssertionError): @@ -28,3 +34,63 @@ def test_empty_bins(): """Test that the bins are not empty.""" with pytest.raises(AssertionError): GeoVar(bins=[]) + + +def test_generate_bins(bins_less_than_zero, bins_greater_than_one): + """Test the new generation of bins.""" + geov_obj = GeoVar() + with pytest.raises(AssertionError): + geov_obj.generate_bins(bins=bins_less_than_zero) + with pytest.raises(AssertionError): + geov_obj.generate_bins(bins=bins_greater_than_one) + geov_obj.generate_bins(bins=[(0, 0), (0, 0.01), (0.01, 1.0)]) + + +@pytest.fixture +def valid_freq_mat(): + """Frequency matrix for input to geovar.""" + return "geovar/data/new_1kg_nygc.chr22.biallelic_snps.filt.n5000.freq.txt" + + +@pytest.fixture +def valid_freq_mat_gz(): + """Frequency matrix for input to geovar as a gzipped file.""" + return "geovar/data/new_1kg_nygc.chr22.biallelic_snps.filt.n5000.freq.txt.gz" + + +def test_add_freq_mat(valid_freq_mat): + """Test for addition of a valid frequency matrix file for GeoVar.""" + geov_obj = GeoVar() + geov_obj.add_freq_mat(valid_freq_mat) + + +def test_geovar_binning(valid_freq_mat, bins_alt1): + """Test GeoVar binning under multiple binning schemes.""" + geov_obj = GeoVar() + geov_obj.add_freq_mat(valid_freq_mat) + geov_obj.geovar_binning() + geov_obj.generate_bins(bins_alt1) + geov_obj.geovar_binning() + + +def test_count_geovar_codes(valid_freq_mat, bins_alt1): + """Test that counting of geovar codes works properly.""" + geov_obj = GeoVar() + geov_obj.add_freq_mat(valid_freq_mat) + geov_obj.geovar_binning() + u, n_geovar, ncat = geov_obj.count_geovar_codes() + u, n_geovar, ncat = geov_obj.count_geovar_codes() + # Two non-zero categories ... + assert ncat == 2 + assert all(n_geovar > 0) + + +def test_geovar_codes_streaming(valid_freq_mat, valid_freq_mat_gz): + """Test that streaming in frequency tables (in both formats) is allowed.""" + geov_obj = GeoVar() + geov_obj.geovar_codes_streaming(valid_freq_mat) + assert geov_obj.n_variants == 5000 + assert geov_obj.pops.size == geov_obj.n_populations + geov_obj.geovar_codes_streaming(valid_freq_mat_gz) + assert geov_obj.n_variants == 5000 + assert geov_obj.pops.size == geov_obj.n_populations diff --git a/tests/test_utils.py b/tests/test_utils.py index 48ce53f..5cacd94 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -124,3 +124,36 @@ def test_verify_pops(pop_panel_multi_pop_df): # This treats warnings as exceptions here... with pytest.raises(Exception): utils.verify_sample_indices(pop_panel_multi_pop_df, samples_excess) + + +@pytest.fixture +def valid_vcf_file(): + """Small VCF file shipped with the geovar project.""" + return "geovar/data/new_1kg_nygc.chr22.biallelic_snps.filt.n5000.vcf.gz" + + +@pytest.fixture +def valid_pop_panel(): + """Corresponding population panel for VCF file.""" + return "geovar/data/integrated_call_samples_v3.20130502.1kg_superpops.panel" + + +@pytest.fixture +def invalid_vcf_file(): + """VCF file that does not exist to test against.""" + return "geovar/data/new_1kg_nygc.chr21.biallelic_snps.vcf" + + +def test_vcf_to_freq_table_bad_file(invalid_vcf_file, valid_pop_panel): + """Test that an invalid VCF file errors out.""" + pop_df = utils.read_pop_panel(valid_pop_panel) + with pytest.raises(FileNotFoundError): + utils.vcf_to_freq_table(vcf_file=invalid_vcf_file, pop_df=pop_df) + + +def test_vcf_to_freq_table(valid_vcf_file, valid_pop_panel): + """Test to take a VCF file to a frequency file.""" + pop_df = utils.read_pop_panel(valid_pop_panel) + af_df = utils.vcf_to_freq_table(vcf_file=valid_vcf_file, pop_df=pop_df) + for col in ["CHR", "SNP", "A1", "A2", "MAC", "MAF"]: + assert col in af_df.columns