deepmr.spiral_proj#
- deepmr.spiral_proj(shape, accel=None, nintl=1, order='ga', **kwargs)[source]#
Design a constant- or multi-density spiral projection.
The trajectory consists of a 2D spiral, 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)
.accel (Iterable[int], optional) – Acceleration factors
(in-plane, radial)
. Range from1
(fully sampled) tonintl
/$\pi$ * shape[0]
. The default is(1, 1)
ifncontrast == 1
and(1, ``$\pi$ * shape[0])
ifncontrast > 1
.nintl (int, optional) – Number of interleaves to fully sample a plane. The default is
1
.order (str, optional) –
Spiral plane rotation type. These can be:
ga
: Pseudo golden angle variation of periodicity377
.ga::multiaxis
: Pseudo golden angle, i.e., same asga
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 asga-sh
but views are repeated 3 times on orthogonal axes.
The default is
ga
.
- Keyword Arguments:
moco_shape (int) – Matrix size for inner-most (motion navigation) spiral. The default is
None
.acs_shape (int) – Matrix size for intermediate inner (coil sensitivity estimation) spiral. The default is
None
.acs_nintl (int) – Number of interleaves to fully sample intermediate inner spiral. The default is
1
.variant (str) –
Type of spiral. Allowed values are:
center-out
: starts at the center of k-space and ends at the edge (default).reverse
: starts at the edge of k-space and ends at the center.in-out
: starts at the edge of k-space and ends on the opposite side (two 180° rotated arms back-to-back).
- Returns:
head – Acquisition header corresponding to the generated spiral.
- Return type:
Header
Example
>>> import deepmr
We can create a single-shot spiral projection for a matrix of
(128, 128, 128)
voxels by:>>> head = deepmr.spiral_proj(128)
An in-plane multi-shot trajectory can be generated by specifying the
nintl
argument:>>> head = deepmr.spiral_proj(128, nintl=48)
Both spirals have constant density. If we want a dual density we can use
acs_shape
andacs_nintl
arguments. For example, if we want an inner(32, 32)
k-space region sampled with a 4 interleaves spiral, this can be obtained as:>>> head = deepmr.spiral_proj(128, nintl=48, acs_shape=32, acs_nintl=4)
This inner region can be used e.g., for Parallel Imaging calibration. Similarly, a triple density spiral can be obtained by using the
moco_shape
argument:>>> head = deepmr.spiral_proj(128, nintl=48, acs_shape=32, acs_nintl=4, moco_shape=8)
The generated spiral will have an innermost
(8, 8)
single-shot k-space region (e.g., for PROPELLER-like motion correction), an intermediate(32, 32)
k-space region fully covered by 4 spiral shots and an outer(128, 128)
region fully covered by 48 interleaves.In-plane acceleration can be specified using the
accel
argument. For example, the following>>> head = deepmr.spiral_proj(128, nintl=48, accel=4)
will generate the following trajectory:
>>> head.traj.shape torch.Size([1, 4824, 538, 2])
i.e., a 48-interleaves trajectory with an in-plane acceleration factor of 4 (i.e., 12 interleaves), repeated for 402 planes covering the 3D k-space sphere.
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.spiral_proj((128, 420), nintl=48) >>> head.traj.shape torch.Size([420, 48, 538, 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.spiral_proj((128, 1, 8), nintl=48) >>> head.traj.shape torch.Size([8, 19296, 538, 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)
inms
. 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, 3)
.
- 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.