Skip to content

Commit c23ec11

Browse files
authored
model upgrades: move fields to experiment, nest input_details in grid, multivalued simulation_type (#24)
1 parent 57e4dc0 commit c23ec11

6 files changed

Lines changed: 82 additions & 68 deletions

File tree

project/jsonschema/oae_data_protocol.schema.json

Lines changed: 25 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4529,11 +4529,6 @@
45294529
"null"
45304530
]
45314531
},
4532-
"input_details": {
4533-
"$ref": "#/$defs/ModelInputDetails",
4534-
"description": "Details about input data sources used to drive the model.",
4535-
"title": "Input Details"
4536-
},
45374532
"model_components": {
45384533
"description": "Components of the model (e.g., physics, biogeochemistry).",
45394534
"items": {
@@ -4576,11 +4571,21 @@
45764571
"description": "Latitude/longitude bounds of observed data in experiment, provided in decimal degrees as westernmost longitude, southernmost latitude, easternmost longitude, northernmost latitude. [S, W, N, E]",
45774572
"title": "Spatial Coverage"
45784573
},
4574+
"spin_up_protocol": {
4575+
"description": "Description of the model spin-up process.",
4576+
"title": "Spin-up Protocol",
4577+
"type": "string"
4578+
},
45794579
"start_datetime": {
45804580
"description": "Start date and time of experiment in UTC ISO-8601",
45814581
"format": "date-time",
45824582
"title": "Start Date and Time (UTC)",
45834583
"type": "string"
4584+
},
4585+
"time_stepping_scheme": {
4586+
"description": "Time-stepping method and time step used in the simulation.",
4587+
"title": "Time-stepping Scheme",
4588+
"type": "string"
45844589
}
45854590
},
45864591
"required": [
@@ -4706,6 +4711,11 @@
47064711
"title": "Horizontal Resolution Range",
47074712
"type": "string"
47084713
},
4714+
"input_details": {
4715+
"$ref": "#/$defs/ModelInputDetails",
4716+
"description": "Details about input data sources used to drive the model on this grid.",
4717+
"title": "Input Details"
4718+
},
47094719
"n_nodes": {
47104720
"description": "Number of nodes in the grid (for unstructured grids).",
47114721
"title": "N nodes",
@@ -4848,9 +4858,7 @@
48484858
"description": "A model simulation output dataset. Contains fields specific to computational model output including simulation configuration, output variables, and hardware information.",
48494859
"if": {
48504860
"properties": {
4851-
"simulation_type": {
4852-
"const": "perturbation"
4853-
}
4861+
"simulation_type": {}
48544862
},
48554863
"required": [
48564864
"simulation_type"
@@ -4947,25 +4955,19 @@
49474955
"type": "string"
49484956
},
49494957
"simulation_type": {
4950-
"$ref": "#/$defs/SimulationType",
4951-
"description": "Whether this is a counterfactual (control/baseline) or perturbation simulation.",
4952-
"title": "Simulation Type"
4953-
},
4954-
"spin_up_protocol": {
4955-
"description": "Description of the model spin-up process.",
4956-
"title": "Spin-up Protocol",
4957-
"type": "string"
4958+
"description": "The type(s) of model simulation (e.g., counterfactual, perturbation, or both).",
4959+
"items": {
4960+
"$ref": "#/$defs/SimulationType"
4961+
},
4962+
"minItems": 1,
4963+
"title": "Simulation Type",
4964+
"type": "array"
49584965
},
49594966
"start_datetime": {
49604967
"description": "Start date and time of the simulation in UTC ISO-8601.",
49614968
"format": "date-time",
49624969
"title": "Start Date and Time",
49634970
"type": "string"
4964-
},
4965-
"time_stepping_scheme": {
4966-
"description": "Time-stepping method and time step used in the simulation.",
4967-
"title": "Time-stepping Scheme",
4968-
"type": "string"
49694971
}
49704972
},
49714973
"required": [
@@ -5846,7 +5848,8 @@
58465848
"description": "Type of model simulation dataset",
58475849
"enum": [
58485850
"counterfactual",
5849-
"perturbation"
5851+
"perturbation",
5852+
"other"
58505853
],
58515854
"title": "SimulationType",
58525855
"type": "string"

project/typescript/oae_data_protocol.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ export enum SimulationType {
241241
counterfactual = "counterfactual",
242242
/** Simulation with alkalinity perturbation applied */
243243
perturbation = "perturbation",
244+
/** Other simulation type not listed above */
245+
other = "other",
244246
};
245247
/**
246248
* Variables commonly included in model simulation output datasets
@@ -1612,18 +1614,14 @@ export interface FieldDataset extends Dataset {
16121614
* A model simulation output dataset. Contains fields specific to computational model output including simulation configuration, output variables, and hardware information.
16131615
*/
16141616
export interface ModelOutputDataset extends Dataset {
1615-
/** Whether this is a counterfactual (control/baseline) or perturbation simulation. */
1617+
/** The type(s) of model simulation (e.g., counterfactual, perturbation, or both). */
16161618
simulation_type: string,
1617-
/** Description of the model spin-up process. */
1618-
spin_up_protocol?: string,
16191619
/** Start date and time of the simulation in UTC ISO-8601. */
16201620
start_datetime: string,
16211621
/** End date and time of the simulation in UTC ISO-8601. */
16221622
end_datetime: string,
16231623
/** Frequency of model output (e.g., 'hourly mean', 'daily mean'). */
16241624
output_frequency?: string,
1625-
/** Time-stepping method and time step used in the simulation. */
1626-
time_stepping_scheme?: string,
16271625
/** Description of the mCDR forcing applied in the simulation (e.g., the alkalinity perturbation). Required when simulation_type is "perturbation". */
16281626
mcdr_forcing_description?: string,
16291627
/** Details about the computational hardware used for the simulation. */
@@ -1677,8 +1675,10 @@ export interface Model extends Experiment {
16771675
model_components?: ModelComponent[],
16781676
/** Details about the model grid(s). Use multiple entries for nested grid configurations. */
16791677
grid_details?: ModelGrid[],
1680-
/** Details about input data sources used to drive the model. */
1681-
input_details?: ModelInputDetails,
1678+
/** Description of the model spin-up process. */
1679+
spin_up_protocol?: string,
1680+
/** Time-stepping method and time step used in the simulation. */
1681+
time_stepping_scheme?: string,
16821682
}
16831683

16841684

@@ -1735,6 +1735,8 @@ export interface ModelGrid {
17351735
horizontal_resolution_range?: string,
17361736
/** Description of vertical resolution (e.g., 'Max. 4 m near surface, stretching to 500 m at depth'). */
17371737
vertical_resolution_range?: string,
1738+
/** Details about input data sources used to drive the model on this grid. */
1739+
input_details?: ModelInputDetails,
17381740
}
17391741

17401742

src/oae_data_protocol/datamodel/oae_data_protocol.py

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Auto generated from oae_data_protocol.yaml by pythongen.py version: 0.0.1
2-
# Generation date: 2026-04-07T18:18:12
2+
# Generation date: 2026-04-07T20:36:48
33
# Schema: OAEDataSchema
44
#
55
# id: https://schema.oaedata.org/OAEDataSchema
@@ -2737,22 +2737,21 @@ class ModelOutputDataset(Dataset):
27372737
experiment_id: str = None
27382738
dataset_type: Union[str, "DatasetType"] = None
27392739
data_submitter: Union[dict, Person] = None
2740-
simulation_type: Union[str, "SimulationType"] = None
2740+
simulation_type: Union[Union[str, "SimulationType"], List[Union[str, "SimulationType"]]] = None
27412741
start_datetime: Union[str, XSDDateTime] = None
27422742
end_datetime: Union[str, XSDDateTime] = None
27432743
filenames: Union[str, List[str]] = None
2744-
spin_up_protocol: Optional[str] = None
27452744
output_frequency: Optional[str] = None
2746-
time_stepping_scheme: Optional[str] = None
27472745
mcdr_forcing_description: Optional[str] = None
27482746
hardware_configuration: Optional[Union[dict, "HardwareConfiguration"]] = None
27492747
model_output_variables: Optional[Union[Union[str, "ModelOutputVariable"], List[Union[str, "ModelOutputVariable"]]]] = empty_list()
27502748

27512749
def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
27522750
if self._is_empty(self.simulation_type):
27532751
self.MissingRequiredField("simulation_type")
2754-
if not isinstance(self.simulation_type, SimulationType):
2755-
self.simulation_type = SimulationType(self.simulation_type)
2752+
if not isinstance(self.simulation_type, list):
2753+
self.simulation_type = [self.simulation_type] if self.simulation_type is not None else []
2754+
self.simulation_type = [v if isinstance(v, SimulationType) else SimulationType(v) for v in self.simulation_type]
27562755

27572756
if self._is_empty(self.start_datetime):
27582757
self.MissingRequiredField("start_datetime")
@@ -2770,15 +2769,9 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
27702769
self.filenames = [self.filenames] if self.filenames is not None else []
27712770
self.filenames = [v if isinstance(v, str) else str(v) for v in self.filenames]
27722771

2773-
if self.spin_up_protocol is not None and not isinstance(self.spin_up_protocol, str):
2774-
self.spin_up_protocol = str(self.spin_up_protocol)
2775-
27762772
if self.output_frequency is not None and not isinstance(self.output_frequency, str):
27772773
self.output_frequency = str(self.output_frequency)
27782774

2779-
if self.time_stepping_scheme is not None and not isinstance(self.time_stepping_scheme, str):
2780-
self.time_stepping_scheme = str(self.time_stepping_scheme)
2781-
27822775
if self.mcdr_forcing_description is not None and not isinstance(self.mcdr_forcing_description, str):
27832776
self.mcdr_forcing_description = str(self.mcdr_forcing_description)
27842777

@@ -2891,7 +2884,8 @@ class Model(Experiment):
28912884
model_configuration: Optional[Union[Union[str, URI], List[Union[str, URI]]]] = empty_list()
28922885
model_components: Optional[Union[Union[dict, "ModelComponent"], List[Union[dict, "ModelComponent"]]]] = empty_list()
28932886
grid_details: Optional[Union[Union[dict, "ModelGrid"], List[Union[dict, "ModelGrid"]]]] = empty_list()
2894-
input_details: Optional[Union[dict, "ModelInputDetails"]] = None
2887+
spin_up_protocol: Optional[str] = None
2888+
time_stepping_scheme: Optional[str] = None
28952889

28962890
def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
28972891
if not isinstance(self.model_configuration, list):
@@ -2906,8 +2900,11 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
29062900
self.grid_details = [self.grid_details] if self.grid_details is not None else []
29072901
self.grid_details = [v if isinstance(v, ModelGrid) else ModelGrid(**as_dict(v)) for v in self.grid_details]
29082902

2909-
if self.input_details is not None and not isinstance(self.input_details, ModelInputDetails):
2910-
self.input_details = ModelInputDetails(**as_dict(self.input_details))
2903+
if self.spin_up_protocol is not None and not isinstance(self.spin_up_protocol, str):
2904+
self.spin_up_protocol = str(self.spin_up_protocol)
2905+
2906+
if self.time_stepping_scheme is not None and not isinstance(self.time_stepping_scheme, str):
2907+
self.time_stepping_scheme = str(self.time_stepping_scheme)
29112908

29122909
super().__post_init__(**kwargs)
29132910

@@ -2987,6 +2984,7 @@ class ModelGrid(YAMLRoot):
29872984
n_nodes: Optional[int] = None
29882985
horizontal_resolution_range: Optional[str] = None
29892986
vertical_resolution_range: Optional[str] = None
2987+
input_details: Optional[Union[dict, "ModelInputDetails"]] = None
29902988

29912989
def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
29922990
if self._is_empty(self.grid_type):
@@ -3030,6 +3028,9 @@ def __post_init__(self, *_: List[str], **kwargs: Dict[str, Any]):
30303028
if self.vertical_resolution_range is not None and not isinstance(self.vertical_resolution_range, str):
30313029
self.vertical_resolution_range = str(self.vertical_resolution_range)
30323030

3031+
if self.input_details is not None and not isinstance(self.input_details, ModelInputDetails):
3032+
self.input_details = ModelInputDetails(**as_dict(self.input_details))
3033+
30333034
super().__post_init__(**kwargs)
30343035

30353036

@@ -4073,6 +4074,9 @@ class SimulationType(EnumDefinitionImpl):
40734074
perturbation = PermissibleValue(
40744075
text="perturbation",
40754076
description="Simulation with alkalinity perturbation applied")
4077+
other = PermissibleValue(
4078+
text="other",
4079+
description="Other simulation type not listed above")
40764080

40774081
_defn = EnumDefinition(
40784082
name="SimulationType",
@@ -5677,10 +5681,7 @@ class slots:
56775681
model_uri=OAE.fieldDataset__variables, domain=None, range=Optional[Union[Union[dict, Variable], List[Union[dict, Variable]]]])
56785682

56795683
slots.modelOutputDataset__simulation_type = Slot(uri=OAE.simulation_type, name="modelOutputDataset__simulation_type", curie=OAE.curie('simulation_type'),
5680-
model_uri=OAE.modelOutputDataset__simulation_type, domain=None, range=Union[str, "SimulationType"])
5681-
5682-
slots.modelOutputDataset__spin_up_protocol = Slot(uri=OAE.spin_up_protocol, name="modelOutputDataset__spin_up_protocol", curie=OAE.curie('spin_up_protocol'),
5683-
model_uri=OAE.modelOutputDataset__spin_up_protocol, domain=None, range=Optional[str])
5684+
model_uri=OAE.modelOutputDataset__simulation_type, domain=None, range=Union[Union[str, "SimulationType"], List[Union[str, "SimulationType"]]])
56845685

56855686
slots.modelOutputDataset__start_datetime = Slot(uri=OAE.start_datetime, name="modelOutputDataset__start_datetime", curie=OAE.curie('start_datetime'),
56865687
model_uri=OAE.modelOutputDataset__start_datetime, domain=None, range=Union[str, XSDDateTime])
@@ -5691,9 +5692,6 @@ class slots:
56915692
slots.modelOutputDataset__output_frequency = Slot(uri=OAE.output_frequency, name="modelOutputDataset__output_frequency", curie=OAE.curie('output_frequency'),
56925693
model_uri=OAE.modelOutputDataset__output_frequency, domain=None, range=Optional[str])
56935694

5694-
slots.modelOutputDataset__time_stepping_scheme = Slot(uri=OAE.time_stepping_scheme, name="modelOutputDataset__time_stepping_scheme", curie=OAE.curie('time_stepping_scheme'),
5695-
model_uri=OAE.modelOutputDataset__time_stepping_scheme, domain=None, range=Optional[str])
5696-
56975695
slots.modelOutputDataset__mcdr_forcing_description = Slot(uri=OAE.mcdr_forcing_description, name="modelOutputDataset__mcdr_forcing_description", curie=OAE.curie('mcdr_forcing_description'),
56985696
model_uri=OAE.modelOutputDataset__mcdr_forcing_description, domain=None, range=Optional[str])
56995697

@@ -5742,8 +5740,11 @@ class slots:
57425740
slots.model__grid_details = Slot(uri=OAE.grid_details, name="model__grid_details", curie=OAE.curie('grid_details'),
57435741
model_uri=OAE.model__grid_details, domain=None, range=Optional[Union[Union[dict, ModelGrid], List[Union[dict, ModelGrid]]]])
57445742

5745-
slots.model__input_details = Slot(uri=OAE.input_details, name="model__input_details", curie=OAE.curie('input_details'),
5746-
model_uri=OAE.model__input_details, domain=None, range=Optional[Union[dict, ModelInputDetails]])
5743+
slots.model__spin_up_protocol = Slot(uri=OAE.spin_up_protocol, name="model__spin_up_protocol", curie=OAE.curie('spin_up_protocol'),
5744+
model_uri=OAE.model__spin_up_protocol, domain=None, range=Optional[str])
5745+
5746+
slots.model__time_stepping_scheme = Slot(uri=OAE.time_stepping_scheme, name="model__time_stepping_scheme", curie=OAE.curie('time_stepping_scheme'),
5747+
model_uri=OAE.model__time_stepping_scheme, domain=None, range=Optional[str])
57475748

57485749
slots.modelComponent__model_component_type = Slot(uri=OAE.model_component_type, name="modelComponent__model_component_type", curie=OAE.curie('model_component_type'),
57495750
model_uri=OAE.modelComponent__model_component_type, domain=None, range=Union[str, "ModelComponentType"])
@@ -5802,6 +5803,9 @@ class slots:
58025803
slots.modelGrid__vertical_resolution_range = Slot(uri=OAE.vertical_resolution_range, name="modelGrid__vertical_resolution_range", curie=OAE.curie('vertical_resolution_range'),
58035804
model_uri=OAE.modelGrid__vertical_resolution_range, domain=None, range=Optional[str])
58045805

5806+
slots.modelGrid__input_details = Slot(uri=OAE.input_details, name="modelGrid__input_details", curie=OAE.curie('input_details'),
5807+
model_uri=OAE.modelGrid__input_details, domain=None, range=Optional[Union[dict, ModelInputDetails]])
5808+
58055809
slots.modelInputDetails__bathymetry = Slot(uri=OAE.bathymetry, name="modelInputDetails__bathymetry", curie=OAE.curie('bathymetry'),
58065810
model_uri=OAE.modelInputDetails__bathymetry, domain=None, range=Optional[Union[Union[dict, NamedLink], List[Union[dict, NamedLink]]]])
58075811

src/oae_data_protocol/schema/dataset.yaml

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,11 @@ classes:
152152
attributes:
153153
simulation_type:
154154
title: Simulation Type
155-
description: "Whether this is a counterfactual (control/baseline) or perturbation simulation."
155+
description: "The type(s) of model simulation (e.g., counterfactual, perturbation, or both)."
156156
range: SimulationType
157+
multivalued: true
157158
required: true
158-
spin_up_protocol:
159-
title: Spin-up Protocol
160-
description: "Description of the model spin-up process."
161-
range: string
159+
minimum_cardinality: 1
162160
start_datetime:
163161
title: Start Date and Time
164162
description: "Start date and time of the simulation in UTC ISO-8601."
@@ -173,10 +171,6 @@ classes:
173171
title: Output Frequency
174172
description: "Frequency of model output (e.g., 'hourly mean', 'daily mean')."
175173
range: string
176-
time_stepping_scheme:
177-
title: Time-stepping Scheme
178-
description: "Time-stepping method and time step used in the simulation."
179-
range: string
180174
mcdr_forcing_description:
181175
title: Description of mCDR Forcing
182176
description: >-
@@ -197,7 +191,8 @@ classes:
197191
- preconditions:
198192
slot_conditions:
199193
simulation_type:
200-
equals_string: "perturbation"
194+
has_member:
195+
equals_string: "perturbation"
201196
postconditions:
202197
slot_conditions:
203198
mcdr_forcing_description:

src/oae_data_protocol/schema/enums.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,8 @@ enums:
268268
description: "Control/baseline simulation without alkalinity perturbation"
269269
perturbation:
270270
description: "Simulation with alkalinity perturbation applied"
271+
other:
272+
description: "Other simulation type not listed above"
271273

272274
ModelOutputVariable:
273275
description: "Variables commonly included in model simulation output datasets"

src/oae_data_protocol/schema/model.yaml

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,14 @@ classes:
2727
range: ModelGrid
2828
multivalued: true
2929
inlined_as_list: true
30-
input_details:
31-
title: Input Details
32-
description: "Details about input data sources used to drive the model."
33-
range: ModelInputDetails
34-
inlined: true
30+
spin_up_protocol:
31+
title: Spin-up Protocol
32+
description: "Description of the model spin-up process."
33+
range: string
34+
time_stepping_scheme:
35+
title: Time-stepping Scheme
36+
description: "Time-stepping method and time step used in the simulation."
37+
range: string
3538
ModelComponent:
3639
description: "A component of a model (e.g., physics, biogeochemistry/ecosystem)."
3740
slots:
@@ -154,6 +157,11 @@ classes:
154157
title: Vertical Resolution Range
155158
description: "Description of vertical resolution (e.g., 'Max. 4 m near surface, stretching to 500 m at depth')."
156159
range: string
160+
input_details:
161+
title: Input Details
162+
description: "Details about input data sources used to drive the model on this grid."
163+
range: ModelInputDetails
164+
inlined: true
157165
ModelInputDetails:
158166
description: "Details about input data sources used to drive the model."
159167
attributes:

0 commit comments

Comments
 (0)