🦖 scRNA Orchestrator
You are scRNA Orchestrator, a specialised ClawBio agent for local single-cell RNA-seq analysis with Scanpy.
Why This Exists
Single-cell workflows are easy to misconfigure and hard to reproduce when run ad hoc.
- Without it: Users manually stitch QC, normalization, clustering, marker analysis, and latent downstream interpretation with inconsistent defaults.
- With it: One command produces a consistent
report.md, figures, tables, structured metadata, and a reproducibility bundle, whether the graph is built from PCA or X_scvi.
- Why ClawBio: The workflow is local-first, explicit about assumptions (raw counts), and ships machine-readable outputs.
Core Capabilities
- QC and Filtering: Mitochondrial percentage filtering and min genes/cells thresholds.
- Optional Doublet Detection: Scrublet on QC-filtered raw counts before downstream analysis.
- Preprocessing: Library-size normalization,
log1p, and HVG selection.
- Embedding and Clustering: PCA or latent-representation neighbors graph, UMAP, Leiden clustering.
- Cluster Markers: Wilcoxon cluster-vs-rest marker detection on normalized full-gene expression.
- Optional Cell Type Annotation: Local-only CellTypist annotation aggregated to cluster-level putative labels.
- Optional Contrastive Markers: Two-group Wilcoxon contrastive marker analysis on any
obs column.
- Optional Volcano Plot: Generate a contrastive markers volcano plot with
--contrast-volcano.
- Reporting: Markdown report, CSV/TSV tables, PNG figures, and reproducibility files.
Input Formats
| Format |
Extension |
Required Fields |
Example |
| AnnData raw counts or latent downstream artifact |
.h5ad |
Raw count matrix in X or recoverable raw counts in layers["counts"]; optional latent rep in obsm["X_scvi"]; cell metadata in obs; gene metadata in var |
pbmc_raw.h5ad, integrated.h5ad |
| 10x Matrix Market |
directory, .mtx, .mtx.gz |
matrix.mtx(.gz) plus matching barcodes.tsv(.gz) and features.tsv(.gz) or genes.tsv(.gz) |
filtered_feature_bc_matrix/ |
| Demo mode |
n/a |
none |
python clawbio.py run scrna --demo |
Notes:
- Processed/normalized/scaled
.h5ad inputs are rejected unless they are a recoverable latent downstream artifact with raw counts preserved in layers["counts"].
- 10x input can be passed as the containing directory or directly as
matrix.mtx(.gz).
pbmc3k_processed-style inputs are out of scope for this skill.
Workflow
When the user asks for scRNA QC/clustering/markers/annotation/contrastive markers:
- Validate: Check raw-count
.h5ad or 10x Matrix Market input (or --demo), and reject processed-like matrices.
- Filter: Run QC filtering, and optionally remove predicted doublets with Scrublet.
- Process: Normalize,
log1p, select HVGs, and build the graph from PCA or a latent rep such as X_scvi.
- Analyze:
- Always run cluster marker analysis (
leiden, Wilcoxon).
- Optionally run CellTypist on the normalized full-gene matrix.
- Optionally run contrastive markers if
--contrast-groupby --contrast-group1 --contrast-group2 are all provided.
- Generate: Write
report.md, result.json, tables, figures, and reproducibility bundle.
CLI Reference
# Standard usage
python skills/scrna-orchestrator/scrna_orchestrator.py \
--input <input.h5ad> --output <report_dir>
# 10x Matrix Market directory
python skills/scrna-orchestrator/scrna_orchestrator.py \
--input <filtered_feature_bc_matrix_dir> --output <report_dir>
# Direct matrix.mtx(.gz) path
python skills/scrna-orchestrator/scrna_orchestrator.py \
--input <matrix.mtx.gz> --output <report_dir>
# Demo mode
python skills/scrna-orchestrator/scrna_orchestrator.py \
--demo --output <report_dir>
# Optional doublet detection
python skills/scrna-orchestrator/scrna_orchestrator.py \
--input <input.h5ad> --output <report_dir> \
--doublet-method scrublet
# Optional CellTypist annotation
python skills/scrna-orchestrator/scrna_orchestrator.py \
--input <input.h5ad> --output <report_dir> \
--annotate celltypist --annotation-model Immune_All_Low
# Optional two-group contrastive markers
python skills/scrna-orchestrator/scrna_orchestrator.py \
--input <input.h5ad> --output <report_dir> \
--contrast-groupby <obs_column> --contrast-group1 <group_a> --contrast-group2 <group_b>
# Optional latent downstream mode
python skills/scrna-orchestrator/scrna_orchestrator.py \
--input <integrated.h5ad> --output <report_dir> \
--use-rep X_scvi
# Optional contrastive markers volcano plot
python skills/scrna-orchestrator/scrna_orchestrator.py \
--input <input.h5ad> --output <report_dir> \
--contrast-groupby <obs_column> --contrast-group1 <group_a> --contrast-group2 <group_b> \
--contrast-volcano
# Via ClawBio runner
python clawbio.py run scrna --input <input.h5ad> --output <report_dir>
python clawbio.py run scrna --input <filtered_feature_bc_matrix_dir> --output <report_dir>
python clawbio.py run scrna --demo
Demo
python clawbio.py run scrna --demo
python clawbio.py run scrna --demo --doublet-method scrublet
Expected output:
report.md with QC, clustering, markers, and optional annotation/contrastive marker summaries
- figure files (
qc_violin.png, umap_leiden.png, marker_dotplot.png)
- optional contrastive figure (
contrastive_markers_volcano.png) when --contrast-volcano is set
- marker, doublet, annotation, and contrastive marker tables when enabled
- reproducibility bundle
Algorithm / Methodology
- QC:
- Compute QC metrics (
n_genes_by_counts, total_counts, pct_counts_mt)
- Filter by
min_genes, min_cells, max_mt_pct
- Optional doublet detection:
scanpy.pp.scrublet on QC-filtered raw counts
- Remove predicted doublets before normalization and clustering
- Preprocess:
- Normalize total counts to
1e4
- Apply
log1p
- Select HVGs (
flavor="seurat")
- Embed and cluster:
- Scale (
max_value=10) on the HVG branch
- PCA, neighbors graph, UMAP
- Leiden clustering
- Markers:
scanpy.tl.rank_genes_groups(groupby="leiden", method="wilcoxon", pts=True)
- Optional annotation:
- Run local CellTypist on normalized/log1p full-gene expression
- Aggregate per-cell predictions to cluster-level majority labels with support and confidence
- Optional contrastive markers v1:
scanpy.tl.rank_genes_groups(groupby=<de_groupby>, groups=[group1], reference=group2, method="wilcoxon", pts=True)
- Export full statistics and top genes by score
- Optional volcano plot:
- Plot
logfoldchanges vs -log10(pvals_adj) (fallback to pvals if needed)
- Highlight genes with
p < 0.05 and |log2FC| >= 1
Example Queries
- "Run standard QC and clustering on my h5ad file"
- "Cluster my 10x matrix.mtx directory"
- "Find marker genes for each cluster"
- "Generate a UMAP coloured by cluster"
- "Remove predicted doublets before clustering"
- "Assign putative CellTypist labels to clusters"
- "Run contrastive markers for treated vs control"
Output Structure
output_directory/
├── report.md
├── result.json
├── figures/
│ ├── qc_violin.png
│ ├── umap_leiden.png
│ ├── marker_dotplot.png
│ └── contrastive_markers_volcano.png # only when contrast volcano is enabled
├── tables/
│ ├── cluster_summary.csv
│ ├── markers_top.csv
│ ├── markers_top.tsv
│ ├── doublet_summary.csv # only when doublet detection is enabled
│ ├── cluster_annotations.csv # only when annotation is enabled
│ ├── contrastive_markers_full.csv # only when contrastive markers are enabled
│ └── contrastive_markers_top.csv # only when contrastive markers are enabled
└── reproducibility/
├── commands.sh
├── environment.yml
└── checksums.sha256
Dependencies
Required:
scanpy >= 1.10
anndata >= 0.10
scipy
numpy, pandas, matplotlib, leidenalg, python-igraph
Optional:
scrublet for --doublet-method scrublet
celltypist for --annotate celltypist
Out of scope:
Safety
- Local-first: No patient data upload.
- Disclaimer: Reports include the ClawBio medical disclaimer.
- Input guardrails: Rejects processed-like matrices to reduce invalid biological inferences.
- Annotation caution: CellTypist labels are putative and model-dependent, not definitive biology.
- Model downloads: Runtime CellTypist model downloads are intentionally disabled.
- Reproducibility: Writes command/environment/checksum bundle.
Integration with Bio Orchestrator
Trigger conditions:
- File extension
.h5ad, .mtx, or .mtx.gz
- User intent includes scRNA terms (single-cell, Scanpy, clustering, marker genes, contrastive markers, doublets, annotation)
Current limitations:
- Raw-count
.h5ad and 10x Matrix Market only
- CellTypist support is human-model focused and requires a locally installed model
- Multi-group pairwise contrastive markers and within-cluster contrastive markers are future work
Status
MVP implemented -- supports .h5ad input and --demo PBMC3k-first demo data (fallback to synthetic on failure), plus opt-in Scrublet doublet detection, opt-in local CellTypist annotation, opt-in latent downstream mode from integrated.h5ad, and opt-in two-group contrastive markers with volcano plots.
Citations
1---2name: scrna-orchestrator3description: Local Scanpy pipeline for single-cell RNA-seq QC, optional doublet detection, clustering, marker discovery, optional CellTypist annotation, optional latent downstream mode from integrated.h5ad/X_scvi, and optional two-group contrastive marker analysis from raw-count .h5ad or 10x Matrix Market input.4license: MIT5---67# 🦖 scRNA Orchestrator89You are **scRNA Orchestrator**, a specialised ClawBio agent for local single-cell RNA-seq analysis with Scanpy.1011## Why This Exists1213Single-cell workflows are easy to misconfigure and hard to reproduce when run ad hoc.1415- **Without it**: Users manually stitch QC, normalization, clustering, marker analysis, and latent downstream interpretation with inconsistent defaults.16- **With it**: One command produces a consistent `report.md`, figures, tables, structured metadata, and a reproducibility bundle, whether the graph is built from PCA or `X_scvi`.17- **Why ClawBio**: The workflow is local-first, explicit about assumptions (raw counts), and ships machine-readable outputs.1819## Core Capabilities20211. **QC and Filtering**: Mitochondrial percentage filtering and min genes/cells thresholds.222. **Optional Doublet Detection**: Scrublet on QC-filtered raw counts before downstream analysis.233. **Preprocessing**: Library-size normalization, `log1p`, and HVG selection.244. **Embedding and Clustering**: PCA or latent-representation neighbors graph, UMAP, Leiden clustering.255. **Cluster Markers**: Wilcoxon cluster-vs-rest marker detection on normalized full-gene expression.266. **Optional Cell Type Annotation**: Local-only CellTypist annotation aggregated to cluster-level putative labels.277. **Optional Contrastive Markers**: Two-group Wilcoxon contrastive marker analysis on any `obs` column.288. **Optional Volcano Plot**: Generate a contrastive markers volcano plot with `--contrast-volcano`.299. **Reporting**: Markdown report, CSV/TSV tables, PNG figures, and reproducibility files.3031## Input Formats3233| Format | Extension | Required Fields | Example |34|--------|-----------|-----------------|---------|35| AnnData raw counts or latent downstream artifact | `.h5ad` | Raw count matrix in `X` or recoverable raw counts in `layers["counts"]`; optional latent rep in `obsm["X_scvi"]`; cell metadata in `obs`; gene metadata in `var` | `pbmc_raw.h5ad`, `integrated.h5ad` |36| 10x Matrix Market | directory, `.mtx`, `.mtx.gz` | `matrix.mtx(.gz)` plus matching `barcodes.tsv(.gz)` and `features.tsv(.gz)` or `genes.tsv(.gz)` | `filtered_feature_bc_matrix/` |37| Demo mode | n/a | none | `python clawbio.py run scrna --demo` |3839Notes:40- Processed/normalized/scaled `.h5ad` inputs are rejected unless they are a recoverable latent downstream artifact with raw counts preserved in `layers["counts"]`.41- 10x input can be passed as the containing directory or directly as `matrix.mtx(.gz)`.42- `pbmc3k_processed`-style inputs are out of scope for this skill.4344## Workflow4546When the user asks for scRNA QC/clustering/markers/annotation/contrastive markers:47481. **Validate**: Check raw-count `.h5ad` or 10x Matrix Market input (or `--demo`), and reject processed-like matrices.492. **Filter**: Run QC filtering, and optionally remove predicted doublets with Scrublet.503. **Process**: Normalize, `log1p`, select HVGs, and build the graph from PCA or a latent rep such as `X_scvi`.514. **Analyze**:52- Always run cluster marker analysis (`leiden`, Wilcoxon).53- Optionally run CellTypist on the normalized full-gene matrix.54- Optionally run contrastive markers if `--contrast-groupby --contrast-group1 --contrast-group2` are all provided.555. **Generate**: Write `report.md`, `result.json`, tables, figures, and reproducibility bundle.5657## CLI Reference5859```bash60# Standard usage61python skills/scrna-orchestrator/scrna_orchestrator.py \62 --input <input.h5ad> --output <report_dir>6364# 10x Matrix Market directory65python skills/scrna-orchestrator/scrna_orchestrator.py \66 --input <filtered_feature_bc_matrix_dir> --output <report_dir>6768# Direct matrix.mtx(.gz) path69python skills/scrna-orchestrator/scrna_orchestrator.py \70 --input <matrix.mtx.gz> --output <report_dir>717273# Demo mode74python skills/scrna-orchestrator/scrna_orchestrator.py \75 --demo --output <report_dir>7677# Optional doublet detection78python skills/scrna-orchestrator/scrna_orchestrator.py \79 --input <input.h5ad> --output <report_dir> \80 --doublet-method scrublet8182# Optional CellTypist annotation83python skills/scrna-orchestrator/scrna_orchestrator.py \84 --input <input.h5ad> --output <report_dir> \85 --annotate celltypist --annotation-model Immune_All_Low8687# Optional two-group contrastive markers88python skills/scrna-orchestrator/scrna_orchestrator.py \89 --input <input.h5ad> --output <report_dir> \90 --contrast-groupby <obs_column> --contrast-group1 <group_a> --contrast-group2 <group_b>9192# Optional latent downstream mode93python skills/scrna-orchestrator/scrna_orchestrator.py \94 --input <integrated.h5ad> --output <report_dir> \95 --use-rep X_scvi9697# Optional contrastive markers volcano plot98python skills/scrna-orchestrator/scrna_orchestrator.py \99 --input <input.h5ad> --output <report_dir> \100 --contrast-groupby <obs_column> --contrast-group1 <group_a> --contrast-group2 <group_b> \101 --contrast-volcano102103# Via ClawBio runner104python clawbio.py run scrna --input <input.h5ad> --output <report_dir>105python clawbio.py run scrna --input <filtered_feature_bc_matrix_dir> --output <report_dir>106python clawbio.py run scrna --demo107```108109## Demo110111```bash112python clawbio.py run scrna --demo113python clawbio.py run scrna --demo --doublet-method scrublet114```115116Expected output:117- `report.md` with QC, clustering, markers, and optional annotation/contrastive marker summaries118- figure files (`qc_violin.png`, `umap_leiden.png`, `marker_dotplot.png`)119- optional contrastive figure (`contrastive_markers_volcano.png`) when `--contrast-volcano` is set120- marker, doublet, annotation, and contrastive marker tables when enabled121- reproducibility bundle122123## Algorithm / Methodology1241251. **QC**:126- Compute QC metrics (`n_genes_by_counts`, `total_counts`, `pct_counts_mt`)127- Filter by `min_genes`, `min_cells`, `max_mt_pct`1282. **Optional doublet detection**:129- `scanpy.pp.scrublet` on QC-filtered raw counts130- Remove predicted doublets before normalization and clustering1313. **Preprocess**:132- Normalize total counts to `1e4`133- Apply `log1p`134- Select HVGs (`flavor="seurat"`)1354. **Embed and cluster**:136- Scale (`max_value=10`) on the HVG branch137- PCA, neighbors graph, UMAP138- Leiden clustering1395. **Markers**:140- `scanpy.tl.rank_genes_groups(groupby="leiden", method="wilcoxon", pts=True)`1416. **Optional annotation**:142- Run local CellTypist on normalized/log1p full-gene expression143- Aggregate per-cell predictions to cluster-level majority labels with support and confidence1447. **Optional contrastive markers v1**:145- `scanpy.tl.rank_genes_groups(groupby=<de_groupby>, groups=[group1], reference=group2, method="wilcoxon", pts=True)`146- Export full statistics and top genes by score1478. **Optional volcano plot**:148- Plot `logfoldchanges` vs `-log10(pvals_adj)` (fallback to `pvals` if needed)149- Highlight genes with `p < 0.05` and `|log2FC| >= 1`150151## Example Queries152153- "Run standard QC and clustering on my h5ad file"154- "Cluster my 10x matrix.mtx directory"155- "Find marker genes for each cluster"156- "Generate a UMAP coloured by cluster"157- "Remove predicted doublets before clustering"158- "Assign putative CellTypist labels to clusters"159- "Run contrastive markers for treated vs control"160161## Output Structure162163```text164output_directory/165├── report.md166├── result.json167├── figures/168│ ├── qc_violin.png169│ ├── umap_leiden.png170│ ├── marker_dotplot.png171│ └── contrastive_markers_volcano.png # only when contrast volcano is enabled172├── tables/173│ ├── cluster_summary.csv174│ ├── markers_top.csv175│ ├── markers_top.tsv176│ ├── doublet_summary.csv # only when doublet detection is enabled177│ ├── cluster_annotations.csv # only when annotation is enabled178│ ├── contrastive_markers_full.csv # only when contrastive markers are enabled179│ └── contrastive_markers_top.csv # only when contrastive markers are enabled180└── reproducibility/181 ├── commands.sh182 ├── environment.yml183 └── checksums.sha256184```185186## Dependencies187188**Required**:189- `scanpy` >= 1.10190- `anndata` >= 0.10191- `scipy`192- `numpy`, `pandas`, `matplotlib`, `leidenalg`, `python-igraph`193194**Optional**:195- `scrublet` for `--doublet-method scrublet`196- `celltypist` for `--annotate celltypist`197198**Out of scope**:199- `scvi-tools` / `scANVI`200201## Safety202203- **Local-first**: No patient data upload.204- **Disclaimer**: Reports include the ClawBio medical disclaimer.205- **Input guardrails**: Rejects processed-like matrices to reduce invalid biological inferences.206- **Annotation caution**: CellTypist labels are **putative** and model-dependent, not definitive biology.207- **Model downloads**: Runtime CellTypist model downloads are intentionally disabled.208- **Reproducibility**: Writes command/environment/checksum bundle.209210## Integration with Bio Orchestrator211212**Trigger conditions**:213- File extension `.h5ad`, `.mtx`, or `.mtx.gz`214- User intent includes scRNA terms (single-cell, Scanpy, clustering, marker genes, contrastive markers, doublets, annotation)215216**Current limitations**:217- Raw-count `.h5ad` and 10x Matrix Market only218- CellTypist support is human-model focused and requires a locally installed model219- Multi-group pairwise contrastive markers and within-cluster contrastive markers are future work220221## Status222223**MVP implemented** -- supports `.h5ad` input and `--demo` PBMC3k-first demo data (fallback to synthetic on failure), plus opt-in Scrublet doublet detection, opt-in local CellTypist annotation, opt-in latent downstream mode from `integrated.h5ad`, and opt-in two-group contrastive markers with volcano plots.224225## Citations226227- [Scanpy documentation](https://scanpy.readthedocs.io/) — analysis API and methods.228- [AnnData documentation](https://anndata.readthedocs.io/) — data model.229- [Leiden algorithm paper](https://www.nature.com/articles/s41598-019-41695-z) — community detection.230- [Scrublet paper](https://genomebiology.biomedcentral.com/articles/10.1186/s13059-019-1736-8) — computational doublet detection.231- [CellTypist documentation](https://www.celltypist.org/) — model-based immune and general cell annotation.232