Test Failed
Push — master ( b5951e...370793 )
by
unknown
01:34 queued 19s
created

savu.plugins.loaders.full_field_loaders.lfov_loader   A

Complexity

Total Complexity 21

Size/Duplication

Total Lines 139
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 81
dl 0
loc 139
rs 10
c 0
b 0
f 0
wmc 21

7 Methods

Rating   Name   Duplication   Size   Complexity  
A LfovLoader._update_preview() 0 33 5
A LfovLoader.__init__() 0 2 1
A LfovLoader._find_files() 0 2 2
A LfovLoader._get_order_list() 0 7 2
B LfovLoader._get_data_objects() 0 29 5
A LfovLoader._get_file_list() 0 17 4
A LfovLoader.get_conf_path() 0 5 2
1
# Copyright 2014 Diamond Light Source Ltd.
2
#
3
# Licensed under the Apache License, Version 2.0 (the "License");
4
# you may not use this file except in compliance with the License.
5
# You may obtain a copy of the License at
6
#
7
#     http://www.apache.org/licenses/LICENSE-2.0
8
#
9
# Unless required by applicable law or agreed to in writing, software
10
# distributed under the License is distributed on an "AS IS" BASIS,
11
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
# See the License for the specific language governing permissions and
13
# limitations under the License.
14
15
"""
16
.. module:: lfov_loader
17
   :platform: Unix
18
   :synopsis: Large field-of-view loader. A class for loading 2 standard
19
    tomography scans.
20
.. moduleauthor:: Nicola Wadeson <[email protected]>
21
22
"""
23
24
import os
25
import copy
26
import numpy as np
27
import glob
28
29
import savu.test.test_utils as tu
30
from savu.plugins.utils import register_plugin
31
from savu.plugins.loaders.full_field_loaders.multi_nxtomo_loader import \
32
        MultiNxtomoLoader
33
34
35
@register_plugin
36
class LfovLoader(MultiNxtomoLoader):
37
38
    def __init__(self, name='LfovLoader'):
39
        super(LfovLoader, self).__init__(name)
40
        
41
    def _update_preview(self, preview, offset):
42
        """
43
        Add extra sinograms to the preview if there are not enough to stitch
44
        at least one frame after taking into account the offset between images.
45
46
        Parameters
47
        ----------
48
        preview : list
49
            A Savu preview data list.
50
51
        Returns
52
        -------
53
        None.
54
55
        """
56
        if not offset or not preview:
57
            return preview
58
        dObj = self.exp.index['in_data']['tomo']
59
60
        # Revert the data shape to before previewing was applied
61
        dObj.set_shape(dObj.get_original_shape())
62
        preview = dObj.get_preview().get_integer_entries(preview)
63
        sino_slice_dim = dObj.get_data_dimension_by_axis_label("detector_y")
64
        max_sino_idx = dObj.data.shape[sino_slice_dim]
65
        sl = list(map(int, preview[sino_slice_dim].split(":")))
66
        sl_0 = sl[0] + offset
67
        sl_1 = sl[1] + offset
68
        if (max_sino_idx >= sl_0 >= 0) and (max_sino_idx >= sl_1 >= 0):
69
            sl[0] = sl_0
70
            sl[1] = sl_1   
71
            preview[sino_slice_dim] = ":".join(map(str, sl))
72
            self.parameters['preview'][sino_slice_dim] = preview[sino_slice_dim]
73
        return preview
74
75
    def _get_order_list(self):
76
        order = self.parameters['order']
77
        if order[0] < order[-1]:
78
            order_list = np.arange(order[0], order[1] + 1)
79
        else:
80
            order_list = np.arange(order[0], order[1] - 1, -1)        
81
        return order_list
82
83
    def _get_file_list(self, order_list):
84
        shared_name = self.parameters["file_name"]
85
        file_path = copy.copy(self.exp.meta_data.get('data_file'))
86
        self.exp.meta_data.set('data_file', file_path)
87
        
88
        if shared_name is None:
89
            file_list = self._find_files(file_path, "/*.hdf")
90
            if len(file_list) == 0:
91
                file_list = self._find_files(file_path, "/*.nxs")
92
        else:
93
            file_list = self._find_files(file_path, "/*" + shared_name + "*")
94
95
        if len(order_list) != len(file_list):
96
            raise ValueError(
97
                "Number of files found in the folder is not the same as the"
98
                " requested number")
99
        return file_list
100
    
101
    def _find_files(self, base, name):
102
        return sorted(glob.glob(base + name)) if base else []
103
104
    def _get_data_objects(self, nxtomo):
105
        order_list = self._get_order_list()
106
        file_list = self._get_file_list(order_list)        
107
        dark_folder, dark_key, dark_scale = self.parameters['dark']
108
        flat_folder, flat_key, flat_scale = self.parameters['flat']
109
        dark_folder = self.get_conf_path(dark_folder)
110
        flat_folder = self.get_conf_path(flat_folder)
111
        dark_list = self._find_files(dark_folder, "/*dark*")
112
        flat_list = self._find_files(flat_folder, "/*flat*")
113
        offset = self.parameters['row_offset']
114
        data_obj_list = []
115
        for i in order_list:
116
            self.exp.meta_data.set('data_file', file_list[i])
117
            # update darks and flats
118
            if dark_folder is not None:
119
                nxtomo.parameters['dark'] = [
120
                    dark_list[i], dark_key, dark_scale]
121
            if flat_folder is not None:
122
                nxtomo.parameters['flat'] = [
123
                    flat_list[i], flat_key, flat_scale]
124
125
            nxtomo.setup()
126
            # update preview
127
            if offset[i] != 0:
128
                nxtomo.parameters['preview'] = \
129
                    self._update_preview(nxtomo.parameters['preview'], offset[i])
130
            data_obj_list.append(self.exp.index['in_data']['tomo'])
131
            self.exp.index['in_data'] = {}
132
        return data_obj_list
133
134
    def get_conf_path(self, path):
135
        # For Savu tests
136
        if path.split(os.sep)[0] == 'Savu':
137
            path = tu.get_test_data_path(path.split('/test_data/data/')[1])
138
        return path
139