Skip to content

Commit a0c2e55

Browse files
committed
a
1 parent 2d6c994 commit a0c2e55

File tree

1 file changed

+36
-3
lines changed

1 file changed

+36
-3
lines changed

src/pyXenium/io/partial_xenium_loader.py

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -373,13 +373,24 @@ def load_anndata_from_partial(
373373
analysis_zarr: Optional[os.PathLike | str] = None,
374374
cells_zarr: Optional[os.PathLike | str] = None,
375375
transcripts_zarr: Optional[os.PathLike | str] = None,
376+
*,
377+
base_dir: Optional[os.PathLike | str] = None,
378+
analysis_name: str = "analysis.zarr",
379+
cells_name: str = "cells.zarr",
380+
transcripts_name: str = "transcripts.zarr",
376381
cluster_key: str = "Cluster",
377382
sample: Optional[str] = None,
378383
keep_unassigned: bool = True,
379384
build_counts_if_missing: bool = True,
380385
) -> AnnData:
381386
"""Create an AnnData from any combination of partial Xenium artifacts.
382387
388+
**New (2025-09-22):** You can now pass a common ``base_dir`` and just override
389+
default filenames via ``analysis_name``, ``cells_name``, and ``transcripts_name``.
390+
For backward compatibility, explicit path arguments (``analysis_zarr``/``cells_zarr``/``transcripts_zarr``)
391+
still work and will take precedence over ``base_dir`` + names.
392+
393+
383394
Parameters
384395
----------
385396
mex_dir : path-like, optional
@@ -404,9 +415,31 @@ def load_anndata_from_partial(
404415
AnnData
405416
"""
406417
mex_dir_p = _p(mex_dir)
407-
analysis_p = _p(analysis_zarr)
408-
cells_p = _p(cells_zarr)
409-
transcripts_p = _p(transcripts_zarr)
418+
419+
# Resolve zarr paths with precedence: explicit path -> base_dir + name -> try .zarr.zip fallback
420+
def _resolve_zarr(explicit: Optional[os.PathLike | str], name: str) -> Optional[Path]:
421+
if explicit is not None:
422+
return _p(explicit)
423+
if base_dir is None:
424+
return None
425+
base = _p(base_dir)
426+
assert base is not None
427+
cand = base / name
428+
if cand.exists():
429+
return cand
430+
# if user passed e.g. "analysis.zarr", also try zipped variant automatically, and vice versa
431+
alt = None
432+
if name.endswith(".zarr"):
433+
alt = base / f"{name}.zip"
434+
elif name.endswith(".zip"):
435+
alt = base / name[:-4]
436+
if alt is not None and alt.exists():
437+
return alt
438+
return cand # return the non-existing candidate for provenance/debugging
439+
440+
analysis_p = _resolve_zarr(analysis_zarr, analysis_name)
441+
cells_p = _resolve_zarr(cells_zarr, cells_name)
442+
transcripts_p = _resolve_zarr(transcripts_zarr, transcripts_name)
410443

411444
if mex_dir_p is not None:
412445
adata = _load_mex(mex_dir_p)

0 commit comments

Comments
 (0)