source: rotdif/bin/rotdif.py @ 1471

Last change on this file since 1471 was 1471, checked in by alexey, 2 years ago

ROTDIF

  • Property svn:executable set to *
File size: 18.2 KB
Line 
1#!/usr/bin/python
2
3import os
4import glob
5import re
6import shutil
7import sys
8import subprocess
9import json
10import cStringIO
11import shlex 
12import socket
13import time
14import pty
15import select
16import atexit
17import signal
18import functools
19import itertools
20import math
21
22from itertools import groupby
23from matplotlib import cm, colors
24
25from StringIO import StringIO
26#from math import exp, expm1, log10, log, log1p
27from subprocess import Popen, PIPE, STDOUT
28
29if (len(sys.argv) < 1):
30    print "\{\"error\":\"module called with no arguments\"\}\n";
31
32##############################################################################
33def FileNameArr():
34    ExpArr       = []
35    FitArr_upper = []
36    FitArr_lower = []
37    LabelArr     = []
38    Surface3d    = []
39    Exp3d        = []
40   
41    for root, dirs, files in os.walk('./'):
42        for name in files:
43            filename = os.path.join(root, name)
44           
45            if '2d_fit_upper' in filename:
46                FitArr_upper.append(filename)
47
48            if '2d_fit_lower' in filename:
49                FitArr_lower.append(filename)
50               
51            if '2d_exp_' in filename:
52                ExpArr.append(filename)
53               
54            if '2d_label_' in filename:
55                LabelArr.append(filename) 
56               
57            if '3d_surface_' in filename:
58                Surface3d.append(filename)
59           
60            if '3d_exp_points_' in filename:
61                Exp3d.append(filename)
62    ExpArr.sort()
63    FitArr_upper.sort()
64    FitArr_lower.sort()
65    LabelArr.sort()
66    Surface3d.sort()
67    Exp3d.sort()
68
69    return ExpArr, FitArr_upper, FitArr_lower, LabelArr, Surface3d, Exp3d
70
71################################################################################
72def GetData(filename):
73    file = open(filename, 'rU')
74    data = file.readlines()
75    file.close()
76       
77    xData = []
78    yData = []
79    eData = []
80    tData = []
81   
82    for line in data:
83        xData.append(re.split(r'[\s]*', line)[0])
84        yData.append(re.split(r'[\s]*', line)[1])
85        if '2d_exp_' in filename:
86            eData.append(re.split(r'[\s]*', line)[2])
87           
88            tooltipArr = re.split(r'[\s]*', line)[-3:]
89            tooltipStr = ""
90            for ch in range(len(tooltipArr)):
91                tooltipStr += tooltipArr[ch] + " " 
92            tooltipStr.rstrip() 
93            tData.append(tooltipStr)
94
95    return xData, yData, eData, tData
96
97##########################################################   
98def GetData_3d(filename):
99    file = open(filename, 'rU')
100    data = file.readlines()
101    file.close()
102       
103    xData = []
104    yData = []
105    zData = []
106       
107    for line in data:
108        xData.append(re.split(r'[\s]*', line)[0])
109        yData.append(re.split(r'[\s]*', line)[1])
110        zData.append(re.split(r'[\s]*', line)[2])
111
112    return xData, yData, zData
113
114################################################################################
115def GetLabels(filename):
116    file = open(filename, 'rU')
117    data = file.readlines()
118    file.close()
119       
120    Labels = []
121   
122    for line in data:
123        Labels.append(line)
124       
125    return Labels
126
127##################################################################################
128def message_box(text,icon):
129   
130    _message = {}
131    _message['icon'] = icon
132    _message['text'] = text
133   
134    UDP_IP = json_variables['_udphost']
135    UDP_PORT = json_variables['_udpport']
136    sock = socket.socket(socket.AF_INET, # Internet
137                         socket.SOCK_DGRAM) # UDP
138   
139    socket_dict={}
140    socket_dict['_uuid'] = json_variables['_uuid']
141    socket_dict['_message'] = _message
142
143    doc_string = json.dumps(socket_dict)
144    sock.sendto(doc_string,(UDP_IP,UDP_PORT))
145   
146    return
147
148#### MAIN ####################################################################
149
150
151output_res = {}
152json_variables = " "
153
154
155InitialDirectoryStr = os.path.abspath(os.path.dirname(sys.argv[0]))
156#InputDir = InitialDirectoryStr + '/willitfit_source/Source'
157
158argv_io_string = StringIO(sys.argv[1])
159json_variables = json.load(argv_io_string)
160
161relax_location = json_variables['relax_location']
162RelaxStr = relax_location[0]
163Relaxfilename = os.path.basename(RelaxStr)
164
165
166pdb_location   = json_variables['pdb_location']
167PdbStr = pdb_location[0]
168Pdbfilename = os.path.basename(PdbStr)
169
170
171## Clean Up ######################################################
172for CleanUp in glob.glob('./2d_*'):                           
173    #print CleanUp
174    #exit()
175    #if not CleanUp.endswith(Coorfilename):
176    os.remove(CleanUp)
177
178for CleanUp in glob.glob('./3d_*'):                           
179    os.remove(CleanUp)
180
181
182for CleanUp in glob.glob('./*.txt'): 
183    print CleanUp, Relaxfilename
184    #exit()
185    if not CleanUp.endswith(Relaxfilename):
186        os.remove(CleanUp)
187
188for CleanUp in glob.glob('./*.out'): 
189    os.remove(CleanUp)
190
191for CleanUp in glob.glob('./*.pdb'):
192    if not CleanUp.endswith(Pdbfilename):
193        os.remove(CleanUp)
194   
195## UDP messaging ##################################################
196UDP_IP = json_variables['_udphost']
197UDP_PORT = json_variables['_udpport']
198sock = socket.socket(socket.AF_INET, # Internet
199        socket.SOCK_DGRAM) # UDP
200
201socket_dict={}
202socket_dict['_uuid'] = json_variables['_uuid']
203
204
205base_dir = json_variables[ '_base_directory' ]
206
207optimization_method_list = json_variables[ 'optimization_method' ]
208
209ExecutableFileLocationRotdif = '/opt/genapp/rotdif/bin/rotdif-1.1.jar'
210######################################################################
211ProcessToCallRotdif = []
212ProcessToCallRotdif.append('/usr/bin/java')
213ProcessToCallRotdif.append('-jar')
214#ProcessToCallRotdif.append('rotdif-1.1.jar')
215ProcessToCallRotdif.append(ExecutableFileLocationRotdif)
216
217ProcessToCallRotdif.append('-nogui')
218
219#if 'rundyn' not in json_variables:
220#    ProcessToCallRotdif.append('-nodynamics')
221
222#if 'runelmpred' in json_variables:
223#    ProcessToCallRotdif.append('-elm')
224
225#if 'runelmdoc' in json_variables:
226#    ProcessToCallRotdif.append('-dock')
227
228#ProcessToCallRotdif.append('-temp')
229#ProcessToCallRotdif.append(json_variables['temperature'])
230
231#ProcessToCallRotdif.append('-out')
232#ProcessToCallRotdif.append(json_variables['outfile'])
233
234#if 'axes' in json_variables:
235#    ProcessToCallRotdif.append('-axes')
236
237#ProcessToCallRotdif.append('-axesl')
238#ProcessToCallRotdif.append(json_variables['axeslength'])
239
240
241ProcessToCallRotdif.append('-pdb')
242ProcessToCallRotdif.append(Pdbfilename)
243
244if optimization_method_list == 'robust':
245    ProcessToCallRotdif.append('-robust')
246
247ProcessToCallRotdif.append('-relax')
248ProcessToCallRotdif.append(Relaxfilename)
249
250if 'stat' not in json_variables:
251    ProcessToCallRotdif.append('-nostat')
252
253#print ProcessToCallRotdif
254#exit()
255## RUN ROTDIF MD  ##########################################################
256
257socket_dict["_textarea"] = 'Starting ROTDIF...\n\n'
258if socket_dict:
259    doc_string = json.dumps(socket_dict)
260    sock.sendto(doc_string,(UDP_IP,UDP_PORT))
261
262master_rotdif, slave_rotdif = pty.openpty()
263ProcessRotdif = subprocess.Popen( ProcessToCallRotdif,stdout=slave_rotdif,stdin=PIPE,bufsize=0,close_fds=True)
264   
265stdout_rotdif = os.fdopen(master_rotdif, 'r', 0)
266rotdif_log = open('rotdif_log.out','w')
267path_to_live_log = str(base_dir) + "/" + 'rotdif_log.out'
268
269#html_base  = json_variables['_osroot']
270##application= json_variables['_application']
271#path_updated = path_to_live_log.replace(html_base + "/", "")
272##path_updated_1 = application + path_updated
273#path_updated_1 =  path_updated
274##print "Webroot: " + html_base + ", application: " + application +  ", pathupdated: " + path_updated + ", pathupdated_1: " + path_updated_1
275##exit()
276#socket_dict['live_log'] =  "<a href=" + path_updated_1 + " target='_blank'>" + "Output Log File" + "</a>"
277##socket_dict['live_log'] = path_updated_1
278
279
280error_string_md = ''
281timeout = .04 # seconds
282
283
284while True:
285    ready, _, _ = select.select([master_rotdif], [], [], timeout)
286    if ready:
287        output = stdout_rotdif.readline()
288        #output = stdout_rotdif.read(10)
289        if not output:
290            break
291        if output:
292            socket_dict["_textarea"] = output#.strip()
293            print >> rotdif_log, output.rstrip()
294            rotdif_log.flush()
295           
296            if "Percent" in output:
297                output_strip = output.strip()
298                OutArr = re.split(r'[\s]*', output_strip)
299                percent = OutArr[1][:-1]
300                socket_dict['progress_output'] = float(percent)/float(100)
301                socket_dict['progress_text'] = 'ROTDIF calculation progress: ' + str(int (float( percent ))) + '%'
302               
303            if socket_dict:
304                doc_string = json.dumps(socket_dict)
305                sock.sendto(doc_string,(UDP_IP,UDP_PORT))
306                #time.sleep(0.002)
307    elif ProcessRotdif.poll() is not None: 
308        break
309             
310ProcessRotdif.wait()
311os.close(slave_rotdif)
312os.close(master_rotdif)
313                           
314socket_dict["_textarea"] = '\nROTDIF Calculations Completed...\n\n'
315
316if socket_dict:
317    doc_string = json.dumps(socket_dict)
318    sock.sendto(doc_string,(UDP_IP,UDP_PORT))
319                           
320                           
321output_res[ 'progress_output' ] = str(1.0)
322output_res[ 'progress_text' ] =  'ROTDIF calculation progress: ' + '100%' 
323### PLOT ##############################################################
324
325output_plot_2d_fit_upper = []
326output_plot_2d_fit_lower = []
327output_plot_2d_exp       = []
328output_plot_2d_rexp      = []
329labels                   = []
330
331output_plot_3d_surface   = []
332output_plot_3d_expp      = []
333
334min_data_x = []
335min_data_y = []
336max_data_x = []
337max_data_y = []
338
339num_exp       = len(FileNameArr()[0])
340num_fit_upper = len(FileNameArr()[1])
341num_fit_lower = len(FileNameArr()[2])
342
343# resizing
344for i in range(num_exp):
345    output_plot_2d_exp.append([])
346    output_plot_2d_rexp.append([])
347    output_plot_3d_surface.append([])
348    output_plot_3d_expp.append([])
349for i in range(num_fit_upper):
350    output_plot_2d_fit_upper.append([])
351for i in range(num_fit_lower):
352    output_plot_2d_fit_lower.append([])
353
354
355#Exp - providing numbers of Exp, Fit and Labels sets ARE the same ...
356for i in range(num_exp):
357    print "Filename/Label/LabelArr: " + FileNameArr()[0][i] + " / " + FileNameArr()[3][i] 
358
359    xExpArr = GetData(FileNameArr()[0][i])[0]
360    yExpArr = GetData(FileNameArr()[0][i])[1]
361    eExpArr = GetData(FileNameArr()[0][i])[2]   
362    rExpArr = GetData(FileNameArr()[0][i])[3]   
363
364    xFupArr = GetData(FileNameArr()[1][i])[0]
365    yFupArr = GetData(FileNameArr()[1][i])[1]
366    eFupArr = GetData(FileNameArr()[1][i])[2]   
367
368    xFloArr = GetData(FileNameArr()[2][i])[0]
369    yFloArr = GetData(FileNameArr()[2][i])[1]
370    eFloArr = GetData(FileNameArr()[2][i])[2] 
371
372    labels.append( GetLabels(FileNameArr()[3][i]) ) 
373
374    xExpArr_3d = GetData_3d(FileNameArr()[4][i])[0]
375    yExpArr_3d = GetData_3d(FileNameArr()[4][i])[1]
376    zExpArr_3d = GetData_3d(FileNameArr()[4][i])[2]   
377
378    xExpArr_3d_expp = GetData_3d(FileNameArr()[5][i])[0]
379    yExpArr_3d_expp = GetData_3d(FileNameArr()[5][i])[1]
380    zExpArr_3d_expp = GetData_3d(FileNameArr()[5][i])[2]   
381
382    #xFupArrsorted = xFupArr.sort()
383    #yFupArrsorted = yFupArr.sort()
384       
385    min_data_x.append( min(ii for ii in xFupArr ) )
386    min_data_y.append( min(ii for ii in yExpArr ) )
387    max_data_x.append( max(ii for ii in xFupArr ) )
388    max_data_y.append( max(ii for ii in yExpArr ) )
389       
390    numpoints_exp = len(xExpArr)
391    numpoints_fup = len(xFupArr)
392    numpoints_flo = len(xFloArr)
393           
394    for j in range(numpoints_exp):
395        output_plot_2d_exp[i].append([xExpArr[j],yExpArr[j],eExpArr[j]]) 
396        output_plot_2d_rexp[i].append([rExpArr[j]]) 
397    for j in range(numpoints_fup):
398        output_plot_2d_fit_upper[i].append([xFupArr[j],yFupArr[j]])     
399    for j in range(numpoints_fup):
400        output_plot_2d_fit_lower[i].append([xFloArr[j],yFloArr[j]]) 
401
402    output_plot_3d_surface[i].append(xExpArr_3d)
403    output_plot_3d_surface[i].append(yExpArr_3d)
404    output_plot_3d_surface[i].append(zExpArr_3d) 
405
406    output_plot_3d_expp[i].append(xExpArr_3d_expp)
407    output_plot_3d_expp[i].append(yExpArr_3d_expp)
408    output_plot_3d_expp[i].append(zExpArr_3d_expp) 
409   
410
411## Plotting with FLOT #####################################################
412
413min_x = min(min_data_x)
414min_y = min(min_data_y)
415max_x = max(max_data_x)
416max_y = max(max_data_y)
417
418min_y1 = float(min_y) - 0.2
419max_y1 = float(max_y) + 0.2
420
421#output_res[ 'error' ] = min_x + " " + max_x + " " + str(min_y1) + " " + str(max_y1)
422#print "max_y: ", max_data_y
423
424xscale = ''
425yscale = ''
426
427flot_data = {
428    "options": 
429    {
430        "title"  : "Experimental &#961;",
431        #"xscale" : "log",
432        #"yscale" : "log",
433        #"xmin"   : min_x,
434        #"xmax"   : max_x,
435        "ymin"   : min_y1,
436        "ymax"   : max_y1,
437        "xlabel" : "&#952;",
438        "ylabel" : "&#961;(Exp.)",
439        "legend" :
440        {           
441            "position"            : "ne",
442            "margin"              : [-140, -1],
443            "backgroundColor"     : "null",
444            "labelBoxBorderColor" : "#000000",
445         },
446        "grid" : 
447        {
448            "backgroundColor" : "#ffffff",
449            "margin"    : 
450                              { 
451                                  "top"    : 0, 
452                                  "left"   : 0,
453                                  "bottom" : 0,
454                                  "right"  : 140
455                              }
456        },
457    },
458    "data": [ ]
459}
460
461## COLORS from Set1 ColorMap ###################################
462colorArr = []
463MaxNumColors = 100
464colorIncr = int( round(MaxNumColors/num_exp, 0) - 1)
465if colorIncr < 0:
466    MaxNumColors = num_exp
467    colorIncr = 1
468
469cmap = cm.get_cmap('Set1', MaxNumColors)   
470
471for i in range(cmap.N):
472    rgb = cmap(i)[:3] # will return rgba, we take only first 3 so we get rgb
473    colorArr.append(colors.rgb2hex(rgb))
474
475################################################################
476
477#colorArr = ['red', 'green', 'blue', 'orange', 'cyan']
478
479## 3D with PLOTLY.JS ############################################################
480data_3d = {
481    "layout" : {
482        "scene": {
483            "xaxis" : { 
484                "title"           : "Theta (Deg)",
485                "backgroundcolor" : "rgb(200, 200, 230)",
486                "gridcolor"       : "rgb(128, 128, 128)",
487                "showbackground"  : "true",
488                "zerolinecolor"   : "rgb(128, 128, 128)"
489            },
490            "yaxis" : { 
491                "title" : "Phi (Deg)",
492                "backgroundcolor" : "rgb(230, 200,230)",
493                "gridcolor"       : "rgb(128, 128, 128)",
494                "showbackground"  : "true",
495                "zerolinecolor"   : "rgb(128, 128, 128)",
496                "range"           : [-179, 180]
497            },
498            "zaxis" : { 
499                "title" : "Rho",
500                "backgroundcolor" : "rgb(230, 230,200)",
501                "gridcolor"       : "rgb(128, 128, 128)",
502                "showbackground"  : "true",
503                "zerolinecolor"   : "rgb(128, 128, 128)"
504            },
505            "camera": {
506                "center" : { "x": 0, "y": 0, "z": 0 }, 
507                "eye"    : { "x": 2, "y": 2, "z": 1 }, 
508                "up"     : { "x": 0, "y": 0, "z": 1 }
509            }
510        },
511        "showlegend" : "false",
512        "autosize" : "false",
513        "width" : 550,
514        "height": 550,
515        "margin": {
516         "l": 0,
517         "r": 0,
518         "b": 0,
519         "t": 0,
520         "pad": 4
521        },
522    },
523    "data"   : []
524}
525
526for i in range(num_exp):
527   # print output_plot_3d_surface[i][0]
528   # exit();
529    current_set_surf = {
530        "type"    :  "mesh3d",
531        "opacity" :  0.6,
532        "x"       :  output_plot_3d_surface[i][0],
533        "y"       :  output_plot_3d_surface[i][1],
534        "z"       :  output_plot_3d_surface[i][2],
535        "color"   :  colorArr[ i*colorIncr ]
536    }
537    data_3d['data'].append(current_set_surf)
538
539for i in range(num_exp):
540   # print output_plot_3d_expp[i][0]
541   # exit();
542    current_set_3d_expp = {
543        "type"    :  "scatter3d",
544        "mode"    :  "markers",
545        "marker"  : {
546            "color"   : colorArr[ i*colorIncr ],
547            "size"    : 2,
548            "symbol"  : 'square',
549            "line"    :  {
550                "color"  : "rgb(0,0,0)",
551                "width"  : 1.5 
552            },
553            "opacity" : 1.0
554        },
555        "opacity" :  1.0,
556        "x"       :  output_plot_3d_expp[i][0],
557        "y"       :  output_plot_3d_expp[i][1],
558        "z"       :  output_plot_3d_expp[i][2],
559        "color"   :  colorArr[ i*colorIncr ]
560    }
561    data_3d['data'].append(current_set_3d_expp)
562
563### 2D ###########################################################
564for i in range(num_exp):
565    #data_label = "Data" + str(i+1)
566    data_label = labels[i]
567    current_set_data = {
568        "points"  : { "show"      : "true", 
569                      "radius"    : 2,
570                      "errorbars" : "y", 
571                      "yerr"      : { "lowerCap" : "-",
572                                      "upperCap" : "-", 
573                                      "show"     : "true", 
574                                      #"color"    : "red",
575                                      "radius"   : 3 
576                                  }
577                  },
578        "label"  : data_label,
579        "data"   : output_plot_2d_exp[i],
580        "tooltips"  : output_plot_2d_rexp[i],
581        "color"  : colorArr[ i*colorIncr ]
582    }
583    flot_data['data'].append(current_set_data)
584
585
586for i in range(num_exp):
587    fit_label = "Fit" + str(i+1)
588    current_set_fit = {
589        "lines"  : { "show" : "true"  },
590        #"label"  : fit_label,
591        "data"   : output_plot_2d_fit_upper[i],
592        "color"  : colorArr[ i*colorIncr ]
593    }
594    flot_data['data'].append(current_set_fit)
595 
596
597for i in range(num_exp):
598    fit_label = "Fit" + str(i+1)
599    current_set_fit = {
600        "lines"  : { "show" : "true" },
601        #"label"  : fit_label,
602        "data"   : output_plot_2d_fit_lower[i],
603         "color"  : colorArr[ i*colorIncr ]
604    }
605    flot_data['data'].append(current_set_fit)
606
607
608
609##########################################################################
610
611outputmd_arr_files = []
612namdlog = str(base_dir) + "/" + 'rotdif_log.out'
613#namdlog = str(base_dir) + "/" + 'output'
614
615if os.path.exists(namdlog):
616    outputmd_arr_files.append(namdlog)
617
618
619output_res[ 'outputrotdif' ] = outputmd_arr_files
620output_res[ 'fit_plot' ] = flot_data
621output_res[ 'plot_3d' ]  = data_3d
622#####################################################
623print json.dumps( output_res )
Note: See TracBrowser for help on using the repository browser.