Source code for nabu.app.correct_rot

from .. import version
from os import environ

import argparse
import shutil
import os
import sys
import re
import h5py
import numpy as np


from ..resources.logger import LoggerOrPrint
from .utils import parse_params_values
from .cli_configs import CorrectRotConfig
from silx.io.dictdump import h5todict

from nxtomo.application.nxtomo import NXtomo

import h5py
from nabu.utils import DictToObj


[docs] def main(user_args=None): """Applies the correction found by diag_to_rot to a nexus file""" if user_args is None: user_args = sys.argv[1:] args = DictToObj( parse_params_values( CorrectRotConfig, parser_description=main.__doc__, program_version="nabu " + version, user_args=user_args, ) ) # now we read the results of the diag_to_rot utility, they are in the cor_file parameter # of the cli cor_data = DictToObj(h5todict(args.cor_file, "/")) my_cor = cor_data.cor[0] # we will take my_cor as cor at the first angular position # and then we correct the x_translation at the other angles # We now load the nexus that we wish to correct nx_tomo = NXtomo().load(args.nexus_source, args.entry_name) # The cor_file that we use for correction # is providing us with the z_m that gives for each # cor position found in the cor array the corresponding value of # the translation along z (in meters) z_translation = nx_tomo.sample.z_translation.value z_translation = z_translation - z_translation[0] # now we interpolate to find the correction # for each position of the encoders cors = np.interp(z_translation, cor_data.z_m, cor_data.cor) # this is the correction x_correction = nx_tomo.instrument.detector.x_pixel_size.value * (cors - my_cor) # we are in meters here # and we apply it to the nexus that we have loaded nx_tomo.sample.x_translation = nx_tomo.sample.x_translation.value + x_correction # finally we write it to the corrected nexus file nx_tomo.save(file_path=args.nexus_target, data_path=args.entry_name, overwrite=True) return 0