From f1e8588dccd9d06ea2da036681b0244e3a6be3ef Mon Sep 17 00:00:00 2001 From: Axel Lauer Date: Wed, 3 Dec 2025 11:08:32 +0100 Subject: [PATCH 01/14] first draft of esmvaltool ozone diagnostics --- .../diagnostics/__init__.py | 12 + .../diagnostics/ozone.py | 370 ++++++++++++++++++ .../src/climate_ref_esmvaltool/recipes.txt | 1 + 3 files changed, 383 insertions(+) create mode 100644 packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/__init__.py b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/__init__.py index 6ed1dac88..ccc23f3eb 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/__init__.py +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/__init__.py @@ -13,6 +13,13 @@ from climate_ref_esmvaltool.diagnostics.ecs import EquilibriumClimateSensitivity from climate_ref_esmvaltool.diagnostics.enso import ENSOBasicClimatology, ENSOCharacteristics from climate_ref_esmvaltool.diagnostics.example import GlobalMeanTimeseries +from climate_ref_esmvaltool.diagnostics.ozone import ( + O3LatMonthMapplot, + O3LatTimeMapplot, + O3PolarCapTimeseriesNH, + O3PolarCapTimeseriesSH, + O3ZonalMeanProfiles, +) from climate_ref_esmvaltool.diagnostics.regional_historical_changes import ( RegionalHistoricalAnnualCycle, RegionalHistoricalTimeSeries, @@ -37,6 +44,11 @@ "ENSOCharacteristics", "EquilibriumClimateSensitivity", "GlobalMeanTimeseries", + "O3LatMonthMapplot", + "O3LatTimeMapplot", + "O3PolarCapTimeseriesSH", + "O3PolarCapTimeseriesNH", + "O3ZonalMeanProfiles", "RegionalHistoricalAnnualCycle", "RegionalHistoricalTimeSeries", "RegionalHistoricalTrend", diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py new file mode 100644 index 000000000..ab1903244 --- /dev/null +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py @@ -0,0 +1,370 @@ +import pandas + +from climate_ref_core.constraints import ( + PartialDateTime, + RequireContiguousTimerange, + RequireTimerange, +) +from climate_ref_core.datasets import FacetFilter, SourceDatasetType +from climate_ref_core.diagnostics import DataRequirement + +# from climate_ref_core.metric_values.typing import SeriesDefinition +from climate_ref_esmvaltool.diagnostics.base import ESMValToolDiagnostic +from climate_ref_esmvaltool.recipe import dataframe_to_recipe +from climate_ref_esmvaltool.types import Recipe + + +class O3LatTimeMapplot(ESMValToolDiagnostic): + """ + Calculate the ozone diagnostics - zonal mean total column ozone vs. time. + """ + + name = "Ozone Diagnostics" + slug = "ozone-lat-time" + base_recipe = "ref/recipe_ref_ozone.yml" + + data_requirements = ( + DataRequirement( + source_type=SourceDatasetType.CMIP6, + filters=( + FacetFilter( + facets={ + "variable_id": "toz", + "experiment_id": "historical", + "table_id": "AERmon", + }, + ), + ), + group_by=("source_id", "member_id", "grid_label"), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(1996, 1), + end=PartialDateTime(2014, 12), + ), + RequireContiguousTimerange(group_by=("instance_id",)), + ), + ), + DataRequirement( + source_type=SourceDatasetType.obs4MIPs, + filters=( + FacetFilter( + facets={ + "variable_id": "toz", + "source_id": "C3S-GTO-ECV-9-0", + "frequency": "mon", + }, + ), + ), + group_by=("source_id",), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(1996, 1), + end=PartialDateTime(2014, 12), + ), + ), + ), + ) + facets = () + + @staticmethod + def update_recipe( + recipe: Recipe, + input_files: dict[SourceDatasetType, pandas.DataFrame], + ) -> None: + """Update the recipe.""" + recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6]) + dataset = recipe_variables["toz"]["additional_datasets"][0] + # set time range of model (CMIP6) dataset (should match observational period) + dataset["timerange"] = "1996/2014" + recipe["datasets"] = [dataset] + diagnostic = "lat_time_mapplot" + recipe["diagnostics"] = {diagnostic: recipe["diagnostics"][diagnostic]} + recipe["diagnostics"][diagnostic]["variables"]["toz"]["timerange"] = "1996/2014" + + +class O3PolarCapTimeseriesSH(ESMValToolDiagnostic): + """ + Calculate the ozone diagnostics - October SH polar mean (60S-85S) time series. + """ + + name = "Ozone Diagnostics" + slug = "ozone-sh-oct" + base_recipe = "ref/recipe_ref_ozone.yml" + + data_requirements = ( + DataRequirement( + source_type=SourceDatasetType.CMIP6, + filters=( + FacetFilter( + facets={ + "variable_id": "toz", + "experiment_id": "historical", + "table_id": "AERmon", + }, + ), + ), + group_by=("source_id", "member_id", "grid_label"), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(1950, 1), + end=PartialDateTime(2014, 12), + ), + RequireContiguousTimerange(group_by=("instance_id",)), + ), + ), + DataRequirement( + source_type=SourceDatasetType.obs4MIPs, + filters=( + FacetFilter( + facets={ + "variable_id": "toz", + "source_id": "C3S-GTO-ECV-9-0", + "frequency": "mon", + }, + ), + ), + group_by=("source_id",), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(1996, 1), + end=PartialDateTime(2021, 12), + ), + ), + ), + ) + facets = () + + @staticmethod + def update_recipe( + recipe: Recipe, + input_files: dict[SourceDatasetType, pandas.DataFrame], + ) -> None: + """Update the recipe.""" + recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6]) + dataset = recipe_variables["toz"]["additional_datasets"][0] + # set model (CMIP6) time range to 1950...2014 + dataset["timerange"] = "1950/2014" + recipe["datasets"] = [dataset] + diagnostic = "polar_cap_time_series_SH" + recipe["diagnostics"] = {diagnostic: recipe["diagnostics"][diagnostic]} + + +class O3PolarCapTimeseriesNH(ESMValToolDiagnostic): + """ + Calculate the ozone diagnostics - March NH polar mean (60N-85N) time series. + """ + + name = "Ozone Diagnostics" + slug = "ozone-nh-mar" + base_recipe = "ref/recipe_ref_ozone.yml" + + data_requirements = ( + DataRequirement( + source_type=SourceDatasetType.CMIP6, + filters=( + FacetFilter( + facets={ + "variable_id": "toz", + "experiment_id": "historical", + "table_id": "AERmon", + }, + ), + ), + group_by=("source_id", "member_id", "grid_label"), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(1950, 1), + end=PartialDateTime(2014, 12), + ), + RequireContiguousTimerange(group_by=("instance_id",)), + ), + ), + DataRequirement( + source_type=SourceDatasetType.obs4MIPs, + filters=( + FacetFilter( + facets={ + "variable_id": "toz", + "source_id": "C3S-GTO-ECV-9-0", + "frequency": "mon", + }, + ), + ), + group_by=("source_id",), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(1996, 1), + end=PartialDateTime(2021, 12), + ), + ), + ), + ) + facets = () + + @staticmethod + def update_recipe( + recipe: Recipe, + input_files: dict[SourceDatasetType, pandas.DataFrame], + ) -> None: + """Update the recipe.""" + # Make sure only grid cells south of 80N are considered as there are no + # measurements north of 80N in March. Specifying 85N as northern boundary + # in the orignal 'recipe_ref_ozone.yml' is a bug! + recipe["preprocessors"]["create_time_series_NH"]["extract_region"]["end_latitude"] = 80 + recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6]) + dataset = recipe_variables["toz"]["additional_datasets"][0] + # set model (CMIP6) time range to 1950...2014 + dataset["timerange"] = "1950/2014" + recipe["datasets"] = [dataset] + diagnostic = "polar_cap_time_series_NH" + # adjust plot title to reflect bug fix regarding northern boundary (see above) + recipe["diagnostics"][diagnostic]["scripts"]["plot"]["plots"]["timeseries"]["pyplot_kwargs"]["title"] = "Total Column Ozone, 60-80N, March" + recipe["diagnostics"] = {diagnostic: recipe["diagnostics"][diagnostic]} + + +class O3ZonalMeanProfiles(ESMValToolDiagnostic): + """ + Calculate the ozone diagnostics - stratospheric zonal mean profiles. + """ + + name = "Ozone Diagnostics" + slug = "ozone-zonal" + base_recipe = "ref/recipe_ref_ozone.yml" + + data_requirements = ( + DataRequirement( + source_type=SourceDatasetType.CMIP6, + filters=( + FacetFilter( + facets={ + "variable_id": "o3", + "experiment_id": "historical", + "table_id": "AERmon", + }, + ), + ), + group_by=("source_id", "member_id", "grid_label"), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(2005, 1), + end=PartialDateTime(2014, 12), + ), + RequireContiguousTimerange(group_by=("instance_id",)), + ), + ), +# DataRequirement( +# source_type=SourceDatasetType.obs4REF, +# filters=( +# FacetFilter( +# facets={ +# "variable_id": "o3", +# "source_id": "ESACCI-OZONE", +# "frequency": "mon", +# }, +# ), +# ), +# group_by=("source_id",), +# constraints=( +# RequireTimerange( +# group_by=("instance_id",), +# start=PartialDateTime(2005, 1), +# end=PartialDateTime(2014, 12), +# ), +# ), +# ), + ) + facets = () + + @staticmethod + def update_recipe( + recipe: Recipe, + input_files: dict[SourceDatasetType, pandas.DataFrame], + ) -> None: + """Update the recipe.""" + recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6]) + dataset = recipe_variables["o3"]["additional_datasets"][0] + # set model (CMIP6) time range to 2005...2014 + dataset["timerange"] = "2005/2014" + recipe["datasets"] = [dataset] + diagnostic = "zonal_mean_profiles" + # adjust plot title to actual time range + recipe["diagnostics"][diagnostic]["scripts"]["plot"]["plots"]["zonal_mean_profile"]["pyplot_kwargs"]["suptitle"] = "{long_name} (2005-2014 mean)" + recipe["diagnostics"] = {diagnostic: recipe["diagnostics"][diagnostic]} + recipe["diagnostics"][diagnostic]["variables"]["o3"]["timerange"] = "2005/2014" + + +class O3LatMonthMapplot(ESMValToolDiagnostic): + """ + Calculate the ozone diagnostics - zonal mean total column ozone vs. annual cycle plot. + """ + + name = "Ozone Diagnostics" + slug = "ozone-annual-cycle" + base_recipe = "ref/recipe_ref_ozone.yml" + + data_requirements = ( + DataRequirement( + source_type=SourceDatasetType.CMIP6, + filters=( + FacetFilter( + facets={ + "variable_id": "toz", + "experiment_id": "historical", + "table_id": "AERmon", + }, + ), + ), + group_by=("source_id", "member_id", "grid_label"), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(2005, 1), + end=PartialDateTime(2014, 12), + ), + RequireContiguousTimerange(group_by=("instance_id",)), + ), + ), + DataRequirement( + source_type=SourceDatasetType.obs4MIPs, + filters=( + FacetFilter( + facets={ + "variable_id": "toz", + "source_id": "C3S-GTO-ECV-9-0", + "frequency": "mon", + }, + ), + ), + group_by=("source_id",), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(2005, 1), + end=PartialDateTime(2014, 12), + ), + ), + ), + ) + facets = () + + @staticmethod + def update_recipe( + recipe: Recipe, + input_files: dict[SourceDatasetType, pandas.DataFrame], + ) -> None: + """Update the recipe.""" + recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6]) + dataset = recipe_variables["toz"]["additional_datasets"][0] + # set model (CMIP6) time range to 2005...2014 + dataset["timerange"] = "2005/2014" + recipe["datasets"] = [dataset] + diagnostic = "lat_month_mapplot" + recipe["diagnostics"] = {diagnostic: recipe["diagnostics"][diagnostic]} + recipe["diagnostics"][diagnostic]["variables"]["toz"]["timerange"] = "2005/2014" diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipes.txt b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipes.txt index 9d26a8a03..3f6990d5b 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipes.txt +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/recipes.txt @@ -10,6 +10,7 @@ ref/recipe_enso_characteristics.yml 34c2518b138068ac96d212910b979d54a8fc ref/recipe_ref_annual_cycle_region.yml 64ebc687789dad6c45a2361b45218cb5a0ad0e38c516840c65fc7e8bf7b5ace7 ref/recipe_ref_cre.yml 4375f262479c3b3e1b348b71080a6d758e195bda76516a591182045a3a29aa32 ref/recipe_ref_fire.yml 2ad82effaca4e742d8abe6a0aa07bb46e1e92ef0d2d240760f7623b0ba045926 +ref/recipe_ref_ozone.yml 388aaf01721c0856ab7143b47b9d2f1efeaaae4ef57e11572c1e133b49aad0a6 ref/recipe_ref_sea_ice_area_basic.yml 7d01a8527880663ca28284772f83a8356d9972fb4f022a4000e50a56ce044b09 ref/recipe_ref_scatterplot.yml b99d1736e16256d161847b025811d7088ad9f892d4887fb009fa99c4079135a0 ref/recipe_ref_timeseries_region.yml 86f36e442021caba201601d8cf4624f8ce6715ce421670a467c792db2910db22 From cb81694badb6f8753dfbac3a5ed5d976b1b184d5 Mon Sep 17 00:00:00 2001 From: Axel Lauer Date: Wed, 10 Dec 2025 09:13:09 +0100 Subject: [PATCH 02/14] add ESACCI-OZONE data (variable o3) for ESMValTool --- .../src/climate_ref_esmvaltool/dataset_registry/data.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/dataset_registry/data.txt b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/dataset_registry/data.txt index f1744d279..94ce67251 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/dataset_registry/data.txt +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/dataset_registry/data.txt @@ -80,6 +80,7 @@ ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_rlu ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_rlutcs_198201-201612.nc 21f096ecafff659e5c7e3338060425f7194e5d1b39c9510865496e04ecac3d75 ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_rsut_198201-201612.nc f2c3f3afcdc2e730df7985c210a3de89b0d4f83b150e0c3846f7ac3c5fa9c54a ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_rsutcs_198201-201612.nc d180d3140d4c1f6b9bb1960e07b45f192643f047e7c272c8c8c7070296ca3ab7 +ESMValTool/OBS/Tier2/ESACCI-OZONE/OBS6_ESACCI-OZONE_sat_L3_AERmon_o3_198410-202212.nc 7ed9446b66e3b8382df4b6ce3074499a9ad00b7173a784c95df289fc9971ce69 ESMValTool/OBS/Tier2/HadCRUT5/OBS_HadCRUT5_ground_5.0.1.0-analysis_Amon_tas_185001-202112.nc edc3ee50b942dfbeccfd58b574df3393555379c2de3418c9717ac11dbafc12fc ESMValTool/OBS/Tier2/ISCCP-FH/OBS_ISCCP-FH_sat_v0_Amon_rlut_198401-201612.nc 650b347df432f6e5f3f693310aad695a7502f2905ac545753c7d4ccb0592adbe ESMValTool/OBS/Tier2/ISCCP-FH/OBS_ISCCP-FH_sat_v0_Amon_rlutcs_198401-201612.nc a90d9e035447f8778a2f64362411c079536d9dea559f6d53d032710b2c9b00e3 From b16785d49805b576d066b3764ce631ef29ed0f46 Mon Sep 17 00:00:00 2001 From: Axel Lauer Date: Wed, 10 Dec 2025 09:18:50 +0100 Subject: [PATCH 03/14] update ozone-zonal diagnostic --- .../diagnostics/ozone.py | 50 ++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py index ab1903244..e43c4ebe7 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py @@ -224,7 +224,9 @@ def update_recipe( recipe["datasets"] = [dataset] diagnostic = "polar_cap_time_series_NH" # adjust plot title to reflect bug fix regarding northern boundary (see above) - recipe["diagnostics"][diagnostic]["scripts"]["plot"]["plots"]["timeseries"]["pyplot_kwargs"]["title"] = "Total Column Ozone, 60-80N, March" + recipe["diagnostics"][diagnostic]["scripts"]["plot"]["plots"]["timeseries"]["pyplot_kwargs"][ + "title" + ] = "Total Column Ozone, 60-80N, March" recipe["diagnostics"] = {diagnostic: recipe["diagnostics"][diagnostic]} @@ -245,7 +247,7 @@ class O3ZonalMeanProfiles(ESMValToolDiagnostic): facets={ "variable_id": "o3", "experiment_id": "historical", - "table_id": "AERmon", + "table_id": "Amon", }, ), ), @@ -259,26 +261,26 @@ class O3ZonalMeanProfiles(ESMValToolDiagnostic): RequireContiguousTimerange(group_by=("instance_id",)), ), ), -# DataRequirement( -# source_type=SourceDatasetType.obs4REF, -# filters=( -# FacetFilter( -# facets={ -# "variable_id": "o3", -# "source_id": "ESACCI-OZONE", -# "frequency": "mon", -# }, -# ), -# ), -# group_by=("source_id",), -# constraints=( -# RequireTimerange( -# group_by=("instance_id",), -# start=PartialDateTime(2005, 1), -# end=PartialDateTime(2014, 12), -# ), -# ), -# ), + # DataRequirement( + # source_type=SourceDatasetType.obs4REF, + # filters=( + # FacetFilter( + # facets={ + # "variable_id": "o3", + # "source_id": "ESACCI-OZONE", + # "frequency": "mon", + # }, + # ), + # ), + # group_by=("source_id",), + # constraints=( + # RequireTimerange( + # group_by=("instance_id",), + # start=PartialDateTime(2005, 1), + # end=PartialDateTime(2014, 12), + # ), + # ), + # ), ) facets = () @@ -295,7 +297,9 @@ def update_recipe( recipe["datasets"] = [dataset] diagnostic = "zonal_mean_profiles" # adjust plot title to actual time range - recipe["diagnostics"][diagnostic]["scripts"]["plot"]["plots"]["zonal_mean_profile"]["pyplot_kwargs"]["suptitle"] = "{long_name} (2005-2014 mean)" + recipe["diagnostics"][diagnostic]["scripts"]["plot"]["plots"]["zonal_mean_profile"]["pyplot_kwargs"][ + "suptitle" + ] = "{long_name} (2005-2014 mean)" recipe["diagnostics"] = {diagnostic: recipe["diagnostics"][diagnostic]} recipe["diagnostics"][diagnostic]["variables"]["o3"]["timerange"] = "2005/2014" From 7402cb733a034d080868e2bbbc8068cf398af5cc Mon Sep 17 00:00:00 2001 From: Axel Lauer Date: Wed, 10 Dec 2025 09:31:24 +0100 Subject: [PATCH 04/14] cleaned up ozone.py --- .../diagnostics/ozone.py | 21 +------------------ 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py index e43c4ebe7..b88ced951 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py @@ -261,26 +261,7 @@ class O3ZonalMeanProfiles(ESMValToolDiagnostic): RequireContiguousTimerange(group_by=("instance_id",)), ), ), - # DataRequirement( - # source_type=SourceDatasetType.obs4REF, - # filters=( - # FacetFilter( - # facets={ - # "variable_id": "o3", - # "source_id": "ESACCI-OZONE", - # "frequency": "mon", - # }, - # ), - # ), - # group_by=("source_id",), - # constraints=( - # RequireTimerange( - # group_by=("instance_id",), - # start=PartialDateTime(2005, 1), - # end=PartialDateTime(2014, 12), - # ), - # ), - # ), + # TODO: Use ESACCI-OZONE (SAGE-OMPS, variable o3) from obs4MIPs once available. ) facets = () From 5501551353ef32760ba56887918662f11ed868a1 Mon Sep 17 00:00:00 2001 From: Axel Lauer Date: Mon, 15 Dec 2025 08:49:46 +0100 Subject: [PATCH 05/14] automatic formatting fixes --- .../src/climate_ref_esmvaltool/diagnostics/__init__.py | 2 +- .../src/climate_ref_esmvaltool/diagnostics/ozone.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/__init__.py b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/__init__.py index ccc23f3eb..3d88468c6 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/__init__.py +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/__init__.py @@ -46,8 +46,8 @@ "GlobalMeanTimeseries", "O3LatMonthMapplot", "O3LatTimeMapplot", - "O3PolarCapTimeseriesSH", "O3PolarCapTimeseriesNH", + "O3PolarCapTimeseriesSH", "O3ZonalMeanProfiles", "RegionalHistoricalAnnualCycle", "RegionalHistoricalTimeSeries", diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py index b88ced951..96f09832d 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py @@ -155,7 +155,7 @@ def update_recipe( class O3PolarCapTimeseriesNH(ESMValToolDiagnostic): """ - Calculate the ozone diagnostics - March NH polar mean (60N-85N) time series. + Calculate the ozone diagnostics - March NH polar mean (60N-80N) time series. """ name = "Ozone Diagnostics" From 91df83f400b7b0c9676c2b6810f632f33ea82f40 Mon Sep 17 00:00:00 2001 From: Axel Lauer Date: Mon, 15 Dec 2025 08:54:08 +0100 Subject: [PATCH 06/14] added 473 to change log --- changelog/473.feature.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog/473.feature.md diff --git a/changelog/473.feature.md b/changelog/473.feature.md new file mode 100644 index 000000000..23b2982f8 --- /dev/null +++ b/changelog/473.feature.md @@ -0,0 +1 @@ +Added ESMValTool ozone diagnostics. From 055c3a893cb56e116ec6c18db8571804728f6fe6 Mon Sep 17 00:00:00 2001 From: Jared Lewis Date: Mon, 2 Mar 2026 15:12:14 +1100 Subject: [PATCH 07/14] chore: add test_specs --- .../diagnostics/ozone.py | 263 ++++++++---------- 1 file changed, 122 insertions(+), 141 deletions(-) diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py index 96f09832d..9f456c74b 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py @@ -1,29 +1,33 @@ import pandas from climate_ref_core.constraints import ( + AddSupplementaryDataset, PartialDateTime, RequireContiguousTimerange, RequireTimerange, ) from climate_ref_core.datasets import FacetFilter, SourceDatasetType from climate_ref_core.diagnostics import DataRequirement +from climate_ref_core.esgf.cmip6 import CMIP6Request +from climate_ref_core.esgf.cmip7 import CMIP7Request +from climate_ref_core.esgf.obs4mips import Obs4MIPsRequest +from climate_ref_core.testing import TestCase, TestDataSpecification # from climate_ref_core.metric_values.typing import SeriesDefinition from climate_ref_esmvaltool.diagnostics.base import ESMValToolDiagnostic from climate_ref_esmvaltool.recipe import dataframe_to_recipe from climate_ref_esmvaltool.types import Recipe +ozone_obs_filter = FacetFilter( + facets={ + "variable_id": "toz", + "source_id": "C3S-GTO-ECV-9-0", + "frequency": "mon", + }, +) -class O3LatTimeMapplot(ESMValToolDiagnostic): - """ - Calculate the ozone diagnostics - zonal mean total column ozone vs. time. - """ - - name = "Ozone Diagnostics" - slug = "ozone-lat-time" - base_recipe = "ref/recipe_ref_ozone.yml" - - data_requirements = ( +toz_data_requirement = ( + ( DataRequirement( source_type=SourceDatasetType.CMIP6, filters=( @@ -43,19 +47,50 @@ class O3LatTimeMapplot(ESMValToolDiagnostic): end=PartialDateTime(2014, 12), ), RequireContiguousTimerange(group_by=("instance_id",)), + AddSupplementaryDataset.from_defaults("areacella", SourceDatasetType.CMIP6), ), ), DataRequirement( source_type=SourceDatasetType.obs4MIPs, + filters=(ozone_obs_filter,), + group_by=("source_id",), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(1996, 1), + end=PartialDateTime(2014, 12), + ), + ), + ), + ), + ( + DataRequirement( + source_type=SourceDatasetType.CMIP7, filters=( FacetFilter( facets={ "variable_id": "toz", - "source_id": "C3S-GTO-ECV-9-0", + "experiment_id": "historical", + "branded_variable": "toz_tavg-u-hxy-u", "frequency": "mon", + "region": "glb", }, ), ), + group_by=("source_id", "variable_label", "grid_label"), + constraints=( + RequireTimerange( + group_by=("instance_id",), + start=PartialDateTime(1996, 1), + end=PartialDateTime(2014, 12), + ), + RequireContiguousTimerange(group_by=("instance_id",)), + AddSupplementaryDataset.from_defaults("areacella", SourceDatasetType.CMIP7), + ), + ), + DataRequirement( + source_type=SourceDatasetType.obs4MIPs, + filters=(ozone_obs_filter,), group_by=("source_id",), constraints=( RequireTimerange( @@ -65,8 +100,77 @@ class O3LatTimeMapplot(ESMValToolDiagnostic): ), ), ), - ) + ), +) +toz_test_spec = TestDataSpecification( + test_cases=( + TestCase( + name="cmip6", + description="Test with CMIP6 data.", + requests=( + CMIP6Request( + slug="cmip6", + facets={ + "experiment_id": ["historical"], + "frequency": ["toz"], + "source_id": "CanESM5", + "variable_id": "toz", + }, + remove_ensembles=True, + time_span=("1996", "2015"), + ), + Obs4MIPsRequest( + slug="obs4mips", + facets=ozone_obs_filter.facets, + remove_ensembles=False, + time_span=("1980", "2009"), + ), + ), + ), + TestCase( + name="cmip7", + description="Test with CMIP7 data.", + requests=( + CMIP7Request( + slug="cmip7", + facets={ + "experiment_id": ["historical"], + "source_id": "CanESM5", + "variable_id": "toz", + "branded_variable": [ + "toz_tavg-u-hxy-u", + ], + "variant_label": "r1i1p1f1", + "frequency": ["fx", "mon"], + "region": "glb", + }, + remove_ensembles=True, + time_span=("1980", "2009"), + ), + Obs4MIPsRequest( + slug="obs4mips", + facets=ozone_obs_filter.facets, + remove_ensembles=False, + time_span=("1980", "2009"), + ), + ), + ), + ), +) + + +class O3LatTimeMapplot(ESMValToolDiagnostic): + """ + Calculate the ozone diagnostics - zonal mean total column ozone vs. time. + """ + + name = "Ozone Diagnostics" + slug = "ozone-lat-time" + base_recipe = "ref/recipe_ref_ozone.yml" + + data_requirements = toz_data_requirement facets = () + test_data_spec = toz_test_spec @staticmethod def update_recipe( @@ -93,50 +197,9 @@ class O3PolarCapTimeseriesSH(ESMValToolDiagnostic): slug = "ozone-sh-oct" base_recipe = "ref/recipe_ref_ozone.yml" - data_requirements = ( - DataRequirement( - source_type=SourceDatasetType.CMIP6, - filters=( - FacetFilter( - facets={ - "variable_id": "toz", - "experiment_id": "historical", - "table_id": "AERmon", - }, - ), - ), - group_by=("source_id", "member_id", "grid_label"), - constraints=( - RequireTimerange( - group_by=("instance_id",), - start=PartialDateTime(1950, 1), - end=PartialDateTime(2014, 12), - ), - RequireContiguousTimerange(group_by=("instance_id",)), - ), - ), - DataRequirement( - source_type=SourceDatasetType.obs4MIPs, - filters=( - FacetFilter( - facets={ - "variable_id": "toz", - "source_id": "C3S-GTO-ECV-9-0", - "frequency": "mon", - }, - ), - ), - group_by=("source_id",), - constraints=( - RequireTimerange( - group_by=("instance_id",), - start=PartialDateTime(1996, 1), - end=PartialDateTime(2021, 12), - ), - ), - ), - ) + data_requirements = toz_data_requirement facets = () + test_data_spec = toz_test_spec @staticmethod def update_recipe( @@ -162,50 +225,9 @@ class O3PolarCapTimeseriesNH(ESMValToolDiagnostic): slug = "ozone-nh-mar" base_recipe = "ref/recipe_ref_ozone.yml" - data_requirements = ( - DataRequirement( - source_type=SourceDatasetType.CMIP6, - filters=( - FacetFilter( - facets={ - "variable_id": "toz", - "experiment_id": "historical", - "table_id": "AERmon", - }, - ), - ), - group_by=("source_id", "member_id", "grid_label"), - constraints=( - RequireTimerange( - group_by=("instance_id",), - start=PartialDateTime(1950, 1), - end=PartialDateTime(2014, 12), - ), - RequireContiguousTimerange(group_by=("instance_id",)), - ), - ), - DataRequirement( - source_type=SourceDatasetType.obs4MIPs, - filters=( - FacetFilter( - facets={ - "variable_id": "toz", - "source_id": "C3S-GTO-ECV-9-0", - "frequency": "mon", - }, - ), - ), - group_by=("source_id",), - constraints=( - RequireTimerange( - group_by=("instance_id",), - start=PartialDateTime(1996, 1), - end=PartialDateTime(2021, 12), - ), - ), - ), - ) + data_requirements = toz_data_requirement facets = () + test_data_spec = toz_test_spec @staticmethod def update_recipe( @@ -294,50 +316,9 @@ class O3LatMonthMapplot(ESMValToolDiagnostic): slug = "ozone-annual-cycle" base_recipe = "ref/recipe_ref_ozone.yml" - data_requirements = ( - DataRequirement( - source_type=SourceDatasetType.CMIP6, - filters=( - FacetFilter( - facets={ - "variable_id": "toz", - "experiment_id": "historical", - "table_id": "AERmon", - }, - ), - ), - group_by=("source_id", "member_id", "grid_label"), - constraints=( - RequireTimerange( - group_by=("instance_id",), - start=PartialDateTime(2005, 1), - end=PartialDateTime(2014, 12), - ), - RequireContiguousTimerange(group_by=("instance_id",)), - ), - ), - DataRequirement( - source_type=SourceDatasetType.obs4MIPs, - filters=( - FacetFilter( - facets={ - "variable_id": "toz", - "source_id": "C3S-GTO-ECV-9-0", - "frequency": "mon", - }, - ), - ), - group_by=("source_id",), - constraints=( - RequireTimerange( - group_by=("instance_id",), - start=PartialDateTime(2005, 1), - end=PartialDateTime(2014, 12), - ), - ), - ), - ) + data_requirements = toz_data_requirement facets = () + test_data_spec = toz_test_spec @staticmethod def update_recipe( From 5591831ad5989c6e128251180f4172186e38ce44 Mon Sep 17 00:00:00 2001 From: Jared Lewis Date: Mon, 2 Mar 2026 17:22:29 +1100 Subject: [PATCH 08/14] chore: Support cmip6/7 --- .../data/cmip6_cmip7_variable_map.json | 75 +++++++++++++++++++ .../src/climate_ref_core/esgf/obs4mips.py | 2 +- .../diagnostics/ozone.py | 67 +++++++++++++---- .../src/climate_ref/conftest_plugin.py | 2 +- scripts/extract-data-request-mappings.py | 1 + 5 files changed, 132 insertions(+), 15 deletions(-) diff --git a/packages/climate-ref-core/src/climate_ref_core/data/cmip6_cmip7_variable_map.json b/packages/climate-ref-core/src/climate_ref_core/data/cmip6_cmip7_variable_map.json index bd179da7f..b465080c2 100644 --- a/packages/climate-ref-core/src/climate_ref_core/data/cmip6_cmip7_variable_map.json +++ b/packages/climate-ref-core/src/climate_ref_core/data/cmip6_cmip7_variable_map.json @@ -5,6 +5,36 @@ "description": "CMIP6-to-CMIP7 variable mappings extracted from the CMIP7 Data Request. Filtered to mon/fx tables and variables used by REF providers. Keyed by CMIP6 compound name (table_id.variable_id). Regenerate with: uv run python scripts/extract-data-request-mappings.py " }, "variables": { + "AERmon.o3": { + "table_id": "AERmon", + "variable_id": "o3", + "cmip6_compound_name": "AERmon.o3", + "cmip7_compound_name": "atmosChem.o3.tavg-al-hxy-u.mon.glb", + "branded_variable": "o3_tavg-al-hxy-u", + "branding_suffix": "tavg-al-hxy-u", + "temporal_label": "tavg", + "vertical_label": "al", + "horizontal_label": "hxy", + "area_label": "u", + "realm": "atmosChem", + "region": "glb", + "frequency": "mon" + }, + "AERmon.o3inst": { + "table_id": "AERmon", + "variable_id": "o3", + "cmip6_compound_name": "AERmon.o3inst", + "cmip7_compound_name": "atmosChem.o3.tpt-al-hxy-u.mon.glb", + "branded_variable": "o3_tpt-al-hxy-u", + "branding_suffix": "tpt-al-hxy-u", + "temporal_label": "tpt", + "vertical_label": "al", + "horizontal_label": "hxy", + "area_label": "u", + "realm": "atmosChem aerosol", + "region": "glb", + "frequency": "mon" + }, "AERmon.toz": { "table_id": "AERmon", "variable_id": "toz", @@ -65,6 +95,21 @@ "region": "glb", "frequency": "mon" }, + "AERmonZ.o3": { + "table_id": "AERmonZ", + "variable_id": "o3", + "cmip6_compound_name": "AERmonZ.o3", + "cmip7_compound_name": "atmosChem.o3.tavg-p39-hy-air.mon.glb", + "branded_variable": "o3_tavg-p39-hy-air", + "branding_suffix": "tavg-p39-hy-air", + "temporal_label": "tavg", + "vertical_label": "p39", + "horizontal_label": "hy", + "area_label": "air", + "realm": "atmosChem", + "region": "glb", + "frequency": "mon" + }, "AERmonZ.ta": { "table_id": "AERmonZ", "variable_id": "ta", @@ -395,6 +440,36 @@ "region": "30S-90S", "frequency": "mon" }, + "Amon.o3": { + "table_id": "Amon", + "variable_id": "o3", + "cmip6_compound_name": "Amon.o3", + "cmip7_compound_name": "atmosChem.o3.tavg-p19-hxy-air.mon.glb", + "branded_variable": "o3_tavg-p19-hxy-air", + "branding_suffix": "tavg-p19-hxy-air", + "temporal_label": "tavg", + "vertical_label": "p19", + "horizontal_label": "hxy", + "area_label": "air", + "realm": "atmosChem", + "region": "glb", + "frequency": "mon" + }, + "Amon.o3Clim": { + "table_id": "Amon", + "variable_id": "o3", + "cmip6_compound_name": "Amon.o3Clim", + "cmip7_compound_name": "atmosChem.o3.tclm-p19-hxy-air.mon.glb", + "branded_variable": "o3_tclm-p19-hxy-air", + "branding_suffix": "tclm-p19-hxy-air", + "temporal_label": "tclm", + "vertical_label": "p19", + "horizontal_label": "hxy", + "area_label": "air", + "realm": "atmosChem", + "region": "glb", + "frequency": "mon" + }, "Amon.pr": { "table_id": "Amon", "variable_id": "pr", diff --git a/packages/climate-ref-core/src/climate_ref_core/esgf/obs4mips.py b/packages/climate-ref-core/src/climate_ref_core/esgf/obs4mips.py index fe1609d5f..337d67c61 100644 --- a/packages/climate-ref-core/src/climate_ref_core/esgf/obs4mips.py +++ b/packages/climate-ref-core/src/climate_ref_core/esgf/obs4mips.py @@ -71,7 +71,7 @@ def __init__( Optional time range filter (start, end) in YYYY-MM format """ self.slug = slug - self.facets = facets + self.facets = {"project": "obs4MIPs", **facets} self.remove_ensembles = remove_ensembles self.time_span = time_span diff --git a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py index 9f456c74b..bdd239a41 100644 --- a/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py +++ b/packages/climate-ref-esmvaltool/src/climate_ref_esmvaltool/diagnostics/ozone.py @@ -12,9 +12,7 @@ from climate_ref_core.esgf.cmip7 import CMIP7Request from climate_ref_core.esgf.obs4mips import Obs4MIPsRequest from climate_ref_core.testing import TestCase, TestDataSpecification - -# from climate_ref_core.metric_values.typing import SeriesDefinition -from climate_ref_esmvaltool.diagnostics.base import ESMValToolDiagnostic +from climate_ref_esmvaltool.diagnostics.base import ESMValToolDiagnostic, get_cmip_source_type from climate_ref_esmvaltool.recipe import dataframe_to_recipe from climate_ref_esmvaltool.types import Recipe @@ -77,7 +75,7 @@ }, ), ), - group_by=("source_id", "variable_label", "grid_label"), + group_by=("source_id", "variant_label", "grid_label"), constraints=( RequireTimerange( group_by=("instance_id",), @@ -111,9 +109,9 @@ CMIP6Request( slug="cmip6", facets={ - "experiment_id": ["historical"], - "frequency": ["toz"], - "source_id": "CanESM5", + "experiment_id": "historical", + "frequency": "mon", + "source_id": "GFDL-ESM4", "variable_id": "toz", }, remove_ensembles=True, @@ -135,7 +133,7 @@ slug="cmip7", facets={ "experiment_id": ["historical"], - "source_id": "CanESM5", + "source_id": "GFDL-ESM4", "variable_id": "toz", "branded_variable": [ "toz_tavg-u-hxy-u", @@ -178,7 +176,7 @@ def update_recipe( input_files: dict[SourceDatasetType, pandas.DataFrame], ) -> None: """Update the recipe.""" - recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6]) + recipe_variables = dataframe_to_recipe(input_files[get_cmip_source_type(input_files)]) dataset = recipe_variables["toz"]["additional_datasets"][0] # set time range of model (CMIP6) dataset (should match observational period) dataset["timerange"] = "1996/2014" @@ -207,7 +205,7 @@ def update_recipe( input_files: dict[SourceDatasetType, pandas.DataFrame], ) -> None: """Update the recipe.""" - recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6]) + recipe_variables = dataframe_to_recipe(input_files[get_cmip_source_type(input_files)]) dataset = recipe_variables["toz"]["additional_datasets"][0] # set model (CMIP6) time range to 1950...2014 dataset["timerange"] = "1950/2014" @@ -239,7 +237,7 @@ def update_recipe( # measurements north of 80N in March. Specifying 85N as northern boundary # in the orignal 'recipe_ref_ozone.yml' is a bug! recipe["preprocessors"]["create_time_series_NH"]["extract_region"]["end_latitude"] = 80 - recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6]) + recipe_variables = dataframe_to_recipe(input_files[get_cmip_source_type(input_files)]) dataset = recipe_variables["toz"]["additional_datasets"][0] # set model (CMIP6) time range to 1950...2014 dataset["timerange"] = "1950/2014" @@ -286,6 +284,49 @@ class O3ZonalMeanProfiles(ESMValToolDiagnostic): # TODO: Use ESACCI-OZONE (SAGE-OMPS, variable o3) from obs4MIPs once available. ) facets = () + test_data_spec = TestDataSpecification( + test_cases=( + TestCase( + name="cmip6", + description="Test with CMIP6 data.", + requests=( + CMIP6Request( + slug="cmip6", + facets={ + "experiment_id": "historical", + "frequency": "mon", + "source_id": "GFDL-ESM4", + "variable_id": "o3", + }, + remove_ensembles=True, + time_span=("1996", "2015"), + ), + ), + ), + TestCase( + name="cmip7", + description="Test with CMIP7 data.", + requests=( + CMIP7Request( + slug="cmip7", + facets={ + "experiment_id": ["historical"], + "source_id": "GFDL-ESM4", + "variable_id": "o3", + "branded_variable": [ + "o3_tavg-al-hxy-u", + ], + "variant_label": "r1i1p1f1", + "frequency": ["fx", "mon"], + "region": "glb", + }, + remove_ensembles=True, + time_span=("1980", "2009"), + ), + ), + ), + ), + ) @staticmethod def update_recipe( @@ -293,7 +334,7 @@ def update_recipe( input_files: dict[SourceDatasetType, pandas.DataFrame], ) -> None: """Update the recipe.""" - recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6]) + recipe_variables = dataframe_to_recipe(input_files[get_cmip_source_type(input_files)]) dataset = recipe_variables["o3"]["additional_datasets"][0] # set model (CMIP6) time range to 2005...2014 dataset["timerange"] = "2005/2014" @@ -326,7 +367,7 @@ def update_recipe( input_files: dict[SourceDatasetType, pandas.DataFrame], ) -> None: """Update the recipe.""" - recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6]) + recipe_variables = dataframe_to_recipe(input_files[get_cmip_source_type(input_files)]) dataset = recipe_variables["toz"]["additional_datasets"][0] # set model (CMIP6) time range to 2005...2014 dataset["timerange"] = "2005/2014" diff --git a/packages/climate-ref/src/climate_ref/conftest_plugin.py b/packages/climate-ref/src/climate_ref/conftest_plugin.py index 96761d275..0bf5a7c62 100644 --- a/packages/climate-ref/src/climate_ref/conftest_plugin.py +++ b/packages/climate-ref/src/climate_ref/conftest_plugin.py @@ -178,7 +178,7 @@ def esgf_data_catalog_trimmed( result = {} for source_type, df in esgf_solve_catalog.items(): if source_type in (SourceDatasetType.CMIP6, SourceDatasetType.CMIP7): - source_ids = ["ACCESS-ESM1-5", "CESM2", "MPI-ESM1-2-LR"] + source_ids = ["ACCESS-ESM1-5", "CESM2", "MPI-ESM1-2-LR", "GFDL-ESM4"] result[source_type] = df[df["source_id"].isin(source_ids)] else: result[source_type] = df diff --git a/scripts/extract-data-request-mappings.py b/scripts/extract-data-request-mappings.py index b3adbafe9..757e02f2e 100644 --- a/scripts/extract-data-request-mappings.py +++ b/scripts/extract-data-request-mappings.py @@ -93,6 +93,7 @@ "ts", # Ozone "toz", + "o3", # Atmosphere: winds "tauu", "ua", From 7bd41af522221f262b932220fe45448a6f533430 Mon Sep 17 00:00:00 2001 From: Jared Lewis Date: Mon, 2 Mar 2026 17:27:27 +1100 Subject: [PATCH 09/14] chore: Add empty solves --- .../test_solve_regression_ozone_annual_cycle_.yml | 1 + .../test_solve_regression_ozone_lat_time_.yml | 1 + .../test_solve_regression_ozone_nh_mar_.yml | 1 + .../test_solve_regression_ozone_sh_oct_.yml | 1 + .../test_solve_regression/test_solve_regression_ozone_zonal_.yml | 1 + 5 files changed, 5 insertions(+) create mode 100644 packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_annual_cycle_.yml create mode 100644 packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_lat_time_.yml create mode 100644 packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_nh_mar_.yml create mode 100644 packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_sh_oct_.yml create mode 100644 packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_zonal_.yml diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_annual_cycle_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_annual_cycle_.yml new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_annual_cycle_.yml @@ -0,0 +1 @@ +{} diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_lat_time_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_lat_time_.yml new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_lat_time_.yml @@ -0,0 +1 @@ +{} diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_nh_mar_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_nh_mar_.yml new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_nh_mar_.yml @@ -0,0 +1 @@ +{} diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_sh_oct_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_sh_oct_.yml new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_sh_oct_.yml @@ -0,0 +1 @@ +{} diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_zonal_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_zonal_.yml new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_zonal_.yml @@ -0,0 +1 @@ +{} From a0d92c632b1877bd3fe710ce6c0f84d3cdf44fdb Mon Sep 17 00:00:00 2001 From: Jared Lewis Date: Tue, 3 Mar 2026 20:32:14 +1100 Subject: [PATCH 10/14] test: Fix failing tests --- .../tests/integration/test_diagnostics.py | 6 ++++++ ...recipe_climate_at_global_warming_levels_cmip6.yml | 12 ++++++++++++ .../tests/unit/test_provider.py | 1 + 3 files changed, 19 insertions(+) diff --git a/packages/climate-ref-esmvaltool/tests/integration/test_diagnostics.py b/packages/climate-ref-esmvaltool/tests/integration/test_diagnostics.py index 59e1e8a10..bd4022922 100644 --- a/packages/climate-ref-esmvaltool/tests/integration/test_diagnostics.py +++ b/packages/climate-ref-esmvaltool/tests/integration/test_diagnostics.py @@ -22,6 +22,12 @@ def provider_test_data_dir() -> Path: SKIP = { "regional-historical-annual-cycle", "regional-historical-timeseries", + # No data in sample data catalog + "ozone-annual-cycle", + "ozone-lat-time", + "ozone-nh-mar", + "ozone-sh-oct", + "ozone-zonal", } diagnostics = [ diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_climate_at_global_warming_levels_cmip6.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_climate_at_global_warming_levels_cmip6.yml index 53200348a..da425d084 100644 --- a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_climate_at_global_warming_levels_cmip6.yml +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_climate_at_global_warming_levels_cmip6.yml @@ -181,6 +181,18 @@ datasets: - historical grid: gn mip: Amon +- project: CMIP6 + activity: + - ScenarioMIP + - CMIP + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + institute: NOAA-GFDL + exp: + - ssp126 + - historical + grid: gr1 + mip: Amon - project: CMIP6 activity: - ScenarioMIP diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_provider.py b/packages/climate-ref-esmvaltool/tests/unit/test_provider.py index bfc62b685..1c66d1c7d 100644 --- a/packages/climate-ref-esmvaltool/tests/unit/test_provider.py +++ b/packages/climate-ref-esmvaltool/tests/unit/test_provider.py @@ -17,6 +17,7 @@ def test_provider(): "cloud_scatterplots.py": 5, "enso.py": 2, "regional_historical_changes.py": 3, + "ozone.py": 5, } n_diagnostics = sum(diagnostics_per_module.get(f.name, 1) for f in diagnostic_modules) assert len(provider) == n_diagnostics From 46a12eaf7dca1cd6bebce0f77f23600d56b453ff Mon Sep 17 00:00:00 2001 From: Jared Lewis Date: Tue, 3 Mar 2026 20:36:17 +1100 Subject: [PATCH 11/14] chore: add obs4mips requirement --- scripts/fetch-esgf.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/scripts/fetch-esgf.py b/scripts/fetch-esgf.py index ad05a97d0..9538ca5ce 100644 --- a/scripts/fetch-esgf.py +++ b/scripts/fetch-esgf.py @@ -248,11 +248,18 @@ def fetch(self, remove_ensembles: bool = True): CMIP6Request( id="esmvaltool-ozone", facets=dict( - variable_id=["toz"], + variable_id=["toz", "o3"], experiment_id=["historical"], table_id="AERmon", ), ), + Obs4MIPsRequest( + id="esmvaltool-ozone-obs4mips", + facets=dict( + source_id="C3S-GTO-ECV-9-0", + variable_id="toz", + ), + ), # ILAMB data CMIP6Request( id="ilamb-data", From 4e01e96e372135fc8a538a9e51ec315c7a419741 Mon Sep 17 00:00:00 2001 From: Jared Lewis Date: Tue, 3 Mar 2026 09:59:51 +0000 Subject: [PATCH 12/14] chore: update catalog --- .../esgf-catalog/obs4mips_catalog.parquet | Bin 18109 -> 18633 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/test-data/esgf-catalog/obs4mips_catalog.parquet b/tests/test-data/esgf-catalog/obs4mips_catalog.parquet index 37d84e4cc062b9b54acf9b4d55b252c83a41471a..013db46c12bebf98c49c24d620424b0829c982e5 100644 GIT binary patch delta 3942 zcmc&$4Qx}_6@K?UKj+!`b&~sR6JtLo;f6ok&n5|EKua7#Aq|kG3@nN;uh_V59Vgfh z3!OS|s?@bZrNEsSVjbHks~BPx5Dl@2R#}C*ZmYU>>LSFZilG*D8|t#ELKU5|o%?JD z<2ju)Rhkq%-T2&dzH`3wbI+^KqhB9JhZdrV!;2P)69R(6HaC3syR!O!0*4Lw6vD?* zKODGvjvKt%%5hvo%VJ4;^DeSA* zU2Ec*(MU8WjOl00;d$7(6i*1a4jZx2(a9}r&DnN+v2oksTWyUN3qVw>0(_ab!ps=~ z(T&K7CTIf9FN$C>_7?od0}@4;bTqY3%fyG1X@;1JYDq1z zKOIjO;n0V8?5--lTFyK@gc|Ah_-f$nCwxm0XDjfk0;nTV3m`qq9`-!2WwWQZXRD{n zqw3TRc6&OCAZL>(_A-gBwnV3#1HfP(-js*RatjVM09IPdL=%a4CK^sfGpTrVpO%<2 z&RNigGFmqCU2f(;cVMLuXic`A6;qd2uPMJ*Ef<>rVw(WMIqU^-upgWCW^vn?xy zjM6c~%GL3dSK-!F!;M}oo%x!UiYVLS$w+AktcU;81pU}x{er*(xU(NiI%oD>2q1=7 zbORbYKFC5GQqmqjK(*q9ciCc4qAsza2lWW+*XF6?g)Lw0L(lTS9Pp;#R^W|}i7qJf zW8&%{8yDNTa|ngF5P}Ow>+lIfKi;l;a6k&N8uWK{b$Ha}9)G9e4}3*c;m>5PTMnh~ zUuWg$k1P5__qY2-5S^}A#lMB2Re9p!ZiUSeKY_ zb0538YPYnMW78F&&lW+iWzYdN5b&t&3>t7n0ayh9x1Nfu{cL-wR;1a5t z8)?|Qg6|8_^Kd+1Hq+KeI0sM!H+YVH6Wv8pC>jnszN*-lh6IEXDr7%r0(lyrt^z$Xqj7J2NTloD?{! z)Hn@>jCOFmr$$6|?@2Q|x!_JtJ6p5dR6kff9;zMS(L3WmwfsQ5udVqz}p0vws4@p};rc_5JX;vplq^CircZOiT6J4#rsF#}0o$?SlLg zy!hTGH!&4mYSWK;Ds;q#^+gST68f2krUuX(BF>)T`*D?y`ww2-0KkQmd$H+yA?x0f zta~B3UP!VRUgg|IY4TGnHAS4kXTr7o*430uWZ!g=^T8PyKg1^ zn^iF`#VV^*i>)WSVHSS&@IN}CM=o!<_mv3gk3>iW{?_GpDo)?2YzV=hOkcItn_%w! zYYz-n*Z5VNo%c=%c8C3+R>C=OmA!*A*4b^9+U`tzUp%uv9FJgLo)F}dNIrwe8X_H5 z=h3dFdh$+_-DoGUasj2qs-``u=-$z2a`%3wNcT4RLa&(1Up27ZF=zgaAfFP*X99VR zFIxZp`}RlO4s1I1G|B<43o6A!t!a|c6${9R_14ro$vJ-! z`2IGMry$;Ha;-}Dz5G_Dhkdc2syST*R6jxT9Yl`Tl5;gowcKt+f8caWQ+YS(8_q>d zpm!9>ClI+=N6yqSz1d|+2Pu>TZF9Ni!R6l|aFM)RPu{e!%lxQj6QG;)yDv-mJUr!c zJK*kd1eHkMYamA(^jKzB8~yf+1^2JH=C{J_Q-XX#Ag{>eQX{)vW+7=(+I*K+&%yC% zGM-82IKGJF*AO{vBU4toS80|$Db&>Wm6jSndLPL*!7n@cuATl+^wK+u3^Ul`b~53K zM){JFTyl{+^I#1K2Hx&24=6>Gk#HtH6wP6R+8ahPvw&Q1)AR12R8XUz=gi)2mXB7F zD=PV{jkYyEu1-CZZ-dhMGmL1N$MQCR$IDlIB|BA@P-Q@R=vb>cY{CdK_(%tTCx3|U6?RG;c<)JN5B26(3K4?s(U1+J5c8lE> z#i#{i2x=vTOAH}~AP^*kK(z!nQL!39AZUnD!Vl$P2tk6_7!3TXo;y3+7COW~{@A%Q z_uTWH@0@!cdv-hi@_js1ic{NX&a|XV7+zMY@Yq-w*1k-Ln8`EbxdtK-l!MS?VTurn zMq-t(2C=n^)#3sVK|~?>vq;KB+{8+(1#?g-n}bVOB`$N=N==}kW3iWU0H@dx_KTUF zYl3HP-Qwjdml~m1G>JF8WM>1=gK(fc5UUKX>o!!@BwmZQOjicK3P>>HmveR&p!c@N z6Y;K%$Ek*E<%6YP8W!;s-@GPi+9TE67Bag_DRE&-OlIREI2Cj}?0 z{c%7J5ekXJJ~VrCvupHB5t`62#!W(#3F7FfZ(O{5$uc7n7ER(!FNQ>pV{!mzs62m@ z)mi4xpA$qi4lrLAPxieM?`;dN>`b&xFqx9VIZwC8gAMH)+Pi{{z3s_le=ox!QjCxR zQ3zcrnbiQ<&x^#1wp9SvSiKc$jwP)NwK7XPjG8du+;ova za|3D8knW02xxkgh?YV-S$96~qEF#-jLUgen(ZQ-^2RkXc*|6wiKZtpNctfm#=Q+7J zTr;ksJ1TOh5&)!eho<3vQuHWXsrK%odx8{;vX8_f0JpO@WE()gBR|T(89%usW{6*R zHkYJ{d$5JoW$k4So4CW~*^HBw8w}tE!_FWmt4q#3G3`~~qPd#8PT6Rc+`?CqyUQs%5GdmIv zdyH5xHO~{!4f92_tflYoc)n- zYEPMzeONh+X$_UONAsEJ&yhxF_^dvPQcU&x;n)-Y^4OuQ^cJ^4Q30|0Dv{Og^O`$) zJKKn$0L(=}`9+|^CVEns7;LBf3*`%MVI9sE2ylCEDqAo;ZK1naWk8k2th#hnAXEs_ zA*}4e^hYb*tIfv;CL5~_5NTJouJBcWPAc3IX-edF(_>7ZW?Z2rqwp|yaeZ%3TmPEA zH2tGkIf3b*OfN_rW@2u2CfSytT0R^y4uAz_T~~J+B27J&MYm+ZETfZ5FBkeJnO?Bb zJvNQ$)Cu;WYqh~bKg1%<=`TAyVK?9;WjL{8!I>U7{x((yG2QK?w;lYrse;`O7D$<^ zV{Wz338#)@A zQXm)ag#uhSma81J(yB$%9t!5raqo%~-VMV$h&>j7|Si8_YqB3ZvL#_1WDt5uQ zAl)f=N1fJlxO(}f&vhR&^?-cER^;=_YdhgTU1zdgujg%8Sxe8YX1A%Do#JPeOP`sb X(5a*xS~C(T*{@2!mLb$wyQ1P>4$_a! From d1f47f2dff34799fd793cb4b63029788558ea780 Mon Sep 17 00:00:00 2001 From: Jared Lewis Date: Tue, 3 Mar 2026 21:05:01 +1100 Subject: [PATCH 13/14] chore: Add regression outputs --- ...cipe_ozone_annual_cycle_cmip6_obs4mips.yml | 138 ++++++++++++++++ ...cipe_ozone_annual_cycle_cmip7_obs4mips.yml | 142 ++++++++++++++++ .../recipe_ozone_lat_time_cmip6_obs4mips.yml | 139 ++++++++++++++++ .../recipe_ozone_lat_time_cmip7_obs4mips.yml | 143 ++++++++++++++++ .../recipe_ozone_nh_mar_cmip6_obs4mips.yml | 136 ++++++++++++++++ .../recipe_ozone_nh_mar_cmip7_obs4mips.yml | 139 ++++++++++++++++ .../recipe_ozone_sh_oct_cmip6_obs4mips.yml | 135 ++++++++++++++++ .../recipe_ozone_sh_oct_cmip7_obs4mips.yml | 138 ++++++++++++++++ .../tests/unit/diagnostics/test_recipes.py | 20 ++- ...t_solve_regression_ozone_annual_cycle_.yml | 153 +++++++++++++++++- .../test_solve_regression_ozone_lat_time_.yml | 153 +++++++++++++++++- .../test_solve_regression_ozone_nh_mar_.yml | 153 +++++++++++++++++- .../test_solve_regression_ozone_sh_oct_.yml | 153 +++++++++++++++++- 13 files changed, 1735 insertions(+), 7 deletions(-) create mode 100644 packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip6_obs4mips.yml create mode 100644 packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip7_obs4mips.yml create mode 100644 packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip6_obs4mips.yml create mode 100644 packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip7_obs4mips.yml create mode 100644 packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip6_obs4mips.yml create mode 100644 packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip7_obs4mips.yml create mode 100644 packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip6_obs4mips.yml create mode 100644 packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip7_obs4mips.yml diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip6_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip6_obs4mips.yml new file mode 100644 index 000000000..b8763045d --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip6_obs4mips.yml @@ -0,0 +1,138 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 85 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP6 + activity: CMIP + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + institute: NOAA-GFDL + exp: historical + grid: gr1 + mip: AERmon + timerange: 2005/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + lat_month_mapplot: + variables: + toz: + timerange: 2005/2014 + mip: AERmon + exp: historical + preprocessor: create_lat_month_map + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + alias: GTO-ECV + frequency: mon + reference_for_monitor_diags: true + scripts: + plot: + script: monitor/multi_datasets.py + facet_used_for_labels: alias + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_LatTime_Map' + matplotlib_rc_params: + xtick.labelsize: 6 + ytick.labelsize: 8 + axes.labelsize: 8 + axes.titlesize: 8 + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + hovmoeller_anncyc_vs_lat_or_lon: + common_cbar: true + show_x_minor_ticks: false + time_on: x-axis diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip7_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip7_obs4mips.yml new file mode 100644 index 000000000..2dc88b34f --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_annual_cycle_cmip7_obs4mips.yml @@ -0,0 +1,142 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 85 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP7 + activity: CMIP + branding_suffix: tavg-u-hxy-u + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + exp: historical + frequency: mon + grid: gr1 + institute: NOAA-GFDL + mip: aerosol + region: glb + timerange: 2005/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + lat_month_mapplot: + variables: + toz: + timerange: 2005/2014 + mip: aerosol + exp: historical + preprocessor: create_lat_month_map + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + alias: GTO-ECV + frequency: mon + reference_for_monitor_diags: true + mip: AERmon + scripts: + plot: + script: monitor/multi_datasets.py + facet_used_for_labels: alias + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_LatTime_Map' + matplotlib_rc_params: + xtick.labelsize: 6 + ytick.labelsize: 8 + axes.labelsize: 8 + axes.titlesize: 8 + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + hovmoeller_anncyc_vs_lat_or_lon: + common_cbar: true + show_x_minor_ticks: false + time_on: x-axis diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip6_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip6_obs4mips.yml new file mode 100644 index 000000000..15a5c0b11 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip6_obs4mips.yml @@ -0,0 +1,139 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 85 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP6 + activity: CMIP + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + institute: NOAA-GFDL + exp: historical + grid: gr1 + mip: AERmon + timerange: 1996/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + lat_time_mapplot: + variables: + toz: + timerange: 1996/2014 + mip: AERmon + exp: historical + preprocessor: create_lat_time_map + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + alias: GTO-ECV + frequency: mon + reference_for_monitor_diags: true + scripts: + plot: + script: monitor/multi_datasets.py + facet_used_for_labels: alias + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_LatTime_Map' + matplotlib_rc_params: + xtick.labelsize: 6 + ytick.labelsize: 8 + axes.labelsize: 8 + axes.titlesize: 8 + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + hovmoeller_time_vs_lat_or_lon: + common_cbar: true + show_x_minor_ticks: false + time_format: '%Y' + time_on: x-axis diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip7_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip7_obs4mips.yml new file mode 100644 index 000000000..6c444f87b --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_lat_time_cmip7_obs4mips.yml @@ -0,0 +1,143 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 85 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP7 + activity: CMIP + branding_suffix: tavg-u-hxy-u + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + exp: historical + frequency: mon + grid: gr1 + institute: NOAA-GFDL + mip: aerosol + region: glb + timerange: 1996/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + lat_time_mapplot: + variables: + toz: + timerange: 1996/2014 + mip: aerosol + exp: historical + preprocessor: create_lat_time_map + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + alias: GTO-ECV + frequency: mon + reference_for_monitor_diags: true + mip: AERmon + scripts: + plot: + script: monitor/multi_datasets.py + facet_used_for_labels: alias + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_LatTime_Map' + matplotlib_rc_params: + xtick.labelsize: 6 + ytick.labelsize: 8 + axes.labelsize: 8 + axes.titlesize: 8 + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + hovmoeller_time_vs_lat_or_lon: + common_cbar: true + show_x_minor_ticks: false + time_format: '%Y' + time_on: x-axis diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip6_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip6_obs4mips.yml new file mode 100644 index 000000000..a0395b1f7 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip6_obs4mips.yml @@ -0,0 +1,136 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 80 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP6 + activity: CMIP + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + institute: NOAA-GFDL + exp: historical + grid: gr1 + mip: AERmon + timerange: 1950/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + polar_cap_time_series_NH: + variables: + toz: + timerange: 1950/2014 + mip: AERmon + exp: historical + preprocessor: create_time_series_NH + facet_used_for_labels: alias + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + timerange: 1996/2021 + alias: GTO-ECV + frequency: mon + scripts: + plot: + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_NH_MAR' + facet_used_for_labels: alias + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + timeseries: + plot_kwargs: + OBS: + color: black + pyplot_kwargs: + title: Total Column Ozone, 60-80N, March diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip7_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip7_obs4mips.yml new file mode 100644 index 000000000..1fad1a667 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_nh_mar_cmip7_obs4mips.yml @@ -0,0 +1,139 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 80 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP7 + activity: CMIP + branding_suffix: tavg-u-hxy-u + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + exp: historical + frequency: mon + grid: gr1 + institute: NOAA-GFDL + mip: aerosol + region: glb + timerange: 1950/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + polar_cap_time_series_NH: + variables: + toz: + timerange: 1950/2014 + mip: aerosol + exp: historical + preprocessor: create_time_series_NH + facet_used_for_labels: alias + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + timerange: 1996/2021 + alias: GTO-ECV + frequency: mon + scripts: + plot: + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_NH_MAR' + facet_used_for_labels: alias + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + timeseries: + plot_kwargs: + OBS: + color: black + pyplot_kwargs: + title: Total Column Ozone, 60-80N, March diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip6_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip6_obs4mips.yml new file mode 100644 index 000000000..e390e8b97 --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip6_obs4mips.yml @@ -0,0 +1,135 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 85 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP6 + activity: CMIP + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + institute: NOAA-GFDL + exp: historical + grid: gr1 + mip: AERmon + timerange: 1950/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + polar_cap_time_series_SH: + variables: + toz: + timerange: 1950/2014 + mip: AERmon + exp: historical + preprocessor: create_time_series_SH + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + timerange: 1996/2021 + alias: GTO-ECV + frequency: mon + scripts: + plot: + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_SH_Oct' + facet_used_for_labels: alias + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + timeseries: + plot_kwargs: + OBS: + color: black + pyplot_kwargs: + title: Total Column Ozone, 60-85S, October diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip7_obs4mips.yml b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip7_obs4mips.yml new file mode 100644 index 000000000..725d4ab5a --- /dev/null +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/recipes/recipe_ozone_sh_oct_cmip7_obs4mips.yml @@ -0,0 +1,138 @@ +documentation: + title: Model evaluation with focus on total column and stratospheric ozone. + description: 'Plot climatologies, zonal means, and selected monthly means for total + column ozone and stratospheric ozone for the REF. + + ' + authors: + - schlund_manuel + - hassler_birgit + maintainer: + - hassler_birgit +preprocessors: + create_time_series_SH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: -85 + end_latitude: -60 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 10 + convert_units: + units: DU + create_time_series_NH: + annual_statistics: + operator: mean + keep_group_coordinates: true + area_statistics: + operator: mean + extract_region: + start_latitude: 60 + end_latitude: 85 + start_longitude: 0 + end_longitude: 360 + extract_month: + month: 3 + convert_units: + units: DU + create_lat_time_map: + regrid: + scheme: linear + target_grid: 5x5 + regrid_time: + calendar: standard + zonal_statistics: + operator: mean + convert_units: + units: DU + create_lat_month_map: + regrid: + scheme: linear + target_grid: 5x5 + climate_statistics: + operator: mean + period: month + zonal_statistics: + operator: mean + convert_units: + units: DU + create_zonal_mean_profile: + zonal_statistics: + operator: mean + regrid: + scheme: linear + target_grid: 5x5 + extract_levels: + levels: + - 15000 + - 10000 + - 7000 + - 5000 + - 3000 + - 2000 + - 1000 + - 500 + - 100 + scheme: linear_extrapolate + coordinate: air_pressure + climate_statistics: + operator: mean + period: full + convert_units: + units: ppm +datasets: +- project: CMIP7 + activity: CMIP + branding_suffix: tavg-u-hxy-u + dataset: GFDL-ESM4 + ensemble: r1i1p1f1 + exp: historical + frequency: mon + grid: gr1 + institute: NOAA-GFDL + mip: aerosol + region: glb + timerange: 1950/2014 +timerange_for_toz_monthly_data: + timerange: 1950/2014 +timerange_for_toz_zonal_mean: + timerange: 1997/2014 +timerange_for_ozone_profile: + timerange: 1990/2000 +diagnostics: + polar_cap_time_series_SH: + variables: + toz: + timerange: 1950/2014 + mip: aerosol + exp: historical + preprocessor: create_time_series_SH + additional_datasets: + - project: obs4MIPs + dataset: C3S-GTO-ECV-9-0 + tier: 1 + timerange: 1996/2021 + alias: GTO-ECV + frequency: mon + scripts: + plot: + script: monitor/multi_datasets.py + plot_folder: '{plot_dir}' + plot_filename: '{plot_type}_{real_name}_SH_Oct' + facet_used_for_labels: alias + savefig_kwargs: + dpi: 150 + bbox_inches: tight + orientation: landscape + plots: + timeseries: + plot_kwargs: + OBS: + color: black + pyplot_kwargs: + title: Total Column Ozone, 60-85S, October diff --git a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/test_recipes.py b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/test_recipes.py index 8375f855b..74720bc7a 100644 --- a/packages/climate-ref-esmvaltool/tests/unit/diagnostics/test_recipes.py +++ b/packages/climate-ref-esmvaltool/tests/unit/diagnostics/test_recipes.py @@ -11,10 +11,24 @@ from climate_ref.solver import solve_executions from climate_ref_core.datasets import SourceDatasetType +SKIP = { + "ozone-zonal", +} -@pytest.mark.parametrize( - "diagnostic", [pytest.param(diagnostic, id=diagnostic.slug) for diagnostic in provider.diagnostics()] -) +diagnostics = [ + pytest.param( + diagnostic, + id=diagnostic.slug, + marks=pytest.mark.skipif( + diagnostic.slug in SKIP, + reason="Missing datasets", + ), + ) + for diagnostic in provider.diagnostics() +] + + +@pytest.mark.parametrize("diagnostic", diagnostics) def test_write_recipe( tmp_path: Path, file_regression: FileRegressionFixture, diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_annual_cycle_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_annual_cycle_.yml index 0967ef424..b9c297465 100644 --- a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_annual_cycle_.yml +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_annual_cycle_.yml @@ -1 +1,152 @@ -{} +cmip6_gn_r1i1p1f1_EC-Earth3-AerChem__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.AERmon.toz.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MPI-ESM-1-2-HAM__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.AERmon.toz.gn.v20190627 + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.fx.areacella.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MRI-ESM2-0__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.AERmon.toz.gn.v20200207 + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.fx.areacella.gn.v20190603 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-0-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.AERmon.toz.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-1-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.AERmon.toz.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-2-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.AERmon.toz.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p4f2_MIROC-ES2H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.AERmon.toz.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr1_r1i1p1f1_GFDL-ESM4__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.AERmon.toz.gr1.v20190726 + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.fx.areacella.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM5A2-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20200729 + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.fx.areacella.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM6A-LR-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-CM6-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.AERmon.toz.gr.v20180917 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.fx.areacella.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-ESM2-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.fx.areacella.gr.v20250328 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.AERmon.toz.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_EC-Earth3-AerChem_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-H_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-2-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MIROC-ES2H_r1i1p4f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MPI-ESM-1-2-HAM_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190627 + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MRI-ESM2-0_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190603 + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200207 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-0-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-1-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr1_GFDL-ESM4_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr1.v20190726 + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-CM6-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20180917 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-ESM2-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20250328 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM5A2-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr.v20200729 + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM6A-LR-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_lat_time_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_lat_time_.yml index 0967ef424..b9c297465 100644 --- a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_lat_time_.yml +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_lat_time_.yml @@ -1 +1,152 @@ -{} +cmip6_gn_r1i1p1f1_EC-Earth3-AerChem__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.AERmon.toz.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MPI-ESM-1-2-HAM__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.AERmon.toz.gn.v20190627 + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.fx.areacella.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MRI-ESM2-0__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.AERmon.toz.gn.v20200207 + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.fx.areacella.gn.v20190603 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-0-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.AERmon.toz.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-1-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.AERmon.toz.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-2-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.AERmon.toz.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p4f2_MIROC-ES2H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.AERmon.toz.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr1_r1i1p1f1_GFDL-ESM4__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.AERmon.toz.gr1.v20190726 + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.fx.areacella.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM5A2-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20200729 + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.fx.areacella.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM6A-LR-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-CM6-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.AERmon.toz.gr.v20180917 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.fx.areacella.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-ESM2-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.fx.areacella.gr.v20250328 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.AERmon.toz.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_EC-Earth3-AerChem_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-H_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-2-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MIROC-ES2H_r1i1p4f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MPI-ESM-1-2-HAM_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190627 + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MRI-ESM2-0_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190603 + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200207 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-0-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-1-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr1_GFDL-ESM4_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr1.v20190726 + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-CM6-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20180917 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-ESM2-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20250328 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM5A2-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr.v20200729 + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM6A-LR-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_nh_mar_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_nh_mar_.yml index 0967ef424..b9c297465 100644 --- a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_nh_mar_.yml +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_nh_mar_.yml @@ -1 +1,152 @@ -{} +cmip6_gn_r1i1p1f1_EC-Earth3-AerChem__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.AERmon.toz.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MPI-ESM-1-2-HAM__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.AERmon.toz.gn.v20190627 + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.fx.areacella.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MRI-ESM2-0__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.AERmon.toz.gn.v20200207 + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.fx.areacella.gn.v20190603 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-0-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.AERmon.toz.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-1-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.AERmon.toz.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-2-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.AERmon.toz.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p4f2_MIROC-ES2H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.AERmon.toz.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr1_r1i1p1f1_GFDL-ESM4__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.AERmon.toz.gr1.v20190726 + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.fx.areacella.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM5A2-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20200729 + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.fx.areacella.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM6A-LR-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-CM6-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.AERmon.toz.gr.v20180917 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.fx.areacella.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-ESM2-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.fx.areacella.gr.v20250328 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.AERmon.toz.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_EC-Earth3-AerChem_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-H_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-2-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MIROC-ES2H_r1i1p4f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MPI-ESM-1-2-HAM_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190627 + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MRI-ESM2-0_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190603 + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200207 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-0-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-1-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr1_GFDL-ESM4_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr1.v20190726 + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-CM6-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20180917 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-ESM2-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20250328 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM5A2-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr.v20200729 + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM6A-LR-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 diff --git a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_sh_oct_.yml b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_sh_oct_.yml index 0967ef424..b9c297465 100644 --- a/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_sh_oct_.yml +++ b/packages/climate-ref-esmvaltool/tests/unit/test_solve_regression/test_solve_regression_ozone_sh_oct_.yml @@ -1 +1,152 @@ -{} +cmip6_gn_r1i1p1f1_EC-Earth3-AerChem__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.AERmon.toz.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MPI-ESM-1-2-HAM__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.AERmon.toz.gn.v20190627 + - CMIP6.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.fx.areacella.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f1_MRI-ESM2-0__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.AERmon.toz.gn.v20200207 + - CMIP6.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.fx.areacella.gn.v20190603 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-0-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.AERmon.toz.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p1f2_UKESM1-1-LL__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.AERmon.toz.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-1-H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.AERmon.toz.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p3f1_GISS-E2-2-G__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.AERmon.toz.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gn_r1i1p4f2_MIROC-ES2H__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.AERmon.toz.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr1_r1i1p1f1_GFDL-ESM4__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.AERmon.toz.gr1.v20190726 + - CMIP6.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.fx.areacella.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM5A2-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20200729 + - CMIP6.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.fx.areacella.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f1_IPSL-CM6A-LR-INCA__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.AERmon.toz.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-CM6-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.AERmon.toz.gr.v20180917 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.fx.areacella.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip6_gr_r1i1p1f2_CNRM-ESM2-1__obs4mips_C3S-GTO-ECV-9-0: + cmip6: + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.fx.areacella.gr.v20250328 + - CMIP6.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.AERmon.toz.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_EC-Earth3-AerChem_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.EC-Earth-Consortium.EC-Earth3-AerChem.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200624 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-1-H_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-1-H.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20220525 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_GISS-E2-2-G_r1i1p3f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NASA-GISS.GISS-E2-2-G.historical.r1i1p3f1.glb.mon.toz.tavg-u-hxy-u.gn.v20211020 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MIROC-ES2H_r1i1p4f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MIROC.MIROC-ES2H.historical.r1i1p4f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220322 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MPI-ESM-1-2-HAM_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190627 + - CMIP7.CMIP.HAMMOZ-Consortium.MPI-ESM-1-2-HAM.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20190627 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_MRI-ESM2-0_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gn.v20190603 + - CMIP7.CMIP.MRI.MRI-ESM2-0.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gn.v20200207 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-0-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-0-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20190406 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gn_UKESM1-1-LL_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.MOHC.UKESM1-1-LL.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gn.v20220512 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr1_GFDL-ESM4_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr1.v20190726 + - CMIP7.CMIP.NOAA-GFDL.GFDL-ESM4.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr1.v20190726 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-CM6-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20180917 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-CM6-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20180917 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_CNRM-ESM2-1_r1i1p1f2__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r13i1p1f2.glb.fx.areacella.ti-u-hxy-u.gr.v20250328 + - CMIP7.CMIP.CNRM-CERFACS.CNRM-ESM2-1.historical.r1i1p1f2.glb.mon.toz.tavg-u-hxy-u.gr.v20181206 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM5A2-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.fx.areacella.ti-u-hxy-u.gr.v20200729 + - CMIP7.CMIP.IPSL.IPSL-CM5A2-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20200729 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 +cmip7_gr_IPSL-CM6A-LR-INCA_r1i1p1f1__obs4mips_C3S-GTO-ECV-9-0: + cmip7: + - CMIP7.CMIP.IPSL.IPSL-CM6A-LR-INCA.historical.r1i1p1f1.glb.mon.toz.tavg-u-hxy-u.gr.v20210216 + obs4mips: + - obs4MIPs.obs4MIPs.DLR-BIRA.C3S-GTO-ECV-9-0.mon.toz.1x1degree.gn.v20231115 From 38a38664c5d44032d3ab2723946f6c06c68144a1 Mon Sep 17 00:00:00 2001 From: Jared Lewis Date: Tue, 3 Mar 2026 21:18:21 +1100 Subject: [PATCH 14/14] chore: fix test --- packages/climate-ref-core/tests/unit/esgf/test_obs4mips.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/climate-ref-core/tests/unit/esgf/test_obs4mips.py b/packages/climate-ref-core/tests/unit/esgf/test_obs4mips.py index 73d84ce8d..98a0700dd 100644 --- a/packages/climate-ref-core/tests/unit/esgf/test_obs4mips.py +++ b/packages/climate-ref-core/tests/unit/esgf/test_obs4mips.py @@ -15,7 +15,11 @@ def test_init_basic(self): facets={"source_id": "GPCP-SG", "variable_id": "pr"}, ) assert request.slug == "test-obs" - assert request.facets == {"source_id": "GPCP-SG", "variable_id": "pr"} + assert request.facets == { + "project": "obs4MIPs", + "source_id": "GPCP-SG", + "variable_id": "pr", + } assert request.remove_ensembles is False assert request.time_span is None assert request.source_type == "obs4MIPs"