'''Demo of Non-Cartesian GRAPPA.''' import numpy as np import matplotlib.pyplot as plt from phantominator import radial, kspace_shepp_logan from pygrappa import ttgrappa from utils import gridder if __name__ == '__main__': # Simulate a radial trajectory sx, spokes, nc = 128, 128, 8 kx, ky = radial(sx, spokes) # We reorder the samples like this for easier undersampling later kx = np.reshape(kx, (sx, spokes)).flatten('F') ky = np.reshape(ky, (sx, spokes)).flatten('F') # Sample Shepp-Logan at points (kx, ky) with nc coils: kspace = kspace_shepp_logan(kx, ky, ncoil=nc) k = kspace.copy() # Get some calibration data -- ideally we would want to simulate # something other than the image we're going to reconstruct, but # since this is just proof of concept, we'll go ahead cx = kx.copy() cy = ky.copy() calib = k.copy() # calib = np.tile(calib[:, None, :], (1, 2, 1)) calib = calib[:, None, :] # middle axis is the through-time dim
from pygrappa import grog, radialgrappaop if __name__ == '__main__': # Make sure we have the primefac-fork try: import primefac # pylint: disable=W0611 except ImportError: raise ImportError('Need to install fork of primefac: ' 'https://github.com/elliptic-shiho/' 'primefac-fork') # Radially sampled Shepp-Logan N, spokes, nc = 288, 72, 8 kx, ky = radial(N, spokes) kx = np.reshape(kx, (N, spokes), 'F').flatten() ky = np.reshape(ky, (N, spokes), 'F').flatten() k = kspace_shepp_logan(kx, ky, ncoil=nc) k = whiten(k) # whitening seems to help conditioning of Gx, Gy # Put in correct shape for radialgrappaop k = np.reshape(k, (N, spokes, nc)) kx = np.reshape(kx, (N, spokes)) ky = np.reshape(ky, (N, spokes)) # Get the GRAPPA operators! t0 = time() Gx, Gy = radialgrappaop(kx, ky, k) print('Gx, Gy computed in %g seconds' % (time() - t0))