source: rotdif/bin/main_elm.py @ 1705

Last change on this file since 1705 was 1705, checked in by yuexi, 2 years ago

finish ellipsoid

  • Property svn:executable set to *
File size: 7.6 KB
Line 
1#!/usr/bin/python
2import os
3import glob
4import re
5import shutil
6import sys
7import subprocess
8import json
9import cStringIO
10import shlex 
11import socket
12import time
13import pty
14import select
15import atexit
16import signal
17import functools
18import itertools
19import math
20import pandas as pd
21import numpy as np
22from itertools import groupby
23from matplotlib import cm, colors
24from StringIO import StringIO
25from math import exp, expm1, log10, log, log1p
26from subprocess import Popen, PIPE, STDOUT
27from os.path import join
28import shutil
29from get_elm_tensor import elm_tensor
30from get_ellipsoid import run_elli
31
32def message_box(text,icon):
33   
34    _message = {}
35    _message['icon'] = icon
36    _message['text'] = text
37   
38    UDP_IP = json_variables['_udphost']
39    UDP_PORT = int(json_variables['_udpport'])
40    sock = socket.socket(socket.AF_INET, # Internet
41                         socket.SOCK_DGRAM) # UDP
42   
43    socket_dict={}
44    socket_dict['_uuid'] = json_variables['_uuid']
45    socket_dict['_message'] = _message
46
47    doc_string = json.dumps(socket_dict)
48    sock.sendto(doc_string,(UDP_IP,UDP_PORT))
49   
50    return
51
52def rotdif(Pdbfilename,sub_dir):
53    output_res = {}
54    json_variables = " "
55    InitialDirectoryStr = os.path.abspath(os.path.dirname(sys.argv[0]))
56    argv_io_string = StringIO(sys.argv[1])
57    json_variables = json.load(argv_io_string)
58    #pdb_location   = json_variables['pdb_location']
59    #PdbStr = pdb_location[0]
60    #Pdbfilename = os.path.basename(PdbStr)
61## UDP messaging ##################################################
62    UDP_IP = json_variables['_udphost']
63    UDP_PORT = int(json_variables['_udpport'])
64    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
65    socket_dict={}
66    socket_dict['_uuid'] = json_variables['_uuid']
67    base_dir = json_variables[ '_base_directory' ]
68    #optimization_method_list = json_variables[ 'optimization_method' ]
69    ExecutableFileLocationRotdif = '/opt/genapp/rotdif/bin/rotdif-1.1.jar'
70    ProcessToCallRotdif = []
71    ProcessToCallRotdif.append('/usr/bin/java')
72    ProcessToCallRotdif.append('-jar')
73    ProcessToCallRotdif.append(ExecutableFileLocationRotdif)
74    ProcessToCallRotdif.append('-nogui')
75    ProcessToCallRotdif.append('-elm')
76    ProcessToCallRotdif.append('-temp')
77    ProcessToCallRotdif.append(json_variables['temperature'])
78    ProcessToCallRotdif.append('-out')
79    ProcessToCallRotdif.append('out')
80    #ProcessToCallRotdif.append('-axes')
81    #ProcessToCallRotdif.append('-axesl')
82    #ProcessToCallRotdif.append(json_variables['axeslength'])
83    ProcessToCallRotdif.append('-pdb')
84    ProcessToCallRotdif.append(Pdbfilename)
85    ProcessToCallRotdif.append('-model')
86    ProcessToCallRotdif.append(json_variables['model'])
87    #if advanced button is checked:
88    if 'adv_option' in json_variables:
89        ProcessToCallRotdif.append('-sr')
90        ProcessToCallRotdif.append(json_variables['hydro'])
91        ProcessToCallRotdif.append('-wr')
92        ProcessToCallRotdif.append(json_variables['water'])
93   
94## RUN ROTDIF MD  ##########################################################
95    socket_dict["_textarea"] = 'Starting ELM...\n\n'
96    if socket_dict:
97        doc_string = json.dumps(socket_dict)
98        sock.sendto(doc_string,(UDP_IP,UDP_PORT))
99    master_rotdif, slave_rotdif = pty.openpty()
100    ProcessRotdif = subprocess.Popen( ProcessToCallRotdif,stdout=slave_rotdif,stdin=PIPE,bufsize=0,close_fds=True)   
101    stdout_rotdif = os.fdopen(master_rotdif, 'r', 0)
102    rotdif_log = open('all_prediction','w')
103    path_to_live_log = join(str(base_dir),join(str(sub_dir),'all_prediction'))
104    error_string_md = ''
105    timeout = 4 # seconds
106
107    while True:
108        ready, _, _ = select.select([master_rotdif], [], [], timeout)
109        if ready:
110            output = stdout_rotdif.readline()
111        #output = stdout_rotdif.read(10)
112            if not output:
113                break
114            if output:
115                socket_dict["_textarea"] = output#.strip()
116                print >> rotdif_log, output.rstrip()
117                rotdif_log.flush()
118                if "Percent" in output:
119                    output_strip = output.strip()
120                    OutArr = re.split(r'[\s]*', output_strip)
121                    percent = OutArr[1][:-1]
122                    socket_dict['progress_output'] = float(percent)/float(100)
123                    socket_dict['progress_text'] = 'ELM calculation progress: ' + str(int (float( percent ))) + '%'
124                if socket_dict:
125                    doc_string = json.dumps(socket_dict)
126                    sock.sendto(doc_string,(UDP_IP,UDP_PORT))
127        elif ProcessRotdif.poll() is not None: 
128            break
129             
130    ProcessRotdif.wait()
131    os.close(slave_rotdif)
132    os.close(master_rotdif)
133    output_res[ 'progress_output' ] = str(1.0)
134    output_res[ 'progress_text' ] =  'ELM calculation progress: ' + '100%'                         
135    socket_dict["_textarea"] = '\nELM Calculations Completed...\n\n'
136
137    if socket_dict:
138        doc_string = json.dumps(socket_dict)
139        sock.sendto(doc_string,(UDP_IP,UDP_PORT))
140                                                   
141    output_res[ 'progress_output' ] = str(1.0)
142    output_res[ 'progress_text' ] =  'ELM calculation progress: ' + '100%' 
143    return output_res, base_dir
144
145def clean_up():
146    for CleanUp in glob.glob('./2d_*'):                           
147        os.remove(CleanUp)
148
149    for CleanUp in glob.glob('./3d_*'):                           
150        os.remove(CleanUp)
151
152    for CleanUp in glob.glob('./*.txt'): 
153        if not CleanUp.endswith(Relaxfilename):
154            os.remove(CleanUp)
155    for CleanUp in glob.glob('./*.out'): 
156        os.remove(CleanUp)
157
158    for CleanUp in glob.glob('./*.pdb'):
159        if not CleanUp.endswith(Pdbfilename):
160            os.remove(CleanUp)
161
162if __name__ == "__main__":
163    output_res = {}
164    json_variables = " " 
165    InitialDirectoryStr = os.path.abspath(os.path.dirname(sys.argv[0]))
166    argv_io_string = StringIO(sys.argv[1])
167    json_variables = json.load(argv_io_string)
168    pdb_location   = json_variables['pdb_location']
169    PdbStr = pdb_location[0]
170    Pdbfilename = os.path.basename(PdbStr)
171    run_name = json_variables['run_name']
172    sub_dir = run_name + "_ELM"
173    #output_res,base_dir = rotdif(sub_dir)
174    if os.path.isdir(sub_dir):
175        sys.stderr.write("Run name already existed!")
176    else:   
177        os.mkdir(sub_dir)
178    new_pdb = join(sub_dir,Pdbfilename)
179    shutil.move(Pdbfilename,new_pdb)
180    os.chdir(sub_dir)
181    output_res,base_dir = rotdif(Pdbfilename, sub_dir)
182    #save elm
183    #elm_out = [join(str(base_dir),join(sub_dir,'ELM_prediction'))]       
184    #save params
185    #copy template
186    shutil.copy("/opt/genapp/rotdif/bin/ELM_ellipsoid.py",join(str(base_dir),join(sub_dir,"ELM_ellipsoid.py")))
187    with open(join(str(base_dir),join(sub_dir,"all_prediction"))) as in_f:
188        tmp = in_f.readlines()
189    tmp[0]="Parameters\n"
190    with open(join(str(base_dir),join(sub_dir,"ELM_params")),'w') as out_f:
191        for items in tmp[:17]:
192            out_f.write(items)
193    with open(join(str(base_dir),join(sub_dir,"ELM_prediction")),'w') as out_f2:
194        for item in tmp[17:]:
195            out_f2.write(item)
196    elm_out = [join(str(base_dir),join(sub_dir,'ELM_prediction'))]
197    elm_params = [join(str(base_dir),join(sub_dir,"ELM_params"))]
198    output_res[ 'elm_out' ] = elm_out
199    output_res['elm_params'] = elm_params
200    pdb = join(str(base_dir),join(sub_dir,Pdbfilename))
201    elm_tensor(pdb)
202    output_res['elm_tensor'] = [join(str(base_dir), join(sub_dir,'ELM_tensor_axes.py'))]
203    run_elli(join(str(base_dir), sub_dir))
204    output_res['elm_ellipsoid'] = [join(str(base_dir), join(sub_dir,'ELM_ellipsoid.py'))]
205    print(json.dumps(output_res))
Note: See TracBrowser for help on using the repository browser.