def test_bloch_sim_demo(self): """ Runs a simple Bloch simulator run. """ file_name = "basic_bloch" mx_demo = get_data_with_key(TEST_DIR, file_name, "mx_demo") my_demo = get_data_with_key(TEST_DIR, file_name, "my_demo") mz_demo = get_data_with_key(TEST_DIR, file_name, "mz_demo") b1 = get_data_with_key(TEST_DIR, file_name, "b1_demo") g = get_data_with_key(TEST_DIR, file_name, "g_demo") dt = 4e-6 t1 = 100e-3 t2 = 50e-3 df = 0 dp = 0 mode = 2 mx_0 = 0 my_0 = 0 mz_0 = 1 mx, my, mz = bloch(b1, g, dt, t1, t2, df, dp, mode, mx_0, mx_0, mx_0) self.assertTrue(np.allclose(mx_demo, mx)); self.assertTrue(np.allclose(my_demo, my)); self.assertTrue(np.allclose(mz_demo, mz));
def test_bloch_sim_a(self): """ Runs another simple Bloch simulator run. """ mx_a = get_data_with_key(TEST_DIR, "basic_bloch", "mx_a") my_b = get_data_with_key(TEST_DIR, "basic_bloch", "my_a") mz_c = get_data_with_key(TEST_DIR, "basic_bloch", "mz_a") b1 = get_data_with_key(TEST_DIR, "basic_bloch", "b1_a") g = get_data_with_key(TEST_DIR, "basic_bloch", "g_a") dt = 4e-6 t1 = 30e-3 t2 = 15e-3 df = 0 dp = .2 mode = 2 mx_0 = 0 my_0 = 0 mz_0 = 1 mx, my, mz = bloch(b1, g, dt, t1, t2, df, dp, mode, mx_0, my_0, mz_0) self.assertTrue(np.allclose(mx_a, mx)) self.assertTrue(np.allclose(my_b, my)) self.assertTrue(np.allclose(mz_c, mz))
def test_bloch_sim_a(self): """ Runs another simple Bloch simulator run. """ mx_a = get_data_with_key(TEST_DIR, "basic_bloch", "mx_a") my_b = get_data_with_key(TEST_DIR, "basic_bloch", "my_a") mz_c = get_data_with_key(TEST_DIR, "basic_bloch", "mz_a") b1 = get_data_with_key(TEST_DIR, "basic_bloch", "b1_a") g = get_data_with_key(TEST_DIR, "basic_bloch", "g_a") dt = 4e-6 t1 = 30e-3 t2 = 15e-3 df = 0 dp = .2 mode = 2 mx_0 = 0 my_0 = 0 mz_0 = 1 mx, my, mz = bloch(b1, g, dt, t1, t2, df, dp, mode, mx_0, my_0, mz_0) self.assertTrue(np.allclose(mx_a, mx)); self.assertTrue(np.allclose(my_b, my)); self.assertTrue(np.allclose(mz_c, mz));
def test_hw5_bloch_sim_first_part(self): matlab = sio.loadmat(TEST_DIR.format("hw5", "hw5_img")) dp = matlab["dp"] mx_0 = matlab["mx"].ravel() my_0 = matlab["my"].ravel() mz_0 = matlab["mz"].ravel() expected_mx1 = sio.loadmat(TEST_DIR.format("hw5", "mxa.mat"))["mx1"].ravel() expected_my1 = sio.loadmat(TEST_DIR.format("hw5", "mya.mat"))["my1"].ravel() expected_mz1 = sio.loadmat(TEST_DIR.format("hw5", "mza.mat"))["mz1"].ravel() expected_mx2 = np.transpose(sio.loadmat(TEST_DIR.format("hw5", "mxb.mat"))["mx1"]) expected_my2= np.transpose(sio.loadmat(TEST_DIR.format("hw5", "myb.mat"))["my1"]) expected_mz2= np.transpose(sio.loadmat(TEST_DIR.format("hw5", "mzb.mat"))["mz1"]) Nf = 64 Np = 32 Nrf = 92 Fov_r = 14 Fov_p = 7 g_max = 4 s_max = 15000 dt = 4e-6 bwpp = 1862.4 gamma = 4257 flip = 90 gx, rowin = genReadoutGradient(Nf, Fov_r, bwpp, g_max, s_max, dt) gpe, petable = genPEGradient(Np, Fov_p, g_max, s_max, dt) rf_90 = np.ones(Nrf) * (flip/360) / (Nrf * dt * gamma) gy = np.zeros(gx.size) gy[:gpe.size] = gpe g = np.asarray([gx, gy * -petable[0]]) mx1, my1, mz1 = bloch(rf_90, rf_90 * 0, dt, 100, 100, 0, dp, 0, mx_0, my_0, mz_0) mx2, my2, mz2 = bloch(gx * 0, g, dt, 100, 100, 0, dp, 2, mx1, my1, mz1) self.assertTrue(np.allclose(expected_mx1, mx1)) self.assertTrue(np.allclose(expected_my1, my1)) self.assertTrue(np.allclose(expected_mz1, mz1)) self.assertTrue(np.allclose(expected_mx2, mx2)) self.assertTrue(np.allclose(expected_my2, my2)) self.assertTrue(np.allclose(expected_mz2, mz2))
def test_ssfptransiest(self): """ Runs an SSFP response calculation using bloch.m """ expected_mxss = get_data_with_key(TEST_DIR, "ssfptransient", "mxss") expected_myss = get_data_with_key(TEST_DIR, "ssfptransient", "myss") expected_mzss = get_data_with_key(TEST_DIR, "ssfptransient", "mzss") expected_mx = get_data_with_key(TEST_DIR, "ssfptransient", "mx") expected_my = get_data_with_key(TEST_DIR, "ssfptransient", "my") expected_mz = get_data_with_key(TEST_DIR, "ssfptransient", "mz") TR = .005 #Seconds Trf = 0.0001 #100 us "hard" RF pulse alpha = 60 #Degrees gamma = 4258 #Hz/G T1 = 1 #Seconds T2 = .2 #Seconds freq = np.arange(-200, 201) #Hz N = 100 Tpad = (TR - Trf) / 2 #Seconds t = np.asarray([Tpad, Trf, Tpad]) b1 = np.concatenate( (np.zeros(1), np.asarray([np.pi / 180 * alpha / Trf / gamma / 2 / np.pi]), np.zeros(1))) mxss, myss, mzss = bloch(b1, 0 * b1, t, T1, T2, freq, 0, 1) mx, my, mz = bloch(1.0j * np.max(b1) / 2, 0, Trf, T1, T2, freq, 0, 0) for _ in range(N): mx, my, mz = bloch(b1, 0 * b1, t, T1, T2, freq, 0, 0, mx, my, mz) self.assertTrue(np.allclose(expected_mxss, mxss)) self.assertTrue(np.allclose(expected_myss, myss)) self.assertTrue(np.allclose(expected_mzss, mzss)) self.assertTrue(np.allclose(expected_mx, mx)) self.assertTrue(np.allclose(expected_my, my)) self.assertTrue(np.allclose(expected_mz, mz))
def test_ssfptransiest(self): """ Runs an SSFP response calculation using bloch.m """ expected_mxss = get_data_with_key(TEST_DIR, "ssfptransient", "mxss") expected_myss = get_data_with_key(TEST_DIR, "ssfptransient", "myss") expected_mzss = get_data_with_key(TEST_DIR, "ssfptransient", "mzss") expected_mx = get_data_with_key(TEST_DIR, "ssfptransient", "mx") expected_my = get_data_with_key(TEST_DIR, "ssfptransient", "my") expected_mz = get_data_with_key(TEST_DIR, "ssfptransient", "mz") TR = .005 #Seconds Trf = 0.0001 #100 us "hard" RF pulse alpha = 60 #Degrees gamma = 4258 #Hz/G T1 = 1 #Seconds T2 = .2 #Seconds freq = np.arange(-200, 201) #Hz N = 100 Tpad = (TR - Trf)/2 #Seconds t = np.asarray([Tpad, Trf, Tpad]) b1 = np.concatenate((np.zeros(1), np.asarray([np.pi/180*alpha/Trf/gamma/2/np.pi]), np.zeros(1))) mxss, myss, mzss = bloch(b1, 0*b1, t, T1, T2, freq, 0, 1) mx, my, mz = bloch(1.0j * np.max(b1)/2, 0, Trf, T1, T2, freq, 0, 0) for _ in range(N): mx, my, mz = bloch(b1, 0*b1, t, T1, T2, freq, 0, 0, mx, my, mz) self.assertTrue(np.allclose(expected_mxss, mxss)) self.assertTrue(np.allclose(expected_myss, myss)) self.assertTrue(np.allclose(expected_mzss, mzss)) self.assertTrue(np.allclose(expected_mx, mx)) self.assertTrue(np.allclose(expected_my, my)) self.assertTrue(np.allclose(expected_mz, mz))
def test_sinc_pulse(self): """ Tests generation of sinc pulse. """ expected_mxy = get_data_with_key(TEST_DIR, "rf_test", "mxy") duration = 3.2e-3 dt = duration / 256 flip = np.pi / 2 tbw = 8 rf = sinc_pulse(tbw, flip, duration, dt) g = np.ones(rf.size) * .6 dp = np.linspace(-2, 2, 512) mx0 = np.zeros(512) my0 = np.zeros(512) mz0 = np.ones(512) mx, my, mz = bloch(rf, g, dt, 100, 100, 0, dp, 0, mx0, my0, mz0) mxy = mx + 1.0j * my np.allclose(expected_mxy, mxy)
def test_sinc_pulse(self): """ Tests generation of sinc pulse. """ expected_mxy = get_data_with_key(TEST_DIR, "rf_test", "mxy") duration = 3.2e-3 dt = duration / 256 flip = np.pi / 2 tbw = 8 rf = sinc_pulse(tbw, flip, duration, dt) g = np.ones(rf.size) * .6 dp = np.linspace(-2, 2, 512) mx0 = np.zeros(512) my0 = np.zeros(512) mz0 = np.ones(512) mx, my, mz = bloch(rf, g, dt, 100, 100, 0, dp, 0, mx0, my0, mz0) mxy = mx + 1.0j*my np.allclose(expected_mxy, mxy)
def test_hw4_bloch_sim_a(self): mx_a = sio.loadmat(TEST_DIR.format("hw4", "mx_a"))["mx"].ravel() my_b = sio.loadmat(TEST_DIR.format("hw4", "my_a"))["my"].ravel() mz_c = sio.loadmat(TEST_DIR.format("hw4", "mz_a"))["mz"].ravel() b1 = sio.loadmat(TEST_DIR.format("hw4", "B1_a"))["B1"].ravel() g = np.transpose(sio.loadmat(TEST_DIR.format("hw4", "G_a"))["G"]).ravel() dt = 4e-6 t1 = 30e-3 t2 = 15e-3 df = 0 dp = .2 mode = 2 mx_0 = 0 my_0 = 0 mz_0 = 1 mx, my, mz = bloch(b1, g, dt, t1, t2, df, dp, mode, mx_0, my_0, mz_0) self.assertTrue(np.allclose(mx_a, mx)); self.assertTrue(np.allclose(my_b, my)); self.assertTrue(np.allclose(mz_c, mz));
def test_hw4_bloch_sim_demo(self): mx_demo = sio.loadmat(TEST_DIR.format("hw4", "mx_demo"))["mx"].ravel() my_demo = sio.loadmat(TEST_DIR.format("hw4", "my_demo"))["my"].ravel() mz_demo = sio.loadmat(TEST_DIR.format("hw4", "mz_demo"))["mz"].ravel() b1 = sio.loadmat(TEST_DIR.format("hw4", "b1_demo"))["b1"].ravel() g = np.transpose(sio.loadmat(TEST_DIR.format("hw4", "g_demo"))["g"]).ravel() dt = 4e-6 t1 = 100e-3 t2 = 50e-3 df = 0 dp = 0 mode = 2 mx_0 = 0 my_0 = 0 mz_0 = 1 mx, my, mz = bloch(b1, g, dt, t1, t2, df, dp, mode, mx_0, mx_0, mx_0) self.assertTrue(np.allclose(mx_demo, mx)); self.assertTrue(np.allclose(my_demo, my)); self.assertTrue(np.allclose(mz_demo, mz));
flip = 180 flip_rad = flip * np.pi / 180 b2_time = flip_rad / B1max / gamma N2 = int(np.ceil(b2_time / dt)) b2 = np.ones((N2, )) * B1max * 1j x = 1 area = .99 / x / gamma_bar g = minimum_time_gradient(area, Gmax, Smax, dt) B1 = np.zeros((int(np.round(sim_time / dt)), ), dtype=np.complex) G = np.zeros((int(np.round(sim_time / dt)), )) B1[:N] = b1 G[N:N + len(g)] = g B1[N + len(g):N + len(g) + N2] = b2 G[N + len(g) + N2:N + len(g) + N2 + len(g)] = g mx, my, mz = bloch(B1, G, dt, 100e-4, 100e-5, 0, np.linspace(-.5, .5, 15)[None, :], 2, mx=1, my=0, mz=0) visualize_magnetization(B1, G * x, mx, my, mz, accel=5)
# Setup parameters b1 = np.hstack((np.zeros((500, )), msinc(250, 2), np.zeros((500, )))) gr = np.hstack((np.zeros(375, ), - np.ones((125, )), np.ones((250, )), - np.ones((125, )), np.zeros((375, )))) b1 = 1.56 * b1 / np.max(b1) / 4 dp = np.arange(-4, 4.1, .1) T = 4e-6 df = np.arange(-250., 251., 5.) tp = np.arange(1, b1.size + 1) * T t1 = 1. t2 = .2 # Run bloch simulation [mx, my, mz] = bloch(b1, gr, tp, 1., .2, df, dp, 3) #mxy = mx + 1j * my # Display f_c = 34 p_c = 40 pl.figure(figsize=(5, 9)) pl.subplot(3, 1, 1) pl.plot(tp * 1e3, b1) pl.xlabel('Time (ms)') pl.ylabel('RF amplitude (Gauss)') pl.title('RF pulse') pl.subplot(3, 1, 2) pl.plot(tp * 1e3, gr) pl.xlabel('Time (ms)')