NonCartesianReadout

NonCartesianReadout#

class pypulseqpp.sequences.NonCartesianReadout[source]#

Bases: SequenceModule

A solved interleaf with its prewinder, rewinder and repetition-time budget.

Nonzero k-space endpoints require prewinder or rewinder blocks. trajectory is any two-channel NonCartesianGradient; the spiral and rosette readouts design theirs. The acquisition loop controls per-shot orientation.

A compact layout reuses one base arm for any arm index; the acquisition loop supplies its rotation. An explicit layout stores each arm separately.

Parameters:
  • system (Opts) – System limits.

  • rf (RfEvent) – The pulse that opens the repetition.

  • gz (GradEvent, default=None) – A selection gradient played in the same block as rf.

  • gz_reph (GradEvent, default=None) – The rephaser that unwinds gz, played left-aligned in the first block after the pulse. Accepted only on an axis that the loop’s rotation leaves unchanged.

  • trajectory (NonCartesianGradient) – Solved gradient interleaf with its ADC, prewinder and rewinder.

  • fov_z (float, default=None) – Partition field of view (m). Stacks only.

  • matrix_z (int, default=None) – Partition count. Stacks only.

  • te (float, default=None) – Echo time (s) from the RF isodelay to the path’s nearest k = 0 crossing. None is as short as possible.

  • tr (float, default=None) – Repetition time (s). None is as short as possible.

  • spoiling_cycles (float, default=0.0) – Dephasing left at the end of the TR, in cycles across voxel_size_m. Zero leaves the path rewound.

  • voxel_size_m (float, default=None) – Length the spoiling is counted over (m); the trajectory’s resolution by default.

  • spoiling_axis ({'z', 'x', 'y'}, default='z') – Axis the spoiler is played on.

  • n_echoes (int, default=1) – Path traversals per repetition, separated by echo_spacing, each with its own ECO label and joined by rewinders and prewinders.

  • explicit (bool, default=False) – Write out one interleaf per entry of angles instead of one base interleaf.

  • angles (ArrayLike, default=None) – In-plane rotations (rad). Required when explicit and rejected otherwise.

  • labels (Sequence[str], default=None) – Counters emitted on the acquisition block.

  • trigger (TriggerEvent, default=None) – A trigger or digital output armed on the block that opens the readout.

Attributes:
  • rf (RfEvent) – The pulse the module was given.

  • gz (GradEvent) – Its selection gradient, if one was given.

  • gz_reph (GradEvent) – Its rephaser, if one was given, left-aligned in whichever block follows the pulse.

  • gx, gy (GradEvent) – The interleaf. Lists of one entry per angle when explicit.

  • gx_pre, gy_pre (GradEvent) – Prewinding gradients reaching the start of the path, when it is not k = 0.

  • gx_rew, gy_rew (GradEvent) – Rewinding gradients returning to k = 0, when the path does not end there.

  • gz_pre, gz_rew (TrapEvent) – Partition encode and its rewinder. Stacks only.

  • gz_spoil (GradEvent) – End-of-TR spoiler, when spoiling_cycles is nonzero.

  • adc (AdcEvent) – The acquisition window.

  • adc_labels (LabelEvent | list[LabelEvent]) – One per name in labels; a bare event when there is one.

  • wait_te, wait_tr (DelayEvent) – Present only when a TE or TR longer than the minimum was asked for.

  • wait_pre, wait_rew (DelayEvent) – Pads setting the span of the prewinder and rewinder blocks, which can outlast their gradients. Absent when that block is not played.

  • trajectory (NonCartesianGradient) – The designed interleaf, for its trajectory array and timings.

  • echo_spacing (float) – Time between consecutive echoes (s), zero for a single-echo readout.

Examples

>>> import numpy as np
>>> import pypulseqpp.sequences as design
>>> import pypulseqpp as pp
>>> system = pp.Opts()
>>> excitation = design.SpatialSelectiveExcitation(system, 15.0, 5e-3)
>>> kmax = 64 / (2 * 0.22)
>>> spoke = np.column_stack([np.linspace(-kmax, kmax, 64), np.zeros(64)])
>>> readout = design.NonCartesianReadout(
...     system, excitation.rf, excitation.gz, excitation.gz_reph,
...     trajectory=design.Arbitrary(system, spoke, matrix=64),
... )
>>> int(readout.adc.num_samples)
64

A single spoke supplied as an Arbitrary trajectory, played in the block layout the readout lays out around it:

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

(svg)#

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

(svg)#

Methods

arm

Block layout of one arm, as the module built it.

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.