EnVar microschema · class
Extreme-Heat-Day Flag Record
ExtremeHeatDayFlagRecord
Canonical record for a daily binary extreme-heat-day flag, defined against a local 95th-percentile Tmax baseline. Pins heat_metric_family = heat_wave_flag, value_data_type = binary_flag, and requires the percentile-reference-period slots in DerivedHeatMetric to be populated.
Where it sits
SpecialisesEnvironmentalExposureRecord
Fields
Who (or what group) the values belong to — a study cohort or an individual patient, named by an anonymous code rather than anything identifying.
The patient or cohort the exposure value is attached to. Carried as an opaque identifier; PHI must not appear here.
Example
cohort:phoenix_aki_2022 — an opaque cohort handle — no PHI
Why it matters & mappings
An exposure value is meaningless without knowing whose exposure it is. The opaque handle is what lets the sidecar be joined back to the right cohort or patient in the health-data layer while staying PHI-free.
This block pins down exactly what was measured. Instead of relying on a nickname like "tmax", it uses shared vocabularies to say "daily maximum air temperature, in degrees Celsius", so any tool or researcher reads it the same way.
The variable identity object — what physical quantity is being captured. Bound to VariableIdentity (see envar_variable). Readable rename of the profile's observation_type anatomy slot.
Example
None — abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance
Covered by — 5 standards
Why it matters & mappings
Without a standard variable identity, "tmax" in one file and "TMAX" in another cannot be recognised as the same physical quantity, and unit mix-ups (Celsius vs Fahrenheit vs Kelvin) go undetected — pooling and cross-study comparison silently break.
Mappings: msprofile:observation_type
See also: https://cfconventions.org/, https://ucum.org/
This block says where the number applies and how it was pulled out of a map. Environmental data usually comes as a grid of cells covering a region; this records how big those cells are and how the value for a specific place was picked from them.
Spatial reference object describing the native grid and extraction. Bound to SpatialReference (see envar_spatial). Readable rename of the profile's location anatomy slot.
Example
None — abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance
Covered by — 5 standards
Why it matters & mappings
A value without its grid, coordinate system, and extraction method cannot be located or compared: a 1 km neighbourhood average and a ~31 km regional average look identical as numbers but describe very different exposures, and the extraction cannot be re-run without the method.
Mappings: msprofile:location
See also: https://epsg.io/
This block explains the time ruler behind each value: how long a period each number summarises (a day, a month), how it was summarised (maximum, mean), and — surprisingly important — when a "day" is considered to start and end.
Temporal reference object describing resolution, aggregation, and day-boundary convention. Bound to TemporalReference (see envar_temporal). Readable rename of the profile's temporality anatomy slot.
Example
None — abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance
Covered by — 5 standards
Why it matters & mappings
A "daily maximum" is ambiguous without the day-boundary convention: Daymet days end at local midnight while PRISM days end at 12:00 GMT, so the same calendar date can cover different physical hours — the most-omitted detail in the heat literature and a known source of cross-product disagreement.
Mappings: msprofile:temporality
See also: https://cfconventions.org/
Most exposure values are not direct readings from an instrument at someone's house — they are estimates computed from weather stations, satellites, or models. This block says which estimation method produced the numbers and what went into it.
The exposure-model object describing how values were produced. Bound to ExposureModel (see envar_model). Readable rename of the profile's methodology anatomy slot, narrowed to the model itself: other methodology-adjacent concerns (source dataset, tool run, provenance chain, derived heat metric) are surfaced as separate envar-extension slots.
Example
None — abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance
Covered by — 5 standards
Why it matters & mappings
The same quantity can be estimated by station interpolation, satellite retrieval, or model reanalysis, each with different inputs and biases; without the model description, values from different products get pooled as if equivalent and their systematic differences stay invisible.
Mappings: msprofile:methodology
The actual numbers live in a separate data table that travels with this record. This block is the map between the two: it names which column holds the values, which holds the person identifier, which holds the date, and so on.
Data-layout object binding this sidecar to the columns of the companion data file — see envar_layout. Required: without it a consumer cannot locate the values the sidecar describes.
Example
None — abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance
Covered by — 5 standards
Why it matters & mappings
The sidecar describes values that live in a companion CSV/parquet file; without the column bindings a consumer cannot tell which column holds the values, subjects, or dates, so the metadata is unanchored and the data unusable — hence the slot is required.
Exposure values are derived from a published data product (for example Daymet, a daily weather dataset). This block names that product precisely — including its version, citation, and license — so anyone can find it and check its documentation.
Source dataset object — see envar_source.
Example
None — abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance
Covered by — 5 standards
Why it matters & mappings
Without the upstream product's identity, version, DOI, and license, the record cannot be cited, its documented biases cannot be looked up, and reuse terms are unknown — and two records built from different product versions cannot be told apart.
See also: https://spdx.org/licenses/, https://www.doi.org/
This block is the receipt for the software step that produced the values: which program ran, which exact version, with what settings, and when. With it, someone else can re-run the same step and get the same numbers.
The current ToolRun — see envar_toolrun.
Example
None — abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance
Covered by — 5 standards
Why it matters & mappings
Without the exact tool name, version, container image, parameters, and timestamp, the record cannot be re-run: "we used the daymet tool" is not reproducible, but a pinned container invocation is.
Environmental data describes places, but health research is about people. This block records how the value for a place was attached to a particular person — for example, by looking up the map cell containing their home address — since that step involves real choices that affect the result.
Linkage-method object — see envar_linkage.
Example
None — abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance
Covered by — 5 standards
Why it matters & mappings
Attaching a place-based value to a person is a lossy, choice-laden step (geocoding, point vs buffer extraction, date alignment) — the "linkage descriptor" gap the GECC/EIRENE forum names as central. Without it, two studies using the same data product can differ solely through undocumented joins.
Schemas change over time, like editions of a paper form. This is the edition number stamped on the document, so anyone reading it knows exactly which version of the form was filled in and can interpret the fields accordingly.
The version of the EnVar micro-schema this document conforms to. Required on every sidecar so downstream consumers can branch on schema evolution.
Example
0.1
Covered by — 5 standards
Why it matters & mappings
Downstream consumers must branch on schema evolution: a parser built for one version will silently misread or wrongly reject sidecars written against another. Without this slot there is no way to tell which iteration of the schema a document targets.
See also: https://semver.org/
A unique serial number for this metadata document, like the tracking number on a parcel. Wherever the data value ends up, that number lets you look up exactly where it came from and how it was made.
Stable identifier for this sidecar / record (ULID recommended). This is the value the downstream health-data layer's source-value field carries to link a row back to its provenance (for OMOP, that field is external_exposure.exposure_source_value).
Example
01HFA7K8R3M6XP-daymet-deposit — ULID-based sidecar identifier for the Daymet Tmax deposit
Covered by — 5 standards
Why it matters & mappings
This identifier is what the downstream health-data layer's source-value field carries (for OMOP, external_exposure.exposure_source_value); it is the only hook that links an exposure value in the health layer back to its full spatial, temporal, and model provenance. Omit it and the value becomes untraceable — its metadata can never be recovered.
PHI (protected health information) means private medical details about an identifiable person. This flag is a written promise on the document saying "no private patient information inside", so it can be passed around and published safely.
Whether the sidecar carries any Protected Health Information. A record-level safety assertion; by design, sidecars are PHI-free.
Example
no_phi
Allowed values
no_phi The sidecar carries no PHI
aggregated_no_phi The sidecar carries aggregated values with no PHI
phi_present The sidecar carries PHI
Covered by — 5 standards
Why it matters & mappings
Sidecars are designed to be PHI-free, and this slot is the explicit machine-readable assertion of that. Without it, every sharing, deposit, or export step must treat the document as potentially containing patient data and re-review it manually before it can leave a protected environment.
Some heat measures are not read from a thermometer but calculated from several ingredients (temperature, humidity, wind, sunshine) using a chosen formula. This block records which formula and ingredients were used — it is only needed when the variable is one of these computed heat metrics.
Heat-metric methodology, present when the variable is a derived heat metric — see envar_heat_metric. Omitted for non-heat variables.
Example
None — illustrative outdoor-WBGT methodology block — not part of the tmax scenario, where this slot is omitted
Why it matters & mappings
Heat metrics like WBGT or Heat Index can be computed by several non-equivalent equations from different inputs, and heat-wave flags depend on the threshold definition; the heat-epidemiology literature flags these choices as the main sources of cross-study disagreement, so omitting the block for a heat metric makes the record uncomparable.
No estimate is perfect. This block says how far off the numbers might be and what was done about gaps in the data, so users know how much confidence to place in each value.
Uncertainty object — see envar_uncertainty.
Example
None — abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance
Covered by — 5 standards
Why it matters & mappings
Exposure values are model estimates with error; without recorded per-value or aggregate uncertainty and missing-data handling, downstream analyses treat estimates as exact, and exposure-measurement error propagates invisibly into health-effect estimates.
Data usually passes through several tools before the final value appears — download, geocode, extract. This block lists those earlier steps in order, like a chain of custody reaching back to the original raw source.
Ordered W3C-PROV-style chain of upstream tool runs — see envar_toolrun. Recommended (not required): a record is reproducible in principle without the full chain, but real reproduction needs it.
Example
None — abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance
Covered by — 5 standards
Why it matters & mappings
The final tool run is rarely the whole story — downloads, geocoding, and intermediate transforms precede it; without the ordered chain back to the raw source, end-to-end reproduction and error tracing are impossible even when the last step is pinned.
See also: https://www.w3.org/TR/prov-o/
Health studies keep patient data in large standard databases. This block notes which of those systems the exposure values were wired into and through which field, so someone browsing the health data can find their way back to this record.
Downstream health-data-layer linkage hooks (OMOP, BDC, …) — see envar_health_layer. Optional: its members are Recommended/Optional, and the Core PHI assertion lives at the record root (phi_status).
Example
None — abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance
Covered by — 5 standards
Why it matters & mappings
Naming the downstream health-data layer (OMOP, BDC, …) and the join field makes the exposure record findable from the clinical side; without it the sidecar and the health records it serves drift apart, and the link must be reconstructed by hand.
If this record and its data are published in a public archive (such as Zenodo), this block holds the publication details: the permanent DOI link, where it lives, and the license saying how others may use it.
FAIR-deposit metadata, present when the sidecar is intended to travel with a published deposit — see envar_health_layer.
Example
None — abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml for a full instance
Why it matters & mappings
When the sidecar travels with a published deposit, the DOI, repository, and license are what make the object findable, citable, and legally reusable — omitting them strands a public artifact without citation or reuse terms. Optional because most records are never deposited.
See also: https://www.go-fair.org/fair-principles/
Full field reference — every slot, cardinality & inheritance
| Field | Name | Tier | Cardinality / Range | Description |
|---|---|---|---|---|
| Subject (Patient or Cohort) | subject |
core | 1 String |
The patient or cohort the exposure value is attached to |
| Variable Identity | variable_identity |
core | 1 VariableIdentity |
The variable identity object — what physical quantity is being captured |
| Spatial Reference | spatial_reference |
core | 1 SpatialReference |
Spatial reference object describing the native grid and extraction |
| Temporal Reference | temporal_reference |
core | 1 TemporalReference |
Temporal reference object describing resolution, aggregation, and day-boundar... |
| Exposure Model | exposure_model |
core | 1 ExposureModel |
The exposure-model object describing how values were produced |
| Uncertainty | uncertainty |
recommended | 0..1 Uncertainty |
Uncertainty object — see envar_uncertainty |
| Derived Heat Metric | derived_heat_metric |
conditionally core | 1 DerivedHeatMetric |
Heat-metric methodology, present when the variable is a derived heat metric —... |
| Data Layout | data_layout |
core | 1 DataLayout |
Data-layout object binding this sidecar to the columns of the companion data ... |
| Source Dataset | source_dataset |
core | 1 SourceDataset |
Source dataset object — see envar_source |
| Tool Run | tool_run |
core | 1 ToolRun |
The current ToolRun — see envar_toolrun |
| Provenance Chain | provenance_chain |
recommended | 0..1 ProvenanceChain |
Ordered W3C-PROV-style chain of upstream tool runs — see envar_toolrun |
| Linkage Method | linkage_method |
core | 1 LinkageMethod |
Linkage-method object — see envar_linkage |
| Health-Layer Linkage | health_layer_linkage |
recommended | 0..1 HealthLayerLinkage |
Downstream health-data-layer linkage hooks (OMOP, BDC, …) — see envar_health_... |
| FAIR Deposit Metadata | deposit_metadata |
optional | 0..1 DepositMetadata |
FAIR-deposit metadata, present when the sidecar is intended to travel with a ... |
| Schema Version | schema_version |
core | 1 String |
The version of the EnVar micro-schema this document conforms to |
| Record Identifier | provenance_id |
core | 1 String |
Stable identifier for this sidecar / record (ULID recommended) |
| PHI Status | phi_status |
core | 1 PhiStatusEnum |
Whether the sidecar carries any Protected Health Information |
Conditional rules on this class
| Rule Applied | Preconditions | Postconditions |
|---|---|---|
| slot_conditions | {'derived_heat_metric': {'value_presence': 'PRESENT'}} |
{'derived_heat_metric': {'any_of': [{'range': 'DerivedHeatMetric'}]}} |
Diagram & LinkML source
classDiagram
class ExtremeHeatDayFlagRecord
click ExtremeHeatDayFlagRecord href "../../classes/ExtremeHeatDayFlagRecord/"
EnvironmentalExposureRecord <|-- ExtremeHeatDayFlagRecord
click EnvironmentalExposureRecord href "../../classes/EnvironmentalExposureRecord/"
ExtremeHeatDayFlagRecord : data_layout
ExtremeHeatDayFlagRecord --> "1" DataLayout : data_layout
click DataLayout href "../../classes/DataLayout/"
ExtremeHeatDayFlagRecord : deposit_metadata
ExtremeHeatDayFlagRecord --> "0..1" DepositMetadata : deposit_metadata
click DepositMetadata href "../../classes/DepositMetadata/"
ExtremeHeatDayFlagRecord : derived_heat_metric
ExtremeHeatDayFlagRecord --> "1" DerivedHeatMetric : derived_heat_metric
click DerivedHeatMetric href "../../classes/DerivedHeatMetric/"
ExtremeHeatDayFlagRecord : exposure_model
ExtremeHeatDayFlagRecord --> "1" ExposureModel : exposure_model
click ExposureModel href "../../classes/ExposureModel/"
ExtremeHeatDayFlagRecord : health_layer_linkage
ExtremeHeatDayFlagRecord --> "0..1" HealthLayerLinkage : health_layer_linkage
click HealthLayerLinkage href "../../classes/HealthLayerLinkage/"
ExtremeHeatDayFlagRecord : linkage_method
ExtremeHeatDayFlagRecord --> "1" LinkageMethod : linkage_method
click LinkageMethod href "../../classes/LinkageMethod/"
ExtremeHeatDayFlagRecord : phi_status
ExtremeHeatDayFlagRecord --> "1" PhiStatusEnum : phi_status
click PhiStatusEnum href "../../enums/PhiStatusEnum/"
ExtremeHeatDayFlagRecord : provenance_chain
ExtremeHeatDayFlagRecord --> "0..1" ProvenanceChain : provenance_chain
click ProvenanceChain href "../../classes/ProvenanceChain/"
ExtremeHeatDayFlagRecord : provenance_id
ExtremeHeatDayFlagRecord : schema_version
ExtremeHeatDayFlagRecord : source_dataset
ExtremeHeatDayFlagRecord --> "1" SourceDataset : source_dataset
click SourceDataset href "../../classes/SourceDataset/"
ExtremeHeatDayFlagRecord : spatial_reference
ExtremeHeatDayFlagRecord --> "1" SpatialReference : spatial_reference
click SpatialReference href "../../classes/SpatialReference/"
ExtremeHeatDayFlagRecord : subject
ExtremeHeatDayFlagRecord : temporal_reference
ExtremeHeatDayFlagRecord --> "1" TemporalReference : temporal_reference
click TemporalReference href "../../classes/TemporalReference/"
ExtremeHeatDayFlagRecord : tool_run
ExtremeHeatDayFlagRecord --> "1" ToolRun : tool_run
click ToolRun href "../../classes/ToolRun/"
ExtremeHeatDayFlagRecord : uncertainty
ExtremeHeatDayFlagRecord --> "0..1" Uncertainty : uncertainty
click Uncertainty href "../../classes/Uncertainty/"
ExtremeHeatDayFlagRecord : variable_identity
ExtremeHeatDayFlagRecord --> "1" VariableIdentity : variable_identity
click VariableIdentity href "../../classes/VariableIdentity/"
name: ExtremeHeatDayFlagRecord
description: Canonical record for a daily binary extreme-heat-day flag, defined against
a local 95th-percentile Tmax baseline. Pins `heat_metric_family = heat_wave_flag`,
`value_data_type = binary_flag`, and requires the percentile-reference-period slots
in DerivedHeatMetric to be populated.
title: Extreme-Heat-Day Flag Record
from_schema: https://w3id.org/linkml/microschemas/envar
rank: 1000
is_a: EnvironmentalExposureRecord
slot_usage:
derived_heat_metric:
name: derived_heat_metric
required: true
attributes:
subject:
name: subject
annotations:
tier:
tag: tier
value: core
justification:
tag: justification
value: An exposure value is meaningless without knowing whose exposure it
is. The opaque handle is what lets the sidecar be joined back to the right
cohort or patient in the health-data layer while staying PHI-free.
explanation:
tag: explanation
value: Who (or what group) the values belong to — a study cohort or an individual
patient, named by an anonymous code rather than anything identifying.
open_question:
tag: open_question
value: '`subject` is the only field in this group that is not a per-value
predicate: every other field explains an individual value, but a single
scalar subject is dataset-scoped and cannot distribute over the sidecar''s
rows (per-row subject identity lives in `subject_column`). Under review
— should it be dropped, or demoted to a dataset-level cohort handle? Feedback
welcome.'
description: The patient or cohort the exposure value is attached to. Carried
as an opaque identifier; PHI must not appear here.
title: Subject (Patient or Cohort)
examples:
- value: cohort:phoenix_aki_2022
description: an opaque cohort handle — no PHI
from_schema: https://w3id.org/linkml/microschemas/envar
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
- MicroschemaDefinition
slot_group: exposure_description
range: string
required: true
variable_identity:
name: variable_identity
implements:
- msprofile:observation_type
annotations:
tier:
tag: tier
value: core
justification:
tag: justification
value: Without a standard variable identity, "tmax" in one file and "TMAX"
in another cannot be recognised as the same physical quantity, and unit
mix-ups (Celsius vs Fahrenheit vs Kelvin) go undetected — pooling and cross-study
comparison silently break.
explanation:
tag: explanation
value: This block pins down exactly what was measured. Instead of relying
on a nickname like "tmax", it uses shared vocabularies to say "daily maximum
air temperature, in degrees Celsius", so any tool or researcher reads it
the same way.
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: gaia_db variable_source.variable_name/variable_description
+ JSON-LD variableMeasured.propertyID (NERC air_temperature); unit_concept_id
8653
note:
tag: note
value: 'Gaia carries variable name, description, unit, and a CF-mirror
propertyID, but CF cell_methods has no slot. Conservative: partial.'
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Variable identity is implicit in the column header tmax with
no CF standard name, cell methods, or unit annotation.
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: thredds_dataset.xml long_name/standard_name/description + gridmet_tmmx.cf_metadata.json
units
note:
tag: note
value: 'Amadeus carries a CF-style blob (long_name, units K), but
standard_name is overloaded with the gridMET shortcode, not a real
CF term. Conservative: partial.'
cher:
tag: cher
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: table_column_dictionary.column_tag=Value + column_unit_id (+
planned ontology tag)
note:
tag: note
value: C-HER tags a Value column with a unit and (planned) ontology
tag, but carries no CF standard name / cell-methods identity.
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Variable identity is exactly the conceptual/represented layer
CODATA EVs occupy, but as a conceptual framework it is excluded
from instance-layer scoring.
description: The variable identity object — what physical quantity is being captured.
Bound to VariableIdentity (see envar_variable). Readable rename of the profile's
`observation_type` anatomy slot.
title: Variable Identity
examples:
- description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
for a full instance
object:
variable_name: tmax
standard_name: CF:air_temperature
cf_cell_methods: 'time: maximum'
units_ucum: Cel
from_schema: https://w3id.org/linkml/microschemas/envar
see_also:
- https://cfconventions.org/
- https://ucum.org/
aliases:
- observation_type
exact_mappings:
- msprofile:observation_type
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: exposure_description
range: VariableIdentity
required: true
inlined: true
spatial_reference:
name: spatial_reference
implements:
- msprofile:location
annotations:
tier:
tag: tier
value: core
justification:
tag: justification
value: 'A value without its grid, coordinate system, and extraction method
cannot be located or compared: a 1 km neighbourhood average and a ~31 km
regional average look identical as numbers but describe very different exposures,
and the extraction cannot be re-run without the method.'
explanation:
tag: explanation
value: This block says where the number applies and how it was pulled out
of a map. Environmental data usually comes as a grid of cells covering a
region; this records how big those cells are and how the value for a specific
place was picked from them.
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: gaia_db location.geom EPSG:4326 / data_source.srid; meta_etl_*.json
epsg / extent; data_source.spatial_coverage
note:
tag: note
value: 'Gaia carries CRS/SRID and dataset spatial coverage, but has
no first-class native-resolution or extraction-method slot. Conservative:
partial.'
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: lat / lon columns on the geocoded CSV (implicit WGS84)
note:
tag: note
value: DeGAUSS carries coordinates but no explicit CRS, native resolution,
or extraction method.
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: thredds_dataset.xml coordinate_system=WGS84,EPSG:4326 + axis
lat/lon increment + projectionBox/LatLonBox
note:
tag: note
value: 'Amadeus declares source-raster CRS and bbox and grid increment,
but no extraction-method slot and resolution is only derivable.
Conservative: partial.'
cher:
tag: cher
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: table_name spatial extent + spatial resolution codes (e.g.
h08 / k05 / m30); column_tag Spatial-Primary
note:
tag: note
value: 'C-HER encodes spatial extent and organisation resolution in
the table_name and tags spatial columns, but carries no per-value
extraction method or CRS field. Conservative: partial.'
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Extraction geometry is instance-layer; out of scope for CODATA's
conceptual framework.
description: Spatial reference object describing the native grid and extraction.
Bound to SpatialReference (see envar_spatial). Readable rename of the profile's
`location` anatomy slot.
title: Spatial Reference
examples:
- description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
for a full instance
object:
native_spatial_resolution_m: 1000
crs: EPSG:4326
extraction_method: inverse_distance_weighted_4_nearest_cells
target_geography_type: point_residence
from_schema: https://w3id.org/linkml/microschemas/envar
see_also:
- https://epsg.io/
aliases:
- location
exact_mappings:
- msprofile:location
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: exposure_description
range: SpatialReference
required: true
inlined: true
temporal_reference:
name: temporal_reference
implements:
- msprofile:temporality
annotations:
tier:
tag: tier
value: core
justification:
tag: justification
value: 'A "daily maximum" is ambiguous without the day-boundary convention:
Daymet days end at local midnight while PRISM days end at 12:00 GMT, so
the same calendar date can cover different physical hours — the most-omitted
detail in the heat literature and a known source of cross-product disagreement.'
explanation:
tag: explanation
value: 'This block explains the time ruler behind each value: how long a period
each number summarises (a day, a month), how it was summarised (maximum,
mean), and — surprisingly important — when a "day" is considered to start
and end.'
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: gaia_db variable_source.start_date/end_date; meta_dcat_*.json
dct:temporal
note:
tag: note
value: 'Gaia carries the dataset time span but has no first-class
temporal-resolution, aggregation-method, or day-boundary slot. Conservative:
partial.'
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Temporal resolution is implicit (one row per day); aggregation
method and day boundary are absent.
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: thredds_dataset.xml day axis (days since 1900-01-01, calendar=gregorian)
+ TimeSpan; long_name daily_maximum_temperature
note:
tag: note
value: 'Amadeus carries time-origin, calendar, and dataset span, and
aggregation is encoded only in the long_name; day-boundary is pure
ambiguity. Conservative: partial.'
cher:
tag: cher
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: table_name temporal extent (YYYYMMDDYYYYMMDD) + temporal resolution
code; column_tag Temporal-Primary
note:
tag: note
value: 'C-HER encodes temporal extent and resolution in the table_name
and tags temporal columns, but carries no aggregation-method or
day-boundary-convention field. Conservative: partial.'
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Temporal-aggregation semantics are instance-layer; out of scope
for CODATA.
description: Temporal reference object describing resolution, aggregation, and
day-boundary convention. Bound to TemporalReference (see envar_temporal). Readable
rename of the profile's `temporality` anatomy slot.
title: Temporal Reference
examples:
- description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
for a full instance
object:
temporal_resolution: daily
temporal_aggregation_method: maximum
day_boundary_convention: local_midnight
calendar: gregorian
from_schema: https://w3id.org/linkml/microschemas/envar
see_also:
- https://cfconventions.org/
aliases:
- temporality
exact_mappings:
- msprofile:temporality
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: exposure_description
range: TemporalReference
required: true
inlined: true
exposure_model:
name: exposure_model
implements:
- msprofile:methodology
annotations:
tier:
tag: tier
value: core
justification:
tag: justification
value: The same quantity can be estimated by station interpolation, satellite
retrieval, or model reanalysis, each with different inputs and biases; without
the model description, values from different products get pooled as if equivalent
and their systematic differences stay invisible.
explanation:
tag: explanation
value: Most exposure values are not direct readings from an instrument at
someone's house — they are estimates computed from weather stations, satellites,
or models. This block says which estimation method produced the numbers
and what went into it.
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: gaia_db data_source.measurement_technique + meta_dcat_*.json
measurementTechnique (free-text)
note:
tag: note
value: 'Gaia carries a free-text method description but no structured
exposure-model type or model-inputs list. Conservative: partial.'
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: DeGAUSS records no exposure-model type or model description.
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Amadeus records no exposure-model type or model description.
cher:
tag: cher
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: table_dictionary.data_level codes (dXX calculated / mXX modeled)
+ description/notes
note:
tag: note
value: 'C-HER''s data_level codes signal that a resource is calculated
or modeled, but do not carry a structured exposure-model type or
inputs. Conservative: partial.'
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Exposure-model identity is instance-layer; out of scope for
CODATA.
description: 'The exposure-model object describing how values were produced. Bound
to ExposureModel (see envar_model). Readable rename of the profile''s `methodology`
anatomy slot, narrowed to the model itself: other methodology-adjacent concerns
(source dataset, tool run, provenance chain, derived heat metric) are surfaced
as separate envar-extension slots.'
title: Exposure Model
examples:
- description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
for a full instance
object:
exposure_model_type: spatial_interpolation
exposure_model_inputs:
- GHCN-Daily station observations
exposure_model_paper_doi: 10.3334/ORNLDAAC/2129
bias_correction_applied: none
from_schema: https://w3id.org/linkml/microschemas/envar
aliases:
- methodology
exact_mappings:
- msprofile:methodology
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: exposure_description
range: ExposureModel
required: true
inlined: true
uncertainty:
name: uncertainty
annotations:
tier:
tag: tier
value: recommended
justification:
tag: justification
value: Exposure values are model estimates with error; without recorded per-value
or aggregate uncertainty and missing-data handling, downstream analyses
treat estimates as exact, and exposure-measurement error propagates invisibly
into health-effect estimates.
explanation:
tag: explanation
value: No estimate is perfect. This block says how far off the numbers might
be and what was done about gaps in the data, so users know how much confidence
to place in each value.
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: No gaia output carries per-value or model-aggregate uncertainty
(per-value uncertainty is ❌ across all pipelines).
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: DeGAUSS carries no uncertainty block.
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Amadeus carries no uncertainty block; only a _FillValue sentinel.
cher:
tag: cher
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: C-HER null taxonomy (structural/derived null) + data_level
QA codes (aXX/bXX)
note:
tag: note
value: 'C-HER classifies null cells and encodes QA level, but carries
no per-value uncertainty or completeness percentage. Conservative:
partial.'
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Per-value uncertainty is instance-layer; out of scope for CODATA.
description: Uncertainty object — see envar_uncertainty.
title: Uncertainty
examples:
- description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
for a full instance
object:
per_value_uncertainty_type: standard_error
per_value_uncertainty_units_ucum: Cel
missing_data_handling_method: spatiotemporal_interpolation
data_completeness_pct: 100
from_schema: https://w3id.org/linkml/microschemas/envar
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: exposure_description
range: Uncertainty
inlined: true
derived_heat_metric:
name: derived_heat_metric
annotations:
tier:
tag: tier
value: conditionally_core
justification:
tag: justification
value: Heat metrics like WBGT or Heat Index can be computed by several non-equivalent
equations from different inputs, and heat-wave flags depend on the threshold
definition; the heat-epidemiology literature flags these choices as the
main sources of cross-study disagreement, so omitting the block for a heat
metric makes the record uncomparable.
explanation:
tag: explanation
value: Some heat measures are not read from a thermometer but calculated from
several ingredients (temperature, humidity, wind, sunshine) using a chosen
formula. This block records which formula and ingredients were used — it
is only needed when the variable is one of these computed heat metrics.
description: Heat-metric methodology, present when the variable is a derived heat
metric — see envar_heat_metric. Omitted for non-heat variables.
title: Derived Heat Metric
examples:
- description: illustrative outdoor-WBGT methodology block — not part of the tmax
scenario, where this slot is omitted
object:
heat_metric_family: wbgt_outdoor
equation_variant: liljegren_2008
indoor_outdoor: outdoor
solar_radiation_basis: surface_downwelling_shortwave_flux
from_schema: https://w3id.org/linkml/microschemas/envar
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: variable_specific_extensions
range: DerivedHeatMetric
required: true
inlined: true
data_layout:
name: data_layout
annotations:
tier:
tag: tier
value: core
justification:
tag: justification
value: The sidecar describes values that live in a companion CSV/parquet file;
without the column bindings a consumer cannot tell which column holds the
values, subjects, or dates, so the metadata is unanchored and the data unusable
— hence the slot is required.
explanation:
tag: explanation
value: 'The actual numbers live in a separate data table that travels with
this record. This block is the map between the two: it names which column
holds the values, which holds the person identifier, which holds the date,
and so on.'
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: external_exposure.person_id/value_as_number + gaia_db location.csv
columns (implicit layout)
note:
tag: note
value: 'Gaia''s OMOP/gaia-db tables have value/subject/time columns
but no portable sidecar column-binding document. Conservative: partial.'
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: geocoded CSV columns id / lat / lon / tmax / date (implicit
layout)
note:
tag: note
value: 'DeGAUSS''s CSV has value/subject/date columns but no portable
sidecar layout describing them. Conservative: partial.'
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: gridmet_tmmx.csv columns person_loc_id / lat / lon / value_kelvin
/ value_celsius (implicit layout)
note:
tag: note
value: 'Amadeus''s CSV has value/subject columns but no portable sidecar
column-binding document. Conservative: partial.'
cher:
tag: cher
annotations:
extent:
tag: extent
value: full
status:
tag: status
value: asserted
where:
tag: where
value: table_column_dictionary (column_name, description, column_tag
Index/Value/Temporal/Spatial, column_unit)
note:
tag: note
value: C-HER's column dictionary is a first-class, portable per-column
layout with a role tag and unit for every column — the closest analogue
to the sidecar's data-layout block.
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Companion-file column binding is instance/packaging-layer;
out of scope for CODATA.
description: 'Data-layout object binding this sidecar to the columns of the companion
data file — see envar_layout. Required: without it a consumer cannot locate
the values the sidecar describes.'
title: Data Layout
examples:
- description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
for a full instance
object:
table_orientation: wide
value_column: tmax
subject_column: subject_id
time_column: date
from_schema: https://w3id.org/linkml/microschemas/envar
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: dataset_and_provenance
range: DataLayout
required: true
inlined: true
source_dataset:
name: source_dataset
annotations:
tier:
tag: tier
value: core
justification:
tag: justification
value: Without the upstream product's identity, version, DOI, and license,
the record cannot be cited, its documented biases cannot be looked up, and
reuse terms are unknown — and two records built from different product versions
cannot be told apart.
explanation:
tag: explanation
value: Exposure values are derived from a published data product (for example
Daymet, a daily weather dataset). This block names that product precisely
— including its version, citation, and license — so anyone can find it and
check its documentation.
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: full
status:
tag: status
value: verified
where:
tag: where
value: gaia_db data_source.dataset_name/dataset_version/license/creator/date_published
+ meta_dcat_*.json dct:title/dct:identifier(DOI)/dct:license
evidence:
tag: evidence
value: COMPARISON.md §I — dataset name ✅, version ✅, DOI ✅, license
✅, publisher ✅, date published/modified ✅
note:
tag: note
value: Gaia natively carries full dataset-level discovery metadata
(name, version, DOI, license, publisher).
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: DeGAUSS carries no dataset name, version, DOI, license, or
publisher.
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Amadeus carries no dataset-identity metadata (no name, DOI,
license, publisher) natively.
cher:
tag: cher
annotations:
extent:
tag: extent
value: full
status:
tag: status
value: asserted
where:
tag: where
value: table_dictionary (dataset, doi, rights, resource_type/format,
contributors) + version + source_update_frequency
note:
tag: note
value: C-HER's table_dictionary and its foreign-key vocabularies identify
the source dataset first-class (dataset, rights, DOI, contributors,
version).
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Dataset identity/discovery is catalogue-layer; CODATA operates
at the conceptual variable layer and is out of scope for scoring.
description: Source dataset object — see envar_source.
title: Source Dataset
examples:
- description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
for a full instance
object:
source_dataset_name: Daymet V4 Daily Surface Weather Data
source_dataset_short_code: daymet_v4
source_dataset_doi: 10.3334/ORNLDAAC/2129
source_license_spdx: public-domain-us-gov
from_schema: https://w3id.org/linkml/microschemas/envar
see_also:
- https://spdx.org/licenses/
- https://www.doi.org/
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: dataset_and_provenance
range: SourceDataset
required: true
inlined: true
tool_run:
name: tool_run
annotations:
tier:
tag: tier
value: core
justification:
tag: justification
value: 'Without the exact tool name, version, container image, parameters,
and timestamp, the record cannot be re-run: "we used the daymet tool" is
not reproducible, but a pinned container invocation is.'
explanation:
tag: explanation
value: 'This block is the receipt for the software step that produced the
values: which program ran, which exact version, with what settings, and
when. With it, someone else can re-run the same step and get the same numbers.'
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: gaia_db data_source.created_at/updated_at (load time); spatial_join_log.txt
(SQL functions)
note:
tag: note
value: 'Gaia carries per-row load times and a join log, but no tool
name/version, container digest, run args, or hashes. Conservative:
partial.'
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: output filename tool name + container image tag (e.g. daymet_1.0.0);
ghcr.io/degauss-org/... reference
note:
tag: note
value: 'DeGAUSS pins tool name and version via the filename/container
tag, but no digest, run args, timestamp, or hashes. Conservative:
partial.'
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: thredds_response_headers.json HTTP Date header (run timestamp
only)
note:
tag: note
value: 'Amadeus records only the HTTP Date header; no tool name/version,
container, run args, or hashes natively. Conservative: partial.'
cher:
tag: cher
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: table_dictionary.metadata_created_at/updated_at + uploaded_by
+ version
note:
tag: note
value: 'C-HER records registration time, uploader, and version, but
no per-run producing-tool name/version, container digest, args,
or hashes. Conservative: partial.'
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Tool-run provenance is instance-layer; out of scope for CODATA.
description: The current ToolRun — see envar_toolrun.
title: Tool Run
examples:
- description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
for a full instance
object:
tool_name: daymet
tool_version: 1.0.0
container_image_repository: ghcr.io/degauss-org/daymet
run_timestamp_utc: '2026-05-23T14:18:42Z'
from_schema: https://w3id.org/linkml/microschemas/envar
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: dataset_and_provenance
range: ToolRun
required: true
inlined: true
provenance_chain:
name: provenance_chain
annotations:
tier:
tag: tier
value: recommended
justification:
tag: justification
value: The final tool run is rarely the whole story — downloads, geocoding,
and intermediate transforms precede it; without the ordered chain back to
the raw source, end-to-end reproduction and error tracing are impossible
even when the last step is pinned.
explanation:
tag: explanation
value: Data usually passes through several tools before the final value appears
— download, geocode, extract. This block lists those earlier steps in order,
like a chain of custody reaching back to the original raw source.
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: gaia_catalog/meta_etl_*.json (ETL recipe) + gaia_db/spatial_join_log.txt
note:
tag: note
value: 'Gaia''s ETL descriptor plus join log capture upstream steps
but not as an ordered per-run W3C-PROV chain. Conservative: partial.'
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: DeGAUSS emits no ordered upstream-run chain.
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Amadeus emits no ordered upstream-run chain.
cher:
tag: cher
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: dataset_lineage (parent-child links) + lineage_notes
note:
tag: note
value: 'C-HER''s dataset_lineage links parent and child resources,
but is a dataset-lineage graph, not an ordered per-run W3C-PROV
chain. Conservative: partial.'
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Ordered tool-run provenance is instance-layer; out of scope
for CODATA.
description: 'Ordered W3C-PROV-style chain of upstream tool runs — see envar_toolrun.
Recommended (not required): a record is reproducible in principle without the
full chain, but real reproduction needs it.'
title: Provenance Chain
examples:
- description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
for a full instance
object:
provenance_chain_terminus_type: raw_source_download
provenance_chain_steps:
- tool_name: geocoder
tool_version: 3.3.0
run_timestamp_utc: '2026-05-23T14:02:11Z'
from_schema: https://w3id.org/linkml/microschemas/envar
see_also:
- https://www.w3.org/TR/prov-o/
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: dataset_and_provenance
range: ProvenanceChain
inlined: true
linkage_method:
name: linkage_method
annotations:
tier:
tag: tier
value: core
justification:
tag: justification
value: Attaching a place-based value to a person is a lossy, choice-laden
step (geocoding, point vs buffer extraction, date alignment) — the "linkage
descriptor" gap the GECC/EIRENE forum names as central. Without it, two
studies using the same data product can differ solely through undocumented
joins.
explanation:
tag: explanation
value: Environmental data describes places, but health research is about people.
This block records how the value for a place was attached to a particular
person — for example, by looking up the map cell containing their home address
— since that step involves real choices that affect the result.
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: working.spatial_join_exposure (st_within with hard-coded buffer),
captured in gaia_db/spatial_join_log.txt
note:
tag: note
value: 'Gaia''s linkage lives in the SQL-join semantics and its NOTICE
log, not as a documented linkage-strategy column. Conservative:
partial.'
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: full
status:
tag: status
value: verified
where:
tag: where
value: geocoded CSV columns score, precision, geocode_result, matched_street/zip/city/state
evidence:
tag: evidence
value: COMPARISON.md §B — geocoder match score ✅, precision ✅, geocode-result
flag ✅ on every row
note:
tag: note
value: DeGAUSS's linkage event (geocoding precision, match score,
result flag, matched address) is first-class per row.
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Amadeus collapses the address to lat/lon at the THREDDS request
and records no linkage/geocoding quality.
cher:
tag: cher
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: table_column_dictionary reference_column_id + column_tag Foreign
Reference / Spatial-Primary (cross-table join descriptors)
note:
tag: note
value: 'C-HER models cross-table join references and spatial-column
tags, but no patient-to-place linkage-strategy field. Conservative:
partial.'
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Patient-to-place linkage is instance-layer; out of scope for
CODATA.
description: Linkage-method object — see envar_linkage.
title: Linkage Method
examples:
- description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
for a full instance
object:
linkage_strategy: point_extraction_at_residence
address_period_alignment: address_history_from_emr
clinical_date_assignment_convention: local_midnight
lag_alignment_applied: none
from_schema: https://w3id.org/linkml/microschemas/envar
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: health_data_integration
range: LinkageMethod
required: true
inlined: true
health_layer_linkage:
name: health_layer_linkage
annotations:
tier:
tag: tier
value: recommended
justification:
tag: justification
value: Naming the downstream health-data layer (OMOP, BDC, …) and the join
field makes the exposure record findable from the clinical side; without
it the sidecar and the health records it serves drift apart, and the link
must be reconstructed by hand.
explanation:
tag: explanation
value: Health studies keep patient data in large standard databases. This
block notes which of those systems the exposure values were wired into and
through which field, so someone browsing the health data can find their
way back to this record.
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: external_exposure.exposure_source_value / exposure_concept_id
+ external_exposure.person_id
note:
tag: note
value: 'Gaia lands values in OMOP external_exposure with a person
link and a source-value hook, but names no explicit sidecar provenance-id
join field. Conservative: partial.'
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: DeGAUSS appends geomarker columns to the cohort CSV but names
no downstream health-layer target or join field.
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Amadeus emits a data CSV with no downstream health-layer target
or join field.
cher:
tag: cher
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: PostgreSQL schema=health + table_column_dictionary.reference_column_id
(cross-table join to health resources)
note:
tag: note
value: 'C-HER has a health schema and cross-table reference columns,
but no sidecar-to-health-layer link-field declaration. Conservative:
partial.'
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Health-layer linkage hooks are instance/integration-layer;
out of scope for CODATA.
description: 'Downstream health-data-layer linkage hooks (OMOP, BDC, …) — see
envar_health_layer. Optional: its members are Recommended/Optional, and the
Core PHI assertion lives at the record root (`phi_status`).'
title: Health-Layer Linkage
examples:
- description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
for a full instance
object:
health_layer_target: omop_external_exposure
health_layer_link_field: exposure_source_value
cohort_size_anchored: 3
from_schema: https://w3id.org/linkml/microschemas/envar
see_also:
- https://ohdsi.github.io/CommonDataModel/
- https://biodatacatalyst.nhlbi.nih.gov/
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: health_data_integration
range: HealthLayerLinkage
inlined: true
deposit_metadata:
name: deposit_metadata
annotations:
tier:
tag: tier
value: optional
justification:
tag: justification
value: When the sidecar travels with a published deposit, the DOI, repository,
and license are what make the object findable, citable, and legally reusable
— omitting them strands a public artifact without citation or reuse terms.
Optional because most records are never deposited.
explanation:
tag: explanation
value: 'If this record and its data are published in a public archive (such
as Zenodo), this block holds the publication details: the permanent DOI
link, where it lives, and the license saying how others may use it.'
description: FAIR-deposit metadata, present when the sidecar is intended to travel
with a published deposit — see envar_health_layer.
title: FAIR Deposit Metadata
examples:
- description: abridged — see tests/data/valid/EnvironmentalExposureRecord-tmax_ideal.yaml
for a full instance
object:
deposit_doi: 10.5281/zenodo.9999999
deposit_repository: zenodo
deposit_license_spdx: CC-BY-4.0
from_schema: https://w3id.org/linkml/microschemas/envar
see_also:
- https://www.go-fair.org/fair-principles/
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: health_data_integration
range: DepositMetadata
inlined: true
schema_version:
name: schema_version
annotations:
tier:
tag: tier
value: core
justification:
tag: justification
value: 'Downstream consumers must branch on schema evolution: a parser built
for one version will silently misread or wrongly reject sidecars written
against another. Without this slot there is no way to tell which iteration
of the schema a document targets.'
explanation:
tag: explanation
value: Schemas change over time, like editions of a paper form. This is the
edition number stamped on the document, so anyone reading it knows exactly
which version of the form was filled in and can interpret the fields accordingly.
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: No native gaia output carries a sidecar schema-version field;
this is an EnVar-sidecar-level construct.
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: DeGAUSS produces no metadata sidecar and carries no schema-version
field.
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Amadeus's native metadata carries no sidecar schema-version
field.
cher:
tag: cher
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: C-HER's version code versions the data resource, not a metadata
sidecar schema, so no EnVar-style schema-version field exists.
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Sidecar schema versioning is packaging-layer; out of scope
for CODATA's conceptual framework.
description: The version of the EnVar micro-schema this document conforms to.
Required on every sidecar so downstream consumers can branch on schema evolution.
title: Schema Version
examples:
- value: '0.1'
from_schema: https://w3id.org/linkml/microschemas/envar
see_also:
- https://semver.org/
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: record_bookkeeping
range: string
required: true
provenance_id:
name: provenance_id
annotations:
tier:
tag: tier
value: core
justification:
tag: justification
value: This identifier is what the downstream health-data layer's source-value
field carries (for OMOP, `external_exposure.exposure_source_value`); it
is the only hook that links an exposure value in the health layer back to
its full spatial, temporal, and model provenance. Omit it and the value
becomes untraceable — its metadata can never be recovered.
explanation:
tag: explanation
value: A unique serial number for this metadata document, like the tracking
number on a parcel. Wherever the data value ends up, that number lets you
look up exactly where it came from and how it was made.
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: external_exposure.exposure_source_value (empty slot that could
carry a provenance id) + gaia_db data_source id
note:
tag: note
value: 'The OMOP source-value field exists as the natural carrier,
but gaia populates no per-sidecar stable record id into it. Conservative:
partial.'
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: DeGAUSS produces no sidecar and no stable per-record provenance
id.
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Amadeus produces no stable per-record provenance id; only file
hashes for citation.
cher:
tag: cher
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: table_name reproducible resource identifier (org_dataset_..._version)
+ osti_id / ornl_res_pub_id
note:
tag: note
value: 'C-HER assigns each resource a reproducible identifier, but
it names the dataset resource, not an EnVar sidecar that a health
layer''s source-value field carries. Conservative: partial.'
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: A per-sidecar provenance id is packaging-layer; out of scope
for CODATA.
description: Stable identifier for this sidecar / record (ULID recommended). This
is the value the downstream health-data layer's source-value field carries to
link a row back to its provenance (for OMOP, that field is `external_exposure.exposure_source_value`).
title: Record Identifier
examples:
- value: 01HFA7K8R3M6XP-daymet-deposit
description: ULID-based sidecar identifier for the Daymet Tmax deposit
from_schema: https://w3id.org/linkml/microschemas/envar
see_also:
- https://github.com/ulid/spec
- https://ohdsi.github.io/CommonDataModel/
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: record_bookkeeping
range: string
required: true
phi_status:
name: phi_status
annotations:
tier:
tag: tier
value: core
justification:
tag: justification
value: Sidecars are designed to be PHI-free, and this slot is the explicit
machine-readable assertion of that. Without it, every sharing, deposit,
or export step must treat the document as potentially containing patient
data and re-review it manually before it can leave a protected environment.
explanation:
tag: explanation
value: PHI (protected health information) means private medical details about
an identifiable person. This flag is a written promise on the document saying
"no private patient information inside", so it can be passed around and
published safely.
covered_by:
tag: covered_by
annotations:
omop_gaia:
tag: omop_gaia
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Gaia carries PHI in OMOP person/location tables but emits no
per-record PHI-free assertion flag on its metadata.
degauss:
tag: degauss
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: DeGAUSS's privacy-preserving design keeps PHI on-site, but
it emits no per-record PHI-status assertion flag.
amadeus:
tag: amadeus
annotations:
extent:
tag: extent
value: absent
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Amadeus handles no PHI and emits no per-record PHI-status flag.
cher:
tag: cher
annotations:
extent:
tag: extent
value: partial
status:
tag: status
value: asserted
where:
tag: where
value: PostgreSQL schemas private / embargo (access-tier separation)
+ rights FK
note:
tag: note
value: 'C-HER separates private/embargoed resources into dedicated
schemas and records rights, but has no per-record PHI-status assertion
flag. Conservative: partial.'
codata:
tag: codata
annotations:
extent:
tag: extent
value: out_of_layer
status:
tag: status
value: asserted
where:
tag: where
value: no column
note:
tag: note
value: Per-record PHI assertion is packaging/governance-layer; out
of scope for CODATA.
description: Whether the sidecar carries any Protected Health Information. A record-level
safety assertion; by design, sidecars are PHI-free.
title: PHI Status
examples:
- value: no_phi
from_schema: https://w3id.org/linkml/microschemas/envar
see_also:
- https://www.hhs.gov/hipaa/for-professionals/privacy/index.html
rank: 1000
owner: ExtremeHeatDayFlagRecord
domain_of:
- EnvironmentalExposureRecord
slot_group: record_bookkeeping
range: PhiStatusEnum
required: true
rules:
- preconditions:
slot_conditions:
derived_heat_metric:
name: derived_heat_metric
value_presence: PRESENT
postconditions:
slot_conditions:
derived_heat_metric:
name: derived_heat_metric
any_of:
- range: DerivedHeatMetric
description: The DerivedHeatMetric inner object must pin heat_metric_family = heat_wave_flag,
heat_wave_threshold_definition = percentile_local, and supply percentile_reference_period_start
/ _end and percentile_reference_geographic_scope.
Identifier and Mapping Information
Schema Source
- from schema: https://w3id.org/linkml/microschemas/envar
Mappings
| Mapping Type | Mapped Value |
|---|---|
| self | envar:ExtremeHeatDayFlagRecord |
| native | envar:ExtremeHeatDayFlagRecord |