def grid2D(data, coords, weights, kernel, out_dims, number_threads=8): # data: np.float32 # coords: np.complex64 # weights: np.float32 # kernel: np.float64 # outdims = [nr_coils, extra_dim2, extra_dim1, mtx_xy, mtx_xy]: int import bni.gridding.grid_kaiser as bni_grid [nr_coils, extra_dim2, extra_dim1, mtx_xy, nr_arms, nr_points] = out_dims # threading is done along the coil dimension. Limit the number of threads to the number of coils: if number_threads > nr_coils: number_threads = nr_coils # make number_threads a divider of nr_coils: while (nr_coils%number_threads != 0): number_threads -= 1 # off-center in pixels. dx = dy = 0. # gridded kspace gridded_kspace = np.zeros([nr_coils, extra_dim2, extra_dim1, mtx_xy, mtx_xy], dtype=data.dtype) # tell the grid routine what shape to produce outdim = np.array([mtx_xy,mtx_xy,nr_coils], dtype=np.int64) # coordinate dimensions if coords.shape[0] == 1: same_coords_for_all_slices_and_dynamics = True else: same_coords_for_all_slices_and_dynamics = False # grid all slices dx = dy = 0. for extra1 in range(extra_dim1): if same_coords_for_all_slices_and_dynamics: extra1_coords = 0 else: extra1_coords = extra1 for extra2 in range(extra_dim2): #for coil in range(nr_coils): gridded_kspace[:,extra2,extra1,:,:] = bni_grid.grid(coords[extra1_coords,:,:,:], data[:,extra2,extra1,:,:], weights[extra1_coords,:,:], kernel, outdim, dx, dy, numThreads=number_threads) return gridded_kspace
def rolloff2D(mtx_xy, kernel, clamp_min_percent=5): # mtx_xy: int import numpy as np import bni.gridding.grid_kaiser as gd # grid one point at k_0 dx = dy = 0.0 coords = np.array([0,0], dtype='float32') data = np.array([1.0], dtype='complex64') weights = np.array([1.0], dtype='float32') outdim = np.array([mtx_xy, mtx_xy],dtype=np.int64) # grid -> fft -> |x| out = np.abs(fft2D(gd.grid(coords, data, weights, kernel, outdim, dx, dy))) # clamp the lowest values to a percentage of the max clamp = out.max() * clamp_min_percent/100.0 out[out < clamp] = clamp # invert return 1.0/out
def grid2D(data, coords, weights, kernel, out_dims): # data: np.float32 # coords: np.complex64 # weights: np.float32 # kernel: np.float64 # outdims = [nr_coils, extra_dim2, extra_dim1, mtx_xy, mtx_xy]: int import bni.gridding.grid_kaiser as bni_grid [nr_coils, extra_dim2, extra_dim1, mtx_xy, nr_arms, nr_points] = out_dims # off-center in pixels. dx = dy = 0. # gridded kspace gridded_kspace = np.zeros([nr_coils, extra_dim2, extra_dim1, mtx_xy, mtx_xy], dtype=data.dtype) # tell the grid routine what shape to produce outdim = np.array([mtx_xy,mtx_xy], dtype=np.int64) # coordinate dimensions if coords.shape[0] == 1: same_coords_for_all_slices_and_dynamics = True else: same_coords_for_all_slices_and_dynamics = False # grid all slices dx = dy = 0. for extra1 in range(extra_dim1): if same_coords_for_all_slices_and_dynamics: extra1_coords = 0 else: extra1_coords = extra1 for extra2 in range(extra_dim2): for coil in range(nr_coils): gridded_kspace[coil,extra2,extra1,:,:] = bni_grid.grid(coords[extra1_coords,:,:,:], data[coil,extra2,extra1,:,:], weights[extra1_coords,:,:], kernel, outdim, dx, dy) return gridded_kspace