Exemple #1
0
def test():
    # simulated image
    mat_contents = sio.loadmat('data/kellman_data/PKdata3.mat',
                               struct_as_record=False,
                               squeeze_me=True)
    xdata = mat_contents["data"]
    im = xdata.images
    TE = xdata.TE
    field = xdata.FieldStrength
    fat_freq_arr = 42.58 * field * np.array(
        [-3.80, -3.40, -2.60, -1.94, -0.39, 0.60])
    fat_rel_amp = np.array([0.087, 0.693, 0.128, 0.004, 0.039, 0.048])

    ut.plotim3(np.real(im[:, :, :]))
    nx, ny, nte = im.shape
    #undersampling
    #mask  = ut.mask3d( nx, ny, nte, [15,15,0], 0.8)
    #FTm   = opts.FFT2d_kmask(mask)
    FTm = opts.FFT2d()
    b = FTm.forward(im)
    scaling = ut.optscaling(FTm, b)
    b = b / scaling

    #ut.plotim3(mask)
    ut.plotim3(np.absolute(FTm.backward(b)))  #undersampled imag
    #parameters
    xpar = np.zeros((nx, ny, 3), np.complex128)

    # IDEAL and FFT jointly
    IDEAL = idealc.IDEAL_opt2(TE, 217.0, 1.0)  #fat_freq_arr , fat_rel_amp
    Aideal_ftm = opts.joint2operators(IDEAL, FTm)  #(FTm,IDEAL)#
    IDEAL.set_x(xpar)  #should update in each gauss newton iteration
    residual = IDEAL.residual(b, FTm)
    #ut.plotim3(np.absolute(FTm.backward(residual)))
    # wavelet and x+d_x
    #addx        = idealc.x_add_dx()
    #addx.set_x(xpar) #should update in each gauss newton iteration
    #dwt         = opts.DWT2d(wavelet = 'haar', level=4)
    #Adwt_addx   = opts.joint2operators(dwt, addx)

    #do L2 cs mri recon
    Nite = 20  #number of iterations
    ostep = 1.0
    for i in range(20):
        dxpar = pf.prox_l2_Afxnb_CGD2(Aideal_ftm.forward, Aideal_ftm.backward,
                                      residual, Nite)
        if i % 5 == 0:
            ut.plotim3(np.absolute(xpar + ostep * dxpar)[..., 0:2], bar=1)
            ut.plotim3(np.real(xpar + ostep * dxpar)[..., 2], bar=1)
            ut.plotim3(np.imag(xpar + ostep * dxpar)[..., 2], bar=1)
        xpar = xpar + ostep * dxpar  #.astype(np.float64)
        #xpar[:,:,2] = np.real(xpar[:,:,2])

        IDEAL.set_x(xpar)  #should update in each gauss newton iteration
        residual = IDEAL.residual(b, FTm)
        #addx.set_x(xpar) #should update in each gauss newton iteration

    ut.plotim3(np.absolute(xpar)[..., 0:2], bar=1)
Exemple #2
0
def test():
    # simulated image
    mat_contents = sio.loadmat(pathdat,
                               struct_as_record=False,
                               squeeze_me=True)
    xdata = mat_contents["data"]
    im = xdata.images
    TE = xdata.TE
    field = xdata.FieldStrength
    fat_freq_arr = 42.58 * field * np.array(
        [-3.80, -3.40, -2.60, -1.94, -0.39, 0.60])
    fat_rel_amp = np.array([0.087, 0.693, 0.128, 0.004, 0.039, 0.048])
    print(TE)
    #ut.plotim3(np.angle(im[:,:,:]))
    nx, ny, nz, nte = im.shape

    scaling = ut.scaling(im)
    b = im / scaling

    #ut.plotim3(mask)
    #ut.plotim3(np.absolute(b)) #undersampled imag
    #parameters
    xpar = np.zeros((nx, ny, nz, 3), np.complex128)

    # IDEAL and FFT jointly
    IDEAL = idealc.IDEAL_opt2(TE, fat_freq_arr,
                              fat_rel_amp)  #fat_freq_arr , fat_rel_amp
    IDEAL.set_x(xpar)  #should update in each gauss newton iteration
    residual = IDEAL.residual(b)
    #do L2 cs mri recon
    Nite = 10  #number of iterations
    ostep = 1.0
    for i in range(40):
        dxpar = pf.prox_l2_Afxnb_CGD2(IDEAL.forward, IDEAL.backward, residual,
                                      Nite)
        #if i%1 == 0:
        #    ut.plotim3(np.absolute(xpar + ostep*dxpar)[...,0:2],bar=1, pause_close = 5)
        #    ut.plotim3(np.real(xpar + ostep*dxpar)[...,2],bar=1, pause_close = 5)
        #    ut.plotim3(np.imag(xpar + ostep*dxpar)[...,2],bar=1, pause_close = 5)
        xpar = xpar + ostep * dxpar  #.astype(np.float64)
        #xpar[...,2] = np.real(xpar[...,2])
        #xpar[:,:,2] = np.real(xpar[:,:,2])
        #if i > 0:
        #    xpar[:,:,2] = unwrap_freq(np.real(xpar[:,:,2]))\
        #    +1j*(np.imag(xpar[:,:,2]))
        IDEAL.set_x(xpar)  #should update in each gauss newton iteration
        residual = IDEAL.residual(b)
    #ut.plotim3(np.absolute(xpar)[...,0:2],bar=1, pause_close = 5)
    sio.savemat(pathdat + 'IDEAL_org_result.mat', {
        'xpar': xpar,
        'residual': residual
    })
Exemple #3
0
def test():
    # simulated image
    mat_contents = sio.loadmat('data/kellman_data/PKdata3.mat',
                               struct_as_record=False,
                               squeeze_me=True)
    xdata = mat_contents["data"]
    im = xdata.images
    field = xdata.FieldStrength
    b0_gain = 100.0
    TE = b0_gain * xdata.TE
    fat_freq_arr = (1.0 / b0_gain) * 42.58 * field * np.array(
        [-3.80, -3.40, -2.60, -1.94, -0.39, 0.60])
    fat_rel_amp = np.array([0.087, 0.693, 0.128, 0.004, 0.039, 0.048])

    #ut.plotim3(np.real(im[:,:,:]))
    nx, ny, nte = im.shape
    #undersampling
    mask = ut.mask3d(nx, ny, nte, [15, 15, 0], 0.8)
    #FTm   = opts.FFT2d_kmask(mask)
    FTm = opts.FFTW2d_kmask(mask)
    #FTm   = opts.FFT2d()
    b = FTm.forward(im)
    scaling = ut.optscaling(FTm, b)
    b = b / scaling

    #ut.plotim3(mask)
    #ut.plotim3(np.absolute(FTm.backward(b))) #undersampled imag
    #parameters
    xpar = np.zeros((nx, ny, 3), np.complex128)
    #xpar[:,:,0]  = 10*np.ones((nx,ny))
    #ut.plotim3(np.absolute(xpar),[3,-1])
    # IDEAL and FFT jointly
    IDEAL = idealc.IDEAL_opt2(TE, fat_freq_arr,
                              fat_rel_amp)  #fat_freq_arr , fat_rel_amp
    Aideal_ftm = opts.joint2operators(IDEAL, FTm)  #(FTm,IDEAL)#
    IDEAL.set_x(xpar)  #this set the size of data
    dwt = opts.DWT2d(wavelet='haar', level=4)

    #do tv cs mri recon
    Nite = 10  #number of iterations
    step = 1  #step size
    l1_r = 0.001
    tv_r = 0.0001  # regularization term for tv term
    rho = 1.0

    xpar = ADMM_l2Agaussnewton_l1Tfx(IDEAL, FTm, dwt, b, Nite, step, l1_r, rho)
    #xpar = ADMM_l2Aguassnewton_tvx(IDEAL, FTm, b, Nite, step, tv_r, rho )
    #xpar = ADMM_l2Agaussnewton_l1Tfx_tvx( IDEAL, FTm, dwt, b, Nite, step, l1_r, tv_r, rho)

    ut.plotim3(np.absolute(xpar)[..., 0:2], bar=1)
    ut.plotim3(b0_gain * np.real(xpar)[..., 2], bar=1)
    ut.plotim3(b0_gain * 2.0 * np.pi * np.imag(xpar)[..., 2], bar=1)
Exemple #4
0
def test():
    # simulated image
    mat_contents = sio.loadmat(pathdat, struct_as_record=False, squeeze_me=True)
    xdata        = mat_contents["data"] 
    im           = xdata.images
    field        = xdata.FieldStrength
    b0_gain      = 100.0
    TE           = b0_gain * xdata.TE
    fat_freq_arr = (1.0/b0_gain) * 42.58 * field * np.array([-3.80, -3.40, -2.60, -1.94, -0.39, 0.60])
    fat_rel_amp  = np.array([0.087, 0.693, 0.128, 0.004, 0.039, 0.048])
 
    ut.plotim3(np.real(im[:,:,:]))
    nx,ny,nte  = im.shape
    #undersampling
    mask       = ut.mask3d( nx, ny, nte, [15,15,0], 0.8)
    #FTm   = opts.FFT2d_kmask(mask)
    #FTm        = opts.FFTW2d_kmask(mask)
    FTm   = opts.FFT2d()
    b          = FTm.forward(im)
    scaling    = ut.optscaling(FTm,b)
    b          = b/scaling

    #ut.plotim3(mask)
    ut.plotim3(np.absolute(FTm.backward(b))) #undersampled imag
    #parameters
    xpar        = np.zeros((nx,ny,3), np.complex128)
    #xpar[:,:,0]  = 10*np.ones((nx,ny))
    #ut.plotim3(np.absolute(xpar),[3,-1])
    # IDEAL and FFT jointly
    IDEAL       = idealc.IDEAL_opt2(TE, fat_freq_arr , fat_rel_amp )#fat_freq_arr , fat_rel_amp
    Aideal_ftm  = opts.joint2operators(IDEAL, FTm)#(FTm,IDEAL)#
    IDEAL.set_x(xpar) #should update in each gauss newton iteration
    residual    = IDEAL.residual(b, FTm)
    #ut.plotim3(np.absolute(FTm.backward(residual)))
    # wavelet and x+d_x
    addx_water  = idealc.x_add_dx()
    addx_fat    = idealc.x_add_dx()
    addx_df     = idealc.x_add_dx()
    #addx        = idealc.x_add_dx()
    #addx.set_w([1, 1, 0.0001])
    addx_water.set_x(xpar[...,0]) #should update in each gauss newton iteration
    addx_fat.set_x  (xpar[...,1])
    addx_df.set_x   (xpar[...,2])
    dwt         = opts.DWT2d(wavelet = 'haar', level=4)
    tvop        = tvopc.TV2d()
    Adwt_addx_w = opts.joint2operators(dwt, addx_water)   
    Adwt_addx_f = opts.joint2operators(dwt, addx_fat)
    Adwt_addx_d = opts.joint2operators(tvop, addx_df)   
    #Adwt_addx   = opts.joint2operators(dwt, addx)

    #CGD
    Nite  = 80
    l1_r1 = 0.01
    l1_r2 = 0.01
    def f(xi):
        #return np.linalg.norm(Aideal_ftm.forward(xi)-residual)
        return alg.obj_fidelity(Aideal_ftm, xi, residual) \
        + l1_r1 * alg.obj_sparsity(Adwt_addx_w, xi[...,0])\
        + l1_r1 * alg.obj_sparsity(Adwt_addx_f, xi[...,1])\
        + l1_r2 * alg.obj_sparsity(Adwt_addx_d, xi[...,2])

    def df(xi):
        #return 2*Aideal_ftm.backward(Aideal_ftm.forward(xi)-residual)
        gradall = alg.grad_fidelity(Aideal_ftm, xi, residual)
        gradall[...,0] += l1_r1 * alg.grad_sparsity(Adwt_addx_w, xi[...,0])
        gradall[...,1] += l1_r1 * alg.grad_sparsity(Adwt_addx_f, xi[...,1])
        gradall[...,2] += l1_r2 * alg.grad_sparsity(Adwt_addx_d, xi[...,2])  
        return gradall      

    #do soft thresholding
    #Nite = 20 #number of iterations
    #step = 0.1 #step size
    #th   = 1 # theshold level
    #do tv cs mri recon
    #Nite = 40 #number of iterations
    #step = 1 #step size
    #tv_r = 0.01 # regularization term for tv term
    #rho  = 1.0  
    ostep = 1.0#0.3       
    for i in range(20):
        #wavelet L1 IST
    #    dxpar = solvers.IST_3( Aideal_ftm.forward, Aideal_ftm.backward,\
    #                Adwt_addx.backward, Adwt_addx.forward, residual, Nite, step, th )
        #wavelet L1 ADMM
    #    dxpar = solvers.ADMM_l2Afxnb_l1Tfx( Aideal_ftm.forward, Aideal_ftm.backward, \
    #               Adwt_addx.backward, Adwt_addx.forward, residual, Nite, step, tv_r, rho,15 )
        # TV ADMM
    #    dxpar = solvers.ADMM_l2Afxnb_tvx( Aideal_ftm.forward, Aideal_ftm.backward, residual\
    #    	, Nite, step, tv_r, rho ) 
        # L2 CGD
    #    dxpar = pf.prox_l2_Afxnb_CGD2( Aideal_ftm.forward, Aideal_ftm.backward, residual, rho, Nite )
    #    dxpar = pf.prox_l2_Afxnb_CGD2( Aideal_ftm.forward, Aideal_ftm.backward, residual, Nite )
        # L1 CGD
        dxpar   = alg.conjugate_gradient(f, df, Aideal_ftm.backward(residual), Nite )
        ostep,j = alg.BacktrackingLineSearch(f, df, xpar, dxpar)
        if i%1 == 0:
            ut.plotim3(np.absolute(xpar + ostep*dxpar)[...,0:2],bar=1)
            ut.plotim3(np.real(xpar + ostep*dxpar)[...,2],bar=1)
            ut.plotim3(np.imag(xpar + ostep*dxpar)[...,2],bar=1)
        xpar = xpar + ostep*dxpar#.astype(np.float64)   

        #if i > 1: #unwrapping on frequence
        #    xpar[:,:,2] = np.real(unwrap_freq(np.real(xpar[:,:,2])))\
        #    +1j*(np.imag(xpar[:,:,2]))

        IDEAL.set_x(xpar) #should update in each gauss newton iteration
        residual = IDEAL.residual(b, FTm)
    #    addx.set_x(xpar) #should update in each gauss newton iteration
        addx_water.set_x(xpar[...,0]) #should update in each gauss newton iteration
        addx_fat.set_x  (xpar[...,1])
        addx_df.set_x   (xpar[...,2])
    ut.plotim3(np.absolute(xpar)[...,0:2],bar=1)
    ut.plotim3(np.real(xpar + ostep*dxpar)[...,2],bar=1)
    ut.plotim3(np.imag(xpar + ostep*dxpar)[...,2],bar=1)
    sio.savemat(pathdat + 'IDEAL_CGD_result.mat', {'xpar':xpar, 'residual':residual})
Exemple #5
0
def test():
    # simulated image
    #mat_contents = sio.loadmat('/data/larson/brain_uT2/2016-09-13_3T-volunteer/ute_32echo_random-csreconallec_l2_r0p01.mat', struct_as_record=False, squeeze_me=True)

    #datpath = '/data/larson/brain_uT2/2016-12-22_7T-volunteer/' #
    datpath = '/data/larson/brain_uT2/2016-09-13_3T-volunteer/'
    f = h5py.File(datpath + 'ute_32echo_random-csreconallec_l2_r0p01.mat')

    #im3d         = f['imallplus'][0:10].transpose([1,2,3,0])
    #im           = im3d[:,40,:,:].squeeze().view(np.complex128)
    Ndiv = 8
    im3d = f['imallplus'][0:Ndiv].transpose([1, 3, 2, 0])
    im = im3d[35, :, :, :].squeeze().view(np.complex128)

    b0_gain = 1000.0
    TE = b0_gain * 1e-6 * f['TE'][0][0:Ndiv]
    field = 3.0
    fat_freq_arr = (1.0 / b0_gain) * 42.58 * field * np.array(
        [-3.80, -3.40, -2.60, -1.94, -0.39, 0.60])
    fat_rel_amp = np.array([0.087, 0.693, 0.128, 0.004, 0.039, 0.048])
    print(1000 / b0_gain * TE)
    #ut.plotim3(np.absolute(im[:,:,-10:-1]),[4,-1])

    nx, ny, nte = im.shape
    #undersampling
    #mask       = ut.mask3d( nx, ny, nte, [15,15,0], 0.8)
    #FTm   = opts.FFT2d_kmask(mask)
    #FTm        = opts.FFTW2d_kmask(mask)
    #FTm   = opts.FFT2d()
    #b          = FTm.forward(im)
    scaling = ut.scaling(im)
    im = im / scaling
    ut.plotim3(np.absolute(im[:, :, :]), [4, -1], bar=1, pause_close=2)

    #ut.plotim3(mask)
    #ut.plotim3(np.absolute(FTm.backward(b))) #undersampled imag
    #parameters
    xpar = np.zeros((nx, ny, 4), np.complex128)
    #xpar[:,:,0]  = 10*np.ones((nx,ny))
    #ut.plotim3(np.absolute(xpar),[3,-1])
    # IDEAL and FFT jointly
    IDEAL = idealc.IDEAL_fatmyelin_opt2(
        TE, fat_freq_arr, fat_rel_amp)  #fat_freq_arr , fat_rel_amp
    Aideal_ftm = IDEAL  #opts.joint2operators(IDEAL, FTm)#(FTm,IDEAL)#
    IDEAL.set_x(xpar)  #should update in each gauss newton iteration
    residual = IDEAL.residual(im)
    #ut.plotim3(np.absolute(FTm.backward(residual)))
    # wavelet and x+d_x
    addx_water = idealc.x_add_dx()
    addx_fat = idealc.x_add_dx()
    addx_dfwater = idealc.x_add_dx()
    addx_dffat = idealc.x_add_dx()

    #addx        = idealc.x_add_dx()
    #addx.set_x(xpar)
    #addx.set_w([1, 1, 0.0001])
    addx_water.set_x(xpar[...,
                          0])  #should update in each gauss newton iteration
    addx_fat.set_x(xpar[..., 1])
    addx_dfwater.set_x(xpar[..., 2])
    addx_dffat.set_x(xpar[..., 3])

    dwt = opts.DWT2d(wavelet='haar', level=4)
    tvop = tvopc.TV2d_r()
    Adwt_addx_w = opts.joint2operators(tvop, addx_water)
    Adwt_addx_f = opts.joint2operators(tvop, addx_fat)
    Adwt_addx_dwat = opts.joint2operators(tvop, addx_dfwater)
    Adwt_addx_dfat = opts.joint2operators(tvop, addx_dffat)

    #Adwt_addx   = opts.joint2operators(dwt, addx)

    #CGD
    Nite = 100
    l1_r1 = 0.01
    l1_r2 = 0.01
    l1_r3 = 0.01
    l1_r4 = 0.01

    def f(xi):
        #return np.linalg.norm(Aideal_ftm.forward(xi)-residual)
        return alg.obj_fidelity(Aideal_ftm, xi, residual)  #\
        + l1_r1 * alg.obj_sparsity(Adwt_addx_w, xi[...,0])\
        + l1_r2 * alg.obj_sparsity(Adwt_addx_f, xi[...,1])\
        + l1_r3 * alg.obj_sparsity(Adwt_addx_dwat, xi[...,2])\
        + l1_r4 * alg.obj_sparsity(Adwt_addx_dfat, xi[...,3])

    def df(xi):
        #return 2*Aideal_ftm.backward(Aideal_ftm.forward(xi)-residual)
        gradall = alg.grad_fidelity(Aideal_ftm, xi, residual)
        gradall[..., 0] += l1_r1 * alg.grad_sparsity(Adwt_addx_w, xi[..., 0])
        gradall[..., 1] += l1_r2 * alg.grad_sparsity(Adwt_addx_f, xi[..., 1])
        gradall[...,
                2] += l1_r3 * alg.grad_sparsity(Adwt_addx_dwat, xi[..., 2])
        gradall[...,
                3] += l1_r4 * alg.grad_sparsity(Adwt_addx_dfat, xi[..., 3])

        return gradall

    #do soft thresholding
    #Nite = 200 #number of iterations
    #step = 0.1 #step size
    #th   = 0.001 # theshold level
    #do tv cs mri recon
    #Nite = 20 #number of iterations
    #step = 1 #step size
    #tv_r = 0.01 # regularization term for tv term
    #rho  = 1.0
    #ostep = 0.3
    for i in range(40):
        #wavelet L1 IST
        #    dxpar = solvers.IST_3( Aideal_ftm.forward, Aideal_ftm.backward,\
        #                Adwt_addx.backward, Adwt_addx.forward, residual, Nite, step, th )
        #wavelet L1 ADMM
        #    dxpar = solvers.ADMM_l2Afxnb_l1Tfx( Aideal_ftm.forward, Aideal_ftm.backward, \
        #               Adwt_addx.backward, Adwt_addx.forward, residual, Nite, step, tv_r, rho,25 )
        # TV ADMM
        #    dxpar = solvers.ADMM_l2Afxnb_tvx( Aideal_ftm.forward, Aideal_ftm.backward, residual\
        #    	, Nite, step, tv_r, rho )
        # L2 CGD
        #    dxpar = pf.prox_l2_Afxnb_CGD2( Aideal_ftm.forward, Aideal_ftm.backward, residual, rho, Nite )
        #    dxpar = pf.prox_l2_Afxnb_CGD2( Aideal_ftm.forward, Aideal_ftm.backward, residual, Nite )
        # L1 CGD
        #dxpar = pf.prox_l2_Afxnb_CGD2( IDEAL.forward, IDEAL.backward, residual, Nite )
        dxpar = alg.conjugate_gradient(f, df, Aideal_ftm.backward(residual),
                                       Nite)
        ostep, j = alg.BacktrackingLineSearch(f, df, xpar, dxpar)
        if i % 1 == 0:
            nxpar = xpar + ostep * dxpar
            nxpar[..., 1] = 10 * nxpar[..., 1]
            ut.plotim3(np.absolute(nxpar)[..., 0:2],
                       colormap='viridis',
                       bar=1,
                       vmin=0,
                       vmax=1,
                       pause_close=2)
            ut.plotim3(b0_gain * np.real(nxpar)[..., 2],
                       colormap='viridis',
                       bar=1,
                       pause_close=2)
            ut.plotim3(b0_gain * np.imag(nxpar)[..., 2],
                       colormap='viridis',
                       bar=1,
                       pause_close=2)
            ut.plotim3(b0_gain * np.real(nxpar)[..., 3],
                       colormap='viridis',
                       bar=1,
                       pause_close=2)
            ut.plotim3(b0_gain * np.imag(nxpar)[..., 3],
                       colormap='viridis',
                       bar=1,
                       pause_close=2)
            sio.savemat(datpath + 'cs_ideal_fitting/cs_IDEAL_CGD.mat', {
                'xpar': xpar,
                'residual': residual
            })
        xpar = xpar + ostep * dxpar  #.astype(np.float64)

        #if i > 1: #fix the frequence offset to be equal for two components
        #    freq_ave    = 0.5 * np.real(xpar[:,:,2]) + 0.5 * np.real(xpar[:,:,3])
        #    xpar[:,:,2] = freq_ave +1j*(np.imag(xpar[:,:,2]))
        #    xpar[:,:,3] = freq_ave +1j*(np.imag(xpar[:,:,3]))

        IDEAL.set_x(xpar)  #should update in each gauss newton iteration
        residual = IDEAL.residual(im)
        ut.plotim3(np.absolute(residual), [4, -1], bar=1, pause_close=2)

        sio.savemat('../save_data/myelin/ideal_result_cg.mat', \
             {'xpar':xpar, 'residual':residual})

        #addx.set_x(xpar) #should update in each gauss newton iteration
        addx_water.set_x(
            xpar[..., 0])  #should update in each gauss newton iteration
        addx_fat.set_x(xpar[..., 1])
        addx_dfwater.set_x(xpar[..., 2])
        addx_dffat.set_x(xpar[..., 3])

    ut.plotim3(np.absolute(xpar)[..., 0:2], bar=1)
    ut.plotim3(np.real(xpar + ostep * dxpar)[..., 2], bar=1)
    ut.plotim3(np.imag(xpar + ostep * dxpar)[..., 2], bar=1)
    ut.plotim3(np.real(xpar + ostep * dxpar)[..., 3], bar=1)
    ut.plotim3(np.imag(xpar + ostep * dxpar)[..., 3], bar=1)
Exemple #6
0
def test():
    # simulated image
    mat_contents = sio.loadmat('data/kellman_data/PKdata3.mat',
                               struct_as_record=False,
                               squeeze_me=True)
    xdata = mat_contents["data"]
    im = xdata.images
    field = xdata.FieldStrength
    b0_gain = 100.0
    TE = b0_gain * xdata.TE
    fat_freq_arr = (1.0 / b0_gain) * 42.58 * field * np.array(
        [-3.80, -3.40, -2.60, -1.94, -0.39, 0.60])
    fat_rel_amp = np.array([0.087, 0.693, 0.128, 0.004, 0.039, 0.048])

    ut.plotim3(np.real(im[:, :, :]))
    nx, ny, nte = im.shape
    #undersampling
    mask = ut.mask3d(nx, ny, nte, [15, 15, 0], 0.8)
    FTm = opts.FFT2d_kmask(mask)
    #FTm        = opts.FFTW2d_kmask(mask)
    #FTm   = opts.FFT2d()
    b = FTm.forward(im)
    scaling = ut.optscaling(FTm, b)
    b = b / scaling

    #ut.plotim3(mask)
    ut.plotim3(np.absolute(FTm.backward(b)))  #undersampled imag
    #parameters
    xpar = np.zeros((nx, ny, 3), np.complex128)
    #xpar[:,:,0]  = 10*np.ones((nx,ny))
    #ut.plotim3(np.absolute(xpar),[3,-1])
    # IDEAL and FFT jointly
    IDEAL = idealc.IDEAL_opt2(TE, fat_freq_arr,
                              fat_rel_amp)  #fat_freq_arr , fat_rel_amp
    Aideal_ftm = opts.joint2operators(IDEAL, FTm)  #(FTm,IDEAL)#
    IDEAL.set_x(xpar)  #should update in each gauss newton iteration
    residual = IDEAL.residual(b, FTm)
    #ut.plotim3(np.absolute(FTm.backward(residual)))
    # wavelet and x+d_x
    addx = idealc.x_add_dx()
    addx.set_x(xpar)
    #addx.set_w([1, 1, 0.0001])
    dwt = opts.DWT2d(wavelet='haar', level=4)
    Adwt_addx = opts.joint2operators(dwt, addx)

    #do soft thresholding
    #Nite = 200 #number of iterations
    #step = 0.01 #step size
    #th   = 0.02 # theshold level
    #do tv cs mri recon
    Nite = 10  #number of iterations
    step = 1  #step size
    l1_r = 0.001
    tv_r = 0.0001  # regularization term for tv term
    rho = 1.0
    ostep = 0.3

    for i in range(20):
        #wavelet L1 IST
        #    dxpar = solvers.IST_3( Aideal_ftm.forward, Aideal_ftm.backward,\
        #                Adwt_addx.backward, Adwt_addx.forward, residual, Nite, step, th )
        #wavelet L1 ADMM
        #    dxpar = solvers.ADMM_l2Afxnb_l1Tfx( Aideal_ftm.forward, Aideal_ftm.backward, \
        #               Adwt_addx.backward, Adwt_addx.forward, residual, Nite, step, l1_r, rho, 200 )
        # TV ADMM
        #    dxpar = solvers.ADMM_l2Afxnb_tvx( Aideal_ftm.forward, Aideal_ftm.backward, residual\
        #    	, Nite, step, tv_r, rho, 15 )
        dxpar = solvers.ADMM_l2Afxnb_tvTfx( Aideal_ftm.forward, Aideal_ftm.backward, \
                   addx.backward, addx.forward, residual, Nite, step, l1_r, rho, 200 )

        # L2 CGD
        #    dxpar = pf.prox_l2_Afxnb_CGD2( Aideal_ftm.forward, Aideal_ftm.backward, residual, rho, Nite )
        #    dxpar = pf.prox_l2_Afxnb_CGD2( Aideal_ftm.forward, Aideal_ftm.backward, residual, Nite )

        if i % 1 == 0:
            ut.plotim3(np.absolute(xpar + ostep * dxpar)[..., 0:2], bar=1)
            ut.plotim3(b0_gain * np.real(xpar + ostep * dxpar)[..., 2], bar=1)
            ut.plotim3(np.imag(xpar + ostep * dxpar)[..., 2], bar=1)

        xpar = xpar + ostep * dxpar  #.astype(np.float64)

        IDEAL.set_x(xpar)  #should update in each gauss newton iteration
        residual = IDEAL.residual(b, FTm)
        addx.set_x(xpar)  #should update in each gauss newton iteration
        sio.savemat('data/kellman_data/xpar.mat', {'xpar': xpar})
    ut.plotim3(np.absolute(xpar)[..., 0:2], bar=1)