Source code for ewoksid02.tasks.gallerytask
from ewokscore import Task
import logging
from matplotlib.figure import Figure
from matplotlib.backends.backend_agg import FigureCanvasAgg
from pathlib import Path
from ewoksid02.id02_format import open_id02_file
logger = logging.getLogger(__name__)
[docs]
class SaveGalleryTask(
Task,
input_names=[
"nxdata_url",
],
optional_input_names=[
"do_save",
],
output_names=[
"filename_png",
],
):
[docs]
def run(self):
if not self.get_input_value("do_save", True):
logger.info("Saving in gallery is skipped")
return
nxdata_url = self.inputs.nxdata_url
filename_processed, h5path = nxdata_url.split("::")
processed_directory = Path(filename_processed).parent
gallery_directory = processed_directory / "gallery"
gallery_directory.mkdir(exist_ok=True)
filename_png = (
gallery_directory / Path(filename_processed).with_suffix(".png").name
)
filename_png = str(filename_png)
with open_id02_file(filename=filename_processed) as file:
if h5path not in file:
logger.error(f"No group {h5path} in {filename_processed}")
return
nxdata_group = file[h5path]
if "data" not in nxdata_group:
logger.error(f"No data dataset in {filename_processed}::{h5path}")
return
dset = nxdata_group["data"]
nb_frames = len(dset)
data_mean = dset[:].mean(axis=0)
fig = Figure()
FigureCanvasAgg(fig)
ax = fig.subplots()
try:
ax.set_title(f"{str(Path(filename_processed).stem)} ({nb_frames} frames)")
ax.set_xlabel("q ($nm^{-1}$)")
ax.set_ylabel("Intensity")
if data_mean.ndim == 1:
ax.loglog(data_mean)
elif data_mean.ndim == 2:
ax.imshow(data_mean)
fig.savefig(filename_png)
finally:
fig.clear()
self.outputs.filename_png = filename_png
logger.info(f"Saving in the gallery: {filename_png}\n")