Single-cell Commitment Scores with radial star embedding
Project description
scCS — Single-Cell Commitment Scores
scCS quantifies RNA velocity-based commitment scores for single-cell data, generalizing the 2-state (homeostatic/activated) framework from Kriukov et al. (2025) to arbitrary k-furcations — branching points where a progenitor population splits into k ≥ 2 terminal fates.
What it does
Classical RNA velocity tools (scVelo, CellRank) describe where cells are going. scCS answers a complementary question: how strongly committed is each cell to a given fate, relative to the alternatives?
Given RNA velocity vectors projected into a radial star embedding, scCS computes:
- unCS / nCS — unnormalized and cell-count-corrected pairwise commitment scores
- Per-cell fate affinities — cosine similarity of each cell's velocity to each fate direction
- Population entropy — how evenly velocity mass is distributed across fates
- Per-fate cell entropy — how individually decisive cells are toward each fate specifically
- NN-smoothed entropy — spatially local commitment uncertainty, noise-robust
Installation
pip install scCS-py
Or from source:
pip install git+https://github.com/mcrewcow/scCS.git
Quickstart
import scCS
scorer = scCS.CommitmentScorer(
adata,
bifurcation_cluster="17", # leiden cluster at the branching point
terminal_cell_types=["homeostatic", "activated"],
cluster_key="leiden",
)
scorer.build_embedding(differentiation_metric="pseudotime")
scorer.fit()
result = scorer.score(compute_cell_level=True)
print(result.summary())
scorer.plot_star(result)
scorer.plot_commitment_bar(result)
Key features
| Feature | Description |
|---|---|
| k-furcation support | Works for any number of fate branches (k ≥ 2) |
| Radial star embedding | Progenitor at origin, each fate on its own arm, cells ordered by pseudotime / CytoTRACE2 |
| unCS / nCS | Pairwise commitment scores, unnormalized and cell-count-corrected |
| Per-fate entropy | Binary cell entropy per fate — how decisive cells are toward each fate individually |
| NN-smoothed entropy | Nearest-neighbor smoothed per-cell entropy in the scCS embedding; elbow plots to choose k |
| Driver genes | Velocity-based and DEG-based driver genes per fate arm |
| Pathway enrichment | Enrichr ORA (KEGG, GO BP, Reactome) per fate, up and down |
| Color map support | Pass your original scanpy/Seurat cluster colors to all plots |
Entropy metrics
scCS provides three complementary entropy metrics:
# 1. Population entropy — single scalar, aggregate velocity-mass balance
result.population_entropy
# 2. Per-fate cell entropy — shape (k,), one value per fate
# Binary entropy of each cell's affinity toward fate j, averaged over cells
result.per_fate_entropy # e.g. array([0.31, 0.28]) for k=2
# 3. NN-smoothed per-cell entropy — shape (n_cells,)
# Average cell_scores over k nearest neighbors in X_sccs, then compute entropy
result = scorer.score(compute_cell_level=True, k_nn=15)
result.nn_cell_entropy # also stored in adata_sub.obs["cs_nn_entropy"]
# Find the optimal k_nn with elbow plots
fig = scorer.plot_nn_entropy_elbow(k_nn_range=range(5, 51, 5))
Full workflow
import scCS
# 1. Initialize
scorer = scCS.CommitmentScorer(
adata,
bifurcation_cluster="17",
terminal_cell_types=["homeostatic", "activated"],
cluster_key="leiden",
)
# 2. Build radial star embedding
scorer.build_embedding(differentiation_metric="pseudotime")
# 3. Fit (builds FateMap, projects velocity)
scorer.fit()
# 4. Score
result = scorer.score(compute_cell_level=True, k_nn=15)
print(result.summary())
# 5. Plots
scorer.plot_star(result)
scorer.plot_commitment_bar(result)
scorer.plot_rose(result)
scorer.plot_pairwise_cs(result)
scorer.plot_nn_entropy_elbow(k_nn_range=range(5, 51, 5))
# 6. Driver genes
vel_drivers = scorer.get_velocity_drivers(n_top=50)
deg_drivers = scorer.get_deg_drivers(n_top=50)
# 7. Pathway enrichment
enrichment = scorer.get_enrichment(deg_drivers, organism="mouse")
# 8. Compare across conditions
subset_results = scorer.score_per_subset("condition")
scorer.plot_subset_comparison(subset_results)
Manuscript values
Reproducing the k=2 microglia bifurcation from Kriukov et al. (2025) (GEO: GSE285564):
scorer = scCS.CommitmentScorer(
adata,
bifurcation_cluster="17",
terminal_cell_types=["homeostatic", "activated"],
cluster_key="leiden",
)
scorer.build_embedding(differentiation_metric="pseudotime")
scorer.fit()
result = scorer.score()
result.pairwise_unCS[0, 1] # → 9.335
result.pairwise_nCS[0, 1] # → 8.066
Citation
If you use scCS in your research, please cite:
Kriukov et al. (2025) Single-cell transcriptome of myeloid cells in response to transplantation of human retinal neurons reveals reversibility of microglial activation. DOI: 10.XXXX
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sccs_py-0.3.2.1.tar.gz.
File metadata
- Download URL: sccs_py-0.3.2.1.tar.gz
- Upload date:
- Size: 49.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a895b5027aefd700326aeace12a1d3e68a569b84655f985a1a630c0116ec4b55
|
|
| MD5 |
5960580115ec5f750f279794180ca3cf
|
|
| BLAKE2b-256 |
65871605bf35fd8b6ab9758ab8a0b091bc543d6ef1a9a3c0dd8660d521435fb1
|
File details
Details for the file sccs_py-0.3.2.1-py3-none-any.whl.
File metadata
- Download URL: sccs_py-0.3.2.1-py3-none-any.whl
- Upload date:
- Size: 44.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.16
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
41bcd6966d128eeb42a4096b05efa76d00c3bd3936a085fb61aac974e4a2e9cd
|
|
| MD5 |
67e1a5e6f358b0a1f7784a0739eeab71
|
|
| BLAKE2b-256 |
52c42b549dd6e462e9deb8ca861a32527128030e9fb384690cae932f89c8b7f4
|