Marks, cells and tissue

What sets seqFISH+ multi-omics apart is the second layer: the signals measured at each DNA spot (cd.spot_tracks: H3K27ac, H3K9me3, LaminB1, nuclear speckles, RNA polymerase II, …) and the cells’ transcripts and positions.

Marks along the genome. Averaged over the cells (or a cell type), a spot signal becomes a per-locus track (cd.bin_tracks), next to the coordinates; peaks of such a track mark the loci a chromatin mark enriches — the per-locus features tutorial calls H3K4me3 peaks on chromosome 19 of the Takei 2025 cerebellum (ds.load("takei2025_cerebellum"), the atlas store) and compares them with gene annotation and sequence content.

Cells by their marks. uchrom.emb.aggregate_tracks sums the spot signals of each cell (means, or the within-cell correlations between marks), and embed_cells(source="if") embeds and clusters the cells by them, as RNA would be — the IF section of the cell embeddings tutorial does it for the 1,799 cerebellar cells:

import uchrom as uc
import uchrom.datasets as ds
import uchrom.emb as emb

cd = ds.load("takei2025_cerebellum")
emb.aggregate_tracks(cd, prefix="if", stat="mean")    # cells["if.<mark>"]
uc.tl.embed_cells(cd, source="if")                    # cellm["if_pca" / "if_tsne" / "if_umap"]
emb.score_embedding(cd, "if_pca", "cell_type")        # against the published cell types

Cells in the tissue. The loaders record each cell’s centroid (and outline when published) as cell positions (cd.cell_positions(), cd.cell_shapes); the web browser shows the cells in their tissue, coloured by type, by an embedding or by any mark, next to each cell’s traces in 3-D.

API: uchrom.emb, uchrom.fea.