Source code for nxtomomill.converter.hdf5.acquisition.utils.detector
from __future__ import annotations
import h5py
[docs]def has_valid_detector(node, detectors_names):
"""
:return True if the node looks like a valid nx detector
"""
for key in node.keys():
if (
"NX_class" in node[key].attrs
and node[key].attrs["NX_class"] == "NXdetector"
):
if detectors_names is None or key in detectors_names:
return True
return False
[docs]def get_nx_detectors(node: h5py.Group) -> tuple:
"""
:param node: node to inspect
:return: tuple of NXdetector (h5py.Group) contained in `node`
(expected to be the `instrument` group)
"""
if not isinstance(node, h5py.Group):
raise TypeError("node should be an instance of h5py.Group")
nx_detectors = []
for _, subnode in node.items():
if isinstance(subnode, h5py.Group) and "NX_class" in subnode.attrs:
if subnode.attrs["NX_class"] == "NXdetector":
if "data" in subnode and hasattr(subnode["data"], "ndim"):
if subnode["data"].ndim == 3:
nx_detectors.append(subnode)
nx_detectors = sorted(nx_detectors, key=lambda det: det.name)
return tuple(nx_detectors)
[docs]def guess_nx_detector(node: h5py.Group) -> tuple:
"""
Try to guess what can be an nx_detector without using the "NXdetector"
NX_class attribute. Expect to find a 3D dataset named 'data' under
a subnode
"""
if not isinstance(node, h5py.Group):
raise TypeError("node should be an instance of h5py.Group")
nx_detectors = []
for _, subnode in node.items():
if isinstance(subnode, h5py.Group) and "data" in subnode:
if isinstance(subnode["data"], h5py.Dataset) and subnode["data"].ndim == 3:
nx_detectors.append(subnode)
nx_detectors = sorted(nx_detectors, key=lambda det: det.name)
return tuple(nx_detectors)