Commit 2fef443c authored by Stelios Karozis's avatar Stelios Karozis

memory opt + debugging

parent 1d83dc7f
...@@ -6,6 +6,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ...@@ -6,6 +6,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
## [0.0.8] - 2020-07-16
### Added
- memory optimizations
- Add check of molecule existance in .ndx file
### Changed
- Update I/O to functions
### Removed
- Remove log message option
## [0.0.7] - 2020-07-03 ## [0.0.7] - 2020-07-03
### Added ### Added
- unified properties output - unified properties output
...@@ -18,7 +29,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ...@@ -18,7 +29,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Removed ### Removed
- None - None
## [0.0.6] - 2020-07-02 ## [0.0.6] - 2020-07-02
### Added ### Added
- Initial support for gmx commands - Initial support for gmx commands
......
...@@ -7,10 +7,9 @@ import tooba_gmx as tbgmx ...@@ -7,10 +7,9 @@ import tooba_gmx as tbgmx
# in case of tail is the one closest to the head, hence # in case of tail is the one closest to the head, hence
# the code is a good approximation # the code is a good approximation
################################################### ###################################################
LOG=0
SYSTEM_NAME='test' SYSTEM_NAME='test'
DISCET=[6, 6, 6] DISCET=[3.5, 3.5, 3.5]
NUM_FR=1 NUM_FR=100
TRAJ=SYSTEM_NAME+'/eq_traj.trr' TRAJ=SYSTEM_NAME+'/eq_traj.trr'
GRO=SYSTEM_NAME+'/eq_final.gro' GRO=SYSTEM_NAME+'/eq_final.gro'
TPR=SYSTEM_NAME+'/eq_run.tpr' TPR=SYSTEM_NAME+'/eq_run.tpr'
...@@ -37,7 +36,7 @@ TPR=SYSTEM_NAME+'/eq_run.tpr' ...@@ -37,7 +36,7 @@ TPR=SYSTEM_NAME+'/eq_run.tpr'
################################################### ###################################################
GROUPS={'ALL':['gmx_ndx','index',['save', ['pkl'],'index'],'density',['save', ['pkl'],'dens']], GROUPS={'ALL':['gmx_ndx','index',['save', ['pkl'],'index'],'density',['save', ['pkl'],'dens']],
'HD_GROUP':['surf',['save', ['pkl', 'json'],'time_domain_c-normal-cg']], 'HD_GROUP':['surf',['save', ['pkl', 'json'],'time_domain_c-normal-cg']],
'TL_GROUP':['vector'], 'TL_GROUP':['vector',['save', ['pkl'],'vec']],
'COMBINE':[['HD_GROUP','surf'],['TL_GROUP','vector'],['COMB','tilt'],['save', ['pkl'],'tilt']] 'COMBINE':[['HD_GROUP','surf'],['TL_GROUP','vector'],['COMB','tilt'],['save', ['pkl'],'tilt']]
} }
ALL={'NS':['C6', 'Na', 'P4', 'P3', 'C7','C3', 'C4', 'C5', 'C8', 'C9', 'C10'], 'CHOL':['ROH','R1', 'R2', 'R3', 'R4', 'R5'], 'FFA':['AC','C1', 'C2', 'C3', 'C4']} ALL={'NS':['C6', 'Na', 'P4', 'P3', 'C7','C3', 'C4', 'C5', 'C8', 'C9', 'C10'], 'CHOL':['ROH','R1', 'R2', 'R3', 'R4', 'R5'], 'FFA':['AC','C1', 'C2', 'C3', 'C4']}
...@@ -56,6 +55,14 @@ _,data_num,_,res_num,res_type,atom_type,atom_num,_ = tbf.read_gro(GRO) ...@@ -56,6 +55,14 @@ _,data_num,_,res_num,res_type,atom_type,atom_num,_ = tbf.read_gro(GRO)
print(' ') print(' ')
################################################### ###################################################
#-------------------------------------------------- #--------------------------------------------------
#Count frames & calculate time of calculations
cnt_fr,time_index=tbf.count_frames(TRAJ,True)
MAX_FR=list(time_index.keys())[-1]
#print(MAX_FR,time_index[MAX_FR])
ST_FR=MAX_FR-NUM_FR
#print(ST_FR,time_index[ST_FR])
###################################################
#--------------------------------------------------
#Read .itp files #Read .itp files
#weights={} #weights={}
#for MOL in ITP_DIC.keys(): #for MOL in ITP_DIC.keys():
...@@ -66,15 +73,12 @@ print(' ') ...@@ -66,15 +73,12 @@ print(' ')
################################################### ###################################################
#-------------------------------------------------- #--------------------------------------------------
if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_data.pkl'): if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_data.pkl'):
if LOG==1: pass
print('WARNING: Preprocessing files exist.')
print(' Erase data.pkl if the system is new.')
print('--------------------------------------------')
data_all=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_data.pkl')
else: else:
#Read .trr file #Read .trr file
data_all=tbf.fr_export(trajfile=TRAJ,num_frames=NUM_FR) data_all=tbf.fr_export(trajfile=TRAJ,num_frames=NUM_FR)
tbf.topickle(fl=data_all, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_data') tbf.topickle(fl=data_all, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_data')
del data_all
################################################### ###################################################
#-------------------------------------------------- #--------------------------------------------------
#Check save files if exist in order to skip functions #Check save files if exist in order to skip functions
...@@ -112,24 +116,18 @@ for i in GROUPS.keys(): ...@@ -112,24 +116,18 @@ for i in GROUPS.keys():
#not COMBINE section #not COMBINE section
if i!='COMBINE': if i!='COMBINE':
if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_ndx.pkl'): if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_ndx.pkl'):
if LOG==1: pass
print('WARNING: Preprocessing files exist.')
print(' Erase ndx_HEAD.pkl if the system is new.')
print('--------------------------------------------')
group_ndx=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_ndx.pkl')
else: else:
#Find atom type index in lists created above #Find atom type index in lists created above
group_ndx=tbf.atomid_data(res_num, res_type, atom_type, atom_num, group=locals()[i]) group_ndx=tbf.atomid_data(res_num, res_type, atom_type, atom_num, group=locals()[i])
tbf.topickle(fl=group_ndx, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_ndx') tbf.topickle(fl=group_ndx, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_ndx')
del group_ndx
#-------------------------------------------------- #--------------------------------------------------
if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box.pkl'): if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box.pkl'):
if LOG==1: pass
print('WARNING: Preprocessing files exist.')
print(' Erase box.pkl if the system is new')
print(' or new grid is applied !')
print('--------------------------------------------')
box_res=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box.pkl')
else: else:
data_all=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_data.pkl')
group_ndx=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_ndx.pkl')
#Create subdomains coordinates #Create subdomains coordinates
box_p=tbf.domain_decomposition(data=data_all,dx=DISCET[0],dy=DISCET[1],dz=DISCET[2]) box_p=tbf.domain_decomposition(data=data_all,dx=DISCET[0],dy=DISCET[1],dz=DISCET[2])
#Assign desired atoms (from above function) to subdomains #Assign desired atoms (from above function) to subdomains
...@@ -137,14 +135,32 @@ for i in GROUPS.keys(): ...@@ -137,14 +135,32 @@ for i in GROUPS.keys():
##result2: {step:{res:{atom_type:{(subX,subYsubZ):[atom_num]}}}} ##result2: {step:{res:{atom_type:{(subX,subYsubZ):[atom_num]}}}}
_,box_res=tbf.atom2grid(data_all,box_p, group_ndx) _,box_res=tbf.atom2grid(data_all,box_p, group_ndx)
tbf.topickle(fl=box_res, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box') tbf.topickle(fl=box_res, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box')
del data_all
del group_ndx
del box_p
del box_res
###################################################
if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_FR'+str(NUM_FR)+'.pkl'):
pass
else:
#Creates dictionary with coordinates per subdomain for each frame
data_all=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_data.pkl')
box_res=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box.pkl')
_,coord_vector=tbf.sub_coord(box=box_res, data=data_all, res_num=res_num)
tbf.topickle(fl=coord_vector, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_FR'+str(NUM_FR))
del data_all
del box_res
del coord_vector
################################################### ###################################################
#Creates dictionary with coordinates per subdomain for each frame
_,coord_vector=tbf.sub_coord(box=box_res, data=data_all, res_num=res_num)
for j in GROUPS[i]: for j in GROUPS[i]:
if len(j) > 1: if len(j) > 1:
if j=='surf' and sv_index[j]['status']=='not exist': if j=='surf' and sv_index[j]['status']=='not exist':
if j not in locals():
surf={}
#Creates dictionary with c, normal per subdomain for each frame #Creates dictionary with c, normal per subdomain for each frame
coord_vector=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_FR'+str(NUM_FR)+'.pkl')
surf[i]=tbf.coord2norm2cg(coord_vector,img=False) surf[i]=tbf.coord2norm2cg(coord_vector,img=False)
del coord_vector
sv_data=surf[i] sv_data=surf[i]
elif j=='surf' and sv_index[j]['status']=='exist': elif j=='surf' and sv_index[j]['status']=='exist':
if j not in locals(): if j not in locals():
...@@ -154,7 +170,9 @@ for i in GROUPS.keys(): ...@@ -154,7 +170,9 @@ for i in GROUPS.keys():
if j=='vector' and sv_index[j]['status']=='not exist': if j=='vector' and sv_index[j]['status']=='not exist':
if j not in locals(): if j not in locals():
vector={} vector={}
coord_vector=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_FR'+str(NUM_FR)+'.pkl')
vector[i]=tbf.coord2vector(coord_vector) vector[i]=tbf.coord2vector(coord_vector)
del coord_vector
sv_data=vector[i] sv_data=vector[i]
elif j=='vector' and sv_index[j]['status']=='exist': elif j=='vector' and sv_index[j]['status']=='exist':
if j not in locals(): if j not in locals():
...@@ -171,12 +189,15 @@ for i in GROUPS.keys(): ...@@ -171,12 +189,15 @@ for i in GROUPS.keys():
dens_df={} dens_df={}
for iidd in uniq_id.keys(): for iidd in uniq_id.keys():
dens_df[iidd]={} dens_df[iidd]={}
fl='./'+uniq_id[iidd]['system']+'/gmx_ndx/'+uniq_id[iidd]['ndx_file'] fl='./'+uniq_id[iidd]['system']+'/gmx_ndx/'+uniq_id[iidd]['ndx_file']
cnt=-1 cnt=-1
for mol in locals()[i].keys(): for mol in locals()[i].keys():
ind=tbf.search_pattern(fl,mol)
if ind=='not exist':
break
cnt=cnt+1 cnt=cnt+1
for d in ('x','y','z'): for d in ('x','y','z'):
peaks = tbgmx.density_picks(TRR=TRAJ,TPR=TPR,IND=fl,SLC=400,ST=1000,EN=-1,normal=d,fld='./'+uniq_id[iidd]['system'],arg=cnt,dist_pk=20) peaks = tbgmx.density_picks(TRR=TRAJ,TPR=TPR,IND=fl,SLC=400,ST=time_index[ST_FR],EN=-1,normal=d,fld='./'+uniq_id[iidd]['system'],arg=cnt,dist_pk=20)
if d=='x': if d=='x':
tmp=peaks tmp=peaks
else: else:
...@@ -191,7 +212,9 @@ for i in GROUPS.keys(): ...@@ -191,7 +212,9 @@ for i in GROUPS.keys():
dens_df=tbf.frompickle(sv_index[j]['name']) dens_df=tbf.frompickle(sv_index[j]['name'])
#-------------------------------------------------- #--------------------------------------------------
if j=='gmx_ndx': if j=='gmx_ndx':
box_res=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box.pkl')
tbf.togmxndx(box_res, fld='./'+SYSTEM_NAME, sv_name=SYSTEM_NAME+'_'+i) tbf.togmxndx(box_res, fld='./'+SYSTEM_NAME, sv_name=SYSTEM_NAME+'_'+i)
del box_res
#-------------------------------------------------- #--------------------------------------------------
# Save module # Save module
if len(j)==3: if len(j)==3:
...@@ -214,16 +237,20 @@ for i in GROUPS.keys(): ...@@ -214,16 +237,20 @@ for i in GROUPS.keys():
if j[0]!='COMB': if j[0]!='COMB':
if j[1]=='surf': if j[1]=='surf':
surf=surf[j[0]] surf=surf[j[0]]
#del surf[j[0]]
if j[1]=='vector': if j[1]=='vector':
vector=vector[j[0]] vector=vector[j[0]]
#del vector[j[0]]
#Calculate COMBINE property #Calculate COMBINE property
if j[0]=='COMB': if j[0]=='COMB':
if j[1]=='tilt' and sv_index[str(j)]['status']=='not exist': if j[1]=='tilt' and sv_index[str(j)]['status']=='not exist':
tilt=tbf.SurfVector_angle(surf,vector) tilt=tbf.SurfVector_angle(surf,vector)
del surf
del vector
#Loop over timesteps and keep avgs tilts for each step #Loop over timesteps and keep avgs tilts for each step
avg={} avg={}
ss=[]
for step in tilt.keys(): for step in tilt.keys():
ss=[]
for sub in tilt[step].keys(): for sub in tilt[step].keys():
avgs=tilt[step][sub]['avg/frame'] avgs=tilt[step][sub]['avg/frame']
if sub not in ss: if sub not in ss:
...@@ -231,6 +258,7 @@ for i in GROUPS.keys(): ...@@ -231,6 +258,7 @@ for i in GROUPS.keys():
avg[sub]=avgs avg[sub]=avgs
else: else:
avg[sub].append(avgs) avg[sub].append(avgs)
del tilt
#Calculate total average #Calculate total average
tot_avg={} tot_avg={}
for sub in avg.keys(): for sub in avg.keys():
......
...@@ -5,6 +5,7 @@ import matplotlib.pyplot as plt ...@@ -5,6 +5,7 @@ import matplotlib.pyplot as plt
import scipy.optimize import scipy.optimize
import pickle as pkl import pickle as pkl
import json import json
import re
from progress.bar import Bar from progress.bar import Bar
from pytrr import ( from pytrr import (
...@@ -13,6 +14,18 @@ from pytrr import ( ...@@ -13,6 +14,18 @@ from pytrr import (
skip_trr_data, skip_trr_data,
) )
def search_pattern(fl,pattern):
textfile = open(fl, 'r')
filetext = textfile.read()
textfile.close()
matches = re.findall(pattern, filetext)
if len(matches)==0:
ind='not exist'
else:
ind='exist'
return ind
def fitPlaneLTSQ(XYZ): def fitPlaneLTSQ(XYZ):
#Source: https://gist.github.com/RustingSword/e22a11e1d391f2ab1f2c #Source: https://gist.github.com/RustingSword/e22a11e1d391f2ab1f2c
(rows, cols) = XYZ.shape (rows, cols) = XYZ.shape
...@@ -123,23 +136,30 @@ def points2vector(data): ...@@ -123,23 +136,30 @@ def points2vector(data):
return vv[0] return vv[0]
def count_frames(trajfile='traj.trr'): def count_frames(trajfile='traj.trr', pr_time=False):
""" """
Count total frames of .trr file Count total frames of .trr file
parameters: trajfile = [.trr] parameters: trajfile = [.trr]
""" """
time_index={}
cnt_fr=0 cnt_fr=0
with open(trajfile, 'rb') as inputfile: with open(trajfile, 'rb') as inputfile:
for i in range(1000): for i in range(1000000):
try: try:
header = read_trr_header(inputfile) header = read_trr_header(inputfile)
#print('Step: {step}, time: {time}'.format(**header))
skip_trr_data(inputfile, header) skip_trr_data(inputfile, header)
if pr_time==True:
#print('Step: {step}, time: {time}'.format(**header))
#print('Step: {step}, time: {time}'.format(**header))
time_index[cnt_fr]='{time}'.format(**header)
cnt_fr=cnt_fr+1 cnt_fr=cnt_fr+1
except EOFError: except EOFError:
pass pass
return cnt_fr if pr_time==True:
return cnt_fr,time_index
else:
return cnt_fr
def fr_export(trajfile='traj.trr', num_frames=1): def fr_export(trajfile='traj.trr', num_frames=1):
""" """
...@@ -616,10 +636,11 @@ def coord2norm2cg(coord_vector,img=True): ...@@ -616,10 +636,11 @@ def coord2norm2cg(coord_vector,img=True):
surf_points=coord_vector[step][subdomain][resid] surf_points=coord_vector[step][subdomain][resid]
else: else:
surf_points=surf_points+coord_vector[step][subdomain][resid] surf_points=surf_points+coord_vector[step][subdomain][resid]
c,normal = fitPlaneLTSQ(np.array(surf_points)) c,normal = fitPlaneLTSQ(np.array(surf_points))
surf[step][subdomain]={'c':c, 'normal':normal} surf[step][subdomain]={'c':c, 'normal':normal}
surf[step][subdomain].update(res_cg) surf[step][subdomain].update(res_cg)
if img==True: if img==True:
fl_save='png/' fl_save='png/'
save=fl_save+str(subdomain) save=fl_save+str(subdomain)
...@@ -643,7 +664,7 @@ def coord2vector(coord_vector): ...@@ -643,7 +664,7 @@ def coord2vector(coord_vector):
output: dictionary = {step:{subdomain:{resid:[x, y, z]}} output: dictionary = {step:{subdomain:{resid:[x, y, z]}}
""" """
print(' ') print(' ')
print('Finding surface progress:') print('Finding vector progress:')
print('==============================') print('==============================')
vector={} vector={}
for step in coord_vector.keys(): for step in coord_vector.keys():
...@@ -652,7 +673,10 @@ def coord2vector(coord_vector): ...@@ -652,7 +673,10 @@ def coord2vector(coord_vector):
for subdomain in coord_vector[step].keys(): for subdomain in coord_vector[step].keys():
vector[step][subdomain]={} vector[step][subdomain]={}
for resid in coord_vector[step][subdomain].keys(): for resid in coord_vector[step][subdomain].keys():
vv = points2vector(np.array(coord_vector[step][subdomain][resid])) grp=[]
for ii in coord_vector[step][subdomain][resid]:
grp.append(ii)
vv = points2vector(np.array(grp))
vector[step][subdomain][resid]=vv vector[step][subdomain][resid]=vv
bar.next() bar.next()
bar.finish() bar.finish()
...@@ -676,6 +700,11 @@ def SurfVector_angle(surf,vector): ...@@ -676,6 +700,11 @@ def SurfVector_angle(surf,vector):
angle[step]={} angle[step]={}
bar = Bar('Step: '+step, max=len(surf[step].keys())) bar = Bar('Step: '+step, max=len(surf[step].keys()))
for sudomain in surf[step].keys(): for sudomain in surf[step].keys():
try:
vector[step][sudomain].keys()
except KeyError:
#print(step, sudomain)
continue
angle[step][sudomain]={} angle[step][sudomain]={}
tot=[] tot=[]
for resid in vector[step][sudomain].keys(): for resid in vector[step][sudomain].keys():
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment