climate-ref-esmvaltool 0.6.4__py3-none-any.whl → 0.6.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. climate_ref_esmvaltool/dataset_registry/data.txt +75 -0
  2. climate_ref_esmvaltool/diagnostics/__init__.py +24 -0
  3. climate_ref_esmvaltool/diagnostics/base.py +82 -16
  4. climate_ref_esmvaltool/diagnostics/climate_at_global_warming_levels.py +5 -2
  5. climate_ref_esmvaltool/diagnostics/climate_drivers_for_fire.py +68 -0
  6. climate_ref_esmvaltool/diagnostics/cloud_radiative_effects.py +2 -2
  7. climate_ref_esmvaltool/diagnostics/cloud_scatterplots.py +188 -0
  8. climate_ref_esmvaltool/diagnostics/ecs.py +9 -18
  9. climate_ref_esmvaltool/diagnostics/enso.py +10 -4
  10. climate_ref_esmvaltool/diagnostics/example.py +15 -2
  11. climate_ref_esmvaltool/diagnostics/regional_historical_changes.py +340 -0
  12. climate_ref_esmvaltool/diagnostics/sea_ice_area_basic.py +5 -2
  13. climate_ref_esmvaltool/diagnostics/sea_ice_sensitivity.py +108 -0
  14. climate_ref_esmvaltool/diagnostics/tcr.py +9 -18
  15. climate_ref_esmvaltool/diagnostics/tcre.py +5 -2
  16. climate_ref_esmvaltool/diagnostics/zec.py +5 -2
  17. climate_ref_esmvaltool/recipe.py +46 -7
  18. climate_ref_esmvaltool/recipes.txt +16 -10
  19. climate_ref_esmvaltool/requirements/conda-lock.yml +4081 -3770
  20. climate_ref_esmvaltool/requirements/environment.yml +1 -0
  21. {climate_ref_esmvaltool-0.6.4.dist-info → climate_ref_esmvaltool-0.6.6.dist-info}/METADATA +2 -2
  22. climate_ref_esmvaltool-0.6.6.dist-info/RECORD +30 -0
  23. climate_ref_esmvaltool-0.6.4.dist-info/RECORD +0 -26
  24. {climate_ref_esmvaltool-0.6.4.dist-info → climate_ref_esmvaltool-0.6.6.dist-info}/WHEEL +0 -0
  25. {climate_ref_esmvaltool-0.6.4.dist-info → climate_ref_esmvaltool-0.6.6.dist-info}/entry_points.txt +0 -0
  26. {climate_ref_esmvaltool-0.6.4.dist-info → climate_ref_esmvaltool-0.6.6.dist-info}/licenses/LICENCE +0 -0
  27. {climate_ref_esmvaltool-0.6.4.dist-info → climate_ref_esmvaltool-0.6.6.dist-info}/licenses/NOTICE +0 -0
@@ -1,12 +1,86 @@
1
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1980_monthly.nc 48ff88cfbe8d99a0886e2dc6a80499a542c5d3d91e51a5475814104ea24959fd
2
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1981_monthly.nc d23fd46ca62287f7f9b8bb2cab6f78cd05c95225400eba122e498d7404da5eae
3
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1982_monthly.nc 0bcb4e855c89b350e357a703fcbb76f0316800e325302d66481db8bed4e6e62d
4
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1983_monthly.nc c01d412621a6e4853594ef275b2bcfa569acd80fd3b5ef6d9aca83aa941b2ab2
5
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1984_monthly.nc 5892d9629a5da067d7fe2d4a3412513b11195d2647374aefa223ab578334329c
6
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1985_monthly.nc c90318e810f8dc11b04b96a63812970b5b84cf0eec20076834173e1bfcb2e092
7
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1986_monthly.nc 8677384f7c8568ecc56b1d0fff10cc7633a36f141890268992f54c12c7f02431
8
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1987_monthly.nc e9938785bc083bd86e5a6882bd6aae4319d58438e7455dec62ec6c6e815456e6
9
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1988_monthly.nc 452da6c221438202faf5d7c698a3b2b697b187ab170ace21c2a90ca7c226b6b0
10
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1989_monthly.nc 8784d1125f81e57efa85c3a491b69fd0c61847e45947d3d5e639345ee1f2ed96
11
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1990_monthly.nc 86c94b2e0ed6f598d536e16cdbbea856dec81a7a02a019a59e1ef3a09a24137f
12
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1991_monthly.nc 8220294b443cd96cb7b499a3d963786a61766a6dc944d396905d96e2676182a2
13
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1992_monthly.nc 04ee384343d8fdca07d52af4f6b074fb6597a99359b6b2116a76f7ce1b7a45e3
14
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1993_monthly.nc a6cb4d42e3fb2a9e702c1e601b7e8edf74eecf0862f259fe5dc14dec71fe9b41
15
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1994_monthly.nc acd0ebbffc5a32591b2d71f906a7167a8d74960f15f43834f668e0668aeb0214
16
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1995_monthly.nc d47ca46cc518deb0c54e823d3bc819e8e0c16c91a918bcd5af0d7f87c0ed9f28
17
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1996_monthly.nc dc638a30d9b31fd51353c5e097dcaeef57634ff1c43570936b6286936ad4b5f5
18
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1997_monthly.nc 3bd6217ed16abcd92288962c76d392ee782cdc857f32b95ccc7060406f7fc3e6
19
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1998_monthly.nc 6e55f80d3aaff7ea572a1952a59de3a382c31d72f322d17fafd0f2f85a9c4be7
20
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_1999_monthly.nc baa867a37e79ef2ce4214556915a11e4f091d8e6dadc0af4a286f928ecdb5a0b
21
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2000_monthly.nc 13f0dd65458d444f259078c7dca46b32e569beffb00fd61675892f1be9344766
22
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2001_monthly.nc e9eb1270f31e687810d3ee18a6d87e4f75194bf1ab9ccd468f9f0bffa46b1507
23
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2002_monthly.nc eb7fae23ee31beba63d4bf0683c33f7f086c8546051b14ab49ef819a3a55f8d2
24
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2003_monthly.nc b24a85c15f54e4fb2a49a2b91b6fb7f4467fd2af4028f65aa4fa6720cb4d44d8
25
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2004_monthly.nc 8d1b015fb2e6acdb719d756d190d5283cf0713365a8b4058bd9c09b1a6998635
26
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2005_monthly.nc 816da648dd5da271a40657c030b61b0b1f6baf0e108384262917ec7c404cbd78
27
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2006_monthly.nc 0b7ed69c8e93de182db00ef90f9a753ef056a0b8abf13f8c2e7ea5f54b52fa2d
28
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2007_monthly.nc 020f2d6f3c01c65a88e05dcc64583a6801507540dcf5b27fb3fa5a1b416518b9
29
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2008_monthly.nc f5880184b7c0ec0a3836e0b84df3beb012d735e0ea310c2b8ceb8a583a59bb1c
30
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2009_monthly.nc 8c2f0d3ddc9eef994ae971c81005010c3762ebec9797c659e0260eeeec3a360d
31
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2010_monthly.nc 80f16ef9275d9fccfb969a08e7ad04d4b25fdad9fb4752d10f5fe0212530468f
32
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2011_monthly.nc ed5ebb860db5e5554c16b6efea6d5ef6c8bd426f728477db45b856d859782f34
33
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2012_monthly.nc 2745a5d61f977f3c71f13b5df1373d6f7801d4541d9862ba8a1a6686c7ccaca3
34
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2013_monthly.nc d60c4395484b195e8fceb6ee1d8436fdd142a0dcd6a0828dcd3f2c181ff1da35
35
+ ESMValTool/native6/Tier3/ERA5/v1/mon/hus/era5_specific_humidity_2014_monthly.nc 1b5ea6a09d156ede27dfacf36cdb7e4633a0c96311523dc487fbc57f276f36eb
36
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1980_monthly.nc 5363c35729b71986dbf0ab870d3280aa70367b2ed992e747f4d354322c20267e
37
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1981_monthly.nc 8dbe433af76d2e9f40aeb5fb0d9cc11f6823b9b71d1db3e8700d5f77722cab81
38
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1982_monthly.nc 5a545da7425ee3b148db286fb2df3f85ac07808926bbc85ee7edea20412479be
39
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1983_monthly.nc 01dab7313cc2c68dfe83d25cb1e3a1f5fdc3a611c3001d22ec4a75ede782d957
40
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1984_monthly.nc 0eec210377c3063983875fdddbb4f357343e4081f6aa31594963b029c13e1bb6
41
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1985_monthly.nc 6eca60f548216df4b2259c1552977aaee82e6dfe66438974582f71133a85d83f
42
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1986_monthly.nc a3142087ab5aecbd6ea42e8f2c700a9fc4090e07faacdb9444b356cb7b53b7eb
43
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1987_monthly.nc ff3c17bf4d475cd061fa80763edda03e371aac3cf526d3b3a54630607f29aea1
44
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1988_monthly.nc 628560d51bdaa45ee079891823e4770699fae685db17ecb29329f0db4a9bd6fe
45
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1989_monthly.nc dc41551e2a21df91f8b4d1840d47f0777808959db269ca50b1fee296882b647e
46
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1990_monthly.nc 8669dcd643da485e7975aa2014b86b9c66ebd5e51923cca7d1b0f4b6898309e6
47
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1991_monthly.nc e09248e7361e3e884ab70c32c85294e0d9d418b8c29ba1187adccedfe42504d4
48
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1992_monthly.nc 09e7750ee3c2357ae81dbdd6b0554b53d8124027f370fdc48965bb389e370b7e
49
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1993_monthly.nc f537c64565172b176c1f0391f66153e0924e0cef920cf7014f167eff9f563c87
50
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1994_monthly.nc f38138bf64a5a4b991db9673c051892df16d89fe19bd9b7c767d3985d4f2b8d3
51
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1995_monthly.nc 3497d32d78fa2e8887277b8629b88ed71b0f570dcaec4fdbeb95129986d69e3b
52
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1996_monthly.nc fd8dd938f724747edd951c026d0e663d48439dda315a2394eda9a21056032bdf
53
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1997_monthly.nc fbb3ccd82381dac655f44c9a363839d6f1b507f0082578a391862a20bf381129
54
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1998_monthly.nc 9d88d17eb926222ab658a6fef376a9243310f4048e20a158a9f3b3bac2672123
55
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_1999_monthly.nc 7146a3bb327ba9bb1a6584574915a27a43ec65eccbe946dd3305bbd5392b2a71
56
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2000_monthly.nc 6c47f0edab228d477d4780be468a8d801c829b204cae2d2449c8d604982cba66
57
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2001_monthly.nc 516e75787b4503f092028bb170c6c48730c1cb3efe3091b32c427d7062ee4905
58
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2002_monthly.nc b7e9e6d35b9515767b05a583ee5a037a6dc16f144cae18c6ded16619d1006ba1
59
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2003_monthly.nc 739d997936d282bba448294c8f4b1d998f4d92313e84445e28806f8c52778f79
60
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2004_monthly.nc c3729496614e917a4b802d5144ebce73eac148c17ac9a68c245b274e704c2be2
61
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2005_monthly.nc 5bc32ffa821732f3cb1fbdd4115daad84530bd3dd05bed69f70bb9472641c9b1
62
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2006_monthly.nc ae253c74b2f7bc05deb66772170a63fa6a2ffa6a43476cd612331c4c91965054
63
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2007_monthly.nc 9fc23a565792d61dd0877b3671803e31c108dd1b96b8228a14ae61f0eeb2e8cd
64
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2008_monthly.nc 13ff4fb0efa617fb0bb9601c1cffcb0d969ecb841def96ba8fa25efcc13c949f
65
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2009_monthly.nc c7fe95230ac84c5b8a13b4d05dd1927a24586c43a3fb134bec2f0707e70a7f11
66
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2010_monthly.nc ab1fef5b7d89c3e4c0cb4c803fc40d077e6baf84ff8b9497adfce03812650ea7
67
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2011_monthly.nc 1f4c9735818621c6dac53b49cb959f48aef6a0affe9ac63a97c20d90b21b47da
68
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2012_monthly.nc 7324f447010bdca690028197fff483cd53668707ade467d00b41ee2717355318
69
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2013_monthly.nc 710ba54caf511eb713eee58f7dda2a79c824ce3c758ad08802109b4898641eb8
70
+ ESMValTool/native6/Tier3/ERA5/v1/mon/pr/era5_total_precipitation_2014_monthly.nc af69507521f2493cfb898100f1a33d983cf09c394421fcb8f5b644b2e113d79c
1
71
  ESMValTool/obs4MIPs/GPCP-V2.3/v20180519/pr_GPCP-SG_L3_v2.3_197901-201710.nc 4dd4678b79ef139446c8406da5aae4fed210abb2f2160ef95f6988bf83e4525b
2
72
  ESMValTool/OBS/Tier2/CERES-EBAF/OBS_CERES-EBAF_sat_Ed4.2_Amon_rlut_200003-202311.nc ede887cf2d83c848a0d71316799232e4d717662bd2f78d5aa1fc166b41d9953b
3
73
  ESMValTool/OBS/Tier2/CERES-EBAF/OBS_CERES-EBAF_sat_Ed4.2_Amon_rlutcs_200003-202311.nc e70e3273092edf01527970693271641fc6474d1974887d7d272e7d656bab83c2
4
74
  ESMValTool/OBS/Tier2/CERES-EBAF/OBS_CERES-EBAF_sat_Ed4.2_Amon_rsut_200003-202311.nc e31e648886c4fa9c09686672a06ab18fbba687ff0d6de2891616d4c8b74e215d
5
75
  ESMValTool/OBS/Tier2/CERES-EBAF/OBS_CERES-EBAF_sat_Ed4.2_Amon_rsutcs_200003-202311.nc eb96edd9274670aa705eab2a6d1ee0cca11e01ac17096706463e032b58e6be47
76
+ ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_clivi_198201-201612.nc 13bc6e3a46397386a14a36776fdd6bdbf5c45147c8dc695d4a7387883d449775
77
+ ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_clt_198201-201612.nc 4a430d77dbe9164dba2d1fdef4bb89ea9358b6d10023f3fbee50917422446ed0
78
+ ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_clwvi_198201-201612.nc e0ffa31369d9552be16b920110b24013d31e116b180ee3f70b3d0aaa5281eff0
6
79
  ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_rlut_198201-201612.nc 075144d673a9f2ff49fbe59e701535bf80c04908797a9dca83781000a9b1b7f2
7
80
  ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_rlutcs_198201-201612.nc 21f096ecafff659e5c7e3338060425f7194e5d1b39c9510865496e04ecac3d75
8
81
  ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_rsut_198201-201612.nc f2c3f3afcdc2e730df7985c210a3de89b0d4f83b150e0c3846f7ac3c5fa9c54a
9
82
  ESMValTool/OBS/Tier2/ESACCI-CLOUD/OBS_ESACCI-CLOUD_sat_AVHRR-AMPM-fv3.0_Amon_rsutcs_198201-201612.nc d180d3140d4c1f6b9bb1960e07b45f192643f047e7c272c8c8c7070296ca3ab7
83
+ ESMValTool/OBS/Tier2/HadCRUT5/OBS_HadCRUT5_ground_5.0.1.0-analysis_Amon_tas_185001-202112.nc edc3ee50b942dfbeccfd58b574df3393555379c2de3418c9717ac11dbafc12fc
10
84
  ESMValTool/OBS/Tier2/ISCCP-FH/OBS_ISCCP-FH_sat_v0_Amon_rlut_198401-201612.nc 650b347df432f6e5f3f693310aad695a7502f2905ac545753c7d4ccb0592adbe
11
85
  ESMValTool/OBS/Tier2/ISCCP-FH/OBS_ISCCP-FH_sat_v0_Amon_rlutcs_198401-201612.nc a90d9e035447f8778a2f64362411c079536d9dea559f6d53d032710b2c9b00e3
12
86
  ESMValTool/OBS/Tier2/ISCCP-FH/OBS_ISCCP-FH_sat_v0_Amon_rsut_198401-201612.nc 8afa3afd416500b17bceda5689c43d64277a4c32f99521f79a3603d0e3fe0570
@@ -85,5 +159,6 @@ ESMValTool/OBS/Tier2/OSI-450-sh/OBS_OSI-450-sh_reanaly_v3_OImon_sic_201101-20111
85
159
  ESMValTool/OBS/Tier2/OSI-450-sh/OBS_OSI-450-sh_reanaly_v3_OImon_sic_201201-201212.nc 86187c3d1174053f2cba6dad010af49ceab77d368aa9314bf53c330b5f2217b9
86
160
  ESMValTool/OBS/Tier2/OSI-450-sh/OBS_OSI-450-sh_reanaly_v3_OImon_sic_201301-201312.nc 8820353570884b2ef182caaffb5986ed6268bbe199fd867f61b56e798ca01f1a
87
161
  ESMValTool/OBS/Tier2/OSI-450-sh/OBS_OSI-450-sh_reanaly_v3_OImon_sic_201401-201412.nc 7102d0db3dc02c5b0eb0cfe3535ee50171007ef5b43eb9aae1220ac21b0b98e9
162
+ ESMValTool/OBS/Tier3/CALIPSO-ICECLOUD/OBS_CALIPSO-ICECLOUD_sat_1-00_Amon_cli_200701-201512.nc 977824810e8f9dbe7df278c59397ffc3f78491a9eb5a0b70e6b28ac66db8e12d
88
163
  ESMValTool/OBS/Tier2/TROPFLUX/OBS6_TROPFLUX_reanaly_v1_Amon_tauu_197901-201812.nc bf313e661b42341d5090038b501ed1ff09e58201009c3fccfe45b78e116fdd78
89
164
  ESMValTool/OBS/Tier2/TROPFLUX/OBS6_TROPFLUX_reanaly_v1_Omon_tos_197901-201812.nc 5f10a5a2aa47f5d21378ad3178bf8e4b577b0ed72ef8402dc04f5ff6fc99ec07
@@ -1,23 +1,47 @@
1
1
  """ESMValTool diagnostics."""
2
2
 
3
3
  from climate_ref_esmvaltool.diagnostics.climate_at_global_warming_levels import ClimateAtGlobalWarmingLevels
4
+ from climate_ref_esmvaltool.diagnostics.climate_drivers_for_fire import ClimateDriversForFire
4
5
  from climate_ref_esmvaltool.diagnostics.cloud_radiative_effects import CloudRadiativeEffects
6
+ from climate_ref_esmvaltool.diagnostics.cloud_scatterplots import (
7
+ CloudScatterplotCliTa,
8
+ CloudScatterplotCliviLwcre,
9
+ CloudScatterplotCltSwcre,
10
+ CloudScatterplotClwviPr,
11
+ CloudScatterplotsReference,
12
+ )
5
13
  from climate_ref_esmvaltool.diagnostics.ecs import EquilibriumClimateSensitivity
6
14
  from climate_ref_esmvaltool.diagnostics.enso import ENSOBasicClimatology, ENSOCharacteristics
7
15
  from climate_ref_esmvaltool.diagnostics.example import GlobalMeanTimeseries
16
+ from climate_ref_esmvaltool.diagnostics.regional_historical_changes import (
17
+ RegionalHistoricalAnnualCycle,
18
+ RegionalHistoricalTimeSeries,
19
+ RegionalHistoricalTrend,
20
+ )
8
21
  from climate_ref_esmvaltool.diagnostics.sea_ice_area_basic import SeaIceAreaBasic
22
+ from climate_ref_esmvaltool.diagnostics.sea_ice_sensitivity import SeaIceSensitivity
9
23
  from climate_ref_esmvaltool.diagnostics.tcr import TransientClimateResponse
10
24
  from climate_ref_esmvaltool.diagnostics.tcre import TransientClimateResponseEmissions
11
25
  from climate_ref_esmvaltool.diagnostics.zec import ZeroEmissionCommitment
12
26
 
13
27
  __all__ = [
14
28
  "ClimateAtGlobalWarmingLevels",
29
+ "ClimateDriversForFire",
15
30
  "CloudRadiativeEffects",
31
+ "CloudScatterplotCliTa",
32
+ "CloudScatterplotCliviLwcre",
33
+ "CloudScatterplotCltSwcre",
34
+ "CloudScatterplotClwviPr",
35
+ "CloudScatterplotsReference",
16
36
  "ENSOBasicClimatology",
17
37
  "ENSOCharacteristics",
18
38
  "EquilibriumClimateSensitivity",
19
39
  "GlobalMeanTimeseries",
40
+ "RegionalHistoricalAnnualCycle",
41
+ "RegionalHistoricalTimeSeries",
42
+ "RegionalHistoricalTrend",
20
43
  "SeaIceAreaBasic",
44
+ "SeaIceSensitivity",
21
45
  "TransientClimateResponse",
22
46
  "TransientClimateResponseEmissions",
23
47
  "ZeroEmissionCommitment",
@@ -1,11 +1,13 @@
1
+ import fnmatch
1
2
  from abc import abstractmethod
2
3
  from collections.abc import Iterable
3
4
  from pathlib import Path
4
5
  from typing import ClassVar
5
6
 
6
7
  import pandas
8
+ import xarray as xr
9
+ import yaml
7
10
  from loguru import logger
8
- from ruamel.yaml import YAML
9
11
 
10
12
  from climate_ref_core.dataset_registry import dataset_registry_manager
11
13
  from climate_ref_core.datasets import ExecutionDatasetCollection, SourceDatasetType
@@ -14,13 +16,12 @@ from climate_ref_core.diagnostics import (
14
16
  ExecutionDefinition,
15
17
  ExecutionResult,
16
18
  )
19
+ from climate_ref_core.metric_values.typing import SeriesMetricValue
17
20
  from climate_ref_core.pycmec.metric import CMECMetric, MetricCV
18
21
  from climate_ref_core.pycmec.output import CMECOutput, OutputCV
19
22
  from climate_ref_esmvaltool.recipe import load_recipe, prepare_climate_data
20
23
  from climate_ref_esmvaltool.types import MetricBundleArgs, OutputBundleArgs, Recipe
21
24
 
22
- yaml = YAML()
23
-
24
25
 
25
26
  class ESMValToolDiagnostic(CommandLineDiagnostic):
26
27
  """ESMValTool Diagnostic base class."""
@@ -29,7 +30,10 @@ class ESMValToolDiagnostic(CommandLineDiagnostic):
29
30
 
30
31
  @staticmethod
31
32
  @abstractmethod
32
- def update_recipe(recipe: Recipe, input_files: pandas.DataFrame) -> None:
33
+ def update_recipe(
34
+ recipe: Recipe,
35
+ input_files: dict[SourceDatasetType, pandas.DataFrame],
36
+ ) -> None:
33
37
  """
34
38
  Update the base recipe for the run.
35
39
 
@@ -69,9 +73,9 @@ class ESMValToolDiagnostic(CommandLineDiagnostic):
69
73
  """
70
74
  return CMECMetric.model_validate(metric_args), CMECOutput.model_validate(output_args)
71
75
 
72
- def build_cmd(self, definition: ExecutionDefinition) -> Iterable[str]:
76
+ def write_recipe(self, definition: ExecutionDefinition) -> Path:
73
77
  """
74
- Build the command to run an ESMValTool recipe.
78
+ Update the ESMValTool recipe for the diagnostic and write it to file.
75
79
 
76
80
  Parameters
77
81
  ----------
@@ -81,22 +85,42 @@ class ESMValToolDiagnostic(CommandLineDiagnostic):
81
85
  Returns
82
86
  -------
83
87
  :
84
- The result of running the diagnostic.
88
+ The path to the written recipe.
85
89
  """
86
- input_files = definition.datasets[SourceDatasetType.CMIP6].datasets
90
+ input_files = {
91
+ project: dataset_collection.datasets
92
+ for project, dataset_collection in definition.datasets.items()
93
+ }
87
94
  recipe = load_recipe(self.base_recipe)
88
95
  self.update_recipe(recipe, input_files)
89
96
 
90
97
  recipe_path = definition.to_output_path("recipe.yml")
91
98
  with recipe_path.open("w", encoding="utf-8") as file:
92
- yaml.dump(recipe, file)
99
+ yaml.safe_dump(recipe, file, sort_keys=False)
100
+ return recipe_path
101
+
102
+ def build_cmd(self, definition: ExecutionDefinition) -> Iterable[str]:
103
+ """
104
+ Build the command to run an ESMValTool recipe.
105
+
106
+ Parameters
107
+ ----------
108
+ definition
109
+ A description of the information needed for this execution of the diagnostic
93
110
 
111
+ Returns
112
+ -------
113
+ :
114
+ The result of running the diagnostic.
115
+ """
116
+ recipe_path = self.write_recipe(definition)
94
117
  climate_data = definition.to_output_path("climate_data")
95
118
 
96
- prepare_climate_data(
97
- definition.datasets[SourceDatasetType.CMIP6].datasets,
98
- climate_data_dir=climate_data,
99
- )
119
+ for metric_dataset in definition.datasets.values():
120
+ prepare_climate_data(
121
+ metric_dataset.datasets,
122
+ climate_data_dir=climate_data,
123
+ )
100
124
 
101
125
  config = {
102
126
  "drs": {
@@ -132,7 +156,7 @@ class ESMValToolDiagnostic(CommandLineDiagnostic):
132
156
  {
133
157
  "OBS": str(data_dir / "OBS"),
134
158
  "OBS6": str(data_dir / "OBS"),
135
- "native6": str(data_dir / "RAWOBS"),
159
+ "native6": str(data_dir / "native6"),
136
160
  }
137
161
  )
138
162
  config["rootpath"]["obs4MIPs"] = [ # type: ignore[index]
@@ -143,7 +167,7 @@ class ESMValToolDiagnostic(CommandLineDiagnostic):
143
167
  config_dir = definition.to_output_path("config")
144
168
  config_dir.mkdir()
145
169
  with (config_dir / "config.yml").open("w", encoding="utf-8") as file:
146
- yaml.dump(config, file)
170
+ yaml.safe_dump(config, file)
147
171
 
148
172
  return [
149
173
  "esmvaltool",
@@ -175,9 +199,15 @@ class ESMValToolDiagnostic(CommandLineDiagnostic):
175
199
  output_args = CMECOutput.create_template()
176
200
 
177
201
  # Add the plots and data files
202
+ variable_attributes = (
203
+ "long_name",
204
+ "standard_name",
205
+ "units",
206
+ )
207
+ series = []
178
208
  plot_suffixes = {".png", ".jpg", ".pdf", ".ps"}
179
209
  for metadata_file in result_dir.glob("run/*/*/diagnostic_provenance.yml"):
180
- metadata = yaml.load(metadata_file.read_text(encoding="utf-8"))
210
+ metadata = yaml.safe_load(metadata_file.read_text(encoding="utf-8"))
181
211
  for filename in metadata:
182
212
  caption = metadata[filename].get("caption", "")
183
213
  relative_path = definition.as_relative_path(filename)
@@ -190,6 +220,41 @@ class ESMValToolDiagnostic(CommandLineDiagnostic):
190
220
  OutputCV.LONG_NAME.value: caption,
191
221
  OutputCV.DESCRIPTION.value: "",
192
222
  }
223
+ for series_def in definition.diagnostic.series:
224
+ if fnmatch.fnmatch(str(relative_path), f"executions/*/{series_def.file_pattern}"):
225
+ dataset = xr.open_dataset(
226
+ filename, decode_times=xr.coders.CFDatetimeCoder(use_cftime=True)
227
+ )
228
+ dataset = dataset.sel(series_def.sel)
229
+ attributes = {
230
+ attr: dataset.attrs[attr]
231
+ for attr in series_def.attributes
232
+ if attr in dataset.attrs
233
+ }
234
+ attributes["caption"] = caption
235
+ attributes["values_name"] = series_def.values_name
236
+ attributes["index_name"] = series_def.index_name
237
+ for attr in variable_attributes:
238
+ if attr in dataset[series_def.values_name].attrs:
239
+ attributes[f"value_{attr}"] = dataset[series_def.values_name].attrs[attr]
240
+ if attr in dataset[series_def.index_name].attrs:
241
+ attributes[f"index_{attr}"] = dataset[series_def.index_name].attrs[attr]
242
+ index = dataset[series_def.index_name].values.tolist()
243
+ if hasattr(index[0], "calendar"):
244
+ attributes["calendar"] = index[0].calendar
245
+ if hasattr(index[0], "isoformat"):
246
+ # Convert time objects to strings.
247
+ index = [v.isoformat() for v in index]
248
+
249
+ series.append(
250
+ SeriesMetricValue(
251
+ dimensions=series_def.dimensions,
252
+ values=dataset[series_def.values_name].values.tolist(),
253
+ index=index,
254
+ index_name=series_def.index_name,
255
+ attributes=attributes,
256
+ )
257
+ )
193
258
 
194
259
  # Add the index.html file
195
260
  index_html = f"{result_dir}/index.html"
@@ -220,4 +285,5 @@ class ESMValToolDiagnostic(CommandLineDiagnostic):
220
285
  definition,
221
286
  cmec_output_bundle=output_bundle,
222
287
  cmec_metric_bundle=metric_bundle,
288
+ series=series,
223
289
  )
@@ -65,13 +65,16 @@ class ClimateAtGlobalWarmingLevels(ESMValToolDiagnostic):
65
65
  facets = ()
66
66
 
67
67
  @staticmethod
68
- def update_recipe(recipe: Recipe, input_files: pandas.DataFrame) -> None:
68
+ def update_recipe(
69
+ recipe: Recipe,
70
+ input_files: dict[SourceDatasetType, pandas.DataFrame],
71
+ ) -> None:
69
72
  """Update the recipe."""
70
73
  # Set up the datasets
71
74
  diagnostics = recipe["diagnostics"]
72
75
  for diagnostic in diagnostics.values():
73
76
  diagnostic.pop("additional_datasets")
74
- recipe_variables = dataframe_to_recipe(input_files)
77
+ recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6])
75
78
  datasets = recipe_variables["tas"]["additional_datasets"]
76
79
  datasets = [ds for ds in datasets if ds["exp"] != "historical"]
77
80
  for dataset in datasets:
@@ -0,0 +1,68 @@
1
+ import pandas
2
+
3
+ from climate_ref_core.constraints import (
4
+ AddSupplementaryDataset,
5
+ RequireFacets,
6
+ RequireOverlappingTimerange,
7
+ )
8
+ from climate_ref_core.datasets import FacetFilter, SourceDatasetType
9
+ from climate_ref_core.diagnostics import DataRequirement
10
+ from climate_ref_esmvaltool.diagnostics.base import ESMValToolDiagnostic
11
+ from climate_ref_esmvaltool.recipe import dataframe_to_recipe
12
+ from climate_ref_esmvaltool.types import Recipe
13
+
14
+
15
+ class ClimateDriversForFire(ESMValToolDiagnostic):
16
+ """
17
+ Calculate diagnostics regarding climate drivers for fire.
18
+ """
19
+
20
+ name = "Climate drivers for fire"
21
+ slug = "climate-drivers-for-fire"
22
+ base_recipe = "ref/recipe_ref_fire.yml"
23
+
24
+ variables = (
25
+ "cVeg",
26
+ "hurs",
27
+ "pr",
28
+ "tas",
29
+ "tasmax",
30
+ "treeFrac",
31
+ "vegFrac",
32
+ )
33
+ data_requirements = (
34
+ DataRequirement(
35
+ source_type=SourceDatasetType.CMIP6,
36
+ filters=(
37
+ FacetFilter(
38
+ facets={
39
+ "variable_id": variables,
40
+ "frequency": "mon",
41
+ "experiment_id": "historical",
42
+ }
43
+ ),
44
+ ),
45
+ group_by=("source_id", "member_id", "grid_label"),
46
+ constraints=(
47
+ RequireFacets("variable_id", variables),
48
+ RequireOverlappingTimerange(group_by=("instance_id",)),
49
+ AddSupplementaryDataset.from_defaults("sftlf", SourceDatasetType.CMIP6),
50
+ ),
51
+ ),
52
+ )
53
+ facets = ()
54
+
55
+ @staticmethod
56
+ def update_recipe(
57
+ recipe: Recipe,
58
+ input_files: dict[SourceDatasetType, pandas.DataFrame],
59
+ ) -> None:
60
+ """Update the recipe."""
61
+ recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6])
62
+ dataset = recipe_variables["cVeg"]["additional_datasets"][0]
63
+ dataset.pop("mip")
64
+ dataset.pop("timerange")
65
+ dataset["start_year"] = 2013
66
+ dataset["end_year"] = 2014
67
+ recipe["datasets"] = [dataset]
68
+ recipe["diagnostics"]["fire_evaluation"]["scripts"]["fire_evaluation"]["remove_confire_files"] = True
@@ -53,9 +53,9 @@ class CloudRadiativeEffects(ESMValToolDiagnostic):
53
53
  )
54
54
 
55
55
  @staticmethod
56
- def update_recipe(recipe: Recipe, input_files: pandas.DataFrame) -> None:
56
+ def update_recipe(recipe: Recipe, input_files: dict[SourceDatasetType, pandas.DataFrame]) -> None:
57
57
  """Update the recipe."""
58
- recipe_variables = dataframe_to_recipe(input_files)
58
+ recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6])
59
59
  recipe_variables = {k: v for k, v in recipe_variables.items() if k != "areacella"}
60
60
 
61
61
  # Select a timerange covered by all datasets.
@@ -0,0 +1,188 @@
1
+ from functools import partial
2
+
3
+ import pandas
4
+
5
+ from climate_ref_core.constraints import (
6
+ AddSupplementaryDataset,
7
+ RequireContiguousTimerange,
8
+ RequireFacets,
9
+ RequireOverlappingTimerange,
10
+ )
11
+ from climate_ref_core.datasets import FacetFilter, SourceDatasetType
12
+ from climate_ref_core.diagnostics import DataRequirement
13
+ from climate_ref_esmvaltool.diagnostics.base import ESMValToolDiagnostic
14
+ from climate_ref_esmvaltool.recipe import dataframe_to_recipe
15
+ from climate_ref_esmvaltool.types import Recipe
16
+
17
+
18
+ def get_cmip6_data_requirements(variables: tuple[str, ...]) -> tuple[DataRequirement, ...]:
19
+ """Create a data requirement for CMIP6 data."""
20
+ return (
21
+ DataRequirement(
22
+ source_type=SourceDatasetType.CMIP6,
23
+ filters=(
24
+ FacetFilter(
25
+ facets={
26
+ "variable_id": variables,
27
+ "experiment_id": "historical",
28
+ },
29
+ ),
30
+ ),
31
+ group_by=("source_id", "experiment_id", "member_id", "frequency", "grid_label"),
32
+ constraints=(
33
+ RequireFacets("variable_id", variables),
34
+ RequireContiguousTimerange(group_by=("instance_id",)),
35
+ RequireOverlappingTimerange(group_by=("instance_id",)),
36
+ # TODO: Add a RequireTimeRange constraint to match reference datasets?
37
+ AddSupplementaryDataset.from_defaults("areacella", SourceDatasetType.CMIP6),
38
+ ),
39
+ ),
40
+ )
41
+
42
+
43
+ def update_recipe(
44
+ recipe: Recipe,
45
+ input_files: dict[SourceDatasetType, pandas.DataFrame],
46
+ var_x: str,
47
+ var_y: str,
48
+ ) -> None:
49
+ """Update the recipe."""
50
+ recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.CMIP6], equalize_timerange=True)
51
+ diagnostics = recipe["diagnostics"]
52
+ diagnostic_name = f"plot_joint_{var_x}_{var_y}_model"
53
+ diagnostic = diagnostics.pop(diagnostic_name)
54
+ diagnostics.clear()
55
+ diagnostics[diagnostic_name] = diagnostic
56
+ datasets = next(iter(recipe_variables.values()))["additional_datasets"]
57
+ diagnostic["additional_datasets"] = datasets
58
+ suptitle = "CMIP6 {dataset} {ensemble} {grid} {timerange}".format(**datasets[0])
59
+ diagnostic["scripts"]["plot"]["suptitle"] = suptitle
60
+ diagnostic["scripts"]["plot"]["plot_filename"] = (
61
+ f"jointplot_{var_x}_{var_y}_{suptitle.replace(' ', '_').replace('/', '-')}"
62
+ )
63
+
64
+
65
+ class CloudScatterplotCltSwcre(ESMValToolDiagnostic):
66
+ """
67
+ Scatterplot of clt vs swcre.
68
+ """
69
+
70
+ name = "Scatterplots of two cloud-relevant variables (clt vs swcre)"
71
+ slug = "cloud-scatterplots-clt-swcre"
72
+ base_recipe = "ref/recipe_ref_scatterplot.yml"
73
+ facets = ()
74
+ data_requirements = get_cmip6_data_requirements(("clt", "rsut", "rsutcs"))
75
+ update_recipe = partial(update_recipe, var_x="clt", var_y="swcre")
76
+
77
+
78
+ class CloudScatterplotClwviPr(ESMValToolDiagnostic):
79
+ """
80
+ Scatterplot of clwvi vs pr.
81
+ """
82
+
83
+ name = "Scatterplots of two cloud-relevant variables (clwvi vs pr)"
84
+ slug = "cloud-scatterplots-clwvi-pr"
85
+ base_recipe = "ref/recipe_ref_scatterplot.yml"
86
+ facets = ()
87
+ data_requirements = get_cmip6_data_requirements(("clwvi", "pr"))
88
+ update_recipe = partial(update_recipe, var_x="clwvi", var_y="pr")
89
+
90
+
91
+ class CloudScatterplotCliviLwcre(ESMValToolDiagnostic):
92
+ """
93
+ Scatterplot of clivi vs lwcre.
94
+ """
95
+
96
+ name = "Scatterplots of two cloud-relevant variables (clivi vs lwcre)"
97
+ slug = "cloud-scatterplots-clivi-lwcre"
98
+ base_recipe = "ref/recipe_ref_scatterplot.yml"
99
+ facets = ()
100
+ data_requirements = get_cmip6_data_requirements(("clivi", "rlut", "rlutcs"))
101
+ update_recipe = partial(update_recipe, var_x="clivi", var_y="lwcre")
102
+
103
+
104
+ class CloudScatterplotCliTa(ESMValToolDiagnostic):
105
+ """
106
+ Scatterplot of cli vs ta.
107
+ """
108
+
109
+ name = "Scatterplots of two cloud-relevant variables (cli vs ta)"
110
+ slug = "cloud-scatterplots-cli-ta"
111
+ base_recipe = "ref/recipe_ref_scatterplot.yml"
112
+ facets = ()
113
+ data_requirements = get_cmip6_data_requirements(("cli", "ta"))
114
+ update_recipe = partial(update_recipe, var_x="cli", var_y="ta")
115
+
116
+
117
+ class CloudScatterplotsReference(ESMValToolDiagnostic):
118
+ """
119
+ Reference scatterplots of two cloud-relevant variables.
120
+ """
121
+
122
+ name = "Reference scatterplots of two cloud-relevant variables"
123
+ slug = "cloud-scatterplots-reference"
124
+ base_recipe = "ref/recipe_ref_scatterplot.yml"
125
+ facets = ()
126
+ data_requirements = (
127
+ DataRequirement(
128
+ source_type=SourceDatasetType.obs4MIPs,
129
+ filters=(
130
+ FacetFilter(
131
+ facets={
132
+ "source_id": ("ERA-5",),
133
+ "variable_id": ("ta",),
134
+ },
135
+ ),
136
+ ),
137
+ group_by=("instance_id",),
138
+ constraints=(RequireContiguousTimerange(group_by=("instance_id",)),),
139
+ # TODO: Add obs4MIPs datasets once available and working:
140
+ #
141
+ # obs4MIPs datasets with issues:
142
+ # - GPCP-V2.3: pr
143
+ # - CERES-EBAF-4-2: rlut, rlutcs, rsut, rsutcs
144
+ #
145
+ # Unsure if available on obs4MIPs:
146
+ # - AVHRR-AMPM-fv3.0: clivi, clwvi
147
+ # - ESACCI-CLOUD: clt
148
+ # - CALIPSO-ICECLOUD: cli
149
+ #
150
+ # Related issues:
151
+ # - https://github.com/Climate-REF/climate-ref/issues/260
152
+ # - https://github.com/esMValGroup/esMValCore/issues/2712
153
+ # - https://github.com/esMValGroup/esMValCore/issues/2711
154
+ # - https://github.com/sciTools/iris/issues/6411
155
+ ),
156
+ )
157
+
158
+ @staticmethod
159
+ def update_recipe(
160
+ recipe: Recipe,
161
+ input_files: dict[SourceDatasetType, pandas.DataFrame],
162
+ ) -> None:
163
+ """Update the recipe."""
164
+ recipe_variables = dataframe_to_recipe(input_files[SourceDatasetType.obs4MIPs])
165
+ recipe["diagnostics"] = {k: v for k, v in recipe["diagnostics"].items() if k.endswith("_ref")}
166
+
167
+ era5_dataset = recipe_variables["ta"]["additional_datasets"][0]
168
+ era5_dataset["timerange"] = "2007/2015" # Use the same timerange as for the other variable.
169
+ era5_dataset["alias"] = era5_dataset["dataset"]
170
+ diagnostic = recipe["diagnostics"]["plot_joint_cli_ta_ref"]
171
+ diagnostic["variables"]["ta"]["additional_datasets"] = [era5_dataset]
172
+ suptitle = "CALIPSO-ICECLOUD / {dataset} {timerange}".format(**era5_dataset)
173
+ diagnostic["scripts"]["plot"]["suptitle"] = suptitle
174
+ diagnostic["scripts"]["plot"]["plot_filename"] = (
175
+ f"jointplot_cli_ta_{suptitle.replace(' ', '_').replace('/', '-')}"
176
+ )
177
+
178
+ # Use the correct obs4MIPs dataset name for dataset that cannot be ingested
179
+ # https://github.com/Climate-REF/climate-ref/issues/260.
180
+ diagnostic = recipe["diagnostics"]["plot_joint_clwvi_pr_ref"]
181
+ diagnostic["variables"]["pr"]["additional_datasets"] = [
182
+ {
183
+ "dataset": "GPCP-V2.3",
184
+ "project": "obs4MIPs",
185
+ "alias": "GPCP-SG",
186
+ "timerange": "1992/2016",
187
+ }
188
+ ]