deepmr.rosette_proj

Contents

deepmr.rosette_proj#

deepmr.rosette_proj(shape, nviews=None, bending_factor=1.0, order='ga')[source]#

Design a 3D rosette projection trajectory.

The trajectory consists of a 2D rosette 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 petals (in-plane, radial). The default is $\pi$ * (shape[0], shape[1]) if shape[2] == 1, otherwise it is ($\pi$ * shape[0], 1).

  • bending_factor (float, optional) – This is 0.0 for radial-like trajectory; increase for maximum coverage per shot. In real world, must account for hardware and safety limitations. The default is 1.0.

  • order (str, optional) –

    Rosette 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.

Returns:

head – Acquisition header corresponding to the generated sampling pattern.

Return type:

Header

Example

>>> import deepmr

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

>>> head = deepmr.rosette_proj(128)

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

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

Petals bending can be modified via bending_factor:

>>> head = deepmr.rosette_proj(128, bending_factor=1.0) # radial-like trajectory

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.rosette_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.rosette_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.