Trajectory & RNA velocity: PAGA, Palantir, VIA, dynamo, scVelo, latentvelo, graphvelo backends via ov.single.Velo. Pseudotime, stream plots.
This skill describes how to reproduce and extend the single-trajectory analysis workflow in omicverse, combining graph-based trajectory inference, RNA velocity coupling, and downstream fate scoring notebooks.
pp.neighbors) on the preprocessed AnnData object.tl.paga to compute cluster connectivity and tl.draw_graph or tl.umap with init_pos='paga' for embedding.Palantir on diffusion components, seeding with manually selected start cells (e.g., naïve T cells).via.VIA on the kNN graph to identify lineage progression with automatic root selection or user-defined roots.scv.pp.filter_and_normalize, scv.pp.moments, and scv.tl.velocity to generate velocity layers.adata.layers['velocity'] to refine lineage directionality (via.VIA(..., velocity_weight=...)).scv.tl.latent_time) to validate directionality and root selection.OmicVerse provides a unified Velo class wrapping 4 velocity backends. Use this when you need more than basic scVelo:
| Backend | Best for | GPU? | Prerequisites |
|---|---|---|---|
| scvelo | Standard velocity analysis | No | spliced/unspliced layers |
| dynamo | Kinetics modeling, vector fields | No | spliced/unspliced layers |
| latentvelo | VAE-based, batch correction, complex dynamics | Yes (torchdiffeq) | celltype_key, batch_key optional |
| graphvelo | Refinement layer on top of any backend | No | base velocity + connectivities |
import omicverse as ov
velo = ov.single.Velo(adata)
# 1. Filter (scvelo backend) or preprocess (dynamo backend)
velo.filter_genes(min_shared_counts=20) # For scvelo
# velo.preprocess(recipe='monocle', n_neighbors=30, n_pcs=30) # For dynamo
# 2. Compute moments
velo.moments(backend='scvelo', n_pcs=30, n_neighbors=30)
# backend: 'scvelo' or 'dynamo'
# 3. Fit kinetic parameters
velo.dynamics(backend='scvelo')
# 4. Calculate velocity
velo.cal_velocity(method='scvelo')
# method: 'scvelo', 'dynamo', 'latentvelo', 'graphvelo'
# 5. Build velocity graph and project to embedding
velo.velocity_graph(basis='umap')
velo.velocity_embedding(basis='umap')
latentvelo uses a VAE + neural ODE to learn latent dynamics. It handles batch effects and complex trajectories better than classical scVelo:
velo.cal_velocity(
method='latentvelo',
celltype_key='cell_type', # Optional: AnnotVAE uses cell type info
batch_key='batch', # Optional: batch correction
velocity_key='velocity_S',
n_top_genes=2000,
latentvelo_VAE_kwargs={}, # Pass custom VAE hyperparameters
)
# Requires: pip install torchdiffeq
# Uses GPU if available, falls back to CPU
GraphVelo refines velocity estimates from any base method by leveraging the cell graph structure. Run it after scvelo or dynamo:
# First: compute base velocity with scvelo or dynamo
velo.cal_velocity(method='scvelo')
# Then: refine with graphvelo
velo.graphvelo(
xkey='Ms', # Spliced moments key
vkey='velocity_S', # Base velocity key to refine
basis_keys=['X_umap', 'X_pca'], # Project to multiple embeddings
gene_subset=None, # Optional: restrict to gene subset
)
search_skills('CellFateGenie fate genes') to load the dedicated CellFateGenie skill.t_metacells.ipynb: Aggregate metacell trajectories for robustness checks and meta-state differential expression.t_cytotrace.ipynb: Integrate CytoTRACE differentiation potential with velocity-informed lineages for maturation scoring.sc.pp.normalize_total, sc.pp.log1p).sc.pp.highly_variable_genes).scvi-tools, bbknn).n_neighbors and n_pcs should be harmonized across PAGA, VIA, and Palantir to maintain consistency.knn, too_big_factor, and root_user for datasets with uneven sampling.threshold to control edge sparsity; ensure connected components reflect biological branches.mode='stochastic' vs mode='dynamical' in scVelo; recalibrate if terminal states disagree with VIA.scv.pl.paga) and annotate branch labels.via.plot_fates and via.plot_scatter.# Before PAGA: verify neighbor graph exists
assert 'neighbors' in adata.uns, "Neighbor graph required. Run sc.pp.neighbors(adata) first."
# Before VIA velocity coupling: verify velocity layers exist
if 'velocity' not in adata.layers:
print("WARNING: velocity layer missing. Run scv.tl.velocity(adata) first for VIA coupling.")
assert 'spliced' in adata.layers and 'unspliced' in adata.layers, \
"Missing spliced/unspliced layers. Check loom/H5AD import preserved velocity layers."
# Before Palantir: verify PCA/diffusion components
assert 'X_pca' in adata.obsm, "PCA required. Run ov.pp.pca(adata) first."
scv.pp.moments and scv.tl.velocity ensuring adata.layers['spliced']/['unspliced'] exist; verify loom/H5AD import preserved layers.n_neighbors; confirm batch correction didn’t fragment the manifold.cluster_graph_pruning_iter), or provide manual terminal state hints based on marker expression.ImportError: torchdiffeq: Install with pip install torchdiffeq. Required for neural ODE backend.preprocess fails: dynamo expects spliced/unspliced layers. Verify with 'spliced' in adata.layers.