Source code for blissoda.utils.counters

import re
from typing import List
from typing import Set

_BLISS_RE = re.compile(r"^(?P<ctrl>[^:]+):spectrum_det(?P<num>\d+)$")
# Example: "fxb:spectrum_det01"

_BLISS_RE_ALT = re.compile(r"^(?P<ctrl>[^:]+):spectrum:det(?P<num>\d+)$")
# Example: "fx_nano:spectrum:det01"

_HDF5_RE = re.compile(r"^(?P<ctrl>.+)_det(?P<num>\d+)$")
# Example: "fxb_det01"


[docs] def counter_to_h5_names(xrf_names: List[str]) -> List[str]: """ Convert counter names to HDF5 NXdetector names. Examples: - "fxb:spectrum_det01" -> "fxb_det01" - "fxb_det01" -> "fxb_det01" - "fx_nano:spectrum:det00 -> "fx_nano_det0" # no leading zeros ???? """ h5_names = [] for name in xrf_names: if m := _BLISS_RE.match(name): prefix = m.group("ctrl") number = m.group("num") h5_names.append(f"{prefix}_det{number}") elif m := _BLISS_RE_ALT.match(name): prefix = m.group("ctrl") number = int(m.group("num")) h5_names.append(f"{prefix}_det{number}") elif _HDF5_RE.match(name): h5_names.append(name) else: raise ValueError(f"Unrecognized XRF name format: {name}") return h5_names
[docs] def counter_to_controller_names(xrf_names: List[str]) -> Set[str]: """ Extract controller names from detector names. Examples: - "fxb:spectrum_det01" -> "fxb" - "fxb_det01" -> "fxb" - "fx_nano:spectrum:det00 -> "fx_nano" """ controllers: Set[str] = set() for name in xrf_names: if m := _BLISS_RE.match(name): controllers.add(m.group("ctrl")) elif m := _BLISS_RE_ALT.match(name): controllers.add(m.group("ctrl")) elif m := _HDF5_RE.match(name): controllers.add(m.group("ctrl")) else: raise ValueError(f"Unrecognized XRF name format: {name}") return controllers