Skip to content

Create FastNetUK utils script - #2370

Open
James Warner (jwarner8) wants to merge 26 commits into
mainfrom
util_fastnetuk
Open

Create FastNetUK utils script#2370
James Warner (jwarner8) wants to merge 26 commits into
mainfrom
util_fastnetuk

Conversation

@jwarner8

@jwarner8 James Warner (jwarner8) commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

This will also make the code transportable for inclusion as a postprocessing task in the FastNetUK inference.

This is largely a rehash of #2106 but retaining that branch as is given it is being used for FastNetUK evaluation.

Note we are not regridding the data in this util, just reshaping to the UKV grid.

Microsoft CoPilot was used to help generate the tests and documentation.

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.
  • Attributed any Generative AI, such as GitHub Copilot, used in this PR.
  • Marked the PR as ready to review.

@jwarner8 James Warner (jwarner8) added the enhancement New feature or request label Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor
Total coverage: 93% (HTML report)
Name                                                              Stmts   Miss Branch BrPart  Cover
---------------------------------------------------------------------------------------------------
src/CSET/__init__.py                                                105      0     14      0   100%
src/CSET/_common.py                                                 156      0     54      0   100%
src/CSET/cset_workflow/app/fetch_fcst/bin/fetch_data.py             117     28     26      0    78%
src/CSET/cset_workflow/app/fetch_nimrod/bin/fetch_nimrod.py          81      8     28     11    83%
src/CSET/cset_workflow/app/finish_website/bin/finish_website.py      79      2      8      2    95%
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                                        103      1     26      1    98%
src/CSET/graph.py                                                    44      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                                    249      3     72      4    98%
src/CSET/operators/_stash_to_lfric.py                                 3      0      0      0   100%
src/CSET/operators/_utils.py                                        190      8     72      6    95%
src/CSET/operators/ageofair.py                                      142      7     64      5    94%
src/CSET/operators/aggregate.py                                      77      1     22      1    98%
src/CSET/operators/aviation.py                                       61      0     18      0   100%
src/CSET/operators/collapse.py                                      155      8     72      3    93%
src/CSET/operators/constraints.py                                   113      7     50      3    93%
src/CSET/operators/convection.py                                     38      4     10      2    88%
src/CSET/operators/ensembles.py                                      27      0     14      0   100%
src/CSET/operators/feature.py                                        44      0     10      0   100%
src/CSET/operators/filters.py                                        67      2     30      0    98%
src/CSET/operators/fluxes.py                                         41      0     10      0   100%
src/CSET/operators/humidity.py                                      135      0     52      0   100%
src/CSET/operators/imageprocessing.py                                57      0     16      0   100%
src/CSET/operators/mesoscale.py                                      18      0      2      0   100%
src/CSET/operators/misc.py                                          172      1     72      3    98%
src/CSET/operators/plot.py                                         1120    157    412     71    83%
src/CSET/operators/power_spectrum.py                                 98      3     30      3    95%
src/CSET/operators/precipitation.py                                 204      2     92      2    99%
src/CSET/operators/pressure.py                                       41      0     12      0   100%
src/CSET/operators/read.py                                          432     21    184     16    94%
src/CSET/operators/regrid.py                                        147      1     70      3    98%
src/CSET/operators/scoreswrappers.py                                208     16     58      6    91%
src/CSET/operators/temperature.py                                   121      0     32      0   100%
src/CSET/operators/transect.py                                       63      0     24      0   100%
src/CSET/operators/wind.py                                           46      3     10      2    91%
src/CSET/operators/write.py                                          15      0      6      0   100%
src/CSET/recipes/__init__.py                                        104      0     28      0   100%
src/CSET/sample_data/__init__.py                                      0      0      0      0   100%
---------------------------------------------------------------------------------------------------
TOTAL                                                              5042    283   1758    144    93%

@jwarner8

Copy link
Copy Markdown
Contributor Author

Produces well formatted iris cubes

image

@jwarner8

James Warner (jwarner8) commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

Additional requirements;

  • Regrid to the specific UKV grid, which is the target of the inference. To be supplied this grid (might only require a reshape).

@jwarner8

Copy link
Copy Markdown
Contributor Author
image Data fixing working nicely now for CSET ingestion...

@jwarner8
James Warner (jwarner8) marked this pull request as ready for review August 14, 2026 09:57
----------
cube : iris.cube.Cube
Original unstructured source cube, used for fixing metadata.
grid:::

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Should there be a description of grid here?

Comment thread utils/proc_fastnetuk/proc_fastnetuk.py Outdated
units="hours",
)

# Start with coordinates of just forecast_period.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is the description/comment correct here?

Comment thread utils/proc_fastnetuk/proc_fastnetuk.py Outdated
Comment thread utils/proc_fastnetuk/proc_fastnetuk.py Outdated
Comment thread utils/proc_fastnetuk/proc_fastnetuk.py Outdated

out_cube.attributes = cube.attributes.copy()

# Delete fill value attribute, as this tends to be np.float64(nan), which causes iris merge/concat issues.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This assumes fill_value always exists. Could make the code safer in case it is removed in the future?

Comment thread utils/proc_fastnetuk/proc_fastnetuk.py Outdated
out_cube.attributes = cube.attributes.copy()

# Delete fill value attribute, as this tends to be np.float64(nan), which causes iris merge/concat issues.
del out_cube.attributes["fill_value"]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
del out_cube.attributes["fill_value"]
if "fill_value" in out_cube.attributes:
del out_cube.attributes["fill_value"]

Comment thread utils/proc_fastnetuk/proc_fastnetuk.py Outdated
Comment thread utils/proc_fastnetuk/proc_fastnetuk.py Outdated
# Delete fill value attribute, as this tends to be np.float64(nan), which causes iris merge/concat issues.
del out_cube.attributes["fill_value"]

# Some unit corrections for specific variables.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think the geopotential_height_at_pressure levels is not just a unit correction is it?

Run processing on FastNetUK data.

Process produces CSET-ready netCDF files for loading.
"""

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
"""
"""
# Define and parse input and output path arguments.

cubes = iris.load(file)

fixed_cubes = iris.cube.CubeList()
# For each cube, where ndim > 1 (excluding latitude/longitude array), do regridding

@cehalliwell Carol Halliwell (cehalliwell) Aug 18, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

How are latitude and longitude excluded? If they are not explicitly excluded, won't cube.ndim always be >1?

dim_coords_and_dims=[(time_coord, 0)],
)

cube.rename(name)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Is this line necessary? The previous command sets long_name=name.

@cehalliwell

Copy link
Copy Markdown
Contributor

This all looks good and the README file is very informative. There are a few comments and (small) suggested code changes. The files in utils are not covered by the coverage report so not totally clear that every part of the code is covered by a test (although tests look sensible). Happy for it to be merged into main after suggestions/comments addressed.

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

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants