Source code for savu.data.data_structures.data_types.map_3dto4d_h5

# 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:: map_3dto4d_h5
   :platform: Unix
   :synopsis: A module for loading a 3D hdf5 dataset that contains a set of \
       4D scans.

.. moduleauthor:: Nicola Wadeson <scientificsoftware@diamond.ac.uk>

"""

import numpy as np

from savu.data.data_structures.data_types.base_type import BaseType


[docs]class Map3dto4dh5(BaseType): """ This class converts a 3D dataset to a 4D dataset. """ def __init__(self, data_obj, n_angles): self.data_obj = data_obj self.data = data_obj.data self.n_angles = n_angles shape = self.data.shape super(Map3dto4dh5, self).__init__() import inspect if inspect.isclass(type(self.data)): self.add_base_class_with_instance(type(self.data), self.data) new_shape = (n_angles, shape[1], shape[2], shape[0] // n_angles) self.shape = new_shape
[docs] def clone_data_args(self, args, kwargs, extras): args = ['self', 'n_angles'] return args, kwargs, extras
def __getitem__(self, idx): rot_dim = \ self.data_obj.get_data_dimension_by_axis_label('rotation_angle') n_angles = self.shape[rot_dim] idx_dim3 = np.arange(idx[3].start, idx[3].stop, idx[3].step) idx_dim0 = np.arange(idx[0].start, idx[0].stop, idx[0].step) idx_dim0 = np.ravel(idx_dim3.reshape(-1, 1)*n_angles + idx_dim0) size = [len(np.arange(i.start, i.stop, i.step)) for i in idx] data = np.empty(size) change = np.where(idx_dim0[:-1] // n_angles != idx_dim0[1:] // n_angles)[0] start = idx_dim0[np.append(0, change+1)] stop = idx_dim0[np.append(change, len(idx_dim0)-1)] + 1 length = stop - start for i in range(len(start)): new_slice = (slice(start[i], stop[i], idx[0].step), idx[1], idx[2]) data[0:length[i], :, :, i] = self.data[new_slice] return data
[docs] def get_shape(self): return self.shape