NeurIPS 2021 BMMC CITE-seq

Processed CITE-seq release to a 66,175 × 14,087 gene-and-protein matrix: the feature set of the JAE joint embedding explorer.

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.

7
donors
9
site × donor batches
2
h5ad files
66,175
cells
66,175 × 14,087
design matrix
Creators

Open Problems in Single-Cell Analysis; benchmark described by Luecken and colleagues (2021).

Release

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

  1. 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)

  2. 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)

  3. 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)

  4. DocumentedCompetition release

    Training files of the competition’s second phase, one per modality (Open Problems NeurIPS 2021 competition documentation)

  5. 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

FieldUnitMeaning
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 countInteger molecule counts per cell and gene; same sparsity pattern as X
X (ADT)CLRln(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 countInteger tag counts per cell and antibody
obsm/isotype_controlsCLRThe 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, _ADT0–1Diffusion 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_mtgenes, %Genes detected and mitochondrial share of UMIs, from the provider’s quality control
obs/total_counts, iso_countantibody countAll tags of the cell, and the isotype-control tags among them
obs/n_antibodies_by_countsantibodiesAntibodies with a count, isotype controls included (up to 140)
obs/is_trainboolTrue 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).

2
h5ad files
754.6 MB
total size
66,175
cells
13,953 + 134
genes + antibodies per cell

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 float64

ADT

/
  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
FileSizeCells × featuresSHA-256
cite_gex_processed_training.h5ad678.4 MB66,175 × 13,953identical to the record
cite_adt_processed_training.h5ad76.2 MB66,175 × 134identical 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:

GeneCountStored X
RPS18635.1801
RPS27615.148
RPLP1535.0083
RPL13504.9505
RPL18A474.889
RPL10444.8236
RPS19414.7536
RPL37394.704
IGKC384.6782
RPL32374.6518
RPS23374.6518
RPL30364.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 X is already log-transformed. The competition documentation says X holds size-factor-normalised counts and a log_norm layer holds their log. These files have no log_norm layer; X equals 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_counts and n_antibodies_by_counts (up to 140) also include the controls.
  • The GEX quality columns describe a larger gene set. n_genes_by_counts exceeds the genes stored for 65,295 cells (by up to 309); pct_counts_mt does not recompute from the 13 mitochondrial genes held (up to 6.3 points off); var/n_cells is 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_counts runs from 200 to 25,934, n_antibodies_by_counts from 51, and iso_count from 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.

StepEvidenceOperationResult
1DocumentedCapture, 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
2DocumentedCell 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
3ReproducedProvider normalisation: GEX ln(1 + count ÷ scran size factor); ADT CLR over 140 antibodiesstored as X; not used below
4DocumentedCompetition training release: the batches of Sites 1–3 (Open Problems NeurIPS 2021 competition documentation)66,175 cells, 9 batches
5ReproducedMatch the two files by barcode66,175 rows, same order
6ReproducedTake layers/counts of both files, not X66,175 × 13,953 and 66,175 × 134 counts
7ReproducedIn 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
8ReproducedPlace the gene block, then the protein block, side by side; keep cell type, batch, phase and pseudotime aside as labels, never features66,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
BatchGEX cells heldBarcode found at the same row in ADTRows of the design matrix
s1d14,7214,7214,721
s1d24,4644,4644,464
s1d35,4845,4845,484
s2d19,3539,3539,353
s2d45,0265,0265,026
s2d58,2068,2068,206
s3d18,5828,5828,582
s3d69,9779,9779,977
s3d710,36210,36210,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.

1 · rawIts counts in layers/counts
2 · provider valuesWhat the file stores in X, for comparison; the recipe does not use it
3 · normaliselog₁₀(1 + 10⁴ × count ÷ the cell’s total), per modality
4 · the stored rowIts row in the display copy of the matrix: 26 marker genes, then all antibodies

Checks

CheckResult
SHA-256 of both files against the dataset recordidentical
Barcodes, batch, cell type and pseudotime in the two filesidentical, row by row
GEX X against ln(1 + count ÷ size factor)max difference 4.8 × 10⁻⁷
ADT X against CLR over 140 / 134 antibodiesmax difference 2.4 × 10⁻⁷ / 0.113
Recovered isotype counts: sum against iso_countmax difference 0
total_counts against antibody plus isotype countsmax difference 0
Display sample rebuilt (stratified by cell type, seed 7) against the workflow’sidentical: 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 recordidentical

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.

66,175
rows
14,087
features (13,953 genes + 134 antibodies)
5
label columns

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

FeatureUnitMeaning
13,953 genes, var/_index orderlog₁₀(1 + counts per 10⁴)Gene symbol; Ensembl ID in var/gene_ids, reference GRCh38
134 antibodies, var/_index orderlog₁₀(1 + counts per 10⁴)Surface protein targeted by the TotalSeq-B antibody (e.g. CD3, CD19, CD14)

Labels kept beside the matrix

LabelUnitMeaning
cell_type45 levelsManual annotation from marker genes and expert review, made per batch (Luecken et al. 2021); a training and scoring target, never an input
batch9 levelsSite × donor; what the joint embedding is asked to forget
phaseG1 / S / G2MThe provider’s cell-cycle call
pseudotime_order_GEX, _ADT0–1Erythroid-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 logged X; their phase calls agree with phase for 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.

Reference

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.