48 shot spiral images are as follows:
The gradient waveform is as follows:
The pulse sequence is as follows:
from psdk import * import numpy as np gamma = 42.57747892 # [MHz/T] TR = 40000.0e+3 # [us] TE = 4.0e+3 # [us] NR = 1495 # Number of readout points NSHOT = 48 # Number of shots fov = [256.0, 256.0, 256.0] # [mm] dwell_time = 5.0 # [us] slice_width = 6.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 = 1.25 / (slice_width * 1.0e-3) / gamma # [mT/m] gx_rise_time = 300.0 # [us] gy_rise_time = 300.0 # [us] gz_rise_time = 300.0 # [us] excitation_pulse_width = 1600.0 # [us] excitation_pulse_flip_angle = 90.0 # [degree] gx_waveform = np.fromfile('GX.dbl', dtype=np.float64) gy_waveform = np.fromfile('GY.dbl', dtype=np.float64) 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 Spiral'): with Block('Excitation', excitation_pulse_width + 2.0*gz_rise_time): GZ(0.0, gz_value, gz_rise_time) RF(gz_rise_time, sinc_with_hamming(excitation_pulse_flip_angle, excitation_pulse_width, 160), excitation_pulse_width / 160) GZ(excitation_pulse_width + gz_rise_time, 0.0, gz_rise_time) with Block("Slice_refocus", excitation_pulse_width * 0.5 + gz_rise_time * 2.0) : GZ(0.0, -gz_value, gz_rise_time) GZ(excitation_pulse_width * 0.5 + gz_rise_time, 0.0, gz_rise_time) with Block('Readout', 10240): GX.waveform(0.0, ([gx_waveform[i * 2048:(i+1)*2048:] for i in range(NSHOT)], ['SHOT']), 5.0) GY.waveform(0.0, ([gy_waveform[i * 2048:(i+1)*2048:] for i in range(NSHOT)], ['SHOT']), 5.0) AD(0.0, NR, dwell_time) with Main(): with Loop('SHOT', NSHOT): BlockRef('Excitation') BlockRef('Slice_refocus') WaitUntil(TE) BlockRef('Readout') WaitUntil(TR)