Source code for ewoksfluo.tasks.regrid.positioners_utils
from typing import Sequence, Tuple, List, Optional, Dict
import numpy
import h5py
from ...io.hdf5 import split_h5uri
from ...io.hdf5 import retry_external_link
from ...io.hdf5 import ReadHdf5File
[docs]
def read_position_suburis(
bliss_scan_uri: str,
position_suburis: Sequence[str],
axes_units: Optional[Dict[str, str]] = None,
) -> Tuple[List[numpy.ndarray], List[str], List[Optional[str]]]:
data = [
get_position_data(bliss_scan_uri, position_suburi)
for position_suburi in position_suburis
]
positions, units = zip(*data)
names = [[s for s in name.split("/") if s][-1] for name in position_suburis]
if axes_units:
units = [
unit if unit else axes_units.get(name) for name, unit in zip(names, units)
]
return positions, names, units
[docs]
def get_position_data(
bliss_scan_uri: str, position_suburi: str
) -> Tuple[numpy.ndarray, Optional[str]]:
"""Get position data with units from HDF5"""
scan_filename, scan_h5path = split_h5uri(bliss_scan_uri)
with ReadHdf5File(scan_filename) as scan_file:
scan_grp = scan_file[scan_h5path]
assert isinstance(scan_grp, h5py.Group)
with retry_external_link(scan_grp, position_suburi) as pos_dataset:
assert isinstance(pos_dataset, h5py.Dataset)
return pos_dataset[()], pos_dataset.attrs.get("units")
[docs]
def get_scan_position_suburis(
bliss_scan_uri: str, ignore_positioners: Optional[Sequence[str]] = None
) -> List[str]:
"""Get all scan sub-URI's for positioners which were scanned."""
scan_filename, scan_h5path = split_h5uri(bliss_scan_uri)
with ReadHdf5File(scan_filename) as scan_file:
scan_grp = scan_file[scan_h5path]
positioners = set(scan_grp["instrument/positioners_start"])
counters = set(scan_grp["measurement"])
positioners &= counters
if ignore_positioners:
positioners -= set(ignore_positioners)
# E.g. order ["sampz", "sampy"]
# The first dimension in pymca and silx is plotted vertically
return [f"measurement/{s}" for s in reversed(sorted(positioners))]