Source code for ewoksid16a.tasks.fluotomo.gallery
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 1 17:02:10 2025
@author: blissadm
"""
import os
import imageio
import numpy as np
from ewokscore import Task
from silx.io import h5py_utils
DEFAULTS = {"detector_name": None, "target_width": 200, "max_size": 200 * 1024}
[docs]
class AnimatedWebP(
Task,
input_names=[
"nx_file",
],
optional_input_names=["detector_name"],
output_names=["nx_file", "detector_name"],
):
"""Export an animated WebP file from a nx-fluotomo"""
[docs]
def bin_stack(self, img, bin_y=2, bin_x=2):
n, h, w = img.shape
h2 = h // bin_y * bin_y
w2 = w // bin_x * bin_x
img = img[:, :h2, :w2]
return img.reshape(n, h2 // bin_y, bin_y, w2 // bin_x, bin_x).mean(axis=(2, 4))
[docs]
def run(self):
pars = {
**DEFAULTS,
**self.get_input_values(),
}
nx_file = pars["nx_file"]
detector_name = pars["detector_name"]
t_width = pars["target_width"]
max_size = pars["max_size"]
processed_data_folder = os.path.dirname(nx_file)
galleryfolder = os.path.join(processed_data_folder, "gallery")
os.makedirs(galleryfolder, exist_ok=True)
os.chmod(
galleryfolder, 0o770
) # nosec B103: group write required for shared pipeline
with h5py_utils.open_item(nx_file, "/") as fd:
for e in fd:
if detector_name is not None and not e.startswith(detector_name):
continue
data = fd[e]["data/data"][()]
data[np.isnan(data)] = 0
width = data.shape[2]
binning = int(np.round(width / t_width))
if binning < 0:
binning = 1
data = self.bin_stack(data, binning, binning)
mn = np.min(data)
Mx = np.max(data)
converted = np.array((data - mn) / (Mx - mn) * 255, dtype=np.uint8)
# imageio.v3.imwrite(
# os.path.join(galleryfolder, f"{e}.webp"), converted, quality=40, method=4,
# )
encoded = imageio.v3.imwrite(
"<bytes>",
converted,
fps=5,
lossless=False,
extension=".webp",
quality=70,
method=4,
)
size = len(encoded)
if size < max_size:
with open(os.path.join(galleryfolder, f"{e}.webp"), "wb") as f:
f.write(encoded)
self.outputs.nx_file = nx_file
self.outputs.detector_name = detector_name