Source code for nxtomomill.io.config.tests.test_confighandler
# coding: utf-8
import os
import pytest
from nxtomomill.io.config.confighandler import TomoHDF5ConfigHandler
from nxtomomill.io.config.hdf5config import TomoHDF5Config
from nxtomomill.models.h52nx.FrameGroup import FrameGroup
class _ARParseMock(object):
def __init__(self):
self.config_file = None
self.input_file = None
self.output_file = None
self.set_params = None
self.alignment_titles = None
self.projection_titles = None
self.flat_titles = None
self.dark_titles = None
self.zseries_init_titles = None
self.multitomo_init_titles = None
self.init_titles = None
self.back_and_forth_init_titles = None
self.sample_x_pixel_size_keys = None
self.sample_y_pixel_size_keys = None
self.exposure_time_keys = None
self.rotation_angle_keys = None
self.valid_camera_names = None
self.translation_z_keys = None
self.sample_y_keys = None
self.sample_x_keys = None
self.request_input = False
self.raises_error = False
self.default_data_copy = None
self.sub_entries_to_ignore = None
self.entries = None
self.debug = False
self.overwrite = False
self.single_file = False
self.no_master_file = False
self.file_extension = None
self.field_of_view = None
self.sample_detector_distance_keys = None
[docs]def test_creation_from_config_file(tmp_path):
options = _ARParseMock()
with pytest.raises(ValueError):
TomoHDF5ConfigHandler(argparse_options=options)
input_file_path = os.path.join(tmp_path, "output_file.cfg")
input_config = TomoHDF5Config()
input_config.to_cfg_file(input_file_path)
options.config_file = input_file_path
# insure this is valid if we add an input file and an output file
# from the command line
options.input_file = "toto.h5"
options.output_file = "toto.nx"
TomoHDF5ConfigHandler(argparse_options=options)
# or if we provide them from the configuration file
options.input_file = None
options.output_file = None
input_config.input_file = "toto.h5"
input_config.output_file = "toto.nx"
input_config.to_cfg_file(input_file_path)
TomoHDF5ConfigHandler(argparse_options=options)
[docs]def write_and_read_configuration(folder, data_urls):
configuration = TomoHDF5Config()
configuration.data_scans = data_urls
configuration.input_file = "toto.h5"
configuration.output_file = "toto.nx"
file_path = os.path.join(folder, "h52nx.cfg")
configuration.to_cfg_file(file_path=file_path)
options = _ARParseMock()
options.config_file = file_path
config_handler = TomoHDF5ConfigHandler(options)
return config_handler.configuration
[docs]def test_local_paths(tmp_path):
res_config = write_and_read_configuration(
folder=tmp_path,
data_urls=(
FrameGroup(url="/entry0000/data/flats", frame_type="flat"),
FrameGroup(url="/entry0000/data/projection1", frame_type="projection"),
FrameGroup(url="/entry0000/data/projection2", frame_type="projection"),
FrameGroup(url="/entry0000/data/alignment1", frame_type="alignment"),
FrameGroup(url="/entry0000/data/alignment2", frame_type="alignment"),
FrameGroup(url="/entry0000/data/darks", frame_type="dark"),
),
)
assert res_config is not None
assert len(res_config.data_scans) == 6
# check flats
flat_url = res_config.data_scans[0].url
assert flat_url.file_path() in (None, "")
assert flat_url.data_path() == "/entry0000/data/flats"
assert flat_url.data_slice() in (None, "")
# check projections
projection_url_0 = res_config.data_scans[1].url
projection_url_1 = res_config.data_scans[2].url
assert projection_url_0.file_path() in (None, "")
assert projection_url_0.data_path() == "/entry0000/data/projection1"
assert projection_url_0.data_slice() is None
assert projection_url_1.file_path() in (None, "")
assert projection_url_1.data_path() == "/entry0000/data/projection2"
assert projection_url_1.data_slice() is None
# check darks
dark_url = res_config.data_scans[-1].url
assert dark_url.file_path() in (None, "")
assert dark_url.data_path(), "/entry0000/data/darks"
assert dark_url.data_slice() is None
# check alignments
alignment_url_0 = res_config.data_scans[3].url
alignment_url_1 = res_config.data_scans[4].url
assert alignment_url_0.file_path() in (None, "")
assert alignment_url_0.data_path(), "/entry0000/data/alignment1"
assert alignment_url_0.data_slice() is None
assert alignment_url_1.data_path() == "/entry0000/data/alignment2"
[docs]def test_external_paths(tmp_path):
"""
Check that DataUrl are handled.
Warning: this also check data_slices but those are not handled.
"""
res_config = write_and_read_configuration(
folder=tmp_path,
data_urls=(
FrameGroup(
frame_type="flat",
url="silx:///myfile.h5?path=/entry0000/data/flats",
),
FrameGroup(
frame_type="dark",
url="h5py:///data/file2.hdf5?path=/entry0000/data/darks",
),
FrameGroup(frame_type="proj", url="h5py:///data/file3.hdf5?path=/data"),
FrameGroup(
frame_type="proj",
url="silx:///data/file2.hdf5?path=/entry0000/data/projection2&slice=5:100",
),
FrameGroup(
frame_type="alignment",
url="silx:///myfile.h5?path=/entry0000/data/alignment&slice=5",
),
),
)
assert res_config is not None
assert len(res_config.data_scans) == 5
# check flats
flat_url = res_config.data_scans[0]
assert flat_url.url.file_path() == "/myfile.h5"
assert flat_url.url.data_path() == "/entry0000/data/flats"
assert flat_url.url.data_slice() is None
assert flat_url.url.scheme() == "silx"
# check projections
projection_url_0 = res_config.data_scans[2].url
projection_url_1 = res_config.data_scans[3].url
assert projection_url_0.file_path() == "/data/file3.hdf5"
assert projection_url_0.data_path() == "/data"
assert projection_url_0.data_slice() is None
assert projection_url_0.scheme() == "h5py"
assert projection_url_1.file_path() == "/data/file2.hdf5"
assert projection_url_1.data_path() == "/entry0000/data/projection2"
assert projection_url_1.data_slice() == (slice(5, 100),)
assert projection_url_1.scheme() == "silx"
# check darks
dark_url = res_config.data_scans[1].url
assert dark_url.file_path() == "/data/file2.hdf5"
assert dark_url.data_path() == "/entry0000/data/darks"
assert dark_url.data_slice() is None
assert dark_url.scheme() == "h5py"
# check alignments
alignment_url_0 = res_config.data_scans[4].url
assert alignment_url_0.file_path() == "/myfile.h5"
assert alignment_url_0.data_path() == "/entry0000/data/alignment"
assert alignment_url_0.data_slice() == (5,)
assert alignment_url_0.scheme() == "silx"