climate_ref.models.dataset
#
CMIP6Dataset
#
Bases: Dataset
Represents a CMIP6 dataset
Fields that are not in the DRS are marked optional.
Source code in packages/climate-ref/src/climate_ref/models/dataset.py
calendar = mapped_column(nullable=True)
class-attribute
instance-attribute
#
CF calendar type (e.g. 'standard', '360_day', 'noleap')
instance_id = mapped_column(index=True)
class-attribute
instance-attribute
#
Unique identifier for the dataset (including the version).
time_units = mapped_column(nullable=True)
class-attribute
instance-attribute
#
Time encoding units (e.g. 'days since 1850-01-01')
version = mapped_column()
class-attribute
instance-attribute
#
Dataset version string (e.g. "v2").
Only write this through an ORM instance.
The base-table version_key ordering key is synced by the _sync_version_key mapper event.
CMIP7Dataset
#
Bases: Dataset
Represents a CMIP7 dataset
Based on CMIP7 Global Attributes v1.0 (DOI: 10.5281/zenodo.17250297). Includes core DRS attributes, additional mandatory attributes, and parent info.
Source code in packages/climate-ref/src/climate_ref/models/dataset.py
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 | |
activity_id = mapped_column()
class-attribute
instance-attribute
#
CV - e.g., "CMIP", "ScenarioMIP"
branch_time_in_child = mapped_column(nullable=True)
class-attribute
instance-attribute
#
Float - when parent exists
branch_time_in_parent = mapped_column(nullable=True)
class-attribute
instance-attribute
#
Float - when parent exists
branding_suffix = mapped_column()
class-attribute
instance-attribute
#
Template - e.g., "tavg-h2m-hxy-u"
calendar = mapped_column(nullable=True)
class-attribute
instance-attribute
#
CF calendar type (e.g. 'standard', '360_day', 'noleap')
experiment_id = mapped_column(index=True)
class-attribute
instance-attribute
#
CV - experiment name
external_variables = mapped_column(nullable=True)
class-attribute
instance-attribute
#
Space-separated list of cell measure variable names (when cell_measures are specified)
frequency = mapped_column()
class-attribute
instance-attribute
#
CV - e.g., "mon", "day"
grid_label = mapped_column()
class-attribute
instance-attribute
#
CV - e.g., "gn", "gr"
instance_id = mapped_column(index=True)
class-attribute
instance-attribute
#
CMIP7 DRS format unique identifier
institution_id = mapped_column()
class-attribute
instance-attribute
#
CV - registered by modeling group
license_id = mapped_column(nullable=True)
class-attribute
instance-attribute
#
CV - e.g., "CC-BY-4.0", "CC0-1.0"
long_name = mapped_column(nullable=True)
class-attribute
instance-attribute
#
Human-readable description
mip_era = mapped_column()
class-attribute
instance-attribute
#
Always "CMIP7"
nominal_resolution = mapped_column(nullable=True)
class-attribute
instance-attribute
#
CV - e.g., "100 km"
parent_activity_id = mapped_column(nullable=True)
class-attribute
instance-attribute
#
String - parent activity identifier
parent_experiment_id = mapped_column(nullable=True)
class-attribute
instance-attribute
#
String - parent experiment identifier
parent_mip_era = mapped_column(nullable=True)
class-attribute
instance-attribute
#
String - "CMIP6" or "CMIP7"
parent_source_id = mapped_column(nullable=True)
class-attribute
instance-attribute
#
String - parent model identifier
parent_time_units = mapped_column(nullable=True)
class-attribute
instance-attribute
#
String - time units used in parent
parent_variant_label = mapped_column(nullable=True)
class-attribute
instance-attribute
#
String - parent variant label
realm = mapped_column(nullable=True)
class-attribute
instance-attribute
#
CV - e.g., "atmos", "ocean" (replaces table_id for filtering)
region = mapped_column()
class-attribute
instance-attribute
#
CV - e.g., "glb" (global)
source_id = mapped_column(index=True)
class-attribute
instance-attribute
#
CV - model identifier
standard_name = mapped_column(nullable=True)
class-attribute
instance-attribute
#
CF standard name
time_units = mapped_column(nullable=True)
class-attribute
instance-attribute
#
Time encoding units (e.g. 'days since 1850-01-01')
units = mapped_column(nullable=True)
class-attribute
instance-attribute
#
Variable units
variable_id = mapped_column()
class-attribute
instance-attribute
#
CV - variable root name
variant_label = mapped_column()
class-attribute
instance-attribute
#
Template - e.g., "r1i1p1f1" (CMIP7 uses prefixed strings)
version = mapped_column()
class-attribute
instance-attribute
#
Template - e.g., "v20250622".
Only write this through an ORM instance.
The base-table version_key ordering key is synced by the _sync_version_key mapper event.
branded_variable()
#
Return branded variable: {variable_id}_{branding_suffix}.
Dataset
#
Bases: Base
Represents a dataset
A dataset is a collection of data files, that is used as an input to the benchmarking process. Adding/removing or updating a dataset will trigger a new diagnostic calculation.
A polymorphic association is used to capture the different types of datasets as each dataset type may have different metadata fields. This enables the use of a single table to store all datasets, but still allows for querying specific metadata fields for each dataset type.
Source code in packages/climate-ref/src/climate_ref/models/dataset.py
created_at = mapped_column(server_default=(func.now()))
class-attribute
instance-attribute
#
When the dataset was added to the database
dataset_type = mapped_column(nullable=False, index=True)
class-attribute
instance-attribute
#
Type of dataset
finalised = mapped_column(default=True, nullable=False)
class-attribute
instance-attribute
#
Whether the complete set of metadata for the dataset has been finalised.
For CMIP6, ingestion may initially create unfinalised datasets (False) until all metadata is extracted. For other dataset types (e.g., obs4MIPs, PMP climatology), this should be True upon creation.
retracted_at = mapped_column(nullable=True, default=None)
class-attribute
instance-attribute
#
When the dataset was retracted, or None while it is active.
Retraction exists because a dataset can never be hard-deleted once it has run
(execution_datasets.dataset_id has no ondelete="CASCADE",
so removing the row would either violate the foreign key or destroy execution provenance).
A retracted dataset's row and files are left intact, but excluded from future solves.
select_datasets (climate_ref.models.dataset_query) excludes retracted rows by default
and only includes them when a caller passes DatasetFilter(include_retracted=True),
so provenance/history reads
(e.g. reconstructing what an existing execution used, or ref datasets list) can still see them.
slug = mapped_column(unique=True)
class-attribute
instance-attribute
#
Globally unique identifier for the dataset.
In the case of CMIP6 datasets, this is the instance_id.
updated_at = mapped_column(server_default=(func.now()), onupdate=(func.now()))
class-attribute
instance-attribute
#
When the dataset was updated.
Updating a dataset will trigger a new diagnostic calculation.
version_key = mapped_column(BigInteger, default=(-1), server_default='-1', nullable=False)
class-attribute
instance-attribute
#
Numeric ordering key for the subclass's version column,
computed by :func:climate_ref_core.datasets.version_sort_key.
Kept in sync by the _sync_version_key mapper event.
Rows with no version attribute (base-table-only inserts) keep the -1 backstop.
Lives on the base table (not a subclass) so the SQL latest-version window function
(select_datasets(..., latest_group_by=...)) can read it off any polymorphic row while
partitioning on the subclass's dataset_id_metadata columns.
Core writes to version
(session.execute(update(...)), connection.execute(...), bulk_update_mappings)
bypass the event and leave version_key stale, silently corrupting latest-version dedup.
ALWAYS mutate version through an ORM instance.
DatasetFile
#
Bases: Base
Capture the metadata for a file in a dataset
A dataset may have multiple files, but is represented as a single dataset in the database. A lot of the metadata will be duplicated for each file in the dataset, but this will be more efficient for querying, filtering and building a data catalog.
Source code in packages/climate-ref/src/climate_ref/models/dataset.py
dataset_id = mapped_column(ForeignKey('dataset.id', ondelete='CASCADE'), nullable=False, index=True)
class-attribute
instance-attribute
#
Foreign key to the dataset table
end_time = mapped_column(nullable=True)
class-attribute
instance-attribute
#
End time of a given file (ISO string, supports cftime calendars)
path = mapped_column()
class-attribute
instance-attribute
#
Prefix that describes where the dataset is stored relative to the data directory
start_time = mapped_column(nullable=True)
class-attribute
instance-attribute
#
Start time of a given file (ISO string, supports cftime calendars)
tracking_id = mapped_column(nullable=True)
class-attribute
instance-attribute
#
Unique file identifier.
For CMIP7, this is the handle identifier (e.g., "hdl:21.14107/uuid").
ESMValToolReferenceDataset
#
Bases: Dataset
Represents a reference (observational/reanalysis) dataset used by ESMValTool.
Unlike obs4MIPs and PMP climatology datasets,
ESMValTool reference data is not strictly CMOR/obs4MIPs compliant.
The data are stored in ESMValTool's own layout
(OBS/OBS6, native6 and non-compliant obs4MIPs),
so the available metadata is limited to what the path and filename encode.
This model therefore has a smaller column set than :class:ReferenceDatasetMixin.
It is a deliberately separate dataset type:
the data describes different sources
and may carry different versions to the obs4MIPs data of the same name,
but will have a different instance_id.
Source code in packages/climate-ref/src/climate_ref/models/dataset.py
data_type = mapped_column(nullable=True)
class-attribute
instance-attribute
#
ESMValTool observation type where available: reanaly, sat, ground.
frequency = mapped_column(index=True)
class-attribute
instance-attribute
#
Temporal resolution, as a CMIP6 frequency CV value, e.g. mon, day, fx.
instance_id = mapped_column(index=True)
class-attribute
instance-attribute
#
Unique identifier for the dataset.
project = mapped_column(index=True)
class-attribute
instance-attribute
#
ESMValCore project the data is loaded as: OBS, OBS6, native6 or obs4MIPs.
source_id = mapped_column(index=True)
class-attribute
instance-attribute
#
Reference dataset name, e.g. CERES-EBAF, ERA5, OSI-450-nh.
tier = mapped_column(nullable=True)
class-attribute
instance-attribute
#
ESMValTool data tier (accessibility), where the layout encodes it.
variable_id = mapped_column(index=True)
class-attribute
instance-attribute
#
ESMValTool short name of the variable, e.g. tas, sic, rlut.
version = mapped_column()
class-attribute
instance-attribute
#
Dataset version as encoded in the ESMValTool layout, e.g. v3, Ed4.2.
Obs4MIPsDataset
#
Bases: ReferenceDatasetMixin, Dataset
Represents a obs4mips dataset
Source code in packages/climate-ref/src/climate_ref/models/dataset.py
Obs4REFDataset
#
Bases: ReferenceDatasetMixin, Dataset
Represents an obs4REF dataset
obs4REF is REF-curated observational data that shares the obs4MIPs metadata conventions but is not published to the obs4MIPs ESGF archive.
The format of this table may change as there isn't an official standard for obs4REF datasets yet. The current columns are based on the obs4MIPs metadata conventions.
Source code in packages/climate-ref/src/climate_ref/models/dataset.py
PMPClimatologyDataset
#
Bases: ReferenceDatasetMixin, Dataset
Represents a climatology dataset from PMP
These data are similar to obs4MIPs datasets, but are post-processed
Source code in packages/climate-ref/src/climate_ref/models/dataset.py
ReferenceDatasetMixin
#
Shared column block for reference/observational dataset types.
These datasets look like obs4MIPs datasets (they share its metadata conventions), but are stored in separate polymorphic subtype tables.
Source code in packages/climate-ref/src/climate_ref/models/dataset.py
instance_id = mapped_column()
class-attribute
instance-attribute
#
Unique identifier for the dataset.
version = mapped_column()
class-attribute
instance-attribute
#
Dataset version string.
Only write this through an ORM instance: the base-table version_key ordering key is
synced by the _sync_version_key mapper event, which Core-level updates bypass.