Source code for nabu.preproc.double_flatfield_variable_region

from .double_flatfield import (
    DoubleFlatField,
    DoubleFlatField,
    check_shape,
    get_2D_3D_shape,
)
from ..misc.binning import get_binning_function


[docs] class DoubleFlatFieldVariableRegion(DoubleFlatField): def __init__( self, shape, result_url=None, binning_x=None, binning_z=None, detector_corrector=None, ): """This class provides the division by the double flat field. At variance with the standard class, it store as member the whole field, and performs the division by the proper region according to the positionings of the processed radios which is passed by the argument array sub_regions_per_radio to the method apply_double_flatfield_for_sub_regions """ self.radios_shape = get_2D_3D_shape(shape) self.n_angles = self.radios_shape[0] self.shape = self.radios_shape[1:] self._init_filedump(result_url, None, detector_corrector) data = self._load_dff_full_dump() if (binning_z, binning_x) != (1, 1): print(" (binning_z, binning_x) ", (binning_z, binning_x)) binning_function = get_binning_function((binning_z, binning_x)) if binning_function is None: raise NotImplementedError(f"Binning factor for {(binning_z, binning_x)} is not implemented yet") self.data = binning_function(data) else: self.data = data def _load_dff_full_dump(self): res = self.reader.get_data(self.result_url) if self.detector_corrector is not None: self.detector_corrector.set_full_transformation() res = self.detector_corrector.transform(res, do_full=True) return res
[docs] def apply_double_flatfield_for_sub_regions(self, radios, sub_regions_per_radio): """ Apply the "double flatfield" filter on a chunk of radios. The processing is done in-place ! """ my_double_ff = self.data for i in range(radios.shape[0]): s_x, e_x, s_y, e_y = sub_regions_per_radio[i] dff = my_double_ff[s_y:e_y, s_x:e_x] check_shape(radios[i].shape, dff.shape, "radios") radios[i] /= dff return radios