def test_phantom(): N = 50 vol = orbital_phantom(gtab, func=f, t=np.linspace(0, 2 * np.pi, N), datashape=(10, 10, 10, len(bvals)), origin=(5, 5, 5), scale=(3, 3, 3), angles=np.linspace(0, 2 * np.pi, 16), radii=np.linspace(0.2, 2, 6), S0=100) m = TensorModel(gtab) t = m.fit(vol) FA = t.fa # print vol FA[np.isnan(FA)] = 0 # 686 -> expected FA given diffusivities of [1500, 400, 400] l1, l2, l3 = 1500e-6, 400e-6, 400e-6 expected_fa = (np.sqrt(0.5) * np.sqrt((l1 - l2)**2 + (l2-l3)**2 + (l3-l1)**2) / np.sqrt(l1**2 + l2**2 + l3**2)) assert_array_almost_equal(FA.max(), expected_fa, decimal=2)
def test_phantom(): N = 50 vol = orbital_phantom(gtab, func=f, t=np.linspace(0, 2 * np.pi, N), datashape=(10, 10, 10, len(bvals)), origin=(5, 5, 5), scale=(3, 3, 3), angles=np.linspace(0, 2 * np.pi, 16), radii=np.linspace(0.2, 2, 6), S0=100) m = TensorModel(gtab) t = m.fit(vol) FA = t.fa # print vol FA[np.isnan(FA)] = 0 # 686 -> expected FA given diffusivities of [1500, 400, 400] l1, l2, l3 = 1500e-6, 400e-6, 400e-6 expected_fa = (np.sqrt(0.5) * np.sqrt((l1 - l2)**2 + (l2 - l3)**2 + (l3 - l1)**2) / np.sqrt(l1**2 + l2**2 + l3**2)) assert_array_almost_equal(FA.max(), expected_fa, decimal=2)
def test_phantom(): def f(t): x=np.sin(t) y=np.cos(t) z=np.linspace(-1,1,len(x)) return x,y,z fimg,fbvals,fbvecs=get_data('small_64D') bvals=np.load(fbvals) bvecs=np.load(fbvecs) bvecs[np.isnan(bvecs)]=0 N=50 #timepoints vol=orbital_phantom(bvals=bvals, bvecs=bvecs, func=f, t=np.linspace(0,2*np.pi,N), datashape=(10,10,10,len(bvals)), origin=(5,5,5), scale=(3,3,3), angles=np.linspace(0,2*np.pi,16), radii=np.linspace(0.2,2,6)) ten=Tensor(vol,bvals,bvecs) FA=ten.fa() FA[np.isnan(FA)]=0 assert_equal(np.round(FA.max()*1000),707)
def test_add_noise(): np.random.seed(1980) N = 50 S0 = 100 options = dict(func=f, t=np.linspace(0, 2 * np.pi, N), datashape=(10, 10, 10, len(bvals)), origin=(5, 5, 5), scale=(3, 3, 3), angles=np.linspace(0, 2 * np.pi, 16), radii=np.linspace(0.2, 2, 6), S0=S0) vol = orbital_phantom(gtab, **options) for snr in [10, 20, 30, 50]: vol_noise = orbital_phantom(gtab, snr=snr, **options) sigma = S0 / snr assert_(np.abs(np.var(vol_noise - vol) - sigma ** 2) < 1)
def test_add_noise(): np.random.seed(1980) N = 50 S0 = 100 options = dict(func=f, t=np.linspace(0, 2 * np.pi, N), datashape=(10, 10, 10, len(bvals)), origin=(5, 5, 5), scale=(3, 3, 3), angles=np.linspace(0, 2 * np.pi, 16), radii=np.linspace(0.2, 2, 6), S0=S0) vol = orbital_phantom(gtab, **options) for snr in [10, 20, 30, 50]: vol_noise = orbital_phantom(gtab, snr=snr, **options) sigma = S0 / snr assert_(np.abs(np.var(vol_noise - vol) - sigma**2) < 1)
def build_phantom(fname): N = 200 S0 = 100 N_angles = 32 N_radii = 20 vol_shape = (100, 100, 100) origin = (50, 50, 50) scale = (30, 30, 30) t = np.linspace(0, 2 * np.pi, N) angles = np.linspace(0, 2 * np.pi, N_angles) radii = np.linspace(0.2, 2, N_radii) vol1 = orbital_phantom(gtab, func=f1, t=t, datashape=vol_shape + (len(bvals), ), origin=origin, scale=scale, angles=angles, radii=radii, S0=S0) vol2 = orbital_phantom(gtab, func=f2, t=t, datashape=vol_shape + (len(bvals), ), origin=origin, scale=scale, angles=angles, radii=radii, S0=S0) vol = vol1 + vol2 np.save(fname, vol)
def create_software_phantom_no_pv_effects(): #if __name__=='__main__': SNR=5. final_name='/home/eg309/Data/orbital_phantoms/'+str(SNR)+'_fat' print 'Loading data' btable=np.loadtxt(get_data('dsi515btable')) bvals=btable[:,0] bvecs=btable[:,1:] def f2(t): x=np.linspace(-1,1,len(t)) y=np.linspace(-1,1,len(t)) z=np.zeros(x.shape) return x,y,z vol2=orbital_phantom(bvals=bvals,bvecs=bvecs,evals=np.array([0.0017,0.0003,0.0003]),func=f2,datashape=(64,64,64,len(bvals))) fvol2 = np.memmap('/tmp/t2', dtype='f8', mode='w+', shape=(64,64,64,len(bvals))) fvol2[:]=vol2[:] del vol2 print 'Created first direction' norm=fvol2[...,0]/100. norm[norm==0]=1 fvol2[:]=fvol2[:]/norm[...,None] print 'Removed partial volume effects' def f3(t): x=np.linspace(-1,1,len(t)) y=-np.linspace(-1,1,len(t)) z=np.zeros(x.shape) return x,y,z #second direction vol3=orbital_phantom(bvals=bvals,bvecs=bvecs,evals=np.array([0.0017,0.0003,0.0003]),func=f3,datashape=(64,64,64,len(bvals))) fvol3 = np.memmap('/tmp/t3', dtype='f8', mode='w+', shape=(64,64,64,len(bvals))) fvol3[:]=vol3[:] del vol3 print 'Created second direction' norm=fvol3[...,0]/100. norm[norm==0]=1 fvol3[:]=fvol3[:]/norm[...,None] print 'Removed partial volume effects' fvolfinal = np.memmap(final_name, dtype='f8', mode='w+', shape=(64,64,64,len(bvals))) fvolfinal[:]=fvol2[:]+fvol3[:]#+fvol4 print 'Adding two directions together' norm=fvolfinal[...,0]/100. norm[norm==0]=1 fvolfinal[:]=fvolfinal[:]/norm[...,None] print 'Removed partial volume effects' print 'Adding noise' def gaussian_noise(vol,snr): voln=np.random.randn(*vol.shape[:3]) pvol=np.sum(vol[:,:,:,0]**2) #power of initial volume pnoise=np.sum(np.random.randn(*voln.shape[:3])**2) #power of noise volume K=pvol/pnoise #print pvol,pnoise,K return np.sqrt(K/np.float(snr))*np.random.randn(*vol.shape) print 'Noise 1' voln=np.random.randn(*fvolfinal[:].shape[:3]) pvol=np.sum(fvolfinal[:,:,:,0]**2) #power of initial volume pnoise=np.sum(np.random.randn(*voln.shape)**2) #power of noise volume K=pvol/pnoise noise1 = np.memmap('/tmp/n1', dtype='f8', mode='w+', shape=(64,64,64,len(bvals))) noise1[:] = np.random.randn(*fvolfinal[:].shape)[:] noise1[:] = np.sqrt(K/np.float(SNR))*noise1[:]#*np.random.randn(*fvolfinal[:].shape) print 'Noise 2' voln=np.random.randn(*fvolfinal[:].shape[:3]) pvol=np.sum(fvolfinal[:,:,:,0]**2) #power of initial volume pnoise=np.sum(np.random.randn(*voln.shape)**2) #power of noise volume K=pvol/pnoise noise2 = np.memmap('/tmp/n2', dtype='f8', mode='w+', shape=(64,64,64,len(bvals))) noise2[:] = np.random.randn(*fvolfinal[:].shape)[:] noise2[:] = np.sqrt(K/np.float(SNR))*noise2[:] print 'Adding both noise components' fvolfinal[:]=np.sqrt((fvolfinal[:]+noise1[:])**2+noise2[:]**2) print 'Noise added' print 'Obtaining only a part from the data' data=fvolfinal[32-10:32+10,32-10:32+10,31:34,:] ds=DiffusionSpectrum(data,bvals,bvecs,odf_sphere='symmetric642',auto=True,save_odfs=True) print 'Showing data' show_blobs(ds.ODF[:,:,0,:][:,:,None,:],ds.odf_vertices,ds.odf_faces,scale=5.)
def create_phantom(): SNR=100. no_seeds=20**3 final_name='/home/eg309/Data/orbital_phantoms/'+str(SNR)+'_beauty2' print 'Loading data' #btable=np.loadtxt(get_data('dsi515btable')) #bvals=btable[:,0] #bvecs=btable[:,1:] bvals=np.loadtxt('data/subj_01/101_32/raw.bval') bvecs=np.loadtxt('data/subj_01/101_32/raw.bvec').T print 'generate first simulation' f2=f2_ellipse vol2=orbital_phantom(bvals=bvals,bvecs=bvecs,evals=np.array([0.0017,0.0001,0.0001]),func=f2, t=np.linspace(0.,3*np.pi/2.-np.pi/4.,1000),datashape=(64,64,64,len(bvals))) fvol2 = np.memmap('/tmp/t2', dtype='f8', mode='w+', shape=(64,64,64,len(bvals))) fvol2[:]=vol2[:] del vol2 print 'Created first component' norm=fvol2[...,0]/100. norm[norm==0]=1 print 'Removing partial volume effects' fvol2[:]=fvol2[:]/norm[...,None] print 'creating first mask A' vol2=orbital_phantom(bvals=bvals,bvecs=bvecs,evals=np.array([0.0017,0.0001,0.0001]),func=f2, t=np.linspace(0.,np.pi/8.,1000),datashape=(64,64,64,len(bvals))) maskA=vol2[...,0]>0 np.save('/tmp/maskA.npy',maskA) del vol2 print 'creating second mask B' vol2=orbital_phantom(bvals=bvals,bvecs=bvecs,evals=np.array([0.0017,0.0001,0.0001]),func=f2, t=np.linspace(3*np.pi/2.-3*np.pi/8.,3*np.pi/2.-np.pi/4.,1000),datashape=(64,64,64,len(bvals))) maskB=vol2[...,0]>0 np.save('/tmp/maskB.npy',maskB) del vol2 print 'generate second simulation' vol3=orbital_phantom(bvals=bvals,bvecs=bvecs,evals=np.array([0.0017,0.0001,0.0001]),func=f3,datashape=(64,64,64,len(bvals))) fvol3 = np.memmap('/tmp/t3', dtype='f8', mode='w+', shape=(64,64,64,len(bvals))) fvol3[:]=vol3[:] del vol3 print 'Created second direction' norm=fvol3[...,0]/100. norm[norm==0]=1 print 'Removing partial volume effects' fvol3[:]=fvol3[:]/norm[...,None] print 'creating mask C' vol3=orbital_phantom(bvals=bvals,bvecs=bvecs,evals=np.array([0.0017,0.0001,0.0001]),func=f3C,datashape=(64,64,64,len(bvals))) maskC=vol3[...,0]>0 np.save('/tmp/maskC.npy',maskC) del vol3 print 'creating mask D' vol3=orbital_phantom(bvals=bvals,bvecs=bvecs,evals=np.array([0.0017,0.0001,0.0001]),func=f3D,datashape=(64,64,64,len(bvals))) maskD=vol3[...,0]>0 np.save('/tmp/maskD.npy',maskD) del vol3 print 'Creating final volume' fvolfinal = np.memmap(final_name, dtype='f8', mode='w+', shape=(64,64,64,len(bvals))) fvolfinal[:]=fvol2[:]+fvol3[:] print 'Adding two directions together' norm=fvolfinal[...,0]/100. norm[norm==0]=1 print 'Removing partial volume effects' fvolfinal[:]=fvolfinal[:]/norm[...,None] print 'Adding noise' print 'Noise 1' voln=np.random.randn(*fvolfinal[:].shape[:3]) pvol=np.sum(fvolfinal[:,:,:,0]**2) #power of initial volume pnoise=np.sum(np.random.randn(*voln.shape)**2) #power of noise volume K=pvol/pnoise noise1 = np.memmap('/tmp/n1', dtype='f8', mode='w+', shape=(64,64,64,len(bvals))) noise1[:] = np.random.randn(*fvolfinal[:].shape)[:] noise1[:] = np.sqrt(K/np.float(SNR))*noise1[:]#*np.random.randn(*fvolfinal[:].shape) print 'Noise 2' voln=np.random.randn(*fvolfinal[:].shape[:3]) pvol=np.sum(fvolfinal[:,:,:,0]**2) #power of initial volume pnoise=np.sum(np.random.randn(*voln.shape)**2) #power of noise volume K=pvol/pnoise noise2 = np.memmap('/tmp/n2', dtype='f8', mode='w+', shape=(64,64,64,len(bvals))) noise2[:] = np.random.randn(*fvolfinal[:].shape)[:] noise2[:] = np.sqrt(K/np.float(SNR))*noise2[:] print 'Adding both noise components' fvolfinal[:]=np.sqrt((fvolfinal[:]+noise1[:])**2+noise2[:]**2) print 'Noise added' print 'Okay phantom created! Done!'
def f2(t): x = -np.sin(t) y = np.linspace(-1, 1, len(x)) z = y return x, y, z def f3(t): x = np.linspace(-1, 1, len(t)) y = np.sin(t) z = x return x, y, z t = np.linspace(0, 2 * np.pi, 100) # kissing fibre #1 vol = orbital_phantom(func=f1, t=t) # kissing fibre #2 vol += orbital_phantom(func=f2, t=t) # kissing fibre #3 vol += orbital_phantom(func=f3, t=t) #vol = add_rician_noise(vol) r=fvtk.ren() fvtk.add(r, fvtk.volume(vol[...,0])) fvtk.show(r)