Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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