def shift3d(data, vt=0.0, ht=0.0, crop=True, _map=map): ''' Shift 2-D all images vt: float or sequence ht: float or sequence ''' if not isvector(vt): vt_val = vt vt = np.empty(data.shape[0], dtype=data.dtype) vt.fill(vt_val) if not isvector(ht): ht_val = ht ht = np.empty(data.shape[0], dtype=data.dtype) ht.fill(ht_val) pos = np.vstack((vt, ht)).T map_obj = _map(ndshift, data, pos) ret = fromiter(map_obj) if crop: return ret[np.index_exp[:]+crop_index(vt)+crop_index(ht)] else: return ret
def valign(data, _map=map): ''' data: 3d volume data (0:2pi, top:bottom, left:right) ''' map_obj = _map(corr2d, data, data[1:]) res = fromiter(map_obj, dtype=data.dtype) res = np.cumsum(res.T[0]) res = -1.0 * np.insert(res, 0, 0) return res
def valign2(data, _map=map): ''' intensity sum ''' d = np.sum(np.abs(data), axis=2) # axis 2 is left-right map_obj = _map(corr1d, d, d[1:]) res = fromiter(map_obj, dtype=data.dtype) res = np.cumsum(res) res = -1.0 * np.insert(res, 0, 0) return res
def shift2d(data, t=0.0): ''' t: float or sequence ''' ret = None if isvector(t): map_obj = map(ndshift, data, t) ret = fromiter(map_obj) else: ret = ndshift(data, (0.0, t)) return ret
def center(data, bg, _map=map): ''' Deprecated. ''' if len(bg.shape) == 3: _bg = np.average(bg, axis=0) elif len(bg.shape) == 2: _bg = bg else: raise TypeError('background should be 2d or 3d array') map_obj = _map(lambda im: corr2d(_bg, im), data) return fromiter(map_obj, dtype=data.dtype)
def power(data, index, _map=map): ''' data: index: index_exp. 2d. empty. return normalised data ''' # index must be tuple if np.prod(data[np.index_exp[:] + index].shape) == 0: raise ValueError('Cannot average. array shape') map_obj = map(np.average, data[np.index_exp[:] + index]) iavg = fromiter(map_obj, dtype=data.dtype) # intensity average of each image iavg = iavg - np.average(iavg) # distance from all average return iavg
def norm_all(data, bg, dk=None, beam_power=None, beam_center=None, crop=True, _map=map): ''' data: 3d bg: 2d dk: 2d beam_power: sequence of intensity values beam_center: sequence of [(yt0, xt0), (yt1, xt1) ...] ''' data.flags.writeable = False bg.flags.writeable = False if dk is not None: dk.flags.writeable = False normfunc = set_normfunc(bg, dk=dk) bp = [None]*data.shape[0] if beam_power is None else beam_power bc = [None]*data.shape[0] if beam_center is None else beam_center map_obj = _map(normfunc, data, bp, bc) res = fromiter(map_obj, dtype=data.dtype) if beam_center is not None and crop: return res[np.index_exp[:]+crop_index(bc.T[0])+crop_index(bc.T[1])] else: return res
def recon3d(sinograms, method='fbp', _map=map): mapobj = _map(lambda sg: iradon(sg.T, circle=True), sinograms) return fromiter(mapobj)