deepmr.radial_proj

Contents

deepmr.radial_proj#

deepmr.radial_proj(shape, nviews=None, order='ga', **kwargs)[source]#

Design a 3D radial projectiontrajectory.

The trajectory consists of a 2D radial trajectory, whose plane is rotated to cover the 3D k-space. In-plane rotations are sequential. Plane rotation types are specified via the order argument.

Parameters:
  • shape (Iterable[int]) – Matrix shape (in-plane, contrasts=1, echoes=1).

  • nviews (int, optional) – Number of spokes (in-plane, radial). The default is $\pi$ * (shape[0], shape[1]) if shape[2] == 1, otherwise it is ($\pi$ * shape[0], 1).

  • order (str, optional) –

    Radial plane rotation type. These can be:

    • ga: Pseudo golden angle variation of periodicity 377.

    • ga::multiaxis: Pseudo golden angle, i.e., same as ga but views are repeated 3 times on orthogonal axes.

    • ga-sh: Shuffled pseudo golden angle.

    • ga-sh::multiaxis: Multiaxis shuffled pseudo golden angle, i.e., same as ga-sh but views are repeated 3 times on orthogonal axes.

    The default is ga.

Keyword Arguments:

variant (str) –

Type of radial trajectory. Allowed values are:

  • fullspoke: starts at the edge of k-space and ends on the opposite side (default).

  • center-out: starts at the center of k-space and ends at the edge.

Returns:

head – Acquisition header corresponding to the generated sampling pattern.

Return type:

Header

Example

>>> import deepmr

We can create a Nyquist-sampled 3D radial trajectory for a matrix of (128, 128, 128) voxels by:

>>> head = deepmr.radial_proj(128)

An undersampled trajectory can be generated by specifying the nviews argument:

>>> head = deepmr.radial_proj(128, nviews=64)

Multiple contrasts with different sampling (e.g., for MR Fingerprinting) can be achieved by providing a tuple of ints as the shape argument:

>>> head = deepmr.radial_proj((128, 420))
>>> head.traj.shape
torch.Size([420, 402, 128, 2])

corresponding to 420 different contrasts, each sampled with a different fully sampled plane. Similarly, multiple echoes (with fixed sampling) can be specified as:

>>> head = deepmr.radial_proj((128, 1, 8))
>>> head.traj.shape
torch.Size([8, 161604, 128, 2])

corresponding to a 8-echoes fully sampled k-spaces, e.g., for QSM and T2* mapping.

Notes

The returned head (deepmr.Header()) is a structure with the following fields:

  • shape (torch.Tensor):

    This is the expected image size of shape (nz, ny, nx).

  • t (torch.Tensor):

    This is the readout sampling time (0, t_read) in ms. with shape (nsamples,).

  • traj (torch.Tensor):

    This is the k-space trajectory normalized as (-0.5 * shape, 0.5 * shape) with shape (ncontrasts, nviews, nsamples, 2).

  • dcf (torch.Tensor):

    This is the k-space sampling density compensation factor with shape (ncontrasts, nviews, nsamples).

  • TE (torch.Tensor):

    This is the Echo Times array. Assumes a k-space raster time of 1 us and minimal echo spacing.