Source code for mrinufft.operators.interfaces.pynufft_cpu

"""PyNUFFT CPU Interface."""

from ..base import FourierOperatorCPU
from mrinufft._utils import proper_trajectory

PYNUFFT_CPU_AVAILABLE = True
try:
    import pynufft
except ImportError:
    PYNUFFT_CPU_AVAILABLE = False


[docs] class RawPyNUFFT: """Wrapper around PyNUFFT object.""" def __init__(self, samples, shape, osf=2, interpolator_shape=6): self._nufft_obj = pynufft.NUFFT() self._nufft_obj.plan( samples, shape, tuple(osf * s for s in shape), tuple([interpolator_shape] * len(shape)), )
[docs] def op(self, coeffs_data, grid_data): """Forward Operator.""" coeffs_data = self._nufft_obj.forward(grid_data.squeeze()) return coeffs_data
[docs] def adj_op(self, coeffs_data, grid_data): """Adjoint Operator.""" grid_data = self._nufft_obj.adjoint(coeffs_data.squeeze()) return grid_data
[docs] class MRIPynufft(FourierOperatorCPU): """PyNUFFT implementation of MRI NUFFT transform.""" backend = "pynufft-cpu" available = PYNUFFT_CPU_AVAILABLE def __init__( self, samples, shape, density=False, n_coils=1, n_batchs=1, smaps=None, osf=2, **kwargs, ): super().__init__( proper_trajectory(samples, normalize="pi"), shape, density=density, n_coils=n_coils, n_batchs=n_batchs, n_trans=1, smaps=smaps, ) self.raw_op = RawPyNUFFT(self.samples, shape, osf, **kwargs)
# @property # def norm_factor(self): # """Normalization factor of the operator.""" # return np.sqrt(2 ** len(self.shape))