152 lines
5.1 KiB
Python
152 lines
5.1 KiB
Python
#A* -------------------------------------------------------------------
|
|
#B* This file contains source code for the PyMOL computer program
|
|
#C* copyright 1998-2000 by Warren Lyford Delano of DeLano Scientific.
|
|
#D* -------------------------------------------------------------------
|
|
#E* It is unlawful to modify or remove this copyright notice.
|
|
#F* -------------------------------------------------------------------
|
|
#G* Please see the accompanying LICENSE file for further information.
|
|
#H* -------------------------------------------------------------------
|
|
#I* Additional authors of this source file include:
|
|
#-* Scott Dixon, Metaphorics, LLC
|
|
#-*
|
|
#-*
|
|
#Z* -------------------------------------------------------------------
|
|
|
|
from __future__ import print_function
|
|
|
|
import os
|
|
import shutil
|
|
import glob
|
|
import sys
|
|
|
|
from chempy import feedback
|
|
|
|
# "do" is the preferred command for running tinker
|
|
|
|
def do(command,in_prefix,run_prefix,out_prefix,tokens,capture=None):
|
|
if feedback['tinker']:
|
|
print(" "+str(__name__)+': creating temporary files "%s.*"' % (run_prefix))
|
|
print(" "+str(__name__)+': launching %s...' % command)
|
|
c = 1
|
|
for a in tokens:
|
|
print(" "+str(__name__)+': input %d = %s' % (c,a))
|
|
c = c + 1
|
|
if hasattr(sys.stdout,"flush"):
|
|
sys.stdout.flush()
|
|
for a in glob.glob(run_prefix+".*"):
|
|
os.unlink(a)
|
|
for a in glob.glob(out_prefix+".*"):
|
|
os.unlink(a)
|
|
for src in glob.glob(in_prefix+".*"):
|
|
dst = src.split('.')
|
|
dst = run_prefix+'.'+dst[len(dst)-1]
|
|
shutil.copyfile(src,dst)
|
|
if capture==1:
|
|
pipe = os.popen(bin_path+command+"> "+run_prefix+".out","w")
|
|
elif capture==2:
|
|
pipe = os.popen(bin_path+command+" | tee "+run_prefix+".out","w")
|
|
else:
|
|
pipe = os.popen(bin_path+command,"w")
|
|
if not pipe:
|
|
print("Error: can't run tinker!!!")
|
|
raise RunError
|
|
for a in tokens:
|
|
pipe.write(a+"\n")
|
|
pipe.close()
|
|
# NFS workaround (flushes the directory cache so that glob will work)
|
|
try: os.unlink(".sync")
|
|
except: pass
|
|
f = open(".sync",'w')
|
|
f.close()
|
|
#
|
|
for src in glob.glob(run_prefix+".*_2"):
|
|
dst = src.replace('_2','')
|
|
if os.path.exists(dst):
|
|
os.unlink(dst)
|
|
# os.rename(src,dst) rename can fail over NFS (remote action)
|
|
shutil.copyfile(src,dst)
|
|
# sloppy workaround for buggy NFS on linux
|
|
os.unlink(src)
|
|
for src in glob.glob(run_prefix+".*"):
|
|
dst = src.split('.')
|
|
dst = out_prefix+'.'+dst[len(dst)-1]
|
|
if os.path.exists(dst):
|
|
os.unlink(dst)
|
|
# os.rename(src,dst) rename can fail over NFS (remote action)
|
|
shutil.copy(src,dst)
|
|
os.unlink(src)
|
|
for a in glob.glob(in_prefix+".*"):
|
|
os.unlink(a)
|
|
if feedback['tinker']:
|
|
print(" "+str(__name__)+': %s job complete. ' % command)
|
|
print(" "+str(__name__)+': creating output files "%s.*"' % (out_prefix))
|
|
|
|
# DEPRECATED
|
|
|
|
prefix = "tinker_run"
|
|
|
|
def run(command,in_prefix,out_prefix,tokens,capture=None):
|
|
if feedback['tinker']:
|
|
print(" "+str(__name__)+': creating temporary files "%s.*"' % (prefix))
|
|
print(" "+str(__name__)+': launching %s...' % command)
|
|
c = 1
|
|
for a in tokens:
|
|
print(" "+str(__name__)+': input %d = %s' % (c,a))
|
|
c = c + 1
|
|
if hasattr(sys.stdout,"flush"):
|
|
sys.stdout.flush()
|
|
for a in glob.glob(prefix+".*"):
|
|
os.unlink(a)
|
|
for a in glob.glob(out_prefix+".*"):
|
|
os.unlink(a)
|
|
for src in glob.glob(in_prefix+".*"):
|
|
dst = src.split('.')
|
|
dst = prefix+'.'+dst[len(dst)-1]
|
|
shutil.copyfile(src,dst)
|
|
if capture:
|
|
pipe = os.popen(bin_path+command+"> "+out_prefix+".out","w")
|
|
else:
|
|
pipe = os.popen(bin_path+command,"w")
|
|
if not pipe:
|
|
print("Error: can't run tinker!!!")
|
|
raise RunError
|
|
for a in tokens:
|
|
pipe.write(a+"\n")
|
|
pipe.close()
|
|
for src in glob.glob(prefix+".*_2"):
|
|
dst = src.replace('_2','')
|
|
if os.path.exists(dst):
|
|
os.unlink(dst)
|
|
# os.rename(src,dst) rename can fail over NFS (remote action)
|
|
shutil.copy(src,dst)
|
|
os.unlink(src)
|
|
for src in glob.glob(prefix+".*"):
|
|
dst = src.split('.')
|
|
dst = out_prefix+'.'+dst[len(dst)-1]
|
|
if os.path.exists(dst):
|
|
os.unlink(dst)
|
|
# os.rename(src,dst) rename can fail over NFS (remote action)
|
|
shutil.copy(src,dst)
|
|
if feedback['tinker']:
|
|
print(" "+str(__name__)+': %s job complete. ' % command)
|
|
print(" "+str(__name__)+': creating output files "%s.*"' % (out_prefix))
|
|
|
|
if 'TINKER_PATH' in os.environ:
|
|
base = os.environ['TINKER_PATH']
|
|
bin_path = base + '/bin/'
|
|
params_path = base + '/params/'
|
|
elif 'FREEMOL_ETC' in os.environ:
|
|
base = os.environ['FREEMOL_ETC'] + '/tinker'
|
|
bin_path = base + '/bin/'
|
|
params_path = base + '/params/'
|
|
else:
|
|
base = ''
|
|
bin_path = ''
|
|
params_path = ''
|
|
|
|
if 'PYMOL_PATH' in os.environ:
|
|
pymol_path = os.environ['PYMOL_PATH']
|
|
test_path = pymol_path + '/data/chempy/tinker/'
|
|
if os.path.exists(test_path):
|
|
params_path = test_path
|