Chapter 17 — FAIR Principles & Data Sharing
Where this chapter sits. Companion to Lecture 17 and Tutorial 17. Cross-reference: Appendix E — Gene-Expression Databases & File Formats, Appendix G — Methods Section Template.
17.1 Why this chapter is the closing chapter
Every paragraph of this workshop has been about generating good scRNA-seq results. This chapter is about preserving them — making sure that the data you’ve collected, the analysis you’ve done, and the conclusions you’ve drawn don’t disappear into a lab hard drive.
Done well, data sharing produces:
- Citations. Reanalysis papers cite their input datasets. A well-deposited dataset is reused; reuse means citation.
- Reproducibility. A reviewer asking “can I see your raw data?” gets a one-line answer.
- Atlas integration. Your dataset can be pulled into HCA / CELLxGENE / Tabula Sapiens. Visibility you won’t get otherwise.
- Funder compliance. NIH (2023+) and most major funders require a Data Management & Sharing Plan; FAIR-aligned plans pass review faster.
Done poorly, sharing produces nothing — the dataset sits in someone’s old lab drive, eventually unreadable, unused, eventually deleted.
The cost of doing FAIR is paid up-front during the project. The payoff is paid back over the rest of your career and the lifetime of the data. Skipping it feels efficient and is not.
17.2 The FAIR principles
Wilkinson et al.1 proposed four guiding principles for data management, summarized in Table 1.
| Principle | One-line definition |
|---|---|
| Findable | Data + metadata have a persistent identifier searchable in a registry |
| Accessible | Anyone (or anyone authorized) can retrieve the data via an open protocol |
| Interoperable | Data uses shared vocabularies so different datasets combine cleanly |
| Reusable | Provenance + clear licence + sufficient metadata for reanalysis |
FAIR is not “open” — FAIR data can be access-controlled (e.g. patient genomes in a controlled-access archive). The “A” requires that the protocol for access is open and standardized, not that the data itself is.
Every line in your data-deposition workflow should map back to one of these four. The most common failure is “I”; the most common omission is “F” (people deposit data without a stable identifier or without indexing it where searchers will look).
FAIR is a framework for making data reusable, not just accessible. Findable means giving data a stable, searchable identifier (a GEO accession, a DOI) so other researchers can discover it without already knowing it exists. Accessible means providing an open, documented protocol to retrieve the data — which can still require authentication for sensitive human data. Interoperable means using controlled vocabularies (Cell Ontology for cell types, Uberon for tissues, MONDO for diseases, EFO for assay types) so your dataset’s metadata can be joined to other datasets’ metadata without manual curation. Reusable means providing enough provenance — methods, software versions, sample metadata, a clear license — that an independent researcher could reproduce your analysis from your raw data. The “I” criterion is the one that most datasets fail: saying “B cells” in a free-text field rather than CL:0000236 means every downstream data integration requires a human to manually reconcile the term against every other study’s vocabulary. Ontology terms are what make computational atlases possible2.
FAIR in practice for scRNA-seq. The table above maps cleanly to specific choices in data deposition. For Findability: obtain a stable accession (GEO GSE, SRA PRJNA, or CELLxGENE slug) and register your dataset in at least one indexed repository — not just a lab website that may go offline. For Accessibility: make sure that not only the data but also the per-cell metadata is downloadable via standard protocols (HTTPS/FTP), and that the data remains accessible under controlled access if human-sensitive. For Interoperability: the CELLxGENE schema3 is the highest bar and most demanding interpreter of this criterion — its required ontology fields are the reason CELLxGENE can build an integrated atlas of millions of cells across thousands of studies. For Reusability: deposit analysis code to Zenodo or GitHub (with a DOI for archival), provide a methods section that specifies exact software versions, and include the canonical sample sheet that links every cell to its biological sample.
17.3 The repository ecosystem
For an scRNA-seq study you typically deposit in multiple repositories, each serving a different audience:
NCBI hierarchy (the canonical raw-data and processed-data archive)
- BioProject (
PRJNA######) — the study as a whole. One per paper. - BioSample (
SAMN########) — each biological sample. Tissue, treatment, donor metadata lives here. - SRA (
SRR#######) — the raw sequencing reads (FASTQs, BAMs). - GEO (
GSE######)4 — the processed data: counts matrices, normalized files, expression metadata. GEO records pull SRA + BioSample IDs in.
For scRNA-seq, you create all four. The Appendix E reference card details what each one holds.
Single-cell-aware repositories
Beyond the generic raw archive, deposit in a scRNA-seq–native repository so the data is queryable as scRNA-seq. Table 2 summarizes the major options.
| Repository | Run by | What it accepts | Strengths |
|---|---|---|---|
| CELLxGENE Discover3 | CZI | AnnData (.h5ad) with required metadata |
Browseable atlas, in-browser visualization, schema-validated |
| Human Cell Atlas Data Portal5 | HCA Consortium | Raw + processed, full provenance graph | Strict QC, integrated atlas |
| Single Cell Expression Atlas | EBI | Counts + author annotations | Curated, queryable per-gene across studies |
| Single Cell Portal | Broad Institute | Loose; raw + processed | Easy upload, less curation |
The recommended workflow in 2026: raw FASTQs to SRA + BioProject; processed data to GEO; AnnData with cell-type metadata to CELLxGENE. The triple-deposit is not redundant — each repository serves a different audience (raw-data reanalyzers, traditional bench biologists, single-cell-tool users).
17.4 The metadata is most of the work
You can’t reuse a counts matrix you can’t interpret. “Sample 1, Sample 2, Sample 3” is not metadata. At minimum, your metadata answers: who is the donor, what’s the tissue, what’s the condition, what’s the protocol, who processed it, when, with what library prep, on what machine, with what software version.
For human samples: also consent type, age range (often binned for de-identification), self-reported sex / gender, and ancestry.
The CELLxGENE schema3 is the most demanding of the major repositories and also the most reusable. Its insistence on ontology-typed fields is exactly what makes cross-dataset atlases possible2. The required fields are listed in Table 3; meeting this bar gets you GEO + HCA compatibility for free.
Three fields deserve a brief explanation that is easy to get wrong:
disease_ontology_term_idencodes the clinical disease state of the donor, not the experimental treatment. For an in vitro perturbation (IFN-β stimulation, a CRISPR knock-out), both the stimulated and unstimulated cells are biologically normal (PATO:0000461). The perturbation goes in a free-texttreatmentcolumn alongside the required schema fields. Encoding an experimental treatment as a disease term breaks atlas integration.is_primary_datais a Boolean flag:TRUEfor data deposited by the generating lab for the first time;FALSEfor a re-analysis of someone else’s data. This flag is how atlases avoid double-counting the same cells.suspension_typedistinguishescell(dissociated whole cells, the usual case) fromnucleus(single-nucleus RNA-seq / snRNA-seq). This field matters for atlas integration because snRNA-seq counts are systematically lower than scRNA-seq counts for the same cell type.
Why ontology terms matter for interoperability. When two independent labs deposit “B cells” in free-text fields, a computational tool cannot know whether both mean the same thing without human curation. But when both use CL:0000236, they are guaranteed to be using the same controlled definition from the Cell Ontology, which is maintained with a formal taxonomy. The ontology also carries hierarchical relationships: CL:0000236 (B cell) is a child of CL:0000945 (lymphocyte), so a query for “all lymphocytes” will automatically include B cells without needing to know all the specific child terms. This hierarchical querying is what makes large-scale meta-analyses and cell atlases computationally tractable2,6. The human Cell Ontology has ~2,500 cell types; most immune cell types have well-defined terms, while many tissue-specific or novel cell states require either choosing the closest parent term or working with the CL maintainers to add a new term.
An ontology is a controlled vocabulary with formal definitions and hierarchical relationships. When you label a cell type as CL:0000236 rather than “B cell,” you are linking your data to a shared, versioned, internationally-maintained definition. Any downstream tool, database, or analysis pipeline that understands the Cell Ontology can automatically infer that CL:0000236 is a lymphocyte, a blood cell, and a hematopoietic cell — and can join it with every other dataset that uses the same term. Free-text labels break this: “B-cell,” “Bcell,” “B_cell,” “mature B lymphocyte,” and “B cell” are all distinct strings to a computer but the same thing to a biologist. The CELLxGENE Discover schema requires ontology terms precisely because they are the technical prerequisite for building multi-million-cell integrated atlases.
CL:0000236 is what makes your dataset interoperable with every other CELLxGENE-deposited dataset.
| Field | Vocabulary |
|---|---|
donor_id |
study-internal, anonymized |
tissue + tissue_ontology_term_id |
Uberon (UBERON:0002048 = lung) |
cell_type_ontology_term_id |
Cell Ontology (CL:0000236 = B cell) |
disease_ontology_term_id |
MONDO or PATO:0000461 (normal) |
assay_ontology_term_id |
EFO (EFO:0009922 = 10x 3’ v3) |
organism_ontology_term_id |
NCBI Taxonomy (NCBITaxon:9606 = human) |
sex_ontology_term_id |
PATO (PATO:0000383 female / PATO:0000384 male) |
development_stage_ontology_term_id |
HsapDv (human) / MmusDv (mouse) |
self_reported_ethnicity_ontology_term_id |
HANCESTRO |
is_primary_data |
Boolean |
suspension_type |
cell / nucleus |
17.5 File formats and what to deposit
Table 4 lists the file types you should deposit at each layer of the data lifecycle.
.h5ad) is the preferred archival format for annotated objects; .rds files are Seurat-version-locked and are not future-proof.
| Layer | Format | Why |
|---|---|---|
| Raw reads | .fastq.gz (paired or single-end) |
Universally supported |
| Aligned reads | .bam + .bai |
Optional — useful for re-alignment |
| Per-cell counts | .h5 (10x), .mtx + barcodes.tsv + features.tsv |
Cell Ranger output |
| Annotated object | .h5ad (AnnData) preferred; .rds (Seurat) accepted by some |
CELLxGENE / scverse-native |
| Metadata sheet | .csv / .tsv (also embedded in .h5ad via .obs) |
Sample-level + per-cell |
| Analysis code | git repo (Zenodo for archival) | Reproducibility |
Seurat .rds files are not future-proof. They lock the data to the Seurat version that wrote them. For long-term archival use AnnData (.h5ad) — versioned, language-agnostic, HDF5-based, readable by Scanpy / Seurat 5 / anndata-rs.
Both .h5ad (AnnData) and .rds (Seurat) store an annotated single-cell object, but they have very different archival properties. .h5ad is an HDF5 file with a defined, versioned schema: the raw counts are in adata.X or adata.raw.X, normalized data in adata.layers, per-cell metadata in adata.obs, per-gene metadata in adata.var, and embeddings in adata.obsm. It can be read by Python (anndata), R (zellkonverter::readH5AD(), anndata, or SeuratDisk), Rust (anndata-rs), and the CELLxGENE browser — it is language-agnostic. .rds is an R binary serialization that includes the full Seurat object graph — but Seurat’s internal structure has changed substantially between v4 and v5, so a .rds written by Seurat 4 may not load in Seurat 5 without conversion. For a dataset that should remain usable in 2030, .h5ad is the correct choice for archival. The conversion from Seurat to AnnData is done via zellkonverter::writeH5AD() (recommended), sceasy::convertFormat(), or SeuratDisk::SaveH5Seurat() + SeuratDisk::Convert(). (Seurat itself does not ship a WriteH5AD() function.)
The CELLxGENE schema validation step. The CELLxGENE consortium provides a Python command-line validator (cellxgene-schema validate <file.h5ad>) that checks every required field, every ontology ID, and the overall structure of the .h5ad before submission. Running this validator is mandatory before attempting to submit to CELLxGENE Discover — the portal will reject non-conformant files. The validator is version-specific: the schema is updated periodically (v4, v5, …) and an .h5ad that passed an older validator version may not pass the current one. Always run the current validator, not a cached version from months earlier. Common validation failures include: missing required fields (e.g., suspension_type not added to the .obs frame), deprecated ontology IDs (cell type or disease ontology terms that were retired in a recent ontology release), and incorrect data types (e.g., is_primary_data stored as a string "TRUE" rather than a Boolean True).
The CELLxGENE Discover schema (currently v5+) requires a specific set of per-cell columns in adata.obs, and each must use the exact controlled vocabulary specified. Required fields with no defaults: cell_type_ontology_term_id (Cell Ontology CL: prefix), tissue_ontology_term_id (Uberon UBERON: prefix), assay_ontology_term_id (EFO EFO: prefix), disease_ontology_term_id (MONDO MONDO: or PATO:0000461 for normal), organism_ontology_term_id (NCBITaxon), sex_ontology_term_id (PATO), is_primary_data (Boolean), and suspension_type ("cell" or "nucleus"). There is no fallback for missing or NA values — the validator will reject the file. Each ontology ID must be a currently valid, non-deprecated term in the appropriate ontology version used by the schema; IDs are versioned and can be deprecated in new ontology releases without notice. The practical workflow is: (1) look up current IDs at the EBI Ontology Lookup Service (https://www.ebi.ac.uk/ols4/); (2) add them to the per-cell metadata frame; (3) run cellxgene-schema validate locally before submission; (4) repeat until the validator passes cleanly.
17.6 Plan submission at experimental design time
The biggest mistake: thinking about deposition only after the manuscript is in revision. By then:
- Sample-level metadata is buried in lab notebooks across multiple students
- Ontology terms have to be reverse-engineered from sketchy memory
- You need to chase three former rotation students for their consent forms
Do this instead: at experimental design time, build the canonical sample sheet (Tutorial 17 ships a template). Include every field you’ll need at deposition. Version-control it alongside your code. As samples come in, update the sheet. At the end of the project, the sheet is your BioSample / SRA / GEO upload.
This single discipline will save you a week of frantic data archeology at submission time.
17.6b Design consideration: one canonical sheet as the single source of truth
The three NCBI upload templates (BioSample, SRA, and GEO) all use sample_id as the join key that links records across portals. NCBI’s accession-linking is case-sensitive and literal: “donor1_CTRL” and “Donor1_CTRL” will not link. Manual transcription of sample names across three spreadsheets is the single most common cause of broken cross-links in a submission.
The solution is to maintain one canonical sample sheet in version control and programmatically derive all upload templates from it with transmute() or equivalent. Every name, date, and ontology ID appears in one place; all three submissions are generated from the same object. Inconsistencies must be fixed in the sheet — they then propagate correctly to all outputs. Tutorial 17 demonstrates this pattern end-to-end.
17.7 The end-to-end submission workflow
Eight steps:
- Plan. Build the canonical sample sheet at design time.
- Create BioProject (one per study) at submit.ncbi.nlm.nih.gov. Get a
PRJNA######. - Create BioSamples (one per sample). Batch-upload
.tsvfrom the canonical sheet. Each gets aSAMN########. - Submit raw
.fastq.gzto SRA. Each sequencing run gets anSRR#######. Link each to itsSAMN. - Analyze the data. This is the rest of the workshop.
- Submit processed counts + per-cell metadata to GEO. Get a
GSE######. Link to BioProject + SRA. - Convert Seurat → AnnData and submit to CELLxGENE Discover. Schema-validate first; iterate until the validator passes.
- Cite all accessions in your manuscript’s Data Availability section.
Tutorial 17 walks all of this hands-on, generating the BioSample / SRA / GEO upload .tsv files and the AnnData from the workshop’s ifnb_annotated_final.rds.
17.8 Common errors
Table 5 collects the errors most commonly encountered during FAIR metadata preparation and submission, their causes, and the fix.
| You see | What’s wrong | What to do |
|---|---|---|
SeuratDisk::SaveH5Seurat fails |
Seurat v5 Assay5 not supported by old SeuratDisk | Use the dev branch: remotes::install_github("mojaveazure/seurat-disk") |
bitr returns empty |
Case mismatch (Cd3d vs CD3D) or wrong organism DB |
Check; use org.Mm.eg.db for mouse |
| CELLxGENE validator: “ontology term not found” | Ontology IDs get updated periodically | Look up current IDs at ols4 |
| Validator passes locally but submission portal rejects | Schema version updates faster than your local validator | Check current schema before submitting |
| “Inconsistent sample names” between BioSample / SRA / GEO sheets | Manual transcription error | Always derive all sheets from a single canonical sheet programmatically |
17.9 Where this material is also discussed
- Lecture: Lecture 17
- Tutorial: Tutorial 17
- Database & file-format reference: Appendix E
- Methods-section template (the “Data availability” paragraph): Appendix G
- scNotebooks Module 13 — parallel walkthrough
17.10 Going further
The principles come from the FAIR paper1; the single-cell infrastructure that operationalizes them is the Human Cell Atlas5, its cell-type ontology standards2, and the CZ CELLxGENE Discover platform3 (whose schema is documented at github.com/chanzuckerberg/single-cell-curation). The canonical raw/processed archive is NCBI GEO/SRA4, and large reference atlases such as Tabula Sapiens6 show what well-shared data enables. Also consult the NIH Data Management & Sharing Policy (2023), required for all NIH-funded studies. The full curated list is on Key Papers, Reviews & Benchmarks.