1313from ..._utils import _doc_params , get_literal_vals , is_backed_type
1414from ..._utils .random import _accepts_legacy_random_state , _legacy_random_state
1515from ...get import _check_mask , _get_obs_rep
16- from .._docs import doc_mask_var_hvg
16+ from .._docs import doc_mask_var
1717from ._compat import _pca_compat_sparse
1818
1919if TYPE_CHECKING :
5151type SvdSolver = SvdSolvDaskML | SvdSolvSkearn | SvdSolvPCACustom
5252
5353
54- @_doc_params (mask_var_hvg = doc_mask_var_hvg , rng = doc_rng )
54+ @_doc_params (mask_var = doc_mask_var , rng = doc_rng )
5555@_accepts_legacy_random_state (0 )
5656def pca ( # noqa: PLR0912, PLR0913, PLR0915
5757 data : AnnData | np .ndarray | CSBase ,
@@ -65,8 +65,9 @@ def pca( # noqa: PLR0912, PLR0913, PLR0915
6565 chunk_size : int | None = None ,
6666 rng : SeedLike | RNGLike | None = None ,
6767 return_info : bool = False ,
68- mask_var : NDArray [np .bool ] | str | None | Default = Default ("'highly_variable'" ),
69- use_highly_variable : bool | None = None ,
68+ mask_var : NDArray [np .bool ] | str | None | Default = Default (
69+ "adata.var.get('highly_variable')"
70+ ),
7071 dtype : DTypeLike = "float32" ,
7172 key_added : str | None | Default = Default (preset = ("pca" , "key_added" )),
7273 copy : bool = False ,
@@ -160,7 +161,7 @@ def pca( # noqa: PLR0912, PLR0913, PLR0915
160161 return_info
161162 Only relevant when not passing an :class:`~anndata.AnnData`:
162163 see “Returns”.
163- {mask_var_hvg }
164+ {mask_var }
164165 layer
165166 Layer of `adata` to use as expression values.
166167 dtype
@@ -224,11 +225,12 @@ def pca( # noqa: PLR0912, PLR0913, PLR0915
224225 else :
225226 adata = AnnData (data )
226227
227- # Unify new mask argument and deprecated use_highly_varible argument
228- mask_var_param , mask_var = _handle_mask_var (
229- adata , mask_var , obsm = obsm , use_highly_variable = use_highly_variable
230- )
231- del use_highly_variable
228+ if isinstance (mask_var , Default ):
229+ mask_var = "highly_variable" if "highly_variable" in adata .var else None
230+ elif mask_var is not None and obsm is not None :
231+ msg = "Argument `mask_var` is incompatible with `obsm`."
232+ raise ValueError (msg )
233+ mask_var_param , mask_var = mask_var , _check_mask (adata , mask_var , "var" )
232234 adata_comp = adata [:, mask_var ] if mask_var is not None else adata
233235
234236 if n_comps is None :
@@ -355,7 +357,6 @@ def pca( # noqa: PLR0912, PLR0913, PLR0915
355357 adata .uns [key_uns ] = dict (
356358 params = dict (
357359 zero_center = zero_center ,
358- use_highly_variable = mask_var_param == "highly_variable" ,
359360 mask_var = mask_var_param ,
360361 ** (dict (layer = layer ) if layer is not None else {}),
361362 ** (dict (obsm = obsm ) if obsm is not None else {}),
@@ -387,49 +388,6 @@ def pca( # noqa: PLR0912, PLR0913, PLR0915
387388 return x_pca
388389
389390
390- def _handle_mask_var (
391- adata : AnnData ,
392- mask_var : NDArray [np .bool ] | str | None | Default ,
393- * ,
394- obsm : str | None = None ,
395- use_highly_variable : bool | None ,
396- ) -> tuple [np .ndarray | str | None , np .ndarray | None ]:
397- """Unify new mask argument and deprecated use_highly_varible argument.
398-
399- Returns both the normalized mask parameter and the validated mask array.
400- """
401- if obsm :
402- if not isinstance (mask_var , Default ) and mask_var is not None :
403- msg = "Argument `mask_var` is incompatible with `obsm`."
404- raise ValueError (msg )
405- return None , None
406-
407- # First, verify and possibly warn
408- if use_highly_variable is not None :
409- hint = (
410- 'Use_highly_variable=True can be called through mask_var="highly_variable". '
411- "Use_highly_variable=False can be called through mask_var=None"
412- )
413- msg = f"Argument `use_highly_variable` is deprecated, consider using the mask argument. { hint } "
414- warn (msg , FutureWarning )
415- if not isinstance (mask_var , Default ):
416- msg = f"These arguments are incompatible. { hint } "
417- raise ValueError (msg )
418-
419- # Handle default case and explicit use_highly_variable=True
420- if use_highly_variable or (
421- use_highly_variable is None
422- and isinstance (mask_var , Default )
423- and "highly_variable" in adata .var .columns
424- ):
425- mask_var = "highly_variable"
426-
427- # Without highly variable genes, we don’t use a mask by default
428- if isinstance (mask_var , Default ) or mask_var is None :
429- return None , None
430- return mask_var , _check_mask (adata , mask_var , "var" )
431-
432-
433391@overload
434392def _handle_dask_ml_args (
435393 svd_solver : str | None , method : type [dmld .PCA | dmld .IncrementalPCA ]
0 commit comments