|
|
|
@ -586,25 +586,15 @@ def CenterComparison(A,B,C,R,center):
|
|
|
|
|
|
|
|
|
|
def VelocityChannel(M,repeat,recorder):
|
|
|
|
|
[row,col,numt2] = M.shape
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[X,Y] = np.meshgrid(np.linspace(0,col,col),np.linspace(0,row,row))
|
|
|
|
|
|
|
|
|
|
plt.ion()
|
|
|
|
|
|
|
|
|
|
rown = row*6/row
|
|
|
|
|
coln = col*6/row
|
|
|
|
|
|
|
|
|
|
fig = plt.figure()#figsize=(4, 6) , dpi=200)
|
|
|
|
|
ax = fig.add_subplot(111, projection='3d')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for rr in range(-1,repeat):
|
|
|
|
|
|
|
|
|
|
for t in range(numt2):
|
|
|
|
|
|
|
|
|
|
V = M[:,:,t]
|
|
|
|
|
|
|
|
|
|
#ax.plot_surface(X, Y, V, cmap=plt.cm.magma, vmin=-30, vmax=50, linewidth=0, antialiased=False)
|
|
|
|
|
#ax.plot_wireframe(X, Y, V,rcount=20,ccount=20,linewidth=0.5)
|
|
|
|
|
ax.plot_surface(X, Y, V,cmap='magma',vmin=-30, vmax=100, linewidth=0, antialiased=False)
|
|
|
|
@ -615,7 +605,6 @@ def VelocityChannel(M,repeat,recorder):
|
|
|
|
|
ax.set_xlabel('$x$')
|
|
|
|
|
ax.set_ylabel('$y$')
|
|
|
|
|
ax.set_zlabel('$v(r)$')
|
|
|
|
|
|
|
|
|
|
ax.set_title('phase ' + str(t))
|
|
|
|
|
plt.pause(0.001)
|
|
|
|
|
plt.draw()
|
|
|
|
@ -634,116 +623,7 @@ def PlotTri(tri,pos,p):
|
|
|
|
|
#ax.plot_trisurf(pos[:,0], pos[:,1], pos[:,2], triangles=tri.simplices, cmap=plt.cm.Spectral,linewidth=0.1,edgecolors='k')
|
|
|
|
|
#ax.tripcolor(pos[:,0], pos[:,1], pos[:,2], triangles=tri.simplices, facecolors=p2.T, edgecolor='black')
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
def PlotPressureDrop(mode):
|
|
|
|
|
|
|
|
|
|
barye2mmHg = 1/1333.22387415
|
|
|
|
|
|
|
|
|
|
CT = np.loadtxt('Pressure/DROPS/pd_NS_coarse.txt')
|
|
|
|
|
CT2 = np.loadtxt('Pressure/DROPS/pd_NS_coarse2.txt')
|
|
|
|
|
|
|
|
|
|
ref_ao = np.loadtxt('Pressure/DROPS2/refPPE1_coarse.txt')
|
|
|
|
|
ref = np.loadtxt('Pressure/DROPS2/refPPE1_coarse_leo1.txt')
|
|
|
|
|
CS2 = np.loadtxt('Pressure/DROPS2/CSPPE2_coarse_leo1.txt')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PPE_CT = np.loadtxt('Pressure/DROPS/pd_PPE_NS_coarse.txt')
|
|
|
|
|
PPE_CT_leo = np.loadtxt('Pressure/DROPS/pd_PPE_NS_coarse_leo1.txt')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
STE_CT = np.loadtxt('Pressure/DROPS/test_STE_R1_coarse.txt')
|
|
|
|
|
test_STE_CT = np.loadtxt('Pressure/DROPS/test2_STE_R1_coarse_leo1.txt')
|
|
|
|
|
|
|
|
|
|
STEint_CT = np.loadtxt('Pressure/DROPS/test_STEint_R1_coarse.txt')
|
|
|
|
|
test_STEint_CT = np.loadtxt('Pressure/DROPS/test2_STEint_R1_coarse_leo1.txt')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# UNDERSAMPLING
|
|
|
|
|
PPE_R1_leo1 = np.loadtxt('Pressure/DROPS/test_PPE_R1_coarse_leo1.txt')
|
|
|
|
|
|
|
|
|
|
PPE_KT_R2_leo1 = np.loadtxt('Pressure/DROPS/KT_PPE_R2_coarse_leo1.txt')
|
|
|
|
|
PPE_KT_R4_leo1 = np.loadtxt('Pressure/DROPS/KT_PPE_R4_coarse_leo1.txt')
|
|
|
|
|
PPE_KT_R8_leo1 = np.loadtxt('Pressure/DROPS/KT_PPE_R8_coarse_leo1.txt')
|
|
|
|
|
PPE_KT_R12_leo1 = np.loadtxt('Pressure/DROPS/KT_PPE_R12_coarse_leo1.txt')
|
|
|
|
|
PPE_KT_R20_leo1 = np.loadtxt('Pressure/DROPS/KT_PPE_R20_coarse_leo1.txt')
|
|
|
|
|
|
|
|
|
|
PPE_CS_R2_leo1 = np.loadtxt('Pressure/DROPS/CS_PPE_R2_coarse_leo1.txt')
|
|
|
|
|
PPE_CS_R4_leo1 = np.loadtxt('Pressure/DROPS/CS_PPE_R4_coarse_leo1.txt')
|
|
|
|
|
PPE_CS_R8_leo1 = np.loadtxt('Pressure/DROPS/CS_PPE_R8_coarse_leo1.txt')
|
|
|
|
|
PPE_CS_R12_leo1 = np.loadtxt('Pressure/DROPS/CS_PPE_R12_coarse_leo1.txt')
|
|
|
|
|
PPE_CS_R20_leo1 = np.loadtxt('Pressure/DROPS/CS_PPE_R20_coarse_leo1.txt')
|
|
|
|
|
|
|
|
|
|
#CT_fine = np.loadtxt('Pressure/DROPS/pd_NS_fine.txt')
|
|
|
|
|
#CT_fine_T = np.loadtxt('Pressure/DROPS/pd_NS_fine_T.txt')
|
|
|
|
|
#PPE_CT_fine = np.loadtxt('Pressure/DROPS/pd_PPE_NS_fine.txt')
|
|
|
|
|
#PPE_CT_fine_leo3 = np.loadtxt('Pressure/DROPS/pd_PPE_NS_fine_leo3.txt')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tvec2 = np.linspace(0, 2.5 ,PPE_CT_leo.size)
|
|
|
|
|
tvec = np.linspace(tvec2[1]*0.5 ,2.5+tvec2[1]*0.5 , CT.size)
|
|
|
|
|
#tvec_T = np.linspace(0,2.5,CT_fine_T.size)
|
|
|
|
|
|
|
|
|
|
fig = plt.figure()
|
|
|
|
|
|
|
|
|
|
if mode=='KT':
|
|
|
|
|
plt.plot(tvec,CT,'-k',linewidth=2,label='$ref$')
|
|
|
|
|
plt.plot(tvec2,PPE_R1_leo1,'xkcd:red',linewidth=2,linestyle='-' , label='$R = 1$')
|
|
|
|
|
plt.plot(tvec2,PPE_KT_R2_leo1,'xkcd:blue',linewidth=2,linestyle='-' ,label='$R = 2$')
|
|
|
|
|
plt.plot(tvec2,PPE_KT_R4_leo1,'xkcd:green',linewidth=2,linestyle='-',label='$R = 4$')
|
|
|
|
|
plt.plot(tvec2,PPE_KT_R8_leo1,'xkcd:orange',linewidth=2,linestyle='-',label='$R = 8$')
|
|
|
|
|
plt.plot(tvec2,PPE_KT_R20_leo1,'xkcd:magenta',linewidth=2,linestyle='-', label='$R = 20$')
|
|
|
|
|
plt.title('$kt-BLAST$',fontsize=20)
|
|
|
|
|
|
|
|
|
|
if mode=='CS':
|
|
|
|
|
plt.plot(tvec,CT,'-k',linewidth=2,label='$ref$')
|
|
|
|
|
plt.plot(tvec2,ref_ao,'xkcd:red',linewidth=2,linestyle='--' , label='$aorta$')
|
|
|
|
|
plt.plot(tvec2,ref,'xkcd:red',linewidth=2,linestyle='-' , label='$leo$')
|
|
|
|
|
plt.plot(tvec2,CS2,'xkcd:blue',linewidth=2,linestyle='-' ,label='$R = 2$')
|
|
|
|
|
|
|
|
|
|
#plt.plot(tvec2,PPE_R1_leo1,'xkcd:red',linewidth=2,linestyle='-' , label='$R = 1$')
|
|
|
|
|
#plt.plot(tvec2,PPE_CS_R2_leo1,'xkcd:blue',linewidth=2,linestyle='-' ,label='$R = 2$')
|
|
|
|
|
#plt.plot(tvec2,PPE_CS_R4_leo1,'xkcd:green',linewidth=2,linestyle='-',label='$R = 4$')
|
|
|
|
|
#plt.plot(tvec2,PPE_CS_R8_leo1,'xkcd:orange',linewidth=2,linestyle='-',label='$R = 8$')
|
|
|
|
|
#plt.plot(tvec2,PPE_CS_R20_leo1,'xkcd:magenta',linewidth=2,linestyle='-', label='$R = 20$')
|
|
|
|
|
plt.title('$Compressed \ \ Sensing$',fontsize=20)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if mode=='STE':
|
|
|
|
|
plt.plot(tvec,CT,'-k',linewidth=2,label='$ref$')
|
|
|
|
|
plt.plot(tvec2,STE_CT , 'xkcd:purple' , label='STE-CT aorta')
|
|
|
|
|
plt.plot(tvec2,test_STE_CT , 'xkcd:purple' , linestyle='--', marker='o', label='STE-CT leo')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if mode=='STEint':
|
|
|
|
|
plt.plot(tvec,CT,'-k',linewidth=2,label='$ref$')
|
|
|
|
|
plt.plot(tvec2,STEint_CT, 'xkcd:aquamarine', label='STEint-CT aorta')
|
|
|
|
|
plt.plot(tvec2,test_STEint_CT, 'xkcd:aquamarine', linestyle='--', marker='o',label='STEint-CT aorta')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plt.ylim([-2,7])
|
|
|
|
|
plt.xlabel(r'$time \ \ \ (s)$',fontsize=20)
|
|
|
|
|
plt.ylabel(r'$\delta p \ \ \ (mmHg) $',fontsize=20)
|
|
|
|
|
plt.legend(fontsize=16)
|
|
|
|
|
##############################################################################################################################
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#fig = plt.figure()
|
|
|
|
|
#plt.plot(tvec2,CT_fine,'-ok',label='CT')
|
|
|
|
|
##plt.plot(tvec_T,CT_fine_T,'--k',label='CT T')
|
|
|
|
|
#plt.plot(tvec2 ,PPE_CT_fine ,'-om',label='PPE-CT aorta')
|
|
|
|
|
#plt.plot(tvec2 ,PPE_CT_fine_leo3,'-oc',label='PPE-CT leo3')
|
|
|
|
|
#plt.title('aorta fine')
|
|
|
|
|
#plt.xlabel(r'$time \ \ (s) $',fontsize=20)
|
|
|
|
|
#plt.ylabel(r'$\delta p \ \ \ (mmHg) $',fontsize=20)
|
|
|
|
|
#plt.legend(fontsize=14)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
def Plot_flux(masterpath,meshpath,options,mode,R):
|
|
|
|
|
|
|
|
|
|
mesh = Mesh()
|
|
|
|
@ -1090,8 +970,7 @@ def Plot_dP(masterpath,options,mode,R):
|
|
|
|
|
tcat[l-2] = float(row[0])
|
|
|
|
|
tcat = tcat+shift_t
|
|
|
|
|
ax.plot(tcat[cstar[0]:tcat.size-cstar[1]],catheter[cstar[0]:tcat.size-cstar[1]],'white',linewidth=linesize,linestyle='--',label='$catheter$')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tm = np.linspace(0,Dt*tend,tend)
|
|
|
|
|
ax.set_xlim([-0.05,0.81])
|
|
|
|
|
|
|
|
|
@ -1131,226 +1010,7 @@ def Plot_dP(masterpath,options,mode,R):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
def Plot_peaksystole(datapath,options,meshes,dt,R):
|
|
|
|
|
import pickle
|
|
|
|
|
barye2mmHg = 1/1333.22387415
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for mesh_size in meshes:
|
|
|
|
|
t_star = 6
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PPE_MEAN = np.zeros([len(R)])
|
|
|
|
|
PPE_STD = np.zeros([len(R)])
|
|
|
|
|
STE_MEAN = np.zeros([len(R)])
|
|
|
|
|
STE_STD = np.zeros([len(R)])
|
|
|
|
|
V_MEAN = np.zeros([len(R)])
|
|
|
|
|
V_STD = np.zeros([len(R)])
|
|
|
|
|
|
|
|
|
|
ref_P = 0
|
|
|
|
|
ref_V = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if mesh_size=='Ucoarse':
|
|
|
|
|
ref_V = 326.95828118309191
|
|
|
|
|
if mesh_size=='Ufine':
|
|
|
|
|
ref_V = 232.95021682714497
|
|
|
|
|
if mesh_size=='Uffine':
|
|
|
|
|
ref_V = 234.66445211879045
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for l in range(len(R)):
|
|
|
|
|
if R[l]==0:
|
|
|
|
|
ref = np.loadtxt('/home/yeye/N_MRI/codes/pressure_drop/'+mesh_size+'/dt' + str(dt) + '/ref_'+mesh_size+'.txt')
|
|
|
|
|
PPE0_raw = open('/home/yeye/N_MRI/codes/pressure_drop/'+mesh_size+'/dt' + str(dt) + '/R0/pdrop_PPE_impl_stan.dat','rb')
|
|
|
|
|
STE0_raw = open('/home/yeye/N_MRI/codes/pressure_drop/'+mesh_size+'/dt' + str(dt) + '/R0/pdrop_STE_impl_stan.dat','rb')
|
|
|
|
|
PPE0 = pickle.load(PPE0_raw)['pdrop']*(-barye2mmHg)
|
|
|
|
|
STE0 = pickle.load(STE0_raw)['pdrop']*(-barye2mmHg)
|
|
|
|
|
|
|
|
|
|
curpath = datapath + 'sequences/aorta_'+mesh_size+'.npz'
|
|
|
|
|
p = np.load(curpath)
|
|
|
|
|
px = p['x']
|
|
|
|
|
py = p['y']
|
|
|
|
|
pz = p['z']
|
|
|
|
|
v = np.sqrt(px[:,:,:,t_star]**2 + py[:,:,:,t_star]**2 + pz[:,:,:,t_star]**2)
|
|
|
|
|
max0 = np.where(v==np.max(v))
|
|
|
|
|
|
|
|
|
|
ref_P = ref[6]
|
|
|
|
|
V_MEAN[l] = ref_V
|
|
|
|
|
V_STD[l] = 0
|
|
|
|
|
PPE_MEAN[l] = PPE0[6]
|
|
|
|
|
PPE_STD[l] = 0
|
|
|
|
|
STE_MEAN[l] = STE0[6]
|
|
|
|
|
STE_STD[l] = 0
|
|
|
|
|
else:
|
|
|
|
|
PPE_MEAN[l] = np.loadtxt(datapath + 'maxpv/'+mesh_size + '/ppemean_R'+ str(R[l]) +'.txt')
|
|
|
|
|
PPE_STD[l] = np.loadtxt(datapath + 'maxpv/'+mesh_size + '/ppestd_R'+ str(R[l]) +'.txt')
|
|
|
|
|
STE_MEAN[l] = np.loadtxt(datapath + 'maxpv/'+mesh_size + '/stemean_R'+ str(R[l]) +'.txt')
|
|
|
|
|
STE_STD[l] = np.loadtxt(datapath + 'maxpv/'+mesh_size + '/stestd_R'+ str(R[l]) +'.txt')
|
|
|
|
|
V_MEAN[l] = np.loadtxt(datapath + 'maxpv/'+mesh_size + '/vmean_R'+ str(R[l]) +'.txt')
|
|
|
|
|
V_STD[l] = np.loadtxt(datapath + 'maxpv/'+mesh_size + '/vstd_R'+ str(R[l]) +'.txt')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plt.figure(figsize=(10, 6), dpi=100)
|
|
|
|
|
Rvec = np.linspace(-10,R[-1]+5,100)
|
|
|
|
|
hline = Rvec*0+ref_P
|
|
|
|
|
plt.subplot(1,2,1)
|
|
|
|
|
plt.plot([0],[ref_P],color='k',marker='o',label= '$ref$')
|
|
|
|
|
plt.plot(Rvec,hline,color='k',linestyle='--')
|
|
|
|
|
plt.errorbar(R,PPE_MEAN, yerr=PPE_STD,color=options['ppecol'],marker='o',label= '$PPE$')
|
|
|
|
|
plt.errorbar(R,STE_MEAN, yerr=STE_STD,color=options['stecol'],marker='o',label= '$STE$')
|
|
|
|
|
plt.xlim([-2,R[-1]+5])
|
|
|
|
|
plt.ylim([-7,18])
|
|
|
|
|
plt.xlabel(r'$R$',fontsize=20)
|
|
|
|
|
plt.title('$Peak \ Systole \ pressure$',fontsize=18)
|
|
|
|
|
plt.ylabel(r'$ max \ \big ( \delta P \big ) \ \ mmHg$',fontsize=16)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plt.subplot(1,2,2)
|
|
|
|
|
#plt.plot([0],[ref_V],color='k',marker='o',label= '$ref$')
|
|
|
|
|
Rvec = np.linspace(-10,R[-1]+5,100)
|
|
|
|
|
hline = Rvec*0+ref_V
|
|
|
|
|
plt.plot(Rvec,hline,color='k',linestyle='--')
|
|
|
|
|
plt.errorbar(R,V_MEAN, yerr=V_STD,color='royalblue',marker='o',label= '$' + mesh_size + '$')
|
|
|
|
|
plt.xlim([-2,R[-1]+5])
|
|
|
|
|
plt.ylim([0,350])
|
|
|
|
|
plt.xlabel(r'$R$',fontsize=20)
|
|
|
|
|
plt.ylabel(r'$ max \ \big ( v \big ) \ \ cm/s$',fontsize=16)
|
|
|
|
|
plt.title('$Peak \ Systole \ velocity$',fontsize=18)
|
|
|
|
|
#plt.legend(fontsize=15)
|
|
|
|
|
|
|
|
|
|
plt.annotate('$'+mesh_size+'$', xy=(-0.2, 1.1), xycoords='axes fraction',fontsize=15)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
def Plot_peaksystole_flux(datapath,options,meshes,dt,R):
|
|
|
|
|
import pickle
|
|
|
|
|
barye2mmHg = 1/1333.22387415
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for mesh_size in meshes:
|
|
|
|
|
t_star = 6
|
|
|
|
|
PPE_MEAN = np.zeros([len(R)])
|
|
|
|
|
PPE_STD = np.zeros([len(R)])
|
|
|
|
|
STE_MEAN = np.zeros([len(R)])
|
|
|
|
|
STE_STD = np.zeros([len(R)])
|
|
|
|
|
V_MEAN = np.zeros([len(R)])
|
|
|
|
|
V_STD = np.zeros([len(R)])
|
|
|
|
|
Q_MEAN = np.zeros([len(R)])
|
|
|
|
|
Q_STD = np.zeros([len(R)])
|
|
|
|
|
|
|
|
|
|
ref_V = 0
|
|
|
|
|
|
|
|
|
|
if mesh_size=='Ucoarse':
|
|
|
|
|
ref_V = 326.95828118309191
|
|
|
|
|
if mesh_size=='Ufine':
|
|
|
|
|
ref_V = 232.95021682714497
|
|
|
|
|
if 'Uffine' in mesh_size:
|
|
|
|
|
ref_V = 226.93523675462458
|
|
|
|
|
maxv1 = 184.05091675316763
|
|
|
|
|
ref_Q = 454.77517472437495
|
|
|
|
|
maxq1 = 429.01393994253556
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for l in range(len(R)):
|
|
|
|
|
if R[l]==0:
|
|
|
|
|
ref = np.loadtxt('/home/yeye/N_MRI/codes/pressure_drop/'+mesh_size+'/dt' + str(dt) + '/ref_'+mesh_size+'.txt')
|
|
|
|
|
PPE0_raw = open('/home/yeye/N_MRI/codes/pressure_drop/'+mesh_size+'/dt' + str(dt) + '/R0/pdrop_PPE_impl_stan.dat','rb')
|
|
|
|
|
STE0_raw = open('/home/yeye/N_MRI/codes/pressure_drop/'+mesh_size+'/dt' + str(dt) + '/R0/pdrop_STE_impl_stan.dat','rb')
|
|
|
|
|
PPE0 = pickle.load(PPE0_raw)['pdrop']*(-barye2mmHg)
|
|
|
|
|
STE0 = pickle.load(STE0_raw)['pdrop']*(-barye2mmHg)
|
|
|
|
|
|
|
|
|
|
curpath = datapath + 'sequences/aorta_'+mesh_size+'.npz'
|
|
|
|
|
p = np.load(curpath)
|
|
|
|
|
px = p['x']
|
|
|
|
|
py = p['y']
|
|
|
|
|
pz = p['z']
|
|
|
|
|
v = np.sqrt(px[:,:,:,t_star]**2 + py[:,:,:,t_star]**2 + pz[:,:,:,t_star]**2)
|
|
|
|
|
max0 = np.where(v==np.max(v))
|
|
|
|
|
V_MEAN[l] = ref_V
|
|
|
|
|
V_STD[l] = 0
|
|
|
|
|
PPE_MEAN[l] = PPE0[6]
|
|
|
|
|
PPE_STD[l] = 0
|
|
|
|
|
STE_MEAN[l] = STE0[6]
|
|
|
|
|
STE_STD[l] = 0
|
|
|
|
|
elif R[l]==1:
|
|
|
|
|
PPE_MEAN[l] = 0
|
|
|
|
|
PPE_STD[l] = 0
|
|
|
|
|
STE_MEAN[l] = 0
|
|
|
|
|
STE_STD[l] = 0
|
|
|
|
|
V_MEAN[l] = maxv1
|
|
|
|
|
V_STD[l] = 0
|
|
|
|
|
Q_MEAN[l] = maxq1
|
|
|
|
|
Q_STD[l] = 0
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
PPE_MEAN[l] = np.loadtxt(datapath + 'maxpv/'+mesh_size + '/ppemean_R'+ str(R[l]) +'.txt')
|
|
|
|
|
PPE_STD[l] = np.loadtxt(datapath + 'maxpv/'+mesh_size + '/ppestd_R'+ str(R[l]) +'.txt')
|
|
|
|
|
STE_MEAN[l] = np.loadtxt(datapath + 'maxpv/'+mesh_size + '/stemean_R'+ str(R[l]) +'.txt')
|
|
|
|
|
STE_STD[l] = np.loadtxt(datapath + 'maxpv/'+mesh_size + '/stestd_R'+ str(R[l]) +'.txt')
|
|
|
|
|
V_MEAN[l] = np.loadtxt(datapath + 'maxpv/'+mesh_size + '/vmean_R'+ str(R[l]) +'.txt')
|
|
|
|
|
V_STD[l] = np.loadtxt(datapath + 'maxpv/'+mesh_size + '/vstd_R'+ str(R[l]) +'.txt')
|
|
|
|
|
Q_MEAN[l] = -np.loadtxt(datapath + 'maxpv/'+mesh_size + '/Q2_R'+ str(R[l]) +'.txt')
|
|
|
|
|
Q_STD[l] = -np.loadtxt(datapath + 'maxpv/'+mesh_size + '/Qstd2_R'+ str(R[l]) +'.txt')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plt.figure(figsize=(15, 5), dpi=100)
|
|
|
|
|
plt.annotate('$'+mesh_size+'$', xy=(-0.2, 1.1), xycoords='axes fraction',fontsize=15)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rvec = np.linspace(-10,R[-1]+5,100)
|
|
|
|
|
plt.subplot(1,3,1)
|
|
|
|
|
#plt.plot(Rvec,hline,color='k',linestyle='--')
|
|
|
|
|
plt.errorbar(R,PPE_MEAN, yerr=PPE_STD,color=options['ppecol'],marker='o',label= '$PPE$')
|
|
|
|
|
plt.errorbar(R,STE_MEAN, yerr=STE_STD,color=options['stecol'],marker='o',label= '$STE$')
|
|
|
|
|
plt.xlim([-2,R[-1]+5])
|
|
|
|
|
plt.ylim([-0.1,2.0])
|
|
|
|
|
plt.xlabel(r'$R$',fontsize=20)
|
|
|
|
|
plt.legend(fontsize=12,loc=2)
|
|
|
|
|
plt.title('$ l_2 \ error \ in \ Peak \ pressure$',fontsize=16)
|
|
|
|
|
plt.xticks(R)
|
|
|
|
|
plt.ylabel(r'$ || p - p^{ref} ||/|| p^{ref} ||_{l2} $',fontsize=16)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plt.subplot(1,3,2)
|
|
|
|
|
#plt.plot([0],[ref_V],color='k',marker='o',label= '$ref$')
|
|
|
|
|
Rvec = np.linspace(-10,R[-1]+7,100)
|
|
|
|
|
hline = Rvec*0+ref_V
|
|
|
|
|
plt.plot(Rvec,hline,color='royalblue',linestyle='--')
|
|
|
|
|
plt.errorbar(R,V_MEAN, yerr=V_STD,color='royalblue',marker='o',label= '$' + mesh_size + '$')
|
|
|
|
|
plt.xlim([-2,R[-1]+5])
|
|
|
|
|
plt.ylim([0,350])
|
|
|
|
|
plt.xlabel(r'$R$',fontsize=20)
|
|
|
|
|
plt.ylabel(r'$ v \ \ cm/s$',fontsize=16)
|
|
|
|
|
plt.xticks(R)
|
|
|
|
|
plt.title('$Peak \ velocity$',fontsize=16)
|
|
|
|
|
#plt.legend(fontsize=15)
|
|
|
|
|
|
|
|
|
|
plt.subplot(1,3,3)
|
|
|
|
|
Rvec = np.linspace(-10,R[-1]+7,100)
|
|
|
|
|
hline = Rvec*0+ref_Q
|
|
|
|
|
plt.plot(Rvec,hline,color='mediumvioletred',linestyle='--')
|
|
|
|
|
plt.errorbar(R,Q_MEAN, yerr=Q_STD,color='mediumvioletred',marker='o',label= '$' + mesh_size + '$')
|
|
|
|
|
plt.xlim([-2,R[-1]+5])
|
|
|
|
|
plt.xlabel(r'$R$',fontsize=20)
|
|
|
|
|
plt.ylabel(r'$ Q \ \ ml/s$',fontsize=16)
|
|
|
|
|
plt.xticks(R)
|
|
|
|
|
plt.ylim([150,550])
|
|
|
|
|
plt.title('$Peak \ Flux $',fontsize=16)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def CLOCK(t1, t2):
|
|
|
|
|
tot_time = np.round(t2 - t1, 2)
|
|
|
|
|
if tot_time < 60:
|
|
|
|
@ -1411,6 +1071,9 @@ def ROUTINE(options):
|
|
|
|
|
if options['Error-curves']['apply']:
|
|
|
|
|
print('--- Error-curves analysis ---')
|
|
|
|
|
ratio = False
|
|
|
|
|
fac=1
|
|
|
|
|
if '11mm' in options['Error-curves']['subfolders']:
|
|
|
|
|
fac=100
|
|
|
|
|
for types in options['Error-curves']['type']:
|
|
|
|
|
if types=='mean_ratio':
|
|
|
|
|
types = 'mean'
|
|
|
|
@ -1418,6 +1081,9 @@ def ROUTINE(options):
|
|
|
|
|
if types=='max_ratio':
|
|
|
|
|
types = 'max'
|
|
|
|
|
ratio = True
|
|
|
|
|
if types=='norm2_m':
|
|
|
|
|
types='norm2'
|
|
|
|
|
meas=True
|
|
|
|
|
nc = 0
|
|
|
|
|
if len(options['Error-curves']['subfolders'])==0:
|
|
|
|
|
ucomp = []
|
|
|
|
@ -1445,46 +1111,262 @@ def ROUTINE(options):
|
|
|
|
|
for subf in options['Error-curves']['subfolders']:
|
|
|
|
|
ucomp = []
|
|
|
|
|
wcomp = []
|
|
|
|
|
colorset = options['Error-curves']['colors']
|
|
|
|
|
if 'colors' in options['Error-curves']:
|
|
|
|
|
print('colors setted...')
|
|
|
|
|
colorset = options['Error-curves']['colors']
|
|
|
|
|
colorsetted = True
|
|
|
|
|
else:
|
|
|
|
|
colorsetted = False
|
|
|
|
|
styles = options['Error-curves']['styles']
|
|
|
|
|
labelset = options['Error-curves']['labels']
|
|
|
|
|
path = options['Error-curves']['folder'] + subf + '/'
|
|
|
|
|
try:
|
|
|
|
|
ucomp = np.loadtxt(path + '/u'+types+'.txt')
|
|
|
|
|
wcomp = np.loadtxt(path + '/w'+types+'.txt')
|
|
|
|
|
times = np.loadtxt(path + '/times.txt')
|
|
|
|
|
except IOError:
|
|
|
|
|
print('no cError-curves for ' + subf)
|
|
|
|
|
|
|
|
|
|
if not ratio:
|
|
|
|
|
plt.plot(
|
|
|
|
|
times, ucomp, color=colorset[nc], linestyle='-', label= '$u'+ subf +'$' )
|
|
|
|
|
|
|
|
|
|
plt.plot(
|
|
|
|
|
times, wcomp, color=colorset[nc], linestyle='--', label='$w'+subf+'$')
|
|
|
|
|
wcomp = np.loadtxt(path + 'w'+types+'.txt')
|
|
|
|
|
times = np.loadtxt(path + 'times.txt')
|
|
|
|
|
if types != 'grad':
|
|
|
|
|
ucomp = np.loadtxt(path + 'u'+types+'.txt')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if colorsetted:
|
|
|
|
|
if not ratio:
|
|
|
|
|
if types not in ['grad']:
|
|
|
|
|
if meas:
|
|
|
|
|
plt.plot(times, fac*ucomp, color=colorset[nc], linestyle='--', label= '$ u \ '+ labelset[nc] +'$',linewidth=2.5 )
|
|
|
|
|
plt.plot(times, fac*wcomp, color=colorset[nc], linestyle=styles[nc], label= '$ w \ '+ labelset[nc] +'$',linewidth=2.5)
|
|
|
|
|
else:
|
|
|
|
|
wu = wcomp/ucomp
|
|
|
|
|
plt.plot(
|
|
|
|
|
times, wu, color=colorset[nc], linestyle=styles[nc], label= '$'+ labelset[nc] +'$' )
|
|
|
|
|
nc +=1
|
|
|
|
|
else:
|
|
|
|
|
wu = wcomp/ucomp
|
|
|
|
|
plt.plot(
|
|
|
|
|
times, wu, color=colorset[nc], linestyle='-', label= '$'+ labelset[nc] +'$' )
|
|
|
|
|
nc +=1
|
|
|
|
|
if not ratio:
|
|
|
|
|
if types not in ['grad']:
|
|
|
|
|
if meas:
|
|
|
|
|
plt.plot(times, fac*ucomp, linestyle='--', label= '$'+ labelset[nc] +'$' )
|
|
|
|
|
else:
|
|
|
|
|
plt.plot(times, fac*ucomp, linestyle='--', label= '$'+ labelset[nc] +'$' )
|
|
|
|
|
plt.plot(
|
|
|
|
|
times, fac*wcomp, linestyle=styles[nc], label= '$'+ labelset[nc] +'$')
|
|
|
|
|
else:
|
|
|
|
|
wu = wcomp/ucomp
|
|
|
|
|
plt.plot(
|
|
|
|
|
times, wu, linestyle=styles[nc], label= '$'+ labelset[nc] +'$' )
|
|
|
|
|
nc +=1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#plt.ylim([0, 170])
|
|
|
|
|
plt.xlabel('$time \ \ (s)$', fontsize=18)
|
|
|
|
|
plt.legend(fontsize=16)
|
|
|
|
|
plt.legend(fontsize=14)
|
|
|
|
|
if options['Error-curves']['title']:
|
|
|
|
|
plt.title(options['Error-curves']['title'], fontsize=18)
|
|
|
|
|
|
|
|
|
|
if not ratio:
|
|
|
|
|
plt.ylabel('$velocity \ \ (cm/s)$', fontsize=18)
|
|
|
|
|
if types == 'grad':
|
|
|
|
|
plt.ylim([0, 230])
|
|
|
|
|
plt.ylabel('$ |grad(w)|_2 \ \ (1/s)$', fontsize=18)
|
|
|
|
|
elif types == 'norm2':
|
|
|
|
|
plt.ylim([0, 52])
|
|
|
|
|
plt.ylabel('$ |w|_2 \ \ (cm/s)$', fontsize=18)
|
|
|
|
|
else:
|
|
|
|
|
plt.ylabel('$velocity \ \ (cm/s)$', fontsize=18)
|
|
|
|
|
plt.savefig(options['Error-curves']['outpath'] + types + '.png', dpi=500, bbox_inches='tight')
|
|
|
|
|
else:
|
|
|
|
|
plt.ylabel('$w/u$', fontsize=18)
|
|
|
|
|
if 'max' in types:
|
|
|
|
|
plt.ylim([0, 1.8])
|
|
|
|
|
plt.ylabel('$|w/u|$', fontsize=18)
|
|
|
|
|
#if 'max' in types:
|
|
|
|
|
#plt.ylim([0, 1.8])
|
|
|
|
|
plt.savefig(options['Error-curves']['outpath'] + types + '_ratio.png', dpi=500, bbox_inches='tight')
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
if 'Histograms_checkpoint' in options:
|
|
|
|
|
if options['Histograms_checkpoint']['apply']:
|
|
|
|
|
print('--- Histograms ---')
|
|
|
|
|
path = options['Histograms_checkpoint']['path']
|
|
|
|
|
freq = np.loadtxt(path + 'hist_freq.txt')
|
|
|
|
|
edges = np.loadtxt(path + 'hist_edges.txt')
|
|
|
|
|
fig, ax = plt.subplots()
|
|
|
|
|
#ax.bar(edges[:-1], freq, width=np.diff(edges), edgecolor="black", align="edge")
|
|
|
|
|
ax.bar(edges[:-1], freq, width=np.diff(edges), align="edge")
|
|
|
|
|
plt.title(options['Histograms_checkpoint']['title'], fontsize=18)
|
|
|
|
|
plt.xlim([0 , 50])
|
|
|
|
|
plt.ylim([0 , 1.8])
|
|
|
|
|
plt.savefig(path + 'hist.png', dpi=500, bbox_inches='tight')
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
if 'Pressure_drops' in options:
|
|
|
|
|
if options['Pressure_drops']['apply']:
|
|
|
|
|
print('--- Pressure_drops ---')
|
|
|
|
|
import pickle
|
|
|
|
|
nc = 0
|
|
|
|
|
tommhg = options['Pressure_drops']['convertor']
|
|
|
|
|
|
|
|
|
|
for subf in options['Pressure_drops']['subfolders']:
|
|
|
|
|
ucomp = []
|
|
|
|
|
wcomp = []
|
|
|
|
|
if 'colors' in options['Pressure_drops']:
|
|
|
|
|
colorset = options['Pressure_drops']['colors']
|
|
|
|
|
colorsetted = True
|
|
|
|
|
else:
|
|
|
|
|
colorsetted = False
|
|
|
|
|
styles = options['Pressure_drops']['styles']
|
|
|
|
|
labelset = options['Pressure_drops']['labels']
|
|
|
|
|
path = options['Pressure_drops']['folder'] + subf + '/'
|
|
|
|
|
dataname = 'pdrop_COR_impl_stan.dat'
|
|
|
|
|
if 'STE' in path:
|
|
|
|
|
dataname = 'pdrop_STE_impl_stan.dat'
|
|
|
|
|
if labelset[nc]=='ref':
|
|
|
|
|
dataname = 'pdrop.dat'
|
|
|
|
|
data = open(path+dataname, 'rb')
|
|
|
|
|
p_drop = pickle.load(data)['pdrop']/tommhg
|
|
|
|
|
data = open(path+dataname, 'rb')
|
|
|
|
|
times = pickle.load(data)['time']
|
|
|
|
|
|
|
|
|
|
if labelset[nc] == 'ref':
|
|
|
|
|
plt.plot(times, p_drop,color='black', linestyle='-', label= '$ref$' )
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
|
|
if colorsetted:
|
|
|
|
|
plt.plot(
|
|
|
|
|
times, p_drop, color=colorset[nc], linestyle=styles[nc], label= '$'+ labelset[nc] +'$' )
|
|
|
|
|
else:
|
|
|
|
|
plt.plot(times, p_drop, linestyle=styles[nc], label= '$'+ labelset[nc] +'$' )
|
|
|
|
|
|
|
|
|
|
if options['Pressure_drops']['catheter']:
|
|
|
|
|
|
|
|
|
|
c_path = '/home/yeye/Desktop/PhD/MEDICAL_DATA/Study_David/catheter_data/catheter_'+ labelset[nc]+'_rest_stats.csv'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with open(c_path, 'r') as csvfile:
|
|
|
|
|
mylist = [row[0] for row in csv.reader(csvfile, delimiter=';')]
|
|
|
|
|
|
|
|
|
|
Values = np.array(mylist)
|
|
|
|
|
catheter = np.zeros([len(Values)-2])
|
|
|
|
|
tcat = np.zeros([len(Values)-2])
|
|
|
|
|
for l in range(2,len(Values)):
|
|
|
|
|
row = Values[l].split(',')
|
|
|
|
|
catheter[l-2] = float(row[5])
|
|
|
|
|
tcat[l-2] = float(row[0])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if '11mm' in subf:
|
|
|
|
|
tdelay = 0.015
|
|
|
|
|
elif '9mm' in subf:
|
|
|
|
|
tdelay = -0.12
|
|
|
|
|
elif '13mm' in subf:
|
|
|
|
|
tdelay = 0.1
|
|
|
|
|
elif 'Normal' in subf:
|
|
|
|
|
tdelay = -0.01
|
|
|
|
|
|
|
|
|
|
plt.plot(tcat+tdelay,catheter,color=colorset[nc],linestyle='--')# ,label='$cat' + subf + '$')
|
|
|
|
|
|
|
|
|
|
nc +=1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#plt.ylim([0, 170])
|
|
|
|
|
plt.xlabel('$time \ \ (s)$', fontsize=18)
|
|
|
|
|
plt.legend(fontsize=14)
|
|
|
|
|
if options['Pressure_drops']['title']:
|
|
|
|
|
plt.title(options['Pressure_drops']['title'], fontsize=18)
|
|
|
|
|
plt.ylabel('$ \delta P \ \ (mmHg)$', fontsize=18)
|
|
|
|
|
plt.savefig(options['Pressure_drops']['outpath'] + 'pressure_drops.png', dpi=500, bbox_inches='tight')
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
if 'l2_comp' in options:
|
|
|
|
|
if options['l2_comp']['apply']:
|
|
|
|
|
print('--- L2 component analysis ---')
|
|
|
|
|
fig, ax = plt.subplots()
|
|
|
|
|
for subf in options['l2_comp']['subfolder']:
|
|
|
|
|
path = options['l2_comp']['folder'] + subf + '/'
|
|
|
|
|
colors = options['l2_comp']['colors']
|
|
|
|
|
mode = options['l2_comp']['mode']['type']
|
|
|
|
|
|
|
|
|
|
if mode in ['gain','gain_compressed']:
|
|
|
|
|
gain = True
|
|
|
|
|
path_to_comp = options['l2_comp']['mode']['comp']
|
|
|
|
|
wx = np.loadtxt(path_to_comp + '/wx.txt')
|
|
|
|
|
wy = np.loadtxt(path_to_comp + '/wy.txt')
|
|
|
|
|
wz = np.loadtxt(path_to_comp + '/wz.txt')
|
|
|
|
|
else:
|
|
|
|
|
gain = False
|
|
|
|
|
wx = np.loadtxt(path + '/wx.txt')
|
|
|
|
|
wy = np.loadtxt(path + '/wy.txt')
|
|
|
|
|
wz = np.loadtxt(path + '/wz.txt')
|
|
|
|
|
|
|
|
|
|
times = np.loadtxt(path + '/times.txt')
|
|
|
|
|
if subf != 'SNRinfV120' and gain:
|
|
|
|
|
varux = np.loadtxt(path + '/varux.txt')
|
|
|
|
|
varuy = np.loadtxt(path + '/varuy.txt')
|
|
|
|
|
varuz = np.loadtxt(path + '/varuz.txt')
|
|
|
|
|
if 'SNRinfV120' in subf:
|
|
|
|
|
lsty = '--'
|
|
|
|
|
labels = ['','','','','']
|
|
|
|
|
else:
|
|
|
|
|
lsty = '-'
|
|
|
|
|
lsty2 = '--'
|
|
|
|
|
labels = ['$wx$','$wy$','$wz$','$div$']
|
|
|
|
|
labels2 = ['$\delta u_x$','$\delta u_y$','$\delta u_z$']
|
|
|
|
|
labels3 = ['$x$','$y$','$z$']
|
|
|
|
|
|
|
|
|
|
if mode == 'gain':
|
|
|
|
|
plt.plot(times, varux, color = colors[0], linestyle=lsty2 , label= labels2[0] )
|
|
|
|
|
plt.plot(times, varuy, color = colors[1], linestyle=lsty2 , label= labels2[1] )
|
|
|
|
|
plt.plot(times, varuz, color = colors[2], linestyle=lsty2 , label= labels2[2] )
|
|
|
|
|
plt.plot(times, wx, color = colors[0], linestyle=lsty, label= labels[0] )
|
|
|
|
|
plt.plot(times, wy, color = colors[1], linestyle=lsty, label= labels[1] )
|
|
|
|
|
plt.plot(times, wz, color = colors[2], linestyle=lsty, label= labels[2] )
|
|
|
|
|
elif mode == 'gain_compressed':
|
|
|
|
|
plt.plot(times, varux-wx, color = colors[0], linestyle=lsty, label= labels3[0] )
|
|
|
|
|
plt.plot(times, varuy-wy, color = colors[1], linestyle=lsty, label= labels3[1] )
|
|
|
|
|
plt.plot(times, varuz-wz, color = colors[2], linestyle=lsty, label= labels3[2] )
|
|
|
|
|
else:
|
|
|
|
|
plt.plot(times, wx, color = colors[0], linestyle=lsty, label= labels[0] )
|
|
|
|
|
plt.plot(times, wy, color = colors[1], linestyle=lsty, label= labels[1] )
|
|
|
|
|
plt.plot(times, wz, color = colors[2], linestyle=lsty, label= labels[2] )
|
|
|
|
|
|
|
|
|
|
plt.xlabel('$time \ \ (s)$', fontsize=18)
|
|
|
|
|
|
|
|
|
|
if options['l2_comp']['div']:
|
|
|
|
|
div = np.loadtxt(path + 'div.txt')
|
|
|
|
|
div_rescaled = div*0.01
|
|
|
|
|
div_rescaled = div_rescaled + 0.1
|
|
|
|
|
plt.plot(times, div_rescaled, color = 'indigo', linestyle=lsty, label= labels[3] )
|
|
|
|
|
|
|
|
|
|
if 'title' in options['l2_comp']:
|
|
|
|
|
if options['l2_comp']['title']:
|
|
|
|
|
plt.title(options['l2_comp']['title'], fontsize=18)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if options['l2_comp']['aliasing']:
|
|
|
|
|
if 'Poiseuille' in options['l2_comp']['folder']:
|
|
|
|
|
print('adding alaising color in Poiseuille')
|
|
|
|
|
import matplotlib.transforms as mtransforms
|
|
|
|
|
trans = mtransforms.blended_transform_factory(ax.transData, ax.transAxes)
|
|
|
|
|
if 'SNR10' in subf:
|
|
|
|
|
time_al = [0.15,0.78]
|
|
|
|
|
elif 'SNRinf' in subf:
|
|
|
|
|
time_al = [0.21,0.78]
|
|
|
|
|
pm_al = 0.5*(time_al[1] + time_al[0])
|
|
|
|
|
r_al = 0.5*(time_al[1] - time_al[0])
|
|
|
|
|
ax.fill_between(times, 0, 1, where=np.abs(times -pm_al)<= r_al ,facecolor='gold', alpha=0.4, transform=trans)
|
|
|
|
|
if mode == 'gain_compressed':
|
|
|
|
|
ax.text(pm_al/times[-1], 0.55, '$aliasing$', horizontalalignment='center',verticalalignment='center', transform=ax.transAxes,fontsize=17)
|
|
|
|
|
else:
|
|
|
|
|
ax.text(pm_al/times[-1], 0.82, '$aliasing$', horizontalalignment='center',verticalalignment='center', transform=ax.transAxes,fontsize=17)
|
|
|
|
|
|
|
|
|
|
leg = plt.legend(fancybox=True,fontsize=16)
|
|
|
|
|
leg.get_frame().set_linewidth(0.0)
|
|
|
|
|
ax.tick_params(axis='both', which='major', labelsize=14)
|
|
|
|
|
#plt.ylim([-0.005 , 0.235])
|
|
|
|
|
|
|
|
|
|
if mode == 'gain_compressed':
|
|
|
|
|
plt.ylim([-0.25 , 1.75])
|
|
|
|
|
plt.ylabel('$|| \delta u ||_{L2} - || w ||_{L2}$', fontsize=18)
|
|
|
|
|
if not gain:
|
|
|
|
|
plt.ylim([-0.005 , 0.5])
|
|
|
|
|
plt.ylabel('$ \sqrt{\int w^2 dx /| \Omega|}/ venc$', fontsize=18)
|
|
|
|
|
|
|
|
|
|
plt.savefig(options['l2_comp']['folder'] + options['l2_comp']['name'] + '.png', dpi=500, bbox_inches='tight')
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|