sc-filter
Load when removing low-quality cells and lowly-detected genes from a single-cell AnnData using QC-derived thresholds or tissue presets. Skip when the full normalize→HVG→PCA→cluster pipeline (use sc-pr
SKILL.mdskills/sc-filter/SKILL.md
GitHubsc-filter
When to use
The user has reviewed sc-qc output and now wants to actually drop
low-quality cells and lowly-detected genes — by per-cell thresholds
(--min-genes, --max-genes, --max-mt-percent, --min-counts,
--max-counts, --min-cells) or tissue-specific presets (--tissue brain / pbmc / etc.). This skill removes cells; it does not
normalise, cluster, or annotate.
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
Outputs
tables/cell_metadata.csvtables/filter_reasons.csvtables/filter_state.csvtables/filter_stats.csvtables/filter_summary.csvtables/gene_expression.csvtables/retention_summary.csvfigures/filter_comparison.pngfigures/filter_reason_summary.pngfigures/filter_state_scatter.pngfigures/filter_summary.pngfigures/filter_thresholds.pngfigures/r_feature_violin.pnganalysis_summary.txtprocessed.h5adreport.mdresult.json- Processed AnnData (
saves_h5ad)
Flow
- Load AnnData via shared loader; persist
expression_sourceinresult.json. - If
--tissueis set, apply preset thresholds (overrides any matching CLI flag silently). - Compute per-cell metrics; mark cells / genes failing each rule.
- Drop cells failing any active rule; drop genes detected in fewer than
--min-cellscells. - Emit before/after retention tables and figures.
- Save
processed.h5ad+report.md+result.json.
Gotchas
--tissuepresets silently override matching CLI flags. Passing--tissue pbmcplus--max-mt-percent 30resolves to whatever the PBMC preset declares formax_mt_percent, not 30. When mixing, omit the explicit flag or override the preset by editing it inreferences/methodology.md. Result tables record the effective thresholds, not the user-passed ones.- QC metrics are computed on demand if missing.
sc_filter.py:617-622callsensure_qc_metrics(...)when the AnnData lacksn_genes_by_counts/pct_counts_mt, so this skill works without a priorsc-qcrun. Runningsc-qcfirst is still recommended for diagnostic figures, but it's not a hard prerequisite — the routing description used to overstate this. - Input file missing → hard fail.
sc_filter.py:573raisesFileNotFoundErroron a non-existent--input. Common in batch pipelines when an upstream output dir was renamed. expression_sourceis recorded but does not gate the filter.result.json["summary"]["expression_source"]carries which matrix the metrics came from (layers.counts/adata.raw/adata.X). Filtering still runs even if the source is log-normalised — buttotal_counts/ mt% interpretations become meaningless. Check the source before relying on the thresholds.processed.h5adis contract-preserving, not contract-canonical. The skill keeps whatever layers /raw/unsthe input had; if upstream skippedsc-standardize-input, downstream skills may still mis-classify the count source. Runsc-standardize-inputbeforesc-filterwhen input came from outside OmicsClaw.
Key CLI
# Demo
python omicsclaw.py run sc-filter --demo --output /tmp/sc_filter_demo
# Threshold-based (typical PBMC defaults)
python omicsclaw.py run sc-filter \
--input qc_output.h5ad --output results/ \
--min-genes 200 --max-mt-percent 20 --min-cells 3
# Tissue preset (overrides matching CLI flags)
python omicsclaw.py run sc-filter \
--input qc_output.h5ad --output results/ --tissue pbmc
See also
references/parameters.md— every CLI flag and tuning hintreferences/methodology.md— tissue preset definitions, threshold semanticsreferences/output_contract.md—processed.h5ad+ table schemas- Adjacent skills:
sc-qc(upstream — produces metrics; recommended before this),sc-doublet-detection(parallel — drops doublets),sc-preprocessing(downstream — normalise/HVG/PCA on the filtered AnnData)