Exemplo n.º 1
0
    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));
Exemplo n.º 2
0
    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))
Exemplo n.º 3
0
    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));
Exemplo n.º 4
0
    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));
Exemplo n.º 5
0
    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))
Exemplo n.º 6
0
    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))
Exemplo n.º 7
0
    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)
Exemplo n.º 9
0
    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)
Exemplo n.º 10
0
    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));
Exemplo n.º 11
0
    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));
Exemplo n.º 12
0
    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)
Exemplo n.º 13
0


# 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)')