コード例 #1
0
ファイル: epg-prop_2spin.py プロジェクト: utcsilab/mri-sim-py
def loss(theta1, theta2, angles_rad, phase_rad, TE, TR):
    T = len(angles_rad)

    x1 = epg.FSE_signal(
        angles_rad, phase_rad, TE, theta1['T1'],
        theta1['T2']) * (1 - exp(-(TR - T * TE) / theta1['T1']))
    x2 = epg.FSE_signal(
        angles_rad, phase_rad, TE, theta2['T1'],
        theta2['T2']) * (1 - exp(-(TR - T * TE) / theta2['T1']))

    return 0.5 * np.linalg.norm(x1, ord=2)**2 + 0.5 * np.linalg.norm(
        x2, ord=2)**2 - 0.5 * np.vdot(x1.ravel(), x2.ravel()) - 0.5 * np.vdot(
            x2.ravel(), x1.ravel())
コード例 #2
0
ファイル: epg-prop_2spin.py プロジェクト: utcsilab/mri-sim-py
def normalized_loss(theta1, theta2, angles_rad, phase_rad, TE, TR):
    T = len(angles_rad)
    x1 = epg.FSE_signal(
        angles_rad, phase_rad, TE, theta1['T1'],
        theta1['T2']) * (1 - exp(-(TR - T * TE) / theta1['T1']))
    x2 = epg.FSE_signal(
        angles_rad, phase_rad, TE, theta2['T1'],
        theta2['T2']) * (1 - exp(-(TR - T * TE) / theta2['T1']))

    x1 = x1 / np.linalg.norm(x1, ord=2)
    x2 = x2 / np.linalg.norm(x2, ord=2)

    return -0.5 * (np.vdot(x1.ravel(), x2.ravel()) +
                   np.vdot(x2.ravel(), x1.ravel()))
コード例 #3
0
ファイル: epg-prop_2spin.py プロジェクト: utcsilab/mri-sim-py
def loss_prime(theta1,
               theta2,
               angles_rad,
               phase_rad,
               TE,
               TR,
               excitation_dict=None,
               inversion_dict=None):
    T = len(angles_rad)
    x1 = epg.FSE_signal(angles_rad,
                        phase_rad,
                        TE,
                        theta1['T1'],
                        theta1['T2'],
                        excitation_dict=excitation_dict,
                        inversion_dict=inversion_dict).ravel() * (
                            1 - exp(-(TR - T * TE) / theta1['T1']))
    x2 = epg.FSE_signal(angles_rad,
                        phase_rad,
                        TE,
                        theta2['T1'],
                        theta2['T2'],
                        excitation_dict=excitation_dict,
                        inversion_dict=inversion_dict).ravel() * (
                            1 - exp(-(TR - T * TE) / theta1['T1']))

    T = len(angles_rad)
    alpha_prime = np.zeros((T, ))
    angle_e_prime = 0.
    angle_TI_prime = 0.

    for i in range(T):
        x1_prime = sig_prime_i(theta1, angles_rad, phase_rad, i).ravel() * (
            1 - exp(-(TR - T * TE) / theta1['T1']))
        x2_prime = sig_prime_i(theta2, angles_rad, phase_rad, i).ravel() * (
            1 - exp(-(TR - T * TE) / theta2['T1']))
        M1 = 0.5 * (np.vdot(x1, x1_prime) + np.vdot(x1_prime, x1))
        M2 = 0.5 * (np.vdot(x2, x2_prime) + np.vdot(x2_prime, x2))
        M3 = 0.5 * (np.vdot(x2_prime, x1) + np.vdot(x1, x2_prime))
        M4 = 0.5 * (np.vdot(x1_prime, x2) + np.vdot(x2, x1_prime))

        alpha_prime[i] = np.real(M1 + M2 - M3 - M4)

    return alpha_prime
コード例 #4
0
ファイル: epg-prop_2spin.py プロジェクト: utcsilab/mri-sim-py
 def plot_vals(self, thetas):
     plt.subplot(2, 1, 1)
     plt.plot(range(self.T), RAD2DEG(self.angles_rad), 'o-')
     plt.xlim((0, self.T))
     plt.subplot(2, 1, 2)
     for theta in thetas:
         plt.plot(
             range(self.T),
             epg.FSE_signal(self.angles_rad, self.phase_rad, self.TE,
                            theta['T1'], theta['T2']))
     plt.xlim((0, self.T))
     plt.ylim((0, 1))
コード例 #5
0
ファイル: epg-prop_2spin.py プロジェクト: utcsilab/mri-sim-py
 def forward(self, theta):
     return epg.FSE_signal(self.angles_rad, self.phase_rad, TE, theta['T1'],
                           theta['T2']).ravel()
コード例 #6
0
ファイル: epg-prop_2spin.py プロジェクト: utcsilab/mri-sim-py
    angles = 150 * np.ones((T, ))
    angles = read_angles('../data/flipangles.txt.408183520')

    TT = len(angles)
    if TT < T:
        T = TT
    else:
        angles = angles[:T]

    phases = np.zeros(angles.shape)

    angles_rad = DEG2RAD(angles)
    phase_rad = DEG2RAD(phases)

    S = epg.FSE_signal(angles_rad, phase_rad, TE, T1, T2)
    S2 = abs(S)

    theta1 = {'T1': 1000e-3, 'T2': 20e-3}
    theta2 = {'T1': 1000e-3, 'T2': 100e-3}

    t1 = time.time()
    NG = numerical_gradient(theta1, theta2, angles_rad, phase_rad, TE, TR)
    t2 = time.time()
    LP = loss_prime(theta1, theta2, angles_rad, phase_rad, TE, TR)
    t3 = time.time()

    NG_time = t2 - t1
    LP_time = t3 - t2

    print 'Numerical Gradient\t(%03.3f s)\t' % NG_time, NG