Source code for pyuff_ustb.readers.util
from enum import Enum
from typing import TYPE_CHECKING, List, Type, Union
import numpy as np
from pyuff_ustb.readers.base import Reader
if TYPE_CHECKING:
# Import type hint stuff here to avoid circular imports. TYPE_CHECKING is always
# False at runtime, but is True when type checking.
from pyuff_ustb.objects.uff import TUff
[docs]
def read_potentially_list(
reader: Reader,
cls: Type["TUff"],
) -> Union["TUff", List["TUff"]]:
"""Read a Uff or a list of Uffs, depending on the "size"
attribute. If size>1, then we have a list of objects."""
n = int(reader.attrs.get("size", [0, 0]).max())
if n > 1:
return [cls(reader[k]) for k in reader.keys()]
else:
return cls(reader)
[docs]
def read_list_of_strings(reader: Reader) -> Union[None, List[str]]:
"""Return a list of strings if the size of the read h5 object is greater than 0.
Return None if n==0."""
def parse(integer_list: List[int]) -> str:
int_chars = np.squeeze(integer_list) # A list of integers
chars = [chr(int(c)) for c in int_chars] # Convert the integers to chars
value = "".join(chars) # Join the chars into a string
return value
n = reader.attrs.get("size", [0, 0])[1]
if n > 0:
strs = []
for k in reader.keys():
with reader[k].read() as obj:
strs.append(parse(obj))
return strs
else:
with reader.read() as obj:
return parse(list(obj))
[docs]
def read_enum(reader: Reader, cls: Type[Enum]):
with reader.read() as obj:
return cls(np.squeeze(obj))
[docs]
def read_scan(scan_reader: Reader):
from pyuff_ustb.common import get_class_from_name
from pyuff_ustb.objects.scans.scan import Scan
cls = get_class_from_name(scan_reader.attrs["class"])
assert issubclass(cls, Scan), "Expected class to be a subclass of Scan"
return cls(scan_reader)
[docs]
def read_probe(probe_reader: Reader):
from pyuff_ustb.common import get_class_from_name
from pyuff_ustb.objects.probes.probe import Probe
cls = get_class_from_name(probe_reader.attrs["class"])
assert issubclass(cls, Probe), "Expected class to be a subclass of Probe"
return cls(probe_reader)