sc-metacell
Load when aggregating single cells into metacells (sample-aware coarse-grained pseudo-cells) on a normalised scRNA AnnData via SEACells or KMeans on a low-D embedding. Skip when ranking marker genes p
SKILL.mdskills/sc-metacell/SKILL.md
GitHubsc-metacell
When to use
The user has a normalised scRNA AnnData with a low-D embedding
(obsm["X_pca"] by default) and wants compact metacell aggregates
suitable for downstream GRN inference, slow-RNA-velocity analysis, or
robust cluster-level statistics that need fewer but higher-coverage
units. Two methods:
seacells(default) — kernel archetypal analysis with iterative refinement (--min-iter/--max-iter). Aggregates similar cells into archetypes. Auto-falls back tokmeansif the SEACells package isn't installed.kmeans— KMeans clustering on the embedding; faster, no SEACells dependency.
Output is a new AnnData (madata) where each row is one metacell.
For per-cluster marker discovery on the original AnnData, use
sc-markers. For ordering cells, use sc-pseudotime.
Inputs & Outputs
<!-- AUTO-GENERATED from skill.yaml (interface) — do not edit by hand. Regenerate: python scripts/generate_skill_md.py <skill_dir> -->Inputs
- Modalities: scrna
- File types:
.h5ad - Requires a preprocessed AnnData (
Xnormalised, PCA/neighbours present)
Outputs
tables/cell_metadata.csvtables/cell_to_metacell.csvtables/centroid_points.csvtables/embedding_points.csvtables/metacell_summary.csvfigures/metacell_centroids.pngfigures/metacell_size_distribution.pngfigures/r_embedding_discrete.pnganalysis_summary.txtmetacells.h5admetacells_annotated.h5adprocessed.h5adreport.mdresult.json- Processed AnnData (
saves_h5ad) — addsobs:metacell
Flow
- SEACells fallback check: try
import SEACells; if it fails, silently switch--methodtokmeans. - Load AnnData (
--input) or build a demo. - Preflight:
obsm[--use-rep]exists;--n-metacellsis< n_cellsand≥ 2; warn if nolayers["counts"]. - For SEACells: run kernel archetypal analysis with
--min-iter/--max-iter; for KMeans: cluster the embedding. - Aggregate cell-level expression into metacell-level expression (sum over
layers["counts"]if present, else.X). - Build per-metacell summary (size, dominant
--celltype-keylabel). - Save metacell AnnData, tables, figures,
report.md,result.json.
Gotchas
--method seacellssilently auto-falls back tokmeansif SEACells isn't installed.sc_metacell.py:326-332catchesImportErrorfromimport SEACellsand logs a warning, then setsargs.method = "kmeans". The actually-used method is recorded inresult.json["method"](the post-fallback value), but the request-vs-execute distinction isn't preserved as separate keys here. Inspect logs / report.md to confirm.- All preflight failures
raise SystemExit(1), notValueError.sc_metacell.py:113raisesSystemExit(1)whenobsm[--use-rep]is missing (with available-embedding hint);:123raises when--n-metacells >= n_cells(with a sane suggested value);:128raises when--n-metacells < 2;:340raisesSystemExit("Provide --input or use --demo"). Wrappers expectingValueErrorneed to catchSystemExit. processed.h5adis the cell-level AnnData with metacell labels — NOT the metacell-aggregated AnnData.sc_metacell.py:463saves the originaladata(withobs["metacell"]added) toprocessed.h5ad;sc_metacell.py:393writes the aggregated metacell-shapemadatatotables/metacells.h5ad. Downstream skills likesc-de/sc-enrichment(advertised in the next-step block atsc_metacell.py:534-535) consumeprocessed.h5ad, not the aggregated shape — passtables/metacells.h5adexplicitly when you actually need per-metacell rows.- Aggregation prefers
layers["counts"]over.X. The preflight warns iflayers["counts"]is absent (sc_metacell.py:131-134); when it's missing the script aggregates from.X(typically log-normalised) which is mathematically less defensible than summing raw counts. --celltype-keydefaults toleiden.sc_metacell.py:77defaults toleiden; if your AnnData has labels under a different key (e.g.,cell_type), pass--celltype-key cell_typeso the per-metacell "dominant cell type" column is meaningful.
Key CLI
# Demo
python omicsclaw.py run sc-metacell --demo --output /tmp/sc_metacell_demo
# Default SEACells, 30 metacells
python omicsclaw.py run sc-metacell \
--input clustered.h5ad --output results/
# KMeans (fast, no SEACells dependency)
python omicsclaw.py run sc-metacell \
--input clustered.h5ad --output results/ \
--method kmeans --n-metacells 50
# Use Harmony-corrected embedding + custom celltype key
python omicsclaw.py run sc-metacell \
--input integrated.h5ad --output results/ \
--use-rep X_harmony --celltype-key cell_type --n-metacells 100
# More refinement iterations for SEACells (slower, smoother archetypes)
python omicsclaw.py run sc-metacell \
--input clustered.h5ad --output results/ \
--min-iter 20 --max-iter 60
See also
references/parameters.md— every CLI flag, SEACells vs KMeans tunablesreferences/methodology.md— when metacells help; SEACells archetypal mathreferences/output_contract.md—madata.obsschema; cell-to-metacell map columns- Adjacent skills:
sc-clustering(upstream — producesobs["leiden"]for the celltype-key default),sc-batch-integration(upstream — producesX_harmonyembedding for--use-rep),sc-grn(downstream — GRN inference is more stable on metacells than single cells),sc-de(parallel — sample-aware DE between conditions; complements per-metacell aggregation)