main.py 14.2 KB
Newer Older
Stelios Karozis's avatar
Stelios Karozis committed
1
import os
Stelios Karozis's avatar
Stelios Karozis committed
2
import tooba_f as tbf
3
import tooba_gmx as tbgmx
Stelios Karozis's avatar
Stelios Karozis committed
4 5 6 7 8 9
###################################################
#NOTICE:    resids of head in each subdomain may differ in tail case
#           keep all atoms of group in the first occurent subdomain
#           in case of tail is the one closest to the head, hence
#           the code is a good approximation 
###################################################
10
SYSTEM_NAME='test'
Stelios Karozis's avatar
Stelios Karozis committed
11 12
DISCET=[3.5, 3.5, 3.5]
NUM_FR=100
13 14
TRAJ=SYSTEM_NAME+'/eq_traj.trr'
GRO=SYSTEM_NAME+'/eq_final.gro'
15
TPR=SYSTEM_NAME+'/eq_run.tpr'
16
#ITP_DIC={'NS':'CER_SOVOVA.itp','FFA':'FFA_CG.itp','CHOL':'CHOL_CG.itp'}
17 18 19 20 21 22
###################################################
# {NAME:[QUEUE OF PROCESSES]}
#
#   NAME: It is user defined. A dictionary must follows with the same name.
#         The dict structure has to be: {res_type:[atom_types]}
# 
23
#         if NAME is COMBINE then it needs part or all the info from aforementioned
24 25
#         groups to execute a process. You cannot use combination as first group.
#
26 27 28 29 30 31 32 33
#   QUEUE OF PROCESSES: surf, vector, tilt, index, density, gmx_ndx, [save, [type], save_name] 
#                                            
#                       surf:                       Determine surface from atoms (ex. Head of lipid)
#                       vector:                     Determine vector that fits atoms (ex. Tail of lipid)
#                       tilt:                       Use surf and vector result to calculate angle (if NAME is COMBINE)
#                       index:                      Creates unique code (md5) for every subdomain to use in data saving process 
#                       density:                    Detrmine density profile of x,y,z and save peaks of directions with the least number 
#                       gmx_ndx:                    Saves one ndx for every subdomain
34
#                       [save, [type], save_name]:  Save result of previous function, type: pkl, json
35 36
#
###################################################
37 38
GROUPS={'ALL':['gmx_ndx','index',['save', ['pkl'],'index'],'density',['save', ['pkl'],'dens']],
        'HD_GROUP':['surf',['save', ['pkl', 'json'],'time_domain_c-normal-cg']],
Stelios Karozis's avatar
Stelios Karozis committed
39
        'TL_GROUP':['vector',['save', ['pkl'],'vec']],
40
        'COMBINE':[['HD_GROUP','surf'],['TL_GROUP','vector'],['COMB','tilt'],['save', ['pkl'],'tilt']]
41
}
42
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']}
Stelios Karozis's avatar
Stelios Karozis committed
43 44
HD_GROUP={'NS':['C6', 'Na', 'P4', 'P3', 'C7'], 'CHOL':['ROH'], 'FFA':['AC']}
TL_GROUP={'NS':['C3', 'C4', 'C5', 'C8', 'C9', 'C10'], 'CHOL':['R1', 'R2', 'R3', 'R4', 'R5'], 'FFA':['C1', 'C2', 'C3', 'C4']}
Stelios Karozis's avatar
Stelios Karozis committed
45
###################################################
Stelios Karozis's avatar
Stelios Karozis committed
46 47 48 49 50 51 52
###################################################
print(' ')
print('================')
print('Starting process')
print('================')
###################################################
###################################################
53
#Read .gro file
Stelios Karozis's avatar
Stelios Karozis committed
54
_,data_num,_,res_num,res_type,atom_type,atom_num,_ = tbf.read_gro(GRO)
Stelios Karozis's avatar
Stelios Karozis committed
55 56
print(' ')
###################################################
57
#--------------------------------------------------
Stelios Karozis's avatar
Stelios Karozis committed
58 59 60 61 62 63 64 65
#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])
###################################################
#--------------------------------------------------
66 67 68 69 70 71 72 73
#Read .itp files
#weights={}
#for MOL in ITP_DIC.keys():
#    weights_tmp = tbf.read_itp(SYSTEM_NAME+'/'+ITP_DIC[MOL])
#    weights[MOL]=weights_tmp
#    print(' ')
#print(weights)
###################################################
74
#--------------------------------------------------
75
if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_data.pkl'):
Stelios Karozis's avatar
Stelios Karozis committed
76
    pass
Stelios Karozis's avatar
Stelios Karozis committed
77
else:
78 79 80
    #Read .trr file
    data_all=tbf.fr_export(trajfile=TRAJ,num_frames=NUM_FR)
    tbf.topickle(fl=data_all, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_data')
Stelios Karozis's avatar
Stelios Karozis committed
81
    del data_all
Stelios Karozis's avatar
Stelios Karozis committed
82
###################################################
83 84 85 86
#--------------------------------------------------
#Check save files if exist in order to skip functions
prev=0
sv_index={}
87
for i in GROUPS.keys():
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
    for j in GROUPS[i]:
        try:
            sv_index[j]={}
            sv_index[j]['status']='not exist'
            sv_index[j]['name']='None'
        except TypeError:
            sv_index[str(j)]={}
            sv_index[str(j)]['status']='not exist'
            sv_index[str(j)]['name']='None'
        if len(j)==3:
            if j[0]=='save':
                for k in j[1]:
                    if k=='pkl':
                        if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_'+j[2]+'.pkl'):
                            sv_index[prev]['status']='exist'
                            sv_index[prev]['name']='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_'+j[2]+'.pkl'
                        else:
                            sv_index[prev]['status']='not exist'
                    if k=='json':    
                        if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_'+j[2]+'.pkl'):
                            sv_index[prev]['status']='exist'
                            sv_index[prev]['name']='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_'+j[2]+'.pkl'
                        else:
                            sv_index[prev]['status']='not exist'
        prev=str(j)
###################################################
#--------------------------------------------------
for i in GROUPS.keys():
#not COMBINE section
117 118
    if i!='COMBINE': 
        if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_ndx.pkl'):
Stelios Karozis's avatar
Stelios Karozis committed
119
            pass
120 121
        else:
            #Find atom type index in lists created above
122
            group_ndx=tbf.atomid_data(res_num, res_type, atom_type, atom_num, group=locals()[i])
123
            tbf.topickle(fl=group_ndx, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_ndx')
Stelios Karozis's avatar
Stelios Karozis committed
124
            del group_ndx
125
#--------------------------------------------------
126
        if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box.pkl'):
Stelios Karozis's avatar
Stelios Karozis committed
127
            pass            
128
        else:
Stelios Karozis's avatar
Stelios Karozis committed
129 130
            data_all=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_data.pkl')
            group_ndx=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_ndx.pkl')
131 132 133 134 135 136 137
            #Create subdomains coordinates
            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
            ##result1: {step:{res:{atom_type:{atom_num:(subX,subYsubZ)}}}}
            ##result2: {step:{res:{atom_type:{(subX,subYsubZ):[atom_num]}}}}
            _,box_res=tbf.atom2grid(data_all,box_p, group_ndx)
            tbf.topickle(fl=box_res, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box')
Stelios Karozis's avatar
Stelios Karozis committed
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
            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
154
###################################################
155 156
        for j in GROUPS[i]:
            if len(j) > 1:
157
                if j=='surf' and sv_index[j]['status']=='not exist':
Stelios Karozis's avatar
Stelios Karozis committed
158 159
                    if j not in locals():
                        surf={}
160
                    #Creates dictionary with c, normal per subdomain for each frame
Stelios Karozis's avatar
Stelios Karozis committed
161
                    coord_vector=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_FR'+str(NUM_FR)+'.pkl')
162
                    surf[i]=tbf.coord2norm2cg(coord_vector,img=False)
Stelios Karozis's avatar
Stelios Karozis committed
163
                    del coord_vector
164 165
                    sv_data=surf[i]
                elif j=='surf' and sv_index[j]['status']=='exist':
166 167
                    if j not in locals():
                        surf={}
168 169 170 171 172
                    surf[i]=tbf.frompickle(sv_index[j]['name'])
#--------------------------------------------------   
                if j=='vector' and sv_index[j]['status']=='not exist':
                    if j not in locals():
                        vector={}
Stelios Karozis's avatar
Stelios Karozis committed
173
                    coord_vector=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_FR'+str(NUM_FR)+'.pkl')
174
                    vector[i]=tbf.coord2vector(coord_vector)
Stelios Karozis's avatar
Stelios Karozis committed
175
                    del coord_vector
176 177 178
                    sv_data=vector[i]
                elif j=='vector' and sv_index[j]['status']=='exist':
                    if j not in locals():
179
                        vector={}
180 181 182
                    vector[i]=tbf.frompickle(sv_index[j]['name'])
#--------------------------------------------------
                if j=='index' and sv_index[j]['status']=='not exist':
183 184
                    uniq_id=tbgmx.ndx_index(SYSTEM_NAME)
                    sv_data=uniq_id
185 186 187 188
                elif j=='index' and sv_index[j]['status']=='exist':
                    uniq_id=tbf.frompickle(sv_index[j]['name'])
#--------------------------------------------------
                if j=='density' and sv_index[j]['status']=='not exist':
189 190 191
                    dens_df={}
                    for iidd in uniq_id.keys():
                        dens_df[iidd]={}
Stelios Karozis's avatar
Stelios Karozis committed
192
                        fl='./'+uniq_id[iidd]['system']+'/gmx_ndx/'+uniq_id[iidd]['ndx_file']                  
193 194
                        cnt=-1
                        for mol in locals()[i].keys():
Stelios Karozis's avatar
Stelios Karozis committed
195 196 197
                            ind=tbf.search_pattern(fl,mol)
                            if ind=='not exist':
                                break
198 199
                            cnt=cnt+1
                            for d in ('x','y','z'):
Stelios Karozis's avatar
Stelios Karozis committed
200
                                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)
201 202 203 204 205 206 207 208 209 210
                                if d=='x':
                                    tmp=peaks
                                else:
                                    print(len(tmp),len(peaks))
                                    if len(tmp)<len(peaks):
                                        peaks=tmp
                                    tmp=peaks

                            dens_df[iidd][mol]=peaks
                        sv_data=dens_df
211 212 213
                elif j=='density' and sv_index[j]['status']=='exist':
                    dens_df=tbf.frompickle(sv_index[j]['name'])
#--------------------------------------------------
214
                if j=='gmx_ndx':
Stelios Karozis's avatar
Stelios Karozis committed
215
                    box_res=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box.pkl')
216
                    tbf.togmxndx(box_res, fld='./'+SYSTEM_NAME, sv_name=SYSTEM_NAME+'_'+i)
Stelios Karozis's avatar
Stelios Karozis committed
217
                    del box_res
218 219
#--------------------------------------------------
            # Save module
220 221
            if len(j)==3:
                if j[0]=='save':
222 223 224 225 226 227 228 229 230 231
                    try:
                        sv_data
                    except NameError:
                        pass
                    else:
                        for k in j[1]:
                            if k=='pkl':
                                tbf.topickle(fl=sv_data, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_'+j[2])
                            if k=='json':    
                                tbf.tojson(fl=sv_data, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_'+j[2])
Stelios Karozis's avatar
Stelios Karozis committed
232
###################################################
233
#COMBINE section
234 235
    else:
        for j in GROUPS[i]:
236 237 238 239
            #Input to COMBINE property
            if j[0]!='COMB':
                if j[1]=='surf':
                    surf=surf[j[0]]
Stelios Karozis's avatar
Stelios Karozis committed
240
                    #del surf[j[0]]
241 242
                if j[1]=='vector':
                    vector=vector[j[0]]
Stelios Karozis's avatar
Stelios Karozis committed
243
                    #del vector[j[0]]
244 245 246 247
            #Calculate COMBINE property
            if j[0]=='COMB':
                if j[1]=='tilt' and sv_index[str(j)]['status']=='not exist':
                    tilt=tbf.SurfVector_angle(surf,vector)
Stelios Karozis's avatar
Stelios Karozis committed
248 249
                    del surf
                    del vector
250 251 252
                    #Loop over timesteps and keep avgs tilts for each step
                    avg={}
                    for step in tilt.keys():
Stelios Karozis's avatar
Stelios Karozis committed
253
                        ss=[]
254 255 256 257 258 259 260
                        for sub in tilt[step].keys():
                            avgs=tilt[step][sub]['avg/frame']
                            if sub not in ss:
                                ss.append(sub)
                                avg[sub]=avgs
                            else:
                                avg[sub].append(avgs)
Stelios Karozis's avatar
Stelios Karozis committed
261
                    del tilt
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290
                    #Calculate total average 
                    tot_avg={}
                    for sub in avg.keys():
                        for key, value in uniq_id.items():
                            if str(value['domain']).strip() == str(sub).strip():
                                hsh=key
                                break
                        try:
                            tot_avg[hsh]=sum(avg[sub])/len(avg[sub])
                        except TypeError: #in case of one frame
                            tot_avg[hsh]=sum([avg[sub]])/len([avg[sub]])
                    sv_data=tot_avg
                elif j[1]=='tilt' and sv_index[str(j)]['status']=='exist':
                    tot_avg=tbf.frompickle(sv_index[str(j)]['name'])
#--------------------------------------------------
            # Save module
            if len(j)==3:
                if j[0]=='save':
                    try:
                        sv_data
                    except NameError:
                        pass
                    else:
                        for k in j[1]:
                            if k=='pkl':
                                tbf.topickle(fl=sv_data, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_'+j[2])
                            if k=='json':    
                                tbf.tojson(fl=sv_data, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_'+j[2])             
###################################################
291
###################################################