Source code for ewoksfluo.tasks.positioner_utils
from typing import Sequence, Optional
import h5py
from .nexus import split_h5uri
_ENERGY_UNITS = "kev", "ev"
_ENERGY_TEMPLATE = "instrument/positioners_start/{}"
[docs]
def get_energy_suburi(scan_uri: str) -> Optional[str]:
return _get_unit_position_suburi(scan_uri, _ENERGY_UNITS)
[docs]
def get_energy(
scan_uri: str,
energy_name: Optional[str] = None,
energy_uri_template: Optional[str] = None,
) -> Optional[float]:
if energy_name:
if not energy_uri_template:
energy_uri_template = _ENERGY_TEMPLATE
return _get_template_position_value(scan_uri, energy_name, energy_uri_template)
return _get_unit_position_value(scan_uri, _ENERGY_UNITS)
def _get_unit_position_suburi(scan_uri: str, units: Sequence[str]) -> Optional[str]:
"""Get scan sub-URI for a positioner with specific units"""
scan_filename, scan_h5path = split_h5uri(scan_uri)
with h5py.File(scan_filename, "r") as nxroot:
positioners = nxroot[f"{scan_h5path}/instrument/positioners_start"]
name = _get_positioner_name(positioners, units)
if name is not None:
return f"instrument/positioners_start/{name}"
def _get_template_position_value(
scan_uri: str, position_name: str, position_uri_template: str
) -> float:
"""Get position value from scan"""
scan_filename, scan_h5path = split_h5uri(scan_uri)
suburi = position_uri_template.format(position_name)
with h5py.File(scan_filename, "r") as nxroot:
return nxroot[f"{scan_h5path}/{suburi}"][()]
def _get_unit_position_value(scan_uri: str, units: Sequence[str]) -> Optional[float]:
"""Get position value from scan"""
scan_filename, scan_h5path = split_h5uri(scan_uri)
with h5py.File(scan_filename, "r") as nxroot:
positioners = nxroot[f"{scan_h5path}/instrument/positioners_start"]
positioner = _get_positioner(positioners, units)
if positioner is not None:
return positioner[()]
def _get_positioner(
positioners: h5py.Group, units: Sequence[str]
) -> Optional[h5py.Dataset]:
for name in positioners:
positioner = positioners[name]
punits = positioner.attrs.get("units", "").lower()
if punits in units:
return positioner
def _get_positioner_name(
positioners: h5py.Group, units: Sequence[str]
) -> Optional[str]:
for name in positioners:
positioner = positioners[name]
punits = positioner.attrs.get("units", "").lower()
if punits in units:
return name