Bone-marrow mononuclear cells from healthy adult donors, bought from one vendor and prepared with one standard protocol at four sites (Luecken et al. 2021; GEO series GSE194122). Each cell was read twice in the same droplet: its messenger RNA (gene expression, GEX) and its surface proteins, tagged by oligonucleotide-barcoded antibodies (antibody-derived tags, ADT). The data were generated for the NeurIPS 2021 multimodal single-cell integration competition. The held files are that competition’s training release: 66,175 cells from 9 site × donor batches, 3 sites and 7 donors.
This page follows the data from the 10x Genomics CITE-seq assay to the 66,175 × 14,087 normalised gene-and-protein matrix: what was measured, what the provider released, and how 66,175 held cells become matrix rows. No sequencer output is held, so the steps before the release are documented by the provider, and the steps after it are reproduced here.
Open Problems in Single-Cell Analysis; benchmark described by Luecken and colleagues (2021).
openproblems_bmmc_cite_phase2: the NeurIPS 2021 competition phase-2 training release (uns/dataset_id of both held files).
CITE-seq captures single cells in droplets with barcoded beads. Inside each droplet the cell’s messenger RNA and the antibody tags bound to its surface receive the same cell barcode, so both readouts belong to one cell. The provider used 10x Genomics’ 3′ gene expression chemistry with Feature Barcoding and BioLegend’s TotalSeq-B Universal Human panel of 134 antibodies against surface proteins plus 6 isotype controls, which bind no human protein and measure background, and sequenced the libraries on an Illumina NovaSeq 6000 (GEO series GSE194122; Open Problems NeurIPS 2021 competition documentation). Each sample targeted about 7,000 cells (Luecken et al. 2021). The earliest level held here is the provider’s processed release, not the sequencer’s reads.
From the donors to the held files
- DocumentedDonors and sites
Bone-marrow mononuclear cells of healthy donors (AllCells, California); CITE-seq samples prepared at four sites, each measuring three donors, with Donor 1 at every site (Open Problems NeurIPS 2021 competition documentation; GEO series GSE194122)
- DocumentedAssay and sequencer
10x Chromium Single Cell 3′ (v3) with Feature Barcoding and the BioLegend TotalSeq-B Universal Human panel v1.0: 134 surface markers and 6 isotype controls; Illumina NovaSeq 6000 (GEO series GSE194122; Open Problems NeurIPS 2021 competition documentation)
- DocumentedProvider processing
Cell Ranger 6.1.0 on GRCh38 (GENCODE v32 / Ensembl 98); cells filtered on mitochondrial share, UMIs, genes and antibody counts; doublets removed; scran size factors for GEX and CLR for ADT; cell types annotated per batch and modality (GEO series GSE194122; Open Problems NeurIPS 2021 competition documentation; Luecken et al. 2021)
- DocumentedCompetition release
Training files of the competition’s second phase, one per modality (Open Problems NeurIPS 2021 competition documentation)
- HeldHeld files
cite_gex_processed_training.h5ad (678.4 MB) and cite_adt_processed_training.h5ad (76.2 MB); both label themselves
openproblems_bmmc_cite_phase2
Documented: described by the provider, not rerun here. Reproduced: rerun or checked here. Held: the bytes this page reads.
One acquisition unit: one cell
A row is one cell barcode: the cell’s gene counts in the GEX file and its antibody counts in the ADT file, in the same row of both. The files store cells, not reads or droplets that failed quality control.
What each cell records
| Field | Unit | Meaning |
|---|---|---|
X (GEX) | ln(1 + count ÷ size factor) | Normalised expression, sparse. Reproduced here from the counts and size_factors to 4.8 × 10⁻⁷ |
layers/counts (GEX) | UMI count | Integer molecule counts per cell and gene; same sparsity pattern as X |
X (ADT) | CLR | ln(1 + count ÷ g), with g the geometric mean of (1 + count) over all 140 antibodies of the cell, isotype controls included. Reproduced to 2.4 × 10⁻⁷ |
layers/counts (ADT) | antibody count | Integer tag counts per cell and antibody |
obsm/isotype_controls | CLR | The 6 isotype controls, stored normalised like X (ADT); their counts are recoverable to 4.1 × 10⁻⁶ |
obsm/X_pca, obsm/X_umap | — | The provider’s 50-component PCA and 2-D UMAP of each file; not used here |
obs/_index | — | Cell barcode with the batch appended, e.g. GCATTAGCATAAGCGG-1-s1d1 |
obs/batch | — | s1d1 = Site 1, Donor 1 (Open Problems NeurIPS 2021 competition documentation); 9 levels |
obs/cell_type | — | Manual annotation from GEX, 45 levels (Open Problems NeurIPS 2021 competition documentation) |
obs/phase (GEX) | — | Cell-cycle phase from scanpy’s score_genes_cell_cycle (G1, S, G2M; Open Problems NeurIPS 2021 competition documentation) |
obs/pseudotime_order_GEX, _ADT | 0–1 | Diffusion pseudotime along the erythroid trajectory; missing for 55,802 and 55,854 cells |
obs/size_factors | — | scran size factor per cell (Open Problems NeurIPS 2021 competition documentation); 0.0002 to 7.9634 |
obs/n_genes_by_counts, pct_counts_mt | genes, % | Genes detected and mitochondrial share of UMIs, from the provider’s quality control |
obs/total_counts, iso_count | antibody count | All tags of the cell, and the isotype-control tags among them |
obs/n_antibodies_by_counts | antibodies | Antibodies with a count, isotype controls included (up to 140) |
obs/is_train | bool | True for all 66,175 cells |
var/_index, gene_ids | — | Gene symbol and Ensembl gene ID (13,953 genes); ADT: antibody target (134) |
var/feature_types, genome, n_cells | — | GEX or ADT; reference GRCh38; a per-gene cell count from the provider’s processing |
uns/dataset_id, organism | — | openproblems_bmmc_cite_phase2, human |
Observed: 9.6% of the GEX entries and 81.4% of the ADT entries are non-zero; a cell has a median of 3,586 gene UMIs (496–37,118) and 967 antibody counts (197–25,879).
The files, opened
Both files are AnnData objects in HDF5. Matrices are stored column by column (compressed sparse columns); categorical labels are integer codes with their names in __categories.
GEX
/
X/ csc_matrix 66175 × 13953
data 88987651 float64
indices 88987651 int32
indptr 13954 int32
layers/
counts/ csc_matrix 66175 × 13953
data 88987651 float64
indices 88987651 int32
indptr 13954 int32
obs/ dataframe
__categories/
_index 66175 strings
batch 66175 int8 codes
cell_type 66175 int8 codes
is_train 66175 bool
n_genes_by_counts 66175 int32
pct_counts_mt 66175 float64
phase 66175 int8 codes
pseudotime_order_ADT 66175 float64
pseudotime_order_GEX 66175 float64
size_factors 66175 float64
obsm/
X_pca 66175 × 50 float32
X_umap 66175 × 2 float32
uns/
dataset_id scalar strings
organism scalar strings
var/ dataframe
__categories/
_index 13953 strings
feature_types 13953 int8 codes
gene_ids 13953 int16 codes
genome 13953 int8 codes
n_cells 13953 float64ADT
/
X/ csc_matrix 66175 × 134
data 7218492 float64
indices 7218492 int32
indptr 135 int32
layers/
counts/ csc_matrix 66175 × 134
data 7218492 float64
indices 7218492 int32
indptr 135 int32
obs/ dataframe
__categories/
_index 66175 strings
batch 66175 int8 codes
cell_type 66175 int8 codes
is_train 66175 bool
iso_count 66175 float64
n_antibodies_by_counts 66175 int32
pseudotime_order_ADT 66175 float64
pseudotime_order_GEX 66175 float64
total_counts 66175 float64
obsm/
X_pca 66175 × 50 float32
X_umap 66175 × 2 float32
isotype_controls/ dataframe
Mouse-IgG1 66175 float32
… 5 more controls and _index, same shape
uns/
dataset_id scalar strings
organism scalar strings
var/ dataframe
__categories/
_index 134 strings
feature_types 134 int8 codes| File | Size | Cells × features | SHA-256 |
|---|---|---|---|
cite_gex_processed_training.h5ad | 678.4 MB | 66,175 × 13,953 | identical to the record |
cite_adt_processed_training.h5ad | 76.2 MB | 66,175 × 134 | identical to the record |
One cell, as held
The first row of both files: barcode GCATTAGCATAAGCGG-1-s1d1, batch s1d1, annotated Naive CD20+ B IGKC+. Its 134 antibody counts in file order (top) and the CLR values the file stores for them (bottom); the grey bars at the right are the 6 isotype controls. Hover a bar to read it.
This cell has 2,828 tags, 5 of them on isotype controls, and 3,250 gene UMIs over 888 genes. Its twelve largest gene counts are ribosomal and housekeeping genes:
| Gene | Count | Stored X |
|---|---|---|
RPS18 | 63 | 5.1801 |
RPS27 | 61 | 5.148 |
RPLP1 | 53 | 5.0083 |
RPL13 | 50 | 4.9505 |
RPL18A | 47 | 4.889 |
RPL10 | 44 | 4.8236 |
RPS19 | 41 | 4.7536 |
RPL37 | 39 | 4.704 |
IGKC | 38 | 4.6782 |
RPL32 | 37 | 4.6518 |
RPS23 | 37 | 4.6518 |
RPL30 | 36 | 4.6247 |
What the files cover
Cells per batch, split by the workflow’s seven lineage groups. The batches come from 3 sites; Donor 1 appears at 3 of them. The provider documents a fourth site with three more samples; none of its cells is in these training files, and is_train is true for every cell.
Cells per batch and cell type
What the raw record does not give you directly
- A batch is a site and a donor, not a donor. 9 batches hold 7 donors: Donor 1 was measured at Sites 1, 2 and 3, and the GEO sample records give it the same donor identifier each time. Site and donor effects are nested, not separable, within these files.
- The GEX
Xis already log-transformed. The competition documentation saysXholds size-factor-normalised counts and alog_normlayer holds their log. These files have nolog_normlayer;Xequals ln(1 + count ÷ size factor) to 4.8 × 10⁻⁷. - The ADT CLR runs over 140 antibodies, not 134. The isotype controls enter each cell’s geometric mean but are kept only in normalised form, outside
X. A CLR over the 134 stored antibodies misses the stored values by up to 0.113;total_countsandn_antibodies_by_counts(up to 140) also include the controls. - The GEX quality columns describe a larger gene set.
n_genes_by_countsexceeds the genes stored for 65,295 cells (by up to 309);pct_counts_mtdoes not recompute from the 13 mitochondrial genes held (up to 6.3 points off);var/n_cellsis below the held count for all 13,953 genes. They were computed before the gene set was cut to 13,953. - Pseudotime covers one trajectory. Only 10,373 cells (GEX) and 10,321 cells (ADT) have a value, all of them Erythroblast, HSC, MK/E prog, Normoblast, Proerythroblast, Reticulocyte; the rest are missing, not zero.
- The documented antibody screens do not match the held cells. The competition documentation gives total antibody counts of 1,100–1,200 up to 24,000 per sample, at least 80 proteins per cell and isotype sums of 1–100. Here
total_countsruns from 200 to 25,934,n_antibodies_by_countsfrom 51, andiso_countfrom 0 to 116; the thresholds that produced these files are not recorded.
The recipe is the workflow’s: the CITE-seq branch of JAE, the competition’s winning joint-embedding method, reimplemented in the demo’s own feature script. It starts again from the raw counts, not from the provider’s normalised values, and keeps every cell and every feature. The workflow then reduces the gene block with a truncated SVD; this page stops where that begins.
| Step | Evidence | Operation | Result |
|---|---|---|---|
| 1 | Documented | Capture, barcode and sequence each sample: Chromium 3′ v3 with Feature Barcoding, TotalSeq-B panel, NovaSeq 6000 (GEO series GSE194122) | 12 CITE-seq samples at 4 sites |
| 2 | Documented | Cell Ranger 6.1.0 on GRCh38; filter cells on mitochondrial share, UMIs, genes and antibody counts; remove doublets; annotate cell types per batch (GEO series GSE194122; Open Problems NeurIPS 2021 competition documentation) | count matrices per sample |
| 3 | Reproduced | Provider normalisation: GEX ln(1 + count ÷ scran size factor); ADT CLR over 140 antibodies | stored as X; not used below |
| 4 | Documented | Competition training release: the batches of Sites 1–3 (Open Problems NeurIPS 2021 competition documentation) | 66,175 cells, 9 batches |
| 5 | Reproduced | Match the two files by barcode | 66,175 rows, same order |
| 6 | Reproduced | Take layers/counts of both files, not X | 66,175 × 13,953 and 66,175 × 134 counts |
| 7 | Reproduced | In each modality separately, divide each cell’s counts by its total, multiply by 10⁴ and take log₁₀(1 + x) (JAE’s CITE-seq preprocessing) | same shapes, values ≥ 0 |
| 8 | Reproduced | Place the gene block, then the protein block, side by side; keep cell type, batch, phase and pseudotime aside as labels, never features | 66,175 × 14,087 |
Where the cells go
Nowhere: no step screens cells, so all 66,175 held cells become rows.
Cells by batch at each step
| Batch | GEX cells held | Barcode found at the same row in ADT | Rows of the design matrix |
|---|---|---|---|
| s1d1 | 4,721 | 4,721 | 4,721 |
| s1d2 | 4,464 | 4,464 | 4,464 |
| s1d3 | 5,484 | 5,484 | 5,484 |
| s2d1 | 9,353 | 9,353 | 9,353 |
| s2d4 | 5,026 | 5,026 | 5,026 |
| s2d5 | 8,206 | 8,206 | 8,206 |
| s3d1 | 8,582 | 8,582 | 8,582 |
| s3d6 | 9,977 | 9,977 | 9,977 |
| s3d7 | 10,362 | 10,362 | 10,362 |
Follow one cell
Pick a cell to see six genes and six antibodies at each step, from the counts in the file to the row the matrix stores. The genes are lineage markers (CD3E, MS4A1, NKG7, LYZ, HBB, CD34); the antibodies target CD3, CD19, CD56, CD14, CD71, CD38. All examples are rows of the workflow’s display sample, and all are kept: nothing is dropped.
layers/countsX, for comparison; the recipe does not use itChecks
| Check | Result |
|---|---|
| SHA-256 of both files against the dataset record | identical |
| Barcodes, batch, cell type and pseudotime in the two files | identical, row by row |
GEX X against ln(1 + count ÷ size factor) | max difference 4.8 × 10⁻⁷ |
ADT X against CLR over 140 / 134 antibodies | max difference 2.4 × 10⁻⁷ / 0.113 |
Recovered isotype counts: sum against iso_count | max difference 0 |
total_counts against antibody plus isotype counts | max difference 0 |
| Display sample rebuilt (stratified by cell type, seed 7) against the workflow’s | identical: 5,004 cells, all 45 cell types |
| Display slice rebuilt against the workflow’s (5,004 × 160, 256 levels) | 99.998% of values identical, the rest one level apart |
| Shapes and label counts against the dataset record | identical |
The provider’s normalisations are reproduced exactly, but the matrix keeps the recipe’s own, computed from the counts, because that is what the workflow’s model reads. The display slice drawn below is this page’s rebuild; its one-level differences from the workflow’s copy are rounding at the quantisation step.
Each row is one cell, in file order; the first 13,953 columns are genes and the last 134 are antibodies. An entry is log₁₀(1 + 10⁴ × count ÷ the cell’s total in that modality): never negative, zero where nothing was counted, so the colour scale is sequential. The heatmap is the workflow’s display copy: its 5,004 display cells grouped by lineage and then cell type, and 160 columns (26 marker genes, then all 134 antibodies). Hover a row to draw it below.
Display copy: 5,004 cells sampled at seed 7 in proportion to cell type, with at least three per type, so the rarest types are over-represented. Each column is scaled to its own 99.5th percentile in the sample and stored in 256 levels; brighter values saturate. At full precision the gene block reaches 3.96 and the protein block 3.95. The workflow’s model uses a separate random 90/10 split of all cells at seed 42, unrelated to the file’s is_train.
Every display column: scale and full-file summary
| Feature | Unit | Meaning |
|---|---|---|
13,953 genes, var/_index order | log₁₀(1 + counts per 10⁴) | Gene symbol; Ensembl ID in var/gene_ids, reference GRCh38 |
134 antibodies, var/_index order | log₁₀(1 + counts per 10⁴) | Surface protein targeted by the TotalSeq-B antibody (e.g. CD3, CD19, CD14) |
Labels kept beside the matrix
| Label | Unit | Meaning |
|---|---|---|
cell_type | 45 levels | Manual annotation from marker genes and expert review, made per batch (Luecken et al. 2021); a training and scoring target, never an input |
batch | 9 levels | Site × donor; what the joint embedding is asked to forget |
phase | G1 / S / G2M | The provider’s cell-cycle call |
pseudotime_order_GEX, _ADT | 0–1 | Erythroid-trajectory ordering, missing outside it |
_index | — | Cell barcode |
The 6 isotype controls and the provider’s quality columns stay in the files and are neither features nor labels.
- Batch mixes site and donor: 7 donors in 9 batches, Donor 1 at 3 sites. A test that holds out one batch still shares Donor 1 or the site with the training batches.
- The Site 4 samples are not in the held files, so all 66,175 rows come from Sites 1–3.
- The matrix uses the recipe’s normalisation, not the provider’s: log₁₀ counts per 10⁴ instead of ln(1 + count ÷ size factor) for genes, and total-count scaling instead of CLR for antibodies. Values from the two cannot be mixed.
- The workflow’s S and G2M labels are scored on log(1 +
X), a second log on top of the provider’s loggedX; their phase calls agree withphasefor 31.32% of cells. - The display copy over-represents the rarest cell types and clips each column at its 99.5th percentile; the page holds this copy, not the full 66,175 × 14,087 matrix.
Luecken et al. (2021). A sandbox for prediction and integration of DNA, RNA, and proteins in single cells. NeurIPS Datasets and Benchmarks, volume 1. GEO accession GSE194122.
JAE joint embedding explorer: reduces the gene block to 100 SVD components, keeps the 134 antibodies, and trains the JAE joint embedding and its variants on this matrix. Its Insight page reads the saved embedding of these cells.