Skip to content

Add Scores diagnostics for spatial and timeseries RMSE, Additive Bias, MAE, and Pearson’s Correlation Coefficient#2232

Open
BernardClaxton (BernardClaxton) wants to merge 105 commits into
mainfrom
2214_adding_scores
Open

Add Scores diagnostics for spatial and timeseries RMSE, Additive Bias, MAE, and Pearson’s Correlation Coefficient#2232
BernardClaxton (BernardClaxton) wants to merge 105 commits into
mainfrom
2214_adding_scores

Conversation

@BernardClaxton

@BernardClaxton BernardClaxton (BernardClaxton) commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Contribution checklist

Aim to have all relevant checks ticked off before merging. See the developer's guide for more detail.

  • Documentation has been updated to reflect change.
  • New code has tests, and affected old tests have been updated.
  • All tests and CI checks pass.
  • Ensured the pull request title is descriptive.
  • Ensure rose-suite.conf.example has been updated if new diagnostic added.
  • Attributed any Generative AI, such as GitHub Copilot, used in this PR.
  • Marked the PR as ready to review.

@BernardClaxton BernardClaxton (BernardClaxton) linked an issue Jun 25, 2026 that may be closed by this pull request
@github-actions

github-actions Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor
Total coverage: 90% (HTML report)
Name                                                              Stmts   Miss Branch BrPart  Cover
---------------------------------------------------------------------------------------------------
src/CSET/__init__.py                                                 93      2     12      0    98%
src/CSET/_common.py                                                 149      0     52      0   100%
src/CSET/cset_workflow/app/fetch_fcst/bin/fetch_data.py             115     27     24      0    79%
src/CSET/cset_workflow/app/finish_website/bin/finish_website.py      70      0      4      0   100%
src/CSET/cset_workflow/app/parbake_recipes/bin/parbake.py            29      0      8      0   100%
src/CSET/cset_workflow/app/send_email/bin/send_email.py              25      0      4      0   100%
src/CSET/cset_workflow/lib/python/jinja_utils.py                     17      0      6      0   100%
src/CSET/extract_workflow.py                                         47      0     16      0   100%
src/CSET/graph.py                                                    43      0     14      0   100%
src/CSET/operators/__init__.py                                       89      0     26      0   100%
src/CSET/operators/_atmospheric_constants.py                          9      0      0      0   100%
src/CSET/operators/_colormaps.py                                    229      4     62      4    97%
src/CSET/operators/_stash_to_lfric.py                                 3      0      0      0   100%
src/CSET/operators/_utils.py                                        183      8     74      6    95%
src/CSET/operators/ageofair.py                                      141      7     64      5    94%
src/CSET/operators/aggregate.py                                      76      1     22      1    98%
src/CSET/operators/aviation.py                                       60      0     18      0   100%
src/CSET/operators/collapse.py                                      154     12     72      5    91%
src/CSET/operators/constraints.py                                   111      7     48      2    93%
src/CSET/operators/convection.py                                     37      4     10      2    87%
src/CSET/operators/ensembles.py                                      27      0     14      0   100%
src/CSET/operators/feature.py                                        41      0     10      0   100%
src/CSET/operators/filters.py                                        66      2     30      0    98%
src/CSET/operators/fluxes.py                                         41      0     10      0   100%
src/CSET/operators/humidity.py                                      139      0     56      0   100%
src/CSET/operators/imageprocessing.py                                56      0     16      0   100%
src/CSET/operators/mesoscale.py                                      17      0      2      0   100%
src/CSET/operators/misc.py                                          158      1     66      4    98%
src/CSET/operators/plot.py                                         1011    180    346     67    78%
src/CSET/operators/power_spectrum.py                                 97      3     30      3    95%
src/CSET/operators/precipitation.py                                 176     34     84      4    80%
src/CSET/operators/pressure.py                                       41      0     12      0   100%
src/CSET/operators/read.py                                          409     38    178     14    89%
src/CSET/operators/regrid.py                                        122     18     64      1    83%
src/CSET/operators/scoreswrappers.py                                135     22     34      8    79%
src/CSET/operators/temperature.py                                   121      0     32      0   100%
src/CSET/operators/transect.py                                       62      0     24      0   100%
src/CSET/operators/wind.py                                           45      3     10      2    91%
src/CSET/operators/write.py                                          15      0      6      0   100%
src/CSET/recipes/__init__.py                                        101      0     28      0   100%
---------------------------------------------------------------------------------------------------
TOTAL                                                              4560    373   1588    128    90%

@BernardClaxton

Copy link
Copy Markdown
Contributor Author

The test scripts test_scoreswrappers.py and test_verification.py were written with the aid of Copilot.

@BernardClaxton

Copy link
Copy Markdown
Contributor Author

Output from testing the scores utility can be found at https://wwwspice/~bernie.claxton/CSET_rmse8/?q=scores . The scores plots all have "Scores" in the title.

@jfrost-mo James Frost (jfrost-mo) changed the title 2214_adding_scores_pr Add Scores diagnostics for spatial and timeseries RMSE, additive_bias, MAE, and Pearson's Correlation Jun 26, 2026
@jfrost-mo James Frost (jfrost-mo) changed the title Add Scores diagnostics for spatial and timeseries RMSE, additive_bias, MAE, and Pearson's Correlation Add Scores diagnostics for spatial and timeseries RMSE, additive_bias, MAE, and Pearson’s Correlation Coefficient Jun 26, 2026
@Sylviabohnenstengel

Copy link
Copy Markdown
Member

BernardClaxton (@BernardClaxton) in scoreswrappers all scores will need to deal with the preserved_coordinates in the same way as in the rmse calculation as they are currently failing in my test case. This change is mostly a copy and paste.

…ores error metrics for spatial surface plots.
@Sylviabohnenstengel

Copy link
Copy Markdown
Member

BernardClaxton (@BernardClaxton) I have check out your branch and added the handling and conversion of iris dim coordinates to xarray dim coordinates as expected by scores to the surface scores plots.

Comment thread src/CSET/loaders/verification.py Outdated
for model, field, method, scores_method in itertools.product(
models[1:],
conf.SURFACE_FIELDS,
conf.SPATIAL_SURFACE_FIELD_METHOD,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

following discussion with BernardClaxton (@BernardClaxton) I suggest that we include the separate methods selection for verification in this PR and the inclusion of a list of variables that the verification uses will be a separate PR to avoid moving the goalposts.

Comment thread src/CSET/loaders/verification.py Outdated
Comment thread src/CSET/operators/scoreswrappers.py Outdated
Comment thread src/CSET/recipes/verification/surface_difference_scores_additive_bias.yaml Outdated
Comment thread src/CSET/recipes/verification/surface_difference_scores_RMSE.yaml
for all times. The PC is calculated based on that used in the
package [`scores`](https://scores.readthedocs.io/en/stable/api.html#scores.continuous.correlation.pearsonr).
This recipe allows the preservation of the time coordinate to produce a timeseries. Therefore, the PC is
collapsed over all other coordinates in the cube and calculated for every timestep.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

they should not be collapsed, but handled directly in scores utilising the preserved_coordinates.

@BernardClaxton

Copy link
Copy Markdown
Contributor Author

Added support in the scores loaders and recipes for SUBAREA_NAME.

@BernardClaxton

Copy link
Copy Markdown
Contributor Author

Added SPATIAL_SCORES_FIELD_METHOD into the spatial scores GUI. This replaces the previous reliance on SPATIAL_SURFACE_FIELD_METHOD found under the Diagnostics / Surface (2D) fields tab. Possible values for this list are SEQ, CASE, MAX, MIN. Selecting CASE will instruct CSET to compute the spatial scores metrics over the entire case study.

image

Co-authored-by: Sylvia Bohnenstengel <62748926+Sylviabohnenstengel@users.noreply.github.com>
Co-authored-by: Sylvia Bohnenstengel <62748926+Sylviabohnenstengel@users.noreply.github.com>
…ve_bias.yaml

Co-authored-by: Sylvia Bohnenstengel <62748926+Sylviabohnenstengel@users.noreply.github.com>
…ve_bias.yaml

Co-authored-by: Sylvia Bohnenstengel <62748926+Sylviabohnenstengel@users.noreply.github.com>
@BernardClaxton

Copy link
Copy Markdown
Contributor Author

Sample workflow output for branch 2214_adding_scores can be found at https://wwwspice/~bernie.claxton/CSET_scores20/?q=scores

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Adding more Scores diagnostics

5 participants