From ea68bececbf14fbf1ab0d7be99573c1c36265a59 Mon Sep 17 00:00:00 2001 From: Sandor Kertesz Date: Sun, 8 Dec 2024 22:26:46 +0000 Subject: [PATCH 1/2] Fix issue when cannot write GRIB based array field to disk --- docs/examples/grib_metadata_object.ipynb | 148 +++---------------- docs/release_notes/version_0.11_updates.rst | 11 +- src/earthkit/data/readers/grib/metadata.py | 4 + tests/array_fieldlist/test_numpy_fl_write.py | 58 ++++++++ tests/core/test_metadata.py | 1 + tests/data/O32_global.grib1 | Bin 0 -> 10800 bytes tests/data/O32_global.grib2 | Bin 0 -> 12000 bytes 7 files changed, 91 insertions(+), 131 deletions(-) create mode 100644 tests/data/O32_global.grib1 create mode 100644 tests/data/O32_global.grib2 diff --git a/docs/examples/grib_metadata_object.ipynb b/docs/examples/grib_metadata_object.ipynb index 1a6a9fc2..ab2e33d8 100644 --- a/docs/examples/grib_metadata_object.ipynb +++ b/docs/examples/grib_metadata_object.ipynb @@ -137,7 +137,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 3, @@ -250,7 +250,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -263,108 +263,6 @@ "md_copy" ] }, - { - "cell_type": "raw", - "id": "388d83a5-8165-4b3d-a121-2c7f2cb578e1", - "metadata": { - "editable": true, - "raw_mimetype": "text/restructuredtext", - "slideshow": { - "slide_type": "" - }, - "tags": [], - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "By default :py:meth:`~data.readers.grib.metadata.GribMetadata.override` is called with ``headers_only_clone=True`` generating the new handle with all the data values (and some related information) removed. With this the resulting object can be significantly smaller, especially if the data section is large. The downside is that now the value related keys either cannot be accessed or give back wrong values. E.g when using the \"average\" key we get:" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "id": "568fe5c9-df84-4d49-aee1-ada0e6a15c28", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(279.70703560965404, 47485.4296875)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "md[\"average\"], md_copy[\"average\"]" - ] - }, - { - "cell_type": "markdown", - "id": "8796976f-a02d-4101-8cff-c14a7730d82c", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "source": [ - "To get a copy without shrinking the GRIB handle use ``headers_only_clone=False``." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "ba989ad8-e034-4168-bc29-1d73877edad2", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "md_copy_full = md.override(headers_only_clone=False)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "id": "15d723c7-2f73-4c14-ab87-2a94de2379f8", - "metadata": { - "editable": true, - "slideshow": { - "slide_type": "" - }, - "tags": [] - }, - "outputs": [ - { - "data": { - "text/plain": [ - "279.70703560965404" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "md_copy_full[\"average\"]" - ] - }, { "cell_type": "markdown", "id": "3240cef2-baa9-4a87-a83a-dafa97b78e43", @@ -396,7 +294,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 6, "id": "40c6d232-03de-402b-82bf-8647e8a7bece", "metadata": { "editable": true, @@ -412,7 +310,7 @@ "('z', 850)" ] }, - "execution_count": 9, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -438,7 +336,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "id": "ef78a3ec-4ea2-4ff5-8c90-e60b5e07e77f", "metadata": { "editable": true, @@ -454,7 +352,7 @@ "('t', 1000)" ] }, - "execution_count": 10, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -507,7 +405,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 8, "id": "cb59ad5f-c48b-4943-984d-3abdf48fda8d", "metadata": { "editable": true, @@ -516,15 +414,7 @@ }, "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "array.shape[0]= 84 len(metadata)= 1\n" - ] - } - ], + "outputs": [], "source": [ "from earthkit.data import FieldList\n", "import numpy as np\n", @@ -537,7 +427,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 9, "id": "85c32bfb-c929-404f-add9-9adae40418d2", "metadata": { "editable": true, @@ -606,7 +496,7 @@ "0 an 0 regular_ll " ] }, - "execution_count": 12, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -630,12 +520,12 @@ } }, "source": [ - "Please note that the resulting :py:class:`~data.sources.array_list.ArrayFieldList` always contains a :py:class:`~data.readers.grib.metadata.RestrictedGribMetadata` object for each field. These objects possess their own GRIB handles, which is ensured by creating a copy with ``override(headers_only_clone=True)`` when needed. On top of that metadata access is limited to keys not related to data values. Getting metadata on any other keys will throw an exception. " + "Please note that the resulting :py:class:`~data.sources.array_list.ArrayFieldList` always contains a :py:class:`~data.readers.grib.metadata.RestrictedGribMetadata` object for each field. These objects possess their own GRIB handles, which is ensured by creating a copy with ``override()`` when needed. On top of that metadata access is limited to keys not related to data values. Getting metadata on any other keys will throw an exception. " ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 10, "id": "c6fe87ed-ee88-4f4d-a2b6-9401b364e2df", "metadata": { "editable": true, @@ -648,10 +538,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 13, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -662,7 +552,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 11, "id": "27686ac4-9382-4916-ad0e-be96a649d034", "metadata": { "editable": true, @@ -678,7 +568,7 @@ "'Wind speed'" ] }, - "execution_count": 14, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -689,7 +579,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 12, "id": "dc28fa77-4020-431f-ad37-e480a69f9d7f", "metadata": { "editable": true, @@ -730,7 +620,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 13, "id": "8eab3462-3661-4fc1-9d23-8be05dc99cd8", "metadata": { "editable": true, @@ -746,7 +636,7 @@ "7.450183054360252" ] }, - "execution_count": 16, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } diff --git a/docs/release_notes/version_0.11_updates.rst b/docs/release_notes/version_0.11_updates.rst index 99a6ce6f..962d568c 100644 --- a/docs/release_notes/version_0.11_updates.rst +++ b/docs/release_notes/version_0.11_updates.rst @@ -2,6 +2,15 @@ Version 0.11 Updates ///////////////////////// +Version 0.11.4 +=============== + +Fixes +++++++ + +- Enforced the use of ``headers_only_clone=False`` when calling :meth:`GribMetadata.override() `. It was a necessary step to fix issues when writing :py:class:`ArrayField`\ containing :class:`~data.readers.grib.metadata.grib.GribMetadata` to disk. This is considered a temporary change until the issues with ``headers_only_clone`` are sorted out. + + Version 0.11.3 =============== @@ -13,8 +22,6 @@ Fixes - Increased the minimum version of ``multiurl`` to 0.3.3 - - Version 0.11.2 =============== diff --git a/src/earthkit/data/readers/grib/metadata.py b/src/earthkit/data/readers/grib/metadata.py index f7e9ce3c..557259c8 100644 --- a/src/earthkit/data/readers/grib/metadata.py +++ b/src/earthkit/data/readers/grib/metadata.py @@ -379,6 +379,10 @@ def _copy_key(self, target_handle, key): def override(self, *args, headers_only_clone=True, **kwargs): d = dict(*args, **kwargs) + # using headers_only_clone=True can cause problems when we want to write GRIB + # to disk or modify the generated handle. Until it is fixed, we use headers_only_clone=False. + headers_only_clone = False + new_value_size = None # extra = None gridspec = d.pop("gridspec", None) diff --git a/tests/array_fieldlist/test_numpy_fl_write.py b/tests/array_fieldlist/test_numpy_fl_write.py index 7059579e..48d7c108 100644 --- a/tests/array_fieldlist/test_numpy_fl_write.py +++ b/tests/array_fieldlist/test_numpy_fl_write.py @@ -22,6 +22,7 @@ from earthkit.data.testing import ARRAY_BACKENDS from earthkit.data.testing import check_array_type from earthkit.data.testing import earthkit_examples_file +from earthkit.data.testing import earthkit_test_data_file from earthkit.data.testing import get_array_namespace here = os.path.dirname(__file__) @@ -225,6 +226,63 @@ def test_array_fl_grib_write_bits_per_value(array_backend, _kwargs, expected_val assert ds1.metadata("bitsPerValue") == [expected_value] * len(ds) +@pytest.mark.parametrize( + "filename,shape", + [ + (earthkit_examples_file("test.grib"), (11, 19)), + (earthkit_test_data_file("O32_global.grib1"), (5248,)), + (earthkit_test_data_file("O32_global.grib2"), (5248,)), + ], +) +def test_array_fl_grib_single_write_to_path(filename, shape): + ds = from_source("file", filename) + + assert len(ds) >= 1 + v1 = ds[0].values + 1 + + md = ds[0].metadata() + md1 = md.override(shortName="msl") + r = FieldList.from_array(v1, md1) + assert r[0].shape == shape + + with temp_file() as tmp: + r.save(tmp) + assert os.path.exists(tmp) + r_tmp = from_source("file", tmp) + # r_tmp = r_tmp.to_fieldlist(array_backend=array_backend) + assert r_tmp[0].shape == shape + assert r_tmp[0].metadata("shortName") == "msl" + v_tmp = r_tmp[0].values + assert np.allclose(v1, v_tmp) + + +@pytest.mark.parametrize( + "filename,shape", + [ + (earthkit_examples_file("test.grib"), (11, 19)), + (earthkit_test_data_file("O32_global.grib1"), (5248,)), + (earthkit_test_data_file("O32_global.grib2"), (5248,)), + ], +) +@pytest.mark.parametrize( + "_kwargs,expected_value", + [({}, None), ({"bits_per_value": 8}, 8), ({"bits_per_value": None}, None)], +) +def test_array_fl_grib_single_write_bits_per_value(filename, shape, _kwargs, expected_value): + ds0 = from_source("file", filename) + + ds = ds0.from_fields([ds0[0].copy()]) + assert ds[0].shape == shape + + if expected_value is None: + expected_value = ds[0].metadata("bitsPerValue") + + with temp_file() as tmp: + ds.save(tmp, **_kwargs) + ds1 = from_source("file", tmp) + assert ds1.metadata("bitsPerValue") == [expected_value] * len(ds) + + if __name__ == "__main__": from earthkit.data.testing import main diff --git a/tests/core/test_metadata.py b/tests/core/test_metadata.py index 45344009..44f67351 100644 --- a/tests/core/test_metadata.py +++ b/tests/core/test_metadata.py @@ -263,6 +263,7 @@ def test_grib_metadata_override_invalid(): assert "EncodingError" in e.typename +@pytest.mark.skipif(True, reason="headers_only_clone has to be fixed") def test_grib_metadata_override_headers_only_true(): ds = from_source("file", earthkit_examples_file("test.grib")) ref_size = ds[0].metadata("totalLength") diff --git a/tests/data/O32_global.grib1 b/tests/data/O32_global.grib1 new file mode 100644 index 0000000000000000000000000000000000000000..773868537b006b558c260ded217f56f515f0452f GIT binary patch literal 10800 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 Cz9bF+ literal 0 HcmV?d00001 From 4951662ee3a01c27fb9e3ff2913a805ef274c388 Mon Sep 17 00:00:00 2001 From: Sandor Kertesz Date: Sun, 8 Dec 2024 22:28:02 +0000 Subject: [PATCH 2/2] Fix issue when cannot write GRIB based array field to disk --- docs/release_notes/version_0.11_updates.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release_notes/version_0.11_updates.rst b/docs/release_notes/version_0.11_updates.rst index 962d568c..8570109c 100644 --- a/docs/release_notes/version_0.11_updates.rst +++ b/docs/release_notes/version_0.11_updates.rst @@ -8,7 +8,7 @@ Version 0.11.4 Fixes ++++++ -- Enforced the use of ``headers_only_clone=False`` when calling :meth:`GribMetadata.override() `. It was a necessary step to fix issues when writing :py:class:`ArrayField`\ containing :class:`~data.readers.grib.metadata.grib.GribMetadata` to disk. This is considered a temporary change until the issues with ``headers_only_clone`` are sorted out. +- Enforced the use of ``headers_only_clone=False`` when calling :meth:`GribMetadata.override() `. It was a necessary step to fix issues when writing :py:class:`ArrayField`\ containing :class:`~data.readers.grib.metadata.grib.GribMetadata` to disk. This is considered a temporary change until the issues with ``headers_only_clone`` are sorted out (:pr:`555`). Version 0.11.3