ZteReadout

Contents

ZteReadout#

class pypulseqpp.sequences.ZteReadout[source]#

Bases: SequenceModule

Continuous-gradient ZTE shell, including its initial and final ramps.

Each view excites on a held gradient, then acquires while slewing toward the next direction. The final view ramps to zero. Generated shells are replayed under shot_rotations; do not rotate individual views again.

Transmit ringdown and receiver dead time leave n_missing central samples. The module reports this gap but does not fill it. Longer TR extends the inter-view slew rather than adding an idle delay.

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

  • rf (RfEvent) – A non-selective pulse, short enough that its bandwidth spans the spoke.

  • fov (float) – Isotropic field of view (m).

  • matrix (int) – Isotropic matrix size.

  • directions (array_like, default=None) – (n_views, 3) unit spoke directions, in the order the shell visits them. When supplied, the four generator arguments below are ignored; by default the shell is generated by calc_projection_shell. An ordering whose steps vary is accepted, but every turn is allotted the duration of the widest step, so the repetition is timed for the largest step throughout.

  • n_views (int, default=None) – Spokes in one shell. Defaults to a Nyquist-matched sphere, ceil(pi * matrix ** 2), split evenly between the shots – so raising n_shots shortens the shell rather than adding spokes.

  • n_shots (int, default=None) – Shells the sphere is split into, each the same one turned about z by 2 * pi / n_shots. It sets the segment length, and playing only some of the shots is angular undersampling. The default balances the two spacings against each other; see step_rad.

  • scheme ({'spiral', 'meridian'}, default='spiral') – Shape of the shell. See calc_projection_shell.

  • oversampling (float, default=2.0) – Radial oversampling: a finer delta_k along the same spoke.

  • readout_bandwidth_hz (float, default=62500.0) – Requested ADC sampling rate (Hz). bandwidth_hz reports the achieved raster-compatible rate. It sets the gradient amplitude too, the spoke being traversed at one sample per delta_k.

  • tr (float, default=None) – Pulse centre to pulse centre (s). None is as short as the widest turn allows. A longer one is spent slewing more gently, not waiting.

  • dead_time_s (float, default=None) – Receiver dead time after the pulse. Defaults to system.adc_dead_time; transmit ringdown is added on top either way.

  • labels (sequence of str, default=None) – Counters emitted on the acquisition block.

Attributes:
  • rf (RfEvent) – The pulse, delayed by the transmit dead time. Non-selective, and short: it plays on a gradient, so its bandwidth has to cover the whole spoke.

  • g_ramp (list of GradEvent) – Zero to the first view’s direction, played once at the head of a shell. One event per axis.

  • g_hold (list of list of GradEvent) – Per view, the plateau the pulse runs on, held through the dead-time gap.

  • g_read (list of list of GradEvent) – Per view, the plateau under the acquisition and then the turn onto the next view. The last entry slews to zero instead, ending the shell.

  • adc (AdcEvent) – The acquisition, delayed past the gap.

  • adc_labels (LabelSetEvent or list of LabelSetEvent) – One per name in labels; a bare event when there is one.

  • shot_rotations (numpy.ndarray) – (n_shots, 3, 3), the rotation about z that maps the shell onto each shot’s spoke directions. Published only when the module generated the shell, not when directions is supplied.

  • directions (numpy.ndarray) – (n_views, 3), the spoke directions of one shell, in play order.

  • step_rad (float) – The widest angle between consecutive views. Every turn between views is allotted the duration of this step, so a shell with equal steps has no unused turn time.

  • tr (float) – Pulse centre to pulse centre (s).

  • view_duration (float) – Plateau held for one view, before the turn (s).

  • n_samples, n_missing, n_nominal (int) – Samples acquired, lost to the gap, and the full half-spoke.

  • gap (float) – Pulse centre to the first sample (s).

  • bandwidth_hz (float) – Achieved ADC sampling rate (Hz).

  • delta_k (float) – Radial k-space step (1/m).

  • kmax (float) – Half-spoke extent (1/m).

Raises:

ValueError – If a count is out of range, the pulse is too long for the dwell, the dead-time gap covers the whole spoke, two consecutive views coincide, or the requested TR is shorter than the turn needs.

Examples

>>> import pypulseqpp.sequences as design
>>> import pypulseqpp as pp
>>> system = pp.Opts()
>>> hard = design.NonSelectiveExcitation(system, 4.0, duration_s=10e-6)
>>> zte = design.ZteReadout(
...     system, hard.rf, fov=0.24, matrix=96, n_views=64, n_shots=256
... )
>>> len(zte.g_read), zte.shot_rotations.shape
(64, (256, 3, 3))
>>> zte.n_samples + zte.n_missing == zte.n_nominal
True
../_images/pypulseqpp-sequences-ZteReadout-1_00.svg

(svg)#

../_images/pypulseqpp-sequences-ZteReadout-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.

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.