SpatialSaturation

SpatialSaturation#

class pypulseqpp.sequences.SpatialSaturation[source]#

Bases: RfModule

Slab-selective saturation pulse in the physical frame, followed by a three-axis spoiler.

The selection gradient points along normal and is split over the gradient channels in proportion to its components. The slab is centred position from the isocentre along normal. NOPOS and NOROT are set on the pulse block and cleared on the spoiler block, so neither a TransformFOV offset nor the prescription rotation moves the band, which stays where it is placed in the physical frame.

Parameters:
  • system (pypulseqpp.Opts) – System limits.

  • normal (array_like of float) – Slab normal (x, y, z) along the physical gradient axes; nonzero, normalised by the module.

  • position (float) – Centre of the slab along normal from the isocentre (m).

  • thickness (float) – Slab thickness along normal (m).

  • flip_angle_deg (float, default=90.0) – Flip angle (degrees).

  • duration_s (float, default=0.003) – Pulse duration (s).

  • time_bw_product (float, default=4.0) – Time-bandwidth product; with the duration and thickness it sets the selection amplitude time_bw_product / (duration_s * thickness) (Hz/m).

  • spoiling_cycles (float, default=4.0) – Cycles of dephasing of each spoiler across voxel_size_m.

  • voxel_size_m (float, default=0.001) – Length the dephasing is counted over (m).

  • labels (sequence of str, default=None) – Labels set to 0 on the pulse block, to be changed per shot by the caller.

Attributes:
  • rf_prep (RfEvent) – The saturation pulse. Its frequency offset is the selection amplitude times position (Hz), and its phase offset makes the phase zero at the pulse centre.

  • gx_sel, gy_sel, gz_sel (GradEvent) – Selection gradient on each channel, gz.amplitude * normal as stored (Hz/m); absent for a channel whose component is zero.

  • gx_spoil, gy_spoil, gz_spoil (GradEvent) – Spoiler gradient of each axis.

  • prep_labels (list of LabelSetEvent) – NOPOS and NOROT set, then one per name in labels, on the pulse block.

  • reset_labels (list of LabelSetEvent) – NOPOS and NOROT cleared, on the spoiler block.

Raises:

ValueError – If normal is the zero vector or not three components, or a thickness, duration, time-bandwidth product, spoiling count or voxel size is not positive.

Examples

>>> import pypulseqpp.sequences as design
>>> import pypulseqpp as pp
>>> band = design.SpatialSaturation(pp.Opts(), (0, 1, 0), 0.05, 0.02)
>>> len(band.blocks)
2
>>> [(event.label, int(event.value)) for event in band.prep_labels]
[('NOPOS', 1), ('NOROT', 1)]

Methods

init_module

Build the module's block layout; implemented by the subclass.

publish

Publish events from the caller's locals and register keyword aliases.

register

Publish named events, whether or not they were added to a block.

sim_rf

Simulate this module's pulse across off-resonance.

Attributes

blocks

Block tuples in play order, holding the original event objects.

duration

Duration of the module (s).

seq

Sequence holding the module's construction-time block layout.