Source code for nxtomomill.converter.edf.checks
import numpy
import logging
from silx.utils.enum import Enum as _Enum
from silx.io.utils import open as open_hdf5
from silx.io.utils import get_data
from tomoscan.esrf.scan.nxtomoscan import NXtomoScan
from nxtomo.paths.nxtomo import get_paths as get_nexus_paths
_logger = logging.getLogger(__name__)
[docs]class OUPUT_CHECK(_Enum):
COMPARE_VOLUME = "compare-output-volume"
[docs]def compare_volumes(edf_volume_as_urls: tuple, hdf5_scan: NXtomoScan) -> tuple:
"""
:param tuple edf_volume_as_urls: ordered list of the expected volume.
contains (DataUrl, bool). first element is the location of the orginal frame,
second is a boolean notifying if the frame has been modified or not.
If yes then we cannot do the comparaison.
:param NXtomoScan hdf5_scan: NXtomo that we want to check the construction.
On this function we compare a final volume and it's construction. The idea here is more to prevent from
some 'external' issues such as a file behing not accessible or some 'rock in the shoe'
"""
issues = set()
with open_hdf5(hdf5_scan.master_file) as h5f:
entry_node = h5f[hdf5_scan.entry]
nexus_path_version = entry_node.attrs.get("version", None)
nexus_paths = get_nexus_paths(nexus_path_version)
detector_dataset = entry_node[nexus_paths.PROJ_PATH]
for i_frame, ((url_original, modified), output_frame) in enumerate(
zip(edf_volume_as_urls, detector_dataset)
):
original_data = get_data(url_original)
if modified:
_logger.info(
f"skip comparaison of frame {i_frame}, expected to be different"
)
elif original_data.dtype != detector_dataset.dtype:
# TODO: in this case maybe we want to be more 'accommodating'
issues.add(
f"orignial data and new dataset have different data type ({original_data.dtype} vs {detector_dataset.dtype})"
)
elif not numpy.allclose(original_data, output_frame):
issues.add(
f"difference found on frame {i_frame}. Orignal url is {url_original.path()}"
)
return tuple(issues)