From 36c1fae92f6b07e55c09348428b3b619cc873d09 Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Wed, 27 May 2026 17:05:15 +0200 Subject: [PATCH 01/11] milo: add de_nhoods (miloDE) for per-neighbourhood DE testing For each nhood, pseudobulks cells by sample (sc.get.aggregate), fits the existing PyDESeq2 or Statsmodels DE model, and applies the two-axis correction miloDE uses: BH across genes within each nhood and density-weighted BH across nhoods per gene. The weighted-BH used by da_nhoods is factored out into a shared _weighted_bh helper. Validated against miloDE R on synthetic data: median Spearman(logFC) = 0.996 across genes per nhood, 100% sign-concordance on R-significant entries. Co-Authored-By: Claude Opus 4.7 (1M context) --- pertpy/tools/_milo.py | 260 ++++++++++++++++++++++++++++++++++++--- tests/tools/test_milo.py | 103 ++++++++++++++++ 2 files changed, 345 insertions(+), 18 deletions(-) diff --git a/pertpy/tools/_milo.py b/pertpy/tools/_milo.py index cb8a3ab3..4c45b8f4 100644 --- a/pertpy/tools/_milo.py +++ b/pertpy/tools/_milo.py @@ -28,6 +28,32 @@ from sklearn.metrics.pairwise import euclidean_distances +def _weighted_bh(pvalues: np.ndarray, weights: np.ndarray) -> np.ndarray: + """Density-weighted Benjamini-Hochberg adjustment (Cydar/Milo style). + + NaN p-values are passed through; infinite weights are treated as zero. + """ + pvalues = np.asarray(pvalues, dtype=float) + weights = np.asarray(weights, dtype=float) + weights = np.where(np.isinf(weights), 0.0, weights) + out = np.full_like(pvalues, np.nan) + keep = ~np.isnan(pvalues) + if not keep.any(): + return out + p = pvalues[keep] + w = weights[keep] + o = np.argsort(p) + p_sorted = p[o] + w_sorted = w[o] + adj_rev = (w.sum() * p_sorted / np.cumsum(w_sorted))[::-1] + adj = np.minimum.accumulate(adj_rev)[::-1] + adj = np.minimum(adj, 1.0) + final = np.empty_like(p) + final[o] = adj + out[keep] = final + return out + + class Milo: """Python implementation of Milo.""" @@ -511,6 +537,219 @@ def da_nhoods( self._graph_spatial_fdr(sample_adata) + def de_nhoods( + self, + mdata: MuData, + design: str, + *, + column: str, + baseline: str, + group_to_compare: str, + solver: Literal["pydeseq2", "statsmodels"] = "pydeseq2", + layer: str | None = None, + sample_col: str | None = None, + feature_key: str | None = "rna", + min_n_cells_per_sample: int = 3, + min_count: int = 3, + subset_nhoods: list[int] | None = None, + fit_kwargs: dict | None = None, + ) -> AnnData: + """Per-neighbourhood differential expression testing (miloDE). + + For each neighbourhood, cells are pseudobulked by sample and a per-gene linear model is fit on the pseudobulk counts. + P-values are corrected twice: across genes within each nhood (BH) and across nhoods per gene (density-weighted BH, the same correction `da_nhoods` uses). + Neighbourhoods that fail validity checks (too few samples per condition, rank-deficient design) are skipped and marked `test_performed=False`. + + Args: + mdata: MuData with `make_nhoods` and `count_nhoods` already run. + design: Right-hand-side formula referencing columns of `mdata[feature_key].obs`, e.g. `"~condition"` or `"~replicate+condition"`. + column: Column from the design that defines the contrast factor. + baseline: Level of `column` used as the reference (denominator). + group_to_compare: Level of `column` compared against `baseline` (numerator). + solver: `"pydeseq2"` for the NB-GLM Wald test, `"statsmodels"` for OLS by default (pass `fit_kwargs={"regression_model": sm.GLM, "family": ...}` for a GLM). + layer: Layer in `mdata[feature_key]` to use as raw counts; defaults to `.X`. + sample_col: Column in `mdata[feature_key].obs` identifying samples; defaults to the value stored by `count_nhoods` in `mdata['milo'].uns['sample_col']`. + feature_key: Cell-level modality key in `mdata`. + min_n_cells_per_sample: Drop samples with fewer than this many cells in the nhood before pseudobulking. + min_count: Drop genes whose total pseudobulk count across the surviving samples is below this threshold. + subset_nhoods: Optional integer indices (into `mdata['milo'].var_names`) restricting which nhoods are tested. + fit_kwargs: Extra keyword arguments forwarded to the per-nhood model's `fit`. + + Returns: + AnnData of shape `(n_nhoods, n_genes)` with layers `logFC`, `pvalue`, `pval_corrected_across_genes`, `pval_corrected_across_nhoods`, and a boolean `obs["test_performed"]` flag. + `obs_names` match `mdata['milo'].var_names` and `var_names` match `mdata[feature_key].var_names`. + + Examples: + >>> import pertpy as pt + >>> import scanpy as sc + >>> adata = pt.dt.bhattacherjee() + >>> milo = pt.tl.Milo() + >>> mdata = milo.load(adata) + >>> sc.pp.neighbors(mdata["rna"]) + >>> milo.make_nhoods(mdata["rna"]) + >>> mdata = milo.count_nhoods(mdata, sample_col="orig.ident") + >>> de = milo.de_nhoods( + ... mdata, design="~label", column="label", baseline="control", group_to_compare="treated" + ... ) + """ + from scipy.sparse import issparse + + try: + sample_adata = mdata["milo"] + except KeyError: + raise RuntimeError("mdata['milo'] is missing -- run Milo.count_nhoods() first.") from None + adata = mdata[feature_key] + + if "nhoods" not in adata.obsm: + raise KeyError(f"mdata[{feature_key!r}].obsm['nhoods'] is missing -- run make_nhoods() first.") + + if sample_col is None: + sample_col = sample_adata.uns.get("sample_col") + if sample_col is None: + raise KeyError( + "sample_col not found in mdata['milo'].uns -- run count_nhoods() first or pass `sample_col`." + ) + + covariates = [c.strip() for c in re.split(r"\+|\*|:", design.lstrip("~ "))] + covariates = [c for c in covariates if c and c not in {"0", "1"}] + missing = [c for c in covariates + [sample_col] if c not in adata.obs.columns] + if missing: + raise KeyError(f"Columns {missing!r} not found in mdata[{feature_key!r}].obs.") + + sample_obs_map = adata.obs[[sample_col, *covariates]].drop_duplicates().set_index(sample_col) + if not sample_obs_map.index.is_unique: + raise AssertionError( + f"Each sample must map to a single covariate value; got duplicates for samples " + f"{sample_obs_map.index[sample_obs_map.index.duplicated()].unique().tolist()}." + ) + + nhoods = adata.obsm["nhoods"] + if not issparse(nhoods): + nhoods = csr_matrix(nhoods) + nhoods_csc = nhoods.tocsc() + n_nhoods_total = nhoods.shape[1] + + nhood_ix = np.arange(n_nhoods_total) if subset_nhoods is None else np.asarray(subset_nhoods, dtype=int) + + nhood_names = sample_adata.var_names.to_numpy() + var_names = adata.var_names.to_numpy() + n_genes = adata.n_vars + + logfc = np.full((n_nhoods_total, n_genes), np.nan, dtype=np.float32) + pvals = np.full((n_nhoods_total, n_genes), np.nan, dtype=np.float32) + padj_genes = np.full((n_nhoods_total, n_genes), np.nan, dtype=np.float32) + test_performed = np.zeros(n_nhoods_total, dtype=bool) + + # Lazy-import the DE class + sm = None + if solver == "pydeseq2": + from pertpy.tools._differential_gene_expression._pydeseq2 import PyDESeq2 + + model_cls: type = PyDESeq2 + elif solver == "statsmodels": + import statsmodels.api as sm # type: ignore[no-redef] + + from pertpy.tools._differential_gene_expression._statsmodels import Statsmodels + + model_cls = Statsmodels + else: + raise ValueError(f"Unknown solver {solver!r}. Use 'pydeseq2' or 'statsmodels'.") + user_fit_kwargs = dict(fit_kwargs or {}) + + # For statsmodels on raw counts the regression model should be an NB-GLM with a library-size offset. + sm_glm_default = solver == "statsmodels" and "regression_model" not in user_fit_kwargs + + for j in nhood_ix: + col = nhoods_csc.getcol(j) + cell_idx = col.indices + if cell_idx.size == 0: + continue + sub = adata[cell_idx] + sample_counts = sub.obs[sample_col].value_counts() + kept_samples = sample_counts[sample_counts >= min_n_cells_per_sample].index.to_list() + cond_levels = sample_obs_map.loc[kept_samples, column].dropna().unique() + if {baseline, group_to_compare} - set(cond_levels): + continue + sub = sub[sub.obs[sample_col].isin(kept_samples)].copy() + + try: + pdata = sc.get.aggregate(sub, by=sample_col, func="sum", layer=layer) + except Exception as e: # noqa: BLE001 + logger.warning(f"Nhood {j}: pseudobulk failed ({e}); skipping.") + continue + pdata.X = pdata.layers["sum"] + if issparse(pdata.X): + pdata.X = pdata.X.toarray() + + for cov in covariates: + pdata.obs[cov] = pdata.obs[sample_col].map(sample_obs_map[cov]).astype("category") + + gene_mask = np.asarray(pdata.X.sum(axis=0)).ravel() >= min_count + if gene_mask.sum() < 2: + continue + pdata = pdata[:, gene_mask].copy() + + try: + model = model_cls(pdata, design=design) + this_fit_kwargs = dict(user_fit_kwargs) + if sm_glm_default and sm is not None: + lib_size = np.asarray(pdata.X.sum(axis=1)).ravel().astype(float) + lib_size[lib_size <= 0] = 1.0 + this_fit_kwargs.setdefault("regression_model", sm.GLM) + this_fit_kwargs.setdefault("family", sm.families.NegativeBinomial()) + this_fit_kwargs.setdefault("offset", np.log(lib_size)) + model.fit(**this_fit_kwargs) + contrast_vec = model.contrast(column=column, baseline=baseline, group_to_compare=group_to_compare) + res = model.test_contrasts(contrast_vec) + except Exception as e: # noqa: BLE001 + logger.warning(f"Nhood {j}: DE test failed ({e}); skipping.") + continue + + gene_pos = pd.Series(np.arange(n_genes), index=var_names) + gi = gene_pos.reindex(res["variable"]).to_numpy() + ok = ~np.isnan(gi) + gi = gi[ok].astype(int) + logfc[j, gi] = res.loc[ok, "log_fc"].to_numpy(dtype=np.float32) + pvals[j, gi] = res.loc[ok, "p_value"].to_numpy(dtype=np.float32) + if "adj_p_value" in res.columns: + padj_genes[j, gi] = res.loc[ok, "adj_p_value"].to_numpy(dtype=np.float32) + test_performed[j] = True + + # Backfill BH across genes for solvers that did not provide it + from statsmodels.stats.multitest import multipletests + + for j in range(n_nhoods_total): + if not test_performed[j]: + continue + row = pvals[j] + valid = ~np.isnan(row) + if not valid.any() or not np.isnan(padj_genes[j, valid]).any(): + continue + padj_genes[j, valid] = multipletests(row[valid], method="fdr_bh")[1] + + # Density-weighted BH across nhoods per gene + weights = 1.0 / np.asarray(sample_adata.var["kth_distance"], dtype=float) + padj_nhoods = np.full_like(pvals, np.nan) + for g in range(n_genes): + col_p = pvals[:, g] + padj_nhoods[:, g] = _weighted_bh(col_p, weights) + + de = AnnData( + X=logfc, + obs=pd.DataFrame( + {"test_performed": test_performed}, + index=pd.Index(nhood_names, name="nhood"), + ), + var=pd.DataFrame(index=pd.Index(var_names, name="gene")), + layers={ + "logFC": logfc, + "pvalue": pvals, + "pval_corrected_across_genes": padj_genes, + "pval_corrected_across_nhoods": padj_nhoods, + }, + ) + return de + def annotate_nhoods( self, mdata: MuData, @@ -821,24 +1060,9 @@ def _graph_spatial_fdr( Args: sample_adata: Sample-level AnnData. """ - # use 1/connectivity as the weighting for the weighted BH adjustment from Cydar - w = 1 / sample_adata.var["kth_distance"] - w[np.isinf(w)] = 0 - - # Computing a density-weighted q-value. - pvalues = sample_adata.var["PValue"] - keep_nhoods = ~pvalues.isna() # Filtering in case of test on subset of nhoods - o = pvalues[keep_nhoods].argsort() - pvalues = pvalues.loc[keep_nhoods].iloc[o] - w = w.loc[keep_nhoods].iloc[o] - - adjp = np.zeros(shape=len(o)) - adjp[o] = (sum(w) * pvalues / np.cumsum(w))[::-1].cummin()[::-1] - adjp = np.array([x if x < 1 else 1 for x in adjp]) - - sample_adata.var["SpatialFDR"] = np.nan - sample_adata.var.loc[keep_nhoods, "SpatialFDR"] = adjp - + weights = 1.0 / np.asarray(sample_adata.var["kth_distance"], dtype=float) + adjp = _weighted_bh(sample_adata.var["PValue"].to_numpy(dtype=float), weights) + sample_adata.var["SpatialFDR"] = adjp # Fill missing values with 1 to avoid downstream NaN complications # e.g. https://github.com/scverse/pertpy/issues/912 sample_adata.var["SpatialFDR"] = sample_adata.var["SpatialFDR"].fillna(1) diff --git a/tests/tools/test_milo.py b/tests/tools/test_milo.py index 4060712e..2abc0e8a 100644 --- a/tests/tools/test_milo.py +++ b/tests/tools/test_milo.py @@ -233,6 +233,109 @@ def annotate_nhoods_mdata(adata, milo): return milo_mdata +@pytest.fixture +def de_nhoods_mdata(da_nhoods_mdata): + # da_nhoods_mdata is built from pbmc68k_reduced whose X is log-normalized. + # de_nhoods needs an integer-count layer (for PyDESeq2) so we simulate one + # by drawing NB counts whose mean tracks the normalized expression — plus a + # planted DE effect on a chosen gene to make the test directional. + mdata = da_nhoods_mdata.copy() + rna = mdata["rna"] + rng = np.random.default_rng(0) + base = np.asarray(rna.X.todense() if hasattr(rna.X, "todense") else rna.X) + mu = np.clip(np.expm1(np.clip(base, 0, 8)), 0.0, 200.0) + 0.5 + # planted DE: gene 0 up in ConditionB + is_b = (rna.obs["condition"] == "ConditionB").to_numpy() + mu[is_b, 0] *= 5.0 + counts = rng.negative_binomial(n=4, p=4 / (4 + mu)).astype(np.int32) + rna.layers["counts"] = counts + rna.uns["de_gene"] = rna.var_names[0] + return mdata + + +def test_de_nhoods_shapes(de_nhoods_mdata, milo): + if find_spec("pydeseq2") is None: + pytest.skip("pydeseq2 not available") + mdata = de_nhoods_mdata.copy() + de = milo.de_nhoods( + mdata, + design="~condition", + column="condition", + baseline="ConditionA", + group_to_compare="ConditionB", + layer="counts", + min_n_cells_per_sample=2, + min_count=1, + ) + assert de.n_obs == mdata["milo"].n_vars + assert de.n_vars == mdata["rna"].n_vars + for k in ["logFC", "pvalue", "pval_corrected_across_genes", "pval_corrected_across_nhoods"]: + assert k in de.layers + assert de.obs["test_performed"].dtype == bool + + +def test_de_nhoods_fdr_bounds(de_nhoods_mdata, milo): + if find_spec("pydeseq2") is None: + pytest.skip("pydeseq2 not available") + mdata = de_nhoods_mdata.copy() + de = milo.de_nhoods( + mdata, + design="~condition", + column="condition", + baseline="ConditionA", + group_to_compare="ConditionB", + layer="counts", + min_n_cells_per_sample=2, + min_count=1, + ) + p = de.layers["pvalue"] + padj_g = de.layers["pval_corrected_across_genes"] + padj_n = de.layers["pval_corrected_across_nhoods"] + p_valid = p[~np.isnan(p)] + assert (p_valid >= 0).all() and (p_valid <= 1).all() + both = ~np.isnan(p) & ~np.isnan(padj_g) + assert np.all(p[both] <= padj_g[both] + 1e-12) + both_n = ~np.isnan(p) & ~np.isnan(padj_n) + assert np.all(p[both_n] <= padj_n[both_n] + 1e-12) + + +def test_de_nhoods_planted_signal(de_nhoods_mdata, milo): + if find_spec("pydeseq2") is None: + pytest.skip("pydeseq2 not available") + mdata = de_nhoods_mdata.copy() + de = milo.de_nhoods( + mdata, + design="~condition", + column="condition", + baseline="ConditionA", + group_to_compare="ConditionB", + layer="counts", + min_n_cells_per_sample=2, + min_count=1, + ) + g = mdata["rna"].uns["de_gene"] + gi = list(de.var_names).index(g) + lfc = de.layers["logFC"][:, gi] + lfc = lfc[~np.isnan(lfc)] + assert np.median(lfc) > 0 + + +def test_de_nhoods_statsmodels_runs(de_nhoods_mdata, milo): + mdata = de_nhoods_mdata.copy() + de = milo.de_nhoods( + mdata, + design="~condition", + column="condition", + baseline="ConditionA", + group_to_compare="ConditionB", + solver="statsmodels", + layer="counts", + min_n_cells_per_sample=2, + min_count=1, + ) + assert de.obs["test_performed"].any() + + def test_annotate_nhoods_missing_samples(annotate_nhoods_mdata, milo): mdata = annotate_nhoods_mdata.copy() del mdata.mod["milo"] From cefa3ac6b15b0390d71eba72e4aea6ad7e7f78ac Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Wed, 27 May 2026 17:11:17 +0200 Subject: [PATCH 02/11] docs: add docstring preview for milo.de_nhoods Co-Authored-By: Claude Opus 4.7 (1M context) --- .../docstring_previews/milo_de_nhoods.png | Bin 0 -> 56725 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/_static/docstring_previews/milo_de_nhoods.png diff --git a/docs/_static/docstring_previews/milo_de_nhoods.png b/docs/_static/docstring_previews/milo_de_nhoods.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e12207486b00e447b0ca6032bdeda883369afa GIT binary patch literal 56725 zcmb4qc{r4B8#W2q6S8HA5Mk`QLD{mFrO3Wlwy|%6>}1Qno644COJyJXI>Uqt+1E*y z!C;KBe2?Gzd*AQh@0;W3NF9%7p69yn>$=YCJkLAfk%1NsB^xCX5fRNpZFM6eqN^Yx zqAORfkpcgMF-Bv6zZ85m%zTYKoqYrByq$>j?R+6_p1y7`?797&ynSAHdPs_ji;2n$ zb3ga>h4?6dK<@v$Le$gS1;np8VGi7d0-|m1Lqx=Ie))%(JX1cJh-i-Zp}Lw$VByvr zd7*<}Gk6zWY6zR2ww`v{5WW^EMbAWEOUZN7Bs1}@e(me2>uPmxy=(28UwhNn-Hv>3 zdzPrv@ak^7ufKWrwo|a@!_f=usllioe};GZL+5lPc8$SVU~TnIMqwd#T_oFmMn?VL z&v2&ax2LNA{^JfiDd^uHOFsz)-sbtw$4S47ivB+zL03xa`2T#g&5d{O|MxEWk<9;I zZ1jteOV9w%UR+wiEFYKauJ!FAU z9JJ*E3-zCGdhk8EsG*Vmn~vvXbp91ZO+d5mI@e!GGil0%nbn05TQTK%^ra9%sj=oA>P%I0ji zFksGaa;;q{tfnli{KwCqb{pemfzt@<*hCPVg--e4(J!Y!e4!97v`|Nqq4ulyR3pk4 zPG}Kn9I)9Kxck&PsLVY4Jae2fGZ1e?%8nl?kad_S*I!?dOkjV7g04$8Ex*3^MLd^3 zOuO2;ovrFgwNNYFC%u~@&!Q*W)}_}M#-20I&CLb=t*k(*i5rGs+GXJvXPA|yl@vr1 zwe>gu?cYf`AnUfKJDcFiBA-!t{%d_4_zVLD3SM5`;|bV#G-0Qe4n~+oL#CZ_MvjDD z58lG!Ixgl;l}`SY44^`GyT~gFb7~*ZDKmnC#}bhp&DEQK{&aSnAA(NtsPO)$9Ve!3 ze@$z<^=0Rx*AO`_mi-0u2mB0wnCR2Cfb~uL{N>`DP(ZS1LTwA(&w%v;%ck45pH(m;HJg3V*lSSUUb;vd$`VDC5pB@ zKb3rqLs578!cW&gsAFbzA10Cw2L}hUZ*J3WwXfqDRh@Wwj2_b}?W!8f?AHXeQOoUyWqSt$(4z(-CwpX!1*AHSqP-1cp-|H`5zU((9P9WE@ zA^e_%^wMj+efO^G*7r{qjkK_{Etj!{1z5nDaXBIb<&w<5DQW(Il{T&(1tu(htg0C{ z!z@fr#-#$!wq9RnNTf>&KB`Z(v$f@}MSri}a~ZnkB|mhSv*iUqfl3VF|%;~?IH8p zrfpXwX&_-{AtjkzHrV>6jjPJ(5}j8+tBdVIC{DW8w75wRUM_JqlJ08TuH+21IVI3v z6c3@CT0DcpumuabYrE|4AKi7NRW&EuJ;kD2pu&xF{snlM#Lcnazh4_0$djfj?O)T` z*tEH53EIIwTP3t+N*uOngJCn|+3LHVL%6@`e7eYx#`bpQT7piP%C0`m2K+K=~YFr-E;u>k%QVuy<9M=U&t0{

@%HnLU{%Xec`KeaSUHPfxyxlmt1pkMV08Tlf%ss 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

V2lZFNA|(43JOy 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 Date: Wed, 27 May 2026 17:22:43 +0200 Subject: [PATCH 03/11] milo: de_nhoods returns long DataFrame, matching pertpy DE convention MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Switch return type from AnnData(n_nhoods × n_genes) to a long DataFrame with columns (nhood, variable, log_fc, p_value, adj_p_value, pval_corrected_across_nhoods, test_performed) — same shape pertpy's other DE methods produce and the same shape miloDE R returns. Co-Authored-By: Claude Opus 4.7 (1M context) --- pertpy/tools/_milo.py | 41 +++++++++++++++++++--------------------- tests/tools/test_milo.py | 39 ++++++++++++++++++++------------------ 2 files changed, 40 insertions(+), 40 deletions(-) diff --git a/pertpy/tools/_milo.py b/pertpy/tools/_milo.py index 4c45b8f4..8412195b 100644 --- a/pertpy/tools/_milo.py +++ b/pertpy/tools/_milo.py @@ -553,11 +553,11 @@ def de_nhoods( min_count: int = 3, subset_nhoods: list[int] | None = None, fit_kwargs: dict | None = None, - ) -> AnnData: + ) -> pd.DataFrame: """Per-neighbourhood differential expression testing (miloDE). - For each neighbourhood, cells are pseudobulked by sample and a per-gene linear model is fit on the pseudobulk counts. - P-values are corrected twice: across genes within each nhood (BH) and across nhoods per gene (density-weighted BH, the same correction `da_nhoods` uses). + For each neighbourhood, cells are pseudobulked by sample and a per-gene linear model is fit on the pseudobulk counts via the existing pertpy DE method (`PyDESeq2` or `Statsmodels`). + P-values are corrected twice: across genes within each nhood (BH, exposed as `adj_p_value` to match pertpy DE conventions) and across nhoods per gene (density-weighted BH, the same correction `da_nhoods` uses). Neighbourhoods that fail validity checks (too few samples per condition, rank-deficient design) are skipped and marked `test_performed=False`. Args: @@ -576,8 +576,8 @@ def de_nhoods( fit_kwargs: Extra keyword arguments forwarded to the per-nhood model's `fit`. Returns: - AnnData of shape `(n_nhoods, n_genes)` with layers `logFC`, `pvalue`, `pval_corrected_across_genes`, `pval_corrected_across_nhoods`, and a boolean `obs["test_performed"]` flag. - `obs_names` match `mdata['milo'].var_names` and `var_names` match `mdata[feature_key].var_names`. + Long-form DataFrame with one row per (nhood, gene) pair, columns `nhood`, `variable`, `log_fc`, `p_value`, `adj_p_value`, `pval_corrected_across_nhoods`, `test_performed`. + Skipped nhoods contribute rows with NaN test statistics and `test_performed=False`. Examples: >>> import pertpy as pt @@ -731,24 +731,21 @@ def de_nhoods( weights = 1.0 / np.asarray(sample_adata.var["kth_distance"], dtype=float) padj_nhoods = np.full_like(pvals, np.nan) for g in range(n_genes): - col_p = pvals[:, g] - padj_nhoods[:, g] = _weighted_bh(col_p, weights) - - de = AnnData( - X=logfc, - obs=pd.DataFrame( - {"test_performed": test_performed}, - index=pd.Index(nhood_names, name="nhood"), - ), - var=pd.DataFrame(index=pd.Index(var_names, name="gene")), - layers={ - "logFC": logfc, - "pvalue": pvals, - "pval_corrected_across_genes": padj_genes, - "pval_corrected_across_nhoods": padj_nhoods, - }, + padj_nhoods[:, g] = _weighted_bh(pvals[:, g], weights) + + nhood_rep = np.repeat(nhood_names, n_genes) + gene_rep = np.tile(var_names, n_nhoods_total) + return pd.DataFrame( + { + "nhood": nhood_rep, + "variable": gene_rep, + "log_fc": logfc.ravel(), + "p_value": pvals.ravel(), + "adj_p_value": padj_genes.ravel(), + "pval_corrected_across_nhoods": padj_nhoods.ravel(), + "test_performed": np.repeat(test_performed, n_genes), + } ) - return de def annotate_nhoods( self, diff --git a/tests/tools/test_milo.py b/tests/tools/test_milo.py index 2abc0e8a..db247d9a 100644 --- a/tests/tools/test_milo.py +++ b/tests/tools/test_milo.py @@ -267,11 +267,19 @@ def test_de_nhoods_shapes(de_nhoods_mdata, milo): min_n_cells_per_sample=2, min_count=1, ) - assert de.n_obs == mdata["milo"].n_vars - assert de.n_vars == mdata["rna"].n_vars - for k in ["logFC", "pvalue", "pval_corrected_across_genes", "pval_corrected_across_nhoods"]: - assert k in de.layers - assert de.obs["test_performed"].dtype == bool + expected = mdata["milo"].n_vars * mdata["rna"].n_vars + assert len(de) == expected + for c in [ + "nhood", + "variable", + "log_fc", + "p_value", + "adj_p_value", + "pval_corrected_across_nhoods", + "test_performed", + ]: + assert c in de.columns + assert de["test_performed"].dtype == bool def test_de_nhoods_fdr_bounds(de_nhoods_mdata, milo): @@ -288,15 +296,12 @@ def test_de_nhoods_fdr_bounds(de_nhoods_mdata, milo): min_n_cells_per_sample=2, min_count=1, ) - p = de.layers["pvalue"] - padj_g = de.layers["pval_corrected_across_genes"] - padj_n = de.layers["pval_corrected_across_nhoods"] - p_valid = p[~np.isnan(p)] - assert (p_valid >= 0).all() and (p_valid <= 1).all() - both = ~np.isnan(p) & ~np.isnan(padj_g) - assert np.all(p[both] <= padj_g[both] + 1e-12) - both_n = ~np.isnan(p) & ~np.isnan(padj_n) - assert np.all(p[both_n] <= padj_n[both_n] + 1e-12) + valid = de.dropna(subset=["p_value"]) + assert ((valid["p_value"] >= 0) & (valid["p_value"] <= 1)).all() + both_g = valid.dropna(subset=["adj_p_value"]) + assert (both_g["p_value"] <= both_g["adj_p_value"] + 1e-12).all() + both_n = valid.dropna(subset=["pval_corrected_across_nhoods"]) + assert (both_n["p_value"] <= both_n["pval_corrected_across_nhoods"] + 1e-12).all() def test_de_nhoods_planted_signal(de_nhoods_mdata, milo): @@ -314,9 +319,7 @@ def test_de_nhoods_planted_signal(de_nhoods_mdata, milo): min_count=1, ) g = mdata["rna"].uns["de_gene"] - gi = list(de.var_names).index(g) - lfc = de.layers["logFC"][:, gi] - lfc = lfc[~np.isnan(lfc)] + lfc = de.loc[de["variable"] == g, "log_fc"].dropna() assert np.median(lfc) > 0 @@ -333,7 +336,7 @@ def test_de_nhoods_statsmodels_runs(de_nhoods_mdata, milo): min_n_cells_per_sample=2, min_count=1, ) - assert de.obs["test_performed"].any() + assert de["test_performed"].any() def test_annotate_nhoods_missing_samples(annotate_nhoods_mdata, milo): From 61d319e890d88fdd99df40f5d3e84b1291c32e76 Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Wed, 27 May 2026 17:25:20 +0200 Subject: [PATCH 04/11] docs: add example previews for milo.de_nhoods plotting recipes Co-Authored-By: Claude Opus 4.7 (1M context) --- .../milo_de_nhoods_nhood_graph.png | Bin 0 -> 21671 bytes .../milo_de_nhoods_volcano.png | Bin 0 -> 37330 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/_static/docstring_previews/milo_de_nhoods_nhood_graph.png create mode 100644 docs/_static/docstring_previews/milo_de_nhoods_volcano.png diff --git a/docs/_static/docstring_previews/milo_de_nhoods_nhood_graph.png b/docs/_static/docstring_previews/milo_de_nhoods_nhood_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..514d031660a228a6ca0a3bdbf4b825b79dcc0230 GIT binary patch literal 21671 zcmZU*2{@GD+cy4`B!mj7tS$CXgpj3Fvae%bN+tWg?@K5`g|Y9AWvpS0U8p2v-^N%< zc4Ie#F?{#*d*A=}z3;!{D4Kbe`?=@7uj{ndcduuzFCq13?#}j3?)Em8T%Ipo-E5p3#e{F)5|+Bj zW$o_n>?SQD;_&|+A?)P(N`&X}pb@wVweu4rHwe1mPX2ph%8Jt)g7g@bAKusVPRC8s z`lr9lARJGt4cu`^%^Z+W9~7H=abN5H=9}zmRFguPPltye8JS(YR}xn#$VDl&7{tl2 zQlA|yC!)z$;;o>4f+0AHYKY2k?taKXwR&3S$9(m)8s+$u;}yUDC5?|#*il)6+I;4I zBf&%DJyt9wMgL&V%WQN#=}Ez$4Fv=#46AD3X~8HJZk>{Zpx|V#+7l4;^;9bz1aa}4 z0aF6qzV8eUd_x_|3XW1chXpTLhR%R#I>-3GPT6qo5g#?Y_Mw7`!~1FX=q@U$<#0}X z+ep}=8Edv{JyGL;$D>;&FN&Dk)6vnbjd~K+CgVw!(3h*VCt#NC5p=>gURVs~t5;Fd zUL3P2$goN>^GqRaCAD-Dy(v33<2Zx(z4gT?|5&cy&l>a&2ng_;^cWqFHs86HCh3%^ zo+A1UgTbsKL;{K?y=P-;0*Lr8<-gaD*49_;EQqNYfd@;T!!Uz!49c#wu5SF#A3=-# zDB0uvUi4)#tFaQJD(reR=iv+$c}NdG-A3}BTn=d)3}-R7R!tHXn&|E0tXU5_CQeSr zy?ZxSX4bIUa!hQ&xn&X4C*23tJx7dQjT^Ka!0eoydiT9y(Oa;tKRV2&HTEgAT6Nu- zvVPt2f(ebgrA{bWKl~UHR=j$+-Rt$t;P|jlk)dt_u~FkVDQ!~g{H!%g=H5Mf`Tb7K z)x>gtL;z{U0$sa5LnUvWb@-Rp47IU-e6&7EtRvwkaH#Tt(g1u_mPbp_iLa(t6gqe0 z5rdlYO`jGPmzQ08tL(=s)2D+DmI?+%g7&*6WqGswT@Sv5P&{ug&njP^3_2z)=`4x= z^<$s=G`hBJB)9Q}Vu@cj|5I98+Mvb3K+-^wo^6|K(BUlS;Hz|(2%>-Vc&$qwao;J3 zI5Ft5U2H-6*@VxFl@@5S8!fwTF-pvo@pANC9x4ivqkx8E5IRHOw(^jYn)0OTrr&f< z&Z^d>rKM%AyJOGe>WH3eSetd<(T0+|ymq1J4BzD<&tnpSYHAi9hm_+y+K9w~!#sLr zUj1V8+by)%BZHd*~fj7^IW1q{q(Ex^_2lt5sz|`s>Oj$e->?a{b#+X z`fT}!78{`~W1AhE>qlP(<%0+f(;ljkEnu*#t5v<8L1$JN420BeeU{SQez^qAM3`M1 zj=;0D?0v)U&Birw70SQ%^YfeJ+@gswKJW)8<95?&XpQL`_Wndq>X=(8qb^jh=J)My zXB}h1&xD7Nh=d7r^R5t~j$h4ISu|~}pJ-Zb{ekwoy1F`^v>r4a2(D501<_>vY{}zr zP9(@BWHn>m|5d9WGu)jyw^ye{gz2QF^wJHJDytacK__n(+W{&1DC~XTmjr7`>KI&qi90bQ zJ8JId(3(Y;{ZrkulYy_Gdn>POrMxAun;>`4A6H-AnMAM2iI(M&UsHaIF7JAYoe~Yh8pnC%xzQ4OHmF2YXD`SmFd-3LmFFS-}Xr&Vu z+KybK}A%q$+A1`S=#`)Ss4DDYL0kwrT5#tMOtLoe%)DHY zIP|ge#V=W#1BUmTMv#x(c}|(oM+#bXoTNJ zd99m!3Fu~}z^TI;v%05S{&I_?IJaQZ?nul}7v<=))tLu*%EWgsyk8M}W1LLL%9*Cn zEzqDltU7)AGUcowI0f!*^5 z_xA3s7&AX#-`Lk(tLlq$O!K4{9Pz~tZ_OL%-zHpRY;2EMQ6c$Ww7dUNuvWR*Q>3mr zb6+;yCu8Ol_iroft|WJqOYoIba5YU0=@pjt`k3`tI1v@Oz}oClvV4r z?QsrcwzSRI^mLY_zbv7ych}cks0G=IT>SJ5Va>l^m={|qWKzRMed60xoQC4hFb281 zzmKMm@aVESXa4GRsS2==BX zy{2X7IiSr)&J;ft97LE(^iI?rEEjk9YZ8-=NYlrYsJ6X{7ShC*-tpn#mkSwQnG^B_ zT7M^0KIyG{cgSFyD;WY76`u>3+PdWGGp6{7PT_0NbuGy7NB9ew7+X`9Z_L~+94La; zx+si&nm9$kl%l7kt&S}sFrN!aQK4Gg(?R?@43cK+*7e`H+)FP;#+m(v`3C6B|b$s7X168L(^o*x}tq9JwH|{_B3z zZmeryK1>ZxG|tA#*muOTd+yIA#f{%Bk4pAMPr7yq)%fn(`hf(z-nMM!H8}@oLMfFR zI-x9g#G1D=)@z{>)e|aB`}4h7>urBP#-ftMtEj$BB^uLA6D(+CM>D*pmJX=pHor0o zdoPm~3BS6`@uGyL&8&?1>cANaPG@!BVJ^d-eCChGD=kM|yF5cbigm7VP!wK>4=7>g zD|moo|J3J=FcrG(e^C4OAjvFnf37U?wejulRB=JlPlIOBfb}NAd_d`V(s!nwEO~iS zC`%((!1&7~1W5N5^8w}eF(Iee=MtR$CK`XhI=9m;4Hp|U+}5@A+WN!Na+eh282b5$ zw7=6k3g#rah97Ylxao8JEwlI%Y09V9Z)#RfEWq>Nto-I%%}<=Zi&qJaV5*6(a%)`{ zN3I76x*AdgvGXrQ{EQCD8rEobuRwZPuaBl*L@GhMkBDEZwU63pMXDzp8yqSvG)nw` z(^@zustGX~_|~y~`3quAaAiNgn$Wt{;FhJ8-st{9R&RmDC!DGT&SlWG0>9fdFJAt; ziemYk9~Mf8kr*h>%@26B?2*q!sLCRBXPg>7?3QfajPXD4vDVDiXhY(!L*uZEGK zpYUGb>T^yvoIEtd30FCh5c2@TE4N8KdhrqKUl{+ug{8FVLn{Lh!IwY$OB?p*({N;9 zX`(;U`WisU+QF}6z}mFtQJ%J%MD_IJe_>_W|38X$Mlu1EUHMWYDAuU&TX%|Bhq~ii zK{CRAV`gnKRX0Xomvbx7*u-SAd!aT0L^@>z3H?FfovZKeBh zHA7>fukU?KY^*WB{Q3DjcJ_aRgrVThZ&?o&;EIv-b(cLGJaLsDK76=tVc?x6<(A)* zAv0=hY`oVEamD&!FI@CHB{@?O5^`c?ZOwDIW^;!Ojce`jtK%c%<4bL95Z7az!iCLa zf_Vuk%N{CN*iJo_F)g}74K;;{q{(8Za z$jC@V`9NpqTLYsMkiu0xtk&pIfrBU~19YZ5#FI-QK$#~#{=gejpgyM8=%YVXD5#sS z#?SAso*^y%pHmWOwMLmRLt2t&#b+|a?ezbaQ$y#}6h~ZbvWrj48GtFb&cJA|m*0iaBpdnpHKb){TQ$n*x#-GE z;_FW+%!v>EF47Tj{PLS*>o(s_y=%mF*EzWN9Hez#4;$RxMj!KP>>i{RdjqEsd@wvV zX4v0x0-A}IcL{D!O-q|J7snaV9?EBbe{7X_^2-gI!gg7(0=(nAm)F<5()Pr}9*%5PhMl3o_M7g-i=)Y%N?hxT}&N|3}WS8Q__B%!amVf#G-!z33aXGLwA z7sx_NI+J<=r~!nR;@K}e1V%y4icDVq@|_p=etubiidxm>q?qv4j|f(mYE6P zv#PGHuAS2(nZlo(fD#{r>ma=mIz?Zy5+n$MJB0!lBk+C9v{5wf$S4m_&xo}a{WlMc z?Cgpgm>%yQ!D6nLoKV<(GV)u;rqSzT-ZlRM>em79teuSdmNOTpxQP8KITiT=Y&mq$ zt?@ICe71+KFY7oMJ@LHT4^CvuiF^MN*d1puCC4Z_l%kxaNg~QSSA|$m(U`EKi z@$OK8v;(HPujR^rF0)&!r{b*0mC97%I`=b_@w{HjpzM`K4hjEo>Zi}hpE|apgD%8o zU$<3lkap;X0k0G+MmJI24|AtS!D5iG>p^*U`rPQq$ozcHf!t|GE9lB4AId$0+Q*L{ zo4y|uzjyE6ym?H7PT^o-A(zkttKLi;{ex2uGsQ%Y6Oa}|VeQp(;Zw>IPPP4M^8-*6$MOSr_YQwYi2Gbs&WRl^Yk}J9lBmw2aPRD(^b!b!FD? z^v*7L3p6s*8eFDg;HUlAS^_qN|_nsnqfK|U`yAQ zEC3Y-yp4F>aB@29TJ6<&y+^vY26jSL&8@?E&KK5Sv}y~QR2Vg;R#0LJ2+WazdNBre++iL*l2OX%BMo z&6J5nnRB@nMeS#Oe{C}1ndaU38~LG;2PtgO#=94y&y?e$OkD3A1)V;JUA|KdJ{bO2 zV@0oU|_^Hv)^nO53Uu!=#8xjCCk6oSq~&FDumS@H;0zl4i3 zJAc=Ft_6Yh|D(FQi27{!K^1Q7^K~uju0Ca$?5l(VtzBb)?9E`BRCgd!bs zT4l11%H_oN+Vy7Q>WGOG%HsH7bYyZ8cf=+&m!P}4TwGqWAiM6PuY3wEo%i#7=){XI zdPn23VY>lQ+Zupl8)hV&rtYPQ+l{>b!eo_VAkT}O$)}l$pku}Uj`8<9sBxH>e^9A0 zBnqd6uEBR?($9Iiw=KvKqzDTg02|8rjZ|g6l<``t)(qT=_r%x~j5iUc>|SO1J=2!{1q<8z6@mE<6#rma{tWJ%eb6aCR7XYqH*hu~{ZKBG`V~84{!~0eUktKh1mX|Uw=(SMbWzbOujnC^RZpro zV{?rs&bVPd)$XM1(RI%KH~*L7o`f{yl`i85gyaMB1*u$3yDQ4GNWD&?S1?OdFQIIU?)v$@*4)zxHfafLDn2MWxuB}rc;CABHRjXeF2A8Ig*}Q*;6$*m z2Ve>7zL2TEx|hS955ASgGVqs})(ya>hMwGdB44@5bjTD@eX4NE*%p`cQVI5rX=F#N z`ew1p@C(Q8QM>+#!Bx@PE3*+k>KLkmylFxGl8U9l0xCzL+%IETtmy^^Oko#0I}u@R zk%jcXGWuwk9y*H5=h;)&IAc(*Q)Q;EthHVPX011nI58c&-+X0LAFS$F{=P!veATOu znKQG8Z-&2LwSj1CXq4(S{;GZVE?u1|RBh!|WUkUNb}PJ=|E0!#Nk>vD$1q5Ove8mZ zhxtrHeLc^+o}Ym|sa?q4^o`R{q6a|ZbuCkFy|Qap%0CugyP4RgeMyT_<7%EE*T4@x zSbAl<)>Z9ar|DFNQO{$gzLPu-SM(^0hmJqk?7Yo1$O^;v%-P<~U0+$SGm^HT{iue} z$&s?KW}U81eyIz2KNejY50?D# z?+^}FX5-}7NZVVxYSETh7(bl{OlVNKU+3XI2gLR3f+O|Ng7e8%x(ym9CC-5A32Zqs z9)5*+jH$2sRGJfKa_>^lJAdXPK9l&@Hig9z&4?{CSgsZ0QQBQr??>w=-WFs)RKg?scO@lXt02CDM&cX(bCD&i#KP>has95DqtMHs40zz~QTwUK zkOJ;$94j(bBM~W$Xc74IGBoulbtxr(FlE^$|JJ9z`KnhMOdFYiE!W~zd=xim$0t!B zZZgKL0XviD*n1K}aiysFW(d%^6_#MmVYS3Xbx#d(N%|RS^FH)YxGJ`+eB8cGt+o$m z7avv-Q&sh8lB-5*$oHayO!|KBKw3^0GP|-+6=bvl*=L9)nL0Ed91b z<9Y7BgP0dOuc{LJ_%u&~6=)LXvLj3txp!}6zlXCcfMOyp zJz=;A_Socv!sj4P-kVDln(tvNI_i%d7`|7=Byt!c%U#8p`z0lpJ804cYUf5NIZ2aY2XI(1yDgd?c5pF z10%Ve)M|Uj zR>?tT9DK2n&tS-Kq=XLRUVw#he;;d7`sbJ)(xkC}#v}1sO7Fd9vf^nrHK3SbwY-=x zZEIqKqHBAy-p}@G@LCK~xD%(KcTQ9n4w2!WT&E<5GIYWWm|E3ygchldgo8>TYvUu+bg#)MP=xr5^~LLvX^cKAWPjpoEhZq>!S z(@?TIcvA5UtX>yg#^R9PshAv{hI5qC;!VSu60il^XSZ%cL+KH(1Z@7Z&pb4*s-F;Y z+fZnY$vzDYi+tFzr~2dKgo-+rfv!EarhxPW1pv*$)y#~Jm{IR9BCD9$mWAL)u%U`K zhsK8V4=n^)&g6oBeEZrUNPUviYcnnrXqg_N|Co(}2#^{s9(#dTw0QrWcL`0Q>`Oi@ zi0c0yhIlCYTWU+-s6d7K-^DK6Oax?0wz2jN{b550-o)`S@D{n0~>y^f}xQ4wJ zupWY?Tgf!d8^kG`!vAwJhlX`w`TrV$6UEev0Pz{_|4hX{QYhH=5qUIUbwWM4z}bcR z0Nz2+W`h5`^MgKBLL`}pZ#dlQ!j)A0s@&gRFah+AU0L0Cff%yvtM$;rB8$w8O5C~g z!fvGGb7vdJzmdLu7{>jPLvfz5b)DU5yz=G9^z^!b1K6baZz6&HJQQS2`Kzu@R~E;! zlGmNoH1@;6cSU3nKGlq72Mf=-;uK z7w7_8OJB=5x)LV6CT3=`({j1u+9|Jx90T!QDx^;-?mq&1gwdC14WK~>|kf--JBAy zk>}i7#XA!)7Pndc-?e3^aw9%7lJSp4Ie7tt2V*3&Yzp_dSDaiQ98QDbD`aH<0Tc0u zUwiz6!G9*olE43b^+Uz5QIgC5xY#Ah8TErnPPhND@Csg#dIS*UOPu@fYm09oo3CtK z_|J{*ri0rC3;fqYXmcylBXpSk&pRv2oCC+`@ssD#8~6okoTlX_8obKMgr8_ib&+lX zCSA&{r1klX)V23dyki?xz8*d21S-Komy}F3K=B0y! z1DtO*!n>)gwSxm?CQr)21sy1>(y>?n9kQ~MT050S{OLAnVQ1V{#r|e3PKvzHD6OZB zFCpu3(=F40uKc;R&#~zHv)<|8HJ#Jsz4?_QQdrG`q`a5G_5gFuUS(Hlotw?nf)v;f z4AYy}iE~2eaeT`?hoXM%v?lMI41CS#MD)}qk6nsb7ZP?YWg|5rn>ZVb0H%|uRim_b z9T!FSzRr$#Otz?D*A4c`vpCm#c zVdVVq;3Dk%gmrdl=RU`lRa@dFuj6NA!j4q(OkIibzZl8XH#T;cKd$H1XaHesu^Hs| zcRPgfHL7))t=@JjdJKz5ZTDl>oxHBOhNPfwiQ~=QsdDCiK(T^}14f4l6vZZjr}1s3 zdd>bTuZg3Atcsx!3b?&vjg6rGIMyKjl~4zflkG{t|JzXv2=+`&>@2`+J=uI0EL zH;oQxY6v~Xx?`GMj=tennWIZ`e2_f>zutQ8Oq)Fwi!*kN7c7dg3nX-~frt`(67ZCE zfIHZcF{<~dLIfQItY8{l+Rzc`-LcH+!?t{3bF1hnmm(BfgY?EAhxdW9%n({^sC-n5 zaGG^_++LSO$dl^4zk^}RH);H8WyHfaPr026+085q)T46mq73}Hq~Z2qjaE7J(H~A( zu(GZTc_B-cp0bXl1d!w%ZYWuINmTpfIqZ!kN^ESbpOoMIVcx<$@HTFG_Nab$(_<=5 zeMvmdD%?Oles4)+wPT^_8~xg9mGXxt_jFxo{at_(5S&`DpO>m=tT#;7XJwc3MoZz z*ZzEqcKF>E?!&;gn8|-k7_~Z~>1XvRGQxg=a3t8*q>f|1Xe?@@zCAHH{cG9q+%kXa z*3SKjqZ!4KV_td@Jy809P07>^l-pMw9DXH2X7xkt#>s%WFa9cISn);QL%8yTye!*t z6_yw|jmbIs6G@rx>5g%alXV$4&f503OBe4Tk+!GnzY{mz@^5UPmh{OCY3MV(mE0Y3E7Cq$Op2oeBHl#%I{Sv5Ns1*m)sb#_!5(v zS9;((_OQyrx(!lO3oVQB??{j#6i!8W*_Z#AeIb5F#;|!k4l%Z_eW;@bEtHk?O?%OQRf^k5K zii$OMqr#Hzf$r`@0i{Jnox47Rf#?YMKxlODtjBtkp!__&_-g%ehlF&6Uz==<8^(T3 z@E2;oJRpqLukLVnm$RDjmu!2_^?<)7UU4a(ZuzMU2*n{W`ZueU7m78|QK~m4b7;$n z&&iol;rs;J$xGe4gO!5=uxd4RoiwzuyIHT_m+sc}66)opP~({C9nZAmddZ0|iY=8C zn)1KrKS-#hIS$5|IEZEWVLsqF!`XIo7wYUbsz!~cBYNOh*irIkE_t|s9nBDn=)hk{ zbW5jz5N`ZW-bG9ZS;OK}Xe~iY9&_Ql2bS=Ene2>f1|lf%FS;a9Zbd!bBUOqd=^LyC zW2-DJSTlrmip+%B+OFxooZn2SmyvX0vD?H$LE$|+JEO+JPg!wK|FetY!>AZ8(m7nl zY)c%j>MD}bYpTrchCj{DiB#$y6NceuD$b6(d{X1QK%4c>dB zt2bIUBv!&js-(*A7A(tc!<_u$n^s5C?AJQ$l7hvvc3v}>TNVV(TG=II^fpHg$_)X) z;nJjZ=*@g(<>xE4;9*46a_y(^FiMWAl;1q^+t*7|4oHp}MpbvdM0WiQc^F`|9h3WZ6TLD*5An`#W|L z){0?0_jbRH;E~%UbF~BXcl1;y+%()-csR*`?q`nMxY($m`SY6R#VPp$chtqxTKcTm zy&6%cE*rtty$PPQrD(P6=+S;0%HSzAU zSV>b;MlVaw=ME5CE>KKXzU(sP7Mi|)I-sevv}e+wRQG}<|E8ME`)n3f1gQA=ghG%} zaHES3j*gxN%^UfOXMtI!0*IerW`~iJKy;n&^Pu)4nxz zgxhW|kr_K9qvKIx<`3VzyNU;BQg~SD74jSrt1J`TTjV5jj;+Q!}+3bYTS4Q^S@x7*?2r>N!j?Qaqk)Lhx{7MtU8cSweQJI{ha-851l_I%rSjOOS6O&s7^jG)#epBqa7xS=k9%kVD z5Bb+S9QG&kYIggN4dA1%tw9+Ld8qO#c&%YCA8b-kQ0S{4O|#3NA&qr3Uq1RA&-1%Z zZ+SlPyUD+&y-KJ~tk+bBp=~RjOq>=w=-1918|u-MYYq?PrV;-nrHd)O_mKmBi#vx?#?IzdHc_<7NQ_GAPC3lYH06x;We}_t%%Ut)bbmi0{vCQR*>E7S z_t(On$ZmlSQ991%yfc40Ebh4TfOGGyxQLnKwgpj|W`;Bdl!Wz-x4 znx~oH`y&h4rz>(>_gTI7yci#t)P$u;7!uU8D%X00zN7xWX*-4OYYyC3}E~D zs9FjlBkdRQeBh^#nN*9}SU;V0}UE6C!WjWio za=%oMI-^3+U#oVgw2WtTPo4w*zZN0m>K{NC#{G@gteJ3XnfzDj6{=#&6Ya)DN_IFo zC1kw04p-`kL@>U*-oQFD_hU)i-ga-zi&$q&-<@w7wKL_b?DEI((z~Q^$}H7Hi7e{# z!(+*JY0CX3S60bR+fuWJk+o)`qs;D*F3#y_-f5L}dM^TYfn5H2DBZuYY?N0teO&*k z!%h>s5sMqC&X)Z+TD39W(eQI(DienvW0$XJGV!VnqY#r}!B9K-mZEN2)9&26Z-tIs z5R)!pT6zc&{F7Q)M|of$T;-MDe@kmaW9Rz)@~g4$F|0U6&V%=6&aIRmR#VQB{mX?i z$TN@X(v#LEpVgEWRP$;hmL*#%D1%6kqjgqtJ^g+Yr@$6@M$f9Z6a0XZ?6O3WeZs8M zck!e1xzWOvlEANt2i{$>136cvkqHzI*+&nX6VPC@YKm39ii4%)=jTV=<4JhEaH+VR zP-cR5Y(o$Ie9;<8DaDBg-qvwo0F{5H`4<>dRp7D#boN?;^zCPj?zVSQ7cR#* z_L}LD)zaZKV5z&EXdo@+@#Jq-MrsiL+|eX9IT&n25v44FbVSLVQKi8%mv5YYwP8KQT?Za zs*iRiABvLQs#L58e{tPI|H(>cfuXo@t#c0hUFYn@`;@58Mc`^1TTv;6etgB^d55WcPLI^)-bafx_+6BedZg%%*zVEr)Pq*lp!MfJ6Zm~J zE%c2KHs;)dE-j?H#WpR&$}3fc>%NNL7|~gAKu=l`ux@dazAL57bS32Ho75*e;a4NR zvLL_mjV&_FbMb1M{4#s4o0>mX#(7+^*rZ5BZ$xM{x0J#m+dn5 z9_(nEkF)BfpR98$099&G8v)3n&w&S{O3H1%HfA4H`}Hzn-G4#G6R3xnVFL>szJ~0V z7H%~2{v8g4T=D=0Y?OO$4s(88#=&JV%8A_JS8$PoMfV*vMg!{T#TU&d3)ELTy;??7 zWuzU5Xs4?Fd!$JwjKsbA_Qwp&PA9Peqj3&}<TXeoI4{CG;^=ywl90B^N{yQ8L-L>XS}v|a`MVcy`z19m^VPSp(hMZ1xp#w zNr7{CWFcJ!3pBlg3ghYs<>pS?zXD5fN5j3PgelIkqg_pY?jonx;x#>Jx|U@cCXA@( z;Q;~v0~3VOl?#Mr6Pa&Chu7Hq%3qn*D~_bK1)d5hxLq|D+02~l3?EOhP^&EJoX^}8 z@akM_4TGnPev_E?Yr!4=@@tacE@;_gH#uBGW19OvT<@x}waZ0j3q+k71(E5slW_Q5k0P`&umQ*d z|DR)Ts&%L2>XI`1(?XO~9x5Wru8spw&|61M7>w0c6_Ar{Xity^msQ%R~mTh z9j_zt5`Y!y?kk(*Mns<9rQ^>YqaNovO+_`!h%FJtDIlp^g{Z<&z?aNI>M4IdQeSN( zuHgqL$N200hM4ci4;6pQ*W?+_cgqe?R9^*!kLjVi4Lo#o&87as&uQUBh6|1_BdI&`IRLKs?`~%z=g8!%w6`sBB$(P zwt4k8-1mfq2Qs&n?0$c}iBq5-e5=hKCLAuUS?qHig7&**ZBRmT3u@~Og(L?jXWT;? zWgKgDGfGkea4<3M4%N-YW$6B?=Gztqn^zqN8JFo=aktn--&iVI75!#_w20+u1?m57`j^0HFbV!h9cpa1dT~+c> zH_cxN9?$!mxZ^L^NJ$)+NHkU;sF6S2!`;31@w&8H(tednjz&;mkyf9Wm?>vJ|5Z){ z@$2OS95{uWM~0&^YAs7$!wrvzC3n63K$pwpSv?49>syY|chNi3hv5Fz{VB|+pykGp zTSS1V_!Bo|bu-z5cqMA*2miMpKb~X<0FUI}@?PO_3+=HV3=Ob) z0#hwPEe*M66a^lMnAKO8xM7&4010Yd0~~roPSGE@otpYqZnFoGuGpE6Il3g~vp?A# zG_DyTpmy$pKl6U%UZ$EF2?J?i&r4j}_h^C+{9u@B&1?kX8=yHIL6!8b0ZUX?Aa&;;(oVa$c!4K}~)zSOvW-`$B{H4}-q2`e(^EPVh$+7al)BvbpY>3xZb zz+TPL_15XJA2ZqFYFSoQSp>EfZ(NJ(;ha8|%+oQgulfsg|g z^@%_K{_bO@(r{}*rteQu6Wr57n$I!sF$4_@jt{+H5ArB$u!Ui&z9}89INYXoq*1k% zUQ|7yIxH@ff|S;`weHe_X%LrkvD^8oeyac=JfNfpjMhMAJfrPX#2tRBxu zx9&#Q@Fg_Uob^&pw$U%e^FW=MvOJF+TFXmVPDXlYM_vuTA5#^TYQ7%JE^{r&9D;1s z>**&#zFw z04mzl1VmGLZS*5&!8xvA4O{s0cZo;`WWCM611XI#&>AALwE&9n&5O}9`9Jl?ZtKw) zB5KwyX%@)CTo}V2s2gjEO|E9TAS{bOz27$AQQIMO5vOqHib~Tj|0D*~yP{x(Cs%#$ zU1}r+bu^1eW(8aEO#b&q>C4DWH^kA+)UA_{mLW!6@yrqbu!3W>(l>SBjcgP!M!p6H z$NClnl!lm^YR-agJQg@I|C;#@_iBGhm-VYjM6&VfgSx))TkaotQ9b{iqF$rVy16vo zv#%0uJM|nMh3eyWw)O7oUK*UXs}r|oR#R;NMC{o~KMi@^UZ7!Ysrm^ARq7c(qp?(C z_efaj%Ku(JtMqhb9KN^AaX^rdk?y%Ra(IA>+Srb>=B1XxR6<%&jFKl%(+Lvp4U;X<6#6 z>c@LI@9Zpn269YA!mH>wV{57l4Kr}{`$B5P=hzMVGNmX#sa5E3z1vaS1t&pNKEE=fkL*4|xoQ^<4LE|zyVd4QN*IIjpOs9}3Si zs~6O+@~$3;jB#Tf{7((f9JR?@~K%%BS6u zs#5VlDu#^(?CkC`vwMJHXm#;$*WxA{2tU43aDICX0|M2-2Wc$**M+DC049tN&MIC< zf}1Z7e`3=(qwBzkqUqlW;ZxH6r)2rmP;`oY;nRNt2mt7I|6QZ!+4LOu7D;z|c0OT% z)b!PB+E{4SB`sklzh6^2dnWpEBiL3AB54LP=c0q0(-IH^BP03-9^2x8f2eHa094oA zWN=7xZoN6T3#TxE-AJIkUUXu;e0G6ho=X889TG zcYc1pQE|RNGiy!2fyM`nXZ*3QjThydn-eN^Xa-LG3N&qcG))3tWZ|INh972OPzZ!m zg~U_nv+VkPANj!Ved7!Kak_|l`86aDAW@*bOX~7&`&dpdH4SjR{}K@41DS*8Y_rMs zTJS8w%g8@9LC1k!Km@CgFP1)c8*~{;QZR!7ck$sAY~wJ|pqrqBtUG~7oxDLRH9^anf=lRxE5rpL(q=UGn@iL^H09^tb+58Dw3tIv4=czM}@qE!<}@@1I{ z#nd>Y5!G)2Lttey8P?TnV?u^v0jJ;-Uh@t(FDIs&{JOSM!EjZy<5dx1VPR|M9vG6X zlp`Y}Pb@%b{YL+%ThY+Mlr1ct&fDW$4iim4IQ|=WTD6E5LTe7JmoD+``?wo|7xeaj zzt-D`HbTIxy}j>#v`Eg$$;l-Y3KT3)0r#}2Q|$}UCExZQ(5!&E)Gto~1#ev{ZEvR* zM|Y^>WOK8*^!X}wcXrgqlnOc)6<#-&F(Pe+a#eePn*dUQxpC(dB2D-6`S}uxdY*i4 zXP|MB&Z&Rd1yAMc0r9Cc0IPGNT;@c}GP{t{fcb?Ru_H;ZCvvE>?ux3EU-wuEiMuIr{BiDLcoaY5+NUIERyqb-FWT zyxK-RSI4xSsl~IVrpyWcb!}XL)P5Off>}9IF$VBPX0cf&c{Va({U8u(?kzw^1TIR07<`Mr*OM#dU6Nf3xqVqx?yeTPRsE_u zPNMp=Jd4BDM7>Ax#7@hL&X4J{MNIGYOALS0GoD)Nga<(PLp0-t1M5~t^#p{_WbrrI z^#6+JrSE~8?+dw)N}>1o$Mv`|(AsJ5aUNUEHaX)12cB^7#@rJ}UmgaMd=5rrii|S|c&IR@O|xE8SJ?~*FMEJmsE8J6_O7&e?2#b= zqZH~6_J%FF%4#Im=)mt*W$B(MONhUUkON^utt30f*Hmt}&K3sa=EB*~4)O{Shw|Zf znEzH&39Fr9v+x*veF{a@FIq4kH$UNJpqB3nTpY_CpzqBAY!W4XM$Vu^7vc!IdG6>4 z>(=XW`Fc&O!_%i+JI|T-?yQ>mO}bZHMK;@{%<#}e9Lxl?BQVi@{(zUYj>#VY5UFKA zxbE)-w3FOytjwBolDmh;IB4OVWyKB&=P}Xf(b#KCH1yEh&{!;oHa=^Q_@Y`N&DK9P z#WB7Dc7u^B;_5*y?4zh+&zeiLB||cR3O0u}ILLUTwg|xf_ymZl*R)~G zXdO*6GP=pbZo2N84N~idOOkHl^1vJh);!2u8x54eMMmd_p8 zoUnB-eMW4w+88#;fwsKPyVWUY%Q|dlV`mq=x)0)vE%FZ!jp`LCm@Pw%&XQIL5}?a$ z=@?(K$-%|IqgB1yNli8XiUGo^KK?wWS`7efqydsXNu^k{_N}oE*p8#>0$R~=g@p1s z8T$(F%|9O(K7x%h1aoGDP2Ta~65D9P0^ruR1w!=g+gHLmsl@~C=Jbsfsodv#N+cw+KEVCBqmH-C&e4`2o zoyvJ?8ig7(hSJZLRof@UFPW>BE^p?4)?4lc|Im2UeK#V>c8uWG$+uroNBo z${7oLzIz~wCh4&YCw~9q9C|Xj&4ioh7MO{D$BGunp?XWl3SmmI0c(iFLLfImH$P6Mi*{;zzAksx z0tIvQpls46QHHb|s^)V>0{&r2_$eSoGK zzidBP0I&=yjax7V@2MhmB$i#4j%u&hp5T)a3OnfIs5RbWxd}Z4y(`d9l@s>8nX)+? zVy}LsS2hVln@LEJKY-$ukf;$GQItu?z>qYz3n`@k$4zx76>tBA^*9vtnkl3la}SO! z`l9yrC-XHjjB7?uWlOxvACUMXE_L;&6MWAAG)GEO6Sb*&)r%Uw5r3k< zTim)%HQnYC;li--N*jUD-cB8M6|EVHU`yuee(B;`z{)4wYgWm*NxT&Tmtr2#v(bG& z$X5)kb)&)POEE3R6;DsJ2teT&C%V@sK?{71DolM6_G3@UCUS6{I&Q6Sv0dvy z@xUMcy1I-lSD=%uF9FP_(G7P1-BphiC-#VOatGFgUK(2(=R2TbEeK4P_hr!Plqkw+ zER9=Q`V4F}wKMt4z}^RGMd`6?Xn^iyz7=f0f81aQCC+c~M8v~ut>q`7Q$QT#=?tNu zvIh-UN?=buw%M=1u=aA?^S)KN0Q_3f02ht|O0qlT6g2fXB^}DXpc(_9gnO$)BgmU} zHa0G}TRWq+Ozuu;y$d-I8l;;iSuBw4d3NCt8l79Zv@xbRLeGJRC*$i-QJ3wfW_#^H zzhPwO;acENxHTN5Q5*lcU+-WT6cM7D$CBCmVu}kFIxh zV>k;Wu3-cXa9!O{ZX!6Fo((9`r-(_9q#b|`$grE7C}^NRTu?$mId{e}We_>r@iL}G zNj<;~S2eg*6>0%m=44Pb5b8}7s}_&#|Ec5LJhO&pz4b6L5qvV%ww z!tCOHIZm!)E+xvPX6~mr)Xb%56^p5OZ8d7jtvdYwNp zd)fT<{e8dR&*$@wNq5|15IU9iB&xKkaFTTvZj0k-Q^FAHgFSpd9BDX|rA$WN%{X4? zmtF7Bitnn}=;pdxb9Nh1ENB1LUjfSr(UIOw2*#06Yy)SfJsLj21SU_ri0wNrtoHIw zP5pVJlE4%s+WT_c_N{M8mKy{cXJ+%iJbv=zJxL9r4P`QdPeGH?7)!uL_RFyEeS@b4 zWcEYQ9lk;9d?vH+X6rRv-`vnbm?+|U_o+)ZpduemVAq(M^158F#FLFjAvI{%#KgVZ z1C8RKmKk}h_g?g+s2l`)u&5Vvecw~ISI)_tpwY+^^Qs_2C3GW=>cY3`##5`oOe6sL z(qZF2&P4KHwpWhZ$6q*js$2VVmNZym%>!Zlmx75lmdV|LU?w*%@ngs8}ZI=3K9$=3TNcQKHeMgNo#u!^tsC%gYEG~ z!|thVO%R+vcuyo=VGg@?MH%NgOKn%f_#Hg2VujGnozWP$ZIYokY(K>-_pVDoggsNF zUOiv-iD4b-A{Y7HStg14B4Z_`6mg!OkN()i`6?yFytqJ*WgLDpXX;V5n#W3^q+&sDk58W%wGIfpyKUh~ztl~0ixaw~hKcT- zy+?*NKhSWe`bzsBa)}4LZSt(^)p#?7i)&s1(TyBV&-~B4PKS@H5=?9%Fykp}NX9GQ zUDAnckX<55zY1Uu-eztTs9une*#kT5VdI)WnjR`;r%fBhi8P^j06G|*& zbwBYrv8HZ*AKlYpk;vhqFJ-+ul->IBtgiUyLytGhBrV;*C7zs6-{C7wfLf0kTSmjS z2`(chraLVjKS_$f({{zXM5nGNbX$6NJT;WRUqspjmUilzd5J-+v&=nF4cbk3__nIF z(y2hD4|qszX8b#%D#tUkb(&B0(?lYxTTdCaf+^39mxf%Bqba~IW{|`4Yn7a?mou!s zJ9!Tvyi}?VM6W^U_M(~E43YAO0@a*DQ@xPU(1Wf{)DRNO)e>O=ShPZ+bTCGGuV$GF zT}%|%rS2oV>usvXJJC=~zb)3vi0V_Xh}>!Vtf!R@j>?OHHY#n(U;2!T6Z1?n2y5sm zS-s0R?|4M=)6v&s5|EI7Frwmv3Cgb|bmMFAM-X%}XbTs|V!Lngl~aMCp``~kI^dTb^z~Egv81^V_0>}zlDQqcP5wiUW#l`sm0Z|7g)U{|?NFhr@208o zjN6#wm~ZtgXcZ%i?-XYOuEID_3Qc%ERxxKYPR3`5nfIO}dx6T|B4pEWm*20=KR*V(!y)xTSOx1f{4496`Id@LzZ*QOB5Z$~{ zJB|roD|e09s&10;5QNfxZ$>NdF%XbR5hrKSUU|kLBu~tn5cok+7^|)VSfEo|_g{bh zR7P(XOL`VMlifABWzq2e(L*}}YrP5CCxA&Y50CwQ%dz%uM#Fng%GIc`TTOcM93k7TIl5#_sg{u^o8s%)nRu>ZnyUN{x=O|zO8_G5K- zdk1s4mRw|C+pcleK&#u9(tNuunfDNu1MAOXE~^AQiaS|BcK z+)nU9MV0c+j=}C=CA7Bm5)%?W%-VhP0OQQqc1XzSdub~T?w~Krtj@((!W?-&VuIKZ zAoL|f=pW)h;*eq-@$I&8C*FSZT~|ge=g-c~b*~#po=9m`la(MT5~p~@9*|`p5D^S} zA${~#ePGl2XWF0FMq{K>|BBHFGuW7Vpm%@#KZ!vbpvwY>I8G0F2r-dty?HYbYrdMV}a{8Fcd>bidI!444#QfLGz@0G#w+3gnd7b?3}4o7K3mwOlqbOBh(hs5VI_ z+NLW<(9alt8m@o8ml0i+F}jU6I2I@R2hH%y8m}{I?Ome2w#p@(d5;-%8UK+Uv;f?) z(biR-FC43x7IZd4!ta-I&1{2DUE%+-!*o+5agl&Nft7z(*)XH#{3MLh*#pk&Xc4{t z!8*enqXCLq=`L(2&SD?`uoUF$?aHMvWpZtqs`Sio*vPfXArS#f>!bZ4H+P_=x)mtp z7d*_uCP$bBB4k8 zE1kWRZjVhyV!$!@!$!T=@B~S)gicS$mpfPl_G4OfYaywE{9BV&G-&&5$2;(=+zOX^ z?Y`b4*el55OT~MEGd4}U+k2gexBK? z1ngByeMzX-2l?eTlE*NO=$cOqzu~t719Iy}IUyL3sTouZedea;CIzAY1e)D914!}( zg>&b-RM@tTUE|_+8D>{HXeyxgnFNam#|fh7zjDp%OJqG)o=o>ul`v;gfjb>~4M zjiDxuhro9NcilpZZz;u)_WKbOwWIJm!vf@6z@>!U=}*qhkEU$+tFT<9UI#*z^#N)p zk?VN+eAg`$+NCZH^y*WqbtwabN&vNi^8uOl^0KlnMN`zt+yx#=4O5TyVxSUOw z!x}czJ9BrV01zZznwpup&Ze}rnLgHF7uP{>J4LFjn{bRR+bqL61S3sk?Nwv5r&~}E zq6Kyy*!H$1Wb^@K#32|3ONV1>R+YI>qjfOt%$%=Zsc9{0O+2H1v63oC_Xab-ci#mc zm7@pOw$*?D)Zo%t9n0k&tY&^=c*HPK8rmX*ILS=)we#T#1-#D>kfr=&r##lOc`Z?G zVq5PlKG?Y-R8vtzIcm0K(C@JqEYU@0-LA&-b84k9h10y4OIuc?mH$Z5^D>YZhv1h+K!&on) z1HtHoLblOH;6HtAS7 zYHF&*tJkaJ5|~!ovj+FZjU+NinHr9Je0RAV%eeO*ri}ChGc`*d=7sfST6Pt)vD5xe zO1T;lGETKSgbrwqY4jyI2wNJQvpdLvHv2a;CAE%l=E1q~>{3{ZO~XzzH&Xkv3g~EX zWGX&hCeR7F4Ssz3t!=nyqYO|VI7|Wd>%@EKK(GivoQ{J+MAwDrn>(~90^LEm!@eB^ zbvXFQuQ>l8T(rs<@jDjU?O?gLWcIYl%JQYGjdwvlQ9&ET)&h|VFugl>S{9ST3-s79 zPoyTt?jZP_T^|4etq+YLIAR56_$+;zlLd z47EszjI(gd>CjhrL&Rg`DUyYVNco7aq2beJahgkE7_~*Ql$PxM9-{SiGnx-o< z?Lu&%ITQ(XMYF*ofDL#I;Z=|*_yU5Q;0t`jRc86B{UK2RBq;; zp3=|u$)VWXyg7OB+@lXlO4>Js!p76O@wMk}%C)Y%{2?H;NXT3TKmG?iCXf&Qk*KMm cv~{C5$n$pa=d_F9FNK(&vp!pS<~Q2E0i@rYXaE2J literal 0 HcmV?d00001 diff --git a/docs/_static/docstring_previews/milo_de_nhoods_volcano.png b/docs/_static/docstring_previews/milo_de_nhoods_volcano.png new file mode 100644 index 0000000000000000000000000000000000000000..0ebe52188809c303177dc41818cc8b651963ff27 GIT binary patch literal 37330 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 vMqZ&Q)$nxAAbSS Date: Wed, 27 May 2026 17:39:25 +0200 Subject: [PATCH 05/11] milo: add plot_de_nhood_graph for one-line per-gene DE visualization Pairs with de_nhoods the same way plot_nhood_graph pairs with da_nhoods: takes the long DataFrame + a gene name and renders the nhood graph colored by that gene's logFC, masking nhoods above the spatial-FDR threshold. The rendering body shared with plot_nhood_graph is factored into a private _render_nhood_graph helper to avoid duplication. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../milo_de_nhoods_nhood_graph.png | Bin 21671 -> 24059 bytes pertpy/tools/_milo.py | 125 +++++++++++++++++- tests/tools/test_milo.py | 25 ++++ 3 files changed, 144 insertions(+), 6 deletions(-) diff --git a/docs/_static/docstring_previews/milo_de_nhoods_nhood_graph.png b/docs/_static/docstring_previews/milo_de_nhoods_nhood_graph.png index 514d031660a228a6ca0a3bdbf4b825b79dcc0230..e5790a1ca51d1aac89bb97c60150a35ab6f8bc2a 100644 GIT binary patch literal 24059 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 literal 21671 zcmZU*2{@GD+cy4`B!mj7tS$CXgpj3Fvae%bN+tWg?@K5`g|Y9AWvpS0U8p2v-^N%< zc4Ie#F?{#*d*A=}z3;!{D4Kbe`?=@7uj{ndcduuzFCq13?#}j3?)Em8T%Ipo-E5p3#e{F)5|+Bj zW$o_n>?SQD;_&|+A?)P(N`&X}pb@wVweu4rHwe1mPX2ph%8Jt)g7g@bAKusVPRC8s z`lr9lARJGt4cu`^%^Z+W9~7H=abN5H=9}zmRFguPPltye8JS(YR}xn#$VDl&7{tl2 zQlA|yC!)z$;;o>4f+0AHYKY2k?taKXwR&3S$9(m)8s+$u;}yUDC5?|#*il)6+I;4I zBf&%DJyt9wMgL&V%WQN#=}Ez$4Fv=#46AD3X~8HJZk>{Zpx|V#+7l4;^;9bz1aa}4 z0aF6qzV8eUd_x_|3XW1chXpTLhR%R#I>-3GPT6qo5g#?Y_Mw7`!~1FX=q@U$<#0}X z+ep}=8Edv{JyGL;$D>;&FN&Dk)6vnbjd~K+CgVw!(3h*VCt#NC5p=>gURVs~t5;Fd zUL3P2$goN>^GqRaCAD-Dy(v33<2Zx(z4gT?|5&cy&l>a&2ng_;^cWqFHs86HCh3%^ zo+A1UgTbsKL;{K?y=P-;0*Lr8<-gaD*49_;EQqNYfd@;T!!Uz!49c#wu5SF#A3=-# zDB0uvUi4)#tFaQJD(reR=iv+$c}NdG-A3}BTn=d)3}-R7R!tHXn&|E0tXU5_CQeSr zy?ZxSX4bIUa!hQ&xn&X4C*23tJx7dQjT^Ka!0eoydiT9y(Oa;tKRV2&HTEgAT6Nu- zvVPt2f(ebgrA{bWKl~UHR=j$+-Rt$t;P|jlk)dt_u~FkVDQ!~g{H!%g=H5Mf`Tb7K z)x>gtL;z{U0$sa5LnUvWb@-Rp47IU-e6&7EtRvwkaH#Tt(g1u_mPbp_iLa(t6gqe0 z5rdlYO`jGPmzQ08tL(=s)2D+DmI?+%g7&*6WqGswT@Sv5P&{ug&njP^3_2z)=`4x= z^<$s=G`hBJB)9Q}Vu@cj|5I98+Mvb3K+-^wo^6|K(BUlS;Hz|(2%>-Vc&$qwao;J3 zI5Ft5U2H-6*@VxFl@@5S8!fwTF-pvo@pANC9x4ivqkx8E5IRHOw(^jYn)0OTrr&f< z&Z^d>rKM%AyJOGe>WH3eSetd<(T0+|ymq1J4BzD<&tnpSYHAi9hm_+y+K9w~!#sLr zUj1V8+by)%BZHd*~fj7^IW1q{q(Ex^_2lt5sz|`s>Oj$e->?a{b#+X z`fT}!78{`~W1AhE>qlP(<%0+f(;ljkEnu*#t5v<8L1$JN420BeeU{SQez^qAM3`M1 zj=;0D?0v)U&Birw70SQ%^YfeJ+@gswKJW)8<95?&XpQL`_Wndq>X=(8qb^jh=J)My zXB}h1&xD7Nh=d7r^R5t~j$h4ISu|~}pJ-Zb{ekwoy1F`^v>r4a2(D501<_>vY{}zr zP9(@BWHn>m|5d9WGu)jyw^ye{gz2QF^wJHJDytacK__n(+W{&1DC~XTmjr7`>KI&qi90bQ zJ8JId(3(Y;{ZrkulYy_Gdn>POrMxAun;>`4A6H-AnMAM2iI(M&UsHaIF7JAYoe~Yh8pnC%xzQ4OHmF2YXD`SmFd-3LmFFS-}Xr&Vu z+KybK}A%q$+A1`S=#`)Ss4DDYL0kwrT5#tMOtLoe%)DHY zIP|ge#V=W#1BUmTMv#x(c}|(oM+#bXoTNJ zd99m!3Fu~}z^TI;v%05S{&I_?IJaQZ?nul}7v<=))tLu*%EWgsyk8M}W1LLL%9*Cn zEzqDltU7)AGUcowI0f!*^5 z_xA3s7&AX#-`Lk(tLlq$O!K4{9Pz~tZ_OL%-zHpRY;2EMQ6c$Ww7dUNuvWR*Q>3mr zb6+;yCu8Ol_iroft|WJqOYoIba5YU0=@pjt`k3`tI1v@Oz}oClvV4r z?QsrcwzSRI^mLY_zbv7ych}cks0G=IT>SJ5Va>l^m={|qWKzRMed60xoQC4hFb281 zzmKMm@aVESXa4GRsS2==BX zy{2X7IiSr)&J;ft97LE(^iI?rEEjk9YZ8-=NYlrYsJ6X{7ShC*-tpn#mkSwQnG^B_ zT7M^0KIyG{cgSFyD;WY76`u>3+PdWGGp6{7PT_0NbuGy7NB9ew7+X`9Z_L~+94La; zx+si&nm9$kl%l7kt&S}sFrN!aQK4Gg(?R?@43cK+*7e`H+)FP;#+m(v`3C6B|b$s7X168L(^o*x}tq9JwH|{_B3z zZmeryK1>ZxG|tA#*muOTd+yIA#f{%Bk4pAMPr7yq)%fn(`hf(z-nMM!H8}@oLMfFR zI-x9g#G1D=)@z{>)e|aB`}4h7>urBP#-ftMtEj$BB^uLA6D(+CM>D*pmJX=pHor0o zdoPm~3BS6`@uGyL&8&?1>cANaPG@!BVJ^d-eCChGD=kM|yF5cbigm7VP!wK>4=7>g zD|moo|J3J=FcrG(e^C4OAjvFnf37U?wejulRB=JlPlIOBfb}NAd_d`V(s!nwEO~iS zC`%((!1&7~1W5N5^8w}eF(Iee=MtR$CK`XhI=9m;4Hp|U+}5@A+WN!Na+eh282b5$ zw7=6k3g#rah97Ylxao8JEwlI%Y09V9Z)#RfEWq>Nto-I%%}<=Zi&qJaV5*6(a%)`{ zN3I76x*AdgvGXrQ{EQCD8rEobuRwZPuaBl*L@GhMkBDEZwU63pMXDzp8yqSvG)nw` z(^@zustGX~_|~y~`3quAaAiNgn$Wt{;FhJ8-st{9R&RmDC!DGT&SlWG0>9fdFJAt; ziemYk9~Mf8kr*h>%@26B?2*q!sLCRBXPg>7?3QfajPXD4vDVDiXhY(!L*uZEGK zpYUGb>T^yvoIEtd30FCh5c2@TE4N8KdhrqKUl{+ug{8FVLn{Lh!IwY$OB?p*({N;9 zX`(;U`WisU+QF}6z}mFtQJ%J%MD_IJe_>_W|38X$Mlu1EUHMWYDAuU&TX%|Bhq~ii zK{CRAV`gnKRX0Xomvbx7*u-SAd!aT0L^@>z3H?FfovZKeBh zHA7>fukU?KY^*WB{Q3DjcJ_aRgrVThZ&?o&;EIv-b(cLGJaLsDK76=tVc?x6<(A)* zAv0=hY`oVEamD&!FI@CHB{@?O5^`c?ZOwDIW^;!Ojce`jtK%c%<4bL95Z7az!iCLa zf_Vuk%N{CN*iJo_F)g}74K;;{q{(8Za z$jC@V`9NpqTLYsMkiu0xtk&pIfrBU~19YZ5#FI-QK$#~#{=gejpgyM8=%YVXD5#sS z#?SAso*^y%pHmWOwMLmRLt2t&#b+|a?ezbaQ$y#}6h~ZbvWrj48GtFb&cJA|m*0iaBpdnpHKb){TQ$n*x#-GE z;_FW+%!v>EF47Tj{PLS*>o(s_y=%mF*EzWN9Hez#4;$RxMj!KP>>i{RdjqEsd@wvV zX4v0x0-A}IcL{D!O-q|J7snaV9?EBbe{7X_^2-gI!gg7(0=(nAm)F<5()Pr}9*%5PhMl3o_M7g-i=)Y%N?hxT}&N|3}WS8Q__B%!amVf#G-!z33aXGLwA z7sx_NI+J<=r~!nR;@K}e1V%y4icDVq@|_p=etubiidxm>q?qv4j|f(mYE6P zv#PGHuAS2(nZlo(fD#{r>ma=mIz?Zy5+n$MJB0!lBk+C9v{5wf$S4m_&xo}a{WlMc z?Cgpgm>%yQ!D6nLoKV<(GV)u;rqSzT-ZlRM>em79teuSdmNOTpxQP8KITiT=Y&mq$ zt?@ICe71+KFY7oMJ@LHT4^CvuiF^MN*d1puCC4Z_l%kxaNg~QSSA|$m(U`EKi z@$OK8v;(HPujR^rF0)&!r{b*0mC97%I`=b_@w{HjpzM`K4hjEo>Zi}hpE|apgD%8o zU$<3lkap;X0k0G+MmJI24|AtS!D5iG>p^*U`rPQq$ozcHf!t|GE9lB4AId$0+Q*L{ zo4y|uzjyE6ym?H7PT^o-A(zkttKLi;{ex2uGsQ%Y6Oa}|VeQp(;Zw>IPPP4M^8-*6$MOSr_YQwYi2Gbs&WRl^Yk}J9lBmw2aPRD(^b!b!FD? z^v*7L3p6s*8eFDg;HUlAS^_qN|_nsnqfK|U`yAQ zEC3Y-yp4F>aB@29TJ6<&y+^vY26jSL&8@?E&KK5Sv}y~QR2Vg;R#0LJ2+WazdNBre++iL*l2OX%BMo z&6J5nnRB@nMeS#Oe{C}1ndaU38~LG;2PtgO#=94y&y?e$OkD3A1)V;JUA|KdJ{bO2 zV@0oU|_^Hv)^nO53Uu!=#8xjCCk6oSq~&FDumS@H;0zl4i3 zJAc=Ft_6Yh|D(FQi27{!K^1Q7^K~uju0Ca$?5l(VtzBb)?9E`BRCgd!bs zT4l11%H_oN+Vy7Q>WGOG%HsH7bYyZ8cf=+&m!P}4TwGqWAiM6PuY3wEo%i#7=){XI zdPn23VY>lQ+Zupl8)hV&rtYPQ+l{>b!eo_VAkT}O$)}l$pku}Uj`8<9sBxH>e^9A0 zBnqd6uEBR?($9Iiw=KvKqzDTg02|8rjZ|g6l<``t)(qT=_r%x~j5iUc>|SO1J=2!{1q<8z6@mE<6#rma{tWJ%eb6aCR7XYqH*hu~{ZKBG`V~84{!~0eUktKh1mX|Uw=(SMbWzbOujnC^RZpro zV{?rs&bVPd)$XM1(RI%KH~*L7o`f{yl`i85gyaMB1*u$3yDQ4GNWD&?S1?OdFQIIU?)v$@*4)zxHfafLDn2MWxuB}rc;CABHRjXeF2A8Ig*}Q*;6$*m z2Ve>7zL2TEx|hS955ASgGVqs})(ya>hMwGdB44@5bjTD@eX4NE*%p`cQVI5rX=F#N z`ew1p@C(Q8QM>+#!Bx@PE3*+k>KLkmylFxGl8U9l0xCzL+%IETtmy^^Oko#0I}u@R zk%jcXGWuwk9y*H5=h;)&IAc(*Q)Q;EthHVPX011nI58c&-+X0LAFS$F{=P!veATOu znKQG8Z-&2LwSj1CXq4(S{;GZVE?u1|RBh!|WUkUNb}PJ=|E0!#Nk>vD$1q5Ove8mZ zhxtrHeLc^+o}Ym|sa?q4^o`R{q6a|ZbuCkFy|Qap%0CugyP4RgeMyT_<7%EE*T4@x zSbAl<)>Z9ar|DFNQO{$gzLPu-SM(^0hmJqk?7Yo1$O^;v%-P<~U0+$SGm^HT{iue} z$&s?KW}U81eyIz2KNejY50?D# z?+^}FX5-}7NZVVxYSETh7(bl{OlVNKU+3XI2gLR3f+O|Ng7e8%x(ym9CC-5A32Zqs z9)5*+jH$2sRGJfKa_>^lJAdXPK9l&@Hig9z&4?{CSgsZ0QQBQr??>w=-WFs)RKg?scO@lXt02CDM&cX(bCD&i#KP>has95DqtMHs40zz~QTwUK zkOJ;$94j(bBM~W$Xc74IGBoulbtxr(FlE^$|JJ9z`KnhMOdFYiE!W~zd=xim$0t!B zZZgKL0XviD*n1K}aiysFW(d%^6_#MmVYS3Xbx#d(N%|RS^FH)YxGJ`+eB8cGt+o$m z7avv-Q&sh8lB-5*$oHayO!|KBKw3^0GP|-+6=bvl*=L9)nL0Ed91b z<9Y7BgP0dOuc{LJ_%u&~6=)LXvLj3txp!}6zlXCcfMOyp zJz=;A_Socv!sj4P-kVDln(tvNI_i%d7`|7=Byt!c%U#8p`z0lpJ804cYUf5NIZ2aY2XI(1yDgd?c5pF z10%Ve)M|Uj zR>?tT9DK2n&tS-Kq=XLRUVw#he;;d7`sbJ)(xkC}#v}1sO7Fd9vf^nrHK3SbwY-=x zZEIqKqHBAy-p}@G@LCK~xD%(KcTQ9n4w2!WT&E<5GIYWWm|E3ygchldgo8>TYvUu+bg#)MP=xr5^~LLvX^cKAWPjpoEhZq>!S z(@?TIcvA5UtX>yg#^R9PshAv{hI5qC;!VSu60il^XSZ%cL+KH(1Z@7Z&pb4*s-F;Y z+fZnY$vzDYi+tFzr~2dKgo-+rfv!EarhxPW1pv*$)y#~Jm{IR9BCD9$mWAL)u%U`K zhsK8V4=n^)&g6oBeEZrUNPUviYcnnrXqg_N|Co(}2#^{s9(#dTw0QrWcL`0Q>`Oi@ zi0c0yhIlCYTWU+-s6d7K-^DK6Oax?0wz2jN{b550-o)`S@D{n0~>y^f}xQ4wJ zupWY?Tgf!d8^kG`!vAwJhlX`w`TrV$6UEev0Pz{_|4hX{QYhH=5qUIUbwWM4z}bcR z0Nz2+W`h5`^MgKBLL`}pZ#dlQ!j)A0s@&gRFah+AU0L0Cff%yvtM$;rB8$w8O5C~g z!fvGGb7vdJzmdLu7{>jPLvfz5b)DU5yz=G9^z^!b1K6baZz6&HJQQS2`Kzu@R~E;! zlGmNoH1@;6cSU3nKGlq72Mf=-;uK z7w7_8OJB=5x)LV6CT3=`({j1u+9|Jx90T!QDx^;-?mq&1gwdC14WK~>|kf--JBAy zk>}i7#XA!)7Pndc-?e3^aw9%7lJSp4Ie7tt2V*3&Yzp_dSDaiQ98QDbD`aH<0Tc0u zUwiz6!G9*olE43b^+Uz5QIgC5xY#Ah8TErnPPhND@Csg#dIS*UOPu@fYm09oo3CtK z_|J{*ri0rC3;fqYXmcylBXpSk&pRv2oCC+`@ssD#8~6okoTlX_8obKMgr8_ib&+lX zCSA&{r1klX)V23dyki?xz8*d21S-Komy}F3K=B0y! z1DtO*!n>)gwSxm?CQr)21sy1>(y>?n9kQ~MT050S{OLAnVQ1V{#r|e3PKvzHD6OZB zFCpu3(=F40uKc;R&#~zHv)<|8HJ#Jsz4?_QQdrG`q`a5G_5gFuUS(Hlotw?nf)v;f z4AYy}iE~2eaeT`?hoXM%v?lMI41CS#MD)}qk6nsb7ZP?YWg|5rn>ZVb0H%|uRim_b z9T!FSzRr$#Otz?D*A4c`vpCm#c zVdVVq;3Dk%gmrdl=RU`lRa@dFuj6NA!j4q(OkIibzZl8XH#T;cKd$H1XaHesu^Hs| zcRPgfHL7))t=@JjdJKz5ZTDl>oxHBOhNPfwiQ~=QsdDCiK(T^}14f4l6vZZjr}1s3 zdd>bTuZg3Atcsx!3b?&vjg6rGIMyKjl~4zflkG{t|JzXv2=+`&>@2`+J=uI0EL zH;oQxY6v~Xx?`GMj=tennWIZ`e2_f>zutQ8Oq)Fwi!*kN7c7dg3nX-~frt`(67ZCE zfIHZcF{<~dLIfQItY8{l+Rzc`-LcH+!?t{3bF1hnmm(BfgY?EAhxdW9%n({^sC-n5 zaGG^_++LSO$dl^4zk^}RH);H8WyHfaPr026+085q)T46mq73}Hq~Z2qjaE7J(H~A( zu(GZTc_B-cp0bXl1d!w%ZYWuINmTpfIqZ!kN^ESbpOoMIVcx<$@HTFG_Nab$(_<=5 zeMvmdD%?Oles4)+wPT^_8~xg9mGXxt_jFxo{at_(5S&`DpO>m=tT#;7XJwc3MoZz z*ZzEqcKF>E?!&;gn8|-k7_~Z~>1XvRGQxg=a3t8*q>f|1Xe?@@zCAHH{cG9q+%kXa z*3SKjqZ!4KV_td@Jy809P07>^l-pMw9DXH2X7xkt#>s%WFa9cISn);QL%8yTye!*t z6_yw|jmbIs6G@rx>5g%alXV$4&f503OBe4Tk+!GnzY{mz@^5UPmh{OCY3MV(mE0Y3E7Cq$Op2oeBHl#%I{Sv5Ns1*m)sb#_!5(v zS9;((_OQyrx(!lO3oVQB??{j#6i!8W*_Z#AeIb5F#;|!k4l%Z_eW;@bEtHk?O?%OQRf^k5K zii$OMqr#Hzf$r`@0i{Jnox47Rf#?YMKxlODtjBtkp!__&_-g%ehlF&6Uz==<8^(T3 z@E2;oJRpqLukLVnm$RDjmu!2_^?<)7UU4a(ZuzMU2*n{W`ZueU7m78|QK~m4b7;$n z&&iol;rs;J$xGe4gO!5=uxd4RoiwzuyIHT_m+sc}66)opP~({C9nZAmddZ0|iY=8C zn)1KrKS-#hIS$5|IEZEWVLsqF!`XIo7wYUbsz!~cBYNOh*irIkE_t|s9nBDn=)hk{ zbW5jz5N`ZW-bG9ZS;OK}Xe~iY9&_Ql2bS=Ene2>f1|lf%FS;a9Zbd!bBUOqd=^LyC zW2-DJSTlrmip+%B+OFxooZn2SmyvX0vD?H$LE$|+JEO+JPg!wK|FetY!>AZ8(m7nl zY)c%j>MD}bYpTrchCj{DiB#$y6NceuD$b6(d{X1QK%4c>dB zt2bIUBv!&js-(*A7A(tc!<_u$n^s5C?AJQ$l7hvvc3v}>TNVV(TG=II^fpHg$_)X) z;nJjZ=*@g(<>xE4;9*46a_y(^FiMWAl;1q^+t*7|4oHp}MpbvdM0WiQc^F`|9h3WZ6TLD*5An`#W|L z){0?0_jbRH;E~%UbF~BXcl1;y+%()-csR*`?q`nMxY($m`SY6R#VPp$chtqxTKcTm zy&6%cE*rtty$PPQrD(P6=+S;0%HSzAU zSV>b;MlVaw=ME5CE>KKXzU(sP7Mi|)I-sevv}e+wRQG}<|E8ME`)n3f1gQA=ghG%} zaHES3j*gxN%^UfOXMtI!0*IerW`~iJKy;n&^Pu)4nxz zgxhW|kr_K9qvKIx<`3VzyNU;BQg~SD74jSrt1J`TTjV5jj;+Q!}+3bYTS4Q^S@x7*?2r>N!j?Qaqk)Lhx{7MtU8cSweQJI{ha-851l_I%rSjOOS6O&s7^jG)#epBqa7xS=k9%kVD z5Bb+S9QG&kYIggN4dA1%tw9+Ld8qO#c&%YCA8b-kQ0S{4O|#3NA&qr3Uq1RA&-1%Z zZ+SlPyUD+&y-KJ~tk+bBp=~RjOq>=w=-1918|u-MYYq?PrV;-nrHd)O_mKmBi#vx?#?IzdHc_<7NQ_GAPC3lYH06x;We}_t%%Ut)bbmi0{vCQR*>E7S z_t(On$ZmlSQ991%yfc40Ebh4TfOGGyxQLnKwgpj|W`;Bdl!Wz-x4 znx~oH`y&h4rz>(>_gTI7yci#t)P$u;7!uU8D%X00zN7xWX*-4OYYyC3}E~D zs9FjlBkdRQeBh^#nN*9}SU;V0}UE6C!WjWio za=%oMI-^3+U#oVgw2WtTPo4w*zZN0m>K{NC#{G@gteJ3XnfzDj6{=#&6Ya)DN_IFo zC1kw04p-`kL@>U*-oQFD_hU)i-ga-zi&$q&-<@w7wKL_b?DEI((z~Q^$}H7Hi7e{# z!(+*JY0CX3S60bR+fuWJk+o)`qs;D*F3#y_-f5L}dM^TYfn5H2DBZuYY?N0teO&*k z!%h>s5sMqC&X)Z+TD39W(eQI(DienvW0$XJGV!VnqY#r}!B9K-mZEN2)9&26Z-tIs z5R)!pT6zc&{F7Q)M|of$T;-MDe@kmaW9Rz)@~g4$F|0U6&V%=6&aIRmR#VQB{mX?i z$TN@X(v#LEpVgEWRP$;hmL*#%D1%6kqjgqtJ^g+Yr@$6@M$f9Z6a0XZ?6O3WeZs8M zck!e1xzWOvlEANt2i{$>136cvkqHzI*+&nX6VPC@YKm39ii4%)=jTV=<4JhEaH+VR zP-cR5Y(o$Ie9;<8DaDBg-qvwo0F{5H`4<>dRp7D#boN?;^zCPj?zVSQ7cR#* z_L}LD)zaZKV5z&EXdo@+@#Jq-MrsiL+|eX9IT&n25v44FbVSLVQKi8%mv5YYwP8KQT?Za zs*iRiABvLQs#L58e{tPI|H(>cfuXo@t#c0hUFYn@`;@58Mc`^1TTv;6etgB^d55WcPLI^)-bafx_+6BedZg%%*zVEr)Pq*lp!MfJ6Zm~J zE%c2KHs;)dE-j?H#WpR&$}3fc>%NNL7|~gAKu=l`ux@dazAL57bS32Ho75*e;a4NR zvLL_mjV&_FbMb1M{4#s4o0>mX#(7+^*rZ5BZ$xM{x0J#m+dn5 z9_(nEkF)BfpR98$099&G8v)3n&w&S{O3H1%HfA4H`}Hzn-G4#G6R3xnVFL>szJ~0V z7H%~2{v8g4T=D=0Y?OO$4s(88#=&JV%8A_JS8$PoMfV*vMg!{T#TU&d3)ELTy;??7 zWuzU5Xs4?Fd!$JwjKsbA_Qwp&PA9Peqj3&}<TXeoI4{CG;^=ywl90B^N{yQ8L-L>XS}v|a`MVcy`z19m^VPSp(hMZ1xp#w zNr7{CWFcJ!3pBlg3ghYs<>pS?zXD5fN5j3PgelIkqg_pY?jonx;x#>Jx|U@cCXA@( z;Q;~v0~3VOl?#Mr6Pa&Chu7Hq%3qn*D~_bK1)d5hxLq|D+02~l3?EOhP^&EJoX^}8 z@akM_4TGnPev_E?Yr!4=@@tacE@;_gH#uBGW19OvT<@x}waZ0j3q+k71(E5slW_Q5k0P`&umQ*d z|DR)Ts&%L2>XI`1(?XO~9x5Wru8spw&|61M7>w0c6_Ar{Xity^msQ%R~mTh z9j_zt5`Y!y?kk(*Mns<9rQ^>YqaNovO+_`!h%FJtDIlp^g{Z<&z?aNI>M4IdQeSN( zuHgqL$N200hM4ci4;6pQ*W?+_cgqe?R9^*!kLjVi4Lo#o&87as&uQUBh6|1_BdI&`IRLKs?`~%z=g8!%w6`sBB$(P zwt4k8-1mfq2Qs&n?0$c}iBq5-e5=hKCLAuUS?qHig7&**ZBRmT3u@~Og(L?jXWT;? zWgKgDGfGkea4<3M4%N-YW$6B?=Gztqn^zqN8JFo=aktn--&iVI75!#_w20+u1?m57`j^0HFbV!h9cpa1dT~+c> zH_cxN9?$!mxZ^L^NJ$)+NHkU;sF6S2!`;31@w&8H(tednjz&;mkyf9Wm?>vJ|5Z){ z@$2OS95{uWM~0&^YAs7$!wrvzC3n63K$pwpSv?49>syY|chNi3hv5Fz{VB|+pykGp zTSS1V_!Bo|bu-z5cqMA*2miMpKb~X<0FUI}@?PO_3+=HV3=Ob) z0#hwPEe*M66a^lMnAKO8xM7&4010Yd0~~roPSGE@otpYqZnFoGuGpE6Il3g~vp?A# zG_DyTpmy$pKl6U%UZ$EF2?J?i&r4j}_h^C+{9u@B&1?kX8=yHIL6!8b0ZUX?Aa&;;(oVa$c!4K}~)zSOvW-`$B{H4}-q2`e(^EPVh$+7al)BvbpY>3xZb zz+TPL_15XJA2ZqFYFSoQSp>EfZ(NJ(;ha8|%+oQgulfsg|g z^@%_K{_bO@(r{}*rteQu6Wr57n$I!sF$4_@jt{+H5ArB$u!Ui&z9}89INYXoq*1k% zUQ|7yIxH@ff|S;`weHe_X%LrkvD^8oeyac=JfNfpjMhMAJfrPX#2tRBxu zx9&#Q@Fg_Uob^&pw$U%e^FW=MvOJF+TFXmVPDXlYM_vuTA5#^TYQ7%JE^{r&9D;1s z>**&#zFw z04mzl1VmGLZS*5&!8xvA4O{s0cZo;`WWCM611XI#&>AALwE&9n&5O}9`9Jl?ZtKw) zB5KwyX%@)CTo}V2s2gjEO|E9TAS{bOz27$AQQIMO5vOqHib~Tj|0D*~yP{x(Cs%#$ zU1}r+bu^1eW(8aEO#b&q>C4DWH^kA+)UA_{mLW!6@yrqbu!3W>(l>SBjcgP!M!p6H z$NClnl!lm^YR-agJQg@I|C;#@_iBGhm-VYjM6&VfgSx))TkaotQ9b{iqF$rVy16vo zv#%0uJM|nMh3eyWw)O7oUK*UXs}r|oR#R;NMC{o~KMi@^UZ7!Ysrm^ARq7c(qp?(C z_efaj%Ku(JtMqhb9KN^AaX^rdk?y%Ra(IA>+Srb>=B1XxR6<%&jFKl%(+Lvp4U;X<6#6 z>c@LI@9Zpn269YA!mH>wV{57l4Kr}{`$B5P=hzMVGNmX#sa5E3z1vaS1t&pNKEE=fkL*4|xoQ^<4LE|zyVd4QN*IIjpOs9}3Si zs~6O+@~$3;jB#Tf{7((f9JR?@~K%%BS6u zs#5VlDu#^(?CkC`vwMJHXm#;$*WxA{2tU43aDICX0|M2-2Wc$**M+DC049tN&MIC< zf}1Z7e`3=(qwBzkqUqlW;ZxH6r)2rmP;`oY;nRNt2mt7I|6QZ!+4LOu7D;z|c0OT% z)b!PB+E{4SB`sklzh6^2dnWpEBiL3AB54LP=c0q0(-IH^BP03-9^2x8f2eHa094oA zWN=7xZoN6T3#TxE-AJIkUUXu;e0G6ho=X889TG zcYc1pQE|RNGiy!2fyM`nXZ*3QjThydn-eN^Xa-LG3N&qcG))3tWZ|INh972OPzZ!m zg~U_nv+VkPANj!Ved7!Kak_|l`86aDAW@*bOX~7&`&dpdH4SjR{}K@41DS*8Y_rMs zTJS8w%g8@9LC1k!Km@CgFP1)c8*~{;QZR!7ck$sAY~wJ|pqrqBtUG~7oxDLRH9^anf=lRxE5rpL(q=UGn@iL^H09^tb+58Dw3tIv4=czM}@qE!<}@@1I{ z#nd>Y5!G)2Lttey8P?TnV?u^v0jJ;-Uh@t(FDIs&{JOSM!EjZy<5dx1VPR|M9vG6X zlp`Y}Pb@%b{YL+%ThY+Mlr1ct&fDW$4iim4IQ|=WTD6E5LTe7JmoD+``?wo|7xeaj zzt-D`HbTIxy}j>#v`Eg$$;l-Y3KT3)0r#}2Q|$}UCExZQ(5!&E)Gto~1#ev{ZEvR* zM|Y^>WOK8*^!X}wcXrgqlnOc)6<#-&F(Pe+a#eePn*dUQxpC(dB2D-6`S}uxdY*i4 zXP|MB&Z&Rd1yAMc0r9Cc0IPGNT;@c}GP{t{fcb?Ru_H;ZCvvE>?ux3EU-wuEiMuIr{BiDLcoaY5+NUIERyqb-FWT zyxK-RSI4xSsl~IVrpyWcb!}XL)P5Off>}9IF$VBPX0cf&c{Va({U8u(?kzw^1TIR07<`Mr*OM#dU6Nf3xqVqx?yeTPRsE_u zPNMp=Jd4BDM7>Ax#7@hL&X4J{MNIGYOALS0GoD)Nga<(PLp0-t1M5~t^#p{_WbrrI z^#6+JrSE~8?+dw)N}>1o$Mv`|(AsJ5aUNUEHaX)12cB^7#@rJ}UmgaMd=5rrii|S|c&IR@O|xE8SJ?~*FMEJmsE8J6_O7&e?2#b= zqZH~6_J%FF%4#Im=)mt*W$B(MONhUUkON^utt30f*Hmt}&K3sa=EB*~4)O{Shw|Zf znEzH&39Fr9v+x*veF{a@FIq4kH$UNJpqB3nTpY_CpzqBAY!W4XM$Vu^7vc!IdG6>4 z>(=XW`Fc&O!_%i+JI|T-?yQ>mO}bZHMK;@{%<#}e9Lxl?BQVi@{(zUYj>#VY5UFKA zxbE)-w3FOytjwBolDmh;IB4OVWyKB&=P}Xf(b#KCH1yEh&{!;oHa=^Q_@Y`N&DK9P z#WB7Dc7u^B;_5*y?4zh+&zeiLB||cR3O0u}ILLUTwg|xf_ymZl*R)~G zXdO*6GP=pbZo2N84N~idOOkHl^1vJh);!2u8x54eMMmd_p8 zoUnB-eMW4w+88#;fwsKPyVWUY%Q|dlV`mq=x)0)vE%FZ!jp`LCm@Pw%&XQIL5}?a$ z=@?(K$-%|IqgB1yNli8XiUGo^KK?wWS`7efqydsXNu^k{_N}oE*p8#>0$R~=g@p1s z8T$(F%|9O(K7x%h1aoGDP2Ta~65D9P0^ruR1w!=g+gHLmsl@~C=Jbsfsodv#N+cw+KEVCBqmH-C&e4`2o zoyvJ?8ig7(hSJZLRof@UFPW>BE^p?4)?4lc|Im2UeK#V>c8uWG$+uroNBo z${7oLzIz~wCh4&YCw~9q9C|Xj&4ioh7MO{D$BGunp?XWl3SmmI0c(iFLLfImH$P6Mi*{;zzAksx z0tIvQpls46QHHb|s^)V>0{&r2_$eSoGK zzidBP0I&=yjax7V@2MhmB$i#4j%u&hp5T)a3OnfIs5RbWxd}Z4y(`d9l@s>8nX)+? zVy}LsS2hVln@LEJKY-$ukf;$GQItu?z>qYz3n`@k$4zx76>tBA^*9vtnkl3la}SO! z`l9yrC-XHjjB7?uWlOxvACUMXE_L;&6MWAAG)GEO6Sb*&)r%Uw5r3k< zTim)%HQnYC;li--N*jUD-cB8M6|EVHU`yuee(B;`z{)4wYgWm*NxT&Tmtr2#v(bG& z$X5)kb)&)POEE3R6;DsJ2teT&C%V@sK?{71DolM6_G3@UCUS6{I&Q6Sv0dvy z@xUMcy1I-lSD=%uF9FP_(G7P1-BphiC-#VOatGFgUK(2(=R2TbEeK4P_hr!Plqkw+ zER9=Q`V4F}wKMt4z}^RGMd`6?Xn^iyz7=f0f81aQCC+c~M8v~ut>q`7Q$QT#=?tNu zvIh-UN?=buw%M=1u=aA?^S)KN0Q_3f02ht|O0qlT6g2fXB^}DXpc(_9gnO$)BgmU} zHa0G}TRWq+Ozuu;y$d-I8l;;iSuBw4d3NCt8l79Zv@xbRLeGJRC*$i-QJ3wfW_#^H zzhPwO;acENxHTN5Q5*lcU+-WT6cM7D$CBCmVu}kFIxh zV>k;Wu3-cXa9!O{ZX!6Fo((9`r-(_9q#b|`$grE7C}^NRTu?$mId{e}We_>r@iL}G zNj<;~S2eg*6>0%m=44Pb5b8}7s}_&#|Ec5LJhO&pz4b6L5qvV%ww z!tCOHIZm!)E+xvPX6~mr)Xb%56^p5OZ8d7jtvdYwNp zd)fT<{e8dR&*$@wNq5|15IU9iB&xKkaFTTvZj0k-Q^FAHgFSpd9BDX|rA$WN%{X4? zmtF7Bitnn}=;pdxb9Nh1ENB1LUjfSr(UIOw2*#06Yy)SfJsLj21SU_ri0wNrtoHIw zP5pVJlE4%s+WT_c_N{M8mKy{cXJ+%iJbv=zJxL9r4P`QdPeGH?7)!uL_RFyEeS@b4 zWcEYQ9lk;9d?vH+X6rRv-`vnbm?+|U_o+)ZpduemVAq(M^158F#FLFjAvI{%#KgVZ z1C8RKmKk}h_g?g+s2l`)u&5Vvecw~ISI)_tpwY+^^Qs_2C3GW=>cY3`##5`oOe6sL z(qZF2&P4KHwpWhZ$6q*js$2VVmNZym%>!Zlmx75lmdV|LU?w*%@ngs8}ZI=3K9$=3TNcQKHeMgNo#u!^tsC%gYEG~ z!|thVO%R+vcuyo=VGg@?MH%NgOKn%f_#Hg2VujGnozWP$ZIYokY(K>-_pVDoggsNF zUOiv-iD4b-A{Y7HStg14B4Z_`6mg!OkN()i`6?yFytqJ*WgLDpXX;V5n#W3^q+&sDk58W%wGIfpyKUh~ztl~0ixaw~hKcT- zy+?*NKhSWe`bzsBa)}4LZSt(^)p#?7i)&s1(TyBV&-~B4PKS@H5=?9%Fykp}NX9GQ zUDAnckX<55zY1Uu-eztTs9une*#kT5VdI)WnjR`;r%fBhi8P^j06G|*& zbwBYrv8HZ*AKlYpk;vhqFJ-+ul->IBtgiUyLytGhBrV;*C7zs6-{C7wfLf0kTSmjS z2`(chraLVjKS_$f({{zXM5nGNbX$6NJT;WRUqspjmUilzd5J-+v&=nF4cbk3__nIF z(y2hD4|qszX8b#%D#tUkb(&B0(?lYxTTdCaf+^39mxf%Bqba~IW{|`4Yn7a?mou!s zJ9!Tvyi}?VM6W^U_M(~E43YAO0@a*DQ@xPU(1Wf{)DRNO)e>O=ShPZ+bTCGGuV$GF zT}%|%rS2oV>usvXJJC=~zb)3vi0V_Xh}>!Vtf!R@j>?OHHY#n(U;2!T6Z1?n2y5sm zS-s0R?|4M=)6v&s5|EI7Frwmv3Cgb|bmMFAM-X%}XbTs|V!Lngl~aMCp``~kI^dTb^z~Egv81^V_0>}zlDQqcP5wiUW#l`sm0Z|7g)U{|?NFhr@208o zjN6#wm~ZtgXcZ%i?-XYOuEID_3Qc%ERxxKYPR3`5nfIO}dx6T|B4pEWm*20=KR*V(!y)xTSOx1f{4496`Id@LzZ*QOB5Z$~{ zJB|roD|e09s&10;5QNfxZ$>NdF%XbR5hrKSUU|kLBu~tn5cok+7^|)VSfEo|_g{bh zR7P(XOL`VMlifABWzq2e(L*}}YrP5CCxA&Y50CwQ%dz%uM#Fng%GIc`TTOcM93k7TIl5#_sg{u^o8s%)nRu>ZnyUN{x=O|zO8_G5K- zdk1s4mRw|C+pcleK&#u9(tNuunfDNu1MAOXE~^AQiaS|BcK z+)nU9MV0c+j=}C=CA7Bm5)%?W%-VhP0OQQqc1XzSdub~T?w~Krtj@((!W?-&VuIKZ zAoL|f=pW)h;*eq-@$I&8C*FSZT~|ge=g-c~b*~#po=9m`la(MT5~p~@9*|`p5D^S} zA${~#ePGl2XWF0FMq{K>|BBHFGuW7Vpm%@#KZ!vbpvwY>I8G0F2r-dty?HYbYrdMV}a{8Fcd>bidI!444#QfLGz@0G#w+3gnd7b?3}4o7K3mwOlqbOBh(hs5VI_ z+NLW<(9alt8m@o8ml0i+F}jU6I2I@R2hH%y8m}{I?Ome2w#p@(d5;-%8UK+Uv;f?) z(biR-FC43x7IZd4!ta-I&1{2DUE%+-!*o+5agl&Nft7z(*)XH#{3MLh*#pk&Xc4{t z!8*enqXCLq=`L(2&SD?`uoUF$?aHMvWpZtqs`Sio*vPfXArS#f>!bZ4H+P_=x)mtp z7d*_uCP$bBB4k8 zE1kWRZjVhyV!$!@!$!T=@B~S)gicS$mpfPl_G4OfYaywE{9BV&G-&&5$2;(=+zOX^ z?Y`b4*el55OT~MEGd4}U+k2gexBK? z1ngByeMzX-2l?eTlE*NO=$cOqzu~t719Iy}IUyL3sTouZedea;CIzAY1e)D914!}( zg>&b-RM@tTUE|_+8D>{HXeyxgnFNam#|fh7zjDp%OJqG)o=o>ul`v;gfjb>~4M zjiDxuhro9NcilpZZz;u)_WKbOwWIJm!vf@6z@>!U=}*qhkEU$+tFT<9UI#*z^#N)p zk?VN+eAg`$+NCZH^y*WqbtwabN&vNi^8uOl^0KlnMN`zt+yx#=4O5TyVxSUOw z!x}czJ9BrV01zZznwpup&Ze}rnLgHF7uP{>J4LFjn{bRR+bqL61S3sk?Nwv5r&~}E zq6Kyy*!H$1Wb^@K#32|3ONV1>R+YI>qjfOt%$%=Zsc9{0O+2H1v63oC_Xab-ci#mc zm7@pOw$*?D)Zo%t9n0k&tY&^=c*HPK8rmX*ILS=)we#T#1-#D>kfr=&r##lOc`Z?G zVq5PlKG?Y-R8vtzIcm0K(C@JqEYU@0-LA&-b84k9h10y4OIuc?mH$Z5^D>YZhv1h+K!&on) z1HtHoLblOH;6HtAS7 zYHF&*tJkaJ5|~!ovj+FZjU+NinHr9Je0RAV%eeO*ri}ChGc`*d=7sfST6Pt)vD5xe zO1T;lGETKSgbrwqY4jyI2wNJQvpdLvHv2a;CAE%l=E1q~>{3{ZO~XzzH&Xkv3g~EX zWGX&hCeR7F4Ssz3t!=nyqYO|VI7|Wd>%@EKK(GivoQ{J+MAwDrn>(~90^LEm!@eB^ zbvXFQuQ>l8T(rs<@jDjU?O?gLWcIYl%JQYGjdwvlQ9&ET)&h|VFugl>S{9ST3-s79 zPoyTt?jZP_T^|4etq+YLIAR56_$+;zlLd z47EszjI(gd>CjhrL&Rg`DUyYVNco7aq2beJahgkE7_~*Ql$PxM9-{SiGnx-o< z?Lu&%ITQ(XMYF*ofDL#I;Z=|*_yU5Q;0t`jRc86B{UK2RBq;; zp3=|u$)VWXyg7OB+@lXlO4>Js!p76O@wMk}%C)Y%{2?H;NXT3TKmG?iCXf&Qk*KMm cv~{C5$n$pa=d_F9FNK(&vp!pS<~Q2E0i@rYXaE2J diff --git a/pertpy/tools/_milo.py b/pertpy/tools/_milo.py index 8412195b..7ef8b42a 100644 --- a/pertpy/tools/_milo.py +++ b/pertpy/tools/_milo.py @@ -1112,16 +1112,130 @@ def plot_nhood_graph( # pragma: no cover # noqa: D417 .. image:: /_static/docstring_previews/milo_nhood_graph.png """ nhood_adata = mdata["milo"].T.copy() + return self._render_nhood_graph( + nhood_adata, + logfc=nhood_adata.obs["logFC"], + spatial_fdr=nhood_adata.obs["SpatialFDR"], + alpha=alpha, + min_logFC=min_logFC, + min_size=min_size, + plot_edges=plot_edges, + title=title, + color_map=color_map, + palette=palette, + ax=ax, + return_fig=return_fig, + **kwargs, + ) + @_doc_params(common_plot_args=doc_common_plot_args) + def plot_de_nhood_graph( # pragma: no cover # noqa: D417 + self, + mdata: MuData, + de_results: pd.DataFrame, + gene: str, + *, + alpha: float = 0.1, + min_logFC: float = 0, + min_size: int = 10, + plot_edges: bool = False, + title: str | None = None, + color_map: Colormap | str | None = None, + palette: str | Sequence[str] | None = None, + ax: Axes | None = None, + return_fig: bool = False, + **kwargs, + ) -> Figure | None: + """Visualize per-neighbourhood DE logFC of a single gene from `de_nhoods` results. + + Pairs with `de_nhoods` the same way `plot_nhood_graph` pairs with `da_nhoods`. + Uses the same embedding (`build_nhood_graph` must have been run) and colors nhoods by `log_fc`, masking those with `pval_corrected_across_nhoods > alpha`. + + Args: + mdata: MuData with `build_nhood_graph` already run. + de_results: Long DataFrame returned by `de_nhoods`. + gene: Gene to plot; must appear in `de_results["variable"]`. + alpha: Significance threshold on `pval_corrected_across_nhoods`. + min_logFC: Minimum absolute log fold-change to color a nhood. + min_size: Multiplier on `Nhood_size` for the node radius. + plot_edges: Whether to draw nhood overlap edges. + title: Plot title; defaults to `miloDE logFC for `. + {common_plot_args} + **kwargs: Forwarded to `scanpy.pl.embedding`. + + Examples: + >>> import pertpy as pt + >>> import scanpy as sc + >>> adata = pt.dt.bhattacherjee() + >>> milo = pt.tl.Milo() + >>> mdata = milo.load(adata) + >>> sc.pp.neighbors(mdata["rna"]) + >>> sc.tl.umap(mdata["rna"]) + >>> milo.make_nhoods(mdata["rna"]) + >>> mdata = milo.count_nhoods(mdata, sample_col="orig.ident") + >>> milo.build_nhood_graph(mdata) + >>> de = milo.de_nhoods( + ... mdata, + ... design="~label", + ... column="label", + ... baseline="control", + ... group_to_compare="treated", + ... layer="counts", + ... ) + >>> milo.plot_de_nhood_graph(mdata, de, gene="CD4") + + Preview: + .. image:: /_static/docstring_previews/milo_de_nhoods_nhood_graph.png + """ + g = de_results.loc[de_results["variable"] == gene] + if g.empty: + raise KeyError(f"Gene {gene!r} not found in de_results['variable'].") + g = g.set_index("nhood") + nhood_adata = mdata["milo"].T.copy() + logfc = g["log_fc"].reindex(nhood_adata.obs_names).to_numpy(dtype=float) + spatial_fdr = g["pval_corrected_across_nhoods"].reindex(nhood_adata.obs_names).to_numpy(dtype=float) + return self._render_nhood_graph( + nhood_adata, + logfc=pd.Series(logfc, index=nhood_adata.obs_names), + spatial_fdr=pd.Series(spatial_fdr, index=nhood_adata.obs_names), + alpha=alpha, + min_logFC=min_logFC, + min_size=min_size, + plot_edges=plot_edges, + title=title if title is not None else f"miloDE logFC for {gene}", + color_map=color_map, + palette=palette, + ax=ax, + return_fig=return_fig, + **kwargs, + ) + + def _render_nhood_graph( + self, + nhood_adata: AnnData, + *, + logfc: pd.Series, + spatial_fdr: pd.Series, + alpha: float, + min_logFC: float, + min_size: int, + plot_edges: bool, + title: str, + color_map, + palette, + ax, + return_fig: bool, + **kwargs, + ) -> Figure | None: if "Nhood_size" not in nhood_adata.obs.columns: raise KeyError( - 'Cannot find "Nhood_size" column in adata.uns["nhood_adata"].obs -- \ - please run milopy.utils.build_nhood_graph(adata)' + 'Cannot find "Nhood_size" column in adata.uns["nhood_adata"].obs -- ' + "please run milo.build_nhood_graph(mdata) first" ) - nhood_adata.obs["graph_color"] = nhood_adata.obs["logFC"] - nhood_adata.obs.loc[nhood_adata.obs["SpatialFDR"] > alpha, "graph_color"] = np.nan - nhood_adata.obs["abs_logFC"] = abs(nhood_adata.obs["logFC"]) + nhood_adata.obs["graph_color"] = logfc + nhood_adata.obs.loc[spatial_fdr > alpha, "graph_color"] = np.nan + nhood_adata.obs["abs_logFC"] = logfc.abs() nhood_adata.obs.loc[nhood_adata.obs["abs_logFC"] < min_logFC, "graph_color"] = np.nan # Plotting order - extreme logFC on top @@ -1151,7 +1265,6 @@ def plot_nhood_graph( # pragma: no cover # noqa: D417 show=False, **kwargs, ) - if return_fig: return fig plt.show() diff --git a/tests/tools/test_milo.py b/tests/tools/test_milo.py index db247d9a..d8f0df99 100644 --- a/tests/tools/test_milo.py +++ b/tests/tools/test_milo.py @@ -323,6 +323,31 @@ def test_de_nhoods_planted_signal(de_nhoods_mdata, milo): assert np.median(lfc) > 0 +def test_plot_de_nhood_graph(de_nhoods_mdata, milo): + if find_spec("pydeseq2") is None: + pytest.skip("pydeseq2 not available") + import matplotlib + + matplotlib.use("Agg") + mdata = de_nhoods_mdata.copy() + milo.build_nhood_graph(mdata) + de = milo.de_nhoods( + mdata, + design="~condition", + column="condition", + baseline="ConditionA", + group_to_compare="ConditionB", + layer="counts", + min_n_cells_per_sample=2, + min_count=1, + ) + g = mdata["rna"].uns["de_gene"] + fig = milo.plot_de_nhood_graph(mdata, de, gene=g, return_fig=True) + assert fig is not None + with pytest.raises(KeyError): + milo.plot_de_nhood_graph(mdata, de, gene="not_a_real_gene") + + def test_de_nhoods_statsmodels_runs(de_nhoods_mdata, milo): mdata = de_nhoods_mdata.copy() de = milo.de_nhoods( From 601a10df43ec001b57811d033fa7fa8cc3058af5 Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Wed, 27 May 2026 17:47:19 +0200 Subject: [PATCH 06/11] docs: bump tutorials submodule for miloDE section Pulls in scverse/pertpy-tutorials#61 which appends a Milo.de_nhoods + plot_de_nhood_graph demonstration to milo.ipynb. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/tutorials/notebooks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/notebooks b/docs/tutorials/notebooks index 7ae61d53..890fdd41 160000 --- a/docs/tutorials/notebooks +++ b/docs/tutorials/notebooks @@ -1 +1 @@ -Subproject commit 7ae61d535361c00e845c39217d513c049f340241 +Subproject commit 890fdd41efa701448ff94d0648d0c9b83c246783 From 390b21fa6f7e1a530a09199c5a6f386bddfe8d5f Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Wed, 27 May 2026 18:05:00 +0200 Subject: [PATCH 07/11] milo: silence per-nhood pydeseq2 stdout in de_nhoods + bump tutorial PyDESeq2 prints progress per fit; calling it once per nhood otherwise floods stdout. Wrap the per-nhood model fit/test in contextlib.redirect_stdout so de_nhoods runs cleanly. Re-points the tutorials submodule to scverse/pertpy-tutorials@cffc9b5 which adds the miloDE section to milo.ipynb, with warnings filtered at the top of the notebook so per-nhood validity messages and small-sample PyDESeq2 warnings don't drown out cell outputs. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/tutorials/notebooks | 2 +- pertpy/tools/_milo.py | 27 ++++++++++++++++----------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/docs/tutorials/notebooks b/docs/tutorials/notebooks index 890fdd41..cffc9b59 160000 --- a/docs/tutorials/notebooks +++ b/docs/tutorials/notebooks @@ -1 +1 @@ -Subproject commit 890fdd41efa701448ff94d0648d0c9b83c246783 +Subproject commit cffc9b59574f0a43679faccef64ac8e11b51880b diff --git a/pertpy/tools/_milo.py b/pertpy/tools/_milo.py index 7ef8b42a..f1c1ac37 100644 --- a/pertpy/tools/_milo.py +++ b/pertpy/tools/_milo.py @@ -1,5 +1,7 @@ from __future__ import annotations +import contextlib +import io import random import re from importlib.util import find_spec @@ -690,17 +692,20 @@ def de_nhoods( pdata = pdata[:, gene_mask].copy() try: - model = model_cls(pdata, design=design) - this_fit_kwargs = dict(user_fit_kwargs) - if sm_glm_default and sm is not None: - lib_size = np.asarray(pdata.X.sum(axis=1)).ravel().astype(float) - lib_size[lib_size <= 0] = 1.0 - this_fit_kwargs.setdefault("regression_model", sm.GLM) - this_fit_kwargs.setdefault("family", sm.families.NegativeBinomial()) - this_fit_kwargs.setdefault("offset", np.log(lib_size)) - model.fit(**this_fit_kwargs) - contrast_vec = model.contrast(column=column, baseline=baseline, group_to_compare=group_to_compare) - res = model.test_contrasts(contrast_vec) + # Solvers (pydeseq2 in particular) print progress per call; silenced + # because running once per nhood would otherwise flood stdout. + with contextlib.redirect_stdout(io.StringIO()): + model = model_cls(pdata, design=design) + this_fit_kwargs = dict(user_fit_kwargs) + if sm_glm_default and sm is not None: + lib_size = np.asarray(pdata.X.sum(axis=1)).ravel().astype(float) + lib_size[lib_size <= 0] = 1.0 + this_fit_kwargs.setdefault("regression_model", sm.GLM) + this_fit_kwargs.setdefault("family", sm.families.NegativeBinomial()) + this_fit_kwargs.setdefault("offset", np.log(lib_size)) + model.fit(**this_fit_kwargs) + contrast_vec = model.contrast(column=column, baseline=baseline, group_to_compare=group_to_compare) + res = model.test_contrasts(contrast_vec) except Exception as e: # noqa: BLE001 logger.warning(f"Nhood {j}: DE test failed ({e}); skipping.") continue From c5aa93f1e7a56df1ff1ae1f7675799985db6acaa Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Thu, 28 May 2026 09:44:10 +0200 Subject: [PATCH 08/11] docs: bump tutorials submodule to kang_2018-based miloDE example MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit scverse/pertpy-tutorials@9ff43c2 switches the miloDE tutorial section to kang_2018 (8 patients × ctrl/stim, raw counts in .X) so the example recovers ISG15 / ISG20 as top hits rather than mostly-NaN results. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/tutorials/notebooks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/notebooks b/docs/tutorials/notebooks index cffc9b59..9ff43c27 160000 --- a/docs/tutorials/notebooks +++ b/docs/tutorials/notebooks @@ -1 +1 @@ -Subproject commit cffc9b59574f0a43679faccef64ac8e11b51880b +Subproject commit 9ff43c2785887ac48cfae98777fd4c9aff0dea1f From 38b5a37ee7dcb49b59f26c2391e86aa6b2d2153d Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Thu, 28 May 2026 10:15:59 +0200 Subject: [PATCH 09/11] milo: float64 p-values in de_nhoods + summarize skipped nhoods once MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two related fixes plus a tutorials submodule bump. de_nhoods previously stored p-values as float32, which underflows to zero below ~1.4e-45. Strong DE signals (IFN-β ISGs in the kang_2018 example) routinely produce p ~ 1e-200 from PyDESeq2, which was getting silently clamped to 0 in both the raw p_value and adj_p_value columns (and hence pval_corrected_across_nhoods too). Storing p-values in float64 fixes it; logFC stays float32. Also collapses the per-nhood `Nhood X: DE test failed (...)` logger warnings (one per skipped nhood) into a single end-of-run summary, so the tutorial doesn't have to reach into pertpy._logger to silence them. Tutorials submodule bumps to scverse/pertpy-tutorials@a0b9e84, which drops the pertpy._logger import from milo.ipynb and re-executes against this fix (top hits now show p_value ~ 1e-73, not 0). Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/tutorials/notebooks | 2 +- pertpy/tools/_milo.py | 25 +++++++++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/docs/tutorials/notebooks b/docs/tutorials/notebooks index 9ff43c27..a0b9e848 160000 --- a/docs/tutorials/notebooks +++ b/docs/tutorials/notebooks @@ -1 +1 @@ -Subproject commit 9ff43c2785887ac48cfae98777fd4c9aff0dea1f +Subproject commit a0b9e848d791c4cd4a9ec808c8b4a492b5624111 diff --git a/pertpy/tools/_milo.py b/pertpy/tools/_milo.py index f1c1ac37..ee50d55b 100644 --- a/pertpy/tools/_milo.py +++ b/pertpy/tools/_milo.py @@ -638,8 +638,10 @@ def de_nhoods( n_genes = adata.n_vars logfc = np.full((n_nhoods_total, n_genes), np.nan, dtype=np.float32) - pvals = np.full((n_nhoods_total, n_genes), np.nan, dtype=np.float32) - padj_genes = np.full((n_nhoods_total, n_genes), np.nan, dtype=np.float32) + # p-values are stored in float64 because Wald tests on strong DE signals + # routinely produce values < 1e-45, which would underflow to zero in float32. + pvals = np.full((n_nhoods_total, n_genes), np.nan, dtype=np.float64) + padj_genes = np.full((n_nhoods_total, n_genes), np.nan, dtype=np.float64) test_performed = np.zeros(n_nhoods_total, dtype=bool) # Lazy-import the DE class @@ -661,6 +663,8 @@ def de_nhoods( # For statsmodels on raw counts the regression model should be an NB-GLM with a library-size offset. sm_glm_default = solver == "statsmodels" and "regression_model" not in user_fit_kwargs + failures: dict[str, list[int]] = {} + for j in nhood_ix: col = nhoods_csc.getcol(j) cell_idx = col.indices @@ -677,7 +681,7 @@ def de_nhoods( try: pdata = sc.get.aggregate(sub, by=sample_col, func="sum", layer=layer) except Exception as e: # noqa: BLE001 - logger.warning(f"Nhood {j}: pseudobulk failed ({e}); skipping.") + failures.setdefault(f"pseudobulk failed ({type(e).__name__})", []).append(int(j)) continue pdata.X = pdata.layers["sum"] if issparse(pdata.X): @@ -707,7 +711,9 @@ def de_nhoods( contrast_vec = model.contrast(column=column, baseline=baseline, group_to_compare=group_to_compare) res = model.test_contrasts(contrast_vec) except Exception as e: # noqa: BLE001 - logger.warning(f"Nhood {j}: DE test failed ({e}); skipping.") + # Keep the message stable so similar small-sample failures collapse into one bucket. + key = str(e).split("\n", 1)[0][:120] + failures.setdefault(key, []).append(int(j)) continue gene_pos = pd.Series(np.arange(n_genes), index=var_names) @@ -715,11 +721,18 @@ def de_nhoods( ok = ~np.isnan(gi) gi = gi[ok].astype(int) logfc[j, gi] = res.loc[ok, "log_fc"].to_numpy(dtype=np.float32) - pvals[j, gi] = res.loc[ok, "p_value"].to_numpy(dtype=np.float32) + pvals[j, gi] = res.loc[ok, "p_value"].to_numpy(dtype=np.float64) if "adj_p_value" in res.columns: - padj_genes[j, gi] = res.loc[ok, "adj_p_value"].to_numpy(dtype=np.float32) + padj_genes[j, gi] = res.loc[ok, "adj_p_value"].to_numpy(dtype=np.float64) test_performed[j] = True + if failures: + total = sum(len(v) for v in failures.values()) + logger.warning( + f"de_nhoods: {total} of {len(nhood_ix)} nhoods skipped " + f"(see `obs['test_performed'] == False`); commonest reason: {max(failures, key=lambda k: len(failures[k]))!r}." + ) + # Backfill BH across genes for solvers that did not provide it from statsmodels.stats.multitest import multipletests From 350a0ed07fcedb375abd4a2d57b90085c5c02459 Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Thu, 28 May 2026 10:19:03 +0200 Subject: [PATCH 10/11] docs: point tutorials submodule at pertpy-tutorials main The miloDE tutorial section landed via scverse/pertpy-tutorials#61 (squashed to d2ab4bf on main); move the pinned commit from the feature-branch tip to the merged main commit. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/tutorials/notebooks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/notebooks b/docs/tutorials/notebooks index a0b9e848..d2ab4bfb 160000 --- a/docs/tutorials/notebooks +++ b/docs/tutorials/notebooks @@ -1 +1 @@ -Subproject commit a0b9e848d791c4cd4a9ec808c8b4a492b5624111 +Subproject commit d2ab4bfbd1bcc18eaf977766117ba5fff62804f8 From b381e4611f639c9f122f5ffc5e936d5a8625aec8 Mon Sep 17 00:00:00 2001 From: Lukas Heumos Date: Thu, 28 May 2026 10:35:11 +0200 Subject: [PATCH 11/11] docs: regenerate de_nhoods preview with kang_2018 / ISG15 Matches the tutorial example. The synthetic-data version was less informative. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../milo_de_nhoods_nhood_graph.png | Bin 24059 -> 58718 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/_static/docstring_previews/milo_de_nhoods_nhood_graph.png b/docs/_static/docstring_previews/milo_de_nhoods_nhood_graph.png index e5790a1ca51d1aac89bb97c60150a35ab6f8bc2a..e6b90307dfe56b4487c852e85a2ce2d8ee713956 100644 GIT binary patch literal 58718 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 X~ve$yyPu*T2D^{3@{7Y}1?D+>8h8$l7W%XJ=<& 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 B!><4U literal 24059 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