Source code for ewoksid16a.tasks.tomo.extract_randdisp

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


import os

import numpy as np
from esrf_pathlib import ESRFPath
from ewokscore import Task
from silx.io import h5py_utils


[docs] class ExtractRanddisp( Task, input_names=[ "bliss_scan_uri", ], optional_input_names=[ "output_filename", "subscans", ], output_names=["bliss_scan_uri", "output_filename"], ): """ This task extract the random displacement to text. """
[docs] def run(self): bliss_uri = self.inputs["bliss_scan_uri"] uri = bliss_uri.split("::/") bliss_filename = uri[0] scan_id = uri[1] scan_no = int(scan_id.split(".")[0]) esrf_path = ESRFPath(bliss_filename) output_filename = os.path.join( esrf_path.processed_dataset_path, "projections", f"{esrf_path.collection}_{esrf_path.dataset}_{scan_no:04d}.txt", ) output_filename = self.get_input_value("output_filename", output_filename) output_path = os.path.abspath(os.path.dirname(output_filename)) if not os.path.isdir(output_path): os.makedirs(output_path, exist_ok=True) os.chmod( output_path, 0o770 ) # nosec B103: group write required for shared pipeline types = [] # Wait for scan completion with h5py_utils.open_item( bliss_filename, f"{scan_id}/end_time", retry_invalid=True ): pass print("OK!") print(bliss_filename, scan_id) subs = self.get_input_value("subscans", None) if subs is None: # open the tomo seauence, read the configuration and scan sequence with h5py_utils.open_item(bliss_filename, scan_id) as tomo_sequence: scan_numbers = tomo_sequence["subscans"]["scan_numbers"][:] for k in tomo_sequence["technique"]["subscans"]: typ = tomo_sequence["technique"]["subscans"][k]["type"][()] if isinstance(typ, bytes): typ = typ.decode() types += [ typ, ] else: scan_numbers = list(subs.keys()) types = list(subs.values()) print(types) disp_y_px = [] disp_z_px = [] for i, n in enumerate(scan_numbers): if types[i] == "tomo:step": # Only valid for projections with h5py_utils.open_item(bliss_filename, f"/{n}.1") as scan: disp_y_px += [scan["technique/proj/rand_pos_y_px"][()]] disp_z_px += [scan["technique/proj/rand_pos_z_px"][()]] elif types[i] == "tomo:return_ref": # add 3 zeros for return ref disp_y_px += [ np.zeros((3,), dtype=np.float32), ] disp_z_px += [ np.zeros((3,), dtype=np.float32), ] disp_y_px = np.concatenate(disp_y_px) disp_z_px = np.concatenate(disp_z_px) np.savetxt(output_filename, np.array([disp_y_px, -disp_z_px]).T, "%.03f") self.outputs["bliss_scan_uri"] = bliss_uri self.outputs["output_filename"] = output_filename