Releases: MetOffice/CSET
v26.2.0 (2026-02-23)
Contained within the first release of 2026 are a number of quality of life tweaks, including improvements to ensemble data reading, new land and sea mask recipes, better plotting of rotated pole domains, improvements to the reliability of the web interface, and improvements to the logging of the workflow so the logs are not split between job.err and job.out, aiding debugging.
There are many more fixes and improvements. Please visit metoffice.github.io/CSET/changelog for the full details.
v25.12.1 (2025-12-10)
A small patch release fixing a couple of critical issues and adding support for python 3.14.
Please visit metoffice.github.io/CSET/changelog for the full details.
Tip
Useful links: PyPI package | conda-forge package | Documentation
Full Changelog: v25.12.0...v25.12.1
v25.12.0 (2025-12-04)
The end of the year brings many things, including a name change to CSET. While the acronym remains the same, its meaning has been updated. CSET is now the Community Seamless Evaluation Toolkit. This new name reflects a widened scope and ambition for CSET. Please see the updated documentation for further details on CSET’s scope.
Over the last four months there have been over 670 commits made to CSET, including from six new contributors. This release brings a host of improvements, including:
- New vector plot type, for showing the direction of a field such as wind on top of its magnitude.
- Many new recipes, including a selection of impact focused diagnostics highlighting impactful weather conditions for specific customers.
- Added the ability to load and plot observations. This is currently only setup for the Met Office-specific MetDB, but other observation sources will be added in future releases.
- An optimised CSET workflow now runs multiple recipes inside the same job. This avoids the overhead of scheduling many small jobs on cluster systems, and greatly reduces the total runtime of CSET.
- The jinja include files for adding recipes into the workflow have been replaced with python loaders, which are more readable, flexible, and performant. Loaders template values into generic recipes, looping over models, variables, fields, and the method of plotting to produce the recipes that are baked in the workflow. You can find out more about implementation details like this in the new CSET architecture documentation.
There are many more fixes and improvements. Please visit metoffice.github.io/CSET/changelog for the full details.
PyPI package | conda-forge package | Documentation
Full Changelog: v25.7.0...v25.12.0
v25.7.0 (2025-07-17)
Over the last two months development of CSET has been steaming ahead. In this release we bring something for everyone.
Figures have been improves so they are better layouts, colours and titles, and use consistent units.
The output webpage now includes extra information so you can tell the provenance of the output you are looking at, and easily copy to settings into your own workflow.
There is new functionality for trimming the domain boundaries (useful for
removing regions where unphysical data exists), and new recipes for calculating summary statistics within a case, such as mean, min/max, or standard deviation.
There have been a number of fixes to how common time points are selected; this has fixed a nasty issue with the diurnal cycle being offset by an hour under certain circumstances. Wind directions are now normalised to true North/East, to allow comparison between models with different conventions.
The workflow has been streamlined, and is now faster due to using an external conda environment, and has an improved tutorial, so it is easier than ever to learn how to use it. The workflow is also easier to install; rather than having to download a separate tarball, it comes included with the cset command line.
Developers are not forgotten either, with the development environment now being setup with a single make command, and the workflow code having moved into the main CSET package for easier testing and distribution.
PyPI package | conda-forge package | Documentation
What's Changed
- Tidy up titles in CSET output by James Warner (@jwarner8) in #1395
- General improvements to plots by James Warner (@jwarner8) in #1394
- Ensure all lead time in common units (hours) between models by ukmo-huw-lewis in #1405
- Add non-aggregated cell_methods constraint to all histogram plotting recipes for surface and level variables by ukmo-huw-lewis in #1406
- Clean up task family inheritance in include files by James Frost (@jfrost-mo) in #1408
- Add copy of local rose-suite.conf into output pages by ukmo-huw-lewis in #1400
- Set 20 minute runtime limit for GitHub Actions jobs by James Frost (@jfrost-mo) in #1420
- Add subarea configuration to example rose-suite.conf by James Frost (@jfrost-mo) in #1409
- Minor fixes and additional tests for run_cset_recipe by James Frost (@jfrost-mo) in #1422
- Allow other python version's tests to finish running after a failure by James Frost (@jfrost-mo) in #1424
- Simplify and test conversion from --input-dir to --INPUT_PATHS by James Frost (@jfrost-mo) in #1425
- Review and reduce plot title wordcount by ukmo-huw-lewis in #1416
- More robustly test command line argument parser by James Frost (@jfrost-mo) in #1426
- Correct version number in changelog by James Frost (@jfrost-mo) in #1407
- Ensure common time points are selected before aggregating over hour of day by James Warner (@jwarner8) in #1290
- Remove environment section from bug report issue template by James Frost (@jfrost-mo) in #1421
- Provide value for placeholder in log message by James Frost (@jfrost-mo) in #1444
- Use correct recipe file for surface histogram case aggregation by James Frost (@jfrost-mo) in #1443
- Exclude additional VCS files from sdist manifest to prevent them being included in published packages by James Frost (@jfrost-mo) in #1412
- Add Makefile providing useful commands by James Frost (@jfrost-mo) in #1428
- Distribute workflow files inside main CSET package and add new
extract-workflowcommand to unpack it for use by James Frost (@jfrost-mo) in #1413 - Add CSET version and date of workflow run to CSET webpage by ukmo-huw-lewis in #1446
- Add model names to spatial_difference recipes by ukmo-huw-lewis in #1439
- Create link to conda environment for workflow in
make setupby James Frost (@jfrost-mo) in #1453 - Align time units and fix diurnal cycle aggregation bug by ukmo-huw-lewis in #1450
- Add checks for non-hour inputs against both minute and second time parts by ukmo-huw-lewis in #1432
- More flexible treatment of latitude/longitude and grid_latitude/grid_longitude across different model domain types by ukmo-huw-lewis in #1403
- Add SELECT_SUBAREA method to trim cutout based on number of grid cells and add related tests by ukmo-huw-lewis in #1433
- Filter down to required variables during workflow preprocessing to minimise data size by ukmo-huw-lewis in #1411
- Fixes pressure model transect recipe by David Flack (@daflack) in #1467
- Update copyright year in README.md by James Frost (@Fraetor) in #1463
- Add new functionality to better control plot extents and colorbar definitions by ukmo-huw-lewis in #1429
- Rename rose-suite.conf.txt to rose-suite.conf by James Frost (@jfrost-mo) in #1462
- Move
make setupdocumentation to make it more prominent by James Frost (@jfrost-mo) in #1461 - Remove conda-environment link from development workflow to fix failing tests by James Frost (@jfrost-mo) in #1460
- Skip posting code coverage report on PRs made from forks by James Frost (@jfrost-mo) in #1468
- Include discrete colourbar for spatial visibility_in_air plots by Sylvia Bohnenstengel (@Sylviabohnenstengel) in #1471
- Visibility follow up by James Frost (@jfrost-mo) in #1476
- Use temporary working directory for plotting tests by James Frost (@jfrost-mo) in #1475
- Update cell_methods constraint to process time aggregated input cubes by ukmo-huw-lewis in #1472
- Add workaround for flaky preprocess tests by James Frost (@jfrost-mo) in #1477
- Remove dead links from documentation by James Frost (@jfrost-mo) in #1485
- Add extra cloud diagnostics to RAL3LFRic example config, and apply cloud diagnostic fixes by ukmo-huw-lewis in #1478
- Add support for rainfall amount diagnostics by ukmo-huw-lewis in #1480
- Add summary statistic (mean, max, min,...) plots and introduce additional aggregation options by ukmo-huw-lewis in #1377
- Simplify internal package structure to make workflow more easily findable by James Frost (@jfrost-mo) in #1474
- Move workflow utils into rose apps by James Frost (@jfrost-mo) in #1489
- Clarify adding a recipe to the CSET workflow by James Frost (@jfrost-mo) in #1487
- Update title for domain mean timeseries aggregation of all cases to remove model names from title by ukmo-huw-lewis in #1491
- Increases memory for ensemble plotting by David Flack (@daflack) in #1506
- Draft documentation update for revised cset-workflow GUI and plot settings by ukmo-huw-lewis in #1492
- Update ceilometer_cloud_amount_maxrnd by James Frost (@jfrost-mo) in #1499
- Allow ensembles to run for more than ten variables by David Flack (@daflack) in #1507
- Update the pre-commit hook ID for ruff-check by James Frost (@jfrost-mo) in #1488
- Rotate UM winds to true east and true north to match LFRic by John Edwards (@JMEdwardsXtr) in #1469
- Update and improve the workflow tutorial by James Frost (@jfrost-mo) in #1512
- Remove preprocess task by James Frost (@jfrost-mo) in #1514
- Simplify release instructions to reflect the workflow being bundled into the CSET package by James Frost (@jfrost-mo) in #1515
- Add CSET v25.7.0 release notes to changelog by James Frost (@jfrost-mo) in #1516
- Correct description for standard deviation time aggregation method in rose edit by Sylvia Bohnenstengel (@Sylviabohnenstengel) in #1513
New Contributors
- John Edwards (@JMEdwardsXtr) made their first contribution in #1469
- James Frost (@Fraetor) is an alternate account of James Frost (@jfrost-mo)
Full Changelog: v25.5.2...v25.7.0
v25.5.2 (2025-05-23)
A bugfix release to fix all recipes failing when run by the workflow due to undefined SUBAREA_TYPE and SUBAREA_EXTENT recipe variables.
PyPI package | conda-forge package | workflow tarball
What's Changed
- Update pyproject.toml metadata by James Frost (@jfrost-mo) in #1383
- Various minor GitHub Actions improvements by James Frost (@jfrost-mo) in #1387
- Add subarea variables to include files by James Frost (@jfrost-mo) in #1389
- Add CSET v25.5.2 release notes to changelog by James Frost (@jfrost-mo) in #1390
Full Changelog: v25.5.1...v25.5.2
v25.5.1 (2025-05-22)
A smaller release with some big features. We now have the capability to select a sub-area of a domain for analysis. This is useful both for looking at small parts of a large (perhaps global) domain, as well as for trimming off boundaries that may contain numerical artifacts.
We also follow up on the last release by bringing multiple model support to time series and vertical profile plots.
PyPI package | conda-forge package | workflow tarball
What's Changed
- Correct model level sort key in rose edit by James Frost (@jfrost-mo) in #1364
- Rationalise number of include and recipe files by introducing LEVELTYPE generic option to simplify dev and user experience by ukmo-huw-lewis in #1328
- Support multiple models on single plot for timeseries by refszkentla in #1365
- Support equalising hour coordinate in difference operator by James Frost (@jfrost-mo) in #1260
- Pair cube with corresponding coordinate when plotting line series by James Frost (@jfrost-mo) in #1366
- Bump minimum iris version to avoid dask issues by James Frost (@jfrost-mo) in #1369
- Fix formatting of cset bake example documentation by James Frost (@jfrost-mo) in #1379
- Improve testing of get_cube_coordindex by James Frost (@jfrost-mo) in #1374
- Reimplement sub-area functionality universally by James Warner (@jwarner8) in #1259
- Multiple model lines on vertical profiles by refszkentla in #1368
- Document how to switch git repository from HTTPS to SSH by Sylvia Bohnenstengel (@Sylviabohnenstengel) in #1380
- Add CSET v25.5.1 release notes to changelog by James Frost (@jfrost-mo) in #1382
Full Changelog: v25.5.0...v25.5.1
v25.5.0 (2025-05-02) Multi-model histograms and more!
Amongst the many changes in this release we now have the capability to plot multiple models on the same plot, at least for histogram plots. This should be a significant aid to those comparing multiple models with CSET. We also have significantly improved documentation (though it has been online for a while), improved colour bars, various performance improvements, simplification of workflow configuration GUI, and various bug fixes.
PyPI package | conda-forge package | workflow tarball
What's Changed
- Update workflow CSET package by James Frost (@jfrost-mo) in #1291
- Ignore codespell error for "runN" by James Frost (@jfrost-mo) in #1292
- Update output image in full cylc example tutorial by James Frost (@jfrost-mo) in #1293
- Add fully worked example with CYLC to documentation by James Warner (@jwarner8) in #1213
- include precipitation specific colorbar and unit conversion by Sylvia Bohnenstengel (@Sylviabohnenstengel) in #1268
- Improve colorbar formatting to reduce whitespace by ukmo-huw-lewis in #1296
- Nicer output on crash from run_cset_recipe by James Frost (@jfrost-mo) in #1262
- Normalise all LFRic coord names by James Frost (@jfrost-mo) in #1299
- Add option to skip writing output by James Frost (@jfrost-mo) in #1277
- Updated default colorbar definition for radiation by ukmo-huw-lewis in #1305
- Conditionally fix times in callbacks to avoid corrupting dates by double fixing by James Frost (@jfrost-mo) in #1297
- Avoid writing meta.json outside tempdir during test by James Frost (@jfrost-mo) in #1311
- Retry failed processing tasks by James Frost (@jfrost-mo) in #1313
- Add SKIP_WRITE to example configuration by James Frost (@jfrost-mo) in #1320
- Update cset-workflow GUI organisation with clearer labelling for "General setup", "Cycling and Models", diagnostic-type and evaluation-type specific option panels by ukmo-huw-lewis in #1310
- Drop support for python 3.10 by James Frost (@jfrost-mo) in #1316
- Add last few changes into v25.3.1 changelog by James Frost (@jfrost-mo) in #1288
- Add preprocessing task to speed up workflow by James Frost (@jfrost-mo) in #1301
- Add model level support to CSET by James Warner (@jwarner8) in #1270
- Refactor lfric_time_callback by James Frost (@jfrost-mo) in #1321
- Simplify cset-workflow plot options and env variable names by ukmo-huw-lewis in #1319
- Move diagnostic archive creation into bake by James Frost (@jfrost-mo) in #1326
- Provide input paths via recipe variables and remove unneeded
cset recipe-idcommand by James Frost (@jfrost-mo) in #1329 - Update logic for reading SKIP_WRITE environment variable when running cset-workflow by ukmo-huw-lewis in #1339
- Correctly format print-based logging in run_cset_recipe.py by James Frost (@jfrost-mo) in #1341
- Fix implementation of grid latitude grid longitude callback for non rotated pole inputs by ukmo-huw-lewis in #1340
- Remove unnecessary array construction in radtime_prehour callback by James Frost (@jfrost-mo) in #1342
- Add category to transect recipe by James Frost (@jfrost-mo) in #1348
- Symbolic link to raw filesystem data to avoid slow copy by James Frost (@jfrost-mo) in #1352
- Add additional STASH to LFRic mappings by James Frost (@jfrost-mo) in #1354
- Plot all models on a single histogram plot by refszkentla in #1324
- Order LFRic before UM in RAL3-LFRic rose config by James Frost (@jfrost-mo) in #1349
- Add v25.5.0 release notes and document more of the release process by James Frost (@jfrost-mo) in #1357
New Contributors
- refszkentla made their first contribution in #1324
Full Changelog: v25.3.1...v25.5.0
v25.3.1 (2025-03-27) Bug fixes and minor improvements
A smaller release contains a number of bug fixes and other minor improvements ahead of a new feature release next month. The most noticeable change maybe be the plot colorbar now being horizontal to leave more space for titles and side-by-side comparisons.
PyPI package | conda-forge package | workflow tarball
What's Changed
- Remove unneeded deletion from housekeeping by James Frost (@jfrost-mo) in #1241
- Add conda HTTP error to common errors by James Frost (@jfrost-mo) in #1242
- Reduce PROCESS time limit to 15 minutes by James Frost (@jfrost-mo) in #1243
- Getting started documentation improvements by James Frost (@jfrost-mo) in #1218
- Check for staggered grid with name rather than STASH in difference operator by James Frost (@jfrost-mo) in #1248
- Fully sort website index by James Frost (@jfrost-mo) in #1249
- Increase aggregation wallclock to 3 hours by James Frost (@jfrost-mo) in #1250
- Skip running dummy tasks by James Frost (@jfrost-mo) in #1120
- Document adding a site-specific configuration by James Frost (@jfrost-mo) in #1251
- Bump the actions-dependencies group with 4 updates by Dependabot (@dependabot) in #1274
- Avoid calling
os.sync()by James Frost (@jfrost-mo) in #1276 - Avoid accessing non-captured output in MASS fetch script by James Frost (@jfrost-mo) in #1278
- Correct for instances where longitude plot bounds caused set_extent to by ukmo-huw-lewis in #1283
- 1-line change to move default position of map colorbars to horizontal by ukmo-huw-lewis in #1284
- Overwrite partially downloaded files from MASS by James Frost (@jfrost-mo) in #1281
- Add release notes for v25.3.1 by James Frost (@jfrost-mo) in #1286
Full Changelog: v25.3.0...v25.3.1
v25.3.0 (2025-03-06) The RAL3-LFRic release
This release is the baseline for evaluating RAL3_LFRic#708.1 with RMED Ticket #708 detailing the science configuration. It introduces a fixed evaluation functionality for RAL3-LFRic and RAL3-UM, new functionality, bug fixes, and improvements. Key features for RAL3-LFRic evaluation include:
- Surface fields: spatial plots, timeseries, histograms, model comparison plots, time aggregation by hour of day, validity time, forecast range, area averages.
- Pressure levels fields: spatial plots, timeseries, histograms, model comparison plots, time aggregation by hour of day, validity time, forecast range, area averages, vertical profiles, PDFs.
Additional capabilities: transects, point selection, QQ plots, age of air diagnostics, cape diagnostics that can be selected by the user.
The next release will add analysis on model levels, multi-line plotting, and more derived variables.
PyPI package | conda-forge package | workflow tarball
What's Changed
- Upload hidden coverage files to fix GitHub Actions breakage by James Frost (@jfrost-mo) in #832
- Pin GitHub Actions to specific commits to prevent random breakage by James Frost (@jfrost-mo) in #846
- Switch to data time cycling to support multiple models and multiple case studies or trials by James Frost (@jfrost-mo) in #765
- Note that all documentation shell examples use bash by James Frost (@jfrost-mo) in #861
- Add colorbar entries for more standard names by James Frost (@jfrost-mo) in #839
- Support python 3.13 and remove usage of tox in CI by James Frost (@jfrost-mo) in #872
- Correct execute_recipe docstring; it takes an input directory by James Frost (@jfrost-mo) in #869
- Fix colorbar min and max not being set on pcolormesh plots by James Frost (@jfrost-mo) in #870
- Error fetch_fcst task when no data found for a model, as it usually indicates a typo in the data path by James Frost (@jfrost-mo) in #842
- Rewrite colorbar loading to use default colorbar definition from inside CSET package by James Frost (@jfrost-mo) in #871
- Fix spelling of stratiform_rainfall_rate in colorbar definition by James Frost (@jfrost-mo) in #878
- Improve transect title by James Warner (@jwarner8) in #829
- Update colorbar definitions by David Flack (@daflack) in #892
- Fix typo in comment by James Frost (@jfrost-mo) in #906
- Sort conda lock files to aid reviewing by James Frost (@jfrost-mo) in #890
- Explicitly use conda-forge conda channel for updating conda and resolving lock files by James Frost (@jfrost-mo) in #886
- Exclude
__main__.pyfrom test coverage measurement by James Frost (@jfrost-mo) in #880 - Remove HTTP status check as urlopen already does it by James Frost (@jfrost-mo) in #882
- Test templating variables into recipe parser by James Frost (@jfrost-mo) in #881
- Test recipe listing and detailing functions by James Frost (@jfrost-mo) in #883
- Fix type signature by James Warner (@jwarner8) in #931
- Changes to fix longitude convention to be in the range -180 degrees to 180 degrees where possible by Jon Shonk (@JKPShonk) in #896
- Disable strict checking that TLS certificates are well formed by James Frost (@jfrost-mo) in #904
- Change CSET introduction on documentation welcome page by Sylvia Bohnenstengel (@Sylviabohnenstengel) in #899
- Harmonise variable names from UM Stash to LFRic variable and long_name by ukmo-huw-lewis in #898
- Add date to cset plot menu items by Sana Mahmood (@mo-sanamahmood) in #934
- Wrap plot title and increase figure size by Sylvia Bohnenstengel (@Sylviabohnenstengel) in #935
- Fix supported arg type in regrid operator by James Warner (@jwarner8) in #948
- Use non-interactive backend for plotting by James Frost (@jfrost-mo) in #951
- Update to WEB_ADDR documentation. by David Flack (@daflack) in #955
- Add iris-grib library support by James Warner (@jwarner8) in #960
- Revert "Add iris-grib to dev dependencies" by James Frost (@jfrost-mo) in #974
- Import CSET.recipes as recipes during testing for readability by James Frost (@jfrost-mo) in #968
- Add nicer error messages for unhandled exceptions by James Frost (@jfrost-mo) in #884
- Target lockfile update PR to source branch by James Frost (@jfrost-mo) in #963
- Convert CLI interface tests to not use
subprocess.runby James Frost (@jfrost-mo) in #970 - Use regular install for CI tests by James Frost (@jfrost-mo) in #463
- Add age of air diagnostic functionality by James Warner (@jwarner8) in #480
- Add mask operators by David Flack (@daflack) in #967
- Documentation update for mask operator by David Flack (@daflack) in #990
- Adds spatial perturbation operator by David Flack (@daflack) in #979
- New callbacks to standardise some dim names by James Warner (@jwarner8) in #983
- Fix location of AOA docs by James Warner (@jwarner8) in #1001
- Fix no title in surface histogram plots by James Warner (@jwarner8) in #1006
- Updates generate_levels_constraint documentation for ensemble functionality by David Flack (@daflack) in #1003
- Log cubes that don't merge in
load_cubeoperator by James Frost (@jfrost-mo) in #1022 - Remove unneeded
nameglobal attribute by James Frost (@jfrost-mo) in #1024 - Adds DKE functionality by David Flack (@daflack) in #1002
- Format JSON when writing by James Frost (@jfrost-mo) in #1041
- Limit domain statistics to 3 s.f. and move below plot by James Frost (@jfrost-mo) in #1040
- Require tasks to succeed in DEBUG mode by James Frost (@jfrost-mo) in #1039
- Generalise spatial plot log message by James Frost (@jfrost-mo) in #1042
- Separate words in callback function name with _ so it is easier to read by James Frost (@jfrost-mo) in #1043
- Handle sorting files outside the current directory in
sort_json.pyscript by James Frost (@jfrost-mo) in #1046 - Replace all remaining usage of typing.Union with
|by James Frost (@jfrost-mo) in #1047 - Fix typo in rose-edit help by James Frost (@jfrost-mo) in #1051
- Add configuration file for GitHub Issue templates by James Frost (@jfrost-mo) in #1035
- Merge lead time into initiation time cycling by James Frost (@jfrost-mo) in #1053
- Add utility function for equalising attributes by James Frost (@jfrost-mo) in #1052
- unify colourbar for relative_humidity between UM and LFRic. by Sylvia Bohnenstengel (@Sylviabohnenstengel) in #1038
- unify colourbar for cloud_base_altitude between um and lfric by Sylvia Bohnenstengel (@Sylviabohnenstengel) in #1059
- Reduce useless log messages by James Frost (@jfrost-mo) in #1045
- Adds collapse_by_hour_of_day operator by David Flack (@daflack) in #1034
- Sort colorbar JSON files via pre-commit hook by James Frost (@jfrost-mo) in #1060
- Handle CubeList in line plotting operator by Sylvia Bohnenstengel (@Sylviabohnenstengel) in #954
- Ensure multiple cases are put into a single cube by David Flack (@daflack) in #1050
- Data loading improvements, including loading multiple models by James Frost (@jfrost-mo) in #1054
- Improve rose edit and simplify include files by James Frost (@jfrost-mo) in #1055
- Collapse by validity time by David Flack (@daflack) in #1067
- Update collapse_by_hour for multiple cases by David Flack (@daflack) in #1068
- Accept microsecond precision in iris times by James Frost (@jfrost-mo) in #1074
- Parallelise CI tests by James Frost (@jfrost-mo) in #1071
- Use "spawn" start method for multiprocessing by James Frost (@jfrost-mo) in #1075
- Fix issue with rose-suite.conf variable by James Warner (@jwarner8) in #1082
- Remove unnecessary computation from age-of-air test by James Frost (@jfrost-mo) in #1081
- Share multiprocessing pool across ensemble members by James Frost (@jfrost-mo) in #1080
- Add data fetching script from MASS by James Frost (@jfrost-mo) in #1084
- Spatial difference plots by James Frost (@jfrost-mo) in #1061
- Make MASS fetch data script executable by James Frost (@jfrost-mo) in #1085
- ...
v25.2.0-pre3 (2025-02-18)
Third try, to see if I've got my release process down smoothly.
The half-hour wait for the conda-forge CDN to update is painful...