Source code for plugins.loaders.full_field_loaders.lfov_loader

# Copyright 2014 Diamond Light Source Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""
.. module:: lfov_loader
   :platform: Unix
   :synopsis: Large field-of-view loader. A class for loading 2 standard
    tomography scans.
.. moduleauthor:: Nicola Wadeson <scientificsoftware@diamond.ac.uk>

"""

import os
import copy
import numpy as np
import glob

import savu.test.test_utils as tu
from savu.plugins.utils import register_plugin
from savu.plugins.loaders.full_field_loaders.multi_nxtomo_loader import \
        MultiNxtomoLoader


[docs]@register_plugin class LfovLoader(MultiNxtomoLoader): def __init__(self, name='LfovLoader'): super(LfovLoader, self).__init__(name) def _update_preview(self, preview, offset): """ Add extra sinograms to the preview if there are not enough to stitch at least one frame after taking into account the offset between images. Parameters ---------- preview : list A Savu preview data list. Returns ------- None. """ if not offset or not preview: return preview dObj = self.exp.index['in_data']['tomo'] # Revert the data shape to before previewing was applied dObj.set_shape(dObj.get_original_shape()) preview = dObj.get_preview().get_integer_entries(preview) sino_slice_dim = dObj.get_data_dimension_by_axis_label("detector_y") max_sino_idx = dObj.data.shape[sino_slice_dim] sl = list(map(int, preview[sino_slice_dim].split(":"))) sl_0 = sl[0] + offset sl_1 = sl[1] + offset if (max_sino_idx >= sl_0 >= 0) and (max_sino_idx >= sl_1 >= 0): sl[0] = sl_0 sl[1] = sl_1 preview[sino_slice_dim] = ":".join(map(str, sl)) self.parameters['preview'][sino_slice_dim] = preview[sino_slice_dim] return preview def _get_order_list(self): order = self.parameters['order'] if order[0] < order[-1]: order_list = np.arange(order[0], order[1] + 1) else: order_list = np.arange(order[0], order[1] - 1, -1) return order_list def _get_file_list(self, order_list): shared_name = self.parameters["file_name"] file_path = copy.copy(self.exp.meta_data.get('data_file')) self.exp.meta_data.set('data_file', file_path) if shared_name is None: file_list = self._find_files(file_path, "/*.hdf") if len(file_list) == 0: file_list = self._find_files(file_path, "/*.nxs") else: file_list = self._find_files(file_path, "/*" + shared_name + "*") if len(order_list) != len(file_list): raise ValueError( "Number of files found in the folder is not the same as the" " requested number") return file_list def _find_files(self, base, name): return sorted(glob.glob(base + name)) if base else [] def _get_data_objects(self, nxtomo): order_list = self._get_order_list() file_list = self._get_file_list(order_list) dark_folder, dark_key, dark_scale = self.parameters['dark'] flat_folder, flat_key, flat_scale = self.parameters['flat'] dark_folder = self.get_conf_path(dark_folder) flat_folder = self.get_conf_path(flat_folder) dark_list = self._find_files(dark_folder, "/*dark*") flat_list = self._find_files(flat_folder, "/*flat*") offset = self.parameters['row_offset'] data_obj_list = [] for i in order_list: self.exp.meta_data.set('data_file', file_list[i]) # update darks and flats if dark_folder is not None: nxtomo.parameters['dark'] = [ dark_list[i], dark_key, dark_scale] if flat_folder is not None: nxtomo.parameters['flat'] = [ flat_list[i], flat_key, flat_scale] nxtomo.setup() # update preview if offset[i] != 0: nxtomo.parameters['preview'] = \ self._update_preview(nxtomo.parameters['preview'], offset[i]) data_obj_list.append(self.exp.index['in_data']['tomo']) self.exp.index['in_data'] = {} return data_obj_list
[docs] def get_conf_path(self, path): # For Savu tests if path.split(os.sep)[0] == 'Savu': path = tu.get_test_data_path(path.split('/test_data/data/')[1]) return path