Source code for ewoksid14.timepix4.t4_write
import h5py
import numpy
from . import t4_camera
[docs]
def save_nxdata(
filename: str,
name: str,
h3d: numpy.ndarray,
toa_edges: numpy.ndarray,
relative_toa: bool = True,
) -> numpy.ndarray:
"""
Save a 3D histogram in NeXus NXdata format (HDF5) with TOA bin centers.
The 3D histogram has shape (n_rows, n_cols, n_toa).
Also creates an additional NXdata group with the histogram summed along time.
:param filename: Output HDF5 filename.
:param name: NXentry group name.
:param h3d: 3D histogram array (n_rows, n_cols, n_toa).
:param toa_edges: TOA bin edges corresponding to the last axis.
:returns: 2D histogram
"""
if relative_toa:
time_units = "ns"
factor = 0.5
time_name = "rel_toa"
long_name = "Relative TOA (ns)"
else:
time_units = "s"
factor = 0.5e-9
time_name = "toa"
long_name = "Absolute TOA (s)"
y = numpy.arange(t4_camera.n_rows)
x = numpy.arange(t4_camera.n_cols)
with h5py.File(filename, "w") as nxroot:
nxroot.attrs["NX_class"] = "NXroot"
nxroot.attrs["default"] = name
# NXentry group
nxentry = nxroot.create_group(name)
nxentry.attrs["NX_class"] = "NXentry"
nxentry.attrs["default"] = "timepix4_hist_2d"
# 3D histogram
nxdata_3d = nxentry.create_group("timepix4_hist_3d")
nxdata_3d.attrs["NX_class"] = "NXdata"
signal_3d = nxdata_3d.create_dataset("counts", data=h3d)
signal_3d.attrs["units"] = "counts"
signal_3d.attrs["interpretation"] = "image"
nxdata_3d.attrs["signal"] = "counts"
toa_centers = factor * (toa_edges[:-1] + toa_edges[1:])
time = nxdata_3d.create_dataset(time_name, data=toa_centers)
time.attrs.update({"units": time_units, "long_name": long_name})
dy = nxdata_3d.create_dataset("y", data=y)
dy.attrs.update({"units": "pixels", "long_name": "Rows (pixels)"})
dx = nxdata_3d.create_dataset("x", data=x)
dx.attrs.update({"units": "pixels", "long_name": "Columns (pixels)"})
nxdata_3d.attrs["axes"] = ["y", "x", time_name]
# 2D histogram summed over time
h2d = h3d.sum(axis=2) # sum over TOA (last axis)
nxdata_2d = nxentry.create_group("timepix4_hist_2d")
nxdata_2d.attrs["NX_class"] = "NXdata"
signal_2d = nxdata_2d.create_dataset("counts", data=h2d)
signal_2d.attrs["units"] = "counts"
signal_2d.attrs["interpretation"] = "image"
nxdata_2d.attrs["signal"] = "counts"
dy = nxdata_2d.create_dataset("y", data=y)
dy.attrs.update({"units": "pixels"})
dx = nxdata_2d.create_dataset("x", data=x)
dx.attrs.update({"units": "pixels"})
nxdata_2d.attrs["axes"] = ["y", "x"]
print(f"Saved {filename}")
return h2d