@@ -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