main.py 22.1 KB
Newer Older
Stelios Karozis's avatar
Stelios Karozis committed
1
import os
2
from collections import OrderedDict
Stelios Karozis's avatar
Stelios Karozis committed
3
import pandas as pd
Stelios Karozis's avatar
Stelios Karozis committed
4
import tooba_f as tbf
5
import tooba_gmx as tbgmx
Stelios Karozis's avatar
Stelios Karozis committed
6 7 8 9 10 11
###################################################
#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 
###################################################
12
SYSTEM_NAME='Case4_20190909_5'
Stelios Karozis's avatar
Stelios Karozis committed
13
DISCET=[3.5, 3.5, 3.5]
14
NUM_FR=750
15 16
TRAJ=SYSTEM_NAME+'/eq_traj.trr'
GRO=SYSTEM_NAME+'/eq_final.gro'
17
TPR=SYSTEM_NAME+'/eq_run.tpr'
18
#ITP_DIC={'NS':'CER_SOVOVA.itp','FFA':'FFA_CG.itp','CHOL':'CHOL_CG.itp'}
19 20 21 22 23 24
###################################################
# {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]}
# 
25
#         if NAME is COMBINE then it needs part or all the info from aforementioned
26 27
#         groups to execute a process. You cannot use combination as first group.
#
28 29 30 31 32
#   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)
33 34 35 36
#                       index+FOLDER:               Saves one ndx for every subdomain and creates unique code (md5) 
#                                                     for every subdomain to use in data saving process
#                       index_order+FOLDER:         Saves one ndx for order parameter calculations for every subdomain 
#                                                     and creates unique code (md5) for every subdomain to use in data saving process
37
#                       density:                    Detrmine density profile of x,y,z and save peaks of directions with the least number 
38 39 40
#                       rdf:                        Calculate the 2D radial deistribution function g(r) and save peaks of directions with the least number
#                       order:                      Calculate the order parameter of atom chain
#                       [save, [TYPE], SAVE_NAME]:  Save result of previous function, type: pkl, json
41 42
#
###################################################
43
GROUPS=OrderedDict()
44 45
GROUPS={'ALL':['index+ALL_ndx',['save', ['pkl'],'index'],'density',['save', ['pkl'],'dens']],
        'HD_GROUP':['surf',['save', ['pkl', 'json'],'surf'],'index+HD_ndx',['save', ['pkl'],'index'],'rdf',['save', ['pkl'],'rdf']],
Stelios Karozis's avatar
Stelios Karozis committed
46
        'TL_GROUP':['vector',['save', ['pkl'],'vec']],
47 48 49 50
        'ORDER_NS_SPH':['index_order+ORDER_NS_SPH_ndx',['save', ['pkl'],'index'],'order',['save',['pkl'], 'order']],
        'ORDER_NS_ACYL':['index_order+ORDER_NS_ACYL_ndx',['save', ['pkl'],'index'],'order',['save',['pkl'], 'order']],
        'ORDER_FFA':['index_order+ORDER_FFA_ndx',['save', ['pkl'],'index'],'order',['save',['pkl'], 'order']],
        'ORDER_CHOL':['index_order+ORDER_CHOL_ndx',['save', ['pkl'],'index'],'order',['save',['pkl'], 'order']],
51
        'COMBINE':[['HD_GROUP','surf'],['TL_GROUP','vector'],['COMB','tilt'],['save', ['pkl'],'tilt']]
52
}
53
ALL=OrderedDict()
54
ALL={'NS':['C1', 'C2', 'C3', 'C4', 'C5','C6', 'Na', 'P4', 'P3', 'C7','C3', 'C4', 'C5', 'C8', 'C9', 'C10'], 'CHOL':['ROH','R1', 'R2', 'R3', 'R4', 'R5'], 'FFA':['AC','C1', 'C2', 'C3', 'C4']}
55
HD_GROUP=OrderedDict()
Stelios Karozis's avatar
Stelios Karozis committed
56
HD_GROUP={'NS':['C6', 'Na', 'P4', 'P3', 'C7'], 'CHOL':['ROH'], 'FFA':['AC']}
57
TL_GROUP=OrderedDict()
Stelios Karozis's avatar
Stelios Karozis committed
58
TL_GROUP={'NS':['C3', 'C4', 'C5', 'C8', 'C9', 'C10'], 'CHOL':['R1', 'R2', 'R3', 'R4', 'R5'], 'FFA':['C1', 'C2', 'C3', 'C4']}
59
ORDER_NS_SPH=OrderedDict()
60
ORDER_NS_SPH={'NS':['C1', 'C2', 'C3', 'C4', 'C5']} #propable problem with the same atomname of NS, FFA
61
ORDER_NS_ACYL=OrderedDict()
62
ORDER_NS_ACYL={'NS':['C8', 'C9', 'C10']}
63
ORDER_FFA=OrderedDict()
64
ORDER_FFA={'FFA':['C1', 'C2', 'C3', 'C4']}
65
ORDER_CHOL=OrderedDict()
66
ORDER_CHOL={'CHOL':['R2', 'R3', 'R4', 'R5']}
Stelios Karozis's avatar
Stelios Karozis committed
67
###################################################
Stelios Karozis's avatar
Stelios Karozis committed
68 69 70 71 72 73 74
###################################################
print(' ')
print('================')
print('Starting process')
print('================')
###################################################
###################################################
75
#Read .gro file
Stelios Karozis's avatar
Stelios Karozis committed
76
_,data_num,_,res_num,res_type,atom_type,atom_num,_ = tbf.read_gro(GRO)
Stelios Karozis's avatar
Stelios Karozis committed
77 78
print(' ')
###################################################
79
#--------------------------------------------------
Stelios Karozis's avatar
Stelios Karozis committed
80 81 82 83 84 85 86 87
#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])
###################################################
#--------------------------------------------------
88 89 90 91 92 93 94 95
#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)
###################################################
96
#--------------------------------------------------
97
if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_data.pkl'):
Stelios Karozis's avatar
Stelios Karozis committed
98
    pass
Stelios Karozis's avatar
Stelios Karozis committed
99
else:
100 101 102
    #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
103
    del data_all
Stelios Karozis's avatar
Stelios Karozis committed
104
###################################################
105 106 107 108
#--------------------------------------------------
#Check save files if exist in order to skip functions
prev=0
sv_index={}
109
ndx_fl={}
110
for i in GROUPS.keys():
111 112 113
    sv_index[i]={}
    ndx_fl[i]={}
    cnt_ndx=-1
114
    for j in GROUPS[i]:
115
        cnt_ndx=cnt_ndx+1
116
        try:
117 118 119 120 121 122 123 124 125 126 127
            if j.split('+')[0]=='index' or j.split('+')[0]=='index_order':
                ndx_fl[i][j.split('+')[0]]=j.split('+')[1]
                j=j.split('+')[0] #generalize index function
                GROUPS[i][cnt_ndx]=j 
        except:
            pass

        try:
            sv_index[i][j]={}
            sv_index[i][j]['status']='not exist'
            sv_index[i][j]['name']='None'
128
        except TypeError:
129 130 131
            sv_index[i][str(j)]={}
            sv_index[i][str(j)]['status']='not exist'
            sv_index[i][str(j)]['name']='None'
132 133 134 135 136
        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'):
137 138
                            sv_index[i][prev]['status']='exist'
                            sv_index[i][prev]['name']='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_'+j[2]+'.pkl'
139
                        else:
140
                            sv_index[i][prev]['status']='not exist'
141 142
                    if k=='json':    
                        if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_'+j[2]+'.pkl'):
143 144
                            sv_index[i][prev]['status']='exist'
                            sv_index[i][prev]['name']='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_'+j[2]+'.pkl'
145
                        else:
146
                            sv_index[i][prev]['status']='not exist'
147 148 149
        prev=str(j)
###################################################
#--------------------------------------------------
Stelios Karozis's avatar
Stelios Karozis committed
150
mrg_data={}
151
for i in GROUPS.keys():
Stelios Karozis's avatar
Stelios Karozis committed
152
    mrg_data[i]={}
153
#not COMBINE section
154 155
    if i!='COMBINE': 
        if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_ndx.pkl'):
Stelios Karozis's avatar
Stelios Karozis committed
156
            pass
157 158
        else:
            #Find atom type index in lists created above
159 160 161
            print('')
            print('Group: ',i)
            print('++++++++++++++++++++++++')
162
            group_ndx=tbf.atomid_data(res_num, res_type, atom_type, atom_num, group=locals()[i])
163
            tbf.topickle(fl=group_ndx, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_ndx')
Stelios Karozis's avatar
Stelios Karozis committed
164
            del group_ndx
165
#--------------------------------------------------
166
        if os.path.isfile('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box.pkl'):
Stelios Karozis's avatar
Stelios Karozis committed
167
            pass            
168
        else:
Stelios Karozis's avatar
Stelios Karozis committed
169 170
            data_all=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_data.pkl')
            group_ndx=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_ndx.pkl')
171 172 173 174 175
            #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]}}}}
176 177
            #todo keep fixed the initial domain name and the molecules that are grouped for all the steps
            _,box_res=tbf.atom2group(data_all,box_p, group_ndx)
178
            tbf.topickle(fl=box_res, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box')
Stelios Karozis's avatar
Stelios Karozis committed
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
            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
195
###################################################
196 197
        for j in GROUPS[i]:
            if len(j) > 1:
198
                if j=='surf' and sv_index[i][j]['status']=='not exist':
Stelios Karozis's avatar
Stelios Karozis committed
199 200
                    if j not in locals():
                        surf={}
201
                    #Creates dictionary with c, normal per subdomain for each frame
Stelios Karozis's avatar
Stelios Karozis committed
202
                    coord_vector=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_FR'+str(NUM_FR)+'.pkl')
203
                    surf[i]=tbf.coord2norm2cg(coord_vector,img=False)
Stelios Karozis's avatar
Stelios Karozis committed
204
                    del coord_vector
205
                    sv_data=surf[i]
206
                elif j=='surf' and sv_index[i][j]['status']=='exist':
207 208
                    if j not in locals():
                        surf={}
209
                    surf[i]=tbf.frompickle(sv_index[i][j]['name'])
210
#--------------------------------------------------   
211
                if j=='vector' and sv_index[i][j]['status']=='not exist':
212 213
                    if j not in locals():
                        vector={}
Stelios Karozis's avatar
Stelios Karozis committed
214
                    coord_vector=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_FR'+str(NUM_FR)+'.pkl')
215
                    vector[i]=tbf.coord2vector(coord_vector)
Stelios Karozis's avatar
Stelios Karozis committed
216
                    del coord_vector
217
                    sv_data=vector[i]
218
                elif j=='vector' and sv_index[i][j]['status']=='exist':
219
                    if j not in locals():
220
                        vector={}
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237
                    vector[i]=tbf.frompickle(sv_index[i][j]['name'])
#--------------------------------------------------
#ToDo: make more generic file with ndx files and ndx for order parameter
#As for now the hash value is generic (system+domain coord), but needs to run for every input group
                if j=='index' and sv_index[i][j]['status']=='not exist':
                    box_res=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box.pkl')
                    tbf.togmxndx(box_res, fld='./'+SYSTEM_NAME+'/'+ndx_fl[i][j], sv_name=SYSTEM_NAME+'_'+i)
                    del box_res

                    uniq_id=tbgmx.ndx_index(SYSTEM_NAME,ndx_fl[i][j])
                    sv_data=uniq_id
                elif j=='index' and sv_index[i][j]['status']=='exist':
                    box_res=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box.pkl')
                    tbf.togmxndx(box_res, fld='./'+SYSTEM_NAME+'/'+ndx_fl[i][j], sv_name=SYSTEM_NAME+'_'+i)
                    del box_res

                    uniq_id=tbf.frompickle(sv_index[i][j]['name'])
238
#--------------------------------------------------
239 240 241 242 243 244 245
                if j=='index_order' and sv_index[i][j]['status']=='not exist':
                    box_res=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box.pkl')
                    for mol, atoms in locals()[i].items():
                        tbgmx.order_ndx(box_res, fld='./'+SYSTEM_NAME+'/'+ndx_fl[i][j], atoms=atoms, sv_name=SYSTEM_NAME+'_'+i)
                    del box_res

                    uniq_id=tbgmx.ndx_index(SYSTEM_NAME,ndx_fl[i][j])
246
                    sv_data=uniq_id
247 248 249 250 251 252 253
                elif j=='index_order' and sv_index[i][j]['status']=='exist':
                    box_res=tbf.frompickle('./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_box.pkl')
                    for mol, atoms in locals()[i].items():
                        tbgmx.order_ndx(box_res, fld='./'+SYSTEM_NAME+'/'+ndx_fl[i][j], atoms=atoms, sv_name=SYSTEM_NAME+'_'+i)
                    del box_res

                    uniq_id=tbf.frompickle(sv_index[i][j]['name'])
254
#--------------------------------------------------
255
                if j=='density' and sv_index[i][j]['status']=='not exist':
Stelios Karozis's avatar
Stelios Karozis committed
256
                    dens_dict={}
257
                    for iidd in uniq_id.keys():
Stelios Karozis's avatar
Stelios Karozis committed
258
                        dens_dict[iidd]={}
259
                        fl='./'+uniq_id[iidd]['system']+'/'+uniq_id[iidd]['fld']+'/'+uniq_id[iidd]['ndx_file']                  
260 261
                        cnt=-1
                        for mol in locals()[i].keys():
Stelios Karozis's avatar
Stelios Karozis committed
262 263 264
                            ind=tbf.search_pattern(fl,mol)
                            if ind=='not exist':
                                break
265 266
                            cnt=cnt+1
                            for d in ('x','y','z'):
267
                                peaks = tbgmx.density_peaks(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)
268 269 270
                                if d=='x':
                                    tmp=peaks
                                else:
271
                                    #print(len(tmp),len(peaks))
272 273 274
                                    if len(tmp)<len(peaks):
                                        peaks=tmp
                                    tmp=peaks
Stelios Karozis's avatar
Stelios Karozis committed
275
                            dens_nm=mol+'_dens_'+uniq_id[iidd]['fld']
Stelios Karozis's avatar
Stelios Karozis committed
276 277
                            dens_dict[iidd][dens_nm]=peaks
                        sv_data=dens_dict
Stelios Karozis's avatar
Stelios Karozis committed
278
                        mrg_data[i][j]=[dens_dict,[]]
Stelios Karozis's avatar
Stelios Karozis committed
279
                    del dens_dict
280 281
                elif j=='density' and sv_index[i][j]['status']=='exist':
                    dens_dict=tbf.frompickle(sv_index[i][j]['name'])
Stelios Karozis's avatar
Stelios Karozis committed
282
                    mrg_data[i][j]=[dens_dict,[]]
Stelios Karozis's avatar
Stelios Karozis committed
283
                    del dens_dict
284
#--------------------------------------------------
285 286 287 288 289 290 291 292 293 294 295 296 297
                if j=='rdf' and sv_index[i][j]['status']=='not exist':
                    rdf_dict={}
                    for iidd in uniq_id.keys():
                        rdf_dict[iidd]={}
                        fl='./'+uniq_id[iidd]['system']+'/'+uniq_id[iidd]['fld']+'/'+uniq_id[iidd]['ndx_file']                  
                        cnt1=-1
                        for mol1 in locals()[i].keys():
                            ind=tbf.search_pattern(fl,mol1)
                            if ind=='not exist':
                                break
                            cnt1=cnt1+1
                            cnt2=-1
                            for mol2 in locals()[i].keys():
Stelios Karozis's avatar
Stelios Karozis committed
298 299 300
                                #ind=tbf.search_pattern(fl,mol2)
                                #if ind=='not exist':
                                    #break
301 302
                                cnt2=cnt2+1
                                peaks = tbgmx.rdf_peaks(TRR=TRAJ,TPR=TPR,IND=fl,ST=time_index[ST_FR],EN=-1,fld='./'+uniq_id[iidd]['system'],arg1=cnt1,arg2=cnt2,dist_pk=20)
Stelios Karozis's avatar
Stelios Karozis committed
303
                            rdf_nm=mol1+'-'+mol2+'_rdf_'+uniq_id[iidd]['fld']
304 305
                            rdf_dict[iidd][rdf_nm]=peaks
                        sv_data=rdf_dict
Stelios Karozis's avatar
Stelios Karozis committed
306
                        mrg_data[i][j]=[rdf_dict,[]]
307 308 309
                    del rdf_dict
                elif j=='rdf' and sv_index[i][j]['status']=='exist':
                    rdf_dict=tbf.frompickle(sv_index[i][j]['name'])
Stelios Karozis's avatar
Stelios Karozis committed
310
                    mrg_data[i][j]=[rdf_dict,[]]
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
                    del rdf_dict
#--------------------------------------------------
                if j=='order' and sv_index[i][j]['status']=='not exist':
                    order_dict={}
                    for iidd in uniq_id.keys():
                        order_dict[iidd]={}
                        #fl='./'+uniq_id[iidd]['system']+'order_'+i+uniq_id[iidd]['ndx_file']                  
                        fl='./'+uniq_id[iidd]['system']+'/'+uniq_id[iidd]['fld']+'/'+uniq_id[iidd]['ndx_file']
                        for d in ('x','y','z'):
                            yy = tbgmx.order(TRR=TRAJ,TPR=TPR,IND=fl,ST=time_index[ST_FR],EN=-1,normal=d,fld='./'+uniq_id[iidd]['system'],dist_pk=1)
                            if d=='x':
                                tmp=yy
                            else:
                                #print(len(tmp),len(peaks))
                                if max(tmp)>max(yy):
                                    yy=tmp
                                tmp=yy
Stelios Karozis's avatar
Stelios Karozis committed
328
                        order_nm=mol+'_order_'+uniq_id[iidd]['fld']
329 330
                        order_dict[iidd][order_nm]=yy
                        sv_data=order_dict
Stelios Karozis's avatar
Stelios Karozis committed
331
                        mrg_data[i][j]=[order_dict,[]]
332 333 334
                    del order_dict
                elif j=='order' and sv_index[i][j]['status']=='exist':
                    order_dict=tbf.frompickle(sv_index[i][j]['name'])
Stelios Karozis's avatar
Stelios Karozis committed
335
                    mrg_data[i][j]=[order_dict,[]]
336
                    del order_dict
337 338
#--------------------------------------------------
            # Save module
339 340
            if len(j)==3:
                if j[0]=='save':
341 342 343 344 345 346 347 348 349 350
                    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])
351
                        del sv_data
Stelios Karozis's avatar
Stelios Karozis committed
352
###################################################
353
#COMBINE section
354 355
    else:
        for j in GROUPS[i]:
356 357 358
            #Input to COMBINE property
            if j[0]!='COMB':
                if j[1]=='surf':
359
                    surf_inuse=surf[j[0]]
Stelios Karozis's avatar
Stelios Karozis committed
360
                    #del surf[j[0]]
361
                if j[1]=='vector':
362
                    vector_inuse=vector[j[0]]
Stelios Karozis's avatar
Stelios Karozis committed
363
                    #del vector[j[0]]
364 365
            #Calculate COMBINE property
            if j[0]=='COMB':
366
                if j[1]=='tilt' and sv_index[i][str(j)]['status']=='not exist':
367 368 369 370
                    tilt=tbf.SurfVector_angle(surf_inuse,vector_inuse)
                    #ToDo: check  "if str(value['domain']).strip() == str(sub).strip():"
                    del surf_inuse
                    del vector_inuse
371 372 373
                    #Loop over timesteps and keep avgs tilts for each step
                    avg={}
                    for step in tilt.keys():
Stelios Karozis's avatar
Stelios Karozis committed
374
                        ss=[]
375 376 377 378 379 380 381
                        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)
382
                    #del tilt
383 384 385 386 387 388 389 390 391 392 393 394
                    #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
Stelios Karozis's avatar
Stelios Karozis committed
395
                    mrg_data[i][j[1]]=[tot_avg,['Tilt[degrees]']]
Stelios Karozis's avatar
Stelios Karozis committed
396
                    del tot_avg
397 398
                elif j[1]=='tilt' and sv_index[i][str(j)]['status']=='exist':
                    tot_avg=tbf.frompickle(sv_index[i][str(j)]['name'])
Stelios Karozis's avatar
Stelios Karozis committed
399
                    mrg_data[i][j[1]]=[tot_avg,['Tilt[degrees]']]
Stelios Karozis's avatar
Stelios Karozis committed
400
                    del tot_avg
401 402 403 404 405 406 407 408 409 410 411 412 413
#--------------------------------------------------
            # 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':    
414 415
                                tbf.tojson(fl=sv_data, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_'+i+'_'+j[2])   
                        del sv_data          
416
###################################################
Stelios Karozis's avatar
Stelios Karozis committed
417 418 419 420 421
#Merge data
tbf.topickle(fl=mrg_data, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_merge')
print(' ')
print('Merging data of:')
print('==============================')
Stelios Karozis's avatar
Stelios Karozis committed
422 423 424 425 426 427 428 429 430 431 432
for grp in mrg_data.keys():
    for tp in mrg_data[grp].keys():
        if len(mrg_data[grp][tp][1])!=0:
            df=pd.DataFrame.from_dict(mrg_data[grp][tp][0], orient='index',columns=mrg_data[grp][tp][1])
        else:
            df=pd.DataFrame.from_dict(mrg_data[grp][tp][0], orient='index')
        try:
            data_df=data_df.join(df)
        except:
            data_df=df.copy()
            continue
Stelios Karozis's avatar
Stelios Karozis committed
433
tbf.topickle(fl=data_df, sv_name='./'+SYSTEM_NAME+'/'+SYSTEM_NAME+'_dataset')
434
print(data_df.head())
Stelios Karozis's avatar
Stelios Karozis committed
435
###################################################
436
###################################################