3D Cartesian MPRAGE#

Open in Colab

An inversion preparation is followed after the prescribed inversion delay by a train of low-flip-angle spoiled Cartesian gradient echoes. The inversion time is measured to the first excitation centre; the corresponding central ADC sample occurs one TE later. The ordering assigns recovery times within each inversion cycle to (line, partition) views. MPRAGE is used for high-resolution 3D T1-weighted structural imaging.

Timing structure#

Each cycle comprises inversion, crusher, inversion delay, spoiled gradient-echo train and recovery interval. ti=None and tr=None take the shortest inversion time and recovery supported by the modules. Four lines per partition provide a compact timing diagram. Clinical matrices typically require inversion times of several hundred milliseconds and much longer readout trains.

from pypulseqpp.sequences import mprage3D_sequence

compact = mprage3D_sequence(n_x=128, n_y=4, n_z=4, ti=None, tr=None, n_dummy=0)
print(
    f"{compact.num_blocks} blocks, {compact.duration()[0]:.2f} s, "
    f"TI {compact.get_definition('TI')[0] * 1e3:.0f} ms, "
    f"TR {compact.get_definition('TR')[0] * 1e3:.0f} ms"
)
80 blocks, 0.16 s, TI 8 ms, TR 41 ms
mprage3D sequence

Sampling order#

At a protocol matrix, each inversion cycle acquires the sampled lines of one partition: the inversion cycle is constant along each row of the map, and the index within the train runs outward from the centre of the line axis. The centre of k-space is therefore the first view in a train. TI is measured from the inversion-pulse centre to that view’s excitation-pulse centre; the central ADC sample occurs one echo time later, at TI + TE. Peripheral lines are acquired later in the recovery.

protocol = mprage3D_sequence(n_x=192, n_y=128, n_z=24, ti=0.9, tr=2.3, n_dummy=0)
print(
    f"{protocol.duration()[0]:.1f} s, "
    f"{int(np.asarray(protocol.evaluate_labels(evolution='adc')['ECO']).max()) + 1} "
    "readouts in the longest train, "
    f"central ADC at {(protocol.get_definition('TI')[0] + protocol.get_definition('TE')[0]) * 1e3:.1f} ms"
)
mprage3D sequence
55.2 s, 128 readouts in the longest train, central ADC at 904.0 ms

Accelerated sampling#

ry and rz subsample the line and partition axes. caipi_shift offsets the sampled partitions between adjacent lines to control the alias distribution. Fewer lines per partition reduce both train duration and the range of inversion-recovery weighting. Scan duration equals the number of inversion cycles multiplied by TR; the fully sampled calibration region still requires every partition.

accelerated = mprage3D_sequence(
    n_x=192, n_y=128, n_z=24, ry=2, rz=2, caipi_shift=1, ti=0.9, tr=2.3, n_dummy=0
)
mprage3D sequence
                 views   cycles  per train  scan (s)
1 x 1             2391       24       99.6      55.2
2 x 2, shift 1     883       24       36.8      55.2

Total running time of the script: (0 minutes 0.808 seconds)

Gallery generated by Sphinx-Gallery