Support analysis/reanalysis comparisons - #2268
Conversation
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 1117 155 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 5039 281 1758 144 93% |
|
I now have a function in I.e. before after |
|
Challenges:
I could back out the path/cycle time, but that would not work if we are baking a recipe on the command line, so avoiding this. I am going to investigate fixing the reanalysis later at a point where I have access to the other models, so I can be a bit more clever with setting the |
|
Have a function now working for aggregation, creating two analyses cubes that match the reference time and forecast period of the forecast (if two cases are being aggregated) |
|
Current thinking. The purpose of this PR is to support the use of reanalysis/analysis as another model across CSET, for all functionality where applicable. I started off creating a new section in the GUI where a user would toggle reanalysis on/off, but I've started backing away from that idea. This is because of the extra overhead of duplicating a huge set of recipes to have recipes that include analysis as a comparison. The current solution I'm leaning towards is that the user simply treats reanalysis as another model. This would also allow us to use multiple reanalyses (UM analysis, alongside ERA5, for example). The main two pieces of work I can think of is
There are a couple of options here. I did look for a place to put this in read.py, once everything is read in, but not sure how this would work with load_model and generators (as it needs all model cubes in one place). OptionA: Embed it somewhere in read.py or similar to its accessible to all subsequent recipes/operators, whether its timeseries, power spectra, transects, profiles etc. Any opinions welcome. I am trying to reduce the additional duplication of having analysis as a separate section by including it as a model. |
Have not digested detail of commentary here, but for feedback (as both 'user' - what's simplest, and 'developer' - what's simplest, and what's possible) would strongly support the 'treat' analysis/reanalysis as model concept. It may be that some of the nuance of working with (re)analysis data need to be handled somewhere, but re-using existing structures and recipes etc will greatly reduce duplication as outlined above. Suggesting there are some parallels here with experience working with point observations (even including the plot order/style comment), where balance of some obs-specific processing needed, but once 'everything looks like a cube', then real power in no longer needing to track variety of output characteristics. Think the implied flexibility will be highly useful (and expected) for users. Happy to support / feedback where useful to you James on this one. |
|
Going to refactor this branch so we have standalone code in contrib that a user points at reanalysis, and write out intermediate output that is suitable for CSET ingestion. PR will also include some small changes to recognise if model name is 'ERA5' or 'UM Analysis' and plot these using a different line style/marker across plot.py. Broader progress in #2341 |
|
TODO:
|
|
Comments addressed, tests passed, and have re-run script with ERA5/UM analysis to check its still actually producing sensible output. Ready for final review James Frost (@jfrost-mo) |
James Frost (jfrost-mo)
left a comment
There was a problem hiding this comment.
Looks good. A couple optional helptext queries, but happy for you to resolve and merge once happy.
Co-authored-by: James Frost <james.frost@metoffice.gov.uk>
…nto 2016_support_reanalysis
Co-authored-by: James Frost <james.frost@metoffice.gov.uk>
…nto 2016_support_reanalysis
James Frost (jfrost-mo)
left a comment
There was a problem hiding this comment.
Looks good. The examples in the README should help people get the quoting right. The tests do need fixing before this can be merged; this looks like you just need to replace the integer hours in the tests with timedelta(hours=N).

Addresses #2016
Microsoft CoPilot was used to suggest some of the unit tests.
Contribution checklist
Aim to have all relevant checks ticked off before merging. See the developer's guide for more detail.