Source code for nexgen.tools.meta_reader

"""
Tools to get the information stored inside the _meta.h5 file and overwrite the phil scope.
"""

from __future__ import annotations

import logging

import numpy as np
from numpy.typing import DTypeLike

from ..nxs_utils import Axis
from ..utils import units_of_length
from .metafile import DectrisMetafile

# TODO actually define the type for scope extract and replace Any with Union
overwrite_logger = logging.getLogger("nexgen.MetaReader")
overwrite_logger.setLevel(logging.DEBUG)


[docs] def define_vds_data_type(meta_file: DectrisMetafile) -> DTypeLike: """Define the data type for the VDS from the bit_depth defined in the meta file. Args: meta_file (DectrisMetafile): Handle to Dectris-shaped meta.h5 file. Returns: DTypeLike: Data type as np.uint##. """ overwrite_logger.debug("Define dtype for VDS creating from bit_depth_image.") # meta = DectrisMetafile(meta_file) nbits = meta_file.get_bit_depth_image() overwrite_logger.debug(f"Found value for bit_depth_image: {nbits}.") if nbits == 32: return np.uint32 elif nbits == 8: return np.uint8 else: return np.uint16
[docs] def update_axes_from_meta( meta_file: DectrisMetafile, axes_list: list[Axis], osc_axis: str | None = None, use_config: bool = False, ): """Update goniometer or detector axes values from those stores in the _dectris group. Args: meta_file (DectrisMetafile): Handle to Dectris-shaped meta.h5 file. axes_list (list[Axis]): List of axes to look up and eventually update. osc_axis (str | None, optional): If passed, the number of images corresponding to the osc_axis \ will be updated too. Defaults to None. use_config (bool, optional): If passed read from config dataset in meta file instead of _dectris\ group. Defaults to False. """ overwrite_logger.debug("Updating axes list with values saved to _dectris group.") if meta_file.hasDectrisGroup is False: overwrite_logger.warning( "No Dectris group in meta file. No values will be updated." ) return if use_config is True and meta_file.hasConfig is True: config = meta_file.read_config_dset() else: config = meta_file.read_dectris_config() num = meta_file.get_full_number_of_images() for ax in axes_list: if f"{ax.name}_start" in config.keys(): ax.start_pos = config[f"{ax.name}_start"] overwrite_logger.debug(f"Start value for axis {ax.name}: {ax.start_pos}.") if f"{ax.name}_increment" in config.keys(): ax.increment = config[f"{ax.name}_increment"] overwrite_logger.debug( f"Increment value for axis {ax.name}: {ax.increment}." ) if osc_axis and ax.name == osc_axis: ax.num_steps = num if ax.name == "det_z": dist = units_of_length(meta_file.get_detector_distance()) ax.start_pos = dist.to("mm").magnitude overwrite_logger.debug(f"Start value for axis {ax.name}: {ax.start_pos}.")