From 585f58c9e4dd82dd7809a831538c4e230b008818 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:08:44 +0100 Subject: [PATCH 01/54] [pre-commit.ci] pre-commit autoupdate (#2841) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3bed583917..dddd96c7c5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.14 + rev: v0.2.0 hooks: - id: ruff types_or: [python, pyi, jupyter] From e5c3d3ad97b3c52adb413534423a60a54788fd6b Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Fri, 9 Feb 2024 03:50:09 +1100 Subject: [PATCH 02/54] Prevent oversubscription during tests (#2843) * Limit multithreading during test time if using pytest-xdist * Docs + minor rearranging * Update scanpy/testing/_pytest/__init__.py * Update scanpy/testing/_pytest/__init__.py * Update scanpy/testing/_pytest/__init__.py --------- Co-authored-by: Philipp A --- scanpy/testing/_pytest/__init__.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/scanpy/testing/_pytest/__init__.py b/scanpy/testing/_pytest/__init__.py index 574349cdd7..67f1522205 100644 --- a/scanpy/testing/_pytest/__init__.py +++ b/scanpy/testing/_pytest/__init__.py @@ -1,6 +1,7 @@ """A private pytest plugin""" from __future__ import annotations +import os import sys from typing import TYPE_CHECKING @@ -39,6 +40,24 @@ def _global_test_context(request: pytest.FixtureRequest) -> Generator[None, None plt.close("all") +@pytest.fixture(autouse=True, scope="session") +def limit_multithreading(): + """Limit number of threads used per worker when using pytest-xdist. + + Prevents oversubscription of the CPU when multiple tests with parallel code are + running at once. + """ + if (n_workers := os.environ.get("PYTEST_XDIST_WORKER_COUNT")) is not None: + import threadpoolctl + + max_threads = max(os.cpu_count() // n_workers, 1) + + with threadpoolctl.threadpool_limits(limits=max_threads): + yield + else: + yield + + def pytest_addoption(parser: pytest.Parser) -> None: parser.addoption( "--internet-tests", From dd6cf8102a68e15a48ecf608413b42111412e986 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Fri, 9 Feb 2024 12:32:51 +0100 Subject: [PATCH 03/54] Fix multithreading helper (#2845) --- scanpy/testing/_pytest/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scanpy/testing/_pytest/__init__.py b/scanpy/testing/_pytest/__init__.py index 67f1522205..47a78f1377 100644 --- a/scanpy/testing/_pytest/__init__.py +++ b/scanpy/testing/_pytest/__init__.py @@ -50,7 +50,9 @@ def limit_multithreading(): if (n_workers := os.environ.get("PYTEST_XDIST_WORKER_COUNT")) is not None: import threadpoolctl - max_threads = max(os.cpu_count() // n_workers, 1) + n_cpus = os.cpu_count() or 1 + n_workers = int(n_workers) + max_threads = max(n_cpus // n_workers, 1) with threadpoolctl.threadpool_limits(limits=max_threads): yield From e78f4a3321219cb442bd1daadf10e8ac3d85314e Mon Sep 17 00:00:00 2001 From: Philipp A Date: Fri, 9 Feb 2024 17:17:17 +0100 Subject: [PATCH 04/54] Fix some plot warnings (#2844) --- docs/release-notes/1.10.0.md | 1 + pyproject.toml | 4 ++ scanpy/plotting/_anndata.py | 3 +- scanpy/plotting/_dotplot.py | 14 +---- scanpy/plotting/_stacked_violin.py | 67 ++++++++++++++------- scanpy/plotting/_tools/__init__.py | 15 +++-- scanpy/plotting/_tools/scatterplots.py | 81 ++++++++++++-------------- scanpy/plotting/_utils.py | 14 +++++ scanpy/tests/test_plotting.py | 7 +++ 9 files changed, 123 insertions(+), 83 deletions(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index dbf9e57e35..ddfdc07bb8 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -29,6 +29,7 @@ * Fix testing package build {pr}`2468` {smaller}`P Angerer` * Fix setting `sc.settings.verbosity` in some cases {pr}`2605` {smaller}`P Angerer` * Fix all remaining pandas warnings {pr}`2789` {smaller}`P Angerer` +* Fix some annoying plotting warnings around violin plots {pr}`2844` {smaller}`P Angerer` ```{rubric} Ecosystem ``` diff --git a/pyproject.toml b/pyproject.toml index 65d3dfb8bc..b34195a3f3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -184,6 +184,10 @@ filterwarnings = [ "error:The provided callable.* is currently using:FutureWarning", "error:The behavior of DataFrame concatenation with empty or all-NA entries is deprecated:FutureWarning", "error:A value is trying to be set on a copy of a slice from a DataFrame", + "error:No data for colormapping provided via 'c'", + "error:\\n*The `scale` parameter has been renamed and will be removed", + "error:\\n*Passing `palette` without assigning `hue` is deprecated", + "error:\\n*Setting a gradient palette using color= is deprecated", ] [tool.coverage.run] diff --git a/scanpy/plotting/_anndata.py b/scanpy/plotting/_anndata.py index c54ee5cc3b..9c48a9a952 100755 --- a/scanpy/plotting/_anndata.py +++ b/scanpy/plotting/_anndata.py @@ -838,6 +838,7 @@ def violin( f"but is of dtype {adata.obs[groupby].dtype}." ) _utils.add_colors_for_categorical_sample_annotation(adata, groupby) + kwds["hue"] = groupby kwds["palette"] = dict( zip(obs_df[groupby].cat.categories, adata.uns[f"{groupby}_colors"]) ) @@ -909,7 +910,7 @@ def violin( data=obs_tidy, order=order, orient="vertical", - scale=scale, + density_norm=scale, ax=ax, **kwds, ) diff --git a/scanpy/plotting/_dotplot.py b/scanpy/plotting/_dotplot.py index 63d5c20d00..52dbe83e1b 100644 --- a/scanpy/plotting/_dotplot.py +++ b/scanpy/plotting/_dotplot.py @@ -586,9 +586,7 @@ def _mainplot(self, ax): if self.are_axes_swapped: _size_df = _size_df.T _color_df = _color_df.T - self.cmap = self.kwds.get("cmap", self.cmap) - if "cmap" in self.kwds: - del self.kwds["cmap"] + self.cmap = self.kwds.pop("cmap", self.cmap) normalize, dot_min, dot_max = self._dotplot( _size_df, @@ -627,7 +625,7 @@ def _dotplot( y_label: str | None = None, dot_max: float | None = None, dot_min: float | None = None, - standard_scale: Literal["var", "group"] = None, + standard_scale: Literal["var", "group"] | None = None, smallest_dot: float | None = 0.0, largest_dot: float | None = 200, size_exponent: float | None = 2, @@ -737,9 +735,7 @@ def _dotplot( x = x.flatten() + 0.5 frac = dot_size.values.flatten() mean_flat = dot_color.values.flatten() - cmap = plt.get_cmap(kwds.get("cmap", cmap)) - if "cmap" in kwds: - del kwds["cmap"] + cmap = plt.get_cmap(cmap) if dot_max is None: dot_max = np.ceil(max(frac) * 10) / 10 else: @@ -786,11 +782,9 @@ def _dotplot( kwds = fix_kwds( kwds, s=size, - cmap=cmap, linewidth=edge_lw, facecolor="none", edgecolor=edge_color, - norm=normalize, ) dot_ax.scatter(x, y, **kwds) else: @@ -801,11 +795,9 @@ def _dotplot( kwds = fix_kwds( kwds, s=size, - cmap=cmap, color=color, linewidth=edge_lw, edgecolor=edge_color, - norm=normalize, ) dot_ax.scatter(x, y, **kwds) diff --git a/scanpy/plotting/_stacked_violin.py b/scanpy/plotting/_stacked_violin.py index 828d5570c8..fed4893cde 100644 --- a/scanpy/plotting/_stacked_violin.py +++ b/scanpy/plotting/_stacked_violin.py @@ -1,5 +1,6 @@ from __future__ import annotations +import warnings from typing import TYPE_CHECKING, Literal import numpy as np @@ -13,7 +14,13 @@ from .._utils import _doc_params from ._baseplot_class import BasePlot, _VarNames, doc_common_groupby_plot_args from ._docs import doc_common_plot_args, doc_show_save_ax, doc_vboundnorm -from ._utils import _AxesSubplot, check_colornorm, make_grid_spec, savefig_or_show +from ._utils import ( + _AxesSubplot, + _deprecated_scale, + check_colornorm, + make_grid_spec, + savefig_or_show, +) if TYPE_CHECKING: from collections.abc import ( @@ -52,7 +59,7 @@ class StackedViolin(BasePlot): Order in which to show the categories. Note: if `dendrogram=True` the categories order will be given by the dendrogram and `order` will be ignored. - scale + density_norm The method used to scale the width of each violin. If 'width' (the default), each violin will have the same width. If 'area', each violin will have the same area. @@ -108,7 +115,7 @@ class StackedViolin(BasePlot): DEFAULT_JITTER_SIZE = 1 DEFAULT_LINE_WIDTH = 0.2 DEFAULT_ROW_PALETTE = None - DEFAULT_SCALE = "width" + DEFAULT_DENSITY_NORM: Literal["area", "count", "width"] = "width" DEFAULT_PLOT_YTICKLABELS = False DEFAULT_YLIM = None DEFAULT_PLOT_X_PADDING = 0.5 # a unit is the distance between two x-axis ticks @@ -131,6 +138,18 @@ class StackedViolin(BasePlot): # None will draw unadorned violins. DEFAULT_INNER = None + def __getattribute__(self, name: str) -> object: + """Called unconditionally when accessing an instance attribute""" + # If the user has set the deprecated version on the class, + # and our code accesses the new version from the instance, + # return the user-specified version instead and warn. + # This is done because class properties are hard to do. + if name == "DEFAULT_DENSITY_NORM" and hasattr(self, "DEFAULT_SCALE"): + msg = "Don’t set DEFAULT_SCALE, use DEFAULT_DENSITY_NORM instead" + warnings.warn(msg, FutureWarning) + return object.__getattribute__(self, "DEFAULT_SCALE") + return object.__getattribute__(self, name) + @old_positionals( "use_raw", "log", @@ -224,7 +243,7 @@ def __init__( self.kwds.setdefault("cut", self.DEFAULT_CUT) self.kwds.setdefault("inner", self.DEFAULT_INNER) self.kwds.setdefault("linewidth", self.DEFAULT_LINE_WIDTH) - self.kwds.setdefault("scale", self.DEFAULT_SCALE) + self.kwds.setdefault("density_norm", self.DEFAULT_DENSITY_NORM) @old_positionals( "cmap", @@ -233,7 +252,7 @@ def __init__( "jitter_size", "linewidth", "row_palette", - "scale", + "density_norm", "yticklabels", "ylim", "x_padding", @@ -248,11 +267,13 @@ def style( jitter_size: int | None = DEFAULT_JITTER_SIZE, linewidth: float | None = DEFAULT_LINE_WIDTH, row_palette: str | None = DEFAULT_ROW_PALETTE, - scale: Literal["area", "count", "width"] | None = DEFAULT_SCALE, + density_norm: Literal["area", "count", "width"] = DEFAULT_DENSITY_NORM, yticklabels: bool | None = DEFAULT_PLOT_YTICKLABELS, ylim: tuple[float, float] | None = DEFAULT_YLIM, x_padding: float | None = DEFAULT_PLOT_X_PADDING, y_padding: float | None = DEFAULT_PLOT_Y_PADDING, + # deprecated + scale: Literal["area", "count", "width"] | None = None, ): r"""\ Modifies plot visual parameters @@ -277,7 +298,7 @@ def style( (see :func:`~seaborn.color_palette`). Alternatively, a single color name or hex value can be passed, e.g. `'red'` or `'#cc33ff'`. - scale + density_norm The method used to scale the width of each violin. If 'width' (the default), each violin will have the same width. If 'area', each violin will have the same area. @@ -338,8 +359,14 @@ def style( self.plot_y_padding = y_padding if linewidth != self.kwds["linewidth"] and linewidth != self.DEFAULT_LINE_WIDTH: self.kwds["linewidth"] = linewidth - if scale != self.kwds["scale"] and scale != self.DEFAULT_SCALE: - self.kwds["scale"] = scale + density_norm = _deprecated_scale( + density_norm, scale, default=self.DEFAULT_DENSITY_NORM + ) + if ( + density_norm != self.kwds["density_norm"] + and density_norm != self.DEFAULT_DENSITY_NORM + ): + self.kwds["density_norm"] = density_norm return self @@ -367,9 +394,7 @@ def _mainplot(self, ax): if self.are_axes_swapped: _color_df = _color_df.T - cmap = plt.get_cmap(self.kwds.get("cmap", self.cmap)) - if "cmap" in self.kwds: - del self.kwds["cmap"] + cmap = plt.get_cmap(self.kwds.pop("cmap", self.cmap)) normalize = check_colornorm( self.vboundnorm.vmin, self.vboundnorm.vmax, @@ -418,9 +443,7 @@ def _make_rows_of_violinplots( ): import seaborn as sns # Slow import, only import if called - row_palette = self.kwds.get("color", self.row_palette) - if "color" in self.kwds: - del self.kwds["color"] + row_palette = self.kwds.pop("color", self.row_palette) if row_palette is not None: if is_color_like(row_palette): row_colors = [row_palette] * _color_df.shape[0] @@ -484,10 +507,9 @@ def _make_rows_of_violinplots( row_ax = fig.add_subplot(gs[idx + 1, 1:-1]) axs_list.append(row_ax) - if row_colors[idx] is None: - palette_colors = colormap_array[idx, :] - else: - palette_colors = None + palette_colors = ( + list(colormap_array[idx, :]) if row_colors[idx] is None else None + ) if not self.are_axes_swapped: x = "genes" @@ -506,6 +528,9 @@ def _make_rows_of_violinplots( data=_df, orient="vertical", ax=row_ax, + # use a single `color`` if row_colors[idx] is defined + # else use the palette + hue=None if palette_colors is None else x, palette=palette_colors, color=row_colors[idx], **self.kwds, @@ -630,7 +655,7 @@ def stacked_violin( stripplot: bool = StackedViolin.DEFAULT_STRIPPLOT, jitter: float | bool = StackedViolin.DEFAULT_JITTER, size: int = StackedViolin.DEFAULT_JITTER_SIZE, - scale: Literal["area", "count", "width"] = StackedViolin.DEFAULT_SCALE, + scale: Literal["area", "count", "width"] = StackedViolin.DEFAULT_DENSITY_NORM, yticklabels: bool | None = StackedViolin.DEFAULT_PLOT_YTICKLABELS, order: Sequence[str] | None = None, swap_axes: bool = False, @@ -779,7 +804,7 @@ def stacked_violin( jitter=jitter, jitter_size=size, row_palette=row_palette, - scale=kwds.get("scale", scale), + density_norm=kwds.get("density_norm", scale), yticklabels=yticklabels, linewidth=kwds.get("linewidth", StackedViolin.DEFAULT_LINE_WIDTH), ).legend(title=colorbar_title) diff --git a/scanpy/plotting/_tools/__init__.py b/scanpy/plotting/_tools/__init__.py index d55c1fed22..a55b5c4262 100644 --- a/scanpy/plotting/_tools/__init__.py +++ b/scanpy/plotting/_tools/__init__.py @@ -27,6 +27,7 @@ doc_vbound_percentile, ) from .._utils import ( + _deprecated_scale, savefig_or_show, timeseries, timeseries_as_heatmap, @@ -1176,7 +1177,7 @@ def rank_genes_groups_matrixplot( "use_raw", "key", "split", - "scale", + "density_norm", "strip", "jitter", "size", @@ -1195,13 +1196,15 @@ def rank_genes_groups_violin( use_raw: bool | None = None, key: str | None = None, split: bool = True, - scale: str = "width", + density_norm: Literal["area", "count", "width"] = "width", strip: bool = True, jitter: int | float | bool = True, size: int = 1, ax: Axes | None = None, show: bool | None = None, save: bool | None = None, + # deprecated + scale: Literal["area", "count", "width"] | None = None, ): """\ Plot ranking of genes for all tested comparisons. @@ -1225,7 +1228,7 @@ def rank_genes_groups_violin( was used in :func:`~scanpy.tl.rank_genes_groups`. split Whether to split the violins or not. - scale + density_norm See :func:`~seaborn.violinplot`. strip Show a strip plot on top of the violin plot. @@ -1244,6 +1247,8 @@ def rank_genes_groups_violin( groups_names = adata.uns[key]["names"].dtype.names if groups is None else groups if isinstance(groups_names, str): groups_names = [groups_names] + density_norm = _deprecated_scale(density_norm, scale, default="width") + del scale axs = [] for group_name in groups_names: if gene_names is None: @@ -1274,7 +1279,7 @@ def rank_genes_groups_violin( hue_order=hue_order, hue="hue", split=split, - scale=scale, + density_norm=density_norm, orient="vertical", ax=ax, ) @@ -1287,7 +1292,7 @@ def rank_genes_groups_violin( dodge=True, hue_order=hue_order, jitter=jitter, - color="black", + palette="dark:black", size=size, ax=_ax, ) diff --git a/scanpy/plotting/_tools/scatterplots.py b/scanpy/plotting/_tools/scatterplots.py index 4b12e2a7ff..b1b8937ff5 100644 --- a/scanpy/plotting/_tools/scatterplots.py +++ b/scanpy/plotting/_tools/scatterplots.py @@ -166,7 +166,6 @@ def embedding( cmap = color_map cmap = copy(colormaps.get_cmap(cmap)) cmap.set_bad(na_color) - kwargs["cmap"] = cmap # Prevents warnings during legend creation na_color = colors.to_hex(na_color, keep_alpha=True) @@ -262,6 +261,7 @@ def embedding( # color=gene2, components = [1, 2], color=gene2, components=[2,3], # ] for count, (value_to_plot, dims) in enumerate(zip(color, dimensions)): + kwargs_scatter = kwargs.copy() # is potentially mutated for each plot color_source_vector = _get_color_source_vector( adata, value_to_plot, @@ -271,7 +271,7 @@ def embedding( gene_symbols=gene_symbols, groups=groups, ) - color_vector, categorical = _color_vector( + color_vector, color_type = _color_vector( adata, value_to_plot, values=color_source_vector, @@ -281,10 +281,10 @@ def embedding( # Order points order = slice(None) - if sort_order is True and value_to_plot is not None and categorical is False: + if sort_order and value_to_plot is not None and color_type == "cont": # Higher values plotted on top, null values on bottom order = np.argsort(-color_vector, kind="stable")[::-1] - elif sort_order and categorical: + elif sort_order and color_type == "cat": # Null points go on bottom order = np.argsort(~pd.isnull(color_source_vector), kind="stable") # Set orders @@ -316,18 +316,17 @@ def embedding( ) ax.set_title(value_to_plot) - if not categorical: + if color_type == "cont": vmin_float, vmax_float, vcenter_float, norm_obj = _get_vboundnorm( vmin, vmax, vcenter, norm=norm, index=count, colors=color_vector ) - normalize = check_colornorm( + kwargs_scatter["norm"] = check_colornorm( vmin_float, vmax_float, vcenter_float, norm_obj, ) - else: - normalize = None + kwargs_scatter["cmap"] = cmap # make the scatter plot if projection == "3d": @@ -337,9 +336,8 @@ def embedding( coords[:, 2], c=color_vector, rasterized=settings._vector_friendly, - norm=normalize, marker=marker[count], - **kwargs, + **kwargs_scatter, ) else: scatter = ( @@ -370,42 +368,35 @@ def embedding( # remove edge from kwargs if present # because edge needs to be set to None - kwargs["edgecolor"] = "none" - - # remove alpha for outline - alpha = kwargs.pop("alpha") if "alpha" in kwargs else None - - ax.scatter( - coords[:, 0], - coords[:, 1], - s=bg_size, - c=bg_color, - rasterized=settings._vector_friendly, - norm=normalize, - marker=marker[count], - **kwargs, - ) - ax.scatter( - coords[:, 0], - coords[:, 1], - s=gap_size, - c=gap_color, - rasterized=settings._vector_friendly, - norm=normalize, - marker=marker[count], - **kwargs, - ) - # if user did not set alpha, set alpha to 0.7 - kwargs["alpha"] = 0.7 if alpha is None else alpha + kwargs_scatter["edgecolor"] = "none" + # For points, if user did not set alpha, set alpha to 0.7 + kwargs_scatter.setdefault("alpha", 0.7) + + # remove alpha and color mapping for outline + kwargs_outline = { + k: v + for k, v in kwargs.items() + if k not in {"alpha", "cmap", "norm"} + } + + for s, c in [(bg_size, bg_color), (gap_size, gap_color)]: + ax.scatter( + coords[:, 0], + coords[:, 1], + s=s, + c=c, + rasterized=settings._vector_friendly, + marker=marker[count], + **kwargs_outline, + ) cax = scatter( coords[:, 0], coords[:, 1], c=color_vector, rasterized=settings._vector_friendly, - norm=normalize, marker=marker[count], - **kwargs, + **kwargs_scatter, ) # remove y and x ticks @@ -445,7 +436,7 @@ def embedding( path_effect = None # Adding legends - if categorical or color_vector.dtype == bool: + if color_type == "cat": _add_categorical_legend( ax, color_source_vector, @@ -1224,12 +1215,12 @@ def _get_palette(adata, values_key: str, palette=None): def _color_vector( adata: AnnData, - values_key: str, + values_key: str | None, *, values: np.ndarray | pd.api.extensions.ExtensionArray, palette: str | Sequence[str] | Cycler | None, na_color: ColorLike = "lightgray", -) -> tuple[np.ndarray | pd.api.extensions.ExtensionArray, bool]: +) -> tuple[np.ndarray | pd.api.extensions.ExtensionArray, Literal["cat", "na", "cont"]]: """ Map array of values to array of hex (plus alpha) codes. @@ -1244,11 +1235,11 @@ def _color_vector( # 'obs' or in 'var' to_hex = partial(colors.to_hex, keep_alpha=True) if values_key is None: - return np.broadcast_to(to_hex(na_color), adata.n_obs), False + return np.broadcast_to(to_hex(na_color), adata.n_obs), "na" if values.dtype == bool: values = pd.Categorical(values.astype(str)) elif not isinstance(values, pd.Categorical): - return values, False + return values, "cont" color_map = { k: to_hex(v) @@ -1262,7 +1253,7 @@ def _color_vector( if color_vector.isna().any(): color_vector = color_vector.add_categories([to_hex(na_color)]) color_vector = color_vector.fillna(to_hex(na_color)) - return color_vector, True + return color_vector, "cat" def _basis2name(basis): diff --git a/scanpy/plotting/_utils.py b/scanpy/plotting/_utils.py index 94e10327f6..70ce5fb26e 100644 --- a/scanpy/plotting/_utils.py +++ b/scanpy/plotting/_utils.py @@ -1258,3 +1258,17 @@ def check_colornorm(vmin=None, vmax=None, vcenter=None, norm=None): norm = Normalize(vmin=vmin, vmax=vmax) return norm + + +DN = Literal["area", "count", "width"] + + +def _deprecated_scale(density_norm: DN, scale: DN | None, *, default: DN) -> DN: + if scale is None: + return density_norm + if density_norm != default: + msg = "can’t specify both `scale` and `density_norm`" + raise ValueError(msg) + msg = "`scale` is deprecated, use `density_norm` instead" + warnings.warn(msg, FutureWarning) + return scale diff --git a/scanpy/tests/test_plotting.py b/scanpy/tests/test_plotting.py index 2873c75cdc..5f6701bfa8 100644 --- a/scanpy/tests/test_plotting.py +++ b/scanpy/tests/test_plotting.py @@ -1685,3 +1685,10 @@ def test_string_mask(tmp_path, check_same_image): plt.close() check_same_image(p1, p2, tol=1) + + +def test_violin_scale_warning(monkeypatch): + adata = pbmc3k_processed() + monkeypatch.setattr(sc.pl.StackedViolin, "DEFAULT_SCALE", "count", raising=False) + with pytest.warns(FutureWarning, match="Don’t set DEFAULT_SCALE"): + sc.pl.StackedViolin(adata, adata.var_names[:3], groupby="louvain") From c09199928bd457459f43f72ab3aa114ac07f1249 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Mon, 12 Feb 2024 14:28:54 +0100 Subject: [PATCH 05/54] Move scrublet out of `external` (#2703) Co-authored-by: Ilan Gold --- docs/api/plotting.md | 1 + docs/api/preprocessing.md | 11 + docs/external/preprocessing.md | 5 +- docs/release-notes/1.10.0.md | 2 + docs/release-notes/1.7.0.md | 2 +- docs/release-notes/1.7.1.md | 2 +- docs/release-notes/1.8.0.md | 2 +- docs/release-notes/1.9.0.md | 4 +- pyproject.toml | 6 +- scanpy/_utils/__init__.py | 6 + scanpy/external/pl.py | 146 +----- scanpy/external/pp/__init__.py | 11 +- scanpy/get/get.py | 9 + scanpy/logging.py | 2 +- scanpy/neighbors/__init__.py | 34 +- scanpy/neighbors/_common.py | 5 +- scanpy/neighbors/_types.py | 2 +- scanpy/plotting/__init__.py | 2 + scanpy/plotting/_scrublet.py | 166 ++++++ scanpy/preprocessing/__init__.py | 3 + .../_scrublet/__init__.py} | 126 ++--- scanpy/preprocessing/_scrublet/core.py | 482 ++++++++++++++++++ scanpy/preprocessing/_scrublet/pipeline.py | 79 +++ .../preprocessing/_scrublet/sparse_utils.py | 75 +++ scanpy/preprocessing/_utils.py | 19 +- scanpy/testing/_pytest/marks.py | 1 - scanpy/tests/_images/scrublet/expected.png | Bin 6353 -> 6423 bytes .../scrublet_no_threshold/expected.png | Bin 6328 -> 6382 bytes .../scrublet_with_batches/expected.png | Bin 13521 -> 12841 bytes scanpy/tests/test_neighbors_common.py | 6 +- scanpy/tests/test_plotting.py | 6 +- scanpy/tests/{external => }/test_scrublet.py | 44 +- 32 files changed, 974 insertions(+), 285 deletions(-) create mode 100644 scanpy/plotting/_scrublet.py rename scanpy/{external/pp/_scrublet.py => preprocessing/_scrublet/__init__.py} (84%) create mode 100644 scanpy/preprocessing/_scrublet/core.py create mode 100644 scanpy/preprocessing/_scrublet/pipeline.py create mode 100644 scanpy/preprocessing/_scrublet/sparse_utils.py rename scanpy/tests/{external => }/test_scrublet.py (82%) diff --git a/docs/api/plotting.md b/docs/api/plotting.md index 3d4db199f7..32f73daf87 100644 --- a/docs/api/plotting.md +++ b/docs/api/plotting.md @@ -66,6 +66,7 @@ Methods for visualizing quality control and results of preprocessing functions. pl.highest_expr_genes pl.filter_genes_dispersion pl.highly_variable_genes + pl.scrublet_score_distribution ``` diff --git a/docs/api/preprocessing.md b/docs/api/preprocessing.md index 910c96e3ad..4b17567a6b 100644 --- a/docs/api/preprocessing.md +++ b/docs/api/preprocessing.md @@ -59,6 +59,17 @@ Also see [Data integration]. Note that a simple batch correction method is avail pp.combat ``` +### Doublet detection + +```{eval-rst} +.. autosummary:: + :nosignatures: + :toctree: generated/ + + pp.scrublet + pp.scrublet_simulate_doublets +``` + ### Neighbors ```{eval-rst} diff --git a/docs/external/preprocessing.md b/docs/external/preprocessing.md index a9c4af83b4..6ff31e099e 100644 --- a/docs/external/preprocessing.md +++ b/docs/external/preprocessing.md @@ -18,15 +18,12 @@ ``` -### Sample demultiplexing, Doublet detection +### Sample demultiplexing ```{eval-rst} .. autosummary:: :toctree: ../generated/ - pp.scrublet - pp.scrublet_simulate_doublets - pl.scrublet_score_distribution pp.hashsolo ``` diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index ddfdc07bb8..886bc17336 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -10,6 +10,8 @@ * {func}`scanpy.experimental.pp.highly_variable_genes` using `flavor='pearson_residuals'` now uses numba for variance computation {pr}`2612` {smaller}`S Dicks & P Angerer` * {func}`scanpy.external.pp.harmony_integrate` now runs with 64 bit floats improving reproducibility {pr}`2655` {smaller}`S Dicks` +* {func}`~scanpy.pp.scrublet` and {func}`~scanpy.pp.scrublet_simulate_doublets` were moved from {mod}`scanpy.external.pp` to {mod}`scanpy.pp`. + The `scrublet` implementation is now maintained as part of scanpy {pr}`2703` {smaller}`P Angerer` * Enhanced dask support for some internal utilities, paving the way for more extensive dask support {pr}`2696` {smaller}`P Angerer` * {func}`scanpy.pp.pca`, {func}`scanpy.pp.scale`, {func}`scanpy.pl.embedding`, and {func}`scanpy.experimental.pp.normalize_pearson_residuals_pca` now support a `mask` parameter {pr}`2272` {smaller}`C Bright, T Marcella, & P Angerer` diff --git a/docs/release-notes/1.7.0.md b/docs/release-notes/1.7.0.md index 4558b5ed5a..69ae5fd1b0 100644 --- a/docs/release-notes/1.7.0.md +++ b/docs/release-notes/1.7.0.md @@ -18,7 +18,7 @@ ``` - Add [Scanorama](https://github.com/brianhie/scanorama) integration to scanpy external API ({func}`~scanpy.external.pp.scanorama_integrate`) {cite}`Hie19` {pr}`1332` {smaller}`B Hie` -- Scrublet {cite}`Wolock19` integration: {func}`~scanpy.external.pp.scrublet`, {func}`~scanpy.external.pp.scrublet_simulate_doublets`, and plotting method {func}`~scanpy.external.pl.scrublet_score_distribution` {pr}`1476` {smaller}`J Manning` +- Scrublet {cite}`Wolock19` integration: {func}`~scanpy.pp.scrublet`, {func}`~scanpy.pp.scrublet_simulate_doublets`, and plotting method {func}`~scanpy.pl.scrublet_score_distribution` {pr}`1476` {smaller}`J Manning` - {func}`~scanpy.external.pp.hashsolo` for HTO demultiplexing {cite}`Bernstein20` {pr}`1432` {smaller}`NJ Bernstein` - Added [scirpy](https://github.com/icbi-lab/scirpy) (sc-AIRR analysis) to ecosystem page {pr}`1453` {smaller}`G Sturm` - Added [scvi-tools](https://scvi-tools.org) to ecosystem page {pr}`1421` {smaller}`A Gayoso` diff --git a/docs/release-notes/1.7.1.md b/docs/release-notes/1.7.1.md index ea75bcdc6c..0e536ca848 100644 --- a/docs/release-notes/1.7.1.md +++ b/docs/release-notes/1.7.1.md @@ -10,6 +10,6 @@ - {func}`~scanpy.tl.dendrogram` use `1 - correlation` as distance matrix to compute the dendrogram {pr}`1614` {smaller}`F Ramirez` - Fixed {func}`~scanpy.get.obs_df`/ {func}`~scanpy.get.var_df` erroring when `keys` not passed {pr}`1637` {smaller}`I Virshup` -- Fixed argument handling for {func}`scanpy.external.pp.scrublet` {smaller}`J Manning` +- Fixed argument handling for {func}`scanpy.pp.scrublet` {smaller}`J Manning` - Fixed passing of `kwargs` to {func}`scanpy.pl.violin` when `stripplot` was also used {pr}`1655` {smaller}`M van den Beek` - Fixed colorbar creation in `scanpy.pl.timeseries_as_heatmap` {pr}`1654` {smaller}`M van den Beek` diff --git a/docs/release-notes/1.8.0.md b/docs/release-notes/1.8.0.md index 6f29c72deb..2ec0a03496 100644 --- a/docs/release-notes/1.8.0.md +++ b/docs/release-notes/1.8.0.md @@ -17,7 +17,7 @@ - Standardized and expanded available arguments to the `sc.pl.rank_genes_groups*` family of functions. {pr}`1529` {smaller}`F Ramirez` {smaller}`I Virshup` \- See examples sections of {func}`~scanpy.pl.rank_genes_groups_dotplot` and {func}`~scanpy.pl.rank_genes_groups_matrixplot` for demonstrations. - {func}`scanpy.tl.tsne` now supports the metric argument and records the passed parameters {pr}`1854` {smaller}`I Virshup` -- {func}`scanpy.external.pl.scrublet_score_distribution` now uses same API as other scanpy functions for saving/ showing plots {pr}`1741` {smaller}`J Manning` +- {func}`scanpy.pl.scrublet_score_distribution` now uses same API as other scanpy functions for saving/ showing plots {pr}`1741` {smaller}`J Manning` ```{rubric} Ecosystem ``` diff --git a/docs/release-notes/1.9.0.md b/docs/release-notes/1.9.0.md index bd34dc2997..309e85f39c 100644 --- a/docs/release-notes/1.9.0.md +++ b/docs/release-notes/1.9.0.md @@ -21,7 +21,7 @@ - {func}`~scanpy.tl.filter_rank_genes_groups` now allows to filter with absolute values of log fold change {pr}`1649` {smaller}`S Rybakov` - `_choose_representation` now subsets the provided representation to n_pcs, regardless of the name of the provided representation (should affect mostly {func}`~scanpy.pp.neighbors`) {pr}`2179` {smaller}`I Virshup` {smaller}`PG Majev` -- {func}`scanpy.external.pp.scrublet` (and related functions) can now be used on `AnnData` objects containing multiple batches {pr}`1965` {smaller}`J Manning` +- {func}`scanpy.pp.scrublet` (and related functions) can now be used on `AnnData` objects containing multiple batches {pr}`1965` {smaller}`J Manning` - Number of variables plotted with {func}`~scanpy.pl.pca_loadings` can now be controlled with `n_points` argument. Additionally, variables are no longer repeated if the anndata has less than 30 variables {pr}`2075` {smaller}`Yves33` - Dask arrays now work with {func}`scanpy.pp.normalize_total` {pr}`1663` {smaller}`G Buckley, I Virshup` - {func}`~scanpy.pl.embedding_density` now allows more than 10 groups {pr}`1936` {smaller}`A Wolf` @@ -42,7 +42,7 @@ Multiple packages have been added to our ecosystem page, including: ``` - Fixed finding variables with `use_raw=True` and `basis=None` in {func}`scanpy.pl.scatter` {pr}`2027` {smaller}`E Rice` -- Fixed {func}`scanpy.external.pp.scrublet` to address {issue}`1957` {smaller}`FlMai` and ensure raw counts are used for simulation +- Fixed {func}`scanpy.pp.scrublet` to address {issue}`1957` {smaller}`FlMai` and ensure raw counts are used for simulation - Functions in {mod}`scanpy.datasets` no longer throw `OldFormatWarnings` when using `anndata` `0.8` {pr}`2096` {smaller}`I Virshup` - Fixed use of {func}`scanpy.pp.neighbors` with `method='rapids'`: RAPIDS cuML no longer returns a squared Euclidean distance matrix, so we should not square-root the kNN distance matrix. {pr}`1828` {smaller}`M Zaslavsky` - Removed `pytables` dependency by implementing `read_10x_h5` with `h5py` due to installation errors on Windows {pr}`2064` diff --git a/pyproject.toml b/pyproject.toml index b34195a3f3..a8afbac042 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -93,8 +93,7 @@ test = [ "scanpy[leiden]", "zarr", "scanpy[dask]", - # Temp. before moving into scanpy - "scrublet==0.2.3", + "scanpy[scrublet]", ] test-full = [ "scanpy[test]", @@ -104,7 +103,6 @@ test-full = [ "scanpy[skmisc]", "scanpy[harmony]", "scanpy[scanorama]", - "scanpy[scrublet]", "scanpy[dask-ml]", ] doc = [ @@ -140,7 +138,7 @@ magic = ["magic-impute>=2.0"] # MAGIC imputation method skmisc = ["scikit-misc>=0.1.3"] # highly_variable_genes method 'seurat_v3' harmony = ["harmonypy"] # Harmony dataset integration scanorama = ["scanorama"] # Scanorama dataset integration -scrublet = ["scrublet"] # Doublet detection +scrublet = ["scikit-image"] # Doublet detection with automatic thresholds # Acceleration rapids = ["cudf>=0.9", "cuml>=0.9", "cugraph>=0.9"] # GPU accelerated calculation of neighbors dask = ["dask[array]!=2.17.0"] # Use the Dask parallelization engine diff --git a/scanpy/_utils/__init__.py b/scanpy/_utils/__init__.py index 81e5de4c9f..9af75fc7b5 100644 --- a/scanpy/_utils/__init__.py +++ b/scanpy/_utils/__init__.py @@ -459,6 +459,12 @@ def moving_average(a: np.ndarray, n: int): return ret[n - 1 :] / n +def get_random_state(seed: AnyRandom) -> random.RandomState: + if isinstance(seed, np.random.RandomState): + return seed + return random.RandomState(seed) + + # -------------------------------------------------------------------------------- # Deal with tool parameters # -------------------------------------------------------------------------------- diff --git a/scanpy/external/pl.py b/scanpy/external/pl.py index b293a8426b..944828e8af 100644 --- a/scanpy/external/pl.py +++ b/scanpy/external/pl.py @@ -4,13 +4,13 @@ import matplotlib.pyplot as plt import numpy as np -import pandas as pd from anndata import AnnData # noqa: TCH002 from matplotlib.axes import Axes # noqa: TCH002 +from sklearn.utils import deprecated from .._compat import old_positionals from .._utils import _doc_params -from ..plotting import _utils, embedding +from ..plotting import _scrublet, _utils, embedding from ..plotting._docs import ( doc_adata_color_etc, doc_edges_arrows, @@ -31,7 +31,6 @@ "harmony_timeseries", "sam", "wishbone_marker_trajectory", - "scrublet_score_distribution", ] @@ -359,143 +358,6 @@ def wishbone_marker_trajectory( return ax -@old_positionals( - "scale_hist_obs", "scale_hist_sim", "figsize", "return_fig", "show", "save" +scrublet_score_distribution = deprecated("Import from sc.pl instead")( + _scrublet.scrublet_score_distribution ) -def scrublet_score_distribution( - adata: AnnData, - *, - scale_hist_obs: str = "log", - scale_hist_sim: str = "linear", - figsize: tuple[float, float] | None = (8, 3), - return_fig: bool = False, - show: bool = True, - save: str | bool | None = None, -): - """\ - Plot histogram of doublet scores for observed transcriptomes and simulated doublets. - - The histogram for simulated doublets is useful for determining the correct doublet - score threshold. - - Scrublet must have been run previously with the input object. - - Parameters - ---------- - adata - An annData object resulting from func:`~scanpy.external.scrublet`. - scale_hist_obs - Set y axis scale transformation in matplotlib for the plot of observed - transcriptomes (e.g. "linear", "log", "symlog", "logit") - scale_hist_sim - Set y axis scale transformation in matplotlib for the plot of simulated - doublets (e.g. "linear", "log", "symlog", "logit") - figsize - width, height - show - Show the plot, do not return axis. - save - If `True` or a `str`, save the figure. - A string is appended to the default filename. - Infer the filetype if ending on {`'.pdf'`, `'.png'`, `'.svg'`}. - - Returns - ------- - If `return_fig` is True, a :class:`~matplotlib.figure.Figure`. - If `show==False` a list of :class:`~matplotlib.axes.Axes`. - - See also - -------- - :func:`~scanpy.external.pp.scrublet`: Main way of running Scrublet, runs - preprocessing, doublet simulation and calling. - :func:`~scanpy.external.pp.scrublet_simulate_doublets`: Run Scrublet's doublet - simulation separately for advanced usage. - """ - - def _plot_scores( - ax: plt.Axes, scores: np.ndarray, scale: str, title: str, threshold=None - ): - ax.hist( - scores, - np.linspace(0, 1, 50), - color="gray", - linewidth=0, - density=True, - ) - ax.set_yscale(scale) - yl = ax.get_ylim() - ax.set_ylim(yl) - - if threshold is not None: - ax.plot(threshold * np.ones(2), yl, c="black", linewidth=1) - - ax.set_title(title) - ax.set_xlabel("Doublet score") - ax.set_ylabel("Prob. density") - - if "scrublet" not in adata.uns: - raise ValueError( - "Please run scrublet before trying to generate the scrublet plot." - ) - - # If batched_by is populated, then we know Scrublet was run over multiple batches - - if "batched_by" in adata.uns["scrublet"]: - batched_by = adata.uns["scrublet"]["batched_by"] - batches = adata.obs[batched_by].astype("category", copy=False) - n_batches = len(batches.cat.categories) - figsize = (figsize[0], figsize[1] * n_batches) - else: - batches = pd.Series( - np.broadcast_to(0, adata.n_obs), dtype="category", index=adata.obs_names - ) - n_batches = 1 - - fig, axs = plt.subplots(n_batches, 2, figsize=figsize) - - for idx, (batch_key, sub_obs) in enumerate( - adata.obs.groupby(batches, observed=True) - ): - # We'll need multiple rows if Scrublet was run in multiple batches - if "batched_by" in adata.uns["scrublet"]: - threshold = adata.uns["scrublet"]["batches"][batch_key].get( - "threshold", None - ) - doublet_scores_sim = adata.uns["scrublet"]["batches"][batch_key][ - "doublet_scores_sim" - ] - axis_lab_suffix = " (%s)" % batch_key - obs_ax = axs[idx][0] - sim_ax = axs[idx][1] - - else: - threshold = adata.uns["scrublet"].get("threshold", None) - doublet_scores_sim = adata.uns["scrublet"]["doublet_scores_sim"] - axis_lab_suffix = "" - obs_ax = axs[0] - sim_ax = axs[1] - - # Make the plots - _plot_scores( - obs_ax, - sub_obs["doublet_score"], - scale=scale_hist_obs, - title=f"Observed transcriptomes {axis_lab_suffix}", - threshold=threshold, - ) - _plot_scores( - sim_ax, - doublet_scores_sim, - scale=scale_hist_sim, - title=f"Simulated doublets {axis_lab_suffix}", - threshold=threshold, - ) - - fig.tight_layout() - - _utils.savefig_or_show("scrublet_score_distribution", show=show, save=save) - if return_fig: - return fig - if show: - return None - return axs diff --git a/scanpy/external/pp/__init__.py b/scanpy/external/pp/__init__.py index 8a144c8595..b14e222981 100644 --- a/scanpy/external/pp/__init__.py +++ b/scanpy/external/pp/__init__.py @@ -1,5 +1,8 @@ from __future__ import annotations +from sklearn.utils import deprecated + +from ...preprocessing import _scrublet from ._bbknn import bbknn from ._dca import dca from ._harmony_integrate import harmony_integrate @@ -7,7 +10,11 @@ from ._magic import magic from ._mnn_correct import mnn_correct from ._scanorama_integrate import scanorama_integrate -from ._scrublet import scrublet, scrublet_simulate_doublets + +scrublet = deprecated("Import from sc.pp instead")(_scrublet.scrublet) +scrublet_simulate_doublets = deprecated("Import from sc.pp instead")( + _scrublet.scrublet_simulate_doublets +) __all__ = [ "bbknn", @@ -17,6 +24,4 @@ "magic", "mnn_correct", "scanorama_integrate", - "scrublet", - "scrublet_simulate_doublets", ] diff --git a/scanpy/get/get.py b/scanpy/get/get.py index 0bb9f9c124..b51dc30a26 100644 --- a/scanpy/get/get.py +++ b/scanpy/get/get.py @@ -11,6 +11,8 @@ if TYPE_CHECKING: from collections.abc import Iterable + from anndata._core.sparse_dataset import BaseCompressedSparseDataset + from anndata._core.views import ArrayView from numpy.typing import NDArray # -------------------------------------------------------------------------------- @@ -405,6 +407,13 @@ def _get_obs_rep( layer: str | None = None, obsm: str | None = None, obsp: str | None = None, +) -> ( + np.ndarray + | spmatrix + | pd.DataFrame + | ArrayView + | BaseCompressedSparseDataset + | None ): """ Choose array aligned with obs annotation. diff --git a/scanpy/logging.py b/scanpy/logging.py index f59d2c6831..b545a2f07c 100644 --- a/scanpy/logging.py +++ b/scanpy/logging.py @@ -35,7 +35,7 @@ def log( msg: str, *, extra: dict | None = None, - time: datetime = None, + time: datetime | None = None, deep: str | None = None, ) -> datetime: from ._settings import settings diff --git a/scanpy/neighbors/__init__.py b/scanpy/neighbors/__init__.py index b41bb07478..4c330dbd02 100644 --- a/scanpy/neighbors/__init__.py +++ b/scanpy/neighbors/__init__.py @@ -500,7 +500,7 @@ def compute_neighbors( *, use_rep: str | None = None, knn: bool = True, - method: _Method = "umap", + method: _Method | None = "umap", transformer: KnnTransformerLike | _KnownTransformer | None = None, metric: _Metric | _MetricFn = "euclidean", metric_kwds: Mapping[str, Any] = MappingProxyType({}), @@ -517,10 +517,14 @@ def compute_neighbors( {use_rep} knn Restrict result to `n_neighbors` nearest neighbors. + method + See :func:`scanpy.pp.neighbors`. + If `None`, skip calculating connectivities. Returns ------- - Writes sparse graph attributes `.distances` and `.connectivities`. + Writes sparse graph attributes `.distances` and, + if `method` is not `None`, `.connectivities`. """ from ..tools._utils import _choose_representation @@ -571,8 +575,8 @@ def compute_neighbors( self._rp_forest = _make_forest_dict(index) except Exception: # TODO catch the correct exception pass - start_connect = logg.debug("computed neighbors", time=start_neighbors) + if method == "umap": self._connectivities = _connectivity.umap( knn_indices, @@ -584,25 +588,26 @@ def compute_neighbors( self._connectivities = _connectivity.gauss( self._distances, self.n_neighbors, knn=self.knn ) - else: + elif method is not None: msg = f"{method!r} should have been coerced in _handle_transform_args" raise AssertionError(msg) - logg.debug("computed connectivities", time=start_connect) self._number_connected_components = 1 if issparse(self._connectivities): from scipy.sparse.csgraph import connected_components self._connected_components = connected_components(self._connectivities) self._number_connected_components = self._connected_components[0] + if method is not None: + logg.debug("computed connectivities", time=start_connect) def _handle_transformer( self, - method: _Method | Literal["gauss"], + method: _Method | Literal["gauss"] | None, transformer: KnnTransformerLike | _KnownTransformer | None, *, knn: bool, kwds: KwdsForTransformer, - ) -> tuple[_Method, KnnTransformerLike, bool]: + ) -> tuple[_Method | None, KnnTransformerLike, bool]: """Return effective `method` and transformer. `method` will be coerced to `'gauss'` or `'umap'`. @@ -620,8 +625,8 @@ def _handle_transformer( use_dense_distances = ( kwds["metric"] == "euclidean" and self._adata.n_obs < 8192 ) or not knn - shortcut = transformer is None and ( - use_dense_distances or self._adata.n_obs < 4096 + shortcut = transformer == "sklearn" or ( + transformer is None and (use_dense_distances or self._adata.n_obs < 4096) ) # Coerce `method` to 'gauss' or 'umap' @@ -631,12 +636,12 @@ def _handle_transformer( raise ValueError(msg) method = "umap" transformer = "rapids" - elif method not in (methods := set(get_args(_Method))): + elif method not in (methods := set(get_args(_Method))) and method is not None: msg = f"`method` needs to be one of {methods}." raise ValueError(msg) # Validate `knn` - conn_method = "gauss" if method == "gauss" else "umap" + conn_method = method if method in {"gauss", None} else "umap" if not knn and not (conn_method == "gauss" and transformer is None): # “knn=False” seems to be only intended for method “gauss” msg = f"`method = {method!r} only with `knn = True`." @@ -646,11 +651,14 @@ def _handle_transformer( if shortcut: from sklearn.neighbors import KNeighborsTransformer - assert transformer is None + assert transformer in {None, "sklearn"} + n_neighbors = self._adata.n_obs - 1 + if knn: # only obey n_neighbors arg if knn set + n_neighbors = min(n_neighbors, kwds["n_neighbors"]) transformer = KNeighborsTransformer( algorithm="brute", n_jobs=settings.n_jobs, - n_neighbors=self._adata.n_obs - 1, # ignore n_neighbors + n_neighbors=n_neighbors, metric=kwds["metric"], metric_params=dict(kwds["metric_params"]), # needs dict # no random_state diff --git a/scanpy/neighbors/_common.py b/scanpy/neighbors/_common.py index 18c2eb2195..5a329a8a55 100644 --- a/scanpy/neighbors/_common.py +++ b/scanpy/neighbors/_common.py @@ -16,9 +16,8 @@ def _has_self_column( indices: NDArray[np.int32 | np.int64], distances: NDArray[np.float32 | np.float64], ) -> bool: - return (distances[:, 0] == 0.0).all() and ( - indices[:, 0] == np.arange(indices.shape[0]) - ).all() + # some algorithms have some messed up reordering. + return (indices[:, 0] == np.arange(indices.shape[0])).any() def _remove_self_column( diff --git a/scanpy/neighbors/_types.py b/scanpy/neighbors/_types.py index 8d1c50dc73..77a7d8889a 100644 --- a/scanpy/neighbors/_types.py +++ b/scanpy/neighbors/_types.py @@ -14,7 +14,7 @@ _Method = Literal["umap", "gauss"] -_KnownTransformer = Literal["pynndescent", "rapids"] +_KnownTransformer = Literal["pynndescent", "sklearn", "rapids"] _MetricFn = _C[[np.ndarray, np.ndarray], float] # from sklearn.metrics.pairwise_distances.__doc__: diff --git a/scanpy/plotting/__init__.py b/scanpy/plotting/__init__.py index 16ef150bfc..53d6e4531b 100644 --- a/scanpy/plotting/__init__.py +++ b/scanpy/plotting/__init__.py @@ -16,6 +16,7 @@ from ._preprocessing import filter_genes_dispersion, highly_variable_genes from ._qc import highest_expr_genes from ._rcmod import set_rcParams_defaults, set_rcParams_scanpy +from ._scrublet import scrublet_score_distribution from ._stacked_violin import StackedViolin, stacked_violin from ._tools import ( dpt_groups_pseudotime, @@ -72,6 +73,7 @@ "set_rcParams_scanpy", "StackedViolin", "stacked_violin", + "scrublet_score_distribution", "dpt_groups_pseudotime", "dpt_timeseries", "embedding_density", diff --git a/scanpy/plotting/_scrublet.py b/scanpy/plotting/_scrublet.py new file mode 100644 index 0000000000..0dc6f6d8c6 --- /dev/null +++ b/scanpy/plotting/_scrublet.py @@ -0,0 +1,166 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Literal +from typing import Union as _U + +import numpy as np +import pandas as pd +from matplotlib import pyplot as plt + +from .._compat import old_positionals +from . import _utils + +if TYPE_CHECKING: + from collections.abc import Sequence + + from anndata import AnnData + from matplotlib.axes import Axes + from matplotlib.figure import Figure + +Scale = _U[Literal["linear", "log", "symlog", "logit"], str] + + +@old_positionals( + "scale_hist_obs", "scale_hist_sim", "figsize", "return_fig", "show", "save" +) +def scrublet_score_distribution( + adata: AnnData, + *, + scale_hist_obs: Scale = "log", + scale_hist_sim: Scale = "linear", + figsize: tuple[float | int, float | int] = (8, 3), + return_fig: bool = False, + show: bool = True, + save: str | bool | None = None, +) -> Figure | Sequence[tuple[Axes, Axes]] | tuple[Axes, Axes] | None: + """\ + Plot histogram of doublet scores for observed transcriptomes and simulated doublets. + + The histogram for simulated doublets is useful for determining the correct doublet + score threshold. + + Scrublet must have been run previously with the input object. + + Parameters + ---------- + adata + An AnnData object resulting from :func:`~scanpy.pp.scrublet`. + scale_hist_obs + Set y axis scale transformation in matplotlib for the plot of observed transcriptomes + scale_hist_sim + Set y axis scale transformation in matplotlib for the plot of simulated doublets + figsize + width, height + show + Show the plot, do not return axis. + save + If :data:`True` or a :class:`str`, save the figure. + A string is appended to the default filename. + Infer the filetype if ending on {`'.pdf'`, `'.png'`, `'.svg'`}. + + Returns + ------- + If ``return_fig`` is True, a :class:`~matplotlib.figure.Figure`. + If ``show==False`` a list of :class:`~matplotlib.axes.Axes`. + + See also + -------- + :func:`~scanpy.pp.scrublet`: Main way of running Scrublet, runs + preprocessing, doublet simulation and calling. + :func:`~scanpy.pp.scrublet_simulate_doublets`: Run Scrublet's doublet + simulation separately for advanced usage. + """ + + if "scrublet" not in adata.uns: + raise ValueError( + "Please run scrublet before trying to generate the scrublet plot." + ) + + # If batched_by is populated, then we know Scrublet was run over multiple batches + + if "batched_by" in adata.uns["scrublet"]: + batched_by = adata.uns["scrublet"]["batched_by"] + batches = adata.obs[batched_by].astype("category", copy=False) + n_batches = len(batches.cat.categories) + figsize = (figsize[0], figsize[1] * n_batches) + else: + batches = pd.Series( + np.broadcast_to(0, adata.n_obs), dtype="category", index=adata.obs_names + ) + n_batches = 1 + + fig, axs = plt.subplots(n_batches, 2, figsize=figsize) + + for idx, (batch_key, sub_obs) in enumerate( + adata.obs.groupby(batches, observed=True) + ): + obs_ax: Axes + sim_ax: Axes + # We'll need multiple rows if Scrublet was run in multiple batches + if "batched_by" in adata.uns["scrublet"]: + threshold = adata.uns["scrublet"]["batches"][batch_key].get( + "threshold", None + ) + doublet_scores_sim = adata.uns["scrublet"]["batches"][batch_key][ + "doublet_scores_sim" + ] + axis_lab_suffix = " (%s)" % batch_key + obs_ax = axs[idx][0] + sim_ax = axs[idx][1] + + else: + threshold = adata.uns["scrublet"].get("threshold", None) + doublet_scores_sim = adata.uns["scrublet"]["doublet_scores_sim"] + axis_lab_suffix = "" + obs_ax = axs[0] + sim_ax = axs[1] + + # Make the plots + _plot_scores( + obs_ax, + sub_obs["doublet_score"], + scale=scale_hist_obs, + title=f"Observed transcriptomes {axis_lab_suffix}", + threshold=threshold, + ) + _plot_scores( + sim_ax, + doublet_scores_sim, + scale=scale_hist_sim, + title=f"Simulated doublets {axis_lab_suffix}", + threshold=threshold, + ) + + fig.tight_layout() + + _utils.savefig_or_show("scrublet_score_distribution", show=show, save=save) + if return_fig: + return fig + elif not show: + return axs + + +def _plot_scores( + ax: Axes, + scores: np.ndarray, + scale: Scale, + title: str, + threshold: float | None = None, +) -> None: + ax.hist( + scores, + np.linspace(0, 1, 50), + color="gray", + linewidth=0, + density=True, + ) + ax.set_yscale(scale) + yl = ax.get_ylim() + ax.set_ylim(yl) + + if threshold is not None: + ax.plot(threshold * np.ones(2), yl, c="black", linewidth=1) + + ax.set_title(title) + ax.set_xlabel("Doublet score") + ax.set_ylabel("Prob. density") diff --git a/scanpy/preprocessing/__init__.py b/scanpy/preprocessing/__init__.py index 88b4460256..3cfcff477d 100644 --- a/scanpy/preprocessing/__init__.py +++ b/scanpy/preprocessing/__init__.py @@ -8,6 +8,7 @@ from ._pca import pca from ._qc import calculate_qc_metrics from ._recipes import recipe_seurat, recipe_weinreb17, recipe_zheng17 +from ._scrublet import scrublet, scrublet_simulate_doublets from ._simple import ( downsample_counts, filter_cells, @@ -31,6 +32,8 @@ "recipe_seurat", "recipe_weinreb17", "recipe_zheng17", + "scrublet", + "scrublet_simulate_doublets", "downsample_counts", "filter_cells", "filter_genes", diff --git a/scanpy/external/pp/_scrublet.py b/scanpy/preprocessing/_scrublet/__init__.py similarity index 84% rename from scanpy/external/pp/_scrublet.py rename to scanpy/preprocessing/_scrublet/__init__.py index 5a8492c5c7..66fd800629 100644 --- a/scanpy/external/pp/_scrublet.py +++ b/scanpy/preprocessing/_scrublet/__init__.py @@ -1,5 +1,7 @@ from __future__ import annotations +from typing import TYPE_CHECKING + import numpy as np import pandas as pd from anndata import AnnData @@ -9,10 +11,15 @@ from ... import preprocessing as pp from ..._compat import old_positionals from ...get import _get_obs_rep +from . import pipeline +from .core import Scrublet + +if TYPE_CHECKING: + from ..._utils import AnyRandom + from ...neighbors import _Metric, _MetricFn @old_positionals( - "adata_sim", "batch_key", "sim_doublet_ratio", "expected_doublet_rate", @@ -33,14 +40,14 @@ ) def scrublet( adata: AnnData, - *, adata_sim: AnnData | None = None, + *, batch_key: str | None = None, sim_doublet_ratio: float = 2.0, expected_doublet_rate: float = 0.05, stdev_doublet_rate: float = 0.02, synthetic_doublet_umi_subsampling: float = 1.0, - knn_dist_metric: str = "euclidean", + knn_dist_metric: _Metric | _MetricFn = "euclidean", normalize_variance: bool = True, log_transform: bool = False, mean_center: bool = True, @@ -51,7 +58,7 @@ def scrublet( threshold: float | None = None, verbose: bool = True, copy: bool = False, - random_state: int = 0, + random_state: AnyRandom = 0, ) -> AnnData | None: """\ Predict doublets using Scrublet [Wolock19]_. @@ -63,12 +70,8 @@ def scrublet( This function is a wrapper around functions that pre-process using Scanpy and directly call functions of Scrublet(). You may also undertake your own preprocessing, simulate doublets with - scanpy.external.pp.scrublet_simulate_doublets(), and run the core scrublet - function scanpy.external.pp.scrublet.scrublet(). - - .. note:: - More information and bug reports `here - `__. + :func:`~scanpy.pp.scrublet_simulate_doublets`, and run the core scrublet + function :func:`~scanpy.pp.scrublet` with ``adata_sim`` set. Parameters ---------- @@ -81,11 +84,11 @@ def scrublet( consistently (filtering, transform, normalisaton, hvg) with adata_sim. adata_sim (Advanced use case) Optional annData object generated by - sc.external.pp.scrublet_simulate_doublets(), with same number of vars + :func:`~scanpy.pp.scrublet_simulate_doublets`, with same number of vars as adata. This should have been built from adata_obs after filtering genes and cells and selcting highly-variable genes. batch_key - Optional `adata.obs` column name discriminating between batches. + Optional :attr:`~anndata.AnnData.obs` column name discriminating between batches. sim_doublet_ratio Number of doublets to simulate relative to the number of observed transcriptomes. @@ -107,14 +110,14 @@ def scrublet( is False). normalize_variance If True, normalize the data such that each gene has a variance of 1. - `sklearn.decomposition.TruncatedSVD` will be used for dimensionality + :class:`sklearn.decomposition.TruncatedSVD` will be used for dimensionality reduction, unless `mean_center` is True. log_transform - Whether to use :func:``~scanpy.pp.log1p`` to log-transform the data + Whether to use :func:`~scanpy.pp.log1p` to log-transform the data prior to PCA. mean_center If True, center the data such that each gene has a mean of 0. - `sklearn.decomposition.PCA` will be used for dimensionality + :class:`sklearn.decomposition.PCA` will be used for dimensionality reduction. n_prin_comps Number of principal components used to embed the transcriptomes prior @@ -138,9 +141,9 @@ def scrublet( `doublet_scores_sim_` histogram and/or based on co-localization of predicted doublets in a 2-D embedding. verbose - If True, print progress updates. + If :data:`True`, log progress updates. copy - If ``True``, return a copy of the input ``adata`` with Scrublet results + If :data:`True`, return a copy of the input ``adata`` with Scrublet results added. Otherwise, Scrublet results are added in place. random_state Initial state for doublet simulation and nearest neighbors. @@ -167,17 +170,11 @@ def scrublet( See also -------- - :func:`~scanpy.external.pp.scrublet_simulate_doublets`: Run Scrublet's doublet + :func:`~scanpy.pp.scrublet_simulate_doublets`: Run Scrublet's doublet simulation separately for advanced usage. - :func:`~scanpy.external.pl.scrublet_score_distribution`: Plot histogram of doublet + :func:`~scanpy.pl.scrublet_score_distribution`: Plot histogram of doublet scores for observed transcriptomes and simulated doublets. """ - try: - import scrublet as sl # noqa: F401 - except ImportError: - raise ImportError( - "Please install scrublet: `pip install scrublet` or `conda install scrublet`." - ) if copy: adata = adata.copy() @@ -186,7 +183,7 @@ def scrublet( adata_obs = adata.copy() - def _run_scrublet(ad_obs, ad_sim=None): + def _run_scrublet(ad_obs: AnnData, ad_sim: AnnData | None = None): # With no adata_sim we assume the regular use case, starting with raw # counts and simulating doublets @@ -205,7 +202,7 @@ def _run_scrublet(ad_obs, ad_sim=None): logged = pp.log1p(ad_obs, copy=True) pp.highly_variable_genes(logged) - ad_obs = ad_obs[:, logged.var["highly_variable"]] + ad_obs = ad_obs[:, logged.var["highly_variable"]].copy() # Simulate the doublets based on the raw expressions from the normalised # and filtered object. @@ -258,7 +255,7 @@ def _run_scrublet(ad_obs, ad_sim=None): batches = np.unique(adata.obs[batch_key]) scrubbed = [ _run_scrublet( - adata_obs[adata_obs.obs[batch_key] == batch,], + adata_obs[adata_obs.obs[batch_key] == batch].copy(), adata_sim, ) for batch in batches @@ -292,16 +289,13 @@ def _run_scrublet(ad_obs, ad_sim=None): logg.info(" Scrublet finished", time=start) - if copy: - return adata - else: - return None + return adata if copy else None def _scrublet_call_doublets( - *, adata_obs: AnnData, adata_sim: AnnData, + *, n_neighbors: int | None = None, expected_doublet_rate: float = 0.05, stdev_doublet_rate: float = 0.02, @@ -309,35 +303,28 @@ def _scrublet_call_doublets( normalize_variance: bool = True, n_prin_comps: int = 30, use_approx_neighbors: bool = True, - knn_dist_metric: str = "euclidean", + knn_dist_metric: _Metric | _MetricFn = "euclidean", get_doublet_neighbor_parents: bool = False, threshold: float | None = None, - random_state: int = 0, + random_state: AnyRandom = 0, verbose: bool = True, ) -> AnnData: """\ Core function for predicting doublets using Scrublet [Wolock19]_. Predict cell doublets using a nearest-neighbor classifier of observed - transcriptomes and simulated doublets. This is a wrapper around the core - functions of `Scrublet `__ to allow - for flexibility in applying Scanpy filtering operations upstream. Unless - you know what you're doing you should use the main scrublet() function. - - .. note:: - More information and bug reports `here - `__. + transcriptomes and simulated doublets. Parameters ---------- adata_obs The annotated data matrix of shape ``n_obs`` × ``n_vars``. Rows correspond to cells and columns to genes. Should be normalised with - scanpy.pp.normalize_total() and filtered to include only highly + :func:`~scanpy.pp.normalize_total` and filtered to include only highly variable genes. adata_sim Anndata object generated by - sc.external.pp.scrublet_simulate_doublets(), with same number of vars + :func:`~scanpy.pp.scrublet_simulate_doublets`, with same number of vars as adata_obs. This should have been built from adata_obs after filtering genes and cells and selcting highly-variable genes. n_neighbors @@ -382,7 +369,7 @@ def _scrublet_call_doublets( random_state Initial state for doublet simulation and nearest neighbors. verbose - If True, print progress updates. + If :data:`True`, log progress updates. Returns ------- @@ -403,12 +390,6 @@ def _scrublet_call_doublets( ``.uns['scrublet']['parameters']`` Dictionary of Scrublet parameters """ - try: - import scrublet as sl - except ImportError: - raise ImportError( - "Please install scrublet: `pip install scrublet` or `conda install scrublet`." - ) # Estimate n_neighbors if not provided, and create scrublet object. @@ -418,7 +399,7 @@ def _scrublet_call_doublets( # Note: Scrublet() will sparse adata_obs.X if it's not already, but this # matrix won't get used if we pre-set the normalised slots. - scrub = sl.Scrublet( + scrub = Scrublet( adata_obs.X, n_neighbors=n_neighbors, expected_doublet_rate=expected_doublet_rate, @@ -429,19 +410,19 @@ def _scrublet_call_doublets( # Ensure normalised matrix sparseness as Scrublet does # https://github.com/swolock/scrublet/blob/67f8ecbad14e8e1aa9c89b43dac6638cebe38640/src/scrublet/scrublet.py#L100 - scrub._E_obs_norm = sparse.csc_matrix(adata_obs.X) - scrub._E_sim_norm = sparse.csc_matrix(adata_sim.X) + scrub._counts_obs_norm = sparse.csc_matrix(adata_obs.X) + scrub._counts_sim_norm = sparse.csc_matrix(adata_sim.X) scrub.doublet_parents_ = adata_sim.obsm["doublet_parents"] # Call scrublet-specific preprocessing where specified if mean_center and normalize_variance: - sl.pipeline_zscore(scrub) + pipeline.zscore(scrub) elif mean_center: - sl.pipeline_mean_center(scrub) + pipeline.mean_center(scrub) elif normalize_variance: - sl.pipeline_normalize_variance(scrub) + pipeline.normalize_variance(scrub) # Do PCA. Scrublet fits to the observed matrix and decomposes both observed # and simulated based on that fit, so we'll just let it do its thing rather @@ -449,18 +430,11 @@ def _scrublet_call_doublets( if mean_center: logg.info("Embedding transcriptomes using PCA...") - # Sklearn PCA doesn't like matrices, so convert to arrays - if isinstance(scrub._E_obs_norm, np.matrix): - scrub._E_obs_norm = np.asarray(scrub._E_obs_norm) - if isinstance(scrub._E_sim_norm, np.matrix): - scrub._E_sim_norm = np.asarray(scrub._E_sim_norm) - sl.pipeline_pca( - scrub, n_prin_comps=n_prin_comps, random_state=scrub.random_state - ) + pipeline.pca(scrub, n_prin_comps=n_prin_comps, random_state=scrub._random_state) else: logg.info("Embedding transcriptomes using Truncated SVD...") - sl.pipeline_truncated_svd( - scrub, n_prin_comps=n_prin_comps, random_state=scrub.random_state + pipeline.truncated_svd( + scrub, n_prin_comps=n_prin_comps, random_state=scrub._random_state ) # Score the doublets @@ -526,7 +500,7 @@ def scrublet_simulate_doublets( layer: str | None = None, sim_doublet_ratio: float = 2.0, synthetic_doublet_umi_subsampling: float = 1.0, - random_seed: int = 0, + random_seed: AnyRandom = 0, ) -> AnnData: """\ Simulate doublets by adding the counts of random observed transcriptome pairs. @@ -563,27 +537,21 @@ def scrublet_simulate_doublets( See also -------- - :func:`~scanpy.external.pp.scrublet`: Main way of running Scrublet, runs + :func:`~scanpy.pp.scrublet`: Main way of running Scrublet, runs preprocessing, doublet simulation (this function) and calling. - :func:`~scanpy.external.pl.scrublet_score_distribution`: Plot histogram of doublet + :func:`~scanpy.pl.scrublet_score_distribution`: Plot histogram of doublet scores for observed transcriptomes and simulated doublets. """ - try: - import scrublet as sl - except ImportError: - raise ImportError( - "Please install scrublet: `pip install scrublet` or `conda install scrublet`." - ) X = _get_obs_rep(adata, layer=layer) - scrub = sl.Scrublet(X, random_state=random_seed) + scrub = Scrublet(X, random_state=random_seed) scrub.simulate_doublets( sim_doublet_ratio=sim_doublet_ratio, synthetic_doublet_umi_subsampling=synthetic_doublet_umi_subsampling, ) - adata_sim = AnnData(scrub._E_sim) + adata_sim = AnnData(scrub._counts_sim) adata_sim.obs["n_counts"] = scrub._total_counts_sim adata_sim.obsm["doublet_parents"] = scrub.doublet_parents_ adata_sim.uns["scrublet"] = {"parameters": {"sim_doublet_ratio": sim_doublet_ratio}} diff --git a/scanpy/preprocessing/_scrublet/core.py b/scanpy/preprocessing/_scrublet/core.py new file mode 100644 index 0000000000..ab1c7e216c --- /dev/null +++ b/scanpy/preprocessing/_scrublet/core.py @@ -0,0 +1,482 @@ +from __future__ import annotations + +import sys +from dataclasses import InitVar, dataclass, field +from typing import TYPE_CHECKING, cast + +import numpy as np +import pandas as pd +from anndata import AnnData, concat +from scipy import sparse + +from ... import logging as logg +from ..._utils import AnyRandom, get_random_state +from ...neighbors import ( + Neighbors, + _get_indices_distances_from_sparse_matrix, + _Metric, + _MetricFn, +) +from .._utils import sample_comb +from .sparse_utils import subsample_counts + +if TYPE_CHECKING: + from numpy.random import RandomState + from numpy.typing import NDArray + +__all__ = ["Scrublet"] + + +if sys.version_info > (3, 10): + kw_only = lambda yes: {"kw_only": yes} # noqa: E731 +else: + kw_only = lambda _: {} # noqa: E731 + + +@dataclass(**kw_only(True)) +class Scrublet: + """\ + Initialize Scrublet object with counts matrix and doublet prediction parameters + + Parameters + ---------- + counts_obs + Matrix with shape (n_cells, n_genes) containing raw (unnormalized) + UMI-based transcript counts. + Converted into a :class:`scipy.sparse.csc_matrix`. + + total_counts_obs + Array with shape (n_cells,) of total UMI counts per cell. + If `None`, this is calculated as the row sums of `counts_obs`. + + sim_doublet_ratio + Number of doublets to simulate relative to the number of observed + transcriptomes. + + n_neighbors + Number of neighbors used to construct the KNN graph of observed + transcriptomes and simulated doublets. + If `None`, this is set to round(0.5 * sqrt(n_cells)) + + expected_doublet_rate + The estimated doublet rate for the experiment. + + stdev_doublet_rate + Uncertainty in the expected doublet rate. + + random_state + Random state for doublet simulation, approximate + nearest neighbor search, and PCA/TruncatedSVD. + """ + + # init fields + + counts_obs: InitVar[ + sparse.csr_matrix | sparse.csc_matrix | NDArray[np.integer] + ] = field(**kw_only(False)) + total_counts_obs: InitVar[NDArray[np.integer] | None] = None + sim_doublet_ratio: float = 2.0 + n_neighbors: InitVar[int | None] = None + expected_doublet_rate: float = 0.1 + stdev_doublet_rate: float = 0.02 + random_state: InitVar[AnyRandom] = 0 + + # private fields + + _n_neighbors: int = field(init=False, repr=False) + _random_state: RandomState = field(init=False, repr=False) + + _counts_obs: sparse.csc_matrix = field(init=False, repr=False) + _total_counts_obs: NDArray[np.integer] = field(init=False, repr=False) + _counts_obs_norm: sparse.csr_matrix | sparse.csc_matrix = field( + init=False, repr=False + ) + + _counts_sim: sparse.csr_matrix | sparse.csc_matrix = field(init=False, repr=False) + _total_counts_sim: NDArray[np.integer] = field(init=False, repr=False) + _counts_sim_norm: sparse.csr_matrix | sparse.csc_matrix | None = field( + default=None, init=False, repr=False + ) + + # Fields set by methods + + predicted_doublets_: NDArray[np.bool_] | None = field(init=False) + """(shape: n_cells) + Boolean mask of predicted doublets in the observed transcriptomes. + """ + + doublet_scores_obs_: NDArray[np.float64] = field(init=False) + """(shape: n_cells) + Doublet scores for observed transcriptomes. + """ + + doublet_scores_sim_: NDArray[np.float64] = field(init=False) + """(shape: n_doublets) + Doublet scores for simulated doublets. + """ + + doublet_errors_obs_: NDArray[np.float64] = field(init=False) + """(shape: n_cells) + Standard error in the doublet scores for observed transcriptomes. + """ + + doublet_errors_sim_: NDArray[np.float64] = field(init=False) + """(shape: n_doublets) + Standard error in the doublet scores for simulated doublets. + """ + + threshold_: float = field(init=False) + """Doublet score threshold for calling a transcriptome a doublet.""" + + z_scores_: NDArray[np.float64] = field(init=False) + """(shape: n_cells) + Z-score conveying confidence in doublet calls. + Z = `(doublet_score_obs_ - threhsold_) / doublet_errors_obs_` + """ + + detected_doublet_rate_: float = field(init=False) + """Fraction of observed transcriptomes that have been called doublets.""" + + detectable_doublet_fraction_: float = field(init=False) + """Estimated fraction of doublets that are detectable, i.e., + fraction of simulated doublets with doublet scores above `threshold_` + """ + + overall_doublet_rate_: float = field(init=False) + """Estimated overall doublet rate, + `detected_doublet_rate_ / detectable_doublet_fraction_`. + Should agree (roughly) with `expected_doublet_rate`. + """ + + manifold_obs_: NDArray[np.float64] = field(init=False) + """(shape: n_cells × n_features) + The single-cell "manifold" coordinates (e.g., PCA coordinates) + for observed transcriptomes. Nearest neighbors are found using + the union of `manifold_obs_` and `manifold_sim_` (see below). + """ + + manifold_sim_: NDArray[np.float64] = field(init=False) + """shape (n_doublets × n_features) + The single-cell "manifold" coordinates (e.g., PCA coordinates) + for simulated doublets. Nearest neighbors are found using + the union of `manifold_obs_` (see above) and `manifold_sim_`. + """ + + doublet_parents_: NDArray[np.intp] = field(init=False) + """(shape: n_doublets × 2) + Indices of the observed transcriptomes used to generate the + simulated doublets. + """ + + doublet_neighbor_parents_: list[NDArray[np.intp]] = field(init=False) + """(length: n_cells) + A list of arrays of the indices of the doublet neighbors of + each observed transcriptome (the ith entry is an array of + the doublet neighbors of transcriptome i). + """ + + def __post_init__( + self, + counts_obs: sparse.csr_matrix | sparse.csc_matrix | NDArray[np.integer], + total_counts_obs: NDArray[np.integer] | None, + n_neighbors: int | None, + random_state: AnyRandom, + ) -> None: + self._counts_obs = sparse.csc_matrix(counts_obs) + self._total_counts_obs = ( + self._counts_obs.sum(1).A.squeeze() + if total_counts_obs is None + else total_counts_obs + ) + self._n_neighbors = ( + int(round(0.5 * np.sqrt(self._counts_obs.shape[0]))) + if n_neighbors is None + else n_neighbors + ) + self._random_state = get_random_state(random_state) + + def simulate_doublets( + self, + *, + sim_doublet_ratio: float | None = None, + synthetic_doublet_umi_subsampling: float = 1.0, + ) -> None: + """Simulate doublets by adding the counts of random observed transcriptome pairs. + + Arguments + --------- + sim_doublet_ratio + Number of doublets to simulate relative to the number of observed + transcriptomes. If `None`, self.sim_doublet_ratio is used. + + synthetic_doublet_umi_subsampling + Rate for sampling UMIs when creating synthetic doublets. + If 1.0, each doublet is created by simply adding the UMIs from two randomly + sampled observed transcriptomes. + For values less than 1, the UMI counts are added and then randomly sampled + at the specified rate. + + Sets + ---- + doublet_parents_ + """ + + if sim_doublet_ratio is None: + sim_doublet_ratio = self.sim_doublet_ratio + else: + self.sim_doublet_ratio = sim_doublet_ratio + + n_obs = self._counts_obs.shape[0] + n_sim = int(n_obs * sim_doublet_ratio) + + pair_ix = sample_comb((n_obs, n_obs), n_sim, random_state=self._random_state) + + E1 = cast(sparse.csc_matrix, self._counts_obs[pair_ix[:, 0], :]) + E2 = cast(sparse.csc_matrix, self._counts_obs[pair_ix[:, 1], :]) + tots1 = self._total_counts_obs[pair_ix[:, 0]] + tots2 = self._total_counts_obs[pair_ix[:, 1]] + if synthetic_doublet_umi_subsampling < 1: + self._counts_sim, self._total_counts_sim = subsample_counts( + E1 + E2, + rate=synthetic_doublet_umi_subsampling, + original_totals=tots1 + tots2, + random_seed=self._random_state, + ) + else: + self._counts_sim = E1 + E2 + self._total_counts_sim = tots1 + tots2 + self.doublet_parents_ = pair_ix + + def set_manifold( + self, manifold_obs: NDArray[np.float64], manifold_sim: NDArray[np.float64] + ) -> None: + """\ + Set the manifold coordinates used in k-nearest-neighbor graph construction + + Arguments + --------- + manifold_obs + (shape: n_cells × n_features) + The single-cell "manifold" coordinates (e.g., PCA coordinates) + for observed transcriptomes. Nearest neighbors are found using + the union of `manifold_obs` and `manifold_sim` (see below). + + manifold_sim + (shape: n_doublets × n_features) + The single-cell "manifold" coordinates (e.g., PCA coordinates) + for simulated doublets. Nearest neighbors are found using + the union of `manifold_obs` (see above) and `manifold_sim`. + + Sets + ---- + manifold_obs_, manifold_sim_, + """ + + self.manifold_obs_ = manifold_obs + self.manifold_sim_ = manifold_sim + + def calculate_doublet_scores( + self, + use_approx_neighbors: bool = True, + distance_metric: _Metric | _MetricFn = "euclidean", + get_doublet_neighbor_parents: bool = False, + ) -> NDArray[np.float64]: + """\ + Calculate doublet scores for observed transcriptomes and simulated doublets + + Requires that manifold_obs_ and manifold_sim_ have already been set. + + Arguments + --------- + use_approx_neighbors + Use approximate nearest neighbor method (annoy) for the KNN + classifier. + + distance_metric + Distance metric used when finding nearest neighbors. For list of + valid values, see the documentation for annoy (if `use_approx_neighbors` + is True) or sklearn.neighbors.NearestNeighbors (if `use_approx_neighbors` + is False). + + get_doublet_neighbor_parents + If True, return the parent transcriptomes that generated the + doublet neighbors of each observed transcriptome. This information can + be used to infer the cell states that generated a given + doublet state. + + Sets + ---- + doublet_scores_obs_, doublet_scores_sim_, + doublet_errors_obs_, doublet_errors_sim_, + doublet_neighbor_parents_ + """ + + self._nearest_neighbor_classifier( + k=self._n_neighbors, + exp_doub_rate=self.expected_doublet_rate, + stdev_doub_rate=self.stdev_doublet_rate, + use_approx_nn=use_approx_neighbors, + distance_metric=distance_metric, + get_neighbor_parents=get_doublet_neighbor_parents, + ) + return self.doublet_scores_obs_ + + def _nearest_neighbor_classifier( + self, + k: int = 40, + *, + use_approx_nn: bool = True, + distance_metric: _Metric | _MetricFn = "euclidean", + exp_doub_rate: float = 0.1, + stdev_doub_rate: float = 0.03, + get_neighbor_parents: bool = False, + ) -> None: + adatas = [ + AnnData( + (arr := getattr(self, f"manifold_{n}_")), + obs=dict( + obs_names=pd.RangeIndex(arr.shape[0]).astype("string") + n, + doub_labels=n, + ), + ) + for n in ["obs", "sim"] + ] + manifold = concat(adatas) + + n_obs: int = (manifold.obs["doub_labels"] == "obs").sum() + n_sim: int = (manifold.obs["doub_labels"] == "sim").sum() + + # Adjust k (number of nearest neighbors) based on the ratio of simulated to observed cells + k_adj = int(round(k * (1 + n_sim / float(n_obs)))) + + # Find k_adj nearest neighbors + knn = Neighbors(manifold) + knn.compute_neighbors( + k_adj, + metric=distance_metric, + knn=True, + transformer="pynndescent" if use_approx_nn else "sklearn", + method=None, + random_state=self._random_state, + ) + neighbors, _ = _get_indices_distances_from_sparse_matrix(knn.distances, k_adj) + + # Calculate doublet score based on ratio of simulated cell neighbors vs. observed cell neighbors + doub_neigh_mask: NDArray[np.bool_] = ( + manifold.obs["doub_labels"].to_numpy()[neighbors] == "sim" + ) + n_sim_neigh: NDArray[np.int64] = doub_neigh_mask.sum(axis=1) + + rho = exp_doub_rate + r = n_sim / float(n_obs) + nd = n_sim_neigh.astype(np.float64) + N = float(k_adj) + + # Bayesian + q = (nd + 1) / (N + 2) + Ld = q * rho / r / (1 - rho - q * (1 - rho - rho / r)) + + se_q = np.sqrt(q * (1 - q) / (N + 3)) + se_rho = stdev_doub_rate + + se_Ld = ( + q + * rho + / r + / (1 - rho - q * (1 - rho - rho / r)) ** 2 + * np.sqrt((se_q / q * (1 - rho)) ** 2 + (se_rho / rho * (1 - q)) ** 2) + ) + + self.doublet_scores_obs_ = Ld[manifold.obs["doub_labels"] == "obs"] + self.doublet_scores_sim_ = Ld[manifold.obs["doub_labels"] == "sim"] + self.doublet_errors_obs_ = se_Ld[manifold.obs["doub_labels"] == "obs"] + self.doublet_errors_sim_ = se_Ld[manifold.obs["doub_labels"] == "sim"] + + # get parents of doublet neighbors, if requested + neighbor_parents = None + if get_neighbor_parents: + parent_cells = self.doublet_parents_ + neighbors = neighbors - n_obs + neighbor_parents = [] + for iCell in range(n_obs): + this_doub_neigh = neighbors[iCell, :][neighbors[iCell, :] > -1] + if len(this_doub_neigh) > 0: + this_doub_neigh_parents = np.unique( + parent_cells[this_doub_neigh, :].flatten() + ) + neighbor_parents.append(this_doub_neigh_parents) + else: + neighbor_parents.append(np.array([], dtype=np.intp)) + self.doublet_neighbor_parents_ = neighbor_parents + + def call_doublets( + self, *, threshold: float | None = None, verbose: bool = True + ) -> NDArray[np.bool_] | None: + """\ + Call trancriptomes as doublets or singlets + + Arguments + --------- + threshold + Doublet score threshold for calling a transcriptome + a doublet. If `None`, this is set automatically by looking + for the minimum between the two modes of the `doublet_scores_sim_` + histogram. It is best practice to check the threshold visually + using the `doublet_scores_sim_` histogram and/or based on + co-localization of predicted doublets in a 2-D embedding. + + verbose + If True, log summary statistics. + + Sets + ---- + predicted_doublets_, z_scores_, threshold_, + detected_doublet_rate_, detectable_doublet_fraction, + overall_doublet_rate_ + """ + + if threshold is None: + # automatic threshold detection + # http://scikit-image.org/docs/dev/api/skimage.filters.html + from skimage.filters import threshold_minimum + + try: + threshold = cast(float, threshold_minimum(self.doublet_scores_sim_)) + if verbose: + logg.info( + f"Automatically set threshold at doublet score = {threshold:.2f}" + ) + except Exception: + self.predicted_doublets_ = None + if verbose: + logg.warning( + "Failed to automatically identify doublet score threshold. " + "Run `call_doublets` with user-specified threshold." + ) + return self.predicted_doublets_ + + Ld_obs = self.doublet_scores_obs_ + Ld_sim = self.doublet_scores_sim_ + se_obs = self.doublet_errors_obs_ + Z = (Ld_obs - threshold) / se_obs + self.predicted_doublets_ = Ld_obs > threshold + self.z_scores_ = Z + self.threshold_ = threshold + self.detected_doublet_rate_ = (Ld_obs > threshold).sum() / float(len(Ld_obs)) + self.detectable_doublet_fraction_ = (Ld_sim > threshold).sum() / float( + len(Ld_sim) + ) + self.overall_doublet_rate_ = ( + self.detected_doublet_rate_ / self.detectable_doublet_fraction_ + ) + + if verbose: + logg.info( + f"Detected doublet rate = {100 * self.detected_doublet_rate_:.1f}%\n" + f"Estimated detectable doublet fraction = {100 * self.detectable_doublet_fraction_:.1f}%\n" + "Overall doublet rate:\n" + f"\tExpected = {100 * self.expected_doublet_rate:.1f}%\n" + f"\tEstimated = {100 * self.overall_doublet_rate_:.1f}%" + ) + + return self.predicted_doublets_ diff --git a/scanpy/preprocessing/_scrublet/pipeline.py b/scanpy/preprocessing/_scrublet/pipeline.py new file mode 100644 index 0000000000..cf593b58c0 --- /dev/null +++ b/scanpy/preprocessing/_scrublet/pipeline.py @@ -0,0 +1,79 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Literal + +import numpy as np +from scipy import sparse + +from .sparse_utils import sparse_multiply, sparse_var, sparse_zscore + +if TYPE_CHECKING: + from ..._utils import AnyRandom + from .core import Scrublet + + +def mean_center(self: Scrublet) -> None: + gene_means = self._counts_obs_norm.mean(0) + self._counts_obs_norm = sparse.csc_matrix(self._counts_obs_norm - gene_means) + if self._counts_sim_norm is not None: + self._counts_sim_norm = sparse.csc_matrix(self._counts_sim_norm - gene_means) + + +def normalize_variance(self: Scrublet) -> None: + gene_stdevs = np.sqrt(sparse_var(self._counts_obs_norm, axis=0)) + self._counts_obs_norm = sparse_multiply(self._counts_obs_norm.T, 1 / gene_stdevs).T + if self._counts_sim_norm is not None: + self._counts_sim_norm = sparse_multiply( + self._counts_sim_norm.T, 1 / gene_stdevs + ).T + + +def zscore(self: Scrublet) -> None: + gene_means = self._counts_obs_norm.mean(0) + gene_stdevs = np.sqrt(sparse_var(self._counts_obs_norm, axis=0)) + self._counts_obs_norm = sparse_zscore( + self._counts_obs_norm, gene_mean=gene_means, gene_stdev=gene_stdevs + ) + if self._counts_sim_norm is not None: + self._counts_sim_norm = sparse_zscore( + self._counts_sim_norm, gene_mean=gene_means, gene_stdev=gene_stdevs + ) + + +def truncated_svd( + self: Scrublet, + n_prin_comps: int = 30, + *, + random_state: AnyRandom = 0, + algorithm: Literal["arpack", "randomized"] = "arpack", +) -> None: + if self._counts_sim_norm is None: + raise RuntimeError("_counts_sim_norm is not set") + from sklearn.decomposition import TruncatedSVD + + svd = TruncatedSVD( + n_components=n_prin_comps, random_state=random_state, algorithm=algorithm + ).fit(self._counts_obs_norm) + self.set_manifold( + svd.transform(self._counts_obs_norm), svd.transform(self._counts_sim_norm) + ) + + +def pca( + self: Scrublet, + n_prin_comps: int = 50, + *, + random_state: AnyRandom = 0, + svd_solver: Literal["auto", "full", "arpack", "randomized"] = "arpack", +) -> None: + if self._counts_sim_norm is None: + raise RuntimeError("_counts_sim_norm is not set") + from sklearn.decomposition import PCA + + X_obs = self._counts_obs_norm.toarray() + X_sim = self._counts_sim_norm.toarray() + + pca = PCA( + n_components=n_prin_comps, random_state=random_state, svd_solver=svd_solver + ).fit(X_obs) + self.set_manifold(pca.transform(X_obs), pca.transform(X_sim)) diff --git a/scanpy/preprocessing/_scrublet/sparse_utils.py b/scanpy/preprocessing/_scrublet/sparse_utils.py new file mode 100644 index 0000000000..b11713ee35 --- /dev/null +++ b/scanpy/preprocessing/_scrublet/sparse_utils.py @@ -0,0 +1,75 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Literal + +import numpy as np +from scipy import sparse + +from ..._utils import AnyRandom, get_random_state + +if TYPE_CHECKING: + from numpy.typing import NDArray + + +def sparse_var( + E: sparse.csr_matrix | sparse.csc_matrix, + *, + axis: Literal[0, 1], +) -> NDArray[np.float64]: + """variance across the specified axis""" + + mean_gene: NDArray[np.float64] = E.mean(axis=axis).A.squeeze() + tmp: sparse.csc_matrix | sparse.csr_matrix = E.copy() + tmp.data **= 2 + return tmp.mean(axis=axis).A.squeeze() - mean_gene**2 + + +def sparse_multiply( + E: sparse.csr_matrix | sparse.csc_matrix | NDArray[np.float64], + a: float | int | NDArray[np.float64], +) -> sparse.csr_matrix | sparse.csc_matrix: + """multiply each row of E by a scalar""" + + nrow = E.shape[0] + w = sparse.lil_matrix((nrow, nrow)) + w.setdiag(a) + r = w @ E + if isinstance(r, (np.matrix, np.ndarray)): + return sparse.csc_matrix(r) + return r + + +def sparse_zscore( + E: sparse.csr_matrix | sparse.csc_matrix, + *, + gene_mean: NDArray[np.float64] | None = None, + gene_stdev: NDArray[np.float64] | None = None, +) -> sparse.csr_matrix | sparse.csc_matrix: + """z-score normalize each column of E""" + + if gene_mean is None: + gene_mean = E.mean(0) + if gene_stdev is None: + gene_stdev = np.sqrt(sparse_var(E, axis=0)) + return sparse_multiply(np.asarray((E - gene_mean).T), 1 / gene_stdev).T + + +def subsample_counts( + E: sparse.csr_matrix | sparse.csc_matrix, + *, + rate: float, + original_totals, + random_seed: AnyRandom = 0, +) -> tuple[sparse.csr_matrix | sparse.csc_matrix, NDArray[np.int64]]: + if rate < 1: + random_seed = get_random_state(random_seed) + E.data = random_seed.binomial(np.round(E.data).astype(int), rate) + current_totals = E.sum(1).A.squeeze() + unsampled_orig_totals = original_totals - current_totals + unsampled_downsamp_totals = np.random.binomial( + np.round(unsampled_orig_totals).astype(int), rate + ) + final_downsamp_totals = current_totals + unsampled_downsamp_totals + else: + final_downsamp_totals = original_totals + return E, final_downsamp_totals diff --git a/scanpy/preprocessing/_utils.py b/scanpy/preprocessing/_utils.py index d1f5cf7498..b9f6eb131c 100644 --- a/scanpy/preprocessing/_utils.py +++ b/scanpy/preprocessing/_utils.py @@ -5,8 +5,9 @@ import numba import numpy as np from scipy import sparse +from sklearn.random_projection import sample_without_replacement -from .._utils import _SupportedArray, elem_mul +from .._utils import AnyRandom, _SupportedArray, elem_mul if TYPE_CHECKING: from numpy.typing import NDArray @@ -121,3 +122,19 @@ def sparse_mean_var_major_axis(data, indices, indptr, *, major_len, minor_len, d variances[i] /= minor_len return means, variances + + +def sample_comb( + dims: tuple[int, ...], + nsamp: int, + *, + random_state: AnyRandom = None, + method: Literal[ + "auto", "tracking_selection", "reservoir_sampling", "pool" + ] = "auto", +) -> NDArray[np.int64]: + """Randomly sample indices from a grid, without repeating the same tuple.""" + idx = sample_without_replacement( + np.prod(dims), nsamp, random_state=random_state, method=method + ) + return np.vstack(np.unravel_index(idx, dims)).T diff --git a/scanpy/testing/_pytest/marks.py b/scanpy/testing/_pytest/marks.py index 99a4bfce4c..e6fa85f936 100644 --- a/scanpy/testing/_pytest/marks.py +++ b/scanpy/testing/_pytest/marks.py @@ -49,7 +49,6 @@ class needs(pytest.MarkDecorator, Enum): pypairs = auto() samalg = "sam-algorithm" scanorama = auto() - scrublet = auto() trimap = auto() wishbone = "wishbone-dev" diff --git a/scanpy/tests/_images/scrublet/expected.png b/scanpy/tests/_images/scrublet/expected.png index dee7a6b36ab1248b3bad874b8561495f3396c851..638d109bd43b7132e9e1c00427908919aa47e7ea 100644 GIT binary patch literal 6423 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 J1#%`Y{tG&zn&bcg literal 6353 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 XbHpRu_u_zmFCe5|$cyKT>ihi?*6{`ozJ~ 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 literal 6328 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 diff --git a/scanpy/tests/_images/scrublet_with_batches/expected.png b/scanpy/tests/_images/scrublet_with_batches/expected.png index 6be1269ff6e9438b123ab89a965a9f9559800783..f05ebe542e24cadc19a0c3ce479ba56c7244d6e5 100644 GIT binary patch literal 12841 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

k0Fyc0yf|kAPa}8dk4XWX=-SxP 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 xaDv=dvneireJ6(xlkl%^=KLo{*MEi1 sparse.csr_matrix: n_col = n_neighbors + (1 if style == "sklearn" else 0) dists = np.abs(np.random.randn(n_obs, n_col)) + 1e-8 - if style != "rapids": + idxs = np.arange(n_obs * n_col).reshape((n_col, n_obs)).T + if style == "rapids": + idxs[:, 0] += 1 # does not include cell itself + else: dists[:, 0] = 0.0 # includes cell itself if duplicates: # Don’t use the first column, as that might be the cell itself dists[n_obs // 4 : n_obs, 2] = 0.0 - idxs = np.arange(n_obs * n_col).reshape((n_col, n_obs)).T # keep self column to simulate output from kNN transformers mat = _get_sparse_matrix_from_indices_distances(idxs, dists, keep_self=True) diff --git a/scanpy/tests/test_plotting.py b/scanpy/tests/test_plotting.py index 5f6701bfa8..898a9ac2a0 100644 --- a/scanpy/tests/test_plotting.py +++ b/scanpy/tests/test_plotting.py @@ -1616,7 +1616,7 @@ def test_filter_rank_genes_groups_plots(tmp_path, plot, check_same_image): check_same_image(pth_a, pth_b, tol=1) -@needs.scrublet +@needs.skmisc @pytest.mark.parametrize( ("id", "params"), [ @@ -1636,11 +1636,11 @@ def test_scrublet_plots(monkeypatch, image_comparer, id, params): with monkeypatch.context() as m: if id == "scrublet_no_threshold": m.setattr("skimage.filters.threshold_minimum", None) - sc.external.pp.scrublet(adata, use_approx_neighbors=False, **params) + sc.pp.scrublet(adata, use_approx_neighbors=False, **params) if id == "scrublet_no_threshold": assert "threshold" not in adata.uns["scrublet"] - sc.external.pl.scrublet_score_distribution(adata, return_fig=True) + sc.pl.scrublet_score_distribution(adata, return_fig=True, show=False) save_and_compare_images(id) diff --git a/scanpy/tests/external/test_scrublet.py b/scanpy/tests/test_scrublet.py similarity index 82% rename from scanpy/tests/external/test_scrublet.py rename to scanpy/tests/test_scrublet.py index 87c58ed74b..85879ead33 100644 --- a/scanpy/tests/external/test_scrublet.py +++ b/scanpy/tests/test_scrublet.py @@ -11,14 +11,12 @@ from numpy.testing import assert_allclose, assert_array_equal import scanpy as sc -import scanpy.external as sce -import scanpy.preprocessing as pp from scanpy.testing._pytest.marks import needs if TYPE_CHECKING: from collections.abc import Callable -pytestmark = [needs.scrublet] +pytestmark = [needs.skimage] def pbmc200() -> AnnData: @@ -36,8 +34,8 @@ def paul500() -> AnnData: @pytest.mark.parametrize( ("mk_data", "expected_idx", "expected_scores"), [ - pytest.param(pbmc200, [13, 105, 138], [0.216495] * 3, id="sparse"), - pytest.param(paul500, [180, 230], [0.30275229] * 2, id="dense"), + pytest.param(pbmc200, [13, 138], [0.149254] * 2, id="sparse"), + pytest.param(paul500, [180], [0.219178], id="dense"), ], ) def test_scrublet( @@ -47,7 +45,7 @@ def test_scrublet( ): """Check that scrublet runs and detects some doublets.""" adata = mk_data() - sce.pp.scrublet(adata, use_approx_neighbors=False) + sc.pp.scrublet(adata, use_approx_neighbors=False) doublet_idx = np.flatnonzero(adata.obs["predicted_doublet"]).tolist() assert doublet_idx == expected_idx @@ -65,14 +63,14 @@ def test_scrublet_batched(): adata.obs["batch"] = 100 * ["a"] + 100 * ["b"] split = [adata[adata.obs["batch"] == x].copy() for x in ("a", "b")] - sce.pp.scrublet(adata, use_approx_neighbors=False, batch_key="batch") + sc.pp.scrublet(adata, use_approx_neighbors=False, batch_key="batch") doublet_idx = np.flatnonzero(adata.obs["predicted_doublet"]).tolist() # only one in the first batch (<100) - assert doublet_idx == [35, 132, 135, 136, 139, 153, 157, 168, 170, 171, 175, 180] + assert doublet_idx == [0, 2, 8, 15, 43, 88, 108, 113, 115, 132, 135, 175] assert_allclose( adata.obs["doublet_score"].iloc[doublet_idx], - np.array([0.164835, 0.109375])[([0] * 3 + [1] * 7 + [0, 1])], + np.array([0.109375, 0.164835])[([0] * 4 + [1] + [0] * 3 + [1] + [0] * 3)], atol=1e-5, rtol=1e-5, ) @@ -80,7 +78,7 @@ def test_scrublet_batched(): # Check that results are independent for s in split: - sce.pp.scrublet(s, use_approx_neighbors=False) + sc.pp.scrublet(s, use_approx_neighbors=False) merged = concat(split) pd.testing.assert_frame_equal(adata.obs[merged.obs.columns], merged.obs) @@ -88,12 +86,12 @@ def test_scrublet_batched(): def _preprocess_for_scrublet(adata: AnnData) -> AnnData: adata_pp = adata.copy() - pp.filter_genes(adata_pp, min_cells=3) - pp.filter_cells(adata_pp, min_genes=3) + sc.pp.filter_genes(adata_pp, min_cells=3) + sc.pp.filter_cells(adata_pp, min_genes=3) adata_pp.layers["raw"] = adata_pp.X.copy() - pp.normalize_total(adata_pp) - logged = pp.log1p(adata_pp, copy=True) - pp.highly_variable_genes(logged) + sc.pp.normalize_total(adata_pp) + logged = sc.pp.log1p(adata_pp, copy=True) + sc.pp.highly_variable_genes(logged) return adata_pp[:, logged.var["highly_variable"]].copy() @@ -125,7 +123,7 @@ def test_scrublet_data(): random_state = 1234 # Run Scrublet and let the main function run simulations - adata_scrublet_auto_sim = sce.pp.scrublet( + adata_scrublet_auto_sim = sc.pp.scrublet( pbmc200(), use_approx_neighbors=False, copy=True, @@ -144,10 +142,10 @@ def test_scrublet_data(): ) # Apply the same post-normalisation the Scrublet function would - pp.normalize_total(adata_obs, target_sum=1e6) - pp.normalize_total(adata_sim, target_sum=1e6) + sc.pp.normalize_total(adata_obs, target_sum=1e6) + sc.pp.normalize_total(adata_sim, target_sum=1e6) - adata_scrublet_manual_sim = sce.pp.scrublet( + adata_scrublet_manual_sim = sc.pp.scrublet( adata_obs, adata_sim=adata_sim, use_approx_neighbors=False, @@ -171,7 +169,7 @@ def _scrub_small_sess() -> AnnData: adata = pbmc200() sc.pp.filter_genes(adata, min_counts=100) - sce.pp.scrublet(adata, use_approx_neighbors=False) + sc.pp.scrublet(adata, use_approx_neighbors=False) return adata @@ -200,7 +198,7 @@ def test_scrublet_params(scrub_small: AnnData, param: str, value: Any): Check that changes to parameters change scrublet results. """ - curr = sce.pp.scrublet( + curr = sc.pp.scrublet( adata=scrub_small, use_approx_neighbors=False, copy=True, **{param: value} ) with pytest.raises(AssertionError): @@ -219,11 +217,11 @@ def test_scrublet_simulate_doublets(): _ = sc.pp.highly_variable_genes(logged) adata_obs = adata_obs[:, logged.var["highly_variable"]] - adata_sim = sce.pp.scrublet_simulate_doublets( + adata_sim = sc.pp.scrublet_simulate_doublets( adata_obs, sim_doublet_ratio=0.02, layer="raw" ) assert_array_equal( adata_sim.obsm["doublet_parents"], - np.array([[172, 47], [117, 192], [67, 195], [103, 9]]), + np.array([[13, 132], [106, 43], [152, 3], [160, 103]]), ) From 284df7791575f1b5a4a484b4f647059fac366623 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Tue, 13 Feb 2024 12:49:48 +0100 Subject: [PATCH 06/54] Ignore dask dataframe warning in tests (#2852) --- scanpy/testing/_pytest/__init__.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/scanpy/testing/_pytest/__init__.py b/scanpy/testing/_pytest/__init__.py index 47a78f1377..1dfc3f78d2 100644 --- a/scanpy/testing/_pytest/__init__.py +++ b/scanpy/testing/_pytest/__init__.py @@ -41,7 +41,7 @@ def _global_test_context(request: pytest.FixtureRequest) -> Generator[None, None @pytest.fixture(autouse=True, scope="session") -def limit_multithreading(): +def max_threads() -> Generator[int, None, None]: """Limit number of threads used per worker when using pytest-xdist. Prevents oversubscription of the CPU when multiple tests with parallel code are @@ -55,9 +55,27 @@ def limit_multithreading(): max_threads = max(n_cpus // n_workers, 1) with threadpoolctl.threadpool_limits(limits=max_threads): - yield + yield max_threads else: - yield + yield 0 + + +@pytest.fixture(autouse=True, scope="session") +def _fix_dask_df_warning(): + """ + Currently, dask warns when importing dask.dataframe. + This fixture preempts the warning and should be removed + once it is no longer raised. + """ + try: + import dask # noqa: F401 + except ImportError: + return + with pytest.warns( + DeprecationWarning, + match=r"The current Dask DataFrame implementation is deprecated", + ): + import dask.dataframe # noqa: F401 def pytest_addoption(parser: pytest.Parser) -> None: From 651cf851304160b4ca9d14f3f1ad9ab6e029af59 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:13:12 +0000 Subject: [PATCH 07/54] [pre-commit.ci] pre-commit autoupdate (#2850) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Philipp A --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index dddd96c7c5..18ea71fc98 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.2.0 + rev: v0.2.1 hooks: - id: ruff types_or: [python, pyi, jupyter] From 8666f0b95837a80a0215ab352e120f19f6c61f28 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Tue, 13 Feb 2024 23:17:27 +1100 Subject: [PATCH 08/54] Better docs for percent_top (#2849) Co-authored-by: Philipp A --- docs/release-notes/1.10.0.md | 1 + scanpy/preprocessing/_docs.py | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 886bc17336..3e47d20a15 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -22,6 +22,7 @@ * Fixed a lot of broken usage examples {pr}`2605` {smaller}`P Angerer` * Improved harmonization of return field of `sc.pp` and `sc.tl` functions {pr}`2742` {smaller}`E Roellin` * Re-add search-as-you-type, this time via `readthedocs-sphinx-search` {pr}`2805` {smaller}`P Angerer` +* Improved docs for `percent_top` argument of {func}`~scanpy.pp.calculate_qc_metrics` {pr}`2849` {smaller}`I Virshup` ```{rubric} Bug fixes ``` diff --git a/scanpy/preprocessing/_docs.py b/scanpy/preprocessing/_docs.py index 30bb6e458e..ef81025768 100644 --- a/scanpy/preprocessing/_docs.py +++ b/scanpy/preprocessing/_docs.py @@ -34,9 +34,12 @@ Keys for boolean columns of `.var` which identify variables you could want to control for (e.g. "ERCC" or "mito"). percent_top - Which proportions of top genes to cover. If empty or `None` don't - calculate. Values are considered 1-indexed, `percent_top=[50]` finds - cumulative proportion to the 50th most expressed gene.\ + List of ranks (where genes are ranked by expression) at which the cumulative + proportion of expression will be reported as a percentage. This can be used to + assess library complexity. Ranks are considered 1-indexed, and if empty or None + don't calculate. + + E.g. `percent_top=[50]` finds cumulative proportion to the 50th most expressed gene. """ doc_qc_metric_naming = """\ From 8f4243e47fff5c2024679bbe16c1a04ad5b2b337 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Tue, 13 Feb 2024 13:44:12 +0100 Subject: [PATCH 09/54] Add cell_ranger consistency test, fix test file extensions (#2851) --- scanpy/tests/_scripts/cell_ranger_hvg.csv | 766 +++++++++ scanpy/tests/_scripts/seurat_extract_hvg.r | 2 +- scanpy/tests/_scripts/seurat_extract_hvg_v3.r | 4 +- scanpy/tests/_scripts/seurat_hvg.csv | 1532 ++++++++--------- ...rat_hvg_v3.csv.gz => seurat_hvg_v3.dat.gz} | Bin ...g_v3_batch.csv => seurat_hvg_v3_batch.dat} | 0 scanpy/tests/test_highly_variable_genes.py | 96 +- .../tests/test_preprocessing_distributed.py | 7 +- 8 files changed, 1577 insertions(+), 830 deletions(-) create mode 100644 scanpy/tests/_scripts/cell_ranger_hvg.csv rename scanpy/tests/_scripts/{seurat_hvg_v3.csv.gz => seurat_hvg_v3.dat.gz} (100%) rename scanpy/tests/_scripts/{seurat_hvg_v3_batch.csv => seurat_hvg_v3_batch.dat} (100%) diff --git a/scanpy/tests/_scripts/cell_ranger_hvg.csv b/scanpy/tests/_scripts/cell_ranger_hvg.csv new file mode 100644 index 0000000000..0fae2d22bc --- /dev/null +++ b/scanpy/tests/_scripts/cell_ranger_hvg.csv @@ -0,0 +1,766 @@ +"","means","dispersions","dispersions_norm","highly_variable" +"HES4",0.5304635122844151,3.1288092668857144,2.6498873233795166,True +"TNFRSF4",0.14171751499176025,3.4165066884559034,0.2908051908016205,False +"SSU72",1.5785272424561636,1.971202021348294,-0.46825626492500305,False +"PARK7",2.9118247635023935,0.8317761719103588,-1.2987037897109985,False +"RBP7",0.117945088999612,3.4874560718097767,0.8794848918914795,False +"SRM",1.1533739699636187,2.3919357802700856,-0.48200079798698425,False +"MAD2L2",0.7493968660490854,2.7181935494443783,-1.1559326648712158,False +"AGTRAP",0.8358520524842399,2.707010108440194,0.3076137900352478,False +"TNFRSF1B",0.7568694932120187,2.7966985420761294,0.11162508279085159,False +"EFHD2",0.9243933268955775,2.592517310372801,0.038651369512081146,False +"NECAP2",0.979150595664978,2.5569515407911947,1.0841343402862549,False +"HP1BP3",0.7030399485996791,2.8093159942644563,0.3153490424156189,False +"C1QA",0.6261157955442156,3.385543681626872,10.756184577941895,True +"C1QB",0.28881434781210763,3.6373533671918135,3.586956262588501,True +"HNRNPR",1.115585243361337,2.4360244979119967,0.22135843336582184,False +"GALE",0.11096609081540788,3.2957238845045014,-0.7113512754440308,False +"STMN1",0.6996363959993634,3.111273483645198,5.190816879272461,True +"CD52",3.4654853027207513,0.5954857524590023,0.01910829171538353,False +"FGR",1.3675572446414404,2.2385974006937257,0.9593446850776672,False +"ATPIF1",1.8348273948260716,1.7636630352024354,-0.6449624300003052,False +"SESN2",0.024847239085606165,3.4679912301743254,0.7179816365242004,False +"EIF3I",1.892265351840428,1.675388041191036,-1.9044612646102905,False +"LCK",1.1270791363716126,2.6058680057188113,2.930917978286743,True +"MARCKSL1",1.0122270372935704,2.569097370041412,1.3148876428604126,False +"SFPQ",0.8402972320147923,2.6379961497199353,-0.880909264087677,False +"PSMB2",1.604980263369424,1.9556445151936688,-0.65134596824646,False +"MEAF6",1.2069518164225987,2.3029466998470602,0.018622349947690964,False +"NDUFS5",2.14812363079616,1.451206658282785,-1.0763150453567505,False +"CAP1",2.5468868037632535,1.1190614095007507,0.6637553572654724,False +"SMAP2",0.7773683203969683,2.7489692881650103,-0.659021258354187,False +"C1orf228",0.2898688234601702,3.2874463066453457,0.01257624477148056,False +"PRDX1",1.968205041885376,1.686806370500477,0.695281982421875,False +"TMEM69",0.1914095071383885,3.176824323316833,-1.6978821754455566,False +"SCP2",1.5313029742240907,2.001290496389565,-0.11415766924619675,False +"MAGOH",0.9533904068810599,2.521659061942851,-1.2912111282348633,False +"JAK1",1.4743659768785748,2.092173777797029,-0.9138151407241821,False +"CCBL2",0.23243971007210867,3.242827987120256,-0.44321003556251526,False +"GBP2",0.7749368071556091,2.8204381467568003,0.49492961168289185,False +"CD53",2.8928838889939446,0.8517409232738253,-1.1623235940933228,False +"DENND2D",0.5294922345025199,3.0185494716856773,1.0842756032943726,False +"C1orf162",2.184737410204751,1.573690905652336,-0.15529216825962067,False +"RHOC",1.6602056353432793,2.082339812911737,0.8396775722503662,False +"CD2",1.1210023679052081,2.517352537254768,1.5188066959381104,True +"RP11-782C8.1",0.05293079308101109,3.330090082626875,-0.4262087941169739,False +"TXNIP",2.281451116970607,1.441476391370049,0.6699948906898499,False +"CD160",0.08323188781738282,3.5767392858542695,1.620283603668213,True +"RP11-277L2.3",0.10405415092195783,3.3761168316854033,-0.04431665688753128,False +"APH1A",1.1272542803628105,2.3677500297559635,-0.8678426146507263,False +"MRPS21",1.5200760640416826,2.0316203966896293,0.24278214573860168,False +"CTSS",2.600600915295737,1.30354158590256,1.9239482879638672,True +"MRPL9",0.7814652310098921,2.676444012398946,-1.8300292491912842,False +"S100A10",3.3607992339134216,0.5893342527101975,0.0,False +"S100A9",1.409582656792232,2.465007269923572,3.855747938156128,True +"S100A8",0.4613748264312744,3.2327125900516456,2.340056896209717,True +"S100A6",3.7293049018723625,0.3582083481355116,-0.7179422378540039,False +"S100A4",3.9585082391330175,0.2761895939069958,-0.9727155566215515,False +"RAB13",0.1162391321999686,3.285544880542617,-0.7958083152770996,False +"TPM3",2.6585403493472506,1.0232566416929298,0.00930843222886324,False +"HAX1",1.1220479621206012,2.400309197613223,-0.3484174311161041,False +"PMVK",1.1341235051836287,2.3685606953904,-0.8549098968505859,False +"PBXIP1",0.5324374226161411,3.034081309820934,1.304816722869873,False +"DAP3",0.9161491434914725,2.587464533062356,-0.05617878586053848,False +"CCT3",1.4862880553518023,2.049297888778499,-1.462315320968628,False +"SH2D2A",0.18897649220057897,3.400267518491947,0.15606589615345,False +"MNDA",1.0991167637280055,2.517804503015002,1.5260169506072998,True +"FCER1A",0.9420430513790675,3.21133792328958,11.652631759643555,True +"TAGLN2",3.1507280370167323,0.7208878645285276,0.40864259004592896,False +"LY9",0.2372690953527178,3.3198660981378607,0.34375178813934326,False +"FCER1G",2.397678366388593,1.724497371427266,2.7781076431274414,True +"SDHC",1.3813321280479431,2.1398495418109613,-0.30391132831573486,False +"FCGR3A",1.2829865860939025,2.8652993179701114,9.280588150024414,True +"FCRLA",0.22628040041242328,3.4028767751669573,1.1917246580123901,False +"CD247",0.891135379246303,2.7810521250870672,3.577059030532837,True +"CREG1",0.41137202501297,3.03348728249702,-1.3830684423446655,False +"RCSD1",1.0958523975099836,2.443483884848663,0.34036004543304443,False +"XCL2",0.06376952069146292,3.6799765942747578,2.4768619537353516,True +"XCL1",0.09707019363130842,3.4941512028361577,0.9350355863571167,False +"PRDX6",1.6806023379734585,1.9038159582034995,-1.2612943649291992,False +"C1orf21",0.1641563814026969,3.229735484427098,-1.2588688135147095,False +"TPR",1.1804531162125724,2.339397006805721,0.6189600825309753,False +"PTPRC",2.12730660370418,1.5089899960552557,-0.6418120265007019,False +"PTPN7",0.34402357612337386,3.1679505563704122,0.22867675125598907,False +"NUCKS1",1.117167865548815,2.458023967826461,0.5723219513893127,False +"G0S2",0.20984560932431903,3.4893325551481222,2.07489013671875,True +"TRAF3IP3",2.1267591844286238,1.5469611141116486,-0.3562873899936676,False +"NENF",1.2834286178861345,2.2435754253522218,-0.9592245221138,False +"CAPN2",0.893832643372672,2.5788666413207455,-0.21754339337348938,False +"COA6",0.48626756804330007,2.96749372243911,-1.0681225061416626,False +"ARID4B",0.851666648047311,2.632559205303406,-0.9745415449142456,False +"RP11-156E8.1",0.03860488619123186,3.3544368842736594,-0.22419904172420502,False +"SH3YL1",0.4620246924672808,3.0782708629148376,0.3554126024246216,False +"ID2",2.0568542160306658,1.7171223734566026,0.9232438206672668,False +"HPCAL1",0.6492441235269819,2.8610645831228916,0.04494196176528931,False +"RAB10",0.7523934701510838,2.756633099257716,-0.5352797508239746,False +"OST4",2.656659406593868,1.0312111569255207,0.0636461079120636,False +"PPM1G",0.8485996399606978,2.6429166729029396,-0.7961705327033997,False +"LBH",0.6921050041062491,2.891877143501132,1.6483982801437378,True +"SRSF7",1.7653309873172216,1.8248941913893455,0.22867758572101593,False +"ZFP36L2",1.830921059335981,1.7927647316918736,-0.22974233329296112,False +"ERLEC1",0.3578668246950422,3.147433133644511,-0.017255501821637154,False +"CAPG",1.3814118017469135,2.2803317327738117,1.4932411909103394,False +"RNF181",1.4380535347121102,2.0739707580413835,-1.1466816663742065,False +"GNLY",1.0032860824040004,2.999422838365487,9.490450859069824,True +"CD8A",0.3241312152998788,3.3003264356119013,1.815401315689087,True +"CD8B",0.44246684312820433,3.273543690808798,2.8647544384002686,True +"MAL",0.4297808020455497,3.128882818675537,1.005798578262329,False +"DUSP2",1.1207810878753661,2.504273889398826,1.31015944480896,False +"MGAT4A",0.31925102846963066,3.1955486141460714,0.5594810843467712,False +"LIMS1",0.7920101846967424,2.7605458075660456,1.2295782566070557,False +"IL1B",0.2570977234840393,3.2971713911053646,0.11192019283771515,False +"NIFK",0.5474454225812639,2.923202247080712,-0.26958805322647095,False +"GYPC",2.2203396940231324,1.5258614178678656,-0.5149469971656799,False +"MZT2B",2.321262831347329,1.384265641952834,0.243854358792305,False +"CCDC115",1.0950205942562647,2.404726569365529,-0.277945876121521,False +"CXCR4",1.086656345980508,2.4897024867232056,1.0776978731155396,False +"PPIG",0.9968291626657758,2.5297641244822695,0.5676126480102539,False +"SSB",1.3223110280718122,2.215775082043864,-1.4170970916748047,False +"WIPF1",0.6886635957445417,2.822894835405091,-0.734584629535675,False +"ITGA4",0.8359883594512939,2.6870599618627664,-0.03595740348100662,False +"HSPD1",1.2332227740968977,2.3219639147831264,0.3318365216255188,False +"BZW1",0.6169549431119646,2.8532494815576617,-0.11466296017169952,False +"NBEAL1",1.9933375239372253,1.6027220872149128,0.06300842016935349,False +"CD28",0.22834476845605034,3.3463397443139953,0.6141861081123352,False +"AC079767.4",0.1084918076651437,3.5331158892640326,1.2583324909210205,False +"SLC11A1",0.30814815282821656,3.2428901013454476,-0.44257551431655884,False +"SP110",1.0571888521739414,2.4843437491704345,-0.2953089475631714,False +"SP140",0.43017298664365494,3.049996283569581,-0.007928198203444481,False +"SP100",1.1510275983810425,2.3706471690624444,-0.8216238021850586,False +"NCL",1.345952959060669,2.213487630522882,0.6381218433380127,False +"ARL4C",1.0411439589091709,2.5342394118625093,0.6526366472244263,False +"UBE2F",0.7239883623804365,2.7911613073139634,0.02221975289285183,False +"OGG1",0.1437217548915318,3.3459452409171737,-0.2946557402610779,False +"MRPS25",0.5746803440366473,2.9108047748360284,-0.4456234574317932,False +"ACAA1",1.1095116427966527,2.3890495658081807,-0.5280453562736511,False +"EXOG",0.2566750294821603,3.219165769692556,-0.6849249601364136,False +"EIF1B",0.9172415174756732,2.5901936764847533,-0.00495842145755887,False +"UQCRC1",1.3424256590434482,2.1660377150102073,0.03110724501311779,False +"NDUFAF3",1.625256486279624,1.9499109903718916,-0.7188214063644409,False +"IMPDH2",1.0820608033452714,2.445885899458562,-1.0259525775909424,False +"GPX1",2.8411599666731697,1.052730919270263,0.21064862608909607,False +"GNAI2",1.3338008305004665,2.208873101514469,0.579089343547821,False +"MANF",0.8267381763458252,2.7701468356474312,1.394922137260437,False +"TEX264",1.1493920115062168,2.3683195499177883,-0.8587568998336792,False +"TKT",2.32977936404092,1.3481921466552433,-0.024843018501996994,False +"ARL6IP5",2.2997865087645395,1.3544619890005456,0.021858587861061096,False +"PCNP",0.9019928847040449,2.608156523163588,0.33216696977615356,False +"BBX",0.6258379769325256,2.89382326193006,0.7139602899551392,False +"CD47",1.167584800379617,2.359159624565145,-1.0048877000808716,False +"TIGIT",0.16308624676295688,3.431156893100665,0.4123605489730835,False +"COX17",0.9749383292879377,2.5266938649006994,0.5092821717262268,False +"EAF2",0.6361635388646807,2.981489276051897,2.50433087348938,True +"GATA2",0.02065466948917934,3.6053354664900152,1.8575512170791626,True +"RAB7A",1.7316541000774928,1.851180282324229,0.6037248969078064,False +"H1FX",1.2759774603162493,2.3191694233756097,0.2858111560344696,False +"SELT",1.2521630345072066,2.3006853382342896,-0.018622349947690964,False +"SIAH2",0.6234958239964077,2.8600963498517955,0.025168094784021378,False +"GPR171",0.12484916210174561,3.3887073296941,0.060148950666189194,False +"P2RY13",0.1822306227684021,3.3755764030955335,-0.04880068823695183,False +"SSR3",1.3090353230067662,2.2646294170526837,-0.6124645471572876,False +"MFSD1",0.4444763374328613,3.032452032490228,-0.2333795577287674,False +"SEC62",1.3226326707431248,2.2461287756813846,-0.9171707630157471,False +"EIF4A2",2.4276457606043134,1.260371513988436,-0.6789846420288086,False +"CCDC50",0.46988354001726423,3.091734123464428,0.5284214615821838,False +"HES1",0.2825032785960606,3.3338783969396846,0.486890584230423,False +"ATP5I",1.422962064402444,2.1008111652004344,-0.8033192753791809,False +"SPON2",0.2778847098350525,3.4251988961414366,1.4197502136230469,False +"LYAR",0.6492481378146581,2.8655540393584085,0.13662846386432648,False +"CYTL1",0.05800771815436227,3.6590551057329663,2.3032727241516113,True +"MRFAP1",1.1185571449143545,2.397478309129657,-0.3935793340206146,False +"BLOC1S4",0.8435735678672791,2.687142834166228,-0.034530218690633774,False +"BST1",0.216778883934021,3.2453370329740827,-0.4175795614719391,False +"FGFBP2",0.3279827870641436,3.4724997132473914,3.879157781600952,True +"MED28",0.6768724032810756,2.7755042702316324,-1.7024245262145996,False +"KLF3",0.6425517780440194,2.891692646708277,0.6704475283622742,False +"SMIM14",0.549254503250122,3.0380474447677948,1.361133098602295,False +"HOPX",0.5609079912730626,3.1768674230821143,3.3322792053222656,True +"SPINK2",0.0866508081981114,3.5272536441528373,1.2096924781799316,False +"IGFBP7",0.7338042909758432,2.858800205561481,1.1143312454223633,False +"IGJ",0.41660849128450667,3.7034051283671636,8.388663291931152,True +"CCNI",2.3846312495640345,1.296249511108144,-0.4117434322834015,False +"HNRNPDL",2.3629807911600387,1.3019859173512682,-0.3690151870250702,False +"PLAC8",1.665989602293287,2.0920173798969977,0.9535687565803528,False +"HSD17B11",1.123522107260568,2.421642110920764,-0.008087675087153912,False +"BANK1",0.3008819491522653,3.3619913162471877,0.7740704417228699,False +"CCDC109B",1.2974642705917359,2.26003965325865,-0.6880581378936768,False +"SNHG8",1.2345471130098615,2.329453261673833,0.45518630743026733,False +"ANXA5",2.4337044647761754,1.2579877071783607,-0.6967406868934631,False +"HMGB2",1.5129692786080498,2.158400935845091,1.7348089218139648,True +"SUB1",1.9149133661815099,1.7741164588515903,1.3518120050430298,False +"IL7R",0.7544083384105137,2.9421889881944194,2.4607436656951904,True +"FYB",1.2590651869773866,2.359428561746921,0.9488804936408997,False +"EMB",0.44575908592769076,3.0021261924147176,-0.6230799555778503,False +"GZMK",0.411912488256182,3.467607131862128,3.8205127716064453,True +"GZMA",0.8198124470029559,3.066636345233417,6.500912666320801,True +"NSA2",0.9535107489994594,2.5590329629649484,-0.5897804498672485,False +"COX7C",3.1460759837286814,0.6037324147664256,0.04472475126385689,False +"GLRX",1.8970978804997036,1.7331939701500767,-1.079692006111145,False +"CAMK4",0.2955056534494673,3.228014595417946,-0.5945321917533875,False +"EPB41L4A-AS1",0.7334964432035174,2.8017803827777286,0.19367752969264984,False +"REEP5",1.7951795479229518,1.7943711789313865,-0.20682169497013092,False +"SNX2",1.2902411535808018,2.274426155022765,-0.45111197233200073,False +"IRF1",0.7273444042887006,2.8259228063128767,0.583486020565033,False +"SKP1",2.205871346337455,1.4317556549676123,-1.2225773334503174,False +"TXNDC15",0.42446238313402446,3.0506132428010764,0.0,False +"H2AFY",2.102547113895416,1.5527049731877816,-0.3130963444709778,False +"EGR1",0.12374017681394305,3.3571881826144856,-0.20137102901935577,False +"MZB1",0.38472775902066914,3.643412870804385,5.927809715270996,True +"NDUFA2",1.6624157694407873,1.913403205598164,-1.1484661102294922,False +"NDFIP1",1.5259128734043665,2.018526590035048,0.08868664503097534,False +"CD74",4.12582847901753,0.30904436481048864,-0.8706594109535217,False +"NUDCD2",0.6666762467793056,2.838733392491702,-0.411119669675827,False +"NPM1",3.6014694012914386,0.3721969248978591,-0.6744897365570068,False +"ATP6V0E1",2.5409100696018765,1.1457857980379478,0.8463109731674194,False +"HIGD2A",3.1212137351717266,0.6834339935249308,0.2923003137111664,False +"LMAN2",1.7619913738114492,1.8226149026577876,0.19615693390369415,False +"F12",0.0330258093561445,3.2966116392244755,-0.7039853930473328,False +"PRR7",0.2693428771836417,3.237854683304181,-0.4940134584903717,False +"NHP2",1.6793759053094046,1.9110689086917452,-1.175937533378601,False +"SQSTM1",1.0375721618107387,2.4559081954580066,-0.8355434536933899,False +"RNF130",1.2203602889605931,2.3884078517044336,1.4261703491210938,False +"SERPINB1",1.5039421936443873,2.085371752579504,0.8753591775894165,False +"SERPINB6",0.8504585446630205,2.648841929413822,-0.6941288113594055,False +"LY86",1.47219874892916,2.2025843541884615,0.4986390173435211,False +"ADTRP",0.10101056609834944,3.4481685000820357,0.5535088777542114,False +"DEK",1.5087253100531441,2.0655981285248735,0.6426517367362976,False +"SOX4",0.2103937956265041,3.3251341296374988,0.39756593108177185,False +"FAM65B",1.0588049936294555,2.5079820063963676,0.15378384292125702,False +"HIST1H4C",0.7881362237249102,2.7708035089645917,-0.3064814507961273,False +"HIST1H1E",1.1152915106500898,2.422656031574563,0.008087675087153912,False +"ZNRD1",0.6638743696893965,2.8217776261284206,-0.7574009895324707,False +"LTB",2.8712917688914708,1.215964406563696,1.3257043361663818,False +"LST1",2.3984740846497674,1.741513492260081,2.9048540592193604,True +"AIF1",2.3917279178755626,1.7763478010736589,3.164321184158325,True +"DDAH2",0.770357038293566,2.750185246221578,-0.6393881440162659,False +"CLIC1",3.739155138560704,0.2242716484012899,-1.133987307548523,False +"C6orf48",2.339820236819131,1.3425456372492157,-0.06690166145563126,False +"HLA-DRA",3.2884157282965525,1.1054795721498065,1.6032928228378296,True +"HLA-DRB5",3.154324907915933,1.0063751810099069,1.2954466342926025,False +"HLA-DRB1",3.446997114590236,0.8677241145786997,0.8647573590278625,False +"HLA-DQA1",2.5476609880583627,1.570376504835609,3.7467103004455566,True +"HLA-DQB1",2.452441107204982,1.5292111965907413,1.3234971761703491,False +"HLA-DQA2",2.3444376816068377,1.6477707912737234,2.20660138130188,True +"HLA-DMB",1.6760586064202445,2.0951059164789236,0.9899164438247681,False +"HLA-DMA",2.1292821376664297,1.7393766169589273,1.0905851125717163,False +"HLA-DPA1",3.2330788959775654,1.0596003132738443,1.4607789516448975,False +"HLA-DPB1",3.16840386731284,1.1301109135152296,1.679804801940918,True +"HSD17B8",0.34022767066955567,3.1348648285625913,-0.16790559887886047,False +"TAPBP",1.0028094267845153,2.5280142554997447,0.5343676805496216,False +"DAXX",0.5590433457919529,2.8906131104106447,-0.7323309183120728,False +"CUTA",2.2513053277560644,1.4442655688953754,0.6907703876495361,False +"HMGA1",1.3753544402122497,2.211347885867605,0.6107485890388489,False +"CCDC167",0.8610743641853332,2.7035271330848105,0.24763178825378418,False +"CNPY3",1.9137607056753976,1.6892247123927515,0.7134667634963989,False +"MEA1",1.0072646692820957,2.483654244744258,-0.3084085285663605,False +"HSP90AB1",2.3867687017577035,1.2828696964441078,-0.5114044547080994,False +"ELOVL5",0.645506854738508,2.8481827513011635,-0.2181389182806015,False +"UBE2J1",0.8947798136302403,2.670492969036405,1.5020928382873535,False +"PNISR",1.6540176173618861,1.9174103609219555,-1.1013076305389404,False +"RP3-467N11.1",0.029356536184038436,3.405342138675657,0.19817093014717102,False +"CD164",1.3470230272838049,2.1907374991342996,0.34708523750305176,False +"GTF3C6",1.1803169584274291,2.342655696233183,0.6726308465003967,False +"RWDD1",1.44691650390625,2.1123171500166498,-0.6561261415481567,False +"GOPC",0.29898412942886354,3.147857445738742,-1.4133557081222534,False +"SAMD3",0.34568540096282957,3.180138629167676,0.3747692108154297,False +"DYNLT1",0.6663589119911194,2.83300111917329,-0.5281877517700195,False +"SOD2",0.9205976619039263,2.642633113035837,0.9792211055755615,False +"TCP1",0.9338056281634739,2.5636135733186625,-0.5038118958473206,False +"MRPL18",1.0986694458552768,2.398655604769184,-0.37479764223098755,False +"RNASET2",2.9407299634388515,0.8370573705911849,-1.2626277208328247,False +"MAD1L1",0.6341510653495789,2.8770988733880554,0.3724043369293213,False +"CHST12",0.6126794375692095,2.8404418394810413,-0.3762286901473999,False +"EIF2AK1",0.4188102793693542,3.046149048194831,-0.05736686661839485,False +"NDUFA4",2.9592636115210396,0.7837307422954507,-1.6269043684005737,False +"TOMM7",2.8213674572535923,0.8942258964180442,-0.8721067309379578,False +"CPVL",1.4130316621916634,2.421491929714827,3.299067258834839,True +"LSM5",0.6533228519984654,2.829257689018655,-0.6046384572982788,False +"SEPT7",1.8130666937146869,1.7952363822936783,-0.19447706639766693,False +"AOAH",0.47285788978849136,3.0247918433301044,-0.3318163752555847,False +"STK17A",0.8681095252718244,2.7487604185375454,1.0266162157058716,False +"COA1",0.6039574517522539,2.851430495384938,-1.288696527481079,False +"PPIA",3.5606521875517707,0.3562480931691587,-0.7240313291549683,False +"SNHG15",0.6873580013002668,2.7928120337349354,-1.3489545583724976,False +"UPP1",0.46531397104263306,3.089963383721524,0.5056666731834412,False +"CCT6A",1.145482864379883,2.3730372145209375,-0.783494770526886,False +"SBDS",0.5968672043936594,2.8765601879455054,-0.931872546672821,False +"WBSCR22",1.026856778689793,2.464154093390568,-0.6788833141326904,False +"EIF4H",1.163014680658068,2.3355280385784853,-1.381888747215271,False +"LAT2",0.7729718971252442,2.7128792661073886,-1.241738200187683,False +"NCF1",0.7237173124722072,2.7894038273395605,-0.006156879477202892,False +"HSPB1",1.1349364835875375,2.4314607175300473,0.14855121076107025,False +"RSBN1L-AS1",0.03947643859045846,3.4271648188678583,0.3792375922203064,False +"CDK6",0.115386267048972,3.4192639664480127,0.31368282437324524,False +"CCDC132",0.05164613587515695,3.2576960768298404,-1.0268747806549072,False +"BRI3",1.0589042724881854,2.5264102345798345,0.5038936138153076,False +"PDAP1",1.0740721126965114,2.442179759204409,-1.09636390209198,False +"ATP5J2",2.341696172441755,1.2777849206137528,-0.549278974533081,False +"MCM7",0.2507415097100394,3.2184273582969998,-0.692467987537384,False +"LAMTOR4",2.934967553274972,0.7882563134366036,-1.5959900617599487,False +"PILRA",1.0828603843280247,2.6414314504728,3.4982712268829346,True +"ZNHIT1",1.9015019583702086,1.6663747693152677,-2.0330617427825928,False +"FAM185A",0.033765993458884105,3.3792286628347243,-0.01849723979830742,False +"RINT1",0.014512692519596644,3.403195955268523,0.18036365509033203,False +"SYPL1",0.5652138178689139,2.9579592640077195,0.22393718361854553,False +"RP11-390E23.6",0.05689254828861782,3.286793717687195,-0.7854464650154114,False +"CPA5",0.13437814678464616,3.3654090125494265,-0.13316133618354797,False +"MTPN",0.8822556029047285,2.6248019123251116,0.6445664167404175,False +"C7orf55",0.4160502713067191,3.0288028236282476,-0.2802734971046448,False +"NDUFB2",2.2544069262913293,1.344193389075016,-0.05462820082902908,False +"MRPS33",0.6887507067407881,2.827236389391286,0.6046954393386841,False +"GSTK1",2.827765314238412,0.8969790653233523,-0.8532997369766235,False +"ZYX",1.0235753835950578,2.489530041579394,-0.196776881814003,False +"GIMAP7",2.2397186613082884,1.5876096278661298,1.7584842443466187,True +"TMEM176B",0.9490635667528425,2.871800016929958,5.280209064483643,True +"TMEM176A",0.3573712778091431,3.231418092533679,0.9894309043884277,False +"OFD1",0.49818977628435407,3.0086811906603628,-0.5388453602790833,False +"NDUFB11",2.517864238875253,1.1725489993281453,1.0291316509246826,False +"TIMP1",2.2173807883262633,1.6034321140820327,0.06834747642278671,False +"CFP",1.7583173383985247,2.089187811462487,3.9995925426483154,True +"EBP",0.69867180619921,2.7901664683699527,0.006156879477202892,False +"WDR13",0.35334653207233974,3.0984666428353043,-0.6041927337646484,False +"PQBP1",1.1066113696779523,2.4196659177273814,-0.039614420384168625,False +"PLP2",1.6222328853607177,2.0064834073669857,-0.05304449051618576,False +"MSN",1.2662034085818699,2.281929009749784,-0.32753971219062805,False +"IGBP1",1.618926956312997,1.9447770691682476,-0.7792403697967529,False +"IL2RG",2.0749206624712264,1.6082441419039284,0.10453162342309952,False +"COX7B",0.8857673301015582,2.635271083018891,0.8410510420799255,False +"ITM2A",0.6361515644618443,3.0110888999558854,3.108832836151123,True +"TCEAL8",0.539815628528595,2.914090055192999,-0.39897477626800537,False +"NGFRAP1",0.3234098836353847,3.2381122715098525,1.0696707963943481,False +"RPL39",1.1081793393407549,2.45699714739544,0.5559408068656921,False +"NDUFA1",2.0945171880722047,1.4909836892363224,-0.7772108316421509,False +"CD40LG",0.20659316710063388,3.4277449064888623,1.44575834274292,False +"SSR4",2.6547780190195356,1.0810629118808102,0.40418583154678345,False +"MPP1",0.3585300963265555,3.0951642098340564,-0.6437773704528809,False +"BLK",0.29053961072649276,3.3730008507488067,0.8865353465080261,False +"BIN3",0.3703190929549081,3.1070248154834927,-0.5016101598739624,False +"PNOC",0.27039243289402554,3.334161462678466,0.4897821843624115,False +"RP11-489E7.4",0.15074032442910332,3.26897496726013,-0.9332917928695679,False +"LEPROTL1",0.8173508821214949,2.7371271477689523,0.826274037361145,False +"GTF2E2",0.4438890027999878,2.9866488284389066,-0.8219709396362305,False +"PPAPDC1B",0.3715251350402832,3.171007459799798,0.265318363904953,False +"GOLGA7",0.7948394434792655,2.6987533604340714,0.1654203236103058,False +"CHCHD7",0.5513905014310564,2.9137123338134714,-0.40433815121650696,False +"TRAM1",1.1111518195697239,2.428138798946678,0.09555574506521225,False +"TPD52",0.4878309239659991,3.024190582171708,-0.33954283595085144,False +"MTDH",2.002582537787301,1.6009606285753135,0.049763090908527374,False +"ZNF706",1.8430475289481028,1.7611412038924252,-0.6809436678886414,False +"EIF3E",1.4990359786578586,2.1318132727444024,1.4219098091125488,False +"LYPD2",0.2695499757358006,3.615220481829752,3.3608639240264893,True +"LY6E",2.8343881038257055,0.9498866870112674,-0.491885244846344,False +"COMMD5",0.5678990956715175,2.877028204677167,-0.9252270460128784,False +"PLGRKT",0.6059730056353978,2.8920885018839155,0.6785319447517395,False +"PTPLAD2",0.6819068455696106,2.797172391899942,-1.2599046230316162,False +"SIT1",0.8835776056562151,2.7373692410772663,2.7572219371795654,True +"CCDC107",1.0341274997166225,2.499956034529484,0.001301950658671558,False +"TLN1",0.8933609758104597,2.638256754198833,0.8970859050750732,False +"DCAF10",0.07251328502382551,3.32401222875022,-0.4766378402709961,False +"ANXA1",2.172457705906459,1.5877249211937419,-0.049763090908527374,False +"OSTF1",1.7721871655327932,1.8030162945417845,-0.0834740549325943,False +"HNRNPK",2.2995847078732083,1.343789417262253,-0.057637229561805725,False +"HIATL1",0.058406964370182585,3.3672887779322815,-0.1175645962357521,False +"ANP32B",2.181985102721623,1.4753827626529357,-0.8945223093032837,False +"TXN",1.488051608289991,2.0750060630092437,-1.1334372758865356,False +"ATP6V1G1",2.5903410400663103,1.0940277692270626,0.4927493929862976,False +"NDUFA8",0.9543200090953282,2.5454485738925956,-0.8447312712669373,False +"ARPC5L",1.1225670995031085,2.4242290318166617,0.03318217396736145,False +"C9orf78",1.43552109003067,2.109446208137029,-0.6928533315658569,False +"NUP214",0.3878690736634391,3.107276439999808,-0.4985940456390381,False +"FCN1",1.419729381629399,2.555718118144937,5.016188621520996,True +"EGFL7",0.046753500189099996,3.6133860799049646,1.9243485927581787,True +"SNHG7",1.642782987526485,1.9652695056213405,-0.5380735397338867,False +"PHPT1",1.1817486844744,2.3400272195953016,0.6293397545814514,False +"C9orf142",1.3177240756579809,2.281642536725902,-0.3322579264640808,False +"CLIC3",0.4501452023642404,3.2944315768386736,3.1331729888916016,True +"KLF6",1.791573168209621,1.8320175433271169,0.3303128778934479,False +"AKR1C3",0.13095156465257918,3.554385532172659,1.4348105192184448,False +"RBM17",0.8748487618991306,2.6013348468905093,0.20413824915885925,False +"PRKCQ-AS1",0.46681215490613664,3.103100917574293,0.6744897365570068,False +"GATA3",0.2590657837050302,3.251678202418415,-0.3528030514717102,False +"VIM",3.885628358295986,0.21233870271118252,-1.171054482460022,False +"NSUN6",0.024934874602726528,3.474595904983479,0.7727817893028259,False +"DNAJC1",0.6634162780216762,2.8232553997600425,-0.7272209525108337,False +"COMMD3",0.8854918708120073,2.6176850215840988,0.5109971761703491,False +"APBB1IP",1.1748897525242397,2.340432011980694,0.6360066533088684,False +"ABI1",0.6449177377564567,2.871763896273733,0.2634500563144684,False +"EPC1",0.669435395513262,2.842406744945392,-0.33610016107559204,False +"HNRNPF",1.7424403936522348,1.8326575481032996,0.3394443988800049,False +"ZNF22",0.5449531759534564,2.9080615878019396,-0.4845747947692871,False +"SRGN",3.1820203178269524,0.7187670703930441,0.4020548164844513,False +"PPA1",1.9723249432018826,1.6812761727173977,0.6536975502967834,False +"PRF1",0.4672342995234898,3.275639186480046,2.8916826248168945,True +"C10orf54",1.9480348338399616,1.7539579326550647,1.200229525566101,False +"PSAP",2.4776945972442626,1.3736345890505057,0.16466780006885529,False +"ANAPC16",2.096301405089242,1.5138270419198916,-0.6054397821426392,False +"RPS24",4.16888646875109,0.03951180933621988,-1.707903504371643,False +"ANXA11",1.2801857791628157,2.268022200146689,-0.5565853118896484,False +"HHEX",0.7483355024882725,2.7820411128241203,-0.12503677606582642,False +"PDLIM1",0.7521954165186201,2.832517061902885,0.6899582743644714,False +"PGAM1",1.2006995878900801,2.2877982710090805,-0.23087278008460999,False +"NPM3",0.5835609034129552,2.865885252861492,-1.083449125289917,False +"ADD3",0.5499678979601179,2.9657473341933214,0.3345223069190979,False +"C10orf118",0.3986073684692383,3.111001656390669,-0.4539417028427124,False +"RGS10",2.047165349211012,1.6040314410144636,0.07285413146018982,False +"TIAL1",0.5335880361284528,2.910171923069395,-0.4546095132827759,False +"FAM175B",0.09877219642911639,3.3717517386351727,-0.08053461462259293,False +"ZNF511",0.7602233764103481,2.7354446135042756,-0.8773934245109558,False +"FUOM",0.6160800736291068,2.8513776886293734,-0.1528898924589157,False +"PSMD13",1.0358003786631993,2.453071104581682,-0.88944411277771,False +"IFITM2",3.025044196333204,0.8708068091830532,0.8743330836296082,False +"IFITM1",0.9825507824761527,2.6816280869914118,3.4528088569641113,True +"IFITM3",1.233267947946276,2.6049925324807095,4.9933271408081055,True +"RNH1",2.2854771607262747,1.430862690039207,0.5909375548362732,False +"IRF7",0.7144035414287022,2.7756465632086846,-0.22828449308872223,False +"TALDO1",2.315921594074794,1.363848686102709,0.09177643060684204,False +"CTSD",1.150955012185233,2.433645389775409,0.183403879404068,False +"CARS",0.3293207386561802,3.1871696070730824,0.45904606580734253,False +"ILK",0.7130265188217163,2.767055800512124,-0.366992712020874,False +"NUCB2",0.7804963626180377,2.8388301473961355,0.7918906211853027,False +"LDHA",2.646963887895857,1.0612974821123924,0.2691672146320343,False +"CAT",1.3958466352735246,2.1633590126821045,-0.003160706255584955,False +"CD82",0.4070742334638323,3.177156608603619,0.3390251696109772,False +"SPI1",2.231482674053737,1.6421315097406062,0.3593484163284302,False +"PSMC3",1.057702433041164,2.435412908399148,-1.2249243259429932,False +"MTCH2",0.9038760454314095,2.5695294343274675,-0.39278340339660645,False +"TIMM10",0.9125858875683376,2.555437698134146,-0.6572561264038086,False +"LPXN",0.5208022686413356,2.9724967887828257,-1.003830909729004,False +"MS4A1",0.3979865292140416,3.5480273204811525,4.784470081329346,True +"CYB561A3",0.55853326184409,2.991263798988882,0.6968382000923157,False +"POLR2G",1.8253445369856698,1.7620458795909237,-0.6680358648300171,False +"SLC3A2",0.7898644290651594,2.7050488519728555,0.2738380432128906,False +"OTUB1",1.2153184212957109,2.3037832457407155,0.03240028768777847,False +"BAD",0.6657410158429827,2.7825584997611923,-1.5583586692810059,False +"CAPN1",0.5994882069315229,2.888645002994283,-0.7602766752243042,False +"NEAT1",1.4566774565832956,2.130449105919701,-0.4241686761379242,False +"KAT5",0.2968501506532942,3.127999098077351,-1.6162132024765015,False +"CTSW",0.9621502413068499,2.813046329991027,4.177524089813232,True +"SF3B2",1.4724382727486747,2.077045175298248,-1.1073514223098755,False +"ADRBK1",0.6168780016899109,2.883235462426564,0.4977295994758606,False +"POLD4",2.4242102306229727,1.2463729817337565,-0.7832542061805725,False +"TBC1D10C",1.7153395128250122,1.9253617431514982,1.66213858127594,True +"PTPRCAP",2.3851946640014647,1.6333942228268428,2.099515914916992,True +"CORO1B",1.5599733216421945,2.057563574525523,0.5480964779853821,False +"GSTP1",3.119873720577785,0.8714259378963397,0.8762562870979309,False +"UNC93B1",0.9315736372130258,2.5934637616120333,0.056414298713207245,False +"NDUFS8",1.7151016981261118,1.8656834018318127,0.8106539845466614,False +"MRPL21",0.8315154310635158,2.6519930911928933,-0.6398611068725586,False +"LAMTOR1",2.2409815730367386,1.3932246889024167,0.3105868101119995,False +"MRPL48",0.6947724696568081,2.795760143583927,0.09647350758314133,False +"SPCS2",1.583583630834307,2.014408752528413,0.0402255542576313,False +"TMEM126B",0.5399540260859899,2.9149846414807135,-0.38627228140830994,False +"CTSC",1.8882055456297737,1.7540570450853805,-0.7820197343826294,False +"CWC15",1.0441237218039376,2.4719411812930745,-0.5309398770332336,False +"FDX1",0.8730441645213536,2.638431645274597,-0.8734093904495239,False +"POU2AF1",0.26468634639467514,3.2528270328841224,-0.34106749296188354,False +"IL18",0.20164505788258144,3.2570738661670697,-1.032037377357483,False +"AMICA1",1.5803277056557792,2.130784304219579,1.409800410270691,False +"CD3E",1.4863548026766096,2.314327366060956,1.9281386137008667,True +"CD3D",1.597190865448543,2.335945691488548,3.824258327484131,True +"CD3G",0.7958931735583714,2.874686919074812,3.1952579021453857,True +"FLI1",0.5684784987994603,2.8810853876799003,-0.8676179051399231,False +"NINJ2",0.39574057000023977,3.131716985087926,-0.20563724637031555,False +"CD27",1.4169702465193612,2.4144899758867426,3.2094931602478027,True +"CHD4",0.3184319577898298,3.127275857394397,-0.2588708698749542,False +"MLF2",1.3171423414775303,2.1922417776912413,-1.8046914339065552,False +"LAG3",0.14760625158037458,3.4282075205781326,0.3878890872001648,False +"CD4",0.6600866266659328,2.804439425764517,-1.11149263381958,False +"KLRG1",0.3516923270906721,3.239973909166978,1.0919852256774902,False +"KLRB1",0.2260218334197998,3.3903462304760947,1.0637223720550537,False +"KLRC2",0.04603870017187936,3.5524425370682007,1.4186891317367554,False +"KLRC1",0.08168333121708461,3.5181544168477346,1.1341944932937622,False +"RP11-291B21.2",0.1719919524874006,3.3853792623738665,0.032535381615161896,False +"PRR4",0.16564905541283745,3.268730880594785,-0.9353170394897461,False +"H2AFJ",1.0108332354681833,2.5471112430404825,0.8971828818321228,False +"WBP11",0.32068588869912285,3.1503122876713943,0.017255501821637154,False +"LDHB",3.090368707180023,0.8168236151401055,0.7066460847854614,False +"FGFR1OP2",0.5136887632097517,2.996302626757417,-0.6979153752326965,False +"FKBP11",0.6760352529798235,3.026186457422854,3.4171648025512695,True +"TMBIM6",2.4643773542131697,1.2290757748601833,-0.9120943546295166,False +"COX14",1.2297626870019096,2.2744939273574203,-0.449995756149292,False +"HNRNPA1",3.810504821709224,0.21062666187887483,-1.1763725280761719,False +"NFE2",0.14978008372443063,3.3596810038081437,-0.18068765103816986,False +"CD63",1.9836902158600944,1.7124564837311567,0.8881585597991943,False +"WIBG",0.7042777190889631,2.810107214841377,0.3281242549419403,False +"CNPY2",1.2761631846427917,2.2577829311966244,-0.7252264022827148,False +"ATP5B",2.5996967690331596,1.1091054208588431,0.5957455635070801,False +"RP11-620J15.3",0.18905291829790388,3.314683790084808,-0.5540375709533691,False +"TMBIM4-1",1.4108897934641156,2.1371014371892754,-0.33906713128089905,False +"LYZ",2.32092558997018,2.0034402274302705,4.855844020843506,True +"ATXN7L3B",0.25039225373949325,3.205269601427195,-0.8268774747848511,False +"NAP1L1",2.914099838052477,0.8732971017743051,-1.0150723457336426,False +"OSBPL8",1.1245168273789543,2.4081749062298576,-0.22293363511562347,False +"BTG1",3.263639827115195,0.6591327372688829,0.21681377291679382,False +"ISCU",1.8713946012088232,1.7385922299795884,-1.002670168876648,False +"HVCN1",0.6137770799228123,2.960789849442122,2.0815939903259277,True +"PPP1CC",1.297231457574027,2.2420686157896124,-0.984041690826416,False +"MAPKAPK5-AS1",0.4799438408442906,2.9987331096006606,-0.6666826009750366,False +"ERP29",3.0997669761521474,0.6733285132770047,0.2609098553657532,False +"OAS1",1.0008396107809885,2.6152677244653435,2.1920578479766846,True +"COX6A1",2.9413888655390057,0.7728634491770028,-1.7011394500732422,False +"TRIAP1",0.42828919036047797,3.040210829921559,-0.13367559015750885,False +"POP5",0.7117045303753444,2.7676167058689862,-0.35793620347976685,False +"ACADS",0.18171605110168457,3.2706955540822853,-0.9190158247947693,False +"RNF34",0.23365106412342618,3.265410289859481,-0.21252667903900146,False +"AC084018.1",0.1785874148777553,3.304151777634601,-0.6414235234260559,False +"MPHOSPH9",0.14263780798230852,3.3228616833605376,-0.48618412017822266,False +"SAP18",2.4612904606546673,1.194226452443494,-1.17167329788208,False +"POMP",1.2791384216717312,2.2226097845101864,-1.3045293092727661,False +"ALOX5AP",0.8205571668488639,2.817019737696731,2.2021431922912598,True +"WBP4",0.25492370912006923,3.195421653593422,-0.9274764657020569,False +"TSC22D1",0.07034264905112131,3.4627494652358646,0.6744897365570068,False +"ESD",0.6112283757754735,2.857631623666684,-0.025168094784021378,False +"EBPL",0.5743373210089547,2.911140628405641,-0.44085457921028137,False +"UCHL3",0.5158664427484785,2.906478392976629,-1.8521963357925415,False +"TNFSF13B",0.5592069693974087,2.950253576124085,0.114521823823452,False +"APEX1",1.4997389898981366,2.0783920997492284,0.7932186126708984,False +"DHRS4L2",0.9008679515974862,2.5793652945943517,-0.20818470418453217,False +"PSME2",3.1926214323725017,0.6151405421380615,0.08016160875558853,False +"NEDD8",2.677662648473467,1.0168477402452565,-0.03447107970714569,False +"TINF2",0.5248728227615357,2.9586227677804393,0.2333584725856781,False +"GZMH",0.4276356611933027,3.49082709004423,5.656941890716553,True +"GZMB",0.5011476033074516,3.447795450085074,5.103966236114502,True +"NFKBIA",1.970262508051736,1.710929472693763,0.8766761422157288,False +"PNN",0.8359825416973659,2.667499932998655,-0.3728102147579193,False +"RN7SL1",0.03981003795351301,3.452677876978633,0.5909239649772644,False +"RPL36AL",3.5186046256337846,0.37371933376110616,-0.6697607040405273,False +"ARF6",1.7209269029753549,1.8634674529040895,0.7790370583534241,False +"LGALS3",1.7085593152046203,1.9631794610996076,2.2017180919647217,True +"DAAM1",0.0946424126625061,3.2396136126711124,-1.176908254623413,False +"DHRS7",1.3602573806898934,2.1619897444801097,-0.02067740261554718,False +"ERH",1.809483583654676,1.7766632177612538,-0.45947712659835815,False +"COX16",1.0406308320590427,2.464616606656494,-0.670096218585968,False +"FOS",2.7579654117992947,1.0824986615322134,0.4139935076236725,False +"AHSA1",0.7930625823565892,2.694530409887485,0.09269482642412186,False +"CALM1",3.1145014020374844,0.7020010676480116,0.3499749004840851,False +"EVL",1.994544268335615,1.6767580625500653,0.6197234988212585,False +"PPP2R5C",0.8032375778470721,2.7357859984771857,0.8031774759292603,False +"PLD4",0.781629514013018,2.745792729404775,-0.7103106379508972,False +"CRIP1",2.3570457751410347,1.3485928162050307,-0.021858587861061096,False +"AL928768.3",0.30944340535572595,3.750983402099297,4.747713088989258,True +"KIAA0125",0.170427519934518,3.4702203119494848,0.736476719379425,False +"NDNL2",0.8685464893068586,2.643079578218124,-0.7933650612831116,False +"EMC7",1.070540543283735,2.432631661243977,-1.277764081954956,False +"NOP10",1.5708321292059761,2.006079303975137,-0.05780021473765373,False +"SRP14",3.4579191841397967,0.4189183782295364,-0.529359757900238,False +"GCHFR",0.5725268135751996,2.936848478391105,-0.07582114636898041,False +"ZNF106",0.42008651086262294,3.053906966662721,0.04232580214738846,False +"CEP152",0.056845097882407054,3.2824405567379205,-0.8215653896331787,False +"EID1",2.422059579236167,1.23438981786237,-0.8725121021270752,False +"MYO5A",0.057138428347451344,3.2945381304245833,-0.7211896777153015,False +"SLTM",1.0512443804740905,2.471111930697448,-0.5466943979263306,False +"RPS27L",1.166659072126661,2.3599716750059816,-0.9919328093528748,False +"PPIB",2.6301378543036327,1.1083946847644455,0.5908904671669006,False +"SPG21",0.8901063888413565,2.5904578730209464,0.0,False +"PKM",2.5076510569027493,1.176702845651336,-1.3021998405456543,False +"CSK",1.1698884044374738,2.347671320564952,-1.1881637573242188,False +"SCAMP2",1.00727518762861,2.5009361443943363,0.01992262527346611,False +"IMP3",1.4027804013660976,2.1361745176242195,-0.3509249687194824,False +"ETFA",1.0373080359186444,2.488858599784022,-0.20953330397605896,False +"CTSH",1.5475437102999006,2.0970698580920826,1.0130292177200317,False +"IL16",0.9671092472757612,2.56156350103441,-0.5422874689102173,False +"ISG20",1.7505244146074568,2.016135050125821,2.9572830200195312,True +"ZNF710",0.04286399330411639,3.305014996963431,-0.6342612504959106,False +"IDH2",1.4521725981576101,2.121438067271259,-0.5394445657730103,False +"NGRN",0.03887676886149815,3.3872271487355894,0.04786762222647667,False +"SLCO3A1",0.07637244156428746,3.2834020878003316,-0.8135874271392822,False +"VIMP",0.8211317297390529,2.7300311384015576,0.7040702104568481,False +"POLR3K",0.5473924248559134,2.926626550452363,-0.22096535563468933,False +"NME4",0.4067884768758501,3.044676912518125,-1.24894380569458,False +"C16orf13",1.3815849273545402,2.1544656183162068,-0.11693161725997925,False +"STUB1",1.3442519756725857,2.186247330566634,0.28964367508888245,False +"NDUFB10",2.246188083716801,1.3694475150795709,0.13347992300987244,False +"SRRM2",0.9750618079730443,2.5447020911968687,0.8514124751091003,False +"TCEB2",2.586166467666626,1.0965636060937665,0.5100718140602112,False +"IL32",1.5635816890852792,2.5077126695832486,5.8457112312316895,True +"CORO7",0.37258016960961476,3.123058584602567,-0.30942124128341675,False +"HMOX2",1.0961791280337743,2.4258323814159017,0.05876084417104721,False +"RSL1D1",1.7715168908664158,1.8223612309477548,0.1925375610589981,False +"TNFRSF17",0.20039225918906076,3.734794972418854,2.931699752807617,True +"BFAR",0.40954332079206196,3.064362635162185,-1.0129806995391846,False +"NDUFAB1",1.4510624824251448,2.106938780347512,-0.7249302268028259,False +"LAT",0.9726561835833958,2.7155758463641546,2.348205089569092,True +"BRD7",0.24906224352972847,3.19008838473117,-0.9819570183753967,False +"TMEM208",0.8501164514677865,2.6506047962283876,-0.6637696027755737,False +"DPEP2",0.5275195918764387,3.0412005951364733,1.4059056043624878,False +"PSMD7",1.4038766472680229,2.1638531531899914,0.003160706255584955,False +"GABARAPL2",2.030773697921208,1.5607095132755997,-0.25290602445602417,False +"C16orf74",0.4480143519810268,3.056765224247439,0.07905567437410355,False +"IRF8",0.5049569334302629,3.1696558103814794,1.5297493934631348,True +"GLOD4",0.5516447394234794,2.976833097668488,0.49193236231803894,False +"SERPINF1",0.35220787933894565,3.0890103539471983,-0.7175406217575073,False +"PSMB6",2.2829623106547765,1.3251462531754836,-0.19650287926197052,False +"RNF167",1.0312209701538086,2.5099021337051965,0.19026349484920502,False +"CLEC10A",0.7441702171734401,3.1773799703520935,6.258185386657715,True +"TMEM256",0.9545732556070601,2.54198221782856,-0.9097875952720642,False +"EIF4A1",3.622343404974256,0.31811460098691197,-0.842484712600708,False +"LSMD1",1.3186237233025686,2.2217600062490663,-1.3185251951217651,False +"TRAPPC1",2.822690201146262,0.8819645309100325,-0.9558647274971008,False +"NCOR1",1.2070997834205628,2.3179943715682136,0.26645800471305847,False +"TNFRSF13B",0.28890597139086044,3.345732288271596,0.6079807877540588,False +"SNORD3B-2",0.26696110793522426,3.221208837092627,-0.6640545725822449,False +"IFT20",0.8111377028056553,2.670073632416282,-0.3284872770309448,False +"UNC119",1.0415094583375113,2.499818976682488,-0.001301950658671558,False +"NSRP1",0.5396455366270883,2.9475280417771756,0.07582114636898041,False +"CCL5",1.1013995705332076,2.8478928737961957,6.792006015777588,True +"CCL4",0.1806995838029044,3.4532010856590265,0.5952651500701904,False +"GGNBP2",0.9487677652495248,2.5455469032268185,-0.8428857922554016,False +"CWC25",0.40028065511158534,3.081570445083094,-0.806719183921814,False +"MIEN1",1.426257335458483,2.1357348730881753,-0.3565492331981659,False +"CCR7",0.5681145552226475,3.0379638708079306,1.359946370124817,False +"NT5C3B",0.13863806247711183,3.22747431124715,-1.2776302099227905,False +"DNAJC7",0.9331264993122645,2.5410453384673524,-0.9273708462715149,False +"CCR10",0.1108936790057591,3.612490398034411,1.9169169664382935,True +"COA3",0.8571394637652806,2.6493598220411614,-0.6852099299430847,False +"SLC25A39",0.9169763238089426,2.5680784815214026,-0.42001479864120483,False +"ABI3",1.6107087775639126,2.061000545116925,0.5885447263717651,False +"PHB",1.5484174258368355,2.0109907055325333,0.0,False +"SUPT4H1",1.835239235333034,1.7239034438957301,-1.2122483253479004,False +"VMP1",0.6176909235545567,2.9160707618254262,1.1683127880096436,False +"PSMC5",1.6979237767628261,1.8689210557218192,0.8568484783172607,False +"CD79B",1.335678538254329,2.474470654803971,3.9768106937408447,True +"DDX5",3.427597258431571,0.44473973976606224,-0.44915130734443665,False +"CD300A",0.8749203951018197,2.7276036211613053,2.573941469192505,True +"SUMO2",2.8082289954594204,0.86314143367416,-1.0844461917877197,False +"ACOX1",0.07262007066181728,3.3391575254827672,-0.3509746193885803,False +"UBALD2",0.39571391378130233,3.086186104539514,-0.7513935565948486,False +"ST6GALNAC1",0.03464632511138916,3.4462553316689273,0.5376349687576294,False +"SRSF2",1.9151688402039664,1.6577228768188745,0.47658801078796387,False +"SEPT9",1.2919991755485534,2.2744533539365155,-0.4506640136241913,False +"DCXR",1.3798010148320878,2.177184438311973,0.17370441555976868,False +"CD7",1.29038943869727,2.507973829010733,3.395426034927368,True +"ANKRD12",0.8216382837295533,2.66114185179545,-0.4823058247566223,False +"PSMG2",0.8190717816352844,2.6542091840076822,-0.6016966700553894,False +"TTC39C",0.5427869493620736,2.99837517020116,0.797814667224884,False +"RNF138",0.306676995073046,3.1767744772718745,-1.1179616451263428,False +"ACAA2",0.48080614839281355,2.9721650355712104,-1.008094072341919,False +"NOP56",0.7246573805809021,2.7437968114646294,-0.7425371408462524,False +"IDH3B",1.0446737861633302,2.453920613779574,-0.8733046650886536,False +"C20orf27",1.6007519773074559,1.9665105232146776,-0.5234684944152832,False +"PCNA",0.5862160124097552,3.0054421182283693,0.8981603384017944,False +"DTD1",0.6217433295931135,2.84821110259958,-0.21755990386009216,False +"NAA20",0.725691396508898,2.745415635296214,-0.7163992524147034,False +"CST3",2.4901576014927453,1.9259647344594246,4.278759479522705,True +"CST7",0.8640804076194764,2.855755926249558,2.8692381381988525,True +"APMAP",0.5536924280439104,2.957822274723249,0.22199203073978424,False +"EIF2S2",1.6079588062422616,1.9606558379870191,-0.5923698544502258,False +"DYNLRB1",1.7748636896269663,1.814717253134203,0.0834740549325943,False +"RBM39",1.4892547130584717,2.0513054995678712,-1.436632513999939,False +"TOP1",0.7303502157756261,2.7408506171971974,-0.7901069521903992,False +"YWHAB",2.647990154879434,1.0205313110758139,-0.00930843222886324,False +"STK4",0.6256038151468549,2.866859343111854,0.16328619420528412,False +"CD40",0.31097863640104023,3.162470080393206,0.16298498213291168,False +"ZFAS1",2.3486714036124092,1.326688016061616,-0.1850188821554184,False +"BCAS4",0.2786700984409877,3.2849840520721623,-0.01257624477148056,False +"PSMA7",3.319489393915449,0.5015205471537102,-0.2727741301059723,False +"ADRM1",1.5278737575667245,2.0060961798587895,-0.05760160833597183,False +"PPDPF",3.281096433912005,0.5611161456751806,-0.08765339851379395,False +"RGS19",2.1279496557371957,1.527910199934606,-0.49954116344451904,False +"GZMM",1.0099424144199916,2.6794868526182127,3.412128448486328,True +"PRSS57",0.08252408197947911,3.7968947524402057,3.4469528198242188,True +"CFD",1.2352295902797155,2.696244388393237,6.496248245239258,True +"CNN2",1.8224455891336713,1.8333902777508315,0.34989890456199646,False +"HMHA1",1.0577020171710423,2.454463492947017,-0.8629907369613647,False +"GPX4",2.7614921736717224,0.9494776394675492,-0.49467945098876953,False +"C19orf24",1.1449876771654401,2.373465790163825,-0.7766575813293457,False +"ABHD17A",0.41261717898505074,3.0879841268355372,-0.7298415303230286,False +"TIMM13",1.5215113874844142,2.0354400299559323,0.287733793258667,False +"GNG7",0.4967505850110735,3.045439968675094,-0.06647885590791702,False +"SLC39A3",0.4524819002832685,2.9719183851831987,-1.0112636089324951,False +"AES",2.055302165235792,1.6936659738532043,0.7468628883361816,False +"S1PR4",1.692176855632237,1.953677942401159,-0.6744897365570068,False +"C19orf77",0.06244105236870902,3.6118648571256156,1.911726713180542,True +"MATK",0.3906022116116115,3.187216783243197,0.45961153507232666,False +"TMIGD2",0.32168435164860315,3.218144053138174,0.8303215503692627,False +"SH3GL1",0.20087484087262836,3.2439662957305617,-1.1407932043075562,False +"NDUFA11",2.5167468558038983,1.149988825777601,0.8750220537185669,False +"CLPP",0.9730332446098328,2.539993741562218,-0.9471071362495422,False +"ALKBH7",1.6917789271899633,1.8646706221168927,-1.7219793796539307,False +"STXBP2",1.694889534200941,1.9980211338177163,2.698835611343384,True +"PRAM1",0.4840992430278233,3.061402011177607,0.13864043354988098,False +"EIF3G",2.695952774797167,0.9951579794744126,-0.1826348751783371,False +"ICAM4",0.4749988055229187,3.1621921166520788,1.433837652206421,False +"ICAM3",2.453131310939789,1.2123284357757655,-1.0368387699127197,False +"S1PR5",0.15060103859220234,3.3814580038221638,0.0,False +"ILF3-AS1",0.7054658828462873,2.8405309613536533,0.8193523287773132,False +"ILF3",0.5308586181913103,2.8962605441557594,-0.6521413326263428,False +"ACP5",0.5303129165513175,2.9930761110519413,0.7225717306137085,False +"C19orf43",3.25658225774765,0.5364403892661752,-0.1643032431602478,False +"JUNB",3.7901645251682825,0.316238569419281,-0.8483121991157532,False +"PRDX2",1.7645213208879744,1.858968715222697,0.7148494720458984,False +"CALR",1.3290880775451661,2.254487291795686,1.162619948387146,False +"LYL1",0.9563667801448277,2.6056230709740698,0.2846193313598633,False +"C19orf53",2.228918822152274,1.3852338816065533,-1.5723987817764282,False +"DDX39A",0.9464807830538069,2.578392564158921,-0.22644084692001343,False +"DNAJB1",0.6687950457845415,2.870630568093778,0.24030452966690063,False +"NDUFB7",1.8374175548553466,1.7236877196558829,-1.215326189994812,False +"TPM4",0.9554985867227827,2.546753693118915,-0.82023686170578,False +"BST2",2.2237748670578004,1.4074733152959267,-1.405168890953064,False +"IFI30",1.4106743250574385,2.3598219176986577,2.510138750076294,True +"LSM4",1.8264865061214992,1.762657844769331,-0.6593043804168701,False +"LRRC25",1.1167027596064976,2.528556031671244,1.6975390911102295,True +"COPE",2.990876786708832,0.7581176602903894,0.5242888331413269,False +"UQCRFS1",2.1159608466284614,1.4791192411398744,-0.8664258122444153,False +"U2AF1L4",0.5218728055272783,2.974725334467154,0.462003618478775,False +"HCST",2.1652586228506907,1.5675971058267806,-0.20111462473869324,False +"TYROBP",2.3660371429579596,1.806212533315188,3.3867719173431396,True +"POLR2I",0.835576035295214,2.6638993562133986,-0.43481749296188354,False +"SPINT2",1.0317874605315072,2.509554928580431,0.18366709351539612,False +"PPP1R14A",0.4159930263246809,3.2532410194071963,1.251011610031128,False +"SERTAD3",0.35232430900846207,3.085454079799817,-0.7601679563522339,False +"CD79A",0.7608414111818587,3.382065228465363,9.56307601928711,True +"RABAC1",1.8045469270433698,1.7858469616716552,-0.32844439148902893,False +"PAFAH1B3",0.6875877237319946,2.772837167790801,-1.7568938732147217,False +"ZNF428",0.8841501631055559,2.6306985117349675,0.7552334070205688,False +"CALM3",1.856072565146855,1.7954805380654666,-0.19099347293376923,False +"AP2S1",2.706616437775748,1.034152338549398,0.08373745530843735,False +"FTL",4.454551051684788,0.025404013925400155,-1.7517262697219849,False +"SNRNP70",0.7736265073503766,2.6933479864368017,-1.5570942163467407,False +"CD37",3.511182520389557,0.3889651977709266,-0.6224027872085571,False +"FLT3LG",0.6243492075375148,2.9516206954676707,1.8943358659744263,True +"NOSIP",2.0801830649375916,1.6914672586162376,0.7303296327590942,False +"FUZ",0.10724892105375017,3.318005736170058,-0.5264747738838196,False +"SPIB",0.42876665217535836,3.172395062036034,1.5649499893188477,True +"JOSD2",0.7369095052991594,2.7451994056458484,-0.7198905348777771,False +"CD33",0.8506120961053031,2.6911529660162996,0.034530218690633774,False +"NKG7",1.1686289865630013,2.8233462110279635,6.400406360626221,True +"FPR1",0.3064187911578587,3.2248570169781057,-0.626787543296814,False +"ZNF600",0.03999556234904698,3.4740517967015125,0.7682672142982483,False +"ZNF524",0.5976441264152527,2.8791170006224784,-0.8955675959587097,False +"CTD-3138B18.5",0.048145558834075924,3.3418048508666027,-0.3290092945098877,False +"ATP6V1E1",1.0629272035190038,2.464006032760394,-0.6816962361335754,False +"BID",1.7931452764783586,1.8393706826537046,0.435226708650589,False +"MRPL40",0.8259185668400356,2.7255363568028974,0.6266633868217468,False +"UFD1L",1.0518067049980164,2.453920650372201,-0.8733039498329163,False +"COMT",1.3008981384549823,2.206929746524636,-1.5627800226211548,False +"DGCR6L",0.8596877070835659,2.654527350536305,-0.5962173938751221,False +"SDF2L1",1.1725469865117755,2.40114649171226,1.6359761953353882,True +"IGLL5",0.4182624476296561,3.6736587063238733,8.00640869140625,True +"IGLL1",0.03814483574458531,3.8329614999459465,3.7462050914764404,True +"CHCHD10",1.6264535624640328,1.9636597449862905,-0.5570181012153625,False +"SMARCB1",1.0624028178623743,2.5237692032176917,0.45371779799461365,False +"MIF",1.8698141769000463,1.745761250672554,-0.9003832936286926,False +"ASCC2",0.36864139182226996,3.090039723107883,-0.7052021026611328,False +"PIK3IP1",0.6333167733464922,2.9331575274605077,1.5172693729400635,True +"HMOX1",0.8037361277852739,2.876400650217808,3.224771022796631,True +"EIF3D",2.197960192135402,1.4083684151285283,-1.3984380960464478,False +"IL2RB",0.2014488993372236,3.343736181879373,-0.3129846751689911,False +"LGALS2",0.7938459042140416,3.016556624575689,5.638465404510498,True +"EIF3L",2.969286025592259,0.7963243898596808,0.6429697275161743,False +"ADSL",0.7988648244312831,2.672640308144182,-0.284285306930542,False +"RBX1",1.6827683806419373,1.887271751688752,-1.4559962749481201,False +"TTC38",0.17977709089006697,3.339751939734414,-0.346042662858963,False +"TYMP",1.9089728954860141,1.8813097525520956,1.03360915184021,False +"CCT8",1.504336954184941,2.0209129161724997,0.11677031219005585,False +"SOD1",2.6116693735122682,1.0862257675778242,0.4394535422325134,False +"PAXBP1",0.05895839384623936,3.399797897897179,0.1521693766117096,False +"ATP5O",2.7453843239375524,0.9545133806869737,-0.46028006076812744,False +"MRPS6",0.9709907872336251,2.5545194480196622,-0.6744897365570068,False +"TTC3",0.42875579629625593,3.043738477490395,-0.08834376186132431,False +"U2AF1",2.212861317907061,1.4066743372050075,-1.4111768007278442,False +"CSTB",2.812350261892591,0.9215837236658532,-0.6852241158485413,False +"SUMO3",1.1913197013310024,2.342881429343698,0.6763486862182617,False +"ITGB2",2.850207292011806,0.9088416474784733,-0.7722658514976501,False +"S100B",0.24995170593261717,3.4242507353331937,1.4100645780563354,False +"PRMT2",1.1855203751155308,2.3803963652038784,1.2942209243774414,False +"MT-ND3",0.8427824320111956,2.6685150092724306,-0.35532906651496887,False diff --git a/scanpy/tests/_scripts/seurat_extract_hvg.r b/scanpy/tests/_scripts/seurat_extract_hvg.r index 9726e658f8..70af325ace 100644 --- a/scanpy/tests/_scripts/seurat_extract_hvg.r +++ b/scanpy/tests/_scripts/seurat_extract_hvg.r @@ -31,4 +31,4 @@ hvg_info <- cbind(hvg_info, rownames(hvg_info) %in% sr_hvg) colnames(hvg_info) <- c("means", "dispersions", "dispersions_norm", "highly_variable") hvg_info <- hvg_info[rownames(sr@data),] -write.table(hvg_info, "seurat_hvg.csv") +write.csv(hvg_info, "seurat_hvg.csv") diff --git a/scanpy/tests/_scripts/seurat_extract_hvg_v3.r b/scanpy/tests/_scripts/seurat_extract_hvg_v3.r index 3ac7087275..c33967d5ea 100644 --- a/scanpy/tests/_scripts/seurat_extract_hvg_v3.r +++ b/scanpy/tests/_scripts/seurat_extract_hvg_v3.r @@ -31,7 +31,7 @@ hvg_info <- as.data.frame(HVFInfo(sr)) hvg_info <- cbind(hvg_info, rownames(hvg_info) %in% sr_hvg) colnames(hvg_info) <- c("means", "variances", "variances_norm", "highly_variable") -write.table(hvg_info, "seurat_hvg_v3.csv") +write.table(hvg_info, "seurat_hvg_v3.dat") X_1 = X[, 1:1500] X_2 = X[, 1501:ncol(X)] @@ -45,4 +45,4 @@ sr2 <- FindVariableFeatures(object = sr2, selection.method = "vst", nfeatures = srs = list(sr1, sr2) features <- SelectIntegrationFeatures(srs, nfeatures=4000) -write.table(features, "seurat_hvg_v3_batch.csv") +write.table(features, "seurat_hvg_v3_batch.dat") diff --git a/scanpy/tests/_scripts/seurat_hvg.csv b/scanpy/tests/_scripts/seurat_hvg.csv index 34f436882a..261063ba93 100644 --- a/scanpy/tests/_scripts/seurat_hvg.csv +++ b/scanpy/tests/_scripts/seurat_hvg.csv @@ -1,766 +1,766 @@ -"means" "dispersions" "dispersions_norm" "highly_variable" -"HES4" 1.88077032191863 3.55366810363084 0.64023993665225 TRUE -"TNFRSF4" 0.862206964359899 3.53394568786647 0.312503920962044 FALSE -"SSU72" 2.78955473500241 3.05248251287271 -0.546511229064831 FALSE -"PARK7" 3.51562963004536 2.45678328702603 -0.734551702076537 FALSE -"RBP7" 0.779661894396393 3.59259048136138 0.848527753345566 TRUE -"SRM" 2.49550683986714 3.23588798534154 -0.249684360972197 FALSE -"MAD2L2" 2.05198283629147 3.2607335950542 -0.661689679526853 FALSE -"AGTRAP" 2.20008855043616 3.33014916346082 0.0255378327794182 FALSE -"TNFRSF1B" 2.12140619189998 3.37607011045442 0.387214229590131 FALSE -"EFHD2" 2.27299086606244 3.26768979892266 -0.466396227648297 FALSE -"NECAP2" 2.34002252354718 3.28416770240885 0.104030378053144 FALSE -"HP1BP3" 2.03090714091537 3.35886246940694 -0.225561862620218 FALSE -"C1QA" 2.26780119055147 3.93296434445563 4.77334982009271 TRUE -"C1QB" 1.56524398237555 3.97964719581811 3.33604014219507 TRUE -"HNRNPR" 2.46599869940325 3.22905980837902 -0.299710064912194 FALSE -"GALE" 0.676448698010205 3.42185061730017 -0.676457727295982 FALSE -"STMN1" 2.24648448379207 3.78470712108589 3.60566618419126 TRUE -"CD52" 3.9383240596554 2.65726626877817 0.254094755148372 FALSE -"FGR" 2.69591551909111 3.21700205644603 0.167425178928824 FALSE -"ATPIF1" 2.96814435737181 3.00283733638007 -0.18347721876371 FALSE -"SESN2" 0.205440249022099 3.48953831056964 0.441192697680527 FALSE -"EIF3I" 2.97101781554166 2.9000046561409 -0.6398134720155 FALSE -"LCK" 2.61248206065248 3.49304289851706 1.98594725205813 TRUE -"MARCKSL1" 2.40099871205148 3.32493702299919 0.402721225241548 FALSE -"SFPQ" 2.16157141818453 3.25187041411575 -0.590990742163032 FALSE -"PSMB2" 2.81001099723218 3.03368873008977 -0.617756413426228 FALSE -"MEAF6" 2.51071071704727 3.15328542182515 -0.854860736722014 FALSE -"NDUFS5" 3.11828489136254 2.82952861863563 -0.952562014836549 FALSE -"CAP1" 3.33127429016772 2.66489777846549 -0.898238151329864 FALSE -"SMAP2" 2.12149230757857 3.30882718006133 -0.142395509924957 FALSE -"C1orf228" 1.34773840883918 3.52729637972859 0.163933471425264 FALSE -"PRDX1" 3.07493711474154 3.00454271280564 -0.175909341639264 FALSE -"TMEM69" 0.958612646535407 3.32754139299571 -1.57406800748461 FALSE -"SCP2" 2.74799354433686 3.04717258564314 -0.566640585075036 FALSE -"MAGOH" 2.27062297589741 3.19748898661502 -1.01930243953784 FALSE -"JAK1" 2.73745653446834 3.11810685254423 -0.484083887167165 FALSE -"CCBL2" 1.13356732074892 3.41539203317771 -1.01249628906537 FALSE -"GBP2" 2.17540327076784 3.45016016075597 0.970752335551299 TRUE -"CD53" 3.51568067232204 2.55102239654541 -0.407812099116343 FALSE -"DENND2D" 1.80773774122602 3.42843268138354 -0.0804581789000627 FALSE -"C1orf162" 3.24942561210149 3.01582481520873 0.64252400956364 FALSE -"RHOC" 2.985741750694 3.32204178661091 1.23304292347939 TRUE -"CD2" 2.53557133944634 3.36110621201421 1.11676508734336 TRUE -"RP11-782C8.1" 0.370210663657041 3.37004316966741 -0.73064188045319 FALSE -"TXNIP" 3.2731625108326 2.98027688141431 0.486449083571333 FALSE -"CD160" 0.626919468581951 3.68140402798016 0.894211411042321 TRUE -"RP11-277L2.3" 0.664996704554698 3.44846098615156 -0.515426959080756 FALSE -"APH1A" 2.43813050354468 3.16948589068915 -0.73617021895599 FALSE -"MRPS21" 2.75295580601676 3.06523192160569 -0.498179608647018 FALSE -"CTSS" 3.54762757164911 3.14905736097152 1.66565514637711 FALSE -"MRPL9" 2.08300092575028 3.24120889728365 -0.748466011881596 FALSE -"S100A10" 3.81536096876538 2.44223867599515 -0.492237754855533 FALSE -"S100A9" 2.93029830903276 3.58932753136182 1.48860978715106 TRUE -"S100A8" 1.79100124352522 3.64342527255502 1.16835405436805 TRUE -"S100A6" 4.01980558791941 2.200924885923 -0.438355066417699 FALSE -"S100A4" 4.19267544737091 2.19511910191538 -0.134003732316128 FALSE -"RAB13" 0.690678797190794 3.36105158683678 -1.04437876728369 FALSE -"TPM3" 3.38289950746532 2.58912183328031 -1.2309361107997 FALSE -"HAX1" 2.44928220942326 3.18071193608576 -0.653924133872012 FALSE -"PMVK" 2.45046175895629 3.18505655637903 -0.622093867943636 FALSE -"PBXIP1" 1.8229903618879 3.44149071306331 -0.00460891537313223 FALSE -"DAP3" 2.25542389981013 3.25354017657867 -0.577839583255053 FALSE -"CCT3" 2.72444627797158 3.08593103645915 -0.696054084521543 FALSE -"SH2D2A" 1.05291375289055 3.54952016366369 0.331799604605673 FALSE -"MNDA" 2.50137095628744 3.33497476625665 0.476261377346501 FALSE -"FCER1A" 2.74486704433425 3.99108486884635 3.01162811231844 TRUE -"TAGLN2" 3.6933593313478 2.52503477022935 -0.342701464152289 FALSE -"LY9" 1.19787954406166 3.55566714133674 0.39340753736688 FALSE -"FCER1G" 3.61782460590848 3.42844644985511 1.28893143832626 FALSE -"SDHC" 2.64245219336588 3.08660335050013 -0.691624964850644 FALSE -"FCGR3A" 3.03212523741908 3.88389506038811 3.72635552834778 FALSE -"FCRLA" 1.20589759528181 3.64802336988037 1.31904556971929 TRUE -"CD247" 2.35082305573306 3.48621802034511 1.58432437768794 TRUE -"CREG1" 1.53902857465827 3.34760775908679 -0.756759826238331 FALSE -"RCSD1" 2.44375827328678 3.23729611150838 -0.239367917341764 FALSE -"XCL2" 0.540378449629801 3.80171120788367 1.35868462509435 TRUE -"XCL1" 0.673182330404454 3.57923209204653 0.275925154834737 FALSE -"PRDX6" 2.87323039456323 3.04722400641683 -0.566445654520422 FALSE -"C1orf21" 0.875691073768353 3.34781133709859 -1.3887971168783 FALSE -"TPR" 2.49690081334352 3.17458841749232 -0.698787254717891 FALSE -"PTPRC" 3.13800013048897 2.90841006663251 -0.602513135956354 FALSE -"PTPN7" 1.44125985833881 3.4445339272991 -0.129110038669163 FALSE -"NUCKS1" 2.48688778047874 3.27964792433752 0.0709168426377314 FALSE -"G0S2" 1.18912873845411 3.72012413383654 2.04167370570866 TRUE -"TRAF3IP3" 3.16899765019373 2.99825210787012 -0.203824894168744 FALSE -"NENF" 2.57797947202887 3.13285736625516 -0.386909372801589 FALSE -"CAPN2" 2.21017564094795 3.20940125154174 -0.92548065800644 FALSE -"COA6" 1.67581756008637 3.31473724112648 -0.740872828010337 FALSE -"ARID4B" 2.17720305391113 3.25324734391835 -0.580145952534994 FALSE -"RP11-156E8.1" 0.284484072581432 3.38119127267806 -1.04002606033147 FALSE -"SH3YL1" 1.694717034835 3.46219556579768 0.115657895877465 FALSE -"ID2" 3.20837502043912 3.14766745584641 1.22138551243336 FALSE -"HPCAL1" 1.95324651319074 3.32800286314145 -0.362715506743191 FALSE -"RAB10" 2.08675184028479 3.3288422298726 -0.358984992330866 FALSE -"OST4" 3.38848298306141 2.62297846214517 -1.082286941062 FALSE -"PPM1G" 2.17873901921501 3.2635955037283 -0.498643165708662 FALSE -"LBH" 2.06320580886345 3.4330046497431 0.103958550856389 FALSE -"SRSF7" 2.92332809912547 3.01009588806467 -0.707194308878235 FALSE -"ZFP36L2" 2.98697085195399 3.05750567641627 0.0591221709010196 FALSE -"ERLEC1" 1.47260668125104 3.46731442399555 0.0184060983653875 FALSE -"CAPG" 2.75040027041101 3.3135801149545 0.443281353486645 FALSE -"RNF181" 2.67271003354135 3.04683439915985 -0.953617774664238 FALSE -"GNLY" 2.7495375274892 4.06006663022984 3.27313045935005 TRUE -"CD8A" 1.4634273769048 3.59348828554246 0.835450647400119 TRUE -"CD8B" 1.77317700698711 3.68394018560444 1.40369015953436 TRUE -"MAL" 1.64318096077802 3.47144089598116 0.0451272544056004 FALSE -"DUSP2" 2.531132387685 3.380728830085 1.24603640758204 TRUE -"MGAT4A" 1.38759438748501 3.46413340182902 -0.293913731468961 FALSE -"LIMS1" 2.16137334569797 3.37009247185121 0.340133955053407 FALSE -"IL1B" 1.25491202982231 3.55771267704059 0.384410990215494 FALSE -"NIFK" 1.78674809979223 3.3331205081553 -0.634091247175682 FALSE -"GYPC" 3.26593350000607 3.06138394280262 0.842553567079129 FALSE -"MZT2B" 3.27153526537439 2.8848499252847 0.0674724082537133 FALSE -"CCDC115" 2.41118903796896 3.16293800176348 -0.784142430957143 FALSE -"CXCR4" 2.46374667112144 3.30203613064927 0.234940971896115 FALSE -"PPIG" 2.3491076588617 3.2642249511761 -0.0420774592796026 FALSE -"SSB" 2.61475888290781 3.14110121837938 -0.332599920102376 FALSE -"WIPF1" 2.00804851083515 3.33284278723216 -0.341204758336087 FALSE -"ITGA4" 2.18805519540149 3.31652567882021 -0.0817616276935953 FALSE -"HSPD1" 2.56038959284022 3.18612018177459 -0.0360206964289463 FALSE -"BZW1" 1.88473444093461 3.29736748706907 -0.49887257340366 FALSE -"NBEAL1" 3.04309527455068 2.9010704255307 -0.635083952090102 FALSE -"CD28" 1.17833159289949 3.55652783303207 0.40203379874517 FALSE -"AC079767.4" 0.75609360948958 3.68939377289349 0.94256078825022 TRUE -"SLC11A1" 1.37615070991924 3.47772767618663 -0.195373404572057 FALSE -"SP110" 2.40978638296584 3.24003539037167 -0.219298965676284 FALSE -"SP140" 1.5961055279512 3.3802462541091 -0.545407775031058 FALSE -"SP100" 2.47521852699296 3.19000451274842 -0.585843342832518 FALSE -"NCL" 2.64474405046805 3.14645992506896 -0.297297439768953 FALSE -"ARL4C" 2.42223987529934 3.30597023620197 0.263763657765005 FALSE -"UBE2F" 2.05581859860972 3.33834619910936 -0.316745178794656 FALSE -"OGG1" 0.842049416232588 3.46358161767188 -0.330636182704285 FALSE -"MRPS25" 1.83637521214718 3.33994598099191 -0.594444606657735 FALSE -"ACAA1" 2.42286250511087 3.15931449544319 -0.810689554061706 FALSE -"EXOG" 1.20605526350558 3.42932766021026 -0.872826809384204 FALSE -"EIF1B" 2.25854504434191 3.2539598165724 -0.574534471082372 FALSE -"UQCRC1" 2.60427554021496 3.0685228131831 -0.810737252577224 FALSE -"NDUFAF3" 2.83560702243022 3.06616628397382 -0.494637542637929 FALSE -"IMPDH2" 2.42585028766239 3.24211646139579 -0.204052283655239 FALSE -"GPX1" 3.6105586131361 2.84302749100406 0.604608636949215 FALSE -"GNAI2" 2.62659107028335 3.14492000647294 -0.307442228259969 FALSE -"MANF" 2.23349723834358 3.43751742582445 0.871177324249738 TRUE -"TEX264" 2.47180296893221 3.18819046951439 -0.599133682297661 FALSE -"TKT" 3.25564846508779 2.849134855879 -0.0893363347393464 FALSE -"ARL6IP5" 3.22468408835907 2.82309971146852 -0.203644897947614 FALSE -"PCNP" 2.2494031628663 3.28822351050334 -0.30467136560034 FALSE -"BBX" 1.92891438174297 3.35610292890043 -0.237826472651718 FALSE -"CD47" 2.49222840449586 3.19157160415785 -0.574362262109909 FALSE -"TIGIT" 0.96818939105192 3.60013416487041 0.917478360958406 TRUE -"COX17" 2.31104990672131 3.23389195422206 -0.264308009771308 FALSE -"EAF2" 2.01877998181135 3.53354084510981 0.550785559671043 TRUE -"GATA2" 0.189738871344609 3.61939208308945 2.21643129578065 TRUE -"RAB7A" 2.8987150914124 3.00905528851261 -0.711139108485027 FALSE -"H1FX" 2.62614265316577 3.26193175061855 0.463416308280052 FALSE -"SELT" 2.5748117702135 3.19186416871151 0.00181996133090909 FALSE -"SIAH2" 1.90641093943005 3.33636929145934 -0.325531424670991 FALSE -"GPR171" 0.773750066473151 3.49700202824371 -0.221684270216929 FALSE -"P2RY13" 1.01490152740574 3.52410523315076 0.0770790877187818 FALSE -"SSR3" 2.6346205193935 3.22265416230132 0.204660535770916 FALSE -"MFSD1" 1.62246493235478 3.38991666808116 -0.48278657182849 FALSE -"SEC62" 2.63945478975412 3.19986329318145 0.0545171792685254 FALSE -"EIF4A2" 3.30739005339261 2.84435879857266 -0.11030584579257 FALSE -"CCDC50" 1.72345530596264 3.4965446694018 0.315179100533326 FALSE -"HES1" 1.35371879587411 3.59134813206372 0.628223101558617 TRUE -"ATP5I" 2.67091313276188 3.06589134864023 -0.828073007387867 FALSE -"SPON2" 1.39974189083309 3.73302162636687 1.65516665691299 TRUE -"LYAR" 1.96041828509616 3.35888177318778 -0.2254760681397 FALSE -"CYTL1" 0.494106397368457 3.77214774939208 1.21559384247036 TRUE -"MRFAP1" 2.44679501225525 3.20491542523992 -0.476600583327349 FALSE -"BLOC1S4" 2.19704394854576 3.29186896345672 -0.275959538531454 FALSE -"BST1" 1.08042068875366 3.40819759541628 -1.08460236483721 FALSE -"FGFBP2" 1.5871240843349 3.82309830014627 2.32230068540171 TRUE -"MED28" 1.95596091462539 3.27795177635202 -0.585164519424375 FALSE -"KLF3" 1.96615774778099 3.3995331200336 -0.0448036282373467 FALSE -"SMIM14" 1.8733167730832 3.52480611379101 0.51196457730003 TRUE -"HOPX" 1.99199632234595 3.6895845704617 1.24431241125872 TRUE -"SPINK2" 0.64367493790273 3.75372270451607 1.33184277586563 TRUE -"IGFBP7" 2.12535811325291 3.46257699304813 1.06854812281712 TRUE -"IGJ" 2.02952034671665 4.31110894566778 4.00663971502981 TRUE -"CCNI" 3.27938208538782 2.81324330174249 -0.246919942495526 FALSE -"HNRNPDL" 3.2598845827918 2.80695519518584 -0.27452817905681 FALSE -"PLAC8" 3.00339922727606 3.36001913842592 1.40157341782591 FALSE -"HSD17B11" 2.46937497489751 3.23188418539812 -0.279017653255639 FALSE -"BANK1" 1.43566745072261 3.67783394119589 1.38163475670373 TRUE -"CCDC109B" 2.61533399141984 3.20338247650842 0.0777011128903178 FALSE -"SNHG8" 2.57262896000928 3.23038728345501 0.255605357583006 FALSE -"ANXA5" 3.30607435588407 2.7834626341202 -0.377673406874909 FALSE -"HMGB2" 2.85267319857206 3.35791655991469 0.611355989210591 TRUE -"SUB1" 3.08179304336015 3.14585089367294 0.451168019962388 FALSE -"IL7R" 2.22330155102622 3.59018870846112 2.0736263810646 TRUE -"FYB" 2.62833568552046 3.28191306290392 0.595050660531786 TRUE -"EMB" 1.60525338597389 3.34100009177806 -0.799548074852102 FALSE -"GZMK" 1.82348368517279 3.89375393761685 2.62242043667214 TRUE -"GZMA" 2.43305136877294 3.78614829441993 3.7817224790948 TRUE -"NSA2" 2.29678066911439 3.24559647737468 -0.640404680308627 FALSE -"COX7C" 3.59614114322243 2.22843708096564 -1.52625855378757 FALSE -"GLRX" 3.02324468069108 3.01487027279973 -0.130079163703886 FALSE -"CAMK4" 1.33153829226669 3.46161160457309 -0.312193392407886 FALSE -"EPB41L4A-AS1" 2.07925483366828 3.35132896289923 -0.259044074339529 FALSE -"REEP5" 2.93993627952589 3.00513323554622 -0.726007184268013 FALSE -"SNX2" 2.61398752309147 3.20516412861831 0.0894384111254829 FALSE -"IRF1" 2.08293528255313 3.36868185297734 -0.181920209251845 FALSE -"SKP1" 3.17378605057298 2.86758922239192 -0.783662076857227 FALSE -"TXNDC15" 1.58440901561121 3.39225463635209 -0.467646952511503 FALSE -"H2AFY" 3.13961463675365 2.94172091620841 -0.45469098201903 FALSE -"EGR1" 0.755854624853946 3.46616246971674 -0.408307681141864 FALSE -"MZB1" 1.89502940314269 4.19894567224949 3.50813686461313 TRUE -"NDUFA2" 2.85485509122861 3.03381640323039 -0.617272418450524 FALSE -"NDFIP1" 2.7535666656136 3.06568029273253 -0.496479882521461 FALSE -"CD74" 4.39880166182438 2.60402299400562 0.707106781186547 FALSE -"NUDCD2" 1.98067806054445 3.36181368053905 -0.212445384144632 FALSE -"NPM1" 3.90178321099788 2.20586010931427 -0.430866386484064 FALSE -"ATP6V0E1" 3.34379860542157 2.69986516791462 -0.744712133419028 FALSE -"HIGD2A" 3.62934687928222 2.3627226327381 -0.635850014226434 FALSE -"LMAN2" 2.91974587368354 3.02706685494151 -0.642859221158197 FALSE -"F12" 0.240142663431215 3.35755263308639 -1.3631912991643 FALSE -"PRR7" 1.25417390301911 3.44610729039542 -0.424578956152598 FALSE -"NHP2" 2.87524692361751 3.04847637234876 -0.561698071623503 FALSE -"SQSTM1" 2.36043469270379 3.19265611498893 -0.566416741943501 FALSE -"RNF130" 2.59071798702997 3.27293445728469 0.535900744954109 TRUE -"SERPINB1" 2.77391025775678 3.15138730332642 -0.171573936690829 FALSE -"SERPINB6" 2.18562732509154 3.2683987789217 -0.460812254576051 FALSE -"LY86" 2.81317057210154 3.25245517733428 0.211563369931743 FALSE -"ADTRP" 0.676051990032346 3.52107861259993 -0.0759865199703292 FALSE -"DEK" 2.76343860238718 3.10724137875725 -0.338926330355305 FALSE -"SOX4" 1.10798430666125 3.55882381561274 0.42504522777171 FALSE -"FAM65B" 2.43119761902019 3.28395555473758 0.102476107176322 FALSE -"HIST1H4C" 2.16308906306601 3.39128869694704 0.507076817092301 TRUE -"HIST1H1E" 2.46011240294088 3.23831352043661 -0.231914010082303 FALSE -"ZNRD1" 1.95954047684283 3.3140703241945 -0.424637829148126 FALSE -"LTB" 3.79717633154273 3.36188072620072 1.1687084798 FALSE -"LST1" 3.63853174752907 3.49409660575534 1.40750080911858 FALSE -"AIF1" 3.65665169135743 3.53135765627296 1.47479721160771 FALSE -"DDAH2" 2.11340429878934 3.32865209691498 0.0137468382652377 FALSE -"CLIC1" 3.92330153224379 1.73580916802688 -1.14411901412209 FALSE -"C6orf48" 3.26808655348311 2.89201107681185 0.0989137910660921 FALSE -"HLA-DRA" 4.14245186724542 3.33325849456824 1.12153477577529 FALSE -"HLA-DRB5" 3.91408203666622 3.00981880472529 0.789055970109514 FALSE -"HLA-DRB1" 4.12317921160857 3.05565265897838 0.815293889198523 FALSE -"HLA-DQA1" 3.68334996316207 3.40805018890775 1.25209417885776 FALSE -"HLA-DQB1" 3.54240798739379 3.27740161855204 2.11064186131899 FALSE -"HLA-DQA2" 3.49808501697905 3.28641585974323 2.14189544173609 FALSE -"HLA-DMB" 3.00743880994498 3.29519571695649 1.11390925106961 FALSE -"HLA-DMA" 3.31313113840681 3.23950601917576 1.62460717526643 FALSE -"HLA-DPA1" 4.04364135819571 3.18712882360912 1.05810518534791 FALSE -"HLA-DPB1" 4.03173419935203 3.2760181401218 1.19298532918502 FALSE -"HSD17B8" 1.41476751550311 3.43002959578333 -0.541120762000296 FALSE -"TAPBP" 2.35771334653687 3.26760910155185 -0.0172839447419166 FALSE -"DAXX" 1.78971204570193 3.29640775234363 -0.847342030957476 FALSE -"CUTA" 3.23620771231059 2.92721041573804 0.253458194396349 FALSE -"HMGA1" 2.68823776570973 3.19839966219859 0.0448749639018696 FALSE -"CCDC167" 2.2417364768391 3.34809811149758 0.166904927264235 FALSE -"CNPY3" 3.01119556212996 2.96333107129326 -0.358792507130755 FALSE -"MEA1" 2.33090504699858 3.19456717900589 -0.552415592991462 FALSE -"HSP90AB1" 3.2733330113404 2.804935751696 -0.283394643562035 FALSE -"ELOVL5" 1.94096442998644 3.33080521468527 -0.350260625658804 FALSE -"UBE2J1" 2.28703739021791 3.41116421484514 0.663617702434484 TRUE -"PNISR" 2.84910153982415 3.04456680162047 -0.576518828600864 FALSE -"RP3-467N11.1" 0.228668589920236 3.41011296999176 -0.644635827167253 FALSE -"CD164" 2.632249719051 3.13283307285002 -0.387069414674882 FALSE -"GTF3C6" 2.50336540233086 3.21077613822447 -0.433662871804668 FALSE -"RWDD1" 2.71267840038055 3.10855368493143 -0.547018944319712 FALSE -"GOPC" 1.29738004317114 3.37600577515729 -0.932721284740385 FALSE -"SAMD3" 1.45178351218028 3.45699836876203 -0.0483959840370171 FALSE -"DYNLT1" 1.97139648287987 3.32396100564693 -0.380679296677205 FALSE -"SOD2" 2.30358639457007 3.33924632341811 0.0971876625405603 FALSE -"TCP1" 2.27049072699976 3.25288183558515 -0.583024720191396 FALSE -"MRPL18" 2.41433158620565 3.16931059842845 -0.737454473711627 FALSE -"RNASET2" 3.55413776411645 2.52836778496456 -0.486358668909856 FALSE -"MAD1L1" 1.93519971071393 3.34319018071071 -0.295216397028156 FALSE -"CHST12" 1.87351132993537 3.31104759754241 -0.438072154004845 FALSE -"EIF2AK1" 1.56342739361332 3.35462386364832 -0.711326723714702 FALSE -"NDUFA4" 3.5313509543955 2.4196384731799 -0.863337742076391 FALSE -"TOMM7" 3.47234138295704 2.5953242492034 -0.254211647863172 FALSE -"CPVL" 2.90014579363954 3.5320455353688 1.27145997690549 TRUE -"LSM5" 1.94349075302528 3.30911772969625 -0.44664933433243 FALSE -"SEPT7" 2.96719887949065 3.057044987757 0.0570777922443779 FALSE -"AOAH" 1.67883149723539 3.36460215023991 -0.451226063103958 FALSE -"STK17A" 2.28547537054658 3.406941310819 0.630357832761845 TRUE -"COA1" 1.85962174058007 3.29801434064504 -0.838009955309245 FALSE -"PPIA" 3.84072050060515 1.97395756653606 -0.782753987303413 FALSE -"SNHG15" 1.98659188274985 3.30186164622693 -0.478898556221889 FALSE -"UPP1" 1.70251680017246 3.44110647375852 -0.00684081900160539 FALSE -"CCT6A" 2.46699995045641 3.17710426010359 -0.68035527817101 FALSE -"SBDS" 1.86319408097774 3.33261067921621 -0.637052654415536 FALSE -"WBSCR22" 2.3493036223267 3.19241126155589 -0.568210627107461 FALSE -"EIF4H" 2.4691986216715 3.15843222700747 -0.817153372999493 FALSE -"LAT2" 2.09148787357433 3.27395693790332 -0.417035829110541 FALSE -"NCF1" 2.05389185978319 3.33473810706238 -0.332781124565232 FALSE -"HSPB1" 2.49467999604256 3.25969132982628 -0.0752924155800499 FALSE -"RSBN1L-AS1" 0.303696615126449 3.45377698244236 -0.0477025325384536 FALSE -"CDK6" 0.74369361209756 3.55655353954441 0.138687495641845 FALSE -"CCDC132" 0.348488159454098 3.32205965300362 -0.962888014795907 FALSE -"BRI3" 2.44602987057203 3.32008159723281 0.367148612928619 FALSE -"PDAP1" 2.40859502009045 3.21403510533497 -0.409786495326051 FALSE -"ATP5J2" 3.21330592099154 2.71228684873763 -0.690174141805705 FALSE -"MCM7" 1.19119917917552 3.45599025313887 -0.60560162657811 FALSE -"LAMTOR4" 3.51216970285824 2.44221792511759 -0.785051760822904 FALSE -"PILRA" 2.56765585415311 3.49057588404772 1.96969487348407 TRUE -"ZNHIT1" 2.97766060424037 2.90776608029641 -0.605370926991997 FALSE -"FAM185A" 0.26161221766767 3.50499179216143 0.652458157777893 TRUE -"RINT1" 0.120314869557555 3.46943002356181 0.166291117654948 FALSE -"SYPL1" 1.85032922833223 3.40973410094924 -0.189071298374853 FALSE -"RP11-390E23.6" 0.386946146446636 3.37178116836425 -0.722229752562229 FALSE -"CPA5" 0.80794929426823 3.47986840813046 -0.181772024122253 FALSE -"MTPN" 2.22318096874595 3.26281401808078 -0.504798198033965 FALSE -"C7orf55" 1.5484530032343 3.34630014841228 -0.765227318322415 FALSE -"NDUFB2" 3.16518984246629 2.77285027462809 -1.20408111445315 FALSE -"MRPS33" 2.01485208304681 3.35999162428856 -0.220543402389014 FALSE -"GSTK1" 3.4814505781444 2.60137286692168 -0.233240280860595 FALSE -"ZYX" 2.36189161198549 3.22648582519528 -0.318568000405514 FALSE -"GIMAP7" 3.33751674898341 3.1838687105225 1.38032887541682 FALSE -"TMEM176B" 2.51113532566192 3.62661746163109 2.61294166772995 TRUE -"TMEM176A" 1.51193913471295 3.51183285909641 0.306687239045162 FALSE -"OFD1" 1.73282506417802 3.40124525700978 -0.238379844777042 FALSE -"NDUFB11" 3.33687528578276 2.71504562397523 -0.678061605433606 FALSE -"TIMP1" 3.31636498152831 3.13320094586693 1.15786959931528 FALSE -"CFP" 3.10993350047188 3.35593348697256 1.38344269448016 FALSE -"EBP" 2.00817689496213 3.32142831124919 -0.391935702968046 FALSE -"WDR13" 1.42412700270031 3.36050865719832 -1.04505468551383 FALSE -"PQBP1" 2.44420339226037 3.22064512426307 -0.361359096365817 FALSE -"PLP2" 2.87666000690641 3.17018239563911 -0.100323788044715 FALSE -"MSN" 2.57944941850045 3.16219705958519 -0.193623192614587 FALSE -"IGBP1" 2.82613831967294 3.07243996825482 -0.470854688574563 FALSE -"IL2RG" 3.15102075797078 3.02435185591424 -0.0880031417300249 FALSE -"COX7B" 2.23638412234519 3.27919865592683 -0.375751713430052 FALSE -"ITM2A" 2.03683717403862 3.55312675230888 0.637833933609996 TRUE -"TCEAL8" 1.76493938389587 3.31923539215111 -0.714744736823374 FALSE -"NGFRAP1" 1.42625360351265 3.53052896191991 0.187365373524195 FALSE -"RPL39" 2.4746451537889 3.28385381743747 0.101730742771905 FALSE -"NDUFA1" 3.08277499344226 2.82728056744339 -0.962538096912818 FALSE -"CD40LG" 1.13908642258007 3.62261294522185 1.06437021264756 TRUE -"SSR4" 3.43267775977527 2.82707067190924 0.549284209944994 FALSE -"MPP1" 1.43587248580675 3.35865952559766 -0.685193612173036 FALSE -"BLK" 1.40709315652298 3.66154429360133 1.13705148936854 TRUE -"BIN3" 1.47925428927643 3.41635553315693 -0.311580504835096 FALSE -"PNOC" 1.32209115379711 3.61891732479677 0.828062915934563 TRUE -"RP11-489E7.4" 0.839191116734345 3.39447833977714 -0.962252420736102 FALSE -"LEPROTL1" 2.190983710905 3.3619002313788 0.275611330633594 FALSE -"GTF2E2" 1.58934064713754 3.30980778860192 -1.00153524532824 FALSE -"PPAPDC1B" 1.52794987271751 3.54282262012451 0.507362838677888 TRUE -"GOLGA7" 2.12054388683268 3.27405241684299 -0.416283830706009 FALSE -"CHCHD7" 1.78939801782059 3.32479413278222 -0.682456073926386 FALSE -"TRAM1" 2.45675474953881 3.2390988589173 -0.226160335193182 FALSE -"TPD52" 1.72478331813181 3.4417388773682 -0.00316742095644467 FALSE -"MTDH" 3.05280739350945 2.90419025102596 -0.621239233913001 FALSE -"ZNF706" 2.97642929127324 3.00867737168276 -0.157561140113553 FALSE -"EIF3E" 2.80476202747249 3.23224722511165 0.134957223191815 FALSE -"LYPD2" 1.48400536912563 3.93487286137792 3.04610191376563 TRUE -"LY6E" 3.52876106620447 2.69712548928742 0.0987468736630405 FALSE -"COMMD5" 1.80082344851781 3.29410196863405 -0.860735473438945 FALSE -"PLGRKT" 1.89151195740484 3.35462448195361 -0.24439734023361 FALSE -"PTPLAD2" 1.97973182028553 3.3047987040352 -0.465844981333787 FALSE -"SIT1" 2.30867132505524 3.43445841645396 1.20511472414158 TRUE -"CCDC107" 2.38671189360534 3.25136998870585 -0.136257582352883 FALSE -"TLN1" 2.25112946854537 3.28757012178372 -0.309817498101959 FALSE -"DCAF10" 0.481516391549768 3.36824458252357 -0.739347263894807 FALSE -"ANXA1" 3.25038837946519 3.06685872744265 0.866590874351591 FALSE -"OSTF1" 2.91874199622537 3.00811793836013 -0.714692500859333 FALSE -"HNRNPK" 3.21429230631956 2.78646598228775 -0.364487061201765 FALSE -"HIATL1" 0.41347302038409 3.42662282947277 -0.456789353880501 FALSE -"ANP32B" 3.17699292897818 2.90427022125329 -0.620884353403957 FALSE -"TXN" 2.74419136757791 3.11334414322823 -0.315791414682894 FALSE -"ATP6V1G1" 3.3624065422185 2.67533139326953 -0.852428859915367 FALSE -"NDUFA8" 2.29102036642718 3.24193855002767 -0.669214756521754 FALSE -"ARPC5L" 2.47398015958645 3.25774525032343 -0.0895501006968455 FALSE -"C9orf78" 2.69694232632053 3.1099048951144 -0.538117342930835 FALSE -"NUP214" 1.52019913561372 3.39592830859287 -0.443857921705363 FALSE -"FCN1" 3.00566712020149 3.66796422708078 2.76812836550596 FALSE -"EGFL7" 0.399810426341325 3.69789824376537 0.856217084416377 TRUE -"SNHG7" 2.87596116491333 3.1531742059832 -0.164799983267586 FALSE -"PHPT1" 2.49749987471086 3.16465937202615 -0.771531047332516 FALSE -"C9orf142" 2.66017680966191 3.25386481848245 0.410272382033987 FALSE -"CLIC3" 1.8141475170406 3.75786503540309 1.83309219738145 TRUE -"KLF6" 2.96287747966498 3.05535843198089 0.0495934347232158 FALSE -"AKR1C3" 0.874161648288546 3.68549922435558 1.69773017207376 TRUE -"RBM17" 2.1937098366361 3.2222877835298 -0.82398548506327 FALSE -"PRKCQ-AS1" 1.71687725243083 3.47143905449621 0.169349893829095 FALSE -"GATA3" 1.23423492994735 3.49010705475675 -0.105639449011703 FALSE -"VIM" 4.06739551743169 1.9219411241981 -0.435360027336482 FALSE -"NSUN6" 0.20596103820399 3.47281238673302 0.212531604456449 FALSE -"DNAJC1" 1.96217309942806 3.32776983822773 -0.36375117180688 FALSE -"COMMD3" 2.22770289465426 3.28622758770585 -0.320391384741297 FALSE -"APBB1IP" 2.48652270934974 3.1514430844842 -0.868358369088895 FALSE -"ABI1" 1.9545422921601 3.35519898919245 -0.241843977734274 FALSE -"EPC1" 1.98110160133363 3.32679869892316 -0.368067341411495 FALSE -"HNRNPF" 2.9008348399592 3.00853895646476 -0.713096467062922 FALSE -"ZNF22" 1.77069596051533 3.30773405385662 -0.781551745766572 FALSE -"SRGN" 3.72197863086736 2.5051152677656 -0.378677660114587 FALSE -"PPA1" 3.07620328737387 3.00059713651996 -0.193418459314089 FALSE -"PRF1" 1.8335541021299 3.69343093664082 1.45881841271069 TRUE -"C10orf54" 3.10529102324294 3.11671626265077 0.321878495177014 FALSE -"PSAP" 3.46133598638492 3.14536293573533 1.65284607972742 FALSE -"ANAPC16" 3.10599776502874 2.90271739964013 -0.627775244463765 FALSE -"RPS24" 4.21077942971783 1.07699270335599 -1.36746490532121 FALSE -"ANXA11" 2.59306967007297 3.17767650974705 -0.0916465373194863 FALSE -"HHEX" 2.09034326754452 3.32248723087241 -0.0348080518899119 FALSE -"PDLIM1" 2.14187005036965 3.44068961198054 0.896161670916329 TRUE -"PGAM1" 2.48769771347841 3.10654000418404 -1.19733464100159 FALSE -"NPM3" 1.82637503444921 3.29752206894404 -0.840869379064064 FALSE -"ADD3" 1.81659996207802 3.36901610265621 -0.425587050408244 FALSE -"C10orf118" 1.55583445100185 3.44113631092627 -0.151111457212627 FALSE -"RGS10" 3.11344058999419 2.98653088838909 -0.255839656101156 FALSE -"TIAL1" 1.74825858844177 3.30627166797725 -0.790046203021887 FALSE -"FAM175B" 0.637380484828048 3.44589579613699 -0.530950025332543 FALSE -"ZNF511" 2.08386519741503 3.29430495572696 -0.512483807785518 FALSE -"FUOM" 1.88410913859839 3.30974848647591 -0.443845974168261 FALSE -"PSMD13" 2.35688939270209 3.19424541014928 -0.554772988478762 FALSE -"IFITM2" 3.68160552077843 2.79230472645207 0.140009202813686 FALSE -"IFITM1" 2.43556259778112 3.45732566196546 1.37264846853062 TRUE -"IFITM3" 2.77828655358999 3.61091668782621 1.57045192879319 TRUE -"RNH1" 3.26444325814092 2.91788175144473 0.212500241745586 FALSE -"IRF7" 2.02560475814499 3.30093399139887 -0.483021461714036 FALSE -"TALDO1" 3.2495587119335 2.8413084720404 -0.12369845225257 FALSE -"CTSD" 2.52001367158521 3.27471482545831 0.0347751688948523 FALSE -"CARS" 1.41363644116194 3.47795422679604 -0.193731215329537 FALSE -"ILK" 2.01411380987544 3.2684345129826 -0.627463417925022 FALSE -"NUCB2" 2.19571108474883 3.46016863191925 1.04957971226943 TRUE -"LDHA" 3.39712417337079 2.63270732937401 -1.03957187802874 FALSE -"CAT" 2.68053409953225 3.1405792354425 -0.33603867751737 FALSE -"CD82" 1.61837904247347 3.52631429390243 0.400462425327005 FALSE -"SPI1" 3.36083675348535 3.18607058054864 1.38999629247011 FALSE -"PSMC3" 2.37639006864026 3.17648331331814 -0.684904559805325 FALSE -"MTCH2" 2.22067237147074 3.20646806105152 -0.948582659099955 FALSE -"TIMM10" 2.22482618831079 3.19240079283312 -1.0593773882006 FALSE -"LPXN" 1.76265157982474 3.38799642004087 -0.3153374254694 FALSE -"MS4A1" 1.82431674142266 3.89874243045918 2.65139674163744 TRUE -"CYB561A3" 1.86270639868611 3.47322837237393 0.17974337782185 FALSE -"POLR2G" 2.95246554993266 2.97156414890618 -0.853263936893935 FALSE -"SLC3A2" 2.11634154429574 3.27708068132422 -0.392433020610266 FALSE -"OTUB1" 2.52290522943674 3.15701231479031 -0.82755616551445 FALSE -"BAD" 1.94136074781356 3.29094728778422 -0.527406758847808 FALSE -"CAPN1" 1.87628679434777 3.35167320661519 -0.257514104070181 FALSE -"NEAT1" 2.74255371475709 3.16384281381358 -0.182781172394637 FALSE -"KAT5" 1.2824138523676 3.36696528440057 -0.998252764467951 FALSE -"CTSW" 2.50184992092505 3.6280099264227 2.6231433704384 TRUE -"SF3B2" 2.72419388741045 3.09907065820968 -0.609491922174002 FALSE -"ADRBK1" 1.90484899588517 3.33468077078783 -0.333035952152058 FALSE -"POLD4" 3.28883662808768 2.78210585353592 -0.383630417780375 FALSE -"TBC1D10C" 2.93736587657673 3.1334831260796 -0.239446723320405 FALSE -"PTPRCAP" 3.54018037063507 3.33524683974809 2.31119898354919 FALSE -"CORO1B" 2.83313843837161 3.19031629023234 -0.023998385714872 FALSE -"GSTP1" 3.77041958250188 2.71995033635047 0.00933145512566443 FALSE -"UNC93B1" 2.28536280184206 3.27465212032249 -0.411560526684235 FALSE -"NDUFS8" 2.88862913685384 3.01809661674621 -0.676864417523986 FALSE -"MRPL21" 2.1553790638201 3.25544960469411 -0.562800801915119 FALSE -"LAMTOR1" 3.18383343358424 2.81331710139359 -0.246595921551035 FALSE -"MRPL48" 2.00051481315874 3.29806612811421 -0.495767505748207 FALSE -"SPCS2" 2.83155534622748 3.15482445635242 -0.158544063788521 FALSE -"TMEM126B" 1.76592133461715 3.32021335578926 -0.709064108721915 FALSE -"CTSC" 3.02764656960464 3.04078979991481 -0.0150571700901549 FALSE -"CWC15" 2.38279312796731 3.22725438234769 -0.31293727162123 FALSE -"FDX1" 2.21824013630881 3.28086232098308 -0.362648578097767 FALSE -"POU2AF1" 1.2522944791464 3.49211481385886 -0.0910858779238025 FALSE -"IL18" 1.03335103697836 3.42054386391006 -0.960862192076992 FALSE -"AMICA1" 2.90919616463609 3.26972963656569 0.277048964125279 FALSE -"CD3E" 2.92322571312313 3.45878855490342 0.993750739797926 TRUE -"CD3D" 3.09327082029195 3.59156091384064 2.42907660084387 FALSE -"CD3G" 2.2518104436951 3.5321563210233 1.61655948325521 TRUE -"FLI1" 1.80565531723311 3.3051818761287 -0.796376399726668 FALSE -"NINJ2" 1.5609515143884 3.46499337118086 0.00337601585060111 FALSE -"CD27" 2.90048060223493 3.52186727817359 1.23287531203383 TRUE -"CHD4" 1.3426981733221 3.36509561660317 -1.01180535808916 FALSE -"MLF2" 2.58958487797847 3.09999260264193 -0.603418269131707 FALSE -"LAG3" 0.892093375483209 3.53825618418845 0.351902623221687 FALSE -"CD4" 1.94017466695926 3.2872142166916 -0.543998166389395 FALSE -"KLRG1" 1.50777997640318 3.55248491474149 0.569931464629263 TRUE -"KLRB1" 1.1924799123468 3.60226689776107 0.860452451661331 TRUE -"KLRC2" 0.377902755908066 3.61136368610661 0.437379160465871 FALSE -"KLRC1" 0.599887622791987 3.6309163749101 0.588688943290777 TRUE -"RP11-291B21.2" 0.978938283551164 3.52872409157692 0.26477760311724 FALSE -"PRR4" 0.904315732416752 3.430788953806 -0.630366956945641 FALSE -"H2AFJ" 2.38184034537358 3.28237801066042 0.0909184464142142 FALSE -"WBP11" 1.3632085384555 3.40002055106161 -0.758646243607779 FALSE -"LDHB" 3.71062938452355 2.76529358903266 0.0912249535718192 FALSE -"FGFR1OP2" 1.76035231530845 3.40513812546283 -0.215767615582579 FALSE -"FKBP11" 2.135253356219 3.65349385725856 2.57222189391006 TRUE -"TMBIM6" 3.3237217096618 2.81448072395967 -0.241486980285002 FALSE -"COX14" 2.52408398744522 3.13571565361898 -0.983583238701814 FALSE -"HNRNPA1" 3.98648113617842 1.7958536858051 -1.05300780399819 FALSE -"NFE2" 0.8730624102893 3.48102103731114 -0.171236788614978 FALSE -"CD63" 3.11515145536368 3.07268154888682 0.12646750087714 FALSE -"WIBG" 2.0294320307228 3.33272357388905 -0.341734594792701 FALSE -"CNPY2" 2.57769129295769 3.14878839713026 -0.281957761015772 FALSE -"ATP5B" 3.38007438412281 2.66905319984354 -0.87999357239605 FALSE -"RP11-620J15.3" 1.01814228650138 3.51284571233393 -0.0357691831393403 FALSE -"TMBIM4-1" 2.68455938124627 3.13435538068185 -0.377040643665837 FALSE -"LYZ" 3.75075224876102 3.78102784301741 1.9257213037436 FALSE -"ATXN7L3B" 1.17805656257772 3.41012741810466 -1.0652607643385 FALSE -"NAP1L1" 3.55567504337354 2.61347062537124 -0.19129573349932 FALSE -"OSBPL8" 2.46106481956778 3.20877395865184 -0.448331566404239 FALSE -"BTG1" 3.77566666663771 2.63181890853916 -0.149840869742786 FALSE -"ISCU" 2.99603328783625 3.0106828226902 -0.148661634657808 FALSE -"HVCN1" 1.95519124092409 3.46154263802075 0.230793904961229 FALSE -"PPP1CC" 2.59884593528146 3.160535098199 -0.204571983535569 FALSE -"MAPKAPK5-AS1" 1.68065698646624 3.3484481281919 -0.545058786548605 FALSE -"ERP29" 3.60119967242132 2.3653440623085 -1.05158372977254 FALSE -"OAS1" 2.41730767894551 3.38488413031527 0.841915502003081 TRUE -"COX6A1" 3.50438682070113 2.38237205057007 -0.992545415932638 FALSE -"TRIAP1" 1.58815147511883 3.38383843261868 -0.522146460568415 FALSE -"POP5" 2.01722334743994 3.29899166797298 -0.491654000108527 FALSE -"ACADS" 0.963008418267332 3.40491964251251 -0.866817058553811 FALSE -"RNF34" 1.15273322429456 3.46085051376541 -0.556889783814366 FALSE -"AC084018.1" 0.963804155489779 3.42214197170866 -0.709401909686537 FALSE -"MPHOSPH9" 0.83013817581624 3.4636988298338 -0.329564842718418 FALSE -"SAP18" 3.29207895163967 2.73110560471937 -0.607549481703003 FALSE -"POMP" 2.55771840396182 3.10827532628545 -0.548852735791161 FALSE -"ALOX5AP" 2.25336594515534 3.47230897984495 1.1451978904923 TRUE -"WBP4" 1.18779191823964 3.40446825046509 -1.12197963301957 FALSE -"TSC22D1" 0.510620462965645 3.52372010161378 0.0131734099573617 FALSE -"ESD" 1.87835099052462 3.31057927051557 -0.440153605006518 FALSE -"EBPL" 1.83724170186105 3.34633700171372 -0.557321537360457 FALSE -"UCHL3" 1.70565827196434 3.27625488864867 -0.964402542580352 FALSE -"TNFSF13B" 1.82566382890225 3.35420686661042 -0.511608410672598 FALSE -"APEX1" 2.76202388943155 3.1294290812593 -0.254815165850972 FALSE -"DHRS4L2" 2.22120701005766 3.20754177788256 -0.940125994765445 FALSE -"PSME2" 3.65622261394295 2.32823873494105 -0.698130659385556 FALSE -"NEDD8" 3.40027342167025 2.6073602953745 -0.212481065229147 FALSE -"TINF2" 1.7595825909509 3.3571167498208 -0.494705978218076 FALSE -"GZMH" 1.87399710375762 3.89137561842566 2.14116045726274 TRUE -"GZMB" 2.0486734718415 3.98502854304607 2.55739518767246 TRUE -"NFKBIA" 3.09724085002722 3.05115538005322 0.030941728238131 FALSE -"PNN" 2.17417094634476 3.28000583093699 -0.369394349996051 FALSE -"RN7SL1" 0.310033909671626 3.46443195456467 0.0979622210236809 FALSE -"RPL36AL" 3.81477657430148 2.08048952933797 -1.14558530773851 FALSE -"ARF6" 2.89712400777323 3.04212544263297 -0.585773754720087 FALSE -"LGALS3" 2.95714605386322 3.18277617655643 -0.0525821357321126 FALSE -"DAAM1" 0.57574442907445 3.3389868067356 -1.1779022261292 FALSE -"DHRS7" 2.63315560935975 3.12874487999587 -0.414001910926923 FALSE -"ERH" 2.94360458991256 2.98295189076515 -0.810094247344307 FALSE -"COX16" 2.37305761054682 3.21971122305615 -0.368201195734782 FALSE -"FOS" 3.5425532392012 2.83233297420364 0.567529316155106 FALSE -"AHSA1" 2.11580830099645 3.27233952829737 -0.429774653475961 FALSE -"CALM1" 3.6435137992878 2.4942334037929 -0.398331166592955 FALSE -"EVL" 3.10536424801186 3.0527650495379 0.0380848907026398 FALSE -"PPP2R5C" 2.16753490785345 3.36382049675213 0.290735466929016 FALSE -"PLD4" 2.13199666321673 3.33876460147225 0.0933935888323726 FALSE -"CRIP1" 3.28862271314085 2.88640782945323 0.0743124620023625 FALSE -"AL928768.3" 1.7146392005646 4.15897724941942 4.16300429829345 TRUE -"KIAA0125" 1.01945656848426 3.66270174888895 1.46615926283861 TRUE -"NDNL2" 2.21232432750462 3.27493874593466 -0.40930304452347 FALSE -"EMC7" 2.3954251974654 3.19457782918572 -0.552337565906698 FALSE -"NOP10" 2.80317292512519 3.08273225448191 -0.431837752057912 FALSE -"SRP14" 3.78208186613075 2.05364490308828 -1.19406882464621 FALSE -"GCHFR" 1.85443389356539 3.403698874406 -0.224127691233205 FALSE -"ZNF106" 1.57011312783586 3.35824131646188 -0.687901744353156 FALSE -"CEP152" 0.384044007868824 3.339003760918 -0.880876444227342 FALSE -"EID1" 3.27396963601886 2.72379885596588 -0.639630116193344 FALSE -"MYO5A" 0.387572249547068 3.33901136594997 -0.880839634935318 FALSE -"SLTM" 2.3921926680529 3.22437706851683 -0.334017517583643 FALSE -"RPS27L" 2.49398843531957 3.20787309734392 -0.454931603475441 FALSE -"PPIB" 3.42580923411985 2.84692516143766 0.61812238189483 FALSE -"SPG21" 2.21463548061152 3.23828286509114 -0.698007171362482 FALSE -"PKM" 3.32942161679077 2.71947340695577 -0.658621209685313 FALSE -"CSK" 2.48614248640561 3.16790612038109 -0.747744189894056 FALSE -"SCAMP2" 2.34337481252477 3.22258586920363 -0.347140494189483 FALSE -"IMP3" 2.67094856594968 3.11208595458494 -0.523748799637702 FALSE -"ETFA" 2.382941320182 3.23501720275826 -0.256064030384178 FALSE -"CTSH" 2.83992491495104 3.19157178082816 -0.0192389575573612 FALSE -"IL16" 2.32376187865812 3.28175962625499 0.0863879377064578 FALSE -"ISG20" 3.05616653278971 3.33691307040955 1.29903659313704 FALSE -"ZNF710" 0.302510697367751 3.33310817634192 -1.69737291191455 FALSE -"IDH2" 2.72799970062989 3.13704308313857 -0.359334400608181 FALSE -"NGRN" 0.293903724983969 3.43376727742207 -0.321256392386435 FALSE -"SLCO3A1" 0.493085615604123 3.35090980631333 -0.823249717162938 FALSE -"VIMP" 2.19695313202799 3.39113008491449 0.505827578298676 TRUE -"POLR3K" 1.79200575384459 3.35693182884598 -0.495780115583827 FALSE -"NME4" 1.53699849852633 3.37119182644184 -0.604040131047366 FALSE -"C16orf13" 2.65421059498564 3.11214437158573 -0.523363955842171 FALSE -"STUB1" 2.6255955188528 3.12871673890011 -0.414187300898267 FALSE -"NDUFB10" 3.1714067608239 2.77984017918255 -1.17306230946285 FALSE -"SRRM2" 2.3237448190312 3.25887370066073 -0.0812826637521603 FALSE -"TCEB2" 3.35644682211781 2.64219840729023 -0.99790084049594 FALSE -"IL32" 3.18508097437666 3.81022388494304 4.13037162214629 FALSE -"CORO7" 1.49121264588086 3.4097277909081 -0.354498749631726 FALSE -"HMOX2" 2.43012488739796 3.20685758971942 -0.462371581093321 FALSE -"RSL1D1" 2.93058749992548 3.02165993383195 -0.663356270407244 FALSE -"TNFRSF17" 1.29279173449958 4.00988201127786 3.66203455705021 TRUE -"BFAR" 1.55489148281805 3.39206751374831 -0.468858673398396 FALSE -"NDUFAB1" 2.71570586891656 3.11380696089873 -0.512411028219006 FALSE -"LAT" 2.44442334440561 3.49183730868594 1.62549332460236 TRUE -"BRD7" 1.16657333980853 3.39613503906858 -1.20549903958126 FALSE -"TMEM208" 2.18834303466666 3.28070010433175 -0.363926207105802 FALSE -"DPEP2" 1.81715482167584 3.44782424269604 0.0321802095079433 FALSE -"PSMD7" 2.69331054932511 3.1592198759391 -0.213236501049554 FALSE -"GABARAPL2" 3.05887265215854 2.88321460607683 -0.71432196990088 FALSE -"C16orf74" 1.64545519715339 3.41688132963283 -0.308175685966357 FALSE -"IRF8" 1.85937966824741 3.63118625107702 1.09726211737773 TRUE -"GLOD4" 1.82939397728794 3.39627496597286 -0.267250422204789 FALSE -"SERPINF1" 1.41748893074723 3.36530116349807 -1.01031541771555 FALSE -"PSMB6" 3.18074359800394 2.73596222179072 -0.586226269097547 FALSE -"RNF167" 2.38891216415749 3.26093462172524 -0.0661836076523231 FALSE -"CLEC10A" 2.36594049161634 3.820537860374 4.03367292714074 TRUE -"TMEM256" 2.28584368835803 3.22156759273921 -0.82965775506666 FALSE -"EIF4A1" 3.87441317833487 1.90582900374495 -0.886131881399053 FALSE -"LSMD1" 2.61240381830552 3.13612548110962 -0.365379446448042 FALSE -"TRAPPC1" 3.45808144976913 2.49271102899477 -0.609985413133518 FALSE -"NCOR1" 2.52274379556912 3.18745292908864 -0.604537171279372 FALSE -"TNFRSF13B" 1.38031143188512 3.59876201313415 0.681963834240456 TRUE -"SNORD3B-2" 1.24675450771303 3.48593386192884 -0.13588952155318 FALSE -"IFT20" 2.13208648542484 3.2609666690596 -0.519348040347258 FALSE -"UNC119" 2.39855608213416 3.26340416172117 -0.048090860879279 FALSE -"NSRP1" 1.78792689808665 3.37028157877281 -0.418236368941893 FALSE -"CCL5" 2.77338811709309 3.87529260416926 2.57267224378342 TRUE -"CCL4" 1.0511249797538 3.64169233678438 1.25559294600193 TRUE -"GGNBP2" 2.27922701317041 3.22255558857385 -0.821876234934065 FALSE -"CWC25" 1.54356057470269 3.4153841296945 -0.317870871906012 FALSE -"MIEN1" 2.70482405569605 3.14408683121987 -0.312931081203359 FALSE -"CCR7" 1.90994749768619 3.51670403136384 0.475955364469793 FALSE -"NT5C3B" 0.771948123880509 3.343965121875 -1.14777630356906 FALSE -"DNAJC7" 2.25154446759174 3.20804863342093 -0.936133967230667 FALSE -"CCR10" 0.801337425291691 3.76664423842912 2.43941001832113 TRUE -"COA3" 2.19740659286139 3.27287174272182 -0.42558289768762 FALSE -"SLC25A39" 2.24100230144089 3.21426086975865 -0.887205985517354 FALSE -"ABI3" 2.89832295263727 3.20587699709897 0.0349905598481674 FALSE -"PHB" 2.77621828268808 3.06437536075699 -0.501426737566584 FALSE -"SUPT4H1" 2.93970298604634 2.94878583383306 -0.939614049352395 FALSE -"VMP1" 1.92883847386978 3.38186782705919 -0.123315949006977 FALSE -"PSMC5" 2.86999435160577 3.01449034114468 -0.690535415696962 FALSE -"CD79B" 2.84176860254764 3.6051815423987 1.54871061689013 TRUE -"DDX5" 3.77464779124756 2.16627034942249 -0.990658366225575 FALSE -"CD300A" 2.28388397984871 3.39974816577667 0.573704149617894 TRUE -"SUMO2" 3.42782335250183 2.43712610232806 -0.802705791777586 FALSE -"ACOX1" 0.492072973180953 3.46177239089959 -0.286661144595184 FALSE -"UBALD2" 1.53192280630342 3.40107933861356 -0.410502193754082 FALSE -"ST6GALNAC1" 0.274560898986033 3.48501115446387 0.379301679016756 FALSE -"SRSF2" 2.98666118989634 2.89705236613655 -0.652914725002025 FALSE -"SEPT9" 2.61413368580122 3.1943011067012 0.017874199869861 FALSE -"DCXR" 2.66768237951364 3.13918674981164 -0.345212196324342 FALSE -"CD7" 2.79237087781125 3.55157866193919 1.34550793306925 TRUE -"ANKRD12" 2.1434646211977 3.25284478100334 -0.583316564513242 FALSE -"PSMG2" 2.13606686709123 3.25441029869955 -0.570986444239716 FALSE -"TTC39C" 1.82848276874254 3.43921111202697 -0.0178502724154508 FALSE -"RNF138" 1.34054558502666 3.4430159746887 -0.446986864972786 FALSE -"ACAA2" 1.66861938161565 3.32980632480297 -0.653342109222304 FALSE -"NOP56" 2.02440052302235 3.27665807807809 -0.590914282760244 FALSE -"IDH3B" 2.36858948015518 3.18773341041145 -0.602482263257409 FALSE -"C20orf27" 2.81700460469908 3.07708427075547 -0.453248643441959 FALSE -"PCNA" 1.92681044999994 3.48948646538109 0.354988546987522 FALSE -"DTD1" 1.89180152659098 3.30012283589523 -0.486626593040638 FALSE -"NAA20" 2.02489479179352 3.2624009076075 -0.654279410237939 FALSE -"CST3" 3.87266101830714 3.70706007871455 1.84704591777024 FALSE -"CST7" 2.36352013310648 3.5912068490142 2.35351066106011 TRUE -"APMAP" 1.82385488816104 3.39210066558381 -0.291497385147886 FALSE -"EIF2S2" 2.81877706032528 3.05188746162684 -0.548767003551868 FALSE -"DYNLRB1" 2.92893109715304 3.01257319717096 -0.69780309977272 FALSE -"RBM39" 2.72760321845281 3.07463165385955 -0.770492984634845 FALSE -"TOP1" 2.03182368754573 3.2688526549337 -0.625605011441792 FALSE -"YWHAB" 3.37074808174454 2.59216218508851 -1.21758729884904 FALSE -"STK4" 1.91145116685317 3.32130289305684 -0.392493116499919 FALSE -"CD40" 1.34237652462335 3.40954750323109 -0.689588568559011 FALSE -"ZFAS1" 3.26221173651 2.84065226714444 -0.126579551648249 FALSE -"BCAS4" 1.31078818485541 3.51301727545523 0.0604290425842048 FALSE -"PSMA7" 3.70184262015965 2.15297593885639 -1.01466912254841 FALSE -"ADRM1" 2.74433349911799 3.03145981157427 -0.626206000845517 FALSE -"PPDPF" 3.70917800551077 2.29780596243752 -0.753094652048315 FALSE -"RGS19" 3.15313752271327 2.93950689261703 -0.464516061244376 FALSE -"GZMM" 2.47874240483735 3.47488674930115 1.50130737130099 TRUE -"PRSS57" 0.709220822554557 3.94826714249575 2.50911470602256 TRUE -"CFD" 2.84723814010623 3.71046642164492 1.94783413124585 TRUE -"CNN2" 3.00323234114854 3.08482057741565 0.180336356420705 FALSE -"HMHA1" 2.39283661108827 3.22489277945028 -0.330239232015325 FALSE -"GPX4" 3.44506841519488 2.59625049630521 -0.2510002252189 FALSE -"C19orf24" 2.46814911759545 3.18846497134477 -0.597122582208558 FALSE -"ABHD17A" 1.57635083390745 3.41584169039307 -0.314907916900643 FALSE -"TIMM13" 2.75910432364373 3.08053149182117 -0.440180603697268 FALSE -"GNG7" 1.76203899779364 3.49720326738288 0.319004651967895 FALSE -"SLC39A3" 1.6026774054119 3.30949755044099 -1.00354420657569 FALSE -"AES" 3.19645833825022 3.16698599022316 1.30620447379883 FALSE -"S1PR4" 2.92801073856382 3.15140301087611 -0.171514391080131 FALSE -"C19orf77" 0.511817382652722 3.73309107285334 1.0265547145141 TRUE -"MATK" 1.58652817616651 3.55807415089641 0.606124816228831 TRUE -"TMIGD2" 1.40700405541319 3.49012338119997 -0.105521104110771 FALSE -"SH3GL1" 1.02312430586355 3.39589871127882 -1.20786762905002 FALSE -"NDUFA11" 3.31978216914435 2.68460425184431 -0.811715924976139 FALSE -"CLPP" 2.31718877187444 3.24894571250279 -0.154018710142789 FALSE -"ALKBH7" 2.8621718237541 3.02838692923039 -0.637854963251816 FALSE -"STXBP2" 2.97132016287779 3.25948423046367 0.955433891813368 TRUE -"PRAM1" 1.73034077734327 3.43531150841942 -0.0405016236246931 FALSE -"EIF3G" 3.40489212234929 2.59543960636747 -0.253811689139252 FALSE -"ICAM4" 1.7772643639441 3.56261956954824 0.698983691962379 TRUE -"ICAM3" 3.29400678585182 2.72425881385486 -0.637610648792036 FALSE -"S1PR5" 0.887915380404925 3.51604071185922 0.148849258950584 FALSE -"ILF3-AS1" 2.05267070540039 3.3759332336717 -0.14969188855979 FALSE -"ILF3" 1.73355287731612 3.28416581667598 -0.918450895394821 FALSE -"ACP5" 1.79560618918677 3.40998194366918 -0.18763167192587 FALSE -"C19orf43" 3.66343251324588 2.19887261277014 -0.931776101613565 FALSE -"JUNB" 4.05380477204222 2.22221272665815 -0.406053017836545 FALSE -"PRDX2" 2.95057551234195 3.08153363722124 -0.436381579593953 FALSE -"CALR" 2.65133166821602 3.19118238315577 -0.00267155547852289 FALSE -"LYL1" 2.33536803427462 3.31724532018289 0.346369017325006 FALSE -"C19orf53" 3.16436473031736 2.79951637906891 -1.08574606609069 FALSE -"DDX39A" 2.30013644905545 3.27443938366181 -0.413236054606464 FALSE -"DNAJB1" 2.00278626978874 3.38532640069678 -0.107944528717884 FALSE -"NDUFB7" 2.93963730681195 2.92874368394805 -1.01559165748205 FALSE -"TPM4" 2.29263724839099 3.23979404425685 -0.686105024926598 FALSE -"BST2" 3.17506747117006 2.83325099983036 -0.936043360614697 FALSE -"IFI30" 2.85076823438554 3.44322765211275 0.934761051508159 TRUE -"LSM4" 2.9543320592816 2.97652355768902 -0.83446335815266 FALSE -"LRRC25" 2.54049014676706 3.38840801344387 1.2966258940397 TRUE -"COPE" 3.54598383391014 2.39720120837223 -0.941130741523855 FALSE -"UQCRFS1" 3.09869205893859 2.82343803607911 -0.979589936480713 FALSE -"U2AF1L4" 1.76255121620343 3.36702337520004 -0.437162065208865 FALSE -"HCST" 3.23021908139091 3.05521156186913 0.81545342947447 FALSE -"TYROBP" 3.63507593900109 3.45796190467109 1.34223868273705 FALSE -"POLR2I" 2.1695581156555 3.26862109163297 -0.459061305050001 FALSE -"SPINT2" 2.38844560562016 3.25656712708157 -0.0981814593780597 FALSE -"PPP1R14A" 1.69312644261049 3.63819086307192 1.13794931083336 TRUE -"SERTAD3" 1.41154117961891 3.33287725651987 -1.245345424383 FALSE -"CD79A" 2.55117267541198 4.08044186650481 5.85565718702568 TRUE -"RABAC1" 2.94951585872543 3.0419475800826 -0.586448012283793 FALSE -"PAFAH1B3" 1.97867292918424 3.31297635916622 -0.429499890215301 FALSE -"ZNF428" 2.23109792169309 3.27731524022097 -0.39058561932245 FALSE -"CALM3" 3.0194689152838 3.08156711100402 0.165898585578688 FALSE -"AP2S1" 3.44353021999209 2.64439744868238 -0.084068298721592 FALSE -"FTL" 4.49103232958047 1.5469629152355 -0.707106781186548 FALSE -"SNRNP70" 2.07997867397491 3.25168248470156 -0.701916789281399 FALSE -"CD37" 3.82224431575387 2.17497573497486 -0.974935751811395 FALSE -"FLT3LG" 1.970299806232 3.45944945648318 0.221490886859855 FALSE -"NOSIP" 3.23284966047349 3.24435342976625 1.64588996637151 FALSE -"FUZ" 0.659916465170035 3.38785814142607 -0.882160794927724 FALSE -"SPIB" 1.67547557426147 3.56558468612117 0.716206954536968 TRUE -"JOSD2" 2.05004428645473 3.29956793377812 -0.489092821768203 FALSE -"CD33" 2.21506666007505 3.32265189002931 -0.0335111855474503 FALSE -"NKG7" 2.86310987439543 3.91107961376435 2.70833690085605 TRUE -"FPR1" 1.36148532323964 3.46244095456051 -0.306181713025613 FALSE -"ZNF600" 0.317701654354738 3.52661104566874 0.948016250111536 TRUE -"ZNF524" 1.86511753362464 3.32878690279856 -0.659263553598737 FALSE -"CTD-3138B18.5" 0.344095934259196 3.38497144796139 -0.658387173686617 FALSE -"ATP6V1E1" 2.40396621188404 3.21436560753577 -0.407365116187893 FALSE -"BID" 2.97622732038644 3.10862320211162 0.285964261344062 FALSE -"MRPL40" 2.20172857816021 3.37711898332359 0.395475221247938 FALSE -"UFD1L" 2.37918109310491 3.18918750031914 -0.591829072570739 FALSE -"COMT" 2.57810709279703 3.10849926696943 -0.547377442954696 FALSE -"DGCR6L" 2.20262456816448 3.26603503595417 -0.479429249552333 FALSE -"SDF2L1" 2.53099539846667 3.26378978729801 0.475656818376051 FALSE -"IGLL5" 2.02317776150909 4.32095716633225 4.05040953310977 TRUE -"IGLL1" 0.396912866528015 4.03353506809634 2.48074067946924 TRUE -"CHCHD10" 2.84803778259013 3.09285195248981 -0.393475078689755 FALSE -"SMARCB1" 2.45535848295947 3.35156104743066 0.59777849619555 TRUE -"MIF" 2.9974728247457 3.00190085723968 -0.187632992795672 FALSE -"ASCC2" 1.46183606611481 3.37169593795579 -0.600775734130829 FALSE -"PIK3IP1" 1.97267972224139 3.41938476024801 0.0434257799346298 FALSE -"HMOX1" 2.26625251593555 3.54277002201964 1.70015368991908 TRUE -"EIF3D" 3.1456873345638 2.80838608730384 -1.04638533549461 FALSE -"IL2RB" 1.07703697479522 3.52569334603516 0.0929959100993111 FALSE -"LGALS2" 2.34537707362106 3.68218825129432 3.02007345219663 TRUE -"EIF3L" 3.55411882736079 2.47934890932978 -0.656313670014485 FALSE -"ADSL" 2.11303477285882 3.25989089946784 -0.52782087236007 FALSE -"RBX1" 2.86726791020208 3.05150916596198 -0.550201081230497 FALSE -"TTC38" 0.993488234346266 3.51766916363223 0.163733597494548 FALSE -"TYMP" 3.14942249530857 3.24050437387103 0.871207781742147 FALSE -"CCT8" 2.72267647287639 3.02332133497672 -1.10851886068876 FALSE -"SOD1" 3.37875548385482 2.66646555338911 -0.891354759552662 FALSE -"PAXBP1" 0.425662638175597 3.47008375124559 -0.246433136193615 FALSE -"ATP5O" 3.4277180993434 2.55583373605459 -0.391130541226468 FALSE -"MRPS6" 2.32597825960564 3.27872423956319 0.0641495925638163 FALSE -"TTC3" 1.59182076431075 3.38937472893264 -0.486295923304141 FALSE -"U2AF1" 3.15925424977627 2.79930398551865 -1.08668859600157 FALSE -"CSTB" 3.4772808013323 2.56546395439329 -0.357741285614294 FALSE -"SUMO3" 2.51254534173561 3.17021610371403 -0.730820413173816 FALSE -"ITGB2" 3.51163693858791 2.60117887552272 -0.233912874999023 FALSE -"S100B" 1.30307756616295 3.70544932468219 1.45530430679135 TRUE -"PRMT2" 2.53377804135866 3.233181935983 0.274016174151852 FALSE -"MT-ND3" 2.1881501449375 3.30109707049301 -0.203278360969233 FALSE +"","means","dispersions","dispersions_norm","highly_variable" +"HES4",1.88077032191863,3.55366810363084,0.64023993665225,TRUE +"TNFRSF4",0.862206964359899,3.53394568786647,0.312503920962044,FALSE +"SSU72",2.78955473500241,3.05248251287271,-0.546511229064831,FALSE +"PARK7",3.51562963004536,2.45678328702603,-0.734551702076537,FALSE +"RBP7",0.779661894396393,3.59259048136138,0.848527753345566,TRUE +"SRM",2.49550683986714,3.23588798534154,-0.249684360972197,FALSE +"MAD2L2",2.05198283629147,3.2607335950542,-0.661689679526853,FALSE +"AGTRAP",2.20008855043616,3.33014916346082,0.0255378327794182,FALSE +"TNFRSF1B",2.12140619189998,3.37607011045442,0.387214229590131,FALSE +"EFHD2",2.27299086606244,3.26768979892266,-0.466396227648297,FALSE +"NECAP2",2.34002252354718,3.28416770240885,0.104030378053144,FALSE +"HP1BP3",2.03090714091537,3.35886246940694,-0.225561862620218,FALSE +"C1QA",2.26780119055147,3.93296434445563,4.77334982009271,TRUE +"C1QB",1.56524398237555,3.97964719581811,3.33604014219507,TRUE +"HNRNPR",2.46599869940325,3.22905980837902,-0.299710064912194,FALSE +"GALE",0.676448698010205,3.42185061730017,-0.676457727295982,FALSE +"STMN1",2.24648448379207,3.78470712108589,3.60566618419126,TRUE +"CD52",3.9383240596554,2.65726626877817,0.254094755148372,FALSE +"FGR",2.69591551909111,3.21700205644603,0.167425178928824,FALSE +"ATPIF1",2.96814435737181,3.00283733638007,-0.18347721876371,FALSE +"SESN2",0.205440249022099,3.48953831056964,0.441192697680527,FALSE +"EIF3I",2.97101781554166,2.9000046561409,-0.6398134720155,FALSE +"LCK",2.61248206065248,3.49304289851706,1.98594725205813,TRUE +"MARCKSL1",2.40099871205148,3.32493702299919,0.402721225241548,FALSE +"SFPQ",2.16157141818453,3.25187041411575,-0.590990742163032,FALSE +"PSMB2",2.81001099723218,3.03368873008977,-0.617756413426228,FALSE +"MEAF6",2.51071071704727,3.15328542182515,-0.854860736722014,FALSE +"NDUFS5",3.11828489136254,2.82952861863563,-0.952562014836549,FALSE +"CAP1",3.33127429016772,2.66489777846549,-0.898238151329864,FALSE +"SMAP2",2.12149230757857,3.30882718006133,-0.142395509924957,FALSE +"C1orf228",1.34773840883918,3.52729637972859,0.163933471425264,FALSE +"PRDX1",3.07493711474154,3.00454271280564,-0.175909341639264,FALSE +"TMEM69",0.958612646535407,3.32754139299571,-1.57406800748461,FALSE +"SCP2",2.74799354433686,3.04717258564314,-0.566640585075036,FALSE +"MAGOH",2.27062297589741,3.19748898661502,-1.01930243953784,FALSE +"JAK1",2.73745653446834,3.11810685254423,-0.484083887167165,FALSE +"CCBL2",1.13356732074892,3.41539203317771,-1.01249628906537,FALSE +"GBP2",2.17540327076784,3.45016016075597,0.970752335551299,TRUE +"CD53",3.51568067232204,2.55102239654541,-0.407812099116343,FALSE +"DENND2D",1.80773774122602,3.42843268138354,-0.0804581789000627,FALSE +"C1orf162",3.24942561210149,3.01582481520873,0.64252400956364,FALSE +"RHOC",2.985741750694,3.32204178661091,1.23304292347939,TRUE +"CD2",2.53557133944634,3.36110621201421,1.11676508734336,TRUE +"RP11-782C8.1",0.370210663657041,3.37004316966741,-0.73064188045319,FALSE +"TXNIP",3.2731625108326,2.98027688141431,0.486449083571333,FALSE +"CD160",0.626919468581951,3.68140402798016,0.894211411042321,TRUE +"RP11-277L2.3",0.664996704554698,3.44846098615156,-0.515426959080756,FALSE +"APH1A",2.43813050354468,3.16948589068915,-0.73617021895599,FALSE +"MRPS21",2.75295580601676,3.06523192160569,-0.498179608647018,FALSE +"CTSS",3.54762757164911,3.14905736097152,1.66565514637711,FALSE +"MRPL9",2.08300092575028,3.24120889728365,-0.748466011881596,FALSE +"S100A10",3.81536096876538,2.44223867599515,-0.492237754855533,FALSE +"S100A9",2.93029830903276,3.58932753136182,1.48860978715106,TRUE +"S100A8",1.79100124352522,3.64342527255502,1.16835405436805,TRUE +"S100A6",4.01980558791941,2.200924885923,-0.438355066417699,FALSE +"S100A4",4.19267544737091,2.19511910191538,-0.134003732316128,FALSE +"RAB13",0.690678797190794,3.36105158683678,-1.04437876728369,FALSE +"TPM3",3.38289950746532,2.58912183328031,-1.2309361107997,FALSE +"HAX1",2.44928220942326,3.18071193608576,-0.653924133872012,FALSE +"PMVK",2.45046175895629,3.18505655637903,-0.622093867943636,FALSE +"PBXIP1",1.8229903618879,3.44149071306331,-0.00460891537313223,FALSE +"DAP3",2.25542389981013,3.25354017657867,-0.577839583255053,FALSE +"CCT3",2.72444627797158,3.08593103645915,-0.696054084521543,FALSE +"SH2D2A",1.05291375289055,3.54952016366369,0.331799604605673,FALSE +"MNDA",2.50137095628744,3.33497476625665,0.476261377346501,FALSE +"FCER1A",2.74486704433425,3.99108486884635,3.01162811231844,TRUE +"TAGLN2",3.6933593313478,2.52503477022935,-0.342701464152289,FALSE +"LY9",1.19787954406166,3.55566714133674,0.39340753736688,FALSE +"FCER1G",3.61782460590848,3.42844644985511,1.28893143832626,FALSE +"SDHC",2.64245219336588,3.08660335050013,-0.691624964850644,FALSE +"FCGR3A",3.03212523741908,3.88389506038811,3.72635552834778,FALSE +"FCRLA",1.20589759528181,3.64802336988037,1.31904556971929,TRUE +"CD247",2.35082305573306,3.48621802034511,1.58432437768794,TRUE +"CREG1",1.53902857465827,3.34760775908679,-0.756759826238331,FALSE +"RCSD1",2.44375827328678,3.23729611150838,-0.239367917341764,FALSE +"XCL2",0.540378449629801,3.80171120788367,1.35868462509435,TRUE +"XCL1",0.673182330404454,3.57923209204653,0.275925154834737,FALSE +"PRDX6",2.87323039456323,3.04722400641683,-0.566445654520422,FALSE +"C1orf21",0.875691073768353,3.34781133709859,-1.3887971168783,FALSE +"TPR",2.49690081334352,3.17458841749232,-0.698787254717891,FALSE +"PTPRC",3.13800013048897,2.90841006663251,-0.602513135956354,FALSE +"PTPN7",1.44125985833881,3.4445339272991,-0.129110038669163,FALSE +"NUCKS1",2.48688778047874,3.27964792433752,0.0709168426377314,FALSE +"G0S2",1.18912873845411,3.72012413383654,2.04167370570866,TRUE +"TRAF3IP3",3.16899765019373,2.99825210787012,-0.203824894168744,FALSE +"NENF",2.57797947202887,3.13285736625516,-0.386909372801589,FALSE +"CAPN2",2.21017564094795,3.20940125154174,-0.92548065800644,FALSE +"COA6",1.67581756008637,3.31473724112648,-0.740872828010337,FALSE +"ARID4B",2.17720305391113,3.25324734391835,-0.580145952534994,FALSE +"RP11-156E8.1",0.284484072581432,3.38119127267806,-1.04002606033147,FALSE +"SH3YL1",1.694717034835,3.46219556579768,0.115657895877465,FALSE +"ID2",3.20837502043912,3.14766745584641,1.22138551243336,FALSE +"HPCAL1",1.95324651319074,3.32800286314145,-0.362715506743191,FALSE +"RAB10",2.08675184028479,3.3288422298726,-0.358984992330866,FALSE +"OST4",3.38848298306141,2.62297846214517,-1.082286941062,FALSE +"PPM1G",2.17873901921501,3.2635955037283,-0.498643165708662,FALSE +"LBH",2.06320580886345,3.4330046497431,0.103958550856389,FALSE +"SRSF7",2.92332809912547,3.01009588806467,-0.707194308878235,FALSE +"ZFP36L2",2.98697085195399,3.05750567641627,0.0591221709010196,FALSE +"ERLEC1",1.47260668125104,3.46731442399555,0.0184060983653875,FALSE +"CAPG",2.75040027041101,3.3135801149545,0.443281353486645,FALSE +"RNF181",2.67271003354135,3.04683439915985,-0.953617774664238,FALSE +"GNLY",2.7495375274892,4.06006663022984,3.27313045935005,TRUE +"CD8A",1.4634273769048,3.59348828554246,0.835450647400119,TRUE +"CD8B",1.77317700698711,3.68394018560444,1.40369015953436,TRUE +"MAL",1.64318096077802,3.47144089598116,0.0451272544056004,FALSE +"DUSP2",2.531132387685,3.380728830085,1.24603640758204,TRUE +"MGAT4A",1.38759438748501,3.46413340182902,-0.293913731468961,FALSE +"LIMS1",2.16137334569797,3.37009247185121,0.340133955053407,FALSE +"IL1B",1.25491202982231,3.55771267704059,0.384410990215494,FALSE +"NIFK",1.78674809979223,3.3331205081553,-0.634091247175682,FALSE +"GYPC",3.26593350000607,3.06138394280262,0.842553567079129,FALSE +"MZT2B",3.27153526537439,2.8848499252847,0.0674724082537133,FALSE +"CCDC115",2.41118903796896,3.16293800176348,-0.784142430957143,FALSE +"CXCR4",2.46374667112144,3.30203613064927,0.234940971896115,FALSE +"PPIG",2.3491076588617,3.2642249511761,-0.0420774592796026,FALSE +"SSB",2.61475888290781,3.14110121837938,-0.332599920102376,FALSE +"WIPF1",2.00804851083515,3.33284278723216,-0.341204758336087,FALSE +"ITGA4",2.18805519540149,3.31652567882021,-0.0817616276935953,FALSE +"HSPD1",2.56038959284022,3.18612018177459,-0.0360206964289463,FALSE +"BZW1",1.88473444093461,3.29736748706907,-0.49887257340366,FALSE +"NBEAL1",3.04309527455068,2.9010704255307,-0.635083952090102,FALSE +"CD28",1.17833159289949,3.55652783303207,0.40203379874517,FALSE +"AC079767.4",0.75609360948958,3.68939377289349,0.94256078825022,TRUE +"SLC11A1",1.37615070991924,3.47772767618663,-0.195373404572057,FALSE +"SP110",2.40978638296584,3.24003539037167,-0.219298965676284,FALSE +"SP140",1.5961055279512,3.3802462541091,-0.545407775031058,FALSE +"SP100",2.47521852699296,3.19000451274842,-0.585843342832518,FALSE +"NCL",2.64474405046805,3.14645992506896,-0.297297439768953,FALSE +"ARL4C",2.42223987529934,3.30597023620197,0.263763657765005,FALSE +"UBE2F",2.05581859860972,3.33834619910936,-0.316745178794656,FALSE +"OGG1",0.842049416232588,3.46358161767188,-0.330636182704285,FALSE +"MRPS25",1.83637521214718,3.33994598099191,-0.594444606657735,FALSE +"ACAA1",2.42286250511087,3.15931449544319,-0.810689554061706,FALSE +"EXOG",1.20605526350558,3.42932766021026,-0.872826809384204,FALSE +"EIF1B",2.25854504434191,3.2539598165724,-0.574534471082372,FALSE +"UQCRC1",2.60427554021496,3.0685228131831,-0.810737252577224,FALSE +"NDUFAF3",2.83560702243022,3.06616628397382,-0.494637542637929,FALSE +"IMPDH2",2.42585028766239,3.24211646139579,-0.204052283655239,FALSE +"GPX1",3.6105586131361,2.84302749100406,0.604608636949215,FALSE +"GNAI2",2.62659107028335,3.14492000647294,-0.307442228259969,FALSE +"MANF",2.23349723834358,3.43751742582445,0.871177324249738,TRUE +"TEX264",2.47180296893221,3.18819046951439,-0.599133682297661,FALSE +"TKT",3.25564846508779,2.849134855879,-0.0893363347393464,FALSE +"ARL6IP5",3.22468408835907,2.82309971146852,-0.203644897947614,FALSE +"PCNP",2.2494031628663,3.28822351050334,-0.30467136560034,FALSE +"BBX",1.92891438174297,3.35610292890043,-0.237826472651718,FALSE +"CD47",2.49222840449586,3.19157160415785,-0.574362262109909,FALSE +"TIGIT",0.96818939105192,3.60013416487041,0.917478360958406,TRUE +"COX17",2.31104990672131,3.23389195422206,-0.264308009771308,FALSE +"EAF2",2.01877998181135,3.53354084510981,0.550785559671043,TRUE +"GATA2",0.189738871344609,3.61939208308945,2.21643129578065,TRUE +"RAB7A",2.8987150914124,3.00905528851261,-0.711139108485027,FALSE +"H1FX",2.62614265316577,3.26193175061855,0.463416308280052,FALSE +"SELT",2.5748117702135,3.19186416871151,0.00181996133090909,FALSE +"SIAH2",1.90641093943005,3.33636929145934,-0.325531424670991,FALSE +"GPR171",0.773750066473151,3.49700202824371,-0.221684270216929,FALSE +"P2RY13",1.01490152740574,3.52410523315076,0.0770790877187818,FALSE +"SSR3",2.6346205193935,3.22265416230132,0.204660535770916,FALSE +"MFSD1",1.62246493235478,3.38991666808116,-0.48278657182849,FALSE +"SEC62",2.63945478975412,3.19986329318145,0.0545171792685254,FALSE +"EIF4A2",3.30739005339261,2.84435879857266,-0.11030584579257,FALSE +"CCDC50",1.72345530596264,3.4965446694018,0.315179100533326,FALSE +"HES1",1.35371879587411,3.59134813206372,0.628223101558617,TRUE +"ATP5I",2.67091313276188,3.06589134864023,-0.828073007387867,FALSE +"SPON2",1.39974189083309,3.73302162636687,1.65516665691299,TRUE +"LYAR",1.96041828509616,3.35888177318778,-0.2254760681397,FALSE +"CYTL1",0.494106397368457,3.77214774939208,1.21559384247036,TRUE +"MRFAP1",2.44679501225525,3.20491542523992,-0.476600583327349,FALSE +"BLOC1S4",2.19704394854576,3.29186896345672,-0.275959538531454,FALSE +"BST1",1.08042068875366,3.40819759541628,-1.08460236483721,FALSE +"FGFBP2",1.5871240843349,3.82309830014627,2.32230068540171,TRUE +"MED28",1.95596091462539,3.27795177635202,-0.585164519424375,FALSE +"KLF3",1.96615774778099,3.3995331200336,-0.0448036282373467,FALSE +"SMIM14",1.8733167730832,3.52480611379101,0.51196457730003,TRUE +"HOPX",1.99199632234595,3.6895845704617,1.24431241125872,TRUE +"SPINK2",0.64367493790273,3.75372270451607,1.33184277586563,TRUE +"IGFBP7",2.12535811325291,3.46257699304813,1.06854812281712,TRUE +"IGJ",2.02952034671665,4.31110894566778,4.00663971502981,TRUE +"CCNI",3.27938208538782,2.81324330174249,-0.246919942495526,FALSE +"HNRNPDL",3.2598845827918,2.80695519518584,-0.27452817905681,FALSE +"PLAC8",3.00339922727606,3.36001913842592,1.40157341782591,FALSE +"HSD17B11",2.46937497489751,3.23188418539812,-0.279017653255639,FALSE +"BANK1",1.43566745072261,3.67783394119589,1.38163475670373,TRUE +"CCDC109B",2.61533399141984,3.20338247650842,0.0777011128903178,FALSE +"SNHG8",2.57262896000928,3.23038728345501,0.255605357583006,FALSE +"ANXA5",3.30607435588407,2.7834626341202,-0.377673406874909,FALSE +"HMGB2",2.85267319857206,3.35791655991469,0.611355989210591,TRUE +"SUB1",3.08179304336015,3.14585089367294,0.451168019962388,FALSE +"IL7R",2.22330155102622,3.59018870846112,2.0736263810646,TRUE +"FYB",2.62833568552046,3.28191306290392,0.595050660531786,TRUE +"EMB",1.60525338597389,3.34100009177806,-0.799548074852102,FALSE +"GZMK",1.82348368517279,3.89375393761685,2.62242043667214,TRUE +"GZMA",2.43305136877294,3.78614829441993,3.7817224790948,TRUE +"NSA2",2.29678066911439,3.24559647737468,-0.640404680308627,FALSE +"COX7C",3.59614114322243,2.22843708096564,-1.52625855378757,FALSE +"GLRX",3.02324468069108,3.01487027279973,-0.130079163703886,FALSE +"CAMK4",1.33153829226669,3.46161160457309,-0.312193392407886,FALSE +"EPB41L4A-AS1",2.07925483366828,3.35132896289923,-0.259044074339529,FALSE +"REEP5",2.93993627952589,3.00513323554622,-0.726007184268013,FALSE +"SNX2",2.61398752309147,3.20516412861831,0.0894384111254829,FALSE +"IRF1",2.08293528255313,3.36868185297734,-0.181920209251845,FALSE +"SKP1",3.17378605057298,2.86758922239192,-0.783662076857227,FALSE +"TXNDC15",1.58440901561121,3.39225463635209,-0.467646952511503,FALSE +"H2AFY",3.13961463675365,2.94172091620841,-0.45469098201903,FALSE +"EGR1",0.755854624853946,3.46616246971674,-0.408307681141864,FALSE +"MZB1",1.89502940314269,4.19894567224949,3.50813686461313,TRUE +"NDUFA2",2.85485509122861,3.03381640323039,-0.617272418450524,FALSE +"NDFIP1",2.7535666656136,3.06568029273253,-0.496479882521461,FALSE +"CD74",4.39880166182438,2.60402299400562,0.707106781186547,FALSE +"NUDCD2",1.98067806054445,3.36181368053905,-0.212445384144632,FALSE +"NPM1",3.90178321099788,2.20586010931427,-0.430866386484064,FALSE +"ATP6V0E1",3.34379860542157,2.69986516791462,-0.744712133419028,FALSE +"HIGD2A",3.62934687928222,2.3627226327381,-0.635850014226434,FALSE +"LMAN2",2.91974587368354,3.02706685494151,-0.642859221158197,FALSE +"F12",0.240142663431215,3.35755263308639,-1.3631912991643,FALSE +"PRR7",1.25417390301911,3.44610729039542,-0.424578956152598,FALSE +"NHP2",2.87524692361751,3.04847637234876,-0.561698071623503,FALSE +"SQSTM1",2.36043469270379,3.19265611498893,-0.566416741943501,FALSE +"RNF130",2.59071798702997,3.27293445728469,0.535900744954109,TRUE +"SERPINB1",2.77391025775678,3.15138730332642,-0.171573936690829,FALSE +"SERPINB6",2.18562732509154,3.2683987789217,-0.460812254576051,FALSE +"LY86",2.81317057210154,3.25245517733428,0.211563369931743,FALSE +"ADTRP",0.676051990032346,3.52107861259993,-0.0759865199703292,FALSE +"DEK",2.76343860238718,3.10724137875725,-0.338926330355305,FALSE +"SOX4",1.10798430666125,3.55882381561274,0.42504522777171,FALSE +"FAM65B",2.43119761902019,3.28395555473758,0.102476107176322,FALSE +"HIST1H4C",2.16308906306601,3.39128869694704,0.507076817092301,TRUE +"HIST1H1E",2.46011240294088,3.23831352043661,-0.231914010082303,FALSE +"ZNRD1",1.95954047684283,3.3140703241945,-0.424637829148126,FALSE +"LTB",3.79717633154273,3.36188072620072,1.1687084798,FALSE +"LST1",3.63853174752907,3.49409660575534,1.40750080911858,FALSE +"AIF1",3.65665169135743,3.53135765627296,1.47479721160771,FALSE +"DDAH2",2.11340429878934,3.32865209691498,0.0137468382652377,FALSE +"CLIC1",3.92330153224379,1.73580916802688,-1.14411901412209,FALSE +"C6orf48",3.26808655348311,2.89201107681185,0.0989137910660921,FALSE +"HLA-DRA",4.14245186724542,3.33325849456824,1.12153477577529,FALSE +"HLA-DRB5",3.91408203666622,3.00981880472529,0.789055970109514,FALSE +"HLA-DRB1",4.12317921160857,3.05565265897838,0.815293889198523,FALSE +"HLA-DQA1",3.68334996316207,3.40805018890775,1.25209417885776,FALSE +"HLA-DQB1",3.54240798739379,3.27740161855204,2.11064186131899,FALSE +"HLA-DQA2",3.49808501697905,3.28641585974323,2.14189544173609,FALSE +"HLA-DMB",3.00743880994498,3.29519571695649,1.11390925106961,FALSE +"HLA-DMA",3.31313113840681,3.23950601917576,1.62460717526643,FALSE +"HLA-DPA1",4.04364135819571,3.18712882360912,1.05810518534791,FALSE +"HLA-DPB1",4.03173419935203,3.2760181401218,1.19298532918502,FALSE +"HSD17B8",1.41476751550311,3.43002959578333,-0.541120762000296,FALSE +"TAPBP",2.35771334653687,3.26760910155185,-0.0172839447419166,FALSE +"DAXX",1.78971204570193,3.29640775234363,-0.847342030957476,FALSE +"CUTA",3.23620771231059,2.92721041573804,0.253458194396349,FALSE +"HMGA1",2.68823776570973,3.19839966219859,0.0448749639018696,FALSE +"CCDC167",2.2417364768391,3.34809811149758,0.166904927264235,FALSE +"CNPY3",3.01119556212996,2.96333107129326,-0.358792507130755,FALSE +"MEA1",2.33090504699858,3.19456717900589,-0.552415592991462,FALSE +"HSP90AB1",3.2733330113404,2.804935751696,-0.283394643562035,FALSE +"ELOVL5",1.94096442998644,3.33080521468527,-0.350260625658804,FALSE +"UBE2J1",2.28703739021791,3.41116421484514,0.663617702434484,TRUE +"PNISR",2.84910153982415,3.04456680162047,-0.576518828600864,FALSE +"RP3-467N11.1",0.228668589920236,3.41011296999176,-0.644635827167253,FALSE +"CD164",2.632249719051,3.13283307285002,-0.387069414674882,FALSE +"GTF3C6",2.50336540233086,3.21077613822447,-0.433662871804668,FALSE +"RWDD1",2.71267840038055,3.10855368493143,-0.547018944319712,FALSE +"GOPC",1.29738004317114,3.37600577515729,-0.932721284740385,FALSE +"SAMD3",1.45178351218028,3.45699836876203,-0.0483959840370171,FALSE +"DYNLT1",1.97139648287987,3.32396100564693,-0.380679296677205,FALSE +"SOD2",2.30358639457007,3.33924632341811,0.0971876625405603,FALSE +"TCP1",2.27049072699976,3.25288183558515,-0.583024720191396,FALSE +"MRPL18",2.41433158620565,3.16931059842845,-0.737454473711627,FALSE +"RNASET2",3.55413776411645,2.52836778496456,-0.486358668909856,FALSE +"MAD1L1",1.93519971071393,3.34319018071071,-0.295216397028156,FALSE +"CHST12",1.87351132993537,3.31104759754241,-0.438072154004845,FALSE +"EIF2AK1",1.56342739361332,3.35462386364832,-0.711326723714702,FALSE +"NDUFA4",3.5313509543955,2.4196384731799,-0.863337742076391,FALSE +"TOMM7",3.47234138295704,2.5953242492034,-0.254211647863172,FALSE +"CPVL",2.90014579363954,3.5320455353688,1.27145997690549,TRUE +"LSM5",1.94349075302528,3.30911772969625,-0.44664933433243,FALSE +"SEPT7",2.96719887949065,3.057044987757,0.0570777922443779,FALSE +"AOAH",1.67883149723539,3.36460215023991,-0.451226063103958,FALSE +"STK17A",2.28547537054658,3.406941310819,0.630357832761845,TRUE +"COA1",1.85962174058007,3.29801434064504,-0.838009955309245,FALSE +"PPIA",3.84072050060515,1.97395756653606,-0.782753987303413,FALSE +"SNHG15",1.98659188274985,3.30186164622693,-0.478898556221889,FALSE +"UPP1",1.70251680017246,3.44110647375852,-0.00684081900160539,FALSE +"CCT6A",2.46699995045641,3.17710426010359,-0.68035527817101,FALSE +"SBDS",1.86319408097774,3.33261067921621,-0.637052654415536,FALSE +"WBSCR22",2.3493036223267,3.19241126155589,-0.568210627107461,FALSE +"EIF4H",2.4691986216715,3.15843222700747,-0.817153372999493,FALSE +"LAT2",2.09148787357433,3.27395693790332,-0.417035829110541,FALSE +"NCF1",2.05389185978319,3.33473810706238,-0.332781124565232,FALSE +"HSPB1",2.49467999604256,3.25969132982628,-0.0752924155800499,FALSE +"RSBN1L-AS1",0.303696615126449,3.45377698244236,-0.0477025325384536,FALSE +"CDK6",0.74369361209756,3.55655353954441,0.138687495641845,FALSE +"CCDC132",0.348488159454098,3.32205965300362,-0.962888014795907,FALSE +"BRI3",2.44602987057203,3.32008159723281,0.367148612928619,FALSE +"PDAP1",2.40859502009045,3.21403510533497,-0.409786495326051,FALSE +"ATP5J2",3.21330592099154,2.71228684873763,-0.690174141805705,FALSE +"MCM7",1.19119917917552,3.45599025313887,-0.60560162657811,FALSE +"LAMTOR4",3.51216970285824,2.44221792511759,-0.785051760822904,FALSE +"PILRA",2.56765585415311,3.49057588404772,1.96969487348407,TRUE +"ZNHIT1",2.97766060424037,2.90776608029641,-0.605370926991997,FALSE +"FAM185A",0.26161221766767,3.50499179216143,0.652458157777893,TRUE +"RINT1",0.120314869557555,3.46943002356181,0.166291117654948,FALSE +"SYPL1",1.85032922833223,3.40973410094924,-0.189071298374853,FALSE +"RP11-390E23.6",0.386946146446636,3.37178116836425,-0.722229752562229,FALSE +"CPA5",0.80794929426823,3.47986840813046,-0.181772024122253,FALSE +"MTPN",2.22318096874595,3.26281401808078,-0.504798198033965,FALSE +"C7orf55",1.5484530032343,3.34630014841228,-0.765227318322415,FALSE +"NDUFB2",3.16518984246629,2.77285027462809,-1.20408111445315,FALSE +"MRPS33",2.01485208304681,3.35999162428856,-0.220543402389014,FALSE +"GSTK1",3.4814505781444,2.60137286692168,-0.233240280860595,FALSE +"ZYX",2.36189161198549,3.22648582519528,-0.318568000405514,FALSE +"GIMAP7",3.33751674898341,3.1838687105225,1.38032887541682,FALSE +"TMEM176B",2.51113532566192,3.62661746163109,2.61294166772995,TRUE +"TMEM176A",1.51193913471295,3.51183285909641,0.306687239045162,FALSE +"OFD1",1.73282506417802,3.40124525700978,-0.238379844777042,FALSE +"NDUFB11",3.33687528578276,2.71504562397523,-0.678061605433606,FALSE +"TIMP1",3.31636498152831,3.13320094586693,1.15786959931528,FALSE +"CFP",3.10993350047188,3.35593348697256,1.38344269448016,FALSE +"EBP",2.00817689496213,3.32142831124919,-0.391935702968046,FALSE +"WDR13",1.42412700270031,3.36050865719832,-1.04505468551383,FALSE +"PQBP1",2.44420339226037,3.22064512426307,-0.361359096365817,FALSE +"PLP2",2.87666000690641,3.17018239563911,-0.100323788044715,FALSE +"MSN",2.57944941850045,3.16219705958519,-0.193623192614587,FALSE +"IGBP1",2.82613831967294,3.07243996825482,-0.470854688574563,FALSE +"IL2RG",3.15102075797078,3.02435185591424,-0.0880031417300249,FALSE +"COX7B",2.23638412234519,3.27919865592683,-0.375751713430052,FALSE +"ITM2A",2.03683717403862,3.55312675230888,0.637833933609996,TRUE +"TCEAL8",1.76493938389587,3.31923539215111,-0.714744736823374,FALSE +"NGFRAP1",1.42625360351265,3.53052896191991,0.187365373524195,FALSE +"RPL39",2.4746451537889,3.28385381743747,0.101730742771905,FALSE +"NDUFA1",3.08277499344226,2.82728056744339,-0.962538096912818,FALSE +"CD40LG",1.13908642258007,3.62261294522185,1.06437021264756,TRUE +"SSR4",3.43267775977527,2.82707067190924,0.549284209944994,FALSE +"MPP1",1.43587248580675,3.35865952559766,-0.685193612173036,FALSE +"BLK",1.40709315652298,3.66154429360133,1.13705148936854,TRUE +"BIN3",1.47925428927643,3.41635553315693,-0.311580504835096,FALSE +"PNOC",1.32209115379711,3.61891732479677,0.828062915934563,TRUE +"RP11-489E7.4",0.839191116734345,3.39447833977714,-0.962252420736102,FALSE +"LEPROTL1",2.190983710905,3.3619002313788,0.275611330633594,FALSE +"GTF2E2",1.58934064713754,3.30980778860192,-1.00153524532824,FALSE +"PPAPDC1B",1.52794987271751,3.54282262012451,0.507362838677888,TRUE +"GOLGA7",2.12054388683268,3.27405241684299,-0.416283830706009,FALSE +"CHCHD7",1.78939801782059,3.32479413278222,-0.682456073926386,FALSE +"TRAM1",2.45675474953881,3.2390988589173,-0.226160335193182,FALSE +"TPD52",1.72478331813181,3.4417388773682,-0.00316742095644467,FALSE +"MTDH",3.05280739350945,2.90419025102596,-0.621239233913001,FALSE +"ZNF706",2.97642929127324,3.00867737168276,-0.157561140113553,FALSE +"EIF3E",2.80476202747249,3.23224722511165,0.134957223191815,FALSE +"LYPD2",1.48400536912563,3.93487286137792,3.04610191376563,TRUE +"LY6E",3.52876106620447,2.69712548928742,0.0987468736630405,FALSE +"COMMD5",1.80082344851781,3.29410196863405,-0.860735473438945,FALSE +"PLGRKT",1.89151195740484,3.35462448195361,-0.24439734023361,FALSE +"PTPLAD2",1.97973182028553,3.3047987040352,-0.465844981333787,FALSE +"SIT1",2.30867132505524,3.43445841645396,1.20511472414158,TRUE +"CCDC107",2.38671189360534,3.25136998870585,-0.136257582352883,FALSE +"TLN1",2.25112946854537,3.28757012178372,-0.309817498101959,FALSE +"DCAF10",0.481516391549768,3.36824458252357,-0.739347263894807,FALSE +"ANXA1",3.25038837946519,3.06685872744265,0.866590874351591,FALSE +"OSTF1",2.91874199622537,3.00811793836013,-0.714692500859333,FALSE +"HNRNPK",3.21429230631956,2.78646598228775,-0.364487061201765,FALSE +"HIATL1",0.41347302038409,3.42662282947277,-0.456789353880501,FALSE +"ANP32B",3.17699292897818,2.90427022125329,-0.620884353403957,FALSE +"TXN",2.74419136757791,3.11334414322823,-0.315791414682894,FALSE +"ATP6V1G1",3.3624065422185,2.67533139326953,-0.852428859915367,FALSE +"NDUFA8",2.29102036642718,3.24193855002767,-0.669214756521754,FALSE +"ARPC5L",2.47398015958645,3.25774525032343,-0.0895501006968455,FALSE +"C9orf78",2.69694232632053,3.1099048951144,-0.538117342930835,FALSE +"NUP214",1.52019913561372,3.39592830859287,-0.443857921705363,FALSE +"FCN1",3.00566712020149,3.66796422708078,2.76812836550596,FALSE +"EGFL7",0.399810426341325,3.69789824376537,0.856217084416377,TRUE +"SNHG7",2.87596116491333,3.1531742059832,-0.164799983267586,FALSE +"PHPT1",2.49749987471086,3.16465937202615,-0.771531047332516,FALSE +"C9orf142",2.66017680966191,3.25386481848245,0.410272382033987,FALSE +"CLIC3",1.8141475170406,3.75786503540309,1.83309219738145,TRUE +"KLF6",2.96287747966498,3.05535843198089,0.0495934347232158,FALSE +"AKR1C3",0.874161648288546,3.68549922435558,1.69773017207376,TRUE +"RBM17",2.1937098366361,3.2222877835298,-0.82398548506327,FALSE +"PRKCQ-AS1",1.71687725243083,3.47143905449621,0.169349893829095,FALSE +"GATA3",1.23423492994735,3.49010705475675,-0.105639449011703,FALSE +"VIM",4.06739551743169,1.9219411241981,-0.435360027336482,FALSE +"NSUN6",0.20596103820399,3.47281238673302,0.212531604456449,FALSE +"DNAJC1",1.96217309942806,3.32776983822773,-0.36375117180688,FALSE +"COMMD3",2.22770289465426,3.28622758770585,-0.320391384741297,FALSE +"APBB1IP",2.48652270934974,3.1514430844842,-0.868358369088895,FALSE +"ABI1",1.9545422921601,3.35519898919245,-0.241843977734274,FALSE +"EPC1",1.98110160133363,3.32679869892316,-0.368067341411495,FALSE +"HNRNPF",2.9008348399592,3.00853895646476,-0.713096467062922,FALSE +"ZNF22",1.77069596051533,3.30773405385662,-0.781551745766572,FALSE +"SRGN",3.72197863086736,2.5051152677656,-0.378677660114587,FALSE +"PPA1",3.07620328737387,3.00059713651996,-0.193418459314089,FALSE +"PRF1",1.8335541021299,3.69343093664082,1.45881841271069,TRUE +"C10orf54",3.10529102324294,3.11671626265077,0.321878495177014,FALSE +"PSAP",3.46133598638492,3.14536293573533,1.65284607972742,FALSE +"ANAPC16",3.10599776502874,2.90271739964013,-0.627775244463765,FALSE +"RPS24",4.21077942971783,1.07699270335599,-1.36746490532121,FALSE +"ANXA11",2.59306967007297,3.17767650974705,-0.0916465373194863,FALSE +"HHEX",2.09034326754452,3.32248723087241,-0.0348080518899119,FALSE +"PDLIM1",2.14187005036965,3.44068961198054,0.896161670916329,TRUE +"PGAM1",2.48769771347841,3.10654000418404,-1.19733464100159,FALSE +"NPM3",1.82637503444921,3.29752206894404,-0.840869379064064,FALSE +"ADD3",1.81659996207802,3.36901610265621,-0.425587050408244,FALSE +"C10orf118",1.55583445100185,3.44113631092627,-0.151111457212627,FALSE +"RGS10",3.11344058999419,2.98653088838909,-0.255839656101156,FALSE +"TIAL1",1.74825858844177,3.30627166797725,-0.790046203021887,FALSE +"FAM175B",0.637380484828048,3.44589579613699,-0.530950025332543,FALSE +"ZNF511",2.08386519741503,3.29430495572696,-0.512483807785518,FALSE +"FUOM",1.88410913859839,3.30974848647591,-0.443845974168261,FALSE +"PSMD13",2.35688939270209,3.19424541014928,-0.554772988478762,FALSE +"IFITM2",3.68160552077843,2.79230472645207,0.140009202813686,FALSE +"IFITM1",2.43556259778112,3.45732566196546,1.37264846853062,TRUE +"IFITM3",2.77828655358999,3.61091668782621,1.57045192879319,TRUE +"RNH1",3.26444325814092,2.91788175144473,0.212500241745586,FALSE +"IRF7",2.02560475814499,3.30093399139887,-0.483021461714036,FALSE +"TALDO1",3.2495587119335,2.8413084720404,-0.12369845225257,FALSE +"CTSD",2.52001367158521,3.27471482545831,0.0347751688948523,FALSE +"CARS",1.41363644116194,3.47795422679604,-0.193731215329537,FALSE +"ILK",2.01411380987544,3.2684345129826,-0.627463417925022,FALSE +"NUCB2",2.19571108474883,3.46016863191925,1.04957971226943,TRUE +"LDHA",3.39712417337079,2.63270732937401,-1.03957187802874,FALSE +"CAT",2.68053409953225,3.1405792354425,-0.33603867751737,FALSE +"CD82",1.61837904247347,3.52631429390243,0.400462425327005,FALSE +"SPI1",3.36083675348535,3.18607058054864,1.38999629247011,FALSE +"PSMC3",2.37639006864026,3.17648331331814,-0.684904559805325,FALSE +"MTCH2",2.22067237147074,3.20646806105152,-0.948582659099955,FALSE +"TIMM10",2.22482618831079,3.19240079283312,-1.0593773882006,FALSE +"LPXN",1.76265157982474,3.38799642004087,-0.3153374254694,FALSE +"MS4A1",1.82431674142266,3.89874243045918,2.65139674163744,TRUE +"CYB561A3",1.86270639868611,3.47322837237393,0.17974337782185,FALSE +"POLR2G",2.95246554993266,2.97156414890618,-0.853263936893935,FALSE +"SLC3A2",2.11634154429574,3.27708068132422,-0.392433020610266,FALSE +"OTUB1",2.52290522943674,3.15701231479031,-0.82755616551445,FALSE +"BAD",1.94136074781356,3.29094728778422,-0.527406758847808,FALSE +"CAPN1",1.87628679434777,3.35167320661519,-0.257514104070181,FALSE +"NEAT1",2.74255371475709,3.16384281381358,-0.182781172394637,FALSE +"KAT5",1.2824138523676,3.36696528440057,-0.998252764467951,FALSE +"CTSW",2.50184992092505,3.6280099264227,2.6231433704384,TRUE +"SF3B2",2.72419388741045,3.09907065820968,-0.609491922174002,FALSE +"ADRBK1",1.90484899588517,3.33468077078783,-0.333035952152058,FALSE +"POLD4",3.28883662808768,2.78210585353592,-0.383630417780375,FALSE +"TBC1D10C",2.93736587657673,3.1334831260796,-0.239446723320405,FALSE +"PTPRCAP",3.54018037063507,3.33524683974809,2.31119898354919,FALSE +"CORO1B",2.83313843837161,3.19031629023234,-0.023998385714872,FALSE +"GSTP1",3.77041958250188,2.71995033635047,0.00933145512566443,FALSE +"UNC93B1",2.28536280184206,3.27465212032249,-0.411560526684235,FALSE +"NDUFS8",2.88862913685384,3.01809661674621,-0.676864417523986,FALSE +"MRPL21",2.1553790638201,3.25544960469411,-0.562800801915119,FALSE +"LAMTOR1",3.18383343358424,2.81331710139359,-0.246595921551035,FALSE +"MRPL48",2.00051481315874,3.29806612811421,-0.495767505748207,FALSE +"SPCS2",2.83155534622748,3.15482445635242,-0.158544063788521,FALSE +"TMEM126B",1.76592133461715,3.32021335578926,-0.709064108721915,FALSE +"CTSC",3.02764656960464,3.04078979991481,-0.0150571700901549,FALSE +"CWC15",2.38279312796731,3.22725438234769,-0.31293727162123,FALSE +"FDX1",2.21824013630881,3.28086232098308,-0.362648578097767,FALSE +"POU2AF1",1.2522944791464,3.49211481385886,-0.0910858779238025,FALSE +"IL18",1.03335103697836,3.42054386391006,-0.960862192076992,FALSE +"AMICA1",2.90919616463609,3.26972963656569,0.277048964125279,FALSE +"CD3E",2.92322571312313,3.45878855490342,0.993750739797926,TRUE +"CD3D",3.09327082029195,3.59156091384064,2.42907660084387,FALSE +"CD3G",2.2518104436951,3.5321563210233,1.61655948325521,TRUE +"FLI1",1.80565531723311,3.3051818761287,-0.796376399726668,FALSE +"NINJ2",1.5609515143884,3.46499337118086,0.00337601585060111,FALSE +"CD27",2.90048060223493,3.52186727817359,1.23287531203383,TRUE +"CHD4",1.3426981733221,3.36509561660317,-1.01180535808916,FALSE +"MLF2",2.58958487797847,3.09999260264193,-0.603418269131707,FALSE +"LAG3",0.892093375483209,3.53825618418845,0.351902623221687,FALSE +"CD4",1.94017466695926,3.2872142166916,-0.543998166389395,FALSE +"KLRG1",1.50777997640318,3.55248491474149,0.569931464629263,TRUE +"KLRB1",1.1924799123468,3.60226689776107,0.860452451661331,TRUE +"KLRC2",0.377902755908066,3.61136368610661,0.437379160465871,FALSE +"KLRC1",0.599887622791987,3.6309163749101,0.588688943290777,TRUE +"RP11-291B21.2",0.978938283551164,3.52872409157692,0.26477760311724,FALSE +"PRR4",0.904315732416752,3.430788953806,-0.630366956945641,FALSE +"H2AFJ",2.38184034537358,3.28237801066042,0.0909184464142142,FALSE +"WBP11",1.3632085384555,3.40002055106161,-0.758646243607779,FALSE +"LDHB",3.71062938452355,2.76529358903266,0.0912249535718192,FALSE +"FGFR1OP2",1.76035231530845,3.40513812546283,-0.215767615582579,FALSE +"FKBP11",2.135253356219,3.65349385725856,2.57222189391006,TRUE +"TMBIM6",3.3237217096618,2.81448072395967,-0.241486980285002,FALSE +"COX14",2.52408398744522,3.13571565361898,-0.983583238701814,FALSE +"HNRNPA1",3.98648113617842,1.7958536858051,-1.05300780399819,FALSE +"NFE2",0.8730624102893,3.48102103731114,-0.171236788614978,FALSE +"CD63",3.11515145536368,3.07268154888682,0.12646750087714,FALSE +"WIBG",2.0294320307228,3.33272357388905,-0.341734594792701,FALSE +"CNPY2",2.57769129295769,3.14878839713026,-0.281957761015772,FALSE +"ATP5B",3.38007438412281,2.66905319984354,-0.87999357239605,FALSE +"RP11-620J15.3",1.01814228650138,3.51284571233393,-0.0357691831393403,FALSE +"TMBIM4-1",2.68455938124627,3.13435538068185,-0.377040643665837,FALSE +"LYZ",3.75075224876102,3.78102784301741,1.9257213037436,FALSE +"ATXN7L3B",1.17805656257772,3.41012741810466,-1.0652607643385,FALSE +"NAP1L1",3.55567504337354,2.61347062537124,-0.19129573349932,FALSE +"OSBPL8",2.46106481956778,3.20877395865184,-0.448331566404239,FALSE +"BTG1",3.77566666663771,2.63181890853916,-0.149840869742786,FALSE +"ISCU",2.99603328783625,3.0106828226902,-0.148661634657808,FALSE +"HVCN1",1.95519124092409,3.46154263802075,0.230793904961229,FALSE +"PPP1CC",2.59884593528146,3.160535098199,-0.204571983535569,FALSE +"MAPKAPK5-AS1",1.68065698646624,3.3484481281919,-0.545058786548605,FALSE +"ERP29",3.60119967242132,2.3653440623085,-1.05158372977254,FALSE +"OAS1",2.41730767894551,3.38488413031527,0.841915502003081,TRUE +"COX6A1",3.50438682070113,2.38237205057007,-0.992545415932638,FALSE +"TRIAP1",1.58815147511883,3.38383843261868,-0.522146460568415,FALSE +"POP5",2.01722334743994,3.29899166797298,-0.491654000108527,FALSE +"ACADS",0.963008418267332,3.40491964251251,-0.866817058553811,FALSE +"RNF34",1.15273322429456,3.46085051376541,-0.556889783814366,FALSE +"AC084018.1",0.963804155489779,3.42214197170866,-0.709401909686537,FALSE +"MPHOSPH9",0.83013817581624,3.4636988298338,-0.329564842718418,FALSE +"SAP18",3.29207895163967,2.73110560471937,-0.607549481703003,FALSE +"POMP",2.55771840396182,3.10827532628545,-0.548852735791161,FALSE +"ALOX5AP",2.25336594515534,3.47230897984495,1.1451978904923,TRUE +"WBP4",1.18779191823964,3.40446825046509,-1.12197963301957,FALSE +"TSC22D1",0.510620462965645,3.52372010161378,0.0131734099573617,FALSE +"ESD",1.87835099052462,3.31057927051557,-0.440153605006518,FALSE +"EBPL",1.83724170186105,3.34633700171372,-0.557321537360457,FALSE +"UCHL3",1.70565827196434,3.27625488864867,-0.964402542580352,FALSE +"TNFSF13B",1.82566382890225,3.35420686661042,-0.511608410672598,FALSE +"APEX1",2.76202388943155,3.1294290812593,-0.254815165850972,FALSE +"DHRS4L2",2.22120701005766,3.20754177788256,-0.940125994765445,FALSE +"PSME2",3.65622261394295,2.32823873494105,-0.698130659385556,FALSE +"NEDD8",3.40027342167025,2.6073602953745,-0.212481065229147,FALSE +"TINF2",1.7595825909509,3.3571167498208,-0.494705978218076,FALSE +"GZMH",1.87399710375762,3.89137561842566,2.14116045726274,TRUE +"GZMB",2.0486734718415,3.98502854304607,2.55739518767246,TRUE +"NFKBIA",3.09724085002722,3.05115538005322,0.030941728238131,FALSE +"PNN",2.17417094634476,3.28000583093699,-0.369394349996051,FALSE +"RN7SL1",0.310033909671626,3.46443195456467,0.0979622210236809,FALSE +"RPL36AL",3.81477657430148,2.08048952933797,-1.14558530773851,FALSE +"ARF6",2.89712400777323,3.04212544263297,-0.585773754720087,FALSE +"LGALS3",2.95714605386322,3.18277617655643,-0.0525821357321126,FALSE +"DAAM1",0.57574442907445,3.3389868067356,-1.1779022261292,FALSE +"DHRS7",2.63315560935975,3.12874487999587,-0.414001910926923,FALSE +"ERH",2.94360458991256,2.98295189076515,-0.810094247344307,FALSE +"COX16",2.37305761054682,3.21971122305615,-0.368201195734782,FALSE +"FOS",3.5425532392012,2.83233297420364,0.567529316155106,FALSE +"AHSA1",2.11580830099645,3.27233952829737,-0.429774653475961,FALSE +"CALM1",3.6435137992878,2.4942334037929,-0.398331166592955,FALSE +"EVL",3.10536424801186,3.0527650495379,0.0380848907026398,FALSE +"PPP2R5C",2.16753490785345,3.36382049675213,0.290735466929016,FALSE +"PLD4",2.13199666321673,3.33876460147225,0.0933935888323726,FALSE +"CRIP1",3.28862271314085,2.88640782945323,0.0743124620023625,FALSE +"AL928768.3",1.7146392005646,4.15897724941942,4.16300429829345,TRUE +"KIAA0125",1.01945656848426,3.66270174888895,1.46615926283861,TRUE +"NDNL2",2.21232432750462,3.27493874593466,-0.40930304452347,FALSE +"EMC7",2.3954251974654,3.19457782918572,-0.552337565906698,FALSE +"NOP10",2.80317292512519,3.08273225448191,-0.431837752057912,FALSE +"SRP14",3.78208186613075,2.05364490308828,-1.19406882464621,FALSE +"GCHFR",1.85443389356539,3.403698874406,-0.224127691233205,FALSE +"ZNF106",1.57011312783586,3.35824131646188,-0.687901744353156,FALSE +"CEP152",0.384044007868824,3.339003760918,-0.880876444227342,FALSE +"EID1",3.27396963601886,2.72379885596588,-0.639630116193344,FALSE +"MYO5A",0.387572249547068,3.33901136594997,-0.880839634935318,FALSE +"SLTM",2.3921926680529,3.22437706851683,-0.334017517583643,FALSE +"RPS27L",2.49398843531957,3.20787309734392,-0.454931603475441,FALSE +"PPIB",3.42580923411985,2.84692516143766,0.61812238189483,FALSE +"SPG21",2.21463548061152,3.23828286509114,-0.698007171362482,FALSE +"PKM",3.32942161679077,2.71947340695577,-0.658621209685313,FALSE +"CSK",2.48614248640561,3.16790612038109,-0.747744189894056,FALSE +"SCAMP2",2.34337481252477,3.22258586920363,-0.347140494189483,FALSE +"IMP3",2.67094856594968,3.11208595458494,-0.523748799637702,FALSE +"ETFA",2.382941320182,3.23501720275826,-0.256064030384178,FALSE +"CTSH",2.83992491495104,3.19157178082816,-0.0192389575573612,FALSE +"IL16",2.32376187865812,3.28175962625499,0.0863879377064578,FALSE +"ISG20",3.05616653278971,3.33691307040955,1.29903659313704,FALSE +"ZNF710",0.302510697367751,3.33310817634192,-1.69737291191455,FALSE +"IDH2",2.72799970062989,3.13704308313857,-0.359334400608181,FALSE +"NGRN",0.293903724983969,3.43376727742207,-0.321256392386435,FALSE +"SLCO3A1",0.493085615604123,3.35090980631333,-0.823249717162938,FALSE +"VIMP",2.19695313202799,3.39113008491449,0.505827578298676,TRUE +"POLR3K",1.79200575384459,3.35693182884598,-0.495780115583827,FALSE +"NME4",1.53699849852633,3.37119182644184,-0.604040131047366,FALSE +"C16orf13",2.65421059498564,3.11214437158573,-0.523363955842171,FALSE +"STUB1",2.6255955188528,3.12871673890011,-0.414187300898267,FALSE +"NDUFB10",3.1714067608239,2.77984017918255,-1.17306230946285,FALSE +"SRRM2",2.3237448190312,3.25887370066073,-0.0812826637521603,FALSE +"TCEB2",3.35644682211781,2.64219840729023,-0.99790084049594,FALSE +"IL32",3.18508097437666,3.81022388494304,4.13037162214629,FALSE +"CORO7",1.49121264588086,3.4097277909081,-0.354498749631726,FALSE +"HMOX2",2.43012488739796,3.20685758971942,-0.462371581093321,FALSE +"RSL1D1",2.93058749992548,3.02165993383195,-0.663356270407244,FALSE +"TNFRSF17",1.29279173449958,4.00988201127786,3.66203455705021,TRUE +"BFAR",1.55489148281805,3.39206751374831,-0.468858673398396,FALSE +"NDUFAB1",2.71570586891656,3.11380696089873,-0.512411028219006,FALSE +"LAT",2.44442334440561,3.49183730868594,1.62549332460236,TRUE +"BRD7",1.16657333980853,3.39613503906858,-1.20549903958126,FALSE +"TMEM208",2.18834303466666,3.28070010433175,-0.363926207105802,FALSE +"DPEP2",1.81715482167584,3.44782424269604,0.0321802095079433,FALSE +"PSMD7",2.69331054932511,3.1592198759391,-0.213236501049554,FALSE +"GABARAPL2",3.05887265215854,2.88321460607683,-0.71432196990088,FALSE +"C16orf74",1.64545519715339,3.41688132963283,-0.308175685966357,FALSE +"IRF8",1.85937966824741,3.63118625107702,1.09726211737773,TRUE +"GLOD4",1.82939397728794,3.39627496597286,-0.267250422204789,FALSE +"SERPINF1",1.41748893074723,3.36530116349807,-1.01031541771555,FALSE +"PSMB6",3.18074359800394,2.73596222179072,-0.586226269097547,FALSE +"RNF167",2.38891216415749,3.26093462172524,-0.0661836076523231,FALSE +"CLEC10A",2.36594049161634,3.820537860374,4.03367292714074,TRUE +"TMEM256",2.28584368835803,3.22156759273921,-0.82965775506666,FALSE +"EIF4A1",3.87441317833487,1.90582900374495,-0.886131881399053,FALSE +"LSMD1",2.61240381830552,3.13612548110962,-0.365379446448042,FALSE +"TRAPPC1",3.45808144976913,2.49271102899477,-0.609985413133518,FALSE +"NCOR1",2.52274379556912,3.18745292908864,-0.604537171279372,FALSE +"TNFRSF13B",1.38031143188512,3.59876201313415,0.681963834240456,TRUE +"SNORD3B-2",1.24675450771303,3.48593386192884,-0.13588952155318,FALSE +"IFT20",2.13208648542484,3.2609666690596,-0.519348040347258,FALSE +"UNC119",2.39855608213416,3.26340416172117,-0.048090860879279,FALSE +"NSRP1",1.78792689808665,3.37028157877281,-0.418236368941893,FALSE +"CCL5",2.77338811709309,3.87529260416926,2.57267224378342,TRUE +"CCL4",1.0511249797538,3.64169233678438,1.25559294600193,TRUE +"GGNBP2",2.27922701317041,3.22255558857385,-0.821876234934065,FALSE +"CWC25",1.54356057470269,3.4153841296945,-0.317870871906012,FALSE +"MIEN1",2.70482405569605,3.14408683121987,-0.312931081203359,FALSE +"CCR7",1.90994749768619,3.51670403136384,0.475955364469793,FALSE +"NT5C3B",0.771948123880509,3.343965121875,-1.14777630356906,FALSE +"DNAJC7",2.25154446759174,3.20804863342093,-0.936133967230667,FALSE +"CCR10",0.801337425291691,3.76664423842912,2.43941001832113,TRUE +"COA3",2.19740659286139,3.27287174272182,-0.42558289768762,FALSE +"SLC25A39",2.24100230144089,3.21426086975865,-0.887205985517354,FALSE +"ABI3",2.89832295263727,3.20587699709897,0.0349905598481674,FALSE +"PHB",2.77621828268808,3.06437536075699,-0.501426737566584,FALSE +"SUPT4H1",2.93970298604634,2.94878583383306,-0.939614049352395,FALSE +"VMP1",1.92883847386978,3.38186782705919,-0.123315949006977,FALSE +"PSMC5",2.86999435160577,3.01449034114468,-0.690535415696962,FALSE +"CD79B",2.84176860254764,3.6051815423987,1.54871061689013,TRUE +"DDX5",3.77464779124756,2.16627034942249,-0.990658366225575,FALSE +"CD300A",2.28388397984871,3.39974816577667,0.573704149617894,TRUE +"SUMO2",3.42782335250183,2.43712610232806,-0.802705791777586,FALSE +"ACOX1",0.492072973180953,3.46177239089959,-0.286661144595184,FALSE +"UBALD2",1.53192280630342,3.40107933861356,-0.410502193754082,FALSE +"ST6GALNAC1",0.274560898986033,3.48501115446387,0.379301679016756,FALSE +"SRSF2",2.98666118989634,2.89705236613655,-0.652914725002025,FALSE +"SEPT9",2.61413368580122,3.1943011067012,0.017874199869861,FALSE +"DCXR",2.66768237951364,3.13918674981164,-0.345212196324342,FALSE +"CD7",2.79237087781125,3.55157866193919,1.34550793306925,TRUE +"ANKRD12",2.1434646211977,3.25284478100334,-0.583316564513242,FALSE +"PSMG2",2.13606686709123,3.25441029869955,-0.570986444239716,FALSE +"TTC39C",1.82848276874254,3.43921111202697,-0.0178502724154508,FALSE +"RNF138",1.34054558502666,3.4430159746887,-0.446986864972786,FALSE +"ACAA2",1.66861938161565,3.32980632480297,-0.653342109222304,FALSE +"NOP56",2.02440052302235,3.27665807807809,-0.590914282760244,FALSE +"IDH3B",2.36858948015518,3.18773341041145,-0.602482263257409,FALSE +"C20orf27",2.81700460469908,3.07708427075547,-0.453248643441959,FALSE +"PCNA",1.92681044999994,3.48948646538109,0.354988546987522,FALSE +"DTD1",1.89180152659098,3.30012283589523,-0.486626593040638,FALSE +"NAA20",2.02489479179352,3.2624009076075,-0.654279410237939,FALSE +"CST3",3.87266101830714,3.70706007871455,1.84704591777024,FALSE +"CST7",2.36352013310648,3.5912068490142,2.35351066106011,TRUE +"APMAP",1.82385488816104,3.39210066558381,-0.291497385147886,FALSE +"EIF2S2",2.81877706032528,3.05188746162684,-0.548767003551868,FALSE +"DYNLRB1",2.92893109715304,3.01257319717096,-0.69780309977272,FALSE +"RBM39",2.72760321845281,3.07463165385955,-0.770492984634845,FALSE +"TOP1",2.03182368754573,3.2688526549337,-0.625605011441792,FALSE +"YWHAB",3.37074808174454,2.59216218508851,-1.21758729884904,FALSE +"STK4",1.91145116685317,3.32130289305684,-0.392493116499919,FALSE +"CD40",1.34237652462335,3.40954750323109,-0.689588568559011,FALSE +"ZFAS1",3.26221173651,2.84065226714444,-0.126579551648249,FALSE +"BCAS4",1.31078818485541,3.51301727545523,0.0604290425842048,FALSE +"PSMA7",3.70184262015965,2.15297593885639,-1.01466912254841,FALSE +"ADRM1",2.74433349911799,3.03145981157427,-0.626206000845517,FALSE +"PPDPF",3.70917800551077,2.29780596243752,-0.753094652048315,FALSE +"RGS19",3.15313752271327,2.93950689261703,-0.464516061244376,FALSE +"GZMM",2.47874240483735,3.47488674930115,1.50130737130099,TRUE +"PRSS57",0.709220822554557,3.94826714249575,2.50911470602256,TRUE +"CFD",2.84723814010623,3.71046642164492,1.94783413124585,TRUE +"CNN2",3.00323234114854,3.08482057741565,0.180336356420705,FALSE +"HMHA1",2.39283661108827,3.22489277945028,-0.330239232015325,FALSE +"GPX4",3.44506841519488,2.59625049630521,-0.2510002252189,FALSE +"C19orf24",2.46814911759545,3.18846497134477,-0.597122582208558,FALSE +"ABHD17A",1.57635083390745,3.41584169039307,-0.314907916900643,FALSE +"TIMM13",2.75910432364373,3.08053149182117,-0.440180603697268,FALSE +"GNG7",1.76203899779364,3.49720326738288,0.319004651967895,FALSE +"SLC39A3",1.6026774054119,3.30949755044099,-1.00354420657569,FALSE +"AES",3.19645833825022,3.16698599022316,1.30620447379883,FALSE +"S1PR4",2.92801073856382,3.15140301087611,-0.171514391080131,FALSE +"C19orf77",0.511817382652722,3.73309107285334,1.0265547145141,TRUE +"MATK",1.58652817616651,3.55807415089641,0.606124816228831,TRUE +"TMIGD2",1.40700405541319,3.49012338119997,-0.105521104110771,FALSE +"SH3GL1",1.02312430586355,3.39589871127882,-1.20786762905002,FALSE +"NDUFA11",3.31978216914435,2.68460425184431,-0.811715924976139,FALSE +"CLPP",2.31718877187444,3.24894571250279,-0.154018710142789,FALSE +"ALKBH7",2.8621718237541,3.02838692923039,-0.637854963251816,FALSE +"STXBP2",2.97132016287779,3.25948423046367,0.955433891813368,TRUE +"PRAM1",1.73034077734327,3.43531150841942,-0.0405016236246931,FALSE +"EIF3G",3.40489212234929,2.59543960636747,-0.253811689139252,FALSE +"ICAM4",1.7772643639441,3.56261956954824,0.698983691962379,TRUE +"ICAM3",3.29400678585182,2.72425881385486,-0.637610648792036,FALSE +"S1PR5",0.887915380404925,3.51604071185922,0.148849258950584,FALSE +"ILF3-AS1",2.05267070540039,3.3759332336717,-0.14969188855979,FALSE +"ILF3",1.73355287731612,3.28416581667598,-0.918450895394821,FALSE +"ACP5",1.79560618918677,3.40998194366918,-0.18763167192587,FALSE +"C19orf43",3.66343251324588,2.19887261277014,-0.931776101613565,FALSE +"JUNB",4.05380477204222,2.22221272665815,-0.406053017836545,FALSE +"PRDX2",2.95057551234195,3.08153363722124,-0.436381579593953,FALSE +"CALR",2.65133166821602,3.19118238315577,-0.00267155547852289,FALSE +"LYL1",2.33536803427462,3.31724532018289,0.346369017325006,FALSE +"C19orf53",3.16436473031736,2.79951637906891,-1.08574606609069,FALSE +"DDX39A",2.30013644905545,3.27443938366181,-0.413236054606464,FALSE +"DNAJB1",2.00278626978874,3.38532640069678,-0.107944528717884,FALSE +"NDUFB7",2.93963730681195,2.92874368394805,-1.01559165748205,FALSE +"TPM4",2.29263724839099,3.23979404425685,-0.686105024926598,FALSE +"BST2",3.17506747117006,2.83325099983036,-0.936043360614697,FALSE +"IFI30",2.85076823438554,3.44322765211275,0.934761051508159,TRUE +"LSM4",2.9543320592816,2.97652355768902,-0.83446335815266,FALSE +"LRRC25",2.54049014676706,3.38840801344387,1.2966258940397,TRUE +"COPE",3.54598383391014,2.39720120837223,-0.941130741523855,FALSE +"UQCRFS1",3.09869205893859,2.82343803607911,-0.979589936480713,FALSE +"U2AF1L4",1.76255121620343,3.36702337520004,-0.437162065208865,FALSE +"HCST",3.23021908139091,3.05521156186913,0.81545342947447,FALSE +"TYROBP",3.63507593900109,3.45796190467109,1.34223868273705,FALSE +"POLR2I",2.1695581156555,3.26862109163297,-0.459061305050001,FALSE +"SPINT2",2.38844560562016,3.25656712708157,-0.0981814593780597,FALSE +"PPP1R14A",1.69312644261049,3.63819086307192,1.13794931083336,TRUE +"SERTAD3",1.41154117961891,3.33287725651987,-1.245345424383,FALSE +"CD79A",2.55117267541198,4.08044186650481,5.85565718702568,TRUE +"RABAC1",2.94951585872543,3.0419475800826,-0.586448012283793,FALSE +"PAFAH1B3",1.97867292918424,3.31297635916622,-0.429499890215301,FALSE +"ZNF428",2.23109792169309,3.27731524022097,-0.39058561932245,FALSE +"CALM3",3.0194689152838,3.08156711100402,0.165898585578688,FALSE +"AP2S1",3.44353021999209,2.64439744868238,-0.084068298721592,FALSE +"FTL",4.49103232958047,1.5469629152355,-0.707106781186548,FALSE +"SNRNP70",2.07997867397491,3.25168248470156,-0.701916789281399,FALSE +"CD37",3.82224431575387,2.17497573497486,-0.974935751811395,FALSE +"FLT3LG",1.970299806232,3.45944945648318,0.221490886859855,FALSE +"NOSIP",3.23284966047349,3.24435342976625,1.64588996637151,FALSE +"FUZ",0.659916465170035,3.38785814142607,-0.882160794927724,FALSE +"SPIB",1.67547557426147,3.56558468612117,0.716206954536968,TRUE +"JOSD2",2.05004428645473,3.29956793377812,-0.489092821768203,FALSE +"CD33",2.21506666007505,3.32265189002931,-0.0335111855474503,FALSE +"NKG7",2.86310987439543,3.91107961376435,2.70833690085605,TRUE +"FPR1",1.36148532323964,3.46244095456051,-0.306181713025613,FALSE +"ZNF600",0.317701654354738,3.52661104566874,0.948016250111536,TRUE +"ZNF524",1.86511753362464,3.32878690279856,-0.659263553598737,FALSE +"CTD-3138B18.5",0.344095934259196,3.38497144796139,-0.658387173686617,FALSE +"ATP6V1E1",2.40396621188404,3.21436560753577,-0.407365116187893,FALSE +"BID",2.97622732038644,3.10862320211162,0.285964261344062,FALSE +"MRPL40",2.20172857816021,3.37711898332359,0.395475221247938,FALSE +"UFD1L",2.37918109310491,3.18918750031914,-0.591829072570739,FALSE +"COMT",2.57810709279703,3.10849926696943,-0.547377442954696,FALSE +"DGCR6L",2.20262456816448,3.26603503595417,-0.479429249552333,FALSE +"SDF2L1",2.53099539846667,3.26378978729801,0.475656818376051,FALSE +"IGLL5",2.02317776150909,4.32095716633225,4.05040953310977,TRUE +"IGLL1",0.396912866528015,4.03353506809634,2.48074067946924,TRUE +"CHCHD10",2.84803778259013,3.09285195248981,-0.393475078689755,FALSE +"SMARCB1",2.45535848295947,3.35156104743066,0.59777849619555,TRUE +"MIF",2.9974728247457,3.00190085723968,-0.187632992795672,FALSE +"ASCC2",1.46183606611481,3.37169593795579,-0.600775734130829,FALSE +"PIK3IP1",1.97267972224139,3.41938476024801,0.0434257799346298,FALSE +"HMOX1",2.26625251593555,3.54277002201964,1.70015368991908,TRUE +"EIF3D",3.1456873345638,2.80838608730384,-1.04638533549461,FALSE +"IL2RB",1.07703697479522,3.52569334603516,0.0929959100993111,FALSE +"LGALS2",2.34537707362106,3.68218825129432,3.02007345219663,TRUE +"EIF3L",3.55411882736079,2.47934890932978,-0.656313670014485,FALSE +"ADSL",2.11303477285882,3.25989089946784,-0.52782087236007,FALSE +"RBX1",2.86726791020208,3.05150916596198,-0.550201081230497,FALSE +"TTC38",0.993488234346266,3.51766916363223,0.163733597494548,FALSE +"TYMP",3.14942249530857,3.24050437387103,0.871207781742147,FALSE +"CCT8",2.72267647287639,3.02332133497672,-1.10851886068876,FALSE +"SOD1",3.37875548385482,2.66646555338911,-0.891354759552662,FALSE +"PAXBP1",0.425662638175597,3.47008375124559,-0.246433136193615,FALSE +"ATP5O",3.4277180993434,2.55583373605459,-0.391130541226468,FALSE +"MRPS6",2.32597825960564,3.27872423956319,0.0641495925638163,FALSE +"TTC3",1.59182076431075,3.38937472893264,-0.486295923304141,FALSE +"U2AF1",3.15925424977627,2.79930398551865,-1.08668859600157,FALSE +"CSTB",3.4772808013323,2.56546395439329,-0.357741285614294,FALSE +"SUMO3",2.51254534173561,3.17021610371403,-0.730820413173816,FALSE +"ITGB2",3.51163693858791,2.60117887552272,-0.233912874999023,FALSE +"S100B",1.30307756616295,3.70544932468219,1.45530430679135,TRUE +"PRMT2",2.53377804135866,3.233181935983,0.274016174151852,FALSE +"MT-ND3",2.1881501449375,3.30109707049301,-0.203278360969233,FALSE diff --git a/scanpy/tests/_scripts/seurat_hvg_v3.csv.gz b/scanpy/tests/_scripts/seurat_hvg_v3.dat.gz similarity index 100% rename from scanpy/tests/_scripts/seurat_hvg_v3.csv.gz rename to scanpy/tests/_scripts/seurat_hvg_v3.dat.gz diff --git a/scanpy/tests/_scripts/seurat_hvg_v3_batch.csv b/scanpy/tests/_scripts/seurat_hvg_v3_batch.dat similarity index 100% rename from scanpy/tests/_scripts/seurat_hvg_v3_batch.csv rename to scanpy/tests/_scripts/seurat_hvg_v3_batch.dat diff --git a/scanpy/tests/test_highly_variable_genes.py b/scanpy/tests/test_highly_variable_genes.py index 0ef36643cc..98204a1a2a 100644 --- a/scanpy/tests/test_highly_variable_genes.py +++ b/scanpy/tests/test_highly_variable_genes.py @@ -1,6 +1,7 @@ from __future__ import annotations from pathlib import Path +from typing import Literal import numpy as np import pandas as pd @@ -13,8 +14,9 @@ from scanpy.testing._pytest.marks import needs FILE = Path(__file__).parent / Path("_scripts/seurat_hvg.csv") -FILE_V3 = Path(__file__).parent / Path("_scripts/seurat_hvg_v3.csv.gz") -FILE_V3_BATCH = Path(__file__).parent / Path("_scripts/seurat_hvg_v3_batch.csv") +FILE_V3 = Path(__file__).parent / Path("_scripts/seurat_hvg_v3.dat.gz") +FILE_V3_BATCH = Path(__file__).parent / Path("_scripts/seurat_hvg_v3_batch.dat") +FILE_CELL_RANGER = Path(__file__).parent / "_scripts/cell_ranger_hvg.csv" def test_highly_variable_genes_runs(): @@ -314,39 +316,65 @@ def test_highly_variable_genes_pearson_residuals_batch( assert len(output_df) == n_genes -def test_highly_variable_genes_compare_to_seurat(): - seurat_hvg_info = pd.read_csv(FILE, sep=" ") +@pytest.mark.parametrize("func", ["hvg", "fgd"]) +@pytest.mark.parametrize( + ("flavor", "params", "ref_path"), + [ + pytest.param( + "seurat", dict(min_mean=0.0125, max_mean=3, min_disp=0.5), FILE, id="seurat" + ), + pytest.param( + "cell_ranger", dict(n_top_genes=100), FILE_CELL_RANGER, id="cell_ranger" + ), + ], +) +def test_compare_to_upstream( + request: pytest.FixtureRequest, + func: Literal["hvg", "fgd"], + flavor: Literal["seurat", "cell_ranger"], + params: dict[str, float | int], + ref_path: Path, +): + if func == "fgd" and flavor == "cell_ranger": + msg = "The deprecated filter_genes_dispersion behaves differently with cell_ranger" + request.node.add_marker(pytest.mark.xfail(reason=msg)) + hvg_info = pd.read_csv(ref_path) pbmc = pbmc68k_reduced() pbmc.X = pbmc.raw.X pbmc.var_names_make_unique() sc.pp.normalize_per_cell(pbmc, counts_per_cell_after=1e4) - sc.pp.log1p(pbmc) - sc.pp.highly_variable_genes( - pbmc, flavor="seurat", min_mean=0.0125, max_mean=3, min_disp=0.5, inplace=True - ) + if func == "hvg": + sc.pp.log1p(pbmc) + sc.pp.highly_variable_genes(pbmc, flavor=flavor, **params, inplace=True) + elif func == "fgd": + sc.pp.filter_genes_dispersion( + pbmc, flavor=flavor, **params, log=True, subset=False + ) + else: + raise AssertionError() np.testing.assert_array_equal( - seurat_hvg_info["highly_variable"], pbmc.var["highly_variable"] + hvg_info["highly_variable"], pbmc.var["highly_variable"] ) # (still) Not equal to tolerance rtol=2e-05, atol=2e-05 # np.testing.assert_allclose(4, 3.9999, rtol=2e-05, atol=2e-05) np.testing.assert_allclose( - seurat_hvg_info["means"], + hvg_info["means"], pbmc.var["means"], rtol=2e-05, atol=2e-05, ) np.testing.assert_allclose( - seurat_hvg_info["dispersions"], + hvg_info["dispersions"], pbmc.var["dispersions"], rtol=2e-05, atol=2e-05, ) np.testing.assert_allclose( - seurat_hvg_info["dispersions_norm"], + hvg_info["dispersions_norm"], pbmc.var["dispersions_norm"], rtol=2e-05, atol=2e-05, @@ -424,50 +452,6 @@ def test_highly_variable_genes_seurat_v3_warning(): sc.pp.highly_variable_genes(pbmc, flavor="seurat_v3") -def test_filter_genes_dispersion_compare_to_seurat(): - seurat_hvg_info = pd.read_csv(FILE, sep=" ") - - pbmc = pbmc68k_reduced() - pbmc.X = pbmc.raw.X - pbmc.var_names_make_unique() - - sc.pp.normalize_per_cell(pbmc, counts_per_cell_after=1e4) - sc.pp.filter_genes_dispersion( - pbmc, - flavor="seurat", - log=True, - subset=False, - min_mean=0.0125, - max_mean=3, - min_disp=0.5, - ) - - np.testing.assert_array_equal( - seurat_hvg_info["highly_variable"], pbmc.var["highly_variable"] - ) - - # (still) Not equal to tolerance rtol=2e-05, atol=2e-05: - # np.testing.assert_allclose(4, 3.9999, rtol=2e-05, atol=2e-05) - np.testing.assert_allclose( - seurat_hvg_info["means"], - pbmc.var["means"], - rtol=2e-05, - atol=2e-05, - ) - np.testing.assert_allclose( - seurat_hvg_info["dispersions"], - pbmc.var["dispersions"], - rtol=2e-05, - atol=2e-05, - ) - np.testing.assert_allclose( - seurat_hvg_info["dispersions_norm"], - pbmc.var["dispersions_norm"], - rtol=2e-05, - atol=2e-05, - ) - - def test_highly_variable_genes_batches(): adata = pbmc68k_reduced() adata[:100, :100].X = np.zeros((100, 100)) diff --git a/scanpy/tests/test_preprocessing_distributed.py b/scanpy/tests/test_preprocessing_distributed.py index aec8044d4c..6dfa78459d 100644 --- a/scanpy/tests/test_preprocessing_distributed.py +++ b/scanpy/tests/test_preprocessing_distributed.py @@ -74,11 +74,8 @@ def test_normalize_per_cell( request: pytest.FixtureRequest, adata: AnnData, adata_dist: AnnData ): if isinstance(adata_dist.X, DaskArray): - request.node.add_marker( - pytest.mark.xfail( - reason="normalize_per_cell deprecated and broken for Dask" - ) - ) + msg = "normalize_per_cell deprecated and broken for Dask" + request.node.add_marker(pytest.mark.xfail(reason=msg)) normalize_per_cell(adata_dist) assert isinstance(adata_dist.X, DIST_TYPES) result = materialize_as_ndarray(adata_dist.X) From 0c82903db822324f28e5b04101381a6298f59f06 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Thu, 15 Feb 2024 09:56:21 +0100 Subject: [PATCH 10/54] Update log handling (#2855) --- scanpy/logging.py | 10 ++++----- scanpy/tests/conftest.py | 40 +++++++++++++++++++++++---------- scanpy/tests/test_logging.py | 43 +++++++++++++++++++++++++++++++----- 3 files changed, 69 insertions(+), 24 deletions(-) diff --git a/scanpy/logging.py b/scanpy/logging.py index b545a2f07c..6111b06483 100644 --- a/scanpy/logging.py +++ b/scanpy/logging.py @@ -76,18 +76,16 @@ def _set_log_file(settings: ScanpyConfig): h = logging.StreamHandler(file) if name is None else logging.FileHandler(name) h.setFormatter(_LogFormatter()) h.setLevel(root.level) - if len(root.handlers) == 1: - root.removeHandler(root.handlers[0]) - elif len(root.handlers) > 1: - raise RuntimeError("Scanpy’s root logger somehow got more than one handler") + for handler in list(root.handlers): + root.removeHandler(handler) root.addHandler(h) def _set_log_level(settings: ScanpyConfig, level: int): root = settings._root_logger root.setLevel(level) - (h,) = root.handlers # may only be 1 - h.setLevel(level) + for h in list(root.handlers): + h.setLevel(level) class _LogFormatter(logging.Formatter): diff --git a/scanpy/tests/conftest.py b/scanpy/tests/conftest.py index 5e91634b6d..4c92245f27 100644 --- a/scanpy/tests/conftest.py +++ b/scanpy/tests/conftest.py @@ -11,6 +11,7 @@ if TYPE_CHECKING: # So editors understand that we’re using those fixtures import os + from collections.abc import Generator from scanpy.testing._pytest.fixtures import * # noqa: F403 @@ -18,25 +19,40 @@ IMPORTED = frozenset(sys.modules.keys()) -def clear_loggers(): - """Remove handlers from all loggers - - Fixes: https://github.com/scverse/scanpy/issues/1736 +@pytest.fixture(scope="session", autouse=True) +def _manage_log_handlers() -> Generator[None, None, None]: + """Remove handlers from all loggers on session teardown. - Code from: https://github.com/pytest-dev/pytest/issues/5502#issuecomment-647157873 + Fixes . + See also . """ import logging - loggers = [logging.getLogger()] + list(logging.Logger.manager.loggerDict.values()) + import scanpy as sc + + yield + + loggers = [ + sc.settings._root_logger, + logging.getLogger(), + *logging.Logger.manager.loggerDict.values(), + ] for logger in loggers: - handlers = getattr(logger, "handlers", []) - for handler in handlers: - logger.removeHandler(handler) + if not isinstance(logger, logging.Logger): + continue # loggerDict can contain `logging.Placeholder`s + for handler in logger.handlers[:]: + if isinstance(handler, logging.StreamHandler): + logger.removeHandler(handler) -@pytest.fixture(scope="session", autouse=True) -def close_logs_on_teardown(request): - request.addfinalizer(clear_loggers) +@pytest.fixture(autouse=True) +def _caplog_adapter(caplog: pytest.LogCaptureFixture) -> Generator[None, None, None]: + """Allow use of scanpy’s logger with caplog""" + import scanpy as sc + + sc.settings._root_logger.addHandler(caplog.handler) + yield + sc.settings._root_logger.removeHandler(caplog.handler) @pytest.fixture diff --git a/scanpy/tests/test_logging.py b/scanpy/tests/test_logging.py index 45f0b62b51..3f8a3ee97d 100644 --- a/scanpy/tests/test_logging.py +++ b/scanpy/tests/test_logging.py @@ -21,6 +21,22 @@ def test_defaults(): assert s.logpath is None +def test_records(caplog: pytest.LogCaptureFixture): + s.verbosity = Verbosity.debug + log.error("0") + log.warning("1") + log.info("2") + log.hint("3") + log.debug("4") + assert caplog.record_tuples == [ + ("root", 40, "0"), + ("root", 30, "1"), + ("root", 20, "2"), + ("root", 15, "3"), + ("root", 10, "4"), + ] + + def test_formats(capsys: pytest.CaptureFixture): s.logfile = sys.stderr s.verbosity = Verbosity.debug @@ -50,7 +66,7 @@ def test_deep(capsys: pytest.CaptureFixture): assert capsys.readouterr().err == "--> 3: 3!\n" -def test_logfile(tmp_path: Path): +def test_logfile(tmp_path: Path, caplog: pytest.LogCaptureFixture): s.verbosity = Verbosity.hint io = StringIO() @@ -60,6 +76,9 @@ def test_logfile(tmp_path: Path): log.error("test!") assert io.getvalue() == "ERROR: test!\n" + # setting a logfile removes all handlers + assert not caplog.records + p = tmp_path / "test.log" s.logpath = p assert s.logpath == p @@ -68,6 +87,9 @@ def test_logfile(tmp_path: Path): log.debug("invisible") assert s.logpath.read_text() == "--> test2\n" + # setting a logfile removes all handlers + assert not caplog.records + def test_timing(monkeypatch, capsys: pytest.CaptureFixture): counter = 0 @@ -84,15 +106,24 @@ def now(tz): s.verbosity = Verbosity.debug log.hint("1") - assert counter == 1 and capsys.readouterr().err == "--> 1\n" + assert counter == 1 + assert capsys.readouterr().err == "--> 1\n" + start = log.info("2") - assert counter == 2 and capsys.readouterr().err == "2\n" + assert counter == 2 + assert capsys.readouterr().err == "2\n" + log.hint("3") - assert counter == 3 and capsys.readouterr().err == "--> 3\n" + assert counter == 3 + assert capsys.readouterr().err == "--> 3\n" + log.info("4", time=start) - assert counter == 4 and capsys.readouterr().err == "4 (0:00:02)\n" + assert counter == 4 + assert capsys.readouterr().err == "4 (0:00:02)\n" + log.info("5 {time_passed}", time=start) - assert counter == 5 and capsys.readouterr().err == "5 0:00:03\n" + assert counter == 5 + assert capsys.readouterr().err == "5 0:00:03\n" @pytest.mark.parametrize( From 82f84129ed895dfdded3111b98aa4dc2ae5d4887 Mon Sep 17 00:00:00 2001 From: Eljas Roellin <65244425+eroell@users.noreply.github.com> Date: Thu, 15 Feb 2024 10:19:07 +0100 Subject: [PATCH 11/54] `sc.pp.highly_variable_genes(adata, flavor="seurat_v3")` consistency improvement and implementation discussion (#2792) Co-authored-by: Philipp A. Co-authored-by: Eljas Roellin --- docs/release-notes/1.10.0.md | 1 + .../preprocessing/_highly_variable_genes.py | 62 +- scanpy/tests/_scripts/seurat_extract_hvg_v3.r | 65 +- scanpy/tests/_scripts/seurat_hvg_v3.csv.gz | Bin 0 -> 324220 bytes scanpy/tests/_scripts/seurat_hvg_v3.dat.gz | Bin 397058 -> 0 bytes scanpy/tests/_scripts/seurat_hvg_v3_batch.csv | 2001 +++++++++ scanpy/tests/_scripts/seurat_hvg_v3_batch.dat | 4001 ----------------- scanpy/tests/test_highly_variable_genes.py | 65 +- 8 files changed, 2108 insertions(+), 4087 deletions(-) create mode 100644 scanpy/tests/_scripts/seurat_hvg_v3.csv.gz delete mode 100644 scanpy/tests/_scripts/seurat_hvg_v3.dat.gz create mode 100644 scanpy/tests/_scripts/seurat_hvg_v3_batch.csv delete mode 100644 scanpy/tests/_scripts/seurat_hvg_v3_batch.dat diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 3e47d20a15..323ad85d64 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -16,6 +16,7 @@ * {func}`scanpy.pp.pca`, {func}`scanpy.pp.scale`, {func}`scanpy.pl.embedding`, and {func}`scanpy.experimental.pp.normalize_pearson_residuals_pca` now support a `mask` parameter {pr}`2272` {smaller}`C Bright, T Marcella, & P Angerer` * {func}`scanpy.tl.rank_genes_groups` no longer warns that it's default was changed from t-test_overestim_var to t-test {pr}`2798` {smaller}`L Heumos` +* {func}`scanpy.pp.highly_variable_genes` has new flavor `seurat_v3_paper` that is in its implementation consistent with the paper description in Stuart et al 2018. {pr}`2792` {smaller}`E Roellin` ```{rubric} Docs ``` diff --git a/scanpy/preprocessing/_highly_variable_genes.py b/scanpy/preprocessing/_highly_variable_genes.py index 5dd28c8748..3366b93970 100644 --- a/scanpy/preprocessing/_highly_variable_genes.py +++ b/scanpy/preprocessing/_highly_variable_genes.py @@ -21,6 +21,7 @@ def _highly_variable_genes_seurat_v3( adata: AnnData, *, + flavor: str = "seurat_v3", layer: str | None = None, n_top_genes: int = 2000, batch_key: str | None = None, @@ -64,7 +65,7 @@ def _highly_variable_genes_seurat_v3( if check_values and not check_nonnegative_integers(X): warnings.warn( - "`flavor='seurat_v3'` expects raw count data, but non-integers were found.", + f"`flavor='{flavor}'` expects raw count data, but non-integers were found.", UserWarning, ) @@ -133,24 +134,28 @@ def _highly_variable_genes_seurat_v3( ma_ranked = np.ma.masked_invalid(ranked_norm_gene_vars) median_ranked = np.ma.median(ma_ranked, axis=0).filled(np.nan) + df["gene_name"] = df.index df["highly_variable_nbatches"] = num_batches_high_var df["highly_variable_rank"] = median_ranked df["variances_norm"] = np.mean(norm_gene_vars, axis=0) - + if flavor == "seurat_v3": + sort_cols = ["highly_variable_rank", "highly_variable_nbatches"] + sort_ascending = [True, False] + elif flavor == "seurat_v3_paper": + sort_cols = ["highly_variable_nbatches", "highly_variable_rank"] + sort_ascending = [False, True] + else: + raise ValueError(f"Did not recognize flavor {flavor}") sorted_index = ( - df[["highly_variable_rank", "highly_variable_nbatches"]] - .sort_values( - ["highly_variable_rank", "highly_variable_nbatches"], - ascending=[True, False], - na_position="last", - ) + df[sort_cols] + .sort_values(sort_cols, ascending=sort_ascending, na_position="last") .index ) df["highly_variable"] = False df.loc[sorted_index[: int(n_top_genes)], "highly_variable"] = True if inplace: - adata.uns["hvg"] = {"flavor": "seurat_v3"} + adata.uns["hvg"] = {"flavor": flavor} logg.hint( "added\n" " 'highly_variable', boolean vector (adata.var)\n" @@ -332,7 +337,7 @@ def highly_variable_genes( max_mean: float | None = 3, span: float = 0.3, n_bins: int = 20, - flavor: Literal["seurat", "cell_ranger", "seurat_v3"] = "seurat", + flavor: Literal["seurat", "cell_ranger", "seurat_v3", "seurat_v3_paper"] = "seurat", subset: bool = False, inplace: bool = True, batch_key: str | None = None, @@ -341,12 +346,13 @@ def highly_variable_genes( """\ Annotate highly variable genes [Satija15]_ [Zheng17]_ [Stuart19]_. - Expects logarithmized data, except when `flavor='seurat_v3'`, in which count + Expects logarithmized data, except when `flavor='seurat_v3'`/`'seurat_v3_paper'`, in which count data is expected. Depending on `flavor`, this reproduces the R-implementations of Seurat - [Satija15]_, Cell Ranger [Zheng17]_, and Seurat v3 [Stuart19]_. Seurat v3 flavor - requires `scikit-misc` package. If you plan to use this flavor, consider + [Satija15]_, Cell Ranger [Zheng17]_, and Seurat v3 [Stuart19]_. + + `'seurat_v3'`/`'seurat_v3_paper'` requires `scikit-misc` package. If you plan to use this flavor, consider installing `scanpy` with this optional dependency: `scanpy[skmisc]`. For the dispersion-based methods (`flavor='seurat'` [Satija15]_ and @@ -355,13 +361,20 @@ def highly_variable_genes( falling into a given bin for mean expression of genes. This means that for each bin of mean expression, highly variable genes are selected. - For `flavor='seurat_v3'` [Stuart19]_, a normalized variance for each gene + For `flavor='seurat_v3'`/`'seurat_v3_paper'` [Stuart19]_, a normalized variance for each gene is computed. First, the data are standardized (i.e., z-score normalization per feature) with a regularized standard deviation. Next, the normalized variance is computed as the variance of each gene after the transformation. Genes are ranked by the normalized variance. + Only if `batch_key` is not `None`, the two flavors differ: For `flavor='seurat_v3'`, genes are first sorted by the median (across batches) rank, with ties broken by the number of batches a gene is a HVG. + For `flavor='seurat_v3_paper'`, genes are first sorted by the number of batches a gene is a HVG, with ties broken by the median (across batches) rank. + + The following may help when comparing to Seurat's naming: + If `batch_key=None` and `flavor='seurat'`, this mimics Seurat's `FindVariableFeatures(…, method='mean.var.plot')`. + If `batch_key=None` and `flavor='seurat_v3'`/`flavor='seurat_v3_paper'`, this mimics Seurat's `FindVariableFeatures(..., method='vst')`. + If `batch_key` is not `None` and `flavor='seurat_v3_paper'`, this mimics Seurat's `SelectIntegrationFeatures`. - See also `scanpy.experimental.pp._highly_variable_genes` for additional flavours + See also `scanpy.experimental.pp._highly_variable_genes` for additional flavors (e.g. Pearson residuals). Parameters @@ -405,13 +418,13 @@ def highly_variable_genes( batch_key If specified, highly-variable genes are selected within each batch separately and merged. This simple process avoids the selection of batch-specific genes and acts as a - lightweight batch correction method. For all flavors, genes are first sorted + lightweight batch correction method. For all flavors, except `seurat_v3`, genes are first sorted by how many batches they are a HVG. For dispersion-based flavors ties are broken - by normalized dispersion. If `flavor = 'seurat_v3'`, ties are broken by the median + by normalized dispersion. For `flavor = 'seurat_v3_paper'`, ties are broken by the median (across batches) rank based on within-batch normalized variance. check_values Check if counts in selected layer are integers. A Warning is returned if set to True. - Only used if `flavor='seurat_v3'`. + Only used if `flavor='seurat_v3'`/`'seurat_v3_paper'`. Returns ------- @@ -426,13 +439,13 @@ def highly_variable_genes( `adata.var['dispersions_norm']` : :class:`pandas.Series` (dtype `float`) For dispersion-based flavors, normalized dispersions per gene `adata.var['variances']` : :class:`pandas.Series` (dtype `float`) - For `flavor='seurat_v3'`, variance per gene - `adata.var['variances_norm']` : :class:`pandas.Series` (dtype `float`) - For `flavor='seurat_v3'`, normalized variance per gene, averaged in + For `flavor='seurat_v3'`/`'seurat_v3_paper'`, variance per gene + `adata.var['variances_norm']`/`'seurat_v3_paper'` : :class:`pandas.Series` (dtype `float`) + For `flavor='seurat_v3'`/`'seurat_v3_paper'`, normalized variance per gene, averaged in the case of multiple batches `adata.var['highly_variable_rank']` : :class:`pandas.Series` (dtype `float`) - For `flavor='seurat_v3'`, rank of the gene according to normalized - variance, median rank in the case of multiple batches + For `flavor='seurat_v3'`/`'seurat_v3_paper'`, rank of the gene according to normalized + variance, in case of multiple batches description above `adata.var['highly_variable_nbatches']` : :class:`pandas.Series` (dtype `int`) If batch_key is given, this denotes in how many batches genes are detected as HVG `adata.var['highly_variable_intersection']` : :class:`pandas.Series` (dtype `bool`) @@ -456,12 +469,13 @@ def highly_variable_genes( "pass `inplace=False` if you want to return a `pd.DataFrame`." ) - if flavor == "seurat_v3": + if flavor in {"seurat_v3", "seurat_v3_paper"}: if n_top_genes is None: sig = signature(_highly_variable_genes_seurat_v3) n_top_genes = cast(int, sig.parameters["n_top_genes"].default) return _highly_variable_genes_seurat_v3( adata, + flavor=flavor, layer=layer, n_top_genes=n_top_genes, batch_key=batch_key, diff --git a/scanpy/tests/_scripts/seurat_extract_hvg_v3.r b/scanpy/tests/_scripts/seurat_extract_hvg_v3.r index c33967d5ea..a6d6d86f66 100644 --- a/scanpy/tests/_scripts/seurat_extract_hvg_v3.r +++ b/scanpy/tests/_scripts/seurat_extract_hvg_v3.r @@ -1,48 +1,45 @@ -library(Seurat) -library(reticulate) -use_python("/usr/local/bin/python3") - -sc <- import("scanpy", convert=FALSE) +# This script generates the reference test data "seurat_hvg_v3.csv" (this file is compressed to .gz afterwards) and "seurat_hvg_v3_batch.csv" +# Requires to load the data from this link: https://cf.10xgenomics.com/samples/cell/pbmc3k/pbmc3k_filtered_gene_bc_matrices.tar.gz -ad <- sc$datasets$pbmc3k() -ad$X <- ad$X$toarray() - -ad$var_names_make_unique() +library(dplyr) +library(Seurat) +library(patchwork) -sc$pp$highly_variable_genes(ad, n_top_genes=1000, flavor="seurat_v3") +################################################################################ +### FindVariableFeatures (no batch covariate) +# Load the PBMC dataset - load the data from the link above! +# pbmc.data <- Read10X(data.dir = "/filtered_gene_bc_matrices/hg19/") +pbmc.data <- Read10X(data.dir = "/Users/eljas.roellin/Documents/R_stuff/filtered_gene_bc_matrices/hg19/") -X <- py_to_r(ad$X$T) -bc <- py_to_r(ad$obs_names$tolist()) -colnames(X) <- bc -genes <- py_to_r(ad$var_names$tolist()) -rownames(X) <- genes +# Initialize the Seurat object with the raw (non-normalized data). +pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200) +pbmc -sr <- CreateSeuratObject(counts = X) -ad_hvg <- py_to_r(ad$var["highly_variable"]) -ad_hvg <- names(ad_hvg[ad_hvg]) +pbmc <- FindVariableFeatures(pbmc, mean.function=ExpMean, selection.method = 'vst', nfeatures = 2000) -sr <- FindVariableFeatures(object = sr, selection.method = "vst", nfeatures = 1000) -sr_hvg <- sr@assays$RNA@var.features +hvf_info <- HVFInfo(pbmc) -print(all(sr_hvg==ad_hvg)) +write.csv(hvf_info, "seurat_hvg_v3.csv") -hvg_info <- as.data.frame(HVFInfo(sr)) -hvg_info <- cbind(hvg_info, rownames(hvg_info) %in% sr_hvg) -colnames(hvg_info) <- c("means", "variances", "variances_norm", "highly_variable") +################################################################################ +### SelectIntegrationFeatures (with batch covariate) -write.table(hvg_info, "seurat_hvg_v3.dat") +# introduce dummy "technical covariates" +pbmc.data <- Read10X(data.dir = "/Users/eljas.roellin/Documents/R_stuff/filtered_gene_bc_matrices/hg19/") -X_1 = X[, 1:1500] -X_2 = X[, 1501:ncol(X)] +# Initialize the Seurat object with the raw (non-normalized data). +pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k_2", min.cells = 3, min.features = 200) +pbmc -sr1 <- CreateSeuratObject(counts = X_1) -sr2 <- CreateSeuratObject(counts = X_2) +pbmc@meta.data["dummy_tech"] = "source_1" +pbmc@meta.data[501:1001, "dummy_tech"] = "source_2" +pbmc@meta.data[1001:1500, "dummy_tech"] = "source_3" +pbmc@meta.data[1501:2000, "dummy_tech"] = "source_4" +pbmc@meta.data[2001:nrow(pbmc@meta.data), "dummy_tech"] = "source_5" -sr1 <- FindVariableFeatures(object = sr1, selection.method = "vst", nfeatures = 4000) -sr2 <- FindVariableFeatures(object = sr2, selection.method = "vst", nfeatures = 4000) +pbmc_list = SplitObject(pbmc, split.by='dummy_tech') -srs = list(sr1, sr2) +features = SelectIntegrationFeatures(pbmc_list) -features <- SelectIntegrationFeatures(srs, nfeatures=4000) -write.table(features, "seurat_hvg_v3_batch.dat") +write.csv(features, "seurat_hvg_v3_batch.csv") diff --git a/scanpy/tests/_scripts/seurat_hvg_v3.csv.gz b/scanpy/tests/_scripts/seurat_hvg_v3.csv.gz new file mode 100644 index 0000000000000000000000000000000000000000..d85f5d37da3b100f226316fc43707ec6d65ea454 GIT binary patch literal 324220 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
rIwt)^SPJbqjKp<=$Sr_YYw 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

&ZlZ1(RmBKc;NzvW@3 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 B*`fdd literal 0 HcmV?d00001 diff --git a/scanpy/tests/_scripts/seurat_hvg_v3.dat.gz b/scanpy/tests/_scripts/seurat_hvg_v3.dat.gz deleted file mode 100644 index a2bb673946a9b5fd66a1484fa6e8fcd9f57b4758..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 397058 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 diff --git a/scanpy/tests/_scripts/seurat_hvg_v3_batch.csv b/scanpy/tests/_scripts/seurat_hvg_v3_batch.csv new file mode 100644 index 0000000000..bfab158784 --- /dev/null +++ b/scanpy/tests/_scripts/seurat_hvg_v3_batch.csv @@ -0,0 +1,2001 @@ +"","x" +"1","LYZ" +"2","GNLY" +"3","S100A9" +"4","FTL" +"5","FTH1" +"6","S100A8" +"7","HLA-DRA" +"8","CST3" +"9","CD74" +"10","NKG7" +"11","GZMB" +"12","IGLL5" +"13","HLA-DPB1" +"14","FCER1A" +"15","CCL4" +"16","HLA-DRB1" +"17","PPBP" +"18","FCGR3A" +"19","PF4" +"20","GNG11" +"21","CCL5" +"22","LST1" +"23","HLA-DPA1" +"24","FCN1" +"25","CD79A" +"26","CCL3" +"27","FCER1G" +"28","FGFBP2" +"29","TYROBP" +"30","GZMH" +"31","HLA-DQA1" +"32","IFITM3" +"33","GZMK" +"34","AIF1" +"35","APOBEC3B" +"36","CLEC10A" +"37","IFI27" +"38","AL928768.3" +"39","PRDX1" +"40","S100B" +"41","STMN1" +"42","GIMAP5" +"43","ACTB" +"44","C1QA" +"45","CLU" +"46","WARS" +"47","LGALS2" +"48","HLA-DQB1" +"49","STK17A" +"50","SAT1" +"51","CST7" +"52","G0S2" +"53","RALY" +"54","TUBA1B" +"55","GIMAP4" +"56","PRF1" +"57","IL8" +"58","YWHAB" +"59","C1QB" +"60","TUBB1" +"61","ATP5H" +"62","MYL9" +"63","CTSS" +"64","CD9" +"65","GSTO1" +"66","COTL1" +"67","LGALS1" +"68","CD1C" +"69","TREML1" +"70","HLA-DRB5" +"71","GP9" +"72","GZMA" +"73","NPC2" +"74","LTB" +"75","SPARC" +"76","HLA-DMA" +"77","MZB1" +"78","S100A4" +"79","HMGB2" +"80","KIAA0101" +"81","APOBEC3A" +"82","IGSF6" +"83","SPON2" +"84","CLIC3" +"85","ANXA1" +"86","MS4A6A" +"87","VMO1" +"88","GAPDH" +"89","IL1B" +"90","TMEM40" +"91","GSTP1" +"92","TCL1A" +"93","C10orf32" +"94","TNFRSF13B" +"95","SDPR" +"96","CDKN1C" +"97","RETN" +"98","IGJ" +"99","H2AFY" +"100","TMEM219" +"101","IL7R" +"102","TALDO1" +"103","TYMS" +"104","MS4A7" +"105","TMSB4X" +"106","S100A11" +"107","PYCARD" +"108","CXCL2" +"109","ABI3" +"110","HOPX" +"111","SWAP70" +"112","SPTSSB" +"113","CFD" +"114","S100A12" +"115","PSAP" +"116","ISG15" +"117","ABT1" +"118","AKR1C3" +"119","BIRC5" +"120","NCF2" +"121","VAMP8" +"122","CDA" +"123","TK1" +"124","PHACTR4" +"125","CEBPB" +"126","HES1" +"127","CD37" +"128","PRKCD" +"129","SRSF3" +"130","ANXA5" +"131","PLA2G12A" +"132","TMEM176A" +"133","GPX1" +"134","FCGR2B" +"135","ARPC1B" +"136","TYMP" +"137","CTD-2267D19.2" +"138","CAT" +"139","HBA1" +"140","SNX3" +"141","NRGN" +"142","TIMP1" +"143","IRF7" +"144","RAB32" +"145","RHOG" +"146","PRSS57" +"147","LYPD2" +"148","TNFSF13B" +"149","CKB" +"150","LILRB2" +"151","ZWINT" +"152","RP11-290F20.3" +"153","CA2" +"154","SCPEP1" +"155","NT5C3A" +"156","TPM4" +"157","ITM2C" +"158","CRIP2" +"159","XCL1" +"160","XCL2" +"161","IFIT2" +"162","MCM5" +"163","SLC39A3" +"164","GCA" +"165","RP1-313I6.12" +"166","TUBB" +"167","HN1" +"168","H2AFZ" +"169","CCDC50" +"170","CCL4L1" +"171","ATP5O" +"172","RBP7" +"173","GMNN" +"174","KRT1" +"175","SLC25A11" +"176","CCT7" +"177","ARHGDIA" +"178","RP5-887A10.1" +"179","ID1" +"180","UBXN1" +"181","GMPR" +"182","UBE2D3" +"183","HIST1H4C" +"184","FKBP2" +"185","FPR1" +"186","PGRMC1" +"187","UBB" +"188","IFNGR2" +"189","COPS6" +"190","COQ7" +"191","PSMA7" +"192","RP11-291B21.2" +"193","RBM3" +"194","MED30" +"195","PRELID1" +"196","PPP1R14A" +"197","NIT1" +"198","TNFRSF17" +"199","ATP6V0E1" +"200","ITGA2B" +"201","ZNF263" +"202","CHTF8" +"203","C1orf162" +"204","PTAFR" +"205","VPREB3" +"206","MANBA" +"207","HLA-DQA2" +"208","RARRES3" +"209","PPIB" +"210","SNRNP25" +"211","ARL6IP5" +"212","ASF1B" +"213","PRPF19" +"214","KLRC1" +"215","SH3BP1" +"216","RGS1" +"217","VPS29" +"218","ABRACL" +"219","HNRNPA2B1" +"220","SERPINA1" +"221","S100A6" +"222","MT-CO2" +"223","TRAPPC3" +"224","FERMT3" +"225","APOBEC3H" +"226","GPR183" +"227","LGALS3BP" +"228","PGM1" +"229","FAM96B" +"230","PSMB8" +"231","HSP90AA1" +"232","TMSB10" +"233","LILRA3" +"234","IL32" +"235","SRSF6" +"236","GNS" +"237","SF3B5" +"238","IDH2" +"239","ANAPC11" +"240","CENPN" +"241","IFI35" +"242","NCR3" +"243","RRM2" +"244","BLOC1S1" +"245","ERH" +"246","C19orf59" +"247","SRGN" +"248","MRPL23" +"249","SLA" +"250","MRP63" +"251","PITPNA-AS1" +"252","EPN1" +"253","DCAF5" +"254","IDH3G" +"255","PTCRA" +"256","C14orf166" +"257","RAMP1" +"258","RABL6" +"259","TIGIT" +"260","PCNA" +"261","CD160" +"262","MS4A4A" +"263","SIVA1" +"264","LSM6" +"265","RBM17" +"266","RGS16" +"267","ZNF185" +"268","SNX9" +"269","EGFL7" +"270","SELL" +"271","RBCK1" +"272","ACP1" +"273","PMVK" +"274","CAPZA2" +"275","PRKCB" +"276","SH3BGRL3" +"277","COX5A" +"278","CWC15" +"279","ISOC2" +"280","GINS2" +"281","IFIT1" +"282","GSTA4" +"283","CD14" +"284","KARS" +"285","MANF" +"286","STAMBP" +"287","NAA20" +"288","FEN1" +"289","FCRL2" +"290","TNFSF10" +"291","ACRBP" +"292","CLEC2B" +"293","CHI3L2" +"294","DDT" +"295","ACAP1" +"296","IL18RAP" +"297","PCNP" +"298","HAGH" +"299","BIK" +"300","GUSB" +"301","SRM" +"302","CHMP4A" +"303","SOX4" +"304","IRF8" +"305","IFITM2" +"306","C16orf13" +"307","VAPA" +"308","SLC25A5" +"309","ENHO" +"310","EIF3H" +"311","HNRNPH3" +"312","NDUFA12" +"313","CTD-2006K23.1" +"314","PPM1N" +"315","IFI6" +"316","IFNG" +"317","NDFIP1" +"318","AHNAK" +"319","SERPINF1" +"320","BLK" +"321","SRSF7" +"322","DSCR3" +"323","HNRNPF" +"324","SEC61B" +"325","GPBAR1" +"326","CSNK2B" +"327","HMOX1" +"328","SEPT5" +"329","NIT2" +"330","HNRNPM" +"331","IER3" +"332","SP140" +"333","RP11-295P9.3" +"334","ZBP1" +"335","SMIM7" +"336","EREG" +"337","SURF1" +"338","BANK1" +"339","MALAT1" +"340","SLC40A1" +"341","ALDH2" +"342","POLR2G" +"343","TMEM141" +"344","PTGDS" +"345","RGS18" +"346","C5orf15" +"347","NSA2" +"348","ACTG1" +"349","SDHB" +"350","IFI30" +"351","UBE2D2" +"352","IL6" +"353","CD79B" +"354","PHLDA2" +"355","NCOA4" +"356","C17orf62" +"357","TMEM208" +"358","HIST1H2AC" +"359","S1PR4" +"360","SULF2" +"361","SARM1" +"362","PSMG2" +"363","VIM" +"364","ATP5D" +"365","XBP1" +"366","MS4A1" +"367","NDUFB9" +"368","BIN2" +"369","HES4" +"370","OAZ1" +"371","RUFY1" +"372","NOP58" +"373","TNNT1" +"374","CXCR3" +"375","CLIC2" +"376","FCRLA" +"377","FABP5" +"378","CFP" +"379","TPM1" +"380","ACOT7" +"381","CCND2" +"382","SH3BGRL" +"383","RBM39" +"384","SPRY1" +"385","LY6G6F" +"386","ANXA2" +"387","IGFBP7" +"388","GFI1B" +"389","PFN1" +"390","P2RY13" +"391","TRAF3IP3" +"392","PDLIM1" +"393","RP11-164H13.1" +"394","GFER" +"395","CMTM5" +"396","EZH2" +"397","PTTG1" +"398","SUMO3" +"399","FFAR2" +"400","LILRA4" +"401","CTSW" +"402","RAD51" +"403","NDUFA11" +"404","CCNA2" +"405","KCTD10" +"406","KIR3DL2" +"407","UBE2J1" +"408","CD8B" +"409","C6orf25" +"410","KIFC1" +"411","RP11-367G6.3" +"412","FCER2" +"413","DHRS9" +"414","MYBL2" +"415","TSPAN15" +"416","TRPM4" +"417","ARHGDIB" +"418","LINC00926" +"419","MAX" +"420","BATF3" +"421","EWSR1" +"422","MCM7" +"423","CENPM" +"424","IFFO1" +"425","KLRD1" +"426","ZNF703" +"427","SNX29P2" +"428","F13A1" +"429","PID1" +"430","IL13RA1" +"431","FAM212A" +"432","HAVCR2" +"433","AC022182.3" +"434","PPP6C" +"435","OSM" +"436","RHOC" +"437","KCNG1" +"438","CD72" +"439","NAGA" +"440","UBE2Q1" +"441","LPGAT1" +"442","MYCL" +"443","HBP1" +"444","KIR2DL3" +"445","FAM13A" +"446","STAP1" +"447","GGNBP2" +"448","FCRL5" +"449","RXRA" +"450","SH2D1B" +"451","UBA5" +"452","NFE2" +"453","ACSM3" +"454","CCR10" +"455","MAP3K7CL" +"456","FH" +"457","RCE1" +"458","NCOR2" +"459","TPPP3" +"460","FKBP3" +"461","GPR56" +"462","PPIL2" +"463","PILRA" +"464","AP001189.4" +"465","BASP1" +"466","DHRS4" +"467","NEIL1" +"468","TSC22D1" +"469","FCGRT" +"470","FBXO41" +"471","SPIB" +"472","DDX17" +"473","FCRL6" +"474","LDHB" +"475","LMNA" +"476","PLBD1" +"477","SLC4A10" +"478","AC079767.4" +"479","TSPAN4" +"480","CLEC7A" +"481","PLD4" +"482","HIST1H1B" +"483","TNNI2" +"484","CPNE2" +"485","RLN2" +"486","ALDH1A1" +"487","FRAT1" +"488","CLYBL" +"489","HLA-DMB" +"490","COCH" +"491","HCK" +"492","SYCE1L" +"493","TNFAIP8L1" +"494","MMD" +"495","TMEM176B" +"496","PRSS23" +"497","ZNF212" +"498","HCAR3" +"499","H1F0" +"500","VPS37C" +"501","TMEM140" +"502","SPI1" +"503","MAPK7" +"504","CD38" +"505","CTBP2" +"506","FAM43A" +"507","CACNA2D3" +"508","CHST2" +"509","RP13-188A5.1" +"510","RAB11B-AS1" +"511","SERPINE2" +"512","ADAP2" +"513","LILRB4" +"514","NDRG2" +"515","TNFRSF4" +"516","C12orf75" +"517","RP13-270P17.3" +"518","ZDHHC1" +"519","LMNB1" +"520","SPTLC1" +"521","HELQ" +"522","CLEC1B" +"523","POU2AF1" +"524","MKI67" +"525","HAPLN3" +"526","SERPING1" +"527","WARS2" +"528","S100A10" +"529","ADAM28" +"530","RPS2" +"531","FAH" +"532","HLA-DQB2" +"533","UBE2C" +"534","KIAA0930" +"535","MCM3" +"536","STXBP2" +"537","PHACTR1" +"538","CORO1C" +"539","HERC5" +"540","BLOC1S5" +"541","RP11-18H21.1" +"542","ZNF467" +"543","LILRA2" +"544","TOPBP1" +"545","PON2" +"546","RP11-407N17.5" +"547","KYNU" +"548","MCM4" +"549","KIF16B" +"550","RELT" +"551","SBNO2" +"552","ACSL1" +"553","RP11-428G5.5" +"554","PPP1R14B" +"555","EIF4A1" +"556","CD8A" +"557","ACBD3" +"558","SENCR" +"559","GSN" +"560","TCF7L2" +"561","PKIG" +"562","RP5-1028K7.2" +"563","NPDC1" +"564","QPCT" +"565","CCL3L3" +"566","LRRC25" +"567","SOD2" +"568","KIAA0125" +"569","EMR1" +"570","FCGR2A" +"571","RP11-403A21.2" +"572","RP11-1399P15.1" +"573","GRN" +"574","CD68" +"575","FOLR3" +"576","SYNGR1" +"577","EEPD1" +"578","CSTA" +"579","CAPN12" +"580","C9orf37" +"581","PPM1F" +"582","YBX1" +"583","C16orf74" +"584","STK32C" +"585","CXCR6" +"586","TTC38" +"587","NDUFAF7" +"588","AC011899.9" +"589","KLRB1" +"590","FCGR1A" +"591","ARHGAP24" +"592","CSF2RA" +"593","KCNQ1OT1" +"594","KHK" +"595","LYRM4" +"596","SLC7A7" +"597","CPVL" +"598","EPB41L3" +"599","LAMTOR4" +"600","SIGLEC9" +"601","YAE1D1" +"602","DIS3" +"603","STK3" +"604","CXCL16" +"605","DENND5A" +"606","MARCO" +"607","FBXO33" +"608","WDYHV1" +"609","WDR76" +"610","KLRF1" +"611","TUBG1" +"612","TMEM131" +"613","MOCS2" +"614","CEP170" +"615","EIF2AK4" +"616","CRCP" +"617","F2R" +"618","RP11-222K16.2" +"619","SMARCD3" +"620","DCTN4" +"621","LXN" +"622","TRAF4" +"623","BCDIN3D" +"624","CARD9" +"625","IL2RA" +"626","C19orf48" +"627","NEURL1" +"628","CAMK1" +"629","EGR1" +"630","TUBA1C" +"631","HLA-DOB" +"632","ADPRM" +"633","RP11-110A12.2" +"634","RCL1" +"635","WDR60" +"636","AIM2" +"637","XXbac-B135H6.15" +"638","RP11-792A8.4" +"639","ZSWIM8" +"640","SHMT1" +"641","DLEU1" +"642","RP11-554J4.1" +"643","PERP" +"644","MGLL" +"645","HOXB-AS1" +"646","ABHD5" +"647","ICAM4" +"648","CYBA" +"649","LGALS3" +"650","TNFRSF18" +"651","CD7" +"652","SLC48A1" +"653","ARIH2OS" +"654","MTMR11" +"655","EXOC3" +"656","REC8" +"657","LILRB1" +"658","SECTM1" +"659","MT1E" +"660","FAM110A" +"661","EMR2" +"662","CSF1R" +"663","RAB13" +"664","TFDP2" +"665","AC016629.8" +"666","WDR4" +"667","TNFRSF8" +"668","CDK12" +"669","SGK1" +"670","NBPF1" +"671","UBXN7" +"672","LILRA5" +"673","YIPF1" +"674","PAICS" +"675","STAG3" +"676","IFI27L1" +"677","SIGLEC10" +"678","LOH12CR2" +"679","CEBPD" +"680","PHLDA1" +"681","CTSL" +"682","ADAM17" +"683","TSPAN13" +"684","PNOC" +"685","GBE1" +"686","RPS17" +"687","PTMS" +"688","MARCH8" +"689","HIST1H2BC" +"690","ARID1B" +"691","HIST2H2BE" +"692","AP003733.1" +"693","RP11-25K19.1" +"694","LPAR5" +"695","DUS2" +"696","ACP2" +"697","C10orf11" +"698","ASRGL1" +"699","GMPPA" +"700","ZNF576" +"701","C12orf66" +"702","FCF1" +"703","GOLGA2" +"704","LIG1" +"705","C14orf142" +"706","TSPAN5" +"707","HSPA5" +"708","STX17" +"709","ITGAX" +"710","MT2A" +"711","LY6E" +"712","NR2C1" +"713","C17orf59" +"714","MFSD1" +"715","CDCA7L" +"716","AP001258.4" +"717","CCDC88A" +"718","B2M" +"719","MAPK8" +"720","UNG" +"721","RP11-727F15.9" +"722","CCDC18" +"723","KLF11" +"724","CD3D" +"725","LAG3" +"726","CLEC4E" +"727","RP11-138A9.2" +"728","SULT1A1" +"729","RP11-22N19.2" +"730","SH2B3" +"731","SHC1" +"732","USP7" +"733","DTYMK" +"734","ATF7IP2" +"735","SLAMF7" +"736","E2F3" +"737","FUT7" +"738","CDK16" +"739","SMPD2" +"740","CLEC4A" +"741","HSPA6" +"742","C2orf76" +"743","AC013264.2" +"744","CHST7" +"745","TCP11L2" +"746","APP" +"747","TRIB1" +"748","ZBTB43" +"749","PLAGL2" +"750","LPAR2" +"751","CTD-3138B18.5" +"752","TSHZ2" +"753","LTB4R" +"754","EMP3" +"755","DYNLL2" +"756","TCEA3" +"757","GNB1L" +"758","VSTM1" +"759","PGM2L1" +"760","KCNK6" +"761","MT-CO1" +"762","AGL" +"763","KCTD20" +"764","TAB2" +"765","TBC1D19" +"766","TPT1" +"767","ORC2" +"768","ANKRD32" +"769","CD27-AS1" +"770","RPL10A" +"771","CDK5" +"772","MLYCD" +"773","DHX8" +"774","LCN8" +"775","METTL2A" +"776","CHAF1A" +"777","SH2B2" +"778","RIPK3" +"779","CD180" +"780","RNF144B" +"781","C1orf21" +"782","MTIF2" +"783","DSE" +"784","THAP7-AS1" +"785","PRKAG2-AS1" +"786","GPR171" +"787","RAB34" +"788","HDGF" +"789","NACA" +"790","ROGDI" +"791","MAP7D3" +"792","EPOR" +"793","RNF157" +"794","CKS2" +"795","AGPAT1" +"796","WIPI1" +"797","PLEKHO2" +"798","SFXN3" +"799","RAB31" +"800","TPRG1L" +"801","TREM1" +"802","MYL6B" +"803","IFIT3" +"804","COG3" +"805","KLHDC10" +"806","XPNPEP1" +"807","ALDH3B1" +"808","AP1S2" +"809","PIBF1" +"810","RALGAPA2" +"811","FBP1" +"812","RGS2" +"813","FBXO42" +"814","MEGF9" +"815","ABI2" +"816","GSTM3" +"817","LRR1" +"818","GTF3C1" +"819","TMEM161A" +"820","RPL36AL" +"821","C11orf57" +"822","MAP4K5" +"823","B3GALT6" +"824","BRF1" +"825","AEN" +"826","SLFN12L" +"827","RPS5" +"828","THAP2" +"829","AGPAT3" +"830","ID3" +"831","EEA1" +"832","SIGLEC1" +"833","RP5-1073O3.7" +"834","PDCD4-AS1" +"835","LINC00877" +"836","RPS6KA4" +"837","FUS" +"838","ODC1" +"839","ATP5A1" +"840","SH3GLB1" +"841","BBC3" +"842","AQP3" +"843","GTF3A" +"844","JTB" +"845","CYTIP" +"846","CORO1B" +"847","ID2" +"848","NFKBIA" +"849","NDUFB10" +"850","REEP3" +"851","TNFRSF1A" +"852","SH3KBP1" +"853","TMBIM6" +"854","PNRC1" +"855","LDHA" +"856","STOML2" +"857","COMMD10" +"858","CLDN5" +"859","MYADM" +"860","C14orf1" +"861","CD2" +"862","KLF6" +"863","CISD3" +"864","CIR1" +"865","MRPS6" +"866","MRPL52" +"867","GIMAP7" +"868","CCND3" +"869","WDR1" +"870","UXS1" +"871","ATP1B3" +"872","PTRHD1" +"873","H2AFX" +"874","MGST2" +"875","LYAR" +"876","UBLCP1" +"877","UPK3A" +"878","BMPR2" +"879","LRRFIP1" +"880","LINC00936" +"881","PGK1" +"882","NAP1L1" +"883","PLEKHB2" +"884","CCDC12" +"885","LMAN2" +"886","MPP1" +"887","PNMA1" +"888","RAD21" +"889","ARRB2" +"890","KLRG1" +"891","THYN1" +"892","NCKAP1L" +"893","ASB8" +"894","HSP90B1" +"895","THAP11" +"896","SCGB3A1" +"897","FYB" +"898","ZUFSP" +"899","IFIT5" +"900","CSTB" +"901","FLNA" +"902","RBM4" +"903","TNFAIP8" +"904","CUTA" +"905","FN3KRP" +"906","CEPT1" +"907","VBP1" +"908","ADAM10" +"909","AURKB" +"910","PSMA2.1" +"911","IRF9" +"912","SMC4" +"913","NUP54" +"914","XRCC5" +"915","ANKRD22" +"916","BOLA1" +"917","GLRX5" +"918","ZC3H15" +"919","LYL1" +"920","RPUSD3" +"921","YWHAE" +"922","UBALD2" +"923","ARRDC3" +"924","ERICH1" +"925","JAKMIP1" +"926","SPCS2" +"927","YPEL5" +"928","ALKBH7" +"929","COMMD5" +"930","NDUFB5" +"931","SDF2L1" +"932","TUBA4A" +"933","NDUFB11" +"934","OARD1" +"935","LINC-PINT" +"936","CTNNBL1" +"937","JAK1" +"938","VAMP5" +"939","HTATIP2" +"940","CCT5" +"941","EI24" +"942","FBXO3" +"943","ACD" +"944","SMARCC2" +"945","ATG4C" +"946","ZFP36L1" +"947","STX11" +"948","FEM1B" +"949","SAFB2" +"950","SLC16A3" +"951","VPS28" +"952","RPL7L1" +"953","UBA2" +"954","XRCC6" +"955","CD247" +"956","PDZD4" +"957","TNFSF4" +"958","CLIC1" +"959","STUB1" +"960","ORAI3" +"961","CARD16" +"962","RAC2" +"963","ARFGAP2" +"964","TMEM66" +"965","CHCHD1" +"966","DNAJB14" +"967","MAL" +"968","PPP2CA" +"969","CCT2" +"970","MYO9B" +"971","NDUFC2" +"972","MVD" +"973","PLEKHA3" +"974","HMGN1" +"975","USP3" +"976","LYPLA1" +"977","OAZ2" +"978","TRADD" +"979","GOLGB1" +"980","CD19" +"981","ALOX5AP" +"982","MLX" +"983","PQBP1" +"984","PPP2R1B" +"985","RPN2" +"986","HSPD1" +"987","DUSP23" +"988","RIC3" +"989","TMCO1" +"990","C14orf119" +"991","KDM3B" +"992","RTN4" +"993","C6orf48" +"994","PRPF8" +"995","TBCC" +"996","ATP6V0B" +"997","NIFK" +"998","UQCRC1" +"999","ARHGEF40" +"1000","GDI2" +"1001","FAM49B" +"1002","ATP5SL" +"1003","EXOSC8" +"1004","FAM32A" +"1005","RNF126" +"1006","MYO1G" +"1007","EAF2" +"1008","SSBP1" +"1009","ALG13" +"1010","BCL2A1" +"1011","ARPC5" +"1012","ATP5C1" +"1013","PCBP1" +"1014","ADH5" +"1015","PTPN18" +"1016","CISD1" +"1017","SNRPE" +"1018","MCM2" +"1019","PPP1R18" +"1020","SAT2" +"1021","C9orf16" +"1022","DRAP1" +"1023","QRICH1" +"1024","AATF" +"1025","UBAC2" +"1026","PHF3" +"1027","AHSA1" +"1028","ITSN2" +"1029","NEAT1" +"1030","DHFR" +"1031","PSMD14" +"1032","PPA1" +"1033","TCL1B" +"1034","MAFB" +"1035","CAP1" +"1036","SPG7" +"1037","MRPL12" +"1038","PTGES2" +"1039","DHRS4L2" +"1040","NXT2" +"1041","KIF5B" +"1042","PMEPA1" +"1043","NME3" +"1044","TCP1" +"1045","PICALM" +"1046","GNB2" +"1047","FAM96A" +"1048","AAMP" +"1049","WDR45" +"1050","FMNL1" +"1051","GBP1" +"1052","ZNF593" +"1053","LMAN1" +"1054","SLC39A1" +"1055","FGR" +"1056","PEX16" +"1057","CTA-217C2.1" +"1058","EIF2B1" +"1059","NME1" +"1060","TGFB1" +"1061","CMTM7" +"1062","HAUS5" +"1063","AP3S1" +"1064","GANAB" +"1065","NUDC" +"1066","GIMAP2" +"1067","GPR42" +"1068","AP001053.11" +"1069","RP11-349A22.5" +"1070","AHCY" +"1071","DPH5" +"1072","MAEA" +"1073","SCAND1" +"1074","GINM1" +"1075","METTL23" +"1076","MGST1" +"1077","PSMC4" +"1078","ERV3-1" +"1079","PINK1" +"1080","RANBP1" +"1081","ZCCHC9" +"1082","PTX3" +"1083","COPS8" +"1084","GLRX3" +"1085","PTPN7" +"1086","TMEM9B" +"1087","TTC3" +"1088","MX1" +"1089","ADI1" +"1090","STK38" +"1091","RPL22L1" +"1092","IL23A" +"1093","NUDT1" +"1094","PACS1" +"1095","NCOR1" +"1096","MT-ND6" +"1097","DUT" +"1098","PRNP" +"1099","THOC7" +"1100","ERP44" +"1101","DIAPH1" +"1102","ICAM2" +"1103","ARL2" +"1104","PRPF31" +"1105","TUBB2A" +"1106","GID8" +"1107","MFF" +"1108","COQ2" +"1109","REEP5" +"1110","CARHSP1" +"1111","CPQ" +"1112","LTC4S" +"1113","PPAPDC2" +"1114","MRPL9" +"1115","CD47" +"1116","APOBEC3G" +"1117","GADD45G" +"1118","SSR2" +"1119","TAF5" +"1120","BST2" +"1121","METTL9" +"1122","OAF" +"1123","TMEM50A" +"1124","HNRNPA0" +"1125","PPP1R2" +"1126","CTSC" +"1127","PHGDH" +"1128","WDR83" +"1129","GADD45B" +"1130","CENPW" +"1131","C5orf30" +"1132","BTN3A1" +"1133","CDC123" +"1134","ZNF493" +"1135","FAM107B" +"1136","NDUFA2" +"1137","RAC1" +"1138","CYB5B" +"1139","WTAP" +"1140","ARF6" +"1141","TMX2" +"1142","ANXA6" +"1143","EMG1" +"1144","P2RX5" +"1145","JUND" +"1146","POLR3GL" +"1147","MRPS12" +"1148","PITHD1" +"1149","MMADHC" +"1150","FBXO21" +"1151","ESYT1" +"1152","TRIM16L" +"1153","GABARAPL2" +"1154","IFRD1" +"1155","GMFG" +"1156","MAD2L1" +"1157","MRPS18B" +"1158","RNASE4" +"1159","BCL11A" +"1160","WDR83OS" +"1161","TAF12" +"1162","LAT2" +"1163","NAT9" +"1164","REXO2" +"1165","CTSB" +"1166","EMC7" +"1167","BBS2" +"1168","OSCAR" +"1169","RP11-412D9.4" +"1170","CTA-250D10.23" +"1171","INTS12" +"1172","PRR5" +"1173","TMEM242" +"1174","VDAC3" +"1175","WDR5" +"1176","A2M-AS1" +"1177","SNX17" +"1178","PHF12" +"1179","MOB2" +"1180","ACTN4" +"1181","COX7A2L" +"1182","EIF3M" +"1183","MRPS33" +"1184","TUBA1A" +"1185","DAGLB" +"1186","PPP1CA" +"1187","CYFIP1" +"1188","HMGB1" +"1189","TMEM205" +"1190","PSMB6" +"1191","MLLT11" +"1192","BSDC1" +"1193","LAMTOR1" +"1194","BABAM1" +"1195","HDAC2" +"1196","ELOF1" +"1197","ORAI1" +"1198","PRDX3" +"1199","LARP1" +"1200","ERGIC3" +"1201","PSMD4" +"1202","EIF5" +"1203","FHL1" +"1204","ANAPC13" +"1205","UQCRH" +"1206","ZNF567" +"1207","PROCA1" +"1208","SMARCA4" +"1209","NKAP" +"1210","POU2F2" +"1211","METTL8" +"1212","HRASLS2" +"1213","GHITM" +"1214","RFNG" +"1215","ANKRD44" +"1216","LILRB3" +"1217","CARS" +"1218","PBXIP1" +"1219","TKT" +"1220","THEM6" +"1221","CTNNAL1" +"1222","TXNL4B" +"1223","TMEM91" +"1224","SEPT11" +"1225","PFKFB3" +"1226","CCDC91" +"1227","RP11-430B1.2" +"1228","HP1BP3" +"1229","SCP2" +"1230","OCIAD1" +"1231","TNFRSF9" +"1232","EXOC3L1" +"1233","ZNF559" +"1234","ARSD" +"1235","CCDC115" +"1236","LIMD2" +"1237","ZBTB32" +"1238","MTERFD2" +"1239","CDC42EP3" +"1240","FGFR1OP2" +"1241","KIF3A" +"1242","ATRAID" +"1243","DNAJA3" +"1244","MX2" +"1245","TBXAS1" +"1246","APMAP" +"1247","RAD51D" +"1248","PACSIN2" +"1249","GAS6" +"1250","METTL3" +"1251","PITPNM1" +"1252","TMEM14B" +"1253","RP11-1070N10.3" +"1254","MED7" +"1255","POLR3K" +"1256","PLEKHG5" +"1257","CRELD2" +"1258","NOSIP" +"1259","NUSAP1" +"1260","RNF213" +"1261","DEXI" +"1262","MLEC" +"1263","GNAI2" +"1264","NOP10" +"1265","ADD1" +"1266","LAMTOR2" +"1267","RAN" +"1268","TRIP12" +"1269","GP1BA" +"1270","SPATS2L" +"1271","CEP78" +"1272","PGRMC2" +"1273","PDIA3" +"1274","PHF14" +"1275","CISD2" +"1276","FAM221A" +"1277","FXYD5" +"1278","AC079305.10" +"1279","LTV1" +"1280","DEPTOR" +"1281","CTSZ" +"1282","PPP2R5C" +"1283","ASB7" +"1284","TBCB" +"1285","TMEM97" +"1286","CMPK1" +"1287","CENPT" +"1288","MYCBP2" +"1289","CLEC4C" +"1290","BAZ2A" +"1291","NOL7" +"1292","RRAGC" +"1293","HDAC1" +"1294","GMEB1" +"1295","RFC3" +"1296","MNDA" +"1297","BRK1" +"1298","NCLN" +"1299","KCNC3" +"1300","NLRC4" +"1301","RNF181" +"1302","TMEM165" +"1303","CYTH4" +"1304","UXT" +"1305","RNF113A" +"1306","MBNL1-AS1" +"1307","RFC2" +"1308","DNAJC2" +"1309","MRPL20" +"1310","JMJD6" +"1311","MRPL41" +"1312","RFC1" +"1313","LIPT2" +"1314","HIST1H2BD" +"1315","RHOB" +"1316","GPSM3" +"1317","ZFAT" +"1318","SCFD2" +"1319","TSPAN33" +"1320","RP6-91H8.3" +"1321","ZNF526" +"1322","IRAK1" +"1323","SPATA5L1" +"1324","PARVB" +"1325","ZNF688" +"1326","MIR4435-1HG" +"1327","ACY3" +"1328","UBXN4" +"1329","BYSL" +"1330","FCGR3B" +"1331","RER1" +"1332","DERL1" +"1333","SHOC2" +"1334","GTPBP2" +"1335","RP11-258F1.1" +"1336","SPCS1" +"1337","MZT2B" +"1338","SUPT4H1" +"1339","NEMF" +"1340","ZNF92" +"1341","RMI2" +"1342","N6AMT1" +"1343","CD300C" +"1344","CCBL1" +"1345","ATG16L1" +"1346","TFAM" +"1347","LARS" +"1348","IRF4" +"1349","CXCL10" +"1350","ZNF394" +"1351","LRRK1" +"1352","PPIE" +"1353","CBX5" +"1354","EIF4A3" +"1355","TESC" +"1356","MARCH2" +"1357","UNC45A" +"1358","RP11-362F19.1" +"1359","PTGIR" +"1360","MRPL28" +"1361","TERF2IP" +"1362","SSX2IP" +"1363","RASD1" +"1364","GALM" +"1365","LNPEP" +"1366","NDUFS2" +"1367","TAOK2" +"1368","POMT1" +"1369","DONSON" +"1370","TUBB6" +"1371","MUTYH" +"1372","SLC25A3" +"1373","UTRN" +"1374","FBXL12" +"1375","MAF1" +"1376","BLNK" +"1377","RP11-706O15.1" +"1378","THAP5" +"1379","C12orf45" +"1380","CDC40" +"1381","C19orf52" +"1382","RBM7" +"1383","NDUFA4" +"1384","RP11-293M10.5" +"1385","CTC-338M12.5" +"1386","TIMM17A" +"1387","LINC00528" +"1388","NUPL2" +"1389","EGLN2" +"1390","TCEAL1" +"1391","CEP120" +"1392","ACTR3" +"1393","RP11-452F19.3" +"1394","LARP4" +"1395","DEAF1" +"1396","CENPQ" +"1397","HDAC5" +"1398","ELP5" +"1399","PCBP4" +"1400","MEOX1" +"1401","PTPRC" +"1402","TCF4" +"1403","DCTPP1" +"1404","QRSL1" +"1405","BBX" +"1406","TNFAIP1" +"1407","PDE12" +"1408","PGLYRP2" +"1409","COMMD3" +"1410","MT-ND5" +"1411","NPRL2" +"1412","RBBP8" +"1413","RDH14" +"1414","FADS1" +"1415","WDR55" +"1416","MLTK" +"1417","CTB-61M7.2" +"1418","SLBP" +"1419","CD48" +"1420","HRH2" +"1421","C19orf33" +"1422","FAM45A" +"1423","JUP" +"1424","ISCA2" +"1425","IER2" +"1426","GRK6" +"1427","RP11-383C5.4" +"1428","CSNK1A1" +"1429","EIF2S3" +"1430","CCDC152" +"1431","C3AR1" +"1432","SRSF2" +"1433","TTF1" +"1434","EHD4" +"1435","OTUB1" +"1436","PRKCI" +"1437","CDK19" +"1438","ARPC5L" +"1439","EIF3K" +"1440","CCR6" +"1441","TP53BP2" +"1442","HGD" +"1443","MARCH7" +"1444","IL4I1" +"1445","C9orf142" +"1446","MFN2" +"1447","SNHG7" +"1448","ZFP36" +"1449","ZFP69" +"1450","ING5" +"1451","GAS2L1" +"1452","RIOK2" +"1453","C1orf228" +"1454","VPS25" +"1455","ENO1" +"1456","MCM6" +"1457","TPI1" +"1458","PRKCE" +"1459","PORCN" +"1460","ABCD4" +"1461","DSCC1" +"1462","TM7SF3" +"1463","L3MBTL2" +"1464","EFNB1" +"1465","FANCG" +"1466","FXYD2" +"1467","MPV17" +"1468","TMEM138" +"1469","LCP1" +"1470","HMG20A" +"1471","SNAPIN" +"1472","MRPS15" +"1473","ASPHD2" +"1474","KLF10" +"1475","NOP2" +"1476","TRAK1" +"1477","CDC34" +"1478","NSDHL" +"1479","SETD8" +"1480","GPATCH4" +"1481","C19orf24" +"1482","FXYD6" +"1483","ARPC3" +"1484","GOT2" +"1485","DMTN" +"1486","STT3A" +"1487","SLC31A2" +"1488","TXNRD1" +"1489","NLN" +"1490","SEC24D" +"1491","TNFAIP2" +"1492","PLIN3" +"1493","CAPZB" +"1494","PPARGC1B" +"1495","C5AR1" +"1496","MBNL2" +"1497","CELA1" +"1498","SNRPB" +"1499","C11orf68" +"1500","OTUD1" +"1501","C19orf10" +"1502","EIF3G" +"1503","NDUFS8" +"1504","CENPL" +"1505","LIMS2" +"1506","SUSD3" +"1507","HMGA1" +"1508","RP11-70P17.1" +"1509","DCTN3" +"1510","HVCN1" +"1511","ADSL" +"1512","RMND5A" +"1513","C11orf58" +"1514","PRR7" +"1515","ZNF683" +"1516","ARRDC4" +"1517","RNASEL" +"1518","GPS1" +"1519","PRR13" +"1520","SSPN" +"1521","SURF6" +"1522","RP11-598F7.3" +"1523","ODF3B" +"1524","NFATC1" +"1525","PLAC8" +"1526","RP11-218M22.1" +"1527","C16orf93" +"1528","NLRP12" +"1529","PLEKHF1" +"1530","ASGR1" +"1531","CDKN3" +"1532","ARHGAP4" +"1533","FLT3LG" +"1534","CD33" +"1535","CCDC66" +"1536","AC092580.4" +"1537","CTNS" +"1538","JARID2" +"1539","ZNF626" +"1540","CLPX" +"1541","PAIP2B" +"1542","RBBP6" +"1543","ELOVL4" +"1544","COL6A2" +"1545","CCDC28B" +"1546","TULP3" +"1547","OLA1" +"1548","APC" +"1549","UTP6" +"1550","CHAC2" +"1551","FASLG" +"1552","LSM1" +"1553","MARC1" +"1554","ST20" +"1555","TRIOBP" +"1556","EIF1B" +"1557","CITED4" +"1558","ZNF844" +"1559","DPM1" +"1560","LINC00152" +"1561","ENKUR" +"1562","NOL9" +"1563","GPR82" +"1564","MON1B" +"1565","ZCWPW1" +"1566","NDUFS7" +"1567","NRG1" +"1568","CD82" +"1569","SNHG12" +"1570","TROAP" +"1571","ZNF398" +"1572","CLSTN3" +"1573","LGMN" +"1574","KIAA0226L" +"1575","GALNS" +"1576","HINT1" +"1577","PPM1B" +"1578","SAAL1" +"1579","BAZ1B" +"1580","GZMM" +"1581","MBOAT7" +"1582","RP11-23P13.6" +"1583","SEC11C" +"1584","MRPL19" +"1585","JAZF1" +"1586","AKAP7" +"1587","MYNN" +"1588","C10orf54" +"1589","MCFD2" +"1590","ANTXR2" +"1591","JUN" +"1592","STAT2" +"1593","USP25" +"1594","MYL12B" +"1595","MTDH" +"1596","SDAD1" +"1597","ALOX12" +"1598","ASXL2" +"1599","RP11-1094M14.11" +"1600","C1orf54" +"1601","ADAL" +"1602","SLC35A2" +"1603","CLK3" +"1604","CYTL1" +"1605","DAB2" +"1606","LMO2" +"1607","CD300E" +"1608","SLC25A14" +"1609","HELZ" +"1610","FXYD1" +"1611","SETD1B" +"1612","EIF1AY" +"1613","SAV1" +"1614","HECTD1" +"1615","MRPL2" +"1616","FLJ00104" +"1617","KLHL6" +"1618","FTSJ2" +"1619","UPF3B" +"1620","C9orf91" +"1621","HIST1H2BJ" +"1622","TCF7" +"1623","WDR34" +"1624","DDX51" +"1625","RASGRP4" +"1626","POP7" +"1627","CTC-378H22.1" +"1628","TMED9" +"1629","SPATA6" +"1630","CXXC1" +"1631","ABCC3" +"1632","UBE2R2" +"1633","PLA2G7" +"1634","LIN52" +"1635","SLC43A3" +"1636","DICER1" +"1637","MPP6" +"1638","ZNF148" +"1639","BANP" +"1640","CCDC167" +"1641","CEBPA" +"1642","OPRL1" +"1643","AC109826.1" +"1644","MRPS18A" +"1645","C19orf53" +"1646","CXCL3" +"1647","DOK2" +"1648","FAM76B" +"1649","ZBED6" +"1650","CD59" +"1651","FAM207A" +"1652","CDC37" +"1653","MT1F" +"1654","ATF5" +"1655","ALKBH4" +"1656","KIAA1147" +"1657","MAFF" +"1658","MGRN1" +"1659","C4orf3" +"1660","SKP1" +"1661","SLC24A4" +"1662","RBM12" +"1663","CTC-444N24.11" +"1664","MXD3" +"1665","ATP6V1A" +"1666","ICOSLG" +"1667","FBXL17" +"1668","SSB" +"1669","RP11-169K16.9" +"1670","ADIPOR2" +"1671","LIMK1" +"1672","DOHH" +"1673","PRAM1" +"1674","GPKOW" +"1675","ACTR6" +"1676","STRN" +"1677","FPR2" +"1678","MED9" +"1679","ARF1" +"1680","CLEC12A" +"1681","FXR2" +"1682","AFTPH" +"1683","TMEM62" +"1684","MED27" +"1685","IL17RA" +"1686","ASCC2" +"1687","PTPRN2" +"1688","SETD6" +"1689","PIGV" +"1690","SRPK1" +"1691","RP11-274B18.2" +"1692","DTNBP1" +"1693","FAM120A" +"1694","PIGF" +"1695","FOSL2" +"1696","WNT10A" +"1697","GSTZ1" +"1698","TMEM214" +"1699","CES4A" +"1700","MTCH2" +"1701","PCYT1A" +"1702","AGA" +"1703","IRS2" +"1704","PSMD7" +"1705","DIDO1" +"1706","LMNB2" +"1707","GAA" +"1708","ZNF528" +"1709","POLR3E" +"1710","MYBBP1A" +"1711","KCNE1" +"1712","GRAP" +"1713","PTGDR" +"1714","MIR4458HG" +"1715","BNIP2" +"1716","ARAP1" +"1717","CHN2" +"1718","SETDB1" +"1719","SPEF2" +"1720","SNAP47" +"1721","CD302" +"1722","TCF12" +"1723","NAF1" +"1724","DNAJB1" +"1725","LARP1B" +"1726","SLC27A1" +"1727","AAAS" +"1728","CD86" +"1729","C1orf63" +"1730","DLST" +"1731","RBM48" +"1732","PTK2" +"1733","TGIF2" +"1734","MYO5A" +"1735","S100Z" +"1736","VPS72" +"1737","THUMPD3" +"1738","TFEC" +"1739","BROX" +"1740","RP4-575N6.4" +"1741","NME6" +"1742","PGM2" +"1743","UBE3A" +"1744","TMEM248" +"1745","ARHGAP26" +"1746","RPUSD2" +"1747","RBM38" +"1748","AP4S1" +"1749","USF1" +"1750","MORN3" +"1751","NCBP1" +"1752","MRPS34" +"1753","SMCO4" +"1754","FBXW5" +"1755","MORC2-AS1" +"1756","ZNF174" +"1757","EPHB6" +"1758","GNPTAB" +"1759","PPIP5K2" +"1760","CLEC4G" +"1761","FBXO4" +"1762","ADO" +"1763","RP5-821D11.7" +"1764","UGDH" +"1765","MAP3K8" +"1766","DENND1A" +"1767","ATP10D" +"1768","SCIMP" +"1769","HLA-DOA" +"1770","SMC2" +"1771","COG4" +"1772","RHEBL1" +"1773","GEMIN4" +"1774","HCCS" +"1775","PRRT3" +"1776","SLC25A12" +"1777","L3MBTL3" +"1778","PREPL" +"1779","MRPL42" +"1780","C21orf119" +"1781","SNX14" +"1782","GTPBP6" +"1783","HMGCS1" +"1784","MYO15B" +"1785","POLI" +"1786","NUDT7" +"1787","TBK1" +"1788","MTA2" +"1789","NPL" +"1790","SRGAP2" +"1791","CCP110" +"1792","CDK6" +"1793","CHD7" +"1794","PDCD1" +"1795","PUM1" +"1796","SLC10A7" +"1797","STK38L" +"1798","ARHGAP18" +"1799","YEATS2" +"1800","METTL25" +"1801","TBCE" +"1802","LRRK2" +"1803","LRFN1" +"1804","IL1RN" +"1805","ACOT13" +"1806","B4GALT4" +"1807","LINC00847" +"1808","CD3E" +"1809","COX10" +"1810","SERP1" +"1811","C2orf88" +"1812","GLS" +"1813","RP11-103G8.2" +"1814","PEX26" +"1815","MACROD2" +"1816","TOP1MT" +"1817","TOR4A" +"1818","C3orf62" +"1819","ZNF669" +"1820","TIPARP" +"1821","ECE2" +"1822","NIPSNAP1" +"1823","MT-ATP6" +"1824","MAGEH1" +"1825","ARRB1" +"1826","SMAGP" +"1827","SLC41A1" +"1828","PANK2" +"1829","DOK3" +"1830","RCC1" +"1831","SLC6A6" +"1832","RP11-421L21.3" +"1833","RP11-356I2.4" +"1834","DHRS1" +"1835","PEMT" +"1836","LAMP3" +"1837","RP11-65J3.1" +"1838","HOMER1" +"1839","RPUSD4" +"1840","ANAPC7" +"1841","NCL" +"1842","WDR91" +"1843","CXorf65" +"1844","FAM76A" +"1845","NPRL3" +"1846","TUBB4B" +"1847","CANT1" +"1848","HAUS8" +"1849","RNH1" +"1850","C11orf24" +"1851","FAM50B" +"1852","HLA-E" +"1853","SYCE1" +"1854","MED10" +"1855","ADTRP" +"1856","LRIG2" +"1857","KDM5C" +"1858","OSGIN2" +"1859","NME7" +"1860","VAPB" +"1861","EFR3A" +"1862","NEK8" +"1863","ATP5G2" +"1864","RNASEH1-AS1" +"1865","RP3-395M20.12" +"1866","CCDC22" +"1867","CXCR4" +"1868","RFC5" +"1869","BEX5" +"1870","CD1D" +"1871","ARL4D" +"1872","ZWILCH" +"1873","DDI2" +"1874","SH2D3A" +"1875","ZBED5-AS1" +"1876","TRMT61A" +"1877","FUZ" +"1878","TMEM87B" +"1879","BCS1L" +"1880","MRI1" +"1881","NAPA-AS1" +"1882","TLE1" +"1883","DAAM1" +"1884","PDCD2L" +"1885","RP13-580F15.2" +"1886","GSTT1" +"1887","AP3M2" +"1888","NELFB" +"1889","NAA50" +"1890","CBFA2T3" +"1891","GPX4" +"1892","PHF10" +"1893","SEL1L" +"1894","C16orf58" +"1895","CLCN7" +"1896","LRRC45" +"1897","RNF214" +"1898","MAP2K7" +"1899","UIMC1" +"1900","GFOD2" +"1901","RNF168" +"1902","EID2B" +"1903","ZBTB17" +"1904","CLCF1" +"1905","OPA3" +"1906","VAMP2" +"1907","SFMBT1" +"1908","SGMS1" +"1909","TNFRSF13C" +"1910","CAMK2G" +"1911","GCSAM" +"1912","SLC35B4" +"1913","ETFA" +"1914","NUDT15" +"1915","DHRS13" +"1916","STK11IP" +"1917","CROT" +"1918","SUSD1" +"1919","NOM1" +"1920","ZBTB11" +"1921","LCORL" +"1922","ZNF333" +"1923","TAF9B" +"1924","MTRR" +"1925","SAMD9" +"1926","SNX22" +"1927","HIGD2A" +"1928","ABCB1" +"1929","BCL2L12" +"1930","POLD1" +"1931","ANO9" +"1932","OLIG1" +"1933","C2CD2L" +"1934","TRMT112" +"1935","HERC2" +"1936","GNG7" +"1937","SCARB2" +"1938","GLCCI1" +"1939","PIGU" +"1940","RBM5" +"1941","MYO1C" +"1942","KIAA0368" +"1943","AC009403.2" +"1944","TSPYL2" +"1945","ZNF609" +"1946","CDR2" +"1947","WHSC1" +"1948","FEM1A" +"1949","MTMR9" +"1950","PIK3C2A" +"1951","RWDD2B" +"1952","CTB-55O6.12" +"1953","FAAH" +"1954","ZNF211" +"1955","NDRG1" +"1956","FAM214A" +"1957","TBXA2R" +"1958","SLC2A13" +"1959","APBA3" +"1960","MICB" +"1961","MICU1" +"1962","PTRH2" +"1963","PAN2" +"1964","IFNG-AS1" +"1965","CSNK2A2" +"1966","PPP1R12C" +"1967","TESK1" +"1968","ZNF429" +"1969","BPNT1" +"1970","CR1" +"1971","SLC20A2" +"1972","RP11-104L21.3" +"1973","HBEGF" +"1974","TMEM181" +"1975","PRKAG1" +"1976","CXorf24" +"1977","FAM26F" +"1978","DPH6" +"1979","ERI3" +"1980","RASGRP3" +"1981","C1orf56" +"1982","ENOX2" +"1983","IL15" +"1984","DNAJC9" +"1985","ENDOV" +"1986","CAMK1D" +"1987","LRRC59" +"1988","ATXN3" +"1989","PPRC1" +"1990","CLEC4D" +"1991","SBNO1" +"1992","TMEM156" +"1993","ALG12" +"1994","DPP4" +"1995","NEK1" +"1996","ICAM1" +"1997","CLUAP1" +"1998","NUP98" +"1999","DUSP5" +"2000","HCFC2" diff --git a/scanpy/tests/_scripts/seurat_hvg_v3_batch.dat b/scanpy/tests/_scripts/seurat_hvg_v3_batch.dat deleted file mode 100644 index 76f5486a11..0000000000 --- a/scanpy/tests/_scripts/seurat_hvg_v3_batch.dat +++ /dev/null @@ -1,4001 +0,0 @@ -"x" -"1" "LYZ" -"2" "S100A9" -"3" "GNLY" -"4" "FTL" -"5" "PPBP" -"6" "IGLL5" -"7" "FTH1" -"8" "PF4" -"9" "HLA-DRA" -"10" "S100A8" -"11" "CD74" -"12" "NKG7" -"13" "CST3" -"14" "FCER1A" -"15" "GNG11" -"16" "GZMB" -"17" "CCL4" -"18" "HLA-DPB1" -"19" "SDPR" -"20" "HLA-DPA1" -"21" "HLA-DRB1" -"22" "AL928768.3" -"23" "CD79A" -"24" "LST1" -"25" "CLU" -"26" "CCL3" -"27" "TYMS" -"28" "CCL5" -"29" "STMN1" -"30" "FCGR3A" -"31" "IFI27" -"32" "RRM2" -"33" "PRDX1" -"34" "PRF1" -"35" "HLA-DQA1" -"36" "FGFBP2" -"37" "TK1" -"38" "FCER1G" -"39" "TYROBP" -"40" "IL8" -"41" "C1QA" -"42" "ACTB" -"43" "AIF1" -"44" "FCN1" -"45" "GZMH" -"46" "IFITM3" -"47" "SPARC" -"48" "ITGA2B" -"49" "GP9" -"50" "KIAA0101" -"51" "CST7" -"52" "TUBB1" -"53" "CLEC10A" -"54" "APOBEC3B" -"55" "SAT1" -"56" "IGJ" -"57" "HBA1" -"58" "COTL1" -"59" "TREML1" -"60" "PTGDS" -"61" "SERPINF1" -"62" "MZB1" -"63" "HLA-DQB1" -"64" "TUBA1B" -"65" "C1QB" -"66" "CA2" -"67" "GIMAP5" -"68" "S100B" -"69" "NPC2" -"70" "HAGH" -"71" "LGALS2" -"72" "MS4A6A" -"73" "PRKCB" -"74" "CMTM5" -"75" "CLDN5" -"76" "BIRC5" -"77" "ZWINT" -"78" "TNFRSF17" -"79" "RALY" -"80" "GZMK" -"81" "SIVA1" -"82" "FUS" -"83" "LGALS1" -"84" "VMO1" -"85" "C10orf32" -"86" "G0S2" -"87" "MYL9" -"88" "TALDO1" -"89" "TCL1A" -"90" "HMGB2" -"91" "RP5-887A10.1" -"92" "NRGN" -"93" "ODC1" -"94" "CD9" -"95" "HLA-DRB5" -"96" "CXCL2" -"97" "GAPDH" -"98" "COQ7" -"99" "ENHO" -"100" "CD1C" -"101" "CD79B" -"102" "S100A4" -"103" "HIST1H2AC" -"104" "MS4A7" -"105" "CTSS" -"106" "RGS1" -"107" "PPP1R14A" -"108" "ABI3" -"109" "WARS" -"110" "NCF2" -"111" "C1orf162" -"112" "SF3B5" -"113" "PSMA7" -"114" "CSNK2B" -"115" "LTB" -"116" "S100A12" -"117" "LY6G6F" -"118" "CFD" -"119" "STAMBP" -"120" "PHACTR4" -"121" "IRF8" -"122" "LILRA4" -"123" "PTTG1" -"124" "TNFSF13B" -"125" "LYAR" -"126" "SH3KBP1" -"127" "FOLR3" -"128" "MANBA" -"129" "CLEC2B" -"130" "SDHB" -"131" "CEBPB" -"132" "GZMA" -"133" "H2AFY" -"134" "ISG15" -"135" "PPIB" -"136" "IL1B" -"137" "TIMP1" -"138" "TIGIT" -"139" "IFIT2" -"140" "APOBEC3A" -"141" "UBLCP1" -"142" "RABL6" -"143" "GPX1" -"144" "TMSB4X" -"145" "ZNF263" -"146" "KLRG1" -"147" "NDUFA12" -"148" "CWC15" -"149" "IDH2" -"150" "FEM1B" -"151" "GUSB" -"152" "BIK" -"153" "ASB8" -"154" "GSTP1" -"155" "ARRB2" -"156" "TRAPPC3" -"157" "C14orf1" -"158" "CKB" -"159" "PTCRA" -"160" "S100A11" -"161" "AQP3" -"162" "BLOC1S1" -"163" "RXRA" -"164" "CLIC3" -"165" "HBP1" -"166" "RGS18" -"167" "PITPNA-AS1" -"168" "STX11" -"169" "GPR183" -"170" "MAP3K7CL" -"171" "ANXA5" -"172" "CLYBL" -"173" "DCAF5" -"174" "TSC22D1" -"175" "OARD1" -"176" "CCNA2" -"177" "CISD1" -"178" "GINS2" -"179" "CCT7" -"180" "ACD" -"181" "BOLA1" -"182" "RPUSD3" -"183" "ITM2C" -"184" "SH3BP1" -"185" "UBXN1" -"186" "UBA5" -"187" "CARHSP1" -"188" "SRGN" -"189" "TNFRSF13B" -"190" "RPL7L1" -"191" "CAPZA2" -"192" "CHMP4A" -"193" "PSMG2" -"194" "FN3KRP" -"195" "C17orf62" -"196" "PRSS57" -"197" "ICAM2" -"198" "MKI67" -"199" "FYB" -"200" "PTX3" -"201" "PLEKHA3" -"202" "MMD" -"203" "QRICH1" -"204" "CHTF8" -"205" "KIFC1" -"206" "CCND3" -"207" "ATP5H" -"208" "EWSR1" -"209" "THOC7" -"210" "TYMP" -"211" "PSMD14" -"212" "SP140" -"213" "GADD45B" -"214" "HES1" -"215" "STK38" -"216" "IFNGR2" -"217" "IGFBP7" -"218" "RBM3" -"219" "PSAP" -"220" "IDH3G" -"221" "HNRNPH3" -"222" "AHNAK" -"223" "FEN1" -"224" "ISOC2" -"225" "LINC00936" -"226" "RIC3" -"227" "ALKBH7" -"228" "YWHAE" -"229" "SUMO3" -"230" "RBCK1" -"231" "EXOSC8" -"232" "SURF1" -"233" "INTS12" -"234" "S1PR4" -"235" "ABT1" -"236" "SLA" -"237" "GSTO1" -"238" "SMIM7" -"239" "TMEM40" -"240" "PACS1" -"241" "CLEC4C" -"242" "DPH5" -"243" "CD160" -"244" "PPP6C" -"245" "ASF1B" -"246" "GSTA4" -"247" "COMMD10" -"248" "SMIM5" -"249" "HSP90AA1" -"250" "SSBP1" -"251" "TMX2" -"252" "ID2" -"253" "SPG7" -"254" "TNFRSF9" -"255" "NUDT1" -"256" "ATP5C1" -"257" "IL23A" -"258" "NAPSA" -"259" "PCNA" -"260" "SPON2" -"261" "FAM96A" -"262" "RHOG" -"263" "LYPLA1" -"264" "ACRBP" -"265" "SNX3" -"266" "ACTG1" -"267" "GMNN" -"268" "MLLT11" -"269" "RFC1" -"270" "AKR1C3" -"271" "PPA1" -"272" "ANXA1" -"273" "USP3" -"274" "HNRNPM" -"275" "SPTSSB" -"276" "CENPM" -"277" "GGNBP2" -"278" "VDAC3" -"279" "HIST1H4C" -"280" "NKAP" -"281" "HOPX" -"282" "MS4A1" -"283" "LYPD2" -"284" "CARS" -"285" "KRT1" -"286" "BTN3A1" -"287" "CTSW" -"288" "KCNG1" -"289" "RRAGC" -"290" "HDAC1" -"291" "FAM32A" -"292" "RP11-349A22.5" -"293" "SERPINA1" -"294" "PTPN7" -"295" "SAT2" -"296" "PGM1" -"297" "RAD21" -"298" "IL6" -"299" "GMPR" -"300" "ZCCHC9" -"301" "CTD-2006K23.1" -"302" "CLEC1B" -"303" "RBM39" -"304" "ARL6IP5" -"305" "DNASE1L3" -"306" "FH" -"307" "KCNQ1OT1" -"308" "MT-CO2" -"309" "PRDX3" -"310" "GTPBP2" -"311" "IFI35" -"312" "TRIP12" -"313" "HN1" -"314" "IFITM2" -"315" "UQCRC1" -"316" "XCL2" -"317" "CCL4L1" -"318" "RFNG" -"319" "RBM4" -"320" "ID1" -"321" "STOML2" -"322" "ACAP1" -"323" "TMEM242" -"324" "HP1BP3" -"325" "PSMB8" -"326" "RAD51" -"327" "PRPF31" -"328" "YWHAB" -"329" "FBXO41" -"330" "METTL23" -"331" "RP11-1070N10.3" -"332" "VAPA" -"333" "FCGR3B" -"334" "UXS1" -"335" "SMARCA4" -"336" "ANAPC13" -"337" "TMEM208" -"338" "RP11-879F14.2" -"339" "RP11-367G6.3" -"340" "TTC3" -"341" "COX5A" -"342" "FKBP2" -"343" "IFI30" -"344" "DNAJC2" -"345" "FAM107B" -"346" "POMT1" -"347" "AP001189.4" -"348" "JAKMIP1" -"349" "RETN" -"350" "KLRC1" -"351" "PAICS" -"352" "MPP1" -"353" "SHOC2" -"354" "RAB32" -"355" "SEPT5" -"356" "IFIT1" -"357" "EPN1" -"358" "LGALS3BP" -"359" "PYCARD" -"360" "HIST1H2BJ" -"361" "SRSF7" -"362" "RIOK2" -"363" "EGFL7" -"364" "CCDC115" -"365" "F13A1" -"366" "CD2" -"367" "SLC40A1" -"368" "MGST2" -"369" "RUFY1" -"370" "CACNA2D3" -"371" "APOBEC3H" -"372" "S100A6" -"373" "IRF7" -"374" "CFP" -"375" "ATP6V0E1" -"376" "JAK1" -"377" "KIAA0125" -"378" "MRPL20" -"379" "RP11-706O15.1" -"380" "IL32" -"381" "LMNB1" -"382" "CRIP2" -"383" "ZNF559" -"384" "PMEPA1" -"385" "POLR2G" -"386" "NCR3" -"387" "PSMB6" -"388" "RDH14" -"389" "H2AFZ" -"390" "NPRL2" -"391" "CDC42EP3" -"392" "SNX17" -"393" "PDIA3" -"394" "XCL1" -"395" "TNNT1" -"396" "HGD" -"397" "C19orf33" -"398" "GP1BA" -"399" "DSCC1" -"400" "PPIL2" -"401" "MAL" -"402" "SRSF6" -"403" "DEPTOR" -"404" "SSX2IP" -"405" "RASD1" -"406" "MANF" -"407" "NUSAP1" -"408" "SPI1" -"409" "TSPAN33" -"410" "ATG16L1" -"411" "FAM110A" -"412" "SLC16A3" -"413" "CD247" -"414" "SLC48A1" -"415" "NEMF" -"416" "DENND5A" -"417" "TMEM50A" -"418" "PSMC4" -"419" "HLA-DQA2" -"420" "RGS16" -"421" "FPR1" -"422" "FAM212A" -"423" "FABP5" -"424" "GFI1B" -"425" "PINK1" -"426" "UBE2C" -"427" "SH3BGRL" -"428" "UBE2D2" -"429" "MAEA" -"430" "EREG" -"431" "ITGB3" -"432" "TNFAIP8" -"433" "COPS8" -"434" "HMOX1" -"435" "CCND2" -"436" "ATP6V0B" -"437" "TNFSF10" -"438" "OAZ1" -"439" "CHI3L2" -"440" "HNRNPF" -"441" "NIT1" -"442" "GPKOW" -"443" "GPR42" -"444" "PRELID1" -"445" "RTN4" -"446" "TMEM14B" -"447" "ACY3" -"448" "CDKN1C" -"449" "ITSN2" -"450" "ZBTB32" -"451" "SERPINE2" -"452" "RP11-290F20.3" -"453" "GBP1" -"454" "TNFRSF1A" -"455" "IFFO1" -"456" "LINC00926" -"457" "EIF1AY" -"458" "MAFB" -"459" "FCGR2B" -"460" "KCTD10" -"461" "APOBEC3G" -"462" "SLBP" -"463" "LGALS3" -"464" "AC147651.3" -"465" "FAM221A" -"466" "UBE2Q1" -"467" "PDZD4" -"468" "DAB2" -"469" "KIR2DL3" -"470" "PLD4" -"471" "CD14" -"472" "NAA20" -"473" "APOOL" -"474" "ERP44" -"475" "UBAC2" -"476" "TMEM140" -"477" "HELQ" -"478" "TMEM176B" -"479" "CYTL1" -"480" "RP6-91H8.3" -"481" "MYLK" -"482" "RP11-598F7.3" -"483" "LILRA3" -"484" "SLC39A3" -"485" "AP4S1" -"486" "IL4I1" -"487" "RP5-1028K7.2" -"488" "UBE2J1" -"489" "CPQ" -"490" "TRPM4" -"491" "MYCL" -"492" "NUDC" -"493" "SEC61B" -"494" "ERICH1" -"495" "NDUFB5" -"496" "ZSCAN5A" -"497" "SPATA7" -"498" "HCAR3" -"499" "C6orf25" -"500" "DHRS4" -"501" "TPM1" -"502" "BCDIN3D" -"503" "PPM1N" -"504" "PGRMC1" -"505" "IFI6" -"506" "FCRLA" -"507" "VIM" -"508" "RP11-164H13.1" -"509" "NT5C3A" -"510" "GIMAP4" -"511" "TSPAN4" -"512" "CPVL" -"513" "TMSB10" -"514" "CRELD2" -"515" "METTL8" -"516" "TMEM141" -"517" "ZFAT" -"518" "SERPING1" -"519" "LTC4S" -"520" "NDUFB9" -"521" "S100A10" -"522" "DHRS9" -"523" "HAPLN3" -"524" "RP11-428G5.5" -"525" "RP1-313I6.12" -"526" "TNFSF4" -"527" "CENPN" -"528" "NCKAP1L" -"529" "NFE2" -"530" "RHOC" -"531" "TTC38" -"532" "CTA-217C2.1" -"533" "PRR5" -"534" "TBCC" -"535" "NDFIP1" -"536" "CPNE2" -"537" "PNMA1" -"538" "ESAM" -"539" "MALAT1" -"540" "CYFIP1" -"541" "TSPAN15" -"542" "RAMP1" -"543" "SLC25A5" -"544" "ICOSLG" -"545" "SCGB1C1" -"546" "ZNF467" -"547" "VAMP8" -"548" "MEOX1" -"549" "SETD1B" -"550" "MYBL2" -"551" "SMARCD3" -"552" "PHF12" -"553" "MT3" -"554" "THEM6" -"555" "CTD-2267D19.2" -"556" "NEIL1" -"557" "TCP1" -"558" "IL18RAP" -"559" "CTTN" -"560" "TAOK2" -"561" "ARL2" -"562" "TUBA8" -"563" "SRM" -"564" "COPS6" -"565" "SEPT11" -"566" "VPREB3" -"567" "CD8B" -"568" "CCL3L3" -"569" "PLEKHG5" -"570" "TROAP" -"571" "MX2" -"572" "GID8" -"573" "C2orf88" -"574" "OCIAD1" -"575" "CENPW" -"576" "PITPNM1" -"577" "ORAI1" -"578" "ATP6V1A" -"579" "PPP1R14B" -"580" "GABARAPL2" -"581" "SOX4" -"582" "CTA-250D10.23" -"583" "SH3BGRL3" -"584" "KLRB1" -"585" "MS4A4A" -"586" "CLIC2" -"587" "ARSD" -"588" "CCR10" -"589" "UBB" -"590" "CTNNAL1" -"591" "ZNF528" -"592" "H2AFX" -"593" "ENKUR" -"594" "PSMA2-1" -"595" "UPK3A" -"596" "DMTN" -"597" "PILRA" -"598" "CXCL3" -"599" "MCFD2" -"600" "H1F0" -"601" "P2RY13" -"602" "SPRY1" -"603" "IER3" -"604" "ACSM3" -"605" "SARM1" -"606" "PPAPDC2" -"607" "RPS2" -"608" "ZWILCH" -"609" "B2M" -"610" "TAF5" -"611" "CHCHD1" -"612" "UBE2D3" -"613" "RP11-383C5.4" -"614" "MPP6" -"615" "RP11-70P17.1" -"616" "IFNG" -"617" "ATP5SL" -"618" "KIF16B" -"619" "MRPL19" -"620" "GPATCH4" -"621" "DUSP23" -"622" "IL13RA1" -"623" "SSPN" -"624" "CITED4" -"625" "FCRL2" -"626" "KLF6" -"627" "POLR3GL" -"628" "SLC35A2" -"629" "EZH2" -"630" "C19orf59" -"631" "NLRC4" -"632" "MCM7" -"633" "UGT2B17" -"634" "PPP2R1B" -"635" "RP11-291B21.2" -"636" "ANTXR2" -"637" "CD37" -"638" "RP11-218M22.1" -"639" "ORAI3" -"640" "PFN1" -"641" "SYCE1" -"642" "PRPF19" -"643" "ICAM4" -"644" "LRRC25" -"645" "POU2AF1" -"646" "ZNF394" -"647" "UBALD2" -"648" "RAB13" -"649" "RAB11B-AS1" -"650" "C16orf93" -"651" "ZNF185" -"652" "TNFRSF4" -"653" "CTBP2" -"654" "TMEM176A" -"655" "CD68" -"656" "RP11-407N17.5" -"657" "TERF2IP" -"658" "KCNE1" -"659" "RLN2" -"660" "ZNF503" -"661" "ERV3-1" -"662" "AC079305.10" -"663" "ARRDC4" -"664" "DUSP4" -"665" "CES4A" -"666" "GANAB" -"667" "SBNO2" -"668" "FAM13A" -"669" "TPPP3" -"670" "HSPA5" -"671" "COCH" -"672" "RP13-270P17.3" -"673" "TNNI2" -"674" "HOXB-AS1" -"675" "RFC3" -"676" "LRRK1" -"677" "SPOCD1" -"678" "BATF3" -"679" "ACOT7" -"680" "PGLYRP2" -"681" "ALDH1A1" -"682" "LIN52" -"683" "TRMT61A" -"684" "EIF3H" -"685" "FAM49B" -"686" "SAV1" -"687" "NLN" -"688" "KIR3DL2" -"689" "HES4" -"690" "SNRNP25" -"691" "SLC27A1" -"692" "VPS37C" -"693" "ADIPOR2" -"694" "COL6A2" -"695" "XXbac-B135H6.15" -"696" "MOB2" -"697" "SLC25A14" -"698" "EXOC3L1" -"699" "LINC00528" -"700" "RCE1" -"701" "FCER2" -"702" "GLRX3" -"703" "EPB41L3" -"704" "ZNF799" -"705" "FCRL5" -"706" "MCM4" -"707" "RMI2" -"708" "HBEGF" -"709" "CELA1" -"710" "TMEM97" -"711" "DRAP1" -"712" "OAF" -"713" "RNASEL" -"714" "SLC4A10" -"715" "F2R" -"716" "VIL1" -"717" "CYBA" -"718" "NEK8" -"719" "SENCR" -"720" "SREBF1" -"721" "LAG3" -"722" "IDO1" -"723" "ORC2" -"724" "WARS2" -"725" "FXYD2" -"726" "LIMS2" -"727" "MRPS18B" -"728" "LGALSL" -"729" "AC022182.3" -"730" "OSBPL7" -"731" "PPARGC1B" -"732" "HNRNPA2B1" -"733" "MT1E" -"734" "STXBP2" -"735" "FCRL6" -"736" "BIN2" -"737" "PID1" -"738" "WDYHV1" -"739" "UQCRH" -"740" "TPRG1L" -"741" "PDLIM1" -"742" "LILRB4" -"743" "YBX1" -"744" "SPIB" -"745" "NLRP12" -"746" "C2orf76" -"747" "STK3" -"748" "CHD7" -"749" "BASP1" -"750" "AC011899.9" -"751" "ANXA2" -"752" "SYCE1L" -"753" "MT-CO1" -"754" "STAG3" -"755" "SPATA6" -"756" "HOMER1" -"757" "MAD2L1" -"758" "DHFR" -"759" "PTK2" -"760" "SCT" -"761" "TUBB2A" -"762" "SH2D1B" -"763" "SIGLEC9" -"764" "FXR2" -"765" "LRFN1" -"766" "HRASLS2" -"767" "MFN2" -"768" "CTB-61M7.2" -"769" "GAS2L1" -"770" "PRKCE" -"771" "MT2A" -"772" "MGST1" -"773" "ZNF703" -"774" "GPBAR1" -"775" "RNASE4" -"776" "AL928742.12" -"777" "AC009501.4" -"778" "PERP" -"779" "EFNB1" -"780" "SCFD2" -"781" "ZNF844" -"782" "RP11-432J24.2" -"783" "ABHD5" -"784" "MCOLN3" -"785" "WDR4" -"786" "CLIC1" -"787" "RP13-188A5.1" -"788" "ARHGDIB" -"789" "CXCR3" -"790" "RP11-554J4.1" -"791" "LINC00662" -"792" "TOPBP1" -"793" "NAPA-AS1" -"794" "CTC-260E6.6" -"795" "RPS5" -"796" "BYSL" -"797" "HMGB1" -"798" "CCT5" -"799" "CD38" -"800" "TNFRSF18" -"801" "AC079767.4" -"802" "CD70" -"803" "ASPHD2" -"804" "FAM98A" -"805" "C1orf51" -"806" "LYL1" -"807" "LCN2" -"808" "NCOA4" -"809" "PTGIR" -"810" "ACSL1" -"811" "TPO" -"812" "PFKFB3" -"813" "EGR1" -"814" "FLJ00104" -"815" "FOXM1" -"816" "RP13-580F15.2" -"817" "ZDHHC1" -"818" "C1orf186" -"819" "KHK" -"820" "CDKN3" -"821" "LRRC26" -"822" "FANCG" -"823" "PGM2L1" -"824" "FXYD1" -"825" "PRKCI" -"826" "RP11-110A12.2" -"827" "JUP" -"828" "IFI27L1" -"829" "PON2" -"830" "EMP3" -"831" "TRIP13" -"832" "SPATA5L1" -"833" "FFAR2" -"834" "MCM6" -"835" "RP11-293M10.5" -"836" "FXYD6" -"837" "MARC1" -"838" "TRIB1" -"839" "CEP170" -"840" "RP5-1074L1.4" -"841" "TCF7L2" -"842" "CXCL16" -"843" "CPLX1" -"844" "TNFAIP8L1" -"845" "TMCC1-AS1" -"846" "BGLAP" -"847" "LIPT2" -"848" "ZNF211" -"849" "PDCD1" -"850" "CCBL1" -"851" "LOH12CR2" -"852" "C10orf11" -"853" "RPS6" -"854" "FCF1" -"855" "WNT10A" -"856" "PVRL3" -"857" "RP11-22N19.2" -"858" "NACA" -"859" "FAH" -"860" "RP13-131K19.7" -"861" "AP001258.4" -"862" "YEATS2" -"863" "STAP1" -"864" "CLEC4G" -"865" "KLRF1" -"866" "YAE1D1" -"867" "DUS2" -"868" "C12orf66" -"869" "RP11-403A21.2" -"870" "AC195454.1" -"871" "LY6E" -"872" "TMEM53" -"873" "FAM214A" -"874" "ARID1B" -"875" "NUDT7" -"876" "ALDH7A1" -"877" "TUBG1" -"878" "GPR63" -"879" "TNFRSF21" -"880" "PORCN" -"881" "KLRD1" -"882" "ADM" -"883" "S100Z" -"884" "PIGZ" -"885" "BAMBI" -"886" "KLHDC10" -"887" "SLC35B4" -"888" "MORN3" -"889" "LINC00309" -"890" "SCD" -"891" "SOD2" -"892" "PAK3" -"893" "GEMIN4" -"894" "POLR1B" -"895" "WHSC1" -"896" "TESK1" -"897" "FBXL17" -"898" "FRMPD3" -"899" "RP11-378J18.3" -"900" "CNFN" -"901" "C2CD4D" -"902" "TKT" -"903" "ZNF684" -"904" "ZNF526" -"905" "CEBPD" -"906" "RP11-611L7.1" -"907" "PPP2R2B" -"908" "EMR2" -"909" "ZBED6" -"910" "Y-RNA" -"911" "FAM76A" -"912" "ARC" -"913" "ZNF333" -"914" "CHAC2" -"915" "LINC00996" -"916" "FLNB" -"917" "WIPI1" -"918" "AGL" -"919" "TMEM86A" -"920" "RP11-110I1.14" -"921" "C11orf68" -"922" "YPEL4" -"923" "KRTAP5-AS1" -"924" "OVCH1-AS1" -"925" "SAMD12" -"926" "FBXO43" -"927" "MDK" -"928" "PLEK2" -"929" "FAM41C" -"930" "ANKRD65" -"931" "RP11-181G12.2" -"932" "PGF" -"933" "AL590822.1" -"934" "RHOBTB3" -"935" "DIO1" -"936" "RP11-493L12.4" -"937" "LINC00337" -"938" "ERRFI1" -"939" "RP4-635E18.6" -"940" "RP11-305E17.6" -"941" "AKR7A3" -"942" "RP1-224A6.9" -"943" "ASAP3" -"944" "RP1-150O5.3" -"945" "KIAA1522" -"946" "ZSCAN20" -"947" "THEM5" -"948" "OXCT2" -"949" "RP11-269F19.2" -"950" "ZSWIM5" -"951" "C8orf31" -"952" "CCDC17" -"953" "MORC4" -"954" "AC096677.1" -"955" "STIL" -"956" "RP5-1024G6.5" -"957" "AL161915.1" -"958" "WDR78" -"959" "ZRANB2-AS1" -"960" "GIPC2" -"961" "TTLL7" -"962" "RP5-837M10.4" -"963" "RP5-1180E21.4" -"964" "AC093901.1" -"965" "RP4-666F24.3" -"966" "RP11-326G21.1" -"967" "PTPRN" -"968" "ECM1" -"969" "TMOD4" -"970" "AL450992.2" -"971" "SCN9A" -"972" "EFNA1" -"973" "MUC1" -"974" "CRABP2" -"975" "PEAR1" -"976" "RP11-71G12.1" -"977" "RP11-367J7.3" -"978" "SLAMF9" -"979" "RP11-574F21.2" -"980" "RP11-46A10.4" -"981" "RP11-569A11.1" -"982" "ADORA1" -"983" "RP11-312O7.2" -"984" "ITGB5" -"985" "DTL" -"986" "RP11-245P10.6" -"987" "RP11-544D21.2" -"988" "OR2W3" -"989" "RP11-407H12.8" -"990" "OR2T10" -"991" "FAM150B" -"992" "AC019118.2" -"993" "AC011747.7" -"994" "AC009228.1" -"995" "RP11-420A23.1" -"996" "GCKR" -"997" "CYP1B1-AS1" -"998" "SLC8A1-AS1" -"999" "CLHC1" -"1000" "TMEM17" -"1001" "AC097495.2" -"1002" "TGFA" -"1003" "AC007040.6" -"1004" "ATOH8" -"1005" "RP11-548P2.2" -"1006" "TEKT4" -"1007" "AC009505.2" -"1008" "AC104653.1" -"1009" "PKD2L2" -"1010" "FAM81B" -"1011" "AC140481.2" -"1012" "TNFAIP6" -"1013" "RP11-1152H14.1" -"1014" "SCN3A" -"1015" "BBS5" -"1016" "AC010894.3" -"1017" "OSBPL6" -"1018" "DFNB59" -"1019" "FZD5" -"1020" "CRYGD" -"1021" "DIRC3" -"1022" "RP11-16P6.1" -"1023" "B3GNT7" -"1024" "SAG" -"1025" "IQCA1" -"1026" "AC105760.2" -"1027" "RP11-445F6.2" -"1028" "FAM132B" -"1029" "CXXC11" -"1030" "MYCT1" -"1031" "PPARG" -"1032" "UBE2E2-AS1" -"1033" "THRB" -"1034" "RP11-10C24.3" -"1035" "HOXA1" -"1036" "VIPR1-AS1" -"1037" "KRBOX1-1" -"1038" "LIMD1-AS1" -"1039" "RP13-131K19.1" -"1040" "LAMB2" -"1041" "RP5-966M1.6" -"1042" "RP11-81N13.1" -"1043" "MGAM" -"1044" "HHLA2" -"1045" "RAB43" -"1046" "RP11-102M11.2" -"1047" "IL20RB" -"1048" "TERC" -"1049" "ZDHHC19" -"1050" "TM4SF19-1" -"1051" "RP13-616I3.1" -"1052" "STK32B" -"1053" "CC2D2A" -"1054" "KIT" -"1055" "RP11-646I6.5" -"1056" "RP11-798L4.1" -"1057" "RP11-127B20.2" -"1058" "RP11-499E18.1" -"1059" "C4orf21" -"1060" "FAT4" -"1061" "CCRN4L" -"1062" "MGARP" -"1063" "NEIL3" -"1064" "CTD-2044J15.2" -"1065" "KNDC1" -"1066" "PRLR" -"1067" "CTD-2113L7.1" -"1068" "RAB3C" -"1069" "RP11-307L14.1" -"1070" "MAST4-AS1" -"1071" "DMGDH" -"1072" "CKMT2" -"1073" "GPR98" -"1074" "CDCA3" -"1075" "EPB41L4A" -"1076" "CTC-487M23.8" -"1077" "ZNF608" -"1078" "CTC-203F4.2" -"1079" "SPOCK1" -"1080" "AICDA" -"1081" "SLC23A1" -"1082" "MIR143HG" -"1083" "CTC-248O19.1" -"1084" "NIPAL4" -"1085" "SOX30" -"1086" "RP11-175K6.1" -"1087" "C5orf58" -"1088" "C6orf52" -"1089" "RP11-456H18.2" -"1090" "HIST1H2BB" -"1091" "HIST1H2AD" -"1092" "HIST1H2AI" -"1093" "PGBD1" -"1094" "POU5F1" -"1095" "ARMC12" -"1096" "RP1-153P14.5" -"1097" "RP3-330M21.5" -"1098" "RCAN2" -"1099" "EYS" -"1100" "RP11-63L7.5" -"1101" "RP1-249I4.2" -"1102" "SLC22A16" -"1103" "RP1-93H18.7" -"1104" "RP11-10J5.1" -"1105" "RP1-67K17.4" -"1106" "RP1-45I4.3" -"1107" "STXBP5-AS1" -"1108" "RP11-350J20.12" -"1109" "CCDC170" -"1110" "ESR1" -"1111" "RP5-933K21.3" -"1112" "PNLDC1" -"1113" "SLC22A3" -"1114" "AC093627.9" -"1115" "PDGFA" -"1116" "RP11-449P15.2" -"1117" "RP11-1275H24.1" -"1118" "AC004895.4" -"1119" "HOXA10-AS" -"1120" "RP11-638I8.1" -"1121" "ZPBP" -"1122" "C7orf72" -"1123" "RP11-340I6.8" -"1124" "RP11-458F8.4" -"1125" "CALN1" -"1126" "LRRD1" -"1127" "AC002451.3" -"1128" "SLC26A4" -"1129" "ST7-OT4" -"1130" "POT1-AS1" -"1131" "SLC13A4" -"1132" "FAM131B" -"1133" "ARHGEF35" -"1134" "MAP3K15" -"1135" "PTCHD1" -"1136" "LANCL3" -"1137" "JADE3" -"1138" "ZNF157" -"1139" "XPNPEP2" -"1140" "SLC6A8" -"1141" "RP11-91J19.4" -"1142" "TNFRSF10C" -"1143" "RP11-380I10.4" -"1144" "RBPMS" -"1145" "XKR4" -"1146" "PENK" -"1147" "MCMDC2" -"1148" "RP11-48B3.3" -"1149" "AC023632.1" -"1150" "SDC2" -"1151" "CASC8" -"1152" "RP13-467H17.1" -"1153" "GS1-393G12.12" -"1154" "RECQL4" -"1155" "RP11-509J21.3" -"1156" "SPATA6L" -"1157" "LURAP1L" -"1158" "CDKN2B-AS1" -"1159" "RUSC2" -"1160" "MAMDC2-AS1" -"1161" "PRUNE2" -"1162" "RP11-154D17.1" -"1163" "RP11-435O5.5" -"1164" "HSD17B3" -"1165" "CTSV" -"1166" "RP11-217B7.2" -"1167" "RP11-235C23.5" -"1168" "NR6A1" -"1169" "RP11-344B5.2" -"1170" "RP11-492E3.51" -"1171" "COL5A1" -"1172" "C9orf163" -"1173" "FAM157B" -"1174" "IDI2-AS1" -"1175" "RP11-342D11.3" -"1176" "NAMPTL" -"1177" "C10orf10" -"1178" "JMJD1C-AS1" -"1179" "DNA2" -"1180" "AC022532.1" -"1181" "ZMIZ1-AS1" -"1182" "NUTM2E" -"1183" "RP11-77P6.2" -"1184" "RP11-76P2.4" -"1185" "NDUFB8" -"1186" "KCNIP2" -"1187" "RP11-451M19.3" -"1188" "FGFR2" -"1189" "ATE1-AS1" -"1190" "CDHR5" -"1191" "BRSK2" -"1192" "RP11-732A19.9" -"1193" "LDHAL6A" -"1194" "MPPED2" -"1195" "DEPDC7" -"1196" "RAPSN" -"1197" "RP11-804A23.4" -"1198" "ZP1" -"1199" "RP11-21A7A.3" -"1200" "RP11-783K16.14" -"1201" "CNIH2" -"1202" "RBM14-RBM4" -"1203" "RP11-849H4.4" -"1204" "P4HA3" -"1205" "KLHL35" -"1206" "LRRC32" -"1207" "RP11-89C3.4" -"1208" "KIRREL3" -"1209" "GLB1L3" -"1210" "NRIP2" -"1211" "TSPAN9" -"1212" "CCND2-AS1" -"1213" "RP11-118B22.4" -"1214" "CLEC12B" -"1215" "CLEC1A" -"1216" "STYK1" -"1217" "GPR19" -"1218" "SMCO3" -"1219" "AC026310.1" -"1220" "RP11-421F16.3" -"1221" "RP11-967K21.1" -"1222" "RP11-328C8.4" -"1223" "RP11-96H19.1" -"1224" "RP11-89H19.1" -"1225" "KRT81" -"1226" "SOAT2" -"1227" "CYP27B1" -"1228" "RP11-320P7.1" -"1229" "RP11-588H23.3" -"1230" "NTN4" -"1231" "STK17A" -"1232" "C16orf13" -"1233" "STUB1" -"1234" "DSCR3" -"1235" "KIF5B" -"1236" "ABRACL" -"1237" "CORO1B" -"1238" "HLA-DMA" -"1239" "KARS" -"1240" "SH3GLB1" -"1241" "MYADM" -"1242" "NDUFB10" -"1243" "TMEM219" -"1244" "CIR1" -"1245" "VPS28" -"1246" "AP2S1" -"1247" "ALDH2" -"1248" "C14orf166" -"1249" "IRF9" -"1250" "ZC3H15" -"1251" "NSA2" -"1252" "CLNS1A" -"1253" "MED30" -"1254" "NXT2" -"1255" "LMAN2" -"1256" "DNAJC15" -"1257" "SCPEP1" -"1258" "FERMT3" -"1259" "JTB" -"1260" "GCA" -"1261" "THYN1" -"1262" "BMPR2" -"1263" "PLA2G12A" -"1264" "FAM96B" -"1265" "AATF" -"1266" "LRRFIP1" -"1267" "ATG4C" -"1268" "VAMP5" -"1269" "RPN2" -"1270" "CCT2" -"1271" "DDT" -"1272" "FKBP3" -"1273" "CTNNBL1" -"1274" "GDI2" -"1275" "KDM3B" -"1276" "DNAJA3" -"1277" "EIF5" -"1278" "ARHGDIA" -"1279" "ELOF1" -"1280" "MLX" -"1281" "ANAPC11" -"1282" "LUC7L" -"1283" "CAT" -"1284" "RNF139" -"1285" "TTC14" -"1286" "UBE2D1" -"1287" "VKORC1" -"1288" "PRKD2" -"1289" "PHF14" -"1290" "UBE2L6" -"1291" "EFHD2" -"1292" "ACP1" -"1293" "CD47" -"1294" "GNB2" -"1295" "TMEM205" -"1296" "MRPS12" -"1297" "TSSC1" -"1298" "OSCAR" -"1299" "TAF12" -"1300" "MMADHC" -"1301" "PPP2CA" -"1302" "MESDC2" -"1303" "IDI1" -"1304" "NOP58" -"1305" "EIF4E" -"1306" "REXO2" -"1307" "ZBP1" -"1308" "NAT9" -"1309" "MTERFD2" -"1310" "PARP1" -"1311" "RNF213" -"1312" "MYCBP2" -"1313" "SCP2" -"1314" "C21orf33" -"1315" "TIMM17A" -"1316" "C19orf52" -"1317" "TMEM165" -"1318" "TBCB" -"1319" "STX18" -"1320" "TOMM22" -"1321" "ADD1" -"1322" "DNAJA1" -"1323" "EMB" -"1324" "OXLD1" -"1325" "DERL1" -"1326" "ZNF688" -"1327" "CMTM7" -"1328" "RER1" -"1329" "PACSIN2" -"1330" "ADSL" -"1331" "ISCA2" -"1332" "PRDX4" -"1333" "ECHDC1" -"1334" "HDAC5" -"1335" "UNC45A" -"1336" "RBM7" -"1337" "PCNP" -"1338" "VTI1B" -"1339" "FKBP5" -"1340" "NUP54" -"1341" "CDA" -"1342" "VPS25" -"1343" "C15orf48" -"1344" "UBXN4" -"1345" "RNF113A" -"1346" "EIF2B1" -"1347" "PNRC1" -"1348" "GGA3" -"1349" "ITPA" -"1350" "WDR55" -"1351" "ZNF493" -"1352" "SURF6" -"1353" "GINM1" -"1354" "RPUSD2" -"1355" "NCOR2" -"1356" "BSDC1" -"1357" "REEP3" -"1358" "CDC40" -"1359" "LILRB2" -"1360" "TRADD" -"1361" "PSMC5" -"1362" "MFSD10" -"1363" "PLD6" -"1364" "CHD2" -"1365" "CCDC91" -"1366" "PMVK" -"1367" "CASP4" -"1368" "EIF3D" -"1369" "SNX9" -"1370" "RNF187" -"1371" "ATP5A1" -"1372" "ERGIC3" -"1373" "RILPL2" -"1374" "ARRDC3" -"1375" "BTN3A2" -"1376" "ZUFSP" -"1377" "C9orf16" -"1378" "CEPT1" -"1379" "OAZ2" -"1380" "CCDC12" -"1381" "SAFB2" -"1382" "YPEL5" -"1383" "GATA2" -"1384" "AURKB" -"1385" "LDHA" -"1386" "PTGES3" -"1387" "PGK1" -"1388" "SCGB3A1" -"1389" "ATXN10" -"1390" "PCBP1" -"1391" "MNDA" -"1392" "C1QC" -"1393" "PPIG" -"1394" "BAZ2A" -"1395" "MRPL9" -"1396" "EVI2B" -"1397" "PPT1" -"1398" "ERH" -"1399" "NUDT16L1" -"1400" "RNF181" -"1401" "ING5" -"1402" "STRA13" -"1403" "BBC3" -"1404" "PPIE" -"1405" "NT5C" -"1406" "PITHD1" -"1407" "PTAFR" -"1408" "REEP5" -"1409" "CDT1" -"1410" "PLBD1" -"1411" "LAMTOR1" -"1412" "SIGLEC10" -"1413" "ATP1A1" -"1414" "DUT" -"1415" "MYOM2" -"1416" "TMEM9B" -"1417" "GMPR2" -"1418" "METTL3" -"1419" "RBP7" -"1420" "AHSA1" -"1421" "NDNL2" -"1422" "GPS1" -"1423" "RAN" -"1424" "PNISR" -"1425" "CENPF" -"1426" "COMMD5" -"1427" "MRPL47" -"1428" "CISD3" -"1429" "ATP1B3" -"1430" "DHRS4L2" -"1431" "DIAPH1" -"1432" "DUSP10" -"1433" "MT-ND6" -"1434" "ARPC5" -"1435" "CDC123" -"1436" "CYTIP" -"1437" "CGRRF1" -"1438" "CYB5B" -"1439" "HSP90B1" -"1440" "GNAI2" -"1441" "ATP5O" -"1442" "NCAPG" -"1443" "HSD17B11" -"1444" "WDR45" -"1445" "HAVCR2" -"1446" "ADI1" -"1447" "C5orf15" -"1448" "DONSON" -"1449" "NIT2" -"1450" "WDR5" -"1451" "HIST1H2BC" -"1452" "IL7R" -"1453" "NIFK" -"1454" "DNAJA2" -"1455" "MCM2" -"1456" "LYN" -"1457" "GOLGB1" -"1458" "CCDC85B" -"1459" "FGR" -"1460" "ZAP70" -"1461" "MRPS33" -"1462" "LSM6" -"1463" "RPL22L1" -"1464" "XRCC5" -"1465" "IFIT5" -"1466" "SMARCC2" -"1467" "HAUS1" -"1468" "MAX" -"1469" "FCGR2A" -"1470" "ZNF593" -"1471" "E2F3" -"1472" "PFDN2" -"1473" "CEP120" -"1474" "MRPL12" -"1475" "ADAM10" -"1476" "ASAH1" -"1477" "GIMAP7" -"1478" "CTD-2302E22.4" -"1479" "SRSF3" -"1480" "ZFP36L1" -"1481" "TEN1" -"1482" "TGFB1" -"1483" "YTHDF2" -"1484" "CRBN" -"1485" "DHRS7" -"1486" "FBXO33" -"1487" "KIAA0930" -"1488" "MBNL2" -"1489" "MRPL23" -"1490" "ARPC1B" -"1491" "CLIP1" -"1492" "CKS1B" -"1493" "NAA25" -"1494" "TMEM104" -"1495" "NDUFA11" -"1496" "SEC11C" -"1497" "JUND" -"1498" "MED7" -"1499" "HNRNPA0" -"1500" "MTDH" -"1501" "RBM17" -"1502" "FBXO21" -"1503" "MED27" -"1504" "FTSJ2" -"1505" "NARS" -"1506" "RASGRP4" -"1507" "DRAXIN" -"1508" "TAPBP" -"1509" "CENPU" -"1510" "MRPL28" -"1511" "SAAL1" -"1512" "FCGRT" -"1513" "GSK3A" -"1514" "TP53BP2" -"1515" "WDR83" -"1516" "DOK2" -"1517" "EIF2S3" -"1518" "TRAF3IP3" -"1519" "ARPC5L" -"1520" "FAM89B" -"1521" "GNG3" -"1522" "ABCC3" -"1523" "FGL2" -"1524" "HEXIM2" -"1525" "BCL2A1" -"1526" "GNS" -"1527" "BBS2" -"1528" "ARF4" -"1529" "METTL9" -"1530" "STK32C" -"1531" "RELT" -"1532" "GZMM" -"1533" "OBSCN" -"1534" "HLA-DMB" -"1535" "PPIF" -"1536" "CTSC" -"1537" "FAM43A" -"1538" "RAB2A" -"1539" "SMC4" -"1540" "CSNK1A1" -"1541" "TRIOBP" -"1542" "NR2C2AP" -"1543" "RANBP1" -"1544" "POLR2I" -"1545" "EIF3M" -"1546" "RSL1D1" -"1547" "ATP6V1C1" -"1548" "CD82" -"1549" "DTX2" -"1550" "FCGR1A" -"1551" "DHX8" -"1552" "ACTN4" -"1553" "JAZF1" -"1554" "KLRC2" -"1555" "SWAP70" -"1556" "ZNF468" -"1557" "PDZK1IP1" -"1558" "TMEM91" -"1559" "ASGR1" -"1560" "BLVRA" -"1561" "CTC-378H22.1" -"1562" "ZMAT3" -"1563" "GTF3A" -"1564" "NF1" -"1565" "PPA2" -"1566" "SAMD3" -"1567" "MX1" -"1568" "MEF2D" -"1569" "TMEM229B" -"1570" "PRPF8" -"1571" "ZBTB10" -"1572" "SENP2" -"1573" "C20orf196" -"1574" "ATP5D" -"1575" "RP11-1399P15.1" -"1576" "ALKBH4" -"1577" "CDK1" -"1578" "ADAL" -"1579" "PGBD2" -"1580" "LIG1" -"1581" "POU2F2" -"1582" "POLG" -"1583" "DENND2D" -"1584" "PTPRN2" -"1585" "RPL39L" -"1586" "SRPK1" -"1587" "TXNDC17" -"1588" "EHMT2" -"1589" "ICOS" -"1590" "DYNC2LI1" -"1591" "C16orf58" -"1592" "MRPL41" -"1593" "CDC37" -"1594" "COMMD8" -"1595" "SGK1" -"1596" "TOP2A" -"1597" "NAIP" -"1598" "NDUFA2" -"1599" "C1orf54" -"1600" "GRN" -"1601" "ZNF397" -"1602" "FLNA" -"1603" "NRROS" -"1604" "CORO1C" -"1605" "TMC8" -"1606" "ITCH" -"1607" "RABIF" -"1608" "ANKRA2" -"1609" "ANKRD49" -"1610" "FASTKD1" -"1611" "SMYD4" -"1612" "TAF1" -"1613" "CLCN3" -"1614" "CTSZ" -"1615" "PGM2" -"1616" "MARCKSL1" -"1617" "CLSTN3" -"1618" "DICER1" -"1619" "MLTK" -"1620" "EPSTI1" -"1621" "SFR1" -"1622" "SIRT6" -"1623" "RIT1" -"1624" "DOHH" -"1625" "RHBDD3" -"1626" "HMG20A" -"1627" "VMAC" -"1628" "C12orf45" -"1629" "SLC25A11" -"1630" "RP5-827C21.4" -"1631" "HARS" -"1632" "IL17RA" -"1633" "USF1" -"1634" "PICALM" -"1635" "RP11-111M22.3" -"1636" "HDAC2" -"1637" "STT3A" -"1638" "TMEM234" -"1639" "OSTC" -"1640" "UCHL1" -"1641" "EIF2S2" -"1642" "TRPV2" -"1643" "LAT2" -"1644" "USP25" -"1645" "LPIN1" -"1646" "OAS1" -"1647" "ANKRD44" -"1648" "XRCC6" -"1649" "ANKHD1" -"1650" "COX7B" -"1651" "GALNT1" -"1652" "HSPD1" -"1653" "AMDHD2" -"1654" "HDGF" -"1655" "CTC-444N24.11" -"1656" "GADD45G" -"1657" "LPAR5" -"1658" "GAS6" -"1659" "MAFF" -"1660" "COG4" -"1661" "OAS3" -"1662" "RBFA" -"1663" "TCTA" -"1664" "TANGO6" -"1665" "PRKCD" -"1666" "RGMB" -"1667" "RPUSD1" -"1668" "PCYT1A" -"1669" "RP11-301O19.1" -"1670" "CISH" -"1671" "TMEM116" -"1672" "CEP164" -"1673" "MDS2" -"1674" "FHL1" -"1675" "DAK" -"1676" "TRAF7" -"1677" "POLR3E" -"1678" "CDK16" -"1679" "SLC31A2" -"1680" "SMCHD1" -"1681" "ANAPC4" -"1682" "UBE2R2" -"1683" "RP11-390E23.6" -"1684" "USP8" -"1685" "AIM2" -"1686" "NDUFS1" -"1687" "SCAND1" -"1688" "BLNK" -"1689" "SMPDL3A" -"1690" "BPTF" -"1691" "SSR3" -"1692" "CIDEB" -"1693" "PKN2" -"1694" "COLGALT1" -"1695" "FAM127A" -"1696" "AAR2" -"1697" "ACAT2" -"1698" "RAB27B" -"1699" "AAAS" -"1700" "ZCCHC11" -"1701" "DAGLB" -"1702" "RAB34" -"1703" "RP11-138A9.2" -"1704" "GRINA" -"1705" "HMGA1" -"1706" "MGRN1" -"1707" "NELL2" -"1708" "MAF1" -"1709" "NFAT5" -"1710" "DNAJB14" -"1711" "TOP1MT" -"1712" "AKAP8" -"1713" "GIMAP1" -"1714" "TUBB" -"1715" "BANP" -"1716" "LRRC8C" -"1717" "GSTZ1" -"1718" "USF2" -"1719" "TARSL2" -"1720" "CDK19" -"1721" "MLEC" -"1722" "ANKZF1" -"1723" "LYRM4" -"1724" "PASK" -"1725" "CYB561" -"1726" "SMARCD1" -"1727" "STAU2" -"1728" "SYTL2" -"1729" "TXK" -"1730" "USP19" -"1731" "LSM14A" -"1732" "C5AR1" -"1733" "DIDO1" -"1734" "TUBA4A" -"1735" "PELI1" -"1736" "TCL1B" -"1737" "GFER" -"1738" "UBAP2" -"1739" "ERCC6L2" -"1740" "LBR" -"1741" "PEX26" -"1742" "ZFYVE28" -"1743" "SKAP2" -"1744" "SPATS2L" -"1745" "ZNF195" -"1746" "AK2" -"1747" "SNHG12" -"1748" "FAM207A" -"1749" "RBBP6" -"1750" "AP003733.1" -"1751" "GLRX5" -"1752" "SPG20" -"1753" "HVCN1" -"1754" "BBX" -"1755" "SF3A3" -"1756" "KIF3A" -"1757" "PRR12" -"1758" "P2RX5" -"1759" "ZNF106" -"1760" "MVD" -"1761" "APH1B" -"1762" "CIRH1A" -"1763" "THAP2" -"1764" "CHMP1B" -"1765" "WBP2" -"1766" "LTV1" -"1767" "RMND5A" -"1768" "IL1RAP" -"1769" "C3orf38" -"1770" "DNMT3A" -"1771" "RFC2" -"1772" "ZMAT5" -"1773" "LINC01003" -"1774" "TRUB2" -"1775" "BRK1" -"1776" "TNFAIP2" -"1777" "APOBEC3C" -"1778" "MVB12A" -"1779" "MINA" -"1780" "TXNDC5" -"1781" "TPM2" -"1782" "ARG2" -"1783" "SLC16A5" -"1784" "NAT14" -"1785" "TYW5" -"1786" "ARL16" -"1787" "DENND6A" -"1788" "POLR3K" -"1789" "RNF26" -"1790" "TMEM194A" -"1791" "TMUB2" -"1792" "NEXN" -"1793" "ZYX" -"1794" "ZNF3" -"1795" "SAMD9L" -"1796" "ATG7" -"1797" "LAIR1" -"1798" "NAAA" -"1799" "B4GALT4" -"1800" "GTF2H2" -"1801" "SLC39A1" -"1802" "PLA2G7" -"1803" "SLC44A1" -"1804" "APMAP" -"1805" "ZNF628" -"1806" "MKNK1" -"1807" "QRSL1" -"1808" "IP6K1" -"1809" "LAS1L" -"1810" "NUDCD3" -"1811" "SLC4A7" -"1812" "NDUFS3" -"1813" "URGCP" -"1814" "YDJC" -"1815" "MRPS18A" -"1816" "ATG16L2" -"1817" "CBX5" -"1818" "CCPG1" -"1819" "DPM1" -"1820" "ST3GAL2" -"1821" "PTGES2" -"1822" "RAB10" -"1823" "IL4R" -"1824" "TMEM60" -"1825" "RAB4B" -"1826" "SAMD4B" -"1827" "DDB2" -"1828" "RHEBL1" -"1829" "TMBIM1" -"1830" "TMEM69" -"1831" "SREK1" -"1832" "POLD2" -"1833" "USP33" -"1834" "INO80C" -"1835" "IRAK1" -"1836" "ATPAF1" -"1837" "DDAH2" -"1838" "PPP1R8" -"1839" "TMEM189" -"1840" "NFATC1" -"1841" "SMIM14" -"1842" "SLFN5" -"1843" "POP7" -"1844" "AP3M1" -"1845" "MAT2A" -"1846" "ADA" -"1847" "RCL1" -"1848" "HTATIP2" -"1849" "TBXAS1" -"1850" "LIX1L" -"1851" "ALOX5AP" -"1852" "DIS3" -"1853" "PRDM2" -"1854" "CLPP" -"1855" "FLT3LG" -"1856" "SMCO4" -"1857" "GUCD1" -"1858" "NUMB" -"1859" "CD302" -"1860" "AC093323.3" -"1861" "ATXN7L3B" -"1862" "PIGL" -"1863" "ZCCHC10" -"1864" "MARCH6" -"1865" "PROCA1" -"1866" "AC113189.5" -"1867" "C1orf198" -"1868" "NSMAF" -"1869" "BTK" -"1870" "GOLT1B" -"1871" "GTF2F2" -"1872" "ST20" -"1873" "GHITM" -"1874" "GPR171" -"1875" "DLST" -"1876" "FAM103A1" -"1877" "TBC1D23" -"1878" "VOPP1" -"1879" "C6orf48" -"1880" "EXOC4" -"1881" "DTYMK" -"1882" "MYC" -"1883" "NUDT5" -"1884" "PHF3" -"1885" "C5orf30" -"1886" "CHIC2" -"1887" "TMEM62" -"1888" "AGA" -"1889" "POLDIP2" -"1890" "NUDT11" -"1891" "KIF11" -"1892" "BIRC3" -"1893" "ZNF341" -"1894" "ZNF836" -"1895" "NDUFAF4" -"1896" "RNPEP" -"1897" "CD27" -"1898" "USP20" -"1899" "ZNF626" -"1900" "ARSG" -"1901" "C1orf63" -"1902" "CCDC107" -"1903" "LTB4R" -"1904" "IL27RA" -"1905" "MBOAT7" -"1906" "SUV420H2" -"1907" "CCDC174" -"1908" "RALBP1" -"1909" "ARID5B" -"1910" "CD55" -"1911" "C1orf50" -"1912" "CERS2" -"1913" "TACC1" -"1914" "GARS" -"1915" "PLAC8" -"1916" "IFI44L" -"1917" "VPS72" -"1918" "TINF2" -"1919" "LAMP2" -"1920" "MKKS" -"1921" "ELL" -"1922" "SH2D1A" -"1923" "ABHD14A" -"1924" "FBXO7" -"1925" "PUM1" -"1926" "PHACTR1" -"1927" "OLFM1" -"1928" "UBE2E1" -"1929" "DDX54" -"1930" "COA6" -"1931" "MDH2" -"1932" "DNAJB9" -"1933" "TTTY15" -"1934" "C22orf39" -"1935" "HMGXB4" -"1936" "TAF1D" -"1937" "GLB1" -"1938" "C16orf52" -"1939" "CEP85L" -"1940" "TAOK3" -"1941" "TCEA2" -"1942" "ELMO1" -"1943" "CXXC1" -"1944" "PNO1" -"1945" "PILRB" -"1946" "SEC11A" -"1947" "C16orf54" -"1948" "HEMGN" -"1949" "KLF13" -"1950" "SNRNP27" -"1951" "SPIN1" -"1952" "TIMM22" -"1953" "TMEM80" -"1954" "STX17" -"1955" "PEX16" -"1956" "BRAT1" -"1957" "SERPINB1" -"1958" "JARID2" -"1959" "ASXL2" -"1960" "CTNNBIP1" -"1961" "PGRMC2" -"1962" "SMU1" -"1963" "C9orf142" -"1964" "PRAF2" -"1965" "GRAP" -"1966" "HNRNPL" -"1967" "PACRGL" -"1968" "IQCE" -"1969" "DENND1C" -"1970" "PCP2" -"1971" "HSPBP1" -"1972" "SNRPB" -"1973" "PRPF38A" -"1974" "TMCO1" -"1975" "SLC2A3" -"1976" "SETD5" -"1977" "FAAH" -"1978" "PHPT1" -"1979" "IFT57" -"1980" "TRIM8" -"1981" "ADAM8" -"1982" "CD96" -"1983" "PDHB" -"1984" "VPS13A" -"1985" "CCT4" -"1986" "RPUSD4" -"1987" "KLHL6" -"1988" "SPEN" -"1989" "CAPNS1" -"1990" "ARAP1" -"1991" "NUDT9" -"1992" "EMC10" -"1993" "MID1IP1" -"1994" "PCNX" -"1995" "RAB21" -"1996" "SELPLG" -"1997" "CSRNP1" -"1998" "MRTO4" -"1999" "TMEM102" -"2000" "METTL13" -"2001" "PHF5A" -"2002" "DEXI" -"2003" "SIAH2" -"2004" "HENMT1" -"2005" "CD4" -"2006" "RARS" -"2007" "NOG" -"2008" "CNPY3" -"2009" "SLC6A6" -"2010" "RASAL3" -"2011" "RP11-792A8.4" -"2012" "TFAM" -"2013" "ERCC1" -"2014" "GUCY1B3" -"2015" "CLSPN" -"2016" "MRPS36" -"2017" "ATP6V1D" -"2018" "AP3M2" -"2019" "TCEAL1" -"2020" "SYNE2" -"2021" "DOCK10" -"2022" "P2RY10" -"2023" "DUSP22" -"2024" "USP7" -"2025" "DHX36" -"2026" "ARIH2OS" -"2027" "NOP56" -"2028" "TOX4" -"2029" "MOB1A" -"2030" "TMEM203" -"2031" "ILF3" -"2032" "CTA-29F11.1" -"2033" "RBM25" -"2034" "RARA" -"2035" "TOB1" -"2036" "TMEM126B" -"2037" "XXbac-BPG299F13.17" -"2038" "MRPS18C" -"2039" "SDHA" -"2040" "HDLBP" -"2041" "PHGDH" -"2042" "TNFRSF25" -"2043" "RFC5" -"2044" "TBC1D8" -"2045" "MRE11A" -"2046" "RWDD4" -"2047" "ARHGEF2" -"2048" "MAPK14" -"2049" "DDX1" -"2050" "KHDRBS1" -"2051" "URB2" -"2052" "KRT7" -"2053" "MYO9B" -"2054" "RP3-395M20.9" -"2055" "ARL6" -"2056" "PQBP1" -"2057" "NOS3" -"2058" "RNPEPL1" -"2059" "TNS1" -"2060" "CCNE1" -"2061" "TIMM13" -"2062" "LRRC47" -"2063" "MORF4L2" -"2064" "BRD9" -"2065" "GPR35" -"2066" "LDOC1L" -"2067" "TCEA1" -"2068" "MLLT10" -"2069" "C9orf69" -"2070" "GPBP1L1" -"2071" "CYLD" -"2072" "SDAD1" -"2073" "C5orf56" -"2074" "COMMD4" -"2075" "ZNF276" -"2076" "TBC1D15" -"2077" "DLGAP4" -"2078" "PNPLA8" -"2079" "LDLRAP1" -"2080" "NKIRAS2" -"2081" "NME3" -"2082" "VPS29" -"2083" "ZFX" -"2084" "DYNLT1" -"2085" "CLPX" -"2086" "NARG2" -"2087" "SEC31A" -"2088" "TCF7" -"2089" "CCNH" -"2090" "TMX3" -"2091" "ANKRD22" -"2092" "CNOT7" -"2093" "TM7SF3" -"2094" "TMEM87A" -"2095" "CALHM2" -"2096" "DDX17" -"2097" "ANKRD36C" -"2098" "KIAA1429" -"2099" "ECI2" -"2100" "FAM173A" -"2101" "PSMA3" -"2102" "UBA2" -"2103" "SIGLEC14" -"2104" "TMEM199" -"2105" "C15orf61" -"2106" "DERL2" -"2107" "GRB2" -"2108" "CD84" -"2109" "ANXA6" -"2110" "ACTR6" -"2111" "SEPHS2" -"2112" "AGO4" -"2113" "NKTR" -"2114" "DTX3" -"2115" "DECR1" -"2116" "SAMM50" -"2117" "C20orf27" -"2118" "ZNHIT3" -"2119" "THOC6" -"2120" "MBD4" -"2121" "URM1" -"2122" "MRPL21" -"2123" "SDF2L1" -"2124" "KLF11" -"2125" "PPP2R5C" -"2126" "PCGF1" -"2127" "THEMIS" -"2128" "NDUFA4" -"2129" "CDV3" -"2130" "NOTCH2NL" -"2131" "ANXA2R" -"2132" "AMICA1" -"2133" "DESI1" -"2134" "ACTR1B" -"2135" "TOR1A" -"2136" "ALG13" -"2137" "CHERP" -"2138" "DMAP1" -"2139" "CYTH4" -"2140" "CCDC69" -"2141" "ATF7IP2" -"2142" "CASC4" -"2143" "ATP6V0E2" -"2144" "EBNA1BP2" -"2145" "C19orf24" -"2146" "SGOL1" -"2147" "DCP2" -"2148" "CDC16" -"2149" "GYS1" -"2150" "MARCH5" -"2151" "ATP6AP1" -"2152" "CNDP2" -"2153" "TLE4" -"2154" "TDG" -"2155" "NAPRT1" -"2156" "KIAA1430" -"2157" "NENF" -"2158" "MRPL40" -"2159" "SETX" -"2160" "EDC3" -"2161" "CYB561D2" -"2162" "RP11-421L21.3" -"2163" "KIAA0040" -"2164" "KDELR2" -"2165" "SH3BP5" -"2166" "U2SURP" -"2167" "LEPROT" -"2168" "TMEM248" -"2169" "IRAK4" -"2170" "ATAD1" -"2171" "PUS10" -"2172" "SPNS1" -"2173" "COPS4" -"2174" "SNAPIN" -"2175" "C1orf35" -"2176" "ZBTB8OS" -"2177" "BZRAP1-AS1" -"2178" "NANS" -"2179" "USP36" -"2180" "FOSL2" -"2181" "MRPL51" -"2182" "CNPY2" -"2183" "GGA2" -"2184" "APOA1BP" -"2185" "LPGAT1" -"2186" "PRPF18" -"2187" "SLU7" -"2188" "AMD1" -"2189" "ZNF32" -"2190" "BEX4" -"2191" "TAF6L" -"2192" "EIF1B" -"2193" "DGKZ" -"2194" "GALK1" -"2195" "HCCS" -"2196" "RNF166" -"2197" "TPD52L2" -"2198" "ARPP19" -"2199" "CCDC25" -"2200" "ZNF567" -"2201" "ECSIT" -"2202" "FOPNL" -"2203" "RBPJ" -"2204" "ZNF277" -"2205" "PLAGL2" -"2206" "YIPF3" -"2207" "ETS1" -"2208" "UTP6" -"2209" "CCDC66" -"2210" "CCNL1" -"2211" "MRPL42" -"2212" "PIGF" -"2213" "E4F1" -"2214" "RP11-400F19.6" -"2215" "CCDC124" -"2216" "HDDC3" -"2217" "HECTD1" -"2218" "TIMMDC1" -"2219" "TIMM10B" -"2220" "SNX5" -"2221" "RMDN3" -"2222" "RNF125" -"2223" "BABAM1" -"2224" "SF3B1" -"2225" "CAPZA1" -"2226" "C1orf86" -"2227" "CRLS1" -"2228" "AC010642.1" -"2229" "NRBF2" -"2230" "CAND1" -"2231" "BAG4" -"2232" "MPLKIP" -"2233" "QSOX1" -"2234" "RP5-1073O3.7" -"2235" "ACAA1" -"2236" "TMEM138" -"2237" "MOCS2" -"2238" "PTPN4" -"2239" "C16orf80" -"2240" "RP11-432I5.1" -"2241" "TNRC6B" -"2242" "RUNDC1" -"2243" "RP11-314N13.3" -"2244" "ASF1A" -"2245" "PRNP" -"2246" "POLE4" -"2247" "C1GALT1C1" -"2248" "WLS" -"2249" "BEX2" -"2250" "VIT" -"2251" "CRTAP" -"2252" "KLK1" -"2253" "ASCC2" -"2254" "DUS3L" -"2255" "DYNLL1" -"2256" "SRP72" -"2257" "MAP3K7" -"2258" "MPV17" -"2259" "STX4" -"2260" "THEM4" -"2261" "PPP2R3C" -"2262" "STK11IP" -"2263" "ALG5" -"2264" "MON1B" -"2265" "NFKBIA" -"2266" "RAB9A" -"2267" "WIBG" -"2268" "GTPBP6" -"2269" "ADH5" -"2270" "TPGS1" -"2271" "SNX10" -"2272" "EIF4E2" -"2273" "ZSWIM6" -"2274" "DCAF8" -"2275" "ANKEF1" -"2276" "RGS19" -"2277" "STX16" -"2278" "EI24" -"2279" "MRPL1" -"2280" "AGPAT1" -"2281" "HAUS5" -"2282" "NFATC3" -"2283" "FAM120C" -"2284" "FBXO25" -"2285" "IGSF6" -"2286" "THRAP3" -"2287" "MAP3K8" -"2288" "UGP2" -"2289" "ADPRM" -"2290" "SNN" -"2291" "TPST2" -"2292" "CAMK2G" -"2293" "OPTN" -"2294" "ORMDL2" -"2295" "SMARCB1" -"2296" "SNW1" -"2297" "IFI44" -"2298" "NPM3" -"2299" "SNHG7" -"2300" "LUC7L3" -"2301" "MZT2A" -"2302" "PWP1" -"2303" "NFYC" -"2304" "PSTPIP1" -"2305" "ITGB7" -"2306" "TMEM55A" -"2307" "C1orf123" -"2308" "MRPL18" -"2309" "PRKACB" -"2310" "CAPN12" -"2311" "PI4KB" -"2312" "UBE2F" -"2313" "DIMT1" -"2314" "NDUFB6" -"2315" "CD2AP" -"2316" "HMCES" -"2317" "MTIF3" -"2318" "RP11-139H15.1" -"2319" "ITM2A" -"2320" "RASGRP2" -"2321" "SARS" -"2322" "EPC1" -"2323" "RPL26L1" -"2324" "HMBOX1" -"2325" "TCEAL4" -"2326" "XXbac-BPGBPG55C20.2" -"2327" "EAPP" -"2328" "INIP" -"2329" "GOT2" -"2330" "PPIL4" -"2331" "NDUFA5" -"2332" "SNX14" -"2333" "PLEKHJ1" -"2334" "PBRM1" -"2335" "TRMT1L" -"2336" "ISY1" -"2337" "SRPR" -"2338" "IRF2" -"2339" "MFSD1" -"2340" "ACADM" -"2341" "CD48" -"2342" "NISCH" -"2343" "ENY2" -"2344" "LITAF" -"2345" "TGFBR2" -"2346" "HADHA" -"2347" "PCSK7" -"2348" "SNX20" -"2349" "IFT20" -"2350" "SATB1" -"2351" "CDC5L" -"2352" "NONO" -"2353" "DYNLL2" -"2354" "FRAT1" -"2355" "LRCH4" -"2356" "MTCH2" -"2357" "UBE3A" -"2358" "LMF2" -"2359" "PRPF6" -"2360" "NDUFA10" -"2361" "RP11-430B1.2" -"2362" "YPEL3" -"2363" "CAMLG" -"2364" "METTL21A" -"2365" "C12orf10" -"2366" "PLRG1" -"2367" "GYG1" -"2368" "RAD23A" -"2369" "GPR56" -"2370" "PSIP1" -"2371" "ETHE1" -"2372" "MRPS16" -"2373" "C8orf44" -"2374" "CCNG1" -"2375" "GBP4" -"2376" "RP11-66N24.3" -"2377" "QPRT" -"2378" "FBXO4" -"2379" "IMP3" -"2380" "ABCD4" -"2381" "ARL2BP" -"2382" "LINC00493" -"2383" "MAP2K7" -"2384" "FBXW5" -"2385" "RTFDC1" -"2386" "CCDC22" -"2387" "DCK" -"2388" "CHMP3" -"2389" "RORA" -"2390" "WDR1" -"2391" "DNAJC8" -"2392" "ATG12" -"2393" "USP5" -"2394" "FASTK" -"2395" "NAP1L4" -"2396" "FAM45A" -"2397" "GIT2" -"2398" "MRPS23" -"2399" "RBM14" -"2400" "EIF5B" -"2401" "RGS14" -"2402" "ARL4A" -"2403" "AFAP1L2" -"2404" "C15orf57" -"2405" "GOSR2" -"2406" "P2RY6" -"2407" "FFAR3" -"2408" "C5AR2" -"2409" "TASP1" -"2410" "DNAJC10" -"2411" "PIK3R1" -"2412" "DNAJC7" -"2413" "NR3C1" -"2414" "ACTR2" -"2415" "FOXP1" -"2416" "DNPH1" -"2417" "MFF" -"2418" "FRY-AS1" -"2419" "GNPDA2" -"2420" "DRAM2" -"2421" "ZMAT2" -"2422" "MGMT" -"2423" "PAFAH1B1" -"2424" "UBE2B" -"2425" "CALCOCO2" -"2426" "DDX46" -"2427" "EMC7" -"2428" "FAM120A" -"2429" "LARS" -"2430" "CDC42SE2" -"2431" "TRABD2A" -"2432" "MTERFD1" -"2433" "RP4-561L24.3" -"2434" "UBE2K" -"2435" "AMIGO1" -"2436" "DPCD" -"2437" "SEMA4F" -"2438" "ACOX2" -"2439" "PDCD4" -"2440" "MSH5" -"2441" "TXN2" -"2442" "TMEM14C" -"2443" "TIAM2" -"2444" "TMEM18" -"2445" "CTPS2" -"2446" "UFD1L" -"2447" "BUB3" -"2448" "ZMAT4" -"2449" "PEX19" -"2450" "ANKRD18A" -"2451" "CD274" -"2452" "C9orf147" -"2453" "hsa-mir-1199" -"2454" "MEIG1" -"2455" "DEF6" -"2456" "CEP55" -"2457" "RGL2" -"2458" "C14orf2" -"2459" "HPRT1" -"2460" "ARGLU1" -"2461" "PRRG4" -"2462" "CADM1" -"2463" "PRICKLE1" -"2464" "BLCAP" -"2465" "LINC01146" -"2466" "DUOX1" -"2467" "FXN" -"2468" "RP11-76E17.3" -"2469" "TXNL4B" -"2470" "CMTM3" -"2471" "SMPD3" -"2472" "TANK" -"2473" "ISOC1" -"2474" "RNF165" -"2475" "MED9" -"2476" "NANP" -"2477" "LYSMD4" -"2478" "WDR62" -"2479" "ESYT1" -"2480" "ZNF808" -"2481" "MAP2K3" -"2482" "SHARPIN" -"2483" "GALT" -"2484" "NDUFS2" -"2485" "RNF7" -"2486" "XPOT" -"2487" "DEGS1" -"2488" "RP11-575L7.8" -"2489" "CUTA" -"2490" "PIGT" -"2491" "RRS1" -"2492" "SIRPG" -"2493" "AAGAB" -"2494" "KPNA1" -"2495" "HMGCL" -"2496" "OAT" -"2497" "RAP1A" -"2498" "DCTN3" -"2499" "TGOLN2" -"2500" "LDHB" -"2501" "CELF1" -"2502" "ZNF92" -"2503" "RWDD1" -"2504" "TTC1" -"2505" "OLA1" -"2506" "ARID4A" -"2507" "YTHDC1" -"2508" "LYRM5" -"2509" "WHAMM" -"2510" "ARPC1A" -"2511" "CNEP1R1" -"2512" "GDPD1" -"2513" "PSMD7" -"2514" "CCDC109B" -"2515" "RHEB" -"2516" "ATP10D" -"2517" "CCDC94" -"2518" "ARF6" -"2519" "BRWD1" -"2520" "NOL7" -"2521" "PMF1" -"2522" "SSBP3" -"2523" "SRSF2" -"2524" "MAPK1IP1L" -"2525" "TRIM14" -"2526" "AP3S1" -"2527" "UIMC1" -"2528" "SPCS1" -"2529" "ELP6" -"2530" "NDUFA9" -"2531" "MAGEH1" -"2532" "PHLDA2" -"2533" "RCN2" -"2534" "ZFAND4" -"2535" "C16orf74" -"2536" "VPS51" -"2537" "CUL4B" -"2538" "SCAF11" -"2539" "SMIM12" -"2540" "CACYBP" -"2541" "PPP1R18" -"2542" "SNHG8" -"2543" "WTAP" -"2544" "RBMX" -"2545" "TREX1" -"2546" "BNIP2" -"2547" "LY86" -"2548" "NGFRAP1" -"2549" "CCT6A" -"2550" "DGUOK" -"2551" "GLTP" -"2552" "VPS13C" -"2553" "MRPL14" -"2554" "TMED5" -"2555" "IDH1" -"2556" "TRIM28" -"2557" "CD93" -"2558" "CORO7" -"2559" "C7orf26" -"2560" "RNASEH2B" -"2561" "RPIA" -"2562" "DDX24" -"2563" "NUDCD1" -"2564" "ARID4B" -"2565" "FGFR1OP2" -"2566" "ATXN3" -"2567" "CLTB" -"2568" "CASC3" -"2569" "RNF25" -"2570" "LENG1" -"2571" "COMMD3" -"2572" "ILF3-AS1" -"2573" "CYTH2" -"2574" "NAGA" -"2575" "TMEM177" -"2576" "MPHOSPH10" -"2577" "TC2N" -"2578" "POLR2E" -"2579" "PRR5L" -"2580" "MYO1G" -"2581" "ZNF75A" -"2582" "RCHY1" -"2583" "ACADVL" -"2584" "THUMPD3" -"2585" "NFKBIL1" -"2586" "TRA2B" -"2587" "GIMAP2" -"2588" "MGA" -"2589" "CAMK1D" -"2590" "MTIF2" -"2591" "UBIAD1" -"2592" "ANKAR" -"2593" "MGAT1" -"2594" "TWF2" -"2595" "EIF4G2" -"2596" "SLC25A38" -"2597" "LAMTOR5" -"2598" "ZNF330" -"2599" "CCDC152" -"2600" "NFU1" -"2601" "CAP1" -"2602" "EMG1" -"2603" "ZNF428" -"2604" "ODF3B" -"2605" "CCP110" -"2606" "TIMM9" -"2607" "CRTC2" -"2608" "MADD" -"2609" "STX5" -"2610" "MIS18BP1" -"2611" "TCEAL8" -"2612" "GMEB1" -"2613" "SPRTN" -"2614" "STAU1" -"2615" "RBMS1" -"2616" "SAMSN1" -"2617" "SNRPE" -"2618" "XRRA1" -"2619" "SNAP47" -"2620" "CCM2" -"2621" "PSMD4" -"2622" "ACTL6A" -"2623" "CIAPIN1" -"2624" "LYRM2" -"2625" "KIF9" -"2626" "SPSB2" -"2627" "AF213884.2" -"2628" "NHP2L1" -"2629" "RP11-295P9.3" -"2630" "SPCS2" -"2631" "PPM1G" -"2632" "TXN" -"2633" "LILRB3" -"2634" "TMEM222" -"2635" "GGH" -"2636" "GRAP2" -"2637" "WNK1" -"2638" "JKAMP" -"2639" "LMAN1" -"2640" "CSRP1" -"2641" "ECHS1" -"2642" "ZNF232" -"2643" "GTF2B" -"2644" "CCNI" -"2645" "RAB1B" -"2646" "ACOT13" -"2647" "RP11-178G16.4" -"2648" "SCFD1" -"2649" "DHX15" -"2650" "ARMC7" -"2651" "ISCU" -"2652" "LRRC59" -"2653" "BOLA3" -"2654" "TAF7" -"2655" "EFCAB14" -"2656" "SCAPER" -"2657" "SMS" -"2658" "RFXANK" -"2659" "CHN2" -"2660" "CPSF3L" -"2661" "TMBIM6" -"2662" "L3MBTL2" -"2663" "PARL" -"2664" "R3HDM2" -"2665" "CD1E" -"2666" "IL16" -"2667" "GNPAT" -"2668" "ST7L" -"2669" "RP11-589C21.6" -"2670" "PTGDR" -"2671" "MRPL43" -"2672" "PEMT" -"2673" "PRPS2" -"2674" "EIF2S1" -"2675" "RHOB" -"2676" "SPPL2A" -"2677" "ZNF131" -"2678" "SRA1" -"2679" "LAPTM4A" -"2680" "PDE12" -"2681" "SNRNP35" -"2682" "ATF4" -"2683" "NCBP2" -"2684" "NABP1" -"2685" "MRP63" -"2686" "VPS26B" -"2687" "ARHGAP30" -"2688" "MIS12" -"2689" "DHX9" -"2690" "TRIP11" -"2691" "CAPZB" -"2692" "RELB" -"2693" "FAM204A" -"2694" "MICU1" -"2695" "IMPDH2" -"2696" "ATM" -"2697" "PAXIP1-AS1" -"2698" "UXT" -"2699" "OSM" -"2700" "SDCCAG8" -"2701" "NUTF2" -"2702" "RPPH1" -"2703" "CDCA8" -"2704" "TAL1" -"2705" "UCK1" -"2706" "RP11-307C12.12" -"2707" "IRF4" -"2708" "TRIM58" -"2709" "ASAP2" -"2710" "EPOR" -"2711" "ITGB1BP1" -"2712" "BOLA3-AS1" -"2713" "PDXDC1" -"2714" "EXOC6" -"2715" "NCKAP1" -"2716" "RP13-131K19.2" -"2717" "FAM3D" -"2718" "LIMD2" -"2719" "NEK11" -"2720" "PIGX" -"2721" "RP11-10L12.4" -"2722" "ZNF45" -"2723" "C18orf21" -"2724" "CTD-2517O10.6" -"2725" "PTPN6" -"2726" "TMEM171" -"2727" "BAG5" -"2728" "TIFAB" -"2729" "FAXDC2" -"2730" "ZNF350" -"2731" "HIST1H4H" -"2732" "RABEP2" -"2733" "RP5-894D12.3" -"2734" "MNAT1" -"2735" "NME8" -"2736" "MBLAC1" -"2737" "MRPL2" -"2738" "SERPINE1" -"2739" "ZBED5-AS1" -"2740" "ZNF630" -"2741" "MRS2" -"2742" "LONRF3" -"2743" "SLC2A8" -"2744" "RP11-258F1.1" -"2745" "ZNF883" -"2746" "KCNC3" -"2747" "KCNMA1" -"2748" "RP11-416N2.4" -"2749" "RP11-142C4.6" -"2750" "TGFBRAP1" -"2751" "MT-ND5" -"2752" "SRGAP1" -"2753" "CBLN3" -"2754" "FBXO3" -"2755" "ABHD12" -"2756" "PKMYT1" -"2757" "AC137932.6" -"2758" "RP11-468E2.4" -"2759" "RP11-333E1.1" -"2760" "EVA1B" -"2761" "FAM106A" -"2762" "NEURL1" -"2763" "SNPH" -"2764" "AC005253.2" -"2765" "PLAGL1" -"2766" "DMC1" -"2767" "ZNF585A" -"2768" "SDHAF2" -"2769" "FEM1A" -"2770" "KLHL24" -"2771" "RNF168" -"2772" "ASB7" -"2773" "DHCR24" -"2774" "LEPR" -"2775" "SELL" -"2776" "PRKACA" -"2777" "RPS10P7" -"2778" "ACBD3" -"2779" "CXCR1" -"2780" "IRS1" -"2781" "DVL3" -"2782" "NMNAT3" -"2783" "PRKAR2B" -"2784" "PSMA1" -"2785" "RP11-297B17.3" -"2786" "SBDS" -"2787" "FIBCD1" -"2788" "MPC2" -"2789" "MLLT6" -"2790" "SUV39H2" -"2791" "KIAA1377" -"2792" "OASL" -"2793" "FNTA" -"2794" "RP11-1008C21.1" -"2795" "SMAP2" -"2796" "AC025335.1" -"2797" "NOL11" -"2798" "SLC5A10" -"2799" "TNFSF12" -"2800" "PLTP" -"2801" "ZNF207" -"2802" "DMWD" -"2803" "FADS1" -"2804" "FBXW4" -"2805" "ZNF813" -"2806" "STK4" -"2807" "ARPC4" -"2808" "WBP2NL" -"2809" "MAD2L1BP" -"2810" "CDADC1" -"2811" "USP51" -"2812" "DPY30" -"2813" "RP11-479G22.8" -"2814" "DBNDD1" -"2815" "SYVN1" -"2816" "CTC-297N7.5" -"2817" "ITSN1" -"2818" "BCL2L11" -"2819" "COMTD1" -"2820" "RFWD3" -"2821" "NNT-AS1" -"2822" "HERPUD2" -"2823" "TTPAL" -"2824" "EGLN3" -"2825" "SLC25A12" -"2826" "UQCC1" -"2827" "AKTIP" -"2828" "EOGT" -"2829" "MRPS6" -"2830" "FNBP4" -"2831" "TAF10" -"2832" "RP3-467K16.4" -"2833" "L1TD1" -"2834" "KLC4" -"2835" "RP11-443B7.1" -"2836" "RAB40C" -"2837" "AC079354.1" -"2838" "PGLS" -"2839" "SEPW1" -"2840" "TXNRD3" -"2841" "RAB11B" -"2842" "RP11-362K14.7" -"2843" "EIF2AK4" -"2844" "RP11-290F5.1" -"2845" "GPX3" -"2846" "RP11-393I2.4" -"2847" "TXLNB" -"2848" "RGS10" -"2849" "RP11-230C9.4" -"2850" "CTSB" -"2851" "GFRA2" -"2852" "CTD-2006H14.2" -"2853" "CHPF2" -"2854" "MSMP" -"2855" "APBB1IP" -"2856" "CDNF" -"2857" "HAX1" -"2858" "SUCLG2" -"2859" "SLC6A12" -"2860" "C1R" -"2861" "MDP1" -"2862" "N4BP2L1" -"2863" "RP11-511B23.1" -"2864" "CTD-2184C24.2" -"2865" "THAP11" -"2866" "MEG3" -"2867" "GOLGA7" -"2868" "RP11-452L6.7" -"2869" "RAB12" -"2870" "FAM83D" -"2871" "KRBOX4" -"2872" "SIGLEC12" -"2873" "TMED4" -"2874" "CTA-85E5.10" -"2875" "GLYCTK" -"2876" "RP3-508I15.21" -"2877" "MKL1" -"2878" "CHCHD3" -"2879" "DOK3" -"2880" "C9orf37" -"2881" "R3HDM1" -"2882" "FAM212B" -"2883" "NFE2L2" -"2884" "CSTB" -"2885" "GRPEL1" -"2886" "HOOK2" -"2887" "SSR2" -"2888" "ERI3" -"2889" "NR2C1" -"2890" "SIK1" -"2891" "SRP9" -"2892" "SRSF9" -"2893" "RNF14" -"2894" "TBPL1" -"2895" "ATP5F1" -"2896" "CR1" -"2897" "EIF4EBP1" -"2898" "SMDT1" -"2899" "ARHGAP24" -"2900" "TMEM251" -"2901" "MED28" -"2902" "PIGU" -"2903" "CEP68" -"2904" "UBE2I" -"2905" "BET1" -"2906" "C14orf80" -"2907" "RAB8A" -"2908" "PCMT1" -"2909" "HTT" -"2910" "PLEKHA1" -"2911" "DEDD" -"2912" "DNAJC19" -"2913" "RAB8B" -"2914" "DNTTIP1" -"2915" "UBE2D4" -"2916" "AP1B1" -"2917" "MTRF1" -"2918" "CCNB1" -"2919" "NOC4L" -"2920" "CNIH4" -"2921" "GLG1" -"2922" "DDX56" -"2923" "AES" -"2924" "IL3RA" -"2925" "LIN7A" -"2926" "CASP5" -"2927" "GPRC5C" -"2928" "CTNNB1" -"2929" "PYCRL" -"2930" "RIOK1" -"2931" "SCARB1" -"2932" "ALOX12" -"2933" "CANX" -"2934" "ZNF561" -"2935" "BLZF1" -"2936" "NELFB" -"2937" "CALM3" -"2938" "HSPB11" -"2939" "HNRNPA3" -"2940" "REPS2" -"2941" "NOP2" -"2942" "ABHD17B" -"2943" "CD163" -"2944" "CLEC7A" -"2945" "SGSM2" -"2946" "CENPT" -"2947" "SUSD1" -"2948" "C19orf53" -"2949" "TMEM160" -"2950" "PDCD2L" -"2951" "TRIM23" -"2952" "NPHP3" -"2953" "NME6" -"2954" "CWC27" -"2955" "RAB5C" -"2956" "POLR2K" -"2957" "GLRX" -"2958" "TIMM17B" -"2959" "DEPDC1B" -"2960" "EIF4A3" -"2961" "VSIG4" -"2962" "CDCA5" -"2963" "CDC45" -"2964" "KIAA0196" -"2965" "NFIC" -"2966" "VIPR1" -"2967" "ANKRD27" -"2968" "TAPSAR1" -"2969" "ZNF175" -"2970" "SIN3A" -"2971" "RABL2B" -"2972" "PAIP2B" -"2973" "BID" -"2974" "FTCDNL1" -"2975" "PSMC6" -"2976" "APC" -"2977" "COPS5" -"2978" "KIAA1715" -"2979" "SLC20A2" -"2980" "INTS2" -"2981" "VTI1A" -"2982" "PYURF" -"2983" "NECAB3" -"2984" "WBP5" -"2985" "MARK3" -"2986" "RARRES3" -"2987" "CECR5" -"2988" "HDAC9" -"2989" "PXMP4" -"2990" "RBM5" -"2991" "EID1" -"2992" "TRIT1" -"2993" "SLC19A1" -"2994" "TULP3" -"2995" "DPY19L1" -"2996" "C17orf59" -"2997" "OPRL1" -"2998" "C4orf3" -"2999" "RAB7A" -"3000" "NBR1" -"3001" "ZRANB3" -"3002" "TBXA2R" -"3003" "PLEKHB2" -"3004" "IDUA" -"3005" "CD27-AS1" -"3006" "NEFH" -"3007" "MALT1" -"3008" "C14orf119" -"3009" "CHPF" -"3010" "MKLN1" -"3011" "ZBTB47" -"3012" "RP11-506M13.3" -"3013" "TOP2B" -"3014" "LDLRAD3" -"3015" "SLC43A3" -"3016" "FAM111B" -"3017" "AATK" -"3018" "CTC-297N7.8" -"3019" "C4orf33" -"3020" "PTBP2" -"3021" "CASC7" -"3022" "EGLN2" -"3023" "EHD3" -"3024" "KCNK6" -"3025" "VPS54" -"3026" "C2orf40" -"3027" "NAP1L1" -"3028" "NR2C2" -"3029" "OSER1" -"3030" "ZNF502" -"3031" "CEP97" -"3032" "SDR39U1" -"3033" "TRMT10A" -"3034" "CTD-2015H6.3" -"3035" "LINC01024" -"3036" "GMPPA" -"3037" "NKAPL" -"3038" "CARD16" -"3039" "MED20" -"3040" "LAMP3" -"3041" "HRH2" -"3042" "IKBIP" -"3043" "PCAT1" -"3044" "ELP5" -"3045" "PAPSS2" -"3046" "FANK1" -"3047" "TGFBR1" -"3048" "FLT3" -"3049" "SLFN13" -"3050" "ADCY9" -"3051" "MT-ATP8" -"3052" "CENPL" -"3053" "CETP" -"3054" "TKTL1" -"3055" "GCSH" -"3056" "7SK-2" -"3057" "HYAL3" -"3058" "PRCD" -"3059" "CUEDC1" -"3060" "SIRPB2" -"3061" "REEP6" -"3062" "RNPS1" -"3063" "ADAT3" -"3064" "MPG" -"3065" "PSPN" -"3066" "ZNF404" -"3067" "CTD-2368P22.1" -"3068" "ANKRD54" -"3069" "FOXRED2" -"3070" "FMNL1" -"3071" "TST" -"3072" "TEF" -"3073" "PAXBP1-AS1" -"3074" "EMILIN2" -"3075" "RP11-488C13.5" -"3076" "C1QBP" -"3077" "TRIM69" -"3078" "YPEL2" -"3079" "ATP6V1E2" -"3080" "SF3B2" -"3081" "TBCK" -"3082" "AIM1L" -"3083" "BCL11A" -"3084" "FAM8A1" -"3085" "NUF2" -"3086" "C9orf91" -"3087" "COLGALT2" -"3088" "TMEM131" -"3089" "EML6" -"3090" "CSDE1" -"3091" "DYSF" -"3092" "MARS2" -"3093" "TMPRSS11E" -"3094" "CENPE" -"3095" "AL590452.1" -"3096" "CTD-2353F22.1" -"3097" "CXCR6" -"3098" "PKIB" -"3099" "AC004893.11" -"3100" "DDX51" -"3101" "CLCN5" -"3102" "AC145212.1" -"3103" "ZNF596" -"3104" "AC073072.5" -"3105" "RP11-390B4.5" -"3106" "ARHGAP6" -"3107" "RP11-338I21.1" -"3108" "ARHGAP19" -"3109" "LAMP5" -"3110" "RP11-430H10.1" -"3111" "RP11-701P16.5" -"3112" "AP001462.6" -"3113" "AURKC" -"3114" "WNT5B" -"3115" "EIF4A1" -"3116" "GPT2" -"3117" "SHPK-1" -"3118" "TPM4" -"3119" "PURA" -"3120" "TUBG2" -"3121" "ST6GALNAC1" -"3122" "ZNF337-AS1" -"3123" "DDIT4" -"3124" "RAC1" -"3125" "RP11-1094M14.11" -"3126" "DPH6" -"3127" "SLC2A13" -"3128" "PDK2" -"3129" "REC8" -"3130" "TTN-AS1" -"3131" "NDUFB11" -"3132" "SMC2" -"3133" "MIS18A" -"3134" "ACOT11" -"3135" "HCFC2" -"3136" "COX6C" -"3137" "RP11-122G18.5" -"3138" "RP11-443B7.3" -"3139" "TRIM11" -"3140" "CENPA" -"3141" "TUFM" -"3142" "CNRIP1" -"3143" "AC022201.5" -"3144" "BACE2" -"3145" "BIN1" -"3146" "KCNAB1" -"3147" "SKP1" -"3148" "DERL3" -"3149" "PLK4" -"3150" "AC068610.3" -"3151" "DNAJC1" -"3152" "CAV1" -"3153" "EARS2" -"3154" "RP11-305L7.3" -"3155" "RP11-324I22.4" -"3156" "HKDC1" -"3157" "RGS12" -"3158" "STRN" -"3159" "SUOX" -"3160" "CTD-2547L24.4" -"3161" "FAM154B" -"3162" "FPR2" -"3163" "HBQ1" -"3164" "IMP4" -"3165" "CTRL" -"3166" "CDH1" -"3167" "NFATC2" -"3168" "RP11-863P13.3" -"3169" "RP13-753N3.1" -"3170" "NDRG2" -"3171" "RP11-1151B14.4" -"3172" "ATP9A" -"3173" "LINC00659" -"3174" "MYL6" -"3175" "C19orf77" -"3176" "SNX29P2" -"3177" "AP1M2" -"3178" "RHOH" -"3179" "SMC3" -"3180" "ZNF763" -"3181" "DPY19L4" -"3182" "ZNF443" -"3183" "CDC20" -"3184" "CTD-2537I9.12" -"3185" "QPCTL" -"3186" "CBX3" -"3187" "ZNF135" -"3188" "USP30" -"3189" "ENO1" -"3190" "EIF3K" -"3191" "NIPSNAP1" -"3192" "MIR4435-1HG" -"3193" "RP11-70C1.1" -"3194" "FRMD3" -"3195" "AC115618.1" -"3196" "LINC00341" -"3197" "MCM3" -"3198" "PDE6B" -"3199" "PEX11G" -"3200" "ATP1B1" -"3201" "AFTPH" -"3202" "FAM72A" -"3203" "DISP1" -"3204" "TLR5" -"3205" "RP11-378A13.2" -"3206" "ACPP" -"3207" "MTCH1" -"3208" "TAPT1-AS1" -"3209" "YIPF5" -"3210" "GALM" -"3211" "RELL1" -"3212" "LMNB2" -"3213" "ARMCX5" -"3214" "GNAZ" -"3215" "ZFP69" -"3216" "RP11-809N8.4" -"3217" "CXCL10" -"3218" "TIRAP" -"3219" "RNF126" -"3220" "SLC25A15" -"3221" "TECPR2" -"3222" "ADSSL1" -"3223" "SIRT1" -"3224" "CCL2" -"3225" "PDIK1L" -"3226" "IGFBP4" -"3227" "RP11-166P13.4" -"3228" "LMNA" -"3229" "RP5-1103G7.4" -"3230" "ATXN1L" -"3231" "SNX4" -"3232" "ZNF69" -"3233" "LAIR2" -"3234" "NAPG" -"3235" "ZNF582-AS1" -"3236" "RP11-223C24.1" -"3237" "LONRF1" -"3238" "PTGS1" -"3239" "TPI1" -"3240" "RP11-727F15.12" -"3241" "SRRM1" -"3242" "CD19" -"3243" "NPIPB11" -"3244" "FASLG" -"3245" "CD3EAP" -"3246" "CRCP" -"3247" "LIMK1" -"3248" "PTRHD1" -"3249" "CPNE5" -"3250" "PRUNE" -"3251" "WDR76" -"3252" "NOSIP" -"3253" "RP4-575N6.4" -"3254" "GMFG" -"3255" "PAN2" -"3256" "MYO5A" -"3257" "DNAJB11" -"3258" "ZNF174" -"3259" "DBP" -"3260" "CMTR2" -"3261" "ABCC10" -"3262" "ACP2" -"3263" "DNAJC30" -"3264" "UGCG" -"3265" "MYNN" -"3266" "UTRN" -"3267" "PPIP5K2" -"3268" "RP1-28O10.1" -"3269" "XBP1" -"3270" "KPNA2" -"3271" "PARS2" -"3272" "MUM1" -"3273" "ORMDL1" -"3274" "TRIM16L" -"3275" "AP001053.11" -"3276" "C19orf43" -"3277" "CTC-338M12.5" -"3278" "DDI2" -"3279" "CTBS" -"3280" "EMR1" -"3281" "TRPC4AP" -"3282" "WDR60" -"3283" "AP1S2" -"3284" "CEACAM4" -"3285" "ZNF148" -"3286" "PJA1" -"3287" "RP11-532F6.3" -"3288" "RP11-85F14.5" -"3289" "ZSWIM8" -"3290" "COX14" -"3291" "NDUFS5" -"3292" "ZNF747" -"3293" "LAMTOR2" -"3294" "RP11-412D9.4" -"3295" "SLC10A7" -"3296" "MAPK7" -"3297" "AP2M1" -"3298" "MACROD2" -"3299" "LSM1" -"3300" "FAM210B" -"3301" "TOP1" -"3302" "DHX34" -"3303" "TMEM109" -"3304" "VWA8" -"3305" "RP11-796G6.2" -"3306" "AC144652.1" -"3307" "BLOC1S5" -"3308" "CSTA" -"3309" "RP11-362F19.1" -"3310" "MRPL52" -"3311" "RAD51B" -"3312" "ANXA11" -"3313" "CDKN2A" -"3314" "PRR4" -"3315" "SLC50A1" -"3316" "ARID5A" -"3317" "HSH2D" -"3318" "C1orf112" -"3319" "AC009948.5" -"3320" "SRGAP3" -"3321" "TMCC2" -"3322" "GHRL" -"3323" "FGFRL1" -"3324" "SERTAD1" -"3325" "COL19A1" -"3326" "SLC35A1" -"3327" "RP3-428L16.2" -"3328" "SCAI" -"3329" "ZNF12" -"3330" "CCZ1B" -"3331" "NUDT22" -"3332" "AC004854.4" -"3333" "ADAR" -"3334" "NCAPG2" -"3335" "ZNF674-AS1" -"3336" "RAC2" -"3337" "EDA" -"3338" "ENTPD3-AS1" -"3339" "RP11-297N6.4" -"3340" "ANK1" -"3341" "NSMCE1" -"3342" "DYNLRB1" -"3343" "E2F5" -"3344" "TMEM67" -"3345" "ARF1" -"3346" "RP11-434C1.1" -"3347" "NRL" -"3348" "GPR68" -"3349" "RP11-111A22.1" -"3350" "NEAT1" -"3351" "EFCAB7" -"3352" "SLC38A7" -"3353" "TNFAIP1" -"3354" "DHRS11" -"3355" "RP11-214N9.1" -"3356" "CCDC142" -"3357" "PPP1R13L" -"3358" "KCNMB3" -"3359" "ZNF765" -"3360" "PRELID2" -"3361" "HSPA1L" -"3362" "TMEM87B" -"3363" "KRT10" -"3364" "TSNARE1" -"3365" "ARHGEF39" -"3366" "PMPCA" -"3367" "INVS" -"3368" "NIPSNAP3B" -"3369" "RNF144B" -"3370" "AGAP4" -"3371" "PLXDC2" -"3372" "LDLRAD4" -"3373" "CTD-3138B18.5" -"3374" "LGALS12" -"3375" "AMDHD1" -"3376" "DYNLT3" -"3377" "RP11-275I4.1" -"3378" "ZNF669" -"3379" "RP11-862L9.3" -"3380" "LGMN" -"3381" "LIM2" -"3382" "GALNS" -"3383" "MYO15B" -"3384" "RP11-53I6.3" -"3385" "SERPINB8" -"3386" "PFAS" -"3387" "SNF8" -"3388" "GLUD1" -"3389" "KMT2B" -"3390" "RP3-325F22.5" -"3391" "IFRD1" -"3392" "TCF25" -"3393" "RP11-274B18.2" -"3394" "TADA2A" -"3395" "GFOD2" -"3396" "USP38" -"3397" "ARL4D" -"3398" "ENSA" -"3399" "DOCK5" -"3400" "N6AMT1" -"3401" "EAF2" -"3402" "RP11-545I5.3" -"3403" "AEBP1" -"3404" "RFT1" -"3405" "SPC25" -"3406" "GATA1" -"3407" "JUNB" -"3408" "CARD9" -"3409" "RP11-509J21.2" -"3410" "MSI2" -"3411" "CTC-524C5.2" -"3412" "PIM3" -"3413" "TMEM191C" -"3414" "ZFHX3" -"3415" "MTMR10" -"3416" "PHF11" -"3417" "PNOC" -"3418" "SUSD3" -"3419" "CD72" -"3420" "MT1F" -"3421" "SGTA" -"3422" "IL24" -"3423" "MED4" -"3424" "FAM76B" -"3425" "ZNF563" -"3426" "RFC4" -"3427" "AP4M1" -"3428" "CLCF1" -"3429" "EDF1" -"3430" "FRMD4B" -"3431" "RBM26-AS1" -"3432" "ZBTB17" -"3433" "LCORL" -"3434" "LINC01011" -"3435" "CDR2" -"3436" "TSPAN5" -"3437" "MCM5" -"3438" "LRBA" -"3439" "TATDN3" -"3440" "PDCD6" -"3441" "ZMPSTE24" -"3442" "TNFAIP3" -"3443" "PKIG" -"3444" "C12orf75" -"3445" "FXYD5" -"3446" "HEMK1" -"3447" "RLF" -"3448" "AC010883.5" -"3449" "CEP72" -"3450" "LINC01013" -"3451" "SLC22A5" -"3452" "KCTD9" -"3453" "LRRC27" -"3454" "MBNL1-AS1" -"3455" "CTD-2260A17.2" -"3456" "MIPEP" -"3457" "A2M-AS1" -"3458" "FNTB" -"3459" "CARM1" -"3460" "TTF1" -"3461" "FGGY" -"3462" "OTUD1" -"3463" "PDIA5" -"3464" "SMOX" -"3465" "RP11-539L10.3" -"3466" "FNBP1" -"3467" "NUDT6" -"3468" "DDX43" -"3469" "CAHM" -"3470" "RP11-66N11.8" -"3471" "RP11-262H14.4" -"3472" "EXD3" -"3473" "GBGT1" -"3474" "FUT4" -"3475" "USP10" -"3476" "ALKBH8" -"3477" "ARHGEF12" -"3478" "PEAK1" -"3479" "SORT1" -"3480" "STPG1" -"3481" "LGALS9B" -"3482" "CCT6B" -"3483" "LINC00910" -"3484" "ZNF212" -"3485" "GAB2" -"3486" "SLC17A9" -"3487" "ABCA5" -"3488" "C20orf201" -"3489" "DEK" -"3490" "RPS19BP1" -"3491" "ZIK1" -"3492" "RP3-400N23.6" -"3493" "ICA1" -"3494" "TTLL1" -"3495" "ERP29" -"3496" "UAP1" -"3497" "CAMTA1" -"3498" "ATG3" -"3499" "NUP210" -"3500" "ALG14" -"3501" "PLCL1" -"3502" "N4BP3" -"3503" "SLC25A46" -"3504" "DCUN1D2" -"3505" "RPL36AL" -"3506" "RP11-894P9.1" -"3507" "LSMD1" -"3508" "ZNF407" -"3509" "SNTA1" -"3510" "TREM1" -"3511" "FCAR" -"3512" "RFPL2" -"3513" "STK36" -"3514" "PHLDA1" -"3515" "RP11-1191J2.5" -"3516" "HILPDA" -"3517" "RP11-527L4.5" -"3518" "SND1" -"3519" "CACFD1" -"3520" "ARHGAP22" -"3521" "RP11-326C3.15" -"3522" "PTGDR2" -"3523" "L2HGDH" -"3524" "UBAP1L" -"3525" "BMP8B" -"3526" "KIAA0556" -"3527" "CMTM2" -"3528" "NCBP1" -"3529" "SPAG5" -"3530" "C14orf28" -"3531" "CATSPERG" -"3532" "HIST1H2BD" -"3533" "FAM109B" -"3534" "RP11-25K19.1" -"3535" "LRRK2" -"3536" "RAB20" -"3537" "IFNG-AS1" -"3538" "RP11-727F15.9" -"3539" "RP5-821D11.7" -"3540" "CD5" -"3541" "TOMM40" -"3542" "CEP78" -"3543" "LPAR2" -"3544" "CHST2" -"3545" "YES1" -"3546" "CD320" -"3547" "RP11-222K16.2" -"3548" "RP11-18H21.1" -"3549" "TOM1L2" -"3550" "C3AR1" -"3551" "MRPS15" -"3552" "EID2" -"3553" "HEATR5A" -"3554" "FCRLB" -"3555" "RBBP8" -"3556" "LZTS2" -"3557" "TLE2" -"3558" "AC005082.12" -"3559" "GSTM4" -"3560" "TMEM59" -"3561" "AGPAT9" -"3562" "MARCH2" -"3563" "TRABD" -"3564" "BLM" -"3565" "ZCCHC18" -"3566" "MRM1" -"3567" "ARHGAP11A" -"3568" "IPPK" -"3569" "FDXACB1" -"3570" "RRP1" -"3571" "CHEK1" -"3572" "TNFRSF1B" -"3573" "SQRDL" -"3574" "TMOD2" -"3575" "CSNK1G1" -"3576" "FBXL12" -"3577" "FLYWCH2" -"3578" "PLCB1" -"3579" "ZNF726" -"3580" "AD000090.2" -"3581" "TPRKB" -"3582" "ZNF570" -"3583" "C19orf73" -"3584" "GBP2" -"3585" "PRMT6" -"3586" "MORN2" -"3587" "RP11-452F19.3" -"3588" "IL17RC" -"3589" "POC1A" -"3590" "FAM198B" -"3591" "ATP6V1F" -"3592" "KIF13A" -"3593" "ATAD3C" -"3594" "ZFP57" -"3595" "FAM104A" -"3596" "RP11-514O12.4" -"3597" "DBI" -"3598" "MAGEE1" -"3599" "C9orf139" -"3600" "PTPN18" -"3601" "TXNL1" -"3602" "CPM" -"3603" "HCK" -"3604" "SSH1" -"3605" "GRHPR" -"3606" "RP11-22P6.2" -"3607" "NCBP2-AS2" -"3608" "ZNF133" -"3609" "SAMD1" -"3610" "ELOVL4" -"3611" "ZNF749" -"3612" "COX4I1" -"3613" "KIAA1147" -"3614" "LAPTM4B" -"3615" "PRMT5" -"3616" "LARP4" -"3617" "HIST1H1B" -"3618" "CD300C" -"3619" "PDZD11" -"3620" "MACF1" -"3621" "COQ2" -"3622" "IFT52" -"3623" "CLUAP1" -"3624" "NOL9" -"3625" "LXN" -"3626" "FNIP2" -"3627" "LINC00426" -"3628" "NBPF12" -"3629" "RNGTT" -"3630" "CBFA2T3" -"3631" "RAD51D" -"3632" "FAM129C" -"3633" "ZNHIT6" -"3634" "SMG9" -"3635" "MARCH8" -"3636" "PPP1R12C" -"3637" "HIVEP3" -"3638" "SULF2" -"3639" "OSBPL1A" -"3640" "SH2B2" -"3641" "ARFGAP2" -"3642" "GOT1" -"3643" "OLIG1" -"3644" "TRMT112" -"3645" "MSTO1" -"3646" "USP6NL" -"3647" "AC009506.1" -"3648" "LRR1" -"3649" "CCL20" -"3650" "MLYCD" -"3651" "ROPN1L" -"3652" "TRIM16" -"3653" "DNAJC18" -"3654" "GFPT1" -"3655" "CPT1A" -"3656" "ZNF324" -"3657" "ENTPD5" -"3658" "SRGAP2" -"3659" "CPNE7" -"3660" "CD59" -"3661" "ABHD17A" -"3662" "FBF1" -"3663" "RP5-1125A11.1" -"3664" "ARHGAP33" -"3665" "PTGER4" -"3666" "MUTYH" -"3667" "RNF207" -"3668" "ARHGEF19" -"3669" "TMTC2" -"3670" "NCR1" -"3671" "REG4" -"3672" "CACNA1I" -"3673" "RP11-126K1.6" -"3674" "CENPO" -"3675" "F5" -"3676" "VEGFA" -"3677" "AC061992.2" -"3678" "HK2" -"3679" "CDK12" -"3680" "TMEM194B" -"3681" "DCTPP1" -"3682" "GCLC" -"3683" "RP11-10K16.1" -"3684" "NT5E" -"3685" "CD69" -"3686" "MMS22L" -"3687" "EHMT1" -"3688" "WASL" -"3689" "POLR2A" -"3690" "WDR91" -"3691" "SYF2" -"3692" "CXorf65" -"3693" "SLC25A43" -"3694" "PRSS23" -"3695" "AMPD3" -"3696" "ZNF408" -"3697" "CTNND1" -"3698" "RP11-23P13.6" -"3699" "METTL1" -"3700" "AACS" -"3701" "KATNAL1" -"3702" "CENPQ" -"3703" "ARHGEF7" -"3704" "ZNF598" -"3705" "LINC00937" -"3706" "RP11-505K9.1" -"3707" "ZNF287" -"3708" "NCLN" -"3709" "NDC80" -"3710" "GCH1" -"3711" "HSD11B1L" -"3712" "CMPK1" -"3713" "BRD1" -"3714" "DENND5B" -"3715" "SNAP23" -"3716" "PSMB7" -"3717" "TMED9" -"3718" "CTB-152G17.6" -"3719" "HSP90AB1" -"3720" "LINC00886" -"3721" "UPF3B" -"3722" "CCDC28B" -"3723" "STK38L" -"3724" "CD7" -"3725" "RNASE2" -"3726" "MR1" -"3727" "LSP1" -"3728" "MZT1" -"3729" "RP11-169K16.9" -"3730" "TOR2A" -"3731" "TSPAN13" -"3732" "GUK1" -"3733" "PSMB9" -"3734" "TRAK1" -"3735" "HCAR2" -"3736" "KCNN4" -"3737" "KIAA0226L" -"3738" "RPS17" -"3739" "ZNF264" -"3740" "SLC27A5" -"3741" "SETDB1" -"3742" "NACC1" -"3743" "TPT1" -"3744" "LINC-PINT" -"3745" "CCNB2" -"3746" "SEPT6" -"3747" "TAB2" -"3748" "ARMC6" -"3749" "TNFRSF8" -"3750" "AC109826.1" -"3751" "COMMD9" -"3752" "MINOS1" -"3753" "THAP5" -"3754" "TFEC" -"3755" "NCF1" -"3756" "AGMAT" -"3757" "TMEM8B" -"3758" "NBPF1" -"3759" "SPTLC1" -"3760" "POLI" -"3761" "RP11-295G20.2" -"3762" "HMGN1" -"3763" "HLA-DOA" -"3764" "MTSS1" -"3765" "LRRN3" -"3766" "PHKG2" -"3767" "KLF9" -"3768" "NUFIP1" -"3769" "JUN" -"3770" "CTA-211A9.5" -"3771" "FLOT1" -"3772" "BANK1" -"3773" "MTRR" -"3774" "CC2D1B" -"3775" "TMEM66" -"3776" "ADC" -"3777" "TTC22" -"3778" "CCDC24" -"3779" "MPZ" -"3780" "TTC21B" -"3781" "DHFRL1" -"3782" "PRRT3" -"3783" "FANCD2" -"3784" "RP11-553L6.5" -"3785" "SEPSECS" -"3786" "TPRG1" -"3787" "CRIPAK" -"3788" "RP11-102N12.3" -"3789" "HIST1H4E" -"3790" "LIN54" -"3791" "ANO9" -"3792" "NOTCH4" -"3793" "AC091729.9" -"3794" "CKAP5" -"3795" "FOLR2" -"3796" "MTURN" -"3797" "ARMCX1" -"3798" "PTPRO" -"3799" "PKIA" -"3800" "ZFYVE26" -"3801" "RP11-318E3.9" -"3802" "ZSCAN32" -"3803" "PLCE1" -"3804" "SPATA33" -"3805" "TCP11L1" -"3806" "HOXB4" -"3807" "RAD51AP1" -"3808" "HAL" -"3809" "HEATR6" -"3810" "CENPJ" -"3811" "C19orf82" -"3812" "RASL11A" -"3813" "OLFM2" -"3814" "RP11-841O20.2" -"3815" "ASB2" -"3816" "CTA-292E10.6" -"3817" "PER3" -"3818" "C17orf58" -"3819" "COL9A2" -"3820" "AC132872.2" -"3821" "FLVCR1" -"3822" "RP11-535A5.1" -"3823" "SUSD4" -"3824" "EBI3" -"3825" "ARRDC5" -"3826" "TTL" -"3827" "LMBRD2" -"3828" "LARGE" -"3829" "ABCB1" -"3830" "CDC42EP1" -"3831" "CXorf24" -"3832" "SPSB1" -"3833" "FBXO48" -"3834" "FYCO1" -"3835" "ZFP91" -"3836" "ERCC8" -"3837" "IFT46" -"3838" "KBTBD7" -"3839" "PPP1R17" -"3840" "CDC14B" -"3841" "RP11-473M20.9" -"3842" "CTB-55O6.12" -"3843" "RP11-536K7.3" -"3844" "IGSF22" -"3845" "ZNF569" -"3846" "AC013264.2" -"3847" "RACGAP1" -"3848" "DPH1" -"3849" "PREPL" -"3850" "GOLGA2" -"3851" "PRR11" -"3852" "ANAPC16" -"3853" "SLC22A4" -"3854" "ZNF436" -"3855" "AP2A1" -"3856" "HIGD2A" -"3857" "UGGT1" -"3858" "PRKAR1B" -"3859" "PRMT2" -"3860" "FAM86A" -"3861" "DENND1A" -"3862" "PPM1F" -"3863" "ZCWPW1" -"3864" "DNAJC11" -"3865" "DEAF1" -"3866" "GALNT10" -"3867" "DHRS13" -"3868" "FZR1" -"3869" "CEP128" -"3870" "N4BP1" -"3871" "ARHGEF10L" -"3872" "TPM3" -"3873" "LRRIQ3" -"3874" "TMCO4" -"3875" "RPL10A" -"3876" "S100A13" -"3877" "NME7" -"3878" "SETD8" -"3879" "CTNS" -"3880" "RNF144A" -"3881" "GPR160" -"3882" "RASSF1" -"3883" "SPINK2" -"3884" "DDX3X" -"3885" "VARS2" -"3886" "FAM220A" -"3887" "HLA-F" -"3888" "HMGA1P4" -"3889" "CCDC50" -"3890" "TSC1" -"3891" "PTDSS2" -"3892" "LARP1" -"3893" "OSBP" -"3894" "TAGLN" -"3895" "OTUD5" -"3896" "ZNF646" -"3897" "ALYREF" -"3898" "GNA15" -"3899" "GPR82" -"3900" "ZNF678" -"3901" "TET3" -"3902" "TNRC18" -"3903" "RP11-383J24.6" -"3904" "RTKN2" -"3905" "NDUFC2" -"3906" "DOK1" -"3907" "KIAA1731" -"3908" "TMPO-AS1" -"3909" "FBXW8" -"3910" "MED29" -"3911" "KLF10" -"3912" "LPCAT2" -"3913" "ANG" -"3914" "MTHFSD" -"3915" "PCBP4" -"3916" "COPE" -"3917" "AC016629.8" -"3918" "GGCT" -"3919" "RP1-43E13.2" -"3920" "ZNF566" -"3921" "LILRA6" -"3922" "RP11-117D22.2" -"3923" "KCNK12" -"3924" "GK5" -"3925" "RP11-395A13.2" -"3926" "BBS7" -"3927" "SLC2A9" -"3928" "ABL1" -"3929" "WDR19" -"3930" "DLEU1" -"3931" "DOCK9" -"3932" "RP11-420G6.4" -"3933" "MYB" -"3934" "RNF157" -"3935" "CHAF1A" -"3936" "ZNF117" -"3937" "CD8A" -"3938" "PAXIP1" -"3939" "ZXDA" -"3940" "BRWD3" -"3941" "EIF3I" -"3942" "ANGPT2" -"3943" "BCL11B" -"3944" "CEBPA" -"3945" "RP11-11N9.4" -"3946" "WDR33" -"3947" "NFIL3" -"3948" "ANKRD16" -"3949" "RP5-1091N2.9" -"3950" "SLC35F2" -"3951" "MSANTD2" -"3952" "RP11-637A17.2" -"3953" "VARS" -"3954" "PAWR" -"3955" "TTC8" -"3956" "GADD45GIP1" -"3957" "RP11-649E7.5" -"3958" "ANKRD9" -"3959" "FANCI" -"3960" "MYL6B" -"3961" "CCDC18" -"3962" "RP11-4F5.2" -"3963" "CROT" -"3964" "IGF1R" -"3965" "AC016586.1" -"3966" "NAGLU" -"3967" "RP13-516M14.4" -"3968" "WDR3" -"3969" "FAM189B" -"3970" "WDR7" -"3971" "RP11-104L21.3" -"3972" "TP53INP2" -"3973" "FLJ27365" -"3974" "RMDN2" -"3975" "FBXO2" -"3976" "LY75" -"3977" "AMMECR1L" -"3978" "OSGEPL1" -"3979" "GNB4" -"3980" "SCLY" -"3981" "AC062017.1" -"3982" "NDUFB2-AS1" -"3983" "STARD4" -"3984" "PM20D2" -"3985" "TMSB4Y" -"3986" "GLA" -"3987" "LRRC61" -"3988" "TLR8" -"3989" "ARPC3" -"3990" "ASPH" -"3991" "OSGIN2" -"3992" "RANBP6" -"3993" "IL2RA" -"3994" "ASRGL1" -"3995" "SNX30" -"3996" "UAP1L1" -"3997" "EXOC3" -"3998" "PYROXD2" -"3999" "KDELC2" -"4000" "ACAP2" diff --git a/scanpy/tests/test_highly_variable_genes.py b/scanpy/tests/test_highly_variable_genes.py index 98204a1a2a..598bc5617f 100644 --- a/scanpy/tests/test_highly_variable_genes.py +++ b/scanpy/tests/test_highly_variable_genes.py @@ -14,8 +14,8 @@ from scanpy.testing._pytest.marks import needs FILE = Path(__file__).parent / Path("_scripts/seurat_hvg.csv") -FILE_V3 = Path(__file__).parent / Path("_scripts/seurat_hvg_v3.dat.gz") -FILE_V3_BATCH = Path(__file__).parent / Path("_scripts/seurat_hvg_v3_batch.dat") +FILE_V3 = Path(__file__).parent / Path("_scripts/seurat_hvg_v3.csv.gz") +FILE_V3_BATCH = Path(__file__).parent / Path("_scripts/seurat_hvg_v3_batch.csv") FILE_CELL_RANGER = Path(__file__).parent / "_scripts/cell_ranger_hvg.csv" @@ -383,12 +383,12 @@ def test_compare_to_upstream( @needs.skmisc def test_highly_variable_genes_compare_to_seurat_v3(): - seurat_hvg_info = pd.read_csv( - FILE_V3, sep=" ", dtype={"variances_norm": np.float64} - ) + ### test without batch + seurat_hvg_info = pd.read_csv(FILE_V3) pbmc = pbmc3k() - pbmc.var_names_make_unique() + sc.pp.filter_cells(pbmc, min_genes=200) # this doesnt do anything btw + sc.pp.filter_genes(pbmc, min_cells=3) pbmc_dense = pbmc.copy() pbmc_dense.X = pbmc_dense.X.toarray() @@ -396,17 +396,14 @@ def test_highly_variable_genes_compare_to_seurat_v3(): sc.pp.highly_variable_genes(pbmc, n_top_genes=1000, flavor="seurat_v3") sc.pp.highly_variable_genes(pbmc_dense, n_top_genes=1000, flavor="seurat_v3") - np.testing.assert_array_equal( - seurat_hvg_info["highly_variable"], pbmc.var["highly_variable"] - ) np.testing.assert_allclose( - seurat_hvg_info["variances"], + seurat_hvg_info["variance"], pbmc.var["variances"], rtol=2e-05, atol=2e-05, ) np.testing.assert_allclose( - seurat_hvg_info["variances_norm"], + seurat_hvg_info["variance.standardized"], pbmc.var["variances_norm"], rtol=2e-05, atol=2e-05, @@ -418,27 +415,39 @@ def test_highly_variable_genes_compare_to_seurat_v3(): atol=2e-05, ) - batch = np.zeros((len(pbmc)), dtype=int) - batch[1500:] = 1 - pbmc.obs["batch"] = batch - df = sc.pp.highly_variable_genes( - pbmc, n_top_genes=4000, flavor="seurat_v3", batch_key="batch", inplace=False - ) - assert df is not None - df.sort_values( - ["highly_variable_nbatches", "highly_variable_rank"], - ascending=[False, True], - na_position="last", - inplace=True, + ### test with batch + # introduce a dummy "technical covariate"; this is used in Seurat's SelectIntegrationFeatures + pbmc.obs["dummy_tech"] = ( + "source_" + pd.array([*range(1, 6), 5]).repeat(500).astype("string") + )[: pbmc.n_obs] + + seurat_v3_paper = sc.pp.highly_variable_genes( + pbmc, + n_top_genes=2000, + flavor="seurat_v3_paper", + batch_key="dummy_tech", + inplace=False, ) - df = df.iloc[:4000] - seurat_hvg_info_batch = pd.read_csv( - FILE_V3_BATCH, sep=" ", dtype={"variances_norm": np.float64} + + seurat_v3 = sc.pp.highly_variable_genes( + pbmc, + n_top_genes=2000, + flavor="seurat_v3", + batch_key="dummy_tech", + inplace=False, ) - # ranks might be slightly different due to many genes having same normalized var + seurat_hvg_info_batch = pd.read_csv(FILE_V3_BATCH) seu = pd.Index(seurat_hvg_info_batch["x"].to_numpy()) - assert len(seu.intersection(df.index)) / 4000 > 0.95 + + gene_intersection_paper = seu.intersection( + seurat_v3_paper[seurat_v3_paper["highly_variable"]].index + ) + gene_intersection_impl = seu.intersection( + seurat_v3[seurat_v3["highly_variable"]].index + ) + assert len(gene_intersection_paper) / 2000 > 0.95 + assert len(gene_intersection_impl) / 2000 < 0.95 @needs.skmisc From e7a125188a8f4612974422d341edfb218877e913 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Thu, 15 Feb 2024 20:42:34 +1100 Subject: [PATCH 12/54] Turn on code cov patch annotations (#2848) --- .codecov.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.codecov.yml b/.codecov.yml index 9dd8f244af..68cc92f2dd 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -8,7 +8,6 @@ coverage: default: # Require 1% coverage, i.e., always succeed target: 1 - patch: false changes: false comment: From 102b4ef0d99984048a11017bd9cd340fa7ecc625 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Thu, 15 Feb 2024 11:44:41 +0100 Subject: [PATCH 13/54] Support Dask in highly_variable_genes (#2809) Co-authored-by: Isaac Virshup --- docs/release-notes/1.10.0.md | 1 + pyproject.toml | 1 + scanpy/_compat.py | 9 +- .../_deprecated/highly_variable_genes.py | 3 +- scanpy/preprocessing/_distributed.py | 2 +- .../preprocessing/_highly_variable_genes.py | 506 ++++++++++-------- scanpy/tests/test_highly_variable_genes.py | 173 ++++-- 7 files changed, 410 insertions(+), 285 deletions(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 323ad85d64..37a6adf97f 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -17,6 +17,7 @@ now support a `mask` parameter {pr}`2272` {smaller}`C Bright, T Marcella, & P Angerer` * {func}`scanpy.tl.rank_genes_groups` no longer warns that it's default was changed from t-test_overestim_var to t-test {pr}`2798` {smaller}`L Heumos` * {func}`scanpy.pp.highly_variable_genes` has new flavor `seurat_v3_paper` that is in its implementation consistent with the paper description in Stuart et al 2018. {pr}`2792` {smaller}`E Roellin` +* {func}`scanpy.pp.highly_variable_genes` supports dask for the default `seurat` and `cell_ranger` flavors {pr}`2809` {smaller}`P Angerer` ```{rubric} Docs ``` diff --git a/pyproject.toml b/pyproject.toml index a8afbac042..bd5e2b5215 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -120,6 +120,7 @@ doc = [ "ipython>=7.20", # for nbsphinx code highlighting "matplotlib!=3.6.1", # TODO: remove necessity for being able to import doc-linked classes + "dask", "scanpy[paga]", "sam-algorithm", ] diff --git a/scanpy/_compat.py b/scanpy/_compat.py index 08fd53bd03..a89e8d20cf 100644 --- a/scanpy/_compat.py +++ b/scanpy/_compat.py @@ -30,7 +30,14 @@ class ZappyArray: pass -__all__ = ["cache", "DaskArray", "fullname", "pkg_metadata", "pkg_version"] +__all__ = [ + "cache", + "DaskArray", + "ZappyArray", + "fullname", + "pkg_metadata", + "pkg_version", +] def fullname(typ: type) -> str: diff --git a/scanpy/preprocessing/_deprecated/highly_variable_genes.py b/scanpy/preprocessing/_deprecated/highly_variable_genes.py index da250c688e..eaa00c754a 100644 --- a/scanpy/preprocessing/_deprecated/highly_variable_genes.py +++ b/scanpy/preprocessing/_deprecated/highly_variable_genes.py @@ -111,7 +111,8 @@ def filter_genes_dispersion( # noqa: PLR0917 if n_top_genes is not None and not all( x is None for x in [min_disp, max_disp, min_mean, max_mean] ): - logg.info("If you pass `n_top_genes`, all cutoffs are ignored.") + msg = "If you pass `n_top_genes`, all cutoffs are ignored." + warnings.warn(msg, UserWarning) if min_disp is None: min_disp = 0.5 if min_mean is None: diff --git a/scanpy/preprocessing/_distributed.py b/scanpy/preprocessing/_distributed.py index 748ec3d671..91db7e7149 100644 --- a/scanpy/preprocessing/_distributed.py +++ b/scanpy/preprocessing/_distributed.py @@ -37,7 +37,7 @@ def materialize_as_ndarray( def materialize_as_ndarray( a: ArrayLike | tuple[ArrayLike | ZappyArray | DaskArray, ...], ) -> tuple[np.ndarray] | np.ndarray: - """Convert distributed arrays to ndarrays.""" + """Compute distributed arrays and convert them to numpy ndarrays.""" if not isinstance(a, tuple): return np.asarray(a) diff --git a/scanpy/preprocessing/_highly_variable_genes.py b/scanpy/preprocessing/_highly_variable_genes.py index 3366b93970..e6f925a168 100644 --- a/scanpy/preprocessing/_highly_variable_genes.py +++ b/scanpy/preprocessing/_highly_variable_genes.py @@ -1,8 +1,9 @@ from __future__ import annotations import warnings +from dataclasses import dataclass from inspect import signature -from typing import Literal, cast +from typing import TYPE_CHECKING, Literal, cast import numpy as np import pandas as pd @@ -10,13 +11,17 @@ from anndata import AnnData from .. import logging as logg -from .._compat import old_positionals +from .._compat import DaskArray, old_positionals from .._settings import Verbosity, settings from .._utils import check_nonnegative_integers, sanitize_anndata +from ..get import _get_obs_rep from ._distributed import materialize_as_ndarray from ._simple import filter_genes from ._utils import _get_mean_var +if TYPE_CHECKING: + from numpy.typing import NDArray + def _highly_variable_genes_seurat_v3( adata: AnnData, @@ -61,15 +66,15 @@ def _highly_variable_genes_seurat_v3( "Please install skmisc package via `pip install --user scikit-misc" ) df = pd.DataFrame(index=adata.var_names) - X = adata.layers[layer] if layer is not None else adata.X + data = _get_obs_rep(adata, layer=layer) - if check_values and not check_nonnegative_integers(X): + if check_values and not check_nonnegative_integers(data): warnings.warn( f"`flavor='{flavor}'` expects raw count data, but non-integers were found.", UserWarning, ) - df["means"], df["variances"] = _get_mean_var(X) + df["means"], df["variances"] = _get_mean_var(data) if batch_key is None: batch_info = pd.Categorical(np.zeros(adata.shape[0], dtype=int)) @@ -78,11 +83,11 @@ def _highly_variable_genes_seurat_v3( norm_gene_vars = [] for b in np.unique(batch_info): - X_batch = X[batch_info == b] + data_batch = data[batch_info == b] - mean, var = _get_mean_var(X_batch) + mean, var = _get_mean_var(data_batch) not_const = var > 0 - estimat_var = np.zeros(X.shape[1], dtype=np.float64) + estimat_var = np.zeros(data.shape[1], dtype=np.float64) y = np.log10(var[not_const]) x = np.log10(mean[not_const]) @@ -91,9 +96,9 @@ def _highly_variable_genes_seurat_v3( estimat_var[not_const] = model.outputs.fitted_values reg_std = np.sqrt(10**estimat_var) - batch_counts = X_batch.astype(np.float64).copy() + batch_counts = data_batch.astype(np.float64).copy() # clip large values as in Seurat - N = X_batch.shape[0] + N = data_batch.shape[0] vmax = np.sqrt(N) clip_val = reg_std * vmax + mean if sp_sparse.issparse(batch_counts): @@ -186,15 +191,55 @@ def _highly_variable_genes_seurat_v3( return df +@dataclass +class _Cutoffs: + min_disp: float + max_disp: float + min_mean: float + max_mean: float + + @classmethod + def validate( + cls, + *, + n_top_genes: int | None, + min_disp: float, + max_disp: float, + min_mean: float, + max_mean: float, + ) -> _Cutoffs | int: + if n_top_genes is None: + return cls(min_disp, max_disp, min_mean, max_mean) + + cutoffs = {"min_disp", "max_disp", "min_mean", "max_mean"} + defaults = { + p.name: p.default + for p in signature(highly_variable_genes).parameters.values() + if p.name in cutoffs + } + if {k: v for k, v in locals().items() if k in cutoffs} != defaults: + msg = "If you pass `n_top_genes`, all cutoffs are ignored." + warnings.warn(msg, UserWarning) + return n_top_genes + + def in_bounds( + self, + mean: NDArray[np.floating] | DaskArray, + dispersion_norm: NDArray[np.floating] | DaskArray, + ) -> NDArray[np.bool_] | DaskArray: + return ( + (mean > self.min_mean) + & (mean < self.max_mean) + & (dispersion_norm > self.min_disp) + & (dispersion_norm < self.max_disp) + ) + + def _highly_variable_genes_single_batch( adata: AnnData, *, layer: str | None = None, - min_disp: float | None = 0.5, - max_disp: float | None = np.inf, - min_mean: float | None = 0.0125, - max_mean: float | None = 3, - n_top_genes: int | None = None, + cutoff: _Cutoffs | int, n_bins: int = 20, flavor: Literal["seurat", "cell_ranger"] = "seurat", ) -> pd.DataFrame: @@ -206,18 +251,18 @@ def _highly_variable_genes_single_batch( A DataFrame that contains the columns `highly_variable`, `means`, `dispersions`, and `dispersions_norm`. """ - X = adata.layers[layer] if layer is not None else adata.X + X = _get_obs_rep(adata, layer=layer) if flavor == "seurat": X = X.copy() if "log1p" in adata.uns_keys() and adata.uns["log1p"].get("base") is not None: X *= np.log(adata.uns["log1p"]["base"]) - # use out if possible. only possible since we copy X + # use out if possible. only possible since we copy the data matrix if isinstance(X, np.ndarray): np.expm1(X, out=X) else: X = np.expm1(X) - mean, var = materialize_as_ndarray(_get_mean_var(X)) + mean, var = _get_mean_var(X) # now actually compute the dispersion mean[mean == 0] = 1e-12 # set entries equal to zero to small value dispersion = var / mean @@ -225,89 +270,197 @@ def _highly_variable_genes_single_batch( dispersion[dispersion == 0] = np.nan dispersion = np.log(dispersion) mean = np.log1p(mean) + # all of the following quantities are "per-gene" here - df = pd.DataFrame() - df["means"] = mean - df["dispersions"] = dispersion + df = pd.DataFrame( + dict(zip(["means", "dispersions"], materialize_as_ndarray((mean, dispersion)))) + ) + df["mean_bin"] = _get_mean_bins(df["means"], flavor, n_bins) + disp_stats = _get_disp_stats(df, flavor) + + # actually do the normalization + df["dispersions_norm"] = (df["dispersions"] - disp_stats["avg"]) / disp_stats["dev"] + df["highly_variable"] = _subset_genes( + adata, + mean=mean, + dispersion_norm=df["dispersions_norm"].to_numpy(), + cutoff=cutoff, + ) + + df.index = adata.var_names + return df + + +def _get_mean_bins( + means: pd.Series, flavor: Literal["seurat", "cell_ranger"], n_bins: int +) -> pd.Series: if flavor == "seurat": - df["mean_bin"] = pd.cut(df["means"], bins=n_bins) - disp_grouped = df.groupby("mean_bin", observed=True)["dispersions"] - disp_mean_bin = disp_grouped.mean() - disp_std_bin = disp_grouped.std(ddof=1) - # retrieve those genes that have nan std, these are the ones where - # only a single gene fell in the bin and implicitly set them to have - # a normalized disperion of 1 - one_gene_per_bin = disp_std_bin.isnull() - gen_indices = np.where(one_gene_per_bin[df["mean_bin"].to_numpy()])[0].tolist() - if len(gen_indices) > 0: - logg.debug( - f"Gene indices {gen_indices} fell into a single bin: their " - "normalized dispersion was set to 1.\n " - "Decreasing `n_bins` will likely avoid this effect." - ) - # Circumvent pandas 0.23 bug. Both sides of the assignment have dtype==float32, - # but there’s still a dtype error without “.value”. - disp_std_bin[one_gene_per_bin.to_numpy()] = disp_mean_bin[ - one_gene_per_bin.to_numpy() - ].to_numpy() - disp_mean_bin[one_gene_per_bin.to_numpy()] = 0 - # actually do the normalization - df["dispersions_norm"] = ( - df["dispersions"].to_numpy() # use values here as index differs - - disp_mean_bin[df["mean_bin"].to_numpy()].to_numpy() - ) / disp_std_bin[df["mean_bin"].to_numpy()].to_numpy() + bins = n_bins elif flavor == "cell_ranger": - from statsmodels import robust + bins = np.r_[-np.inf, np.percentile(means, np.arange(10, 105, 5)), np.inf] + else: + raise ValueError('`flavor` needs to be "seurat" or "cell_ranger"') - df["mean_bin"] = pd.cut( - df["means"], - np.r_[-np.inf, np.percentile(df["means"], np.arange(10, 105, 5)), np.inf], - ) - disp_grouped = df.groupby("mean_bin", observed=True)["dispersions"] - disp_median_bin = disp_grouped.median() - # the next line raises the warning: "Mean of empty slice" - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - disp_mad_bin = disp_grouped.apply(robust.mad) - df["dispersions_norm"] = ( - df["dispersions"].to_numpy() - - disp_median_bin[df["mean_bin"].to_numpy()].to_numpy() - ) / disp_mad_bin[df["mean_bin"].to_numpy()].to_numpy() + return pd.cut(means, bins=bins) + + +def _get_disp_stats( + df: pd.DataFrame, flavor: Literal["seurat", "cell_ranger"] +) -> pd.DataFrame: + disp_grouped = df.groupby("mean_bin", observed=True)["dispersions"] + if flavor == "seurat": + disp_bin_stats = disp_grouped.agg(avg="mean", dev="std") + _postprocess_dispersions_seurat(disp_bin_stats, df["mean_bin"]) + elif flavor == "cell_ranger": + disp_bin_stats = disp_grouped.agg(avg="median", dev=_mad) else: raise ValueError('`flavor` needs to be "seurat" or "cell_ranger"') - dispersion_norm = df["dispersions_norm"].to_numpy() - if n_top_genes is not None: - dispersion_norm = dispersion_norm[~np.isnan(dispersion_norm)] - dispersion_norm[ - ::-1 - ].sort() # interestingly, np.argpartition is slightly slower - if n_top_genes > adata.n_vars: - logg.info("`n_top_genes` > `adata.n_var`, returning all genes.") - n_top_genes = adata.n_vars - if n_top_genes > dispersion_norm.size: - warnings.warn( - "`n_top_genes` > number of normalized dispersions, returning all genes with normalized dispersions.", - UserWarning, + return disp_bin_stats.loc[df["mean_bin"]].set_index(df.index) + + +def _postprocess_dispersions_seurat( + disp_bin_stats: pd.DataFrame, mean_bin: pd.Series +) -> None: + # retrieve those genes that have nan std, these are the ones where + # only a single gene fell in the bin and implicitly set them to have + # a normalized disperion of 1 + one_gene_per_bin = disp_bin_stats["dev"].isnull() + gen_indices = np.flatnonzero(one_gene_per_bin.loc[mean_bin]) + if len(gen_indices) == 0: + return + logg.debug( + f"Gene indices {gen_indices} fell into a single bin: their " + "normalized dispersion was set to 1.\n " + "Decreasing `n_bins` will likely avoid this effect." + ) + disp_bin_stats.loc[one_gene_per_bin, "dev"] = disp_bin_stats.loc[ + one_gene_per_bin, "avg" + ] + disp_bin_stats.loc[one_gene_per_bin, "avg"] = 0 + + +def _mad(a): + from statsmodels.robust import mad + + with warnings.catch_warnings(): + # MAD calculation raises the warning: "Mean of empty slice" + warnings.simplefilter("ignore", category=RuntimeWarning) + return mad(a) + + +def _subset_genes( + adata: AnnData, + *, + mean: NDArray[np.float64] | DaskArray, + dispersion_norm: NDArray[np.float64] | DaskArray, + cutoff: _Cutoffs | int, +) -> NDArray[np.bool_] | DaskArray: + """Get boolean mask of genes with normalized dispersion in bounds.""" + if isinstance(cutoff, _Cutoffs): + dispersion_norm[np.isnan(dispersion_norm)] = 0 # similar to Seurat + return cutoff.in_bounds(mean, dispersion_norm) + n_top_genes = cutoff + del cutoff + + if n_top_genes > adata.n_vars: + logg.info("`n_top_genes` > `adata.n_var`, returning all genes.") + n_top_genes = adata.n_vars + disp_cut_off = _nth_highest(dispersion_norm, n_top_genes) + logg.debug( + f"the {n_top_genes} top genes correspond to a " + f"normalized dispersion cutoff of {disp_cut_off}" + ) + return np.nan_to_num(dispersion_norm) >= disp_cut_off + + +def _nth_highest(x: NDArray[np.float64] | DaskArray, n: int) -> float | DaskArray: + x = x[~np.isnan(x)] + if n > x.size: + msg = "`n_top_genes` > number of normalized dispersions, returning all genes with normalized dispersions." + warnings.warn(msg, UserWarning) + n = x.size + if isinstance(x, DaskArray): + return x.topk(n)[-1] + # interestingly, np.argpartition is slightly slower + x[::-1].sort() + return x[n - 1] + + +def _highly_variable_genes_batched( + adata: AnnData, + batch_key: str, + *, + layer: str | None, + n_bins: int, + flavor: Literal["seurat", "cell_ranger"], + cutoff: _Cutoffs | int, +) -> pd.DataFrame: + sanitize_anndata(adata) + batches = adata.obs[batch_key].cat.categories + dfs = [] + gene_list = adata.var_names + for batch in batches: + adata_subset = adata[adata.obs[batch_key] == batch] + + # Filter to genes that are in the dataset + with settings.verbosity.override(Verbosity.error): + # TODO use groupby or so instead of materialize_as_ndarray + filt, _ = materialize_as_ndarray( + filter_genes( + _get_obs_rep(adata_subset, layer=layer), + min_cells=1, + inplace=False, + ) ) - n_top_genes = dispersion_norm.size - disp_cut_off = dispersion_norm[n_top_genes - 1] - gene_subset = np.nan_to_num(df["dispersions_norm"].to_numpy()) >= disp_cut_off - logg.debug( - f"the {n_top_genes} top genes correspond to a " - f"normalized dispersion cutoff of {disp_cut_off}" + + adata_subset = adata_subset[:, filt] + + hvg = _highly_variable_genes_single_batch( + adata_subset, layer=layer, cutoff=cutoff, n_bins=n_bins, flavor=flavor ) - else: - dispersion_norm[np.isnan(dispersion_norm)] = 0 # similar to Seurat - gene_subset = np.logical_and.reduce( - ( - mean > min_mean, - mean < max_mean, - dispersion_norm > min_disp, - dispersion_norm < max_disp, + hvg.reset_index(drop=False, inplace=True, names=["gene"]) + + if (n_removed := np.sum(~filt)) > 0: + # Add 0 values for genes that were filtered out + missing_hvg = pd.DataFrame( + np.zeros((n_removed, len(hvg.columns))), + columns=hvg.columns, ) + missing_hvg["highly_variable"] = missing_hvg["highly_variable"].astype(bool) + missing_hvg["gene"] = gene_list[~filt] + hvg = pd.concat([hvg, missing_hvg], ignore_index=True) + + dfs.append(hvg) + + df = pd.concat(dfs, axis=0) + + df["highly_variable"] = df["highly_variable"].astype(int) + df = df.groupby("gene", observed=True).agg( + dict( + means="mean", + dispersions="mean", + dispersions_norm="mean", + highly_variable="sum", ) + ) + df["highly_variable_nbatches"] = df["highly_variable"] + df["highly_variable_intersection"] = df["highly_variable_nbatches"] == len(batches) + + if isinstance(cutoff, int): + # sort genes by how often they selected as hvg within each batch and + # break ties with normalized dispersion across batches + df.sort_values( + ["highly_variable_nbatches", "dispersions_norm"], + ascending=False, + na_position="last", + inplace=True, + ) + df["highly_variable"] = np.arange(df.shape[0]) < cutoff + else: + dispersion_norm = df["dispersions_norm"].to_numpy() + dispersion_norm[np.isnan(dispersion_norm)] = 0 # similar to Seurat + df["highly_variable"] = cutoff.in_bounds(df["means"], df["dispersions_norm"]) - df["highly_variable"] = gene_subset return df @@ -331,10 +484,10 @@ def highly_variable_genes( *, layer: str | None = None, n_top_genes: int | None = None, - min_disp: float | None = 0.5, - max_disp: float | None = np.inf, - min_mean: float | None = 0.0125, - max_mean: float | None = 3, + min_disp: float = 0.5, + max_disp: float = np.inf, + min_mean: float = 0.0125, + max_mean: float = 3, span: float = 0.3, n_bins: int = 20, flavor: Literal["seurat", "cell_ranger", "seurat_v3", "seurat_v3_paper"] = "seurat", @@ -447,20 +600,15 @@ def highly_variable_genes( For `flavor='seurat_v3'`/`'seurat_v3_paper'`, rank of the gene according to normalized variance, in case of multiple batches description above `adata.var['highly_variable_nbatches']` : :class:`pandas.Series` (dtype `int`) - If batch_key is given, this denotes in how many batches genes are detected as HVG + If `batch_key` is given, this denotes in how many batches genes are detected as HVG `adata.var['highly_variable_intersection']` : :class:`pandas.Series` (dtype `bool`) - If batch_key is given, this denotes the genes that are highly variable in all batches + If `batch_key` is given, this denotes the genes that are highly variable in all batches Notes ----- This function replaces :func:`~scanpy.pp.filter_genes_dispersion`. """ - if n_top_genes is not None and not all( - m is None for m in [min_disp, max_disp, min_mean, max_mean] - ): - logg.info("If you pass `n_top_genes`, all cutoffs are ignored.") - start = logg.info("extracting highly variable genes") if not isinstance(adata, AnnData): @@ -485,137 +633,49 @@ def highly_variable_genes( inplace=inplace, ) + cutoff = _Cutoffs.validate( + n_top_genes=n_top_genes, + min_disp=min_disp, + max_disp=max_disp, + min_mean=min_mean, + max_mean=max_mean, + ) + del min_disp, max_disp, min_mean, max_mean, n_top_genes + if batch_key is None: df = _highly_variable_genes_single_batch( - adata, - layer=layer, - min_disp=min_disp, - max_disp=max_disp, - min_mean=min_mean, - max_mean=max_mean, - n_top_genes=n_top_genes, - n_bins=n_bins, - flavor=flavor, + adata, layer=layer, cutoff=cutoff, n_bins=n_bins, flavor=flavor ) else: - sanitize_anndata(adata) - batches = adata.obs[batch_key].cat.categories - df = [] - gene_list = adata.var_names - for batch in batches: - adata_subset = adata[adata.obs[batch_key] == batch] - - # Filter to genes that are in the dataset - with settings.verbosity.override(Verbosity.error): - filt = filter_genes(adata_subset, min_cells=1, inplace=False)[0] - - adata_subset = adata_subset[:, filt] - - hvg = _highly_variable_genes_single_batch( - adata_subset, - layer=layer, - min_disp=min_disp, - max_disp=max_disp, - min_mean=min_mean, - max_mean=max_mean, - n_top_genes=n_top_genes, - n_bins=n_bins, - flavor=flavor, - ) - - hvg["gene"] = adata_subset.var_names.to_numpy() - if (n_removed := np.sum(~filt)) > 0: - # Add 0 values for genes that were filtered out - missing_hvg = pd.DataFrame( - np.zeros((n_removed, len(hvg.columns))), - columns=hvg.columns, - ) - missing_hvg["highly_variable"] = missing_hvg["highly_variable"].astype( - bool - ) - missing_hvg["gene"] = gene_list[~filt] - hvg = pd.concat([hvg, missing_hvg], ignore_index=True) - - # Order as before filtering - idxs = np.concatenate((np.where(filt)[0], np.where(~filt)[0])) - hvg = hvg.loc[np.argsort(idxs)] - - df.append(hvg) - - df = pd.concat(df, axis=0) - df["highly_variable"] = df["highly_variable"].astype(int) - df = df.groupby("gene", observed=True).agg( - dict( - means="mean", - dispersions="mean", - dispersions_norm="mean", - highly_variable="sum", - ) - ) - df.rename( - columns=dict(highly_variable="highly_variable_nbatches"), inplace=True - ) - df["highly_variable_intersection"] = df["highly_variable_nbatches"] == len( - batches + df = _highly_variable_genes_batched( + adata, batch_key, layer=layer, cutoff=cutoff, n_bins=n_bins, flavor=flavor ) - if n_top_genes is not None: - # sort genes by how often they selected as hvg within each batch and - # break ties with normalized dispersion across batches - df.sort_values( - ["highly_variable_nbatches", "dispersions_norm"], - ascending=False, - na_position="last", - inplace=True, - ) - high_var = np.zeros(df.shape[0]) - high_var[:n_top_genes] = True - df["highly_variable"] = high_var.astype(bool) - df = df.loc[adata.var_names, :] - else: - df = df.loc[adata.var_names] - dispersion_norm = df["dispersions_norm"].to_numpy() - dispersion_norm[np.isnan(dispersion_norm)] = 0 # similar to Seurat - gene_subset = np.logical_and.reduce( - ( - df["means"] > min_mean, - df["means"] < max_mean, - df["dispersions_norm"] > min_disp, - df["dispersions_norm"] < max_disp, - ) - ) - df["highly_variable"] = gene_subset - logg.info(" finished", time=start) - if inplace: - adata.uns["hvg"] = {"flavor": flavor} - logg.hint( - "added\n" - " 'highly_variable', boolean vector (adata.var)\n" - " 'means', float vector (adata.var)\n" - " 'dispersions', float vector (adata.var)\n" - " 'dispersions_norm', float vector (adata.var)" - ) - adata.var["highly_variable"] = df["highly_variable"].to_numpy() - adata.var["means"] = df["means"].to_numpy() - adata.var["dispersions"] = df["dispersions"].to_numpy() - adata.var["dispersions_norm"] = ( - df["dispersions_norm"].to_numpy().astype("float32", copy=False) - ) - - if batch_key is not None: - adata.var["highly_variable_nbatches"] = df[ - "highly_variable_nbatches" - ].to_numpy() - adata.var["highly_variable_intersection"] = df[ - "highly_variable_intersection" - ].to_numpy() - if subset: - adata._inplace_subset_var(df["highly_variable"].to_numpy()) - - else: + if not inplace: if subset: df = df.loc[df["highly_variable"]] return df + + adata.uns["hvg"] = {"flavor": flavor} + logg.hint( + "added\n" + " 'highly_variable', boolean vector (adata.var)\n" + " 'means', float vector (adata.var)\n" + " 'dispersions', float vector (adata.var)\n" + " 'dispersions_norm', float vector (adata.var)" + ) + adata.var["highly_variable"] = df["highly_variable"] + adata.var["means"] = df["means"] + adata.var["dispersions"] = df["dispersions"] + adata.var["dispersions_norm"] = df["dispersions_norm"].astype( + np.float32, copy=False + ) + + if batch_key is not None: + adata.var["highly_variable_nbatches"] = df["highly_variable_nbatches"] + adata.var["highly_variable_intersection"] = df["highly_variable_intersection"] + if subset: + adata._inplace_subset_var(df["highly_variable"]) diff --git a/scanpy/tests/test_highly_variable_genes.py b/scanpy/tests/test_highly_variable_genes.py index 598bc5617f..27b237ad5b 100644 --- a/scanpy/tests/test_highly_variable_genes.py +++ b/scanpy/tests/test_highly_variable_genes.py @@ -1,17 +1,21 @@ from __future__ import annotations from pathlib import Path +from string import ascii_letters from typing import Literal import numpy as np import pandas as pd import pytest +from anndata import AnnData +from pandas.testing import assert_frame_equal, assert_index_equal from scipy import sparse import scanpy as sc from scanpy.testing._helpers import _check_check_values_warnings from scanpy.testing._helpers.data import pbmc3k, pbmc68k_reduced from scanpy.testing._pytest.marks import needs +from scanpy.testing._pytest.params import ARRAY_TYPES_SUPPORTED FILE = Path(__file__).parent / Path("_scripts/seurat_hvg.csv") FILE_V3 = Path(__file__).parent / Path("_scripts/seurat_hvg_v3.csv.gz") @@ -19,13 +23,24 @@ FILE_CELL_RANGER = Path(__file__).parent / "_scripts/cell_ranger_hvg.csv" -def test_highly_variable_genes_runs(): +@pytest.fixture(scope="session") +def adata_sess() -> AnnData: adata = sc.datasets.blobs() + rng = np.random.default_rng(0) + adata.var_names = rng.choice(list(ascii_letters), adata.n_vars, replace=False) + return adata + + +@pytest.fixture +def adata(adata_sess: AnnData) -> AnnData: + return adata_sess.copy() + + +def test_runs(adata): sc.pp.highly_variable_genes(adata) -def test_highly_variable_genes_supports_batch(): - adata = sc.datasets.blobs() +def test_supports_batch(adata): gen = np.random.default_rng(0) adata.obs["batch"] = pd.array( gen.binomial(3, 0.5, size=adata.n_obs), dtype="category" @@ -35,39 +50,33 @@ def test_highly_variable_genes_supports_batch(): assert "highly_variable_intersection" in adata.var.columns -def test_highly_variable_genes_supports_layers(): - adata = sc.datasets.blobs() - gen = np.random.default_rng(0) - adata.obs["batch"] = pd.array( - gen.binomial(4, 0.5, size=adata.n_obs), dtype="category" - ) - sc.pp.highly_variable_genes(adata, batch_key="batch", n_top_genes=3) - assert "highly_variable_nbatches" in adata.var.columns - assert adata.var["highly_variable"].sum() == 3 - highly_var_first_layer = adata.var["highly_variable"] +def test_supports_layers(adata_sess): + def execute(layer: str | None) -> AnnData: + gen = np.random.default_rng(0) + adata = adata_sess.copy() + assert isinstance(adata.X, np.ndarray) + if layer: + adata.X, adata.layers[layer] = None, adata.X.copy() + gen.shuffle(adata.layers[layer]) + adata.obs["batch"] = pd.array( + gen.binomial(4, 0.5, size=adata.n_obs), dtype="category" + ) + sc.pp.highly_variable_genes( + adata, batch_key="batch", n_top_genes=3, layer=layer + ) + assert "highly_variable_nbatches" in adata.var.columns + assert adata.var["highly_variable"].sum() == 3 + return adata - adata = sc.datasets.blobs() - assert isinstance(adata.X, np.ndarray) - new_layer = adata.X.copy() - gen.shuffle(new_layer) - adata.layers["test_layer"] = new_layer - adata.obs["batch"] = gen.binomial(4, 0.5, size=(adata.n_obs)) - adata.obs["batch"] = adata.obs["batch"].astype("category") - sc.pp.highly_variable_genes( - adata, batch_key="batch", n_top_genes=3, layer="test_layer" - ) - assert "highly_variable_nbatches" in adata.var.columns - assert adata.var["highly_variable"].sum() == 3 - assert (highly_var_first_layer != adata.var["highly_variable"]).any() + adata1, adata2 = map(execute, [None, "test_layer"]) + assert (adata1.var["highly_variable"] != adata2.var["highly_variable"]).any() -def test_highly_variable_genes_no_batch_matches_batch(): - adata = sc.datasets.blobs() +def test_no_batch_matches_batch(adata): sc.pp.highly_variable_genes(adata) no_batch_hvg = adata.var["highly_variable"].copy() assert no_batch_hvg.any() - adata.obs["batch"] = "batch" - adata.obs["batch"] = adata.obs["batch"].astype("category") + adata.obs["batch"] = pd.array(["batch"], dtype="category").repeat(len(adata)) sc.pp.highly_variable_genes(adata, batch_key="batch") assert np.all(no_batch_hvg == adata.var["highly_variable"]) assert np.all( @@ -75,28 +84,31 @@ def test_highly_variable_genes_no_batch_matches_batch(): ) -def test_highly_variable_genes_(): - adata = sc.datasets.blobs() - adata.obs["batch"] = np.tile(["a", "b"], adata.shape[0] // 2) - sc.pp.highly_variable_genes(adata, batch_key="batch") +@pytest.mark.parametrize("batch_key", [None, "batch"], ids=["single", "batched"]) +@pytest.mark.parametrize("array_type", ARRAY_TYPES_SUPPORTED) +def test_no_inplace(adata, array_type, batch_key): + """Tests that, with `n_top_genes=None` the returned dataframe has the expected columns.""" + adata.X = array_type(adata.X) + if batch_key: + adata.obs[batch_key] = np.tile(["a", "b"], adata.shape[0] // 2) + sc.pp.highly_variable_genes(adata, batch_key=batch_key, n_bins=3) assert adata.var["highly_variable"].any() - colnames = [ - "means", - "dispersions", - "dispersions_norm", - "highly_variable_nbatches", - "highly_variable_intersection", - "highly_variable", - ] - hvg_df = sc.pp.highly_variable_genes(adata, batch_key="batch", inplace=False) - assert hvg_df is not None - assert np.all(np.isin(colnames, hvg_df.columns)) + colnames = {"means", "dispersions", "dispersions_norm", "highly_variable"} | ( + {"mean_bin"} + if batch_key is None + else {"highly_variable_nbatches", "highly_variable_intersection"} + ) + hvg_df = sc.pp.highly_variable_genes( + adata, batch_key=batch_key, n_bins=3, inplace=False + ) + assert isinstance(hvg_df, pd.DataFrame) + assert colnames == set(hvg_df.columns) @pytest.mark.parametrize("base", [None, 10]) @pytest.mark.parametrize("flavor", ["seurat", "cell_ranger"]) -def test_highly_variable_genes_keep_layer(base, flavor): +def test_keep_layer(base, flavor): adata = pbmc3k() # cell_ranger flavor can raise error if many 0 genes sc.pp.filter_genes(adata, min_counts=1) @@ -124,7 +136,7 @@ def _check_pearson_hvg_columns(output_df: pd.DataFrame, n_top_genes: int): assert np.nanmax(output_df["highly_variable_rank"].to_numpy()) <= n_top_genes - 1 -def test_highly_variable_genes_pearson_residuals_inputchecks(pbmc3k_parametrized_small): +def test_pearson_residuals_inputchecks(pbmc3k_parametrized_small): adata = pbmc3k_parametrized_small() # depending on check_values, warnings should be raised for non-integer data @@ -164,7 +176,7 @@ def test_highly_variable_genes_pearson_residuals_inputchecks(pbmc3k_parametrized ) @pytest.mark.parametrize("theta", [100, np.Inf], ids=["100theta", "inftheta"]) @pytest.mark.parametrize("n_top_genes", [100, 200], ids=["100n", "200n"]) -def test_highly_variable_genes_pearson_residuals_general( +def test_pearson_residuals_general( pbmc3k_parametrized_small, subset, clip, theta, n_top_genes ): adata = pbmc3k_parametrized_small() @@ -248,9 +260,7 @@ def test_highly_variable_genes_pearson_residuals_general( @pytest.mark.parametrize("subset", [True, False], ids=["subset", "full"]) @pytest.mark.parametrize("n_top_genes", [100, 200], ids=["100n", "200n"]) -def test_highly_variable_genes_pearson_residuals_batch( - pbmc3k_parametrized_small, subset, n_top_genes -): +def test_pearson_residuals_batch(pbmc3k_parametrized_small, subset, n_top_genes): adata = pbmc3k_parametrized_small() # cleanup var del adata.var @@ -382,7 +392,7 @@ def test_compare_to_upstream( @needs.skmisc -def test_highly_variable_genes_compare_to_seurat_v3(): +def test_compare_to_seurat_v3(): ### test without batch seurat_hvg_info = pd.read_csv(FILE_V3) @@ -451,7 +461,7 @@ def test_highly_variable_genes_compare_to_seurat_v3(): @needs.skmisc -def test_highly_variable_genes_seurat_v3_warning(): +def test_seurat_v3_warning(): pbmc = pbmc3k()[:200].copy() sc.pp.log1p(pbmc) with pytest.warns( @@ -461,13 +471,13 @@ def test_highly_variable_genes_seurat_v3_warning(): sc.pp.highly_variable_genes(pbmc, flavor="seurat_v3") -def test_highly_variable_genes_batches(): +def test_batches(): adata = pbmc68k_reduced() adata[:100, :100].X = np.zeros((100, 100)) adata.obs["batch"] = ["0" if i < 100 else "1" for i in range(adata.n_obs)] - adata_1 = adata[adata.obs.batch.isin(["0"]), :] - adata_2 = adata[adata.obs.batch.isin(["1"]), :] + adata_1 = adata[adata.obs["batch"] == "0"].copy() + adata_2 = adata[adata.obs["batch"] == "1"].copy() sc.pp.highly_variable_genes( adata, @@ -538,7 +548,7 @@ def test_seurat_v3_mean_var_output_with_batchkey(): def test_cellranger_n_top_genes_warning(): X = np.random.poisson(2, (100, 30)) - adata = sc.AnnData(X) + adata = AnnData(X) sc.pp.normalize_total(adata) sc.pp.log1p(adata) @@ -549,12 +559,26 @@ def test_cellranger_n_top_genes_warning(): sc.pp.highly_variable_genes(adata, n_top_genes=1000, flavor="cell_ranger") +def test_cutoff_info(): + adata = pbmc3k()[:200].copy() + sc.pp.normalize_total(adata) + sc.pp.log1p(adata) + with pytest.warns(UserWarning, match="pass `n_top_genes`, all cutoffs are ignored"): + sc.pp.highly_variable_genes(adata, n_top_genes=10, max_mean=3.1) + + @pytest.mark.parametrize("flavor", ["seurat", "cell_ranger"]) +@pytest.mark.parametrize("array_type", ARRAY_TYPES_SUPPORTED) @pytest.mark.parametrize("subset", [True, False], ids=["subset", "full"]) @pytest.mark.parametrize("inplace", [True, False], ids=["inplace", "copy"]) -def test_highly_variable_genes_subset_inplace_consistency(flavor, subset, inplace): +def test_subset_inplace_consistency(flavor, array_type, subset, inplace): + """Tests that, with `n_top_genes=n` + - `inplace` and `subset` interact correctly + - for both the `seurat` and `cell_ranger` flavors + - for dask arrays and non-dask arrays + """ adata = sc.datasets.blobs(n_observations=20, n_variables=80, random_state=0) - adata.X = np.abs(adata.X).astype(int) + adata.X = array_type(np.abs(adata.X).astype(int)) if flavor == "seurat" or flavor == "cell_ranger": sc.pp.normalize_total(adata, target_sum=1e4) @@ -578,3 +602,34 @@ def test_highly_variable_genes_subset_inplace_consistency(flavor, subset, inplac assert (output_df is None) == inplace assert len(adata.var if inplace else output_df) == (15 if subset else n_genes) + if output_df is not None: + assert isinstance(output_df, pd.DataFrame) + + +@pytest.mark.parametrize("flavor", ["seurat", "cell_ranger"]) +@pytest.mark.parametrize("batch_key", [None, "batch"], ids=["single", "batched"]) +@pytest.mark.parametrize( + "to_dask", [p for p in ARRAY_TYPES_SUPPORTED if "dask" in p.values[0].__name__] +) +def test_dask_consistency(adata: AnnData, flavor, batch_key, to_dask): + adata.X = np.abs(adata.X).astype(int) + if batch_key is not None: + adata.obs[batch_key] = np.tile(["a", "b"], adata.shape[0] // 2) + sc.pp.normalize_total(adata, target_sum=1e4) + sc.pp.log1p(adata) + + adata_dask = adata.copy() + adata_dask.X = to_dask(adata_dask.X) + + output_mem, output_dask = ( + sc.pp.highly_variable_genes(ad, flavor=flavor, n_top_genes=15, inplace=False) + for ad in [adata, adata_dask] + ) + + assert isinstance(output_mem, pd.DataFrame) + assert isinstance(output_dask, pd.DataFrame) + + assert_index_equal(adata.var_names, output_mem.index, check_names=False) + assert_index_equal(adata.var_names, output_dask.index, check_names=False) + + assert_frame_equal(output_mem, output_dask) From ddeb820620b48752d41d0903df0475c4a60d7b64 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Fri, 16 Feb 2024 03:45:02 +1100 Subject: [PATCH 14/54] Minimum dependency test job (#2816) * Start mindeps * Fix check_is_fitted import * Temporarilly bump anndata dep to access test utilities * Support for numpy 1.23 where np.equal didn't work on strings * Fix palette color mapping for pandas < 2.1 * Bump networkx * Exit on error for test script * Bump numba for numpy compat * update ci * Fix array comparison in both envs * Bump statsmodels version * Test returns different plot type with older dependencies * Skip test that relies on pd.value_counts * Try to use better naming test results in CI * Temporarily bump pandas * Add dependency on pynndescent, bump packaging version * skip doctest for dendrogram * install pre-commit in env * Bump networkx * Get tests to collect with an old anndata version * Fix most preprocessing tests (account for old anndata constructor) * Bump anndata min version to 0.7.8 * Fix pytest_itemcollected * Bump min anndata version to 0.8 * Fix test_get.py cases * Fix neighbor test * Fix dendrogram plotting cases * fix stacked violin ordering * Bump tolerance for older versions of numba * Fix ordering for matrixplot * Fix preprocessing tests * xfail masking test for anndata 0.8 * Fix order * Fix min-deps.py * Discard changes to scanpy/plotting/_utils.py * removed TODOs from min-deps.py * Remove dev script * Rename test jobs to be more identifiable * Use marker for xfail * Add warning for PCA order * Fix usage of pytest.mark.xfail * Remove commented out code from CI job * Obey signature test * Don't error on warning for dask.dataframe * update dask version * fix dask version better * Fix view issue with anndata==0.8 * Typo * Release note * coverage for min deps * fix coverage for minimum-version install --------- Co-authored-by: Philipp A --- .azure-pipelines.yml | 40 ++++---- ci/scripts/min-deps.py | 99 +++++++++++++++++++ docs/release-notes/1.10.0.md | 1 + pyproject.toml | 28 +++--- scanpy/get/get.py | 2 +- scanpy/neighbors/_backends/rapids.py | 3 +- scanpy/plotting/_baseplot_class.py | 2 +- scanpy/plotting/_matrixplot.py | 10 +- scanpy/plotting/_stacked_violin.py | 15 +-- scanpy/plotting/_tools/scatterplots.py | 7 +- .../preprocessing/_highly_variable_genes.py | 5 + scanpy/preprocessing/_pca.py | 14 +++ scanpy/testing/_helpers/__init__.py | 30 +++++- scanpy/testing/_pytest/__init__.py | 26 ++++- scanpy/testing/_pytest/params.py | 15 ++- scanpy/tests/test_get.py | 5 +- scanpy/tests/test_metrics.py | 7 +- scanpy/tests/test_neighbors.py | 3 +- scanpy/tests/test_pca.py | 33 ++++++- scanpy/tests/test_preprocessing.py | 16 +-- .../tests/test_preprocessing_distributed.py | 18 ++-- scanpy/tools/_dendrogram.py | 8 +- 22 files changed, 314 insertions(+), 73 deletions(-) create mode 100755 ci/scripts/min-deps.py diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml index 4642fe4435..cbe87aadb9 100644 --- a/.azure-pipelines.yml +++ b/.azure-pipelines.yml @@ -6,10 +6,9 @@ variables: python.version: '3.11' PIP_CACHE_DIR: $(Pipeline.Workspace)/.pip PYTEST_ADDOPTS: '-v --color=yes --durations=0 --nunit-xml=test-data/test-results.xml' - ANNDATA_DEV: no - RUN_COVERAGE: no TEST_EXTRA: 'test-full' - PRERELEASE_DEPENDENCIES: no + DEPENDENCIES_VERSION: "latest" # |"pre-release" | "minimum-version" + TEST_TYPE: "standard" # | "coverage" jobs: - job: PyTest @@ -20,12 +19,16 @@ jobs: Python3.9: python.version: '3.9' Python3.11: {} - minimal_tests: + minimal_dependencies: TEST_EXTRA: 'test-min' anndata_dev: - ANNDATA_DEV: yes - RUN_COVERAGE: yes - PRERELEASE_DEPENDENCIES: yes + DEPENDENCIES_VERSION: "pre-release" + TEST_TYPE: "coverage" + minimum_versions: + python.version: '3.9' + DEPENDENCIES_VERSION: "minimum-version" + TEST_TYPE: "coverage" + steps: - task: UsePythonVersion@0 @@ -52,19 +55,22 @@ jobs: pip install wheel coverage pip install .[dev,$(TEST_EXTRA)] displayName: 'Install dependencies' - condition: eq(variables['PRERELEASE_DEPENDENCIES'], 'no') + condition: eq(variables['DEPENDENCIES_VERSION'], 'latest') - script: | python -m pip install --pre --upgrade pip pip install --pre wheel coverage pip install --pre .[dev,$(TEST_EXTRA)] + pip install -v "anndata[dev,test] @ git+https://github.com/scverse/anndata" displayName: 'Install dependencies release candidates' - condition: eq(variables['PRERELEASE_DEPENDENCIES'], 'yes') + condition: eq(variables['DEPENDENCIES_VERSION'], 'pre-release') - script: | - pip install -v "anndata[dev,test] @ git+https://github.com/scverse/anndata" - displayName: 'Install development anndata' - condition: eq(variables['ANNDATA_DEV'], 'yes') + python -m pip install pip wheel tomli packaging pytest-cov + pip install `python3 ci/scripts/min-deps.py pyproject.toml --extra dev test` + pip install --no-deps . + displayName: 'Install dependencies minimum version' + condition: eq(variables['DEPENDENCIES_VERSION'], 'minimum-version') - script: | pip list @@ -72,31 +78,31 @@ jobs: - script: pytest displayName: 'PyTest' - condition: eq(variables['RUN_COVERAGE'], 'no') + condition: eq(variables['TEST_TYPE'], 'standard') - script: | coverage run -m pytest coverage xml displayName: 'PyTest (coverage)' - condition: eq(variables['RUN_COVERAGE'], 'yes') + condition: eq(variables['TEST_TYPE'], 'coverage') - task: PublishCodeCoverageResults@1 inputs: codeCoverageTool: Cobertura summaryFileLocation: 'test-data/coverage.xml' failIfCoverageEmpty: true - condition: eq(variables['RUN_COVERAGE'], 'yes') + condition: eq(variables['TEST_TYPE'], 'coverage') - task: PublishTestResults@2 condition: succeededOrFailed() inputs: testResultsFiles: 'test-data/test-results.xml' testResultsFormat: NUnit - testRunTitle: 'Publish test results for Python $(python.version)' + testRunTitle: 'Publish test results for $(Agent.JobName)' - script: bash <(curl -s https://codecov.io/bash) displayName: 'Upload to codecov.io' - condition: eq(variables['RUN_COVERAGE'], 'yes') + condition: eq(variables['TEST_TYPE'], 'coverage') - job: CheckBuild pool: diff --git a/ci/scripts/min-deps.py b/ci/scripts/min-deps.py new file mode 100755 index 0000000000..b3f393ea57 --- /dev/null +++ b/ci/scripts/min-deps.py @@ -0,0 +1,99 @@ +#!python3 +from __future__ import annotations + +import argparse +import sys +from collections import deque +from pathlib import Path +from typing import TYPE_CHECKING + +if sys.version_info >= (3, 11): + import tomllib +else: + import tomli as tomllib + +from packaging.requirements import Requirement +from packaging.version import Version + +if TYPE_CHECKING: + from collections.abc import Generator, Iterable + + +def min_dep(req: Requirement) -> Requirement: + """ + Given a requirement, return the minimum version specifier. + + Example + ------- + + >>> min_dep(Requirement("numpy>=1.0")) + "numpy==1.0" + """ + req_name = req.name + if req.extras: + req_name = f"{req_name}[{','.join(req.extras)}]" + + if not req.specifier: + return Requirement(req_name) + + min_version = Version("0.0.0.a1") + for spec in req.specifier: + if spec.operator in [">", ">=", "~="]: + min_version = max(min_version, Version(spec.version)) + elif spec.operator == "==": + min_version = Version(spec.version) + + return Requirement(f"{req_name}=={min_version}.*") + + +def extract_min_deps( + dependencies: Iterable[Requirement], *, pyproject +) -> Generator[Requirement, None, None]: + dependencies = deque(dependencies) # We'll be mutating this + project_name = pyproject["project"]["name"] + + while len(dependencies) > 0: + req = dependencies.pop() + + # If we are referring to other optional dependency lists, resolve them + if req.name == project_name: + assert req.extras, f"Project included itself as dependency, without specifying extras: {req}" + for extra in req.extras: + extra_deps = pyproject["project"]["optional-dependencies"][extra] + dependencies += map(Requirement, extra_deps) + else: + yield min_dep(req) + + +def main(): + parser = argparse.ArgumentParser( + prog="min-deps", + description="""Parse a pyproject.toml file and output a list of minimum dependencies. + + Output is directly passable to `pip install`.""", + usage="pip install `python min-deps.py pyproject.toml`", + ) + parser.add_argument( + "path", type=Path, help="pyproject.toml to parse minimum dependencies from" + ) + parser.add_argument( + "--extras", type=str, nargs="*", default=(), help="extras to install" + ) + + args = parser.parse_args() + + pyproject = tomllib.loads(args.path.read_text()) + + project_name = pyproject["project"]["name"] + deps = [ + *map(Requirement, pyproject["project"]["dependencies"]), + *(Requirement(f"{project_name}[{extra}]") for extra in args.extras), + ] + + min_deps = extract_min_deps(deps, pyproject=pyproject) + + print(" ".join(map(str, min_deps))) + + +if __name__ == "__main__": + main() diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 37a6adf97f..7d48d4fd9d 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -35,6 +35,7 @@ * Fix setting `sc.settings.verbosity` in some cases {pr}`2605` {smaller}`P Angerer` * Fix all remaining pandas warnings {pr}`2789` {smaller}`P Angerer` * Fix some annoying plotting warnings around violin plots {pr}`2844` {smaller}`P Angerer` +* Scanpy now has a test job which tests against the minumum versions of the dependencies. In the process of implementing this, many bugs associated with using older versions of `pandas`, `anndata`, `numpy`, and `matplotlib` were fixed. {pr}`2816` {smaller}`I Virshup` ```{rubric} Ecosystem ``` diff --git a/pyproject.toml b/pyproject.toml index bd5e2b5215..fda07ea18b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,24 +46,25 @@ classifiers = [ "Topic :: Scientific/Engineering :: Visualization", ] dependencies = [ - "anndata>=0.7.4", + "anndata>=0.8", # numpy needs a version due to #1320 - "numpy>=1.17.0", + "numpy>=1.23", "matplotlib>=3.6", - "pandas >=2.1.3", - "scipy>=1.4", - "seaborn>=0.13.0", - "h5py>=3", + "pandas >=1.5", + "scipy>=1.8", + "seaborn>=0.13", + "h5py>=3.1", "tqdm", "scikit-learn>=0.24", - "statsmodels>=0.10.0rc2", + "statsmodels>=0.13", "patsy", - "networkx>=2.3", + "networkx>=2.7", "natsort", "joblib", - "numba>=0.41.0", + "numba>=0.56", "umap-learn>=0.3.10", - "packaging", + "pynndescent>=0.5", + "packaging>=21.3", "session-info", "legacy-api-wrap>=1.4", # for positional API deprecations "get-annotations; python_version < '3.10'", @@ -132,8 +133,8 @@ dev = [ ] # Algorithms paga = ["igraph"] -louvain = ["igraph", "louvain>=0.6,!=0.6.2"] # Louvain community detection -leiden = ["igraph>=0.10", "leidenalg>=0.9"] # Leiden community detection +louvain = ["igraph", "louvain>=0.6.0,!=0.6.2"] # Louvain community detection +leiden = ["igraph>=0.10", "leidenalg>=0.9.0"] # Leiden community detection bbknn = ["bbknn"] # Batch balanced KNN (batch correction) magic = ["magic-impute>=2.0"] # MAGIC imputation method skmisc = ["scikit-misc>=0.1.3"] # highly_variable_genes method 'seurat_v3' @@ -142,7 +143,7 @@ scanorama = ["scanorama"] # Scanorama dataset integration scrublet = ["scikit-image"] # Doublet detection with automatic thresholds # Acceleration rapids = ["cudf>=0.9", "cuml>=0.9", "cugraph>=0.9"] # GPU accelerated calculation of neighbors -dask = ["dask[array]!=2.17.0"] # Use the Dask parallelization engine +dask = ["dask[array]>=2022.09.2"] # Use the Dask parallelization engine dask-ml = ["dask-ml", "scanpy[dask]"] # Dask-ML for sklearn-like API [tool.hatch.build] @@ -166,6 +167,7 @@ nunit_attach_on = "fail" markers = [ "internet: tests which rely on internet resources (enable with `--internet-tests`)", "gpu: tests that use a GPU (currently unused, but needs to be specified here as we import anndata.tests.helpers, which uses it)", + "anndata_dask_support: tests that require dask support in anndata", ] filterwarnings = [ # legacy-api-wrap: internal use of positional API diff --git a/scanpy/get/get.py b/scanpy/get/get.py index b51dc30a26..8ef58f4b51 100644 --- a/scanpy/get/get.py +++ b/scanpy/get/get.py @@ -260,7 +260,7 @@ def obs_df( ... ) >>> plotdf.columns Index(['CD8B', 'n_genes', 'X_umap-0', 'X_umap-1'], dtype='object') - >>> plotdf.plot.scatter("X_umap-0", "X_umap-1", c="CD8B") + >>> plotdf.plot.scatter("X_umap-0", "X_umap-1", c="CD8B") # doctest: +SKIP Calculating mean expression for marker genes by cluster: diff --git a/scanpy/neighbors/_backends/rapids.py b/scanpy/neighbors/_backends/rapids.py index 78a6bb7359..ef6b9b23f1 100644 --- a/scanpy/neighbors/_backends/rapids.py +++ b/scanpy/neighbors/_backends/rapids.py @@ -3,8 +3,9 @@ from typing import TYPE_CHECKING, Any, Literal import numpy as np -from sklearn.base import BaseEstimator, TransformerMixin, check_is_fitted +from sklearn.base import BaseEstimator, TransformerMixin from sklearn.exceptions import NotFittedError +from sklearn.utils.validation import check_is_fitted from ..._settings import settings from ._common import TransformerChecksMixin diff --git a/scanpy/plotting/_baseplot_class.py b/scanpy/plotting/_baseplot_class.py index 22ff04913e..10329f16e4 100644 --- a/scanpy/plotting/_baseplot_class.py +++ b/scanpy/plotting/_baseplot_class.py @@ -347,7 +347,7 @@ def add_totals( >>> adata = sc.datasets.pbmc68k_reduced() >>> markers = {'T-cell': 'CD3D', 'B-cell': 'CD79A', 'myeloid': 'CST3'} >>> plot = sc.pl._baseplot_class.BasePlot(adata, markers, groupby='bulk_labels').add_totals() - >>> plot.plot_group_extra['counts_df'] + >>> plot.plot_group_extra['counts_df'] # doctest: +SKIP bulk_labels CD4+/CD25 T Reg 68 CD4+/CD45RA+/CD25- Naive T 8 diff --git a/scanpy/plotting/_matrixplot.py b/scanpy/plotting/_matrixplot.py index d811a12a8a..a65332be65 100644 --- a/scanpy/plotting/_matrixplot.py +++ b/scanpy/plotting/_matrixplot.py @@ -168,7 +168,15 @@ def __init__( if values_df is None: # compute mean value - values_df = self.obs_tidy.groupby(level=0, observed=True).mean() + values_df = ( + self.obs_tidy.groupby(level=0, observed=True) + .mean() + .loc[ + self.categories_order + if self.categories_order is not None + else self.categories + ] + ) if standard_scale == "group": values_df = values_df.sub(values_df.min(1), axis=0) diff --git a/scanpy/plotting/_stacked_violin.py b/scanpy/plotting/_stacked_violin.py index fed4893cde..6b9abfd49c 100644 --- a/scanpy/plotting/_stacked_violin.py +++ b/scanpy/plotting/_stacked_violin.py @@ -383,14 +383,17 @@ def _mainplot(self, ax): if self.var_names_idx_order is not None: _matrix = _matrix.iloc[:, self.var_names_idx_order] - if self.categories_order is not None: - _matrix.index = _matrix.index.reorder_categories( - self.categories_order, ordered=True - ) - # get mean values for color and transform to color values # using colormap - _color_df = _matrix.groupby(level=0, observed=True).median() + _color_df = ( + _matrix.groupby(level=0, observed=True) + .median() + .loc[ + self.categories_order + if self.categories_order is not None + else self.categories + ] + ) if self.are_axes_swapped: _color_df = _color_df.T diff --git a/scanpy/plotting/_tools/scatterplots.py b/scanpy/plotting/_tools/scatterplots.py index b1b8937ff5..59c828d517 100644 --- a/scanpy/plotting/_tools/scatterplots.py +++ b/scanpy/plotting/_tools/scatterplots.py @@ -20,6 +20,7 @@ from matplotlib.colors import Colormap, Normalize from matplotlib.figure import Figure # noqa: TCH002 from numpy.typing import NDArray # noqa: TCH002 +from packaging.version import Version from ... import logging as logg from ..._settings import settings @@ -1247,8 +1248,10 @@ def _color_vector( } # If color_map does not have unique values, this can be slow as the # result is not categorical - color_vector = pd.Categorical(values.map(color_map, na_action="ignore")) - + if Version(pd.__version__) < Version("2.1.0"): + color_vector = pd.Categorical(values.map(color_map)) + else: + color_vector = pd.Categorical(values.map(color_map, na_action="ignore")) # Set color to 'missing color' for all missing values if color_vector.isna().any(): color_vector = color_vector.add_categories([to_hex(na_color)]) diff --git a/scanpy/preprocessing/_highly_variable_genes.py b/scanpy/preprocessing/_highly_variable_genes.py index e6f925a168..0dd2a33c51 100644 --- a/scanpy/preprocessing/_highly_variable_genes.py +++ b/scanpy/preprocessing/_highly_variable_genes.py @@ -252,6 +252,11 @@ def _highly_variable_genes_single_batch( `highly_variable`, `means`, `dispersions`, and `dispersions_norm`. """ X = _get_obs_rep(adata, layer=layer) + + if hasattr(X, "_view_args"): # AnnData array view + # For compatibility with anndata<0.9 + X = X.copy() # Doesn't actually copy memory, just removes View class wrapper + if flavor == "seurat": X = X.copy() if "log1p" in adata.uns_keys() and adata.uns["log1p"].get("base") is not None: diff --git a/scanpy/preprocessing/_pca.py b/scanpy/preprocessing/_pca.py index 53377f1321..df88b57b19 100644 --- a/scanpy/preprocessing/_pca.py +++ b/scanpy/preprocessing/_pca.py @@ -3,6 +3,7 @@ import warnings from warnings import warn +import anndata as ad import numpy as np from anndata import AnnData from packaging import version @@ -188,6 +189,19 @@ def pca( X = _get_obs_rep(adata_comp, layer=layer) + # See: https://github.com/scverse/scanpy/pull/2816#issuecomment-1932650529 + if ( + version.parse(ad.__version__) < version.parse("0.9") + and mask is not None + and isinstance(X, np.ndarray) + ): + warnings.warn( + "When using a mask parameter with anndata<0.9 on a dense array, the PCA" + "can have slightly different results due the array being column major " + "instead of row major.", + UserWarning, + ) + is_dask = isinstance(X, DaskArray) # check_random_state returns a numpy RandomState when passed an int but diff --git a/scanpy/testing/_helpers/__init__.py b/scanpy/testing/_helpers/__init__.py index 939ce60c53..c36ed5a2cb 100644 --- a/scanpy/testing/_helpers/__init__.py +++ b/scanpy/testing/_helpers/__init__.py @@ -20,9 +20,24 @@ # These functions can be used to check that functions are correctly using arugments like `layers`, `obsm`, etc. +def anndata_v0_8_constructor_compat(X, *args, **kwargs): + """Constructor for anndata that uses dtype of X for test compatibility with older versions of AnnData. + + Once the minimum version of AnnData is 0.9, this function can be replaced with the default constructor. + """ + import anndata as ad + from packaging.version import Version + + if Version(ad.__version__) < Version("0.9"): + return ad.AnnData(X=X, *args, **kwargs, dtype=X.dtype) + else: + return ad.AnnData(X=X, *args, **kwargs) + + def check_rep_mutation(func, X, *, fields=("layer", "obsm"), **kwargs): """Check that only the array meant to be modified is modified.""" - adata = sc.AnnData(X=X.copy()) + adata = anndata_v0_8_constructor_compat(X.copy()) + for field in fields: sc.get._set_obs_rep(adata, X, **{field: field}) X_array = asarray(X) @@ -105,3 +120,16 @@ def _check_check_values_warnings(function, adata, expected_warning, kwargs={}): function(adata.copy(), **kwargs, check_values=True) warning_msgs = [w.message.args[0] for w in record] assert expected_warning in warning_msgs + + +# Delayed imports for case where we aren't using dask +def as_dense_dask_array(*args, **kwargs): + from anndata.tests.helpers import as_dense_dask_array + + return as_dense_dask_array(*args, **kwargs) + + +def as_sparse_dask_array(*args, **kwargs): + from anndata.tests.helpers import as_sparse_dask_array + + return as_sparse_dask_array(*args, **kwargs) diff --git a/scanpy/testing/_pytest/__init__.py b/scanpy/testing/_pytest/__init__.py index 1dfc3f78d2..ad42b8ec74 100644 --- a/scanpy/testing/_pytest/__init__.py +++ b/scanpy/testing/_pytest/__init__.py @@ -3,6 +3,7 @@ import os import sys +import warnings from typing import TYPE_CHECKING import pytest @@ -71,10 +72,12 @@ def _fix_dask_df_warning(): import dask # noqa: F401 except ImportError: return - with pytest.warns( - DeprecationWarning, - match=r"The current Dask DataFrame implementation is deprecated", - ): + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", + category=DeprecationWarning, + message=r"The current Dask DataFrame implementation is deprecated", + ) import dask.dataframe # noqa: F401 @@ -118,3 +121,18 @@ def _modify_doctests(request: pytest.FixtureRequest) -> None: skip_reason: str | None if skip_reason := getattr(func, "_doctest_skip_reason", None): pytest.skip(reason=skip_reason) + + +def pytest_itemcollected(item: pytest.Item) -> None: + # Dask AnnData tests require anndata > 0.10 + import anndata + from packaging.version import Version + + requires_anndata_dask_support = ( + len([mark for mark in item.iter_markers(name="anndata_dask_support")]) > 0 + ) + + if requires_anndata_dask_support and Version(anndata.__version__) < Version("0.10"): + item.add_marker( + pytest.mark.skip(reason="dask support requires anndata version > 0.10") + ) diff --git a/scanpy/testing/_pytest/params.py b/scanpy/testing/_pytest/params.py index 3ff543bfa7..655daf6c7a 100644 --- a/scanpy/testing/_pytest/params.py +++ b/scanpy/testing/_pytest/params.py @@ -5,9 +5,10 @@ from typing import TYPE_CHECKING, Literal import pytest -from anndata.tests.helpers import as_dense_dask_array, as_sparse_dask_array, asarray +from anndata.tests.helpers import asarray from scipy import sparse +from .._helpers import as_dense_dask_array, as_sparse_dask_array from .._pytest.marks import needs if TYPE_CHECKING: @@ -35,10 +36,18 @@ def param_with( pytest.param(sparse.csc_matrix, id="scipy_csc"), ), ("dask", "dense"): ( - pytest.param(as_dense_dask_array, marks=[needs.dask], id="dask_array_dense"), + pytest.param( + as_dense_dask_array, + marks=[needs.dask, pytest.mark.anndata_dask_support], + id="dask_array_dense", + ), ), ("dask", "sparse"): ( - pytest.param(as_sparse_dask_array, marks=[needs.dask], id="dask_array_sparse"), + pytest.param( + as_sparse_dask_array, + marks=[needs.dask, pytest.mark.anndata_dask_support], + id="dask_array_sparse", + ), # probably not necessary to also do csc ), } diff --git a/scanpy/tests/test_get.py b/scanpy/tests/test_get.py index bbdea8ce3d..b55064088a 100644 --- a/scanpy/tests/test_get.py +++ b/scanpy/tests/test_get.py @@ -11,6 +11,7 @@ import scanpy as sc from scanpy.datasets._utils import filter_oldformatwarning +from scanpy.testing._helpers import anndata_v0_8_constructor_compat from scanpy.testing._helpers.data import pbmc68k_reduced @@ -38,7 +39,7 @@ def adata(): adata.X is np.ones((2, 2)) adata.layers['double'] is sparse np.ones((2,2)) * 2 to also test sparse matrices """ - return AnnData( + return anndata_v0_8_constructor_compat( X=np.ones((2, 2), dtype=int), obs=pd.DataFrame( {"obs1": [0, 1], "obs2": ["a", "b"]}, index=["cell1", "cell2"] @@ -60,7 +61,7 @@ def test_obs_df(adata): adata.obsm["sparse"] = sparse.csr_matrix(np.eye(2), dtype="float64") # make raw with different genes than adata - adata.raw = AnnData( + adata.raw = anndata_v0_8_constructor_compat( X=np.array([[1, 2, 3], [2, 4, 6]], dtype=np.float64), var=pd.DataFrame( {"gene_symbols": ["raw1", "raw2", "raw3"]}, diff --git a/scanpy/tests/test_metrics.py b/scanpy/tests/test_metrics.py index 8d0acf3c33..226aecd7f6 100644 --- a/scanpy/tests/test_metrics.py +++ b/scanpy/tests/test_metrics.py @@ -5,10 +5,12 @@ from operator import eq from string import ascii_letters +import numba import numpy as np import pandas as pd import pytest import threadpoolctl +from packaging.version import Version from scipy import sparse import scanpy as sc @@ -77,7 +79,10 @@ def test_consistency(metric, threading): all_genes = metric(pbmc, layer="raw") first_gene = metric(pbmc, vals=pbmc.obs_vector(pbmc.var_names[0], layer="raw")) - np.testing.assert_allclose(all_genes[0], first_gene, rtol=1e-9) + if Version(numba.__version__) < Version("0.57"): + np.testing.assert_allclose(all_genes[0], first_gene, rtol=1e-5) + else: + np.testing.assert_allclose(all_genes[0], first_gene, rtol=1e-9) # Test that results are similar for sparse and dense reps of same data equality_check( diff --git a/scanpy/tests/test_neighbors.py b/scanpy/tests/test_neighbors.py index dbefe5a006..d623682ff3 100644 --- a/scanpy/tests/test_neighbors.py +++ b/scanpy/tests/test_neighbors.py @@ -11,6 +11,7 @@ import scanpy as sc from scanpy import Neighbors +from scanpy.testing._helpers import anndata_v0_8_constructor_compat if TYPE_CHECKING: from pytest_mock import MockerFixture @@ -113,7 +114,7 @@ def get_neighbors() -> Neighbors: - return Neighbors(AnnData(np.array(X))) + return Neighbors(anndata_v0_8_constructor_compat(np.array(X))) @pytest.fixture diff --git a/scanpy/tests/test_pca.py b/scanpy/tests/test_pca.py index 6e529b4320..c9b6d913c2 100644 --- a/scanpy/tests/test_pca.py +++ b/scanpy/tests/test_pca.py @@ -3,19 +3,20 @@ import warnings from typing import Literal +import anndata as ad import numpy as np import pytest from anndata import AnnData from anndata.tests.helpers import ( - as_dense_dask_array, - as_sparse_dask_array, asarray, assert_equal, ) +from packaging.version import Version from scipy import sparse from sklearn.utils import issparse import scanpy as sc +from scanpy.testing._helpers import as_dense_dask_array, as_sparse_dask_array from scanpy.testing._helpers.data import pbmc3k_normalized from scanpy.testing._pytest.marks import needs from scanpy.testing._pytest.params import ARRAY_TYPES, ARRAY_TYPES_SUPPORTED, param_with @@ -337,12 +338,20 @@ def test_mask_argument_equivalence(float_dtype, array_type): ) -def test_mask(array_type): +def test_mask(array_type, request): if array_type is as_dense_dask_array: pytest.xfail("TODO: Dask arrays are not supported") adata = sc.datasets.blobs(n_variables=10, n_centers=3, n_observations=100) adata.X = array_type(adata.X) + if isinstance(adata.X, np.ndarray) and Version(ad.__version__) < Version("0.9"): + request.node.add_marker( + pytest.mark.xfail( + reason="TODO: Previous version of anndata would return an F ordered array for one" + " case here, which suprisingly considerably changes the results of PCA. " + ) + ) + mask = np.random.choice([True, False], adata.shape[1]) adata_masked = adata[:, mask].copy() @@ -359,6 +368,24 @@ def test_mask(array_type): ) +def test_mask_order_warning(request): + if Version(ad.__version__) >= Version("0.9"): + request.node.add_marker( + pytest.mark.xfail( + reason="Not expected to warn in later versions of anndata" + ) + ) + + adata = ad.AnnData(X=np.random.randn(50, 5)) + mask = np.array([True, False, True, False, True]) + + with pytest.warns( + UserWarning, + match="When using a mask parameter with anndata<0.9 on a dense array", + ): + sc.pp.pca(adata, mask=mask) + + def test_mask_defaults(array_type, float_dtype): """ Test if pca result is equal without highly variable and with-but mask is None diff --git a/scanpy/tests/test_preprocessing.py b/scanpy/tests/test_preprocessing.py index 3029068776..5ae3b3e08f 100644 --- a/scanpy/tests/test_preprocessing.py +++ b/scanpy/tests/test_preprocessing.py @@ -11,7 +11,11 @@ from scipy import sparse as sp import scanpy as sc -from scanpy.testing._helpers import check_rep_mutation, check_rep_results +from scanpy.testing._helpers import ( + anndata_v0_8_constructor_compat, + check_rep_mutation, + check_rep_results, +) from scanpy.testing._helpers.data import pbmc3k, pbmc68k_reduced from scanpy.testing._pytest.params import ARRAY_TYPES_SUPPORTED @@ -187,11 +191,11 @@ def test_scale_array(count_matrix_format, zero_center): Test that running sc.pp.scale on an anndata object and an array returns the same results. """ X = count_matrix_format(sp.random(100, 200, density=0.3).toarray()) - adata = sc.AnnData(X=X.copy().astype(np.float64)) + adata = anndata_v0_8_constructor_compat(X=X.copy()) sc.pp.scale(adata, zero_center=zero_center) scaled_X = sc.pp.scale(X, zero_center=zero_center, copy=True) - assert np.array_equal(asarray(scaled_X), asarray(adata.X)) + np.testing.assert_equal(asarray(scaled_X), asarray(adata.X)) def test_recipe_plotting(): @@ -314,7 +318,7 @@ def test_downsample_counts_per_cell(count_matrix_format, replace, dtype): TARGET = 1000 X = np.random.randint(0, 100, (1000, 100)) * np.random.binomial(1, 0.3, (1000, 100)) X = X.astype(dtype) - adata = AnnData(X=count_matrix_format(X).astype(dtype)) + adata = anndata_v0_8_constructor_compat(X=count_matrix_format(X).astype(dtype)) with pytest.raises(ValueError): sc.pp.downsample_counts( adata, counts_per_cell=TARGET, total_counts=TARGET, replace=replace @@ -346,7 +350,7 @@ def test_downsample_counts_per_cell_multiple_targets( TARGETS = np.random.randint(500, 1500, 1000) X = np.random.randint(0, 100, (1000, 100)) * np.random.binomial(1, 0.3, (1000, 100)) X = X.astype(dtype) - adata = AnnData(X=count_matrix_format(X).astype(dtype)) + adata = anndata_v0_8_constructor_compat(X=count_matrix_format(X).astype(dtype)) initial_totals = np.ravel(adata.X.sum(axis=1)) with pytest.raises(ValueError): sc.pp.downsample_counts(adata, counts_per_cell=[40, 10], replace=replace) @@ -372,7 +376,7 @@ def test_downsample_counts_per_cell_multiple_targets( def test_downsample_total_counts(count_matrix_format, replace, dtype): X = np.random.randint(0, 100, (1000, 100)) * np.random.binomial(1, 0.3, (1000, 100)) X = X.astype(dtype) - adata_orig = AnnData(X=count_matrix_format(X)) + adata_orig = anndata_v0_8_constructor_compat(X=count_matrix_format(X)) total = X.sum() target = np.floor_divide(total, 10) initial_totals = np.ravel(adata_orig.X.sum(axis=1)) diff --git a/scanpy/tests/test_preprocessing_distributed.py b/scanpy/tests/test_preprocessing_distributed.py index 6dfa78459d..5f7a7bf443 100644 --- a/scanpy/tests/test_preprocessing_distributed.py +++ b/scanpy/tests/test_preprocessing_distributed.py @@ -4,9 +4,10 @@ import numpy.testing as npt import pytest -from anndata import AnnData, OldFormatWarning, read_zarr +from anndata import AnnData, read_zarr from scanpy._compat import DaskArray, ZappyArray +from scanpy.datasets._utils import filter_oldformatwarning from scanpy.preprocessing import ( filter_cells, filter_genes, @@ -27,24 +28,24 @@ @pytest.fixture() +@filter_oldformatwarning def adata() -> AnnData: - with pytest.warns(OldFormatWarning): - a = read_zarr(input_file) # regular anndata + a = read_zarr(input_file) a.var_names_make_unique() a.X = a.X[:] # convert to numpy array return a +@filter_oldformatwarning @pytest.fixture( params=[ pytest.param("direct", marks=[needs.zappy]), - pytest.param("dask", marks=[needs.dask]), + pytest.param("dask", marks=[needs.dask, pytest.mark.anndata_dask_support]), ] ) def adata_dist(request: pytest.FixtureRequest) -> AnnData: # regular anndata except for X, which we replace on the next line - with pytest.warns(OldFormatWarning): - a = read_zarr(input_file) + a = read_zarr(input_file) a.var_names_make_unique() a.uns["dist-mode"] = request.param input_file_X = f"{input_file}/X" @@ -133,6 +134,7 @@ def test_filter_genes(adata: AnnData, adata_dist: AnnData): npt.assert_allclose(result, adata.X) +@filter_oldformatwarning def test_write_zarr(adata: AnnData, adata_dist: AnnData): import zarr @@ -153,7 +155,7 @@ def test_write_zarr(adata: AnnData, adata_dist: AnnData): assert False, "add branch for new dist-mode" # read back as zarr directly and check it is the same as adata.X - with pytest.warns(OldFormatWarning, match="without encoding metadata"): - adata_log1p = read_zarr(temp_store) + adata_log1p = read_zarr(temp_store) + log1p(adata) npt.assert_allclose(adata_log1p.X, adata.X) diff --git a/scanpy/tools/_dendrogram.py b/scanpy/tools/_dendrogram.py index 31fe6564fc..68902a6632 100644 --- a/scanpy/tools/_dendrogram.py +++ b/scanpy/tools/_dendrogram.py @@ -111,7 +111,7 @@ def dendrogram( >>> import scanpy as sc >>> adata = sc.datasets.pbmc68k_reduced() >>> sc.tl.dendrogram(adata, groupby='bulk_labels') - >>> sc.pl.dendrogram(adata, groupby='bulk_labels') + >>> sc.pl.dendrogram(adata, groupby='bulk_labels') # doctest: +SKIP >>> markers = ['C1QA', 'PSAP', 'CD79A', 'CD79B', 'CST3', 'LYZ'] >>> sc.pl.dotplot(adata, markers, groupby='bulk_labels', dendrogram=True) @@ -155,7 +155,11 @@ def dendrogram( ) # aggregate values within categories using 'mean' - mean_df = rep_df.groupby(level=0, observed=True).mean() + mean_df = ( + rep_df.groupby(level=0, observed=True) + .mean() + .loc[categories] # Fixed ordering for pandas < 2 + ) import scipy.cluster.hierarchy as sch from scipy.spatial import distance From d7607e58f9540a8ae502ecae42db80598771f962 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Fri, 16 Feb 2024 15:56:49 +0100 Subject: [PATCH 15/54] Rename mask parameters (#2857) --- scanpy/_utils/__init__.py | 14 ++-- scanpy/experimental/pp/_normalization.py | 20 +++--- scanpy/get/get.py | 2 +- scanpy/plotting/_tools/scatterplots.py | 16 ++--- scanpy/plotting/_utils.py | 26 ++++--- scanpy/preprocessing/_docs.py | 4 +- scanpy/preprocessing/_pca.py | 44 ++++++------ scanpy/preprocessing/_simple.py | 40 ++++++----- scanpy/tests/test_normalization.py | 2 +- scanpy/tests/test_pca.py | 31 ++++---- scanpy/tests/test_plotting.py | 18 ++--- scanpy/tests/test_rank_genes_groups.py | 14 ++-- scanpy/tests/test_scaling.py | 20 +++--- scanpy/tools/_rank_genes_groups.py | 92 +++++++++++++----------- 14 files changed, 185 insertions(+), 158 deletions(-) diff --git a/scanpy/_utils/__init__.py b/scanpy/_utils/__init__.py index 9af75fc7b5..6d21a11fd5 100644 --- a/scanpy/_utils/__init__.py +++ b/scanpy/_utils/__init__.py @@ -574,18 +574,18 @@ def select_groups( """Get subset of groups in adata.obs[key].""" groups_order = adata.obs[key].cat.categories if key + "_masks" in adata.uns: - groups_masks = adata.uns[key + "_masks"] + groups_masks_obs = adata.uns[key + "_masks"] else: - groups_masks = np.zeros( + groups_masks_obs = np.zeros( (len(adata.obs[key].cat.categories), adata.obs[key].values.size), dtype=bool ) for iname, name in enumerate(adata.obs[key].cat.categories): # if the name is not found, fallback to index retrieval if adata.obs[key].cat.categories[iname] in adata.obs[key].values: - mask = adata.obs[key].cat.categories[iname] == adata.obs[key].values + mask_obs = adata.obs[key].cat.categories[iname] == adata.obs[key].values else: - mask = str(iname) == adata.obs[key].values - groups_masks[iname] = mask + mask_obs = str(iname) == adata.obs[key].values + groups_masks_obs[iname] = mask_obs groups_ids = list(range(len(groups_order))) if groups_order_subset != "all": groups_ids = [] @@ -609,11 +609,11 @@ def select_groups( from sys import exit exit(0) - groups_masks = groups_masks[groups_ids] + groups_masks_obs = groups_masks_obs[groups_ids] groups_order_subset = adata.obs[key].cat.categories[groups_ids].values else: groups_order_subset = groups_order.values - return groups_order_subset, groups_masks + return groups_order_subset, groups_masks_obs def warn_with_traceback(message, category, filename, lineno, file=None, line=None): # noqa: PLR0917 diff --git a/scanpy/experimental/pp/_normalization.py b/scanpy/experimental/pp/_normalization.py index 614ef3b704..6835a76ad2 100644 --- a/scanpy/experimental/pp/_normalization.py +++ b/scanpy/experimental/pp/_normalization.py @@ -26,8 +26,8 @@ doc_pca_chunk, ) from ...get import _get_obs_rep, _set_obs_rep -from ...preprocessing._docs import doc_mask_hvg -from ...preprocessing._pca import _handle_mask_param, pca +from ...preprocessing._docs import doc_mask_var_hvg +from ...preprocessing._pca import _handle_mask_var, pca if TYPE_CHECKING: from collections.abc import Mapping @@ -157,7 +157,7 @@ def normalize_pearson_residuals( adata=doc_adata, dist_params=doc_dist_params, pca_chunk=doc_pca_chunk, - mask_hvg=doc_mask_hvg, + mask_var_hvg=doc_mask_var_hvg, check_values=doc_check_values, inplace=doc_inplace, ) @@ -169,7 +169,7 @@ def normalize_pearson_residuals_pca( n_comps: int | None = 50, random_state: float = 0, kwargs_pca: Mapping[str, Any] = MappingProxyType({}), - mask: np.ndarray | str | None | Empty = _empty, + mask_var: np.ndarray | str | None | Empty = _empty, use_highly_variable: bool | None = None, check_values: bool = True, inplace: bool = True, @@ -189,7 +189,7 @@ def normalize_pearson_residuals_pca( {adata} {dist_params} {pca_chunk} - {mask_hvg} + {mask_var_hvg} {check_values} {inplace} @@ -219,11 +219,11 @@ def normalize_pearson_residuals_pca( """ # Unify new mask argument and deprecated use_highly_varible argument - _, mask = _handle_mask_param(adata, mask, use_highly_variable) + _, mask_var = _handle_mask_var(adata, mask_var, use_highly_variable) del use_highly_variable - if mask is not None: - adata_sub = adata[:, mask].copy() + if mask_var is not None: + adata_sub = adata[:, mask_var].copy() adata_pca = AnnData( adata_sub.X.copy(), obs=adata_sub.obs[[]], var=adata_sub.var[[]] ) @@ -239,9 +239,9 @@ def normalize_pearson_residuals_pca( if inplace: norm_settings = adata_pca.uns["pearson_residuals_normalization"] norm_dict = dict(**norm_settings, pearson_residuals_df=adata_pca.to_df()) - if mask is not None: + if mask_var is not None: adata.varm["PCs"] = np.zeros(shape=(adata.n_vars, n_comps)) - adata.varm["PCs"][mask] = adata_pca.varm["PCs"] + adata.varm["PCs"][mask_var] = adata_pca.varm["PCs"] else: adata.varm["PCs"] = adata_pca.varm["PCs"] adata.uns["pca"] = adata_pca.uns["pca"] diff --git a/scanpy/get/get.py b/scanpy/get/get.py index 8ef58f4b51..a9ca372dc0 100644 --- a/scanpy/get/get.py +++ b/scanpy/get/get.py @@ -482,7 +482,7 @@ def _set_obs_rep( def _check_mask( data: AnnData | np.ndarray, - mask: str | NDArray[np.bool_], + mask: NDArray[np.bool_] | str, dim: Literal["obs", "var"], ) -> NDArray[np.bool_]: # Could also be a series, but should be one or the other """ diff --git a/scanpy/plotting/_tools/scatterplots.py b/scanpy/plotting/_tools/scatterplots.py index 59c828d517..e72bc78c16 100644 --- a/scanpy/plotting/_tools/scatterplots.py +++ b/scanpy/plotting/_tools/scatterplots.py @@ -60,7 +60,7 @@ def embedding( basis: str, *, color: str | Sequence[str] | None = None, - mask: NDArray[np.bool_] | str | None = None, + mask_obs: NDArray[np.bool_] | str | None = None, gene_symbols: str | None = None, use_raw: bool | None = None, sort_order: bool = True, @@ -136,10 +136,10 @@ def embedding( args_3d = dict(projection="3d") if projection == "3d" else {} # Checking the mask format and if used together with groups - if groups is not None and mask is not None: + if groups is not None and mask_obs is not None: raise ValueError("Groups and mask arguments are incompatible.") - if mask is not None: - mask = _check_mask(adata, mask, "obs") + if mask_obs is not None: + mask_obs = _check_mask(adata, mask_obs, "obs") # Figure out if we're using raw if use_raw is None: @@ -267,7 +267,7 @@ def embedding( adata, value_to_plot, layer=layer, - mask=mask, + mask_obs=mask_obs, use_raw=use_raw, gene_symbols=gene_symbols, groups=groups, @@ -1162,7 +1162,7 @@ def _get_color_source_vector( adata: AnnData, value_to_plot: str, *, - mask: NDArray[np.bool_] | None = None, + mask_obs: NDArray[np.bool_] | None = None, use_raw: bool = False, gene_symbols: str | None = None, layer: str | None = None, @@ -1189,8 +1189,8 @@ def _get_color_source_vector( values = adata.raw.obs_vector(value_to_plot) else: values = adata.obs_vector(value_to_plot, layer=layer) - if mask is not None: - values[~mask] = np.nan + if mask_obs is not None: + values[~mask_obs] = np.nan if groups and isinstance(values, pd.Categorical): values = values.remove_categories(values.categories.difference(groups)) return values diff --git a/scanpy/plotting/_utils.py b/scanpy/plotting/_utils.py index 70ce5fb26e..fa3ea611c6 100644 --- a/scanpy/plotting/_utils.py +++ b/scanpy/plotting/_utils.py @@ -26,6 +26,7 @@ if TYPE_CHECKING: from anndata import AnnData + from matplotlib.typing import MarkerType from numpy.typing import ArrayLike from PIL.Image import Image @@ -585,20 +586,29 @@ def plot_arrows(axs, adata, basis, arrows_kwds=None): def scatter_group( - ax, key, imask, adata, Y, *, projection="2d", size=3, alpha=None, marker="." + ax: Axes, + key: str, + cat_code: int, + adata: AnnData, + Y: np.ndarray, + *, + projection: Literal["2d", "3d"] = "2d", + size: int = 3, + alpha: float | None = None, + marker: MarkerType = ".", ): """Scatter of group using representation of data Y.""" - mask = adata.obs[key].cat.categories[imask] == adata.obs[key].values - color = adata.uns[key + "_colors"][imask] + mask_obs = adata.obs[key].cat.categories[cat_code] == adata.obs[key].values + color = adata.uns[key + "_colors"][cat_code] if not isinstance(color[0], str): from matplotlib.colors import rgb2hex - color = rgb2hex(adata.uns[key + "_colors"][imask]) + color = rgb2hex(adata.uns[key + "_colors"][cat_code]) if not is_color_like(color): raise ValueError(f'"{color}" is not a valid matplotlib color.') - data = [Y[mask, 0], Y[mask, 1]] + data = [Y[mask_obs, 0], Y[mask_obs, 1]] if projection == "3d": - data.append(Y[mask, 2]) + data.append(Y[mask_obs, 2]) ax.scatter( *data, marker=marker, @@ -606,10 +616,10 @@ def scatter_group( c=color, edgecolors="none", s=size, - label=adata.obs[key].cat.categories[imask], + label=adata.obs[key].cat.categories[cat_code], rasterized=settings._vector_friendly, ) - return mask + return mask_obs def setup_axes( diff --git a/scanpy/preprocessing/_docs.py b/scanpy/preprocessing/_docs.py index ef81025768..b46a5d48ff 100644 --- a/scanpy/preprocessing/_docs.py +++ b/scanpy/preprocessing/_docs.py @@ -15,8 +15,8 @@ If True, use `adata.raw.X` for expression values instead of `adata.X`.\ """ -doc_mask_hvg = """\ -mask +doc_mask_var_hvg = """\ +mask_var To run only on a certain set of genes given by a boolean array or a string referring to an array in :attr:`~anndata.AnnData.var`. By default, uses `.var['highly_variable']` if available, else everything. diff --git a/scanpy/preprocessing/_pca.py b/scanpy/preprocessing/_pca.py index df88b57b19..ae1ecdedb2 100644 --- a/scanpy/preprocessing/_pca.py +++ b/scanpy/preprocessing/_pca.py @@ -1,6 +1,7 @@ from __future__ import annotations import warnings +from typing import TYPE_CHECKING from warnings import warn import anndata as ad @@ -17,12 +18,15 @@ from .._settings import settings from .._utils import AnyRandom, Empty, _doc_params, _empty from ..get import _check_mask, _get_obs_rep -from ._docs import doc_mask_hvg +from ._docs import doc_mask_var_hvg from ._utils import _get_mean_var +if TYPE_CHECKING: + from numpy.typing import NDArray + @_doc_params( - mask_hvg=doc_mask_hvg, + mask_var_hvg=doc_mask_var_hvg, ) def pca( data: AnnData | np.ndarray | spmatrix, @@ -33,7 +37,7 @@ def pca( svd_solver: str | None = None, random_state: AnyRandom = 0, return_info: bool = False, - mask: np.ndarray | str | None | Empty = _empty, + mask_var: NDArray[np.bool_] | str | None | Empty = _empty, use_highly_variable: bool | None = None, dtype: str = "float32", copy: bool = False, @@ -114,7 +118,7 @@ def pca( return_info Only relevant when not passing an :class:`~anndata.AnnData`: see “Returns”. - {mask_hvg} + {mask_var_hvg} layer Layer of `adata` to use as expression values. dtype @@ -174,9 +178,9 @@ def pca( adata = AnnData(data) # Unify new mask argument and deprecated use_highly_varible argument - mask_param, mask = _handle_mask_param(adata, mask, use_highly_variable) + mask_var_param, mask_var = _handle_mask_var(adata, mask_var, use_highly_variable) del use_highly_variable - adata_comp = adata[:, mask] if mask is not None else adata + adata_comp = adata[:, mask_var] if mask_var is not None else adata if n_comps is None: min_dim = min(adata_comp.n_vars, adata_comp.n_obs) @@ -192,7 +196,7 @@ def pca( # See: https://github.com/scverse/scanpy/pull/2816#issuecomment-1932650529 if ( version.parse(ad.__version__) < version.parse("0.9") - and mask is not None + and mask_var is not None and isinstance(X, np.ndarray) ): warnings.warn( @@ -309,17 +313,17 @@ def pca( if data_is_AnnData: adata.obsm["X_pca"] = X_pca - if mask is not None: + if mask_var is not None: adata.varm["PCs"] = np.zeros(shape=(adata.n_vars, n_comps)) - adata.varm["PCs"][mask] = pca_.components_.T + adata.varm["PCs"][mask_var] = pca_.components_.T else: adata.varm["PCs"] = pca_.components_.T uns_entry = { "params": { "zero_center": zero_center, - "use_highly_variable": mask_param == "highly_variable", - "mask": mask_param, + "use_highly_variable": mask_var_param == "highly_variable", + "mask_var": mask_var_param, }, "variance": pca_.explained_variance_, "variance_ratio": pca_.explained_variance_ratio_, @@ -350,9 +354,9 @@ def pca( return X_pca -def _handle_mask_param( +def _handle_mask_var( adata: AnnData, - mask: np.ndarray | str | Empty | None, + mask_var: NDArray[np.bool_] | str | Empty | None, use_highly_variable: bool | None, ) -> tuple[np.ndarray | str | None, np.ndarray | None]: """\ @@ -363,27 +367,27 @@ def _handle_mask_param( # First, verify and possibly warn if use_highly_variable is not None: hint = ( - 'Use_highly_variable=True can be called through mask="highly_variable". ' - "Use_highly_variable=False can be called through mask=None" + 'Use_highly_variable=True can be called through mask_var="highly_variable". ' + "Use_highly_variable=False can be called through mask_var=None" ) msg = f"Argument `use_highly_variable` is deprecated, consider using the mask argument. {hint}" warn(msg, FutureWarning) - if mask is not _empty: + if mask_var is not _empty: msg = f"These arguments are incompatible. {hint}" raise ValueError(msg) # Handle default case and explicit use_highly_variable=True if use_highly_variable or ( use_highly_variable is None - and mask is _empty + and mask_var is _empty and "highly_variable" in adata.var.keys() ): - mask = "highly_variable" + mask_var = "highly_variable" # Without highly variable genes, we don’t use a mask by default - if mask is _empty or mask is None: + if mask_var is _empty or mask_var is None: return None, None - return mask, _check_mask(adata, mask, "var") + return mask_var, _check_mask(adata, mask_var, "var") def _pca_with_sparse(X, npcs, solver="arpack", mu=None, random_state=None): diff --git a/scanpy/preprocessing/_simple.py b/scanpy/preprocessing/_simple.py index ad42105bc7..7fba1a71f8 100644 --- a/scanpy/preprocessing/_simple.py +++ b/scanpy/preprocessing/_simple.py @@ -746,7 +746,7 @@ def _regress_out_chunk(data): @renamed_arg("X", "data", pos_0=True) -@old_positionals("zero_center", "max_value", "copy", "layer", "obsm", "mask") +@old_positionals("zero_center", "max_value", "copy", "layer", "obsm") @singledispatch def scale( data: AnnData | spmatrix | np.ndarray, @@ -756,7 +756,7 @@ def scale( copy: bool = False, layer: str | None = None, obsm: str | None = None, - mask: NDArray[np.bool_] | str | None = None, + mask_obs: NDArray[np.bool_] | str | None = None, ) -> AnnData | spmatrix | np.ndarray | None: """\ Scale data to unit variance and zero mean. @@ -783,6 +783,10 @@ def scale( If provided, which element of layers to scale. obsm If provided, which element of obsm to scale. + mask_obs + Restrict both the derivation of scaling parameters and the scaling itself + to a certain set of observations. The mask is specified as a boolean array + or a string referring to an array in :attr:`~anndata.AnnData.obs`. Returns ------- @@ -807,7 +811,7 @@ def scale( f"`obsm` argument inappropriate for value of type {type(data)}" ) return scale_array( - data, zero_center=zero_center, max_value=max_value, copy=copy, mask=mask + data, zero_center=zero_center, max_value=max_value, copy=copy, mask_obs=mask_obs ) @@ -819,25 +823,25 @@ def scale_array( max_value: float | None = None, copy: bool = False, return_mean_std: bool = False, - mask: NDArray[np.bool_] | None = None, + mask_obs: NDArray[np.bool_] | None = None, ) -> np.ndarray | tuple[np.ndarray, NDArray[np.float64], NDArray[np.float64]]: if copy: X = X.copy() - if mask is not None: - mask = _check_mask(X, mask, "obs") + if mask_obs is not None: + mask_obs = _check_mask(X, mask_obs, "obs") scale_rv = scale_array( - X[mask, :], + X[mask_obs, :], zero_center=zero_center, max_value=max_value, copy=False, return_mean_std=return_mean_std, - mask=None, + mask_obs=None, ) if return_mean_std: - X[mask, :], mean, std = scale_rv + X[mask_obs, :], mean, std = scale_rv return X, mean, std else: - X[mask, :] = scale_rv + X[mask_obs, :] = scale_rv return X if not zero_center and max_value is not None: @@ -882,7 +886,7 @@ def scale_sparse( max_value: float | None = None, copy: bool = False, return_mean_std: bool = False, - mask: NDArray[np.bool_] | None = None, + mask_obs: NDArray[np.bool_] | None = None, ) -> np.ndarray | tuple[np.ndarray, NDArray[np.float64], NDArray[np.float64]]: # need to add the following here to make inplace logic work if zero_center: @@ -898,7 +902,7 @@ def scale_sparse( copy=copy, max_value=max_value, return_mean_std=return_mean_std, - mask=mask, + mask_obs=mask_obs, ) @@ -911,16 +915,16 @@ def scale_anndata( copy: bool = False, layer: str | None = None, obsm: str | None = None, - mask: NDArray[np.bool_] | str | None = None, + mask_obs: NDArray[np.bool_] | str | None = None, ) -> AnnData | None: adata = adata.copy() if copy else adata str_mean_std = ("mean", "std") - if mask is not None: - if isinstance(mask, str): - str_mean_std = (f"mean of {mask}", f"std of {mask}") + if mask_obs is not None: + if isinstance(mask_obs, str): + str_mean_std = (f"mean of {mask_obs}", f"std of {mask_obs}") else: str_mean_std = ("mean with mask", "std with mask") - mask = _check_mask(adata, mask, "obs") + mask_obs = _check_mask(adata, mask_obs, "obs") view_to_actual(adata) X = _get_obs_rep(adata, layer=layer, obsm=obsm) X, adata.var[str_mean_std[0]], adata.var[str_mean_std[1]] = scale( @@ -929,7 +933,7 @@ def scale_anndata( max_value=max_value, copy=False, # because a copy has already been made, if it were to be made return_mean_std=True, - mask=mask, + mask_obs=mask_obs, ) _set_obs_rep(adata, X, layer=layer, obsm=obsm) return adata if copy else None diff --git a/scanpy/tests/test_normalization.py b/scanpy/tests/test_normalization.py index f1fa910b1e..ea7556db74 100644 --- a/scanpy/tests/test_normalization.py +++ b/scanpy/tests/test_normalization.py @@ -189,7 +189,7 @@ def _check_pearson_pca_fields(ad, n_cells, n_comps): pytest.param( True, dict(use_highly_variable=False), "n_genes", id="hvg_opt_out" ), - pytest.param(False, dict(mask="test_mask"), "n_unmasked", id="mask"), + pytest.param(False, dict(mask_var="test_mask"), "n_unmasked", id="mask"), ], ) def test_normalize_pearson_residuals_pca( diff --git a/scanpy/tests/test_pca.py b/scanpy/tests/test_pca.py index c9b6d913c2..a18a313063 100644 --- a/scanpy/tests/test_pca.py +++ b/scanpy/tests/test_pca.py @@ -312,25 +312,25 @@ def test_mask_highly_var_error(array_type): def test_mask_length_error(): """Check error for n_obs / mask length mismatch.""" adata = AnnData(A_list) - mask = np.random.choice([True, False], adata.shape[1] + 1) + mask_var = np.random.choice([True, False], adata.shape[1] + 1) with pytest.raises( ValueError, match=r"The shape of the mask do not match the data\." ): - sc.pp.pca(adata, mask=mask, copy=True) + sc.pp.pca(adata, mask_var=mask_var, copy=True) -def test_mask_argument_equivalence(float_dtype, array_type): +def test_mask_var_argument_equivalence(float_dtype, array_type): """Test if pca result is equal when given mask as boolarray vs string""" adata_base = AnnData(array_type(np.random.random((100, 10))).astype(float_dtype)) - mask = np.random.choice([True, False], adata_base.shape[1]) + mask_var = np.random.choice([True, False], adata_base.shape[1]) adata = adata_base.copy() - sc.pp.pca(adata, mask=mask, dtype=float_dtype) + sc.pp.pca(adata, mask_var=mask_var, dtype=float_dtype) adata_w_mask = adata_base.copy() - adata_w_mask.var["mask"] = mask - sc.pp.pca(adata_w_mask, mask="mask", dtype=float_dtype) + adata_w_mask.var["mask"] = mask_var + sc.pp.pca(adata_w_mask, mask_var="mask", dtype=float_dtype) assert np.allclose( adata.X.toarray() if issparse(adata.X) else adata.X, @@ -351,20 +351,19 @@ def test_mask(array_type, request): " case here, which suprisingly considerably changes the results of PCA. " ) ) + mask_var = np.random.choice([True, False], adata.shape[1]) - mask = np.random.choice([True, False], adata.shape[1]) - - adata_masked = adata[:, mask].copy() - sc.pp.pca(adata, mask=mask) + adata_masked = adata[:, mask_var].copy() + sc.pp.pca(adata, mask_var=mask_var) sc.pp.pca(adata_masked) - masked_var_loadings = adata.varm["PCs"][~mask] + masked_var_loadings = adata.varm["PCs"][~mask_var] np.testing.assert_equal(masked_var_loadings, np.zeros_like(masked_var_loadings)) np.testing.assert_equal(adata.obsm["X_pca"], adata_masked.obsm["X_pca"]) # There are slight difference based on whether the matrix was column or row major np.testing.assert_allclose( - adata.varm["PCs"][mask], adata_masked.varm["PCs"], rtol=1e-11 + adata.varm["PCs"][mask_var], adata_masked.varm["PCs"], rtol=1e-11 ) @@ -401,10 +400,10 @@ def test_mask_defaults(array_type, float_dtype): mask[1] = True adata.var["highly_variable"] = mask with_var = sc.pp.pca(adata, copy=True, dtype=float_dtype) - assert without_var.uns["pca"]["params"]["mask"] is None - assert with_var.uns["pca"]["params"]["mask"] == "highly_variable" + assert without_var.uns["pca"]["params"]["mask_var"] is None + assert with_var.uns["pca"]["params"]["mask_var"] == "highly_variable" assert not np.array_equal(without_var.obsm["X_pca"], with_var.obsm["X_pca"]) - with_no_mask = sc.pp.pca(adata, mask=None, copy=True, dtype=float_dtype) + with_no_mask = sc.pp.pca(adata, mask_var=None, copy=True, dtype=float_dtype) assert np.array_equal(without_var.obsm["X_pca"], with_no_mask.obsm["X_pca"]) diff --git a/scanpy/tests/test_plotting.py b/scanpy/tests/test_plotting.py index 898a9ac2a0..0a03fdd8ba 100644 --- a/scanpy/tests/test_plotting.py +++ b/scanpy/tests/test_plotting.py @@ -1108,7 +1108,7 @@ def pbmc_scatterplots(_pbmc_scatterplots_session): partial( sc.pl.pca, color=["LYZ", "CD79A", "louvain"], - mask="mask", + mask_obs="mask", ), ), ], @@ -1647,14 +1647,14 @@ def test_scrublet_plots(monkeypatch, image_comparer, id, params): def test_umap_mask_equal(tmp_path, check_same_image): """Check that all desired cells are coloured and masked cells gray""" pbmc = pbmc3k_processed() - mask = pbmc.obs["louvain"].isin(["B cells", "NK cells"]) + mask_obs = pbmc.obs["louvain"].isin(["B cells", "NK cells"]) ax = sc.pl.umap(pbmc, size=8.0, show=False) - sc.pl.umap(pbmc[mask], size=8.0, color="LDHB", ax=ax) + sc.pl.umap(pbmc[mask_obs], size=8.0, color="LDHB", ax=ax) plt.savefig(p1 := tmp_path / "umap_mask_fig1.png") plt.close() - sc.pl.umap(pbmc, size=8.0, color="LDHB", mask=mask) + sc.pl.umap(pbmc, size=8.0, color="LDHB", mask_obs=mask_obs) plt.savefig(p2 := tmp_path / "umap_mask_fig2.png") plt.close() @@ -1665,8 +1665,8 @@ def test_umap_mask_mult_plots(): """Check that multiple images are plotted when color is a list.""" pbmc = pbmc3k_processed() color = ["LDHB", "LYZ", "CD79A"] - mask = pbmc.obs["louvain"].isin(["B cells", "NK cells"]) - axes = sc.pl.umap(pbmc, color=color, mask=mask, show=False) + mask_obs = pbmc.obs["louvain"].isin(["B cells", "NK cells"]) + axes = sc.pl.umap(pbmc, color=color, mask_obs=mask_obs, show=False) assert isinstance(axes, list) assert len(axes) == len(color) @@ -1674,13 +1674,13 @@ def test_umap_mask_mult_plots(): def test_string_mask(tmp_path, check_same_image): """Check that the same mask given as string or bool array provides the same result""" pbmc = pbmc3k_processed() - pbmc.obs["mask"] = mask = pbmc.obs["louvain"].isin(["B cells", "NK cells"]) + pbmc.obs["mask"] = mask_obs = pbmc.obs["louvain"].isin(["B cells", "NK cells"]) - sc.pl.umap(pbmc, mask=mask, color="LDHB") + sc.pl.umap(pbmc, mask_obs=mask_obs, color="LDHB") plt.savefig(p1 := tmp_path / "umap_mask_fig1.png") plt.close() - sc.pl.umap(pbmc, color="LDHB", mask="mask") + sc.pl.umap(pbmc, color="LDHB", mask_obs="mask") plt.savefig(p2 := tmp_path / "umap_mask_fig2.png") plt.close() diff --git a/scanpy/tests/test_rank_genes_groups.py b/scanpy/tests/test_rank_genes_groups.py index 3cad9c2d23..dd2b4c3dac 100644 --- a/scanpy/tests/test_rank_genes_groups.py +++ b/scanpy/tests/test_rank_genes_groups.py @@ -318,13 +318,13 @@ def test_mask_n_genes(n_genes_add, n_genes_out_add): """ pbmc = pbmc68k_reduced() - mask = np.zeros(pbmc.shape[1]).astype(bool) - mask[:6].fill(True) - no_genes = sum(mask) - 1 + mask_var = np.zeros(pbmc.shape[1]).astype(bool) + mask_var[:6].fill(True) + no_genes = sum(mask_var) - 1 rank_genes_groups( pbmc, - mask=mask, + mask_var=mask_var, groupby="bulk_labels", groups=["CD14+ Monocyte", "Dendritic"], reference="CD14+ Monocyte", @@ -342,8 +342,8 @@ def test_mask_not_equal(): """ pbmc = pbmc68k_reduced() - mask = np.random.choice([True, False], pbmc.shape[1]) - n_genes = sum(mask) + mask_var = np.random.choice([True, False], pbmc.shape[1]) + n_genes = sum(mask_var) run = partial( rank_genes_groups, @@ -357,7 +357,7 @@ def test_mask_not_equal(): run(n_genes=n_genes) no_mask = pbmc.uns["rank_genes_groups"]["names"] - run(mask=mask) + run(mask_var=mask_var) with_mask = pbmc.uns["rank_genes_groups"]["names"] assert not np.array_equal(no_mask, with_mask) diff --git a/scanpy/tests/test_scaling.py b/scanpy/tests/test_scaling.py index d34c91e861..d6b004c1ff 100644 --- a/scanpy/tests/test_scaling.py +++ b/scanpy/tests/test_scaling.py @@ -56,7 +56,7 @@ @pytest.mark.parametrize("typ", [np.array, csr_matrix], ids=lambda x: x.__name__) @pytest.mark.parametrize("dtype", ["float32", "int64"]) @pytest.mark.parametrize( - ("mask", "X", "X_centered", "X_scaled"), + ("mask_obs", "X", "X_centered", "X_scaled"), [ (None, X_original, X_centered_original, X_scaled_original), ( @@ -67,40 +67,40 @@ ), ], ) -def test_scale(*, typ, dtype, mask, X, X_centered, X_scaled): +def test_scale(*, typ, dtype, mask_obs, X, X_centered, X_scaled): # test AnnData arguments # test scaling with default zero_center == True adata0 = AnnData(typ(X).astype(dtype)) - sc.pp.scale(adata0, mask=mask) + sc.pp.scale(adata0, mask_obs=mask_obs) assert np.allclose(csr_matrix(adata0.X).toarray(), X_centered) # test scaling with explicit zero_center == True adata1 = AnnData(typ(X).astype(dtype)) - sc.pp.scale(adata1, zero_center=True, mask=mask) + sc.pp.scale(adata1, zero_center=True, mask_obs=mask_obs) assert np.allclose(csr_matrix(adata1.X).toarray(), X_centered) # test scaling with explicit zero_center == False adata2 = AnnData(typ(X).astype(dtype)) - sc.pp.scale(adata2, zero_center=False, mask=mask) + sc.pp.scale(adata2, zero_center=False, mask_obs=mask_obs) assert np.allclose(csr_matrix(adata2.X).toarray(), X_scaled) # test bare count arguments, for simplicity only with explicit copy=True # test scaling with default zero_center == True data0 = typ(X, dtype=dtype) - cdata0 = sc.pp.scale(data0, copy=True, mask=mask) + cdata0 = sc.pp.scale(data0, copy=True, mask_obs=mask_obs) assert np.allclose(csr_matrix(cdata0).toarray(), X_centered) # test scaling with explicit zero_center == True data1 = typ(X, dtype=dtype) - cdata1 = sc.pp.scale(data1, zero_center=True, copy=True, mask=mask) + cdata1 = sc.pp.scale(data1, zero_center=True, copy=True, mask_obs=mask_obs) assert np.allclose(csr_matrix(cdata1).toarray(), X_centered) # test scaling with explicit zero_center == False data2 = typ(X, dtype=dtype) - cdata2 = sc.pp.scale(data2, zero_center=False, copy=True, mask=mask) + cdata2 = sc.pp.scale(data2, zero_center=False, copy=True, mask_obs=mask_obs) assert np.allclose(csr_matrix(cdata2).toarray(), X_scaled) def test_mask_string(): with pytest.raises(ValueError): - sc.pp.scale(np.array(X_original), mask="mask") + sc.pp.scale(np.array(X_original), mask_obs="mask") adata = AnnData(np.array(X_for_mask, dtype="float32")) adata.obs["some cells"] = np.array((0, 0, 1, 1, 1, 0, 0), dtype=bool) - sc.pp.scale(adata, mask="some cells") + sc.pp.scale(adata, mask_obs="some cells") assert np.array_equal(adata.X, X_centered_for_mask) assert "mean of some cells" in adata.var.keys() diff --git a/scanpy/tools/_rank_genes_groups.py b/scanpy/tools/_rank_genes_groups.py index 54a97e1fbb..ba9196a842 100644 --- a/scanpy/tools/_rank_genes_groups.py +++ b/scanpy/tools/_rank_genes_groups.py @@ -21,6 +21,7 @@ from anndata import AnnData from numpy.typing import NDArray + from scipy import sparse _Method = Literal["logreg", "t-test", "wilcoxon", "t-test_overestim_var"] _CorrMethod = Literal["benjamini-hochberg", "bonferroni"] @@ -36,7 +37,11 @@ def _select_top_n(scores: NDArray, n_top: int): return global_indices -def _ranks(X, mask=None, mask_rest=None): +def _ranks( + X: np.ndarray | sparse.csr_matrix | sparse.csc_matrix, + mask_obs: NDArray[np.bool_] | None = None, + mask_obs_rest: NDArray[np.bool_] | None = None, +): CONST_MAX_SIZE = 10000000 n_genes = X.shape[1] @@ -48,12 +53,12 @@ def _ranks(X, mask=None, mask_rest=None): merge = np.vstack adapt = lambda X: X - masked = mask is not None and mask_rest is not None + masked = mask_obs is not None and mask_obs_rest is not None if masked: - n_cells = np.count_nonzero(mask) + np.count_nonzero(mask_rest) + n_cells = np.count_nonzero(mask_obs) + np.count_nonzero(mask_obs_rest) get_chunk = lambda X, left, right: merge( - (X[mask, left:right], X[mask_rest, left:right]) + (X[mask_obs, left:right], X[mask_obs_rest, left:right]) ) else: n_cells = X.shape[0] @@ -91,19 +96,19 @@ def __init__( groups: list[str] | Literal["all"], groupby: str, *, - gene_mask: NDArray[np.bool_] | None = None, + mask_var: NDArray[np.bool_] | None = None, reference: Literal["rest"] | str = "rest", use_raw: bool = True, layer: str | None = None, comp_pts: bool = False, ) -> None: - self.gene_mask = gene_mask + self.mask_var = mask_var if "log1p" in adata.uns_keys() and adata.uns["log1p"].get("base") is not None: self.expm1_func = lambda x: np.expm1(x * np.log(adata.uns["log1p"]["base"])) else: self.expm1_func = np.expm1 - self.groups_order, self.groups_masks = _utils.select_groups( + self.groups_order, self.groups_masks_obs = _utils.select_groups( adata, groups, groupby ) @@ -132,9 +137,9 @@ def __init__( if issparse(X): X.eliminate_zeros() - if self.gene_mask is not None: - self.X = X[:, self.gene_mask] - self.var_names = adata_comp.var_names[self.gene_mask] + if self.mask_var is not None: + self.X = X[:, self.mask_var] + self.var_names = adata_comp.var_names[self.mask_var] else: self.X = X @@ -163,7 +168,7 @@ def __init__( def _basic_stats(self) -> None: """Set self.{means,vars,pts}{,_rest} depending on X.""" n_genes = self.X.shape[1] - n_groups = self.groups_masks.shape[0] + n_groups = self.groups_masks_obs.shape[0] self.means = np.zeros((n_groups, n_genes)) self.vars = np.zeros((n_groups, n_genes)) @@ -174,7 +179,7 @@ def _basic_stats(self) -> None: self.vars_rest = np.zeros((n_groups, n_genes)) self.pts_rest = np.zeros((n_groups, n_genes)) if self.comp_pts else None else: - mask_rest = self.groups_masks[self.ireference] + mask_rest = self.groups_masks_obs[self.ireference] X_rest = self.X[mask_rest] self.means[self.ireference], self.vars[self.ireference] = _get_mean_var( X_rest @@ -187,24 +192,27 @@ def _basic_stats(self) -> None: else: get_nonzeros = lambda X: np.count_nonzero(X, axis=0) - for imask, mask in enumerate(self.groups_masks): - X_mask = self.X[mask] + for group_index, mask_obs in enumerate(self.groups_masks_obs): + X_mask = self.X[mask_obs] if self.comp_pts: - self.pts[imask] = get_nonzeros(X_mask) / X_mask.shape[0] + self.pts[group_index] = get_nonzeros(X_mask) / X_mask.shape[0] - if self.ireference is not None and imask == self.ireference: + if self.ireference is not None and group_index == self.ireference: continue - self.means[imask], self.vars[imask] = _get_mean_var(X_mask) + self.means[group_index], self.vars[group_index] = _get_mean_var(X_mask) if self.ireference is None: - mask_rest = ~mask + mask_rest = ~mask_obs X_rest = self.X[mask_rest] - self.means_rest[imask], self.vars_rest[imask] = _get_mean_var(X_rest) + ( + self.means_rest[group_index], + self.vars_rest[group_index], + ) = _get_mean_var(X_rest) # this can be costly for sparse data if self.comp_pts: - self.pts_rest[imask] = get_nonzeros(X_rest) / X_rest.shape[0] + self.pts_rest[group_index] = get_nonzeros(X_rest) / X_rest.shape[0] # deleting the next line causes a memory leak for some reason del X_rest @@ -215,18 +223,18 @@ def t_test( self._basic_stats() - for group_index, (mask, mean_group, var_group) in enumerate( - zip(self.groups_masks, self.means, self.vars) + for group_index, (mask_obs, mean_group, var_group) in enumerate( + zip(self.groups_masks_obs, self.means, self.vars) ): if self.ireference is not None and group_index == self.ireference: continue - ns_group = np.count_nonzero(mask) + ns_group = np.count_nonzero(mask_obs) if self.ireference is not None: mean_rest = self.means[self.ireference] var_rest = self.vars[self.ireference] - ns_other = np.count_nonzero(self.groups_masks[self.ireference]) + ns_other = np.count_nonzero(self.groups_masks_obs[self.ireference]) else: mean_rest = self.means_rest[group_index] var_rest = self.vars_rest[group_index] @@ -278,14 +286,14 @@ def wilcoxon( else: T = 1 - for group_index, mask in enumerate(self.groups_masks): + for group_index, mask_obs in enumerate(self.groups_masks_obs): if group_index == self.ireference: continue - mask_rest = self.groups_masks[self.ireference] + mask_obs_rest = self.groups_masks_obs[self.ireference] - n_active = np.count_nonzero(mask) - m_active = np.count_nonzero(mask_rest) + n_active = np.count_nonzero(mask_obs) + m_active = np.count_nonzero(mask_obs_rest) if n_active <= 25 or m_active <= 25: logg.hint( @@ -294,7 +302,7 @@ def wilcoxon( ) # Calculate rank sums for each chunk for the current mask - for ranks, left, right in _ranks(self.X, mask, mask_rest): + for ranks, left, right in _ranks(self.X, mask_obs, mask_obs_rest): scores[left:right] = ranks.iloc[0:n_active, :].sum(axis=0) if tie_correct: T[left:right] = _tiecorrect(ranks) @@ -313,7 +321,7 @@ def wilcoxon( # If no reference group exists, # ranking needs only to be done once (full mask) else: - n_groups = self.groups_masks.shape[0] + n_groups = self.groups_masks_obs.shape[0] scores = np.zeros((n_groups, n_genes)) n_cells = self.X.shape[0] @@ -322,13 +330,15 @@ def wilcoxon( for ranks, left, right in _ranks(self.X): # sum up adjusted_ranks to calculate W_m,n - for imask, mask in enumerate(self.groups_masks): - scores[imask, left:right] = ranks.iloc[mask, :].sum(axis=0) + for group_index, mask_obs in enumerate(self.groups_masks_obs): + scores[group_index, left:right] = ranks.iloc[mask_obs, :].sum( + axis=0 + ) if tie_correct: - T[imask, left:right] = _tiecorrect(ranks) + T[group_index, left:right] = _tiecorrect(ranks) - for group_index, mask in enumerate(self.groups_masks): - n_active = np.count_nonzero(mask) + for group_index, mask_obs in enumerate(self.groups_masks_obs): + n_active = np.count_nonzero(mask_obs) if tie_correct: T_i = T[group_index] @@ -469,7 +479,7 @@ def rank_genes_groups( adata: AnnData, groupby: str, *, - mask: NDArray[np.bool_] | str | None = None, + mask_var: NDArray[np.bool_] | str | None = None, use_raw: bool | None = None, groups: Literal["all"] | Iterable[str] = "all", reference: str = "rest", @@ -495,7 +505,7 @@ def rank_genes_groups( Annotated data matrix. groupby The key of the observations grouping to consider. - mask + mask_var Select subset of genes to use in statistical tests. use_raw Use `raw` attribute of `adata` if present. @@ -583,8 +593,8 @@ def rank_genes_groups( >>> sc.pl.rank_genes_groups(adata) """ - if mask is not None: - mask = _check_mask(adata, mask, "var") + if mask_var is not None: + mask_var = _check_mask(adata, mask_var, "var") if use_raw is None: use_raw = adata.raw is not None @@ -641,7 +651,7 @@ def rank_genes_groups( adata, groups_order, groupby, - gene_mask=mask, + mask_var=mask_var, reference=reference, use_raw=use_raw, layer=layer, @@ -662,7 +672,7 @@ def rank_genes_groups( n_genes_user = test_obj.X.shape[1] logg.debug(f"consider {groupby!r} groups:") - logg.debug(f"with sizes: {np.count_nonzero(test_obj.groups_masks, axis=1)}") + logg.debug(f"with sizes: {np.count_nonzero(test_obj.groups_masks_obs, axis=1)}") test_obj.compute_statistics( method, From 33e245d0bb98da5fe8023fae1826c66039f94991 Mon Sep 17 00:00:00 2001 From: Noam Teyssier <22600644+noamteyssier@users.noreply.github.com> Date: Fri, 16 Feb 2024 07:28:28 -0800 Subject: [PATCH 16/54] Convert string input on calculate qc metrics into collection for convenience (#2859) * feat: conversion of qc_vars into a collection if a single string is provided as input * tests: added a testing function on collection conversion on string input to qc_vars * chore: update release notes to reflect proposed changes in PR * tests: remove paramaterization on testing for string conversion in qc_vals * Move release note to 1.10 --------- Co-authored-by: Isaac Virshup --- docs/release-notes/1.10.0.md | 1 + scanpy/preprocessing/_qc.py | 6 +++++- scanpy/tests/test_qc_metrics.py | 10 ++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 7d48d4fd9d..1bb50c8991 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -18,6 +18,7 @@ * {func}`scanpy.tl.rank_genes_groups` no longer warns that it's default was changed from t-test_overestim_var to t-test {pr}`2798` {smaller}`L Heumos` * {func}`scanpy.pp.highly_variable_genes` has new flavor `seurat_v3_paper` that is in its implementation consistent with the paper description in Stuart et al 2018. {pr}`2792` {smaller}`E Roellin` * {func}`scanpy.pp.highly_variable_genes` supports dask for the default `seurat` and `cell_ranger` flavors {pr}`2809` {smaller}`P Angerer` +* Auto conversion of strings to collections in `scanpy.pp.calculate_qc_metrics` {pr}`2859` {smaller}`N Teyssier` ```{rubric} Docs ``` diff --git a/scanpy/preprocessing/_qc.py b/scanpy/preprocessing/_qc.py index 241afb32c3..4d1123f622 100644 --- a/scanpy/preprocessing/_qc.py +++ b/scanpy/preprocessing/_qc.py @@ -233,7 +233,7 @@ def calculate_qc_metrics( *, expr_type: str = "counts", var_type: str = "genes", - qc_vars: Collection[str] = (), + qc_vars: Collection[str] | str = (), percent_top: Collection[int] | None = (50, 100, 200, 500), layer: str | None = None, use_raw: bool = False, @@ -308,6 +308,10 @@ def calculate_qc_metrics( if issparse(X): X.eliminate_zeros() + # Convert qc_vars to list if str + if isinstance(qc_vars, str): + qc_vars = [qc_vars] + obs_metrics = describe_obs( adata, expr_type=expr_type, diff --git a/scanpy/tests/test_qc_metrics.py b/scanpy/tests/test_qc_metrics.py index 06a4d0ceae..83971fa2ce 100644 --- a/scanpy/tests/test_qc_metrics.py +++ b/scanpy/tests/test_qc_metrics.py @@ -143,6 +143,16 @@ def test_qc_metrics_format(cls): assert np.allclose(adata.var[col], adata_dense.var[col]) +def test_qc_metrics_format_str_qc_vars(): + adata_dense, init_var = adata_mito() + sc.pp.calculate_qc_metrics(adata_dense, qc_vars="mito", inplace=True) + adata = AnnData(X=adata_dense.X, var=init_var.copy()) + sc.pp.calculate_qc_metrics(adata, qc_vars="mito", inplace=True) + assert np.allclose(adata.obs, adata_dense.obs) + for col in adata.var: # np.allclose doesn't like mix of types + assert np.allclose(adata.var[col], adata_dense.var[col]) + + def test_qc_metrics_percentage(): # In response to #421 adata_dense, init_var = adata_mito() sc.pp.calculate_qc_metrics(adata_dense, percent_top=[]) From edfc7c682887ad133868b77a1a21afd5245fe70a Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Sat, 17 Feb 2024 03:18:27 +1100 Subject: [PATCH 17/54] py 3.12 suport (#2863) --- .azure-pipelines.yml | 8 ++++---- .readthedocs.yml | 2 +- docs/release-notes/1.10.0.md | 5 +++++ pyproject.toml | 1 + 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml index cbe87aadb9..9e72bd321d 100644 --- a/.azure-pipelines.yml +++ b/.azure-pipelines.yml @@ -3,7 +3,7 @@ trigger: - "*.*.x" variables: - python.version: '3.11' + python.version: '3.12' PIP_CACHE_DIR: $(Pipeline.Workspace)/.pip PYTEST_ADDOPTS: '-v --color=yes --durations=0 --nunit-xml=test-data/test-results.xml' TEST_EXTRA: 'test-full' @@ -18,7 +18,7 @@ jobs: matrix: Python3.9: python.version: '3.9' - Python3.11: {} + Python3.12: {} minimal_dependencies: TEST_EXTRA: 'test-min' anndata_dev: @@ -111,8 +111,8 @@ jobs: - task: UsePythonVersion@0 inputs: - versionSpec: '3.11' - displayName: 'Use Python 3.11' + versionSpec: '3.12' + displayName: 'Use Python 3.12' - script: | python -m pip install --upgrade pip diff --git a/.readthedocs.yml b/.readthedocs.yml index 3d0bd6da95..97597ff326 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -2,7 +2,7 @@ version: 2 build: os: ubuntu-20.04 tools: - python: '3.11' + python: '3.12' sphinx: fail_on_warning: true # do not change or you will be fired configuration: docs/conf.py diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 1bb50c8991..71ab684386 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -38,6 +38,11 @@ * Fix some annoying plotting warnings around violin plots {pr}`2844` {smaller}`P Angerer` * Scanpy now has a test job which tests against the minumum versions of the dependencies. In the process of implementing this, many bugs associated with using older versions of `pandas`, `anndata`, `numpy`, and `matplotlib` were fixed. {pr}`2816` {smaller}`I Virshup` +```{rubric} Development +``` + +* Scanpy is now tested against python 3.12 {pr}`2863` {smaller}`ivirshup` + ```{rubric} Ecosystem ``` diff --git a/pyproject.toml b/pyproject.toml index fda07ea18b..9046317d07 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,6 +42,7 @@ classifiers = [ "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", "Topic :: Scientific/Engineering :: Bio-Informatics", "Topic :: Scientific/Engineering :: Visualization", ] From 1ac74a78219f062128c7fbbf94fafd027dbb92e6 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Fri, 16 Feb 2024 17:34:15 +0100 Subject: [PATCH 18/54] Improve image compare code (#2860) --- scanpy/tests/conftest.py | 71 ++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 21 deletions(-) diff --git a/scanpy/tests/conftest.py b/scanpy/tests/conftest.py index 4c92245f27..a3dcf69d75 100644 --- a/scanpy/tests/conftest.py +++ b/scanpy/tests/conftest.py @@ -2,7 +2,8 @@ import sys from pathlib import Path -from typing import TYPE_CHECKING +from textwrap import dedent +from typing import TYPE_CHECKING, TypedDict, Union, cast import pytest @@ -60,30 +61,58 @@ def imported_modules(): return IMPORTED +class CompareResult(TypedDict): + rms: float + expected: str + actual: str + diff: str + tol: int + + @pytest.fixture def check_same_image(add_nunit_attachment): - from matplotlib.testing.compare import compare_images, make_test_filename + from urllib.parse import quote + + from matplotlib.testing.compare import compare_images - def _(pth1, pth2, *, tol: int, basename: str = ""): + def check_same_image( + expected: Path | os.PathLike, + actual: Path | os.PathLike, + *, + tol: int, + basename: str = "", + ) -> None: def fmt_descr(descr): - if basename != "": - return f"{descr} ({basename})" - else: - return descr - - pth1, pth2 = Path(pth1), Path(pth2) - try: - result = compare_images(str(pth1), str(pth2), tol=tol) - assert result is None, result - except Exception as e: - diff_pth = make_test_filename(pth2, "failed-diff") - add_nunit_attachment(str(pth1), fmt_descr("Expected")) - add_nunit_attachment(str(pth2), fmt_descr("Result")) - if Path(diff_pth).is_file(): - add_nunit_attachment(str(diff_pth), fmt_descr("Difference")) - raise e - - return _ + return f"{descr} ({basename})" if basename else descr + + result = cast( + Union[CompareResult, None], + compare_images(str(expected), str(actual), tol=tol, in_decorator=True), + ) + if result is None: + return + + add_nunit_attachment(result["expected"], fmt_descr("Expected")) + add_nunit_attachment(result["actual"], fmt_descr("Result")) + add_nunit_attachment(result["diff"], fmt_descr("Difference")) + + result_urls = { + k: f"file://{quote(v)}" if isinstance(v, str) else v + for k, v in result.items() + } + msg = dedent( + """\ + Image files did not match. + RMS Value: {rms} + Expected: {expected} + Actual: {actual} + Difference: {diff} + Tolerance: {tol} + """ + ).format_map(result_urls) + raise AssertionError(msg) + + return check_same_image @pytest.fixture From 6ee18b954b743cba6b75ddf8bfe823cb287bf3b9 Mon Sep 17 00:00:00 2001 From: Ilan Gold Date: Mon, 19 Feb 2024 17:50:45 +0100 Subject: [PATCH 19/54] (feat): `igraph` leiden implementation now included as an option in `sc.tl.leiden` (#2815) * (feat): igraph as option for leiden * (feat): add test for similarity * (feat): migrate defaults to `igraph` * (chore): add test for `directed` + `igraph` * (chore): change expected images * (fix): weights condition bug * (fix): change `rank_genes_groups` tolerance and update test images * (feat): new violin plot based on redone cluster assignments * (chore): check parameters matching * (fix): handle import properly * (fix): handle `partition_type` with `use_igraph` * (chore): remove unnecessary test args * (chore): add test for old defaults * (chore): pre-commit? * (chore): pre-commit hooks run * (chore): make violin plot `expected` correct * (fix): change `tol` again for violin plots * (chore): revert tolerance change - separate issue incoming * (chore): release note * (chore): try new plots with random seed set * (test): try publishing artifacts * (fix): publish artifact * (fix): publish other images * (chore): umap * (fix): fix random seeding for `igraph` * (fix): import in function * (fix): remove umap from test * (fix): try different random? * (feat): try marker gene labeling + write results * (fix): publish artifacts * (fix): try writing out data after relabel * (fix): try stable dataset * (chore): add more writes * (fix): sort categories * (fix): require igraph * (chore): remove build artifact * (fix): spelling error * (fix): swap changed after re-ordering * (chore): `use_igraph` -> `use_leidenalg` * fmt * (refactor): `use_leidenalg` -> `backend` * (refactor): get `objective_function` from `clustering_args` * (fix): docstring links * (refactor): create rng for igraph * (refactor): less lines * (chore): add test for random state * (refactor): fix initial state settings for other `igraph` methods by using `random` again * (refactor): `FLAVORS` reuse in test * Update scanpy/tools/_leiden.py Co-authored-by: Philipp A. * Update scanpy/_utils/__init__.py Co-authored-by: Philipp A. * Update scanpy/_utils/__init__.py Co-authored-by: Philipp A. * (fix): fix heatmap plot * (fix): change out images for new random seed method * Update scanpy/tools/_leiden.py Co-authored-by: Philipp A. * (chore): switch back to `leidenalg` default * (chore): fix clustering tests and update message * (fix): plotting test * (fix): `test_leiden_basic` `directed` arg * (fix): fix iterations to defaults * (fix): correct category swapping * (fix): need to reorder categories as well * (fix): clean up simple tests * (fix): remove unnecessary cluster swap. * (fix): just use random state that gives same number of categories * (fix): use `np.random` instead of `random` module * (chore): remove unnecessary comment in test about state * (refactor): simplify conditions * (refactor): `elif` -> `else` when `flavor` already checked * (fix): move leiden import for test * (fix): revert unnecessary image changes * (chore): address comments --------- Co-authored-by: Philipp A --- docs/release-notes/1.10.0.md | 1 + scanpy/_utils/__init__.py | 41 +++++- .../_images/heatmap_var_as_dict/expected.png | Bin 6008 -> 6008 bytes .../rank_genes_groups_1/expected.png | Bin 48157 -> 42345 bytes .../rank_genes_groups_2/expected.png | Bin 51994 -> 45907 bytes .../rank_genes_groups_3/expected.png | Bin 6991 -> 6178 bytes .../_images_pbmc3k/scatter_3/expected.png | Bin 9752 -> 10182 bytes .../_images_pbmc3k/violin_2/expected.png | Bin 32689 -> 29883 bytes scanpy/tests/notebooks/test_pbmc3k.py | 58 ++++++-- scanpy/tests/test_clustering.py | 132 +++++++++++++++++- scanpy/tests/test_plotting.py | 9 +- scanpy/tools/_leiden.py | 80 ++++++++--- 12 files changed, 276 insertions(+), 45 deletions(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 71ab684386..1ec5a1edca 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -16,6 +16,7 @@ * {func}`scanpy.pp.pca`, {func}`scanpy.pp.scale`, {func}`scanpy.pl.embedding`, and {func}`scanpy.experimental.pp.normalize_pearson_residuals_pca` now support a `mask` parameter {pr}`2272` {smaller}`C Bright, T Marcella, & P Angerer` * {func}`scanpy.tl.rank_genes_groups` no longer warns that it's default was changed from t-test_overestim_var to t-test {pr}`2798` {smaller}`L Heumos` +* {func}`scanpy.tl.leiden` now offers `igraph`'s implementation of the leiden algorithm via via `flavor` when set to `igraph`. `leidenalg`'s implementation is still default, but discouraged. {pr}`2815` {smaller}`I Gold` * {func}`scanpy.pp.highly_variable_genes` has new flavor `seurat_v3_paper` that is in its implementation consistent with the paper description in Stuart et al 2018. {pr}`2792` {smaller}`E Roellin` * {func}`scanpy.pp.highly_variable_genes` supports dask for the default `seurat` and `cell_ranger` flavors {pr}`2809` {smaller}`P Angerer` * Auto conversion of strings to collections in `scanpy.pp.calculate_qc_metrics` {pr}`2859` {smaller}`N Teyssier` diff --git a/scanpy/_utils/__init__.py b/scanpy/_utils/__init__.py index 6d21a11fd5..625e3b71e3 100644 --- a/scanpy/_utils/__init__.py +++ b/scanpy/_utils/__init__.py @@ -7,9 +7,11 @@ import importlib.util import inspect +import random import sys import warnings from collections import namedtuple +from contextlib import contextmanager from enum import Enum from functools import partial, singledispatch, wraps from textwrap import dedent @@ -20,10 +22,10 @@ import numpy as np from anndata import AnnData from anndata import __version__ as anndata_version -from numpy import random from numpy.typing import NDArray from packaging import version from scipy import sparse +from sklearn.utils import check_random_state from .. import logging as logg from .._compat import DaskArray @@ -45,7 +47,38 @@ def __repr__(self) -> str: _empty = Empty.token # e.g. https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html -AnyRandom = Union[int, random.RandomState, None] # maybe in the future random.Generator +# maybe in the future random.Generator +AnyRandom = Union[int, np.random.RandomState, None] + + +class RNGIgraph: + """ + Random number generator for ipgraph so global seed is not changed. + See :func:`igraph.set_random_number_generator` for the requirements. + """ + + def __init__(self, random_state: int = 0) -> None: + self._rng = check_random_state(random_state) + + def __getattr__(self, attr: str): + return getattr(self._rng, "normal" if attr == "gauss" else attr) + + +@contextmanager +def set_igraph_random_state(random_state: int): + try: + import igraph + except ImportError: + raise ImportError( + "Please install igraph: `conda install -c conda-forge igraph` or `pip3 install igraph`." + ) + rng = RNGIgraph(random_state) + try: + igraph.set_random_number_generator(rng) + yield None + finally: + igraph.set_random_number_generator(random) + EPS = 1e-15 @@ -459,10 +492,10 @@ def moving_average(a: np.ndarray, n: int): return ret[n - 1 :] / n -def get_random_state(seed: AnyRandom) -> random.RandomState: +def get_random_state(seed: AnyRandom) -> np.random.RandomState: if isinstance(seed, np.random.RandomState): return seed - return random.RandomState(seed) + return np.random.RandomState(seed) # -------------------------------------------------------------------------------- diff --git a/scanpy/tests/_images/heatmap_var_as_dict/expected.png b/scanpy/tests/_images/heatmap_var_as_dict/expected.png index 9406010120dc07ff403493d63ca2d385fbd334a8..aed510396f5ef606d46e9d96c02928d5c43eb764 100644 GIT binary patch literal 6008 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 XH~sv_YcgOJ9C)mxp;(E0{r3L={{DRR literal 6008 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 T*QN?^!9i+Dnu-^j<- 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 literal 48157 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�ChA$AHN`D%fJ=7cGHmAuo{C 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 bH2i0-<6yd>@=SFS0}yz+`njxgN@xNAj9J{k diff --git a/scanpy/tests/notebooks/_images_pbmc3k/rank_genes_groups_3/expected.png b/scanpy/tests/notebooks/_images_pbmc3k/rank_genes_groups_3/expected.png index e33a4e2d44211dcae84a7ed2c932569f85044b53..89d455fa3cd3081995912c8811bd7d956518e8e8 100644 GIT binary patch literal 6178 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 diff --git a/scanpy/tests/notebooks/test_pbmc3k.py b/scanpy/tests/notebooks/test_pbmc3k.py index 5e2c71e617..ad883d1403 100644 --- a/scanpy/tests/notebooks/test_pbmc3k.py +++ b/scanpy/tests/notebooks/test_pbmc3k.py @@ -28,11 +28,10 @@ @needs.leidenalg def test_pbmc3k(image_comparer): + # ensure violin plots and other non-determinstic plots have deterministic behavior + np.random.seed(0) save_and_compare_images = partial(image_comparer, ROOT, tol=20) - - adata = sc.read( - "./data/pbmc3k_raw.h5ad", backup_url="https://falexwolf.de/data/pbmc3k_raw.h5ad" - ) + adata = sc.datasets.pbmc3k() # Preprocessing @@ -105,13 +104,48 @@ def test_pbmc3k(image_comparer): # Clustering the graph - sc.tl.leiden(adata, resolution=0.9) - # sc.pl.umap(adata, color=['leiden', 'CST3', 'NKG7'], show=False) - # save_and_compare_images('umap_2') + sc.tl.leiden( + adata, + resolution=0.9, + random_state=0, + directed=False, + n_iterations=2, + flavor="igraph", + ) + + # sc.pl.umap(adata, color=["leiden", "CST3", "NKG7"], show=False) + # save_and_compare_images("umap_2") sc.pl.scatter(adata, "CST3", "NKG7", color="leiden", show=False) save_and_compare_images("scatter_3") # Finding marker genes + # Due to incosistency with our test runner vs local, these clusters need to + # be pre-annotated as the numbers for each cluster are not consistent. + marker_genes = [ + "RP11-18H21.1", + "GZMK", + "CD79A", + "FCGR3A", + "GNLY", + "S100A8", + "FCER1A", + "PPBP", + ] + new_labels = ["0", "1", "2", "3", "4", "5", "6", "7"] + data_df = adata[:, marker_genes].to_df() + data_df["leiden"] = adata.obs["leiden"] + max_idxs = data_df.groupby("leiden", observed=True).mean().idxmax() + leiden_relabel = {} + for marker_gene, new_label in zip(marker_genes, new_labels): + leiden_relabel[max_idxs[marker_gene]] = new_label + adata.obs["leiden_old"] = adata.obs["leiden"].copy() + adata.rename_categories( + "leiden", [leiden_relabel[key] for key in sorted(leiden_relabel.keys())] + ) + # ensure that the column can be sorted for consistent plotting since it is by default unordered + adata.obs["leiden"] = adata.obs["leiden"].cat.reorder_categories( + list(map(str, range(len(adata.obs["leiden"].cat.categories)))), ordered=True + ) sc.tl.rank_genes_groups(adata, "leiden") sc.pl.rank_genes_groups(adata, n_genes=20, sharey=False, show=False) @@ -129,18 +163,13 @@ def test_pbmc3k(image_comparer): # sc.pl.rank_genes_groups_violin(adata, groups='0', n_genes=8) # save_and_compare_images('rank_genes_groups_4') - if adata[adata.obs["leiden"] == "4", "CST3"].X.mean() < 1: - ( # switch clusters - adata.obs["leiden"][adata.obs["leiden"] == "4"], - adata.obs["leiden"][adata.obs["leiden"] == "5"], - ) = ("5", "4") new_cluster_names = [ "CD4 T cells", - "CD14+ Monocytes", - "B cells", "CD8 T cells", + "B cells", "NK cells", "FCGR3A+ Monocytes", + "CD14+ Monocytes", "Dendritic cells", "Megakaryocytes", ] @@ -148,7 +177,6 @@ def test_pbmc3k(image_comparer): # sc.pl.umap(adata, color='leiden', legend_loc='on data', title='', frameon=False, show=False) # save_and_compare_images('umap_3') - sc.pl.violin( adata, ["CST3", "NKG7", "PPBP"], groupby="leiden", rotation=90, show=False ) diff --git a/scanpy/tests/test_clustering.py b/scanpy/tests/test_clustering.py index f42a4a4b2a..d2005d9659 100644 --- a/scanpy/tests/test_clustering.py +++ b/scanpy/tests/test_clustering.py @@ -1,6 +1,7 @@ from __future__ import annotations import pytest +from sklearn.metrics.cluster import normalized_mutual_info_score import scanpy as sc from scanpy.testing._helpers.data import pbmc68k_reduced @@ -12,11 +13,136 @@ def adata_neighbors(): return pbmc68k_reduced() +FLAVORS = [ + pytest.param("igraph", marks=needs.igraph), + pytest.param("leidenalg", marks=needs.leidenalg), +] + + +@needs.leidenalg +@needs.igraph +@pytest.mark.parametrize("flavor", FLAVORS) +@pytest.mark.parametrize("resolution", [1, 2]) +@pytest.mark.parametrize("n_iterations", [-1, 3]) +def test_leiden_basic(adata_neighbors, flavor, resolution, n_iterations): + sc.tl.leiden( + adata_neighbors, + flavor=flavor, + resolution=resolution, + n_iterations=n_iterations, + directed=(flavor == "leidenalg"), + ) + assert adata_neighbors.uns["leiden"]["params"]["resolution"] == resolution + assert adata_neighbors.uns["leiden"]["params"]["n_iterations"] == n_iterations + + @needs.leidenalg -def test_leiden_basic(adata_neighbors): - sc.tl.leiden(adata_neighbors) +@needs.igraph +@pytest.mark.parametrize("flavor", FLAVORS) +def test_leiden_random_state(adata_neighbors, flavor): + is_leiden_alg = flavor == "leidenalg" + n_iterations = 2 if is_leiden_alg else -1 + adata_1 = sc.tl.leiden( + adata_neighbors, + flavor=flavor, + random_state=1, + copy=True, + directed=is_leiden_alg, + n_iterations=n_iterations, + ) + adata_1_again = sc.tl.leiden( + adata_neighbors, + flavor=flavor, + random_state=1, + copy=True, + directed=is_leiden_alg, + n_iterations=n_iterations, + ) + adata_2 = sc.tl.leiden( + adata_neighbors, + flavor=flavor, + random_state=2, + copy=True, + directed=is_leiden_alg, + n_iterations=n_iterations, + ) + assert (adata_1.obs["leiden"] == adata_1_again.obs["leiden"]).all() + assert (adata_2.obs["leiden"] != adata_1_again.obs["leiden"]).any() + + +@needs.igraph +def test_leiden_igraph_directed(adata_neighbors): + with pytest.raises(ValueError): + sc.tl.leiden(adata_neighbors, flavor="igraph", directed=True) + + +@needs.igraph +def test_leiden_wrong_flavor(adata_neighbors): + with pytest.raises(ValueError): + sc.tl.leiden(adata_neighbors, flavor="foo") + + +@needs.igraph +@needs.leidenalg +def test_leiden_igraph_partition_type(adata_neighbors): + import leidenalg + + with pytest.raises(ValueError): + sc.tl.leiden( + adata_neighbors, + flavor="igraph", + partition_type=leidenalg.RBConfigurationVertexPartition, + ) + + +@needs.leidenalg +@needs.igraph +def test_leiden_equal_defaults_same_args(adata_neighbors): + """Ensure the two implementations are the same for the same args.""" + leiden_alg_clustered = sc.tl.leiden( + adata_neighbors, flavor="leidenalg", copy=True, n_iterations=2 + ) + igraph_clustered = sc.tl.leiden( + adata_neighbors, flavor="igraph", copy=True, directed=False, n_iterations=2 + ) + assert ( + normalized_mutual_info_score( + leiden_alg_clustered.obs["leiden"], igraph_clustered.obs["leiden"] + ) + > 0.9 + ) + + +@needs.leidenalg +@needs.igraph +def test_leiden_equal_defaults(adata_neighbors): + """Ensure that the old leidenalg defaults are close enough to the current default outputs.""" + leiden_alg_clustered = sc.tl.leiden( + adata_neighbors, flavor="leidenalg", directed=True, copy=True + ) + igraph_clustered = sc.tl.leiden( + adata_neighbors, copy=True, n_iterations=2, directed=False + ) + assert ( + normalized_mutual_info_score( + leiden_alg_clustered.obs["leiden"], igraph_clustered.obs["leiden"] + ) + > 0.9 + ) + + +@needs.igraph +def test_leiden_objective_function(adata_neighbors): + """Ensure that popping this as a `clustering_kwargs` and using it does not error out.""" + sc.tl.leiden( + adata_neighbors, + objective_function="modularity", + flavor="igraph", + directed=False, + ) +@needs.igraph @pytest.mark.parametrize( "clustering,key", [ @@ -52,6 +178,7 @@ def test_clustering_subset(adata_neighbors, clustering, key): @needs.louvain +@needs.igraph def test_louvain_basic(adata_neighbors): sc.tl.louvain(adata_neighbors) sc.tl.louvain(adata_neighbors, use_weights=True) @@ -60,6 +187,7 @@ def test_louvain_basic(adata_neighbors): @needs.louvain +@needs.igraph def test_partition_type(adata_neighbors): import louvain diff --git a/scanpy/tests/test_plotting.py b/scanpy/tests/test_plotting.py index 0a03fdd8ba..5482c0d72f 100644 --- a/scanpy/tests/test_plotting.py +++ b/scanpy/tests/test_plotting.py @@ -103,7 +103,14 @@ def test_heatmap(image_comparer): # test var_names as dict pbmc = pbmc68k_reduced() - sc.tl.leiden(pbmc, key_added="clusters", resolution=0.5) + sc.tl.leiden( + pbmc, + key_added="clusters", + resolution=0.5, + flavor="igraph", + n_iterations=2, + directed=False, + ) # call umap to trigger colors for the clusters sc.pl.umap(pbmc, color="clusters") marker_genes_dict = { diff --git a/scanpy/tools/_leiden.py b/scanpy/tools/_leiden.py index aa8a9f4981..5345e3567b 100644 --- a/scanpy/tools/_leiden.py +++ b/scanpy/tools/_leiden.py @@ -1,6 +1,8 @@ from __future__ import annotations -from typing import TYPE_CHECKING +import importlib +import warnings +from typing import TYPE_CHECKING, Literal import numpy as np import pandas as pd @@ -34,14 +36,15 @@ def leiden( random_state: _utils.AnyRandom = 0, key_added: str = "leiden", adjacency: sparse.spmatrix | None = None, - directed: bool = True, + directed: bool | None = None, use_weights: bool = True, n_iterations: int = -1, partition_type: type[MutableVertexPartition] | None = None, neighbors_key: str | None = None, obsp: str | None = None, copy: bool = False, - **partition_kwargs, + flavor: Literal["leidenalg", "ipgraph"] = "leidenalg", + **clustering_args, ) -> AnnData | None: """\ Cluster cells into subgroups [Traag18]_. @@ -80,6 +83,7 @@ def leiden( How many iterations of the Leiden clustering algorithm to perform. Positive values above 2 define the total number of iterations to perform, -1 has the algorithm run until it reaches its optimal clustering. + 2 is faster and the default for underlying packages. partition_type Type of partition to use. Defaults to :class:`~leidenalg.RBConfigurationVertexPartition`. @@ -96,9 +100,11 @@ def leiden( `obsp` and `neighbors_key` at the same time. copy Whether to copy `adata` or modify it inplace. - **partition_kwargs - Any further arguments to pass to `~leidenalg.find_partition` - (which in turn passes arguments to the `partition_type`). + flavor + Which package's implementation to use. + **clustering_args + Any further arguments to pass to :func:`~leidenalg.find_partition` (which in turn passes arguments to the `partition_type`) + or :meth:`igraph.Graph.community_leiden` from `igraph`. Returns ------- @@ -112,13 +118,35 @@ def leiden( A dict with the values for the parameters `resolution`, `random_state`, and `n_iterations`. """ - try: - import leidenalg - except ImportError: + if flavor not in {"igraph", "leidenalg"}: + raise ValueError( + f"flavor must be either 'igraph' or 'leidenalg', but '{flavor}' was passed" + ) + igraph_spec = importlib.util.find_spec("igraph") + if igraph_spec is None: raise ImportError( - "Please install the leiden algorithm: `conda install -c conda-forge leidenalg` or `pip3 install leidenalg`." + "Please install the igraph package: `conda install -c conda-forge igraph` or `pip3 install igraph`." ) - partition_kwargs = dict(partition_kwargs) + if flavor == "igraph": + if directed: + raise ValueError( + "Cannot use igraph's leiden implemntation with a directed graph." + ) + if partition_type is not None: + raise ValueError( + "Do not pass in partition_type argument when using igraph." + ) + else: + try: + import leidenalg + + msg = 'Use of leidenalg is discouraged and will be deprecated in the future. Please use `flavor="igraph"` `n_iterations=2` to achieve similar results. `directed` must also be `False` to work with `igraph`\'s implementation.' + warnings.warn(msg, FutureWarning) + except ImportError: + raise ImportError( + "Please install the leiden algorithm: `conda install -c conda-forge leidenalg` or `pip3 install leidenalg`." + ) + clustering_args = dict(clustering_args) start = logg.info("running Leiden clustering") adata = adata.copy() if copy else adata @@ -133,23 +161,29 @@ def leiden( restrict_categories=restrict_categories, adjacency=adjacency, ) - # convert it to igraph - g = _utils.get_igraph_from_adjacency(adjacency, directed=directed) - # flip to the default partition type if not overriden by the user - if partition_type is None: - partition_type = leidenalg.RBConfigurationVertexPartition # Prepare find_partition arguments as a dictionary, # appending to whatever the user provided. It needs to be this way # as this allows for the accounting of a None resolution # (in the case of a partition variant that doesn't take it on input) - if use_weights: - partition_kwargs["weights"] = np.array(g.es["weight"]).astype(np.float64) - partition_kwargs["n_iterations"] = n_iterations - partition_kwargs["seed"] = random_state + clustering_args["n_iterations"] = n_iterations if resolution is not None: - partition_kwargs["resolution_parameter"] = resolution - # clustering proper - part = leidenalg.find_partition(g, partition_type, **partition_kwargs) + clustering_args["resolution_parameter"] = resolution + if flavor == "leidenalg": + directed = True if directed is None else directed + g = _utils.get_igraph_from_adjacency(adjacency, directed=directed) + if partition_type is None: + partition_type = leidenalg.RBConfigurationVertexPartition + if use_weights: + clustering_args["weights"] = np.array(g.es["weight"]).astype(np.float64) + clustering_args["seed"] = random_state + part = leidenalg.find_partition(g, partition_type, **clustering_args) + else: + g = _utils.get_igraph_from_adjacency(adjacency, directed=False) + if use_weights: + clustering_args["weights"] = "weight" + clustering_args.setdefault("objective_function", "modularity") + with _utils.set_igraph_random_state(random_state): + part = g.community_leiden(**clustering_args) # store output into adata.obs groups = np.array(part.membership) if restrict_to is not None: From 3ddf1ee1dd12b9b4f9e19f90879393e2ac703c5f Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 19 Feb 2024 18:28:29 +0000 Subject: [PATCH 20/54] [pre-commit.ci] pre-commit autoupdate (#2867) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.2.1 → v0.2.2](https://github.com/astral-sh/ruff-pre-commit/compare/v0.2.1...v0.2.2) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 18ea71fc98..00f1497b0e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.2.1 + rev: v0.2.2 hooks: - id: ruff types_or: [python, pyi, jupyter] From b4ba81dc9eab9f75b761d85e473e548a5c37b49e Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Tue, 20 Feb 2024 18:57:25 +1100 Subject: [PATCH 21/54] Fix pandas stack warning (#2864) --- docs/release-notes/1.10.0.md | 1 + scanpy/get/get.py | 8 ++++++-- scanpy/plotting/_stacked_violin.py | 7 ++++++- scanpy/tests/test_pca.py | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 1ec5a1edca..542ee15fd9 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -38,6 +38,7 @@ * Fix all remaining pandas warnings {pr}`2789` {smaller}`P Angerer` * Fix some annoying plotting warnings around violin plots {pr}`2844` {smaller}`P Angerer` * Scanpy now has a test job which tests against the minumum versions of the dependencies. In the process of implementing this, many bugs associated with using older versions of `pandas`, `anndata`, `numpy`, and `matplotlib` were fixed. {pr}`2816` {smaller}`I Virshup` +* Fix warnings caused by internal usage of `pandas.DataFrame.stack` with `pandas>=2.1` {pr}`2864`{smaller}`I Virshup` ```{rubric} Development ``` diff --git a/scanpy/get/get.py b/scanpy/get/get.py index a9ca372dc0..3080dfb2bb 100644 --- a/scanpy/get/get.py +++ b/scanpy/get/get.py @@ -6,6 +6,7 @@ import numpy as np import pandas as pd from anndata import AnnData +from packaging.version import Version from scipy.sparse import spmatrix if TYPE_CHECKING: @@ -23,7 +24,7 @@ # TODO: implement diffxpy method, make singledispatch def rank_genes_groups_df( adata: AnnData, - group: str | Iterable[str], + group: str | Iterable[str] | None, *, key: str = "rank_genes_groups", pval_cutoff: float | None = None, @@ -74,7 +75,10 @@ def rank_genes_groups_df( d = [pd.DataFrame(adata.uns[key][c])[group] for c in colnames] d = pd.concat(d, axis=1, names=[None, "group"], keys=colnames) - d = d.stack(level=1).reset_index() + if Version(pd.__version__) >= Version("2.1"): + d = d.stack(level=1, future_stack=True).reset_index() + else: + d = d.stack(level=1).reset_index() d["group"] = pd.Categorical(d["group"], categories=group) d = d.sort_values(["group", "level_0"]).drop(columns="level_0") diff --git a/scanpy/plotting/_stacked_violin.py b/scanpy/plotting/_stacked_violin.py index 6b9abfd49c..21a9d9705b 100644 --- a/scanpy/plotting/_stacked_violin.py +++ b/scanpy/plotting/_stacked_violin.py @@ -7,6 +7,7 @@ import pandas as pd from matplotlib import pyplot as plt from matplotlib.colors import Normalize, is_color_like +from packaging.version import Version from .. import logging as logg from .._compat import old_positionals @@ -468,9 +469,13 @@ def _make_rows_of_violinplots( # the expression value # This format is convenient to aggregate per gene or per category # while making the violin plots. + if Version(pd.__version__) >= Version("2.1"): + stack_kwargs = {"future_stack": True} + else: + stack_kwargs = {"dropna": False} df = ( - pd.DataFrame(_matrix.stack(dropna=False)) + pd.DataFrame(_matrix.stack(**stack_kwargs)) .reset_index() .rename( columns={ diff --git a/scanpy/tests/test_pca.py b/scanpy/tests/test_pca.py index a18a313063..86e47ba18e 100644 --- a/scanpy/tests/test_pca.py +++ b/scanpy/tests/test_pca.py @@ -165,7 +165,7 @@ def test_pca_transform(array_type): with warnings.catch_warnings(record=True) as record: sc.pp.pca(adata, n_comps=4, zero_center=True, dtype="float64") - assert len(record) == 0 + assert len(record) == 0, record assert np.linalg.norm(A_pca_abs[:, :4] - np.abs(adata.obsm["X_pca"])) < 2e-05 From 383a61b2db0c45ba622f231f01d0e7546d99566b Mon Sep 17 00:00:00 2001 From: Ilan Gold Date: Tue, 20 Feb 2024 11:10:51 +0100 Subject: [PATCH 22/54] (feat): Aggregation via group-by in `sc.get` (#2590) --- docs/api/get.md | 1 + docs/release-notes/1.10.0.md | 1 + scanpy/_utils/__init__.py | 10 + scanpy/get/__init__.py | 4 +- scanpy/get/_aggregated.py | 387 ++++++++++++++++++++++++++++++++ scanpy/tests/test_aggregated.py | 373 ++++++++++++++++++++++++++++++ 6 files changed, 774 insertions(+), 2 deletions(-) create mode 100644 scanpy/get/_aggregated.py create mode 100644 scanpy/tests/test_aggregated.py diff --git a/docs/api/get.md b/docs/api/get.md index 82f74ed411..039769d0a6 100644 --- a/docs/api/get.md +++ b/docs/api/get.md @@ -19,5 +19,6 @@ useful formats. get.obs_df get.var_df get.rank_genes_groups_df + get.aggregate ``` diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 542ee15fd9..0266b2bdf9 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -15,6 +15,7 @@ * Enhanced dask support for some internal utilities, paving the way for more extensive dask support {pr}`2696` {smaller}`P Angerer` * {func}`scanpy.pp.pca`, {func}`scanpy.pp.scale`, {func}`scanpy.pl.embedding`, and {func}`scanpy.experimental.pp.normalize_pearson_residuals_pca` now support a `mask` parameter {pr}`2272` {smaller}`C Bright, T Marcella, & P Angerer` +* New function {func}`scanpy.get.aggregate` which allows grouped aggregations over your data. Useful for pseudobulking! {pr}`2590` {smaller}`Isaac Virshup` {smaller}`Ilan Gold` {smaller}`Jon Bloom` * {func}`scanpy.tl.rank_genes_groups` no longer warns that it's default was changed from t-test_overestim_var to t-test {pr}`2798` {smaller}`L Heumos` * {func}`scanpy.tl.leiden` now offers `igraph`'s implementation of the leiden algorithm via via `flavor` when set to `igraph`. `leidenalg`'s implementation is still default, but discouraged. {pr}`2815` {smaller}`I Gold` * {func}`scanpy.pp.highly_variable_genes` has new flavor `seurat_v3_paper` that is in its implementation consistent with the paper description in Stuart et al 2018. {pr}`2792` {smaller}`E Roellin` diff --git a/scanpy/_utils/__init__.py b/scanpy/_utils/__init__.py index 625e3b71e3..3ef16300aa 100644 --- a/scanpy/_utils/__init__.py +++ b/scanpy/_utils/__init__.py @@ -874,3 +874,13 @@ def _choose_graph(adata, obsp, neighbors_key): "to compute a neighborhood graph." ) return neighbors["connectivities"] + + +def _resolve_axis( + axis: Literal["obs", 0, "var", 1], +) -> tuple[Literal[0], Literal["obs"]] | tuple[Literal[1], Literal["var"]]: + if axis in {0, "obs"}: + return (0, "obs") + if axis in {1, "var"}: + return (1, "var") + raise ValueError(f"`axis` must be either 0, 1, 'obs', or 'var', was {axis!r}") diff --git a/scanpy/get/__init__.py b/scanpy/get/__init__.py index 08567cfc6e..56c0d3c130 100644 --- a/scanpy/get/__init__.py +++ b/scanpy/get/__init__.py @@ -1,7 +1,6 @@ -# Public -# Private from __future__ import annotations +from ._aggregated import aggregate from .get import ( _check_mask, _get_obs_rep, @@ -15,6 +14,7 @@ "_check_mask", "_get_obs_rep", "_set_obs_rep", + "aggregate", "obs_df", "rank_genes_groups_df", "var_df", diff --git a/scanpy/get/_aggregated.py b/scanpy/get/_aggregated.py new file mode 100644 index 0000000000..159f7572e3 --- /dev/null +++ b/scanpy/get/_aggregated.py @@ -0,0 +1,387 @@ +from __future__ import annotations + +from functools import singledispatch +from typing import TYPE_CHECKING, Literal, Union, get_args + +import numpy as np +import pandas as pd +from anndata import AnnData, utils +from scipy import sparse + +from .._utils import _resolve_axis +from .get import _check_mask + +if TYPE_CHECKING: + from collections.abc import Collection, Iterable + + from numpy.typing import NDArray + +Array = Union[np.ndarray, sparse.csc_matrix, sparse.csr_matrix] +AggType = Literal["count_nonzero", "mean", "sum", "var"] + + +class Aggregate: + """\ + Functionality for generic grouping and aggregating. + + There is currently support for count_nonzero, sum, mean, and variance. + + **Implementation** + + Moments are computed using weighted sum aggregation of data by some feature + via multiplication by a sparse coordinate matrix A. + + Runtime is effectively computation of the product `A @ X`, i.e. the count of (non-zero) + entries in X with multiplicity the number of group memberships for that entry. + This is `O(data)` for partitions (each observation belonging to exactly one group), + independent of the number of groups. + + Params + ------ + groupby + :class:`~pandas.Categorical` containing values for grouping by. + data + Data matrix for aggregation. + mask + Mask to be used for aggregation. + """ + + def __init__( + self, + groupby: pd.Categorical, + data: Array, + *, + mask: NDArray[np.bool_] | None = None, + ) -> None: + self.groupby = groupby + self.indicator_matrix = sparse_indicator(groupby, mask=mask) + self.data = data + + groupby: pd.Categorical + indicator_matrix: sparse.coo_matrix + data: Array + + def count_nonzero(self) -> NDArray[np.integer]: + """\ + Count the number of observations in each group. + + Returns + ------- + Array of counts. + """ + # pattern = self.data._with_data(np.broadcast_to(1, len(self.data.data))) + # return self.indicator_matrix @ pattern + return self.indicator_matrix @ (self.data != 0) + + def sum(self) -> Array: + """\ + Compute the sum per feature per group of observations. + + Returns + ------- + Array of sum. + """ + return utils.asarray(self.indicator_matrix @ self.data) + + def mean(self) -> Array: + """\ + Compute the mean per feature per group of observations. + + Returns + ------- + Array of mean. + """ + return ( + utils.asarray(self.indicator_matrix @ self.data) + / np.bincount(self.groupby.codes)[:, None] + ) + + def mean_var(self, dof: int = 1) -> tuple[np.ndarray, np.ndarray]: + """\ + Compute the count, as well as mean and variance per feature, per group of observations. + + The formula `Var(X) = E(X^2) - E(X)^2` suffers loss of precision when the variance is a + very small fraction of the squared mean. In particular, when X is constant, the formula may + nonetheless be non-zero. By default, our implementation resets the variance to exactly zero + when the computed variance, relative to the squared mean, nears limit of precision of the + floating-point significand. + + Params + ------ + dof + Degrees of freedom for variance. + + Returns + ------- + Object with `count`, `mean`, and `var` attributes. + """ + assert dof >= 0 + + group_counts = np.bincount(self.groupby.codes) + mean_ = self.mean() + # sparse matrices do not support ** for elementwise power. + mean_sq = ( + utils.asarray(self.indicator_matrix @ _power(self.data, 2)) + / group_counts[:, None] + ) + sq_mean = mean_**2 + var_ = mean_sq - sq_mean + # TODO: Why these values exactly? Because they are high relative to the datatype? + # (unchanged from original code: https://github.com/scverse/anndata/pull/564) + precision = 2 << (42 if self.data.dtype == np.float64 else 20) + # detects loss of precision in mean_sq - sq_mean, which suggests variance is 0 + var_[precision * var_ < sq_mean] = 0 + if dof != 0: + var_ *= (group_counts / (group_counts - dof))[:, np.newaxis] + return mean_, var_ + + +def _power(X: Array, power: float | int) -> Array: + """\ + Generate elementwise power of a matrix. + + Needed for non-square sparse matrices because they do not support `**` so the `.power` function is used. + + Params + ------ + X + Matrix whose power is to be raised. + power + Integer power value + + Returns + ------- + Matrix whose power has been raised. + """ + return X**power if isinstance(X, np.ndarray) else X.power(power) + + +@singledispatch +def aggregate( + adata: AnnData, + by: str | Collection[str], + func: AggType | Iterable[AggType], + *, + axis: Literal["obs", 0, "var", 1] | None = None, + mask: NDArray[np.bool_] | str | None = None, + dof: int = 1, + layer: str | None = None, + obsm: str | None = None, + varm: str | None = None, +) -> AnnData: + """\ + Aggregate data matrix based on some categorical grouping. + + This function is useful for pseudobulking as well as plotting. + + Aggregation to perform is specified by `func`, which can be a single metric or a + list of metrics. Each metric is computed over the group and results in a new layer + in the output `AnnData` object. + + If none of `layer`, `obsm`, or `varm` are passed in, `X` will be used for aggregation data. + If `func` only has length 1 or is just an `AggType`, then aggregation data is written to `X`. + Otherwise, it is written to `layers` or `xxxm` as appropriate for the dimensions of the aggregation data. + + Params + ------ + adata + :class:`~anndata.AnnData` to be aggregated. + by + Key of the column to be grouped-by. + func + How to aggregate. + axis + Axis on which to find group by column. + mask + Boolean mask (or key to column containing mask) to apply along the axis. + dof + Degrees of freedom for variance. Defaults to 1. + layer + If not None, key for aggregation data. + obsm + If not None, key for aggregation data. + varm + If not None, key for aggregation data. + + Returns + ------- + Aggregated :class:`~anndata.AnnData`. + + Examples + -------- + + Calculating mean expression and number of nonzero entries per cluster: + + >>> import scanpy as sc, pandas as pd + >>> pbmc = sc.datasets.pbmc3k_processed().raw.to_adata() + >>> pbmc.shape + (2638, 13714) + >>> aggregated = sc.get.aggregate(pbmc, by="louvain", func=["mean", "count_nonzero"]) + >>> aggregated + AnnData object with n_obs × n_vars = 8 × 13714 + obs: 'louvain' + var: 'n_cells' + layers: 'mean', 'count_nonzero' + + We can group over multiple columns: + + >>> pbmc.obs["percent_mito_binned"] = pd.cut(pbmc.obs["percent_mito"], bins=5) + >>> sc.get.aggregate(pbmc, by=["louvain", "percent_mito_binned"], func=["mean", "count_nonzero"]) + AnnData object with n_obs × n_vars = 40 × 13714 + obs: 'louvain', 'percent_mito_binned' + var: 'n_cells' + layers: 'mean', 'count_nonzero' + + Note that this filters out any combination of groups that wasn't present in the original data. + """ + if axis is None: + axis = 1 if varm else 0 + axis, axis_name = _resolve_axis(axis) + if mask is not None: + mask = _check_mask(adata, mask, axis_name) + data = adata.X + if sum(p is not None for p in [varm, obsm, layer]) > 1: + raise TypeError("Please only provide one (or none) of varm, obsm, or layer") + + if varm is not None: + if axis != 1: + raise ValueError("varm can only be used when axis is 1") + data = adata.varm[varm] + elif obsm is not None: + if axis != 0: + raise ValueError("obsm can only be used when axis is 0") + data = adata.obsm[obsm] + elif layer is not None: + data = adata.layers[layer] + if axis == 1: + data = data.T + elif axis == 1: + # i.e., all of `varm`, `obsm`, `layers` are None so we use `X` which must be transposed + data = data.T + + dim_df = getattr(adata, axis_name) + categorical, new_label_df = _combine_categories(dim_df, by) + # Actual computation + layers = aggregate( + data, + by=categorical, + func=func, + mask=mask, + dof=dof, + ) + result = AnnData( + layers=layers, + obs=new_label_df, + var=getattr(adata, "var" if axis == 0 else "obs"), + ) + + if axis == 1: + return result.T + else: + return result + + +@aggregate.register(np.ndarray) +@aggregate.register(sparse.spmatrix) +def aggregate_array( + data, + by: pd.Categorical, + func: AggType | Iterable[AggType], + *, + mask: NDArray[np.bool_] | None = None, + dof: int = 1, +) -> dict[AggType, np.ndarray]: + groupby = Aggregate(groupby=by, data=data, mask=mask) + result = {} + + funcs = set([func] if isinstance(func, str) else func) + if unknown := funcs - set(get_args(AggType)): + raise ValueError(f"func {unknown} is not one of {get_args(AggType)}") + + if "sum" in funcs: # sum is calculated separately from the rest + agg = groupby.sum() + result["sum"] = agg + # here and below for count, if var is present, these can be calculate alongside var + if "mean" in funcs and "var" not in funcs: + agg = groupby.mean() + result["mean"] = agg + if "count_nonzero" in funcs: + result["count_nonzero"] = groupby.count_nonzero() + if "var" in funcs: + mean_, var_ = groupby.mean_var(dof) + result["var"] = var_ + if "mean" in funcs: + result["mean"] = mean_ + + return result + + +def _combine_categories( + label_df: pd.DataFrame, cols: Collection[str] | str +) -> tuple[pd.Categorical, pd.DataFrame]: + """ + Returns both the result categories and a dataframe labelling each row + """ + from itertools import product + + if isinstance(cols, str): + cols = [cols] + + df = pd.DataFrame( + {c: pd.Categorical(label_df[c]).remove_unused_categories() for c in cols}, + ) + n_categories = [len(df[c].cat.categories) for c in cols] + + # It's like np.concatenate([x for x in product(*[range(n) for n in n_categories])]) + code_combinations = np.indices(n_categories).reshape(len(n_categories), -1) + result_categories = pd.Index( + ["_".join(map(str, x)) for x in product(*[df[c].cat.categories for c in cols])] + ) + + # Dataframe with unique combination of categories for each row + new_label_df = pd.DataFrame( + { + c: pd.Categorical.from_codes(code_combinations[i], df[c].cat.categories) + for i, c in enumerate(cols) + }, + index=result_categories, + ) + + # Calculating result codes + factors = np.ones(len(cols) + 1, dtype=np.int32) # First factor needs to be 1 + np.cumsum(n_categories[::-1], out=factors[1:]) + factors = factors[:-1][::-1] + + code_array = np.zeros((len(cols), df.shape[0]), dtype=np.int32) + for i, c in enumerate(cols): + code_array[i] = df[c].cat.codes + code_array *= factors[:, None] + + result_categorical = pd.Categorical.from_codes( + code_array.sum(axis=0), categories=result_categories + ) + + # Filter unused categories + result_categorical = result_categorical.remove_unused_categories() + new_label_df = new_label_df.loc[result_categorical.categories] + + return result_categorical, new_label_df + + +def sparse_indicator( + categorical: pd.Categorical, + *, + mask: NDArray[np.bool_] | None = None, + weight: NDArray[np.floating] | None = None, +) -> sparse.coo_matrix: + if mask is not None and weight is None: + weight = mask.astype(np.float32) + elif mask is not None and weight is not None: + weight = mask * weight + elif mask is None and weight is None: + weight = np.broadcast_to(1.0, len(categorical)) + A = sparse.coo_matrix( + (weight, (categorical.codes, np.arange(len(categorical)))), + shape=(len(categorical.categories), len(categorical)), + ) + return A diff --git a/scanpy/tests/test_aggregated.py b/scanpy/tests/test_aggregated.py new file mode 100644 index 0000000000..4439f3e0eb --- /dev/null +++ b/scanpy/tests/test_aggregated.py @@ -0,0 +1,373 @@ +from __future__ import annotations + +import anndata as ad +import numpy as np +import pandas as pd +import pytest +from scipy.sparse import csr_matrix + +import scanpy as sc +from scanpy._utils import _resolve_axis +from scanpy.testing._helpers import assert_equal +from scanpy.testing._helpers.data import pbmc3k_processed +from scanpy.testing._pytest.params import ARRAY_TYPES_MEM + + +@pytest.fixture +def df_base(): + ax_base = ["A", "B"] + return pd.DataFrame(index=ax_base) + + +@pytest.fixture +def df_groupby(): + ax_groupby = [ + *["v0", "v1", "v2"], + *["w0", "w1"], + *["a1", "a2", "a3"], + *["b1", "b2"], + *["c1", "c2"], + "d0", + ] + + df_groupby = pd.DataFrame(index=pd.Index(ax_groupby, name="cell")) + df_groupby["key"] = pd.Categorical([c[0] for c in ax_groupby]) + df_groupby["key_superset"] = pd.Categorical([c[0] for c in ax_groupby]).map( + {"v": "v", "w": "v", "a": "a", "b": "a", "c": "a", "d": "a"} + ) + df_groupby["key_subset"] = pd.Categorical([c[1] for c in ax_groupby]) + df_groupby["weight"] = 2.0 + return df_groupby + + +@pytest.fixture +def X(): + data = [ + *[[0, -2], [1, 13], [2, 1]], # v + *[[3, 12], [4, 2]], # w + *[[5, 11], [6, 3], [7, 10]], # a + *[[8, 4], [9, 9]], # b + *[[10, 5], [11, 8]], # c + [12, 6], # d + ] + return np.array(data, dtype=np.float32) + + +def gen_adata(data_key, dim, df_base, df_groupby, X): + if (data_key == "varm" and dim == "obs") or (data_key == "obsm" and dim == "var"): + pytest.skip("invalid parameter combination") + + obs_df, var_df = (df_groupby, df_base) if dim == "obs" else (df_base, df_groupby) + data = X.T if dim == "var" and data_key != "varm" else X + if data_key != "X": + data_dict_sparse = {data_key: {"test": csr_matrix(data)}} + data_dict_dense = {data_key: {"test": data}} + else: + data_dict_sparse = {data_key: csr_matrix(data)} + data_dict_dense = {data_key: data} + + adata_sparse = ad.AnnData(obs=obs_df, var=var_df, **data_dict_sparse) + adata_dense = ad.AnnData(obs=obs_df, var=var_df, **data_dict_dense) + return adata_sparse, adata_dense + + +@pytest.mark.parametrize("axis", [0, 1]) +def test_mask(axis): + blobs = sc.datasets.blobs() + mask = blobs.obs["blobs"] == 0 + blobs.obs["mask_col"] = mask + if axis == 1: + blobs = blobs.T + by_name = sc.get.aggregate(blobs, "blobs", "sum", axis=axis, mask="mask_col") + by_value = sc.get.aggregate(blobs, "blobs", "sum", axis=axis, mask=mask) + + assert_equal(by_name, by_value) + + assert np.all(by_name["0"].layers["sum"] == 0) + + +@pytest.mark.parametrize("array_type", ARRAY_TYPES_MEM) +@pytest.mark.parametrize("metric", ["sum", "mean", "var", "count_nonzero"]) +def test_aggregate_vs_pandas(metric, array_type): + adata = pbmc3k_processed().raw.to_adata() + adata = adata[ + adata.obs["louvain"].isin(adata.obs["louvain"].cat.categories[:5]), :1_000 + ].copy() + adata.X = array_type(adata.X) + adata.obs["percent_mito_binned"] = pd.cut(adata.obs["percent_mito"], bins=5) + result = sc.get.aggregate(adata, ["louvain", "percent_mito_binned"], metric) + + if metric == "count_nonzero": + expected = ( + (adata.to_df() != 0) + .astype(np.float64) + .join(adata.obs[["louvain", "percent_mito_binned"]]) + .groupby(["louvain", "percent_mito_binned"], observed=True) + .agg("sum") + ) + else: + expected = ( + adata.to_df() + .astype(np.float64) + .join(adata.obs[["louvain", "percent_mito_binned"]]) + .groupby(["louvain", "percent_mito_binned"], observed=True) + .agg(metric) + ) + # TODO: figure out the axis names + expected.index = expected.index.to_frame().apply( + lambda x: "_".join(map(str, x)), axis=1 + ) + expected.index.name = None + expected.columns.name = None + + result_df = result.to_df(layer=metric) + result_df.index.name = None + result_df.columns.name = None + + pd.testing.assert_frame_equal(result_df, expected, check_dtype=False, atol=1e-5) + + +@pytest.mark.parametrize("array_type", ARRAY_TYPES_MEM) +@pytest.mark.parametrize("metric", ["sum", "mean", "var", "count_nonzero"]) +def test_aggregate_axis(array_type, metric): + adata = pbmc3k_processed().raw.to_adata() + adata = adata[ + adata.obs["louvain"].isin(adata.obs["louvain"].cat.categories[:5]), :1_000 + ].copy() + adata.X = array_type(adata.X) + expected = sc.get.aggregate(adata, ["louvain"], metric) + actual = sc.get.aggregate(adata.T, ["louvain"], metric, axis=1).T + + assert_equal(expected, actual) + + +def test_aggregate_entry(): + args = ("blobs", ["mean", "var", "count_nonzero"]) + + adata = sc.datasets.blobs() + X_result = sc.get.aggregate(adata, *args) + # layer adata + layer_adata = ad.AnnData( + obs=adata.obs, + var=adata.var, + layers={"test": adata.X.copy()}, + ) + layer_result = sc.get.aggregate(layer_adata, *args, layer="test") + obsm_adata = ad.AnnData( + obs=adata.obs, + var=adata.var, + obsm={"test": adata.X.copy()}, + ) + obsm_result = sc.get.aggregate(obsm_adata, *args, obsm="test") + varm_adata = ad.AnnData( + obs=adata.var, + var=adata.obs, + varm={"test": adata.X.copy()}, + ) + varm_result = sc.get.aggregate(varm_adata, *args, varm="test") + + X_result_min = X_result.copy() + del X_result_min.var + X_result_min.var_names = [str(x) for x in np.arange(X_result_min.n_vars)] + + assert_equal(X_result, layer_result) + assert_equal(X_result_min, obsm_result) + assert_equal(X_result.layers, obsm_result.layers) + assert_equal(X_result.layers, varm_result.T.layers) + + +def test_aggregate_incorrect_dim(): + adata = pbmc3k_processed().raw.to_adata() + + with pytest.raises(ValueError, match="was 'foo'"): + sc.get.aggregate(adata, ["louvain"], "sum", axis="foo") + + +@pytest.mark.parametrize("axis_name", ["obs", "var"]) +def test_aggregate_axis_specification(axis_name): + axis, axis_name = _resolve_axis(axis_name) + by = "blobs" if axis == 0 else "labels" + + adata = sc.datasets.blobs() + adata.var["labels"] = np.tile(["a", "b"], adata.shape[1])[: adata.shape[1]] + + agg_index = sc.get.aggregate(adata, by=by, func="mean", axis=axis) + agg_name = sc.get.aggregate(adata, by=by, func="mean", axis=axis_name) + + np.testing.assert_equal(agg_index.layers["mean"], agg_name.layers["mean"]) + + if axis_name == "obs": + agg_unspecified = sc.get.aggregate(adata, by=by, func="mean") + np.testing.assert_equal(agg_name.layers["mean"], agg_unspecified.layers["mean"]) + + +@pytest.mark.parametrize( + ("matrix", "df", "keys", "metrics", "expected"), + [ + pytest.param( + np.block( + [ + [np.ones((2, 2)), np.zeros((2, 2))], + [np.zeros((2, 2)), np.ones((2, 2))], + ] + ), + pd.DataFrame( + { + "a": ["a", "a", "b", "b"], + "b": ["c", "d", "d", "d"], + } + ), + ["a", "b"], + ["count_nonzero"], # , "sum", "mean"], + ad.AnnData( + obs=pd.DataFrame( + {"a": ["a", "a", "b"], "b": ["c", "d", "d"]}, + index=["a_c", "a_d", "b_d"], + ).astype("category"), + var=pd.DataFrame(index=[f"gene_{i}" for i in range(4)]), + layers={ + "count_nonzero": np.array( + [[1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 2, 2]] + ), + # "sum": np.array([[2, 0], [0, 2]]), + # "mean": np.array([[1, 0], [0, 1]]), + }, + ), + id="count_nonzero", + ), + pytest.param( + np.block( + [ + [np.ones((2, 2)), np.zeros((2, 2))], + [np.zeros((2, 2)), np.ones((2, 2))], + ] + ), + pd.DataFrame( + { + "a": ["a", "a", "b", "b"], + "b": ["c", "d", "d", "d"], + } + ), + ["a", "b"], + ["sum", "mean", "count_nonzero"], + ad.AnnData( + obs=pd.DataFrame( + {"a": ["a", "a", "b"], "b": ["c", "d", "d"]}, + index=["a_c", "a_d", "b_d"], + ).astype("category"), + var=pd.DataFrame(index=[f"gene_{i}" for i in range(4)]), + layers={ + "sum": np.array([[1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 2, 2]]), + "mean": np.array([[1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 1, 1]]), + "count_nonzero": np.array( + [[1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 2, 2]] + ), + }, + ), + id="sum-mean-count_nonzero", + ), + pytest.param( + np.block( + [ + [np.ones((2, 2)), np.zeros((2, 2))], + [np.zeros((2, 2)), np.ones((2, 2))], + ] + ), + pd.DataFrame( + { + "a": ["a", "a", "b", "b"], + "b": ["c", "d", "d", "d"], + } + ), + ["a", "b"], + ["mean"], + ad.AnnData( + obs=pd.DataFrame( + {"a": ["a", "a", "b"], "b": ["c", "d", "d"]}, + index=["a_c", "a_d", "b_d"], + ).astype("category"), + var=pd.DataFrame(index=[f"gene_{i}" for i in range(4)]), + layers={ + "mean": np.array([[1, 1, 0, 0], [1, 1, 0, 0], [0, 0, 1, 1]]), + }, + ), + id="mean", + ), + ], +) +def test_aggregate_examples(matrix, df, keys, metrics, expected): + adata = ad.AnnData( + X=matrix, + obs=df, + var=pd.DataFrame(index=[f"gene_{i}" for i in range(matrix.shape[1])]), + ) + result = sc.get.aggregate(adata, by=keys, func=metrics) + + print(result) + print(expected) + + assert_equal(expected, result) + + +@pytest.mark.parametrize( + ("label_cols", "cols", "expected"), + [ + pytest.param( + dict( + a=pd.Categorical(["a", "b", "c"]), + b=pd.Categorical(["d", "d", "f"]), + ), + ["a", "b"], + pd.Categorical(["a_d", "b_d", "c_f"]), + id="two_of_two", + ), + pytest.param( + dict( + a=pd.Categorical(["a", "b", "c"]), + b=pd.Categorical(["d", "d", "f"]), + c=pd.Categorical(["g", "h", "h"]), + ), + ["a", "b", "c"], + pd.Categorical(["a_d_g", "b_d_h", "c_f_h"]), + id="three_of_three", + ), + pytest.param( + dict( + a=pd.Categorical(["a", "b", "c"]), + b=pd.Categorical(["d", "d", "f"]), + c=pd.Categorical(["g", "h", "h"]), + ), + ["a", "c"], + pd.Categorical(["a_g", "b_h", "c_h"]), + id="two_of_three-1", + ), + pytest.param( + dict( + a=pd.Categorical(["a", "b", "c"]), + b=pd.Categorical(["d", "d", "f"]), + c=pd.Categorical(["g", "h", "h"]), + ), + ["b", "c"], + pd.Categorical(["d_g", "d_h", "f_h"]), + id="two_of_three-2", + ), + ], +) +def test_combine_categories(label_cols, cols, expected): + from scanpy.get._aggregated import _combine_categories + + label_df = pd.DataFrame(label_cols) + result, result_label_df = _combine_categories(label_df, cols) + + assert isinstance(result, pd.Categorical) + + pd.testing.assert_extension_array_equal(result, expected) + + pd.testing.assert_index_equal( + pd.Index(result), result_label_df.index.astype("category") + ) + + reconstructed_df = pd.DataFrame( + [x.split("_") for x in result], columns=cols, index=result.astype(str) + ).astype("category") + pd.testing.assert_frame_equal(reconstructed_df, result_label_df) From d27ee7fad77c3691db2be932a254446f79f2c49c Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Thu, 22 Feb 2024 05:24:21 +1100 Subject: [PATCH 23/54] Fix coverage ci (#2874) * Fix coverage ci * Fix aggregate tests * Fix usage of pca(mask=...) * use pytest_plugins var * Cleanup --- .azure-pipelines.yml | 9 ++++----- pyproject.toml | 2 +- scanpy/preprocessing/_docs.py | 2 +- scanpy/tests/conftest.py | 2 ++ scanpy/tests/test_aggregated.py | 9 ++++++++- scanpy/tests/test_pca.py | 2 +- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml index 9e72bd321d..cf8946a51b 100644 --- a/.azure-pipelines.yml +++ b/.azure-pipelines.yml @@ -52,21 +52,21 @@ jobs: - script: | python -m pip install --upgrade pip - pip install wheel coverage + pip install wheel pip install .[dev,$(TEST_EXTRA)] displayName: 'Install dependencies' condition: eq(variables['DEPENDENCIES_VERSION'], 'latest') - script: | python -m pip install --pre --upgrade pip - pip install --pre wheel coverage + pip install --pre wheel pip install --pre .[dev,$(TEST_EXTRA)] pip install -v "anndata[dev,test] @ git+https://github.com/scverse/anndata" displayName: 'Install dependencies release candidates' condition: eq(variables['DEPENDENCIES_VERSION'], 'pre-release') - script: | - python -m pip install pip wheel tomli packaging pytest-cov + python -m pip install pip wheel tomli packaging pip install `python3 ci/scripts/min-deps.py pyproject.toml --extra dev test` pip install --no-deps . displayName: 'Install dependencies minimum version' @@ -81,8 +81,7 @@ jobs: condition: eq(variables['TEST_TYPE'], 'standard') - script: | - coverage run -m pytest - coverage xml + pytest --cov --cov-report=xml --cov-context=test displayName: 'PyTest (coverage)' condition: eq(variables['TEST_TYPE'], 'coverage') diff --git a/pyproject.toml b/pyproject.toml index 9046317d07..775273f55c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -87,6 +87,7 @@ test-min = [ "pytest>=7.4.2", "pytest-nunit", "pytest-mock", + "pytest-cov", "profimp", ] test = [ @@ -159,7 +160,6 @@ addopts = [ "--import-mode=importlib", "--strict-markers", "--doctest-modules", - "-pscanpy.testing._pytest", ] testpaths = ["scanpy"] norecursedirs = ["scanpy/tests/_images"] diff --git a/scanpy/preprocessing/_docs.py b/scanpy/preprocessing/_docs.py index b46a5d48ff..3c13e84afb 100644 --- a/scanpy/preprocessing/_docs.py +++ b/scanpy/preprocessing/_docs.py @@ -26,7 +26,7 @@ By default uses them if they have been determined beforehand. .. deprecated:: 1.10.0 - Use `mask` instead + Use `mask_var` instead """ doc_obs_qc_args = """\ diff --git a/scanpy/tests/conftest.py b/scanpy/tests/conftest.py index a3dcf69d75..5c96484f4e 100644 --- a/scanpy/tests/conftest.py +++ b/scanpy/tests/conftest.py @@ -7,6 +7,8 @@ import pytest +pytest_plugins = ["scanpy.testing._pytest"] + # just import for the IMPORTED check import scanpy as _sc # noqa: F401 diff --git a/scanpy/tests/test_aggregated.py b/scanpy/tests/test_aggregated.py index 4439f3e0eb..0b3e14b163 100644 --- a/scanpy/tests/test_aggregated.py +++ b/scanpy/tests/test_aggregated.py @@ -4,6 +4,7 @@ import numpy as np import pandas as pd import pytest +from packaging.version import Version from scipy.sparse import csr_matrix import scanpy as sc @@ -113,7 +114,6 @@ def test_aggregate_vs_pandas(metric, array_type): .groupby(["louvain", "percent_mito_binned"], observed=True) .agg(metric) ) - # TODO: figure out the axis names expected.index = expected.index.to_frame().apply( lambda x: "_".join(map(str, x)), axis=1 ) @@ -124,6 +124,13 @@ def test_aggregate_vs_pandas(metric, array_type): result_df.index.name = None result_df.columns.name = None + if Version(pd.__version__) < Version("2"): + # Order of results returned by groupby changed in pandas 2 + assert expected.shape == result_df.shape + assert expected.index.isin(result_df.index).all() + + expected = expected.loc[result_df.index] + pd.testing.assert_frame_equal(result_df, expected, check_dtype=False, atol=1e-5) diff --git a/scanpy/tests/test_pca.py b/scanpy/tests/test_pca.py index 86e47ba18e..3150808ee1 100644 --- a/scanpy/tests/test_pca.py +++ b/scanpy/tests/test_pca.py @@ -382,7 +382,7 @@ def test_mask_order_warning(request): UserWarning, match="When using a mask parameter with anndata<0.9 on a dense array", ): - sc.pp.pca(adata, mask=mask) + sc.pp.pca(adata, mask_var=mask) def test_mask_defaults(array_type, float_dtype): From 21e6a7503a7ee2649ba7a63f2366ba4729bc9c79 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Wed, 21 Feb 2024 19:54:57 +0100 Subject: [PATCH 24/54] Bump umap to 0.5.5, remove most compat code (#2870) * Some minimal umap bumping * fix connectivity code * remove remaining dead code * simplify simplicial_set_embedding * relnotes * fixup * lower bounds slightly --------- Co-authored-by: Isaac Virshup --- docs/release-notes/1.10.0.md | 1 + pyproject.toml | 2 +- scanpy/_utils/__init__.py | 13 ---- scanpy/neighbors/_connectivity.py | 6 +- scanpy/tools/_ingest.py | 113 ++---------------------------- scanpy/tools/_umap.py | 51 +++++--------- 6 files changed, 28 insertions(+), 158 deletions(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 0266b2bdf9..3af9f84474 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -55,3 +55,4 @@ * Dropped support for Python 3.8. [More details here](https://numpy.org/neps/nep-0029-deprecation_policy.html). {pr}`2695` {smaller}`P Angerer` * Deprecated specifying large numbers of function parameters by position as opposed to by name/keyword in all public APIs. e.g. prefer `sc.tl.umap(adata, min_dist=0.1, spread=0.8)` over `sc.tl.umap(adata, 0.1, 0.8)` {pr}`2702` {smaller}`P Angerer` +* Dropped support for `umap<0.5` for performance reasons. {pr}`2870` {smaller}`P Angerer` diff --git a/pyproject.toml b/pyproject.toml index 775273f55c..3acaed64b3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,7 +63,7 @@ dependencies = [ "natsort", "joblib", "numba>=0.56", - "umap-learn>=0.3.10", + "umap-learn>=0.5,!=0.5.0", "pynndescent>=0.5", "packaging>=21.3", "session-info", diff --git a/scanpy/_utils/__init__.py b/scanpy/_utils/__init__.py index 3ef16300aa..e182ab3840 100644 --- a/scanpy/_utils/__init__.py +++ b/scanpy/_utils/__init__.py @@ -84,10 +84,6 @@ def set_igraph_random_state(random_state: int): def check_versions(): - from .._compat import pkg_version - - umap_version = pkg_version("umap-learn") - if version.parse(anndata_version) < version.parse("0.6.10"): from .. import __version__ @@ -96,15 +92,6 @@ def check_versions(): f"not {anndata_version}.\nRun `pip install anndata -U --no-deps`." ) - if umap_version < version.parse("0.3.0"): - from . import __version__ - - # make this a warning, not an error - # it might be useful for people to still be able to run it - logg.warning( - f"Scanpy {__version__} needs umap " f"version >=0.3.0, not {umap_version}." - ) - def getdoc(c_or_f: Callable | type) -> str | None: if getattr(c_or_f, "__doc__", None) is None: diff --git a/scanpy/neighbors/_connectivity.py b/scanpy/neighbors/_connectivity.py index f6788d33d2..adbde723f7 100644 --- a/scanpy/neighbors/_connectivity.py +++ b/scanpy/neighbors/_connectivity.py @@ -123,7 +123,7 @@ def umap( from umap.umap_ import fuzzy_simplicial_set X = coo_matrix(([], ([], [])), shape=(n_obs, 1)) - connectivities = fuzzy_simplicial_set( + connectivities, _sigmas, _rhos = fuzzy_simplicial_set( X, n_neighbors, None, @@ -134,8 +134,4 @@ def umap( local_connectivity=local_connectivity, ) - if isinstance(connectivities, tuple): - # In umap-learn 0.4, this returns (result, sigmas, rhos) - connectivities = connectivities[0] - return connectivities.tocsr() diff --git a/scanpy/tools/_ingest.py b/scanpy/tools/_ingest.py index 4c8528180b..fb36b7a913 100644 --- a/scanpy/tools/_ingest.py +++ b/scanpy/tools/_ingest.py @@ -222,12 +222,9 @@ class Ingest: """ def _init_umap(self, adata): - import umap as u + from umap import UMAP - if not self._use_pynndescent: - u.umap_._HAVE_PYNNDESCENT = False - - self._umap = u.UMAP( + self._umap = UMAP( metric=self._metric, random_state=adata.uns["umap"]["params"].get("random_state", 0), ) @@ -246,79 +243,16 @@ def _init_umap(self, adata): self._umap._n_neighbors = self._n_neighbors self._umap.n_neighbors = self._n_neighbors - if not self._use_pynndescent: - if self._random_init is not None or self._tree_init is not None: - self._umap._random_init = self._random_init - self._umap._tree_init = self._tree_init - self._umap._search = self._search - - if self._dist_func is not None: - self._umap._input_distance_func = self._dist_func - - self._umap._rp_forest = self._rp_forest - - self._umap._search_graph = self._search_graph - else: - self._umap._knn_search_index = self._nnd_idx + self._umap._knn_search_index = self._nnd_idx self._umap._a = adata.uns["umap"]["params"]["a"] self._umap._b = adata.uns["umap"]["params"]["b"] self._umap._input_hash = None - def _init_dist_search(self, dist_args): - from functools import partial - - from umap.distances import named_distances - from umap.nndescent import initialise_search - - self._random_init = None - self._tree_init = None - - self._initialise_search = None - self._search = None - - self._dist_func = None - - dist_func = named_distances[self._metric] - - if pkg_version("umap-learn") < version.parse("0.4.0"): - from umap.nndescent import ( - make_initialisations, - make_initialized_nnd_search, - ) - - self._random_init, self._tree_init = make_initialisations( - dist_func, dist_args - ) - _initialise_search = partial( - initialise_search, - init_from_random=self._random_init, - init_from_tree=self._tree_init, - ) - _search = make_initialized_nnd_search(dist_func, dist_args) - - else: - from numba import njit - from umap.nndescent import initialized_nnd_search - - @njit - def partial_dist_func(x, y): - return dist_func(x, y, *dist_args) - - _initialise_search = partial(initialise_search, dist=partial_dist_func) - _search = partial(initialized_nnd_search, dist=partial_dist_func) - - self._dist_func = partial_dist_func - - self._initialise_search = _initialise_search - self._search = _search - def _init_pynndescent(self, distances): from pynndescent import NNDescent - self._use_pynndescent = True - first_col = np.arange(distances.shape[0])[:, None] init_indices = np.hstack((first_col, np.stack(distances.tolil().rows))) @@ -365,27 +299,13 @@ def _init_neighbors(self, adata, neighbors_key): if "metric_kwds" in neighbors["params"]: self._metric_kwds = neighbors["params"]["metric_kwds"] - dist_args = tuple(self._metric_kwds.values()) else: self._metric_kwds = {} - dist_args = () self._metric = neighbors["params"]["metric"] - if pkg_version("umap-learn") < version.parse("0.5.0"): - self._init_dist_search(dist_args) - - search_graph = neighbors["distances"].copy() - search_graph.data = (search_graph.data > 0).astype(np.int8) - self._search_graph = search_graph.maximum(search_graph.transpose()) - - if "rp_forest" in neighbors: - self._rp_forest = _rp_forest_generate(neighbors["rp_forest"]) - else: - self._rp_forest = None - else: - self._neigh_random_state = neighbors["params"].get("random_state", 0) - self._init_pynndescent(neighbors["distances"]) + self._neigh_random_state = neighbors["params"].get("random_state", 0) + self._init_pynndescent(neighbors["distances"]) def _init_pca(self, adata): self._pca_centered = adata.uns["pca"]["params"]["zero_center"] @@ -411,9 +331,6 @@ def __init__(self, adata: AnnData, neighbors_key: str | None = None): self._adata_ref = adata self._adata_new = None - # only use with umap > 0.5.0 - self._use_pynndescent = False - if "pca" in adata.uns: self._init_pca(adata) @@ -498,29 +415,13 @@ def neighbors(self, k=None, queue_size=5, epsilon=0.1, random_state=0): random_state = check_random_state(random_state) rng_state = random_state.randint(INT32_MIN, INT32_MAX, 3).astype(np.int64) - train = self._rep test = self._obsm["rep"] if k is None: k = self._n_neighbors - if self._use_pynndescent: - self._nnd_idx.search_rng_state = rng_state - - self._indices, self._distances = self._nnd_idx.query(test, k, epsilon) - - else: - from umap.utils import deheap_sort - - init = self._initialise_search( - self._rp_forest, train, test, int(k * queue_size), rng_state=rng_state - ) - - result = self._search( - train, self._search_graph.indptr, self._search_graph.indices, init, test - ) - indices, dists = deheap_sort(result) - self._indices, self._distances = indices[:, :k], dists[:, :k] + self._nnd_idx.search_rng_state = rng_state + self._indices, self._distances = self._nnd_idx.query(test, k, epsilon) def _umap_transform(self): return self._umap.transform(self._obsm["rep"]) diff --git a/scanpy/tools/_umap.py b/scanpy/tools/_umap.py index 6b18438e1b..8105c3abd8 100644 --- a/scanpy/tools/_umap.py +++ b/scanpy/tools/_umap.py @@ -4,7 +4,6 @@ from typing import TYPE_CHECKING, Literal import numpy as np -from packaging import version from sklearn.utils import check_array, check_random_state from .. import logging as logg @@ -165,29 +164,12 @@ def umap( f'.obsp["{neighbors["connectivities_key"]}"] have not been computed using umap' ) - # Compat for umap 0.4 -> 0.5 with warnings.catch_warnings(): # umap 0.5.0 warnings.filterwarnings("ignore", message=r"Tensorflow not installed") import umap - if version.parse(umap.__version__) >= version.parse("0.5.0"): - - def simplicial_set_embedding(*args, **kwargs): - from umap.umap_ import simplicial_set_embedding - - X_umap, _ = simplicial_set_embedding( - *args, - densmap=False, - densmap_kwds={}, - output_dens=False, - **kwargs, - ) - return X_umap - - else: - from umap.umap_ import simplicial_set_embedding - from umap.umap_ import find_ab_params + from umap.umap_ import find_ab_params, simplicial_set_embedding if a is None or b is None: a, b = find_ab_params(spread, min_dist) @@ -222,20 +204,23 @@ def simplicial_set_embedding(*args, **kwargs): # for the init condition in the UMAP embedding default_epochs = 500 if neighbors["connectivities"].shape[0] <= 10000 else 200 n_epochs = default_epochs if maxiter is None else maxiter - X_umap = simplicial_set_embedding( - X, - neighbors["connectivities"].tocoo(), - n_components, - alpha, - a, - b, - gamma, - negative_sample_rate, - n_epochs, - init_coords, - random_state, - neigh_params.get("metric", "euclidean"), - neigh_params.get("metric_kwds", {}), + X_umap, _ = simplicial_set_embedding( + data=X, + graph=neighbors["connectivities"].tocoo(), + n_components=n_components, + initial_alpha=alpha, + a=a, + b=b, + gamma=gamma, + negative_sample_rate=negative_sample_rate, + n_epochs=n_epochs, + init=init_coords, + random_state=random_state, + metric=neigh_params.get("metric", "euclidean"), + metric_kwds=neigh_params.get("metric_kwds", {}), + densmap=False, + densmap_kwds={}, + output_dens=False, verbose=settings.verbosity > 3, ) elif method == "rapids": From 4b77cf249c7ef404bea2b353fb86569a5eec4cd9 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Thu, 22 Feb 2024 07:26:44 +1100 Subject: [PATCH 25/54] re-order and rephrase some release notes (#2872) --- docs/release-notes/1.10.0.md | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 3af9f84474..345647285f 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -3,38 +3,35 @@ ```{rubric} Features ``` +* {func}`~scanpy.pp.scrublet` and {func}`~scanpy.pp.scrublet_simulate_doublets` were moved from {mod}`scanpy.external.pp` to {mod}`scanpy.pp`. The `scrublet` implementation is now maintained as part of scanpy {pr}`2703` {smaller}`P Angerer` +* {func}`scanpy.pp.pca`, {func}`scanpy.pp.scale`, {func}`scanpy.pl.embedding`, and {func}`scanpy.experimental.pp.normalize_pearson_residuals_pca` now support a `mask` parameter {pr}`2272` {smaller}`C Bright, T Marcella, & P Angerer` +* Enhanced dask support for some internal utilities, paving the way for more extensive dask support {pr}`2696` {smaller}`P Angerer` +* {func}`scanpy.pp.highly_variable_genes` supports dask for the default `seurat` and `cell_ranger` flavors {pr}`2809` {smaller}`P Angerer` +* New function {func}`scanpy.get.aggregate` which allows grouped aggregations over your data. Useful for pseudobulking! {pr}`2590` {smaller}`Isaac Virshup` {smaller}`Ilan Gold` {smaller}`Jon Bloom` +* {func}`scanpy.pp.neighbors` now has a `transformer` argument allowing the use of different ANN/ KNN libraries {pr}`2536` {smaller}`P Angerer` +* {func}`scanpy.experimental.pp.highly_variable_genes` using `flavor='pearson_residuals'` now uses numba for variance computation and is faster {pr}`2612` {smaller}`S Dicks & P Angerer` +* {func}`scanpy.tl.leiden` now offers `igraph`'s implementation of the leiden algorithm via via `flavor` when set to `igraph`. `leidenalg`'s implementation is still default, but discouraged. {pr}`2815` {smaller}`I Gold` +* {func}`scanpy.pp.highly_variable_genes` has new flavor `seurat_v3_paper` that is in its implementation consistent with the paper description in Stuart et al 2018. {pr}`2792` {smaller}`E Roellin` * {func}`scanpy.datasets.blobs` now accepts a `random_state` argument {pr}`2683` {smaller}`E Roellin` * {func}`scanpy.pp.pca` and {func}`scanpy.pp.regress_out` now accept a layer argument {pr}`2588` {smaller}`S Dicks` * {func}`scanpy.pp.subsample` with `copy=True` can now be called in backed mode {pr}`2624` {smaller}`E Roellin` -* {func}`scanpy.pp.neighbors` now has a `transformer` argument allowing for more flexibility {pr}`2536` {smaller}`P Angerer` -* {func}`scanpy.experimental.pp.highly_variable_genes` using `flavor='pearson_residuals'` - now uses numba for variance computation {pr}`2612` {smaller}`S Dicks & P Angerer` * {func}`scanpy.external.pp.harmony_integrate` now runs with 64 bit floats improving reproducibility {pr}`2655` {smaller}`S Dicks` -* {func}`~scanpy.pp.scrublet` and {func}`~scanpy.pp.scrublet_simulate_doublets` were moved from {mod}`scanpy.external.pp` to {mod}`scanpy.pp`. - The `scrublet` implementation is now maintained as part of scanpy {pr}`2703` {smaller}`P Angerer` -* Enhanced dask support for some internal utilities, paving the way for more extensive dask support {pr}`2696` {smaller}`P Angerer` -* {func}`scanpy.pp.pca`, {func}`scanpy.pp.scale`, {func}`scanpy.pl.embedding`, and {func}`scanpy.experimental.pp.normalize_pearson_residuals_pca` - now support a `mask` parameter {pr}`2272` {smaller}`C Bright, T Marcella, & P Angerer` -* New function {func}`scanpy.get.aggregate` which allows grouped aggregations over your data. Useful for pseudobulking! {pr}`2590` {smaller}`Isaac Virshup` {smaller}`Ilan Gold` {smaller}`Jon Bloom` * {func}`scanpy.tl.rank_genes_groups` no longer warns that it's default was changed from t-test_overestim_var to t-test {pr}`2798` {smaller}`L Heumos` -* {func}`scanpy.tl.leiden` now offers `igraph`'s implementation of the leiden algorithm via via `flavor` when set to `igraph`. `leidenalg`'s implementation is still default, but discouraged. {pr}`2815` {smaller}`I Gold` -* {func}`scanpy.pp.highly_variable_genes` has new flavor `seurat_v3_paper` that is in its implementation consistent with the paper description in Stuart et al 2018. {pr}`2792` {smaller}`E Roellin` -* {func}`scanpy.pp.highly_variable_genes` supports dask for the default `seurat` and `cell_ranger` flavors {pr}`2809` {smaller}`P Angerer` -* Auto conversion of strings to collections in `scanpy.pp.calculate_qc_metrics` {pr}`2859` {smaller}`N Teyssier` +* `scanpy.pp.calculate_qc_metrics` now allows `qc_vars` to be passed as a string {pr}`2859` {smaller}`N Teyssier` ```{rubric} Docs ``` + +* Re-add search-as-you-type, this time via `readthedocs-sphinx-search` {pr}`2805` {smaller}`P Angerer` * Fixed a lot of broken usage examples {pr}`2605` {smaller}`P Angerer` * Improved harmonization of return field of `sc.pp` and `sc.tl` functions {pr}`2742` {smaller}`E Roellin` -* Re-add search-as-you-type, this time via `readthedocs-sphinx-search` {pr}`2805` {smaller}`P Angerer` * Improved docs for `percent_top` argument of {func}`~scanpy.pp.calculate_qc_metrics` {pr}`2849` {smaller}`I Virshup` ```{rubric} Bug fixes ``` * Updated {func}`~scanpy.read_visium` such that it can read spaceranger 2.0 files {smaller}`L Lehner` -* Fix {func}`~scanpy.pp.normalize_total` {pr}`2466` {smaller}`P Angerer` -* Fix testing package build {pr}`2468` {smaller}`P Angerer` +* Fix {func}`~scanpy.pp.normalize_total` for dask {pr}`2466` {smaller}`P Angerer` * Fix setting `sc.settings.verbosity` in some cases {pr}`2605` {smaller}`P Angerer` * Fix all remaining pandas warnings {pr}`2789` {smaller}`P Angerer` * Fix some annoying plotting warnings around violin plots {pr}`2844` {smaller}`P Angerer` @@ -45,9 +42,7 @@ ``` * Scanpy is now tested against python 3.12 {pr}`2863` {smaller}`ivirshup` - -```{rubric} Ecosystem -``` +* Fix testing package build {pr}`2468` {smaller}`P Angerer` ```{rubric} Deprecations ``` From 48b495d983a2873083b823e9be5e98f6082ac88c Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Thu, 22 Feb 2024 23:58:27 +1100 Subject: [PATCH 26/54] note that it's an rc (#2876) * note that it's an rc * fix syntax --- docs/release-notes/1.10.0.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 345647285f..629c6f5d2b 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -1,4 +1,4 @@ -### 1.10.0 {small}`the future` +### 1.10.0rc1 {small}`2024-02-22` ```{rubric} Features ``` From 29a6e3eda38dfcc8c3da01ec5619cc5a2e06025f Mon Sep 17 00:00:00 2001 From: Philipp A Date: Fri, 23 Feb 2024 08:56:46 +0100 Subject: [PATCH 27/54] Fix pytest deprecation warning (#2879) Co-authored-by: Isaac Virshup --- docs/release-notes/1.10.0.md | 7 +++++++ scanpy/__init__.py | 12 +++++++----- scanpy/testing/_doctests.py | 16 +--------------- scanpy/testing/_pytest/__init__.py | 9 ++++----- scanpy/testing/_pytest/marks.py | 2 +- 5 files changed, 20 insertions(+), 26 deletions(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 629c6f5d2b..1b338fd5ed 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -1,3 +1,10 @@ +### 1.10.0rc2 {small}`2024-02-22` + +```{rubric} Bug fixes +``` + +* Fix pytest deprecation warning {pr}`2879` {smaller}`P Angerer` + ### 1.10.0rc1 {small}`2024-02-22` ```{rubric} Features diff --git a/scanpy/__init__.py b/scanpy/__init__.py index d6a2e46770..be2a10f5bf 100644 --- a/scanpy/__init__.py +++ b/scanpy/__init__.py @@ -1,6 +1,8 @@ """Single-Cell Analysis in Python.""" from __future__ import annotations +import sys + try: # See https://github.com/maresb/hatch-vcs-footgun-example from setuptools_scm import get_version @@ -21,6 +23,11 @@ # the actual API # (start with settings as several tools are using it) + +from ._settings import Verbosity, settings + +set_figure_params = settings.set_figure_params + from anndata import ( AnnData, concat, @@ -38,15 +45,10 @@ from . import plotting as pl from . import preprocessing as pp from . import tools as tl -from ._settings import Verbosity, settings from .neighbors import Neighbors from .readwrite import read, read_10x_h5, read_10x_mtx, read_visium, write -set_figure_params = settings.set_figure_params - # has to be done at the end, after everything has been imported -import sys - sys.modules.update({f"{__name__}.{m}": globals()[m] for m in ["tl", "pp", "pl"]}) from ._utils import annotate_doc_types diff --git a/scanpy/testing/_doctests.py b/scanpy/testing/_doctests.py index 9be5b3f227..6a339ab7f8 100644 --- a/scanpy/testing/_doctests.py +++ b/scanpy/testing/_doctests.py @@ -9,22 +9,8 @@ def doctest_needs(mod: str) -> Callable[[F], F]: """Mark function with doctest dependency.""" - try: - from ._pytest.marks import needs - except ImportError: - mark = None - else: - try: - mark = needs[mod] - except KeyError: - raise KeyError( - f"Unknown dependency {mod}. If it isn’t a typo, " - "please add it to `needs` enum in `scanpy.testing._pytests.marks`." - ) from None - def decorator(func: F) -> F: - if mark is not None: - func._doctest_needs = mark + func._doctest_needs = mod return func return decorator diff --git a/scanpy/testing/_pytest/__init__.py b/scanpy/testing/_pytest/__init__.py index ad42b8ec74..e864d31d3d 100644 --- a/scanpy/testing/_pytest/__init__.py +++ b/scanpy/testing/_pytest/__init__.py @@ -10,12 +10,11 @@ from ..._utils import _import_name from .fixtures import * # noqa: F403 +from .marks import needs if TYPE_CHECKING: from collections.abc import Generator, Iterable - from .marks import needs - # Defining it here because it’s autouse. @pytest.fixture(autouse=True) @@ -113,9 +112,9 @@ def _modify_doctests(request: pytest.FixtureRequest) -> None: request.getfixturevalue("_doctest_env") func = _import_name(request.node.name) - needs_marker: needs | None - if needs_marker := getattr(func, "_doctest_needs", None): - assert needs_marker.mark.name == "skipif" + needs_mod: str | None + if needs_mod := getattr(func, "_doctest_needs", None): + needs_marker = needs[needs_mod] if needs_marker.mark.args[0]: pytest.skip(reason=needs_marker.mark.kwargs["reason"]) skip_reason: str | None diff --git a/scanpy/testing/_pytest/marks.py b/scanpy/testing/_pytest/marks.py index e6fa85f936..dd6fda5db0 100644 --- a/scanpy/testing/_pytest/marks.py +++ b/scanpy/testing/_pytest/marks.py @@ -57,4 +57,4 @@ def __init__(self, mod: str) -> None: if self._name_.casefold() != mod.casefold().replace("-", "_"): reason = f"{reason} (`pip install {mod}`)" dec = pytest.mark.skipif(not find_spec(self._name_), reason=reason) - super().__init__(dec.mark) + super().__init__(dec.mark, _ispytest=True) From d15f4e7d8aade4fa65e25e0db71c764b6d3ac376 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Fri, 23 Feb 2024 20:09:31 +1100 Subject: [PATCH 28/54] Allow blank issues (#2868) --- .github/ISSUE_TEMPLATE/config.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index a0c4b12e00..af69628eea 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,8 @@ -blank_issues_enabled: false +blank_issues_enabled: true contact_links: - name: Scanpy Community Forum url: https://discourse.scverse.org/ about: If you have questions about “How to do X”, please ask them here. + - name: Blank issue + url: https://github.com/scverse/scanpy/issues/new + about: For things that don't quite fit elsewhere. Please note that other templates should be used in most cases – this is mainly for use by the developers. From d31a150e89d80ac05642942b99b36735a689fb3f Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Sat, 24 Feb 2024 01:52:05 +1100 Subject: [PATCH 29/54] Even more subtle blank issues (#2883) As noted by @ilan-gold, just setting `blank_issues = true` makes a little link visible: --- .github/ISSUE_TEMPLATE/config.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index af69628eea..1505f196f5 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -3,6 +3,3 @@ contact_links: - name: Scanpy Community Forum url: https://discourse.scverse.org/ about: If you have questions about “How to do X”, please ask them here. - - name: Blank issue - url: https://github.com/scverse/scanpy/issues/new - about: For things that don't quite fit elsewhere. Please note that other templates should be used in most cases – this is mainly for use by the developers. From 886d4e778d58d80aac5c7555a0694ab731b6c864 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Sat, 24 Feb 2024 02:08:05 +1100 Subject: [PATCH 30/54] start 0.11 release notes (#2877) --- docs/release-notes/1.11.0.md | 13 +++++++++++++ docs/release-notes/index.md | 5 +++++ 2 files changed, 18 insertions(+) create mode 100644 docs/release-notes/1.11.0.md diff --git a/docs/release-notes/1.11.0.md b/docs/release-notes/1.11.0.md new file mode 100644 index 0000000000..fb6c33a443 --- /dev/null +++ b/docs/release-notes/1.11.0.md @@ -0,0 +1,13 @@ +### 1.11.0 {small}`the future` + +```{rubric} Features +``` + +```{rubric} Docs +``` + +```{rubric} Bug fixes +``` + +```{rubric} Deprecations +``` diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index 72160d4eac..0dd4e2a020 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -2,6 +2,11 @@ # Release notes +## Version 1.11 + +```{include} /release-notes/1.11.0.md +``` + ## Version 1.10 ```{include} /release-notes/1.10.0.md From 91ea0fbb03392795d1506d297d4b4847c646db04 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Sat, 24 Feb 2024 02:23:55 +1100 Subject: [PATCH 31/54] master-to-main (#2884) Co-authored-by: Philipp A --- .azure-pipelines.yml | 2 +- .github/ISSUE_TEMPLATE/bug-report.yml | 2 +- .github/workflows/check-pr.yml | 1 - .pre-commit-config.yaml | 2 +- README.md | 2 +- docs/dev/code.md | 2 +- docs/dev/getting-set-up.md | 8 ++++---- docs/dev/release.md | 2 +- docs/dev/testing.md | 2 +- docs/extensions/git_ref.py | 2 +- scanpy/tools/_rank_genes_groups.py | 2 +- 11 files changed, 13 insertions(+), 14 deletions(-) diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml index cf8946a51b..00c7dc2f14 100644 --- a/.azure-pipelines.yml +++ b/.azure-pipelines.yml @@ -1,5 +1,5 @@ trigger: -- master +- main - "*.*.x" variables: diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 38fa7a0d4b..7e94695e47 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -14,7 +14,7 @@ body: required: true - label: I have confirmed this bug exists on the latest version of scanpy. required: true - - label: (optional) I have confirmed this bug exists on the master branch of scanpy. + - label: (optional) I have confirmed this bug exists on the main branch of scanpy. required: false - type: markdown attributes: diff --git a/.github/workflows/check-pr.yml b/.github/workflows/check-pr.yml index 21a1f361df..e74c041c8b 100644 --- a/.github/workflows/check-pr.yml +++ b/.github/workflows/check-pr.yml @@ -4,7 +4,6 @@ on: pull_request: branches: - main - - master types: # milestone changes - milestoned diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 00f1497b0e..709cc29b1a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -26,7 +26,7 @@ repos: - id: check-merge-conflict - id: detect-private-key - id: no-commit-to-branch - args: ["--branch=master", "--branch=main"] + args: ["--branch=main"] ci: autofix_prs: false diff --git a/README.md b/README.md index 219f51a5ca..53c4c35706 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Downloads](https://static.pepy.tech/badge/scanpy)](https://pepy.tech/project/scanpy) [![Conda](https://img.shields.io/conda/dn/conda-forge/scanpy?logo=Anaconda)](https://anaconda.org/conda-forge/scanpy) [![Docs](https://readthedocs.com/projects/icb-scanpy/badge/?version=latest)](https://scanpy.readthedocs.io) -[![Build Status](https://dev.azure.com/scverse/scanpy/_apis/build/status/theislab.scanpy?branchName=master)](https://dev.azure.com/scverse/scanpy/_build) +[![Build Status](https://dev.azure.com/scverse/scanpy/_apis/build/status/theislab.scanpy?branchName=main)](https://dev.azure.com/scverse/scanpy/_build) [![Discourse topics](https://img.shields.io/discourse/posts?color=yellow&logo=discourse&server=https%3A%2F%2Fdiscourse.scverse.org)](https://discourse.scverse.org/) [![Chat](https://img.shields.io/badge/zulip-join_chat-%2367b08f.svg)](https://scverse.zulipchat.com) [![Powered by NumFOCUS](https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A)](https://numfocus.org/) diff --git a/docs/dev/code.md b/docs/dev/code.md index 61fffb31cb..06c267951b 100644 --- a/docs/dev/code.md +++ b/docs/dev/code.md @@ -20,5 +20,5 @@ We ignore a couple of flake8 checks which are documented in the .flake8 file in To learn how to ignore checks per line please read [flake8 violations](https://flake8.pycqa.org/en/latest/user/violations.html). Additionally, we use Scanpy’s -[EditorConfig](https://github.com/scverse/scanpy/blob/master/.editorconfig), +[EditorConfig](https://github.com/scverse/scanpy/blob/main/.editorconfig), so using an editor/IDE with support for both is helpful. diff --git a/docs/dev/getting-set-up.md b/docs/dev/getting-set-up.md index b7124303f5..750af53e91 100644 --- a/docs/dev/getting-set-up.md +++ b/docs/dev/getting-set-up.md @@ -21,7 +21,7 @@ This is very straight forward if you're using [GitHub's CLI](https://cli.github. $ gh repo fork scverse/scanpy --clone --remote ``` -This will fork the repo to your github account, create a clone of the repo on your current machine, add our repository as a remote, and set the `master` development branch to track our repository. +This will fork the repo to your github account, create a clone of the repo on your current machine, add our repository as a remote, and set the `main` development branch to track our repository. To do this manually, first make a fork of the repository by clicking the "fork" button on our main github package. Then, on your machine, run: @@ -32,7 +32,7 @@ git clone https://github.com/{your-username}/scanpy.git cd scanpy # Add our repository as a remote git remote add upstream https://github.com/scverse/scanpy.git -# git branch --set-upstream-to "upstream/master" +# git branch --set-upstream-to "upstream/main" ``` ### `pre-commit` @@ -61,11 +61,11 @@ If you choose not to run the hooks on each commit, you can run them manually wit ### Creating a branch for your feature All development should occur in branches dedicated to the particular work being done. -Additionally, unless you are a maintainer, all changes should be directed at the `master` branch. +Additionally, unless you are a maintainer, all changes should be directed at the `main` branch. You can create a branch with: ```shell -git checkout master # Starting from the master branch +git checkout main # Starting from the main branch git pull # Syncing with the repo git checkout -b {your-branch-name} # Making and changing to the new branch ``` diff --git a/docs/dev/release.md b/docs/dev/release.md index def899ac67..f4bcb528a6 100644 --- a/docs/dev/release.md +++ b/docs/dev/release.md @@ -67,4 +67,4 @@ If you want to replicate the process more exactly, make sure you are careful, and create a version tag before building (make sure you delete it after uploading to TestPyPI!). [hatch-build]: https://hatch.pypa.io/latest/config/build/ -[publish workflow]: https://github.com/scverse/scanpy/tree/master/.github/workflows/publish.yml +[publish workflow]: https://github.com/scverse/scanpy/tree/main/.github/workflows/publish.yml diff --git a/docs/dev/testing.md b/docs/dev/testing.md index e0297cff32..46ab9f129c 100644 --- a/docs/dev/testing.md +++ b/docs/dev/testing.md @@ -21,7 +21,7 @@ It can take a while to run the whole test suite. There are a few ways to cut dow ## Writing tests -You can refer to the [existing test suite](https://github.com/scverse/scanpy/tree/master/scanpy/tests) for examples. +You can refer to the [existing test suite](https://github.com/scverse/scanpy/tree/main/scanpy/tests) for examples. If you haven't written tests before, Software Carpentry has an [in-depth guide](https://katyhuff.github.io/2016-07-11-scipy/testing/01-basics.html) on the topic. We highly recommend using [Test Driven Development](https://en.wikipedia.org/wiki/Test-driven_development) when contributing code. diff --git a/docs/extensions/git_ref.py b/docs/extensions/git_ref.py index 1f57de7a25..dd61f0cce0 100644 --- a/docs/extensions/git_ref.py +++ b/docs/extensions/git_ref.py @@ -32,7 +32,7 @@ def get() -> str | None: try: git_ref = git("rev-parse", "HEAD") except Exception: - git_ref = "master" + git_ref = "main" return git_ref diff --git a/scanpy/tools/_rank_genes_groups.py b/scanpy/tools/_rank_genes_groups.py index ba9196a842..8e133434bf 100644 --- a/scanpy/tools/_rank_genes_groups.py +++ b/scanpy/tools/_rank_genes_groups.py @@ -582,7 +582,7 @@ def rank_genes_groups( Notes ----- There are slight inconsistencies depending on whether sparse - or dense data are passed. See `here `__. + or dense data are passed. See `here `__. Examples -------- From 14555ba48537995acaa381b8b6ad5fc41e612510 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Mon, 26 Feb 2024 11:36:44 +0100 Subject: [PATCH 32/54] Use index in score_genes (#2890) --- scanpy/tests/test_score_genes.py | 4 +-- scanpy/tools/_score_genes.py | 50 ++++++++++++-------------------- 2 files changed, 21 insertions(+), 33 deletions(-) diff --git a/scanpy/tests/test_score_genes.py b/scanpy/tests/test_score_genes.py index cb44e46dc9..23bd934e78 100644 --- a/scanpy/tests/test_score_genes.py +++ b/scanpy/tests/test_score_genes.py @@ -66,8 +66,8 @@ def test_score_with_reference(): sc.tl.score_genes(adata, gene_list=adata.var_names[:100], score_name="Test") with Path(HERE, "score_genes_reference_paul2015.pkl").open("rb") as file: reference = pickle.load(file) - # np.testing.assert_allclose(reference, adata.obs.Test.values) - np.testing.assert_array_equal(reference, adata.obs.Test.values) + # np.testing.assert_allclose(reference, adata.obs["Test"].to_numpy()) + np.testing.assert_array_equal(reference, adata.obs["Test"].to_numpy()) def test_add_score(): diff --git a/scanpy/tools/_score_genes.py b/scanpy/tools/_score_genes.py index 3e31f0cc66..307a162b12 100644 --- a/scanpy/tools/_score_genes.py +++ b/scanpy/tools/_score_genes.py @@ -51,10 +51,10 @@ def _sparse_nanmean(X, axis): ) def score_genes( adata: AnnData, - gene_list: Sequence[str], + gene_list: Sequence[str] | pd.Index[str], *, ctrl_size: int = 50, - gene_pool: Sequence[str] | None = None, + gene_pool: Sequence[str] | pd.Index[str] | None = None, n_bins: int = 25, score_name: str = "score", random_state: AnyRandom = 0, @@ -114,26 +114,20 @@ def score_genes( if random_state is not None: np.random.seed(random_state) - gene_list_in_var = [] var_names = adata.raw.var_names if use_raw else adata.var_names - genes_to_ignore = [] - for gene in gene_list: - if gene in var_names: - gene_list_in_var.append(gene) - else: - genes_to_ignore.append(gene) + gene_list = pd.Index([gene_list] if isinstance(gene_list, str) else gene_list) + genes_to_ignore = gene_list.difference(var_names, sort=False) # first get missing + gene_list = gene_list.intersection(var_names) # then restrict to present if len(genes_to_ignore) > 0: logg.warning(f"genes are not in var_names and ignored: {genes_to_ignore}") - gene_list = set(gene_list_in_var) - if len(gene_list) == 0: raise ValueError("No valid genes were passed for scoring.") if gene_pool is None: - gene_pool = list(var_names) + gene_pool = pd.Index(var_names, dtype="string") else: - gene_pool = [x for x in gene_pool if x in var_names] - if not gene_pool: + gene_pool = pd.Index(gene_pool, dtype="string").intersection(var_names) + if len(gene_pool) == 0: raise ValueError("No valid genes were passed for reference set.") # Trying here to match the Seurat approach in scoring cells. @@ -144,34 +138,28 @@ def score_genes( _adata_subset = ( _adata[:, gene_pool] if len(gene_pool) < len(_adata.var_names) else _adata ) + # average expression of genes if issparse(_adata_subset.X): obs_avg = pd.Series( np.array(_sparse_nanmean(_adata_subset.X, axis=0)).flatten(), index=gene_pool, - ) # average expression of genes + ) else: - obs_avg = pd.Series( - np.nanmean(_adata_subset.X, axis=0), index=gene_pool - ) # average expression of genes + obs_avg = pd.Series(np.nanmean(_adata_subset.X, axis=0), index=gene_pool) - obs_avg = obs_avg[ - np.isfinite(obs_avg) - ] # Sometimes (and I don't know how) missing data may be there, with nansfor + # Sometimes (and I don't know how) missing data may be there, with nansfor + obs_avg = obs_avg[np.isfinite(obs_avg)] n_items = int(np.round(len(obs_avg) / (n_bins - 1))) obs_cut = obs_avg.rank(method="min") // n_items - control_genes = set() + control_genes = pd.Index([], dtype="string") # now pick `ctrl_size` genes from every cut - for cut in np.unique(obs_cut.loc[list(gene_list)]): - r_genes = np.array(obs_cut[obs_cut == cut].index) - np.random.shuffle(r_genes) - # uses full r_genes if ctrl_size > len(r_genes) - control_genes.update(set(r_genes[:ctrl_size])) - - # To index, we need a list – indexing implies an order. - control_genes = list(control_genes - gene_list) - gene_list = list(gene_list) + for cut in np.unique(obs_cut.loc[gene_list]): + r_genes: pd.Index[str] = obs_cut[obs_cut == cut].index + if ctrl_size < len(r_genes): + r_genes = r_genes.to_series().sample(ctrl_size).index + control_genes = control_genes.union(r_genes.difference(gene_list)) X_list = _adata[:, gene_list].X if issparse(X_list): From a956fa781a8406fc5030093356c0372456d9184b Mon Sep 17 00:00:00 2001 From: Severin Dicks <37635888+Intron7@users.noreply.github.com> Date: Wed, 6 Mar 2024 16:23:33 +0100 Subject: [PATCH 33/54] makes count nonzeros dense (#2893) * makes count nonzeros dense * added test * added releasenote --- docs/release-notes/1.10.0.md | 1 + scanpy/get/_aggregated.py | 2 +- scanpy/tests/test_aggregated.py | 12 ++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 1b338fd5ed..722140376f 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -44,6 +44,7 @@ * Fix some annoying plotting warnings around violin plots {pr}`2844` {smaller}`P Angerer` * Scanpy now has a test job which tests against the minumum versions of the dependencies. In the process of implementing this, many bugs associated with using older versions of `pandas`, `anndata`, `numpy`, and `matplotlib` were fixed. {pr}`2816` {smaller}`I Virshup` * Fix warnings caused by internal usage of `pandas.DataFrame.stack` with `pandas>=2.1` {pr}`2864`{smaller}`I Virshup` +* {func}`scanpy.get.aggregate` now always returns {class}`numpy.ndarray` {pr}`2893` {smaller}`S Dicks` ```{rubric} Development ``` diff --git a/scanpy/get/_aggregated.py b/scanpy/get/_aggregated.py index 159f7572e3..9f50575ffb 100644 --- a/scanpy/get/_aggregated.py +++ b/scanpy/get/_aggregated.py @@ -71,7 +71,7 @@ def count_nonzero(self) -> NDArray[np.integer]: """ # pattern = self.data._with_data(np.broadcast_to(1, len(self.data.data))) # return self.indicator_matrix @ pattern - return self.indicator_matrix @ (self.data != 0) + return utils.asarray(self.indicator_matrix @ (self.data != 0)) def sum(self) -> Array: """\ diff --git a/scanpy/tests/test_aggregated.py b/scanpy/tests/test_aggregated.py index 0b3e14b163..c3b5331afc 100644 --- a/scanpy/tests/test_aggregated.py +++ b/scanpy/tests/test_aggregated.py @@ -378,3 +378,15 @@ def test_combine_categories(label_cols, cols, expected): [x.split("_") for x in result], columns=cols, index=result.astype(str) ).astype("category") pd.testing.assert_frame_equal(reconstructed_df, result_label_df) + + +@pytest.mark.parametrize("array_type", ARRAY_TYPES_MEM) +@pytest.mark.parametrize("metric", ["sum", "mean", "var", "count_nonzero"]) +def test_aggregate_arraytype(array_type, metric): + adata = pbmc3k_processed().raw.to_adata() + adata = adata[ + adata.obs["louvain"].isin(adata.obs["louvain"].cat.categories[:5]), :1_000 + ].copy() + adata.X = array_type(adata.X) + aggregate = sc.get.aggregate(adata, ["louvain"], metric) + assert isinstance(aggregate.layers[metric], np.ndarray) From e50d7fe48debb2242ce264d091a9299eabda7d98 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Tue, 12 Mar 2024 14:04:36 +0100 Subject: [PATCH 34/54] tutorial link for `transformer` (#2903) --- scanpy/neighbors/__init__.py | 5 +++++ scanpy/tests/test_score_genes.py | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/scanpy/neighbors/__init__.py b/scanpy/neighbors/__init__.py index 4c330dbd02..0910a0883b 100644 --- a/scanpy/neighbors/__init__.py +++ b/scanpy/neighbors/__init__.py @@ -104,6 +104,7 @@ def neighbors( transformer Approximate kNN search implementation following the API of :class:`~sklearn.neighbors.KNeighborsTransformer`. + See :doc:`tutorials:knn-transformers` for more details. Also accepts the following known options: `None` (the default) @@ -162,6 +163,10 @@ def neighbors( >>> transformer = KNeighborsTransformer(n_neighbors=10, metric='manhattan', algorithm='kd_tree') >>> sc.pp.neighbors(adata, transformer=transformer) >>> # now you can e.g. access the index: `transformer._tree` + + See also + -------- + :doc:`tutorials:knn-transformers` """ start = logg.info("computing neighbors") adata = adata.copy() if copy else adata diff --git a/scanpy/tests/test_score_genes.py b/scanpy/tests/test_score_genes.py index 23bd934e78..cef66d27d1 100644 --- a/scanpy/tests/test_score_genes.py +++ b/scanpy/tests/test_score_genes.py @@ -197,7 +197,7 @@ def test_npnanmean_vs_sparsemean(monkeypatch): def mock_fn(x, axis): return np.nanmean(x.A, axis, dtype="float64") - monkeypatch.setattr(sc.tools._score_genes, "_sparse_nanmean", mock_fn) + monkeypatch.setattr(sc.tl._score_genes, "_sparse_nanmean", mock_fn) sc.tl.score_genes(adata, gene_list=gene_set, score_name="Test") dense_scores = adata.obs["Test"].values From 7449672ea8ac7c7da07e505c58052f76f5358682 Mon Sep 17 00:00:00 2001 From: Severin Dicks <37635888+Intron7@users.noreply.github.com> Date: Thu, 14 Mar 2024 10:28:18 +0100 Subject: [PATCH 35/54] remove self for pynndescent (#2896) Co-authored-by: Philipp A --- docs/release-notes/1.10.0.md | 3 +++ scanpy/preprocessing/_scrublet/core.py | 3 ++- scanpy/tests/test_scrublet.py | 4 +++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 722140376f..afe72f87bf 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -45,6 +45,9 @@ * Scanpy now has a test job which tests against the minumum versions of the dependencies. In the process of implementing this, many bugs associated with using older versions of `pandas`, `anndata`, `numpy`, and `matplotlib` were fixed. {pr}`2816` {smaller}`I Virshup` * Fix warnings caused by internal usage of `pandas.DataFrame.stack` with `pandas>=2.1` {pr}`2864`{smaller}`I Virshup` * {func}`scanpy.get.aggregate` now always returns {class}`numpy.ndarray` {pr}`2893` {smaller}`S Dicks` +* Removes self from array of neighbors for `use_approx_neighbors = True` in {func}`~scanpy.pp.scrublet` {pr}`2896`{smaller}`S Dicks` + + ```{rubric} Development ``` diff --git a/scanpy/preprocessing/_scrublet/core.py b/scanpy/preprocessing/_scrublet/core.py index ab1c7e216c..ed0ff33e3a 100644 --- a/scanpy/preprocessing/_scrublet/core.py +++ b/scanpy/preprocessing/_scrublet/core.py @@ -360,7 +360,8 @@ def _nearest_neighbor_classifier( random_state=self._random_state, ) neighbors, _ = _get_indices_distances_from_sparse_matrix(knn.distances, k_adj) - + if use_approx_nn: + neighbors = neighbors[:, 1:] # Calculate doublet score based on ratio of simulated cell neighbors vs. observed cell neighbors doub_neigh_mask: NDArray[np.bool_] = ( manifold.obs["doub_labels"].to_numpy()[neighbors] == "sim" diff --git a/scanpy/tests/test_scrublet.py b/scanpy/tests/test_scrublet.py index 85879ead33..d6c1b21684 100644 --- a/scanpy/tests/test_scrublet.py +++ b/scanpy/tests/test_scrublet.py @@ -38,14 +38,16 @@ def paul500() -> AnnData: pytest.param(paul500, [180], [0.219178], id="dense"), ], ) +@pytest.mark.parametrize("use_approx_neighbors", [True, False]) def test_scrublet( mk_data: Callable[[], AnnData], expected_idx: list[int], expected_scores: list[float], + use_approx_neighbors: bool, ): """Check that scrublet runs and detects some doublets.""" adata = mk_data() - sc.pp.scrublet(adata, use_approx_neighbors=False) + sc.pp.scrublet(adata, use_approx_neighbors=use_approx_neighbors) doublet_idx = np.flatnonzero(adata.obs["predicted_doublet"]).tolist() assert doublet_idx == expected_idx From 1fee6a1033669db8f0d1e4ade477b861174b5722 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Thu, 14 Mar 2024 22:21:22 +1100 Subject: [PATCH 36/54] Remove inplace modification of a buffer created by pandas (#2905) Co-authored-by: Philipp A --- pyproject.toml | 3 ++- scanpy/preprocessing/_highly_variable_genes.py | 5 ++--- scanpy/testing/_pytest/__init__.py | 5 ++++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 3acaed64b3..e1c80492f1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -175,7 +175,8 @@ filterwarnings = [ "error:The specified parameters:FutureWarning", # When calling `.show()` in tests, this is raised "ignore:FigureCanvasAgg is non-interactive:UserWarning", - # We explicitly handle these errors in tests + + # We explicitly handle the below errors in tests "error:`anndata.read` is deprecated:FutureWarning", "error:Observation names are not unique:UserWarning", "error:The dtype argument is deprecated and will be removed:FutureWarning", diff --git a/scanpy/preprocessing/_highly_variable_genes.py b/scanpy/preprocessing/_highly_variable_genes.py index 0dd2a33c51..dad4d06160 100644 --- a/scanpy/preprocessing/_highly_variable_genes.py +++ b/scanpy/preprocessing/_highly_variable_genes.py @@ -362,7 +362,7 @@ def _subset_genes( ) -> NDArray[np.bool_] | DaskArray: """Get boolean mask of genes with normalized dispersion in bounds.""" if isinstance(cutoff, _Cutoffs): - dispersion_norm[np.isnan(dispersion_norm)] = 0 # similar to Seurat + dispersion_norm = np.nan_to_num(dispersion_norm) # similar to Seurat return cutoff.in_bounds(mean, dispersion_norm) n_top_genes = cutoff del cutoff @@ -462,8 +462,7 @@ def _highly_variable_genes_batched( ) df["highly_variable"] = np.arange(df.shape[0]) < cutoff else: - dispersion_norm = df["dispersions_norm"].to_numpy() - dispersion_norm[np.isnan(dispersion_norm)] = 0 # similar to Seurat + df["dispersions_norm"] = df["dispersions_norm"].fillna(0) # similar to Seurat df["highly_variable"] = cutoff.in_bounds(df["means"], df["dispersions_norm"]) return df diff --git a/scanpy/testing/_pytest/__init__.py b/scanpy/testing/_pytest/__init__.py index e864d31d3d..0fe2e6d3d9 100644 --- a/scanpy/testing/_pytest/__init__.py +++ b/scanpy/testing/_pytest/__init__.py @@ -1,4 +1,5 @@ """A private pytest plugin""" + from __future__ import annotations import os @@ -6,6 +7,7 @@ import warnings from typing import TYPE_CHECKING +import pandas as pd import pytest from ..._utils import _import_name @@ -71,7 +73,8 @@ def _fix_dask_df_warning(): import dask # noqa: F401 except ImportError: return - with warnings.catch_warnings(): + # reset COW mode after this block: https://github.com/dask/dask/issues/10996 + with warnings.catch_warnings(), pd.option_context("mode.copy_on_write", True): warnings.filterwarnings( "ignore", category=DeprecationWarning, From c6a7ae18e041bb23983dc0130dc2188571b447b0 Mon Sep 17 00:00:00 2001 From: Severin Dicks <37635888+Intron7@users.noreply.github.com> Date: Thu, 14 Mar 2024 13:02:26 +0100 Subject: [PATCH 37/54] Scale clips low (#2913) Co-authored-by: Philipp A --- docs/release-notes/1.10.0.md | 1 + scanpy/preprocessing/_simple.py | 5 ++++- scanpy/tests/test_scaling.py | 9 +++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index afe72f87bf..9373c27370 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -25,6 +25,7 @@ * {func}`scanpy.external.pp.harmony_integrate` now runs with 64 bit floats improving reproducibility {pr}`2655` {smaller}`S Dicks` * {func}`scanpy.tl.rank_genes_groups` no longer warns that it's default was changed from t-test_overestim_var to t-test {pr}`2798` {smaller}`L Heumos` * `scanpy.pp.calculate_qc_metrics` now allows `qc_vars` to be passed as a string {pr}`2859` {smaller}`N Teyssier` +* {func}`scanpy.pp.scale` now clips `np.ndarray` also at `- max_value` for zero-centering {pr}`2913` {smaller}`S Dicks` ```{rubric} Docs ``` diff --git a/scanpy/preprocessing/_simple.py b/scanpy/preprocessing/_simple.py index 7fba1a71f8..8b21588669 100644 --- a/scanpy/preprocessing/_simple.py +++ b/scanpy/preprocessing/_simple.py @@ -871,7 +871,10 @@ def scale_array( # do the clipping if max_value is not None: logg.debug(f"... clipping at max_value {max_value}") - X[X > max_value] = max_value + if zero_center: + X = np.clip(X, a_min=-max_value, a_max=max_value) + else: + X[X > max_value] = max_value if return_mean_std: return X, mean, std else: diff --git a/scanpy/tests/test_scaling.py b/scanpy/tests/test_scaling.py index d6b004c1ff..ba425e4408 100644 --- a/scanpy/tests/test_scaling.py +++ b/scanpy/tests/test_scaling.py @@ -104,3 +104,12 @@ def test_mask_string(): sc.pp.scale(adata, mask_obs="some cells") assert np.array_equal(adata.X, X_centered_for_mask) assert "mean of some cells" in adata.var.keys() + + +@pytest.mark.parametrize("zero_center", [True, False]) +def test_clip(zero_center): + adata = sc.datasets.pbmc3k() + sc.pp.scale(adata, max_value=1, zero_center=zero_center) + if zero_center: + assert adata.X.min() >= -1 + assert adata.X.max() <= 1 From 8da41b16ce893401bee6a82c7293a3280a505060 Mon Sep 17 00:00:00 2001 From: Severin Dicks <37635888+Intron7@users.noreply.github.com> Date: Thu, 14 Mar 2024 13:15:47 +0100 Subject: [PATCH 38/54] fixes pca_test `test_mask_defaults` (#2914) Co-authored-by: Philipp A --- scanpy/tests/test_pca.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/scanpy/tests/test_pca.py b/scanpy/tests/test_pca.py index 3150808ee1..86e17e14d3 100644 --- a/scanpy/tests/test_pca.py +++ b/scanpy/tests/test_pca.py @@ -390,14 +390,13 @@ def test_mask_defaults(array_type, float_dtype): Test if pca result is equal without highly variable and with-but mask is None and if pca takes highly variable as mask as default """ - A = array_type(A_list).astype("float32") + A = array_type(A_list).astype("float64") adata = AnnData(A) without_var = sc.pp.pca(adata, copy=True, dtype=float_dtype) - mask = np.random.choice([True, False], adata.shape[1]) - mask[0] = True - mask[1] = True + rng = np.random.default_rng(8) + mask = rng.choice([True, False], adata.shape[1]) adata.var["highly_variable"] = mask with_var = sc.pp.pca(adata, copy=True, dtype=float_dtype) assert without_var.uns["pca"]["params"]["mask_var"] is None From f7858a6787c1e8deef88246d2efd92b709ba5d38 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 12:26:09 +0000 Subject: [PATCH 39/54] [pre-commit.ci] pre-commit autoupdate (#2907) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Philipp A --- .pre-commit-config.yaml | 2 +- docs/extensions/function_images.py | 1 + scanpy/__init__.py | 1 + scanpy/_utils/__init__.py | 1 + scanpy/_utils/compute/is_constant.py | 6 ++--- scanpy/datasets/__init__.py | 4 ++-- scanpy/experimental/_docs.py | 4 ++-- scanpy/external/exporting.py | 1 + scanpy/external/pp/_harmony_integrate.py | 1 + scanpy/external/pp/_hashsolo.py | 25 +++++++++++---------- scanpy/external/pp/_magic.py | 1 + scanpy/external/pp/_scanorama_integrate.py | 1 + scanpy/external/tl/_harmony_timeseries.py | 1 + scanpy/external/tl/_palantir.py | 1 + scanpy/external/tl/_phate.py | 1 + scanpy/external/tl/_phenograph.py | 1 + scanpy/external/tl/_pypairs.py | 1 + scanpy/external/tl/_sam.py | 1 + scanpy/external/tl/_trimap.py | 1 + scanpy/get/get.py | 1 + scanpy/logging.py | 4 ++-- scanpy/metrics/_metrics.py | 1 + scanpy/metrics/_morans_i.py | 1 + scanpy/neighbors/_types.py | 15 +++++-------- scanpy/plotting/_anndata.py | 4 ++-- scanpy/plotting/_baseplot_class.py | 4 ++-- scanpy/plotting/_docs.py | 1 + scanpy/plotting/_rcmod.py | 4 ++-- scanpy/plotting/palettes.py | 1 + scanpy/preprocessing/_distributed.py | 12 ++++------ scanpy/preprocessing/_docs.py | 4 ++-- scanpy/preprocessing/_recipes.py | 1 + scanpy/preprocessing/_scrublet/__init__.py | 6 ++--- scanpy/preprocessing/_scrublet/core.py | 6 ++--- scanpy/preprocessing/_simple.py | 1 + scanpy/readwrite.py | 21 +++++++++-------- scanpy/testing/_helpers/__init__.py | 1 + scanpy/testing/_pytest/fixtures/__init__.py | 1 + scanpy/tests/test_datasets.py | 1 + scanpy/tests/test_pca.py | 15 ++++++++----- scanpy/tools/_dpt.py | 6 ++--- scanpy/tools/_embedding_density.py | 1 + scanpy/tools/_marker_gene_overlap.py | 1 + scanpy/tools/_rank_genes_groups.py | 4 ++-- scanpy/tools/_score_genes.py | 4 ++-- scanpy/tools/_sim.py | 1 + scanpy/tools/_top_genes.py | 1 + 47 files changed, 101 insertions(+), 77 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 709cc29b1a..a7e14a1baf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.2.2 + rev: v0.3.2 hooks: - id: ruff types_or: [python, pyi, jupyter] diff --git a/docs/extensions/function_images.py b/docs/extensions/function_images.py index 0503be39ce..cfbfe3307c 100644 --- a/docs/extensions/function_images.py +++ b/docs/extensions/function_images.py @@ -1,4 +1,5 @@ """Images for plot functions""" + from __future__ import annotations from pathlib import Path diff --git a/scanpy/__init__.py b/scanpy/__init__.py index be2a10f5bf..b038ed02b5 100644 --- a/scanpy/__init__.py +++ b/scanpy/__init__.py @@ -1,4 +1,5 @@ """Single-Cell Analysis in Python.""" + from __future__ import annotations import sys diff --git a/scanpy/_utils/__init__.py b/scanpy/_utils/__init__.py index e182ab3840..8511465eab 100644 --- a/scanpy/_utils/__init__.py +++ b/scanpy/_utils/__init__.py @@ -3,6 +3,7 @@ This file largely consists of the old _utils.py file. Over time, these functions should be moved of this file. """ + from __future__ import annotations import importlib.util diff --git a/scanpy/_utils/compute/is_constant.py b/scanpy/_utils/compute/is_constant.py index 0488fa8428..d6b6b57956 100644 --- a/scanpy/_utils/compute/is_constant.py +++ b/scanpy/_utils/compute/is_constant.py @@ -31,13 +31,11 @@ def func(a, axis=None): @overload -def is_constant(a: NDArray, axis: None = None) -> bool: - ... +def is_constant(a: NDArray, axis: None = None) -> bool: ... @overload -def is_constant(a: NDArray, axis: Literal[0, 1]) -> NDArray[np.bool_]: - ... +def is_constant(a: NDArray, axis: Literal[0, 1]) -> NDArray[np.bool_]: ... @_check_axis_supported diff --git a/scanpy/datasets/__init__.py b/scanpy/datasets/__init__.py index cff764effe..550f0e3033 100644 --- a/scanpy/datasets/__init__.py +++ b/scanpy/datasets/__init__.py @@ -1,5 +1,5 @@ -"""Builtin Datasets. -""" +"""Builtin Datasets.""" + from __future__ import annotations from ._datasets import ( diff --git a/scanpy/experimental/_docs.py b/scanpy/experimental/_docs.py index 62610d6320..5f9a1e8297 100644 --- a/scanpy/experimental/_docs.py +++ b/scanpy/experimental/_docs.py @@ -1,5 +1,5 @@ -"""Shared docstrings for experimental function parameters. -""" +"""Shared docstrings for experimental function parameters.""" + from __future__ import annotations doc_adata = """\ diff --git a/scanpy/external/exporting.py b/scanpy/external/exporting.py index 80d091e13d..481c2cf88d 100644 --- a/scanpy/external/exporting.py +++ b/scanpy/external/exporting.py @@ -1,6 +1,7 @@ """\ Exporting to formats for other software. """ + from __future__ import annotations import json diff --git a/scanpy/external/pp/_harmony_integrate.py b/scanpy/external/pp/_harmony_integrate.py index 5ebd79b77c..19ef30343b 100644 --- a/scanpy/external/pp/_harmony_integrate.py +++ b/scanpy/external/pp/_harmony_integrate.py @@ -1,6 +1,7 @@ """ Use harmony to integrate cells from different experiments. """ + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/scanpy/external/pp/_hashsolo.py b/scanpy/external/pp/_hashsolo.py index 5af0769174..223758b9f2 100644 --- a/scanpy/external/pp/_hashsolo.py +++ b/scanpy/external/pp/_hashsolo.py @@ -14,6 +14,7 @@ barcodes should come from noise distributions. We test each of these hypotheses in a bayesian fashion, and select the most probable hypothesis. """ + from __future__ import annotations from itertools import product @@ -383,12 +384,12 @@ def hashsolo( priors, number_of_noise_barcodes, ) - results.loc[ - cluster_feature_bool_vector, "most_likely_hypothesis" - ] = posterior_dict["most_likely_hypothesis"] - results.loc[ - cluster_feature_bool_vector, "cluster_feature" - ] = cluster_feature + results.loc[cluster_feature_bool_vector, "most_likely_hypothesis"] = ( + posterior_dict["most_likely_hypothesis"] + ) + results.loc[cluster_feature_bool_vector, "cluster_feature"] = ( + cluster_feature + ) results.loc[ cluster_feature_bool_vector, "negative_hypothesis_probability" ] = posterior_dict["probs_hypotheses"][:, 0] @@ -429,12 +430,12 @@ def hashsolo( ] adata.obs["Classification"] = None - adata.obs.loc[ - adata.obs["most_likely_hypothesis"] == 2, "Classification" - ] = "Doublet" - adata.obs.loc[ - adata.obs["most_likely_hypothesis"] == 0, "Classification" - ] = "Negative" + adata.obs.loc[adata.obs["most_likely_hypothesis"] == 2, "Classification"] = ( + "Doublet" + ) + adata.obs.loc[adata.obs["most_likely_hypothesis"] == 0, "Classification"] = ( + "Negative" + ) all_sings = adata.obs["most_likely_hypothesis"] == 1 singlet_sample_index = np.argmax( adata.obs.loc[all_sings, cell_hashing_columns].values, axis=1 diff --git a/scanpy/external/pp/_magic.py b/scanpy/external/pp/_magic.py index 793181d0eb..fe729c5a39 100644 --- a/scanpy/external/pp/_magic.py +++ b/scanpy/external/pp/_magic.py @@ -1,6 +1,7 @@ """\ Denoise high-dimensional data using MAGIC """ + from __future__ import annotations from typing import TYPE_CHECKING, Literal diff --git a/scanpy/external/pp/_scanorama_integrate.py b/scanpy/external/pp/_scanorama_integrate.py index b0be9dc674..49d29d0ade 100644 --- a/scanpy/external/pp/_scanorama_integrate.py +++ b/scanpy/external/pp/_scanorama_integrate.py @@ -1,6 +1,7 @@ """ Use Scanorama to integrate cells from different experiments. """ + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/scanpy/external/tl/_harmony_timeseries.py b/scanpy/external/tl/_harmony_timeseries.py index ce904fd0cb..ac7f55df33 100644 --- a/scanpy/external/tl/_harmony_timeseries.py +++ b/scanpy/external/tl/_harmony_timeseries.py @@ -2,6 +2,7 @@ Harmony time series for data visualization with augmented affinity matrix at discrete time points """ + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/scanpy/external/tl/_palantir.py b/scanpy/external/tl/_palantir.py index 0cf613b605..2a15580187 100644 --- a/scanpy/external/tl/_palantir.py +++ b/scanpy/external/tl/_palantir.py @@ -1,6 +1,7 @@ """\ Run Diffusion maps using the adaptive anisotropic kernel """ + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/scanpy/external/tl/_phate.py b/scanpy/external/tl/_phate.py index e926b7ad11..813160a36e 100644 --- a/scanpy/external/tl/_phate.py +++ b/scanpy/external/tl/_phate.py @@ -1,6 +1,7 @@ """\ Embed high-dimensional data using PHATE """ + from __future__ import annotations from typing import TYPE_CHECKING, Literal diff --git a/scanpy/external/tl/_phenograph.py b/scanpy/external/tl/_phenograph.py index 753e84b785..721e18135c 100644 --- a/scanpy/external/tl/_phenograph.py +++ b/scanpy/external/tl/_phenograph.py @@ -1,6 +1,7 @@ """\ Perform clustering using PhenoGraph """ + from __future__ import annotations from typing import TYPE_CHECKING, Any, Literal diff --git a/scanpy/external/tl/_pypairs.py b/scanpy/external/tl/_pypairs.py index 9241ea86d7..044c4726d7 100644 --- a/scanpy/external/tl/_pypairs.py +++ b/scanpy/external/tl/_pypairs.py @@ -1,6 +1,7 @@ """\ Calculate scores based on relative expression change of maker pairs """ + from __future__ import annotations from collections.abc import Collection, Mapping diff --git a/scanpy/external/tl/_sam.py b/scanpy/external/tl/_sam.py index 086a49b2d1..97af6ff3fc 100644 --- a/scanpy/external/tl/_sam.py +++ b/scanpy/external/tl/_sam.py @@ -1,6 +1,7 @@ """\ Run the Self-Assembling Manifold algorithm """ + from __future__ import annotations from typing import TYPE_CHECKING, Literal diff --git a/scanpy/external/tl/_trimap.py b/scanpy/external/tl/_trimap.py index 84a6d9e5f6..1549be876e 100644 --- a/scanpy/external/tl/_trimap.py +++ b/scanpy/external/tl/_trimap.py @@ -1,6 +1,7 @@ """\ Embed high-dimensional data using TriMap """ + from __future__ import annotations from typing import TYPE_CHECKING, Literal diff --git a/scanpy/get/get.py b/scanpy/get/get.py index 3080dfb2bb..7e65fef203 100644 --- a/scanpy/get/get.py +++ b/scanpy/get/get.py @@ -1,4 +1,5 @@ """This module contains helper functions for accessing data.""" + from __future__ import annotations from typing import TYPE_CHECKING, Any, Literal diff --git a/scanpy/logging.py b/scanpy/logging.py index 6111b06483..a10f0810c1 100644 --- a/scanpy/logging.py +++ b/scanpy/logging.py @@ -1,5 +1,5 @@ -"""Logging and Profiling -""" +"""Logging and Profiling""" + from __future__ import annotations import logging diff --git a/scanpy/metrics/_metrics.py b/scanpy/metrics/_metrics.py index c75e33a3c2..90eb42a7af 100644 --- a/scanpy/metrics/_metrics.py +++ b/scanpy/metrics/_metrics.py @@ -1,6 +1,7 @@ """ Metrics which don't quite deserve their own file. """ + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/scanpy/metrics/_morans_i.py b/scanpy/metrics/_morans_i.py index ed98e75afa..8497d83d99 100644 --- a/scanpy/metrics/_morans_i.py +++ b/scanpy/metrics/_morans_i.py @@ -1,4 +1,5 @@ """Moran's I global spatial autocorrelation.""" + from __future__ import annotations from functools import singledispatch diff --git a/scanpy/neighbors/_types.py b/scanpy/neighbors/_types.py index 77a7d8889a..da1b24e68c 100644 --- a/scanpy/neighbors/_types.py +++ b/scanpy/neighbors/_types.py @@ -46,19 +46,14 @@ class KnnTransformerLike(Protocol): """See :class:`~sklearn.neighbors.KNeighborsTransformer`.""" - def fit(self, X, y: None = None): - ... + def fit(self, X, y: None = None): ... - def transform(self, X) -> spmatrix: - ... + def transform(self, X) -> spmatrix: ... # from TransformerMixin - def fit_transform(self, X, y: None = None) -> spmatrix: - ... + def fit_transform(self, X, y: None = None) -> spmatrix: ... # from BaseEstimator - def get_params(self, deep: bool = True) -> dict[str, Any]: - ... + def get_params(self, deep: bool = True) -> dict[str, Any]: ... - def set_params(self, **params: Any) -> Self: - ... + def set_params(self, **params: Any) -> Self: ... diff --git a/scanpy/plotting/_anndata.py b/scanpy/plotting/_anndata.py index 9c48a9a952..970e56a27c 100755 --- a/scanpy/plotting/_anndata.py +++ b/scanpy/plotting/_anndata.py @@ -1,5 +1,5 @@ -"""Plotting functions for AnnData. -""" +"""Plotting functions for AnnData.""" + from __future__ import annotations import collections.abc as cabc diff --git a/scanpy/plotting/_baseplot_class.py b/scanpy/plotting/_baseplot_class.py index 10329f16e4..d3b3acff02 100644 --- a/scanpy/plotting/_baseplot_class.py +++ b/scanpy/plotting/_baseplot_class.py @@ -1,5 +1,5 @@ -"""BasePlot for dotplot, matrixplot and stacked_violin -""" +"""BasePlot for dotplot, matrixplot and stacked_violin""" + from __future__ import annotations import collections.abc as cabc diff --git a/scanpy/plotting/_docs.py b/scanpy/plotting/_docs.py index c1078090b0..2091b5ec4c 100644 --- a/scanpy/plotting/_docs.py +++ b/scanpy/plotting/_docs.py @@ -1,6 +1,7 @@ """\ Shared docstrings for plotting function parameters. """ + from __future__ import annotations doc_adata_color_etc = """\ diff --git a/scanpy/plotting/_rcmod.py b/scanpy/plotting/_rcmod.py index cfe6da13bf..525f3e97da 100644 --- a/scanpy/plotting/_rcmod.py +++ b/scanpy/plotting/_rcmod.py @@ -1,5 +1,5 @@ -"""Set the default matplotlib.rcParams. -""" +"""Set the default matplotlib.rcParams.""" + from __future__ import annotations import matplotlib as mpl diff --git a/scanpy/plotting/palettes.py b/scanpy/plotting/palettes.py index 172501619d..ec4cd5dde2 100644 --- a/scanpy/plotting/palettes.py +++ b/scanpy/plotting/palettes.py @@ -1,4 +1,5 @@ """Color palettes in addition to matplotlib's palettes.""" + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/scanpy/preprocessing/_distributed.py b/scanpy/preprocessing/_distributed.py index 91db7e7149..195550de17 100644 --- a/scanpy/preprocessing/_distributed.py +++ b/scanpy/preprocessing/_distributed.py @@ -11,27 +11,23 @@ @overload -def materialize_as_ndarray(a: ArrayLike) -> np.ndarray: - ... +def materialize_as_ndarray(a: ArrayLike) -> np.ndarray: ... @overload -def materialize_as_ndarray(a: tuple[ArrayLike]) -> tuple[np.ndarray]: - ... +def materialize_as_ndarray(a: tuple[ArrayLike]) -> tuple[np.ndarray]: ... @overload def materialize_as_ndarray( a: tuple[ArrayLike, ArrayLike], -) -> tuple[np.ndarray, np.ndarray]: - ... +) -> tuple[np.ndarray, np.ndarray]: ... @overload def materialize_as_ndarray( a: tuple[ArrayLike, ArrayLike, ArrayLike], -) -> tuple[np.ndarray, np.ndarray, np.ndarray]: - ... +) -> tuple[np.ndarray, np.ndarray, np.ndarray]: ... def materialize_as_ndarray( diff --git a/scanpy/preprocessing/_docs.py b/scanpy/preprocessing/_docs.py index 3c13e84afb..aa1378bd67 100644 --- a/scanpy/preprocessing/_docs.py +++ b/scanpy/preprocessing/_docs.py @@ -1,5 +1,5 @@ -"""Shared docstrings for preprocessing function parameters. -""" +"""Shared docstrings for preprocessing function parameters.""" + from __future__ import annotations doc_adata_basic = """\ diff --git a/scanpy/preprocessing/_recipes.py b/scanpy/preprocessing/_recipes.py index 10556bc993..cd9ee8506c 100644 --- a/scanpy/preprocessing/_recipes.py +++ b/scanpy/preprocessing/_recipes.py @@ -1,4 +1,5 @@ """Preprocessing recipes from the literature""" + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/scanpy/preprocessing/_scrublet/__init__.py b/scanpy/preprocessing/_scrublet/__init__.py index 66fd800629..f11120a674 100644 --- a/scanpy/preprocessing/_scrublet/__init__.py +++ b/scanpy/preprocessing/_scrublet/__init__.py @@ -484,9 +484,9 @@ def _scrublet_call_doublets( adata_obs.obs["predicted_doublet"] = False if get_doublet_neighbor_parents: - adata_obs.uns["scrublet"][ - "doublet_neighbor_parents" - ] = scrub.doublet_neighbor_parents_ + adata_obs.uns["scrublet"]["doublet_neighbor_parents"] = ( + scrub.doublet_neighbor_parents_ + ) return adata_obs diff --git a/scanpy/preprocessing/_scrublet/core.py b/scanpy/preprocessing/_scrublet/core.py index ed0ff33e3a..076a26eafc 100644 --- a/scanpy/preprocessing/_scrublet/core.py +++ b/scanpy/preprocessing/_scrublet/core.py @@ -71,9 +71,9 @@ class Scrublet: # init fields - counts_obs: InitVar[ - sparse.csr_matrix | sparse.csc_matrix | NDArray[np.integer] - ] = field(**kw_only(False)) + counts_obs: InitVar[sparse.csr_matrix | sparse.csc_matrix | NDArray[np.integer]] = ( + field(**kw_only(False)) + ) total_counts_obs: InitVar[NDArray[np.integer] | None] = None sim_doublet_ratio: float = 2.0 n_neighbors: InitVar[int | None] = None diff --git a/scanpy/preprocessing/_simple.py b/scanpy/preprocessing/_simple.py index 8b21588669..2ab6f31370 100644 --- a/scanpy/preprocessing/_simple.py +++ b/scanpy/preprocessing/_simple.py @@ -2,6 +2,7 @@ Compositions of these functions are found in sc.preprocess.recipes. """ + from __future__ import annotations import warnings diff --git a/scanpy/readwrite.py b/scanpy/readwrite.py index 379ddd78eb..9bac25bf4e 100644 --- a/scanpy/readwrite.py +++ b/scanpy/readwrite.py @@ -1,5 +1,5 @@ -"""Reading and Writing -""" +"""Reading and Writing""" + from __future__ import annotations import json @@ -1005,13 +1005,16 @@ def _download(url: str, path: Path): with open_url as resp: total = resp.info().get("content-length", None) - with tqdm( - unit="B", - unit_scale=True, - miniters=1, - unit_divisor=1024, - total=total if total is None else int(total), - ) as t, path.open("wb") as f: + with ( + tqdm( + unit="B", + unit_scale=True, + miniters=1, + unit_divisor=1024, + total=total if total is None else int(total), + ) as t, + path.open("wb") as f, + ): block = resp.read(blocksize) while block: f.write(block) diff --git a/scanpy/testing/_helpers/__init__.py b/scanpy/testing/_helpers/__init__.py index c36ed5a2cb..b85faec3f3 100644 --- a/scanpy/testing/_helpers/__init__.py +++ b/scanpy/testing/_helpers/__init__.py @@ -1,6 +1,7 @@ """ This file contains helper functions for the scanpy test suite. """ + from __future__ import annotations import warnings diff --git a/scanpy/testing/_pytest/fixtures/__init__.py b/scanpy/testing/_pytest/fixtures/__init__.py index 14dcabdc71..e225ace290 100644 --- a/scanpy/testing/_pytest/fixtures/__init__.py +++ b/scanpy/testing/_pytest/fixtures/__init__.py @@ -2,6 +2,7 @@ This is kept seperate from the helpers file because it relies on pytest. """ + from __future__ import annotations import warnings diff --git a/scanpy/tests/test_datasets.py b/scanpy/tests/test_datasets.py index 45d5159b89..d1230413a2 100644 --- a/scanpy/tests/test_datasets.py +++ b/scanpy/tests/test_datasets.py @@ -1,6 +1,7 @@ """ Tests to make sure the example datasets load. """ + from __future__ import annotations import subprocess diff --git a/scanpy/tests/test_pca.py b/scanpy/tests/test_pca.py index 86e17e14d3..c2de64c0b9 100644 --- a/scanpy/tests/test_pca.py +++ b/scanpy/tests/test_pca.py @@ -299,12 +299,15 @@ def test_pca_n_pcs(): def test_mask_highly_var_error(array_type): """Check if use_highly_variable=True throws an error if the annotation is missing.""" adata = AnnData(array_type(A_list).astype("float32")) - with pytest.warns( - FutureWarning, - match=r"Argument `use_highly_variable` is deprecated, consider using the mask argument\.", - ), pytest.raises( - ValueError, - match=r"Did not find `adata\.var\['highly_variable'\]`\.", + with ( + pytest.warns( + FutureWarning, + match=r"Argument `use_highly_variable` is deprecated, consider using the mask argument\.", + ), + pytest.raises( + ValueError, + match=r"Did not find `adata\.var\['highly_variable'\]`\.", + ), ): sc.pp.pca(adata, use_highly_variable=True) diff --git a/scanpy/tools/_dpt.py b/scanpy/tools/_dpt.py index 4eb640b227..a1ef528c04 100644 --- a/scanpy/tools/_dpt.py +++ b/scanpy/tools/_dpt.py @@ -157,9 +157,9 @@ def dpt( logg.info(" this uses a hierarchical implementation") if dpt.iroot is not None: dpt._set_pseudotime() # pseudotimes are distances from root point - adata.uns[ - "iroot" - ] = dpt.iroot # update iroot, might have changed when subsampling, for example + adata.uns["iroot"] = ( + dpt.iroot + ) # update iroot, might have changed when subsampling, for example adata.obs["dpt_pseudotime"] = dpt.pseudotime # detect branchings and partition the data into segments if n_branchings > 0: diff --git a/scanpy/tools/_embedding_density.py b/scanpy/tools/_embedding_density.py index 00e97c0780..5ae69361dc 100644 --- a/scanpy/tools/_embedding_density.py +++ b/scanpy/tools/_embedding_density.py @@ -1,6 +1,7 @@ """\ Calculate density of cells in embeddings """ + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/scanpy/tools/_marker_gene_overlap.py b/scanpy/tools/_marker_gene_overlap.py index 6d0f6ef54e..f60430d157 100644 --- a/scanpy/tools/_marker_gene_overlap.py +++ b/scanpy/tools/_marker_gene_overlap.py @@ -1,6 +1,7 @@ """\ Calculate overlaps of rank_genes_groups marker genes with marker gene dictionaries """ + from __future__ import annotations import collections.abc as cabc diff --git a/scanpy/tools/_rank_genes_groups.py b/scanpy/tools/_rank_genes_groups.py index 8e133434bf..c1aab62182 100644 --- a/scanpy/tools/_rank_genes_groups.py +++ b/scanpy/tools/_rank_genes_groups.py @@ -1,5 +1,5 @@ -"""Rank genes according to differential expression. -""" +"""Rank genes according to differential expression.""" + from __future__ import annotations from math import floor diff --git a/scanpy/tools/_score_genes.py b/scanpy/tools/_score_genes.py index 307a162b12..5ae7c526e7 100644 --- a/scanpy/tools/_score_genes.py +++ b/scanpy/tools/_score_genes.py @@ -1,5 +1,5 @@ -"""Calculate scores based on the expression of gene lists. -""" +"""Calculate scores based on the expression of gene lists.""" + from __future__ import annotations from typing import TYPE_CHECKING diff --git a/scanpy/tools/_sim.py b/scanpy/tools/_sim.py index d1ee6ac5b2..eef1cc618a 100644 --- a/scanpy/tools/_sim.py +++ b/scanpy/tools/_sim.py @@ -8,6 +8,7 @@ ---- Beta Version. The code will be reorganized soon. """ + from __future__ import annotations import itertools diff --git a/scanpy/tools/_top_genes.py b/scanpy/tools/_top_genes.py index 316f9cb652..1ad8c52ac6 100644 --- a/scanpy/tools/_top_genes.py +++ b/scanpy/tools/_top_genes.py @@ -3,6 +3,7 @@ """\ This modules provides all non-visualization tools for advanced gene ranking and exploration of genes """ + from __future__ import annotations from typing import TYPE_CHECKING, Literal From 360e3501460824906b0fef88c36f1d78364e6994 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Thu, 14 Mar 2024 18:20:50 +0100 Subject: [PATCH 40/54] Run CI with uv (#2916) * try out uv * syntax * env * better * Fix resolution * wtf * Fix order * compile --- .azure-pipelines.yml | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml index 00c7dc2f14..009b1b5d8b 100644 --- a/.azure-pipelines.yml +++ b/.azure-pipelines.yml @@ -4,7 +4,6 @@ trigger: variables: python.version: '3.12' - PIP_CACHE_DIR: $(Pipeline.Workspace)/.pip PYTEST_ADDOPTS: '-v --color=yes --durations=0 --nunit-xml=test-data/test-results.xml' TEST_EXTRA: 'test-full' DEPENDENCIES_VERSION: "latest" # |"pre-release" | "minimum-version" @@ -36,13 +35,18 @@ jobs: versionSpec: '$(python.version)' displayName: 'Use Python $(python.version)' + - script: | + python -m pip install --upgrade uv + echo "##vso[task.setvariable variable=uv_cache_dir]`uv cache dir`" + displayName: 'Install tools' + - task: Cache@2 inputs: key: '"python $(python.version)" | "$(Agent.OS)" | pyproject.toml' restoreKeys: | python | "$(Agent.OS)" python - path: $(PIP_CACHE_DIR) + path: $(uv_cache_dir) displayName: Cache pip packages - script: | @@ -50,30 +54,25 @@ jobs: echo $MPLBACKEND displayName: 'Set env' - - script: | - python -m pip install --upgrade pip - pip install wheel - pip install .[dev,$(TEST_EXTRA)] + - script: uv pip install --system --compile 'scanpy[dev,$(TEST_EXTRA)] @ .' displayName: 'Install dependencies' condition: eq(variables['DEPENDENCIES_VERSION'], 'latest') - - script: | - python -m pip install --pre --upgrade pip - pip install --pre wheel - pip install --pre .[dev,$(TEST_EXTRA)] - pip install -v "anndata[dev,test] @ git+https://github.com/scverse/anndata" + - script: > + uv pip install --system --compile --pre + "scanpy[dev,$(TEST_EXTRA)] @ ." + "anndata[dev,test] @ git+https://github.com/scverse/anndata" displayName: 'Install dependencies release candidates' condition: eq(variables['DEPENDENCIES_VERSION'], 'pre-release') - script: | - python -m pip install pip wheel tomli packaging - pip install `python3 ci/scripts/min-deps.py pyproject.toml --extra dev test` - pip install --no-deps . + uv pip install --system --compile tomli packaging + deps=`python3 ci/scripts/min-deps.py pyproject.toml --extra dev test` + uv pip install --system --compile $deps "scanpy @ ." displayName: 'Install dependencies minimum version' condition: eq(variables['DEPENDENCIES_VERSION'], 'minimum-version') - - script: | - pip list + - script: uv pip list displayName: 'Display installed versions' - script: pytest From 04b779f14426809c6bf86c7dabbd569e0820f2e9 Mon Sep 17 00:00:00 2001 From: Jason Fan Date: Mon, 18 Mar 2024 09:18:47 -0400 Subject: [PATCH 41/54] Fix for #2887, update Leiden and Louvain tools to write parameters to user specified key (#2889) Co-authored-by: Ilan Gold Co-authored-by: Phil Schaf --- docs/release-notes/1.10.0.md | 1 + pyproject.toml | 4 +- scanpy/tests/external/test_hashsolo.py | 2 +- .../notebooks/test_paga_paul15_subsampled.py | 17 ++----- scanpy/tests/test_clustering.py | 46 ++++++++++++++++++- scanpy/tools/_leiden.py | 6 +-- scanpy/tools/_louvain.py | 6 +-- 7 files changed, 59 insertions(+), 23 deletions(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 9373c27370..d1d83b3420 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -25,6 +25,7 @@ * {func}`scanpy.external.pp.harmony_integrate` now runs with 64 bit floats improving reproducibility {pr}`2655` {smaller}`S Dicks` * {func}`scanpy.tl.rank_genes_groups` no longer warns that it's default was changed from t-test_overestim_var to t-test {pr}`2798` {smaller}`L Heumos` * `scanpy.pp.calculate_qc_metrics` now allows `qc_vars` to be passed as a string {pr}`2859` {smaller}`N Teyssier` +* {func}`scanpy.tl.leiden` and {func}`scanpy.tl.louvain` now store clustering parameters in the key provided by the `key_added` parameter instead of always writing to (or overwriting) a default key {pr}`2864` {smaller}`J Fan` * {func}`scanpy.pp.scale` now clips `np.ndarray` also at `- max_value` for zero-centering {pr}`2913` {smaller}`S Dicks` ```{rubric} Docs diff --git a/pyproject.toml b/pyproject.toml index e1c80492f1..b7a00384eb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -100,8 +100,8 @@ test = [ ] test-full = [ "scanpy[test]", - # tested algorithms - "scanpy[leiden]", + # additional tested algorithms + "scanpy[louvain]", "scanpy[magic]", "scanpy[skmisc]", "scanpy[harmony]", diff --git a/scanpy/tests/external/test_hashsolo.py b/scanpy/tests/external/test_hashsolo.py index 499a204b21..a6f0a79971 100644 --- a/scanpy/tests/external/test_hashsolo.py +++ b/scanpy/tests/external/test_hashsolo.py @@ -32,4 +32,4 @@ def test_cell_demultiplexing(): ) negatives = ["Negative"] * 10 classification = doublets + classes + negatives - assert all(test_data.obs["Classification"].astype(str) == classification) + assert test_data.obs["Classification"].astype(str).tolist() == classification diff --git a/scanpy/tests/notebooks/test_paga_paul15_subsampled.py b/scanpy/tests/notebooks/test_paga_paul15_subsampled.py index 1aa683d731..8460e7d520 100644 --- a/scanpy/tests/notebooks/test_paga_paul15_subsampled.py +++ b/scanpy/tests/notebooks/test_paga_paul15_subsampled.py @@ -8,10 +8,9 @@ from pathlib import Path import numpy as np +import pytest from matplotlib.testing import setup -setup() - import scanpy as sc from scanpy.testing._helpers.data import paul15 from scanpy.testing._pytest.marks import needs @@ -20,9 +19,11 @@ ROOT = HERE / "_images_paga_paul15_subsampled" +@pytest.mark.skip(reason="Broken, needs fixing") @needs.igraph @needs.louvain def test_paga_paul15_subsampled(image_comparer, plt): + setup() save_and_compare_images = partial(image_comparer, ROOT, tol=25) adata = paul15() @@ -59,16 +60,8 @@ def test_paga_paul15_subsampled(image_comparer, plt): [ [0.0, 0.128553, 0.0, 0.07825, 0.0, 0.0, 0.238741, 0.0, 0.0, 0.657049], [ - 0.128553, - 0.0, - 0.480676, - 0.257505, - 0.533036, - 0.043871, - 0.0, - 0.032903, - 0.0, - 0.087743, + *[0.128553, 0.0, 0.480676, 0.257505, 0.533036], + *[0.043871, 0.0, 0.032903, 0.0, 0.087743], ], ] ) diff --git a/scanpy/tests/test_clustering.py b/scanpy/tests/test_clustering.py index d2005d9659..2b757fa4ab 100644 --- a/scanpy/tests/test_clustering.py +++ b/scanpy/tests/test_clustering.py @@ -31,9 +31,12 @@ def test_leiden_basic(adata_neighbors, flavor, resolution, n_iterations): resolution=resolution, n_iterations=n_iterations, directed=(flavor == "leidenalg"), + key_added="leiden_custom", + ) + assert adata_neighbors.uns["leiden_custom"]["params"]["resolution"] == resolution + assert ( + adata_neighbors.uns["leiden_custom"]["params"]["n_iterations"] == n_iterations ) - assert adata_neighbors.uns["leiden"]["params"]["resolution"] == resolution - assert adata_neighbors.uns["leiden"]["params"]["n_iterations"] == n_iterations @needs.leidenalg @@ -186,6 +189,22 @@ def test_louvain_basic(adata_neighbors): sc.tl.louvain(adata_neighbors, flavor="igraph") +@needs.louvain +@pytest.mark.parametrize("random_state", [10, 999]) +@pytest.mark.parametrize("resolution", [0.9, 1.1]) +def test_louvain_custom_key(adata_neighbors, resolution, random_state): + sc.tl.louvain( + adata_neighbors, + key_added="louvain_custom", + random_state=random_state, + resolution=resolution, + ) + assert ( + adata_neighbors.uns["louvain_custom"]["params"]["random_state"] == random_state + ) + assert adata_neighbors.uns["louvain_custom"]["params"]["resolution"] == resolution + + @needs.louvain @needs.igraph def test_partition_type(adata_neighbors): @@ -193,3 +212,26 @@ def test_partition_type(adata_neighbors): sc.tl.louvain(adata_neighbors, partition_type=louvain.RBERVertexPartition) sc.tl.louvain(adata_neighbors, partition_type=louvain.SurpriseVertexPartition) + + +@pytest.mark.parametrize( + "clustering,default_key,default_res,custom_resolutions", + [ + pytest.param(sc.tl.leiden, "leiden", 0.8, [0.9, 1.1], marks=needs.leidenalg), + pytest.param(sc.tl.louvain, "louvain", 0.8, [0.9, 1.1], marks=needs.louvain), + ], +) +def test_clustering_custom_key( + adata_neighbors, clustering, default_key, default_res, custom_resolutions +): + custom_keys = [f"{default_key}_{res}" for res in custom_resolutions] + + # Run clustering with default key, then custom keys + clustering(adata_neighbors, resolution=default_res) + for key, res in zip(custom_keys, custom_resolutions): + clustering(adata_neighbors, resolution=res, key_added=key) + + # ensure that all clustering parameters are added to user provided keys and not overwritten + assert adata_neighbors.uns[default_key]["params"]["resolution"] == default_res + for key, res in zip(custom_keys, custom_resolutions): + assert adata_neighbors.uns[key]["params"]["resolution"] == res diff --git a/scanpy/tools/_leiden.py b/scanpy/tools/_leiden.py index 5345e3567b..a9a9c6e822 100644 --- a/scanpy/tools/_leiden.py +++ b/scanpy/tools/_leiden.py @@ -114,7 +114,7 @@ def leiden( Array of dim (number of samples) that stores the subgroup id (``'0'``, ``'1'``, ...) for each cell. - `adata.uns['leiden']['params']` : :class:`dict` + `adata.uns['leiden' | key_added]['params']` : :class:`dict` A dict with the values for the parameters `resolution`, `random_state`, and `n_iterations`. """ @@ -202,8 +202,8 @@ def leiden( categories=natsorted(map(str, np.unique(groups))), ) # store information on the clustering parameters - adata.uns["leiden"] = {} - adata.uns["leiden"]["params"] = dict( + adata.uns[key_added] = {} + adata.uns[key_added]["params"] = dict( resolution=resolution, random_state=random_state, n_iterations=n_iterations, diff --git a/scanpy/tools/_louvain.py b/scanpy/tools/_louvain.py index 51f3cb5bb7..06de3bdc08 100644 --- a/scanpy/tools/_louvain.py +++ b/scanpy/tools/_louvain.py @@ -133,7 +133,7 @@ def louvain( Array of dim (number of samples) that stores the subgroup id (``'0'``, ``'1'``, ...) for each cell. - `adata.uns['louvain']['params']` : :class:`dict` + `adata.uns['louvain' | key_added]['params']` : :class:`dict` A dict with the values for the parameters `resolution`, `random_state`, and `n_iterations`. """ @@ -255,8 +255,8 @@ def louvain( values=groups.astype("U"), categories=natsorted(map(str, np.unique(groups))), ) - adata.uns["louvain"] = {} - adata.uns["louvain"]["params"] = dict( + adata.uns[key_added] = {} + adata.uns[key_added]["params"] = dict( resolution=resolution, random_state=random_state, ) From 9fe98587895c1457fb1bc024e607e7c9332d2a3a Mon Sep 17 00:00:00 2001 From: Nicolaj Hackert <59015594+n-hackert@users.noreply.github.com> Date: Mon, 18 Mar 2024 14:40:06 +0100 Subject: [PATCH 42/54] Fixed Coifman 2005 DOI link. (#2922) --- docs/references.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/references.rst b/docs/references.rst index 6b6e4bfae1..80fdc892de 100644 --- a/docs/references.rst +++ b/docs/references.rst @@ -27,7 +27,7 @@ References .. [Coifman05] Coifman *et al.* (2005), *Geometric diffusions as a tool for harmonic analysis and structure definition of data: Diffusion maps*, - `PNAS `__. + `PNAS `__. .. [Csardi06] Csardi *et al.* (2006), *The igraph software package for complex network research*, From 8d32a519e61607ed224c2844a841b12eb8eb31a9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 22:49:34 +0000 Subject: [PATCH 43/54] [pre-commit.ci] pre-commit autoupdate (#2926) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.3.2 → v0.3.3](https://github.com/astral-sh/ruff-pre-commit/compare/v0.3.2...v0.3.3) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a7e14a1baf..7cee632407 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.3.2 + rev: v0.3.3 hooks: - id: ruff types_or: [python, pyi, jupyter] From 6542113d9e7f6a9e1a287aa940ec5564b60a247d Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Wed, 20 Mar 2024 01:16:59 +1100 Subject: [PATCH 44/54] Remove incorrect docs for aggregate (#2932) --- scanpy/get/_aggregated.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/scanpy/get/_aggregated.py b/scanpy/get/_aggregated.py index 9f50575ffb..ffc0413507 100644 --- a/scanpy/get/_aggregated.py +++ b/scanpy/get/_aggregated.py @@ -179,8 +179,6 @@ def aggregate( in the output `AnnData` object. If none of `layer`, `obsm`, or `varm` are passed in, `X` will be used for aggregation data. - If `func` only has length 1 or is just an `AggType`, then aggregation data is written to `X`. - Otherwise, it is written to `layers` or `xxxm` as appropriate for the dimensions of the aggregation data. Params ------ From 921fccaca86ce86974ad91348498991714452bc6 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Sat, 23 Mar 2024 00:32:24 +1100 Subject: [PATCH 45/54] Fix paga (#2943) * Stop reporting durations * Fix compatibility with scipy 1.13 * release note --- .azure-pipelines.yml | 2 +- docs/release-notes/1.10.0.md | 1 + scanpy/_utils/__init__.py | 19 ------------------- scanpy/tools/_paga.py | 8 ++++---- 4 files changed, 6 insertions(+), 24 deletions(-) diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml index 009b1b5d8b..c1b928c9f0 100644 --- a/.azure-pipelines.yml +++ b/.azure-pipelines.yml @@ -4,7 +4,7 @@ trigger: variables: python.version: '3.12' - PYTEST_ADDOPTS: '-v --color=yes --durations=0 --nunit-xml=test-data/test-results.xml' + PYTEST_ADDOPTS: '-v --color=yes --nunit-xml=test-data/test-results.xml' TEST_EXTRA: 'test-full' DEPENDENCIES_VERSION: "latest" # |"pre-release" | "minimum-version" TEST_TYPE: "standard" # | "coverage" diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index d1d83b3420..fab39ca94f 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -48,6 +48,7 @@ * Fix warnings caused by internal usage of `pandas.DataFrame.stack` with `pandas>=2.1` {pr}`2864`{smaller}`I Virshup` * {func}`scanpy.get.aggregate` now always returns {class}`numpy.ndarray` {pr}`2893` {smaller}`S Dicks` * Removes self from array of neighbors for `use_approx_neighbors = True` in {func}`~scanpy.pp.scrublet` {pr}`2896`{smaller}`S Dicks` +* Compatibility with scipy 1.13 {pr}`2943` {smaller}`I Virshup` diff --git a/scanpy/_utils/__init__.py b/scanpy/_utils/__init__.py index 8511465eab..a2254ad0cd 100644 --- a/scanpy/_utils/__init__.py +++ b/scanpy/_utils/__init__.py @@ -271,25 +271,6 @@ def get_igraph_from_adjacency(adjacency, directed=None): return g -def get_sparse_from_igraph(graph, weight_attr=None): - from scipy.sparse import csr_matrix - - edges = graph.get_edgelist() - if weight_attr is None: - weights = [1] * len(edges) - else: - weights = graph.es[weight_attr] - if not graph.is_directed(): - edges.extend([(v, u) for u, v in edges]) - weights.extend(weights) - shape = graph.vcount() - shape = (shape, shape) - if len(edges) > 0: - return csr_matrix((weights, zip(*edges)), shape=shape) - else: - return csr_matrix(shape) - - # -------------------------------------------------------------------------------- # Group stuff # -------------------------------------------------------------------------------- diff --git a/scanpy/tools/_paga.py b/scanpy/tools/_paga.py index 6f513a22b5..b8c1d66c99 100644 --- a/scanpy/tools/_paga.py +++ b/scanpy/tools/_paga.py @@ -186,7 +186,7 @@ def _compute_connectivities_v1_2(self): n = sum(ns) es_inner_cluster = [vc.subgraph(i).ecount() for i in range(len(ns))] cg = vc.cluster_graph(combine_edges="sum") - inter_es = _utils.get_sparse_from_igraph(cg, weight_attr="weight") + inter_es = cg.get_adjacency_sparse(attribute="weight") es = np.array(es_inner_cluster) + inter_es.sum(axis=1).A1 inter_es = inter_es + inter_es.T # \epsilon_i + \epsilon_j connectivities = inter_es.copy() @@ -220,7 +220,7 @@ def _compute_connectivities_v1_0(self): ) ns = vc.sizes() cg = vc.cluster_graph(combine_edges="sum") - inter_es = _utils.get_sparse_from_igraph(cg, weight_attr="weight") / 2 + inter_es = cg.get_adjacency_sparse(attribute="weight") / 2 connectivities = inter_es.copy() inter_es = inter_es.tocoo() n_neighbors_sq = self._neighbors.n_neighbors**2 @@ -301,7 +301,7 @@ def compute_transitions(self): ) # set combine_edges to False if you want self loops cg_full = vc.cluster_graph(combine_edges="sum") - transitions = _utils.get_sparse_from_igraph(cg_full, weight_attr="weight") + transitions = cg_full.get_adjacency_sparse(attribute="weight") transitions = transitions - transitions.T transitions_conf = transitions.copy() transitions = transitions.tocoo() @@ -343,7 +343,7 @@ def compute_transitions_old(self): g_bool, membership=self._adata.obs[self._groups_key].cat.codes.values ) cg_bool = vc_bool.cluster_graph(combine_edges="sum") # collapsed version - transitions = _utils.get_sparse_from_igraph(cg_bool, weight_attr="weight") + transitions = cg_bool.get_adjacency_sparse(attribute="weight") total_n = self._neighbors.n_neighbors * np.array(vc_bool.sizes()) transitions_ttest = transitions.copy() transitions_confidence = transitions.copy() From 4b757d85b015f028e7a283f509cbb77d82476754 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Fri, 22 Mar 2024 17:22:57 +0100 Subject: [PATCH 46/54] (feat): pre-processing functions for `dask` with sparse chunks (#2856) * (chore): add dask sparse chunks creation * (feat): add dask summation * (refactor): `materialize_as_ndarray` needs to operate on indidiual dask arrays * (feat): `filter_genes` and `filter_cells` * (feat): normalization * (fix) `lop1p` tests working * (refactor): clean up writing test * (refactor): us `da.chunk.sum` * (fix): remove `Client` * (refactor): remove unnecessary `count_nonzero` * (fix): change expected fail on sparse normalization * (fix): update comment * (feat): `_get_mean_var` dask * (feat): clean up tests for what should/should not work * (refactor): `_compat.sum` to `_utils.elem_sum` * (chore): add `elem_sum` test * (refactor): `elem_sum` -> `axis_sum` * (feat): add `scale` support * (fix): maintain dtype * (chore): add back condition * (fix): use `sum` when needed * (chore): release notes * (fx): don't use `mean_func` name twice * (chore): revert sparse-chunks-in-dask * (chore): type hint * (chore): check `test_compare_to_upstream` * (chore): remove comment * (chore): allow passing `dtype` arg in `axis_sum` * (fix): revert fixture changes * (refactor): cleaner with `array_type` conversion before if-then * (chore): clarify hvg support * (chore): handle array types better * (chore): clean up `materialize_as_ndarray` * (chore): fix typing/dispatch problem in 3.9 * (chore): `list` type -> `Callable` * (feat): `row_divide` for better division handling * (fix): use `tuple` for `ARRAY_TYPEXXXX` * (refactor): `mean_func` -> `axis_mean` + types * (chore): remove unnecessary aggregation * (fix): raise `ValueError` for summing over more than one axis * (fix): grammar * (fix): better type hints * (revert): use old `test_normalize_total` siince we have `csr` * (revert): extraneous diff * (fix): try `Union` * (chore): add column division ability * (chore): add scale test * (fix): duplicate in release note * (refactor): guard clause + comments * (chore): add `out` check for `dask` * (chore): add `divisor` type hints * (fix): remove some erroneous diffs * (chore): `axis_{sum,mean}` type hint fixes * (refactor): generalize to scaling * (chore): remove erroneous comment * (chore): remove non-public API * (fix): import from `sc._utils` * (fix): `inidices` -> `indices` * (fix): remove erroneous `axis_sum` calls * (fix): return statements for `axis_scale` * (refactor): return out of `axis_sum` if `X._meta` is `np.ndarray` * (core): comment fix * (fix): use `normalize_total` in HVG test for true reproducibility * (refactor): separate out `out` test for dask * (fix): correct chunking/rechunking behavior * (chore): add guard clause for `sparse` `out != X != None` in scaling * (fix): guard clause condition * (fix): try finishing `|` typing for 3.9 * (fix): call `register` to allow unions? * (fix): clarify warning * (feat): test for `max_value`/`zero_center` combos * (fix): allow settings of `X` in `scale_array` * (chore): add tests for `normalize` correctness * (fix): refactor for pure dask in `median` * (refactor): add clarifying condition * (chore): skip warning computations + tests * (fix): actually skip computation in `normalize_total` condition * (fix): actually skip in `filter_genes` + tests * (fix): use all-in-one median implemetation * (refactor): remove erreous dask warnings * (chore): add note about `exclude_highly_expressed` * (feat): `axis_scale` -> `axis_mul_or_truediv` * (feat): `allow_divide_by_zero` * (chore): add notes + type hints * Have hvg compute earlier and only once * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * (refactor): make codecov better by removing dead code/refactoring * (fix): `np.clip` in dask does not take min/max as `kwargs` * Update docs/release-notes/1.11.0.md Co-authored-by: Isaac Virshup * (chore): move release note * (chore): remove erroneous comment --------- Co-authored-by: ilan-gold Co-authored-by: Isaac Virshup Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/release-notes/1.10.0.md | 1 + scanpy/_utils/__init__.py | 223 +++++++++++++++++- scanpy/preprocessing/_distributed.py | 4 +- .../preprocessing/_highly_variable_genes.py | 6 +- scanpy/preprocessing/_normalization.py | 66 ++++-- scanpy/preprocessing/_simple.py | 77 ++++-- scanpy/preprocessing/_utils.py | 22 +- scanpy/testing/_pytest/params.py | 16 +- scanpy/tests/test_highly_variable_genes.py | 24 +- scanpy/tests/test_normalization.py | 49 +++- scanpy/tests/test_pca.py | 8 +- scanpy/tests/test_preprocessing.py | 121 +++++++++- scanpy/tests/test_utils.py | 129 +++++++++- 13 files changed, 651 insertions(+), 95 deletions(-) diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index fab39ca94f..52d6be2d9c 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -27,6 +27,7 @@ * `scanpy.pp.calculate_qc_metrics` now allows `qc_vars` to be passed as a string {pr}`2859` {smaller}`N Teyssier` * {func}`scanpy.tl.leiden` and {func}`scanpy.tl.louvain` now store clustering parameters in the key provided by the `key_added` parameter instead of always writing to (or overwriting) a default key {pr}`2864` {smaller}`J Fan` * {func}`scanpy.pp.scale` now clips `np.ndarray` also at `- max_value` for zero-centering {pr}`2913` {smaller}`S Dicks` +* Support sparse chunks in dask {func}`~scanpy.pp.scale`, {func}`~scanpy.pp.normalize_total` and {func}`~scanpy.pp.highly_variable_genes` (`seurat` and `cell-ranger` tested) {pr}`2856` {smaller}`ilan-gold` ```{rubric} Docs ``` diff --git a/scanpy/_utils/__init__.py b/scanpy/_utils/__init__.py index a2254ad0cd..5acbc3482f 100644 --- a/scanpy/_utils/__init__.py +++ b/scanpy/_utils/__init__.py @@ -15,9 +15,18 @@ from contextlib import contextmanager from enum import Enum from functools import partial, singledispatch, wraps +from operator import mul, truediv from textwrap import dedent from types import MethodType, ModuleType -from typing import TYPE_CHECKING, Any, Callable, Literal, Union +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Literal, + TypeVar, + Union, + overload, +) from weakref import WeakSet import numpy as np @@ -542,6 +551,218 @@ def _elem_mul_dask(x: DaskArray, y: DaskArray) -> DaskArray: return da.map_blocks(elem_mul, x, y) +Scaling_T = TypeVar("Scaling_T", DaskArray, np.ndarray) + + +def broadcast_axis(divisor: Scaling_T, axis: Literal[0, 1]) -> Scaling_T: + divisor = np.ravel(divisor) + if axis: + return divisor[None, :] + return divisor[:, None] + + +def check_op(op): + if op not in {truediv, mul}: + raise ValueError(f"{op} not one of truediv or mul") + + +@singledispatch +def axis_mul_or_truediv( + X: sparse.spmatrix, + scaling_array, + axis: Literal[0, 1], + op: Callable[[Any, Any], Any], + *, + allow_divide_by_zero: bool = True, + out: sparse.spmatrix | None = None, +) -> sparse.spmatrix: + check_op(op) + if out is not None: + if X.data is not out.data: + raise ValueError( + "`out` argument provided but not equal to X. This behavior is not supported for sparse matrix scaling." + ) + if not allow_divide_by_zero and op is truediv: + scaling_array = scaling_array.copy() + (scaling_array == 0) + + row_scale = axis == 0 + column_scale = axis == 1 + if row_scale: + + def new_data_op(x): + return op(x.data, np.repeat(scaling_array, np.diff(x.indptr))) + + elif column_scale: + + def new_data_op(x): + return op(x.data, scaling_array.take(x.indices, mode="clip")) + + if X.format == "csr": + indices = X.indices + indptr = X.indptr + if out is not None: + X.data = new_data_op(X) + return X + return sparse.csr_matrix( + (new_data_op(X), indices.copy(), indptr.copy()), shape=X.shape + ) + transposed = X.T + return axis_mul_or_truediv( + transposed, + scaling_array, + op=op, + axis=1 - axis, + out=transposed, + allow_divide_by_zero=allow_divide_by_zero, + ).T + + +@axis_mul_or_truediv.register(np.ndarray) +def _( + X: np.ndarray, + scaling_array: np.ndarray, + axis: Literal[0, 1], + op: Callable[[Any, Any], Any], + *, + allow_divide_by_zero: bool = True, + out: np.ndarray | None = None, +) -> np.ndarray: + check_op(op) + scaling_array = broadcast_axis(scaling_array, axis) + if op is mul: + return np.multiply(X, scaling_array, out=out) + if not allow_divide_by_zero: + scaling_array = scaling_array.copy() + (scaling_array == 0) + return np.true_divide(X, scaling_array, out=out) + + +def make_axis_chunks( + X: DaskArray, axis: Literal[0, 1], pad=True +) -> tuple[tuple[int], tuple[int]]: + if axis == 0: + return (X.chunks[axis], (1,)) + return ((1,), X.chunks[axis]) + + +@axis_mul_or_truediv.register(DaskArray) +def _( + X: DaskArray, + scaling_array: Scaling_T, + axis: Literal[0, 1], + op: Callable[[Any, Any], Any], + *, + allow_divide_by_zero: bool = True, + out: None = None, +) -> DaskArray: + check_op(op) + if out is not None: + raise TypeError( + "`out` is not `None`. Do not do in-place modifications on dask arrays." + ) + + import dask.array as da + + scaling_array = broadcast_axis(scaling_array, axis) + row_scale = axis == 0 + column_scale = axis == 1 + + if isinstance(scaling_array, DaskArray): + if (row_scale and not X.chunksize[0] == scaling_array.chunksize[0]) or ( + column_scale + and ( + ( + len(scaling_array.chunksize) == 1 + and X.chunksize[1] != scaling_array.chunksize[0] + ) + or ( + len(scaling_array.chunksize) == 2 + and X.chunksize[1] != scaling_array.chunksize[1] + ) + ) + ): + warnings.warn("Rechunking scaling_array in user operation", UserWarning) + scaling_array = scaling_array.rechunk(make_axis_chunks(X, axis)) + else: + scaling_array = da.from_array( + scaling_array, + chunks=make_axis_chunks(X, axis), + ) + return da.map_blocks( + axis_mul_or_truediv, + X, + scaling_array, + axis, + op, + meta=X._meta, + out=out, + allow_divide_by_zero=allow_divide_by_zero, + ) + + +@overload +def axis_sum( + X: sparse.spmatrix, + *, + axis: tuple[Literal[0, 1], ...] | Literal[0, 1] | None = None, + dtype: np.typing.DTypeLike | None = None, +) -> np.matrix: ... + + +@singledispatch +def axis_sum( + X: np.ndarray, + *, + axis: tuple[Literal[0, 1], ...] | Literal[0, 1] | None = None, + dtype: np.typing.DTypeLike | None = None, +) -> np.ndarray: + return np.sum(X, axis=axis, dtype=dtype) + + +@axis_sum.register(DaskArray) +def _( + X: DaskArray, + *, + axis: tuple[Literal[0, 1], ...] | Literal[0, 1] | None = None, + dtype: np.typing.DTypeLike | None = None, +) -> DaskArray: + import dask.array as da + + if dtype is None: + dtype = getattr(np.zeros(1, dtype=X.dtype).sum(), "dtype", object) + + if isinstance(X._meta, np.ndarray) and not isinstance(X._meta, np.matrix): + return X.sum(axis=axis, dtype=dtype) + + def sum_drop_keepdims(*args, **kwargs): + kwargs.pop("computing_meta", None) + # masked operations on sparse produce which numpy matrices gives the same API issues handled here + if isinstance(X._meta, (sparse.spmatrix, np.matrix)) or isinstance( + args[0], (sparse.spmatrix, np.matrix) + ): + kwargs.pop("keepdims", None) + axis = kwargs["axis"] + if isinstance(axis, tuple): + if len(axis) != 1: + raise ValueError( + f"`axis_sum` can only sum over one axis when `axis` arg is provided but got {axis} instead" + ) + kwargs["axis"] = axis[0] + # returns a np.matrix normally, which is undesireable + return np.array(np.sum(*args, dtype=dtype, **kwargs)) + + def aggregate_sum(*args, **kwargs): + return np.sum(args[0], dtype=dtype, **kwargs) + + return da.reduction( + X, + sum_drop_keepdims, + aggregate_sum, + axis=axis, + dtype=dtype, + meta=np.array([], dtype=dtype), + ) + + @singledispatch def check_nonnegative_integers(X: _SupportedArray) -> bool | DaskArray: """Checks values of X to ensure it is count data""" diff --git a/scanpy/preprocessing/_distributed.py b/scanpy/preprocessing/_distributed.py index 195550de17..c653ffadc2 100644 --- a/scanpy/preprocessing/_distributed.py +++ b/scanpy/preprocessing/_distributed.py @@ -31,9 +31,11 @@ def materialize_as_ndarray( def materialize_as_ndarray( - a: ArrayLike | tuple[ArrayLike | ZappyArray | DaskArray, ...], + a: DaskArray | ArrayLike | tuple[ArrayLike | ZappyArray | DaskArray, ...], ) -> tuple[np.ndarray] | np.ndarray: """Compute distributed arrays and convert them to numpy ndarrays.""" + if isinstance(a, DaskArray): + return a.compute() if not isinstance(a, tuple): return np.asarray(a) diff --git a/scanpy/preprocessing/_highly_variable_genes.py b/scanpy/preprocessing/_highly_variable_genes.py index dad4d06160..08470e3c76 100644 --- a/scanpy/preprocessing/_highly_variable_genes.py +++ b/scanpy/preprocessing/_highly_variable_genes.py @@ -267,7 +267,7 @@ def _highly_variable_genes_single_batch( else: X = np.expm1(X) - mean, var = _get_mean_var(X) + mean, var = materialize_as_ndarray(_get_mean_var(X)) # now actually compute the dispersion mean[mean == 0] = 1e-12 # set entries equal to zero to small value dispersion = var / mean @@ -277,9 +277,7 @@ def _highly_variable_genes_single_batch( mean = np.log1p(mean) # all of the following quantities are "per-gene" here - df = pd.DataFrame( - dict(zip(["means", "dispersions"], materialize_as_ndarray((mean, dispersion)))) - ) + df = pd.DataFrame(dict(zip(["means", "dispersions"], (mean, dispersion)))) df["mean_bin"] = _get_mean_bins(df["means"], flavor, n_bins) disp_stats = _get_disp_stats(df, flavor) diff --git a/scanpy/preprocessing/_normalization.py b/scanpy/preprocessing/_normalization.py index ea50686e60..3dd4e0b2a6 100644 --- a/scanpy/preprocessing/_normalization.py +++ b/scanpy/preprocessing/_normalization.py @@ -1,17 +1,24 @@ from __future__ import annotations +from operator import truediv from typing import TYPE_CHECKING, Literal from warnings import warn import numpy as np from scipy.sparse import issparse -from sklearn.utils import sparsefuncs from .. import logging as logg from .._compat import DaskArray, old_positionals -from .._utils import view_to_actual +from .._utils import axis_mul_or_truediv, axis_sum, view_to_actual from ..get import _get_obs_rep, _set_obs_rep +try: + import dask + import dask.array as da +except ImportError: + da = None + dask = None + if TYPE_CHECKING: from collections.abc import Iterable @@ -22,21 +29,30 @@ def _normalize_data(X, counts, after=None, copy: bool = False): X = X.copy() if copy else X if issubclass(X.dtype.type, (int, np.integer)): X = X.astype(np.float32) # TODO: Check if float64 should be used - if isinstance(counts, DaskArray): - counts_greater_than_zero = counts[counts > 0].compute_chunk_sizes() - else: - counts_greater_than_zero = counts[counts > 0] + if after is None: + if isinstance(counts, DaskArray): + + def nonzero_median(x): + return np.ma.median(np.ma.masked_array(x, x == 0)).item() - after = np.median(counts_greater_than_zero, axis=0) if after is None else after - counts += counts == 0 + after = da.from_delayed( + dask.delayed(nonzero_median)(counts), + shape=(), + meta=counts._meta, + dtype=counts.dtype, + ) + else: + counts_greater_than_zero = counts[counts > 0] + after = np.median(counts_greater_than_zero, axis=0) counts = counts / after - if issparse(X): - sparsefuncs.inplace_row_scale(X, 1 / counts) - elif isinstance(counts, np.ndarray): - np.divide(X, counts[:, None], out=X) - else: - X = np.divide(X, counts[:, None]) # dask does not support kwarg "out" - return X + return axis_mul_or_truediv( + X, + counts, + op=truediv, + out=X if isinstance(X, np.ndarray) or issparse(X) else None, + allow_divide_by_zero=False, + axis=0, + ) @old_positionals( @@ -78,6 +94,11 @@ def normalize_total( Similar functions are used, for example, by Seurat [Satija15]_, Cell Ranger [Zheng17]_ or SPRING [Weinreb17]_. + .. note:: + When used with a :class:`~dask.array.Array` in `adata.X`, this function will have to + call functions that trigger `.compute()` on the :class:`~dask.array.Array` if `exclude_highly_expressed` + is `True`, `layer_norm` is not `None`, or if `key_added` is not `None`. + Params ------ adata @@ -92,7 +113,8 @@ def normalize_total( normalization factor (size factor) for each cell. A gene is considered highly expressed, if it has more than `max_fraction` of the total counts in at least one cell. The not-excluded genes will sum up to - `target_sum`. + `target_sum`. Providing this argument when `adata.X` is a :class:`~dask.array.Array` + will incur blocking `.compute()` calls on the array. max_fraction If `exclude_highly_expressed=True`, consider cells as highly expressed that have more counts than `max_fraction` of the original total counts @@ -187,27 +209,27 @@ def normalize_total( gene_subset = None msg = "normalizing counts per cell" + + counts_per_cell = axis_sum(X, axis=1) if exclude_highly_expressed: - counts_per_cell = X.sum(1) # original counts per cell counts_per_cell = np.ravel(counts_per_cell) # at least one cell as more than max_fraction of counts per cell - gene_subset = (X > counts_per_cell[:, None] * max_fraction).sum(0) + gene_subset = axis_sum((X > counts_per_cell[:, None] * max_fraction), axis=0) gene_subset = np.asarray(np.ravel(gene_subset) == 0) msg += ( ". The following highly-expressed genes are not considered during " f"normalization factor computation:\n{adata.var_names[~gene_subset].tolist()}" ) - counts_per_cell = X[:, gene_subset].sum(1) - else: - counts_per_cell = X.sum(1) + counts_per_cell = axis_sum(X[:, gene_subset], axis=1) + start = logg.info(msg) counts_per_cell = np.ravel(counts_per_cell) cell_subset = counts_per_cell > 0 - if not np.all(cell_subset): + if not isinstance(cell_subset, DaskArray) and not np.all(cell_subset): warn(UserWarning("Some cells have zero counts")) if inplace: diff --git a/scanpy/preprocessing/_simple.py b/scanpy/preprocessing/_simple.py index 2ab6f31370..a8099f52e7 100644 --- a/scanpy/preprocessing/_simple.py +++ b/scanpy/preprocessing/_simple.py @@ -7,6 +7,7 @@ import warnings from functools import singledispatch +from operator import truediv from typing import TYPE_CHECKING, Literal import numba @@ -18,11 +19,13 @@ from sklearn.utils import check_array, sparsefuncs from .. import logging as logg -from .._compat import old_positionals +from .._compat import DaskArray, old_positionals from .._settings import settings as sett from .._utils import ( AnyRandom, _check_array_function_arguments, + axis_mul_or_truediv, + axis_sum, renamed_arg, sanitize_anndata, view_to_actual, @@ -51,7 +54,7 @@ "min_counts", "min_genes", "max_counts", "max_genes", "inplace", "copy" ) def filter_cells( - data: AnnData | spmatrix | np.ndarray, + data: AnnData | spmatrix | np.ndarray | DaskArray, *, min_counts: int | None = None, min_genes: int | None = None, @@ -163,7 +166,7 @@ def filter_cells( X = data # proceed with processing the data matrix min_number = min_counts if min_genes is None else min_genes max_number = max_counts if max_genes is None else max_genes - number_per_cell = np.sum( + number_per_cell = axis_sum( X if min_genes is None and max_genes is None else X > 0, axis=1 ) if issparse(X): @@ -173,7 +176,7 @@ def filter_cells( if max_number is not None: cell_subset = number_per_cell <= max_number - s = materialize_as_ndarray(np.sum(~cell_subset)) + s = axis_sum(~cell_subset) if s > 0: msg = f"filtered out {s} cells that have " if min_genes is not None or min_counts is not None: @@ -198,7 +201,7 @@ def filter_cells( "min_counts", "min_cells", "max_counts", "max_cells", "inplace", "copy" ) def filter_genes( - data: AnnData | spmatrix | np.ndarray, + data: AnnData | spmatrix | np.ndarray | DaskArray, *, min_counts: int | None = None, min_cells: int | None = None, @@ -279,7 +282,7 @@ def filter_genes( X = data # proceed with processing the data matrix min_number = min_counts if min_cells is None else min_cells max_number = max_counts if max_cells is None else max_cells - number_per_gene = np.sum( + number_per_gene = axis_sum( X if min_cells is None and max_cells is None else X > 0, axis=0 ) if issparse(X): @@ -289,7 +292,7 @@ def filter_genes( if max_number is not None: gene_subset = number_per_gene <= max_number - s = np.sum(~gene_subset) + s = axis_sum(~gene_subset) if s > 0: msg = f"filtered out {s} genes that are detected " if min_cells is not None or min_counts is not None: @@ -750,7 +753,7 @@ def _regress_out_chunk(data): @old_positionals("zero_center", "max_value", "copy", "layer", "obsm") @singledispatch def scale( - data: AnnData | spmatrix | np.ndarray, + data: AnnData | spmatrix | np.ndarray | DaskArray, *, zero_center: bool = True, max_value: float | None = None, @@ -758,7 +761,7 @@ def scale( layer: str | None = None, obsm: str | None = None, mask_obs: NDArray[np.bool_] | str | None = None, -) -> AnnData | spmatrix | np.ndarray | None: +) -> AnnData | spmatrix | np.ndarray | DaskArray | None: """\ Scale data to unit variance and zero mean. @@ -817,15 +820,23 @@ def scale( @scale.register(np.ndarray) +@scale.register(DaskArray) def scale_array( - X: np.ndarray, + X: np.ndarray | DaskArray, *, zero_center: bool = True, max_value: float | None = None, copy: bool = False, return_mean_std: bool = False, mask_obs: NDArray[np.bool_] | None = None, -) -> np.ndarray | tuple[np.ndarray, NDArray[np.float64], NDArray[np.float64]]: +) -> ( + np.ndarray + | DaskArray + | tuple[ + np.ndarray | DaskArray, NDArray[np.float64] | DaskArray, NDArray[np.float64] + ] + | DaskArray +): if copy: X = X.copy() if mask_obs is not None: @@ -860,22 +871,40 @@ def scale_array( mean, var = _get_mean_var(X) std = np.sqrt(var) std[std == 0] = 1 - if issparse(X): - if zero_center: - raise ValueError("Cannot zero-center sparse matrix.") - sparsefuncs.inplace_column_scale(X, 1 / std) - else: - if zero_center: - X -= mean - X /= std + if zero_center: + if isinstance(X, DaskArray) and issparse(X._meta): + warnings.warn( + "zero-center being used with `DaskArray` sparse chunks. This can be bad if you have large chunks or intend to eventually read the whole data into memory.", + UserWarning, + ) + X -= mean + X = axis_mul_or_truediv( + X, + std, + op=truediv, + out=X if isinstance(X, np.ndarray) or issparse(X) else None, + axis=1, + ) # do the clipping if max_value is not None: logg.debug(f"... clipping at max_value {max_value}") - if zero_center: - X = np.clip(X, a_min=-max_value, a_max=max_value) + if isinstance(X, DaskArray) and issparse(X._meta): + + def clip_set(x): + x = x.copy() + x[x > max_value] = max_value + if zero_center: + x[x < -max_value] = -max_value + return x + + X = da.map_blocks(clip_set, X) else: - X[X > max_value] = max_value + if zero_center: + a_min, a_max = -max_value, max_value + X = np.clip(X, a_min, a_max) # dask does not accept these as kwargs + else: + X[X > max_value] = max_value if return_mean_std: return X, mean, std else: @@ -1084,7 +1113,7 @@ def _downsample_per_cell(X, counts_per_cell, random_state, replace): original_type = type(X) if not isspmatrix_csr(X): X = csr_matrix(X) - totals = np.ravel(X.sum(axis=1)) # Faster for csr matrix + totals = np.ravel(axis_sum(X, axis=1)) # Faster for csr matrix under_target = np.nonzero(totals > counts_per_cell)[0] rows = np.split(X.data, X.indptr[1:-1]) for rowidx in under_target: @@ -1100,7 +1129,7 @@ def _downsample_per_cell(X, counts_per_cell, random_state, replace): if original_type is not csr_matrix: # Put it back X = original_type(X) else: - totals = np.ravel(X.sum(axis=1)) + totals = np.ravel(axis_sum(X, axis=1)) under_target = np.nonzero(totals > counts_per_cell)[0] for rowidx in under_target: row = X[rowidx, :] diff --git a/scanpy/preprocessing/_utils.py b/scanpy/preprocessing/_utils.py index b9f6eb131c..4220503e6e 100644 --- a/scanpy/preprocessing/_utils.py +++ b/scanpy/preprocessing/_utils.py @@ -1,5 +1,6 @@ from __future__ import annotations +from functools import singledispatch from typing import TYPE_CHECKING, Literal import numba @@ -7,11 +8,26 @@ from scipy import sparse from sklearn.random_projection import sample_without_replacement -from .._utils import AnyRandom, _SupportedArray, elem_mul +from .._utils import AnyRandom, _SupportedArray, axis_sum, elem_mul if TYPE_CHECKING: from numpy.typing import NDArray + from .._compat import DaskArray + + +@singledispatch +def axis_mean( + X: DaskArray, *, axis: Literal[0, 1], dtype: np.typing.DTypeLike +) -> DaskArray: + total = axis_sum(X, axis=axis, dtype=dtype) + return total / X.shape[axis] + + +@axis_mean.register(np.ndarray) +def _(X: np.ndarray, *, axis: Literal[0, 1], dtype: np.typing.DTypeLike) -> np.ndarray: + return X.mean(axis=axis, dtype=dtype) + def _get_mean_var( X: _SupportedArray, *, axis: Literal[0, 1] = 0 @@ -19,8 +35,8 @@ def _get_mean_var( if isinstance(X, sparse.spmatrix): mean, var = sparse_mean_variance_axis(X, axis=axis) else: - mean = X.mean(axis=axis, dtype=np.float64) - mean_sq = elem_mul(X, X).mean(axis=axis, dtype=np.float64) + mean = axis_mean(X, axis=axis, dtype=np.float64) + mean_sq = axis_mean(elem_mul(X, X), axis=axis, dtype=np.float64) var = mean_sq - mean**2 # enforce R convention (unbiased estimator) for variance var *= X.shape[axis] / (X.shape[axis] - 1) diff --git a/scanpy/testing/_pytest/params.py b/scanpy/testing/_pytest/params.py index 655daf6c7a..6acd44c8a0 100644 --- a/scanpy/testing/_pytest/params.py +++ b/scanpy/testing/_pytest/params.py @@ -8,7 +8,10 @@ from anndata.tests.helpers import asarray from scipy import sparse -from .._helpers import as_dense_dask_array, as_sparse_dask_array +from .._helpers import ( + as_dense_dask_array, + as_sparse_dask_array, +) from .._pytest.marks import needs if TYPE_CHECKING: @@ -63,21 +66,16 @@ def param_with( at for (_, spsty), ats in MAP_ARRAY_TYPES.items() if spsty == "dense" for at in ats ) ARRAY_TYPES_SPARSE = tuple( - at for (_, spsty), ats in MAP_ARRAY_TYPES.items() if spsty == "dense" for at in ats + at for (_, spsty), ats in MAP_ARRAY_TYPES.items() if "sparse" in spsty for at in ats ) - -ARRAY_TYPES_SUPPORTED = tuple( +ARRAY_TYPES_SPARSE_DASK_UNSUPPORTED = tuple( ( param_with(at, marks=[pytest.mark.xfail(reason="sparse-in-dask not supported")]) - if attrs == ("dask", "sparse") + if attrs[0] == "dask" and "sparse" in attrs[1] else at ) for attrs, ats in MAP_ARRAY_TYPES.items() for at in ats ) -""" -Sparse matrices in dask arrays aren’t officially supported upstream, -so add xfail to them. -""" ARRAY_TYPES = tuple(at for ats in MAP_ARRAY_TYPES.values() for at in ats) diff --git a/scanpy/tests/test_highly_variable_genes.py b/scanpy/tests/test_highly_variable_genes.py index 27b237ad5b..9ef3ab5945 100644 --- a/scanpy/tests/test_highly_variable_genes.py +++ b/scanpy/tests/test_highly_variable_genes.py @@ -2,7 +2,7 @@ from pathlib import Path from string import ascii_letters -from typing import Literal +from typing import Callable, Literal import numpy as np import pandas as pd @@ -15,7 +15,7 @@ from scanpy.testing._helpers import _check_check_values_warnings from scanpy.testing._helpers.data import pbmc3k, pbmc68k_reduced from scanpy.testing._pytest.marks import needs -from scanpy.testing._pytest.params import ARRAY_TYPES_SUPPORTED +from scanpy.testing._pytest.params import ARRAY_TYPES FILE = Path(__file__).parent / Path("_scripts/seurat_hvg.csv") FILE_V3 = Path(__file__).parent / Path("_scripts/seurat_hvg_v3.csv.gz") @@ -85,7 +85,7 @@ def test_no_batch_matches_batch(adata): @pytest.mark.parametrize("batch_key", [None, "batch"], ids=["single", "batched"]) -@pytest.mark.parametrize("array_type", ARRAY_TYPES_SUPPORTED) +@pytest.mark.parametrize("array_type", ARRAY_TYPES) def test_no_inplace(adata, array_type, batch_key): """Tests that, with `n_top_genes=None` the returned dataframe has the expected columns.""" adata.X = array_type(adata.X) @@ -338,12 +338,14 @@ def test_pearson_residuals_batch(pbmc3k_parametrized_small, subset, n_top_genes) ), ], ) -def test_compare_to_upstream( +@pytest.mark.parametrize("array_type", ARRAY_TYPES) +def test_compare_to_upstream( # noqa: PLR0917 request: pytest.FixtureRequest, func: Literal["hvg", "fgd"], flavor: Literal["seurat", "cell_ranger"], params: dict[str, float | int], ref_path: Path, + array_type: Callable, ): if func == "fgd" and flavor == "cell_ranger": msg = "The deprecated filter_genes_dispersion behaves differently with cell_ranger" @@ -352,9 +354,11 @@ def test_compare_to_upstream( pbmc = pbmc68k_reduced() pbmc.X = pbmc.raw.X + pbmc.X = array_type(pbmc.X) pbmc.var_names_make_unique() + sc.pp.filter_cells(pbmc, min_counts=1) + sc.pp.normalize_total(pbmc, target_sum=1e4) - sc.pp.normalize_per_cell(pbmc, counts_per_cell_after=1e4) if func == "hvg": sc.pp.log1p(pbmc) sc.pp.highly_variable_genes(pbmc, flavor=flavor, **params, inplace=True) @@ -386,8 +390,8 @@ def test_compare_to_upstream( np.testing.assert_allclose( hvg_info["dispersions_norm"], pbmc.var["dispersions_norm"], - rtol=2e-05, - atol=2e-05, + rtol=2e-05 if "dask" not in array_type.__name__ else 1e-4, + atol=2e-05 if "dask" not in array_type.__name__ else 1e-4, ) @@ -568,7 +572,7 @@ def test_cutoff_info(): @pytest.mark.parametrize("flavor", ["seurat", "cell_ranger"]) -@pytest.mark.parametrize("array_type", ARRAY_TYPES_SUPPORTED) +@pytest.mark.parametrize("array_type", ARRAY_TYPES) @pytest.mark.parametrize("subset", [True, False], ids=["subset", "full"]) @pytest.mark.parametrize("inplace", [True, False], ids=["inplace", "copy"]) def test_subset_inplace_consistency(flavor, array_type, subset, inplace): @@ -609,7 +613,7 @@ def test_subset_inplace_consistency(flavor, array_type, subset, inplace): @pytest.mark.parametrize("flavor", ["seurat", "cell_ranger"]) @pytest.mark.parametrize("batch_key", [None, "batch"], ids=["single", "batched"]) @pytest.mark.parametrize( - "to_dask", [p for p in ARRAY_TYPES_SUPPORTED if "dask" in p.values[0].__name__] + "to_dask", [p for p in ARRAY_TYPES if "dask" in p.values[0].__name__] ) def test_dask_consistency(adata: AnnData, flavor, batch_key, to_dask): adata.X = np.abs(adata.X).astype(int) @@ -632,4 +636,4 @@ def test_dask_consistency(adata: AnnData, flavor, batch_key, to_dask): assert_index_equal(adata.var_names, output_mem.index, check_names=False) assert_index_equal(adata.var_names, output_dask.index, check_names=False) - assert_frame_equal(output_mem, output_dask) + assert_frame_equal(output_mem, output_dask, atol=1e-4) diff --git a/scanpy/tests/test_normalization.py b/scanpy/tests/test_normalization.py index ea7556db74..3582b51fed 100644 --- a/scanpy/tests/test_normalization.py +++ b/scanpy/tests/test_normalization.py @@ -8,8 +8,10 @@ from anndata.tests.helpers import assert_equal from scipy import sparse from scipy.sparse import csr_matrix +from sklearn.utils import issparse import scanpy as sc +from scanpy._utils import axis_sum from scanpy.testing._helpers import ( _check_check_values_warnings, check_rep_mutation, @@ -17,7 +19,7 @@ ) # TODO: Add support for sparse-in-dask -from scanpy.testing._pytest.params import ARRAY_TYPES_SUPPORTED +from scanpy.testing._pytest.params import ARRAY_TYPES if TYPE_CHECKING: from collections.abc import Callable @@ -26,21 +28,50 @@ X_frac = np.array([[1, 0, 1], [3, 0, 1], [5, 6, 1]]) -@pytest.mark.parametrize("array_type", ARRAY_TYPES_SUPPORTED) +@pytest.mark.parametrize("array_type", ARRAY_TYPES) +@pytest.mark.parametrize("dtype", ["float32", "int64"]) +@pytest.mark.parametrize("target_sum", [None, 1.0]) +@pytest.mark.parametrize("exclude_highly_expressed", [True, False]) +def test_normalize_matrix_types( + array_type, dtype, target_sum, exclude_highly_expressed +): + adata = sc.datasets.pbmc68k_reduced() + adata.X = (adata.raw.X).astype(dtype) + adata_casted = adata.copy() + adata_casted.X = array_type(adata_casted.raw.X).astype(dtype) + sc.pp.normalize_total( + adata, target_sum=target_sum, exclude_highly_expressed=exclude_highly_expressed + ) + sc.pp.normalize_total( + adata_casted, + target_sum=target_sum, + exclude_highly_expressed=exclude_highly_expressed, + ) + X = adata_casted.X + if "dask" in array_type.__name__: + X = X.compute() + if issparse(X): + X = X.todense() + if issparse(adata.X): + adata.X = adata.X.todense() + np.testing.assert_allclose(X, adata.X, rtol=1e-5, atol=1e-5) + + +@pytest.mark.parametrize("array_type", ARRAY_TYPES) @pytest.mark.parametrize("dtype", ["float32", "int64"]) def test_normalize_total(array_type, dtype): adata = AnnData(array_type(X_total).astype(dtype)) sc.pp.normalize_total(adata, key_added="n_counts") - assert np.allclose(np.ravel(adata.X.sum(axis=1)), [3.0, 3.0, 3.0]) + assert np.allclose(np.ravel(axis_sum(adata.X, axis=1)), [3.0, 3.0, 3.0]) sc.pp.normalize_total(adata, target_sum=1, key_added="n_counts2") - assert np.allclose(np.ravel(adata.X.sum(axis=1)), [1.0, 1.0, 1.0]) + assert np.allclose(np.ravel(axis_sum(adata.X, axis=1)), [1.0, 1.0, 1.0]) adata = AnnData(array_type(X_frac).astype(dtype)) sc.pp.normalize_total(adata, exclude_highly_expressed=True, max_fraction=0.7) - assert np.allclose(np.ravel(adata.X[:, 1:3].sum(axis=1)), [1.0, 1.0, 1.0]) + assert np.allclose(np.ravel(axis_sum(adata.X[:, 1:3], axis=1)), [1.0, 1.0, 1.0]) -@pytest.mark.parametrize("array_type", ARRAY_TYPES_SUPPORTED) +@pytest.mark.parametrize("array_type", ARRAY_TYPES) @pytest.mark.parametrize("dtype", ["float32", "int64"]) def test_normalize_total_rep(array_type, dtype): # Test that layer kwarg works @@ -49,17 +80,17 @@ def test_normalize_total_rep(array_type, dtype): check_rep_results(sc.pp.normalize_total, X, fields=["layer"]) -@pytest.mark.parametrize("array_type", ARRAY_TYPES_SUPPORTED) +@pytest.mark.parametrize("array_type", ARRAY_TYPES) @pytest.mark.parametrize("dtype", ["float32", "int64"]) def test_normalize_total_layers(array_type, dtype): adata = AnnData(array_type(X_total).astype(dtype)) adata.layers["layer"] = adata.X.copy() with pytest.warns(FutureWarning, match=r".*layers.*deprecated"): sc.pp.normalize_total(adata, layers=["layer"]) - assert np.allclose(adata.layers["layer"].sum(axis=1), [3.0, 3.0, 3.0]) + assert np.allclose(axis_sum(adata.layers["layer"], axis=1), [3.0, 3.0, 3.0]) -@pytest.mark.parametrize("array_type", ARRAY_TYPES_SUPPORTED) +@pytest.mark.parametrize("array_type", ARRAY_TYPES) @pytest.mark.parametrize("dtype", ["float32", "int64"]) def test_normalize_total_view(array_type, dtype): adata = AnnData(array_type(X_total).astype(dtype)) diff --git a/scanpy/tests/test_pca.py b/scanpy/tests/test_pca.py index c2de64c0b9..2ffc490db2 100644 --- a/scanpy/tests/test_pca.py +++ b/scanpy/tests/test_pca.py @@ -19,7 +19,11 @@ from scanpy.testing._helpers import as_dense_dask_array, as_sparse_dask_array from scanpy.testing._helpers.data import pbmc3k_normalized from scanpy.testing._pytest.marks import needs -from scanpy.testing._pytest.params import ARRAY_TYPES, ARRAY_TYPES_SUPPORTED, param_with +from scanpy.testing._pytest.params import ( + ARRAY_TYPES, + ARRAY_TYPES_SPARSE_DASK_UNSUPPORTED, + param_with, +) A_list = np.array( [ @@ -59,7 +63,7 @@ @pytest.fixture( params=[ param_with(at, marks=[needs.dask_ml]) if "dask" in at.id else at - for at in ARRAY_TYPES_SUPPORTED + for at in ARRAY_TYPES_SPARSE_DASK_UNSUPPORTED ] ) def array_type(request: pytest.FixtureRequest): diff --git a/scanpy/tests/test_preprocessing.py b/scanpy/tests/test_preprocessing.py index 5ae3b3e08f..d043ac490c 100644 --- a/scanpy/tests/test_preprocessing.py +++ b/scanpy/tests/test_preprocessing.py @@ -9,6 +9,7 @@ from anndata.tests.helpers import asarray, assert_equal from numpy.testing import assert_allclose from scipy import sparse as sp +from sklearn.utils import issparse import scanpy as sc from scanpy.testing._helpers import ( @@ -17,7 +18,7 @@ check_rep_results, ) from scanpy.testing._helpers.data import pbmc3k, pbmc68k_reduced -from scanpy.testing._pytest.params import ARRAY_TYPES_SUPPORTED +from scanpy.testing._pytest.params import ARRAY_TYPES def test_log1p(tmp_path): @@ -59,8 +60,7 @@ def test_log1p_rep(count_matrix_format, base, dtype): check_rep_results(sc.pp.log1p, X, base=base) -# TODO: Add support for sparse-in-dask -@pytest.mark.parametrize("array_type", ARRAY_TYPES_SUPPORTED) +@pytest.mark.parametrize("array_type", ARRAY_TYPES) def test_mean_var(array_type): pbmc = pbmc3k() pbmc.X = array_type(pbmc.X) @@ -159,6 +159,43 @@ def test_subsample_copy_backed(tmp_path): sc.pp.subsample(adata_d, n_obs=40, copy=False) +@pytest.mark.parametrize("array_type", ARRAY_TYPES) +@pytest.mark.parametrize("zero_center", [True, False]) +@pytest.mark.parametrize("max_value", [None, 1.0]) +def test_scale_matrix_types(array_type, zero_center, max_value): + adata = pbmc68k_reduced() + adata.X = adata.raw.X + adata_casted = adata.copy() + adata_casted.X = array_type(adata_casted.raw.X) + sc.pp.scale(adata, zero_center=zero_center, max_value=max_value) + sc.pp.scale(adata_casted, zero_center=zero_center, max_value=max_value) + X = adata_casted.X + if "dask" in array_type.__name__: + X = X.compute() + if issparse(X): + X = X.todense() + if issparse(adata.X): + adata.X = adata.X.todense() + assert_allclose(X, adata.X, rtol=1e-5, atol=1e-5) + + +ARRAY_TYPES_DASK_SPARSE = [ + a for a in ARRAY_TYPES if "sparse" in a.id and "dask" in a.id +] + + +@pytest.mark.parametrize("array_type", ARRAY_TYPES_DASK_SPARSE) +def test_scale_zero_center_warns_dask_sparse(array_type): + adata = pbmc68k_reduced() + adata.X = adata.raw.X + adata_casted = adata.copy() + adata_casted.X = array_type(adata_casted.raw.X) + with pytest.warns(UserWarning, match="zero-center being used with `DaskArray`*"): + sc.pp.scale(adata_casted) + sc.pp.scale(adata) + assert_allclose(adata_casted.X, adata.X, rtol=1e-5, atol=1e-5) + + def test_scale(): adata = pbmc68k_reduced() adata.X = adata.raw.X @@ -407,3 +444,81 @@ def test_recipe_weinreb(): orig = adata.copy() sc.pp.recipe_weinreb17(adata, log=False, copy=True) assert_equal(orig, adata) + + +@pytest.mark.parametrize("array_type", ARRAY_TYPES) +@pytest.mark.parametrize( + "max_cells,max_counts,min_cells,min_counts", + [ + [100, None, None, None], + [None, 100, None, None], + [None, None, 20, None], + [None, None, None, 20], + ], +) +def test_filter_genes(array_type, max_cells, max_counts, min_cells, min_counts): + adata = pbmc68k_reduced() + adata.X = adata.raw.X + adata_casted = adata.copy() + adata_casted.X = array_type(adata_casted.raw.X) + sc.pp.filter_genes( + adata, + max_cells=max_cells, + max_counts=max_counts, + min_cells=min_cells, + min_counts=min_counts, + ) + sc.pp.filter_genes( + adata_casted, + max_cells=max_cells, + max_counts=max_counts, + min_cells=min_cells, + min_counts=min_counts, + ) + X = adata_casted.X + if "dask" in array_type.__name__: + X = X.compute() + if issparse(X): + X = X.todense() + if issparse(adata.X): + adata.X = adata.X.todense() + assert_allclose(X, adata.X, rtol=1e-5, atol=1e-5) + + +@pytest.mark.parametrize("array_type", ARRAY_TYPES) +@pytest.mark.parametrize( + "max_genes,max_counts,min_genes,min_counts", + [ + [100, None, None, None], + [None, 100, None, None], + [None, None, 20, None], + [None, None, None, 20], + ], +) +def test_filter_cells(array_type, max_genes, max_counts, min_genes, min_counts): + adata = pbmc68k_reduced() + adata.X = adata.raw.X + adata_casted = adata.copy() + adata_casted.X = array_type(adata_casted.raw.X) + sc.pp.filter_cells( + adata, + max_genes=max_genes, + max_counts=max_counts, + min_genes=min_genes, + min_counts=min_counts, + ) + sc.pp.filter_cells( + adata_casted, + max_genes=max_genes, + max_counts=max_counts, + min_genes=min_genes, + min_counts=min_counts, + ) + X = adata_casted.X + if "dask" in array_type.__name__: + X = X.compute() + if issparse(X): + X = X.todense() + if issparse(adata.X): + adata.X = adata.X.todense() + assert_allclose(X, adata.X, rtol=1e-5, atol=1e-5) diff --git a/scanpy/tests/test_utils.py b/scanpy/tests/test_utils.py index e7bdb24f7d..533485107a 100644 --- a/scanpy/tests/test_utils.py +++ b/scanpy/tests/test_utils.py @@ -1,21 +1,29 @@ from __future__ import annotations +from operator import mul, truediv from types import ModuleType import numpy as np import pytest from anndata.tests.helpers import asarray -from scipy.sparse import csr_matrix +from scipy.sparse import csr_matrix, issparse from scanpy._compat import DaskArray from scanpy._utils import ( + axis_mul_or_truediv, + axis_sum, check_nonnegative_integers, descend_classes_and_funcs, elem_mul, is_constant, ) from scanpy.testing._pytest.marks import needs -from scanpy.testing._pytest.params import ARRAY_TYPES, ARRAY_TYPES_SUPPORTED +from scanpy.testing._pytest.params import ( + ARRAY_TYPES, + ARRAY_TYPES_DASK, + ARRAY_TYPES_SPARSE, + ARRAY_TYPES_SPARSE_DASK_UNSUPPORTED, +) def test_descend_classes_and_funcs(): @@ -35,16 +43,123 @@ def test_descend_classes_and_funcs(): assert {a.A, a.b.B} == set(descend_classes_and_funcs(a, "a")) -# TODO: add support for dask-in-sparse -@pytest.mark.parametrize("array_type", ARRAY_TYPES_SUPPORTED) +def test_axis_mul_or_truediv_badop(): + dividend = np.array([[0, 1.0, 1.0], [1.0, 0, 1.0]]) + divisor = np.array([0.1, 0.2]) + with pytest.raises(ValueError, match=".*not one of truediv or mul"): + axis_mul_or_truediv(dividend, divisor, op=np.add, axis=0) + + +def test_axis_mul_or_truediv_bad_out(): + dividend = csr_matrix(np.array([[0, 1.0, 1.0], [1.0, 0, 1.0]])) + divisor = np.array([0.1, 0.2]) + with pytest.raises(ValueError, match="`out` argument provided but not equal to X"): + axis_mul_or_truediv(dividend, divisor, op=truediv, out=dividend.copy(), axis=0) + + +@pytest.mark.parametrize("array_type", ARRAY_TYPES) +@pytest.mark.parametrize("op", [truediv, mul]) +def test_scale_row(array_type, op): + dividend = array_type(asarray([[0, 1.0, 1.0], [1.0, 0, 1.0]])) + divisor = np.array([0.1, 0.2]) + if op is mul: + divisor = 1 / divisor + expd = np.array([[0, 10.0, 10.0], [5.0, 0, 5.0]]) + out = dividend if issparse(dividend) or isinstance(dividend, np.ndarray) else None + res = asarray(axis_mul_or_truediv(dividend, divisor, op=op, axis=0, out=out)) + np.testing.assert_array_equal(res, expd) + + +@pytest.mark.parametrize("array_type", ARRAY_TYPES) +@pytest.mark.parametrize("op", [truediv, mul]) +def test_scale_column(array_type, op): + dividend = array_type(asarray([[0, 1.0, 2.0], [3.0, 0, 4.0]])) + divisor = np.array([0.1, 0.2, 0.5]) + if op is mul: + divisor = 1 / divisor + expd = np.array([[0, 5.0, 4.0], [30.0, 0, 8.0]]) + out = dividend if issparse(dividend) or isinstance(dividend, np.ndarray) else None + res = asarray(axis_mul_or_truediv(dividend, divisor, op=op, axis=1, out=out)) + np.testing.assert_array_equal(res, expd) + + +@pytest.mark.parametrize("array_type", ARRAY_TYPES) +def test_divide_by_zero(array_type): + dividend = array_type(asarray([[0, 1.0, 2.0], [3.0, 0, 4.0]])) + divisor = np.array([0.1, 0.2, 0.0]) + expd = np.array([[0, 5.0, 2.0], [30.0, 0, 4.0]]) + res = asarray( + axis_mul_or_truediv( + dividend, divisor, op=truediv, axis=1, allow_divide_by_zero=False + ) + ) + np.testing.assert_array_equal(res, expd) + res = asarray( + axis_mul_or_truediv( + dividend, divisor, op=truediv, axis=1, allow_divide_by_zero=True + ) + ) + expd = np.array([[0, 5.0, np.inf], [30.0, 0, np.inf]]) + np.testing.assert_array_equal(res, expd) + + +@pytest.mark.parametrize("array_type", ARRAY_TYPES_SPARSE) +def test_scale_out_with_dask_or_sparse_raises(array_type): + dividend = array_type(asarray([[0, 1.0, 2.0], [3.0, 0, 4.0]])) + divisor = np.array([0.1, 0.2, 0.5]) + if isinstance(dividend, DaskArray): + with pytest.raises( + TypeError if "dask" in array_type.__name__ else ValueError, + match="`out`*", + ): + axis_mul_or_truediv(dividend, divisor, op=truediv, axis=1, out=dividend) + + +@pytest.mark.parametrize("array_type", ARRAY_TYPES_DASK) +@pytest.mark.parametrize("axis", [0, 1]) +@pytest.mark.parametrize("op", [truediv, mul]) +def test_scale_rechunk(array_type, axis, op): + import dask.array as da + + dividend = array_type( + asarray([[0, 1.0, 2.0], [3.0, 0, 4.0], [3.0, 0, 4.0]]) + ).rechunk(((3,), (3,))) + divisor = da.from_array(np.array([0.1, 0.2, 0.5]), chunks=(1,)) + if op is mul: + divisor = 1 / divisor + if axis == 1: + expd = np.array([[0, 5.0, 4.0], [30.0, 0, 8.0], [30.0, 0, 8.0]]) + else: + expd = np.array([[0, 10.0, 20.0], [15.0, 0, 20.0], [6.0, 0, 8.0]]) + out = dividend if issparse(dividend) or isinstance(dividend, np.ndarray) else None + with pytest.warns(UserWarning, match="Rechunking scaling_array*"): + res = asarray(axis_mul_or_truediv(dividend, divisor, op=op, axis=axis, out=out)) + np.testing.assert_array_equal(res, expd) + + +@pytest.mark.parametrize("array_type", ARRAY_TYPES) def test_elem_mul(array_type): - m1 = array_type([[0, 1, 1], [1, 0, 1]]) - m2 = array_type([[2, 2, 1], [3, 2, 0]]) + m1 = array_type(asarray([[0, 1, 1], [1, 0, 1]])) + m2 = array_type(asarray([[2, 2, 1], [3, 2, 0]])) expd = np.array([[0, 2, 1], [3, 0, 0]]) res = asarray(elem_mul(m1, m2)) np.testing.assert_array_equal(res, expd) +@pytest.mark.parametrize("array_type", ARRAY_TYPES) +def test_axis_sum(array_type): + m1 = array_type(asarray([[0, 1, 1], [1, 0, 1]])) + expd_0 = np.array([1, 1, 2]) + expd_1 = np.array([2, 2]) + res_0 = asarray(axis_sum(m1, axis=0)) + res_1 = asarray(axis_sum(m1, axis=1)) + if "matrix" in array_type.__name__: # for sparse since dimension is kept + res_0 = res_0.ravel() + res_1 = res_1.ravel() + np.testing.assert_array_equal(res_0, expd_0) + np.testing.assert_array_equal(res_1, expd_1) + + @pytest.mark.parametrize("array_type", ARRAY_TYPES) @pytest.mark.parametrize( ("array_value", "expected"), @@ -79,7 +194,7 @@ def test_check_nonnegative_integers(array_type, array_value, expected): # TODO: Make it work for sparse-in-dask -@pytest.mark.parametrize("array_type", ARRAY_TYPES_SUPPORTED) +@pytest.mark.parametrize("array_type", ARRAY_TYPES_SPARSE_DASK_UNSUPPORTED) def test_is_constant(array_type): constant_inds = [1, 3] A = np.arange(20).reshape(5, 4) From e6c7251d66eae3983baad37575a6b0bba8fe1318 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Sat, 23 Mar 2024 04:15:37 +1100 Subject: [PATCH 47/54] Fix aggregating obsm/ varm (#2934) * Fix aggregating obsm/ varm * Remove print * Add test for labeled case --- scanpy/get/_aggregated.py | 24 ++++++++--- scanpy/tests/test_aggregated.py | 70 +++++++++++++++++++++++++++++++-- 2 files changed, 86 insertions(+), 8 deletions(-) diff --git a/scanpy/get/_aggregated.py b/scanpy/get/_aggregated.py index ffc0413507..6d60328791 100644 --- a/scanpy/get/_aggregated.py +++ b/scanpy/get/_aggregated.py @@ -267,11 +267,20 @@ def aggregate( mask=mask, dof=dof, ) - result = AnnData( - layers=layers, - obs=new_label_df, - var=getattr(adata, "var" if axis == 0 else "obs"), - ) + + # Define new var dataframe + if obsm or varm: + if isinstance(data, pd.DataFrame): + # Check if there could be labels + var = pd.DataFrame(index=data.columns) + else: + # Create them otherwise + var = pd.DataFrame(index=pd.RangeIndex(data.shape[1]).astype(str)) + else: + var = getattr(adata, "var" if axis == 0 else "obs") + + # It's all coming together + result = AnnData(layers=layers, obs=new_label_df, var=var) if axis == 1: return result.T @@ -279,6 +288,11 @@ def aggregate( return result +@aggregate.register(pd.DataFrame) +def aggregate_df(data, by, func, *, mask=None, dof=1): + return aggregate(data.values, by, func, mask=mask, dof=dof) + + @aggregate.register(np.ndarray) @aggregate.register(sparse.spmatrix) def aggregate_array( diff --git a/scanpy/tests/test_aggregated.py b/scanpy/tests/test_aggregated.py index c3b5331afc..d0e01bb604 100644 --- a/scanpy/tests/test_aggregated.py +++ b/scanpy/tests/test_aggregated.py @@ -5,7 +5,7 @@ import pandas as pd import pytest from packaging.version import Version -from scipy.sparse import csr_matrix +from scipy import sparse import scanpy as sc from scanpy._utils import _resolve_axis @@ -61,10 +61,10 @@ def gen_adata(data_key, dim, df_base, df_groupby, X): obs_df, var_df = (df_groupby, df_base) if dim == "obs" else (df_base, df_groupby) data = X.T if dim == "var" and data_key != "varm" else X if data_key != "X": - data_dict_sparse = {data_key: {"test": csr_matrix(data)}} + data_dict_sparse = {data_key: {"test": sparse.csr_matrix(data)}} data_dict_dense = {data_key: {"test": data}} else: - data_dict_sparse = {data_key: csr_matrix(data)} + data_dict_sparse = {data_key: sparse.csr_matrix(data)} data_dict_dense = {data_key: data} adata_sparse = ad.AnnData(obs=obs_df, var=var_df, **data_dict_sparse) @@ -390,3 +390,67 @@ def test_aggregate_arraytype(array_type, metric): adata.X = array_type(adata.X) aggregate = sc.get.aggregate(adata, ["louvain"], metric) assert isinstance(aggregate.layers[metric], np.ndarray) + + +def test_aggregate_obsm_varm(): + adata_obsm = sc.datasets.blobs() + adata_obsm.obs["blobs"] = adata_obsm.obs["blobs"].astype(str) + adata_obsm.obsm["test"] = adata_obsm.X[:, ::2].copy() + adata_varm = adata_obsm.T.copy() + + result_obsm = sc.get.aggregate(adata_obsm, "blobs", ["sum", "mean"], obsm="test") + result_varm = sc.get.aggregate(adata_varm, "blobs", ["sum", "mean"], varm="test") + + assert_equal(result_obsm, result_varm.T) + + expected_sum = ( + pd.DataFrame(adata_obsm.obsm["test"], index=adata_obsm.obs_names) + .groupby(adata_obsm.obs["blobs"], observed=True) + .sum() + ) + expected_mean = ( + pd.DataFrame(adata_obsm.obsm["test"], index=adata_obsm.obs_names) + .groupby(adata_obsm.obs["blobs"], observed=True) + .mean() + ) + + assert_equal(expected_sum.values, result_obsm.layers["sum"]) + assert_equal(expected_mean.values, result_obsm.layers["mean"]) + + +def test_aggregate_obsm_labels(): + from itertools import chain, repeat + + label_counts = [("a", 5), ("b", 3), ("c", 4)] + blocks = [np.ones((n, 1)) for _, n in label_counts] + obs_names = pd.Index( + [f"cell_{i:02d}" for i in range(sum(b.shape[0] for b in blocks))] + ) + entry = pd.DataFrame( + sparse.block_diag(blocks).toarray(), + columns=[f"dim_{i}" for i in range(len(label_counts))], + index=obs_names, + ) + + adata = ad.AnnData( + obs=pd.DataFrame( + { + "labels": list( + chain.from_iterable(repeat(l, n) for (l, n) in label_counts) + ) + }, + index=obs_names, + ), + var=pd.DataFrame(index=["gene_0"]), + obsm={"entry": entry}, + ) + + expected = ad.AnnData( + obs=pd.DataFrame({"labels": pd.Categorical(list("abc"))}, index=list("abc")), + var=pd.DataFrame(index=[f"dim_{i}" for i in range(3)]), + layers={ + "sum": np.diag([n for _, n in label_counts]), + }, + ) + result = sc.get.aggregate(adata, by="labels", func="sum", obsm="entry") + assert_equal(expected, result) From 10a51d8bdc489a5371a2c7e88d6bfe5d44b0b671 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Mon, 25 Mar 2024 21:48:03 +1100 Subject: [PATCH 48/54] Check that agggregate is only called on anndata (#2950) --- scanpy/get/_aggregated.py | 28 ++++++++++++++++++++++------ scanpy/tests/test_aggregated.py | 6 ++++++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/scanpy/get/_aggregated.py b/scanpy/get/_aggregated.py index 6d60328791..5530059c2c 100644 --- a/scanpy/get/_aggregated.py +++ b/scanpy/get/_aggregated.py @@ -156,7 +156,6 @@ def _power(X: Array, power: float | int) -> Array: return X**power if isinstance(X, np.ndarray) else X.power(power) -@singledispatch def aggregate( adata: AnnData, by: str | Collection[str], @@ -232,6 +231,11 @@ def aggregate( Note that this filters out any combination of groups that wasn't present in the original data. """ + if not isinstance(adata, AnnData): + raise NotImplementedError( + "sc.get.aggregate is currently only implemented for AnnData input, " + f"was passed {type(adata)}." + ) if axis is None: axis = 1 if varm else 0 axis, axis_name = _resolve_axis(axis) @@ -260,7 +264,7 @@ def aggregate( dim_df = getattr(adata, axis_name) categorical, new_label_df = _combine_categories(dim_df, by) # Actual computation - layers = aggregate( + layers = _aggregate( data, by=categorical, func=func, @@ -288,13 +292,25 @@ def aggregate( return result -@aggregate.register(pd.DataFrame) +@singledispatch +def _aggregate( + data, + by: pd.Categorical, + func: AggType | Iterable[AggType], + *, + mask: NDArray[np.bool_] | None = None, + dof: int = 1, +): + raise NotImplementedError(f"Data type {type(data)} not supported for aggregation") + + +@_aggregate.register(pd.DataFrame) def aggregate_df(data, by, func, *, mask=None, dof=1): - return aggregate(data.values, by, func, mask=mask, dof=dof) + return _aggregate(data.values, by, func, mask=mask, dof=dof) -@aggregate.register(np.ndarray) -@aggregate.register(sparse.spmatrix) +@_aggregate.register(np.ndarray) +@_aggregate.register(sparse.spmatrix) def aggregate_array( data, by: pd.Categorical, diff --git a/scanpy/tests/test_aggregated.py b/scanpy/tests/test_aggregated.py index d0e01bb604..99d36947c4 100644 --- a/scanpy/tests/test_aggregated.py +++ b/scanpy/tests/test_aggregated.py @@ -454,3 +454,9 @@ def test_aggregate_obsm_labels(): ) result = sc.get.aggregate(adata, by="labels", func="sum", obsm="entry") assert_equal(expected, result) + + +def test_dispatch_not_implemented(): + adata = sc.datasets.blobs() + with pytest.raises(NotImplementedError): + sc.get.aggregate(adata.X, adata.obs["blobs"], "sum") From 996ff88019469bf609ca37e4e32854dd4c4d4f05 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Tue, 26 Mar 2024 01:43:21 +1100 Subject: [PATCH 49/54] Update leiden future warning (#2951) * Update leiden future warning * Better warning * Update scanpy/_utils/__init__.py --------- Co-authored-by: Ilan Gold --- scanpy/_utils/__init__.py | 7 +++++++ scanpy/tools/_leiden.py | 5 ++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/scanpy/_utils/__init__.py b/scanpy/_utils/__init__.py index 5acbc3482f..1039ef896c 100644 --- a/scanpy/_utils/__init__.py +++ b/scanpy/_utils/__init__.py @@ -9,6 +9,7 @@ import importlib.util import inspect import random +import re import sys import warnings from collections import namedtuple @@ -857,6 +858,12 @@ def warn_with_traceback(message, category, filename, lineno, file=None, line=Non settings.write(warnings.formatwarning(message, category, filename, lineno, line)) +def warn_once(msg: str, category: type[Warning], stacklevel: int = 1): + warnings.warn(msg, category, stacklevel=stacklevel) + # You'd think `'once'` works, but it doesn't at the repl and in notebooks + warnings.filterwarnings("ignore", category=category, message=re.escape(msg)) + + def subsample( X: np.ndarray, subsample: int = 1, diff --git a/scanpy/tools/_leiden.py b/scanpy/tools/_leiden.py index a9a9c6e822..dbb4d02bb5 100644 --- a/scanpy/tools/_leiden.py +++ b/scanpy/tools/_leiden.py @@ -1,7 +1,6 @@ from __future__ import annotations import importlib -import warnings from typing import TYPE_CHECKING, Literal import numpy as np @@ -140,8 +139,8 @@ def leiden( try: import leidenalg - msg = 'Use of leidenalg is discouraged and will be deprecated in the future. Please use `flavor="igraph"` `n_iterations=2` to achieve similar results. `directed` must also be `False` to work with `igraph`\'s implementation.' - warnings.warn(msg, FutureWarning) + msg = 'In the future, the default backend for leiden will be igraph instead of leidenalg.\n\n To achieve the future defaults please pass: flavor="igraph" and n_iterations=2. directed must also be False to work with igraph\'s implementation.' + _utils.warn_once(msg, FutureWarning, stacklevel=3) except ImportError: raise ImportError( "Please install the leiden algorithm: `conda install -c conda-forge leidenalg` or `pip3 install leidenalg`." From 7a1f89fcb7e292b24a68e9a2df3c4f2a9ab99165 Mon Sep 17 00:00:00 2001 From: Philipp A Date: Mon, 25 Mar 2024 16:50:03 +0100 Subject: [PATCH 50/54] Clip correlation in dendrogram (#2928) --- docs/release-notes/1.10.0.md | 2 +- notebooks | 1 + scanpy/tests/test_dendrogram.py | 76 +++++++++++++++++++++++ scanpy/tests/test_dendrogram_key_added.py | 24 ------- scanpy/tools/_dendrogram.py | 4 +- 5 files changed, 80 insertions(+), 27 deletions(-) create mode 160000 notebooks create mode 100644 scanpy/tests/test_dendrogram.py delete mode 100644 scanpy/tests/test_dendrogram_key_added.py diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 52d6be2d9c..72b066d130 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -50,7 +50,7 @@ * {func}`scanpy.get.aggregate` now always returns {class}`numpy.ndarray` {pr}`2893` {smaller}`S Dicks` * Removes self from array of neighbors for `use_approx_neighbors = True` in {func}`~scanpy.pp.scrublet` {pr}`2896`{smaller}`S Dicks` * Compatibility with scipy 1.13 {pr}`2943` {smaller}`I Virshup` - +* Fix use of {func}`~scanpy.tl.dendrogram` on highly correlated low precision data {pr}`2928` {smaller}`P Angerer` ```{rubric} Development diff --git a/notebooks b/notebooks new file mode 160000 index 0000000000..26e16f8338 --- /dev/null +++ b/notebooks @@ -0,0 +1 @@ +Subproject commit 26e16f83387caef76abdd42afda3c7c13f7139f1 diff --git a/scanpy/tests/test_dendrogram.py b/scanpy/tests/test_dendrogram.py new file mode 100644 index 0000000000..ee8956de7d --- /dev/null +++ b/scanpy/tests/test_dendrogram.py @@ -0,0 +1,76 @@ +from __future__ import annotations + +import numpy as np +import pandas as pd +import pytest +import scipy.sparse as sp + +import scanpy as sc +from scanpy.testing._helpers.data import pbmc68k_reduced + +n_neighbors = 5 +key = "test" + + +@pytest.mark.parametrize("groupby", ["bulk_labels", ["bulk_labels", "phase"]]) +@pytest.mark.parametrize("key_added", [None, "custom_key"]) +def test_dendrogram_key_added(groupby, key_added): + adata = pbmc68k_reduced() + sc.tl.dendrogram(adata, groupby=groupby, key_added=key_added, use_rep="X_pca") + if isinstance(groupby, list): + dendrogram_key = f'dendrogram_{"_".join(groupby)}' + else: + dendrogram_key = f"dendrogram_{groupby}" + + if key_added is None: + key_added = dendrogram_key + assert key_added in adata.uns + + +REP_PCA_0 = [ + *(1.50808525e00, -1.67258829e-01, -7.12063432e-01, -2.07935140e-01), + *(-3.55730444e-01, -2.24421427e-01, -1.46907698e-02, -7.01090470e-02), + *(-1.31467551e-01, -3.75757217e-02, -1.07698059e-02, -4.37555499e-02), + *(1.06897885e-02, 1.10454357e-03, -5.37674241e-02, -4.94170748e-03), + *(1.11988001e-02, -4.48330259e-03, -2.56892946e-02, -3.50749046e-02), + *(-3.15931924e-02, 2.84416862e-02, -3.70664597e-02, -2.38820408e-02), + *(-4.57040370e-02, 2.99325008e-02, 9.56365839e-03, -4.28026691e-02), + *(5.36734704e-03, -3.08445804e-02, -1.16719725e-02, -2.35078149e-02), + *(2.87542702e-04, -1.70532353e-02, -1.79676879e-02, -3.09410989e-02), + *(-1.09178647e-02, -1.60753895e-02, -1.04769412e-02, -1.36501975e-02), + *(-6.83976896e-03, -1.17562497e-02, -4.65345643e-02, 1.91588048e-02), + *(-1.38043752e-02, 4.75460896e-03, -1.41307563e-02, -1.03387292e-02), + *(-1.68043356e-02, 1.33516011e-03), +] +REP_PCA_1_6 = [ + *(-2.70745814e-01, -3.45929652e-01, 6.27844110e-02, -8.34012777e-02), + *(-1.08290315e-01, -1.38125733e-01, -2.57148240e-02, -2.73127705e-02), + *(-1.45030200e-01, -6.88858554e-02, -4.28490154e-02, -1.88931823e-02), + *(-2.56232135e-02, -7.66322482e-03, -5.49384989e-02, -1.43514248e-02), + *(2.42769364e-02, -3.01547404e-02, -3.37253511e-02, -3.81337740e-02), + *(-3.42049589e-03, -4.34436463e-03, -4.15385924e-02, -2.66448390e-02), + *(-2.74285320e-02, 1.47806173e-02, 1.19129466e-02, -6.70884028e-02), + *(2.58150720e-03, -1.64280720e-02, -1.07431635e-02, -3.04328315e-02), + *(-3.82748269e-03, -2.95090005e-02, -3.10521629e-02, -3.43420058e-02), + *(-4.49432433e-03, -2.15906072e-02, -1.23507539e-02, -2.88041346e-02), + *(-7.31994957e-03, -7.28111062e-03, -7.61008039e-02, 2.40524579e-02), + *(-1.20806806e-02, 5.05997473e-03, -2.53410172e-02, -1.83318909e-02), + *(-1.81263424e-02, -3.35110351e-03), +] +REP_PCA = np.array([REP_PCA_0, *([REP_PCA_1_6] * 6)], dtype=np.float32) + + +def test_dendrogram_cor(): + rep = sc.AnnData( + sp.csr_matrix( + ( + np.array([1.2762934659055623, 1.6916760106710726, 1.6916760106710726]), + np.array([12, 5, 44]), + np.array([0, 0, 0, 0, 0, 1, 2, 3]), + ), + shape=(7, 51), + ), + dict(leiden=pd.Categorical(["372", "366", "357", "357", "357", "357", "357"])), + obsm=dict(X_pca=REP_PCA), + ) + sc.tl.dendrogram(rep, groupby="leiden") diff --git a/scanpy/tests/test_dendrogram_key_added.py b/scanpy/tests/test_dendrogram_key_added.py deleted file mode 100644 index 586612962a..0000000000 --- a/scanpy/tests/test_dendrogram_key_added.py +++ /dev/null @@ -1,24 +0,0 @@ -from __future__ import annotations - -import pytest - -import scanpy as sc -from scanpy.testing._helpers.data import pbmc68k_reduced - -n_neighbors = 5 -key = "test" - - -@pytest.mark.parametrize("groupby", ["bulk_labels", ["bulk_labels", "phase"]]) -@pytest.mark.parametrize("key_added", [None, "custom_key"]) -def test_dendrogram_key_added(groupby, key_added): - adata = pbmc68k_reduced() - sc.tl.dendrogram(adata, groupby=groupby, key_added=key_added, use_rep="X_pca") - if isinstance(groupby, list): - dendrogram_key = f'dendrogram_{"_".join(groupby)}' - else: - dendrogram_key = f"dendrogram_{groupby}" - - if key_added is None: - key_added = dendrogram_key - assert key_added in adata.uns diff --git a/scanpy/tools/_dendrogram.py b/scanpy/tools/_dendrogram.py index 68902a6632..b834b64936 100644 --- a/scanpy/tools/_dendrogram.py +++ b/scanpy/tools/_dendrogram.py @@ -145,7 +145,7 @@ def dendrogram( categorical.name = "_".join(groupby) rep_df.set_index(categorical, inplace=True) - categories = rep_df.index.categories + categories: pd.Index = rep_df.index.categories else: gene_names = adata.raw.var_names if use_raw else adata.var_names from ..plotting._anndata import _prepare_dataframe @@ -164,7 +164,7 @@ def dendrogram( import scipy.cluster.hierarchy as sch from scipy.spatial import distance - corr_matrix = mean_df.T.corr(method=cor_method) + corr_matrix = mean_df.T.corr(method=cor_method).clip(-1, 1) corr_condensed = distance.squareform(1 - corr_matrix) z_var = sch.linkage( corr_condensed, method=linkage_method, optimal_ordering=optimal_ordering From f5edd43fde1a4bd750482fa0def65e1d15a07653 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Tue, 26 Mar 2024 03:50:39 +1100 Subject: [PATCH 51/54] Fix links (#2953) Co-authored-by: Philipp A --- CONTRIBUTING.md | 2 +- README.md | 15 +++++++++------ docs/index.md | 6 +++--- docs/installation.md | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 307fcaaf91..c65de370b7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,4 +17,4 @@ Contributing code ----------------- We love code contributions! -If you're interested in contributing code, please take a look over the [contributing guide](https://scanpy.readthedocs.io/en/latest/dev/index.html) in the main documentation. +If you're interested in contributing code, please take a look over the [contribution guide](https://scanpy.readthedocs.io/en/latest/dev/index.html) in the main documentation. diff --git a/README.md b/README.md index 53c4c35706..69621821b3 100644 --- a/README.md +++ b/README.md @@ -11,13 +11,17 @@ # Scanpy – Single-Cell Analysis in Python Scanpy is a scalable toolkit for analyzing single-cell gene expression data -built jointly with [anndata](https://anndata.readthedocs.io). It includes +built jointly with [anndata][]. It includes preprocessing, visualization, clustering, trajectory inference and differential expression testing. The Python-based implementation efficiently deals with datasets of more than one million cells. -Discuss usage on the scverse [Discourse]. Read the [documentation]. -If you'd like to contribute by opening an issue or creating a pull request, please take a look at our [contributing guide]. +Discuss usage on the scverse [Discourse][]. Read the [documentation][]. +If you'd like to contribute by opening an issue or creating a pull request, please take a look at our [contribution guide][]. + +[anndata]: https://anndata.readthedocs.io +[discourse]: https://discourse.scverse.org/ +[documentation]: https://scanpy.readthedocs.io [//]: # (numfocus-fiscal-sponsor-attribution) @@ -52,6 +56,5 @@ You can cite the scverse publication as follows: > > _Nat Biotechnol._ 2023 Apr 10. doi: [10.1038/s41587-023-01733-8](https://doi.org/10.1038/s41587-023-01733-8). -[contributing guide]: CONTRIBUTING.md -[discourse]: https://discourse.scverse.org/ -[documentation]: https://scanpy.readthedocs.io + +[contribution guide]: CONTRIBUTING.md diff --git a/docs/index.md b/docs/index.md index d4b596af44..9ecf45dcb5 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,5 +1,5 @@ ```{include} ../README.md -:end-line: 36 +:end-line: 40 ``` ```{eval-rst} @@ -51,7 +51,7 @@ Find a bug? Interested in improving scanpy? Checkout our GitHub for the latest d **Other resources** * Follow changes in the {ref}`release notes `. * Find tools that harmonize well with anndata & Scanpy via the {doc}`external API ` and the {doc}`ecosystem page `. -* Check out our {ref}`contributing guide ` for development practices. +* Check out our {ref}`contribution guide ` for development practices. * Consider citing [Genome Biology (2018)] along with original {doc}`references `. ## News @@ -85,6 +85,6 @@ contributors references ``` -[discourse]: https://discourse.scverse.org/ +[contribution guide]: dev/index.md [genome biology (2018)]: https://doi.org/10.1186/s13059-017-1382-0 [github]: https://github.com/scverse/scanpy diff --git a/docs/installation.md b/docs/installation.md index 6aa0be5e6e..b147ee62d8 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -65,7 +65,7 @@ flit install -s --deps=develop On Windows, you might have to use `flit install --pth-file` if you are not able to give yourself the [create symbolic links] privilege. -For instructions on how to work with the code, see the {ref}`contributing guide `. +For instructions on how to work with the code, see the {ref}`contribution guide `. ## Docker From e0a4a781c9cbbc39597c3782bbf867d1f6d5f7bc Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 13:58:31 -0700 Subject: [PATCH 52/54] [pre-commit.ci] pre-commit autoupdate (#2960) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.3.3 → v0.3.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.3.3...v0.3.4) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7cee632407..22d67d9df2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.3.3 + rev: v0.3.4 hooks: - id: ruff types_or: [python, pyi, jupyter] From 65f567e6905afbbf673ecf715ad0f796794ce9cb Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Wed, 27 Mar 2024 00:15:01 +1100 Subject: [PATCH 53/54] Doc submodule (#2901) * Start going to tutorial submodule * bump submodule * Got plotting tutorial layout to a decent point * clear out git submodule * Using stubs to reference notebooks * Use symlinks instead * Add knn-transformers * Remove docutils.conf as it's no longer needed * Update basic tutorial * Update reference to ecosystem * Add bib * Start a how-to section * Update old tutorial link * experimental tutorial module * update spatial tutorials links * Update basic tutorials layout * Add trajectories * Fix some links * fix some more links * unfuck cite directive * update submodule * Fix sphinx handling of ftp link * Add submodule to readthedocs * add rapids-singlecell to news * Update advanced plotting tutorial * apply pre-commit fixes on notebooks * Fix link * Cut down on tutorials * Release notes (+ a release note fix) * Fix rapids-singlecell link * Updae tutorials page * add setuptools dep for doc builds * Use intersphinx for a link * update notebooks * add back blank line * update submodule * Add dask notebook * Update notebook submodule * Update notebook submodule * update submodule * Prep release notes * update submodule * add release note for doc style overhaul * bump date --- .gitmodules | 3 + .readthedocs.yml | 2 + docs/_tutorials.md | 142 ------------------ docs/api/plotting.md | 2 +- docs/conf.py | 10 +- docs/extensions/cite.py | 2 +- docs/how-to/index.md | 7 + docs/how-to/knn-transformers.ipynb | 1 + docs/index.md | 10 +- docs/installation.md | 2 +- docs/news.md | 6 +- docs/references.bib | 100 ++++++++++++ docs/references.rst | 6 +- docs/release-notes/0.4.0.md | 2 +- docs/release-notes/0.4.3.md | 2 +- docs/release-notes/1.0.0.md | 2 +- docs/release-notes/1.1.0.md | 8 +- docs/release-notes/1.10.0.md | 18 ++- docs/release-notes/1.2.1.md | 2 +- docs/release-notes/1.3.1.md | 10 +- docs/release-notes/1.3.4.md | 6 +- docs/release-notes/1.4.1.md | 2 +- docs/release-notes/1.4.5.md | 2 +- docs/release-notes/1.4.6.md | 2 +- docs/release-notes/1.5.0.md | 4 +- docs/release-notes/1.6.0.md | 2 +- docs/release-notes/1.7.0.md | 6 +- docs/release-notes/1.9.0.md | 2 +- docs/tutorials/basics/clustering-2017.ipynb | 1 + docs/tutorials/basics/clustering.ipynb | 1 + docs/tutorials/basics/index.md | 9 ++ .../integrating-data-using-ingest.ipynb | 1 + docs/tutorials/experimental/dask.ipynb | 1 + docs/tutorials/experimental/index.md | 8 + .../experimental/pearson_residuals.ipynb | 1 + docs/tutorials/index.md | 66 ++++++++ docs/tutorials/plotting/advanced.ipynb | 1 + docs/tutorials/plotting/core.ipynb | 1 + docs/tutorials/plotting/index.md | 8 + docs/tutorials/spatial/basic-analysis.ipynb | 1 + docs/tutorials/spatial/index.md | 8 + .../spatial/integration-scanorama.ipynb | 1 + docs/tutorials/trajectories/index.md | 7 + docs/tutorials/trajectories/paga-paul15.ipynb | 1 + notebooks | 2 +- pyproject.toml | 2 + scanpy/datasets/_datasets.py | 2 +- scanpy/neighbors/__init__.py | 4 +- scanpy/plotting/_tools/scatterplots.py | 2 +- scanpy/tools/_ingest.py | 2 +- 50 files changed, 299 insertions(+), 194 deletions(-) create mode 100644 .gitmodules delete mode 100644 docs/_tutorials.md create mode 100644 docs/how-to/index.md create mode 120000 docs/how-to/knn-transformers.ipynb create mode 100644 docs/references.bib create mode 120000 docs/tutorials/basics/clustering-2017.ipynb create mode 120000 docs/tutorials/basics/clustering.ipynb create mode 100644 docs/tutorials/basics/index.md create mode 120000 docs/tutorials/basics/integrating-data-using-ingest.ipynb create mode 120000 docs/tutorials/experimental/dask.ipynb create mode 100644 docs/tutorials/experimental/index.md create mode 120000 docs/tutorials/experimental/pearson_residuals.ipynb create mode 100644 docs/tutorials/index.md create mode 120000 docs/tutorials/plotting/advanced.ipynb create mode 120000 docs/tutorials/plotting/core.ipynb create mode 100644 docs/tutorials/plotting/index.md create mode 120000 docs/tutorials/spatial/basic-analysis.ipynb create mode 100644 docs/tutorials/spatial/index.md create mode 120000 docs/tutorials/spatial/integration-scanorama.ipynb create mode 100644 docs/tutorials/trajectories/index.md create mode 120000 docs/tutorials/trajectories/paga-paul15.ipynb diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..8665ee972e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "notebooks"] + path = notebooks + url = https://github.com/scverse/scanpy-tutorials/ diff --git a/.readthedocs.yml b/.readthedocs.yml index 97597ff326..4a5d3e219f 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,4 +1,6 @@ version: 2 +submodules: + include: all build: os: ubuntu-20.04 tools: diff --git a/docs/_tutorials.md b/docs/_tutorials.md deleted file mode 100644 index 36f7a99da1..0000000000 --- a/docs/_tutorials.md +++ /dev/null @@ -1,142 +0,0 @@ -# Tutorials - -## Clustering - -For getting started, we recommend Scanpy’s reimplementation {doc}`tutorials:pbmc3k` -of Seurat’s {cite}`Satija15` clustering tutorial for 3k PBMCs from 10x Genomics, -containing preprocessing, clustering and the identification of cell types via -known marker genes. - -```{image} _static/img/tutorials/170505_seurat/filter_genes_dispersion.png -:width: 100px -``` - -```{image} _static/img/tutorials/170505_seurat/louvain.png -:width: 100px -``` - -```{image} _static/img/tutorials/170505_seurat/NKG7.png -:width: 100px -``` - -```{image} _static/img/tutorials/170505_seurat/violin.png -:width: 100px -``` - -```{image} _static/img/tutorials/170505_seurat/cell_types.png -:width: 200px -``` - -## Visualization - -Learn how to visually explore genes using scanpy: {doc}`tutorials:plotting/core` - -For advanced customization of your plots, see {doc}`tutorials:plotting/advanced` - -```{image} _static/img/stacked_violin_dotplot_matrixplot.png -:width: 550px -``` - -## Trajectory inference - -Get started with the following example for hematopoiesis for data of {cite}`Paul15`: {doc}`tutorials:paga-paul15` - -```{image} _static/img/tutorials/paga_paul15.png -:width: 450px -``` - -More examples for trajectory inference on complex datasets can be found in the -[PAGA](https://github.com/theislab/paga) repository {cite}`Wolf19`, for instance, multi-resolution analyses of whole -animals, such as for [planaria] for data of {cite}`Plass18`. - -```{image} _static/img/tutorials/paga_planaria.png -:width: 350px -``` - -As a reference for simple pseudotime analyses, we provide the diffusion pseudotime (DPT) analyses of {cite}`Haghverdi16` -for two hematopoiesis datasets: [DPT example 1] {cite}`Paul15` and [DPT example 2] {cite}`Moignard15`. - -## Integrating datasets - -Map labels and embeddings of reference data to new data: {doc}`tutorials:integrating-data-using-ingest` - -```{image} https://scanpy-tutorials.readthedocs.io/en/latest/_images/integrating-data-using-ingest_21_0.png -:width: 350px -``` - -## Spatial data - -- Basic analysis of spatial data: {doc}`tutorials:spatial/basic-analysis` -- Integrating spatial data with scRNA-seq using scanorama: {doc}`tutorials:spatial/integration-scanorama` - -```{image} _static/img/spatial-basic-analysis.png -:width: 250px -``` - -## Further Tutorials - -(conversion-to-r)= - -### Conversion: AnnData, SingleCellExperiment, and Seurat objects - -```{image} https://github.com/theislab/scanpy-in-R/raw/master/logo.png -:align: right -:width: 200px -``` - -- See [Seurat to AnnData] for a tutorial on `anndata2ri`. -- See the [Scanpy in R] guide for a tutorial on interacting with Scanpy from R. - -### Regressing out cell cycle - -See the [cell cycle] notebook. - -```{image} _static/img/tutorials/170522_visualizing_one_million_cells/tsne_1.3M.png -:align: right -:width: 120px -``` - -### Normalization with Pearson Residuals - -Normalization of scRNA-seq data with Pearson Residuals, from {cite}`Lause21`: {doc}`tutorials:tutorial_pearson_residuals` - -### Scaling Computations - -- Visualize and cluster [1.3M neurons] from 10x Genomics. - -### Simulations - -Simulating single cells using literature-curated gene regulatory networks {cite}`Wittmann09`. - -```{image} _static/img/tutorials/170430_krumsiek11/timeseries.png -:align: right -:width: 200px -``` - -- Notebook for [myeloid differentiation] -- Notebook for simple [toggleswitch] - -### Images - -See pseudotime-time inference on deep-learning based features for [cell cycle reconstruction] from image data {cite}`Eulenberg17`. - -% User Examples -% ~~~~~~~~~~~~~ -% -% January 12, 2018: `Exploring the mouse cell atlas`_ by `David P. Cook`_. -% Data by `Tabula Muris Consortium`_. -% -% .. _Exploring the mouse cell atlas: https://github.com/dpcook/fun_analysis/blob/master/tabula_muris/mouse_atlas_scanpy.ipynb -% .. _David P. Cook: https://twitter.com/DavidPCook -% .. _Tabula Muris Consortium: https://www.biorxiv.org/content/early/2017/12/20/237446 - -[1.3m neurons]: https://github.com/scverse/scanpy_usage/tree/master/170522_visualizing_one_million_cells -[cell cycle]: https://nbviewer.jupyter.org/github/scverse/scanpy_usage/blob/master/180209_cell_cycle/cell_cycle.ipynb -[cell cycle reconstruction]: https://github.com/scverse/scanpy_usage/tree/master/170529_images -[dpt example 1]: https://nbviewer.jupyter.org/github/scverse/scanpy_usage/blob/master/170502_paul15/paul15.ipynb -[dpt example 2]: https://nbviewer.jupyter.org/github/scverse/scanpy_usage/blob/master/170501_moignard15/moignard15.ipynb -[myeloid differentiation]: https://nbviewer.jupyter.org/github/scverse/scanpy_usage/blob/master/170430_krumsiek11/krumsiek11.ipynb -[planaria]: https://nbviewer.jupyter.org/github/theislab/paga/blob/master/planaria/planaria.ipynb -[scanpy in r]: https://theislab.github.io/scanpy-in-R/ -[seurat to anndata]: https://github.com/LuckyMD/Code_snippets/blob/master/Seurat_to_anndata.ipynb -[toggleswitch]: https://nbviewer.jupyter.org/github/scverse/scanpy_usage/blob/master/170430_krumsiek11/toggleswitch.ipynb diff --git a/docs/api/plotting.md b/docs/api/plotting.md index 32f73daf87..f1ceb17c4c 100644 --- a/docs/api/plotting.md +++ b/docs/api/plotting.md @@ -11,7 +11,7 @@ The plotting module {mod}`scanpy.pl` largely parallels the `tl.*` and a few of the `pp.*` functions. For most tools and for some preprocessing functions, you'll find a plotting function with the same name. -See {doc}`tutorials:plotting/core` for an overview of how to use these functions. +See {doc}`/tutorials/plotting/core` for an overview of how to use these functions. ```{note} See the {ref}`settings` section for all important plotting configurations. diff --git a/docs/conf.py b/docs/conf.py index 61d931974f..12ab01c8c0 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -21,7 +21,6 @@ # -- General configuration ------------------------------------------------ - nitpicky = True # Warn about broken links. This is here for a reason: Do not change. needs_sphinx = "4.0" # Nicer param docs suppress_warnings = [ @@ -42,6 +41,11 @@ release = version +# Bibliography settings +bibtex_bibfiles = ["references.bib"] +bibtex_reference_style = "author_year" + + # default settings templates_path = ["_templates"] master_doc = "index" @@ -59,6 +63,7 @@ "sphinx.ext.napoleon", "sphinx.ext.autosummary", "sphinx.ext.extlinks", + "sphinxcontrib.bibtex", "matplotlib.sphinxext.plot_directive", "sphinx_autodoc_typehints", # needs to be after napoleon "git_ref", # needs to be before scanpydoc.rtd_github_links @@ -90,7 +95,7 @@ "html_image", "html_admonition", ] -myst_url_schemes = ("http", "https", "mailto") +myst_url_schemes = ("http", "https", "mailto", "ftp") nb_output_stderr = "remove" nb_execution_mode = "off" nb_merge_streams = True @@ -127,7 +132,6 @@ scipy=("https://docs.scipy.org/doc/scipy/", None), seaborn=("https://seaborn.pydata.org/", None), sklearn=("https://scikit-learn.org/stable/", None), - tutorials=("https://scanpy-tutorials.readthedocs.io/en/latest/", None), ) diff --git a/docs/extensions/cite.py b/docs/extensions/cite.py index 3b8afd34a7..649f0c28f2 100644 --- a/docs/extensions/cite.py +++ b/docs/extensions/cite.py @@ -30,4 +30,4 @@ def cite_role( # noqa: PLR0917 def setup(app: Sphinx): - app.add_role("cite", cite_role, override=True) + app.add_role("cite-hack", cite_role, override=True) diff --git a/docs/how-to/index.md b/docs/how-to/index.md new file mode 100644 index 0000000000..2e923a539d --- /dev/null +++ b/docs/how-to/index.md @@ -0,0 +1,7 @@ +# How to + +This section contains short examples on how to perform specific tasks with scanpy. + +```{toctree} +knn-transformers +``` diff --git a/docs/how-to/knn-transformers.ipynb b/docs/how-to/knn-transformers.ipynb new file mode 120000 index 0000000000..74ae4f265b --- /dev/null +++ b/docs/how-to/knn-transformers.ipynb @@ -0,0 +1 @@ +../../notebooks/knn-transformers.ipynb \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 9ecf45dcb5..fea9a50ecd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -21,7 +21,7 @@ New to *scanpy*? Check out the installation guide. ::: :::{grid-item-card} Tutorials {octicon}`play;1em;` -:link: _tutorials +:link: tutorials/index :link-type: doc The tutorials walk you through real-world applications of scanpy. @@ -49,8 +49,9 @@ Find a bug? Interested in improving scanpy? Checkout our GitHub for the latest d :::: **Other resources** + * Follow changes in the {ref}`release notes `. -* Find tools that harmonize well with anndata & Scanpy via the {doc}`external API ` and the {doc}`ecosystem page `. +* Find tools that harmonize well with anndata & Scanpy at [scverse.org/packages/](https://scverse.org/packages/) * Check out our {ref}`contribution guide ` for development practices. * Consider citing [Genome Biology (2018)] along with original {doc}`references `. @@ -71,9 +72,10 @@ Find a bug? Interested in improving scanpy? Checkout our GitHub for the latest d :hidden: true :maxdepth: 1 -_tutorials -usage-principles installation +tutorials/index +usage-principles +how-to/index api/index external/index ecosystem diff --git a/docs/installation.md b/docs/installation.md index b147ee62d8..7cc17df09c 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -24,7 +24,7 @@ pip install 'scanpy[leiden]' ``` The extra `[leiden]` installs two packages that are needed for popular -parts of scanpy but aren't requirements: [igraph] {cite}`Csardi06` and [leiden] {cite}`Traag18`. +parts of scanpy but aren't requirements: [igraph] {cite-hack}`Csardi06` and [leiden] {cite-hack}`Traag18`. (dev-install-instructions)= diff --git a/docs/news.md b/docs/news.md index f9edc56753..9e2f257b89 100644 --- a/docs/news.md +++ b/docs/news.md @@ -7,6 +7,10 @@ ``` +### `rapids-singlecell` brings scanpy to the GPU! {small}`2024-03-18` + +{doc}`rapids-singlecell ` by Severin Dicks provides a scanpy-like API with accelerated operations implemented on GPU. + ### Scanpy hits 100 contributors! {small}`2022-03-31` [100 people have contributed to Scanpy's source code!](https://github.com/scverse/scanpy/graphs/contributors) @@ -59,7 +63,7 @@ Bioconda, Seurat, Bioconductor, and others. ### Science “Breakthrough of the Year 2018” {small}`2018-12-01` -The Science “Breakthrough of the Year 2018”, [Development cell by cell](https://vis.sciencemag.org/breakthrough2018/finalists/#cell-development), mentions the first application of PAGA {cite}`Plass18` among 5 papers. +The Science “Breakthrough of the Year 2018”, [Development cell by cell](https://vis.sciencemag.org/breakthrough2018/finalists/#cell-development), mentions the first application of PAGA {cite-hack}`Plass18` among 5 papers. [32 projects]: https://chanzuckerberg.com/eoss/proposals/ [essential open source software for science]: https://chanzuckerberg.com/newsroom/chan-zuckerberg-initiative-awards-5-million-for-open-source-software-projects-essential-to-science/ diff --git a/docs/references.bib b/docs/references.bib new file mode 100644 index 0000000000..595b2fa56a --- /dev/null +++ b/docs/references.bib @@ -0,0 +1,100 @@ +@article{Wolf2018, + author = {Wolf, F. Alexander + and Angerer, Philipp + and Theis, Fabian J.}, + title = {SCANPY: large-scale single-cell gene expression data analysis}, + journal = {Genome Biology}, + year = {2018}, + month = {Feb}, + day = {06}, + volume = {19}, + number = {1}, + pages = {15}, + abstract = {Scanpy is a scalable toolkit for analyzing single-cell gene expression data. It includes methods for preprocessing, visualization, clustering, pseudotime and trajectory inference, differential expression testing, and simulation of gene regulatory networks. Its Python-based implementation efficiently deals with data sets of more than one million cells (https://github.com/theislab/Scanpy). Along with Scanpy, we present AnnData, a generic class for handling annotated data matrices (https://github.com/theislab/anndata).}, + issn = {1474-760X}, + doi = {10.1186/s13059-017-1382-0}, + url = {https://doi.org/10.1186/s13059-017-1382-0} +} +@inproceedings{luecken2021, + author = {Luecken, Malte and Burkhardt, Daniel and Cannoodt, Robrecht and Lance, Christopher and Agrawal, Aditi and Aliee, Hananeh and Chen, Ann and Deconinck, Louise and Detweiler, Angela and Granados, Alejandro and Huynh, Shelly and Isacco, Laura and Kim, Yang and Klein, Dominik and DE KUMAR, BONY and Kuppasani, Sunil and Lickert, Heiko and McGeever, Aaron and Melgarejo, Joaquin and Mekonen, Honey and Morri, Maurizio and M\"{u}ller, Michaela and Neff, Norma and Paul, Sheryl and Rieck, Bastian and Schneider, Kaylie and Steelman, Scott and Sterr, Michael and Treacy, Daniel and Tong, Alexander and Villani, Alexandra-Chloe and Wang, Guilin and Yan, Jia and Zhang, Ce and Pisco, Angela and Krishnaswamy, Smita and Theis, Fabian and Bloom, Jonathan M}, + booktitle = {Proceedings of the Neural Information Processing Systems Track on Datasets and Benchmarks}, + editor = {J. Vanschoren and S. Yeung}, + pages = {}, + publisher = {Curran}, + title = {A sandbox for prediction and integration of DNA, RNA, and proteins in single cells}, + url = {https://datasets-benchmarks-proceedings.neurips.cc/paper_files/paper/2021/file/158f3069a435b314a80bdcb024f8e422-Paper-round2.pdf}, + volume = {1}, + year = {2021} +} +@article{McCarthy2017, + doi = {10.1093/bioinformatics/btw777}, + url = {https://doi.org/10.1093/bioinformatics/btw777}, + year = {2017}, + month = jan, + publisher = {Oxford University Press ({OUP})}, + volume = {33}, + number = {8}, + pages = {1179--1186}, + author = {Davis J McCarthy and Kieran R Campbell and Aaron T L Lun and Quin F Wills}, + editor = {Ivo Hofacker}, + title = {Scater: pre-processing, quality control, normalization and visualization of single-cell {RNA}-seq data in R}, + journal = {Bioinformatics} +} +@article{Wolock2019, + doi = {10.1016/j.cels.2018.11.005}, + url = {https://doi.org/10.1016/j.cels.2018.11.005}, + year = {2019}, + month = apr, + publisher = {Elsevier {BV}}, + volume = {8}, + number = {4}, + pages = {281--291.e9}, + author = {Samuel L. Wolock and Romain Lopez and Allon M. Klein}, + title = {Scrublet: Computational Identification of Cell Doublets in Single-Cell Transcriptomic Data}, + journal = {Cell Systems} +} +@article{Satija2015, + doi = {10.1038/nbt.3192}, + url = {https://doi.org/10.1038/nbt.3192}, + year = {2015}, + month = apr, + publisher = {Springer Science and Business Media {LLC}}, + volume = {33}, + number = {5}, + pages = {495--502}, + author = {Rahul Satija and Jeffrey A Farrell and David Gennert and Alexander F Schier and Aviv Regev}, + title = {Spatial reconstruction of single-cell gene expression data}, + journal = {Nature Biotechnology} +} +@article{Zheng2017, + doi = {10.1038/ncomms14049}, + url = {https://doi.org/10.1038/ncomms14049}, + year = {2017}, + month = jan, + publisher = {Springer Science and Business Media {LLC}}, + volume = {8}, + number = {1}, + author = {Grace X. Y. Zheng and Jessica M. Terry and Phillip Belgrader and Paul Ryvkin and Zachary W. Bent and Ryan Wilson and Solongo B. Ziraldo and Tobias D. Wheeler and Geoff P. McDermott and Junjie Zhu and Mark T. Gregory and Joe Shuga and Luz Montesclaros and Jason G. Underwood and Donald A. Masquelier and Stefanie Y. Nishimura and Michael Schnall-Levin and Paul W. Wyatt and Christopher M. Hindson and Rajiv Bharadwaj and Alexander Wong and Kevin D. Ness and Lan W. Beppu and H. Joachim Deeg and Christopher McFarland and Keith R. Loeb and William J. Valente and Nolan G. Ericson and Emily A. Stevens and Jerald P. Radich and Tarjei S. Mikkelsen and Benjamin J. Hindson and Jason H. Bielas}, + title = {Massively parallel digital transcriptional profiling of single cells}, + journal = {Nature Communications} +} +@article{stuart2019comprehensive, + title = {Comprehensive integration of single-cell data}, + author = {Stuart, Tim and Butler, Andrew and Hoffman, Paul and Hafemeister, Christoph and Papalexi, Efthymia and Mauck, William M and Hao, Yuhan and Stoeckius, Marlon and Smibert, Peter and Satija, Rahul}, + journal = {Cell}, + volume = {177}, + number = {7}, + pages = {1888--1902}, + year = {2019}, + publisher = {Elsevier} +} +@article{traag2019louvain, + title = {From Louvain to Leiden: guaranteeing well-connected communities}, + author = {Traag, Vincent A and Waltman, Ludo and Van Eck, Nees Jan}, + journal = {Scientific reports}, + volume = {9}, + number = {1}, + pages = {5233}, + year = {2019}, + publisher = {Nature Publishing Group UK London} +} diff --git a/docs/references.rst b/docs/references.rst index 80fdc892de..04c8a59b9f 100644 --- a/docs/references.rst +++ b/docs/references.rst @@ -37,10 +37,6 @@ References *Single cell RNA-seq denoising using a deep count autoencoder*, `bioRxiv `__. -.. [Eulenberg17] Eulenberg *et al.* (2017), - *Reconstructing cell cycle and disease progression using deep learning* - `Nature Communications `__. - .. [Fechtner18] *PyPairs*, `GitHub `__. @@ -233,3 +229,5 @@ References .. [Zunder15] Zunder *et al.* (2015), *A continuous molecular roadmap to iPSC reprogramming through progression analysis of single-cell mass cytometry*, `Cell Stem Cell `__. + +.. bibliography:: diff --git a/docs/release-notes/0.4.0.md b/docs/release-notes/0.4.0.md index e028f7852e..5e49ad8570 100644 --- a/docs/release-notes/0.4.0.md +++ b/docs/release-notes/0.4.0.md @@ -1,6 +1,6 @@ ### 0.4.0 {small}`2017-12-23` -- export to [SPRING] {cite}`Weinreb17` for interactive visualization of data: +- export to [SPRING] {cite-hack}`Weinreb17` for interactive visualization of data: [spring tutorial] {smaller}`S Wollock` [spring]: https://github.com/AllonKleinLab/SPRING/ diff --git a/docs/release-notes/0.4.3.md b/docs/release-notes/0.4.3.md index 966157e076..c3027fbce9 100644 --- a/docs/release-notes/0.4.3.md +++ b/docs/release-notes/0.4.3.md @@ -1,6 +1,6 @@ ### 0.4.3 {small}`2018-02-09` - {func}`~scanpy.pl.clustermap`: heatmap from hierarchical clustering, - based on {func}`seaborn.clustermap` {cite}`Waskom16` {smaller}`A Wolf` + based on {func}`seaborn.clustermap` {cite-hack}`Waskom16` {smaller}`A Wolf` - only return {class}`matplotlib.axes.Axes` in plotting functions of `sc.pl` when `show=False`, otherwise `None` {smaller}`A Wolf` diff --git a/docs/release-notes/1.0.0.md b/docs/release-notes/1.0.0.md index 7085c6a00f..ab86b1c200 100644 --- a/docs/release-notes/1.0.0.md +++ b/docs/release-notes/1.0.0.md @@ -38,7 +38,7 @@ ```{rubric} Further updates ``` -- UMAP {cite}`McInnes18` can serve as a first visualization of the data just as tSNE, +- UMAP {cite-hack}`McInnes18` can serve as a first visualization of the data just as tSNE, in contrast to tSNE, UMAP directly embeds the single-cell graph and is faster; UMAP is also used for measuring connectivities and computing neighbors, see {func}`~scanpy.pp.neighbors` {smaller}`A Wolf` diff --git a/docs/release-notes/1.1.0.md b/docs/release-notes/1.1.0.md index 2f4ca67b08..fd0d68d9fb 100644 --- a/docs/release-notes/1.1.0.md +++ b/docs/release-notes/1.1.0.md @@ -1,12 +1,12 @@ ### 1.1.0 {small}`2018-06-01` - {func}`~scanpy.set_figure_params` by default passes `vector_friendly=True` and allows you to produce reasonablly sized pdfs by rasterizing large scatter plots {smaller}`A Wolf` -- {func}`~scanpy.tl.draw_graph` defaults to the ForceAtlas2 layout {cite}`Jacomy14` {cite}`Chippada18`, which is often more visually appealing and whose computation is much faster {smaller}`S Wollock` +- {func}`~scanpy.tl.draw_graph` defaults to the ForceAtlas2 layout {cite-hack}`Jacomy14` {cite-hack}`Chippada18`, which is often more visually appealing and whose computation is much faster {smaller}`S Wollock` - {func}`~scanpy.pl.scatter` also plots along variables axis {smaller}`MD Luecken` - {func}`~scanpy.pp.pca` and {func}`~scanpy.pp.log1p` support chunk processing {smaller}`S Rybakov` - {func}`~scanpy.pp.regress_out` is back to multiprocessing {smaller}`F Ramirez` - {func}`~scanpy.read` reads compressed text files {smaller}`G Eraslan` - {func}`~scanpy.queries.mitochondrial_genes` for querying mito genes {smaller}`FG Brundu` -- {func}`~scanpy.external.pp.mnn_correct` for batch correction {cite}`Haghverdi18` {cite}`Kang18` -- {func}`~scanpy.external.tl.phate` for low-dimensional embedding {cite}`Moon17` {smaller}`S Gigante` -- {func}`~scanpy.external.tl.sandbag`, {func}`~scanpy.external.tl.cyclone` for scoring genes {cite}`Scialdone15` {cite}`Fechtner18` +- {func}`~scanpy.external.pp.mnn_correct` for batch correction {cite-hack}`Haghverdi18` {cite-hack}`Kang18` +- {func}`~scanpy.external.tl.phate` for low-dimensional embedding {cite-hack}`Moon17` {smaller}`S Gigante` +- {func}`~scanpy.external.tl.sandbag`, {func}`~scanpy.external.tl.cyclone` for scoring genes {cite-hack}`Scialdone15` {cite-hack}`Fechtner18` diff --git a/docs/release-notes/1.10.0.md b/docs/release-notes/1.10.0.md index 72b066d130..a42d409f9f 100644 --- a/docs/release-notes/1.10.0.md +++ b/docs/release-notes/1.10.0.md @@ -1,11 +1,14 @@ -### 1.10.0rc2 {small}`2024-02-22` +### 1.10.0 {small}`2024-03-26` -```{rubric} Bug fixes -``` +`scanpy` 1.10 brings a large amount of new features, performance improvements, and improved documentation. -* Fix pytest deprecation warning {pr}`2879` {smaller}`P Angerer` +Some highlights: -### 1.10.0rc1 {small}`2024-02-22` +* Improved support for out-of-core workflows via `dask`. See new tutorial: {doc}`/tutorials/experimental/dask` demonstrating counts-to-clusters for 1.4 million cells in <10 min. +* A new {doc}`basic clustering tutorial ` demonstrating an updated workflow. +* Opt-in increased performance for neighbor search and clustering ({doc}`how to guide `). +* Ability to `mask` observations or variables from a number of methods (see {doc}`/tutorials/plotting/advanced` for an example with plotting embeddings) +* A new function {func}`~scanpy.get.aggregate` for computing aggregations of your data, very useful for pseudo bulking! ```{rubric} Features ``` @@ -32,10 +35,14 @@ ```{rubric} Docs ``` +* Doc style overhaul {pr}`2220` {smaller}`A Gayoso` * Re-add search-as-you-type, this time via `readthedocs-sphinx-search` {pr}`2805` {smaller}`P Angerer` * Fixed a lot of broken usage examples {pr}`2605` {smaller}`P Angerer` * Improved harmonization of return field of `sc.pp` and `sc.tl` functions {pr}`2742` {smaller}`E Roellin` * Improved docs for `percent_top` argument of {func}`~scanpy.pp.calculate_qc_metrics` {pr}`2849` {smaller}`I Virshup` +* New basic clustering tutorial ({doc}`/tutorials/basics/clustering`), based on one from [scverse-tutorials](https://scverse-tutorials.readthedocs.io/en/latest/notebooks/basic-scrna-tutorial.html) {pr}`2901` {smaller}`I Virshup` +* Overhauled {doc}`/tutorials/index` page, and added new {doc}`/how-to/index` section to docs {pr}`2901` {smaller}`I Virshup` +* Added a new tutorial on working with dask ({doc}`/tutorials/experimental/dask`) {pr}`2901` {smaller}`I Gold` {smaller}`I Virshup` ```{rubric} Bug fixes ``` @@ -51,6 +58,7 @@ * Removes self from array of neighbors for `use_approx_neighbors = True` in {func}`~scanpy.pp.scrublet` {pr}`2896`{smaller}`S Dicks` * Compatibility with scipy 1.13 {pr}`2943` {smaller}`I Virshup` * Fix use of {func}`~scanpy.tl.dendrogram` on highly correlated low precision data {pr}`2928` {smaller}`P Angerer` +* Fix pytest deprecation warning {pr}`2879` {smaller}`P Angerer` ```{rubric} Development diff --git a/docs/release-notes/1.2.1.md b/docs/release-notes/1.2.1.md index 24d339e34a..3bbd855406 100644 --- a/docs/release-notes/1.2.1.md +++ b/docs/release-notes/1.2.1.md @@ -3,4 +3,4 @@ ~~~{rubric} Plotting of {ref}`pl-generic` marker genes and quality control. ~~~ -- {func}`~scanpy.pl.highest_expr_genes` for quality control; plot genes with highest mean fraction of cells, similar to `plotQC` of *Scater* {cite}`McCarthy17` {pr}`169` {smaller}`F Ramirez` +- {func}`~scanpy.pl.highest_expr_genes` for quality control; plot genes with highest mean fraction of cells, similar to `plotQC` of *Scater* {cite-hack}`McCarthy17` {pr}`169` {smaller}`F Ramirez` diff --git a/docs/release-notes/1.3.1.md b/docs/release-notes/1.3.1.md index 9eb6bf35d6..93a0109da4 100644 --- a/docs/release-notes/1.3.1.md +++ b/docs/release-notes/1.3.1.md @@ -1,10 +1,10 @@ ### 1.3.1 {small}`2018-09-03` -```{rubric} RNA velocity in single cells {cite}`Manno18` +```{rubric} RNA velocity in single cells {cite-hack}`Manno18` ``` -- Scanpy and AnnData support loom’s layers so that computations for single-cell RNA velocity {cite}`Manno18` become feasible {smaller}`S Rybakov and V Bergen` -- [scvelo] harmonizes with Scanpy and is able to process loom files with splicing information produced by Velocyto {cite}`Manno18`, it runs a lot faster than the count matrix analysis of Velocyto and provides several conceptual developments +- Scanpy and AnnData support loom’s layers so that computations for single-cell RNA velocity {cite-hack}`Manno18` become feasible {smaller}`S Rybakov and V Bergen` +- [scvelo] harmonizes with Scanpy and is able to process loom files with splicing information produced by Velocyto {cite-hack}`Manno18`, it runs a lot faster than the count matrix analysis of Velocyto and provides several conceptual developments ~~~{rubric} Plotting ({ref}`pl-generic`) ~~~ @@ -16,7 +16,7 @@ ~~~{rubric} There now is a section on imputation in {doc}`external <../external/index>`: ~~~ -- {func}`~scanpy.external.pp.magic` for imputation using data diffusion {cite}`vanDijk18` {pr}`187` {smaller}`S Gigante` -- {func}`~scanpy.external.pp.dca` for imputation and latent space construction using an autoencoder {cite}`Eraslan18` {pr}`186` {smaller}`G Eraslan` +- {func}`~scanpy.external.pp.magic` for imputation using data diffusion {cite-hack}`vanDijk18` {pr}`187` {smaller}`S Gigante` +- {func}`~scanpy.external.pp.dca` for imputation and latent space construction using an autoencoder {cite-hack}`Eraslan18` {pr}`186` {smaller}`G Eraslan` [scvelo]: https://github.com/theislab/scvelo diff --git a/docs/release-notes/1.3.4.md b/docs/release-notes/1.3.4.md index 2a26a1c765..2be8d27903 100644 --- a/docs/release-notes/1.3.4.md +++ b/docs/release-notes/1.3.4.md @@ -1,5 +1,5 @@ ### 1.3.4 {small}`2018-11-24` -- {func}`~scanpy.tl.leiden` wraps the recent graph clustering package by {cite}`Traag18` {smaller}`K Polanski` -- {func}`~scanpy.external.pp.bbknn` wraps the recent batch correction package {cite}`Polanski19` {smaller}`K Polanski` -- {func}`~scanpy.pp.calculate_qc_metrics` caculates a number of quality control metrics, similar to `calculateQCMetrics` from *Scater* {cite}`McCarthy17` {smaller}`I Virshup` +- {func}`~scanpy.tl.leiden` wraps the recent graph clustering package by {cite-hack}`Traag18` {smaller}`K Polanski` +- {func}`~scanpy.external.pp.bbknn` wraps the recent batch correction package {cite-hack}`Polanski19` {smaller}`K Polanski` +- {func}`~scanpy.pp.calculate_qc_metrics` caculates a number of quality control metrics, similar to `calculateQCMetrics` from *Scater* {cite-hack}`McCarthy17` {smaller}`I Virshup` diff --git a/docs/release-notes/1.4.1.md b/docs/release-notes/1.4.1.md index b9023513c6..964176a029 100644 --- a/docs/release-notes/1.4.1.md +++ b/docs/release-notes/1.4.1.md @@ -10,7 +10,7 @@ - {func}`~scanpy.pp.normalize_total` replaces {func}`~scanpy.pp.normalize_per_cell`, is more efficient and provides a parameter to only normalize using a fraction of expressed genes {smaller}`S Rybakov` - {func}`~scanpy.pp.downsample_counts` has been sped up, changed default value of `replace` parameter to `False` {pr}`474` {smaller}`I Virshup` - {func}`~scanpy.tl.embedding_density` computes densities on embeddings {pr}`543` {smaller}`M Luecken` -- {func}`~scanpy.external.tl.palantir` interfaces Palantir {cite}`Setty18` {pr}`493` {smaller}`A Mousa` +- {func}`~scanpy.external.tl.palantir` interfaces Palantir {cite-hack}`Setty18` {pr}`493` {smaller}`A Mousa` ```{rubric} Code design ``` diff --git a/docs/release-notes/1.4.5.md b/docs/release-notes/1.4.5.md index a70ab739ee..c56c1270da 100644 --- a/docs/release-notes/1.4.5.md +++ b/docs/release-notes/1.4.5.md @@ -5,7 +5,7 @@ Please install `scanpy==1.4.5.post3` instead of `scanpy==1.4.5`. ```{rubric} New functionality ``` -- {func}`~scanpy.tl.ingest` maps labels and embeddings of reference data to new data {doc}`tutorials:integrating-data-using-ingest` {pr}`651` {smaller}`S Rybakov, A Wolf` +- {func}`~scanpy.tl.ingest` maps labels and embeddings of reference data to new data {doc}`/tutorials/basics/integrating-data-using-ingest` {pr}`651` {smaller}`S Rybakov, A Wolf` - {mod}`~scanpy.queries` recieved many updates including enrichment through [gprofiler] and more advanced biomart queries {pr}`467` {smaller}`I Virshup` - {func}`~scanpy.set_figure_params` allows setting `figsize` and accepts `facecolor='white'`, useful for working in dark mode {smaller}`A Wolf` diff --git a/docs/release-notes/1.4.6.md b/docs/release-notes/1.4.6.md index bd204d211f..dc321e878a 100644 --- a/docs/release-notes/1.4.6.md +++ b/docs/release-notes/1.4.6.md @@ -3,7 +3,7 @@ ~~~{rubric} Functionality in `external` ~~~ -- {func}`~scanpy.external.tl.sam` self-assembling manifolds {cite}`Tarashansky19` {pr}`903` {smaller}`A Tarashansky` +- {func}`~scanpy.external.tl.sam` self-assembling manifolds {cite-hack}`Tarashansky19` {pr}`903` {smaller}`A Tarashansky` - {func}`~scanpy.external.tl.harmony_timeseries` for trajectory inference on discrete time points {pr}`994` {smaller}`A Mousa` - {func}`~scanpy.external.tl.wishbone` for trajectory inference (bifurcations) {pr}`1063` {smaller}`A Mousa` diff --git a/docs/release-notes/1.5.0.md b/docs/release-notes/1.5.0.md index 3da5fdf766..b1fff45e03 100644 --- a/docs/release-notes/1.5.0.md +++ b/docs/release-notes/1.5.0.md @@ -5,7 +5,7 @@ The `1.5.0` release adds a lot of new functionality, much of which takes advanta ```{rubric} Spatial data support ``` -- Basic analysis {doc}`tutorials:spatial/basic-analysis` and integration with single cell data {doc}`tutorials:spatial/integration-scanorama` {smaller}`G Palla` +- Basic analysis {doc}`/tutorials/spatial/basic-analysis` and integration with single cell data {doc}`/tutorials/spatial/integration-scanorama` {smaller}`G Palla` - {func}`~scanpy.read_visium` read 10x Visium data {pr}`1034` {smaller}`G Palla, P Angerer, I Virshup` - {func}`~scanpy.datasets.visium_sge` load Visium data directly from 10x Genomics {pr}`1013` {smaller}`M Mirkazemi, G Palla, P Angerer` - {func}`~scanpy.pl.spatial` plot spatial data {pr}`1012` {smaller}`G Palla, P Angerer` @@ -20,7 +20,7 @@ The `1.5.0` release adds a lot of new functionality, much of which takes advanta ``` - `scanpy.external.pp.scvi` for preprocessing with scVI {pr}`1085` {smaller}`G Xing` -- Guide for using {ref}`Scanpy in R ` {pr}`1186` {smaller}`L Zappia` +- Guide for using `Scanpy in R` {pr}`1186` {smaller}`L Zappia` ```{rubric} Performance ``` diff --git a/docs/release-notes/1.6.0.md b/docs/release-notes/1.6.0.md index a57f2b01b8..fe40597a81 100644 --- a/docs/release-notes/1.6.0.md +++ b/docs/release-notes/1.6.0.md @@ -5,7 +5,7 @@ This release includes an overhaul of {func}`~scanpy.pl.dotplot`, {func}`~scanpy. ~~~{rubric} Overhaul of {func}`~scanpy.pl.dotplot`, {func}`~scanpy.pl.matrixplot`, and {func}`~scanpy.pl.stacked_violin` {pr}`1210` {smaller}`F Ramirez` ~~~ -- An overhauled tutorial {doc}`tutorials:plotting/core`. +- An overhauled tutorial {doc}`/tutorials/plotting/core`. - New plotting classes can be accessed directly (e.g., {class}`~scanpy.pl.DotPlot`) or using the `return_fig` param. diff --git a/docs/release-notes/1.7.0.md b/docs/release-notes/1.7.0.md index 69ae5fd1b0..39d4b5a06b 100644 --- a/docs/release-notes/1.7.0.md +++ b/docs/release-notes/1.7.0.md @@ -17,9 +17,9 @@ ```{rubric} External tools (new) ``` -- Add [Scanorama](https://github.com/brianhie/scanorama) integration to scanpy external API ({func}`~scanpy.external.pp.scanorama_integrate`) {cite}`Hie19` {pr}`1332` {smaller}`B Hie` -- Scrublet {cite}`Wolock19` integration: {func}`~scanpy.pp.scrublet`, {func}`~scanpy.pp.scrublet_simulate_doublets`, and plotting method {func}`~scanpy.pl.scrublet_score_distribution` {pr}`1476` {smaller}`J Manning` -- {func}`~scanpy.external.pp.hashsolo` for HTO demultiplexing {cite}`Bernstein20` {pr}`1432` {smaller}`NJ Bernstein` +- Add [Scanorama](https://github.com/brianhie/scanorama) integration to scanpy external API ({func}`~scanpy.external.pp.scanorama_integrate`) {cite-hack}`Hie19` {pr}`1332` {smaller}`B Hie` +- Scrublet {cite-hack}`Wolock19` integration: {func}`~scanpy.pp.scrublet`, {func}`~scanpy.pp.scrublet_simulate_doublets`, and plotting method {func}`~scanpy.pl.scrublet_score_distribution` {pr}`1476` {smaller}`J Manning` +- {func}`~scanpy.external.pp.hashsolo` for HTO demultiplexing {cite-hack}`Bernstein20` {pr}`1432` {smaller}`NJ Bernstein` - Added [scirpy](https://github.com/icbi-lab/scirpy) (sc-AIRR analysis) to ecosystem page {pr}`1453` {smaller}`G Sturm` - Added [scvi-tools](https://scvi-tools.org) to ecosystem page {pr}`1421` {smaller}`A Gayoso` diff --git a/docs/release-notes/1.9.0.md b/docs/release-notes/1.9.0.md index 309e85f39c..977489a34b 100644 --- a/docs/release-notes/1.9.0.md +++ b/docs/release-notes/1.9.0.md @@ -3,7 +3,7 @@ ```{rubric} Tutorials ``` -- New tutorial on the usage of Pearson Residuals: {doc}`tutorials:tutorial_pearson_residuals` {smaller}`J Lause, G Palla` +- New tutorial on the usage of Pearson Residuals: {doc}`/tutorials/experimental/pearson_residuals` {smaller}`J Lause, G Palla` - [Materials](https://github.com/scverse/scanpy-tutorials/tree/master/scanpy_workshop) and [recordings](https://www.youtube.com/playlist?list=PL4rcQcNPLZxWQQH7LlRBMkAo5NWuHX1e3) for Scanpy workshops by Maren Büttner ```{rubric} Experimental module diff --git a/docs/tutorials/basics/clustering-2017.ipynb b/docs/tutorials/basics/clustering-2017.ipynb new file mode 120000 index 0000000000..188cc47fa4 --- /dev/null +++ b/docs/tutorials/basics/clustering-2017.ipynb @@ -0,0 +1 @@ +../../../notebooks/pbmc3k.ipynb \ No newline at end of file diff --git a/docs/tutorials/basics/clustering.ipynb b/docs/tutorials/basics/clustering.ipynb new file mode 120000 index 0000000000..5048fcbfd5 --- /dev/null +++ b/docs/tutorials/basics/clustering.ipynb @@ -0,0 +1 @@ +../../../notebooks/basic-scrna-tutorial.ipynb \ No newline at end of file diff --git a/docs/tutorials/basics/index.md b/docs/tutorials/basics/index.md new file mode 100644 index 0000000000..820f925092 --- /dev/null +++ b/docs/tutorials/basics/index.md @@ -0,0 +1,9 @@ +# Basics + +```{toctree} +:maxdepth: 1 + +clustering +clustering-2017 +integrating-data-using-ingest +``` diff --git a/docs/tutorials/basics/integrating-data-using-ingest.ipynb b/docs/tutorials/basics/integrating-data-using-ingest.ipynb new file mode 120000 index 0000000000..900667fb75 --- /dev/null +++ b/docs/tutorials/basics/integrating-data-using-ingest.ipynb @@ -0,0 +1 @@ +../../../notebooks/integrating-data-using-ingest.ipynb \ No newline at end of file diff --git a/docs/tutorials/experimental/dask.ipynb b/docs/tutorials/experimental/dask.ipynb new file mode 120000 index 0000000000..627fb705d4 --- /dev/null +++ b/docs/tutorials/experimental/dask.ipynb @@ -0,0 +1 @@ +../../../notebooks/dask.ipynb \ No newline at end of file diff --git a/docs/tutorials/experimental/index.md b/docs/tutorials/experimental/index.md new file mode 100644 index 0000000000..a269c2e11f --- /dev/null +++ b/docs/tutorials/experimental/index.md @@ -0,0 +1,8 @@ +## Experimental + +```{toctree} +:maxdepth: 1 + +pearson_residuals +dask +``` diff --git a/docs/tutorials/experimental/pearson_residuals.ipynb b/docs/tutorials/experimental/pearson_residuals.ipynb new file mode 120000 index 0000000000..d1caec3010 --- /dev/null +++ b/docs/tutorials/experimental/pearson_residuals.ipynb @@ -0,0 +1 @@ +../../../notebooks/tutorial_pearson_residuals.ipynb \ No newline at end of file diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md new file mode 100644 index 0000000000..ee57056a6d --- /dev/null +++ b/docs/tutorials/index.md @@ -0,0 +1,66 @@ +# Tutorials + +:::{seealso} +For more tutorials featureing scanpy and other [scverse](https://scverse.org) ecosystem tools, check out the curated set of tutorials at [scverse.org/learn](https://scverse.org/learn) +::: + +## Basic workflows + +```{toctree} +:maxdepth: 2 + +basics/index +``` + +## Visualization + +```{toctree} +:maxdepth: 2 + +plotting/index +``` + +## Trajectory inference + +```{seealso} +For more powerful tools for analysing single cell dynamics, check out the Scverse ecosystem packages: + +* [CellRank](https://cellrank.readthedocs.io) +* [Dynamo](https://dynamo-release.readthedocs.io/en/latest/) +``` + +```{toctree} +:maxdepth: 2 + +trajectories/index +``` + +## Spatial data + +```{seealso} +For more up-to-date tutorials on working with spatial data, see: + +* [SquidPy tutorials](https://squidpy.readthedocs.io/en/stable/notebooks/tutorials/index.html) +* [SpatialData tutorials](https://spatialdata.scverse.org/en/latest/tutorials/notebooks/notebooks.html) +* [Scverse ecosystem spatial tutorials](https://scverse.org/learn/) +``` + +```{toctree} +:maxdepth: 2 + +spatial/index +``` + +## Experimental + +```{toctree} +:maxdepth: 2 + +experimental/index +``` + +## Older tutorials + +A number of older tutorials can be found at: + +* The [`scanpy_usage`](https://github.com/scverse/scanpy_usage) repository diff --git a/docs/tutorials/plotting/advanced.ipynb b/docs/tutorials/plotting/advanced.ipynb new file mode 120000 index 0000000000..1737cc043d --- /dev/null +++ b/docs/tutorials/plotting/advanced.ipynb @@ -0,0 +1 @@ +../../../notebooks/plotting/advanced.ipynb \ No newline at end of file diff --git a/docs/tutorials/plotting/core.ipynb b/docs/tutorials/plotting/core.ipynb new file mode 120000 index 0000000000..0fb0f04350 --- /dev/null +++ b/docs/tutorials/plotting/core.ipynb @@ -0,0 +1 @@ +../../../notebooks/plotting/core.ipynb \ No newline at end of file diff --git a/docs/tutorials/plotting/index.md b/docs/tutorials/plotting/index.md new file mode 100644 index 0000000000..62dde6990d --- /dev/null +++ b/docs/tutorials/plotting/index.md @@ -0,0 +1,8 @@ +# Plotting + +```{toctree} +:maxdepth: 1 + +core +advanced +``` diff --git a/docs/tutorials/spatial/basic-analysis.ipynb b/docs/tutorials/spatial/basic-analysis.ipynb new file mode 120000 index 0000000000..66d9e48121 --- /dev/null +++ b/docs/tutorials/spatial/basic-analysis.ipynb @@ -0,0 +1 @@ +../../../notebooks/spatial/basic-analysis.ipynb \ No newline at end of file diff --git a/docs/tutorials/spatial/index.md b/docs/tutorials/spatial/index.md new file mode 100644 index 0000000000..801b901e53 --- /dev/null +++ b/docs/tutorials/spatial/index.md @@ -0,0 +1,8 @@ +## Spatial + +```{toctree} +:maxdepth: 1 + +basic-analysis +integration-scanorama +``` diff --git a/docs/tutorials/spatial/integration-scanorama.ipynb b/docs/tutorials/spatial/integration-scanorama.ipynb new file mode 120000 index 0000000000..5143681577 --- /dev/null +++ b/docs/tutorials/spatial/integration-scanorama.ipynb @@ -0,0 +1 @@ +../../../notebooks/spatial/integration-scanorama.ipynb \ No newline at end of file diff --git a/docs/tutorials/trajectories/index.md b/docs/tutorials/trajectories/index.md new file mode 100644 index 0000000000..2b65cc9510 --- /dev/null +++ b/docs/tutorials/trajectories/index.md @@ -0,0 +1,7 @@ +## Trajectories + +```{toctree} +:maxdepth: 1 + +paga-paul15 +``` diff --git a/docs/tutorials/trajectories/paga-paul15.ipynb b/docs/tutorials/trajectories/paga-paul15.ipynb new file mode 120000 index 0000000000..fb77d3d59e --- /dev/null +++ b/docs/tutorials/trajectories/paga-paul15.ipynb @@ -0,0 +1 @@ +../../../notebooks/paga-paul15.ipynb \ No newline at end of file diff --git a/notebooks b/notebooks index 26e16f8338..22cc7cf461 160000 --- a/notebooks +++ b/notebooks @@ -1 +1 @@ -Subproject commit 26e16f83387caef76abdd42afda3c7c13f7139f1 +Subproject commit 22cc7cf46139cc8bdc2a1c7e4ec37254c8aa50ae diff --git a/pyproject.toml b/pyproject.toml index b7a00384eb..2a2578af30 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -122,6 +122,8 @@ doc = [ "nbsphinx>=0.9", "ipython>=7.20", # for nbsphinx code highlighting "matplotlib!=3.6.1", + "sphinxcontrib-bibtex", + "setuptools", # TODO: remove necessity for being able to import doc-linked classes "dask", "scanpy[paga]", diff --git a/scanpy/datasets/_datasets.py b/scanpy/datasets/_datasets.py index f040eb7a52..0b4f333dab 100644 --- a/scanpy/datasets/_datasets.py +++ b/scanpy/datasets/_datasets.py @@ -307,7 +307,7 @@ def pbmc3k() -> ad.AnnData: def pbmc3k_processed() -> ad.AnnData: """Processed 3k PBMCs from 10x Genomics. - Processed using the basic tutorial :doc:`tutorials:pbmc3k`. + Processed using the basic tutorial :doc:`/tutorials/basics/clustering-2017`. Returns ------- diff --git a/scanpy/neighbors/__init__.py b/scanpy/neighbors/__init__.py index 0910a0883b..3f5a512160 100644 --- a/scanpy/neighbors/__init__.py +++ b/scanpy/neighbors/__init__.py @@ -104,7 +104,7 @@ def neighbors( transformer Approximate kNN search implementation following the API of :class:`~sklearn.neighbors.KNeighborsTransformer`. - See :doc:`tutorials:knn-transformers` for more details. + See :doc:`/how-to/knn-transformers` for more details. Also accepts the following known options: `None` (the default) @@ -166,7 +166,7 @@ def neighbors( See also -------- - :doc:`tutorials:knn-transformers` + :doc:`/how-to/knn-transformers` """ start = logg.info("computing neighbors") adata = adata.copy() if copy else adata diff --git a/scanpy/plotting/_tools/scatterplots.py b/scanpy/plotting/_tools/scatterplots.py index e72bc78c16..ec47f95908 100644 --- a/scanpy/plotting/_tools/scatterplots.py +++ b/scanpy/plotting/_tools/scatterplots.py @@ -989,7 +989,7 @@ def spatial( -------- :func:`scanpy.datasets.visium_sge` Example visium data. - :doc:`tutorials:spatial/basic-analysis` + :doc:`/tutorials/spatial/basic-analysis` Tutorial on spatial analysis. """ # get default image params if available diff --git a/scanpy/tools/_ingest.py b/scanpy/tools/_ingest.py index fb36b7a913..3cf9dda891 100644 --- a/scanpy/tools/_ingest.py +++ b/scanpy/tools/_ingest.py @@ -45,7 +45,7 @@ def ingest( """\ Map labels and embeddings from reference data to new data. - :doc:`tutorials:integrating-data-using-ingest` + :doc:`/tutorials/basics/integrating-data-using-ingest` Integrates embeddings and annotations of an `adata` with a reference dataset `adata_ref` through projecting on a PCA (or alternate From 3ceb740ba37effc44f42ecdb884cef86a38d4346 Mon Sep 17 00:00:00 2001 From: Isaac Virshup Date: Wed, 27 Mar 2024 22:04:42 +1100 Subject: [PATCH 54/54] Fix aggregate for more than two groups (#2965) * Fix aggregate for more than two groups * release note --- docs/release-notes/1.10.1.md | 13 +++++++++++++ docs/release-notes/index.md | 3 +++ scanpy/get/_aggregated.py | 2 +- scanpy/tests/test_aggregated.py | 16 ++++++++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 docs/release-notes/1.10.1.md diff --git a/docs/release-notes/1.10.1.md b/docs/release-notes/1.10.1.md new file mode 100644 index 0000000000..282d2297ca --- /dev/null +++ b/docs/release-notes/1.10.1.md @@ -0,0 +1,13 @@ +### 1.10.1 {small}`the future` + + +```{rubric} Docs +``` + +```{rubric} Bug fixes +``` + +* Fix `aggregate` when aggregating by more than two groups {pr}`2965` {smaller}`I Virshup` + +```{rubric} Performance +``` diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index 0dd4e2a020..ce582c4687 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -9,6 +9,9 @@ ## Version 1.10 +```{include} /release-notes/1.10.1.md +``` + ```{include} /release-notes/1.10.0.md ``` diff --git a/scanpy/get/_aggregated.py b/scanpy/get/_aggregated.py index 5530059c2c..e68053bb3e 100644 --- a/scanpy/get/_aggregated.py +++ b/scanpy/get/_aggregated.py @@ -377,7 +377,7 @@ def _combine_categories( # Calculating result codes factors = np.ones(len(cols) + 1, dtype=np.int32) # First factor needs to be 1 - np.cumsum(n_categories[::-1], out=factors[1:]) + np.cumprod(n_categories[::-1], out=factors[1:]) factors = factors[:-1][::-1] code_array = np.zeros((len(cols), df.shape[0]), dtype=np.int32) diff --git a/scanpy/tests/test_aggregated.py b/scanpy/tests/test_aggregated.py index 99d36947c4..312f4ba5be 100644 --- a/scanpy/tests/test_aggregated.py +++ b/scanpy/tests/test_aggregated.py @@ -460,3 +460,19 @@ def test_dispatch_not_implemented(): adata = sc.datasets.blobs() with pytest.raises(NotImplementedError): sc.get.aggregate(adata.X, adata.obs["blobs"], "sum") + + +def test_factors(): + from itertools import product + + obs = pd.DataFrame( + product(range(5), range(5), range(5), range(5)), columns=list("abcd") + ) + obs.index = [f"cell_{i:04d}" for i in range(obs.shape[0])] + adata = ad.AnnData( + X=np.arange(obs.shape[0]).reshape(-1, 1), + obs=obs, + ) + + res = sc.get.aggregate(adata, by=["a", "b", "c", "d"], func="sum") + np.testing.assert_equal(res.layers["sum"], adata.X)