diff --git a/omf/fileio/geoh5.py b/omf/fileio/geoh5.py index 278bd6a..ef7ab52 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=2e-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=2e-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..b19be8d 100644 --- a/tests/convert_volume_test.py +++ b/tests/convert_volume_test.py @@ -13,7 +13,9 @@ 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 import omf @@ -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, + }, } ) @@ -201,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()