make_2d_selective_pulse

make_2d_selective_pulse#

pypulseqpp.make_2d_selective_pulse()[source]#

Design a small-tip 2D-selective pulse on a spiral excitation trajectory.

Each centre-out interleaf is followed by an RF-off retrace to the origin. The envelope uses arc-length weighting, without an additional radial density factor. The closed trajectory requires no separate rephaser.

Parameters:
  • flip_angle (float) – Nominal flip angle (rad), reached at the centre of the excited region.

  • fov (float) – Excitation field of view (m), square; the profile repeats with period fov.

  • matrix (int) – Excitation grid size, square; sets the trajectory’s k-space extent.

  • selective_size (float or sequence of float, default=None) – Diameter (m) of the excited disc, one value or one per axis. Half the field of view by default.

  • target (numpy.ndarray, default=None) – Complex desired profile on the (matrix, matrix) grid, instead of a disc.

  • n_interleaves (int, default=None) – Spiral arms to play. The default covers excitation k-space at the Nyquist spacing. Fewer arms shorten the pulse and reduce the alias-free excitation FOV.

  • axes (sequence of str, default=('x', 'y')) – The two gradient channels the trajectory runs on.

  • b1_maps (array_like, default=None) – Complex B1+ per transmit channel, (num_channels, matrix, matrix), relative to nominal. When given, the pulse is designed in the spatial domain against them (Grissom et al., Magn Reson Med 56:620, 2006) and returned as a pTx pulse, one waveform per channel, whose small-tip flip is flip_angle times the target; a single channel is a pulse tailored to that channel’s B1.

  • off_resonance (array_like, default=None) – Off-resonance map, (matrix, matrix), in Hz, for the spatial-domain design.

  • magnitude_only (bool, default=False) – Fit only the target’s magnitude in the spatial-domain design, leaving its phase free (magnitude least squares).

  • regularization (float, default=0.0) – Tikhonov weight on the waveforms’ power in the spatial-domain design.

  • system (pypulseqpp.Opts, default=None) – System limits.

  • use (str, default='excitation') – Pulseq use tag.

  • freq_offset (float, default=0.0) – Event offsets in Hz and radians, respectively.

  • phase_offset (float, default=0.0) – Event offsets in Hz and radians, respectively.

Returns:

  • rf (RfEvent) – The pulse, sampled on the gradient raster; a pTx pulse when b1_maps is given.

  • gradients (tuple of GradEvent) – One arbitrary gradient per axis with a nonzero waveform, delayed with rf, to be played in the pulse’s block.

  • rephasers (tuple of TrapEvent) – A trapezoid for each axis left with net area; empty for the closed spiral trajectory.

Raises:

ValueError – If a size is out of range, target does not match matrix, or the requested profile has no response on the trajectory.

Examples

>>> import numpy as np
>>> import pypulseqpp as pp
>>> system = pp.Opts(max_grad=40, grad_unit="mT/m", max_slew=150, slew_unit="T/m/s")
>>> rf, gradients, rephasers = pp.make_2d_selective_pulse(
...     np.deg2rad(30), fov=0.256, matrix=32, selective_size=0.04, system=system
... )
>>> [gradient.channel for gradient in gradients], len(rephasers)
(['x', 'y'], 0)

Half the arms is half the pulse:

>>> short, _, _ = pp.make_2d_selective_pulse(
...     np.deg2rad(30), fov=0.256, matrix=32, selective_size=0.04,
...     n_interleaves=8, system=system,
... )
>>> round(float(short.shape_dur) / float(rf.shape_dur), 3)
0.5

See also

make_spsp_pulse

selective in one dimension and in frequency.

sim_rf

check the profile a pulse actually produces.