sc_tools.pp — Preprocessing#
Modality-aware preprocessing with GPU auto-detection (rapids-singlecell, falls back to scanpy).
import sc_tools.pp as pp
# One-call recipe
pp.preprocess(adata, modality="visium", integration="scvi", batch_key="library_id")
# Or step-by-step
pp.backup_raw(adata)
pp.normalize_total(adata)
pp.log_transform(adata)
pp.pca(adata)
pp.cluster(adata, resolution=0.8)
Recipe#
- sc_tools.pp.preprocess(adata, modality='visium', batch_key='library_id', integration='scvi', spatial_clustering=None, n_top_genes=2000, resolution=0.8, filter_patterns=None, use_gpu='auto', copy=False, **kwargs)[source]#
Modality-aware preprocessing pipeline.
Dispatches to a recipe based on
modality. Each recipe handles normalization, feature selection, batch integration, dimensionality reduction, and clustering appropriate for the data type.- Parameters:
adata (
AnnData) – Annotated data with raw counts/intensities inX.modality (
str) – Data modality:"visium","visium_hd","xenium","cosmx", or"imc".batch_key (
str) – Column inadata.obsfor batch/library identification.integration (
str) – Integration method:"scvi"(default),"harmony","cytovi"(IMC only), or"none".spatial_clustering (
str|None) – If"utag", run UTAG spatial-aware clustering after standard Leiden.n_top_genes (
int) – Number of highly variable genes to select (not used for IMC).resolution (
float) – Leiden clustering resolution.filter_patterns (
list[str] |None) – Gene name patterns to exclude. None uses modality defaults.copy (
bool) – If True, operate on a copy and return it.**kwargs (
Any) –Extra arguments passed to integration and recipe-specific steps. Recognized keys:
strategy: explicitScaleStrategyinstance (default: auto-select).n_latent,n_layers,n_hidden,max_epochs,early_stopping: passed torun_scvi/run_cytovi.n_neighbors: passed toneighbors()(default 20).n_comps: number of PCA components (default 50).cofactor: arcsinh cofactor for IMC (default 5).skip_log1p: if True, skip log1p in Xenium recipe (default True).max_dist,utag_resolutions: passed torun_utag.hvg_flavor,hvg_batch_key: passed to HVG selection.
- Returns:
Preprocessed data with clustering, embeddings, and (optionally) batch-corrected latent space.
- Return type:
AnnData
Normalization#
- sc_tools.pp.backup_raw(adata)[source]#
Save a copy of the current adata to adata.raw (no-op if already set).
- sc_tools.pp.normalize_total(adata, target_sum=10000.0, inplace=True, **kwargs)[source]#
Library-size normalize counts per cell.
Wraps
scanpy.pp.normalize_total(orrapids_singlecell.pp.normalize_totalon GPU).- Parameters:
- Returns:
Modified adata if
inplace=False, else None.- Return type:
AnnData or None
- sc_tools.pp.log_transform(adata, base=None, inplace=True, **kwargs)[source]#
Apply log1p transformation.
Wraps
scanpy.pp.log1p(orrapids_singlecell.pp.log1pon GPU).
- sc_tools.pp.scale(adata, max_value=10, zero_center=True, inplace=True, **kwargs)[source]#
Zero-center and scale features to unit variance.
Wraps
scanpy.pp.scale(orrapids_singlecell.pp.scaleon GPU).- Parameters:
- Return type:
- sc_tools.pp.arcsinh_transform(adata, cofactor=5, inplace=True)[source]#
Arcsinh transform for mass cytometry (IMC) protein data.
Applies
arcsinh(X / cofactor)element-wise. This is the standard normalization for CyTOF / IMC data (NOT log1p).
- sc_tools.pp.filter_genes_by_pattern(adata, patterns=None, exclude=True, case_sensitive=False)[source]#
Remove (or keep) genes matching regex patterns in place.
- Parameters:
adata (
AnnData) – Annotated data. Modified in place.patterns (
list[str] |None) – List of regex patterns. Defaults to["^MT-", "^RP[SL]", "^HB[^(P)]"](mitochondrial, ribosomal, hemoglobin).exclude (
bool) – If True (default), remove matching genes. If False, keep only matching genes.case_sensitive (
bool) – If False (default), patterns are case-insensitive.
- Return type:
Integration#
All integration functions are soft dependencies; install hints are printed if the required package is missing.
- sc_tools.pp.run_scvi(adata, batch_key='library_id', n_latent=30, n_layers=2, n_hidden=128, max_epochs=400, early_stopping=True, use_gpu='auto', layer=None, **kwargs)[source]#
Run scVI batch integration.
Trains an scVI model on raw counts and stores the latent representation in
adata.obsm['X_scVI']. Model parameters are recorded inadata.uns['scvi_params'].Requires
scvi-tools:pip install sc-tools[deconvolution]- Parameters:
adata (
AnnData) – Annotated data with raw counts inX(unnormalized). Modified in place.batch_key (
str) – Column inadata.obsfor batch correction.n_latent (
int) – Dimensionality of the latent space.n_layers (
int) – Number of hidden layers.n_hidden (
int) – Number of units per hidden layer.max_epochs (
int) – Maximum training epochs.early_stopping (
bool) – If True, stop training when validation loss plateaus.layer (
str|None) – Layer inadata.layersto use. None usesX.**kwargs (
Any) – Passed toscvi.model.SCVI().
- Return type:
- sc_tools.pp.run_scanvi(adata, batch_key='library_id', labels_key='celltype', n_latent=30, max_epochs=200, use_gpu='auto', unlabeled_category='Unknown', scvi_model=None, **kwargs)[source]#
Run scANVI semi-supervised integration.
Initializes from a pre-trained scVI model (or trains one) and refines using cell type labels. Stores latent representation in
adata.obsm['X_scANVI'].Requires
scvi-tools:pip install sc-tools[deconvolution]- Parameters:
adata (
AnnData) – Annotated data with raw counts. Modified in place.batch_key (
str) – Column inadata.obsfor batch correction.labels_key (
str) – Column inadata.obswith cell type labels.n_latent (
int) – Dimensionality of the latent space.max_epochs (
int) – Maximum training epochs for scANVI fine-tuning.unlabeled_category (
str) – Label for unlabeled cells (default"Unknown").scvi_model (
Any|None) – Pre-trainedscvi.model.SCVImodel. If None, one is trained.**kwargs (
Any) – Passed toSCANVI.from_scvi_model().
- Return type:
- sc_tools.pp.run_harmony(adata, batch_key='library_id', basis='X_pca', key_added='X_pca_harmony', **kwargs)[source]#
Run Harmony integration on a PCA embedding.
Wraps
scanpy.external.pp.harmony_integrate. Stores corrected embedding inadata.obsm[key_added].Requires
harmonypy:pip install harmonypy- Parameters:
- Return type:
- sc_tools.pp.run_combat(adata, batch_key='library_id', key_added='X_pca_combat', n_pcs=50, **kwargs)[source]#
Run ComBat batch correction followed by PCA.
Wraps
scanpy.pp.combat(). Correctsadata.Xin-place, then re-runs PCA and stores the result inadata.obsm[key_added].- Parameters:
adata (
AnnData) – Annotated data (log-normalized). Modified in place.batch_key (
str) – Column inadata.obsfor batch correction.key_added (
str) – Key for the PCA embedding of corrected data inobsm.n_pcs (
int) – Number of PCs to compute after correction.**kwargs (
Any) – Passed toscanpy.pp.combat.
- Return type:
- sc_tools.pp.run_bbknn(adata, batch_key='library_id', neighbors_within_batch=3, **kwargs)[source]#
Run BBKNN batch-balanced k-nearest-neighbors graph construction.
Wraps
bbknn.bbknn(). Modifies the neighbor graph inobspand runs UMAP, storing coordinates inadata.obsm['X_umap_bbknn'].BBKNN is graph-based and does not produce a latent embedding. For benchmarking, the UMAP coordinates are used as a proxy.
Requires
bbknn:pip install bbknn
- sc_tools.pp.run_scanorama(adata, batch_key='library_id', key_added='X_scanorama', **kwargs)[source]#
Run Scanorama integration.
Wraps
scanorama.integrate_scanpy()orscanpy.external.pp.scanorama_integrate. Stores corrected embedding inadata.obsm[key_added].Requires
scanorama:pip install scanorama
- sc_tools.pp.run_cytovi(adata, batch_key='library_id', n_latent=20, max_epochs=300, use_gpu='auto', **kwargs)[source]#
Run CytoVI for mass cytometry / IMC protein data integration.
CytoVI is a totalVI-inspired model from scvi-tools designed for protein marker data. Stores latent representation in
adata.obsm['X_cytovi'].Requires
scvi-tools:pip install sc-tools[deconvolution]- Parameters:
- Return type:
- sc_tools.pp.integrate.run_imc_phenotyping(adata, batch_key='sample', roi_key='roi', z_score_per='roi', z_score_cap=3.0, key_added='X_pca_imc_phenotyping', n_pcs=50, **kwargs)[source]#
Run ElementoLab IMC phenotyping batch correction pipeline.
Reproduces the batch correction from
imc.ops.clustering.phenotyping()(ElementoLab/imc). Pipeline: log1p -> per-ROI z-score (capped) -> global scale -> ComBat -> scale -> PCA -> BBKNN (batch-aware neighbors).Stores corrected PCA in
adata.obsm[key_added]and batch-aware neighbor graph inobsp.- Parameters:
adata (
AnnData) – Annotated data with raw or arcsinh-normalized intensities. Modified in place (X is overwritten with corrected values).batch_key (
str) – Column inadata.obsfor batch correction (ComBat + BBKNN).roi_key (
str) – Column inadata.obsfor per-ROI z-scoring. Falls back tobatch_keyif not present.z_score_per (
str) – Z-score within"roi"(default) or"sample"groups.z_score_cap (
float) – Cap z-scores at ±this value. Default 3.0.key_added (
str) – Key for the corrected PCA embedding inobsm.n_pcs (
int) – Number of PCs to compute after correction.**kwargs (
Any) – Passed toscanpy.pp.combat.
- Return type:
Dimensionality Reduction and Clustering#
- sc_tools.pp.pca(adata, n_comps=50, use_highly_variable=True, **kwargs)[source]#
Run PCA on the data.
Wraps
scanpy.tl.pca(orrapids_singlecell.tl.pcaon GPU).
- sc_tools.pp.neighbors(adata, n_neighbors=20, use_rep=None, **kwargs)[source]#
Compute K-nearest neighbors graph.
Wraps
scanpy.pp.neighbors(orrapids_singlecell.pp.neighborson GPU). Auto-detectsuse_rep: X_scVI > X_cytovi > X_pca_harmony > X_pca.
- sc_tools.pp.umap(adata, **kwargs)[source]#
Compute UMAP embedding.
Wraps
scanpy.tl.umap(orrapids_singlecell.tl.umapon GPU).
- sc_tools.pp.leiden(adata, resolution=0.8, key_added='leiden', **kwargs)[source]#
Run Leiden clustering.
Wraps
scanpy.tl.leiden(orrapids_singlecell.tl.leidenon GPU).
- sc_tools.pp.cluster(adata, resolution=0.8, use_rep=None, n_neighbors=20, key_added='leiden', run_umap=True, random_state=0, **kwargs)[source]#
Convenience: neighbors + leiden + umap in one call.
- Parameters:
adata (
AnnData) – Annotated data. Modified in place.resolution (
float) – Leiden resolution.use_rep (
str|None) – Representation for neighbor graph. Auto-detected if None.n_neighbors (
int) – Number of neighbors.key_added (
str) – Key for cluster labels inadata.obs.run_umap (
bool) – If True (default), compute UMAP embedding.random_state (
int) – Random state for Leiden reproducibility (D-14, PRV-05).**kwargs (
Any) – Extra kwargs passed toneighbors().
- Return type:
- sc_tools.pp.run_utag(adata, max_dist=20, slide_key='library_id', clustering_method='leiden', resolutions=None, key_added='utag', **kwargs)[source]#
Run UTAG spatial-aware clustering.
UTAG builds an adjacency graph from spatial coordinates, performs message passing to aggregate neighborhood features, then clusters to identify microanatomical domains. Runs after standard Leiden as a complementary spatial-aware annotation.
Requires
utagpackage:pip install git+https://github.com/ElementoLab/utag.git@main- Parameters:
adata (
AnnData) – Annotated data withobsm['spatial']. Modified in place.max_dist (
float) – Distance threshold for cell adjacency. 10-20 for IMC, 10-100 for transcriptomics.slide_key (
str|None) – Batch key for multi-image processing. None for single image.clustering_method (
str) – Clustering method (“leiden” or “parc”).resolutions (
list[float] |None) – List of resolutions to explore. Defaults to[0.5, 0.8, 1.0].key_added (
str) – Prefix for cluster labels inadata.obs.**kwargs (
Any) – Passed toutag.utag.
- Return type: