source: rotdif/bin/main_elm.py @ 1654

Last change on this file since 1654 was 1654, checked in by yuexi, 3 years ago

ELM folder

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