Experimental Metadata Specification#
Overview#
This specification defines how experimental metadata (i.e. the acquisition, study, sample, and perturbation context surrounding a dataset) is recorded for Dynamic Cell Atlas datasets. It complements the Channel Metadata Specification specification (per-channel semantics) and Normalization Statistics Specification.
Experimental metadata is curated into a sibling Parquet within the Zarr store by an agent or human curation from source text (papers, portals, READMEs, file headers). This is the complete record, the required fields and the optional ones alike, each with inline provenance; the Parquet is the source of truth.
A small required floor (see Conformance) is
additionally mirrored into the dca block in zarr.json, alongside the channel
and normalization-statistics metadata it already carries (see DCA Metadata), so
these stable, every-dataset fields are compliant with the OME-NGFF storage format, which places group-level
metadata in the zarr.json attributes. That
zarr.json copy is derived from the Parquet; optional or not-yet-standardized
fields stay in the Parquet alone until they are
promoted.
Every curated value carries its provenance as plain columns alongside it (see Provenance), so each field is tied to its source and independently verifiable. Because metadata is often derived from prose, keeping it in a re-curatable Parquet lets values be corrected as the source understanding improves.
This document organizes the fields by REMBI component: Study, Study Component (imaging method + assay class), Biosample, Specimen (sample preparation), Image Acquisition (instrument), and Image Data, plus the DCA-native Perturbation model, all pulling from existing standards.
See also
See Experimental Metadata Example for a worked example (an example cultured
human iPSC dataset) of how a 3D+t live-imaging dataset is filled in,
including which concepts still land in additional_metadata.
Standards Repurposed#
This specification is, by design, mostly an assembly of existing community
standards. Its overall structure — Study / StudyComponent / Biosample /
Specimen / AcquisitionMetadata / ImageData — follows the REMBI reporting guideline; definitions of each REMBI
component these classes correspond to are on the BioImage Archive REMBI Overview and in the
REMBI metadata table (paper supplement).
Within that, every
field is anchored on a more specific established schema or ontology wherever one exists,
and DCA-native fields are added only where no standard covers the concept. Each field records its source as an exact_mappings (or
close_mappings) entry in the LinkML schema, which is the machine-readable record
of this table. The DCA spec is meant to be interoperable with the broader community.
Standard |
What it contributes to this spec |
|---|---|
Instrument & acquisition (microscope, objective, detector, imaging
environment, time increment); study |
|
Cell-line identity (name / type / modification); study fields (source, DOI,
year imaged, CellProfiler version → |
|
Sample context as |
|
Dataset-level |
|
Cell culture setup: |
|
The dataset-level container this metadata populates: |
|
Ontologies — NCBITaxon, UBERON, CL, MONDO, EFO, FBbi, HsapDv, PATO, Cellosaurus, NCBI Gene, HGNC, Ensembl, PubChem |
Term ids underpinning the cross-modality, imaging-method, cell-line and perturbation fields, enabling queries and cross-spec (e.g. OPS) projection. |
DCA extensions#
The following are the only concepts this spec adds, each at a genuine gap no referenced standard covers:
Per-value provenance (the main extension). The inline
Provenancecolumns —citation(source_url/quote/match_status/char_start/char_end),grounded,source_kind— carried alongside every curated value. The catalog records dataset-leveldata_qualitybut nothing per-field; no referenced standard models per-value grounding/citation this way (it comes from the agent’s provenance layer).Storage + promotion model. The full curated record in a sibling Parquet (source of truth), the required floor mirrored into
zarr.json(alongside the channel / normalization-statistics metadata), and the promotion path that extends that mirror to more fields. The catalog is storage-agnostic (itsmetadatais opaque JSON on the Dataset record); how that metadata is physically laid out in the store is a DCA convention.``additional_metadata`` — the promotable, evidence-backed free-text bucket. The catalog permits extra key-value pairs, but the promotion + provenance mechanism is DCA-specific.
``Biosample.group_id`` — the sample↔image linkage key, reusing the Parquet (
tables/obs) row key.Structured, modality-agnostic ``Perturbation`` — the catalog carries an opaque
sample.perturbation([json]); DCA gives it structure, anchored on OMEReagentand generalized to chemical / genetic / physical / biological. REMBI scopes treatment as a single (unstructured) Biosample “extrinsic variable”; DCA instead models it as separatePerturbation(a reusable per-construct codebook) andWellPerturbation(the per-well assignment with dosing / control / timing) classes, because the grain differs from a singleBiosampleand a free-text entry cannot capture it. The link is by key:Biosample.group_id↔WellPerturbation.plate/well(the OME-NGFF HCS path).``Specimen.specimen_state`` — the coarse specimen state (
live/fixed/unknown), a DCA controlled vocabulary. No referenced standard structures the live-vs-fixed distinction cleanly across specimen types (OME / Bio-Formats has no sample-preparation fields; FBbi has only specific specimen-preparation terms, not a clean state axis), so it is DCA-native (REMBI-derived). The specific preparation methods (such as fixation subtype, sectioning, whole-mount, clearing, expansion) live inSpecimen.preparation_methodas FBbi{ontology_term_id, label}terms.
A few descriptive fields have no machine-readable term source and are carried as
DCA-native: Experimenter.orcid and the nested Publication fields (publication
title, authors, year). Everything else maps to a referenced standard or the catalog
via exact_mappings / close_mappings in the LinkML schema.
Conformance: Required, Recommended, Optional#
All experimental metadata lives in the Parquet; the required fields are
additionally mirrored into zarr.json (the dca block). The table below is the
field reference by category; for nested blocks (microscope / objective /
detector / imaging_environment, experimenter, related_publication) it
names the block rather than each leaf — the LinkML schema is the exhaustive, authoritative list:
Required — the field MUST be present and is mirrored into
zarr.json. Where a value does not exist or apply, state it with a sentinel (see the sentinel definitions below) rather than dropping the field, so a missing value is always stated, never silently omitted or fabricated. Most required fields apply unconditionally (the cross-modality term annotations,year_imaged,imaging_method); others are required only when a condition holds and omitted otherwise (the perturbation fields when a dataset has perturbations,cell_line_namefortissue_type“cell line”,cp_versionfor a JUMP-CPdataset_name,time_increment_sfor time-lapse data).The sentinels, used in place of a value rather than dropping the field:
unknown— the value is not available to the curator (absent from the source data).na— the field does not apply to this experiment or use case.unavailable— (ontology-term fields) the value is known but no ontology term exists for it; thelabelthen carries the free-text value.
For an ontology-term field, when the
ontology_term_idisunknownornathelabelrepeats that sentinel; when it isunavailablethelabelcarries the free-text value. Which sentinels a field accepts is per field (e.g.imaging_methodaccepts only a real FBbi term orunavailable).Recommended — SHOULD be populated whenever the information exists (e.g.
related_publication,accession_id,protocol_url). Lives in the Parquet, not thezarr.jsonfloor, and is not enforced. Unlike Optional, omitting it when the value is available is discouraged.Optional — MAY be populated; do so when available, and simply omit otherwise. Lives in the Parquet; an absent Optional field is fine and needs no sentinel.
The Recommended and Optional fields (the Parquet layer, outside the zarr.json
floor) are promotion candidates: a future spec version may reclassify one as
Required (unconditionally or when a condition holds) and mirror it into the floor,
once it is verifiable, schema-stable, and consistently scoped (see
Promotion).
additional_metadata goes one step further: its free-text entries can first become
defined fields before being promoted.
Group |
Field(s) |
Required? |
Standard / ontology |
|---|---|---|---|
Study |
|
Recommended |
present when deposited; omitted for in-house data |
Study |
|
Required |
schema.org ( |
Study |
|
Required |
OME |
Study |
|
Required |
OME |
Study |
|
Required |
CellPainting Gallery |
Study |
|
Recommended |
schema.org ( |
Study |
|
Required ( |
CPG |
Study |
|
Required when JUMP-CP |
CPG |
Study |
|
Optional |
DCA-native (protocols.io) |
Study |
|
Required |
schema.org ( |
Study |
|
Required |
schema.org ( |
Study |
|
Required |
OME |
Sample |
|
Required |
cross-modality · NCBITaxon |
Sample |
|
Required |
cross-modality ( |
Sample |
|
Required |
cross-modality · UBERON / CL |
Sample |
|
Required |
cross-modality · MONDO / PATO |
Sample |
|
Required |
cross-modality · HsapDv |
Study component |
|
Required |
cross-modality · EFO only |
Specimen |
|
Required |
DCA controlled vocab (REMBI-derived) · FBbi optional |
Sample |
|
|
CellPainting Gallery + Cellosaurus ( |
Specimen |
|
Optional |
OPS |
Acquisition |
|
Optional |
OPS |
Perturbation |
|
Required when perturbed |
OME |
Perturbation |
chemical ( |
Required when chemical |
CellPainting Gallery |
Perturbation |
genetic ( |
Required when CRISPR / ORF |
CellPainting Gallery (JUMP) + HGNC / NCBIGene |
Perturbation |
per-well dosing / timing ( |
Optional |
CellPainting Gallery ( |
Study component |
|
Required ( |
FBbi only |
Acquisition |
|
Required when time-lapse |
OME |
Acquisition |
|
Optional |
CellPainting Gallery |
Image data |
|
Optional |
DCA-native · zarr-local mirror of the Scientific Dataset Catalog
|
Acquisition |
|
Optional |
OME (Bio-Formats) |
Extra |
|
Optional |
DCA-native · agent-minted, each with inline provenance columns. Lives in the
Parquet and can be elevated to a defined (and ultimately required,
|
The provenance columns are REQUIRED for
agent-curated values and OPTIONAL for manually entered values (set
source_kind: human; the citation MAY be blank).
Note
Some CellPainting Gallery fields are deliberately out of scope here because
they belong to another layer. The per-channel staining/optics details
(Label_Mechanism / Label_Molecule / Label_Reagent /
Label_Fluorophore / Label_Structure and the excitation/emission
peaks/widths) belong with channel metadata (see Channel Metadata Specification);
they are not defined as structured fields there, so they are usually recorded in
the channel’s free-text description. The structural fields
(File*, Batch / Plate / Well / Site, Plate_Size,
Image_*, Microscope_Pixel_Size) live in the array / HCS structural layer
(zarr.json dimensions, dtype, scale, plate layout), not in experimental
metadata.
Note
Identity, authority, and image linkage. Several facts are reachable through more than one field; each has a single authoritative slot, with the others as convenience mirrors:
Cell-line identity →
tissue’sontology_term_id(a CellosaurusCVCL:term) is authoritative;cell_line_idmirrors it.Publication → each
related_publicationentry is a self-contained citation (doi+ title + authors + year).Assay vs. modality are distinct axes, one ontology each (not mirrors):
assay(EFO only) is the assay / experiment class; the acquisition modality is the Study-Componentimaging_method(FBbi only). Both are Study-Component-level fields, each anontology_term_id+labelpair.
All ontology / database identifiers are stored as colon CURIEs (e.g.
CVCL:0030, NCBIGene:7157, PubChem:2244) that expand to a resolvable URL
via the schema prefixes block, so a stored value names its own source database
rather than relying on the slot name. Sample-to-image linkage is carried by
Biosample.group_id — the row key of the Parquet (tables/obs) table,
with one row per image group: a single-image store has one row, an HCS plate one row
per well (which WellPerturbation.plate / well also key on).
Promotion to zarr.json#
The required floor is already mirrored into zarr.json; every optional or
recommended field stays in the Parquet alone. This keeps agent-extracted,
unstandardized, or experiment-specific fields queryable as soon as they are curated, so
consumers do not have to wait for a spec revision before they are available. An optional
or recommended field MAY be promoted into the zarr.json dca block in a future
spec version (joining the required floor), but only when all of the following hold:
Verifiable — the value can be confirmed deterministically (measured from the array, or via a reproducible grounded / cross-source check), not solely a model’s prose extraction.
Schema-stable — its shape and vocabulary are settled and not expected to churn as taxonomies / ontologies update.
Consistently scoped — its applicability is well defined, so a consumer knows when to expect it. This can be either:
corpus-wide — it applies to essentially all datasets (written uniformly,
null/"unknown"where unavailable) and joins the unconditional required floor; orexperiment-class conditional — it is optional corpus-wide but required for a defined class of experiments (e.g. perturbation fields for screens,
cell_line_*whentissue_typeis “cell line”). Such a field is promoted tozarr.jsonand made conditionally required on that class, rather than left optional — so consumers of that experiment type can rely on it.
Promotion is a per-field specification decision made via a version bump. For a
corpus-wide field it applies uniformly; for an experiment-class field it applies
to that class. When a field is promoted, the Parquet remains the source of truth
and the zarr.json copy is a derived, versioned snapshot.
Acquisition Metadata#
Image Acquisition is about how the images were captured. It is optional, so it lives
in the Parquet (not zarr.json). The only field expected across datasets is
time_increment_s (conditional, for time-lapse); see the field reference under
Conformance.
A minimal, optional OME instrument set — microscope, objective,
detector, imaging_environment, and acquisition_date — is defined in the
LinkML schema (with OME
exact_mappings) but not enumerated here.
Z-calibration correction factors. Some objectives introduce a refractive-index
mismatch between the immersion medium and the sample that causes the physical Z step
to differ from the nominal (stage-commanded) value. When a correction factor is
known (e.g. a 1.43Ă— axial-distortion correction for a 20Ă—/0.8 NA air objective
imaging through aqueous medium per Diel et al. 2020), record it in
AcquisitionMetadata.additional_metadata as
{"name": "z_ri_correction_factor", "value": <factor>} alongside the nominal Z
spacing already stored in coordinateTransformations. The corrected physical Z step
is nominal_z_step_um Ă— z_ri_correction_factor; downstream analyses requiring
physically-accurate axial distances should apply this multiplier.
Image Data#
Image Data contains image-level metadata. The one structured field here is
ImageData.processing_variant: the zarr-local tag for the computational variant that
produced this array (e.g. raw / denoised / deconvolved); the full derivation
(parent dataset, algorithm, parameters) is a Scientific Dataset Catalog
transformed_from Lineage Edge, not duplicated here. The remaining image-level fields
(format, dimensions, pixel and voxel size, channels) are not otherwise captured here:
they live in the OME-NGFF spec arrays and the
Channel Metadata Spec.
Study and Study Component#
The sub-groups, and the standard each field draws on:
study— experiment fields on OMEExperiment(type, description) and the CellPainting Gallery study fields (Source,DOI_to_Cite,Year_Imaged); people on OMEExperimenter(name, email, institution); dataset-leveldataset_name/license/related_publication/release_dateon schema.org (name/license/citation/datePublished).study_component— two experiment-class descriptors, each anontology_term_id+labelpair:assay(EFO: the assay / experiment class, cross-modality / CELLxGENE-aligned) andimaging_method(FBbi: the acquisition modality, e.g. confocal or light-sheet). One ontology per field: EFO answers “what kind of experiment”, FBbi “how was it imaged”. Both are REQUIRED for every imaging dataset (imaging_methodusesunavailablewith a free-text label only when no FBbi term fits;unknownandnaare not permitted).
Biosample and Specimen#
Biosample is about what was imaged, for example the species of the organism being imaged, whether a particular cell line is used, genetic background, etc. Specimen describes how the sample was prepared for imaging.
The sub-groups, and the standard each field draws on:
biosamples— cell-line identity from the CellPainting Gallery (cell_line_name/cell_line_type/cell_line_modification+ a Cellosauruscell_line_id;parent_cell_line_idfor the parental line when the imaged line was derived by gene editing or reprogramming); sample context reuses the CZI cross-modality schema v1.1.0 (CELLxGENE-aligned) asontology_term_id+labelobject pairs:organism(NCBITaxon),tissue(UBERON / CL) +tissue_type,disease(MONDO / PATO), anddevelopment_stage(HsapDv) — each a list of{ontology_term_id, label}objects. Whentissue_typeis"cell culture",tissue’sontology_term_idtakes a Cell Ontology (CL) term identifying the cell type (e.g.CL:0002620for induced pluripotent stem cell). See the cross-modality schema for the fulltissue_typevocabulary and term guidance.specimens—specimen_staterecords the coarse specimen state at imaging time (live/fixed/unknown), a DCA controlled vocabulary (REMBI Specimen module; no source ontology structures the live-vs-fixed state). The multivaluedpreparation_methodcarries the specific FBbi sample-preparation method(s) — a descendant ofFBbi:00000001, as an{ontology_term_id, label}term — withunavailable+ a free-textlabelwhen no FBbi term fits (e.g. clearing, expansion),nawhen no preparation applies (e.g. a live sample), andunknownwhen the source does not record it.
Note
Gene-edited cell lines (``parent_cell_line_id``). When the imaged line was
derived from a registered parental line by CRISPR editing or reprogramming,
record the parental Cellosaurus accession in parent_cell_line_id (e.g.
"CVCL:Y803" for WTC-11 hiPSC). cell_line_id then identifies the
engineered clone.
hiPSC and reprogrammed cell lines (development stage). Keep
organism (the donor’s species), but set development_stage’s
ontology_term_id to "na": a reprogrammed cell line has no organismal life
stage (per cross-modality). Donor age, reprogramming method, and passage number go
in Biosample.additional_metadata; the cells’ pluripotent identity goes in
tissue’s ontology_term_id (a Cell Ontology stem-cell term).
Organoids (``tissue_type = “organoid”``). Set tissue’s
ontology_term_id to the UBERON term for the tissue of origin (not a
CVCL: accession); the cell_line_* fields do not apply.
See the field reference under Conformance for the
full Study / Sample field list with required-vs-optional status, and the
Study, Experimenter, Biosample, Specimen classes in the
LinkML schema for the
authoritative field list.
Free-Text Gap-Fill#
Free-text additional_metadata is the mechanism for concepts that have no
stable structured schema in this version. Examples include the iPSC-specific
identifiers (donor, clone, hPSCreg id, differentiation state) that the
structured cell_line_* fields do not capture, and any other field a standard
model does not cover. Rather than forcing
premature structure, such values are recorded as additional_metadata entries
available on study and biosamples:
{
"name": "differentiation_state",
"value": "definitive endoderm, day 5 of directed differentiation",
"provenance": {
"grounded": true,
"citation": {
"source_url": "https://doi.org/10.1234/example",
"quote": "hiPSCs were differentiated toward definitive endoderm over five days",
"match_status": "exact"
},
"source_kind": "agent"
}
}
Each additional_metadata entry MUST carry a name and value and
SHOULD carry its provenance columns. An agent
MAY mint new additional_metadata fields; as with every agent-curated value,
each MUST carry its extracted value, source citation, and grounding flag.
As fields here stabilize and gain a community schema, they are promoted to
first-class structured slots in a future version. additional_metadata is a
staging area, not a permanent home.
Perturbation Metadata#
Perturbation metadata is modelled as a modality-agnostic ``Perturbation``
(mapped to the OME Reagent entity), specialized by a modality discriminator
into a chemical or genetic block. This generalizes beyond chemical
perturbation to CRISPR / gene knockout / ORF (and physical / biological).
The genetic block carries the gene target that CellPainting Gallery cannot express
(its Treatment_Category enum names CRISPR/ORF but provides no gene
field). The fields are harmonized across three sources: OME/Bio-Formats Reagent,
the CellPainting Gallery Treatment_* fields, and the JUMP compound/orf/crispr
tables.
These fields apply to any perturbation dataset, not just CellPainting Gallery /
JUMP ones; the cpg: / JUMP entries are alignment mappings (provenance), not a
requirement that the data originate from those projects. A custom drug screen, an
IDR dataset, or an in-house CRISPR experiment populates the same Perturbation
/ WellPerturbation structure, with values sourced from wherever its metadata
lives (source_kind records that, e.g. original_data from the source’s own CSV).
Required when present. A dataset with no perturbations simply has no
Perturbation / WellPerturbation. But if a dataset has perturbations, the
core fields are required and written to zarr.json (well level):
perturbation_id + modality on the Perturbation, and plate / well
/ control_class on the WellPerturbation. perturbation is required on
every treated or control well (treatment / negcon / poscon) but is
omitted for an empty well, which has nothing to record. The chemical
vs genetic block is required according to modality. All three conditionals
are enforced as schema rules (see Validation).
The Perturbation definition (a codebook entry) is reusable across wells. Its
assignment is recorded per (plate, well) for arrayed screens as a
WellPerturbation row. See the Perturbation, ChemicalPerturbation,
GeneticPerturbation, and WellPerturbation classes in the
LinkML schema.
Concept |
OME |
CellPainting Gallery |
JUMP |
|---|---|---|---|
External id |
|
|
|
Modality |
— |
|
|
Control class |
— |
|
control |
Concentration |
— |
|
structured value+unit |
Compound ids |
( |
|
|
Gene target |
— |
absent |
|
The reconciled vocabularies (see the schema enums):
modality— lowercased superset of CPGTreatment_Categoryand JUMPperturbation_modality, plus non-molecular categories:compound|orf|crispr|shrna|mirna|physical(e.g. heat shock) |biological|other|unknown.control_class—treatment|negcon|poscon|empty(CPG’s redundantControldropped; JUMP’semptyretained).
Known gaps and contradictions:
Gene target gap — CellPainting Gallery has no gene field; filled from JUMP.
Concentration type — CPG records free text; DCA and JUMP use
{value, unit}. The schema keeps structuredvalue/unitwith a free-texttextfallback.Gene identifier — NCBI Gene ID is the canonical key (JUMP-native); HGNC symbol is the label; Ensembl is optional cross-map.
Deferred: pooled / optical pooled screens (OPS)#
WellPerturbation covers arrayed screens (one perturbation per well). In a
pooled / optical pooled screen (OPS) a single well contains a library of many
sgRNAs and the perturbation is assigned per cell by decoding an integrated
barcode after imaging. That assignment is therefore not expressible per well. The
pooled-screen reagent fields (sgRNA protospacer, PAM, barcode, target locus) and the
per-cell assignment table are deferred to a future version, as is the broader move
from this spec’s current Parquet tables to AnnData / SpatialData conventions for
single-cell data. The Perturbation definition above is unchanged for pooled
libraries; only the level at which a perturbation is assigned differs (per well for
arrayed screens, per cell for pooled).
Provenance#
Because metadata can be extracted by an agent, each value carries its provenance
(source_kind + grounding citation + grounded flag). source_kind is
always required — it is the discriminator that tells a consumer whether a value was
agent-extracted, human-entered, or taken from the source’s own
original_data. The grounding citation is required for ``agent`` values and
optional for ``human`` / ``original_data`` (left blank when there is nothing to
cite). This lets a consumer decide how much to trust a value without re-reading the
source. The provenance has two equivalent layouts for the two stores:
In the Parquet it is plain columns alongside each value (one row per group, companion columns per field).
In the object form (
zarr.json/ the worked example) it is theExperimentalMetadata.provenancemap, keyed by each value’s dottedfield_path(e.g.biosample.organism). The values stay plain and provenance travels as a parallel layer; a deterministic post-ingest step folds the two together. Free-textadditional_metadatavalues are keyed the same way, by<block>.additional_metadata.<name>, so all provenance lives in the one map.
grounded is computed deterministically by the agent’s grounding gate, not
self-reported by the model: a grounding gate checks whether the cited quote is
an (exact or fuzzy) substring of the fetched source page, recording the result as
match_status (exact / fuzzy / none) plus the character offsets of the
match. The gate runs at curation time against the raw source pages; match_status
and the offsets carry its result so the grounding stays auditable downstream, where
the raw corpus is no longer available.
Field |
Type |
Description |
|---|---|---|
|
string (uri) |
Where the value was read from. |
|
string |
Verbatim excerpt from the source supporting the value. |
|
enum |
Grounding-gate result locating the quote in the source page: |
|
integer |
Half-open span of the located quote in the source page’s raw text; blank when
|
|
boolean |
|
|
enum |
|
Validation#
The LinkML schema is the
authoring layer and single source of truth for all three groups; from it we generate
Pydantic models (enforced by the validator) and a committed
JSON Schema (interop artifact and test-suite oracle cross-check).
Authoring in LinkML (rather than hand-maintaining JSON Schema and Pydantic) also gives
machine-readable cross-spec alignment: each slot records its exact_mappings to
Bio-Formats/OME, CellPainting Gallery, CZI cross-modality, schema.org, the
Scientific Dataset Catalog, and external ontologies. The same Study / Biosample
classes can therefore be validated against, or projected to, other specs that publish a
LinkML schema (e.g. OPS) without a second validator.