Add mask fill operator so that bad fill values are set to NaN - #2123
Add mask fill operator so that bad fill values are set to NaN#2123Simon Osborne (mo-sro) wants to merge 14 commits into
Conversation
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 196 18 80 4 88% src/CSET/operators/plot.py 929 169 318 59 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 47 6 12 3 85% 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 4428 363 1552 115 90% |
ukmo-huw-lewis
left a comment
There was a problem hiding this comment.
Self-nominated review on this one.
Please document and illustrate what issue this PR is addressing - would typically expect to see linked Issue with evidence of problem, and then evidence of 'problem fixed' in PR.
My default starting point is to propose that we handle fill-value masking within the read operator (e.g. automatic callbacks) rather than require a new operator to be called from recipes (noting maybe only being called for Cardington recipes in first instance?).
Unpacking use-case, with sample data will I hope help us consider best approach to enable the functionality you require.
Can offer more detailed review comment when we have bottomed out these aspects - e.g. how to ensure the hard-coded FillValues do not remove valid data. In general would anticipate FillValue to be identified attribute in file, and then require read operators to handle these appropriately.
Let's play with some real data to unpack use-case.
Updated the _mask_fill_cube and mask_fill_values functions to improve parameter handling and much needed documentation.
|
Despite the fact that iris can and does handle masked arrays, e.g. masks that use _FIllValue of 1e10 or 1e11 within the Cardington data netCDFs, these masks somehow get quietly dropped by the time plot.py is reached. No reference to masked arrays appears in plot.py. So when plotting UM vs Cardington data, where the latter contains fill values, these values are being plotted and so the plot axes either auto-correct to absurd limits, or the data doesn't appear if the axes limits are hard-wired to sensible values. Maybe this problem hasn't been encountered before, maybe it's been assumed that masked arrays would be handled across routines without issue. This isn't the case. In addition, putting a function of the kind in this PR in read.py is risky because if certain science calculations are carried out that generate "bad data" from 1e10 or 1e11 data, and masks are not maintained, then this data will never be filtered out before plotting. |
1c65eba to
a0656d5
Compare
…to np.nan
Contribution checklist
Aim to have all relevant checks ticked off before merging. See the developer's guide for more detail.
rose-suite.conf.examplehas been updated if new diagnostic added.