BlochSiegertPreparation

BlochSiegertPreparation#

class pypulseqpp.sequences.BlochSiegertPreparation[source]#

Bases: OffResonanceSaturation

Off-resonance Fermi pulse for Bloch-Siegert B1 mapping.

By default, no spoiler is played, preserving transverse phase between excitation and readout. Calibration constants describe phase per squared RF amplitude.

Parameters:
  • system (Opts) – System limits.

  • freq_offset_hz (float, default=4000.0) – Offset from water (Hz); flip its sign for the second acquisition.

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

  • peak_b1_hz (float, default=500.0) – Plateau amplitude, in Pulseq units.

  • flat_fraction (float, default=0.8) – Fraction of the duration held at peak_b1_hz, in (0, 1).

  • transition_fraction (float, default=0.02) – Width of each shoulder, as a fraction of the duration.

  • dwell_s (float, default=1e-05) – RF raster (s).

  • spoiling_cycles (float, default=0.0) – Cycles of dephasing the closing spoiler winds across voxel_size_m. Zero, the default here, omits the spoiler, for the reason above.

  • n_pulses (int, default=1) – Pulses in the train.

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

  • labels (Sequence[str], default=None) – Counters emitted on the first pulse’s block.

Attributes:
  • rf_prep (RfEvent) – The Fermi pulse.

  • gx_spoil, gy_spoil, gz_spoil (GradEvent) – The closing spoiler, when there is one.

  • prep_labels (LabelEvent | list[LabelEvent]) – One per name in labels.

  • kbs (float) – Phase shift per unit squared Pulseq amplitude (rad).

  • kbs_per_gauss2 (float) – The same constant in rad/G^2.

Raises:

ValueError – If freq_offset_hz is zero, a duration or amplitude is not positive, or the envelope fractions are out of range. If n_pulses is below one, or a spoiling argument is out of range.

References

Sacolick et al., B1 mapping by Bloch-Siegert shift, Magn Reson Med 2010;63:1315-1322, 10.1002/mrm.22357.

Examples

>>> import pypulseqpp.sequences as design
>>> import pypulseqpp as pp
>>> pulse = design.BlochSiegertPreparation(pp.Opts())
>>> len(pulse.blocks), round(pulse.kbs_per_gauss2, 1)
(1, 86.6)

The pulse is placed far enough off resonance to produce a phase shift with a small flip angle; the residual dip at its offset is the saturation that remains at that frequency offset:

../_images/pypulseqpp-sequences-BlochSiegertPreparation-1_00.svg

(svg)#

../_images/pypulseqpp-sequences-BlochSiegertPreparation-1_01.svg

(svg)#

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 without requiring prior block registration.

sim_rf

Simulate this module's pulse across off-resonance.

Attributes

blocks

Return block tuples in play order, retaining the original event objects.

duration

Duration of the module in seconds.

seq

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