U-Chrom Atlas

The software behind the atlas

One data structure for the 3-D genome

U-Chrom (Universal Chromatin) is a Python toolkit for chromatin 3-D structure data. Chromatin tracing, single-cell and spatial Hi-C and 3-D reconstructions all become one container, ChromData, which every analysis module and the browser share.

Source code coming soon

Data model

ChromData

Every row of a ChromData is a spot: one locus of one copy of a chromosome in one cell, with its x, y, z when it has them. Spots are stored flat and read by cell, trace or chromosome; the loci live once, on an axis that all cells share.

Cellcells · cellm
Traceone chromosome copy · traces
Spotspots · coords · spot_tracks
Binthe locus axis · bins

Locus axis one row per locus, shared by all cells

bins
chrom, start, end
bin_tracks
per-locus signals: bulk ATAC, ChIP, GC, compartment scores
intervals
typed TADs, loops, peaks, segments

Spot axis one row per locus of a chromosome copy

spots
bin_id, trace_id, cell_id
coords
x, y, z (n × 3); alternative models in layers
spot_tracks
per-spot signals: IF intensity, seqFISH z-scores

Cell axis one row per cell or spot of a tissue

cells
cell type, stage, QC, position in the tissue
cellm
embeddings: RNA / Hi-C / ATAC PCA and UMAP
cell_shapes, points
outlines, RNA spots and other 3-D points

Other modalities linked, or embedded in the store

contact maps
per cell (.scool) and bulk (.cool / .mcool)
AnnData
RNA, ATAC, A/B per cell or spot
images
tissue sections, in tissue coordinates
The spots table with bin_id, trace_id and cell_id keys pointing at the bins, traces and cells tables; coordinates and spot tracks row-aligned with the spots; contact maps linked; and the layout of a .chromdata.zarr store
Tables joined by keys. Spots point at the locus axis (bins) and at traces and cells; coordinates and per-spot tracks are row-aligned with the spots; contact maps are linked or embedded, not copied. Right, the .chromdata.zarr layout: Zarr v3 with Parquet tables, coordinates one table per chromosome; .cdz is the same store in one zip file. Fig. 2a

On disk and at scale

.chromdata.zarr

Open formats any language can read, laid out so that a reader fetches only what it needs, from a disk or over HTTP. Benchmarks on the Takei et al. 2025 cerebellum DNA seqFISH+ data (62 per-spot tracks), up to 107 real spots and 108 replicated ones.

Matrix of twelve kinds of chromatin data against six formats: chromdata.zarr represents all of them natively, contact maps linked
What each format can represent: filled, native; ring, linked; open, by convention only; dash, not supported. Fig. 2b
File size and full-read time against the number of spots for chromdata.zarr, FOF-CT, AnnData and SpatialData
Storage and full reads. At 107 spots: 1.8 GB, read in 0.57 s (FOF-CT 6.7 GB, 99 s; AnnData 5.6 GB, 5.4 s; SpatialData 2.2 GB, 2.2 s). Fig. 2c
Access time by level, time to open a file and get one cell across formats, memory to open and query, and peak memory of a streamed distance map
Access speed and memory. Opening a 107-spot store and getting one cell takes 45 ms (SpatialData 0.75 s, AnnData 7.6 s); opening and querying stays under a few GB where loading everything does not; a median distance map streamed under a 2 GB budget peaks at 1.55 GB instead of 12.3 GB, with a bitwise-identical result. Open markers: 108 spots of replicated cells. Fig. 2d, e

The package

An open ecosystem

Community formats are read, or linked without copying; five analysis modules share one API, reached from Python, the command line, the web browser this atlas runs on, and an MCP server for agents.

Interfaces (Python API, CLI, web browser, MCP server), the five method modules on ChromData, and the formats read, written or linked
Interfaces, methods and formats. Reconstruction (uchrom.recon), imaging-side processing (uchrom.im), structure calling (uchrom.strc), geometric features (uchrom.fea) and cell embeddings (uchrom.emb) on one ChromData; FOF-CT, .pairs, .cool / .mcool / .scool, .hic, .3dg and tracing tools read, AnnData / MuData and coolers linked, structures exported as PDB. Logos are marks of their owners, used for identification only. Fig. 1c

A first look

An atlas dataset in Python

The same stores the atlas shows, opened from Python: nothing is downloaded until it is used.

from uchrom import ChromData

cd = ChromData.read(
    "https://uchrom-atlas-r2.u-science.org/stevens2017_mesc.chromdata.zarr",
    backed=True,                                           # read on demand, over HTTP
)
cd.cells                                                   # one row per cell
cell = cd.get_cell("Cell_1")                               # its 3-D genome structure
dist = cell.compute_distances(trace_id="Cell_1_chr1")      # chr1 distance matrix
clr = cd.load_linked_scool(key="per_cell", cell="Cell_1")  # its contact map (cooler)