|
@@ -8,44 +8,43 @@ from mpmath import mp, mpf
|
|
mp.dps = 2000
|
|
mp.dps = 2000
|
|
|
|
|
|
voxel_num = 15
|
|
voxel_num = 15
|
|
-phase_range = mp.pi/2
|
|
|
|
-phase_init = mp.pi/4 #mpf(0.0)
|
|
|
|
|
|
+phase_range = np.pi/2
|
|
|
|
+phase_init = np.pi/4 #(0.0)
|
|
U_points = voxel_num * 3000
|
|
U_points = voxel_num * 3000
|
|
|
|
|
|
-noise_ratio = mpf(0.0*1e-38) #1e8
|
|
|
|
|
|
+noise_ratio = (0.0*1e-38) #1e8
|
|
|
|
|
|
total_periods=10#DO NOT CHANGE to fit T2s_scale autoscale
|
|
total_periods=10#DO NOT CHANGE to fit T2s_scale autoscale
|
|
-rf_samples_per_period = 80
|
|
|
|
|
|
+rf_samples_per_period = 10
|
|
# max polynomial order equals rf_samples_per_period * total_periods
|
|
# max polynomial order equals rf_samples_per_period * total_periods
|
|
|
|
|
|
# B0=1.5T freq=64Mhz, period = 15.6 ns
|
|
# B0=1.5T freq=64Mhz, period = 15.6 ns
|
|
-period = mpf(10) #ms
|
|
|
|
-omega = 2.0*mp.pi/period
|
|
|
|
|
|
+period = (10.0) #ms
|
|
|
|
+omega = 2.0*np.pi/period
|
|
#T2s_scale = 0.01 #ms # need to be 10ms
|
|
#T2s_scale = 0.01 #ms # need to be 10ms
|
|
T2s_scale = total_periods*period/rf_samples_per_period/voxel_num*8 #ms # need to be 10ms
|
|
T2s_scale = total_periods*period/rf_samples_per_period/voxel_num*8 #ms # need to be 10ms
|
|
T2s_min = T2s_scale/20.0
|
|
T2s_min = T2s_scale/20.0
|
|
-#print(period)
|
|
|
|
#ms
|
|
#ms
|
|
-time_steps = np.array(mp.linspace(mpf(0), mpf(period*total_periods), rf_samples_per_period*total_periods))
|
|
|
|
-tmp = [mp.rand()*0.0+mpf(1.0) for n in range(voxel_num)]
|
|
|
|
|
|
+time_steps = np.array(mp.linspace((0), (period*total_periods), rf_samples_per_period*total_periods))
|
|
|
|
+tmp = [np.random.rand()*0.0+(1.0) for n in range(voxel_num)]
|
|
voxel_amplitudes = np.array(tmp)
|
|
voxel_amplitudes = np.array(tmp)
|
|
-tmp = [mp.rand() for n in range(voxel_num)]
|
|
|
|
|
|
+tmp = [np.random.rand() for n in range(voxel_num)]
|
|
voxel_T2s_decay = np.sort(np.array(tmp))*(T2s_scale-2*T2s_min) + T2s_min
|
|
voxel_T2s_decay = np.sort(np.array(tmp))*(T2s_scale-2*T2s_min) + T2s_min
|
|
|
|
|
|
voxel_all = np.append(voxel_amplitudes,voxel_T2s_decay/T2s_scale)
|
|
voxel_all = np.append(voxel_amplitudes,voxel_T2s_decay/T2s_scale)
|
|
if voxel_num == 5:
|
|
if voxel_num == 5:
|
|
-# voxel_all = np.array([mpf(0.2),mpf(0.6),mpf(0.02),mpf(0.1)])
|
|
|
|
- voxel_all = np.array([mpf(0.822628),mpf(0.691376),mpf(0.282906),mpf(0.226013),mpf(0.90703),mpf(0.144985),mpf(0.228563),mpf(0.340353),mpf(0.462462),mpf(0.720518)])
|
|
|
|
- #voxel_all = np.array([mpf(0.592606),mpf(0.135168),mpf(0.365712),mpf(0.667536),mpf(0.437378),mpf(0.918822),mpf(0.943879),mpf(0.590338),mpf(0.685997),mpf(0.658839)])
|
|
|
|
|
|
+# voxel_all = np.array([mpf(0.2),(0.6),(0.02),(0.1)])
|
|
|
|
+ voxel_all = np.array([(0.822628),(0.691376),(0.282906),(0.226013),(0.90703),(0.144985),(0.228563),(0.340353),(0.462462),(0.720518)])
|
|
|
|
+ #voxel_all = np.array([(0.592606),(0.135168),(0.365712),(0.667536),(0.437378),(0.918822),(0.943879),(0.590338),(0.685997),(0.658839)])
|
|
voxel_amplitudes = voxel_all[:voxel_num]
|
|
voxel_amplitudes = voxel_all[:voxel_num]
|
|
voxel_T2s_decay = voxel_all[voxel_num:]*T2s_scale
|
|
voxel_T2s_decay = voxel_all[voxel_num:]*T2s_scale
|
|
|
|
|
|
-# a_i = np.array([mpf(0.3),mpf(0.1),mpf(0.15),mpf(0.1)])
|
|
|
|
-# d_i = np.array([mpf(0.7),mpf(0.9),mpf(0.2),mpf(0.67)])
|
|
|
|
|
|
+# a_i = np.array([(0.3),(0.1),(0.15),(0.1)])
|
|
|
|
+# d_i = np.array([(0.7),(0.9),(0.2),(0.67)])
|
|
# voxel_num = len(a_i)
|
|
# voxel_num = len(a_i)
|
|
|
|
|
|
|
|
|
|
-voxel_phases = np.array(mp.linspace(0,phase_range, voxel_num))
|
|
|
|
|
|
+voxel_phases = np.array(np.linspace(0,phase_range, voxel_num))
|
|
# if len(voxel_amplitudes) != len(voxel_phases):
|
|
# if len(voxel_amplitudes) != len(voxel_phases):
|
|
# print("ERROR! Size of amplitude and phase arrays do not match!")
|
|
# print("ERROR! Size of amplitude and phase arrays do not match!")
|
|
# raise
|
|
# raise
|
|
@@ -60,28 +59,20 @@ def gen_rf_signal(time):
|
|
mag_sin = np.array(tmp)
|
|
mag_sin = np.array(tmp)
|
|
mag_cos = np.array(tmp)
|
|
mag_cos = np.array(tmp)
|
|
for t in range(len(time)):
|
|
for t in range(len(time)):
|
|
- #print("time",float(time[t]))
|
|
|
|
for i in range(voxel_num):
|
|
for i in range(voxel_num):
|
|
# mag_sin[t] += a_i[i]*(
|
|
# mag_sin[t] += a_i[i]*(
|
|
# (d_i[i] + np.random.rand()*noise_ratio)**time[t]
|
|
# (d_i[i] + np.random.rand()*noise_ratio)**time[t]
|
|
# )
|
|
# )
|
|
- # print("a_{:d} =".format(i),float(a_i[i]),", ",
|
|
|
|
- # "d_{:d} =".format(i),float(d_i[i]),"+", np.random.rand()*noise_ratio)
|
|
|
|
-
|
|
|
|
amp = voxel_amplitudes[i] * (
|
|
amp = voxel_amplitudes[i] * (
|
|
mp.exp(-time[t]/voxel_T2s_decay[i])
|
|
mp.exp(-time[t]/voxel_T2s_decay[i])
|
|
) + ( 0.0
|
|
) + ( 0.0
|
|
# + np.random.rand()*noise_ratio
|
|
# + np.random.rand()*noise_ratio
|
|
)
|
|
)
|
|
if t == 0:
|
|
if t == 0:
|
|
- #print("a_{:d}".format(i),float(voxel_amplitudes[i]* mp.sin(voxel_phases[i] + phase_init)))
|
|
|
|
- print("d_{:d}".format(i),float( mp.exp(-(period/rf_samples_per_period)/voxel_T2s_decay[i]) ))
|
|
|
|
- mag_sin[t] += amp * mp.sin(
|
|
|
|
- voxel_phases[i] + phase_init
|
|
|
|
- )
|
|
|
|
- mag_cos[t] += amp * mp.cos(
|
|
|
|
- voxel_phases[i] + phase_init
|
|
|
|
- )
|
|
|
|
|
|
+ #print("a_{:d}".format(i),float(voxel_amplitudes[i]* np.sin(voxel_phases[i] + phase_init)))
|
|
|
|
+ print("d_{:d}".format(i),float( np.exp(-(period/rf_samples_per_period)/voxel_T2s_decay[i]) ))
|
|
|
|
+ mag_sin[t] += amp * np.sin((voxel_phases[i] + phase_init))
|
|
|
|
+ mag_cos[t] += amp * np.cos((voxel_phases[i] + phase_init))
|
|
return mag_sin, mag_cos
|
|
return mag_sin, mag_cos
|
|
|
|
|
|
def factorial(n):
|
|
def factorial(n):
|
|
@@ -120,10 +111,9 @@ def GetLambda(mag_rf):
|
|
M_cutoff = len(mag_rf)
|
|
M_cutoff = len(mag_rf)
|
|
all_lambda = []
|
|
all_lambda = []
|
|
for i in range(M_cutoff):
|
|
for i in range(M_cutoff):
|
|
-# print("M = ", i)
|
|
|
|
- lambd = (0)
|
|
|
|
|
|
+ lambd = mpf(0.0)
|
|
for j in range(i+1):
|
|
for j in range(i+1):
|
|
- lambd += K(i,j)*mag_rf[j]
|
|
|
|
|
|
+ lambd += K(i,j)*mpf(mag_rf[j])
|
|
# print("K({:d},{:d}) =".format(i,j), float(K(i,j)))
|
|
# print("K({:d},{:d}) =".format(i,j), float(K(i,j)))
|
|
all_lambda.append(float(lambd))
|
|
all_lambda.append(float(lambd))
|
|
# tmp = [mpf(0.0) for n in range(M_cutoff)]
|
|
# tmp = [mpf(0.0) for n in range(M_cutoff)]
|