From ebbb9ab50cb884ad0557db087be359604b25fb17 Mon Sep 17 00:00:00 2001 From: Jayaram Kancherla Date: Wed, 29 Jan 2025 13:35:21 -0800 Subject: [PATCH] Support 1-d outputs for agg functions (#15) --- .../{pypi-publish.yml => publish-pypi.yml} | 13 +++--- .../{pypi-test.yml => run-tests.yml} | 2 +- README.md | 15 +++++-- assets/genarr.jpg | Bin 29105 -> 31706 bytes assets/genarr.png | Bin 27210 -> 31654 bytes assets/genarr.svg | 2 +- src/genomicarrays/build_genomicarray.py | 14 ++++--- src/genomicarrays/build_options.py | 14 ++++++- src/genomicarrays/utils_bw.py | 35 +++++++++++----- tests/agg_test.py | 9 ++++ tests/test_ingest.py | 39 ++++++++++++++++++ 11 files changed, 117 insertions(+), 26 deletions(-) rename .github/workflows/{pypi-publish.yml => publish-pypi.yml} (81%) rename .github/workflows/{pypi-test.yml => run-tests.yml} (97%) create mode 100644 tests/agg_test.py diff --git a/.github/workflows/pypi-publish.yml b/.github/workflows/publish-pypi.yml similarity index 81% rename from .github/workflows/pypi-publish.yml rename to .github/workflows/publish-pypi.yml index 29657bb..796105b 100644 --- a/.github/workflows/pypi-publish.yml +++ b/.github/workflows/publish-pypi.yml @@ -10,6 +10,11 @@ on: jobs: build: runs-on: ubuntu-latest + permissions: + id-token: write + repository-projects: write + contents: write + pages: write steps: - uses: actions/checkout@v4 @@ -45,8 +50,6 @@ jobs: run: | python -m tox -e clean,build - - name: Publish package - uses: pypa/gh-action-pypi-publish@v1.12.2 - with: - user: __token__ - password: ${{ secrets.PYPI_PASSWORD }} + # This uses the trusted publisher workflow so no token is required. + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 \ No newline at end of file diff --git a/.github/workflows/pypi-test.yml b/.github/workflows/run-tests.yml similarity index 97% rename from .github/workflows/pypi-test.yml rename to .github/workflows/run-tests.yml index 90aa16a..4e9342f 100644 --- a/.github/workflows/pypi-test.yml +++ b/.github/workflows/run-tests.yml @@ -30,4 +30,4 @@ jobs: - name: Test with tox run: | - tox + tox \ No newline at end of file diff --git a/README.md b/README.md index 343aadc..b428ba7 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,8 @@ [![Twitter](https://img.shields.io/twitter/url/http/shields.io.svg?style=social&label=Twitter)](https://twitter.com/GenomicArrays) --> -[![Project generated with PyScaffold](https://img.shields.io/badge/-PyScaffold-005CA0?logo=pyscaffold)](https://pyscaffold.org/) +[![PyPI-Server](https://img.shields.io/pypi/v/GenomicArrays.svg)](https://pypi.org/project/GenomicArrays/) +![Unit tests](https://github.com/CellArr/GenomicArrays/actions/workflows/run-tests.yml/badge.svg) # Genomic Arrays based on TileDB @@ -80,8 +81,16 @@ dataset = garr.build_genomicarray( ) ``` -The build process stores missing intervals from a bigwig file as `np.nan`. The -default is to choose an aggregate functions that works with `np.nan`. +> [!NOTE] +> - The aggregate function is expected to return either a scalar value or a 1-dimensional NumPy ndarray. If the later, users need to specify the expected dimension of the return array. e.g. +> ```python +> feature_annotation_options=garr.FeatureAnnotationOptions( +> aggregate_function = my_custom_func, +> expected_agg_function_length = 10, +> ), +> - The build process stores missing intervals from a bigwig file as `np.nan`. The default is to choose an aggregate functions that works with `np.nan`. + + ### Query a `GenomicArrayDataset` diff --git a/assets/genarr.jpg b/assets/genarr.jpg index e780fbfc84f31f8d0b44f187c5b0d9e9ed740a12..388eebfd90f0763e236a0d28bbc2d13adbe197d9 100644 GIT binary patch delta 23975 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 TT@jSY*{N{-;hDPYYybZNd0!P& diff --git a/assets/genarr.png b/assets/genarr.png index accd94b287b296d99228f486304f6c8bcea73ca9..c4d019f0edde37b8909469e47a8e20c734b030a3 100644 GIT binary patch literal 31654 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 diff --git a/assets/genarr.svg b/assets/genarr.svg index cabde4f..1bd5617 100644 --- a/assets/genarr.svg +++ b/assets/genarr.svg @@ -1 +1 @@ - + \ No newline at end of file diff --git a/src/genomicarrays/build_genomicarray.py b/src/genomicarrays/build_genomicarray.py index be931ac..cf5214f 100644 --- a/src/genomicarrays/build_genomicarray.py +++ b/src/genomicarrays/build_genomicarray.py @@ -179,14 +179,16 @@ def build_genomicarray( # append start index for each interval input_intervals["widths"] = input_intervals["ends"] - input_intervals["starts"] total_length = None + outsize_per_feature = 1 if feature_annotation_options.aggregate_function is None: total_length = int(input_intervals["widths"].sum()) counter = input_intervals["widths"].shift(1) counter[0] = 0 input_intervals["genarr_feature_start_index"] = counter.cumsum().astype(int) else: - counter = [1] * len(input_intervals) - total_length = len(input_intervals) + outsize_per_feature = feature_annotation_options.expected_agg_function_length + counter = [outsize_per_feature] * len(input_intervals) + total_length = len(input_intervals) * outsize_per_feature counter[0] = 0 input_intervals["genarr_feature_start_index"] = pd.Series(counter).cumsum().astype(int) @@ -272,6 +274,7 @@ def build_genomicarray( idx, feature_annotation_options.aggregate_function, total_length, + outsize_per_feature, ) for idx, bwpath in enumerate(files) ] @@ -294,7 +297,7 @@ def build_genomicarray( ) -def _write_intervals_to_tiledb(outpath, intervals, bwpath, bwidx, agg_func, total_length): +def _write_intervals_to_tiledb(outpath, intervals, bwpath, bwidx, agg_func, total_length, outsize_per_feature): """Wrapper to extract the data for the given intervals from the bigwig file and write the output to the tiledb file.""" data = ubw.wrapper_extract_bw_values( @@ -302,6 +305,7 @@ def _write_intervals_to_tiledb(outpath, intervals, bwpath, bwidx, agg_func, tota intervals=intervals, agg_func=agg_func, total_length=total_length, + outsize_per_feature=outsize_per_feature, ) if data is not None and len(data) > 0: @@ -310,5 +314,5 @@ def _write_intervals_to_tiledb(outpath, intervals, bwpath, bwidx, agg_func, tota def _wrapper_extract_bwinfo(args): """Wrapper for multiprocessing multiple files and intervals.""" - counts_uri, input_intervals, bwpath, idx, agg_func, total_length = args - return _write_intervals_to_tiledb(counts_uri, input_intervals, bwpath, idx, agg_func, total_length) + counts_uri, input_intervals, bwpath, idx, agg_func, total_length, outsize_per_feature = args + return _write_intervals_to_tiledb(counts_uri, input_intervals, bwpath, idx, agg_func, total_length, outsize_per_feature) diff --git a/src/genomicarrays/build_options.py b/src/genomicarrays/build_options.py index 491689c..a7b00da 100644 --- a/src/genomicarrays/build_options.py +++ b/src/genomicarrays/build_options.py @@ -122,7 +122,18 @@ class FeatureAnnotationOptions: aggregate_function: A callable to summarize the values in a given - interval. Defaults to None. + interval. The aggregate function is expected to + return either a scalar value or a 1-dimensional + NumPy `ndarray`. + + Defaults to None. + + expected_agg_function_length: + Length of the output when a agg function is applied + to an interval. Defaults to 1, expecting a scalar. + + Note: `ndarrays` will be flattenned before writing to + TileDB. """ skip: bool = False @@ -130,6 +141,7 @@ class FeatureAnnotationOptions: tiledb_store_name: str = "feature_annotation" column_types: Dict[str, np.dtype] = None aggregate_function: Optional[Callable] = None + expected_agg_function_length: int = 1 def __post_init__(self): if self.column_types is None: diff --git a/src/genomicarrays/utils_bw.py b/src/genomicarrays/utils_bw.py index c53de62..553a3c9 100644 --- a/src/genomicarrays/utils_bw.py +++ b/src/genomicarrays/utils_bw.py @@ -43,12 +43,22 @@ def wrapper_extract_bw_values( agg_func: Optional[callable], val_dtype: np.dtype = np.float32, total_length: int = None, + outsize_per_feature: int = 1, ) -> np.ndarray: + print("outsize_per_feature", outsize_per_feature) + if total_length is None: total_length = len(intervals) if agg_func is not None: - return extract_bw_values_as_vec(bw_path=bw_path, intervals=intervals, agg_func=agg_func, val_dtype=val_dtype) + return extract_bw_values_as_vec( + bw_path=bw_path, + intervals=intervals, + agg_func=agg_func, + val_dtype=val_dtype, + total_length=total_length, + outsize_per_feature=outsize_per_feature, + ) else: return extract_bw_intervals_as_vec( bw_path=bw_path, intervals=intervals, val_dtype=val_dtype, total_length=total_length @@ -58,8 +68,10 @@ def wrapper_extract_bw_values( def extract_bw_values_as_vec( bw_path: str, intervals: pd.DataFrame, + total_length: int, agg_func: Optional[callable] = None, val_dtype: np.dtype = np.float32, + outsize_per_feature: int = 1, ) -> np.ndarray: """Extract data from BigWig for a given region and apply the aggregate function. @@ -77,26 +89,29 @@ def extract_bw_values_as_vec( val_dtype: Dtype of the resulting array. + total_length: + Size of all the regions. + + outsize_per_feature: + Expected length of output after applying the ``agg_func``. + Returns: - A vector with length as the number of intervals, + A vector with length as number of intervals X outsize_per_feature, a value if the file contains the data for the corresponding region or ``np.nan`` if the region is not measured. """ bwfile = bw.open(bw_path) - results = [] - for row in intervals.itertuples(): + results = _get_empty_array(total_length, val_dtype=val_dtype) + for i, row in enumerate(intervals.itertuples()): + start_idx = i * outsize_per_feature if row.seqnames in bwfile.chroms(): try: data = bwfile.values(row.seqnames, row.starts, row.ends, numpy=True) if data is not None and len(data) != 0: - results.append(agg_func(data)) - else: - results.append(np.nan) + results[start_idx : start_idx + outsize_per_feature] = agg_func(data).flatten() except Exception as _: - results.append(np.nan) - else: - results.append(np.nan) + pass return np.array(results, dtype=val_dtype) diff --git a/tests/agg_test.py b/tests/agg_test.py new file mode 100644 index 0000000..262b68f --- /dev/null +++ b/tests/agg_test.py @@ -0,0 +1,9 @@ +import numpy as np + +__author__ = "Jayaram Kancherla" +__copyright__ = "Jayaram Kancherla" +__license__ = "MIT" + +def aggfunc(x): + print(x) + return np.array([np.nanmin(x), np.nansum(x)]) \ No newline at end of file diff --git a/tests/test_ingest.py b/tests/test_ingest.py index 4b6e9a6..3e9a6ed 100644 --- a/tests/test_ingest.py +++ b/tests/test_ingest.py @@ -5,6 +5,7 @@ import tiledb from genomicarrays import build_genomicarray, FeatureAnnotationOptions +from agg_test import aggfunc __author__ = "Jayaram Kancherla" __copyright__ = "Jayaram Kancherla" @@ -62,6 +63,7 @@ def test_ingest_bigwigs_agg(): features = ffp.df[:] assert len(features) == 15 + assert len(cfp) == 15 assert np.allclose( cfp.multi_index[0:5, 0]["data"], @@ -75,3 +77,40 @@ def test_ingest_bigwigs_agg(): sfp = tiledb.open(f"{tempdir}/sample_metadata", "r") samples = sfp.df[:] assert len(samples) == 2 + +def test_ingest_bigwigs_agg_not_scalar(): + tempdir = tempfile.mkdtemp() + + strts = np.arange(300, 600, 20) + features = pd.DataFrame( + {"seqnames": ["chr1"] * 15, "starts": strts, "ends": strts + 15} + ) + + build_genomicarray( + output_path=tempdir, + files=["tests/data/test1.bw", "tests/data/test2.bw"], + features=features, + genome_fasta="tests/data/test.fa", + feature_annotation_options=FeatureAnnotationOptions(aggregate_function=aggfunc, expected_agg_function_length=2), + ) + + cfp = tiledb.open(f"{tempdir}/coverage", "r") + ffp = tiledb.open(f"{tempdir}/feature_annotation", "r") + + features = ffp.df[:] + + assert len(features) == 15 + assert len(cfp) == 30 + + assert np.allclose( + cfp.multi_index[0:5, 0]["data"].flatten(), + np.array([1,10,1,10,1,10]), + ) + assert np.allclose( + cfp.multi_index[0:5, 1]["data"].flatten(), + np.array([0.5, 5,0.5, 5,0.5, 5]), + ) + + sfp = tiledb.open(f"{tempdir}/sample_metadata", "r") + samples = sfp.df[:] + assert len(samples) == 2 \ No newline at end of file