Conventional 2D spin echo sequence. The image matrix is 256×256. The number of subvoxels is 1×1×4. The total number of subvoxels is 13,572,096. The calculation time was 15.7 s.
TR/TE = 500 ms/12 ms (T1 weighted) TR/TE = 500 ms/96 ms
TR/TE = 4800ms/12ms (PD weighted) TR/TE = 4800ms/96ms (T2 weighted)
Pulse sequence chart visualized by the SequenceViewer:
One data acquisition sequence. TR = 500 ms, TE = 12 ms.
Entire pulse sequence. Moire pattern is visualized because of the interference between screen resolution and the repeating pulse sequence.
Python sequence code:
from psdk import * import numpy as np gamma = 42.57747892 # [MHz/T] TR = 500.0e+3 # [us] TE = 12.0e+3 # [us] NR = 256 # Number of readout points NPE1 = 256 # Number of 1st phase encoding fov = [220.0, 220.0, 256.0] # [mm] dwell_time = 10.0 # [us] slice_width = 5.0 # [mm] gx_value = 1e+6 / (dwell_time * gamma * fov[0]) # [mT/m] gy_value = 2e+6 / (dwell_time * gamma * fov[1]) * NPE1 / NR # [mT/m] gz_value = 2.5 / (slice_width * 1.0e-3) / gamma # [mT/m] gx_rt = 300.0 # [us] gx_rise_time gy_rt = 300.0 # [us] gy_rise_time gz_rt = 300.0 # [us] gz_rise_time PW = 1600.0 # [us] ex_pulse_flip_angle = 90.0 # [degree] def sinc_with_hamming(flip_angle, pulse_width, points, *, min = -2.0 * np.pi, max = 2.0 * np.pi): x0 = np.arange(min, max, (max - min) / points) x1 = x0 + (max - min) / points y = (np.sinc(x0 / np.pi) + np.sinc(x1 / np.pi)) * 0.5 * np.hamming(points) return flip_angle * y * points / (y.sum() * pulse_width * 360.0e-6 * gamma) with Sequence('2D SpinEcho'): with Block('Excitation', PW + 2.0 * gz_rt): GZ(0.0, gz_value, gz_rt) RF(gz_rt, sinc_with_hamming(ex_pulse_flip_angle, PW, 160), PW / 160, phase = 0.0) GZ(PW + gz_rt, 0.0, gz_rt) with Block('Slice_refocus+Prephasing', NR // 2 * dwell_time + gx_rt * 2.0 ): GX(0.0, gx_value, gx_rt) GX(NR * dwell_time, 0.0, gx_rt) GZ(0.0, -gz_value, gz_rt) GZ(PW * 0.5 + gz_rt, 0.0, gz_rt) with Block('Refocus', PW + 2.0 * gz_rt): GZ(0.0, gz_value, gz_rt) RF(gz_rt, sinc_with_hamming(180, PW, 160), PW / 160, phase = 0.5 * np.pi) GZ(PW + gz_rt, 0.0, gz_rt) with Block('Phase_encoding+Acquisition', TE/2 + NR * dwell_time - PW * 0.5 - gz_rt + gy_rt): GY(0.0, ([gy_value * (i - NPE1 // 2) / NPE1 for i in range(NPE1)], ['PE1']), gy_rt) GY(NR // 2 * dwell_time, 0.0, gy_rt) GX(TE/2 - PW * 0.5 - gz_rt - NR * dwell_time - 0.5 * gx_rt, gx_value, gx_rt) AD(TE/2 - PW * 0.5 - gz_rt - NR // 2 * dwell_time, NR, dwell_time) GX(TE/2 - PW * 0.5 - gz_rt + NR * dwell_time + gx_rt * 0.5, 0, gx_rt) with Main(): with Loop('PE1', NPE1): BlockRef('Excitation') BlockRef('Slice_refocus+Prephasing') WaitUntil(TE/2 - 2.0 * gz_rt) BlockRef('Refocus') BlockRef('Phase_encoding+Acquisition') WaitUntil(TR)