From c7f7a75d4a7bff3cdb03389a1297704a6e629704 Mon Sep 17 00:00:00 2001 From: dominiquef Date: Tue, 17 Jun 2025 16:46:40 -0700 Subject: [PATCH 1/4] Use float if NDV present on integer --- omf/fileio/geoh5.py | 19 +++++++++++++------ tests/convert_volume_test.py | 9 ++++++++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/omf/fileio/geoh5.py b/omf/fileio/geoh5.py index 278bd6a..f5206cc 100644 --- a/omf/fileio/geoh5.py +++ b/omf/fileio/geoh5.py @@ -552,20 +552,27 @@ def collect_attributes( with fetch_h5_handle(workspace): if isinstance(element, UidModel): values = element.array.array + ndvs = np.isnan(values) - if np.issubdtype(values.dtype, np.floating): - values[np.isclose(values, FLOAT_NDV, atol=1e-45)] = np.nan - values = values.astype(np.float32) - else: + if np.allclose( + values[~ndvs].astype(np.int32), values[~ndvs], atol=1e-45 + ): + values[ndvs] = INTEGER_NDV values = values.astype(np.int32) + else: + values = values.astype(np.float32) else: values = getattr(element, "values", None) if np.issubdtype(values.dtype, np.floating): - values[np.isnan(values)] = np.nan + values[np.isclose(values, FLOAT_NDV, atol=1e-45)] = np.nan else: - values[np.isclose(values, INTEGER_NDV)] = 0 + # Convert to float with nan as no-data value not supporter by OMF + ndvs = np.isclose(values, INTEGER_NDV) + if np.any(ndvs): + values = values.astype(np.float32) + values[ndvs] = np.nan if values is not None: conversion = _VALUE_MAP.get(type(self._parent), None) diff --git a/tests/convert_volume_test.py b/tests/convert_volume_test.py index b568509..ace5f03 100644 --- a/tests/convert_volume_test.py +++ b/tests/convert_volume_test.py @@ -14,7 +14,9 @@ import numpy as np from geoh5py.objects import BlockModel +from geoh5py.shared import INTEGER_NDV from geoh5py.workspace import Workspace +from pydantic_core.core_schema import int_schema import omf from omf import Project @@ -177,11 +179,16 @@ def test_nan_values(tmp_path): values = np.random.randn(block.n_cells) values[block.centroids[:, 2] > 100] = np.nan # Set some values to NaN + int_values = np.random.randint(0, 10, block.n_cells) + int_values[block.centroids[:, 2] > 100] = INTEGER_NDV # Set some values to NaN block.add_data( { "test_data": { "values": values, - } + }, + "test_int_data": { + "values": int_values, + }, } ) From 7a5bb3f82caaa39af41c26e9fdd3a3603f37b5aa Mon Sep 17 00:00:00 2001 From: dominiquef Date: Tue, 17 Jun 2025 16:50:32 -0700 Subject: [PATCH 2/4] Remove unused import --- tests/convert_volume_test.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/convert_volume_test.py b/tests/convert_volume_test.py index ace5f03..1d79739 100644 --- a/tests/convert_volume_test.py +++ b/tests/convert_volume_test.py @@ -16,7 +16,6 @@ from geoh5py.objects import BlockModel from geoh5py.shared import INTEGER_NDV from geoh5py.workspace import Workspace -from pydantic_core.core_schema import int_schema import omf from omf import Project From 13b7861c851ce217fbffa333d2a5a07378fd178c Mon Sep 17 00:00:00 2001 From: dominiquef Date: Wed, 18 Jun 2025 08:44:18 -0700 Subject: [PATCH 3/4] Add checks on integer data --- tests/convert_volume_test.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/convert_volume_test.py b/tests/convert_volume_test.py index 1d79739..b19be8d 100644 --- a/tests/convert_volume_test.py +++ b/tests/convert_volume_test.py @@ -13,6 +13,7 @@ from pathlib import Path import numpy as np +from geoh5py.data import IntegerData from geoh5py.objects import BlockModel from geoh5py.shared import INTEGER_NDV from geoh5py.workspace import Workspace @@ -207,3 +208,9 @@ def test_nan_values(tmp_path): converter.from_omf(project) rec_data = out_ws.get_entity("test_data")[0] assert np.isnan(rec_data.values).sum() == np.isnan(values).sum() + + rec_data = out_ws.get_entity("test_int_data")[0] + assert isinstance(rec_data, IntegerData) + assert (rec_data.values == INTEGER_NDV).sum() == ( + block.centroids[:, 2] > 100 + ).sum() From dd90a06da8be6e82c140b73e758131dd9bfecf18 Mon Sep 17 00:00:00 2001 From: dominiquef Date: Wed, 18 Jun 2025 13:20:43 -0700 Subject: [PATCH 4/4] Increase atol --- omf/fileio/geoh5.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/omf/fileio/geoh5.py b/omf/fileio/geoh5.py index f5206cc..ef7ab52 100644 --- a/omf/fileio/geoh5.py +++ b/omf/fileio/geoh5.py @@ -555,7 +555,7 @@ def collect_attributes( ndvs = np.isnan(values) if np.allclose( - values[~ndvs].astype(np.int32), values[~ndvs], atol=1e-45 + values[~ndvs].astype(np.int32), values[~ndvs], atol=2e-45 ): values[ndvs] = INTEGER_NDV values = values.astype(np.int32) @@ -566,7 +566,7 @@ def collect_attributes( values = getattr(element, "values", None) if np.issubdtype(values.dtype, np.floating): - values[np.isclose(values, FLOAT_NDV, atol=1e-45)] = np.nan + values[np.isclose(values, FLOAT_NDV, atol=2e-45)] = np.nan else: # Convert to float with nan as no-data value not supporter by OMF ndvs = np.isclose(values, INTEGER_NDV)