Skip to content

Commit 5e009cf

Browse files
committed
Update ESMValTool diagnostics to use timerange constraint
1 parent 85cb9ea commit 5e009cf

8 files changed

Lines changed: 146 additions & 42 deletions

File tree

packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/climate_at_global_warming_levels.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
from climate_ref_core.constraints import (
44
AddSupplementaryDataset,
5-
RequireContiguousTimerange,
5+
PartialDateTime,
66
RequireFacets,
7+
RequireTimerange,
78
)
89
from climate_ref_core.datasets import FacetFilter, SourceDatasetType
910
from climate_ref_core.diagnostics import DataRequirement
@@ -26,6 +27,14 @@ class ClimateAtGlobalWarmingLevels(ESMValToolDiagnostic):
2627
"tas",
2728
)
2829

30+
matching_facets = (
31+
"source_id",
32+
"member_id",
33+
"grid_label",
34+
"table_id",
35+
"variable_id",
36+
)
37+
2938
data_requirements = (
3039
DataRequirement(
3140
source_type=SourceDatasetType.CMIP6,
@@ -47,17 +56,15 @@ class ClimateAtGlobalWarmingLevels(ESMValToolDiagnostic):
4756
RequireFacets("variable_id", variables),
4857
AddSupplementaryDataset(
4958
supplementary_facets={"experiment_id": "historical"},
50-
matching_facets=(
51-
"source_id",
52-
"member_id",
53-
"grid_label",
54-
"table_id",
55-
"variable_id",
56-
),
59+
matching_facets=matching_facets,
5760
optional_matching_facets=tuple(),
5861
),
5962
RequireFacets("experiment_id", ("historical",)),
60-
RequireContiguousTimerange(group_by=("instance_id",)),
63+
RequireTimerange(
64+
group_by=matching_facets,
65+
start=PartialDateTime(year=1850, month=1),
66+
end=PartialDateTime(year=2100, month=12),
67+
),
6168
AddSupplementaryDataset.from_defaults("areacella", SourceDatasetType.CMIP6),
6269
),
6370
),

packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/climate_drivers_for_fire.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@
22

33
from climate_ref_core.constraints import (
44
AddSupplementaryDataset,
5+
PartialDateTime,
56
RequireFacets,
6-
RequireOverlappingTimerange,
7+
RequireTimerange,
78
)
89
from climate_ref_core.datasets import FacetFilter, SourceDatasetType
910
from climate_ref_core.diagnostics import DataRequirement
@@ -45,7 +46,11 @@ class ClimateDriversForFire(ESMValToolDiagnostic):
4546
group_by=("source_id", "member_id", "grid_label"),
4647
constraints=(
4748
RequireFacets("variable_id", variables),
48-
RequireOverlappingTimerange(group_by=("instance_id",)),
49+
RequireTimerange(
50+
group_by=("instance_id",),
51+
start=PartialDateTime(2013, 1),
52+
end=PartialDateTime(2014, 12),
53+
),
4954
AddSupplementaryDataset.from_defaults("sftlf", SourceDatasetType.CMIP6),
5055
),
5156
),

packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/cloud_radiative_effects.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22

33
from climate_ref_core.constraints import (
44
AddSupplementaryDataset,
5-
RequireContiguousTimerange,
5+
PartialDateTime,
66
RequireFacets,
77
RequireOverlappingTimerange,
8+
RequireTimerange,
89
)
910
from climate_ref_core.datasets import FacetFilter, SourceDatasetType
1011
from climate_ref_core.diagnostics import DataRequirement
@@ -44,7 +45,11 @@ class CloudRadiativeEffects(ESMValToolDiagnostic):
4445
group_by=("source_id", "member_id", "grid_label"),
4546
constraints=(
4647
RequireFacets("variable_id", variables),
47-
RequireContiguousTimerange(group_by=("instance_id",)),
48+
RequireTimerange(
49+
group_by=("instance_id",),
50+
start=PartialDateTime(1996, 1),
51+
end=PartialDateTime(2014, 12),
52+
),
4853
RequireOverlappingTimerange(group_by=("instance_id",)),
4954
AddSupplementaryDataset.from_defaults("areacella", SourceDatasetType.CMIP6),
5055
),
@@ -58,19 +63,7 @@ def update_recipe(recipe: Recipe, input_files: dict[SourceDatasetType, pandas.Da
5863
recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6])
5964
recipe_variables = {k: v for k, v in recipe_variables.items() if k != "areacella"}
6065

61-
# Select a timerange covered by all datasets.
62-
start_times, end_times = [], []
63-
for variable in recipe_variables.values():
64-
for dataset in variable["additional_datasets"]:
65-
start, end = dataset["timerange"].split("/")
66-
start_times.append(start)
67-
end_times.append(end)
68-
start_time = max(start_times)
69-
start_time = max(start_time, "20010101T000000") # Earliest observational dataset availability
70-
timerange = f"{start_time}/{min(end_times)}"
71-
7266
datasets = recipe_variables["rsut"]["additional_datasets"]
7367
for dataset in datasets:
7468
dataset.pop("timerange")
7569
recipe["datasets"] = datasets
76-
recipe["timerange_for_models"] = timerange

packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/cloud_scatterplots.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
from climate_ref_core.constraints import (
66
AddSupplementaryDataset,
77
PartialDateTime,
8-
RequireContiguousTimerange,
98
RequireFacets,
10-
RequireOverlappingTimerange,
119
RequireTimerange,
1210
)
1311
from climate_ref_core.datasets import FacetFilter, SourceDatasetType
@@ -33,9 +31,11 @@ def get_cmip6_data_requirements(variables: tuple[str, ...]) -> tuple[DataRequire
3331
group_by=("source_id", "experiment_id", "member_id", "frequency", "grid_label"),
3432
constraints=(
3533
RequireFacets("variable_id", variables),
36-
RequireContiguousTimerange(group_by=("instance_id",)),
37-
RequireOverlappingTimerange(group_by=("instance_id",)),
38-
# TODO: Add a RequireTimeRange constraint to match reference datasets?
34+
RequireTimerange(
35+
group_by=("instance_id",),
36+
start=PartialDateTime(1996, 1),
37+
end=PartialDateTime(2014, 12),
38+
),
3939
AddSupplementaryDataset.from_defaults("areacella", SourceDatasetType.CMIP6),
4040
),
4141
),
@@ -49,13 +49,15 @@ def update_recipe(
4949
var_y: str,
5050
) -> None:
5151
"""Update the recipe."""
52-
recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6], equalize_timerange=True)
52+
recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6])
5353
diagnostics = recipe["diagnostics"]
5454
diagnostic_name = f"plot_joint_{var_x}_{var_y}_model"
5555
diagnostic = diagnostics.pop(diagnostic_name)
5656
diagnostics.clear()
5757
diagnostics[diagnostic_name] = diagnostic
5858
datasets = next(iter(recipe_variables.values()))["additional_datasets"]
59+
for dataset in datasets:
60+
dataset["timerange"] = "1996/2014"
5961
diagnostic["additional_datasets"] = datasets
6062
suptitle = "CMIP6 {dataset} {ensemble} {grid} {timerange}".format(**datasets[0])
6163
diagnostic["scripts"]["plot"]["suptitle"] = suptitle

packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/regional_historical_changes.py

Lines changed: 92 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77

88
from climate_ref_core.constraints import (
99
AddSupplementaryDataset,
10-
RequireContiguousTimerange,
10+
PartialDateTime,
1111
RequireFacets,
12+
RequireTimerange,
1213
)
1314
from climate_ref_core.datasets import ExecutionDatasetCollection, FacetFilter, SourceDatasetType
1415
from climate_ref_core.diagnostics import DataRequirement
@@ -130,7 +131,11 @@ class RegionalHistoricalAnnualCycle(ESMValToolDiagnostic):
130131
group_by=("source_id", "member_id", "grid_label"),
131132
constraints=(
132133
RequireFacets("variable_id", variables),
133-
RequireContiguousTimerange(group_by=("instance_id",)),
134+
RequireTimerange(
135+
group_by=("instance_id",),
136+
start=PartialDateTime(1980, 1),
137+
end=PartialDateTime(2009, 12),
138+
),
134139
AddSupplementaryDataset.from_defaults("areacella", SourceDatasetType.CMIP6),
135140
),
136141
),
@@ -149,7 +154,13 @@ class RegionalHistoricalAnnualCycle(ESMValToolDiagnostic):
149154
),
150155
),
151156
group_by=("source_id",),
152-
constraints=(RequireContiguousTimerange(group_by=("instance_id",)),),
157+
constraints=(
158+
RequireTimerange(
159+
group_by=("instance_id",),
160+
start=PartialDateTime(1980, 1),
161+
end=PartialDateTime(2009, 12),
162+
),
163+
),
153164
# TODO: Add obs4MIPs datasets once available and working:
154165
#
155166
# obs4MIPs dataset that cannot be ingested (https://github.com/Climate-REF/climate-ref/issues/260):
@@ -211,6 +222,15 @@ class RegionalHistoricalTimeSeries(RegionalHistoricalAnnualCycle):
211222
name = "Regional historical mean and anomaly of climate variables"
212223
slug = "regional-historical-timeseries"
213224
base_recipe = "ref/recipe_ref_timeseries_region.yml"
225+
226+
variables = (
227+
"hus",
228+
"pr",
229+
"psl",
230+
"tas",
231+
"ua",
232+
)
233+
214234
series = tuple(
215235
SeriesDefinition(
216236
file_pattern=f"{diagnostic}-{region}/allplots/*_{var_name}_*.nc",
@@ -220,11 +240,67 @@ class RegionalHistoricalTimeSeries(RegionalHistoricalAnnualCycle):
220240
index_name="time",
221241
attributes=[],
222242
)
223-
for var_name in RegionalHistoricalAnnualCycle.variables
243+
for var_name in variables
224244
for region in REGIONS
225245
for diagnostic in ["timeseries_abs", "timeseries"]
226246
)
227247

248+
data_requirements = (
249+
DataRequirement(
250+
source_type=SourceDatasetType.CMIP6,
251+
filters=(
252+
FacetFilter(
253+
facets={
254+
"variable_id": variables,
255+
"experiment_id": "historical",
256+
"frequency": "mon",
257+
},
258+
),
259+
),
260+
group_by=("source_id", "member_id", "grid_label"),
261+
constraints=(
262+
RequireFacets("variable_id", variables),
263+
RequireTimerange(
264+
group_by=("instance_id",),
265+
start=PartialDateTime(1980, 1),
266+
end=PartialDateTime(2014, 12),
267+
),
268+
AddSupplementaryDataset.from_defaults("areacella", SourceDatasetType.CMIP6),
269+
),
270+
),
271+
DataRequirement(
272+
source_type=SourceDatasetType.obs4MIPs,
273+
filters=(
274+
FacetFilter(
275+
facets={
276+
"variable_id": (
277+
"psl",
278+
"ua",
279+
),
280+
"source_id": "ERA-5",
281+
"frequency": "mon",
282+
},
283+
),
284+
),
285+
group_by=("source_id",),
286+
constraints=(
287+
RequireTimerange(
288+
group_by=("instance_id",),
289+
start=PartialDateTime(1980, 1),
290+
end=PartialDateTime(2014, 12),
291+
),
292+
),
293+
# TODO: Add obs4MIPs datasets once available and working:
294+
#
295+
# obs4MIPs dataset that cannot be ingested (https://github.com/Climate-REF/climate-ref/issues/260):
296+
# - GPCP-V2.3: pr
297+
#
298+
# Not yet available on obs4MIPs:
299+
# - ERA5: hus
300+
# - HadCRUT5_ground_5.0.1.0-analysis: tas
301+
),
302+
)
303+
228304

229305
class RegionalHistoricalTrend(ESMValToolDiagnostic):
230306
"""
@@ -255,7 +331,11 @@ class RegionalHistoricalTrend(ESMValToolDiagnostic):
255331
),
256332
group_by=("source_id", "member_id", "grid_label"),
257333
constraints=(
258-
RequireContiguousTimerange(group_by=("instance_id",)),
334+
RequireTimerange(
335+
group_by=("instance_id",),
336+
start=PartialDateTime(1980, 1),
337+
end=PartialDateTime(2009, 12),
338+
),
259339
AddSupplementaryDataset.from_defaults("areacella", SourceDatasetType.CMIP6),
260340
),
261341
),
@@ -275,7 +355,13 @@ class RegionalHistoricalTrend(ESMValToolDiagnostic):
275355
),
276356
),
277357
group_by=("source_id",),
278-
constraints=(RequireContiguousTimerange(group_by=("instance_id",)),),
358+
constraints=(
359+
RequireTimerange(
360+
group_by=("instance_id",),
361+
start=PartialDateTime(1980, 1),
362+
end=PartialDateTime(2009, 12),
363+
),
364+
),
279365
# TODO: Add obs4MIPs datasets once available and working:
280366
#
281367
# obs4MIPs dataset that cannot be ingested (https://github.com/Climate-REF/climate-ref/issues/260):

packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/sea_ice_area_basic.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
from climate_ref_core.constraints import (
44
AddSupplementaryDataset,
5-
RequireContiguousTimerange,
5+
PartialDateTime,
6+
RequireTimerange,
67
)
78
from climate_ref_core.datasets import FacetFilter, SourceDatasetType
89
from climate_ref_core.diagnostics import DataRequirement
@@ -33,7 +34,11 @@ class SeaIceAreaBasic(ESMValToolDiagnostic):
3334
),
3435
group_by=("instance_id",),
3536
constraints=(
36-
RequireContiguousTimerange(group_by=("instance_id",)),
37+
RequireTimerange(
38+
group_by=("instance_id",),
39+
start=PartialDateTime(1979, 1),
40+
end=PartialDateTime(2014, 12),
41+
),
3742
AddSupplementaryDataset.from_defaults("areacello", SourceDatasetType.CMIP6),
3843
),
3944
),

packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/sea_ice_sensitivity.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55

66
from climate_ref_core.constraints import (
77
AddSupplementaryDataset,
8-
RequireContiguousTimerange,
8+
PartialDateTime,
99
RequireFacets,
10+
RequireTimerange,
1011
)
1112
from climate_ref_core.datasets import ExecutionDatasetCollection, FacetFilter, SourceDatasetType
1213
from climate_ref_core.diagnostics import DataRequirement
@@ -46,7 +47,11 @@ class SeaIceSensitivity(ESMValToolDiagnostic):
4647
constraints=(
4748
AddSupplementaryDataset.from_defaults("areacella", SourceDatasetType.CMIP6),
4849
AddSupplementaryDataset.from_defaults("areacello", SourceDatasetType.CMIP6),
49-
RequireContiguousTimerange(group_by=("instance_id",)),
50+
RequireTimerange(
51+
group_by=("instance_id",),
52+
start=PartialDateTime(1979, 1),
53+
end=PartialDateTime(2014, 12),
54+
),
5055
RequireFacets("variable_id", variables),
5156
# TODO: Add a constraint to ensure that tas, siconc and areacello
5257
# are available for each model or alternatively filter out

packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_cloud_radiative_effects.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ datasets:
1818
exp: historical
1919
grid: gn
2020
mip: Amon
21-
timerange_for_models: 20010101T000000/20141216T120000
21+
timerange_for_models:
22+
timerange: 1996/2014
2223
preprocessors:
2324
full_climatology:
2425
climate_statistics:

0 commit comments

Comments
 (0)