make_spsp_pulse

make_spsp_pulse#

pypulseqpp.make_spsp_pulse()[source]#

Design a spectral-spatial pulse on an alternating slice gradient.

Both envelopes are SLR designs; each spatial subpulse is VERSEd onto its whole trapezoid lobe, ramps included. The pulse is scaled to flip_angle by area.

Parameters:
  • flip_angle (float) – Nominal flip angle (rad).

  • slice_thickness (float) – Slice thickness (m).

  • spectral_bandwidth (float) – Spectral passband (Hz).

  • freq_offset (float, default=0.0) – Centre of the spectral passband (Hz).

  • spatial_time_bandwidth_product (float, default=4.0) – Time-bandwidth product of each spatial subpulse.

  • spectral_time_bandwidth_product (float, default=3.0) – Time-bandwidth product of the spectral envelope; sets the total duration as spectral_time_bandwidth_product / spectral_bandwidth.

  • n_subpulses (int, default=10) – Number of subpulses (>= 4, rounded up to even).

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

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

Returns:

  • rf (RfEvent) – The spectral-spatial pulse.

  • gz (GradEvent) – The alternating selection gradient, with the same delay as rf.

  • gz_reph (TrapEvent or None) – A trapezoid of one lobe’s area when an odd number of lobes follows the pulse’s centre, otherwise None.

Raises:

ValueError – If the requested selectivity exceeds the gradient or slew limit, or the spectral bandwidth is too wide for the subpulse count.

Examples

>>> import numpy as np
>>> import pypulseqpp as pp
>>> system = pp.Opts(max_grad=40, grad_unit="mT/m", max_slew=180, slew_unit="T/m/s")
>>> rf, gz, gz_reph = pp.make_spsp_pulse(
...     np.deg2rad(30), slice_thickness=10e-3,
...     spectral_bandwidth=300.0, n_subpulses=12, system=system,
... )
>>> rf.type, gz.channel
('rf', 'z')

See also

make_slr_pulse

the design underneath both of its envelopes.

sim_rf

check the spectral profile the design produces.