From 6f0eb1c0b910c4fbba2df6b0f95c49f672bbf775 Mon Sep 17 00:00:00 2001 From: Leon Hafner Date: Tue, 14 Jul 2026 18:28:43 +0000 Subject: [PATCH 1/2] Add --epsilon CLI flag to `cell-eval run` Expose pdex's log fold-change pseudocount as a CLI option. Defaults to 0.0 (no behavior change from the current pinned default); pass e.g. 1e-9 to match pdex>=0.2.5 behavior. Forwarded via pdex_kwargs to both the --celltype-col split path and the single-evaluator path, and thus into the data-ceiling DE, mirroring how --cpm-filter is handled. --- src/cell_eval/_cli/_run.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/cell_eval/_cli/_run.py b/src/cell_eval/_cli/_run.py index b62a124..db403f1 100644 --- a/src/cell_eval/_cli/_run.py +++ b/src/cell_eval/_cli/_run.py @@ -2,6 +2,7 @@ import importlib.metadata import logging import os +from typing import Any from .. import KNOWN_PROFILES from ._const import DEFAULT_CTRL, DEFAULT_OUTDIR, DEFAULT_PERT_COL @@ -118,6 +119,14 @@ def parse_args_run(parser: ap.ArgumentParser): "the reference, removing the below-detection floor. OFF by default (default DE " "behavior unchanged); pass e.g. 5 to enable (T is dataset-dependent).", ) + parser.add_argument( + "--epsilon", + type=float, + default=0.0, + help="Epsilon (pseudocount) forwarded to pdex for the log fold-change " + "denominator [default: %(default)s]. Pass e.g. 1e-9 to match pdex>=0.2.5 " + "behavior.", + ) parser.add_argument( "--version", action="version", @@ -154,6 +163,12 @@ def run_evaluation(args: ap.Namespace): skip_metrics = args.skip_metrics.split(",") if args.skip_metrics else None + # DE knobs forwarded to pdex (cpm_filter off by default; epsilon default 0.0). + pdex_kwargs: dict[str, Any] = { + "cpm_filter": args.cpm_filter, + "epsilon": args.epsilon, + } + if args.celltype_col is not None: real = ad.read_h5ad(args.adata_real) pred = ad.read_h5ad(args.adata_pred) @@ -181,7 +196,7 @@ def run_evaluation(args: ap.Namespace): allow_discrete=args.allow_discrete, prefix=ct, skip_de=args.profile == "pds", - pdex_kwargs={"cpm_filter": args.cpm_filter}, + pdex_kwargs=pdex_kwargs, ) evaluator.compute( profile=args.profile, @@ -210,7 +225,7 @@ def run_evaluation(args: ap.Namespace): outdir=args.outdir, allow_discrete=args.allow_discrete, skip_de=args.profile == "pds", - pdex_kwargs={"cpm_filter": args.cpm_filter}, + pdex_kwargs=pdex_kwargs, ) evaluator.compute( profile=args.profile, From faee50136058c21cf76ca4f55756f5c05abaed0c Mon Sep 17 00:00:00 2001 From: Leon Hafner Date: Tue, 14 Jul 2026 18:39:01 +0000 Subject: [PATCH 2/2] Drop unused ty:ignore[invalid-argument-type] suppressions A newer ty no longer reports invalid-argument-type on AnnData.write_h5ad, so these three suppressions are now flagged unused-ignore-comment and fail the typing CI. Remove them (no functional change). --- src/cell_eval/_baseline.py | 2 +- src/cell_eval/_cli/_prep.py | 2 +- tutorials/vcc/vcc.ipynb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cell_eval/_baseline.py b/src/cell_eval/_baseline.py index a2cbf8d..aab4534 100644 --- a/src/cell_eval/_baseline.py +++ b/src/cell_eval/_baseline.py @@ -77,7 +77,7 @@ def build_base_mean_adata( if output_path is not None: logger.info(f"Saving baseline data to {output_path}") - baseline_adata.write_h5ad(output_path) # ty: ignore[invalid-argument-type] + baseline_adata.write_h5ad(output_path) if output_de_path is not None: logger.info("Calculating differential expression") diff --git a/src/cell_eval/_cli/_prep.py b/src/cell_eval/_cli/_prep.py index dce7b1a..686b8a2 100644 --- a/src/cell_eval/_cli/_prep.py +++ b/src/cell_eval/_cli/_prep.py @@ -226,7 +226,7 @@ def strip_anndata( # Write the h5ad file logger.info(f"Writing h5ad output to {tmp_h5ad}") - minimal.write_h5ad(tmp_h5ad) # ty: ignore[invalid-argument-type] + minimal.write_h5ad(tmp_h5ad) # Zstd compress the h5ad file (will create pred.h5ad.zst) logger.info(f"Zstd compressing {tmp_h5ad}") diff --git a/tutorials/vcc/vcc.ipynb b/tutorials/vcc/vcc.ipynb index 7e64de8..32bf2c9 100644 --- a/tutorials/vcc/vcc.ipynb +++ b/tutorials/vcc/vcc.ipynb @@ -259,7 +259,7 @@ "id": "386ee994", "metadata": {}, "outputs": [], - "source": "adata.write_h5ad(\"./example.h5ad\") # ty: ignore[invalid-argument-type]" + "source": "adata.write_h5ad(\"./example.h5ad\")" }, { "cell_type": "markdown",