# ---------------------------------------------------------------------- # # VSDMIP PyMol plugin # # Alvaro Cortes # # Bioinformatics Unit, Center for Molecular Biology. CSIC-UAM. Spain # # # All Rights Reserved # # Permission to use, copy, modify, distribute, and distribute modified # versions of this software and its documentation for any purpose and # without fee is hereby granted, provided that the above copyright # notice appear in all copies and that both the copyright notice and # this permission notice appear in supporting documentation, and that # the name of Daniel Seeliger not be used in advertising or publicity # pertaining to distribution of the software without specific, written # prior permission. # # ALVARO CORTES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS # SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND # FITNESS. IN NO EVENT SHALL DANIEL SEELIGER BE LIABLE FOR ANY # SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER # RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF # CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # ---------------------------------------------------------------------- # # # # This code is based on the original Autodock plugin for pymol # # # This is the Autodock plugin Copyright Notice # ============================ # # The Autodock/Vina plugin source code is copyrighted, but you can freely use and # copy it as long as you don't change or remove any of the copyright # notices. # # ---------------------------------------------------------------------- # Autodock/Vina plugin is Copyright (C) 2009 by Daniel Seeliger # # All Rights Reserved # # Permission to use, copy, modify, distribute, and distribute modified # versions of this software and its documentation for any purpose and # without fee is hereby granted, provided that the above copyright # notice appear in all copies and that both the copyright notice and # this permission notice appear in supporting documentation, and that # the name of Daniel Seeliger not be used in advertising or publicity # pertaining to distribution of the software without specific, written # prior permission. # # DANIEL SEELIGER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS # SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND # FITNESS. IN NO EVENT SHALL DANIEL SEELIGER BE LIABLE FOR ANY # SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER # RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF # CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # ---------------------------------------------------------------------- # # VSDMIP is integrated platform for virtual screening and data management # developed originaly by: # # Ruben Gil-Redondo # Jorge Estrada # Antonio Morreale # Fernando Herranz # Javier Sancho # Angel R. Ortiz # # # Please cite: # # Cabrera, A.C.; Gil-Redondo, R.; Perona, A.; Gago, F.; Morreale, A. # VSDMIP 1.5: an automated structure- and ligand-based virtual screening platform with a PyMOL graphical user interface # Journal of Computer-Aided Molecular Design (2011) # # # Gil-Redondo, R.; Estrada, J.; Morreales, A.; Herranz, F.; Sancho, J.; Ortiz, A.R. # VSDMIP: virtual screening data management on an integrated platform # Journal of Computer-Aided Molecular Design (2008) Vol 23 (3) # # #================================================================ """ import sys,os,math,re, fnmatch, shutil from os import stat from os.path import abspath from stat import ST_SIZE from time import sleep, time from Tkinter import * import Tkconstants, tkFileDialog import Tkinter,Pmw from Tkinter import * import tkMessageBox import Pmw from threading import Thread from commands import getstatusoutput from pymol import cmd,selector from pymol.cmd import _feedback,fb_module,fb_mask,is_list,_cmd from pymol.cgo import * from pymol import stored import tkColorChooser from pymol.vfont import plain """ import sys,os,math,re, fnmatch, shutil from os import stat from os.path import abspath from stat import ST_SIZE from time import sleep, time import Tkinter import Tkconstants, tkFileDialog import Tkinter,Pmw from Tkinter import * import tkMessageBox import Pmw from commands import getstatusoutput from pymol import cmd,selector from pymol.cmd import _feedback,fb_module,fb_mask,is_list,_cmd from pymol.cgo import * from pymol import stored import tkColorChooser from pymol.vfont import plain from glob import glob import subprocess from threading import Thread nonumpy = '0' try: from numpy import * except ImportError: nonumpy='1' print 'Cant import numpy' import tkColorChooser from pymol.vfont import plain from glob import glob import subprocess nodb='0' try: import MySQLdb except ImportError: print 'Cant import MySQLdb' nodb='1' pass import random import datetime __version__ = "1.5 - Bioinformatics Unit - Centro de Biologia Molecular Severo Ochoa" # # HI MAN OF THE FUTURE! # # If you're reading this, i'm so sorry for you. The code is awful, crap everywhere, # pain and confusion follow every class and method, mystherious variable names will appear # in your worst nightmares # # You can find very little (in the sense of ancient indian zero/null concept) documentation inline # # Because of my magnanimity i gonna expend a couple of lines with the general concept # behind this 'master piece' of code: # # 1. Every section or dialog is a method and has other method associated for closing the dialog # 2. You can find the core in the main class named CGRID. Yeah, nosense, but this is for historical reasons. # 3. There is 'copy & paste' (tm) everywhere, the OOP paradigm is overstimated. # 4. Instead of using only one class for running commands, each command have a separated class with the only # reason of giving you some particular information in a text box. User's fault not mine. # 5. Oh yeah this gonna hurt. Pmw (Python Mega Widgets or puta mierda de widgets) are worse than bradykinin # 6. Remember: Define the object, pack, align, define the callback, use a global variable, # cross your fingers and ... damn!: Indentation error. Breathe and repeat from the begining. # # And remember this code lives: It will eat your time # It will grow each time you put your eyes away from it # It will fuck your eyes and reproduce # Eventually it could die in chunks and be used to create a Frankencode def __init__(self): if nonumpy == '0': self.menuBar.addmenuitem('Plugin', 'command', 'Launch VSDMIP', label='VSDMIP', command = lambda s=self: CGRID(s)) # cmd.set("retain_order") about_text = """ VSDMIP PyMol plugin (a) Alvaro Cortes . 2009/2010 (a) Ruben Gil Redondo (b) Federico Gago (a) Antonio Morreale (a) Bioinformatics Unit Center for Molecular Biology. CSIC-UAM. Spain (b) Modelling Laboratory. Faculty of Medicine. University of Alcala de Henares VSDMIP is integrated platform for virtual screening and data management developed by: Alvaro Cortes Cabrera Ruben Gil-Redondo Jorge Estrada Antonio Morreale Fernando Herranz Javier Sancho Angel R. Ortiz Federico Gago Almudena Perona Please cite: Cabrera, A.C.; Gil-Redondo, R.; Perona, A.; Gago, F.; Morreale, A. VSDMIP 1.5: an automated structure- and ligand-based virtual screening platform with a PyMOL graphical user interface Journal of Computer-Aided Molecular Design (2011) Gil-Redondo, R.; Estrada, J.; Morreales, A.; Herranz, F.; Sancho, J.; Ortiz, A.R. VSDMIP: virtual screening data management on an integrated platform Journal of Computer-Aided Molecular Design (2008) Vol 23 (3) This code is derived from the original Autodock plugin code, same permissions and disclaims are aplicable to this software. Autodock plugin Copyright Notice ============================ The Autodock/Vina plugin source code is copyrighted, but you can freely use and copy it as long as you don't change or remove any of the copyright notices. ---------------------------------------------------------------------- Autodock/Vina plugin is Copyright (C) 2009 by Daniel Seeliger All Rights Reserved Permission to use, copy, modify, distribute, and distribute modified versions of this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both the copyright notice and this permission notice appear in supporting documentation, and that the name of Daniel Seeliger not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DANIEL SEELIGER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DANIEL SEELIGER BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ---------------------------------------------------------------------- """ about_image = """ R0lGODlhLAFQAOf+AC5ATiRCYStCVipDXCZHXyFKZztFXC5JXS1JaABVezJJYwBVjTxKUDdKXx1Q cgRUlCxNZkFIWjtKWipNcQhVhzZMWzhMVidPbDBNbDJOYTVNZwpXgz5KbEFKZwBamB1VdwBciABb kx5UggBdggBcjjBSakJOZA9bgSxUcQpdfTdSZgZfeTVSckZObB5YgDpSbBtdYgBhjBxbd0BSaDVV bkZPeD9UXT1UYxdbjiVacDdWZCJafAhfmDpVaThVdEVTYgBimS5XgEJSeAhhkzFYdQJkiTRZYz9U dQBipztVezRXfFBQcBtgbwBjoRleiz5WcDJZdjBacjlXdjhYcQBllg9gnzVabBFfpQBlnD1YbEZX XB1ekgNnhgBnkgBksxphiEVXbUFYcxJimwBnn0JZaQBmrE1VcwBomgBnpQ5lkTVcehdlekRaYztb dBFklxNmgABqlRpkhEBbbwBrkCphiSdjfy5ieRhlngFsnhpkpAFrqSxihARro0BdfhJpjyNkkQBu mQBtpBhnmjlgf0RecwBunj1hdBdplThiekBgeUhfbgNxjUlgaUhfegBwpwBxoSVojwFwrw5voRFu p0RkflNhcR9tmR5vjUtkeRZxlzBwkBF4pEtqhDFxmT9ujxt3qlNsgTB2i1lse0J0izR2sUl1hyx8 o013fjB9nD54pz18izx9kj58m0h6m113jWR4iDmDqmt6gEOKoEKJvVCIpUOLuVSLkHOGlXKLoWSQ rnuQoFaZtValzIWcoGihzGikvY6eq3SmtIqgtIOjs3qo1m6x2Zmpr4StzYWvwJWrvnmyzJqrt3y0 w4+xw3e61IG7y3C/4Y+31Yi71o+6zIK95qO4xKK5zZzB7rHE0KzG2orP6p/L26PJ6bPL0JrU4KzV 1r3S5aHc9bXY5Kbb/rDb9LnZ98vW48zi9tTi7qrt/7vo/7Lr/9zp6tPq/cnv/MLz/7z1/7T6/93w /fLu/8P//cz//+D6/+n4/9X//93+///1++L//Or//vH+//78//n+/yH+EUNyZWF0ZWQgd2l0aCBH SU1QACwAAAAALAFQAAAI/gCJCBxIsKDBgwgTKlzIUKAUKT4i+hD4pKLFiA0zatzIsaPHjyBDihxJ suRCHxAlUrRYEaPJlzBjypxJs6ZNghJVEmHZcuLNn0CDCh1KVGFOlzyfuCzKtKnTp1ATJq0YtarV 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 """ r=0 r2=0 r3=0 r4=0 r_gfps = 0 r_ss = 0 r_ppp = 0 r_runcdock = 0 r_rungtp = 0 r_rep = 0 listilla = 0# Simple search results listilla_adv = 0 # Advanced search results listilla_ppp = 0 # PH3D search results r_getr = 0 rmulti = 0 my_selected_grid_average='' if not sys.platform.startswith('win'): home = os.environ.get('HOME') else: home = os.environ.get('PYMOL_PATH') tmp_dir = os.path.join(home,'.VSDMIPplugin') if not os.path.isdir(tmp_dir): os.mkdir(tmp_dir) print "Created temporary files directory: %s" % tmp_dir grid_bigbox = DoubleVar() grid_spacing = DoubleVar() default_settings = { "grid_spacing" : '0.5', "n_points_X":'60', "n_points_Y":'60', "n_points_Z":'60', "grid_center_selection":'(all)', "grid_center_X":'0', "grid_center_Y":'0', "grid_center_Z":'0', "dx":'1.0', "dy":'1.0', "dz":'1.0', "box_cylinder_size":'0.2', "box_mesh_line_width":'1', "box_mesh_grid_size":'1', "box_file_name":'box.dat', "gpf_file_name":'myPDB.pdb', "config_file_name":'config.txt', "dlg_input_file":'dock.dlg', "map_input_file":'receptor.C.map', "map_threshold":5., "grid_bigbox" : '0.0', "cpar" : '100', "npar" : '100', "opar" : '80', "spar" : '100', "hpar" : '80', "ppar" : '100', "fpar" : '100', "clpar" : '100', "brpar" : '100', "ipar" : '100', "nhpar" : '100', } BOX_AS_BOX = 0 BOX_AS_WIREBOX = 1 GRID_CENTER_FROM_SELECTION = 0 GRID_CENTER_FROM_COORDINATES = 1 # # Let's R&R # # So redundant...even degenerated # # class running_cdock(Thread): def __init__ (self, work_dir, command, page,state): Thread.__init__(self) self.page = page self.command = "\"%s\"" %(command) self.work_dir = work_dir self.pid = 0 self.state = state def run(self): donde_estoy = os.getcwd() os.chdir(self.work_dir) self.page.yview('moveto',1.0) print 'Running CDOCK: %s' %(self.command) p1 = subprocess.Popen(self.command, stdout=subprocess.PIPE, shell=True) # This is crap, # but shell prevents OS errors # about file name too long self.pid = p1.pid result = p1.communicate()[0] try: self.page.insert('end',"%s" % result) self.page.yview('moveto',1.0) except: self.screwup("Oops","It seems like CDOCK didnt output anything. So bad thing...") os.chdir(donde_estoy) self.state.configure(text="--------- CDOCK END -------------") def stop(self): os.system('kill -9 %d' % self.pid) self.state.configure(text="--------- CDOCK KILLED!-------------") class running_insert(Thread): def __init__ (self, work_dir, command, page,state): Thread.__init__(self) self.page = page #self.command = command self.command = "\"%s\"" %(command) self.work_dir = work_dir self.pid = 0 self.state = state def run(self): donde_estoy = os.getcwd() os.chdir(self.work_dir) self.page.yview('moveto',1.0) print 'Running insertVSDB: %s' %(self.command) p1 = subprocess.Popen(self.command, stdout=subprocess.PIPE, shell=True) # This is crap, # but shell prevents OS errors # about file name too long self.pid = p1.pid result = p1.communicate()[0] self.page.insert('end',"%s" % result) self.page.yview('moveto',1.0) os.chdir(donde_estoy) self.state.configure(text="--------- insertVSDB (local!) END -------------") def stop(self): # os.system('kill -9 %d' % self.pid) self.state.configure(text="--------- None Killed -------------") class running_runcdock(Thread): def __init__ (self, work_dir, command, page,state): Thread.__init__(self) self.page = page #self.command = command self.command = "\"%s\"" %(command) self.work_dir = work_dir self.pid = 0 self.state = state def run(self): donde_estoy = os.getcwd() os.chdir(self.work_dir) self.page.yview('moveto',1.0) print 'Running runCDOCK: %s' %(self.command) p1 = subprocess.Popen(self.command, stdout=subprocess.PIPE, shell=True) # This is crap, # but shell prevents OS errors # about file name too long self.pid = p1.pid result = p1.communicate()[0] self.page.insert('end',"%s" % result) self.page.yview('moveto',1.0) os.chdir(donde_estoy) self.state.configure(text="--------- runCDOCK (local!) END -------------") def stop(self): # os.system('kill -9 %d' % self.pid) self.state.configure(text="--------- None Killed -------------") class running_rungtp(Thread): def __init__ (self, work_dir, command, page): Thread.__init__(self) self.page = page #self.command = command self.command = "\"%s\"" %(command) self.work_dir = work_dir self.pid = 0 def run(self): donde_estoy = os.getcwd() os.chdir(self.work_dir) self.page.yview('moveto',1.0) print 'Running runGTP: %s' %(self.command) p1 = subprocess.Popen(self.command, stdout=subprocess.PIPE, shell=True) # This is crap, # but shell prevents OS errors # about file name too long self.pid = p1.pid result = p1.communicate()[0] self.page.insert('end',"%s" % result) self.page.yview('moveto',1.0) os.chdir(donde_estoy) def stop(self): # os.system('kill -9 %d' % self.pid) print 'No' class running_getresults(Thread): def __init__ (self, work_dir, command, page,state): Thread.__init__(self) self.page = page #self.command = command self.command = "\"%s\"" %(command) self.work_dir = work_dir self.pid = 0 self.state = state def run(self): donde_estoy = os.getcwd() os.chdir(self.work_dir) self.page.yview('moveto',1.0) print 'Running getResultsFromVS: %s' %(self.command) p1 = subprocess.Popen(self.command, stdout=subprocess.PIPE, shell=True) # This is crap, self.pid = p1.pid result = p1.communicate()[0] self.page.insert('end',"%s" % result) self.page.yview('moveto',1.0) os.chdir(donde_estoy) self.state.configure(text="--------- getResultsFromVS (local!) END -------------") def stop(self): # os.system('kill -9 %d' % self.pid) self.state.configure(text="--------- None Killed -------------") class running_gfps(Thread): def __init__ (self, work_dir, command, page): Thread.__init__(self) self.page = page #self.command = command self.command = "\"%s\"" %(command) self.work_dir = work_dir self.pid = 0 def run(self): donde_estoy = os.getcwd() os.chdir(self.work_dir) self.page.yview('moveto',1.0) print 'Running OpenBABEL: %s' %(self.command) p1 = subprocess.Popen(self.command, stdout=subprocess.PIPE, shell=True) # This is super-crap, # but shell prevents OS errors # about file name too long self.pid = p1.pid result = p1.communicate()[0] self.page.insert('end',"%s" % result) self.page.yview('moveto',1.0) os.chdir(donde_estoy) self.page.insert('end',"--------- OPENBABEL END -------------") def stop(self): os.system('kill -9 %d' % self.pid) self.page.insert('end',"--------- OPENBABEL KILLED! -------------") class running_rep(Thread): def __init__ (self, work_dir, command, page): Thread.__init__(self) self.page = page #self.command = command self.command = "\"%s\"" %(command) self.work_dir = work_dir self.pid = 0 def run(self): donde_estoy = os.getcwd() os.chdir(self.work_dir) self.page.yview('moveto',1.0) p1 = subprocess.Popen(self.command, stdout=subprocess.PIPE, shell=True) # This is super-crap, # but shell prevents OS errors # about file name too long self.pid = p1.pid result = p1.communicate()[0] self.page.insert('end',"%s" % result) self.page.yview('moveto',1.0) os.chdir(donde_estoy) self.page.insert('end',"--------- Receptor ready -------------") def stop(self): os.system('kill -9 %d' % self.pid) self.page.insert('end',"--------- Preparator killed! -------------") class running_alfa(Thread): def __init__ (self, work_dir, command, page,fp, fp2,alln, method, apx): Thread.__init__(self) self.page = page #self.command = command self.command = "\"%s\"" %(command) self.work_dir = work_dir self.pid = 0 self.fp = fp self.fp2 = fp2 self.r9 = 0 self.mopac_alln = alln self.method = method self.apx = apx def stop(self): self.page.insert('end',"Stopping Job\n") self.page.yview('moveto',1.0) self.r9 = 1 # os.system('kill -9 %d' % self.pid) def run(self): donde_estoy = os.getcwd() os.chdir(self.work_dir) ftemp = os.path.join(self.work_dir,'temp.dat') salida = os.path.join(self.work_dir,'temp.dat.arc') lst = self.fp.readlines() new = [] for line in lst: if line.strip(): new.append(line.strip()) lst = new new_flag = 0 atoms_flag = 0 atoms_list = [] # try: if 1 == 1: self.page.insert('end',"Reading MOL2 file\n") self.page.yview('moveto',1.0) lindex = 0 for line in lst: if line == '@BOND': atoms_flag = 0 fp3.close() # Call MOPAC and the things if not sys.platform.startswith('win'): u = "temp" else: u = "temp.dat" if self.mopac_alln == 'yes' or lindex == 1: command = "%s %s" %(self.command, u) os.chdir(self.work_dir) self.page.insert('end',"Calling MOPAC 7\n") self.page.yview('moveto',1.0) if self.r9 != 0: return p1 = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True) result = p1.communicate()[0] print "Tengo: %s" %(result) if not sys.platform.startswith('win'): arco = "temp.out" else: arco = "temp.dat.out" try: fp5 = open("temp.out","r") except: try: fp5 = open("temp.OUT","r") except: try: fp5 = open("temp.dat.out","r") except: self.screwup("MOPAC ERROR","Mopac produced no output. Failed to prepare the ligand") #print "Open file now" # fp5 = open(arco,"r") lst2 = fp5.readlines() new2 = [] for line2 in lst2: if line2.strip(): new2.append(line2.strip()) lst2 = new2 flag_1 = 0 charges = [] for myl in lst2: print '%s : %i ' %(myl,myl.find('ELECTROSTATIC POTENTIAL CHARGES')) if flag_1 > 0: flag_1 = flag_1 + 1 print 'flag_1 is now: %i' %(flag_1) if myl.find("ELECTROSTATIC POTENTIAL CHARGES") >= 0: print 'keyword found' flag_1 = 1 if flag_1 > 1: try: print 'Carga: %s' %(myl.split()[-1]) charges.append(myl.split()[-1]) except: charges.append("0.0000") pass fp5.close() try: print 'hey' #os.remove(arco) except: pass #print "Borrado" my_ind = 1 for atomu in atom_list: spl = atomu.strip().split() rd = 1.0 spl2 = spl[2] if spl2[0] == 'C': rd = 1.91 elif spl2[0] == 'H': rd = 1.49 elif spl2[0] == 'O': rd = 1.66 elif spl2[0] == 'N': rd = 1.82 elif spl2[0] == 'P': rd = 2.1 elif spl2[0] == 'S': rd = 2.0 elif spl2[0] == 'F': rd = 1.50 elif spl2[0:1] == 'Cl': rd = 1.95 elif spl2[0:1] == 'Br': rd = 2.22 elif spl2[0] == 'I': rd = 2.35 print >>self.fp2,"%s %1.2f %7s" %(atomu,rd,charges[my_ind]) my_ind = my_ind + 1 print >>self.fp2,"TER" print >>self.fp2,"ENDMDL" if atoms_flag == 1: #print line mis_cosas = line.split() atomillo = mis_cosas[5].split('.') atomillo_x = float(mis_cosas[2]) atomillo_y = float(mis_cosas[3]) atomillo_z = float(mis_cosas[4]) if len(atomillo[0]) == 2 : cadena = 'ATOM 1 %s LIG 0 %8.3f%8.3f%8.3f ' % (atomillo[0], atomillo_x, atomillo_y, atomillo_z) elif len(atomillo[0]) > 2: cadena = 'ATOM 1 %s LIG 0 %8.3f%8.3f%8.3f ' % (atomillo[0], atomillo_x, atomillo_y, atomillo_z) else: cadena = 'ATOM 1 %s LIG 0 %8.3f%8.3f%8.3f ' % (atomillo[0], atomillo_x, atomillo_y, atomillo_z) atom_list.append(cadena) atomcillo = atomillo[0] if atomcillo[0:1] == 'Cl' or atomcillo[0:1] == 'Br': print >>fp3,'%s %f 1 %f 1 %f 1' % (atomcillo[0:1], atomillo_x, atomillo_y, atomillo_z) else: print >>fp3,'%s %f 1 %f 1 %f 1' % (atomcillo[0], atomillo_x, atomillo_y, atomillo_z) # print >>fp3,'%s %f 1 %f 1 %f 1' % (atomillo[0], atomillo_x, atomillo_y, atomillo_z) if line == '@MOLECULE' : atom_list = [] atoms_flag = 0 lindex = lindex + 1 fp3 = open(ftemp,"w") print >>self.fp2,"MODEL" print >> fp3,"%s 1SCF PRECISE GEO-OK MMOK ESP %s\n\n" %(self.method, self.apx) elif line == '@ATOM': atoms_flag = 1 # except: # self.page.insert('end',"Cant convert and assign charges to this MOL2 files\n") # self.page.yview('moveto',1.0) # return self.fp.close() self.fp2.close() self.page.insert('end',"OK. PDB generated\n") self.page.yview('moveto',1.0) os.chdir(donde_estoy) # self.state.configure(text="--------- END -------------") class running_delphi(Thread): def __init__ (self, work_dir, command, page): Thread.__init__(self) self.page = page self.command = command self.work_dir = work_dir self.pid = 0 def run(self): donde_estoy = os.getcwd() os.chdir(self.work_dir) #self.page.insert('end',"Batch: %s\n" % self.command) self.page.yview('moveto',1.0) p1 = subprocess.Popen(self.command, stdout=subprocess.PIPE, shell=True) self.pid = p1.pid #result = os.popen(command.read()) result = p1.communicate()[0] try: self.page.insert('end',"%s" % result) self.page.yview('moveto',1.0) except: self.screwup("Fatal","Oops! Delphi null results") return os.chdir(donde_estoy) def stop(self): os.system('kill -9 %d' % self.pid) self.state.configure(text="--------- DELPHI KILLED!-------------") class running_gfusion(Thread): def __init__ (self, work_dir, command, page): Thread.__init__(self) self.page = page self.command = command self.work_dir = work_dir self.pid = 0 def run(self): donde_estoy = os.getcwd() os.chdir(self.work_dir) #self.page.insert('end',"Batch: %s\n" % self.command) self.page.yview('moveto',1.0) p1 = subprocess.Popen(self.command, stdout=subprocess.PIPE, shell=True) self.pid = p1.pid #result = os.popen(command.read()) result = p1.communicate()[0] try: self.page.insert('end',"%s" % result) self.page.yview('moveto',1.0) except: self.screwup("Fatal","GFUSION null results --> No results, so something is wrong") return os.chdir(donde_estoy) def stop(self): os.system('kill -9 %d' % self.pid) self.state.configure(text="--------- CGRID KILLED!-------------") class running_cgrid(Thread): def __init__ (self, work_dir, command, page,state): Thread.__init__(self) self.page = page #self.command = command self.command = command print '%s' %(command) self.work_dir = work_dir print 'Directorio: %s' %(work_dir) self.pid = 0 self.state = state def run(self): # Me fabrico ficheros de configuracion print 'Directorio: %s' %(self.work_dir) outcgrid = os.path.join(self.work_dir,'cgrid.in'); text_file = open(outcgrid, "w") text_file.write("\n") text_file.write("/Verb *Gepc\n") text_file.write("*distdependent\n") text_file.write("Spacing %1.3f\n" %( float(grid_spacing.get()))) if float(grid_bigbox.get()) > 0.0: text_file.write("BigBox %1.1f\n" %(float(grid_bigbox.get()))) else: text_file.write("BigBox 0.0\n") text_file.write("\n") text_file.write("temp.pdb\n\n") text_file.close() outcgrid2 = os.path.join(self.work_dir,'correction.in'); text_file2 = open(outcgrid2, "w") # Corrections Someday this could be configurable. No reason to do it now text_file2.write("100.\n") text_file2.write("100.\n") text_file2.write(" 80.\n") text_file2.write("100.\n") text_file2.write(" 80.\n") text_file2.write("100.\n") text_file2.write("100.\n") text_file2.write("100.\n") text_file2.write("100.\n") text_file2.write("100.\n") text_file2.write("100.\n\n") text_file2.close() donde_estoy = os.getcwd() os.chdir(self.work_dir) #self.page.insert('end',"Batch: %s\n" % self.command) self.page.yview('moveto',1.0) p1 = subprocess.Popen(self.command, stdout=subprocess.PIPE, shell=True) self.pid = p1.pid #result = os.popen(command.read()) result = p1.communicate()[0] try: self.page.insert('end',"%s" % result) self.page.yview('moveto',1.0) except: self.screwup("Fatal","CGRID results are null --> No results, so something is wrong") return os.chdir(donde_estoy) self.state.configure(text="--------- CGRID END -------------") def stop(self): os.system('kill -9 %d' % self.pid) self.state.configure(text="--------- CGRID KILLED!-------------") class ResCDOCK: def __init__(self, lst = None): self.atomlines = [] self.energy = 0. self.vdwe = 0.0 self.coulombice = 0.0 self.receptordesolvatione = 0.0 self.liganddesolvatione = 0.0 self.apolare = 0.0 self.hbnum = 0.0 self.hbcc = 0.0 self.hbcn = 0.0 self.hbnn = 0.0 self.hbcorrection = 0.0 self.info = '' self.lst = [] self.bh = [] self.num = 0 self.as_string = '' if lst is not None: self.from_list(lst) def from_list(self, lst): self.lst = lst hf = 0 cont = 1 for line in lst: if line.startswith('REMARK'): self.info+=line if line.startswith('ATOM') or \ line.startswith('HETATM'): self.atomlines.append(line) self.as_string+='ATOM '+line[6:67]+'\n' elif line.startswith('REMARK'): if 'totalE' in line: entr = line.split(':')[1] self.energy = float(entr.split()[0]) elif 'vdwE' in line: entr2 = line.split(':')[1] self.vdwe = float(entr2.split()[0]) elif 'coulombicE' in line: entr2 = line.split(':')[1] self.coulombice = float(entr2.split()[0]) elif 'receptorDesolvationE' in line: entr2 = line.split(':')[1] self.receptordesolvatione = float(entr2.split()[0]) elif 'ligandDesolvationE' in line: entr2 = line.split(':')[1] self.liganddesolvatione = float(entr2.split()[0]) elif 'apolarE' in line: entr2 = line.split(':')[1] self.apolare = float(entr2.split()[0]) elif 'Hydrogen Bonds' in line: entr2 = line.split(':')[1] self.hbnum = int(entr2.split()[0]) elif 'hbCorrection' in line: entr2 = line.split(':')[1] self.hbcorrection = float(entr2.split()[0]) elif 'IDP' in line: hf = 1 elif hf != 0: a = [] a.append(int(line.split()[2])) a.append(int(line.split()[3])) self.bh.append(a) if cont == self.hbnum: hf = 0 cont = cont + 1 def as_pdb_string(self): return self.as_string def info_string(self): return self.info class CGRID: def __init__(self,app): # These are anti multi window vars self.check_w = 0 self.check_w1 = 0 self.check_w2 = 0 self.check_w3 = 0 self.check_w4 = 0 self.check_w5 = 0 self.check_w6 = 0 self.check_w7 = 0 self.check_w8 = 0 self.check_w9 = 0 self.check_w10= 0 self.check_w11= 0 self.check_w12= 0 self.check_w13= 0 self.check_w14= 0 self.check_w15= 0 self.check_w16= 0 self.check_w17= 0 self.check_w18= 0 self.check_w19= 0 self.check_w20= 0 self.check_w21= 0 self.check_w22= 0 self.check_w23= 0 self.check_w24= 0 self.check_w25= 0 self.check_w26= 0 self.check_w27= 0 self.check_w28= 0 self.check_w29= 0 self.check_w30= 0 self.check_w31= 0 self.check_w32= 0 self.check_wpijaditas = 0 self.check_wds_st = 0 self.check_wdelphi = 0 self.check_wct = 0 self.check_wje = 0 parent = app.root self.parent = parent if nodb=='1': self.db_warn = Pmw.MessageDialog(self.parent, title = 'Very important warning', defaultbutton = 0, message_text = 'Since you dont have installed MySQLdb package you dont have access to Database Features.') self.db_warn.iconname('Warning') self.db_warn.withdraw() self.db_warn.show() # receptors and ligands self.receptor_dic = {} self.ligand_dic = {} # directory with ligands self.ligand_dir = StringVar() # box display settings self.box_display_mode = IntVar() self.box_display_mode.set(BOX_AS_BOX) self.box_color = [1.,1.,1.] self.box_is_on_display = False self.box_display_cylinder_size = DoubleVar() self.box_display_cylinder_size.set(default_settings['box_cylinder_size']) self.box_display_line_width = DoubleVar() self.box_display_line_width.set(default_settings['box_mesh_line_width']) self.box_display_mesh_grid = DoubleVar() self.box_display_mesh_grid.set(default_settings['box_mesh_grid_size']) self.box_size = [] # grid definition grid_spacing.set(default_settings['grid_spacing']) grid_bigbox.set(default_settings['grid_bigbox']) self.n_points_X = DoubleVar() self.n_points_X.set(default_settings['n_points_X']) self.n_points_Y = DoubleVar() self.n_points_Y.set(default_settings['n_points_Y']) self.n_points_Z = DoubleVar() self.n_points_Z.set(default_settings['n_points_Z']) self.grid_center = [DoubleVar(), DoubleVar(), DoubleVar()] self.grid_center[0].set(default_settings['grid_center_X']) self.grid_center[1].set(default_settings['grid_center_Y']) self.grid_center[2].set(default_settings['grid_center_Z']) # paths main dialog things self.config_settings = {} self.gtp_exe = StringVar() self.rep_exe = StringVar() self.alfa_exe = StringVar() self.oe_licence = StringVar() self.cgrid_exe = StringVar() self.gfusion_exe = StringVar() self.cdock_exe = StringVar() self.work_dir = StringVar() self.alfaout_opt = 'yes' self.simplex_opt = '1' self.alfarmsd_opt = '1' self.onlyenergy_opt = '0' self.nouseISM_opt = '0' self.nouseHB_opt = '0' self.GAGA_opt = '0' self.usefilter = 'yes' self.gfps_smiles = StringVar() self.gfps_working = StringVar() self.fp_type = 1 # Default MACCS self.fp_type_adv_single = 1 self.fp_type_adv_fusion = 1 self.scoring = 1 # Tanimoto = 1 | Tversky = 2 | !Rule = 3 self.scoring_adv_single = 1 self.scoring_adv_fusion = 1 self.scoring_adv_centroid = 1 self.engine_fusion = 'MAX' self.getr_different = 'no' # No repeats self.getr_mol2pdb = 'no' # MOL" self.filter_active = '' self.current_ppp = 1 self.ppp_type_insert = 1 self.v_pot = 12 self.delphi_bndcon_val = 'Dipolar' self.mopac_method = 'AM1' self.mopac_alln = 'yes' self.prot_ff = 'ff03' self.lig_ff = 'gaff' self.solvent = 'TIP3BOX' self.md_output = 'AMBER' self.fcres = 0 # VSDMIP config dialog stuff self.ssh_command = StringVar() self.scp_command = StringVar() self.queue_command = StringVar() self.queue_name = StringVar() # ligand display settings self.ligand_display_mode = { 'lines':True, 'sticks':False, 'spheres':False, 'surface':False, 'mesh':False } # build main window self.dialog = Pmw.Dialog(parent,buttons = ('Quit',),title = 'VSDMIP Plugin',command = self.button_pressed) self.dialog.withdraw() Pmw.setbusycursorattributes(self.dialog.component('hull')) self.status_line = Label(self.dialog.interior(), relief='sunken', font='helvetica 12', anchor='w',fg='yellow',bg='black') self.status_line.pack(side=BOTTOM,fill='x', expand=1, padx=0, pady=0) self.dialog.geometry('650x180') self.dialog.bind('',self.button_pressed) # the title balloon = Pmw.Balloon(self.dialog.interior()) menuBar = Pmw.MenuBar(self.dialog.interior(), hull_relief=RAISED, hull_borderwidth=1, balloon=balloon) menuBar.pack(fill=X) menuBar.addmenu('SBVS', 'Structure Based Virtual Screening','Virtual Screening') menuBar.addmenuitem('SBVS', 'command', 'Insert new molecules', font=('StingerLight', 14), label='Insert new molecules', command=self.insertmol_dialog) menuBar.addmenuitem('SBVS', 'command', 'Run VS', font=('StingerLight', 14), label='Run Virtual Screening', command=self.runcdock_dialog) menuBar.addmenuitem('SBVS', 'command', 'Get Results from Virtual Screening', font=('StingerLight', 14), label='Get Results from Screening', command=self.getresults_dialog) menuBar.addmenuitem('SBVS', 'command', 'Receptor preparation', font=('StingerLight', 14), label='Receptor preparation', command=self.show_rep_dialog) if not sys.platform.startswith('win'): menuBar.addmenuitem('SBVS', 'command', 'Set up MD', font=('StingerLight', 14), label='Set up Molecular dynamics', command=self.show_md_dialog) if nodb=='0': menuBar.addmenu('LBVS', 'Ligand Based Virtual Screening','Virtual Screening') menuBar.addmenuitem('LBVS', 'command', 'Generate new fingerprints for molecules', font=('StingerLight', 14), label='Generate 2D Fingerprints', command=self.show_generatefps_dialog) menuBar.addmenuitem('LBVS', 'command', 'Generate 3D phamacophoric fingerprints for molecules', font=('StingerLight', 14), label='Generate 3D Fingerprints', command=self.show_generatefps3d_dialog) menuBar.addmenuitem('LBVS', 'command', 'Insert new fingerprints for molecules', font=('StingerLight', 14), label='Insert 2D Fingerprints', command=self.show_insertfps_dialog) menuBar.addmenuitem('LBVS', 'command', '', font=('StingerLight', 14), label='Simple search', command=self.show_simple_search_dialog) menuBar.addmenuitem('LBVS', 'command', 'Advanced query', font=('StingerLight', 14), label='Advanced search', command=self.show_adv_search_dialog) menuBar.addmenuitem('LBVS', 'command', 'Fingerprints 3D',font=('StingerLight', 14), label='3D Pharmacophores', command=self.show_ppp3d_dialog) # menuBar.addmenuitem('Buttons', 'command', label='aaa', foreground = 'yellow') #bitmap="@bitmaps/RotateLeft", # menuBar.addmenuitem('VS', 'separator') menuBar.addmenu('Local', 'Local','Local') menuBar.addmenuitem('Local', 'command', 'Options', font=('StingerLight', 14), label='Options', command=self.show_options_dialog) menuBar.addmenuitem('Local', 'command', 'Set up ligand', font=('StingerLight', 14), label='Ligand set up', command=self.show_alfa_dialog) # menuBar.addmenuitem('Local', 'command', 'Generate ligand AMBER input', # font=('StingerLight', 14), label='AMBER prep generator', command=self.show_prepis_dialog) #menuBar.addmenuitem('Local', 'command', 'Charge assigment and transformation', # font=('StingerLight', 14), label='Charge assigment and transformation', command=self.show_ct_dialog) menuBar.addmenuitem('Local', 'command', 'CGRID', font=('StingerLight', 14), label='CGRID', command=self.show_cgrid_dialog) menuBar.addmenuitem('Local', 'command', 'Grids', font=('StingerLight', 14), label='View Grids', command=self.show_grids_dialogs) menuBar.addmenuitem('Local','command','Grids processing', font=('StingerLight', 14), label='Grids processing', command=self.show_proc_grids) menuBar.addmenuitem('Local', 'command', 'CDOCK', font=('StingerLight', 14), label='CDOCK', command=self.show_cdock_dialog) menuBar.addmenuitem('Local', 'command', 'Results',font=('StingerLight', 14), label='Docking Results Visualization', command=self.show_cdock_results_dialog) menuBar.addmenu('Info', 'Info','Info') if nodb=='0': menuBar.addmenuitem('Info', 'command', 'Show sources of molecules', font=('StingerLight', 14), label='View database subsets', command=self.show_dbsources_dialog) menuBar.addmenuitem('Info', 'command', 'Show sources of VS', font=('StingerLight', 14), label='Show Virtual Screening catalog', command=self.show_vssources_dialog) menuBar.addmenuitem('Info', 'command', 'Show remote process from cluster', font=('StingerLight', 14), label='Remote process', command=self.show_queue_dialog) menuBar.addmenuitem('Info', 'command', 'Explore job output', font=('StingerLight', 14), label='Job output explorer', command=self.show_job_explorer_dialog) menuBar.addmenu('Config', 'Config Virtual Screening','Config Virtual Screening') menuBar.addmenuitem('Config', 'command', 'Configure queue & nodes system', font=('StingerLight', 14), label='Configure queues', command=self.config_dialog) menuBar.addmenu('About', 'About') menuBar.addmenuitem('About', 'command', 'About', font=('StingerLight', 14), label='About', command=self.show_about_dialog) self.config_settings = self.read_plugin_config_file() self.title_label = Tkinter.Label(self.dialog.interior(), text = '\nVSDMIP Plugin for PyMOL\n\nVirtual Screening Data Management on an Integrated Platform\n\n', background = 'black', foreground = 'yellow', ) self.title_label.pack(expand = 0, fill = 'both', padx = 4, pady = 4) self.dialog.show() self.status_line.configure(text ="(version: %s)" % __version__) def show_modres_dialog(self): if( self.check_w29 == 1): return self.check_w29 = 1 self.modres_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Library generator for special residues', command = self.button_pressed29) self.modres_dialog.withdraw() Pmw.setbusycursorattributes(self.modres_dialog.component('hull')) self.modres_dialog.geometry('550x450') self.modres_dialog.bind('',self.button_pressed29) self.modres_file_group = Pmw.Group(self.modres_dialog.interior(),tag_text='Files') self.modres_file_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.modres_pdb_entry = Pmw.EntryField(self.modres_file_group.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_modres_pdb_filename,filter=("*.pdb")), validate = {'validator':quickFileValidation,}, value = '', label_text = 'Receptor PDB') self.modres_pdb_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.modres_out_entry = Pmw.EntryField(self.modres_file_group.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_out_modres_filename,filter=("*.erl")), validate = {'validator':quickFileValidation,}, value = '', label_text = 'Output file') self.modres_out_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.modres_file_io = Pmw.Group(self.modres_dialog.interior(), tag_text='Generator log') self.modres_file_io.pack(side = TOP,expand=1, fill='x') self.modres_button_box = Pmw.ButtonBox(self.modres_file_io.interior(),orient='vertical', padx=0,pady=0) self.modres_button_box.add('Generate library',command = self.do_generate_erl) self.modres_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.modres_page_log_text = Pmw.ScrolledText(self.modres_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow') self.modres_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.modres_dialog.show() def show_ppp3d_dialog(self): print "Here" if( self.check_w25 == 1): return self.check_w25 = 1 self.ppp_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Local 3D Pharmacophores', command = self.button_pressed25) self.ppp_dialog.withdraw() Pmw.setbusycursorattributes(self.ppp_dialog.component('hull')) self.ppp_dialog.geometry('550x550') self.ppp_dialog.bind('',self.button_pressed25) self.gen_ppp_group = Pmw.Group(self.ppp_dialog.interior(),tag_text='Insert pharmacophoric points') self.gen_ppp_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) my_ppp_list = ('Hydrogen bond donor','Hydrogen bond acceptor','Positive charged group','Negative charged group','Aromatic ring','Lipophilic point') self.select_ppp_dropdown = Pmw.ComboBox(self.gen_ppp_group.interior(), label_text = 'Point type', labelpos = 'w', selectioncommand = self.changePPPList, scrolledlist_items = my_ppp_list) self.select_ppp_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.select_ppp_dropdown.selectitem(my_ppp_list[0]) self.gen_ppp_button_box = Pmw.ButtonBox(self.gen_ppp_group.interior(),orient='vertical', padx=0,pady=0) self.gen_ppp_button_box.add('Insert',command = self.insertPPP) self.gen_ppp_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.search_ppp_group = Pmw.Group(self.ppp_dialog.interior(),tag_text='Search') self.search_ppp_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.search_group_selection_entry = Pmw.EntryField(self.search_ppp_group.interior(), labelpos = 'w', label_text = 'Pharmacophores group', value = '(sele)') self.search_group_selection_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.search_id_selection_entry = Pmw.EntryField(self.search_ppp_group.interior(), labelpos = 'w', label_text = 'Database origin ID', value = '') self.search_id_selection_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.ppp_file_io = Pmw.Group(self.ppp_dialog.interior(), tag_text='Search log') self.ppp_file_io.pack(side = TOP,expand=1, fill='x') self.ppp_button_box = Pmw.ButtonBox(self.ppp_file_io.interior(),orient='vertical', padx=0,pady=0) self.ppp_button_box.add('Search!',command = self.do_3d_simple_search) self.ppp_button_box.add('Save IDs for Docking',command = self.pre_do_save_3d_search_ids) #self.ppp_button_box.add('Extract 3D from database',command = self.pre_save_adv_3d_from_search) self.ppp_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.ppp_page_log_text = Pmw.ScrolledText(self.ppp_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow') self.ppp_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.ppp_dialog.show() def show_md_dialog(self): if( self.check_w28 == 1): return self.check_w28 = 1 self.md_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Set up MD', command = self.button_pressed28) self.md_dialog.withdraw() Pmw.setbusycursorattributes(self.md_dialog.component('hull')) self.md_dialog.geometry('550x550') self.md_dialog.bind('',self.button_pressed28) self.md_toper_group = Pmw.Group(self.md_dialog.interior(),tag_text='Input/Output' ) self.md_toper_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.md_prot_location = Pmw.EntryField(self.md_toper_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_md_prot_path), value = '', label_text = 'Protein file:') self.md_prot_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.md_ligand_location = Pmw.EntryField(self.md_toper_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_md_lig_path), value = '', label_text = 'Ligand file:') self.md_ligand_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) my_output = ('AMBER','gCOMBINE') self.md_output_dropdown = Pmw.ComboBox(self.md_toper_group.interior(), label_text = 'Output for', labelpos = 'w', selectioncommand = self.changeMDOutput , scrolledlist_items = my_output) self.md_output_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.md_output_dropdown.selectitem(my_output[0]) self.md_top_group = Pmw.Group(self.md_dialog.interior(),tag_text='Parameters') self.md_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) my_force_fields = ('ff03','f03ua','ff03.r1','ff02polEP.r1','ff02pol.r1','ff99bsc0','ff99SB','gaff','GLYCAM_06','GLYCAM_04EP') my_solvents = ('TIP3BOX','TIP4BOX','TIP5BOX','SPCBOX','POLBOX') self.ff_dropdown = Pmw.ComboBox(self.md_top_group.interior(), label_text = 'Protein force field', labelpos = 'w', selectioncommand = self.changeProtFF , scrolledlist_items = my_force_fields) self.ff2_dropdown = Pmw.ComboBox(self.md_top_group.interior(), label_text = 'Ligand force field', labelpos = 'w', selectioncommand = self.changeLigFF, scrolledlist_items = my_force_fields) self.solvents_dropdown = Pmw.ComboBox(self.md_top_group.interior(), label_text = 'Solvent', labelpos = 'w', selectioncommand = self.changeSolvent, scrolledlist_items = my_solvents) self.ff_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.ff2_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.solvents_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.md_buffer = Pmw.EntryField(self.md_top_group.interior(),labelpos = 'w', label_text = 'Distance (Buffer) ',value = '15.0') self.md_buffer.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.na_ions = Pmw.EntryField(self.md_top_group.interior(),labelpos = 'w', label_text = 'Na+ ions (0 to neutralize) ',value = '0') self.na_ions.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.cl_ions = Pmw.EntryField(self.md_top_group.interior(),labelpos = 'w', label_text = 'Cl- ions (0 to neutralize) ',value = '0') self.cl_ions.pack(fill = 'both', expand = 1, padx = 10, pady = 5) Pmw.alignlabels( [ self.md_prot_location, self.md_ligand_location, self.md_output_dropdown , self.ff_dropdown, self.ff2_dropdown, self.solvents_dropdown, self.md_buffer, self.na_ions, self.cl_ions ] ) self.ff_dropdown.selectitem(my_force_fields[0]) self.ff2_dropdown.selectitem(my_force_fields[7]) self.solvents_dropdown.selectitem(my_solvents[0]) self.md_file_io = Pmw.Group(self.md_dialog.interior(), tag_text='Preparator output') self.md_file_io.pack(side = TOP,expand=1, fill='x') self.md_button_box = Pmw.ButtonBox(self.md_file_io.interior(),orient='horizontal', padx=0,pady=0) self.md_button_box.add('Give me the files!',command = self.save_md_input_file) self.md_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.md_page_log_text = Pmw.ScrolledText(self.md_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow') self.md_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.md_dialog.show() def show_rep_dialog(self): if( self.check_w24 == 1): return self.check_w24 = 1 self.rep_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Receptor Preparation', command = self.button_pressed24) self.rep_dialog.withdraw() Pmw.setbusycursorattributes(self.rep_dialog.component('hull')) self.rep_dialog.geometry('550x550') self.rep_dialog.bind('',self.button_pressed24) self.rep_top_group = Pmw.Group(self.rep_dialog.interior(),tag_text='From Editor') self.rep_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.rep_second_group = Pmw.Group(self.rep_dialog.interior(),tag_text='From File') self.rep_second_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.rep_3_group = Pmw.Group(self.rep_dialog.interior(),tag_text='Options') self.rep_3_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.rep_selection_entry = Pmw.EntryField(self.rep_top_group.interior(), labelpos = 'w', label_text = 'Input Selection (exported as PDB)', value = '(sele)') self.rep_smiles_location = Pmw.EntryField(self.rep_second_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_rep_smi_path), value = '', label_text = 'Input file:') self.rep_working_location = Pmw.EntryField(self.rep_3_group.interior(), labelpos='w', label_pyclass = DirDialogButtonClassFactory.get(self.set_rep_working_path), value = self.config_settings['work_dir'], label_text = 'Working dir:') self.rep_selection_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.rep_smiles_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.rep_working_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) Pmw.alignlabels( [self.rep_selection_entry, self.rep_smiles_location, self.rep_working_location]) self.rep_file_io = Pmw.Group(self.rep_dialog.interior(), tag_text='Preparator output') self.rep_file_io.pack(side = TOP,expand=1, fill='x') self.rep_button_box = Pmw.ButtonBox(self.rep_file_io.interior(),orient='horizontal', padx=0,pady=0) self.rep_button_box.add('Process',command = self.save_rep_input_file) self.rep_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.rep_page_log_text = Pmw.ScrolledText(self.rep_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow') self.rep_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.rep_dialog.show() def show_adv_search_dialog(self): if( self.check_w21 == 1): return self.check_w21 = 1 self.adv_search_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Advanced Search', command = self.button_pressed21) self.adv_search_dialog.withdraw() Pmw.setbusycursorattributes(self.adv_search_dialog.component('hull')) self.adv_search_dialog.geometry('550x800') self.adv_search_dialog.bind('',self.button_pressed21) self.adv_top_group = Pmw.Group(self.adv_search_dialog.interior(),tag_text='Advanced operations') self.adv_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.adv_notebook = Pmw.NoteBook(self.adv_top_group.interior()) self.adv_notebook.pack(fill = 'both', expand = 1, padx = 10, pady = 10) self.adv_page_simple = self.adv_notebook.add('Advanced single search') self.adv_page_subs = self.adv_notebook.add('Substructure search') self.adv_page_scoring = self.adv_notebook.add('Scoring fusion') self.adv_page_centroids = self.adv_notebook.add('Centroids') self.adv_notebook.tab('Advanced single search').focus_set() # Advanced single search self.adv_query_selection_entry = Pmw.EntryField(self.adv_page_simple, labelpos = 'w', label_text = 'SMILES', value = '') self.adv_query_selection_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) my_scoring_adv = ('Tanimoto','Tversky','!Rule') my_fp_adv = ('MACCS','CATS','Groups') self.scoring_adv_dropdown = Pmw.ComboBox(self.adv_page_simple, label_text = 'Scoring method', labelpos = 'w', selectioncommand = self.changeScoring_adv_single, scrolledlist_items = my_scoring_adv) self.fp_adv_dropdown = Pmw.ComboBox(self.adv_page_simple, label_text = 'Fingerprint', labelpos = 'w', selectioncommand = self.changeFP_adv_single, scrolledlist_items = my_fp_adv) self.scoring_adv_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.fp_adv_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.adv_cutoff = Pmw.EntryField(self.adv_page_simple,labelpos = 'w', label_text = 'Cut off',value = '0.8') self.adv_cutoff.pack(fill = 'both', expand = 1, padx = 10, pady = 5) Pmw.alignlabels( [self.adv_query_selection_entry, self.fp_adv_dropdown, self.scoring_adv_dropdown, self.adv_cutoff] ) self.scoring_adv_dropdown.selectitem(my_scoring_adv[0]) self.fp_adv_dropdown.selectitem(my_fp_adv[0]) # Substructure search self.subs_query_selection_entry = Pmw.EntryField(self.adv_page_subs, labelpos = 'w', label_text = 'SMILES', value = '') self.subs_query_selection_entry.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.subs_cutoff = Pmw.EntryField(self.adv_page_subs,labelpos = 'w', label_text = 'Cut off',value = '0.8') self.subs_cutoff.pack(fill = 'both', expand = 0, padx = 10, pady = 5) Pmw.alignlabels( [self.subs_query_selection_entry, self.subs_cutoff]) # Scoring fusion self.fusion_query_selection_entry = Pmw.EntryField(self.adv_page_scoring, labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_fusion_filename,filter="*"), validate = {'validator':quickFileValidation,}, value = '', label_text = 'SMILES input file:') my_scoring_fusion = ('Tanimoto','Tversky','!Rule') my_fp_fusion = ('MACCS','CATS','Groups') my_engine_fusion = ('MAX','MIN','PRODUCT','AVERAGE','SUM') self.scoring_fusion_dropdown = Pmw.ComboBox(self.adv_page_scoring, label_text = 'Scoring method', labelpos = 'w', selectioncommand = self.changeScoring_adv_fusion, scrolledlist_items = my_scoring_fusion) self.fp_fusion_dropdown = Pmw.ComboBox(self.adv_page_scoring, label_text = 'Fingerprint', labelpos = 'w', selectioncommand = self.changeFP_adv_fusion, scrolledlist_items = my_fp_fusion) self.engine_fusion_dropdown = Pmw.ComboBox(self.adv_page_scoring, label_text = 'Fusion function', labelpos = 'w', selectioncommand = self.changeEngine, scrolledlist_items = my_engine_fusion) self.fusion_query_selection_entry.pack( anchor = 'n',fill = 'x', expand = 1, padx = 8, pady = 8) self.scoring_fusion_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.fp_fusion_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.engine_fusion_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.fusion_cutoff = Pmw.EntryField(self.adv_page_scoring,labelpos = 'w', label_text = 'Cut off',value = '0.8') self.fusion_cutoff.pack(fill = 'both', expand = 1, padx = 10, pady = 5) Pmw.alignlabels( [self.fusion_query_selection_entry, self.fp_fusion_dropdown, self.engine_fusion_dropdown, self.scoring_fusion_dropdown, self.fusion_cutoff] ) self.scoring_fusion_dropdown.selectitem(my_scoring_fusion[0]) self.fp_fusion_dropdown.selectitem(my_fp_fusion[0]) self.engine_fusion_dropdown.selectitem(my_engine_fusion[0]) self.adv_notebook.setnaturalsize() # Centroids self.adv_gen_centroid = Pmw.Group(self.adv_page_centroids, tag_text='Generation of centroid') self.adv_gen_centroid.pack(side = TOP,expand=1, fill='x') self.centroid_origin = Pmw.EntryField(self.adv_gen_centroid.interior(), labelpos = 'w', label_text = 'DATABASE ID', value = '') self.centroid_origin.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.centroid_cons = Pmw.EntryField(self.adv_gen_centroid.interior(), labelpos = 'w', label_text = 'Consensus frequency (%)', value = '50') self.centroid_cons.pack(fill = 'both', expand = 1, padx = 10, pady = 5) my_scoring_centroid = ('Tanimoto','Tversky','!Rule') self.scoring_centroid_dropdown = Pmw.ComboBox(self.adv_gen_centroid.interior(), label_text = 'Scoring method', labelpos = 'w', selectioncommand = self.changeScoring_adv_centroid, scrolledlist_items = my_scoring_centroid) #self.scoring_centroid_dropdown.pack( anchor = 'n', # fill = 'x', expand = 1, padx = 8, pady = 8) self.scoring_centroid_dropdown.selectitem(my_scoring_centroid[0]) self.adv_search_centroid = Pmw.Group(self.adv_page_centroids, tag_text='Searching') self.adv_search_centroid.pack(side = TOP,expand=1, fill='x') self.adv_centroid_cutoff = Pmw.EntryField(self.adv_search_centroid.interior(),labelpos = 'w', label_text = 'Cut off',value = '0.8') self.adv_centroid_cutoff.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.adv_centroid_type_checkbutton = Pmw.RadioSelect(self.adv_search_centroid.interior(), buttontype = 'checkbutton',orient = 'vertical', labelpos = 'w', label_text = '', hull_borderwidth = 2,hull_relief = 'ridge') self.adv_centroid_type_checkbutton.pack(side = 'top', expand = 1, padx = 10, pady = 10) self.adv_centroid_type_checkbutton.add('Inverse search') # Filters self.adv_filt_group = Pmw.Group(self.adv_search_dialog.interior(),tag_text='Filters') self.adv_filt_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) filt_groups = ('1.Primary carbon','2.Secondary carbon','3.Tertiary carbon','4.Quaternary carbon', '5.Alkene','6.Alkyne','7.Alkylchloride','8.Alkylfluoride','9.Alkylbromide','10.Alkyliodide', '11.Alcohol','12.Primary alcohol','13.Secondary alcohol','14.Tertiary alcohol','15.Dialkylether', '16.Dialkylthioether','17.Alkylarylether','18.Diarylether','19.Alkylarylthioether','20.Diarylthioether', '21.Oxonium','22.Amine','23.Primary aliph amine','24.Secondary aliph amine','25.Tertiary aliph amine', '26.Quaternary aliph ammonium','27.Primary arom amine','28.Secondary arom amine','29.Tertiary arom amine', '30.Quaternary arom ammonium','31.Secondary mixed amine','32.Tertiary mixed amine','33.Quaternary mixed ammonium', '34.Ammonium','35.Alkylthiol','36.Dialkylthioether','37.Alkylarylthioether','38.Disulfide','39.1,2-Aminoalcohol', '40.1,2-Diol','41.1,1-Diol','42.Hydroperoxide','43.Peroxo','44.Organolithium compounds','45.Organomagnesium compounds', '46.Organometallic compounds','47.Aldehyde','48.Ketone','49.Thioaldehyde','50.Thioketone','51.Imine','52.Immonium', '53.Oxime','54.Oximether','55.Acetal','56.Hemiacetal','57.Aminal','58.Hemiaminal','59.Thioacetal','60.Thiohemiacetal', '61.Halogen acetal like','62.Acetal like','63.Halogenmethylen ester or similar','64.NOS methylen ester or similar', '65.Hetero methylen ester or similar','66.Cyanhydrine','67.Chloroalkene','68.Fluoroalkene','69.Bromoalkene','70.Iodoalkene', '71.Enol','72.Endiol','73.Enolether','74.Enolester','75.Enamine','76.Thioenol','77.Thioenolether','78.Acylchloride', '79.Acylfluoride','80.Acylbromide','81.Acyliodide','82.Acylhalide','83.Carboxylic acid','84.Carboxylic ester','85.Lactone', '86.Carboxylic anhydride','87.Carboxylic acid derivative','88.Carbothioic acid','89.Carbothioic-S-ester','90.Carbothioic_S_lactone', '91.Carbothioic-O-ester','92.Carbothioic-O-lactone','93.Carbothioic halide','94.Carbodithioic acid','95.Carbodithioic ester', '96.Carbodithiolactone','97.Amide','98.Primary amide','99.Secondary amide','100.Tertiary amide','101.Lactam','102.Alkyl_imide', '103.N-hetero imide','104.Imide acidic','105.Thioamide','106.Thiolactam','107.Oximester','108.Amidine','109.Hydroxamic acid', '110.Hydroxamic acid ester','111.Imidoacid','112.Imidoacid cyclic','113.Imidoester','114.Imidolactone','115.Imidothioacid', '116.Imidothioacid cyclic','117.Imidothioester','118.Imidothiolactone','119.Amidine','120.Imidolactam','121.Imidoylhalide', '122.Imidoylhalide cyclic','123.Amidrazone','124.Alpha aminoacid','125.Alpha hydroxyacid','126.Peptide middle','127.Peptide C-term', '128.Peptide N-term','129.Carboxylic orthoester','130.Ketene','131.Ketenacetal','132.Nitrile','133.Isonitrile','134.Vinylogous carbonyl/carboxyl_derivative', '135.Vinylogous acid','136.Vinylogous ester','137.Vinylogous amide','138.Vinylogous halide','139.Carbonic acid dieester', '140.Carbonic acid esterhalide','141.Carbonic acid monoester','142.Carbonic acid derivatives','143.Thiocarbonic acid dieester', '144.Thiocarbonic acid esterhalide','145.Thiocarbonic acid monoester','146.Urea','147.Thiourea','148.Isourea','149.Isothiourea', '150.Guanidine','151.Carbaminic acid','152.Urethan','153.Biuret','154.Semicarbazide','155.Carbazide','156.Semicarbazone','157.Carbazone', '158.Thiosemicarbazide','159.Thiocarbazide','160.Thiosemicarbazone','161.Thiocarbazone','162.Isocyanate','163.Cyanate','164.Isothiocyanate', '165.Thiocyanate','166.Carbodiimide','167.Orthocarbonic derivatives','168.Phenol','169.1,2-Diphenol','170.Arylchloride','171.Arylfluoride', '172.Arylbromide','173.Aryliodide','174.Arylthiol','175.Iminoarene','176.Oxoarene','177.Thioarene','178.Hetero-N H-Basic','179.Hetero-N No-H-Basic', '180.Hetero-N nonbasic','181.Hetero-O','182.Hetero-S','183.Heteroaromatic','184.Nitrite','185.Thionitrite','186.Nitrate','187.Nitro', '188.Nitroso','189.Azide','190.Acylazide','191.Diazo','192.Diazonium','193.Nitrosamine','194.Nitrosamide','195.N-Oxide','196.Hydrazine', '197.Hydrazone','198.Hydroxylamine','199.Sulfon','200.Sulfoxide','201.Sulfonium','202.Sulfuric acid','203.Sulfuric monoester', '204.Sulfuric diester','205.Sulfuric monoamide','206.Sulfuric diamide','207.Sulfuric esteramide','208.Sulfuric derivative','209.Sulfonic acid', '210.Sulfonamide','211.Sulfonic ester','212.Sulfonic halide','213.Sulfonic derivative','214.Sulfinic acid','215.Sulfinic amide','216.Sulfinic ester', '217.Sulfinic halide','218.Sulfinic derivative','219.Sulfenic acid','220.Sulfenic amide','221.Sulfenic ester','222.Sulfenic halide', '223.Sulfenic derivative','224.Phosphine','225.Phosphine oxide','226.Phosphonium','227.Phosphorylen','228.Phosphonic acid','229.Phosphonic monoester', '230.Phosphonic diester','231.Phosphonic monoamide','232.Phosphonic diamide','233.Phosphonic esteramide','234.Phosphonic acid derivative', '235.Phosphoric acid','236.Phosphoric monoester','237.Phosphoric diester','238.Phosphoric triester','239.Phosphoric monoamide','240.Phosphoric diamide', '241.Phosphoric triamide','242.Phosphoric monoestermonoamide','243.Phosphoric diestermonoamide','244.Phosphoric_monoesterdiamide', '245.Phosphoric acid derivative','246.Phosphinic acid','247.Phosphinic ester','248.Phosphinic amide','249.Phosphinic acid derivative', '250.Phosphonous acid','251.Phosphonous monoester','252.Phosphonous diester','253.Phosphonous monoamide','254.Phosphonous diamide','255.Phosphonous esteramide', '256.Phosphonous derivatives','257.Phosphinous acid','258.Phosphinous ester','259.Phosphinous amide','260.Phosphinous derivatives', '261.Quart silane','262.Non-quartz silane','263.Silylmonohalide','264.Het-trialkylsilane','265.DiHet dialkylsilane','266.TriHet alkylsilane', '267.Silicic acid derivative','268.Trialkylborane','269.Boric acid derivatives','270.Boronic acid derivative','271.Borohydride','272.Quaternary boron', '273.Aromatic','274.Heterocyclic','275.Epoxide','276.NH-aziridine','277.Spiro','278.Annelated_rings','279.Bridged rings','280.Sugar pattern 1', '281.Sugar pattern 2','282.Sugar pattern combi','283.Sugar pattern 2 reducing','284.Sugar pattern 2 alpha','285.Sugar pattern 2 beta', '286.Conjugated double bond','287.Conjugated tripple bond','288.Trans double bond','289.Mixed anhydrides','290.Halogen on heteroatom', '291.Halogen multi subst','292.Trifluoromethyl','293.C~O/C~N/C~S bond (Drug Filter)','294.Charged','295.Anion','296.Cation','297.Salt','298.1,3-Tautomerizable', '299.1,5-Tautomerizable','300.Rotatable bond','301.Michael acceptor','302.Dicarbodiazene','303.CH-acidic','304.CH-acidic strong','305.Chiral center specified') self.groups_filter_simple = Pmw.ComboBox(self.adv_filt_group.interior(), label_text = 'Groups', labelpos = 'nw', selectioncommand = self.changeText_filt, scrolledlist_items = filt_groups, dropdown = 0, ) self.groups_filter_simple.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.dbid_cutoff = Pmw.EntryField(self.adv_filt_group.interior(),labelpos = 'w', label_text = 'Database ID',value = '') self.dbid_cutoff.pack(fill = 'both', expand = 0, padx = 10, pady = 5) # Output self.adv_file_io = Pmw.Group(self.adv_search_dialog.interior(), tag_text='Search log') self.adv_file_io.pack(side = TOP,expand=1, fill='x') self.adv_button_box = Pmw.ButtonBox(self.adv_file_io.interior(),orient='vertical', padx=0,pady=0) self.adv_button_box.add('Search!',command = self.do_adv_search) self.adv_button_box.add('Save SMILES',command = self.pre_do_save_adv_search_smiles) self.adv_button_box.add('Save IDs for Docking',command = self.pre_do_save_adv_search_ids) self.adv_button_box.add('Extract 3D from database',command = self.pre_save_adv_3d_from_search) self.adv_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.adv_page_log_text = Pmw.ScrolledText(self.adv_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow') self.adv_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.adv_search_dialog.show() def show_simple_search_dialog(self): if( self.check_w16 == 1): return self.check_w16 = 1 self.simple_search_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Simple Search', command = self.button_pressed16) self.simple_search_dialog.withdraw() Pmw.setbusycursorattributes(self.simple_search_dialog.component('hull')) self.simple_search_dialog.geometry('620x500') self.simple_search_dialog.bind('',self.button_pressed16) self.ss_top_group = Pmw.Group(self.simple_search_dialog.interior(),tag_text='Search Options') self.ss_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.ss_query_selection_entry = Pmw.EntryField(self.ss_top_group.interior(), labelpos = 'w', label_text = 'SMILES', value = '') self.ss_query_selection_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.ss_alfa_query_selection_entry = Pmw.EntryField(self.ss_top_group.interior(), labelpos = 'w', label_text = 'alfa (only for tversky)', value = '') self.ss_alfa_query_selection_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.ss_beta_query_selection_entry = Pmw.EntryField(self.ss_top_group.interior(), labelpos = 'w', label_text = 'beta (only for tversky)', value = '') self.ss_beta_query_selection_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) my_scoring = ('Tanimoto','Tversky','!Rule') my_fp = ('MACCS','CATS','Groups') self.scoring_dropdown = Pmw.ComboBox(self.ss_top_group.interior(), label_text = 'Scoring method', labelpos = 'w', selectioncommand = self.changeScoring, scrolledlist_items = my_scoring) self.fp_dropdown = Pmw.ComboBox(self.ss_top_group.interior(), label_text = 'Fingerprint', labelpos = 'w', selectioncommand = self.changeFP, scrolledlist_items = my_fp) self.scoring_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.fp_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) Pmw.alignlabels( [self.ss_query_selection_entry, self.ss_alfa_query_selection_entry, self.ss_beta_query_selection_entry, self.fp_dropdown, self.scoring_dropdown] ) self.scoring_dropdown.selectitem(my_scoring[0]) self.fp_dropdown.selectitem(my_fp[0]) self.ss_file_io = Pmw.Group(self.simple_search_dialog.interior(), tag_text='Search log') self.ss_file_io.pack(side = TOP,expand=1, fill='x') self.ss_button_box = Pmw.ButtonBox(self.ss_file_io.interior(),orient='vertical', padx=0,pady=0) self.ss_button_box.add('Search!',command = self.do_simple_search) self.ss_button_box.add('Save IDs for Docking',command = self.pre_do_save_simple_search_ids) #self.ss_button_box.add('Show SMILES',command = self.stop_gfps) self.ss_button_box.add('Extract 3D from database',command = self.pre_save_3d_from_search) self.ss_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.ss_page_log_text = Pmw.ScrolledText(self.ss_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow' ) self.ss_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.simple_search_dialog.show() def show_insertfps_dialog(self): if( self.check_w15 == 1): return self.check_w15 = 1 self.ifps_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Insert Fingerprints', command = self.button_pressed15) self.ifps_dialog.withdraw() Pmw.setbusycursorattributes(self.ifps_dialog.component('hull')) self.ifps_dialog.geometry('620x200') self.ifps_dialog.bind('',self.button_pressed15) self.ifps_top_group = Pmw.Group(self.ifps_dialog.interior(),tag_text='Load FPs') self.ifps_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.ifps_ids_location = Pmw.EntryField(self.ifps_top_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_ifps_path), value = '', label_text = 'IDs INPUT FILE:') self.ifps_workdir_location = Pmw.EntryField(self.ifps_top_group.interior(), labelpos='w', label_pyclass = DirDialogButtonClassFactory.get(self.set_ifps_working_path), value = '', label_text = 'Working directory:') self.ifps_ids_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.ifps_workdir_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) Pmw.alignlabels( [self.ifps_ids_location, self.ifps_workdir_location]) self.ifps_button_box = Pmw.ButtonBox(self.ifps_dialog.interior(),orient='horizontal', padx=0,pady=0) self.ifps_button_box.add('Insert',command = self.save_ifps_input_file) self.ifps_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.ifps_dialog.show() def show_generatefps3d_dialog(self): if( self.check_w26 == 1): return self.check_w26 = 1 self.gfps3d_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Generate Fingerprints', command = self.button_pressed26) self.gfps3d_dialog.withdraw() Pmw.setbusycursorattributes(self.gfps3d_dialog.component('hull')) self.gfps3d_dialog.geometry('620x500') self.gfps3d_dialog.bind('',self.button_pressed26) self.gfps3d_top_group = Pmw.Group(self.gfps3d_dialog.interior(),tag_text='Input parameters') self.gfps3d_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.gfps3d_node_selection_entry = Pmw.EntryField(self.gfps3d_top_group.interior(), labelpos = 'w', label_text = 'Head Node name', value = self.config_settings['rnode']) self.gfps3d_numproc_selection_entry = Pmw.EntryField(self.gfps3d_top_group.interior(), labelpos = 'w', label_text = 'Num processors', value = '2') self.gfps3d_output_selection_entry = Pmw.EntryField(self.gfps3d_top_group.interior(), labelpos = 'w', label_text = 'Working Directory on Nodes', value = self.config_settings['rwork_dir']) self.gfps3d_usedatabases_selection_entry = Pmw.EntryField(self.gfps3d_top_group.interior(), labelpos = 'w', label_text = 'Use Databases (, separated)', value = '') self.gfps3d_node_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.gfps3d_numproc_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.gfps3d_output_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.gfps3d_usedatabases_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) Pmw.alignlabels( [self.gfps3d_node_selection_entry, self.gfps3d_numproc_selection_entry, self.gfps3d_output_selection_entry, self.gfps3d_usedatabases_selection_entry]) self.gfps3d_file_io = Pmw.Group(self.gfps3d_dialog.interior(), tag_text='Output') self.gfps3d_file_io.pack(side = TOP,expand=1, fill='x') self.gfps3d_button_box = Pmw.ButtonBox(self.gfps3d_file_io.interior(),orient='vertical', padx=0,pady=0) self.gfps3d_button_box.add('Insert',command = self.save_rungtp_input_file) self.gfps3d_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.gfps3d_page_log_text = Pmw.ScrolledText(self.gfps3d_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow' ) self.gfps3d_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.gfps3d_dialog.show() def show_generatefps_dialog(self): if( self.check_w14 == 1): return self.check_w14 = 1 self.gfps_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Generate Fingerprints', command = self.button_pressed14) self.gfps_dialog.withdraw() Pmw.setbusycursorattributes(self.gfps_dialog.component('hull')) self.gfps_dialog.geometry('620x700') self.gfps_dialog.bind('',self.button_pressed14) self.gfps_top_group = Pmw.Group(self.gfps_dialog.interior(),tag_text='From Database') self.gfps_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.gfps_second_group = Pmw.Group(self.gfps_dialog.interior(),tag_text='From File') self.gfps_second_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.gfps_3_group = Pmw.Group(self.gfps_dialog.interior(),tag_text='Options') self.gfps_3_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.gfps_db_selection_entry = Pmw.EntryField(self.gfps_top_group.interior(), labelpos = 'w', label_text = 'Database Name', value = '') self.gfps_smiles_location = Pmw.EntryField(self.gfps_second_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_gfps_path), value = '', label_text = 'SMILES Input file:') self.gfps_working_location = Pmw.EntryField(self.gfps_3_group.interior(), labelpos='w', label_pyclass = DirDialogButtonClassFactory.get(self.set_gfps_working_path), value = '', label_text = 'Working dir:') # Create and pack a vertical RadioSelect widget, with checkbuttons. self.fp_types_checkbutton = Pmw.RadioSelect(self.gfps_3_group.interior(), buttontype = 'checkbutton',orient = 'vertical', labelpos = 'w', label_text = 'Generate\nthe following\nfingerprints', hull_borderwidth = 2,hull_relief = 'ridge') self.fp_types_checkbutton.pack(side = 'top', expand = 1, padx = 10, pady = 10) # Add some buttons to the checkbutton RadioSelect. self.fp_types_checkbutton.add('Structure based (MACCS)') self.fp_types_checkbutton.add('Topological Pharmacophores (CATS)') self.fp_types_checkbutton.add('Groups filtering') #self.fp_types_checkbutton.add('3D Pharmacophoric triplets') # self.fp_types_checkbutton.invoke('') self.gfps_db_selection_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.gfps_smiles_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.gfps_working_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) Pmw.alignlabels( [self.gfps_db_selection_entry, self.gfps_smiles_location, self.gfps_working_location]) self.gfps_file_io = Pmw.Group(self.gfps_dialog.interior(), tag_text='Generator output') self.gfps_file_io.pack(side = TOP,expand=1, fill='x') self.gfps_button_box = Pmw.ButtonBox(self.gfps_file_io.interior(),orient='horizontal', padx=0,pady=0) self.gfps_button_box.add('Generate',command = self.save_gfps_input_file) self.gfps_button_box.add('Stop!',command = self.stop_gfps) self.gfps_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.gfps_page_log_text = Pmw.ScrolledText(self.gfps_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow' ) self.gfps_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.gfps_dialog.show() def show_dbsources_dialog(self): if( self.check_w13 == 1): return self.check_w13 = 1 self.dbsources_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Sources', command = self.button_pressed13) self.dbsources_dialog.withdraw() Pmw.setbusycursorattributes(self.dbsources_dialog.component('hull')) self.dbsources_dialog.geometry('520x200') self.dbsources_dialog.bind('',self.button_pressed13) self.dbsources_top_group = Pmw.Group(self.dbsources_dialog.interior(),tag_text='MOLECULAR DATABASES') self.dbsources_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) try: db = MySQLdb.connection(host=self.config_settings['mysql_host'], user=self.config_settings['mysql_user'], passwd=self.config_settings['mysql_password'], db=self.config_settings['mysql_db'], port=int(self.config_settings['mysql_port'])) except: self.screwup("Fatal","Can not connect to the database. Check parameters") return try: db.query("""SELECT * FROM ORIGINDB""") lista = () self.combo_dbsources = Pmw.ComboBox(self.dbsources_top_group.interior(), label_text = 'These are the sources available:', labelpos = 'n', #selectioncommand = self.changeText, scrolledlist_items = lista, dropdown = 0) self.combo_dbsources.pack(side = 'left', fill = 'both', expand = 1, padx = 8, pady = 8) res = db.store_result() for row in res.fetch_row(0): new_line = "%s - %s | %s" %(row[0],row[1],row[3]) self.combo_dbsources.insert('end',new_line) #print row[0],row[1] except: db.close() self.screwup("Fatal","Can not extract information from database") return self.dbsources_dialog.show() db.close() def show_vssources_dialog(self): if( self.check_w20 == 1): return self.check_w20 = 1 self.vssources_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'VS catalog', command = self.button_pressed20) self.vssources_dialog.withdraw() Pmw.setbusycursorattributes(self.vssources_dialog.component('hull')) self.vssources_dialog.geometry('820x300') self.vssources_dialog.bind('',self.button_pressed20) self.vssources_top_group = Pmw.Group(self.vssources_dialog.interior(),tag_text='Virtual Screening Catalog') self.vssources_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) try: db = MySQLdb.connection(host=self.config_settings['mysql_host'], user=self.config_settings['mysql_user'], passwd=self.config_settings['mysql_password'], db=self.config_settings['mysql_db'], port=int(self.config_settings['mysql_port'])) except: self.screwup("Fatal","Cannot connect to the database. Check parameters") return try: db.query("""SELECT * FROM VIRTUAL_SCREENING""") lista = () self.combo_vssources = Pmw.ComboBox(self.vssources_top_group.interior(), label_text = 'These are the sources available:', labelpos = 'n', #selectioncommand = self.changeText, scrolledlist_items = lista, dropdown = 0) self.combo_vssources.pack(side = 'left', fill = 'both', expand = 1, padx = 8, pady = 8) res = db.store_result() for row in res.fetch_row(0): new_line = "%s - %s | %s" %(row[0],row[3],row[1]) self.combo_vssources.insert('end',new_line) #print row[0],row[1] except: db.close() self.screwup("Fatal","Cant extract information. Check DB schema") return db.close() self.vssources_dialog.show() def show_about_dialog(self): if( self.check_w11 == 1): return self.check_w11 = 1 self.about_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'About the software...', command = self.button_pressed11) self.about_dialog.withdraw() Pmw.setbusycursorattributes(self.about_dialog.component('hull')) self.about_dialog.geometry('620x440') self.about_dialog.bind('',self.button_pressed11) self.about_top_group = Pmw.Group(self.about_dialog.interior(),tag_text='About and legal notice') self.about_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) photo = PhotoImage(data=about_image) self.about_image_label = Tkinter.Label(self.about_top_group.interior(), image=photo) self.about_image_label.image = photo self.about_image_label.pack() self.about_text_field = Pmw.ScrolledText(self.about_top_group.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow') self.about_text_field.insert('end',"%s" % about_text) # self.about_text_field = Tkinter.Label(self.about_top_group.interior(), # text = about_text, # background = 'black', # foreground = 'yellow', # justify = LEFT, # ) self.about_text_field.pack(expand = 0, fill = 'both', padx = 4, pady = 4) self.about_dialog.show() def show_options_dialog(self): if( self.check_w10 == 1): return self.check_w10 = 1 self.options_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Local options', command = self.button_pressed10) self.options_dialog.withdraw() Pmw.setbusycursorattributes(self.options_dialog.component('hull')) self.status_line6 = Label(self.options_dialog.interior(), relief='sunken', font='helvetica 12', anchor='w',fg='yellow',bg='black') self.status_line6.pack(side=BOTTOM,fill='x', expand=1, padx=0, pady=0) self.options_dialog.geometry('640x680') self.options_dialog.bind('',self.button_pressed10) # self.configuration_top_group = Pmw.Group(self.options_dialog.interior(),tag_text='Version Notes') # self.configuration_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) # self.text_field = Tkinter.Label(self.configuration_top_group.interior(), # text = intro_text, # background = 'black', # foreground = 'yellow', # justify = LEFT, # ) # self.text_field.pack(expand = 0, fill = 'both', padx = 4, pady = 4) self.configuration_group = Pmw.Group(self.options_dialog.interior(),tag_text='PATHs & stuff') self.configuration_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.alfa_location = Pmw.EntryField(self.configuration_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_alfa_path), value = self.config_settings['alfa_exe'], label_text = 'ALFA executable:') self.mopac7_location = Pmw.EntryField(self.configuration_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_mopac_path), value = self.config_settings['lmopac7_exe'], label_text = 'MOPAC7 executable:') self.cgrid_location = Pmw.EntryField(self.configuration_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_cgrid_path), value = self.config_settings['cgrid_exe'], label_text = 'CGRID executable:') self.cdock_location = Pmw.EntryField(self.configuration_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_cdock_path), value = self.config_settings['cdock_exe'], label_text = 'CDOCK executable:') self.gfusion_location = Pmw.EntryField(self.configuration_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_gfusion_path), value = self.config_settings['gfusion_exe'], label_text = 'GFUSION executable:') self.work_location = Pmw.EntryField(self.configuration_group.interior(), labelpos='w', label_pyclass = DirDialogButtonClassFactory.get(self.set_work_dir), value = self.config_settings['work_dir'], label_text = 'Working directory:') self.oe_location = Pmw.EntryField(self.configuration_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_oe_path), value = self.config_settings['oe_licence'], label_text = 'OE LICENSE:') self.gtp_location = Pmw.EntryField(self.configuration_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_gtp_path), value = self.config_settings['gtp_exe'], label_text = 'GTP executable:') self.oblocal_location = Pmw.EntryField(self.configuration_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_oblocal_path), value = self.config_settings['ob_exe'], label_text = 'OpenBABEL executable:') self.prep_location = Pmw.EntryField(self.configuration_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_prep_path), value = self.config_settings['rep_exe'], label_text = 'Receptor Preparator executable:') self.amberhome_location = Pmw.EntryField(self.configuration_group.interior(), labelpos='w', label_pyclass = DirDialogButtonClassFactory.get(self.set_amberhome_path), value = self.config_settings['amberhome'], label_text = 'AMBERHOME:') self.delphi_location = Pmw.EntryField(self.configuration_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_delphi_path), value = self.config_settings['delphi_exe'], label_text = 'Delphi executable:') self.home_checkbutton = Pmw.RadioSelect(self.configuration_group.interior(), buttontype = 'checkbutton',orient = 'vertical', labelpos = 'w', label_text = 'Working options', hull_borderwidth = 2,hull_relief = 'ridge') self.home_checkbutton.add('Ignore working dir and use current dir') for x in [ self.alfa_location, self.mopac7_location, self.cgrid_location, self.cdock_location, self.gfusion_location, self.work_location, self.oe_location, self.gtp_location, self.oblocal_location, self.prep_location, self.delphi_location, self.amberhome_location, self.home_checkbutton]: x.pack(fill = 'both', expand = 1, padx = 10, pady = 5) Pmw.alignlabels( [self.alfa_location, self.mopac7_location, self.cgrid_location, self.cdock_location, self.gfusion_location, self.work_location, self.oe_location, self.gtp_location, self.oblocal_location, self.prep_location, self.amberhome_location, self.delphi_location, self.home_checkbutton] ) self.config_button_box = Pmw.ButtonBox(self.options_dialog.interior(), padx=0, pady=0,orient='horizontal') self.config_button_box.pack(side=BOTTOM,expand = 1, padx = 10, pady = 5) self.config_button_box.add('Save Plugin Configuration File',command = self.save_plugin_config_file) self.options_dialog.show() def show_cdock_results_dialog(self): if( self.check_w9 == 1): return self.check_w9 = 1 self.cdock_results_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'CDOCK Results', command = self.button_pressed9) self.cdock_results_dialog.withdraw() Pmw.setbusycursorattributes(self.cdock_results_dialog.component('hull')) self.cdock_results_dialog.geometry('620x500') self.cdock_results_dialog.bind('',self.button_pressed9) self.results_viewer_page_top_group = Pmw.Group(self.cdock_results_dialog.interior(),tag_text='File') self.results_viewer_page_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.results_viewer_page_mini_group = Pmw.Group(self.cdock_results_dialog.interior(),tag_text='Protein') self.results_viewer_page_mini_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.pose_viewer_ligand_dic = {} self.results_viewer_page_stucts = Pmw.Group(self.cdock_results_dialog.interior(),tag_text='Poses') self.results_viewer_page_stucts.pack(fill = 'both', expand = 1, padx = 10, pady = 0) self.pose_file = StringVar() self.pose_file.set('conformers_MINE.pdb') self.prot_sele_pose_location = Pmw.EntryField(self.results_viewer_page_mini_group.interior(), labelpos='w', value = '', label_text = 'Protein selection:') self.prot_sele_pose_location.pack(side=LEFT,fill = 'x', expand = 1, padx = 1, pady = 5) self.pose_file_location = Pmw.EntryField(self.results_viewer_page_top_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_pose_filename,filter="*.pdb"), validate = {'validator':quickFileValidation,}, value = 'conformers_MINE.pdb', label_text = 'CDOCK results:') self.pose_file_location.pack(side=LEFT,fill = 'x', expand = 1, padx = 1, pady = 5) self.load_pose_file_buttonbox = Pmw.ButtonBox(self.results_viewer_page_top_group.interior(), padx=0) self.load_pose_file_buttonbox.pack(side=BOTTOM,expand = 1, padx = 10, pady = 5) self.load_pose_file_buttonbox.add('Load',command=self.pre_load_cdock_res) self.cdock_results_dialog.show() def show_cdock_dialog(self): if( self.check_w8 == 1): return self.check_w8 = 1 self.cdock_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'CDOCK', command = self.button_pressed8) self.cdock_dialog.withdraw() Pmw.setbusycursorattributes(self.cdock_dialog.component('hull')) self.status_line3 = Label(self.cdock_dialog.interior(), relief='sunken', font='helvetica 12', anchor='w',fg='yellow',bg='black') self.status_line3.pack(side=BOTTOM,fill='x', expand=1, padx=0, pady=0) self.cdock_dialog.geometry('620x740') self.cdock_dialog.bind('',self.button_pressed8) # CDOCK panel self.dock_page_main_group = Pmw.Group(self.cdock_dialog.interior(), tag_text='CDOCK input') self.dock_page_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.dock_page_left_side = Pmw.Group(self.dock_page_main_group.interior(),tag_text = 'Parameters') self.dock_page_left_side.pack(side = LEFT, fill = 'both',expand = 0, padx = 10, pady = 3) self.dock_page_right_side = Pmw.Group(self.dock_page_main_group.interior(),tag_text = 'Stack & poses') self.dock_page_right_side.pack(side = LEFT, fill = 'both',expand = 0, padx = 10, pady = 3) self.dock_page_main2_group = Pmw.Group(self.cdock_dialog.interior(), tag_text='Algorithms') self.dock_page_main2_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.dock_page_left2_side = Pmw.Group(self.dock_page_main2_group.interior(),tag_text = 'MCSA') self.dock_page_left2_side.pack(side = LEFT, fill = 'both',expand = 0, padx = 10, pady = 3) self.dock_page_right2_side = Pmw.Group(self.dock_page_main2_group.interior(),tag_text = 'Energy and the rest') self.dock_page_right2_side.pack(side = LEFT, fill = 'both',expand = 0, padx = 10, pady = 3) ####### CDOCK inputs ################ self.input_cdock = Pmw.EntryField(self.dock_page_left_side.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_input_cdock,filter=("*.pdb")), validate = {'validator':quickFileValidation,}, value = 'myInput.pdb', label_text = 'Input File:') self.ref_cdock = Pmw.EntryField(self.dock_page_left_side.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_ref_cdock,filter=("*.pdb")), validate = {'validator':quickFileValidation,}, value = '', label_text = 'Reference File:') self.cgrid_cdock = Pmw.EntryField(self.dock_page_left_side.interior(), labelpos='w', label_pyclass = DirDialogButtonClassFactory.get(self.set_cgrid_cdock_path), value = self.config_settings['work_dir'], label_text = 'CGRID directory:') self.input_cdock.pack(fill='x',padx=4,pady=1,expand=0) self.ref_cdock.pack(fill='x',padx=4,pady=1,expand=0) self.cgrid_cdock.pack(fill='x',padx=4,pady=1,expand=0) Pmw.alignlabels( [self.input_cdock, self.ref_cdock, self.cgrid_cdock ] ) self.max_generated_poses_selection_entry = Pmw.EntryField(self.dock_page_right_side.interior(), labelpos = 'w', label_text = 'maxGeneratedPoses', value = '167500000', ) self.max_total_stack_size_selection_entry = Pmw.EntryField(self.dock_page_right_side.interior(), labelpos = 'w', label_text = 'maxTotalStackSize', value = '60000', ) self.max_exh_poses_selection_entry = Pmw.EntryField(self.dock_page_right_side.interior(), labelpos = 'w', label_text = 'maxExhaustivePoses', value = '7000000', ) self.max_conf_stack_size_selection_entry = Pmw.EntryField(self.dock_page_right_side.interior(), labelpos = 'w', label_text = 'maxConfStackSize', value = '512', ) self.jau_meni_selection_entry = Pmw.EntryField(self.dock_page_right_side.interior(), labelpos = 'w', label_text = 'HowManyResults', value = '5', ) self.max_generated_poses_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.max_total_stack_size_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.max_conf_stack_size_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.max_exh_poses_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.jau_meni_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) Pmw.alignlabels( [self.max_total_stack_size_selection_entry, self.max_generated_poses_selection_entry, self.max_conf_stack_size_selection_entry, self.max_exh_poses_selection_entry, self.jau_meni_selection_entry ]) self.initial_temp_selection_entry = Pmw.EntryField(self.dock_page_left2_side.interior(), labelpos = 'w', label_text = 'initialMCSATemperature', value = '773', ) self.maxAcceptedPerMCSARound_selection_entry = Pmw.EntryField(self.dock_page_left2_side.interior(), labelpos = 'w', label_text = 'maxAcceptedPerRound', value = '0.97', ) self.maxGenPerMCSARound_selection_entry = Pmw.EntryField(self.dock_page_left2_side.interior(), labelpos = 'w', label_text = 'maxGenPerRound', value = '725000', ) self.annealingSchedule_selection_entry = Pmw.EntryField(self.dock_page_left2_side.interior(), labelpos = 'w', label_text = 'annealingSchedule', value = '0.80', ) self.probChange_selection_entry = Pmw.EntryField(self.dock_page_left2_side.interior(), labelpos = 'w', label_text = 'probChange', value = '0.80', ) self.seed_selection_entry = Pmw.EntryField(self.dock_page_left2_side.interior(), labelpos = 'w', label_text = 'seed', value = 'date-time', ) self.initial_temp_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.maxAcceptedPerMCSARound_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.maxGenPerMCSARound_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.annealingSchedule_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.probChange_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.seed_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) Pmw.alignlabels( [self.initial_temp_selection_entry, self.maxAcceptedPerMCSARound_selection_entry, self.maxGenPerMCSARound_selection_entry, self.annealingSchedule_selection_entry, self.probChange_selection_entry, self.seed_selection_entry ]) simplex = ('yes', 'no') onlyEnergy = ('no', 'yes') noUseISM = ('no','yes') noUseHB = ('no','yes') GAGAinput = ('no','yes') self.simplex_dropdown = Pmw.ComboBox(self.dock_page_right2_side.interior(), label_text = 'refineWithSimplex', labelpos = 'w', selectioncommand = self.changeSimplex, scrolledlist_items = simplex) self.onlyEnergy_dropdown = Pmw.ComboBox(self.dock_page_right2_side.interior(), label_text = 'getOnlyEnergy', labelpos = 'w', selectioncommand = self.changeonlyEnergy, scrolledlist_items = onlyEnergy) self.noUseISM_dropdown = Pmw.ComboBox(self.dock_page_right2_side.interior(), label_text = 'noUseISM', labelpos = 'w', selectioncommand = self.changenoUseISM, scrolledlist_items = noUseISM) self.noUseHB_dropdown = Pmw.ComboBox(self.dock_page_right2_side.interior(), label_text = 'noUseHB', labelpos = 'w', selectioncommand = self.changenoUseHB, scrolledlist_items = noUseHB) self.GAGA_dropdown = Pmw.ComboBox(self.dock_page_right2_side.interior(), label_text = 'getGAGAinput', labelpos = 'w', selectioncommand = self.changeGAGAinput, scrolledlist_items = GAGAinput) # self.simplex_dropdown.pack(side = 'left', anchor = 'n', # fill = 'x', expand = 1, padx = 8, pady = 8) self.simplex_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.onlyEnergy_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.noUseISM_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.noUseHB_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.GAGA_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) # Display the first element self.simplex_dropdown.selectitem(simplex[0]) self.onlyEnergy_dropdown.selectitem(onlyEnergy[0]) self.noUseISM_dropdown.selectitem(noUseISM[0]) self.noUseHB_dropdown.selectitem(noUseHB[0]) self.GAGA_dropdown.selectitem(GAGAinput[0]) Pmw.alignlabels( [self.GAGA_dropdown, self.simplex_dropdown, self.onlyEnergy_dropdown, self.noUseISM_dropdown, self.noUseHB_dropdown ]) self.cdock_file_io = Pmw.Group(self.cdock_dialog.interior(), tag_text='CDOCK output') self.cdock_file_io.pack(side = TOP,expand=1, fill='x') self.cdock_button_box = Pmw.ButtonBox(self.cdock_file_io.interior(),orient='horizontal', padx=0,pady=0) self.cdock_button_box.add('Run CDOCK',command = self.save_cdock_input_file) self.cdock_button_box.add('Stop!',command = self.stop_cdock) self.cdock_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.cdock_page_log_text = Pmw.ScrolledText(self.cdock_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow' ) self.cdock_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.cdock_dialog.show() def show_proc_grids(self): if( self.check_w31 == 1): return self.check_w31 = 1 self.proc_grids_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Grids Processing', command = self.button_pressed31) self.proc_grids_dialog.withdraw() Pmw.setbusycursorattributes(self.proc_grids_dialog.component('hull')) self.proc_grids_dialog.geometry('710x700') self.proc_grids_dialog.bind('',self.button_pressed31) self.pg_notebook = Pmw.NoteBook(self.proc_grids_dialog.interior()) self.pg_notebook.pack(fill = 'both', expand = 1, padx = 10, pady = 10) self.pg_page_average = self.pg_notebook.add('Boltzmann average') self.pg_page_diff = self.pg_notebook.add('Grid differences') self.pg_page_delphi = self.pg_notebook.add('Delphi frontend') # Average self.pg_notebook.tab('Boltzmann average').focus_set() self.grid_append_entry = Pmw.EntryField(self.pg_page_average, labelpos='w', label_pyclass = DirDialogButtonClassFactory.get(self.set_pg_append_path), value = self.config_settings['work_dir'], label_text = 'Grids directory:') self.grid_append_entry.pack(expand = 0, padx = 10, pady = 5) self.add_grid_buttonbox = Pmw.ButtonBox(self.pg_page_average, padx=0) self.add_grid_buttonbox.pack(expand = 0, padx = 10, pady = 5) self.add_grid_buttonbox.add('Add Grid',command=self.add_grid_average) self.add_grid_buttonbox.add('Clear grids',command=self.remove_grid_average) self.my_grid_lista = [] self.combo_grids = Pmw.ComboBox(self.pg_page_average, label_text = 'Grids to be averaged', labelpos = 'w', selectioncommand = self.select_average_grid, scrolledlist_items = self.my_grid_lista, dropdown = 0) self.combo_grids.pack(fill = 'both', expand = 1, padx = 8, pady = 8) # new_line = "%s - %s | %s" %(row[0],row[1],row[3]) # self.combo_dbsources.insert('end',new_line) #print row[0],row[1] self.pg_average_file_io = Pmw.Group(self.pg_page_average, tag_text='GFUSION output') self.pg_average_file_io.pack(side = 'bottom',expand=1, fill='x') self.pg_average_button_box = Pmw.ButtonBox(self.pg_average_file_io.interior(),orient='vertical',padx=0,pady=0) self.pg_average_button_box.add('Run GFUSION',command = self.save_gfusion_input) # self.pg_average_button_box.add('Stop!',command = self.stop_cdock) self.pg_average_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.pg_page_average_page_log_text = Pmw.ScrolledText(self.pg_average_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow' ) self.pg_page_average_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) # Now, diff grids self.grid_target_entry = Pmw.EntryField(self.pg_page_diff, labelpos='w', label_pyclass = DirDialogButtonClassFactory.get(self.set_pg_target_path), value = self.config_settings['work_dir'], label_text = 'Target Grid directory:') self.grid_target_entry.pack(fill='x',expand = 0, padx = 10, pady = 5) self.grid_ref_entry = Pmw.EntryField(self.pg_page_diff, labelpos='w', label_pyclass = DirDialogButtonClassFactory.get(self.set_pg_ref_path), value = self.config_settings['work_dir'], label_text = 'Reference Grid directory:') self.grid_ref_entry.pack(fill='x',expand = 0, padx = 10, pady = 5) Pmw.alignlabels( [ self.grid_target_entry, self.grid_ref_entry ] ) self.pg_diff_file_io = Pmw.Group(self.pg_page_diff, tag_text='GFUSION output') self.pg_diff_file_io.pack(side = 'bottom',expand=1, fill='x') self.pg_diff_button_box = Pmw.ButtonBox(self.pg_diff_file_io.interior(),orient='vertical',padx=0,pady=0) self.pg_diff_button_box.add('Run GFUSION',command = self.save_gfusion_input_diff) # self.pg_diff_button_box.add('Stop!',command = self.stop_cdock) self.pg_diff_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.pg_diff_average_page_log_text = Pmw.ScrolledText(self.pg_diff_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow' ) self.pg_diff_average_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) # Delphi stuff self.delphi_pdb_entry = Pmw.EntryField(self.pg_page_delphi, labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_delphi_pdb,filter=("*.pdb")), validate = {'validator':quickFileValidation,}, value = self.config_settings['work_dir'], label_text = 'PDB file:') self.delphi_pdb_entry.pack(fill='x',expand = 0, padx = 10, pady = 5) self.delphi_siz_entry = Pmw.EntryField(self.pg_page_delphi, labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_delphi_siz,filter=("*")), validate = {'validator':quickFileValidation,}, value = '', label_text = 'Radii file (opt):') self.delphi_siz_entry.pack(fill='x',expand = 0, padx = 10, pady = 5) self.delphi_crg_entry = Pmw.EntryField(self.pg_page_delphi, labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_delphi_crg,filter=("*")), validate = {'validator':quickFileValidation,}, value = '', label_text = 'Charges file (opt):') self.delphi_crg_entry.pack(fill='x',expand = 0, padx = 10, pady = 5) self.delphi_pqr_entry = Pmw.EntryField(self.pg_page_delphi, labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_delphi_pqr,filter=("*.pqr")), validate = {'validator':quickFileValidation,}, value = '', label_text = 'PQR output file (opt):') self.delphi_pqr_entry.pack(fill='x',expand = 0, padx = 10, pady = 5) self.delphi_phi_entry = Pmw.EntryField(self.pg_page_delphi, labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_delphi_phi,filter=("*.phi")), validate = {'validator':quickFileValidation,}, value = self.config_settings['work_dir'], label_text = 'Potential output file::') self.delphi_phi_entry.pack(fill='x',expand = 0, padx = 10, pady = 5) self.delphi_scale = Pmw.EntryField(self.pg_page_delphi, labelpos='w', value = '0.125', label_text = 'Grid spacing: ') self.delphi_scale.pack(fill='x',expand = 0, padx = 2, pady = 5) self.delphi_perfil = Pmw.EntryField(self.pg_page_delphi, labelpos='w', value = '40', label_text = 'Percentage of system in lattice: ') self.delphi_perfil.pack(fill='x',expand = 0, padx = 2, pady = 5) self.delphi_indi = Pmw.EntryField(self.pg_page_delphi, labelpos='w', value = '4.0', label_text = 'Internal dielectric constant:') self.delphi_indi.pack(fill='x',expand = 0, padx = 2, pady = 5) self.delphi_exdi = Pmw.EntryField(self.pg_page_delphi, labelpos='w', value = '80.0', label_text = 'Solvent dielectric constant:') self.delphi_exdi.pack(fill='x',expand = 0, padx = 2, pady = 5) self.delphi_solv_rat = Pmw.EntryField(self.pg_page_delphi, labelpos='w', value = '1.4', label_text = 'Solvent radius:') self.delphi_solv_rat.pack(fill='x',expand = 0, padx = 2, pady = 5) self.delphi_ion_rat = Pmw.EntryField(self.pg_page_delphi, labelpos='w', value = '2.0', label_text = 'Ion radius:') self.delphi_ion_rat.pack(fill='x',expand = 0, padx = 2, pady = 5) self.delphi_salt = Pmw.EntryField(self.pg_page_delphi, labelpos='w', value = '0', label_text = 'Salt molarity:') self.delphi_salt.pack(fill='x',expand = 0, padx = 2, pady = 5) # Combo for boundary conditions bnd_delphi_type = ('Zero potential', 'Dipolar','Focusing','Coulombic') self.delphi_bndcon = Pmw.ComboBox(self.pg_page_delphi, label_text = 'Boundary conditions', labelpos = 'w', selectioncommand = self.changeBND, scrolledlist_items = bnd_delphi_type) self.delphi_bndcon.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.delphi_bndcon.selectitem(bnd_delphi_type[1]) self.delphi_linit = Pmw.EntryField(self.pg_page_delphi, labelpos='w', value = '120', label_text = 'Linear equation iterations:') self.delphi_linit.pack(fill='x',expand = 0, padx = 2, pady = 5) self.delphi_nonit = Pmw.EntryField(self.pg_page_delphi, labelpos='w', value = '0', label_text = 'Non-Linear equation iterations:') self.delphi_nonit.pack(fill='x',expand = 0, padx = 2, pady = 5) Pmw.alignlabels( [ self.delphi_pdb_entry, self.delphi_siz_entry, self.delphi_crg_entry, self.delphi_indi, self.delphi_exdi, self.delphi_solv_rat, self.delphi_ion_rat, self.delphi_salt, self.delphi_linit, self.delphi_pqr_entry, self.delphi_phi_entry, self.delphi_scale,self.delphi_bndcon ] ) self.pg_delphi_file_io = Pmw.Group(self.pg_page_delphi, tag_text='Delphi output') self.pg_delphi_file_io.pack(side = 'bottom',expand=1, fill='x') self.pg_delphi_button_box = Pmw.ButtonBox(self.pg_delphi_file_io.interior(),orient='vertical',padx=0,pady=0) self.pg_delphi_button_box.add('Run Delphi',command = self.save_delphi_input) self.pg_delphi_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.pg_delphi_average_page_log_text = Pmw.ScrolledText(self.pg_delphi_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow' ) self.pg_delphi_average_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.pg_notebook.setnaturalsize() self.proc_grids_dialog.show() def show_grids_dialogs(self): if( self.check_w7 == 1): return self.check_w7 = 1 self.grids_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Grids Visualization', command = self.button_pressed7) self.grids_dialog.withdraw() Pmw.setbusycursorattributes(self.grids_dialog.component('hull')) self.status_line3 = Label(self.grids_dialog.interior(), relief='sunken', font='helvetica 12', anchor='w',fg='yellow',bg='black') self.status_line3.pack(side=BOTTOM,fill='x', expand=1, padx=0, pady=0) self.grids_dialog.geometry('910x640') self.grids_dialog.bind('',self.button_pressed7) self.map_viewer_page_top_group = Pmw.Group(self.grids_dialog.interior(),tag_text='Grid Map') self.map_viewer_page_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.map_viewer_page_center_group = Pmw.Group(self.grids_dialog.interior(),tag_text='Maps') self.map_viewer_page_center_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) #self.map_viewer_notebook = Pmw.NoteBook(self.map_viewer_page_center_group.interior()) #self.map_viewer_notebook.pack(fill='both',expand=1,padx=3,pady=3) self.left_frame = Tkinter.Frame(self.map_viewer_page_center_group.interior()) self.right_frame = Tkinter.Frame(self.map_viewer_page_center_group.interior()) self.grid_c_group = Pmw.Group(self.left_frame, tag_text='Carbon grid') self.grid_c_group.pack(fill = 'x', expand = 0, padx=10, pady=5) self.grid_h_group = Pmw.Group(self.left_frame, tag_text='Hydrogen grid') self.grid_h_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.grid_o_group = Pmw.Group(self.left_frame, tag_text='Oxygen grid') self.grid_o_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.grid_n_group = Pmw.Group(self.left_frame, tag_text='Nitrogen grid') self.grid_n_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.grid_p_group = Pmw.Group(self.left_frame, tag_text='Phosphorous grid') self.grid_p_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.grid_s_group = Pmw.Group(self.right_frame, tag_text='Sulfur grid') self.grid_s_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.grid_f_group = Pmw.Group(self.right_frame, tag_text='Fluorine grid') self.grid_f_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.grid_cl_group = Pmw.Group(self.right_frame, tag_text='Chlorine grid') self.grid_cl_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.grid_br_group = Pmw.Group(self.right_frame, tag_text='Bromide grid') self.grid_br_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.grid_i_group = Pmw.Group(self.right_frame, tag_text='Iodine grid') self.grid_i_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.show_surface_cpot = Pmw.ButtonBox(self.grid_c_group.interior(), padx = 0) self.show_surface_hpot = Pmw.ButtonBox(self.grid_h_group.interior(), padx = 0) self.show_surface_opot = Pmw.ButtonBox(self.grid_o_group.interior(), padx = 0) self.show_surface_npot = Pmw.ButtonBox(self.grid_n_group.interior(), padx = 0) self.show_surface_ppot = Pmw.ButtonBox(self.grid_p_group.interior(), padx = 0) self.show_surface_spot = Pmw.ButtonBox(self.grid_s_group.interior(), padx = 0) self.show_surface_fpot = Pmw.ButtonBox(self.grid_f_group.interior(), padx = 0) self.show_surface_clpot = Pmw.ButtonBox(self.grid_cl_group.interior(), padx = 0) self.show_surface_brpot = Pmw.ButtonBox(self.grid_br_group.interior(), padx = 0) self.show_surface_ipot = Pmw.ButtonBox(self.grid_i_group.interior(), padx = 0) self.show_surface_cpot.pack(side=LEFT,expand = 0, padx = 1, pady = 1) self.show_surface_cpot.add('Show Surface C pot',command=self.show_scpot) self.level_surface_cpot = Pmw.EntryField(self.grid_c_group.interior(), labelpos='w', value = '-1.0', label_text = 'Isosurface level:') self.level_surface_cpot.pack(side=LEFT,expand = 0, padx = 2, pady = 5) self.show_surface_hpot.pack(side=LEFT,expand = 1, padx = 1, pady = 1) self.show_surface_hpot.add('Show Surface H pot',command=self.show_shpot) self.level_surface_hpot = Pmw.EntryField(self.grid_h_group.interior(), labelpos='w', value = '1.0', label_text = 'Isosurface level:') self.level_surface_hpot.pack(side=LEFT,expand = 0, padx = 2, pady = 5) self.show_surface_opot.pack(side=LEFT,expand = 0, padx = 1, pady = 1) self.show_surface_opot.add('Show Surface O pot',command=self.show_sopot) self.level_surface_opot = Pmw.EntryField(self.grid_o_group.interior(), labelpos='w', value = '-1.0', label_text = 'Isosurface level:') self.level_surface_opot.pack(side=LEFT,expand = 0, padx = 2, pady = 5) self.show_surface_npot.pack(side=LEFT,expand = 0, padx = 1, pady = 1) self.show_surface_npot.add('Show Surface N pot',command=self.show_snpot) self.level_surface_npot = Pmw.EntryField(self.grid_n_group.interior(), labelpos='w', value = '-1.0', label_text = 'Isosurface level:') self.level_surface_npot.pack(side=LEFT,expand = 0, padx = 2, pady = 5) self.show_surface_ppot.pack(side=LEFT,expand = 0, padx = 1, pady = 1) self.show_surface_ppot.add('Show Surface P pot',command=self.show_sppot) self.level_surface_ppot = Pmw.EntryField(self.grid_p_group.interior(), labelpos='w', value = '-1.0', label_text = 'Isosurface level:') self.level_surface_ppot.pack(side=LEFT,expand = 0, padx = 2, pady = 5) self.show_surface_spot.pack(side=LEFT,expand = 0, padx = 1, pady = 1) self.show_surface_spot.add('Show Surface S pot',command=self.show_sspot) self.level_surface_spot = Pmw.EntryField(self.grid_s_group.interior(), labelpos='w', value = '-1.0', label_text = 'Isosurface level:') self.level_surface_spot.pack(side=LEFT,expand = 0, padx = 2, pady = 5) self.show_surface_fpot.pack(side=LEFT,expand = 0, padx = 1, pady = 1) self.show_surface_fpot.add('Show Surface F pot',command=self.show_sfpot) self.level_surface_fpot = Pmw.EntryField(self.grid_f_group.interior(), labelpos='w', value = '-1.0', label_text = 'Isosurface level:') self.level_surface_fpot.pack(side=LEFT,expand = 0, padx = 2, pady = 5) self.show_surface_clpot.pack(side=LEFT,expand = 0, padx = 1, pady = 1) self.show_surface_clpot.add('Show Surface Cl pot',command=self.show_sclpot) self.level_surface_clpot = Pmw.EntryField(self.grid_cl_group.interior(), labelpos='w', value = '-1.0', label_text = 'Isosurface level:') self.level_surface_clpot.pack(side=LEFT,expand = 0, padx = 2, pady = 5) self.show_surface_brpot.pack(side=LEFT,expand = 0, padx = 1, pady = 1) self.show_surface_brpot.add('Show Surface Br pot',command=self.show_sbrpot) self.level_surface_brpot = Pmw.EntryField(self.grid_br_group.interior(), labelpos='w', value = '-1.0', label_text = 'Isosurface level:') self.level_surface_brpot.pack(side=LEFT,expand = 0, padx = 2, pady = 5) self.show_surface_ipot.pack(side=LEFT,expand = 0, padx = 1, pady = 1) self.show_surface_ipot.add('Show Surface I pot',command=self.show_sipot) self.level_surface_ipot = Pmw.EntryField(self.grid_i_group.interior(), labelpos='w', value = '-1.0', label_text = 'Isosurface level:') self.level_surface_ipot.pack(side=LEFT,expand = 0, padx = 2, pady = 5) self.left_frame.pack(side=LEFT , padx=1, pady=1) self.right_frame.pack(side=LEFT , padx=1, pady=1) self.cgrid_views = Pmw.EntryField(self.map_viewer_page_top_group.interior(), labelpos='w', label_pyclass = DirDialogButtonClassFactory.get(self.set_cgrid_views_path), value = self.config_settings['work_dir'], label_text = 'CGRID directory:') self.cgrid_views.pack(side=LEFT,expand = 1, padx = 10, pady = 5) self.load_map_buttonbox = Pmw.ButtonBox(self.map_viewer_page_top_group.interior(), padx=0) self.load_map_buttonbox.pack(expand = 0, padx = 10, pady = 5) self.load_map_buttonbox.add('Load Grids!',command=self.load_cgrid_map) self.load_map_buttonbox.add('Unload Grids',command=self.unload_cgrid_map) self.grids_dialog.show() def show_ct_dialog(self): if( self.check_wct == 1): return self.check_wct = 1 self.ct_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'MOPAC and radius', command = self.button_ct) self.ct_dialog.withdraw() Pmw.setbusycursorattributes(self.ct_dialog.component('hull')) self.ct_dialog.geometry('620x440') self.ct_dialog.bind('',self.button_ct) self.mopac_input_main_group = Pmw.Group(self.ct_dialog.interior(), tag_text='Input Options') self.mopac_input_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.mopac_output_main_group = Pmw.Group(self.ct_dialog.interior(), tag_text='Output') self.mopac_output_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.mopac_inputfile_selection_entry = Pmw.EntryField(self.mopac_input_main_group.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_mopac_inputfile,filter=("*.mol2")), validate = {'validator':quickFileValidation,}, value = '', label_text = 'Input File:') self.mopac_outputfile_selection_entry = Pmw.EntryField(self.mopac_output_main_group.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_mopac_outputfile,filter=("*.pdb")), value = '', label_text = 'Output File:') self.mopac_inputfile_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.mopac_outputfile_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) mopac_type = ('AM1', 'PM3','MNDO/3') self.mopac_dropdown = Pmw.ComboBox(self.mopac_input_main_group.interior(), label_text = 'Semi empiric method', labelpos = 'w', selectioncommand = self.changeMOPAC, scrolledlist_items = mopac_type) self.mopac_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.mopac_dropdown.selectitem(mopac_type[0]) Pmw.alignlabels( [ self.mopac_inputfile_selection_entry, self.mopac_outputfile_selection_entry, self.mopac_dropdown ] ) self.mopac_file_io = Pmw.Group(self.ct_dialog.interior(), tag_text='MOPAC output') self.mopac_file_io.pack(side = TOP,expand=1, fill='x') self.mopac_button_box = Pmw.ButtonBox(self.mopac_file_io.interior(),orient='vertical', padx=0,pady=0) self.mopac_button_box.add('Run transformation',command = self.save_mopac_input_file) self.mopac_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.mopac_page_log_text = Pmw.ScrolledText(self.mopac_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow' ) self.mopac_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.ct_dialog.show() def show_prepis_dialog(self): if( self.check_w30 == 1): return self.check_w30 = 1 self.prepis_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'PREP generator', command = self.button_pressed30) self.prepis_dialog.withdraw() Pmw.setbusycursorattributes(self.prepis_dialog.component('hull')) self.status_line_prepis = Label(self.prepis_dialog.interior(), relief='sunken', font='helvetica 12', anchor='w',fg='yellow',bg='black') self.status_line_prepis.pack(side=BOTTOM,fill='x', expand=1, padx=0, pady=0) self.prepis_dialog.geometry('620x440') self.prepis_dialog.bind('',self.button_pressed30) self.prepis_dialog.show() def show_alfa_dialog(self): if( self.check_w6 == 1): return self.check_w6 = 1 self.alfa_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Ligand set up', command = self.button_pressed6) self.alfa_dialog.withdraw() Pmw.setbusycursorattributes(self.alfa_dialog.component('hull')) self.status_line1 = Label(self.alfa_dialog.interior(), relief='sunken', font='helvetica 12', anchor='w',fg='yellow',bg='black') self.status_line1.pack(side=BOTTOM,fill='x', expand=1, padx=0, pady=0) self.alfa_dialog.geometry('620x740') self.alfa_dialog.bind('',self.button_pressed6) # ALFA panel self.conf_analysis_main_group = Pmw.Group(self.alfa_dialog.interior(), tag_text='Input & Output filenames') self.conf_analysis_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.conf_analysis_left_side = Pmw.Group(self.conf_analysis_main_group.interior(),tag_text = 'Files') self.conf_analysis_left_side.pack(side = LEFT, fill = 'both',expand = 0, padx = 10, pady = 3) self.conf_analysis_right_side = Pmw.Group(self.conf_analysis_main_group.interior(),tag_text = 'ALFA Rules') self.conf_analysis_right_side.pack(side = LEFT, fill = 'both',expand = 0, padx = 10, pady = 3) self.conf_analysis_main2_group = Pmw.Group(self.alfa_dialog.interior(), tag_text='Algorithm') self.conf_analysis_main2_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.conf_analysis_left2_side = Pmw.Group(self.conf_analysis_main2_group.interior(),tag_text = 'ALFA RMSD') self.conf_analysis_left2_side.pack(side = LEFT, fill = 'both',expand = 0, padx = 10, pady = 3) self.conf_analysis_right2_side = Pmw.Group(self.conf_analysis_main2_group.interior(),tag_text = 'ALFA Conformations') self.conf_analysis_right2_side.pack(side = LEFT, fill = 'both',expand = 0, padx = 10, pady = 3) self.input_alfa = Pmw.EntryField(self.conf_analysis_left_side.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_input_alfa,filter=("*.mol2")), validate = {'validator':quickFileValidation,}, value = 'myInput.mol2', label_text = 'Input File:') self.ref_alfa = Pmw.EntryField(self.conf_analysis_left2_side.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_ref_alfa,filter=("*.mol2")), validate = {'validator':quickFileValidation,}, value = '', label_text = 'Reference File:') self.alfa_outputfile_selection_entry = Pmw.EntryField(self.conf_analysis_left_side.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_alfa_outputfile,filter=("*")), validate = {'validator':quickFileValidation,}, value = 'conformers', label_text = 'Output File:') self.input_alfa.pack(fill='x',padx=4,pady=1,expand=0) self.ref_alfa.pack(fill='x',padx=4,pady=1,expand=0) self.alfa_outputfile_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.alfa_cutoff_selection_entry = Pmw.EntryField(self.conf_analysis_right2_side.interior(), labelpos = 'w', label_text = 'CutOff', value = '0.0', ) self.alfa_maxcombinations_selection_entry = Pmw.EntryField(self.conf_analysis_right2_side.interior(), labelpos = 'w', label_text = 'maxCombinations', value = '300000', ) self.alfa_howmany_selection_entry = Pmw.EntryField(self.conf_analysis_right2_side.interior(), labelpos = 'w', label_text = 'HoyManySelect', value = '100', ) self.alfa_cutoff_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.alfa_maxcombinations_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.alfa_howmany_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) Pmw.alignlabels( [self.alfa_cutoff_selection_entry, self.alfa_maxcombinations_selection_entry, self.alfa_howmany_selection_entry ]) alfa_inputrmsd = ('yes', 'no') self.alfa_inputrmsd_dropdown = Pmw.ComboBox(self.conf_analysis_left2_side.interior(), label_text = 'useInputInRMSD', labelpos = 'w', selectioncommand = self.changealfainputrmsd, scrolledlist_items = alfa_inputrmsd) self.alfa_inputrmsd_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.alfa_inputrmsd_dropdown.selectitem(alfa_inputrmsd[0]) alfa_output_type = ('yes', 'no') self.alfa_output_type_dropdown = Pmw.ComboBox(self.conf_analysis_left_side.interior(), label_text = 'Conformational analysis', labelpos = 'w', selectioncommand = self.changealfaoutput, scrolledlist_items = alfa_output_type) self.alfa_output_type_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.alfa_output_type_dropdown.selectitem(alfa_output_type[0]) Pmw.alignlabels( [self.input_alfa, self.alfa_outputfile_selection_entry, self.alfa_output_type_dropdown ]) self.alfa_add_rules = Pmw.EntryField(self.conf_analysis_right_side.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_addrules_alfa,filter=("*")), validate = {'validator':quickFileValidation,}, value = '', label_text = 'AddRulesFile:') self.alfa_use_rules = Pmw.EntryField(self.conf_analysis_right_side.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_userules_alfa,filter=("*")), validate = {'validator':quickFileValidation,}, value = '', label_text = 'useRulesFile:') self.alfa_add_rules.pack(fill='x',padx=4,pady=1,expand=0) self.alfa_use_rules.pack(fill='x',padx=4,pady=1,expand=0) Pmw.alignlabels( [self.alfa_add_rules, self.alfa_use_rules ]) self.mopac_main_group = Pmw.Group(self.alfa_dialog.interior(), tag_text='Charge assigment') self.mopac_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) #self.mopac_input_main_group = Pmw.Group(self.mopac_main_group.interior(), tag_text='Input Options') #self.mopac_input_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) #self.mopac_output_main_group = Pmw.Group(self.mopac_main_group.interior(), tag_text='Output') #self.mopac_output_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) """ self.mopac_inputfile_selection_entry = Pmw.EntryField(self.mopac_input_main_group.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_mopac_inputfile,filter=("*.mol2")), validate = {'validator':quickFileValidation,}, value = '', label_text = 'Input File:') self.mopac_outputfile_selection_entry = Pmw.EntryField(self.mopac_output_main_group.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_mopac_outputfile,filter=("*.pdb")), value = '', label_text = 'Output File:') """ #self.mopac_inputfile_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) #self.mopac_outputfile_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) mopac_type = ('AM1', 'PM3','MNDO/3') self.mopac_dropdown = Pmw.ComboBox(self.mopac_main_group.interior(), label_text = 'Semi empiric method', labelpos = 'w', selectioncommand = self.changeMOPAC, scrolledlist_items = mopac_type) self.mopac_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.mopac_dropdown.selectitem(mopac_type[0]) mopac_all = ('yes', 'no') self.mopac_all_dropdown = Pmw.ComboBox(self.mopac_main_group.interior(), label_text = 'Run MOPAC for each conformer?', labelpos = 'w', selectioncommand = self.changeallMOPAC, scrolledlist_items = mopac_all) self.mopac_all_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.mopac_all_dropdown.selectitem(mopac_all[0]) self.mopac_globalcharge_selection_entry = Pmw.EntryField(self.mopac_main_group.interior(), labelpos = 'w', label_text = 'Global charge', value = '0') self.mopac_append_selection_entry = Pmw.EntryField(self.mopac_main_group.interior(), labelpos = 'w', label_text = 'MOPAC extra commands', value = '', ) self.mopac_globalcharge_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.mopac_append_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) Pmw.alignlabels( [ self.mopac_dropdown, self.mopac_all_dropdown, self.mopac_globalcharge_selection_entry, self.mopac_append_selection_entry ] ) self.alfa_file_io = Pmw.Group(self.alfa_dialog.interior(), tag_text='Output') self.alfa_file_io.pack(side = TOP,expand=1, fill='x') self.alfa_button_box = Pmw.ButtonBox(self.alfa_file_io.interior(),orient='vertical', padx=0,pady=0) self.alfa_button_box.add('Run!',command = self.save_alfa_input_file) self.alfa_button_box.add('Stop!',command = self.stop_alfa) self.alfa_button_box.add('Load results', command=self.load_conformers) self.alfa_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.alfa_page_log_text = Pmw.ScrolledText(self.alfa_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow' ) self.alfa_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.alfa_dialog.show() def show_delphi_dialog(self): if( self.check_wdelphi == 1): return self.check_wdelphi = 1 self.delphi_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Delphi frontend', command = self.close_delphi) self.delphi_dialog.withdraw() self.delphi_dialog.geometry('620x740') self.delphi.bind('',self.close_delphi) self.delphi_dialog.show() def show_cgrid_dialog(self): if( self.check_w5 == 1): return self.check_w5 = 1 self.cgrid_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'CGRID', command = self.button_pressed5) self.cgrid_dialog.withdraw() Pmw.setbusycursorattributes(self.cgrid_dialog.component('hull')) self.status_line1 = Label(self.cgrid_dialog.interior(), relief='sunken', font='helvetica 12', anchor='w',fg='yellow',bg='black') self.status_line1.pack(side=BOTTOM,fill='x', expand=1, padx=0, pady=0) self.cgrid_dialog.geometry('620x740') self.cgrid_dialog.bind('',self.button_pressed5) self.grid_page_main_group = Pmw.Group(self.cgrid_dialog.interior(), tag_text='GRID things') self.grid_page_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) # grid parameters on the left self.grid_page_left_side = Pmw.Group(self.grid_page_main_group.interior(),tag_text = 'Parameters') self.grid_page_left_side.pack(side = LEFT, fill = 'both',expand = 0, padx = 10, pady = 3) # grid spacing entry self.grid_spacing_frame = Tkinter.Frame(self.grid_page_left_side.interior()) self.grid_spacing_label = Label(self.grid_spacing_frame, text='Spacing:', width = 10) self.grid_spacing_location = Entry(self.grid_spacing_frame, textvariable= grid_spacing, bg='black',fg='green', width = 10) self.grid_spacing_scrollbar = Scrollbar(self.grid_spacing_frame, orient = 'horizontal', command = self.grid_spacing_changed) self.grid_spacing_label.pack(side = LEFT, anchor='w') self.grid_spacing_location.pack(side = LEFT, anchor='w') self.grid_spacing_scrollbar.pack(side = LEFT, anchor='w') self.grid_spacing_frame.pack(fill = 'x', padx = 4, pady=1) # grid bigbox entry self.grid_bigbox_frame = Tkinter.Frame(self.grid_page_left_side.interior()) self.grid_bigbox_label = Label(self.grid_bigbox_frame, text='bigBox:', width = 10) self.grid_bigbox_location = Entry(self.grid_bigbox_frame, textvariable= grid_bigbox, bg='black',fg='green', width = 10) self.grid_bigbox_scrollbar = Scrollbar(self.grid_bigbox_frame, orient = 'horizontal', command = self.grid_bigbox_changed) self.grid_bigbox_label.pack(side = LEFT, anchor='w') self.grid_bigbox_location.pack(side = LEFT, anchor='w') self.grid_bigbox_scrollbar.pack(side = LEFT, anchor='w') self.grid_bigbox_frame.pack(fill = 'x', padx = 4, pady=1) # n grid points entries self.n_points_X_frame = Tkinter.Frame(self.grid_page_left_side.interior()) self.n_points_X_label = Label(self.n_points_X_frame, text='X-points:', width = 10) self.n_points_X_location = Entry(self.n_points_X_frame, textvariable= self.n_points_X, bg='black',fg='green', width = 10) self.n_points_X_scrollbar = Scrollbar(self.n_points_X_frame, orient = 'horizontal', command = self.n_points_X_changed) self.n_points_X_label.pack(side = LEFT, anchor='w') self.n_points_X_location.pack(side = LEFT, anchor='w') self.n_points_X_scrollbar.pack(side = LEFT, anchor='w') self.n_points_X_frame.pack(fill = 'x', padx = 4, pady=1) self.n_points_Y_frame = Tkinter.Frame(self.grid_page_left_side.interior()) self.n_points_Y_label = Label(self.n_points_Y_frame, text='Y-points:', width = 10) self.n_points_Y_location = Entry(self.n_points_Y_frame, textvariable= self.n_points_Y, bg='black',fg='green', width = 10) self.n_points_Y_scrollbar = Scrollbar(self.n_points_Y_frame, orient = 'horizontal', command = self.n_points_Y_changed) self.n_points_Y_label.pack(side = LEFT, anchor='w') self.n_points_Y_location.pack(side = LEFT, anchor='w') self.n_points_Y_scrollbar.pack(side = LEFT, anchor='w') self.n_points_Y_frame.pack(fill = 'x', padx = 4, pady=1) self.n_points_Z_frame = Tkinter.Frame(self.grid_page_left_side.interior()) self.n_points_Z_label = Label(self.n_points_Z_frame, text='Z-points:', width = 10) self.n_points_Z_location = Entry(self.n_points_Z_frame, textvariable= self.n_points_Z, bg='black',fg='green', width = 10) self.n_points_Z_scrollbar = Scrollbar(self.n_points_Z_frame, orient = 'horizontal', command = self.n_points_Z_changed) self.n_points_Z_label.pack(side = LEFT, anchor='w') self.n_points_Z_location.pack(side = LEFT, anchor='w') self.n_points_Z_scrollbar.pack(side = LEFT, anchor='w') self.n_points_Z_frame.pack(fill = 'x', padx = 4, pady=1) Pmw.alignlabels( [self.grid_spacing_label, self.grid_bigbox_label, self.n_points_X_label, self.n_points_Y_label, self.n_points_Z_label ]) Pmw.alignlabels( [self.grid_spacing_location, self.grid_bigbox_location, self.n_points_X_location, self.n_points_Y_location, self.n_points_Z_location ]) # display option buttons self.display_button_box = Pmw.ButtonBox(self.grid_page_main_group.interior(), padx=0, pady=1,orient='vertical') self.display_button_box.pack(side=LEFT) self.display_button_box.add('Show Box',command = self.show_box) self.display_button_box.add('Hide Box',command = self.hide_box) self.display_button_box.add('Change Box Color',command = self.change_box_color) # display options on the right self.grid_page_right_side = Pmw.Group(self.grid_page_main_group.interior(), tag_text = 'Display Options') self.grid_page_right_side.pack(side = LEFT, fill = 'both', expand = 0, padx = 10, pady = 3) self.box_display_radiogroups = [] self.box_display_radioframe = Tkinter.Frame(self.grid_page_right_side.interior()) self.box_display_cylinder_frame = Pmw.Group(self.box_display_radioframe, tag_pyclass = Tkinter.Radiobutton, tag_text = 'Cylindric Box', tag_value = 0, tag_variable = self.box_display_mode ) self.box_display_cylinder_frame.pack(fill='x',expand = 1,side=TOP) self.box_display_radiogroups.append(self.box_display_cylinder_frame) self.box_display_cylinder_size_frame = Tkinter.Frame(self.box_display_cylinder_frame.interior()) self.box_display_cylinder_size_label = Label(self.box_display_cylinder_size_frame, text = 'Size:', width=10) self.box_display_cylinder_size_location = Entry(self.box_display_cylinder_size_frame, textvariable = self.box_display_cylinder_size, bg = 'black',fg = 'green', width = 10) self.box_display_cylinder_size_scrollbar = Scrollbar(self.box_display_cylinder_size_frame, orient = 'horizontal',command = self.box_display_cylinder_size_changed) self.box_display_cylinder_size_label.pack(side = LEFT) self.box_display_cylinder_size_location.pack(side = LEFT) self.box_display_cylinder_size_scrollbar.pack(side = LEFT) self.box_display_cylinder_size_frame.pack(fill='x',padx = 4, pady=1) self.box_display_wire_frame = Pmw.Group(self.box_display_radioframe, tag_pyclass = Tkinter.Radiobutton, tag_text = 'Wired Box', tag_value = 1, tag_variable = self.box_display_mode ) self.box_display_wire_frame.pack(fill='x',expand = 1) self.box_display_radiogroups.append(self.box_display_wire_frame) self.box_display_mesh_line_width_frame = Tkinter.Frame(self.box_display_wire_frame.interior()) self.box_display_mesh_line_width_label = Label(self.box_display_mesh_line_width_frame, text = 'Line Width:', width=10) self.box_display_mesh_line_width_location = Entry(self.box_display_mesh_line_width_frame, textvariable = self.box_display_line_width, bg='black', fg='green',width = 10) self.box_display_mesh_line_width_scrollbar = Scrollbar(self.box_display_mesh_line_width_frame, orient = 'horizontal',command = self.box_display_line_width_changed) self.box_display_mesh_line_width_label.pack(side = LEFT) self.box_display_mesh_line_width_location.pack(side = LEFT) self.box_display_mesh_line_width_scrollbar.pack(side = LEFT) self.box_display_mesh_line_width_frame.pack(fill='x',padx=4,pady=1) self.box_display_mesh_grid_frame = Tkinter.Frame(self.box_display_wire_frame.interior()) self.box_display_mesh_grid_label = Label(self.box_display_mesh_grid_frame, text = 'Grid Size:', width=10) self.box_display_mesh_grid_location = Entry(self.box_display_mesh_grid_frame, textvariable = self.box_display_mesh_grid, bg='black', fg='green',width = 10) self.box_display_mesh_grid_scrollbar = Scrollbar(self.box_display_mesh_grid_frame, orient = 'horizontal',command = self.box_display_mesh_grid_changed) self.box_display_mesh_grid_label.pack(side = LEFT) self.box_display_mesh_grid_location.pack(side = LEFT) self.box_display_mesh_grid_scrollbar.pack(side = LEFT) self.box_display_mesh_grid_frame.pack(fill='x',padx=4,pady=1) self.box_display_radioframe.pack(padx = 6, pady = 6, expand='yes', fill='both') Pmw.aligngrouptags( self.box_display_radiogroups ) # grid center definition self.grid_center_radiogroups = [] self.grid_center_selection_mode = IntVar() self.grid_center_selection_mode.set(GRID_CENTER_FROM_SELECTION) self.grid_center_radioframe = Tkinter.Frame(self.cgrid_dialog.interior()) self.grid_center_radio_button_pymol_selection = Pmw.Group(self.grid_center_radioframe, tag_pyclass = Tkinter.Radiobutton, tag_text = 'Calculate Grid Center by Selection', tag_value = GRID_CENTER_FROM_SELECTION, tag_variable = self.grid_center_selection_mode ) self.grid_center_radio_button_pymol_selection.pack(fill = 'x', expand = 1, side = TOP) self.grid_center_radiogroups.append(self.grid_center_radio_button_pymol_selection) self.grid_center_selection_entry = Pmw.EntryField(self.grid_center_radio_button_pymol_selection.interior(), labelpos = 'w', label_text = 'Selection', value = default_settings['grid_center_selection'], command = self.grid_center_from_selection_changed ) self.grid_center_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.grid_center_radio_button_coordinates = Pmw.Group(self.grid_center_radioframe, tag_pyclass = Tkinter.Radiobutton, tag_text = 'Grid Center Coordinates', tag_value = GRID_CENTER_FROM_COORDINATES, tag_variable = self.grid_center_selection_mode ) self.grid_center_radio_button_coordinates.pack(fill = 'x', expand = 1, side = TOP) self.grid_center_radiogroups.append(self.grid_center_radio_button_coordinates) self.grid_center_radioframe.pack(padx = 6, pady = 6, expand='yes', fill='both') Pmw.aligngrouptags(self.grid_center_radiogroups) self.grid_center_X_frame = Tkinter.Frame(self.grid_center_radio_button_coordinates.interior()) self.grid_center_X_label = Label(self.grid_center_X_frame, text = 'X:') self.grid_center_X_location = Entry(self.grid_center_X_frame, textvariable = self.grid_center[0], bg='black', fg='green', width=10) if not sys.platform.startswith('win'): self.grid_center_X_scrollbar = Scrollbar(self.grid_center_X_frame,orient='horizontal',command = self.grid_center_X_changed) else: self.grid_center_X_scrollbar = Scrollbar(self.grid_center_X_frame,orient='horizontal',command = self.grid_center_X_changed_win) self.grid_center_Y_frame = Tkinter.Frame(self.grid_center_radio_button_coordinates.interior()) self.grid_center_Y_label = Label(self.grid_center_Y_frame, text = 'Y:') self.grid_center_Y_location = Entry(self.grid_center_Y_frame, textvariable = self.grid_center[1], bg='black', fg='green', width=10) if not sys.platform.startswith('win'): self.grid_center_Y_scrollbar = Scrollbar(self.grid_center_Y_frame,orient='horizontal',command = self.grid_center_Y_changed) else: self.grid_center_Y_scrollbar = Scrollbar(self.grid_center_Y_frame,orient='horizontal',command = self.grid_center_Y_changed_win) self.grid_center_Z_frame = Tkinter.Frame(self.grid_center_radio_button_coordinates.interior()) self.grid_center_Z_label = Label(self.grid_center_Z_frame, text = 'Z:') self.grid_center_Z_location = Entry(self.grid_center_Z_frame, textvariable = self.grid_center[2], bg='black', fg='green', width=10) if not sys.platform.startswith('win'): self.grid_center_Z_scrollbar = Scrollbar(self.grid_center_Z_frame,orient='horizontal',command = self.grid_center_Z_changed) else: self.grid_center_Z_scrollbar = Scrollbar(self.grid_center_Z_frame,orient='horizontal',command = self.grid_center_Z_changed_win) self.grid_center_X_label.pack(side = LEFT) self.grid_center_X_location.pack(side=LEFT) self.grid_center_X_scrollbar.pack(side=LEFT) self.grid_center_X_frame.pack(side=LEFT,padx=4,pady=1) self.grid_center_Y_label.pack(side = LEFT) self.grid_center_Y_location.pack(side=LEFT) self.grid_center_Y_scrollbar.pack(side=LEFT) self.grid_center_Y_frame.pack(side=LEFT,padx=4,pady=1) self.grid_center_Z_label.pack(side = LEFT) self.grid_center_Z_location.pack(side=LEFT) self.grid_center_Z_scrollbar.pack(side=LEFT) self.grid_center_Z_frame.pack(side=LEFT,padx=4,pady=1) self.select_binding_site_button_box = Pmw.ButtonBox(self.grid_center_radio_button_coordinates.interior(),orient='horizontal', padx=0,pady=0) self.select_binding_site_button_box.add('Select binding site',command = self.select_atoms_within_binding_site) self.select_binding_site_button_box.pack(side=TOP,expand = 1, padx = 3, pady = 3) # Load Receptor PDB self.gpf_file_io = Pmw.Group(self.cgrid_dialog.interior(), tag_text='CGRID output') self.gpf_file_io.pack(side = TOP,expand=1, fill='x') my_V_opt = ('12-6 Potential (Recommended)','9-6 Soft Potential (DNA, fragments or tight pocket)') self.pot_sele_dropdown = Pmw.ComboBox(self.gpf_file_io.interior(), label_text = 'Potential', labelpos = 'w', selectioncommand = self.changePot, scrolledlist_items = my_V_opt) self.pot_sele_dropdown.pack( anchor = 'n', fill = 'x', expand = 1, padx = 8, pady = 8) self.pot_sele_dropdown.selectitem(my_V_opt[0]) self.el_file_location = Pmw.EntryField(self.gpf_file_io.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_el_filename,filter=("*.erl")), validate = {'validator':quickFileValidation,}, value = '', label_text = 'Extended Library (optional):') self.gpf_file_location = Pmw.EntryField(self.gpf_file_io.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_gpf_filename,filter=("*.pdb")), validate = {'validator':quickFileValidation,}, value = default_settings['gpf_file_name'], label_text = 'Receptor File:') self.gpf_file_location.pack(side=TOP,fill = 'x', expand = 1, padx = 1, pady = 5) self.el_file_location.pack(side=TOP,fill = 'x', expand = 1, padx = 1, pady = 5) self.cgrid_inv_checkbutton = Pmw.RadioSelect(self.gpf_file_io.interior(), buttontype = 'checkbutton',orient = 'vertical', labelpos = 'w', label_text = '', hull_borderwidth = 2,hull_relief = 'ridge') self.cgrid_inv_checkbutton.pack(side = 'top', expand = 1, padx = 10, pady = 10) self.cgrid_inv_checkbutton.add('Swap charges/radii columns') self.aviso_cargas_radios = Label(self.gpf_file_io.interior(), text = 'File must contain coordinates radii and charges!!\nExample: (ATOM 1 O LEU 1 31.879 26.061 16.106 1.66 -0.5713)') self.aviso_cargas_radios.pack(side=TOP,expand=1, padx=10, pady=5) self.gpf_button_box = Pmw.ButtonBox(self.gpf_file_io.interior(),orient='vertical', padx=0,pady=0) self.gpf_button_box.add('Run CGRID',command = self.save_cgrid_input_file) self.gpf_button_box.add('Extended residues',command = self.show_modres_dialog) self.gpf_button_box.add('Stop!',command = self.stop_cgrid) self.subpid = 0 self.gpf_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.cgrid_page_log_text = Pmw.ScrolledText(self.gpf_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='green' ) self.cgrid_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.n_points_X_frame = Tkinter.Frame(self.grid_page_left_side.interior()) self.cgrid_dialog.show() def button_pressed(self, result): if hasattr(result,'keycode'): if result.keycode == 36: if self.notebook.getcurselection()=='Grid Settings': self.show_box() elif self.notebook.getcurselection()=='View Poses': self.load_ligand_file() elif result == 'Quit' or result == None: self.dialog.withdraw() elif result == 'Return' : self.insdialog.withdraw() def close_delphi(self, result): sekf.check_wdelphi = 0 if result == 'Return' or result == None : self.delphi_dialog.withdraw() def button_pressed_je(self, result): self.check_wje = 0 if result == 'Return' or result == None : self.jedialog.withdraw() def button_pressed2(self, result): self.check_w2 = 0 if result == 'Return' or result == None : self.insdialog.withdraw() def button_ct(self, result): self.check_wct = 0 if result == 'Return' or result == None : self.ct_dialog.withdraw() def button_pressed3(self, result): self.check_w3 = 0 if result == 'Return' or result == None : self.confdialog.withdraw() def button_pressed4(self, result): self.check_w4 = 0 if result == 'Return' or result == None : self.rcdockdialog.withdraw() def button_pressed5(self, result): self.check_w5 = 0 if result == 'Return' or result == None : self.cgrid_dialog.withdraw() def button_pressed6(self, result): self.check_w6 = 0 if result == 'Return' or result == None : self.alfa_dialog.withdraw() def button_pressed7(self, result): self.check_w7 = 0 if result == 'Return' or result == None : self.grids_dialog.withdraw() def button_pressed8(self, result): self.check_w8 = 0 if result == 'Return' or result == None : self.cdock_dialog.withdraw() def button_pressed9(self, result): self.check_w9 = 0 if result == 'Return' or result == None : self.fcres = 0 self.cdock_results_dialog.withdraw() def button_pressed10(self, result): self.check_w10= 0 if result == 'Return' or result == None : self.options_dialog.withdraw() def button_pressed11(self, result): self.check_w11= 0 if result == 'Return' or result == None : self.about_dialog.withdraw() def button_pressed12(self, result): self.check_w12= 0 if result == 'Return' or result == None : self.qdialog.withdraw() def button_pressed13(self, result): self.check_w13 = 0 if result == 'Return' or result == None : self.dbsources_dialog.withdraw() def button_pressed14(self, result): self.check_w14= 0 if result == 'Return' or result == None : self.gfps_dialog.withdraw() def button_pressed15(self, result): self.check_w15 = 0 if result == 'Return' or result == None : self.ifps_dialog.withdraw() def button_pressed16(self, result): self.check_w16 = 0 if result == 'Return' or result == None : self.simple_search_dialog.withdraw() def button_pressed17(self, result): self.check_w17 = 0 if result == 'Return' or result == None : self.pre_ids_dialog.withdraw() def button_pressed18(self, result): self.check_w18 = 0 if result == 'Return' or result == None : self.pre_3d_dialog.withdraw() def button_pressed19(self, result): self.check_w19 = 0 if result == 'Return' or result == None : self.getr_dialog.withdraw() def button_pressed20(self, result): self.check_w20 = 0 if result == 'Return' or result == None : self.vssources_dialog.withdraw() def button_pressed21(self, result): self.check_w21 = 0 if result == 'Return' or result == None : self.adv_search_dialog.withdraw() def button_pressed22(self, result): self.check_w22 = 0 if result == 'Return' or result == None : self.pre_adv_uds_dialog.withdraw() def button_pressed23(self, result): self.check_w23 = 0 if result == 'Return' or result == None : self.pre_adv_3d_dialog.withdraw() def button_pressed24(self, result): self.check_w24 = 0 if result == 'Return' or result == None : self.rep_dialog.withdraw() def button_pressed25(self, result): self.check_w25 = 0 if result == 'Return' or result == None : self.ppp_dialog.withdraw() def button_pressed26(self, result): self.check_w26 = 0 if result == 'Return' or result == None : self.gfps3d_dialog.withdraw() def button_pressed27(self, result): self.check_w27 = 0 if result == 'Return' or result == None : self.pre_3d_ids_dialog.withdraw() def button_pressed28(self, result): self.check_w28 = 0 if result == 'Return' or result == None : self.md_dialog.withdraw() def button_pressed29(self, result): self.check_w29 = 0 if result == 'Return' or result == None : self.modres_dialog.withdraw() def close_ds_st_dialog(self, result): self.check_wds_st = 0 if result == 'Return' or result == None : self.dataset_st_dialog.withdraw() def close_pijaditas_dialog(self, result): self.check_wpijaditas = 0 if result == 'Return' or result == None : self.pijaditas_dialog.withdraw() def button_pressed30(self, result): self.check_w30 = 0 if result == 'Return' or result == None : self.prepis_dialog.withdraw() def button_pressed31(self, result): self.check_w31 = 0 if result == 'Return' or result == None : self.proc_grids_dialog.withdraw() def button_pressed32(self, result): self.check_w32 = 0 if result == 'Return' or result == None : self.pre_adv_smiles_dialog.withdraw() #------------------------------------------------------------------ # grid settings functions def grid_spacing_changed(self, x): val = float(grid_spacing.get())+float(x)*0.005 grid_spacing.set(val) if self.box_is_on_display: self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) def grid_bigbox_changed(self, x): val = float(grid_bigbox.get())+float(x)*0.005 grid_bigbox.set(val) if self.box_is_on_display: self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) def calculate_grid_center(self): if self.grid_center_selection_mode.get() == GRID_CENTER_FROM_SELECTION: sel = self.grid_center_selection_entry.get() if sel: stored.xyz = [] cmd.iterate_state(1,sel,"stored.xyz.append([x,y,z])") xx = average(map(lambda a: a[0], stored.xyz)) yy = average(map(lambda a: a[1], stored.xyz)) zz = average(map(lambda a: a[2], stored.xyz)) self.grid_center[0].set(round(xx,2)) self.grid_center[1].set(round(yy,2)) self.grid_center[2].set(round(zz,2)) else: self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) def runcdock_dialog(self): if( self.check_w4 == 1): return self.check_w4 = 1 self.rcdockdialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'runCDOCK Wizard', command = self.button_pressed4) self.rcdockdialog.withdraw() Pmw.setbusycursorattributes(self.rcdockdialog.component('hull')) # self.status_line = Label(self.dialog.interior(), # relief='sunken', # font='helvetica 12', anchor='w',fg='yellow',bg='black') # self.status_line.pack(side=BOTTOM,fill='x', expand=1, padx=0, pady=0) self.rcdockdialog.geometry('700x640') self.rcdockdialog.bind('',self.button_pressed4) # the title self.title_label4 = Tkinter.Label(self.rcdockdialog.interior(), text = 'runCDOCK Wizard', background = 'yellow', foreground = 'navy', ) self.title_label4.pack(expand = 0, fill = 'both', padx = 4, pady = 4) self.runcdock_main_group = Pmw.Group(self.rcdockdialog.interior(), tag_text='CDOCK3 parameters') self.runcdock_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.runcdock_bot_group = Pmw.Group(self.rcdockdialog.interior(), tag_text='runCDOCK3 parameters') self.runcdock_bot_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.runcdock_input = Pmw.EntryField(self.runcdock_main_group.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_runcdock_input_smiles,filter=("*")), validate = {'validator':quickFileValidation,}, value = '', label_text = 'Input File (opt):') self.rd_node_selection_entry = Pmw.EntryField(self.runcdock_bot_group.interior(), labelpos = 'w', label_text = 'Head Node name', value = self.config_settings['rnode']) self.rd_numproc_selection_entry = Pmw.EntryField(self.runcdock_bot_group.interior(), labelpos = 'w', label_text = 'Num processors', value = '2') self.rd_output_selection_entry = Pmw.EntryField(self.runcdock_bot_group.interior(), labelpos = 'w', label_text = 'Working Directory on Nodes', value = self.config_settings['rwork_dir']) self.rd_grids_selection_entry = Pmw.EntryField(self.runcdock_main_group.interior(), labelpos = 'w', label_text = 'Grids Directory on Nodes', value = '') self.rd_idvirtual_selection_entry = Pmw.EntryField(self.runcdock_main_group.interior(), labelpos = 'w', label_text = 'Virtual Screening ID (opt)', value = '') self.rd_idprotein_selection_entry = Pmw.EntryField(self.runcdock_main_group.interior(), labelpos = 'w', label_text = 'Protein ID (opt)', value = '') self.rd_usedatabases_selection_entry = Pmw.EntryField(self.runcdock_main_group.interior(), labelpos = 'w', label_text = 'Use Databases (, separated)', value = '') self.rd_usedock_selection_entry = Pmw.EntryField(self.runcdock_main_group.interior(), labelpos = 'w', label_text = 'Use DOCK filters (, separated)', value = '') self.rd_zscore_selection_entry = Pmw.EntryField(self.runcdock_main_group.interior(), labelpos = 'w', label_text = 'ZScore', value = '5.0') self.rd_maxzscore_selection_entry = Pmw.EntryField(self.runcdock_main_group.interior(), labelpos = 'w', label_text = 'maxConformerZScore', value = '5.0') self.rd_maxpermol_selection_entry = Pmw.EntryField(self.runcdock_main_group.interior(), labelpos = 'w', label_text = 'ConformersPerMolecule', value = '100') self.runcdock_input.pack(fill='x',padx=4,pady=1,expand=0) self.rd_node_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.rd_numproc_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.rd_output_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.rd_grids_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.rd_idvirtual_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.rd_idprotein_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.rd_usedatabases_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.rd_usedock_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.rd_zscore_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.rd_maxzscore_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.rd_maxpermol_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) Pmw.alignlabels( [self.runcdock_input, self.rd_node_selection_entry, self.rd_numproc_selection_entry, self.rd_output_selection_entry, self.rd_grids_selection_entry, self.rd_idvirtual_selection_entry, self.rd_idprotein_selection_entry, self.rd_usedatabases_selection_entry, self.rd_usedock_selection_entry, self.rd_zscore_selection_entry, self.rd_maxzscore_selection_entry, self.rd_maxpermol_selection_entry ]) self.runcdock_file_io = Pmw.Group(self.rcdockdialog.interior(), tag_text='Output') self.runcdock_file_io.pack(side = TOP,expand=1, fill='x') self.runcdock_button_box = Pmw.ButtonBox(self.runcdock_file_io.interior(),orient='vertical', padx=0,pady=0) self.runcdock_button_box.add('Run Screening!',command = self.save_runcdock_input_file) self.runcdock_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.runcdock_page_log_text = Pmw.ScrolledText(self.runcdock_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow' ) self.runcdock_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.rcdockdialog.show() def update_qstat(self): try: self.qstat_page_log_text.clear() self.qstat_page_log_text.yview('moveto',1.0) rtnode = self.qstat_root_node_selection_entry.get() if len(self.config_settings['ssh_command']) == 0 or len(self.config_settings['queue_command']) == 0 or len(self.config_settings['queue_status']) == 0 or len(rtnode) == 0: self.screwup("Oops","You have to provide:\nSSH command\nSSH user\nQueue status command\nNode name") return comando = '\"%s\" \"%s@%s\" \"%s\"' % (self.config_settings['ssh_command'],self.config_settings['queue_command'],rtnode,self.config_settings['queue_status']) print comando if not sys.platform.startswith('win'): p1 = subprocess.Popen(comando, stdout=subprocess.PIPE, shell=True) else: p1 = subprocess.Popen(comando, stdout=subprocess.PIPE) result = p1.communicate()[0] self.qstat_page_log_text.insert('end',"%s" % result) self.qstat_page_log_text.yview('moveto',1.0) except: self.screwup("Fatal","Cant execute remote command") return def show_job_explorer_dialog(self): if( self.check_wje == 1): return self.check_wje = 1 self.jedialog = Pmw.Dialog(self.parent,buttons = ('Return',), title = 'Job explorer', command = self.button_pressed_je) self.jedialog.withdraw() Pmw.setbusycursorattributes(self.jedialog.component('hull')) self.jedialog.geometry('800x540') self.jedialog.bind('',self.button_pressed_je) self.je_notebook = Pmw.NoteBook(self.jedialog.interior()) self.je_notebook.pack(fill = 'both', expand = 1, padx = 10, pady = 10) self.je_explorer_page = self.je_notebook.add('Explore results') # self.je_fetch_page = self.je_notebook.add('Fetch remote results') self.je_notebook.tab('Explore results').focus_set() self.je_explorer_top_group = Pmw.Group(self.je_explorer_page,tag_text='Input') self.je_explorer_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.je_explorer_bottom_group = Pmw.Group(self.je_explorer_page,tag_text='Data') self.je_explorer_bottom_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.je_explorer_top_location = Pmw.EntryField(self.je_explorer_top_group.interior(), labelpos='w', label_pyclass = DirDialogButtonClassFactory.get(self.set_je_explorer_top_location), value = self.config_settings['rwork_dir'], label_text = 'Job directory') self.je_explorer_top_buttonbox = Pmw.ButtonBox(self.je_explorer_top_group.interior(), padx=0) self.je_explorer_top_buttonbox.pack(side=RIGHT,expand = 0, padx = 10, pady = 5) self.je_explorer_top_buttonbox.add('Load',command=self.je_explorer_loader) self.je_explorer_top_job_type_selection_entry = Pmw.EntryField(self.je_explorer_bottom_group.interior(), labelpos = 'w', label_text = 'Job type', value = '') self.je_explorer_top_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.je_explorer_top_job_type_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) Pmw.alignlabels( [self.je_explorer_top_location, self.je_explorer_top_job_type_selection_entry]) jobs_list = [] self.je_jobs_combo = Pmw.ComboBox(self.je_explorer_bottom_group.interior(), label_text='Docked', labelpos='nw', scrolledlist_items= jobs_list, selectioncommand=self.je_jobs_combo_selected, listbox_height=10, listbox_width=1, dropdown=False) self.je_jobs_combo.pack(side='left', padx=3, anchor='n') self.je_notebook_logs = Pmw.NoteBook(self.je_explorer_bottom_group.interior()) self.je_notebook_logs.pack(fill = 'both', expand = 1, padx = 10, pady = 10) self.je_log_page = self.je_notebook_logs.add('Program output') self.je_log_pbs_page = self.je_notebook_logs.add('Queue system script') self.je_log_queue_log_page = self.je_notebook_logs.add('Queue system output log') self.je_log_queue_error_page = self.je_notebook_logs.add('Queue system error log') self.je_page_log_text = Pmw.ScrolledText(self.je_log_page,borderframe=5,vscrollmode='dynamic', hscrollmode='dynamic',labelpos='n',text_width=300, text_height=25,text_wrap='none',text_background='#000000', text_foreground='yellow') self.je_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.je_page_log_pbs_text = Pmw.ScrolledText(self.je_log_pbs_page,borderframe=5,vscrollmode='dynamic', hscrollmode='dynamic',labelpos='n',text_width=300, text_height=25,text_wrap='none',text_background='#000000', text_foreground='yellow') self.je_page_log_pbs_text.pack(side=BOTTOM, anchor='n',pady=0) self.je_page_log_queue_log_text = Pmw.ScrolledText(self.je_log_queue_log_page,borderframe=5,vscrollmode='dynamic', hscrollmode='dynamic',labelpos='n',text_width=300, text_height=25,text_wrap='none',text_background='#000000', text_foreground='yellow') self.je_page_log_queue_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.je_page_log_queue_error_text = Pmw.ScrolledText(self.je_log_queue_error_page,borderframe=5,vscrollmode='dynamic', hscrollmode='dynamic',labelpos='n',text_width=300, text_height=25,text_wrap='none',text_background='#000000', text_foreground='yellow') self.je_page_log_queue_error_text.pack(side=BOTTOM, anchor='n',pady=0) self.jedialog.show() def je_explorer_loader(self): a = self.je_explorer_top_location.get() dirList=os.listdir(a) self.je_jobs_combo.setlist(dirList) def je_jobs_combo_selected(self, value): job_type = "Error" basename = os.path.join(self.je_explorer_top_location.get(),value) try: logf = os.path.join(basename,"insertVSDB.log") logf2 = os.path.join(basename,"insertVSDB_QUEUE.error") logf3 = os.path.join(basename,"insertVSDB_QUEUE.log") logf4 = os.path.join(basename,"insertVSDB_QUEUE.pbs") fp5 = open(logf,"r") all_lines = fp5.readlines() self.je_page_log_text.clear() for line in all_lines: self.je_page_log_text.insert('end',line) fp5.close() fp5 = open(logf4,"r") all_lines = fp5.readlines() self.je_page_log_pbs_text.clear() for line in all_lines: self.je_page_log_pbs_text.insert('end',line) fp5.close() fp5 = open(logf3,"r") all_lines = fp5.readlines() self.je_page_log_queue_log_text.clear() for line in all_lines: self.je_page_log_queue_log_text.insert('end',line) fp5.close() fp5 = open(logf2,"r") all_lines = fp5.readlines() self.je_page_log_queue_error_text.clear() for line in all_lines: self.je_page_log_queue_error_text.insert('end',line) fp5.close() job_type = "Insertion" except: try: logf = os.path.join(basename,"runCDOCK3.log") logf2 = os.path.join(basename,"runCDOCK3_QUEUE.error") logf3 = os.path.join(basename,"runCDOCK3_QUEUE.log") logf4 = os.path.join(basename,"runCDOCK3_QUEUE.pbs") fp5 = open(logf,"r") all_lines = fp5.readlines() self.je_page_log_text.clear() for line in all_lines: self.je_page_log_text.insert('end',line) fp5.close() fp5 = open(logf4,"r") all_lines = fp5.readlines() self.je_page_log_pbs_text.clear() for line in all_lines: self.je_page_log_pbs_text.insert('end',line) fp5.close() fp5 = open(logf3,"r") all_lines = fp5.readlines() self.je_page_log_queue_log_text.clear() for line in all_lines: self.je_page_log_queue_log_text.insert('end',line) fp5.close() fp5 = open(logf2,"r") all_lines = fp5.readlines() self.je_page_log_queue_error_text.clear() for line in all_lines: self.je_page_log_queue_error_text.insert('end',line) fp5.close() job_type = "Docking" except: self.screwup("Error","No jobs in the directory") self.je_explorer_top_job_type_selection_entry.setvalue(job_type) def show_queue_dialog(self): if( self.check_w12 == 1): return self.check_w12 = 1 self.qdialog = Pmw.Dialog(self.parent,buttons = ('Return',), title = 'Remote process status', command = self.button_pressed12) self.qdialog.withdraw() Pmw.setbusycursorattributes(self.qdialog.component('hull')) self.qdialog.geometry('800x440') self.qdialog.bind('',self.button_pressed12) self.qtitle_label = Tkinter.Label(self.qdialog.interior(),text = 'Cluster status',background = 'yellow',foreground = 'navy') self.qtitle_label.pack(expand = 0, fill = 'both', padx = 4, pady = 4) self.qstat_root_node_selection_entry = Pmw.EntryField(self.qdialog.interior(), labelpos = 'w', label_text = 'Head Node name', value = self.config_settings['rnode']) self.qstat_root_node_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.qstat_file_io = Pmw.Group(self.qdialog.interior(), tag_text='Queue status') self.qstat_file_io.pack(side = TOP,expand=1, fill='x') self.qstat_button_box = Pmw.ButtonBox(self.qstat_file_io.interior(),orient='horizontal', padx=0,pady=0) self.qstat_button_box.add('Update',command = self.update_qstat) self.qstat_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.qstat_page_log_text = Pmw.ScrolledText(self.qstat_file_io.interior(),borderframe=5,vscrollmode='dynamic', hscrollmode='dynamic',labelpos='n',text_width=300, text_height=25,text_wrap='none',text_background='#000000', text_foreground='yellow') self.qstat_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.qdialog.show() def getresults_dialog(self): if( self.check_w19 == 1): return self.check_w19 = 1 self.getr_dialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Get Results from DB', command = self.button_pressed19) self.getr_dialog.withdraw() Pmw.setbusycursorattributes(self.getr_dialog.component('hull')) self.getr_dialog.geometry('500x440') self.getr_dialog.bind('',self.button_pressed19) self.getr_main_group = Pmw.Group(self.getr_dialog.interior(), tag_text='getResultsfromVS') self.getr_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.getr_node_selection_entry = Pmw.EntryField(self.getr_main_group.interior(), labelpos = 'w', label_text = 'Head Node name', value = self.config_settings['rnode']) self.getr_idvs_selection_entry = Pmw.EntryField(self.getr_main_group.interior(), labelpos = 'w', label_text = 'ID Virtual Screening', value = '') self.getr_outputdir_selection_entry = Pmw.EntryField(self.getr_main_group.interior(), labelpos = 'w', label_text = 'Working Directory on Nodes', value = self.config_settings['rwork_dir']) self.getr_howmany_selection_entry = Pmw.EntryField(self.getr_main_group.interior(), labelpos = 'w', label_text = 'Number of Results', value = '100') # self.vs_prot_selection_entry = Pmw.EntryField(self.getr_main_group.interior(), # labelpos = 'w', # label_text = 'Protein selection', # value = '') self.getr_sortbysumof_selection_entry = Pmw.EntryField(self.getr_main_group.interior(), labelpos = 'w', label_text = 'Query keywords', value = 'VDW_ENERGY COULOMBIC_ENERGY DESOLVR_ENERGY DESOLVL_ENERGY APOLAR_ENERGY ISM_CORRECTION -CONVERT(HB_CC,SIGNED) -CONVERT(HB_CN,SIGNED) -CONVERT(HB_NN,SIGNED)') my_getr_output = ('mol2','pdb') my_getr_different = ('no','yes') self.getr_output_dropdown = Pmw.ComboBox(self.getr_main_group.interior(), label_text = 'Output type', labelpos = 'w', selectioncommand = self.change_getr_mol2pdb, scrolledlist_items = my_getr_output) self.getr_different_dropdown = Pmw.ComboBox(self.getr_main_group.interior(), label_text = 'Different Molecules', labelpos = 'w', selectioncommand = self.change_getr_different, scrolledlist_items = my_getr_different) self.getr_node_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.getr_idvs_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.getr_outputdir_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.getr_howmany_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.getr_sortbysumof_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.getr_output_dropdown.pack(fill='x',padx=4,pady=1,expand=0) self.getr_different_dropdown.pack(fill='x',padx=4,pady=1,expand=0) # self.vs_prot_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) Pmw.alignlabels( [self.getr_node_selection_entry, self.getr_idvs_selection_entry, self.getr_outputdir_selection_entry, self.getr_howmany_selection_entry, self.getr_sortbysumof_selection_entry, self.getr_output_dropdown, self.getr_different_dropdown ]) # self.vs_prot_selection_entry ] ) self.getr_output_dropdown.selectitem(my_getr_output[0]) self.getr_different_dropdown.selectitem(my_getr_different[0]) self.getr_file_io = Pmw.Group(self.getr_dialog.interior(), tag_text='Output') self.getr_file_io.pack(side = TOP,expand=1, fill='x') self.getr_button_box = Pmw.ButtonBox(self.getr_file_io.interior(),orient='vertical', padx=0,pady=0) self.getr_button_box.add('Get Results',command = self.save_getr_input_file) self.getr_button_box.add('Load Results',command = self.load_getr_input) self.getr_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.getr_page_log_text = Pmw.ScrolledText(self.getr_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow' ) self.getr_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.getr_dialog.show() def insertmol_dialog(self): if( self.check_w2 == 1): return self.check_w2 = 1 self.insdialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Insert Molecules Wizard', command = self.button_pressed2) self.insdialog.withdraw() Pmw.setbusycursorattributes(self.insdialog.component('hull')) # self.status_line = Label(self.dialog.interior(), # relief='sunken', # font='helvetica 12', anchor='w',fg='yellow',bg='black') # self.status_line.pack(side=BOTTOM,fill='x', expand=1, padx=0, pady=0) self.insdialog.geometry('500x440') self.insdialog.bind('',self.button_pressed2) # the title self.title_label2 = Tkinter.Label(self.insdialog.interior(), text = 'Molecules to DB Wizard', background = 'yellow', foreground = 'navy', ) self.title_label2.pack(expand = 0, fill = 'both', padx = 4, pady = 4) self.insert_main_group = Pmw.Group(self.insdialog.interior(), tag_text='InsertVSDB') self.insert_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.insert_smiles = Pmw.EntryField(self.insert_main_group.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_input_smiles,filter=("*")), validate = {'validator':quickFileValidation,}, value = 'myinput.smi', label_text = 'SMILES Input File:') self.ins_node_selection_entry = Pmw.EntryField(self.insert_main_group.interior(), labelpos = 'w', label_text = 'Head Node name', value = self.config_settings['rnode']) self.numproc_selection_entry = Pmw.EntryField(self.insert_main_group.interior(), labelpos = 'w', label_text = 'Num processors', value = '2') self.ins_output_selection_entry = Pmw.EntryField(self.insert_main_group.interior(), labelpos = 'w', label_text = 'Working Directory on Nodes', value = self.config_settings['rwork_dir'] ) self.db_name_selection_entry = Pmw.EntryField(self.insert_main_group.interior(), labelpos = 'w', label_text = 'Database name', value = '') self.insert_smiles.pack(fill='x',padx=4,pady=1,expand=0) self.ins_node_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.numproc_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.ins_output_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.db_name_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) Pmw.alignlabels( [self.insert_smiles, self.ins_node_selection_entry, self.numproc_selection_entry, self.ins_output_selection_entry, self.db_name_selection_entry ]) self.insert_file_io = Pmw.Group(self.insdialog.interior(), tag_text='Output') self.insert_file_io.pack(side = TOP,expand=1, fill='x') self.insert_button_box = Pmw.ButtonBox(self.insert_file_io.interior(),orient='vertical', padx=0,pady=0) self.insert_button_box.add('Run INSERT',command = self.save_insert_input_file) self.insert_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.insert_page_log_text = Pmw.ScrolledText(self.insert_file_io.interior(), borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', text_width=150, text_height=15, text_wrap='none', text_background='#000000', text_foreground='yellow' ) self.insert_page_log_text.pack(side=BOTTOM, anchor='n',pady=0) self.insdialog.show() def config_dialog(self): if( self.check_w3 == 1): return self.check_w3 = 1 self.confdialog = Pmw.Dialog(self.parent, buttons = ('Return',), title = 'Configuration of queues and commands', command = self.button_pressed3) self.confdialog.withdraw() Pmw.setbusycursorattributes(self.confdialog.component('hull')) # self.status_line = Label(self.dialog.interior(), # relief='sunken', # font='helvetica 12', anchor='w',fg='yellow',bg='black') # self.status_line.pack(side=BOTTOM,fill='x', expand=1, padx=0, pady=0) self.confdialog.geometry('1100x700') self.confdialog.bind('',self.button_pressed3) # the title self.title_label3 = Tkinter.Label(self.confdialog.interior(), text = 'Configuration', background = 'yellow', foreground = 'navy', ) self.title_label3.pack(expand = 0, fill = 'both', padx = 4, pady = 4) self.config1_main_group = Pmw.Group(self.confdialog.interior(), tag_text='Secure Shell commands') self.config1_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.config_macro_main_group = Pmw.Group(self.confdialog.interior(), tag_text='Remote settings') self.config_macro_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.config2_main_group = Pmw.Group(self.config_macro_main_group.interior(), tag_text='Queue system') self.config2_main_group.pack(fill = 'both', expand = 1, padx=10, pady=5, side='left') self.config4_main_group = Pmw.Group(self.config_macro_main_group.interior(), tag_text='Remote commands') self.config4_main_group.pack(fill = 'both', expand = 1, padx=10, pady=5, sid='right') self.config3_main_group = Pmw.Group(self.confdialog.interior(), tag_text='MySQL settings') self.config3_main_group.pack(fill = 'both', expand = 0, padx=10, pady=5) self.ssh_command_entry = Pmw.EntryField(self.config1_main_group.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_ssh_command,filter=("*")), validate = {'validator':quickFileValidation,}, value = self.config_settings['ssh_command'], label_text = 'SSH:') self.scp_command_entry = Pmw.EntryField(self.config1_main_group.interior(), labelpos = 'w', label_pyclass = FileDialogButtonClassFactory.get(self.set_scp_command,filter=("*")), validate = {'validator':quickFileValidation,}, value = self.config_settings['scp_command'], label_text = 'SCP:') self.queue_selection_entry = Pmw.EntryField(self.config2_main_group.interior(), labelpos = 'w', label_text = 'Queue name', value = self.config_settings['queue_name']) self.queue_command_selection_entry = Pmw.EntryField(self.config2_main_group.interior(), labelpos = 'w', label_text = 'Remote username', value = self.config_settings['queue_command']) self.queue_stat_selection_entry = Pmw.EntryField(self.config2_main_group.interior(), labelpos = 'w', label_text = 'Queue status command', value = self.config_settings['queue_status']) self.junk_selection_entry = Pmw.EntryField(self.config2_main_group.interior(), labelpos = 'w', label_text = 'Remote junk directory', value = self.config_settings['junk_dir']) self.defremote_selection_entry = Pmw.EntryField(self.config2_main_group.interior(), labelpos = 'w', label_text = 'Default remote directory', value = self.config_settings['rwork_dir']) self.defhead_selection_entry = Pmw.EntryField(self.config2_main_group.interior(), labelpos = 'w', label_text = 'Default node', value = self.config_settings['rnode']) self.mysql_host_selection_entry = Pmw.EntryField(self.config3_main_group.interior(), labelpos = 'w', label_text = 'MySQL hostname', value = self.config_settings['mysql_host']) self.mysql_port_selection_entry = Pmw.EntryField(self.config3_main_group.interior(), labelpos = 'w', label_text = 'MySQL port', value = self.config_settings['mysql_port']) self.mysql_user_selection_entry = Pmw.EntryField(self.config3_main_group.interior(), labelpos = 'w', label_text = 'MySQL username', value = self.config_settings['mysql_user']) self.mysql_password_selection_entry = Pmw.EntryField(self.config3_main_group.interior(), labelpos = 'w', label_text = 'MySQL password', value = self.config_settings['mysql_password']) self.mysql_db_selection_entry = Pmw.EntryField(self.config3_main_group.interior(), labelpos = 'w', label_text = 'MySQL database', value = self.config_settings['mysql_db']) self.aviso_relativo = Label(self.config4_main_group.interior(), text = 'The PATHS are from each node!!!') self.aviso_relativo.pack(side=TOP,expand=1, padx=10, pady=5) self.insertcommand_selection_entry = Pmw.EntryField(self.config4_main_group.interior(), labelpos = 'w', label_text = 'insertVSDB', value = self.config_settings['insertVSDB_exe']) self.runcdockcommand_selection_entry = Pmw.EntryField(self.config4_main_group.interior(), labelpos = 'w', label_text = 'runCDOCK', value = self.config_settings['runCDOCK_exe']) self.rungtpcommand_selection_entry = Pmw.EntryField(self.config4_main_group.interior(), labelpos = 'w', label_text = 'runGTP', value = self.config_settings['runGTP_exe']) self.euler_command_selection_entry = Pmw.EntryField(self.config4_main_group.interior(), labelpos = 'w', label_text = 'eulerAnglesAndTransVector', value = self.config_settings['eulerAnglesAndTransVector_exe']) self.rcdockcommand_selection_entry = Pmw.EntryField(self.config4_main_group.interior(), labelpos = 'w', label_text = 'remote CDOCK', value = self.config_settings['rcdock_exe']) self.getresultscommand_selection_entry = Pmw.EntryField(self.config4_main_group.interior(), labelpos = 'w', label_text = 'getResultsFromVS', value = self.config_settings['getResultsFromVS_exe']) self.rgtpcommand_selection_entry = Pmw.EntryField(self.config4_main_group.interior(), labelpos = 'w', label_text = 'remote GTP', value = self.config_settings['rgtp_exe']) self.alfa_remotecommand_selection_entry = Pmw.EntryField(self.config4_main_group.interior(), labelpos = 'w', label_text = 'ALFA remote command', value = self.config_settings['alfa_remote_exe']) self.corina_command_selection_entry = Pmw.EntryField(self.config4_main_group.interior(), labelpos = 'w', label_text = 'CORINA remote command', value = self.config_settings['corina_exe']) self.mopac7_command_selection_entry = Pmw.EntryField(self.config4_main_group.interior(), labelpos = 'w', label_text = 'MOPAC7 remote command', value = self.config_settings['mopac7_exe']) self.ob_command_selection_entry = Pmw.EntryField(self.config4_main_group.interior(), labelpos = 'w', label_text = 'OpenBABEL Mod remote command', value = self.config_settings['rob_exe']) self.ssh_command_entry.pack(fill='x',padx=4,pady=1,expand=0) self.scp_command_entry.pack(fill='x',padx=4,pady=1,expand=0) self.queue_selection_entry.pack(fill='x',padx=4,pady=1,expand=1) self.queue_command_selection_entry.pack(fill='x',padx=4,pady=1,expand=1) self.junk_selection_entry.pack(fill='x',padx=4,pady=1,expand=1) self.defremote_selection_entry.pack(fill='x',padx=4,pady=1,expand=1) self.defhead_selection_entry.pack(fill='x',padx=4,pady=1,expand=1) self.queue_stat_selection_entry.pack(fill='x',padx=4,pady=1,expand=1) self.insertcommand_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.runcdockcommand_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.rungtpcommand_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.rcdockcommand_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.rgtpcommand_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.euler_command_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.getresultscommand_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.alfa_remotecommand_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.corina_command_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.mopac7_command_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.ob_command_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.mysql_host_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.mysql_port_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.mysql_user_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.mysql_password_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) self.mysql_db_selection_entry.pack(fill='x',padx=4,pady=1,expand=0) Pmw.alignlabels( [self.ssh_command_entry, self.scp_command_entry] ) Pmw.alignlabels( [self.queue_command_selection_entry, self.defremote_selection_entry, self.defhead_selection_entry, self.queue_selection_entry, self.queue_stat_selection_entry, self.junk_selection_entry] ) Pmw.alignlabels( [ self.mysql_host_selection_entry, self.mysql_port_selection_entry, self.mysql_user_selection_entry, self.mysql_password_selection_entry, self.mysql_db_selection_entry ] ) Pmw.alignlabels( [ self.insertcommand_selection_entry, self.runcdockcommand_selection_entry, self.rcdockcommand_selection_entry, self.euler_command_selection_entry, self.rgtpcommand_selection_entry,self.rungtpcommand_selection_entry, self.getresultscommand_selection_entry, self.alfa_remotecommand_selection_entry, self.corina_command_selection_entry, self.mopac7_command_selection_entry, self.ob_command_selection_entry]) self.config_button_box2 = Pmw.ButtonBox(self.confdialog.interior(), padx=0, pady=0,orient='horizontal') self.config_button_box2.pack(side=BOTTOM,expand = 1, padx = 10, pady = 5) self.config_button_box2.add('Save Plugin Configuration File',command = self.save_plugin_config_file2) self.confdialog.show() def change_getr_different(self, yesno): if yesno == 'yes': self.getr_different = 'yes' else: self.getr_different = 'no' def change_getr_mol2pdb(self, yesno): if yesno == 'pdb': self.getr_mol2pdb = 'yes' else: self.getr_mol2pdb = 'no' def changeText_filt(self, yesno): self.filter_active = yesno def changeScoring_adv_centroid(self, yesno): if yesno == 'Tanimoto': self.scoring_adv_centroid = 1 elif yesno == 'Tversky': self.scoring_adv_centroid = 2 else: self.scoring_adv_centroid = 3 def changeScoring_adv_fusion(self, yesno): if yesno == 'Tanimoto': self.scoring_adv_fusion = 1 elif yesno == 'Tversky': self.scoring_adv_fusion = 2 else: self.scoring_adv_fusion = 3 def select_average_grid(self, yesno): self.my_selected_grid_average = yesno def changePot(self, yesno): if yesno == '12-6 Potential (Recommended)': self.v_pot = 12 elif yesno == '9-6 Soft Potential (DNA, fragments or tight pocket)': self.v_pot = 9 def changePPPList(self, yesno): if yesno == 'Hydrogen bond donor': self.ppp_type_insert = 1 elif yesno == 'Hydrogen bond acceptor': self.ppp_type_insert = 2 elif yesno == 'Positive charged group': self.ppp_type_insert = 3 elif yesno == 'Negative charged group': self.ppp_type_insert = 4 elif yesno == 'Aromatic ring': self.ppp_type_insert = 5 elif yesno == 'Lipophilic point': self.ppp_type_insert = 6 def insertPPP(self): try: m = cmd.get_view(0) ttt = [m[0], m[1], m[2], 0.0, m[3], m[4], m[5], 0.0, m[6], m[7], m[8], 0.0, 0.0, 0.0, 0.0, 1.0] # Old insert a = 'ATOM 1 PCG PCG %4i %3i.000 00.000 00.000 0.00 0.0000' %(self.current_ppp, self.current_ppp) if self.ppp_type_insert == 1: a = 'ATOM 1 DHB DHB %4i %3i.000 %3i.000 %3i.000 0.00 0.0000' %(self.current_ppp, m[12],m[13],m[14]) elif self.ppp_type_insert == 2: a = 'ATOM 1 AHB AHB %4i %3i.000 %3i.000 %3i.000 0.00 0.0000' %(self.current_ppp, m[12],m[13],m[14]) elif self.ppp_type_insert == 3: a = 'ATOM 1 PCG PCG %4i %3i.000 %3i.000 %3i.000 0.00 0.0000' %(self.current_ppp, m[12],m[13],m[14]) elif self.ppp_type_insert == 4: a = 'ATOM 1 NCG NCG %4i %3i.000 %3i.000 %3i.000 0.00 0.0000' %(self.current_ppp, m[12],m[13],m[14]) elif self.ppp_type_insert == 5: a = 'ATOM 1 ARR ARR %4i %3i.000 %3i.000 %3i.000 0.00 0.0000' %(self.current_ppp, m[12],m[13],m[14]) elif self.ppp_type_insert == 6: a = 'ATOM 1 LPP LPP %4i %3i.000 %3i.000 %3i.000 0.00 0.0000' %(self.current_ppp, m[12],m[13],m[14]) #my_view= cmd.get_view(0) #print "%f,%f,%f" %(my_view[0],my_view[1],my_view[2]) #print "%f,%f,%f" %(my_view[3],my_view[4],my_view[5]) #print "%f,%f,%f" %(my_view[6],my_view[7],my_view[8]) #print "%f,%f,%f" %(m[12],m[13],m[14]) #print a #print "ATOM 1 DEM DEM 1 38.991 -19.313 -6.835 0.00 0.00 A" #cmd.transform_object("PPP1",ttt) #cmd.save(file,object) name = "PPP%i" %(self.current_ppp) self.current_ppp = self.current_ppp + 1 cmd.read_pdbstr(a,name) #cmd.transform_object("PPP1",ttt) except: self.screwup("Fatal","Cant insert the point into PyMOL") return def changeMDOutput(self, yesno): self.md_output = yesno def changeProtFF(self, yesno): self.prot_ff = yesno def changeLigFF(self, yesno): self.lig_ff = yesno def changeSolvent(self, yesno): self.solvent = yesno def changeScoring_adv_single(self, yesno): if yesno == 'Tanimoto': self.scoring_adv_single = 1 elif yesno == 'Tversky': self.scoring_adv_single = 2 else: self.scoring_adv_single = 3 def changeScoring(self, yesno): if yesno == 'Tanimoto': self.scoring = 1 elif yesno == 'Tversky': self.scoring = 2 else: self.scoring = 3 def changeEngine(self, yesno): self.engine_fusion = yesno def changeFP_adv_fusion(self, yesno): if yesno == 'MACCS': self.fp_type_adv_fusion = 1 elif yesno == 'CATS': self.fp_type_adv_fusion = 2 else: self.fp_type_adv_fusion = 3 def changeFP_adv_single(self, yesno): if yesno == 'MACCS': self.fp_type_adv_single = 1 elif yesno == 'CATS': self.fp_type_adv_single = 2 else: self.fp_type_adv_single = 3 def changeFP(self, yesno): if yesno == 'MACCS': self.fp_type = 1 elif yesno == 'CATS': self.fp_type = 2 else: self.fp_type = 3 def changeSimplex(self, yesno): if yesno == 'yes': self.simplex_opt = '1' else: self.simplex_opt = '0' def changealfainputrmsd(self, yesno): if yesno == 'yes': self.alfarmsd_opt = '1' else: self.alfarmsd_opt = '0' def changealfaoutput(self, pdbmol2): self.alfaout_opt = pdbmol2 def changeBND(self, yesno): self.delphi_bndcon_val = yesno def changeMOPAC(self, yesno): self.mopac_method = yesno def changeallMOPAC(self, yesno): self.mopac_alln = yesno def changenoUseISM(self, yesno): if yesno == 'yes': self.nouseISM_opt = '1' else: self.nouseISM_opt = '0' def changenoUseHB(self, yesno): if yesno == 'yes': self.nouseHB_opt = '1' else: self.nouseHB_opt = '0' def changeonlyEnergy(self,yesno): if yesno == 'yes': self.onlyenergy_opt = '1' else: self.onlyenergy_opt = '0' def changeGAGAinput(self,yesno): if yesno == 'yes': self.GAGA_opt = '1' else: self.GAGA_opt = '0' def n_points_X_changed(self, x): val = int(self.n_points_X.get())+int(x) self.n_points_X.set(val) self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) self.show_box() def n_points_Y_changed(self, x): val = int(self.n_points_Y.get())+int(x) self.n_points_Y.set(val) self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) self.show_box() def n_points_Z_changed(self, x): val = int(self.n_points_Z.get())+int(x) self.n_points_Z.set(val) self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) self.show_box() def grid_center_from_selection_changed(self): self.grid_center_selection_mode.set(GRID_CENTER_FROM_SELECTION) self.show_box() self.grid_center_selection_entry.clear() def grid_center_X_changed_win(self, x,b,c): self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) val=float(self.grid_center[0].get())+float(b)*1.0 self.grid_center[0].set(val) self.show_box() def grid_center_Y_changed_win(self, x,b,c): self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) val=float(self.grid_center[1].get())+float(b)*1.0 self.grid_center[1].set(val) self.show_box() def grid_center_Z_changed_win(self, x,b,c): self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) val=float(self.grid_center[2].get())+float(b)*1.0 self.grid_center[2].set(val) self.show_box() def grid_center_X_changed(self, x): self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) val=float(self.grid_center[0].get())+float(x)*1.0 self.grid_center[0].set(val) self.show_box() def grid_center_Y_changed(self, x): self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) val=float(self.grid_center[1].get())+float(x)*1.0 self.grid_center[1].set(val) self.show_box() def grid_center_Z_changed(self, x): self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) val=float(self.grid_center[2].get())+float(x)*1.0 self.grid_center[2].set(val) self.show_box() def select_atoms_within_binding_site(self): m = cmd.get_model("polymer") xmin, xmax = self.box_coords[0] ymin, ymax = self.box_coords[1] zmin, zmax = self.box_coords[2] lst = filter(lambda a: a.coord[0] >= xmin and \ a.coord[0] <= xmax and \ a.coord[1] >= ymin and \ a.coord[1] <= ymax and \ a.coord[2] >= zmin and \ a.coord[2] <= zmax, m.atom) by_id = map(lambda a: a.id, lst) if len(by_id) > 1: cmd.select("binding_site", "ID %d" % by_id[0]) for idx in by_id[1:]: cmd.select("binding_site", "binding_site or ID %d" % idx) self.status_line.configure(text = "Selector 'binding_site' created with %d atoms" % len(by_id)) self.import_selections() def box_display_cylinder_size_changed(self, x): val=float(self.box_display_cylinder_size.get())+float(x)*0.1 self.box_display_cylinder_size.set(val) self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) self.show_box() def box_display_line_width_changed(self, x): val=float(self.box_display_line_width.get())+float(x)*0.1 self.box_display_line_width.set(val) self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) self.show_box() def box_display_mesh_grid_changed(self, x): val=float(self.box_display_mesh_grid.get())+float(x)*0.1 self.box_display_mesh_grid.set(val) self.grid_center_selection_mode.set(GRID_CENTER_FROM_COORDINATES) self.show_box() def show_box(self): self.calculate_grid_center() self.show_crisscross() self.calculate_box() def hide_box(self): cmd.delete("box") cmd.delete("wirebox") cmd.delete("grid_center") self.box_is_on_display = False def change_box_color(self): color = tkColorChooser.Chooser( initialcolor='white',title='Choose box color').show() if color[0] is not None: self.box_color = [color[0][0]/100., color[0][1]/100., color[0][2]/100.] self.show_box() def set_pg_target_path(self,dirname): self.grid_target_entry.setvalue(dirname) def set_pg_ref_path(self,dirname): self.grid_ref_entry.setvalue(dirname) def set_pg_append_path(self, dirname): self.grid_append_entry.setvalue(dirname) def set_cgrid_views_path(self, dirname): self.cgrid_views.setvalue(dirname) def set_cgrid_cdock_path(self, dirname): self.cgrid_cdock.setvalue(dirname) def set_input_smiles(self, filename): self.insert_smiles.setvalue(filename) def set_runcdock_input_smiles(self, filename): self.runcdock_input.setvalue(filename) def set_ssh_command(self, filename): self.ssh_command_entry.setvalue(filename) #self.ssh_commnad.set(filename) self.config_settings['ssh_command'] = filename def set_scp_command(self, filename): self.scp_command_entry.setvalue(filename) #self.scp_commnad.set(filename) self.config_settings['scp_command'] = filename def set_box_filename(self, filename): self.box_file_location.setvalue(filename) def set_out_modres_filename(self, filename): self.modres_out_entry.setvalue(filename) def set_modres_pdb_filename(self, filename): self.modres_pdb_entry.setvalue(filename) def set_el_filename(self, filename): self.el_file_location.setvalue(filename) def set_gpf_filename(self, filename): self.gpf_file_location.setvalue(filename) def set_pose_filename(self, filename): self.pose_file_location.setvalue(filename) def set_fusion_filename(self,filename): self.fusion_query_selection_entry.setvalue(filename) def set_input_cdock(self, filename): self.input_cdock.setvalue(filename) def set_ref_cdock(self, filename): self.ref_cdock.setvalue(filename) def set_addrules_alfa(self,filename): self.alfa_add_rules.setvalue(filename) def set_userules_alfa(self,filename): self.alfa_use_rules.setvalue(filename) def set_input_alfa(self, filename): self.input_alfa.setvalue(filename) def set_ref_alfa(self, filename): self.ref_alfa.setvalue(filename) def set_alfa_outputfile(self, filename): self.alfa_outputfile_selection_entry.setvalue(filename) def set_config_filename(self, filename): self.config_file_location.setvalue(filename) def set_mopac_inputfile(self, filename): self.mopac_inputfile_selection_entry.setvalue(filename) def set_mopac_outputfile(self, filename): self.mopac_outputfile_selection_entry.setvalue(filename) def set_delphi_pdb(self, filename): self.delphi_pdb_entry.setvalue(filename) def set_delphi_siz(self, filename): self.delphi_siz_entry.setvalue(filename) def set_delphi_crg(self, filename): self.delphi_crg_entry.setvalue(filename) def set_delphi_pqr(self, filename): self.delphi_pqr_entry.setvalue(filename) def set_delphi_phi(self, filename): self.delphi_phi_entry.setvalue(filename) def stop_cgrid(self): try: self.r.stop() except: self.screwup("Fatal","Cant stop the process.\n\nIf you dont run a job, you cant stop it\n(Confucius)") return def stop_cdock(self): try: self.r2.stop() except: self.screwup("Fatal","Cant stop the process.\n\nIf you dont run a job, you cant stop it\n(Confucius)") return def stop_gfps(self): try: self.r_gfps.stop() except: self.screwup("Fatal","Cant stop the process.\n\nIf you dont run a job, you cant stop it\n(Confucius)") return def load_conformers(self): try: #view = cmd.get_view() #myworking = self.work_location.get() #myworking = self.config_settings['work_dir'] confr = self.alfa_outputfile_selection_entry.get() #confr = os.path.join(myworking,que); #confr += ".%s" %(self.alfaout_opt) cmd.load(confr) except: self.screwup("Fatal","Cant load conformers into PyMOL. Check Working directory and job status") return def show_scpot(self): try: lv = float(self.level_surface_cpot.get()) cmd.isosurface("C_pot_surf","C_pot",lv) cmd.color("green","C_pot_surf") except: pass def show_shpot(self): try: lv = float(self.level_surface_hpot.get()) cmd.isosurface("H_pot_surf","H_pot",lv) cmd.color("white","H_pot_surf") except: pass def show_sopot(self): try: lv = float(self.level_surface_opot.get()) cmd.isosurface("O_pot_surf","O_pot",lv) cmd.color("red","O_pot_surf") except: pass def show_snpot(self): try: lv = float(self.level_surface_npot.get()) cmd.isosurface("N_pot_surf","N_pot",lv) cmd.color("blue","N_pot_surf") except: pass def show_sppot(self): try: lv = float(self.level_surface_ppot.get()) cmd.isosurface("P_pot_surf","P_pot",lv) cmd.color("orange","P_pot_surf") except: pass def show_sspot(self): try: lv = float(self.level_surface_spot.get()) cmd.isosurface("S_pot_surf","S_pot",lv) cmd.color("yellow","S_pot_surf") except: pass def show_sfpot(self): try: lv = float(self.level_surface_fpot.get()) cmd.isosurface("F_pot_surf","F_pot",lv) cmd.color(5,"F_pot_surf") except: pass def show_sclpot(self): try: lv = float(self.level_surface_clpot.get()) cmd.isosurface("Cl_pot_surf","Cl_pot",lv) cmd.color(5,"Cl_pot_surf") except: pass def show_sbrpot(self): try: lv = float(self.level_surface_brpot.get()) cmd.isosurface("Br_pot_surf","Br_pot",lv) cmd.color(5,"Br_pot_surf") except: pass def show_sipot(self): try: lv = float(self.level_surface_ipot.get()) cmd.isosurface("I_pot_surf","I_pot",lv) cmd.color(5,"I_pot_surf") except: pass def write_mol2_to_descriptor(self, id, fp): try: db_wr = MySQLdb.connection(host=self.config_settings['mysql_host'], user=self.config_settings['mysql_user'], passwd=self.config_settings['mysql_password'], db=self.config_settings['mysql_db'], port=int(self.config_settings['mysql_port'])) except: self.screwup("Fatal","Can not connect to the database. Check parameters") return if not fp: self.screwup("Oops","File descriptor not valid") return try: da_query = "SELECT COORDINATES,MOL2TYPES,TOPOLOGY FROM CONFIGURATION WHERE ID_MOLECULE=\'%s\'" %(id) db_wr.query(da_query) res = db_wr.store_result() if res.num_rows() > 0: for row in res.fetch_row(): coor_token = row[0].split(";") mol2_token = row[1].split(";") topol_token = row[2].split(";") natoms = len(mol2_token) nbonds = len(topol_token) print >>fp, "@MOLECULE" print >>fp, "Molecula%s" %(id) print >>fp, "%s %s" %(natoms,nbonds) print >>fp, "SMALL\nNO_CHARGES\n\n" print >>fp, "@ATOM" for i in range(len(coor_token)): atoms = mol2_token[i].split(".") print >>fp,"%i %s%i %s %s1 LIG 0.0" %((i+1),atoms[0],(i+1),coor_token[i],mol2_token[i]) print >>fp, "@BOND" # Aqui van los enlaces for i2 in range(nbonds): bonds = topol_token[i2].split("-") print >>fp, " %i %s %s %s" %((i2+1),bonds[0],bonds[1],bonds[2]) print >>fp, "\n" except: self.screwup("Fatal","Cant save query results") db_wr.close() return db_wr.close() def save_ifps_input_file(self): # Open files myworking = self.ifps_workdir_location.get() ids_name_fp = self.ifps_ids_location.get() if len(myworking) == 0 or len(ids_name_fp) == 0: self.screwup("Oops","You have to provide:\nWorking directory\nID output file") return hash_maccs = os.path.join(myworking,'fps_MACCS.hash') hash_cats = os.path.join(myworking,'fps_CATS.hash') hash_groups = os.path.join(myworking,'fps_groups.hash') fp_ids = self.fileopen(ids_name_fp,"r") if not fp_ids: self.screwup("Oops","Cant open file %s" %(ids_name_fp)) return fp_maccs = self.fileopen(hash_maccs,"r") if not fp_maccs: fp_ids.close() self.screwup("Oops","Cant open file %s" %(hash_maccs)) return fp_cats = self.fileopen(hash_cats,"r") if not fp_cats: fp_ids.close() fp_maccs.close() self.screwup("Oops","Cant open file %s" %(hash_cats)) return fp_groups = self.fileopen(hash_groups,"r") if not fp_groups: fp_ids.close() fp_maccs.close() fp_cats.close() self.screwup("Oops","Cant open file %s" %(hash_groups)) return try: lst1 = fp_ids.readlines() lst2 = fp_maccs.readlines() lst3 = fp_cats.readlines() lst4 = fp_groups.readlines() except: self.screwup("Fatal","Cant read files") return #print len(lst1) try: db_ifps = MySQLdb.connection(host=self.config_settings['mysql_host'], user=self.config_settings['mysql_user'], passwd=self.config_settings['mysql_password'], db=self.config_settings['mysql_db'], port=int(self.config_settings['mysql_port'])) except: self.screwup("Fatal","Can not connect with the database. Check parameters") return for i in range(1, len(lst1)): query1 = """INSERT INTO FINGERPRINTS (ID_MOLECULE, FINGERPRINT, ID_FINGER_TYPE) VALUES (%s,'%s',1) """ %(lst1[i].rstrip(),lst2[i].rstrip() ) # Insert MACCS query2 = """INSERT INTO FINGERPRINTS (ID_MOLECULE, FINGERPRINT, ID_FINGER_TYPE) VALUES (%s,'%s',3) """ %(lst1[i].rstrip(),lst4[i].rstrip() ) # Insert Groups query3 = """INSERT INTO FINGERPRINTS (ID_MOLECULE, FINGERPRINT, ID_FINGER_TYPE) VALUES (%s,'%s',2) """ %(lst1[i].rstrip(),lst3[i].rstrip() ) # Insert CATS try: db_ifps.query(query1) db_ifps.query(query2) db_ifps.query(query3) db_ifps.commit() except: db_ifps.rollback() self.screwup("Fatal","Error in commit. Rollback done.\nCan not insert fingerprints. Check database schema version") return db_ifps.close() fp_ids.close() fp_maccs.close() fp_cats.close() fp_groups.close() lblok = "%i (%ix3) fingerprints were inserted in the database" %(len(lst1)*3,len(lst1)) allok = Pmw.TextDialog(self.parent, scrolledtext_labelpos = 'n', title = 'Insertion summary', defaultbutton = 0, label_text = lblok) allok.withdraw() allok.show() n = len(lst2) n2 = len(lst4) n3 = len(lst3) info = "%s structural based fingerprints (MACCS) were inserted\n%s topological pharmacophoric fingerprints (CATS) were inserted\n%s groups filters were inserted\n\n\nSo far, everthing seems perfect." %(n,n2,n3) allok.insert('end', info) allok.geometry('620x200') allok.configure(text_state = 'disabled') def save_md_input_file(self): # set up environment now = datetime.datetime.now() new_dir = "md_%s" %(now.strftime("%Y_%m_%d_%H%M%S")) myoldworking = self.config_settings['work_dir'] myworking = os.path.join(myoldworking,new_dir) mylig = "lig" myprot = "prot" mywholething = "todo" try: os.makedirs(myworking) except OSError: pass self.md_page_log_text.insert('end',"Envirnoment ok\n") self.md_page_log_text.yview('moveto',1.0) # Parse input files prot_fp = open(self.md_prot_location.get(),"r") lig_fp = open(self.md_ligand_location.get(),"r") prot_good_path = os.path.join(myworking, "%s.pdb" %(myprot)) lig_good_path = os.path.join(myworking,"%s.pdb" %(mylig)) whole_good_path = os.path.join(myworking,"%s.pdb" %(mywholething)) sc_up = os.path.join(myworking, "param.sh") prot_good = open(prot_good_path,"w") lig_good = open(lig_good_path,"w") whole_good = open(whole_good_path,"w") sc_good = open(sc_up,"w") if not prot_fp: return if not sc_good: return lst_prot = prot_fp.readlines() # Load prot lst_lig = lig_fp.readlines() # Load lig for line_prot in lst_prot: if line_prot.strip(): if line_prot[0:4] == 'ATOM': #print "%s|%s|%s" %(line_prot[0:53],line_prot[60:67], line_prot[54:59]) print >>prot_good,"%s %s %s" %(line_prot[0:54],line_prot[61:67], line_prot[56:60]) print >>whole_good,"%s %s %s" %(line_prot[0:54],line_prot[61:67], line_prot[56:60]) #print >>prot_good, line_prot.strip() #print >>whole_good, line_prot.strip() print >> prot_good,"TER" print >> whole_good,"TER" for line_lig in lst_lig: if line_lig.strip(): if line_lig[0:4] == 'ATOM' or line_lig[0:6] == 'HETATM': print >> lig_good,"%s %s %s" %(line_lig[0:54],line_lig[61:68],line_lig[56:60]) print >> whole_good,"%s %s %s" %(line_lig[0:54],line_lig[61:68],line_lig[56:60]) #print >>lig_good, line_lig.strip() #print >>whole_good, line_lig.strip() prot_fp.close() lig_fp.close() prot_good.close() lig_good.close() whole_good.close() self.md_page_log_text.insert('end',"Prot and ligand ok\n") self.md_page_log_text.yview('moveto',1.0) donde_estoy = os.getcwd() os.chdir(myworking) # Call antechamberA antebin = os.path.join(self.config_settings['amberhome'],"bin/antechamber") ante_command = "export AMBERHOME=\"%s\" \n \"%s\" -i \"%s.pdb\" -fi mpdb -o \"%s.prepi\" -fo prepi -pf y > log" % (self.config_settings['amberhome'],antebin,mylig,mylig) print >> sc_good,ante_command #self.md_page_log_text.insert('end',"Calling antechamber: %s \n" %(ante_command)) #self.md_page_log_text.yview('moveto',1.0) #p1 = subprocess.Popen(ante_command, stdout=subprocess.PIPE, shell=True) # This is super-crap, # but shell prevents OS errors # about file name too long #result = p1.communicate()[0] #self.md_page_log_text.insert('end',"%s" % result) #self.md_page_log_text.yview('moveto',1.0) # Call parmchk parmbin =os.path.join(self.config_settings['amberhome'],"bin/parmchk") parmchk_command = "\"%s\" -i \"%s.prepi\" -o \"%s.frcmod\" -f prepi >> log" %(parmbin,mylig,mylig) #self.md_page_log_text.insert('end',"Calling parmchk: %s \n" %(parmchk_command)) #self.md_page_log_text.yview('moveto',1.0) #p1 = subprocess.Popen(parmchk_command, stdout=subprocess.PIPE, shell=True) # This is super-crap, # but shell prevents OS errors # about file name too long #result = p1.communicate()[0] #self.md_page_log_text.insert('end',"%s" % result) #self.md_page_log_text.yview('moveto',1.0) print >> sc_good, parmchk_command # Make tleap.in filename3 = os.path.join(myworking,'tleap.in') fp3 = open(filename3,"w") if not fp3: return print >>fp3,"source leaprc.%s" %(self.prot_ff) print >>fp3,"source leaprc.%s" %(self.lig_ff) print >>fp3,"loadamberparams %s.frcmod" %(mylig) print >>fp3,"loadamberprep %s.prepi" %(mylig) print >>fp3,"complex = loadpdb %s.pdb" %(mywholething) if self.md_output == 'AMBER': print >>fp3,"addions complex Na+ %s" %(self.na_ions.get()) print >>fp3,"addions complex Cl- %s" %(self.cl_ions.get()) print >>fp3,"solvatebox complex %s %s" %(self.solvent,self.md_buffer.get()) print >>fp3,"saveamberparm complex %s.top %s.crd" %(mywholething,mywholething) print >>fp3,"quit" fp3.close() # Call tleap tleapbin = os.path.join(self.config_settings['amberhome'],"bin/teLeap") tleap_command = "\"%s\" -f tleap.in -I%s/dat/leap/prep -I%s/dat/leap/lib -I%s/dat/leap/parm -I%s/dat/leap/cmd>> log" %(tleapbin,self.config_settings['amberhome'],self.config_settings['amberhome'],self.config_settings['amberhome'],self.config_settings['amberhome']) print >> sc_good,tleap_command #self.md_page_log_text.insert('end',"Calling tleap: %s \n" %(tleap_command)) #self.md_page_log_text.yview('moveto',1.0) #p1 = subprocess.Popen(tleap_command, stdout=subprocess.PIPE, shell=True) # This is super-crap, # but shell prevents OS errors # about file name too long #result = p1.communicate()[0] #self.md_page_log_text.insert('end',"%s" % result) #self.md_page_log_text.yview('moveto',1.0) # Call ambpdb ambpdbbin = os.path.join(self.config_settings['amberhome'],"bin/ambpdb") ambpdb_command = "\"%s\" -pqr -p \"%s.top\" < \"%s.crd\" > \"%s_AMBER.pdb\"" %(ambpdbbin, mywholething, mywholething, mywholething) print >> sc_good,ambpdb_command #self.md_page_log_text.insert('end',"Calling ambpdb: %s \n" %(ambpdb_command)) #self.md_page_log_text.yview('moveto',1.0) sc_good.close() os.chmod(sc_up, 0755) p1 = subprocess.Popen(sc_up, stdout=subprocess.PIPE, shell=True) # This is super-crap, # but shell prevents OS errors # about file name too long result = p1.communicate()[0] self.md_page_log_text.insert('end',"%s" % result) self.md_page_log_text.yview('moveto',1.0) self.md_page_log_text.insert('end',"We are done here, i guess\n") os.chdir(donde_estoy) def do_generate_erl(self): modres_input = self.modres_pdb_entry.get() modres_output = self.modres_out_entry.get() knowledge_matrix = ['ALA','GLY','SER','THR','LEU','ILE','VAL','ASN','GLN','ARG','HID','HIE','HIP','TRP','PHE','TYR','GLU','ASP','LYS', 'LYN','PRO','CYS','CYM','CYX','MET','ACE','NME','HOH','WAT','IP3','ASH','GLH','PLP','FMN','PRG','HEM','ADP','APC', 'CME','FAD','GOL','FPP','IMP','NAP','NDP','NSP','P25','PM2','POI','PO4','SAH','UMP','CIM','CL','NA','K','RB','CS', 'MG','CAA','CA','ZN','MN','CO'] modres_input_fp = self.fileopen(modres_input,"r") modres_output_fp = self.fileopen(modres_output,"w") if not modres_input_fp: self.screwup("Oops","Cant open receptor file %s" %(modres_input)) return lst_modres = modres_input_fp.readlines() # Load PDB new_modres = [] my_modres = [] for line_modres in lst_modres: if line_modres.strip(): if line_modres[0:4] == 'ATOM' or line_modres[0:6] == 'HETATM': fflag_modres = 0 for kne in knowledge_matrix: if line_modres[17:20].strip().find(kne) >= 0: fflag_modres = 1 if fflag_modres != 1: new_modres.append(line_modres.strip()) my_modres.append(line_modres[17:20].strip()) modres_input_fp.close() # Got it self.modres_page_log_text.insert('end','PDB read. Processing non-standard residues.\n') for e in my_modres: self.modres_page_log_text.insert('end','Residue %s\n' %(e)) checked = [] for e in my_modres: if e not in checked: checked.append(e) print >>modres_output_fp,'RES %s' %(e) ox = [] hyds = [] carbs = [] for line_modres in new_modres: if line_modres[12:16].strip()[0] == 'N': print >>modres_output_fp,'DEF %s %s 3 8' %(line_modres[17:20].strip(),line_modres[12:16]) elif line_modres[12:16].strip()[0] == 'S': print >>modres_output_fp,'DEF %s %s 6 15' %(line_modres[17:20].strip(),line_modres[12:16]) elif line_modres[12:16].strip()[0] == 'P': print >>modres_output_fp,'DEF %s %s 10 16' %(line_modres[17:20].strip(),line_modres[12:16]) elif line_modres[12:16].strip()[0] == 'C': carbs.append( [ line_modres[17:20].strip(), line_modres[12:16], float(line_modres[30:38]),float(line_modres[38:46]),float(line_modres[46:54]) ]) elif line_modres[12:16].strip()[0] == 'O': ox.append( [ line_modres[17:20].strip(), line_modres[12:16], float(line_modres[30:38]),float(line_modres[38:46]),float(line_modres[46:54]) ]) elif line_modres[12:16].strip()[0] == 'H' or line_modres[12:16].strip()[1] == 'H': hyds.append( [ line_modres[17:20].strip(), line_modres[12:16], float(line_modres[30:38]),float(line_modres[38:46]),float(line_modres[46:54]) ]) for hyd in hyds: myx = hyd[2] myy = hyd[3] myz = hyd[4] for candidate in new_modres: r_x = float(candidate[30:38]) r_y = float(candidate[38:46]) r_z = float(candidate[46:54]) pre_x = myx - r_x pre_y = myy - r_y pre_z = myz - r_z dist_c = sqrt( (pre_x*pre_x) + (pre_y*pre_y) + (pre_z*pre_z)) if( dist_c > 0.3 and dist_c < 1.3): if candidate[12:16].strip()[0] == 'C': print >>modres_output_fp,'DEF %s %s 7 16' %(hyd[0], hyd[1]) elif candidate[12:16].strip()[0] == 'N' or candidate[12:16].strip()[0] == 'S': print >>modres_output_fp,'DEF %s %s 8 16' %(hyd[0], hyd[1]) elif candidate[12:16].strip()[0] == 'O': print >>modres_output_fp,'DEF %s %s 9 16' %(hyd[0], hyd[1]) else: print >>modres_output_fp,'DEF %s %s 7 16' %(hyd[0], hyd[1]) for oxy in ox: myx = oxy[2] myy = oxy[3] myz = oxy[4] neig = 0 for candidate in new_modres: r_x = float(candidate[30:38]) r_y = float(candidate[38:46]) r_z = float(candidate[46:54]) pre_x = myx - r_x pre_y = myy - r_y pre_z = myz - r_z dist_c = sqrt( (pre_x*pre_x) + (pre_y*pre_y) + (pre_z*pre_z)) if( dist_c > 0.3 and dist_c < 1.5): neig = neig + 1 if( neig <= 1): print >>modres_output_fp,'DEF %s %s 5 11' %(oxy[0], oxy[1]) else: print >>modres_output_fp,'DEF %s %s 4 12' %(oxy[0], oxy[1]) for car in carbs: myx = car[2] myy = car[3] myz = car[4] neig = 0 for candidate in new_modres: r_x = float(candidate[30:38]) r_y = float(candidate[38:46]) r_z = float(candidate[46:54]) pre_x = myx - r_x pre_y = myy - r_y pre_z = myz - r_z dist_c = sqrt( (pre_x*pre_x) + (pre_y*pre_y) + (pre_z*pre_z)) if( dist_c > 0.3 and dist_c < 1.7): neig = neig + 1 if( neig <= 3): print >>modres_output_fp,'DEF %s %s 2 2' %(car[0], car[1]) else: print >>modres_output_fp,'DEF %s %s 1 2' %(car[0], car[1]) def save_rep_input_file(self): selection_rep = self.rep_selection_entry.get() working_rep = self.rep_working_location.get() smiles_rep = self.rep_smiles_location.get() if len(smiles_rep) == 0 and len(selection_rep) == 0: self.screwup("Oops","You have to provide a file or choose a selection group") return if len(working_rep) == 0: self.screwup("Oops","You have to provide a working directory") return try: if len(smiles_rep) == 0 and len(selection_rep) != 0: stored.xyz = [] cmd.iterate_state(1,selection_rep,"stored.xyz.append((name,resi,resn,[x,y,z],chain))") a = '' print stored.xyz i = 0 for item in stored.xyz: i = i + 1 a += 'ATOM %4i %4s%4s%2s%4i %8.3f%8.3f%8.3f 0.00 0.0000\n' %(i,item[0],item[2],item[4], int(item[1]), float(item[3][0]), float(item[3][1]), float(item[3][2])) filename3 = os.path.join(working_rep,'%s_preR.pdb' %(selection_rep)) fp3 = open(filename3,"w") print >>fp3,a fp3.close() self.rep_page_log_text.insert('end',"PDB extracted from PyMOL group %s\n" %(selection_rep)) self.rep_page_log_text.yview('moveto',1.0) else: filename3 = smiles_rep except: self.screwup("Fatal","Cant extract information from PyMOL") return command = "\"%s\" \"%s\"" %(self.config_settings['rep_exe'],filename3) filename_sh = os.path.join(working_rep,'doprot.sh') fp_sh = open(filename_sh,"w") print >>fp_sh, command fp_sh.close() try: if not sys.platform.startswith('win'): os.chmod(filename_sh, 0755) except: self.screwup("Oops","Cant chmod the batch file %s" %(filename_sh)) return command = "\"%s\"" %(filename_sh) self.rep_page_log_text.insert('end',"Here we go...\n") self.rep_page_log_text.yview('moveto',1.0) try: self.r_rep =running_rep(working_rep,command,self.rep_page_log_text) self.r_rep.start() except: self.screwup("Fatal","Cant execute command. Please check you have threading support int tk") return def save_gfps_input_file(self): myworking = self.gfps_working_location.get() fromdb = self.gfps_db_selection_entry.get() smiles_name_fp = self.gfps_smiles_location.get() if len(myworking) == 0 or (len(fromdb) == 0 and len(smiles_name_fp) == 0): self.screwup("Oops","Fail in parameters.\nProvide the following: Working directory\nDatabase name or SMILES input file") return if len(fromdb) != 0: self.gfps_page_log_text.insert('end','#---------------------------------------\n') self.gfps_page_log_text.insert('end','# EXTRACTING MOLECULE FROM DATABASE ...\n') try: db = MySQLdb.connection(host=self.config_settings['mysql_host'], user=self.config_settings['mysql_user'], passwd=self.config_settings['mysql_password'], db=self.config_settings['mysql_db'], port=int(self.config_settings['mysql_port'])) except: self.screwup("Fatal","Cant connect to the database.\nPlease check the provided information\n") return try: da_query = "SELECT * FROM ORIGINDB WHERE NAME=\'%s\'" %(fromdb) db.query(da_query) res = db.store_result() if res.num_rows() > 0: rows = res.fetch_row() #print rows[0][0] da_query = "SELECT SMILES,ID_ORIGIN,ID_MOLECULE FROM MOLECULE WHERE ID_ORIGINDB=%s" %(rows[0][0]) db.query(da_query) res_new = db.store_result() filename2 = os.path.join(myworking,'gfps_input.smi') filename3 = os.path.join(myworking,'gfps_input.ids') fp2 = self.fileopen(filename2,"w") fp3 = self.fileopen(filename3,"w") if not fp2: self.screup("Oops","Cant open file %s" %(filename2)) return if not fp3: self.screup("Oops","Cant open file %s" %(filename3)) return for row2 in res_new.fetch_row(0): print >>fp2, '%s %s' % (row2[0],row2[1]) print >>fp3, '%s' % (row2[2]) db.close() fp2.close() fp3.close() smiles_name_fp = 'gfps_input.smi' else: self.screwup("Fatal","There are no SMILES in the database to extract") return except: self.screwup("Fatal","Error in the query, can not extract smiles from the database") return self.gfps_page_log_text.insert('end','#---------------------------------------\n') self.gfps_page_log_text.insert('end','# CALLING FINGERPRINT GENERATOR (a.k.a OpenBABEL). PLEASE BE PATIENT...\n') if not sys.platform.startswith('win'): filename = os.path.join(myworking,'runningFPS.sh') else: filename = os.path.join(myworking,'runningFPS.bat') fp = self.fileopen(filename,"w") if not fp: self.screwup("Oops","Can not open file %s" %(filename)) return command1 = "\"%s\" -ismi \"%s\" -ofpt -xs -xn -xfMACCS fps_MACCS.hash\n" %(self.config_settings['ob_exe'], smiles_name_fp ) command2 = "\"%s\" -ismi \"%s\" -ofpt -xs -xn -xfCATS fps_CATS.hash\n" %(self.config_settings['ob_exe'], smiles_name_fp ) command3 = "\"%s\" -ismi \"%s\" -ofpt -xs -xn -xfgroups fps_groups.hash\n" %(self.config_settings['ob_exe'], smiles_name_fp ) da_selection = self.fp_types_checkbutton.getcurselection() for cosa in da_selection: if cosa == 'Structure based (MACCS)': print >>fp, '%s' % (command1) elif cosa == 'Topological Pharmacophores (CATS)': print >>fp, '%s' % (command2) elif cosa == 'Groups filtering': print >>fp, '%s' % (command3) fp.close() try: if not sys.platform.startswith('win'): os.chmod(filename, 0755) except: self.screwup("Oops","Cant chmod the batch file %s" %(filename)) return self.gfps_page_log_text.insert('end',"Batch: %s\n" % filename) self.gfps_page_log_text.yview('moveto',1.0) try: self.r_gfps =running_gfps(myworking,filename,self.gfps_page_log_text) self.r_gfps.start() except: self.screwup("Fatal","Fatal error generating FPs\nPlease check you have threading support in tk") return def pre_save_3d_from_search(self): if( self.check_w18 == 1): return self.check_w18 = 1 try: self.pre_3d_dialog = Pmw.Dialog(self.parent, title = 'Output file') self.pre_3d_dialog.withdraw() Pmw.setbusycursorattributes(self.pre_3d_dialog.component('hull')) self.pre_3d_dialog.geometry('620x200') self.pre_3d_dialog.bind('',self.button_pressed18) self.pre_3d_top_group = Pmw.Group(self.pre_3d_dialog.interior(),tag_text='Save 3D Multi MOL2') self.pre_3d_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.pre_3d_location = Pmw.EntryField(self.pre_3d_top_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_pre3d_path), value = '', label_text = '3D OUTPUT FILE:') self.pre_3d_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) Pmw.alignlabels( [self.pre_3d_location]) self.pre_3d_button_box = Pmw.ButtonBox(self.pre_3d_dialog.interior(),orient='horizontal', padx=0,pady=0) self.pre_3d_button_box.add('Save',command = self.save_3d_from_search) self.pre_3d_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.pre_3d_dialog.show() except: self.screwup("Fatal","Dirty error\nCan display dialog") return def pre_save_adv_3d_from_search(self): if( self.check_w23 == 1): return self.check_w23 = 1 try: self.pre_adv_3d_dialog = Pmw.Dialog(self.parent, title = 'Output file') self.pre_adv_3d_dialog.withdraw() Pmw.setbusycursorattributes(self.pre_adv_3d_dialog.component('hull')) self.pre_adv_3d_dialog.geometry('620x200') self.pre_adv_3d_dialog.bind('',self.button_pressed23) self.pre_adv_3d_top_group = Pmw.Group(self.pre_adv_3d_dialog.interior(),tag_text='Save 3D Multi MOL2') self.pre_adv_3d_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.pre_adv_3d_location = Pmw.EntryField(self.pre_adv_3d_top_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_adv_pre3d_path), value = '', label_text = '3D OUTPUT FILE:') self.pre_adv_3d_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) Pmw.alignlabels( [self.pre_adv_3d_location]) self.pre_adv_3d_button_box = Pmw.ButtonBox(self.pre_adv_3d_dialog.interior(),orient='horizontal', padx=0,pady=0) self.pre_adv_3d_button_box.add('Save',command = self.save_adv_3d_from_search) self.pre_adv_3d_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.pre_adv_3d_dialog.show() except: self.screwup("Fatal","Dirty error.\nCan show dialog") def save_3d_from_search(self): outfile_3d = self.pre_3d_location.get() if len(outfile_3d) == 0: self.screwup("Oops","You should provide something to search for, shouldn't you?") return fp_3d = self.fileopen(outfile_3d,"w") if not fp_3d: self.screwup("Oops","Cant open file %s" %(fp_3d)) return try: for row in self.listilla: self.write_mol2_to_descriptor(row[1],fp_3d) except: fp_3d.close() self.screwup("Fatal","Cant write mol2 format") return fp_3d.close() self.ss_page_log_text.insert('end','3D extracted\n-----------------\n\n') self.ss_page_log_text.yview('moveto',1.0) try: cmd.load(outfile_3d) except: self.screwp("Fatal","Cant load %s into PyMOL\nThis can be due to a previous error in the Mol2 generator\nCheck the file or perform the query again" %(outfile_3d)) return def save_adv_3d_from_search(self): outfile_3d = self.pre_adv_3d_location.get() if len(outfile_3d) == 0: self.screwup("Oops","You should provide something to search for, shouldn't you?") return fp_3d = self.fileopen(outfile_3d,"w") if not fp_3d: self.screwup("Oops","Cant open file %s" %(fp_3d)) return try: for row in self.listilla_adv: self.write_mol2_to_descriptor(row[1],fp_3d) except: fp_3d.close() self.screwup("Fatal","Cant write mol2 format") return fp_3d.close() self.adv_page_log_text.insert('end','3D extracted\n-----------------\n\n') self.adv_page_log_text.yview('moveto',1.0) try: cmd.load(outfile_3d) except: self.screwp("Fatal","Cant load %s into PyMOL\nThis can be due to a previous error in the Mol2 generator\nCheck the file or perform the query again" %(outfile_3d)) return def do_adv_search(self): single_search = self.adv_query_selection_entry.get() my_single_cutoff = self.adv_cutoff.get() subs_search = self.subs_query_selection_entry.get() my_subs_cutoff = self.subs_cutoff.get() my_fusion_cutoff = self.fusion_cutoff.get() my_db_cutoff = self.dbid_cutoff.get() my_centroids_search = self.centroid_origin.get() my_centroid_cons = self.centroid_cons.get() self.adv_page_log_text.insert('end','-----------------\nConnecting to the database...\n') try: db_adv = MySQLdb.connection(host=self.config_settings['mysql_host'], user=self.config_settings['mysql_user'], passwd=self.config_settings['mysql_password'], db=self.config_settings['mysql_db'], port=int(self.config_settings['mysql_port'])) except: self.screwup("Fatal","Cant connect to the database. Check parameters") return fusion_flag = 0 alphabet = 'abcdefghijklmnopqrstuvwxyz' min = 5 max = 15 string='query_' for x in random.sample(alphabet,random.randint(min,max)): string+=x string2='query_' for x in random.sample(alphabet,random.randint(min,max)): string2+=x #print string #print string2 # End common adv_query = '' # Here, filters if len(self.filter_active) != 0: curr_filt = self.filter_active.split(".") filt = '' filt_active =int(curr_filt[0])-1 for u in range(307): if filt_active == u: filt += '1' else: filt += '0' print filt try: adv_query = "create view %s as SELECT MOLECULE.ID_MOLECULE,MolSearch_rule(FINGERPRINTS.FINGERPRINT,\'%s\') as score2 FROM MOLECULE,FINGERPRINTS WHERE FINGERPRINTS.ID_FINGER_TYPE=3 AND MOLECULE.ID_MOLECULE=FINGERPRINTS.ID_MOLECULE " %(string,filt) if len(my_db_cutoff) != 0: adv_query += " AND MOLECULE.ID_ORIGINDB = %s ;" %(my_db_cutoff) else: adv_query += " ;" db_adv.query(adv_query) except: self.screwup("Fatal","Error in query while filtering"); return if len(single_search) != 0: # Perform single search if len(self.filter_active) != 0: adv_query = "create view %s as SELECT %s.score2,MOLECULE.ID_ORIGINDB,MOLECULE.ID_MOLECULE,MOLECULE.SMILES,MolSearch_" %(string2,string) else: adv_query = "create view %s as SELECT MOLECULE.ID_ORIGINDB,MOLECULE.ID_MOLECULE,MOLECULE.SMILES,MolSearch_" %(string2) if self.scoring_adv_single == 1: adv_query += "tanimoto" elif self.scoring_adv_single == 2: adv_query += "tversky" else: adv_query += "rule" if self.fp_type_adv_single == 1: command_query = "echo \"%s\" | \"%s\" -ismi -ofpt -xs -xn -xfMACCS\n" %(single_search,self.config_settings['ob_exe']) elif self.fp_type_adv_single == 2: command_query = "echo \"%s\" | \"%s\" -ismi -ofpt -xs -xn -xfCATS\n" %(single_search,self.config_settings['ob_exe']) else: command_query = "echo \"%s\" | \"%s\" -ismi -ofpt -xs -xn -xfgroups \n" %(single_search,self.config_settings['ob_exe']) self.adv_page_log_text.insert('end','Generating query...\n') print command_query try: my_p = subprocess.Popen(command_query, stdout=subprocess.PIPE, shell=True) # This is super-crap, # but shell prevents OS errors # about file name too long my_result = my_p.communicate()[0] except: self.screwup("Fatal","Error trying to generate the query (openbabel)") return adv_query += "(FINGERPRINTS.FINGERPRINT,'%s') as score" %(my_result.rstrip()) if len(self.filter_active) != 0: adv_query += " FROM MOLECULE,FINGERPRINTS,%s WHERE FINGERPRINTS.ID_FINGER_TYPE=%i AND MOLECULE.ID_MOLECULE = FINGERPRINTS.ID_MOLECULE AND %s.ID_MOLECULE=MOLECULE.ID_MOLECULE" %(string,self.fp_type_adv_single,string) else: adv_query += " FROM MOLECULE,FINGERPRINTS WHERE FINGERPRINTS.ID_FINGER_TYPE=%i AND MOLECULE.ID_MOLECULE = FINGERPRINTS.ID_MOLECULE" %(self.fp_type_adv_single) if len(my_db_cutoff) != 0: adv_query += " AND MOLECULE.ID_ORIGINDB = %s ;" %(my_db_cutoff) if len(self.filter_active) != 0: adv_query2 = "SELECT * FROM %s where score2 > 0 and score > %s; " %(string2,my_single_cutoff) else: adv_query2 = "SELECT * FROM %s where score > %s; " %(string2,my_single_cutoff) print adv_query elif len(subs_search) != 0: # Perform substructure search # Generate centroid if len(self.filter_active) != 0: adv_query = "create view %s as SELECT %s.score2,MOLECULE.ID_ORIGINDB,MOLECULE.ID_MOLECULE,MOLECULE.SMILES,MolSearch_" %(string2,string) else: adv_query = "create view %s as SELECT MOLECULE.ID_ORIGINDB,MOLECULE.ID_MOLECULE,MOLECULE.SMILES,MolSearch_" %(string2) adv_query += "tanimoto" command_query = "echo \"%s\" | \"%s\" -ismi -ofpt -xs -xn -xfMACCS\n" %(subs_search,self.config_settings['ob_exe']) self.adv_page_log_text.insert('end','Generating query...\n') print command_query try: my_p = subprocess.Popen(command_query, stdout=subprocess.PIPE, shell=True) # This is super-crap, # but shell prevents OS errors # about file name too long my_result = my_p.communicate()[0] except: self.screwup("Fatal","Error trying to generate the query (openbabel)") return adv_query += "(FINGERPRINTS.FINGERPRINT,'%s') as score" %(my_result.rstrip()) if len(self.filter_active) != 0: adv_query += " FROM MOLECULE,FINGERPRINTS,%s WHERE FINGERPRINTS.ID_FINGER_TYPE=1 AND MOLECULE.ID_MOLECULE = FINGERPRINTS.ID_MOLECULE AND %s.ID_MOLECULE=MOLECULE.ID_MOLECULE" %(string,string) else: adv_query += " FROM MOLECULE,FINGERPRINTS WHERE FINGERPRINTS.ID_FINGER_TYPE=1 AND MOLECULE.ID_MOLECULE = FINGERPRINTS.ID_MOLECULE" if len(my_db_cutoff) != 0: adv_query += " AND MOLECULE.ID_ORIGINDB = %s ;" %(my_db_cutoff) if len(self.filter_active) != 0: adv_query2 = "SELECT * FROM %s where score2 > 0 and score > %s; " %(string2,my_subs_cutoff) else: adv_query2 = "SELECT * FROM %s where score > %s; " %(string2,my_subs_cutoff) print adv_query # Centroids elif len(my_centroids_search) != 0: my_centroid_cf = self.adv_centroid_cutoff.get() sign = ">=" da_selection = self.adv_centroid_type_checkbutton.getcurselection() for cosa in da_selection: if cosa == 'Inverse search': sign = "<=" self.adv_page_log_text.insert('end','Generating query...\n') super_query = "select mycentroids(%s,166,MOLECULE.ID_ORIGINDB,FINGERPRINTS.FINGERPRINT,%s) from MOLECULE,FINGERPRINTS WHERE MOLECULE.ID_MOLECULE = FINGERPRINTS.ID_MOLECULE and MOLECULE.ID_ORIGINDB=%s AND FINGERPRINTS.ID_FINGER_TYPE=1;" %(my_centroids_search, my_centroid_cons, my_centroids_search) db_adv.query(super_query) print super_query cent_adv = db_adv.store_result() my_centroi_listilla = cent_adv.fetch_row(1) for row_cent in my_centroi_listilla: my_abstract = "%s" %(row_cent[0]) if len(self.filter_active) != 0: adv_query = "create view %s as SELECT %s.score2,MOLECULE.ID_ORIGINDB,MOLECULE.ID_MOLECULE,MOLECULE.SMILES,MolSearch_" %(string2,string) else: adv_query = "create view %s as SELECT MOLECULE.ID_ORIGINDB,MOLECULE.ID_MOLECULE,MOLECULE.SMILES,MolSearch_" %(string2) adv_query += "tanimoto" adv_query += "(FINGERPRINTS.FINGERPRINT,'%s') as score" %(my_abstract.rstrip()) if len(self.filter_active) != 0: adv_query += " FROM MOLECULE,FINGERPRINTS,%s WHERE FINGERPRINTS.ID_FINGER_TYPE=1 AND MOLECULE.ID_MOLECULE = FINGERPRINTS.ID_MOLECULE AND %s.ID_MOLECULE=MOLECULE.ID_MOLECULE" %(string,string) else: adv_query += " FROM MOLECULE,FINGERPRINTS WHERE FINGERPRINTS.ID_FINGER_TYPE=1 AND MOLECULE.ID_MOLECULE = FINGERPRINTS.ID_MOLECULE" if len(my_db_cutoff) != 0: adv_query += " AND MOLECULE.ID_ORIGINDB = %s ;" %(my_db_cutoff) if len(self.filter_active) != 0: adv_query2 = "SELECT * FROM %s where score2 %s 0 and score > %s; " %(string2,sign,my_centroid_cf) else: adv_query2 = "SELECT * FROM %s where score %s %s; " %(string2,sign,my_centroid_cf) print adv_query else: # Perform scoring fusion fusion_file = self.fusion_query_selection_entry.get() fusion_flag = 1 fusion_fp = self.fileopen(fusion_file,"r") if not fusion_fp: self.screwup("Oops","Cant open SMILES file %s" %(fusion_file)) return try: lst_fusion = fusion_fp.readlines() # Load SMILES new_fusion = [] for line_fusion in lst_fusion: if line_fusion.strip(): new_fusion.append(line_fusion.strip()) fusion_fp.close() # Got it self.adv_page_log_text.insert('end','Generating query...\n') fps_fusion = [] for line_fusion in new_fusion: if self.fp_type_adv_fusion == 1: command_query = "echo \"%s\" | \"%s\" -ismi -ofpt -xs -xn -xfMACCS\n" %(line_fusion,self.config_settings['ob_exe']) elif self.fp_type_adv_fusion == 2: command_query = "echo \"%s\" | \"%s\" -ismi -ofpt -xs -xn -xfCATS\n" %(line_fusion,self.config_settings['ob_exe']) else: command_query = "echo \"%s\" | \"%s\" -ismi -ofpt -xs -xn -xfgroups \n" %(line_fusion,self.config_settings['ob_exe']) my_p = subprocess.Popen(command_query, stdout=subprocess.PIPE, shell=True) my_result = my_p.communicate()[0] fps_fusion.append(my_result.rstrip()) except: self.screwup("Fatal","Error reading/generating SMILES from file %s" %(fusion_file)) return n_querys = len(fps_fusion) if self.scoring_adv_single == 1: fusion_prefix = "tanimoto" elif self.scoring_adv_single == 2: fusion_prefix = "tversky" else: fusion_prefix = "rule" if len(self.filter_active) != 0: adv_query6 = "create view %s as SELECT %s.score2,MOLECULE.ID_ORIGINDB,MOLECULE.ID_MOLECULE,MOLECULE.SMILES" %(string2,string) else: adv_query6 = "create view %s as SELECT MOLECULE.ID_ORIGINDB,MOLECULE.ID_MOLECULE,MOLECULE.SMILES" %(string2) n_i = 3 for fusion_hash in fps_fusion: adv_query6 += ",MolSearch_%s(FINGERPRINTS.FINGERPRINT,'%s') as score%i " %(fusion_prefix,fusion_hash,n_i) n_i = n_i + 1 if len(self.filter_active) != 0: adv_query6 += " FROM MOLECULE,FINGERPRINTS,%s WHERE FINGERPRINTS.ID_FINGER_TYPE=%i AND MOLECULE.ID_MOLECULE = FINGERPRINTS.ID_MOLECULE AND %s.ID_MOLECULE=MOLECULE.ID_MOLECULE" %(string,self.fp_type_adv_fusion,string) else: adv_query6 += " FROM MOLECULE,FINGERPRINTS WHERE FINGERPRINTS.ID_FINGER_TYPE=%i AND MOLECULE.ID_MOLECULE = FINGERPRINTS.ID_MOLECULE" %(self.fp_type_adv_fusion) if len(my_db_cutoff) != 0: adv_query6 += " AND MOLECULE.ID_ORIGINDB = %s ;" %(my_db_cutoff) string3='query_' for x in random.sample(alphabet,random.randint(min,max)): string3+=x if len(self.filter_active) != 0: adv_query = "create view %s as SELECT ID_ORIGINDB,ID_MOLECULE,SMILES,MolSearch_fusion(\"%s\"" %(string3,self.engine_fusion) for c in range(n_querys): adv_query += ",%s.score%i" %(string2,(c+3)) adv_query += ") as superscore FROM %s where score2 > 0; " %(string2) else: adv_query = "create view %s as SELECT ID_ORIGINDB,ID_MOLECULE,SMILES,MolSearch_fusion(\"%s\"" %(string3,self.engine_fusion) for c in range(n_querys): adv_query += ",%s.score%i" %(string2,(c+3)) adv_query += ") as superscore FROM %s; " %(string2) try: db_adv.query(adv_query6) except: self.screwup("Fatal","Error executing create view") return adv_query2 = "SELECT * FROM %s where superscore >= %s" %(string3, my_fusion_cutoff) # Common Query! try: self.adv_page_log_text.insert('end','Performing query...\n') print adv_query db_adv.query(adv_query) print adv_query2 db_adv.query(adv_query2) r_adv = db_adv.store_result() self.adv_page_log_text.insert('end','Yeepe! All done\n\n') self.listilla_adv = r_adv.fetch_row(0) ck=0 for row in self.listilla_adv: if( ck <= 100): new_line = "%s - %s - %s | %s\n" %(row[0],row[1],row[2],row[3]) self.adv_page_log_text.insert('end',new_line) ck=ck+1 new_line = "Total %i molecules\n" %(ck) self.adv_page_log_text.insert('end',new_line) except: self.screwup("Fatal","Error performing query") return self.adv_page_log_text.yview('moveto',1.0) if len(self.filter_active) != 0: adv_query3 = "DROP VIEW %s" %(string) db_adv.query(adv_query3) if fusion_flag == 1: adv_query5 = "DROP VIEW %s" %(string3) # db_adv.query(adv_query5) # adv_query4 = "DROP VIEW %s" %(string2) try: print '' # db_adv.query(adv_query4) except: self.screwup("Fatal","Error cleaning up") return db_adv.close() self.adv_page_log_text.insert('end','Connection to the database closed\n-----------------\n\n') self.adv_page_log_text.yview('moveto',1.0) def do_3d_simple_search(self): if len(self.config_settings['gtp_exe']) == 0: self.screwup("Oops","You failed to provide GTP executable path") return if len(self.search_id_selection_entry.get()) == 0: self.screwup("Oops","You have to select a database") return try: self.ppp_page_log_text.insert('end','Tranforming Pharmacophoric points to triplets...\n') stored.xyz = [] cmd.iterate_state(1,"sele","stored.xyz.append((resi,resn,[x,y,z]))") a = '' #print stored.xyz for item in stored.xyz: a += 'ATOM 1 %3s %3s %3i %8.3f%8.3f%8.3f 0.00 0.0000\n' %(item[1],item[1],int(item[0]), float(item[2][0]), float(item[2][1]), float(item[2][2])) except: self.screwup("Oops","Cant read information from PyMOL") return myworking2 = self.config_settings['work_dir'] if len(myworking2) == 0: self.screwup("Oops","No working directory has been selected") return filename2 = os.path.join(myworking2,'pdb_ppp.log') filename3 = os.path.join(myworking2,'pdb_ppp.pdb') fp3 = open(filename3,"w") if not fp3: self.screwup("Oops","Cant open file %s" %(filename3)) return print >>fp3,a fp3.close() try: command_query = "\"%s\" -i \"%s\" -g > \"%s\" \n" %(self.config_settings['gtp_exe'],filename3,filename2) print command_query my_p = subprocess.Popen(command_query, stdout=subprocess.PIPE, shell=True) my_result = my_p.communicate()[0] except: self.screwup("Error","Error generating triplets for query") return try: fp2 = open(filename2,"r") except: self.screwup("Oops","Error in GTP. It seems like GTP didnt write the output properly in %s" %(filename2)) return if not fp2: self.screwup("Oops","Cant open file %s" %(filename2)) return fp_3d = fp2.readline() fp2.close() print fp_3d.strip() #print my_result if len(fp_3d) == 0: self.screwup("Oops","Query not valid or GTP failed to generate the triplets. Check the version of GTP and paths and stuff") return self.ppp_page_log_text.insert('end','-----------------\nConnecting to the database...\n') try: db_ss = MySQLdb.connection(host=self.config_settings['mysql_host'], user=self.config_settings['mysql_user'], passwd=self.config_settings['mysql_password'], db=self.config_settings['mysql_db'], port=int(self.config_settings['mysql_port'])) except: self.screwup("Oops","Cant connect to the database. Check provided information") return alphabet = 'abcdefghijklmnopqrstuvwxyz' log_name='query_' for x in random.sample(alphabet,random.randint(5,15)): log_name+=x ss_query = "create view %s as select PHARMACOPHORES.ID_MOLECULE,PHARMACOPHORES.ID_CONFORMER,PHARMACOPHORES.ID_CONFIGURATION,PharmacophoreSearch(PHARMACOPHORES.FINGERPRINT,\"%s\") as score FROM MOLECULE,PHARMACOPHORES WHERE (MOLECULE.ID_ORIGINDB=%s) AND MOLECULE.ID_MOLECULE=PHARMACOPHORES.ID_MOLECULE;" %(log_name,fp_3d.strip('\n'),self.search_id_selection_entry.get()) self.ppp_page_log_text.insert('end','Performing query...\n') print ss_query try: db_ss.query(ss_query) adv_query2 = "SELECT * FROM %s where score > 0" %(log_name) db_ss.query(adv_query2) r_ppp = db_ss.store_result() self.ppp_page_log_text.insert('end','All done\n\n') self.listilla_ppp = r_ppp.fetch_row(1000) for row in self.listilla_ppp: new_line = "%s - %s - %s | %s\n" %(row[0],row[1],row[2],row[3]) self.ppp_page_log_text.insert('end',new_line) adv_query3 = "DROP VIEW %s" %(log_name) db_ss.query(adv_query3) db_ss.close() except: self.screwup("Fatal error","One or more DB operations failed. Check you have the correct schema") return self.ppp_page_log_text.insert('end','Connection to the database closed\n-----------------\n\n') self.ppp_page_log_text.yview('moveto',1.0) def do_simple_search(self): try: my_ss_smiles = self.ss_query_selection_entry.get() if len(my_ss_smiles) == 0: self.screwup("Oops","You should give me something to search for...moron") return self.ss_page_log_text.insert('end','-----------------\nConnecting to the database...\n') db_ss = MySQLdb.connection(host=self.config_settings['mysql_host'], user=self.config_settings['mysql_user'], passwd=self.config_settings['mysql_password'], db=self.config_settings['mysql_db'], port=int(self.config_settings['mysql_port'])) ss_query = "SELECT MOLECULE.ID_ORIGINDB,MOLECULE.ID_MOLECULE,MOLECULE.SMILES,MolSearch_" if self.scoring == 1: ss_query += "tanimoto" elif self.scoring == 2: ss_query += "tversky" else: ss_query += "rule" if self.fp_type == 1: command_query = "echo \"%s\" | \"%s\" -ismi -ofpt -xs -xn -xfMACCS\n" %(my_ss_smiles,self.config_settings['ob_exe']) elif self.fp_type == 2: command_query = "echo \"%s\" | \"%s\" -ismi -ofpt -xs -xn -xfCATS\n" %(my_ss_smiles,self.config_settings['ob_exe']) else: command_query = "echo \"%s\" | \"%s\" -ismi -ofpt -xs -xn -xfgroups\n" %(my_ss_smiles,self.config_settings['ob_exe']) print command_query self.ss_page_log_text.insert('end','Generating query...\n') my_p = subprocess.Popen(command_query, stdout=subprocess.PIPE, shell=True) # This is super-crap, # but shell prevents OS errors # about file name too long my_result = my_p.communicate()[0] if self.scoring == 2: ss_query += "(FINGERPRINTS.FINGERPRINT,'%s','%s','%s') as score FROM MOLECULE,FINGERPRINTS WHERE FINGERPRINTS.ID_FINGER_TYPE=%i AND MOLECULE.ID_MOLECULE = FINGERPRINTS.ID_MOLECULE ORDER BY score desc" %(my_result.rstrip(),self.ss_alfa_query_selection_entry.get(),self.ss_beta_query_selection_entry.get(),self.fp_type) else: ss_query += "(FINGERPRINTS.FINGERPRINT,'%s') as score FROM MOLECULE,FINGERPRINTS WHERE FINGERPRINTS.ID_FINGER_TYPE=%i AND MOLECULE.ID_MOLECULE = FINGERPRINTS.ID_MOLECULE ORDER BY score desc" %(my_result.rstrip(),self.fp_type) self.ss_page_log_text.insert('end','Performing query...\n') print ss_query db_ss.query(ss_query) r_ss = db_ss.store_result() self.ss_page_log_text.insert('end','Yeepe! All done\n\n') self.listilla = r_ss.fetch_row(100) for row in self.listilla: new_line = "%s - %s - %s | %s\n" %(row[0],row[1],row[2],row[3]) self.ss_page_log_text.insert('end',new_line) self.ss_page_log_text.yview('moveto',1.0) db_ss.close() self.ss_page_log_text.insert('end','Connection to the database closed\n-----------------\n\n') self.ss_page_log_text.yview('moveto',1.0) except: self.screwup("Fatal error","Error performing the operation:\nCheck you have connectivity with the DB and the right schema") return def do_save_simple_search_ids(self): try: outfile_ids = self.pre_ids_location.get() if len(outfile_ids) == 0: self.screwup("Oops","You should provide a file name") return fp2 = self.fileopen(outfile_ids,"wb") if not fp2: self.screwup("Oops","Cant open file %s" %(outfile_ids)) return for row in self.listilla: fp2.write("%s%c" %(row[1],10)) fp2.close() self.ss_page_log_text.insert('end','IDs saved\n-----------------\n\n') self.ss_page_log_text.yview('moveto',1.0) except: self.screwup("Fatal error","Cant save IDS") def do_save_adv_search_smiles(self): try: outfile_ids = self.pre_adv_smiles_location.get() if len(outfile_ids) == 0: self.screwup("Oops","You should provide a file name") return fp2 = self.fileopen(outfile_ids,"wb") if not fp2: self.screwup("Oops","Cant open file %s" %(outfile_ids)) return for row in self.listilla_adv: fp2.write("%s%c" %(row[2],10)) fp2.close() self.adv_page_log_text.insert('end','SMILES saved\n-----------------\n\n') self.adv_page_log_text.yview('moveto',1.0) except: self.screwup("Fatal error","Cant save SMILES") def do_save_adv_search_ids(self): try: outfile_ids = self.pre_adv_ids_location.get() if len(outfile_ids) == 0: self.screwup("Oops","You should provide a file name") return fp2 = self.fileopen(outfile_ids,"wb") if not fp2: self.screwup("Oops","Cant open file %s" %(outfile_ids)) return for row in self.listilla_adv: fp2.write("%s%c" %(row[1],10)) fp2.close() self.adv_page_log_text.insert('end','IDs saved\n-----------------\n\n') self.adv_page_log_text.yview('moveto',1.0) except: self.screwup("Fatal error","Cant save IDS") def do_save_3d_search_ids(self): try: outfile_ids = self.pre_3d_ids_location.get() if len(outfile_ids) == 0: self.screwup("Oops","You should provide a file name") return fp2 = self.fileopen(outfile_ids,"wb") if not fp2: self.screwup("Oops","Cant open file %s" %(outfile_ids)) return for row in self.listilla_ppp: fp2.write("%s_%s_%s%c" %(row[0],row[1],row[2],10)) fp2.close() self.ppp_page_log_text.insert('end','IDs saved\n-----------------\n\n') self.ppp_page_log_text.yview('moveto',1.0) except: self.screwup("Fatal error","Cant save IDS") def pre_do_save_3d_search_ids(self): if( self.check_w27 == 1): return self.check_w27 = 1 try: self.pre_3d_ids_dialog = Pmw.Dialog(self.parent, title = 'Output file') self.pre_3d_ids_dialog.withdraw() Pmw.setbusycursorattributes(self.pre_3d_ids_dialog.component('hull')) self.pre_3d_ids_dialog.geometry('620x200') self.pre_3d_ids_dialog.bind('',self.button_pressed27) self.pre_3d_ids_top_group = Pmw.Group(self.pre_3d_ids_dialog.interior(),tag_text='Save IDs') self.pre_3d_ids_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.pre_3d_ids_location = Pmw.EntryField(self.pre_3d_ids_top_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_3d_preids_path), value = '', label_text = 'IDs OUTPUT FILE:') self.pre_3d_ids_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) Pmw.alignlabels( [self.pre_3d_ids_location]) self.pre_3d_ids_button_box = Pmw.ButtonBox(self.pre_3d_ids_dialog.interior(),orient='horizontal', padx=0,pady=0) self.pre_3d_ids_button_box.add('Save',command = self.do_save_3d_search_ids) self.pre_3d_ids_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.pre_3d_ids_dialog.show() except: self.screwup("Fatal error","Cant display save dialog!\nIf you're in Windows this is normal due to a poor implementation\nIf not: what the hell are you doing?!") def pre_do_save_adv_search_smiles(self): if( self.check_w32 == 1): return self.check_w32 = 1 try: self.pre_adv_smiles_dialog = Pmw.Dialog(self.parent, title = 'Output file') self.pre_adv_smiles_dialog.withdraw() Pmw.setbusycursorattributes(self.pre_adv_smiles_dialog.component('hull')) self.pre_adv_smiles_dialog.geometry('620x200') self.pre_adv_smiles_dialog.bind('',self.button_pressed32) self.pre_adv_smiles_top_group = Pmw.Group(self.pre_adv_smiles_dialog.interior(),tag_text='Save IDs') self.pre_adv_smiles_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.pre_adv_smiles_location = Pmw.EntryField(self.pre_adv_smiles_top_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_adv_presmiles_path), value = '', label_text = 'IDs OUTPUT FILE:') self.pre_adv_smiles_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) # Pmw.alignlabels( [self.pre_adv_smiles_location]) self.pre_adv_smiles_button_box = Pmw.ButtonBox(self.pre_adv_smiles_dialog.interior(),orient='horizontal', padx=0,pady=0) self.pre_adv_smiles_button_box.add('Save',command = self.do_save_adv_search_smiles) self.pre_adv_smiles_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.pre_adv_smiles_dialog.show() except: self.screwup("Fatal error","Cant display save dialog!\nIf you're in Windows this is normal due to a poor implementation\nIf not: what the hell are you doing?!") def pre_do_save_adv_search_ids(self): if( self.check_w22 == 1): return self.check_w22 = 1 try: self.pre_adv_ids_dialog = Pmw.Dialog(self.parent, title = 'Output file') self.pre_adv_ids_dialog.withdraw() Pmw.setbusycursorattributes(self.pre_adv_ids_dialog.component('hull')) self.pre_adv_ids_dialog.geometry('620x200') self.pre_adv_ids_dialog.bind('',self.button_pressed22) self.pre_adv_ids_top_group = Pmw.Group(self.pre_adv_ids_dialog.interior(),tag_text='Save IDs') self.pre_adv_ids_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.pre_adv_ids_location = Pmw.EntryField(self.pre_adv_ids_top_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_adv_preids_path), value = '', label_text = 'IDs OUTPUT FILE:') self.pre_adv_ids_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) Pmw.alignlabels( [self.pre_adv_ids_location]) self.pre_adv_ids_button_box = Pmw.ButtonBox(self.pre_adv_ids_dialog.interior(),orient='horizontal', padx=0,pady=0) self.pre_adv_ids_button_box.add('Save',command = self.do_save_adv_search_ids) self.pre_adv_ids_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.pre_adv_ids_dialog.show() except: self.screwup("Fatal error","Cant display save dialog!\nIf you're in Windows this is normal due to a poor implementation\nIf not: what the hell are you doing?!") def pre_do_save_simple_search_ids(self): if( self.check_w17 == 1): return self.check_w17 = 1 try: self.pre_ids_dialog = Pmw.Dialog(self.parent, title = 'Output file') self.pre_ids_dialog.withdraw() Pmw.setbusycursorattributes(self.pre_ids_dialog.component('hull')) self.pre_ids_dialog.geometry('620x200') self.pre_ids_dialog.bind('',self.button_pressed17) self.pre_ids_top_group = Pmw.Group(self.pre_ids_dialog.interior(),tag_text='Save IDs') self.pre_ids_top_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.pre_ids_location = Pmw.EntryField(self.pre_ids_top_group.interior(), labelpos='w', label_pyclass = FileDialogButtonClassFactory.get(self.set_preids_path), value = '', label_text = 'IDs OUTPUT FILE:') self.pre_ids_location.pack(fill = 'both', expand = 1, padx = 10, pady = 5) Pmw.alignlabels( [self.pre_ids_location]) self.pre_ids_button_box = Pmw.ButtonBox(self.pre_ids_dialog.interior(),orient='horizontal', padx=0,pady=0) self.pre_ids_button_box.add('Save',command = self.do_save_simple_search_ids) self.pre_ids_button_box.pack(side=RIGHT,expand = 1, padx = 10, pady = 5) self.pre_ids_dialog.show() except: self.screwup("Fatal error","Cant display save dialog!\nIf you're in Windows this is normal due to a poor implementation\nIf not: what the hell are you doing?!") def save_cdock_input_file(self): try: myworking = self.cgrid_cdock.get() self.cdock_page_log_text.insert('end','#---------------------------------------\n') self.cdock_page_log_text.insert('end','# CALLING CDOCK. PLEASE BE PATIENT...\n') #donde_estoy = os.getcwd() #os.chdir(tmp_dir) #cdock_donde = self.cdock_location.get() cdock_donde = self.config_settings['cdock_exe'] inputf = self.input_cdock.get() ref = self.ref_cdock.get() maxposes = self.max_generated_poses_selection_entry.get() maxexhposes = self.max_exh_poses_selection_entry.get() maxtotalstack = self.max_total_stack_size_selection_entry.get() maxconfstack = self.max_conf_stack_size_selection_entry.get() howmany = self.jau_meni_selection_entry.get() initialtemp = self.initial_temp_selection_entry.get() maxaccpMCSA = self.maxAcceptedPerMCSARound_selection_entry.get() maxgenMCSA = self.maxGenPerMCSARound_selection_entry.get() annealing = self.annealingSchedule_selection_entry.get() probChange = self.probChange_selection_entry.get() seeder = self.seed_selection_entry.get() if len(cdock_donde) == 0 or len(myworking) == 0 or len(inputf) == 0 or len(maxposes) == 0 or len(maxexhposes) == 0 or len(maxtotalstack) == 0 or len(maxconfstack) == 0 or len(howmany) == 0 or len(initialtemp) == 0 or len(maxaccpMCSA) == 0 or len(maxgenMCSA) == 0 or len(annealing) == 0 or len(probChange) == 0 or len(seeder) == 0: self.screwup("Oops","You failed to provide the minimum information to run CDOCK:\nCDOCK executable path\nWorking directory\nInput file\nPose information\n MonteCarlo information") return try: shutil.copy2(inputf,myworking) except: pass spli1 = os.path.split(inputf) if len(ref) == 0: command = "\"%s\" -inputFile \"%s\" -maxGeneratedPoses %s -maxTotalStackSize %s -maxConfStackSize %s -maxExhaustivePoses %s -initialMCSATemperature %s -maxGeneratedPerMCSARound %s -maxAcceptedPerMCSARound %s -annealingSchedule %s -howManyResults %s -probChange %s" % (cdock_donde,spli1[1],maxposes,maxtotalstack,maxconfstack,maxexhposes,initialtemp,maxgenMCSA,maxaccpMCSA,annealing,howmany,probChange) else: command = "\"%s\" -inputFile \"%s\" -referenceFile \"%s\" -maxGeneratedPoses %s -maxTotalStackSize %s -maxConfStackSize %s -maxExhaustivePoses %s -initialMCSATemperature %s -maxGeneratedPerMCSARound %s -maxAcceptedPerMCSARound %s -annealingSchedule %s -howManyResults %s -probChange %s" % (cdock_donde,spli1[1],ref,maxposes,maxtotalstack,maxconfstack,maxexhposes,initialtemp,maxgenMCSA,maxaccpMCSA,annealing,howmany,probChange) if seeder != "date-time" and len(seeder) == 5: command += ' -seed %s' % (seeder) command += " -getOnlyEnergy %s -noUseISM %s -noUseHB %s -getGAGAInput %s -refineWithSimplex %s" %(self.onlyenergy_opt,self.nouseISM_opt,self.nouseHB_opt,self.GAGA_opt,self.simplex_opt) if not sys.platform.startswith('win'): filename = os.path.join(myworking,'runningCDOCK.sh') else: filename = os.path.join(myworking,'runningCDOCK.bat') fp = self.fileopen(filename,"w") if not fp: self.screwup("Oops","Cant open file %s" %(filename)) return print >>fp, '%s' % (command) fp.close() if not sys.platform.startswith('win'): os.chmod(filename, 0755) self.cdock_page_log_text.insert('end',"Batch: %s\n" % command) self.cdock_page_log_text.yview('moveto',1.0) self.status_line.configure(text="Running CDOCK. PLEASE BE PATIENT") #lista = filename2.split('/') #receptor_ficherillo = lista[ -1 ] #destino = os.path.join(myworking,receptor_ficherillo) #print 'Copiando: %s, %s' %(filename2,destino) #shutil.copy2(filename2, destino) #shutil.copy2(filename2,myworking) self.r2 =running_cdock(myworking,filename,self.cdock_page_log_text,self.status_line) self.r2.start() except: self.screwup("Superb","I dont exactly whats going on, but i have a fatal error. Please check paths and stuff and threads support in tk") def save_rungtp_input_file(self): myworking = self.gfps3d_output_selection_entry.get() usedb = self.gfps3d_usedatabases_selection_entry.get() numproc = self.gfps3d_numproc_selection_entry.get() node_name = self.gfps3d_node_selection_entry.get() myworking2 = self.config_settings['work_dir'] if len(myworking) == 0 or len(usedb) == 0 or len(node_name) == 0 or len(myworking2) == 0 or len(numproc) == 0 or len(self.config_settings['scp_command']) == 0 or len(self.config_settings['queue_command']) == 0 or len(self.config_settings['ssh_command']) == 0: self.screwup("Oops","You should provide the necessary information to perform this operation:\nWorking directory\nRemote working directory\nNode name\nNumber of processors\nSSH/SCP information") return filename3 = os.path.join(myworking2,'runningGTP.sh') filename4 = os.path.join(myworking2,'runGTPConfig.xml') fp3 = self.fileopen(filename3,"wb") if not fp3: self.screwup("Oops","Cant open file %s" %(filename3)) return alphabet = 'abcdefghijklmnopqrstuvwxyz' log_name='log_' for x in random.sample(alphabet,random.randint(5,15)): log_name+=x local_cmd = "\"%s\" -mode 1 -numProcessors %s -outputFolder \"%s\" -useDatabases %s " %(self.config_settings['runGTP_exe'],numproc,log_name,usedb) fp3.write("cd \"%s\" %c" %(myworking,10)) fp3.write("%s%c" %(local_cmd,10)) fp3.close() self.gfps3d_page_log_text.insert('end','#---------------------------------------\n') self.gfps3d_page_log_text.insert('end','# CALLING runGTP. Pray now...\n') #dest = os.path.join(myworking,'runningGTP.sh') #dest3 = os.path.join(myworking,'runGTPConfig.xml') # In windows doesnt work. dest = "%s/%s" %(myworking,'runningGTP.sh') dest3 = "%s/%s" %(myworking,'runGTPConfig.xml') spli1 = os.path.split(filename3) spli2 = os.path.split(filename4) command = "\"%s\" \"%s\" \"%s@%s:%s\"" % (self.config_settings['scp_command'],spli1[1],self.config_settings['queue_command'],node_name,dest) command3 = "\"%s\" \"%s\" \"%s@%s:%s\"" % (self.config_settings['scp_command'],spli2[1],self.config_settings['queue_command'],node_name,dest3) command4 = "\"%s\" \"%s@%s\" \'cd %s ; chmod 755 * ; chmod 755 runningGTP.sh ; %s > run_log'" %(self.config_settings['ssh_command'],self.config_settings['queue_command'],node_name,myworking,dest) command2 = "echo 'Copy sent'" fp4 = self.fileopen(filename4,"w") if not fp4: self.screwup("Oops","Cant open config file %s" %(filename4)) return print >>fp4,"" print >>fp4,"\t" print >>fp4,"\t\t%s" %(self.config_settings['mysql_db']) print >>fp4,"\t\t%s" %(self.config_settings['mysql_host']) print >>fp4,"\t\t%s" %(self.config_settings['mysql_user']) print >>fp4,"\t\t%s" %(self.config_settings['mysql_password']) print >>fp4,"\t" print >>fp4,"\trunGTP.log" print >>fp4,"\t%s" %(self.config_settings['queue_name']) print >>fp4,"\t%s" %(self.config_settings['junk_dir']) print >>fp4,"\t" print >>fp4,'\t\t\n%s\nGTP.exe\n-a\ninputFileCDock.mol2\ncDockOutputScreen\n\n\n%s\neulerAnglesAndTransVector.exe\nfromFile\ntoFile\nparametersFile\n \n\n' % (self.config_settings['rgtp_exe'],self.config_settings['eulerAnglesAndTransVector_exe']) fp4.close() if not sys.platform.startswith('win'): filename_batch = os.path.join(myworking2,'sendrunGTP.sh') else: filename_batch = os.path.join(myworking2,'sendrunGTP.bat') fp_batch = self.fileopen(filename_batch,"w") if not fp_batch: self.screwup("Oops","Cant open batch file %s" %(filename_batch)) return fp_batch.write("%s\n" %(command)) fp_batch.write("%s\n" %(command2)) fp_batch.write("%s\n" %(command3)) fp_batch.write("%s\n" %(command4)) fp_batch.close() if not sys.platform.startswith('win'): os.chmod(filename_batch, 0755) self.gfps3d_page_log_text.insert('end','That\'s the way: %s\n' %(filename_batch)) try: self.r_rungtp =running_rungtp(myworking2,filename_batch,self.gfps3d_page_log_text) self.r_rungtp.start() except: self.screwup("Oops","Big error here. Cant run thread with the process or error in threading. Do you have tk with threads support?") self.gfps3d_page_log_text.insert('end','Something really nasty has been done. Fatal error.\n') self.gfps3d_page_log_text.insert('end','I\'m finished here.\nCheck the status of your job in the Status dialog\n' ) self.gfps3d_page_log_text.insert('end','#---------------------------------------\n' ) def save_runcdock_input_file(self): try: myworking = self.rd_output_selection_entry.get() idsin = self.runcdock_input.get() grids_1 = self.rd_grids_selection_entry.get().strip("/") grids = "/%s" %(grids_1) docks = self.rd_usedock_selection_entry.get() idvs = self.rd_idvirtual_selection_entry.get() usedb = self.rd_usedatabases_selection_entry.get() idprot = self.rd_idprotein_selection_entry.get() zs = self.rd_zscore_selection_entry.get() maxzs = self.rd_maxzscore_selection_entry.get() numproc = self.rd_numproc_selection_entry.get() node_name = self.rd_node_selection_entry.get() myworking2 = self.config_settings['work_dir'] filename3 = os.path.join(myworking2,'runningCDOCK.sh') filename4 = os.path.join(myworking2,'runCDOCK3Config.xml') fp3 = self.fileopen(filename3,"wb") if not fp3: this.screwup("Oops","Cant open file %s.\nWatch out permission and so on" %(filename3)) return if len(myworking) == 0 or len(grids) == 0 or len(zs) == 0 or len(maxzs) == 0 or len(numproc) == 0 or len(node_name) == 0 or len(myworking2) == 0: fp3.close() self.screwup("Oops","You failed to provide the minimum information required.\nPlease fill: Remote Working directory\nRemote Grid directory\nZ-Score\nMax z-Score") return if len(idsin) == 0 and len(usedb) == 0: fp3.close() self.screwup("Oops","You failed to provide the minimum information required.\nPlease provide an input file or database ID") return alphabet = 'abcdefghijklmnopqrstuvwxyz' log_name='log_' for x in random.sample(alphabet,random.randint(5,15)): log_name+=x local_cmd = "\"%s\" -mode 1 -numProcessors %s -outputFolder \"%s\" -gridsFolder \"%s\" -zScore %s -maxConformerZScore %s" %(self.config_settings['runCDOCK_exe'],numproc,log_name,grids, zs, maxzs) # Basico if len(idvs) != 0: local_cmd += " -idVirtualScreening %s" %(idvs) if len(idprot) != 0: local_cmd += " -idProtein %s" %(idprot) if len(idsin) != 0: p_dest8 = os.path.split(idsin) myw3 = os.getcwd() try: shutil.copy2(idsin,myworking2) print "Copying %s to %s" %(idsin,myworking2) except: pass local_cmd += " -inputFile \"%s\" -useFilter no " %(p_dest8[1]) else: if len(docks) != 0: local_cmd += " -useFilter yes - useDOCKFilters %s " %(docks) else: local_cmd += " -useDatabases %s -useFilter no " %(usedb) fp3.write("cd \"%s\" %c" %(myworking,10)) fp3.write("%s%c" %(local_cmd,10)) fp3.close() self.runcdock_page_log_text.insert('end','#---------------------------------------\n') self.runcdock_page_log_text.insert('end','# CALLING runCDOCK. Hold your machos!...\n') #dest = os.path.join(myworking,'runningCDOCK.sh') #dest3 = os.path.join(myworking,'runCDOCK3Config.xml') dest = "%s/%s" %(myworking,'runningCDOCK.sh') dest3 = "%s/%s" %(myworking,'runCDOCK3Config.xml') spli1 = os.path.split(filename3) spli2 = os.path.split(filename4) command = "\"%s\" \"%s\" \"%s@%s:%s\"" % (self.config_settings['scp_command'],spli1[1],self.config_settings['queue_command'],node_name,dest) command3 = "\"%s\" \"%s\" \"%s@%s:%s\"" % (self.config_settings['scp_command'],spli2[1],self.config_settings['queue_command'],node_name,dest3) command4 = "\"%s\" \"%s@%s\" \"cd %s ; chmod 755 * ; chmod 755 runningCDOCK.sh ; %s > run_log\"" %(self.config_settings['ssh_command'],self.config_settings['queue_command'],node_name,myworking,dest) if len(idsin) != 0: p_dest5 = os.path.split(idsin) dest5 = "%s/%s" %(myworking,p_dest5[1]) spli3 = os.path.split(idsin) command2 = "\"%s\" \"%s\" \"%s@%s:%s\"" % (self.config_settings['scp_command'],spli3[1],self.config_settings['queue_command'],node_name,dest5) print command2 else: command2 = "echo 'Using database.'" if not sys.platform.startswith('win'): filename_batch = os.path.join(myworking2,'sendrunCDOCK.sh') else: filename_batch = os.path.join(myworking2,'sendrunCDOCK.bat') fp_batch = self.fileopen(filename_batch,"w") if not fp_batch: self.screwup("Oops","Cant open file %s" %(filename_batch)) return fp_batch.write("%s\n" %(command)) fp_batch.write("%s\n" %(command2)) fp_batch.write("%s\n" %(command3)) fp_batch.write("%s\n" %(command4)) fp_batch.close() if not sys.platform.startswith('win'): os.chmod(filename_batch, 0755) fp4 = self.fileopen(filename4,"w") if not fp4: self.screwup("Oops","Cant open file %s" %(filename4)) return print >>fp4,"" print >>fp4,"\t" print >>fp4,"\t\t%s" %(self.config_settings['mysql_db']) print >>fp4,"\t\t%s" %(self.config_settings['mysql_host']) print >>fp4,"\t\t%s" %(self.config_settings['mysql_user']) print >>fp4,"\t\t%s" %(self.config_settings['mysql_password']) print >>fp4,"\t" print >>fp4,"\trunCDOCK3.log" print >>fp4,"\t%s" %(self.config_settings['queue_name']) print >>fp4,"\t%s" %(self.config_settings['junk_dir']) print >>fp4,"\t" print >>fp4,'\t\t\n%s\nCDOCK.exe\n-howManyResults 1\ninputFileCDock.pdb\ncDockOutputScreen\n\n\n%s\neulerAnglesAndTransVector.exe\nfromFile\ntoFile\nparametersFile\n \n\n' % (self.config_settings['rcdock_exe'],self.config_settings['eulerAnglesAndTransVector_exe']) fp4.close() self.runcdock_page_log_text.insert('end','That\'s the way: %s\n' %(filename_batch)) #lista = filename2.split('/') #receptor_ficherillo = lista[ -1 ] #destino = os.path.join(myworking,receptor_ficherillo) #print 'Copiando: %s, %s' %(filename2,destino) #shutil.copy2(filename2, destino) # shutil.copy2(filename2,myworking) self.r_runcdock =running_runcdock(myworking2,filename_batch,self.runcdock_page_log_text,self.status_line) self.r_runcdock.start() self.runcdock_page_log_text.insert('end','I\'m finished here.\nCheck the status of your job in the Status dialog\n' ) self.runcdock_page_log_text.insert('end','#---------------------------------------\n' ) except e: self.screwup("Fatal error","Big fatal obscure error. It seems that some components of the system are not properly installed:\n\nPython/Pymol in Windows.\nTk without threads support.\nObsolete modules Pmw,numpy,etc.\n\nPlease mail me the bug to improve the plugin"); self.screwup("Error",e) return def load_getr_input(self): myworking2 = self.config_settings['work_dir'] myworking = self.getr_outputdir_selection_entry.get() node_name = self.getr_node_selection_entry.get() if len(myworking2) == 0 or len(myworking) == 0 or len(node_name) == 0 or len(self.config_settings['scp_command']) == 0 or len(self.config_settings['queue_command']) == 0: self.screwup("Oops","You failed to provide:\nRemote working directory\nLocal working directory\nNode name\nSCP command\nSSH username") return if self.getr_mol2pdb == 'no': dest = "%s/%s" %(myworking,'output_file.mol2') dest2 = "%s/%s" %(myworking,'output_file.mol2.data') filename = os.path.join(myworking2,'output_file.mol2') filename2 = os.path.join(myworking2,'output_file.mol2.data') else: dest = "%s/%s" %(myworking,'output_file.pdb') dest2 = "%s/%s" %(myworking,'output_file.pdb.data') filename = os.path.join(myworking2,'output_file.pdb') filename2 = os.path.join(myworking2,'output_file.pdb.data') donde_estoy = os.getcwd() try: os.chdir(myworking2) except: self.screwup("Oops","Local working directory is not valid") return command = "\"%s\" \"%s@%s:%s\" . " % (self.config_settings['scp_command'],self.config_settings['queue_command'],node_name,dest) command3 = "\"%s\" \"%s@%s:%s\" . " % (self.config_settings['scp_command'],self.config_settings['queue_command'],node_name,dest2) if not sys.platform.startswith('win'): filename_batch = os.path.join(myworking2,'getVSRS.sh') else: filename_batch = os.path.join(myworking2,'getVSRS.bat') fp_batch = self.fileopen(filename_batch,"w") if not fp_batch: self.screwup("Oops","Cant open file %s" %(filename_batch)) os.chdir(donde_estoy) return fp_batch.write("%s\n" %(command)) fp_batch.write("%s\n" %(command3)) fp_batch.close() try: if not sys.platform.startswith('win'): os.chmod(filename_batch, 0755) except: os.chdir(donde_estoy) self.screwup("Oops","Cant chmod batch file %s" %(filename_batch)) return os.chdir(myworking2) try: bringback = subprocess.Popen(filename_batch, stdout=subprocess.PIPE, shell=True) # This is crap, # but shell prevents OS errors # about file name too long result_scp = bringback.communicate()[0] self.getr_page_log_text.insert('end','Loading results ... %s\n' %(result_scp)) except: os.chdir(donde_estoy) self.screwup("Fatal","Error executing SCP command") return try: cmd.load(filename) self.show_global_grid(filename) # self.show_pijaditas() except: os.chdir(donde_estoy) self.screwup("Fatal","Cant load results. Maybe a remote error?") return os.chdir(donde_estoy) def save_getr_input_file(self): myworking2 = self.config_settings['work_dir'] myworking = self.getr_outputdir_selection_entry.get() node_name = self.getr_node_selection_entry.get() idvs = self.getr_idvs_selection_entry.get() hm = self.getr_howmany_selection_entry.get() sbsof = self.getr_sortbysumof_selection_entry.get() if len(myworking) == 0 or len(myworking2) == 0 or len(node_name) == 0 or len(idvs) == 0 or len(hm) == 0 or len(sbsof) == 0 or len(self.config_settings['scp_command']) == 0 or len(self.config_settings['queue_command']) == 0 or len(self.config_settings['ssh_command']) ==0 : self.screwup("Oops","You failed to provide:\nRemote working directory\nWorking directory\nNode name\nVirtual screening ID\nNumber of results\nClasification criteria\nSCP command\SSH command\nSSH username") return filename = os.path.join(myworking2,'getResults.sh') filename2 = os.path.join(myworking2,'getResultsFromVSConfig.xml') fp = self.fileopen(filename,"wb") if not fp: self.screwup("Oops","Cant open file %s" %(filename)) return fp2 = self.fileopen(filename2,"wb") if not fp2: fp.close() self.screwup("Oops","Cant open file %s" %(filename2)) return local_cmd = "\"%s\" -idVirtualScreening %s -idQuery default -isPDBOutput %s -differentMolecules %s " %(self.config_settings['getResultsFromVS_exe'],idvs,self.getr_mol2pdb, self.getr_different) # Basico if self.getr_mol2pdb == 'no': local_cmd += " -outputFile output_file.mol2" else: local_cmd += " -outputFile output_file.pdb" fp.write("cd \"%s\" %c" %(myworking,10)) if self.getr_mol2pdb == 'no': fp.write("rm -f output_file.mol2.data%c" %(10)) fp.write("rm -f output_file.mol2%c" %(10)) else: fp.write("rm -f output_file.pdb.data%c" %(10)) fp.write("rm -f output_file.pdb%c" %(10)) fp.write("%s%c" %(local_cmd,10)) self.getr_page_log_text.insert('end','#---------------------------------------\n') self.getr_page_log_text.insert('end','# CALLING getResultsFromVS. Cross your fingers!...\n') #dest = os.path.join(myworking,'getResults.sh') donde_estoy = os.getcwd() try: os.chdir(myworking2) except: fp.close() fp2.close() self.screwup("Fatal","Local working directory is not valid") return dest = myworking + "/getResults.sh" #dest2 = os.path.join(myworking,'getResultsFromVSConfig.xml') dest2 = myworking + "/getResultsFromVSConfig.xml" spli1 = os.path.split(filename) spli2 = os.path.split(filename2) command = "\"%s\" \"%s\" \"%s@%s:%s\"" % (self.config_settings['scp_command'],spli1[1],self.config_settings['queue_command'],node_name,dest) command3 = "\"%s\" \"%s\" \"%s@%s:%s\"" % (self.config_settings['scp_command'],spli2[1],self.config_settings['queue_command'],node_name,dest2) command4 = "\"%s\" \"%s@%s\" \"cd %s ; chmod 755 * ; chmod 755 getResults.sh ; %s > run_log\"" %(self.config_settings['ssh_command'],self.config_settings['queue_command'],node_name,myworking,dest) print >>fp2,"" print >>fp2,"\t" print >>fp2,"\t\t%s" %(self.config_settings['mysql_db']) print >>fp2,"\t\t%s" %(self.config_settings['mysql_host']) print >>fp2,"\t\t%s" %(self.config_settings['mysql_user']) print >>fp2,"\t\t%s" %(self.config_settings['mysql_password']) print >>fp2,"\t" print >>fp2,"\tgetResultsFromVS.log" print >>fp2,"\t" print >>fp2,'\t\t\n%s\neulerAnglesAndTransVector.exe\nfromFile\ntoFile\nparametersFile\n \n' % (self.config_settings['eulerAnglesAndTransVector_exe']) print >>fp2,"\t\t" print >>fp2,'\t\t\t' %(hm, sbsof) print >>fp2,'\t' print >>fp2,'' fp2.close() fp.close() if not sys.platform.startswith('win'): filename_batch = os.path.join(myworking2,'getVS.sh') else: filename_batch = os.path.join(myworking2,'getVS.bat') fp_batch = self.fileopen(filename_batch,"w") if not fp_batch: self.screwup("Oops","Can open batch file %s" %(filename_batch)) os.chdir(donde_estoy) return fp_batch.write("%s\n" %(command)) fp_batch.write("%s\n" %(command3)) fp_batch.write("%s\n" %(command4)) fp_batch.close() try: if not sys.platform.startswith('win'): os.chmod(filename_batch, 0755) except: os.chdir(donde_estoy) self.screwup("Oops","Cant chmod file %s" %(filename_batch)) return self.getr_page_log_text.insert('end','That\'s the way: %s\n' %(filename_batch)) try: self.r_getr =running_getresults(myworking2,filename_batch,self.getr_page_log_text,self.status_line) self.r_getr.start() except: os.chdir(donde_estoy) self.screwup("Fatal","Cant run process. Check threading support in tk") return os.chdir(donde_estoy) self.getr_page_log_text.insert('end','I\'m finished here.\nCheck the status of your job in the Status dialog\n' ) self.getr_page_log_text.insert('end','#---------------------------------------\n' ) def save_insert_input_file(self): myworking = self.ins_output_selection_entry.get() smilin = self.insert_smiles.get() dbname = self.db_name_selection_entry.get() numproc = self.numproc_selection_entry.get() node_name = self.ins_node_selection_entry.get() myworking2 = self.config_settings['work_dir'] if len(myworking) == 0 or len(smilin) == 0 or len(dbname) == 0 or len(node_name) == 0 or len(myworking2) == 0: self.screwup("Oops.","You should provide the necessary information to accomplish this task:\nRemote Working directory\nSMILES input file\nDatabase Name\nNode name\nLocal working directory.\n") return if len(self.config_settings['rob_exe']) == 0 or len(self.config_settings['corina_exe']) == 0 or len(self.config_settings['alfa_remote_exe']) == 0 or len(self.config_settings['mopac7_exe']) == 0 or len(self.config_settings['scp_command']) == 0 or len(self.config_settings['queue_command']) == 0 or len(self.config_settings['ssh_command']) == 0: self.screwup("Oops.","You should provide the necessary information to accomplish this task:\n SSH/SCP commands\nCORINA remote exe\nALFA remote exe\nMOPAC7 remote exe\nSSH user information") return #myworking2 = self.work_location.get() filename = os.path.join(myworking2,'temp.smi') fp2 = self.fileopen(smilin,'r') if not fp2: self.screwup("Oops","Can read file %s" %(smilin)) return fp = self.fileopen(filename,"wb") if not fp: fp2.close() self.screwup("Oops","Can read file %s" %(filename)) return try: lst = fp2.readlines() new = [] for line in lst: if line.strip(): new.append(line.strip()) lst = new fp.write("DATABASE_NAME: %s%c" %(dbname,10)) for line in lst: fp.write( '%s%c' % (line,10)) fp.close(); fp2.close(); except: self.screwup("Fatal. Cant add DATABASE_NAME to input file"); return filename3 = os.path.join(myworking2,'runningInsert.sh') filename4 = os.path.join(myworking2,'insertVSDBConfig.xml') fp3 = self.fileopen(filename3,"wb") if not fp3: self.screwup("Oops","Cant open file %s" %(filename3)) return alphabet = 'abcdefghijklmnopqrstuvwxyz' log_name='log_' for x in random.sample(alphabet,random.randint(5,15)): log_name+=x fp3.write("cd \"%s\"%c" %(myworking,10)) fp3.write("\"%s\" -inputFile input.smi -mode 1 -numProcessors %s -outputFolder \"%s\"%c" %(self.config_settings['insertVSDB_exe'],numproc,log_name,10)) fp3.close() self.status_line.configure(text= 'Wrote smiles to %s' % filename) self.insert_page_log_text.insert('end','#---------------------------------------\n') self.insert_page_log_text.insert('end','# CALLING insertVSDB. Here we go!...\n') #dest = os.path.join(myworking,'runningInsert.sh') #dest2 = os.path.join(myworking,'input.smi') #dest3 = os.path.join(myworking,'insertVSDBConfig.xml') dest = "%s/%s" %(myworking,'runningInsert.sh') dest2 = "%s/%s" %(myworking,'input.smi') dest3 = "%s/%s" %(myworking,'insertVSDBConfig.xml') spli1 = os.path.split(filename3) spli2 = os.path.split(filename) spli3 = os.path.split(filename4) command = "\"%s\" \"%s\" \"%s@%s:%s\"" % (self.config_settings['scp_command'],spli1[1],self.config_settings['queue_command'],node_name,dest) command2 = "\"%s\" \"%s\" \"%s@%s:%s\"" % (self.config_settings['scp_command'],spli2[1],self.config_settings['queue_command'],node_name,dest2) command3 = "\"%s\" \"%s\" \"%s@%s:%s\"" % (self.config_settings['scp_command'],spli3[1],self.config_settings['queue_command'],node_name,dest3) command4 = "\"%s\" \"%s@%s\" \"cd %s ; chmod 755 * ; chmod 755 runningInsert.sh ; %s > run_log\"" %(self.config_settings['ssh_command'],self.config_settings['queue_command'],node_name,myworking,dest) if not sys.platform.startswith('win'): filename_batch = os.path.join(myworking2,'sendInsert.sh') else: filename_batch = os.path.join(myworking2,'sendInsert.bat') fp_batch = self.fileopen(filename_batch,"w") if not fp_batch: self.screwup("Oops","Cant open file %s" %(filename_batch)) return fp4 = self.fileopen(filename4,"w") if not fp4: fp_batch.close() self.screwup("Oops","Cant open file %s" %(filename4)) return print >>fp4,"" print >>fp4,"\t" print >>fp4,"\t\t%s" %(self.config_settings['mysql_db']) print >>fp4,"\t\t%s" %(self.config_settings['mysql_host']) print >>fp4,"\t\t%s" %(self.config_settings['mysql_user']) print >>fp4,"\t\t%s" %(self.config_settings['mysql_password']) print >>fp4,"\t" print >>fp4,"\tinsertVSDB.log" print >>fp4,"\t%s" %(self.config_settings['queue_name']) print >>fp4,"\t%s" %(self.config_settings['junk_dir']) print >>fp4,"\t" print >>fp4,'\t\t\n%s\ncorina\n-i t=smiles -o t=mol2 -o nodummies -d stergen -d preserve -d names -d wh -d rc -d rs\ncorinaInputFile\ncorinaOutputFile\ncorina.trc\n\n\n%s\nALFA.exe\n-cutOff 50.0 -howManySelect 200 -maxCombinations 300000\n\n\n%s\nmopac\nfileMopac\n.dat\n.out\nMNDO 1SCF ESP MMOK GEO-OK T=360000 \nmopacWorkingFolder\nmopacOutputScreen\n%s \ninputFileBabel\n\n\n' % (self.config_settings['corina_exe'],self.config_settings['alfa_remote_exe'],self.config_settings['mopac7_exe'],self.config_settings['rob_exe']) fp4.close() fp_batch.write('%s\n' % (command)) fp_batch.write('%s\n' % (command2)) fp_batch.write('%s\n' % (command3)) fp_batch.write('%s\n' % (command4)) self.insert_page_log_text.insert('end','That\'s the way: %s\n' %(filename_batch)) #lista = filename2.split('/') #receptor_ficherillo = lista[ -1 ] #destino = os.path.join(myworking,receptor_ficherillo) #print 'Copiando: %s, %s' %(filename2,destino) #shutil.copy2(filename2, destino) # shutil.copy2(filename2,myworking) fp_batch.close() try: if not sys.platform.startswith('win'): os.chmod(filename_batch, 0755) except: self.screwup("Oops","Cant chmod batch file %s" %(filename_batch)) return try: self.r4 =running_insert(myworking2,filename_batch,self.insert_page_log_text,self.status_line) self.r4.start() except: self.screwup("Fatal","Cant execute process. Please check you have threading support in tk") self.insert_page_log_text.insert('end','I\'m finished here.\nCheck the status of your job in the Status dialog\n' ) self.insert_page_log_text.insert('end','#---------------------------------------\n' ) def save_mopac_input_file(self): myworking = self.config_settings['work_dir'] mopac_donde = self.config_settings['lmopac7_exe'] inputf = self.mopac_inputfile_selection_entry.get() outputf = self.mopac_outputfile_selection_entry.get() fp = self.fileopen(inputf,"r") if not fp: self.screwup("Oops","Cant open file %s" %(inputf)) return fp2 = self.fileopen(outputf,"w") if not fp2: fp.close() self.screwup("Oops","Cant open file %s" %(outputf)) return ftemp = os.path.join(myworking,'temp.dat') salida = os.path.join(myworking,'temp.dat.arc') lst = fp.readlines() new = [] for line in lst: if line.strip(): new.append(line.strip()) lst = new new_flag = 0 atoms_flag = 0 atoms_list = [] try: self._page_log_text.insert('end',"Reading MOL2 file\n") self.mopac_page_log_text.yview('moveto',1.0) for line in lst: if line == '@BOND': atoms_flag = 0 fp3.close() # Call MOPAC and the things if not sys.platform.startswith('win'): u = "temp" else: u = "temp.dat" command = "%s %s" %(mopac_donde, u) os.chdir(myworking) self.mopac_page_log_text.insert('end',"Calling MOPAC 7\n") self.mopac_page_log_text.yview('moveto',1.0) p1 = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True) result = p1.communicate()[0] if not sys.platform.startswith('win'): arco = "temp.arc" else: arco = "temp.dat.arc" fp5 = self.fileopen(arco,"r") lst2 = fp5.readlines() new2 = [] for line2 in lst2: if line.strip(): new2.append(line2.strip()) lst2 = new2 flag_1 = 0 charges = [] for myl in lst2: if flag_1 > 0: flag_1 = flag_1 + 1 if myl.rfind("CHARGE") > 0: flag_1 = 1 if flag_1 > 3: try: charges.append(myl.split()[-1]) except: charges.append("0.0000") pass fp5.close() my_ind = 1 for atomu in atom_list: spl = atomu.strip().split() rd = 1.0 if spl[2] == 'C': rd = 1.91 elif spl[2] == 'H': rd = 1.49 elif spl[2] == 'O': rd = 1.66 elif spl[2] == 'N': rd = 1.82 elif spl[2] == 'P': rd = 2.1 elif spl[2] == 'S': rd = 2.0 elif spl[2] == 'F': rd = 1.50 elif spl[2] == 'Cl': rd = 1.95 elif spl[2] == 'Br': rd = 2.22 elif spl[2] == 'I': rd = 2.35 print >>fp2,"%s %1.2f %7s" %(atomu,rd,charges[my_ind]) my_ind = my_ind + 1 print >>fp2,"TER" if atoms_flag == 1: #print line mis_cosas = line.split() atomillo = mis_cosas[5].split('.') atomillo_x = float(mis_cosas[2]) atomillo_y = float(mis_cosas[3]) atomillo_z = float(mis_cosas[4]) if atomillo[0] == 'Cl' or atomillo[0] == 'Br' : cadena = 'ATOM 1 %s LIG 0 %8.3f%8.3f%8.3f ' % (atomillo[0], atomillo_x, atomillo_y, atomillo_z) else: cadena = 'ATOM 1 %s LIG 0 %8.3f%8.3f%8.3f ' % (atomillo[0], atomillo_x, atomillo_y, atomillo_z) atom_list.append(cadena) print >>fp3,'%s %f 1 %f 1 %f 1' % (atomillo[0], atomillo_x, atomillo_y, atomillo_z) if line == '@MOLECULE' : atom_list = [] atoms_flag = 0 fp3 = self.fileopen(ftemp,"w") print >> fp3,"AM1 1SCF PRECISE\n\n" elif line == '@ATOM': atoms_flag = 1 except: self.screwup("Fatal","Cant convert and assign charges to this MOL2 files") return fp.close() fp2.close() self.mopac_page_log_text.insert('end',"OK. PDB generated\n") self.mopac_page_log_text.yview('moveto',1.0) def save_alfa_input_file(self): myworking = self.config_settings['work_dir'] mopac_donde = self.config_settings['lmopac7_exe'] inputf = self.input_alfa.get() outputf = self.alfa_outputfile_selection_entry.get() self.alfa_page_log_text.insert('end','#---------------------------------------\n') self.alfa_page_log_text.insert('end','Setting up ligand\n') if self.alfaout_opt == 'yes': self.alfa_page_log_text.insert('end','# CALLING ALFA. PLEASE BE PATIENT...\n') alfa_donde = self.config_settings['alfa_exe'] ref = self.ref_alfa.get() cutoff = self.alfa_cutoff_selection_entry.get() howmany = self.alfa_howmany_selection_entry.get() maxcombinations = self.alfa_maxcombinations_selection_entry.get() addrules = self.alfa_add_rules.get() userules = self.alfa_use_rules.get() #oeee = self.oe_location.get() oeee = self.config_settings['oe_licence'] if len(myworking) == 0 or len(self.config_settings['alfa_exe']) == 0 or len(inputf) == 0 or len(cutoff) == 0 or len(howmany) == 0 or len(maxcombinations) == 0 or len(oeee) == 0: self.screwup("Oops","You failed to provide one or more of the following requirements:\nWorking directory\nALFA executable path\nInput file\nCut off\nHow many\nMax combinations\OpenEye license path") return command = "\"%s\" -inputFile \"%s\" -howManySelect %s -cutOff %s -maxCombinations %s -outputFile \"alfa_output\" -outputType mol2" % (alfa_donde,inputf,howmany,cutoff,maxcombinations) if len(ref) != 0: command += " -referenceFile %s -useInputInRMSD %s" %(ref, self.alfarmsd_opt) if len(addrules) != 0: command += ' -addRulesFile %s' % (addrules) if len(userules) != 0: command += ' -useRulesFile %s' % (userules) if not sys.platform.startswith('win'): filename = os.path.join(myworking,'runningALFA.sh') else: filename = os.path.join(myworking,'runningALFA.bat') fp = self.fileopen(filename,"w") if not fp: self.screwup("Oops","Cant open file %s" %(filename)) return if sys.platform.startswith('win'): print >>fp, 'set OE_LICENSE=%s' %(oeee) else: print >>fp, 'export OE_LICENSE=%s' %(oeee) print >>fp, '%s' % (command) fp.close() try: if not sys.platform.startswith('win'): os.chmod(filename, 0755) except: self.screwup("Fatal","Cant chmod batch file %s" %(filename)) return self.alfa_page_log_text.insert('end',"Batch: %s\n" % command) self.alfa_page_log_text.yview('moveto',1.0) self.status_line.configure(text="Running ALFA. PLEASE BE PATIENT") try: donde_estoy = os.getcwd() os.chdir(myworking) p1 = subprocess.Popen(filename, stdout=subprocess.PIPE, shell=True) # This is crap, # but shell prevents OS errors # about file name too long result = p1.communicate()[0] self.alfa_page_log_text.insert('end',"%s" % result) self.alfa_page_log_text.yview('moveto',1.0) os.chdir(donde_estoy) self.status_line.configure(text="--------- ALFA END -------------") except: self.screwup("Fatal","Cant run ALFA\nPlease check you have threading support in tk") return if self.alfaout_opt == 'yes': inputf = os.path.join(myworking,"alfa_output.mol2") print inputf fp = self.fileopen(inputf,"r") if not fp: self.screwup("Oops","Cant open file %s" %(inputf)) return fp2 = self.fileopen(outputf,"w") if not fp2: fp.close() self.screwup("Oops","Cant open file %s" %(outputf)) return newappend = " CHARGE=%s %s" %(self.mopac_globalcharge_selection_entry.get(), self.mopac_append_selection_entry.get()) self.rmulti = running_alfa(myworking,mopac_donde, self.alfa_page_log_text, fp, fp2, self.mopac_alln,self.mopac_method, newappend) self.rmulti.start() def stop_alfa(self): try: self.rmulti.stop() except: self.screwup("Fatal","Cant stop the process.\n\n") return def save_delphi_input(self): now = datetime.datetime.now() new_dir = "delphi_%s" %(now.strftime("%Y_%m_%d_%H%M%S")) myoldworking = self.config_settings['work_dir'] # if len(myoldworking) == 0 or len(self.config_settings['delphi_exe']) == 0: # self.screwup("Oops","You have to provide a working directory") # return myworking = os.path.join(myoldworking,new_dir) try: os.makedirs(myworking) except OSError: self.screwup("Fatal","Can not create a new directory for Delphi: %s" %(myworking)) return filename = os.path.join(myworking,'fort.10') fp = self.fileopen(filename,"w") if not fp: self.screwup("Oops","Cant open file %s" %(filename)) return crg_file = self.delphi_crg_entry.get().strip() siz_file = self.delphi_siz_entry.get().strip() do_crg_flag = 0 do_siz_flag = 0 try: perfil = self.delphi_perfil.get().strip() scale = float(self.delphi_scale.get().strip()) print >>fp,"scale=%f" %( 1.0/scale ) print >>fp,"perfil=%s" %( perfil ) exdi = float(self.delphi_exdi.get()) if exdi <= 0: self.screwup("Fatal","Error parsing external dielectric = 0") else: print >>fp,"exdi=%f" %(exdi) prbrad = float(self.delphi_solv_rat.get()) if prbrad <= 0: self.screwup("Fatal","Error parsing probe radius") else: print >>fp,"prbrad=%f" %(prbrad) ionrad = float(self.delphi_ion_rat.get()) if ionrad > 0: print >>fp,"ionrad=%f" %(ionrad) salt = float(self.delphi_salt.get()) if salt > 0: print >>fp,"salt=%f" %(salt) if( self.delphi_bndcon_val == 'Zero potential'): print >>fp,"bndcon=1" elif ( self.delphi_bndcon_val == 'Dipolar'): print >>fp,"bndcon=2" elif ( self.delphi_bndcon_val == 'Focusing'): print >>fp,"bndcon=3" elif ( self.delphi_bndcon_val == 'Coulombic'): print >>fp,"bndcon=4" linit = int(self.delphi_linit.get()) if linit > 0: print >>fp,"linit=%i" %(linit) nonit = int(self.delphi_nonit.get()) if nonit > 0: print >>fp,"nonit=%i" %(nonit) except: self.screwup("Fatal","Can not read input data") return if len(crg_file.strip()) == 0: do_drg_flag = 1 if len(siz_file.strip()) == 0: do_siz_flag = 1 print >>fp,"in(pdb,file=\"%s\")" %(self.delphi_pdb_entry.get()) if( len(siz_file) != 0): print >>fp,"in(siz,file=\"%s\")" %(siz_file) if( len(crg_file) != 0): print >>fp,"in(crg,file=\"%s\")" %(crg_file) if( len(self.delphi_pqr_entry.get().strip()) != 0): print >>fp,"out(pqr,file=\"%s\")" %(self.delphi_pqr_entry.get()) print >>fp,"out(phi,file=\"%s\")" %(self.delphi_phi_entry.get()) indi = 0 try: indi = float(self.delphi_indi.get()) if indi <= 0: self.screwup("Fatal","Error parsing internal dielectric = 0") else: print >>fp,"indi=%f" %(indi) except: self.screwup("Fatal","Error parsing internal dielectric") fp.close() delphi_whereis = self.config_settings['delphi_exe'] command = "%s" %(delphi_whereis) # self.pg_delphi_average_page_log_text.insert('end',"Batch: %s\n" % command) self.pg_delphi_average_page_log_text.yview('moveto',1.0) # try: self.r =running_delphi(myworking,command,self.pg_delphi_average_page_log_text) self.r.start() except: self.screwup("Fatal","Big error here. Can not run the program.\nPlease check you have threading support in tk") return def save_gfusion_input_diff (self): now = datetime.datetime.now() new_dir = "gfusion_%s" %(now.strftime("%Y_%m_%d_%H%M%S")) myoldworking = self.config_settings['work_dir'] if len(myoldworking) == 0 or len(self.config_settings['gfusion_exe']) == 0: self.screwup("Oops","You have to provide a working directory") return myworking = os.path.join(myoldworking,new_dir) try: os.makedirs(myworking) except OSError: self.screwup("Fatal","Can not create a new directory for CGRID: %s" %(myworking)) return filename = os.path.join(myworking,'gfusion.in') fp = self.fileopen(filename,"w") if not fp: self.screwup("Oops","Cant open file %s" %(filename)) return print >>fp, self.grid_target_entry.get() print >>fp, self.grid_ref_entry.get() print >>fp,"" fp.close() # Now call gfusion in the working dir gfusion_donde = self.config_settings['gfusion_exe'] command = "%s -inputfile gfusion.in -diff " %(gfusion_donde) self.pg_diff_average_page_log_text.insert('end',"Batch: %s\n" % command) self.pg_diff_average_page_log_text.yview('moveto',1.0) try: self.r =running_gfusion(myworking,command,self.pg_diff_average_page_log_text) self.r.start() except: self.screwup("Fatal","Big error here. Can not run the program.\nPlease check you have threading support in tk") return def save_gfusion_input (self): now = datetime.datetime.now() new_dir = "gfusion_%s" %(now.strftime("%Y_%m_%d_%H%M%S")) myoldworking = self.config_settings['work_dir'] if len(myoldworking) == 0 or len(self.config_settings['gfusion_exe']) == 0: self.screwup("Oops","You have to provide a working directory") return myworking = os.path.join(myoldworking,new_dir) try: os.makedirs(myworking) except OSError: self.screwup("Fatal","Can not create a new directory for CGRID: %s" %(myworking)) return filename = os.path.join(myworking,'gfusion.in') fp = self.fileopen(filename,"w") if not fp: self.screwup("Oops","Cant open file %s" %(filename)) return for el in self.my_grid_lista: print >>fp,el print >>fp,"" fp.close() # Now call gfusion in the working dir gfusion_donde = self.config_settings['gfusion_exe'] command = "%s -inputfile gfusion.in" %(gfusion_donde) self.pg_page_average_page_log_text.insert('end',"Batch: %s\n" % command) self.pg_page_average_page_log_text.yview('moveto',1.0) try: self.r =running_gfusion(myworking,command,self.pg_page_average_page_log_text) self.r.start() except: self.screwup("Fatal","Big error here. Can not run the program.\nPlease check you have threading support in tk") return def save_cgrid_input_file(self): now = datetime.datetime.now() new_dir = "cgrid_%s" %(now.strftime("%Y_%m_%d_%H%M%S")) el_stuff = self.el_file_location.get() #myoldworking = self.work_location.get() myoldworking = self.config_settings['work_dir'] if len(myoldworking) == 0 or len(self.config_settings['cgrid_exe']) == 0: self.screwup("Oops","You have to provide a working directory") return myworking = os.path.join(myoldworking,new_dir) try: os.makedirs(myworking) except OSError: self.screwup("Fatal","Can not create a new directory for CGRID: %s" %(myworking)) return filename2 = self.gpf_file_location.get() fp2 = self.fileopen(filename2,'r') filename = os.path.join(myworking,'temp.pdb') fp = self.fileopen(filename,"w") if not fp: self.screwup("Oops","Cant open file %s" %(filename)) return if not fp2: fp.close() self.screwp("Oops","Cant open file %s" %(filename2)) return #try: lst = fp2.readlines() new = [] for line in lst: if line.strip(): if line.find("ATOM") >= 0 or line.find("HETATM") >= 0: new.append(line.strip()) if line[17:20] == 'HIS': self.screwup("Oops","I have detected that some residues are misconfigured (Histidines),\n" \ " please check your receptor PDB and change HIS residues by HID, HIE or HIP") return lst = new swap_cl = 0 da_selection = self.cgrid_inv_checkbutton.getcurselection() for cosa in da_selection: if cosa == 'Swap charges/radii columns': self.cgrid_page_log_text.insert('end','Swaping charges-radii columns\n') swap_cl = 1 for line in lst: mis_cosas = line.split() if float(mis_cosas[-2]) < 0 and swap_cl == 0: swap_cl = 1 self.cgrid_page_log_text.insert('end','Negative radius detected. Automatically swaping charges-radii columns\n') for line in lst: if swap_cl == 0: print >>fp, '%s' % (line) else: last_flag = 0 mis_cosas = line.split() try: if float(mis_cosas[-1]) != 0.0: last_flag = 0 except: last_flag = 1 pass if last_flag != 0: print "%s %s" %(mis_cosas[-2], mis_cosas[-3]) if float(mis_cosas[8]) >= 0: cadena = '%s %1.2f %1.4f' % (line[0:54], float(mis_cosas[-2]),float(mis_cosas[-3])) else: cadena = '%s %1.2f %1.4f' % (line[0:54], float(mis_cosas[-2]),float(mis_cosas[-3])) else: print "%s %s" %(mis_cosas[-1], mis_cosas[-2]) if float(mis_cosas[8]) >= 0: cadena = '%s %1.2f %1.4f' % (line[0:54], float(mis_cosas[-1]),float(mis_cosas[-2])) else: cadena = '%s %1.2f %1.4f' % (line[0:54], float(mis_cosas[-1]),float(mis_cosas[-2])) print cadena print >>fp, '%s' %(cadena) print >>fp, 'TER' #except: # self.screwup("Fatal","Error reading receptor file. Verify format and charges/radii") # return self.status_line.configure(text= 'Reading PDB RECEPTOR from %s' % filename2) try: x = float(self.grid_center[0].get()) y = float(self.grid_center[1].get()) z = float(self.grid_center[2].get()) xpts = int(self.n_points_X.get()) ypts = int(self.n_points_Y.get()) zpts = int(self.n_points_Z.get()) spacing = float(grid_spacing.get()) print "Center: %f %f %f" %(x,y,z) print "Points: %i %i %i" %(xpts,ypts,zpts) size = [xpts*spacing, ypts*spacing, zpts*spacing] xmax = x + size[0]/2. xmin = x - size[0]/2. ymax = y + size[1]/2. ymin = y - size[1]/2. zmax = z + size[2]/2. zmin = z - size[2]/2. box_edge_x = [xmin,xmax] box_edge_y = [ymin,ymax] box_edge_z = [zmin,zmax] print "Dimensions: %f %f %f" %(size[0]/2,size[1]/2,size[2]/2) print "Max: %f %f %f" %(xmax,ymax,zmax) print "Min: %f %f %f" %(xmin,ymin,zmin) except: self.screwup("Fatal","Error calculating grid size") return if float(grid_bigbox.get()) > 0.0: print >>fp, 'ATOM 0001 D1 LIG A 001 %8.3f%8.3f%8.3f' % (x,y,z) else: print >>fp, 'ATOM 0001 D1 LIG A 001 %8.3f%8.3f%8.3f' % (x,y,z) print >>fp, 'ATOM 0002 D1 LIG A 001 %8.3f%8.3f%8.3f' % ( xmax,ymax,zmax ) print >>fp, 'ATOM 0003 D1 LIG A 001 %8.3f%8.3f%8.3f' % ( xmax,ymax,zmin ) print >>fp, 'ATOM 0004 D1 LIG A 001 %8.3f%8.3f%8.3f' % ( xmax,ymin,zmax ) print >>fp, 'ATOM 0005 D1 LIG A 001 %8.3f%8.3f%8.3f' % ( xmax,ymin,zmin ) print >>fp, 'ATOM 0006 D1 LIG A 001 %8.3f%8.3f%8.3f' % ( xmin,ymax,zmin ) print >>fp, 'ATOM 0007 D1 LIG A 001 %8.3f%8.3f%8.3f' % ( xmin,ymax,zmax ) print >>fp, 'ATOM 0008 D1 LIG A 001 %8.3f%8.3f%8.3f' % ( xmin,ymin,zmin ) print >>fp, 'ATOM 0009 D1 LIG A 001 %8.3f%8.3f%8.3f' % ( xmin,ymin,zmax ) print >>fp, 'TER' print >>fp, 'END' fp.close(); fp2.close(); self.status_line.configure(text= 'Wrote system & box info to %s' % filename) self.cgrid_page_log_text.insert('end','#---------------------------------------\n') self.cgrid_page_log_text.insert('end','# CALLING CGRID. PLEASE BE PATIENT...\n') #donde_estoy = os.getcwd() #os.chdir(tmp_dir) #cgrid_donde = self.cgrid_location.get() cgrid_donde = self.config_settings['cgrid_exe'] command = "\"%s\"" % (cgrid_donde) if( len(el_stuff) != 0): try: shutil.copy2(el_stuff,myworking) except: pass newel_stuff = os.path.split(el_stuff)[1] command = "\"%s\" -modresfile \"%s\" " %(cgrid_donde, newel_stuff) if self.v_pot == 9: command = "%s -soft" % (command) self.cgrid_page_log_text.insert('end',"Batch: %s\n" % command) self.cgrid_page_log_text.yview('moveto',1.0) self.status_line.configure(text="Running CGRID. PLEASE BE PATIENT") #lista = filename2.split('/') #receptor_ficherillo = lista[ -1 ] #destino = os.path.join(myworking,receptor_ficherillo) #print 'Copiando: %s, %s' %(filename2,destino) #shutil.copy2(filename2, destino) try: shutil.copy2(filename2,myworking) except: pass try: self.r =running_cgrid(myworking,command,self.cgrid_page_log_text,self.status_line) self.r.start() except: self.screwup("Fatal","Big error here. Can not run the program.\nPlease check you have threading support in tk") return #p = Process(target=run_cgrid, args=(self,)) #p.start() #p_pid = p.getPid() #self.subpid.set(p_pid) #self.cgrid_page_log_text.insert('end',"%s" % result) #self.cgrid_page_log_text.yview('moveto',1.0) #os.chdir(donde_estoy) #self.status_line.configure(text="--------- CGRID END -------------") def show_crisscross(self): center = [float(self.grid_center[0].get()), float(self.grid_center[1].get()), float(self.grid_center[2].get()) ] cmd.delete("grid_center") self.crisscross(center[0], center[1], center[2], 0.5, "grid_center") def crisscross(self,x,y,z,d,name="crisscross"): obj = [ LINEWIDTH, 3, BEGIN, LINE_STRIP, VERTEX, float(x-d), float(y), float(z), VERTEX, float(x+d), float(y), float(z), END, BEGIN, LINE_STRIP, VERTEX, float(x), float(y-d), float(z), VERTEX, float(x), float(y+d), float(z), END, BEGIN, LINE_STRIP, VERTEX, float(x), float(y), float(z-d), VERTEX, float(x), float(y), float(z+d), END ] view = cmd.get_view() cmd.load_cgo(obj,name) cmd.set_view(view) def calculate_box(self): x = float(self.grid_center[0].get()) y = float(self.grid_center[1].get()) z = float(self.grid_center[2].get()) xpts = int(self.n_points_X.get()) ypts = int(self.n_points_Y.get()) zpts = int(self.n_points_Z.get()) spacing = float(grid_spacing.get()) cylinder_size = float(self.box_display_cylinder_size.get()) if float(grid_bigbox.get()) > 0.0: size = [float(grid_bigbox.get()) * 2, float(grid_bigbox.get()) *2 , float(grid_bigbox.get()) *2] else: size = [xpts*spacing, ypts*spacing, zpts*spacing] xmax = x + size[0]/2. xmin = x - size[0]/2. ymax = y + size[1]/2. ymin = y - size[1]/2. zmax = z + size[2]/2. zmin = z - size[2]/2. box_edge_x = [xmin,xmax] box_edge_y = [ymin,ymax] box_edge_z = [zmin,zmax] self.box_coords = [box_edge_x,box_edge_y,box_edge_z] cmd.delete('box') if self.box_display_mode.get()==BOX_AS_BOX: self.display_box(self.box_coords,cylinder_size) elif self.box_display_mode.get()==BOX_AS_WIREBOX: self.display_wire_box(self.box_coords) self.box_is_on_display = True def display_box(self, box, cylinder_size): view = cmd.get_view() name = "box" obj = [] # build cgo object color = self.box_color for i in range(2): for k in range (2): for j in range(2): if i != 1: obj.append(CYLINDER) obj.extend([box[0][i],box[1][j],box[2][k]]) obj.extend([box[0][i+1],box[1][j],box[2][k]]) obj.append(cylinder_size) obj.extend(color) obj.extend(color) obj.append(COLOR) obj.extend(color) obj.append(SPHERE) obj.extend([box[0][i],box[1][j],box[2][k],cylinder_size]) if j != 1: obj.append(CYLINDER) obj.extend([box[0][i],box[1][j],box[2][k]]) obj.extend([box[0][i],box[1][j+1],box[2][k]]) obj.append(cylinder_size) obj.extend(color) obj.extend(color) obj.append(COLOR) obj.extend(color) obj.append(SPHERE) obj.extend([box[0][i],box[1][j+1],box[2][k],cylinder_size]) if k != 1: obj.append(CYLINDER) obj.extend([box[0][i],box[1][j],box[2][k]]) obj.extend([box[0][i],box[1][j],box[2][k+1]]) obj.append(cylinder_size) obj.extend(color) obj.extend(color) obj.append(COLOR) obj.extend(color) obj.append(SPHERE) obj.extend([box[0][i],box[1][j],box[2][k+1],cylinder_size]) axes = [[2.0,0.0,0.0],[0.0,2.0,0.0],[0.0,0.0,2.0]] xpos = [box[0][1]+(box[0][1]-box[0][0])/5.,box[1][0],box[2][0]] cyl_text(obj,plain,xpos,'X',0.10,axes=axes) ypos = [box[0][0],box[1][1]+(box[1][1]-box[1][0])/5,box[2][0]] cyl_text(obj,plain,ypos,'Y',0.10,axes=axes) zpos = [box[0][0],box[1][0],box[2][1]+(box[2][1]-box[2][0])/5] cyl_text(obj,plain,zpos,'Z',0.10,axes=axes) cmd.load_cgo(obj,name) cmd.set_view(view) def display_wire_box(self, box): cmd.delete("wirebox") color = self.box_color view = cmd.get_view() spacing = float(self.box_display_mesh_grid.get()) lwidth = float(self.box_display_line_width.get()) xpts = int(round((box[0][1]-box[0][0])/spacing))+1 ypts = int(round((box[1][1]-box[1][0])/spacing))+1 zpts = int(round((box[2][1]-box[2][0])/spacing))+1 obj = [] for i in range(xpts): for k in range (ypts): obj.append(BEGIN) obj.append(LINE_STRIP) obj.append(COLOR) obj.extend(color) for j in range(zpts): obj.append(VERTEX) obj.extend([box[0][0]+spacing*i,box[1][0]+spacing*k,\ box[2][0]+spacing*j]) obj.append(END) for i in range(xpts): for j in range (zpts): obj.append(BEGIN) obj.append(LINE_STRIP) obj.append(COLOR) obj.extend(color) for k in range(ypts): obj.append(VERTEX) obj.extend([box[0][0]+spacing*i,box[1][0]+spacing*k,\ box[2][0]+spacing*j]) obj.append(END) for j in range(zpts): for i in range (xpts): obj.append(BEGIN) obj.append(LINE_STRIP) obj.append(COLOR) obj.extend(color) for k in range(ypts): obj.append(VERTEX) obj.extend([box[0][0]+spacing*i,box[1][0]+spacing*k,\ box[2][0]+spacing*j]) obj.append(END) for j in range(zpts): for k in range (ypts): obj.append(BEGIN) obj.append(LINE_STRIP) obj.append(COLOR) obj.extend(color) for i in range(xpts): obj.append(VERTEX) obj.extend([box[0][0]+spacing*i,box[1][0]+spacing*k,\ box[2][0]+spacing*j]) obj.append(END) cmd.load_cgo(obj,"wirebox") cmd.set("cgo_line_width",lwidth) cmd.set_view(view) #--------------------------------------------------------------------- # config functions def set_md_lig_path(self, filename): self.md_ligand_location.setvalue(filename) def set_md_prot_path(self, filename): self.md_prot_location.setvalue(filename) def set_rep_smi_path(self,filename): self.rep_smiles_location.setvalue(filename) def set_je_explorer_top_location(self, filename): self.je_explorer_top_location.setvalue(filename) def set_rep_working_path(self, filename): self.rep_working_location.setvalue(filename) def set_gfps_working_path(self, filename): self.gfps_working_location.setvalue(filename) self.gfps_working.set(filename) def set_gfps_path(self, filename): self.gfps_smiles_location.setvalue(filename) self.gfps_smiles.set(filename) def set_pre3d_path(self, filename): self.pre_3d_location.setvalue(filename) def set_adv_pre3d_path(self, filename): self.pre_adv_3d_location.setvalue(filename) def set_preids_path(self, filename): self.pre_ids_location.setvalue(filename) def set_3d_preids_path(self, filename): self.pre_3d_ids_location.setvalue(filename) def set_adv_preids_path(self, filename): self.pre_adv_ids_location.setvalue(filename) def set_adv_presmiles_path(self, filename): self.pre_adv_smiles_location.setvalue(filename) def set_ifps_path(self, filename): self.ifps_ids_location.setvalue(filename) def set_ifps_working_path(self, filename): self.ifps_workdir_location.setvalue(filename) def set_oe_path(self, filename): self.oe_location.setvalue(filename) self.oe_licence.set(filename) self.config_settings['oe_licence'] = filename def set_mopac_path(self,filename): self.mopac7_location.setvalue(filename) self.config_settings['lmopac7_exe'] = filename def set_alfa_path(self, filename): self.alfa_location.setvalue(filename) self.alfa_exe.set(filename) self.config_settings['alfa_exe'] = filename def set_cgrid_path(self, filename): self.cgrid_location.setvalue(filename) self.cgrid_exe.set(filename) self.config_settings['cgrid_exe'] = filename def set_gfusion_path(self, filename): self.gfusion_location.setvalue(filename) self.gfusion_exe.set(filename) self.config_settings['gfusion_exe'] = filename def set_amberhome_path(self, filename): self.amberhome_location.setvalue(filename) self.config_settings['amberhome'] = filename def set_delphi_path(self, filename): self.delphi_location.setvalue(filename) self.config_settings['delphi_exe'] = filename def set_prep_path(self, filename): self.prep_location.setvalue(filename) self.rep_exe.set(filename) self.config_settings['rep_exe'] = filename def set_gtp_path( self, filename): self.gtp_location.setvalue(filename) self.gtp_exe.set(filename) self.config_settings['gtp_exe'] = filename def set_oblocal_path(self,filename): self.oblocal_location.setvalue(filename) self.config_settings['ob_exe'] = filename def set_cdock_path(self, filename): self.cdock_location.setvalue(filename) self.cdock_exe.set(filename) self.config_settings['cdock_exe'] = filename def set_work_dir(self, dirname): self.work_location.setvalue(dirname) self.work_dir.set(dirname) self.config_settings['work_dir'] = dirname def read_plugin_config_file(self): config_file_name = os.path.join(tmp_dir,"pymol_vsdmip_plugin.conf") self.config_settings = {} self.config_settings['alfa_exe'] = '' self.config_settings['lmopac7_exe'] = '' self.config_settings['oe_licence'] = '' self.config_settings['cgrid_exe'] = '' self.config_settings['gfusion_exe'] = '' self.config_settings['cdock_exe'] = '' self.config_settings['gtp_exe'] = '' self.config_settings['rep_exe'] = '' self.config_settings['amberhome'] = '' self.config_settings['work_dir'] = '' self.config_settings['ssh_command'] = '' self.config_settings['scp_command'] = '' self.config_settings['queue_name'] = '' self.config_settings['queue_command'] = '' self.config_settings['queue_status'] = '' self.config_settings['mysql_host'] = '' self.config_settings['rwork_dir'] = '' self.config_settings['rnode'] = '' self.config_settings['mysql_port'] = '' self.config_settings['mysql_user'] = '' self.config_settings['mysql_password'] = '' self.config_settings['mysql_db'] = '' self.config_settings['insertVSDB_exe'] = '' self.config_settings['runCDOCK_exe'] = '' self.config_settings['runGTP_exe'] = '' self.config_settings['rcdock_exe'] = '' self.config_settings['rgtp_exe'] = '' self.config_settings['eulerAnglesAndTransVector_exe'] = '' self.config_settings['getResultsFromVS_exe'] = '' self.config_settings['alfa_remote_exe'] = '' self.config_settings['corina_exe'] = '' self.config_settings['mopac7_exe'] = '' self.config_settings['junk_dir'] = '' self.config_settings['ob_exe'] = '' self.config_settings['rob_exe'] = '' self.config_settings['use_home'] = 'no' self.config_settings['delphi_exe'] = '' if os.path.isfile(config_file_name): self.status_line.configure(text = 'Reading configuration file: %s' % config_file_name) lst = self.fileopen(config_file_name,'r').readlines() for line in lst: if line[0]!='#': entr = line.split('=') self.config_settings[entr[0].strip()] = entr[1].strip() self.alfa_exe.set(self.config_settings['alfa_exe']) self.oe_licence.set(self.config_settings['oe_licence']) self.cgrid_exe.set(self.config_settings['cgrid_exe']) self.gfusion_exe.set(self.config_settings['gfusion_exe']) self.cdock_exe.set(self.config_settings['cdock_exe']) self.work_dir.set(self.config_settings['work_dir']) self.gtp_exe.set(self.config_settings['gtp_exe']) self.rep_exe.set(self.config_settings['rep_exe']) if self.config_settings['use_home'] == 'yes': self.work_dir.set(os.getcwd()) self.config_settings['work_dir'] = os.getcwd() else: self.status_line.configure(text = 'Configuration file not found') return self.config_settings def save_plugin_config_file(self): self.config_settings['ob_exe'] = self.oblocal_location.get() self.config_settings['amberhome'] = self.amberhome_location.get() self.config_settings['lmopac7_exe'] = self.mopac7_location.get() self.config_settings['alfa_exe'] = self.alfa_location.get() self.config_settings['oe_licence'] = self.oe_location.get() self.config_settings['cgrid_exe'] = self.cgrid_location.get() self.config_settings['gfusion_exe'] = self.gfusion_location.get() self.config_settings['cdock_exe'] = self.cdock_location.get() self.config_settings['work_dir'] = self.work_location.get() self.config_settings['gtp_exe'] = self.gtp_location.get() self.config_settings['rep_exe'] = self.prep_location.get() self.config_settings['delphi_exe'] = self.delphi_location.get() if self.config_settings['use_home'] == 'yes': self.work_dir.set(os.getcwd()) self.config_settings['work_dir'] = os.getcwd() self.config_settings['use_home'] = 'no' da_home_selection = self.home_checkbutton.getcurselection() for cosa in da_home_selection: if cosa == 'Ignore working dir and use current dir': self.config_settings['use_home'] = 'yes' if not sys.platform.startswith('win'): home2 = os.environ.get('HOME') else: home2 = os.environ.get('PYMOL_PATH') tmp_dir2 = os.path.join(home2,'.VSDMIPplugin') config_file_name = os.path.join(tmp_dir2,"pymol_vsdmip_plugin.conf") fp = self.fileopen(config_file_name,'w') if not fp: self.screwup("Fatal","Cant open config file %s" %(config_file_name)) return # print >>fp, '#========================================' # print >>fp, '# Thionfiguration file' for key, val in self.config_settings.items(): print >>fp, key, '=', val fp.close() self.status_line.configure(text = 'Wrote configuration file %s' % config_file_name) def save_plugin_config_file2(self): self.config_settings['ssh_command'] = self.ssh_command_entry.get() self.config_settings['scp_command'] = self.scp_command_entry.get() self.config_settings['queue_name'] = self.queue_selection_entry.get() self.config_settings['queue_command'] = self.queue_command_selection_entry.get() self.config_settings['queue_status'] = self.queue_stat_selection_entry.get() self.config_settings['mysql_host'] = self.mysql_host_selection_entry.get() self.config_settings['rwork_dir'] = self.defremote_selection_entry.get() self.config_settings['rnode'] = self.defhead_selection_entry.get() self.config_settings['mysql_port'] = self.mysql_port_selection_entry.get() self.config_settings['mysql_user'] = self.mysql_user_selection_entry.get() self.config_settings['mysql_password'] = self.mysql_password_selection_entry.get() self.config_settings['mysql_db'] = self.mysql_db_selection_entry.get() self.config_settings['insertVSDB_exe'] = self.insertcommand_selection_entry.get() self.config_settings['runCDOCK_exe'] = self.runcdockcommand_selection_entry.get() self.config_settings['runGTP_exe'] = self.rungtpcommand_selection_entry.get() self.config_settings['rcdock_exe'] = self.rcdockcommand_selection_entry.get() self.config_settings['rgtp_exe'] = self.rgtpcommand_selection_entry.get() self.config_settings['eulerAnglesAndTransVector_exe'] = self.euler_command_selection_entry.get() self.config_settings['getResultsFromVS_exe'] = self.getresultscommand_selection_entry.get() self.config_settings['alfa_remote_exe'] = self.alfa_remotecommand_selection_entry.get() self.config_settings['corina_exe'] = self.corina_command_selection_entry.get() self.config_settings['mopac7_exe'] = self.mopac7_command_selection_entry.get() self.config_settings['rob_exe'] = self.ob_command_selection_entry.get() self.config_settings['junk_dir'] = self.junk_selection_entry.get() if not sys.platform.startswith('win'): home2 = os.environ.get('HOME') else: home2 = os.environ.get('PYMOL_PATH') tmp_dir2 = os.path.join(home2,'.VSDMIPplugin') config_file_name = os.path.join(tmp_dir2,"pymol_vsdmip_plugin.conf") fp = self.fileopen(config_file_name,'w') if not fp: self.screwup("Fatal","Cant open config file %s" %(config_file_name)) return for key, val in self.config_settings.items(): print >>fp, key, '=', val fp.close() self.status_line.configure(text = 'Wrote configuration file %s' % config_file_name) def ligand_display_mode_changed(self, button_name, pressed): if pressed: self.ligand_display_mode[button_name] = True action = 'Enabled' else: self.ligand_display_mode[button_name] = False action = 'Disabled' txt = action+' ligand display mode <'+button_name+'>' self.status_line.configure(text=txt) #---------------------------------------------------------------------------- # receptors def delete_residue(self, value): pass def selectionCommand(self, value): sels = self.selection_list.getcurselection() if len(sels) == 0: print 'No selection' else: print 'Selection:', sels[0] def selected_receptor(self, value): sel = self.receptor_list.get() receptor_object = self.receptor_dic[sel] lst = [] for resn, resi in receptor_object.flexible_residues: lst.append("%4d %s" % (resn, resi)) self.flexible_residues_list.setlist(lst) self.receptor_page_log_text.insert('end',receptor_object.info()) self.receptor_page_log_text.yview('moveto',1.0) self.docking_receptor_rigid_list.selectitem(value) def import_selections(self): try: lst = cmd.get_names("selections")+cmd.get_names() if 'grid_center' in lst: lst.remove('grid_center') if 'box' in lst: lst.remove('box') self.selection_list.setlist(lst) self.ligand_selection_list.setlist(lst) except: pass def generate_receptor(self): sel = self.selection_list.getcurselection() tmp_rec_pdb = os.path.join(tmp_dir,"receptor.%s.pdb" % sel[0]) cmd.save(tmp_rec_pdb,sel[0]) util_program = os.path.join(self.autodock_tools_path.get(),"prepare_receptor4.py") command = "%s -r %s -o receptor.%s.pdbqt -A checkhydrogens" % (util_program,tmp_rec_pdb,sel[0]) self.receptor_page_log_text.insert('end',"Batch: %s\n" % command) self.receptor_page_log_text.yview('moveto',1.0) result, output = getstatusoutput(command) if result == 0: self.receptor_list.insert('end',sel[0]) self.status_line.configure(text="Successfully generated receptor file receptor.%s.pdbqt" % sel[0]) #self.receptor_page_log_text.insert('end',"Successfully generated receptor file receptor.%s.pdbqt\n" % sel[0]) self.receptor_page_log_text.insert('end',output) self.receptor_page_log_text.yview('moveto',1.0) r = Receptor() r.selection = sel[0] r.pdb_file = tmp_rec_pdb r.receptor_pdbqt = "receptor.%s.pdbqt" % sel[0] stored.list = [] cmd.iterate(sel[0]+' and name ca',"stored.list.append([resi,resn])") for resi, resn in stored.list: r.resi_dic[int(resi)] = resn self.receptor_dic[sel[0]] = r self.receptor_list.selectitem(-1) self.docking_receptor_rigid_list.insert('end',sel[0]) self.docking_receptor_rigid_list.selectitem(-1) else: self.status_line.configure(text="An error occured while preparing receptor from selection %s" % sel[0]) self.receptor_page_log_text.insert('end',output) def select_flexible_residues(self): sel = self.selection_list.get() rec = self.receptor_list.get() stored.list = [] cmd.iterate(sel+' and name ca',"stored.list.append([resn,resi])") receptor_object = self.receptor_dic[rec] receptor_object.flexible_residues = [] for resn, resi in stored.list: if resn not in ['ALA','GLY','PRO']: receptor_object.flexible_residues.append( [int(resi), resn] ) self.status_line.configure(text = "Selected %d flexible residues for receptor %s" \ % (len(receptor_object.flexible_residues), rec)) util_program = os.path.join(self.autodock_tools_path.get(),"prepare_flexreceptor4.py") flex_res_string = receptor_object.flex_res_string() receptor_filename = receptor_object.receptor_pdbqt rec_rigid = receptor_filename.split('.')[0]+'.rigid.pdbqt' rec_flexible = receptor_filename.split('.')[0]+'.flexible.pdbqt' command = "%s -r %s -s %s -g %s -x %s" % \ (util_program, receptor_filename, flex_res_string, rec_rigid, rec_flexible) self.receptor_page_log_text.insert('end',"Batch: %s\n" % command) self.receptor_page_log_text.yview('moveto',1.0) # result = os.system(command) result, output = getstatusoutput(command) if result == 0: receptor_object.receptor_rigid = rec_rigid receptor_object.receptor_flexible = rec_flexible self.status_line.configure(text="Successfully generated flexible receptor files for %s(%s)" % (rec,sel)) # self.receptor_page_log_text.insert('end',"Successfully generated flexible receptor files for %s(%s)\n" % (rec,sel)) self.receptor_page_log_text.insert('end',output) self.selected_receptor(rec) self.docking_receptor_flexible_list.selectitem('Yes') else: self.status_line.configure(text="An error occured while preparing a flexible receptor from selection %s" % sel) self.receptor_page_log_text.insert('end',output) self.receptor_page_log_text.yview('moveto',1.0) def remove_receptor(self): rec = self.receptor_list.get() del self.receptor_dic[rec] self.status_line.configure(text="Removed receptor %s" % rec) index = list(self.receptor_list.get(0, 'end')).index(rec) self.receptor_list.delete(index) self.docking_receptor_list.delete(index) try: self.receptor_list.selectitem(0) self.docking_receptor_list.selectitem(0) except: self.receptor_list.clear() self.docking_receptor_list.clear() def remove_flexible_residues(self): rec = self.receptor_list.get() rec_object = self.receptor_dic[rec] rec_object.flexible_residues = [] rec_object.receptor_rigid = "" rec_object.receptor_flexible = "" self.status_line.configure(text="Removed flexible residues from receptor %s" % rec) self.selected_receptor(rec) def remove_all_receptors(self): self.receptor_dic = {} self.status_line.configure(text="Deleted all receptor objects") self.receptor_list.clear() self.flexible_residues_list.clear() #------------------------------------------------------------------------------ # ligands def save_as_ligand_pdb(self, name): pdb_name = name+'.ligand.pdb' cmd.save(pdb_name, name) self.status_line.configure(text="Saving ligand pdb file %s from selection %s" % (pdb_name, name)) self.ligand_list.insert('end',name) l = Ligand() l.input_file = pdb_name l.selection = name l.name = name self.ligand_dic[name] = l self.ligand_list.selectitem(-1) def generate_ligand(self): sel = self.ligand_list.get() filename = self.ligand_dic[sel].input_file outfile = os.path.basename(filename).split('.')[0]+'.pdbqt' util_program = os.path.join(self.autodock_tools_path.get(),"prepare_ligand4.py") command = "%s -l %s -o %s -A checkhydrogens" % (util_program,filename,outfile) self.ligand_page_log_text.insert('end',"Batch: %s\n" % command) # result = os.system(command) result, output = getstatusoutput(command) if result == 0: self.ligand_pdbqt_list.insert('end',sel) self.docking_ligand_list.insert('end',sel) self.docking_ligand_list.selectitem(-1) self.status_line.configure(text="Successfully generated ligand file %s" % outfile) #self.ligand_page_log_text.insert('end',"Successfully generated ligand file %s\n" % outfile) self.ligand_page_log_text.insert('end',output) self.ligand_pdbqt_list.selectitem(-1) self.ligand_dic[sel].ligand_pdbqt = outfile else: self.status_line.configure(text="An error occured while preparing ligand file from %s" % sel) self.ligand_page_log_text.insert('end',output) self.ligand_page_log_text.yview('moveto',1.0) def ligand_info(self, sel): try: sel = self.ligand_pdbqt_list.getcurselection()[0] except: sel = self.ligand_list.getcurselection()[0] self.ligand_page_log_text.insert('end',self.ligand_dic[sel].info()) self.ligand_page_log_text.yview('moveto',1.0) def remove_ligand(self): lig = self.ligand_pdbqt_list.get() try: del self.ligand_dic[lig] except: lig = self.ligand_list.get() del self.ligand_dic[lig] try: index = list(self.ligand_pdbqt_list.get(0, 'end')).index(lig) self.ligand_pdbqt_list.delete(index) self.docking_ligand_list.delete(index+1) except: pass index = list(self.ligand_list.get(0, 'end')).index(lig) self.ligand_list.delete(index) self.status_line.configure(text="Removed ligand %s" % lig) try: self.ligand_list.selectitem(0) except: self.ligand_list.clear() try: self.ligand_pdbqt_list.selectitem(0) except: self.ligand_pdbqt_list.clear() try: self.docking_ligand_list.selectitem(0) except: self.docking_ligand_list.clear() def display_ligand(self): lig = self.ligand_list.get() ligand_input = self.ligand_dic[lig].input_file string = open(ligand_input).read() cmd.load(ligand_input) self.ligand_page_log_text.insert('end',string) self.ligand_page_log_text.yview('moveto',1.0) def remove_all_ligands(self): self.ligand_dic = {} self.status_line.configure(text="Deleted all ligand objects") self.ligand_list.clear() self.ligand_pdbqt_list.clear() def set_ligand_dir_location(self, dirname): pth = self.ligand_dir_location.setvalue(dirname) self.ligand_dir.set(dirname) def import_ligands(self): pth = self.ligand_dir.get() lst = glob(os.path.join(pth,"*.pdb"))+glob(os.path.join(pth,"*.mol2")) self.ligand_dic['VS_DIR'] = pth for f in lst: l = Ligand() l.input_file = f name = os.path.basename(f).split('.')[0] self.ligand_dic[name] = l self.ligand_dic[name].name = name self.ligand_page_log_text.insert('end',"Importing ligand %s\n" % f) self.ligand_page_log_text.yview('moveto',1.0) self.ligand_list.insert('end',name) self.status_line.configure(text="Loaded %d ligands" % len(lst)) def generate_all_ligands(self): for key, ligand in self.ligand_dic.items(): if key !='VS_DIR': self.ligand_list.selectitem(key) self.generate_ligand() self.docking_ligand_list.selectitem(0) #------------------------------------------------------------------- # view poses def set_pose_filename(self, filename): self.pose_file_location.setvalue(filename) def load_ligand_file(self): filename = self.pose_file_location.get() ext = os.path.basename(filename).split('.')[-1] def load_all_ligand_files(self): lst = [] for name, ligand in self.ligand_dic.items(): if name != 'VS_DIR' and ligand.outfile_poses!='': lst.append(ligand.outfile_poses) for f in lst: self.pose_file_location.setvalue(f) self.load_ligand_file() def pre_load_cdock_res(self): a = self.pose_file_location.get() if len(a) == 0: self.screwup("Oops","You have to provide something to load") return self.load_cdock_res(a) def load_cdock_res(self, filename): # try: print 'Loading cdock results' name = '.'.join(os.path.basename(filename).split('.')[:-1]) lst = self.fileopen(filename,'r').readlines() filt = [] for line in lst: filt.append(line) modlist = [] for i, line in enumerate(lst): if line.startswith('MODEL'): newmod = [] for k, line2 in enumerate(filt[i:]): if not line2.startswith('ENDMDL'): newmod.append(line2) else: modlist.append(newmod) break pose_list = [] for m in modlist: model = ResCDOCK(lst = m) pose_list.append(model) pose_list.sort(lambda a, b: cmp(a.energy, b.energy)) self.pose_viewer_ligand_dic[name] = {} for i in range(len(pose_list)): self.pose_viewer_ligand_dic[name].update({name+'::%d'%(i+1):pose_list[i]}) self.update_combo(name) self.fcres = 1 # except: # self.screwup("Fatal","Cant load results from CDOCK") # return def update_combo(self,name): # try: # self.pose_viewer_notebook.delete(name) # except: # pass #self.pose_viewer_ligand_pages[name] = {'name':self.pose_viewer_notebook.add(name)} pose_list = self.pose_viewer_ligand_dic[name].keys() pose_list.sort(lambda a,b: cmp(int(a.split('::')[1]), int(b.split('::')[1]))) # self.pose_viewer_ligand_pages[name].update( {'poses':pose_list} ) # self.pose_viewer_buttonbox = Pmw.ButtonBox(self.results_viewer_page_stucts.interior(), padx=3) # self.pose_viewer_buttonbox.add('Show best 10' ,command=self.show_best_poses) # self.pose_viewer_buttonbox.add('Show all' ,command=self.show_all_poses) # self.pose_viewer_buttonbox.add('Hide all' ,command=self.hide_all_poses) # self.pose_viewer_buttonbox.add('Delete',command=self.delete_ligand) # self.pose_viewer_buttonbox.pack(fill='x',side=TOP) # self.pose_viewer_buttonbox.alignbuttons() if self.fcres == 0: self.pose_viewer_combo = Pmw.ComboBox(self.results_viewer_page_stucts.interior(), label_text='Docked', labelpos='nw', scrolledlist_items= pose_list, selectioncommand=self.ligand_combo_box_selected, listbox_height=10, listbox_width=1, dropdown=False) self.pose_viewer_combo.pack(side='left', padx=3, anchor='n') self.res_energy_group = Pmw.Group(self.results_viewer_page_stucts.interior(),tag_text='Pose information') self.res_energy_group.pack(fill = 'both', expand = 0, padx = 10, pady = 5) self.res_total_energy_entry = Pmw.EntryField(self.res_energy_group.interior(), labelpos = 'w', label_text = 'Total energy', value = '') self.res_total_energy_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.res_vdw_energy_entry = Pmw.EntryField(self.res_energy_group.interior(), labelpos = 'w', label_text = 'Vdw', value = '') self.res_vdw_energy_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.res_qq_energy_entry = Pmw.EntryField(self.res_energy_group.interior(), labelpos = 'w', label_text = 'Coulombic', value = '') self.res_qq_energy_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.res_apolar_energy_entry = Pmw.EntryField(self.res_energy_group.interior(), labelpos = 'w', label_text = 'Apolar', value = '') self.res_apolar_energy_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.res_recdes_energy_entry = Pmw.EntryField(self.res_energy_group.interior(), labelpos = 'w', label_text = 'Receptor desolvation', value = '') self.res_recdes_energy_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.res_ligdes_energy_entry = Pmw.EntryField(self.res_energy_group.interior(), labelpos = 'w', label_text = 'Ligand desolvation', value = '') self.res_ligdes_energy_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.res_hbnum_energy_entry = Pmw.EntryField(self.res_energy_group.interior(), labelpos = 'w', label_text = 'Hydrogen bonds', value = '') self.res_hbnum_energy_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) self.res_hbcor_energy_entry = Pmw.EntryField(self.res_energy_group.interior(), labelpos = 'w', label_text = 'Hydrogen bond correction', value = '') self.res_hbcor_energy_entry.pack(fill = 'both', expand = 1, padx = 10, pady = 5) Pmw.alignlabels([self.res_total_energy_entry, self.res_vdw_energy_entry, self.res_qq_energy_entry, self.res_apolar_energy_entry, self.res_recdes_energy_entry, self.res_ligdes_energy_entry, self.res_hbnum_energy_entry, self.res_hbcor_energy_entry]) # self.pose_viewer_text = Pmw.ScrolledText(self.results_viewer_page_stucts.interior(), # borderframe=5, # vscrollmode='dynamic', # hscrollmode='dynamic', # labelpos='n', # label_text=name, # text_width=150, text_height=15, # text_wrap='none', # text_background='#000000', # text_foreground='yellow') # self.pose_viewer_text.pack() self.status_line.configure(text ='Loading %s' % name) else: #self.pose_viewer_combo.clear() self.pose_viewer_combo.setlist(pose_list) def ligand_combo_box_selected(self, value): name = value.split('::')[0] # view = cmd.get_view() ligand = self.pose_viewer_ligand_dic[name][str(value)] # print ligand.as_pdb_string() cmd.read_pdbstr(ligand.as_pdb_string(),str(value)) # pmlname = value.replace(' ','_').replace('::','_') # for key, val in self.ligand_display_mode.items(): # print key, val # if val == True: # cmd.show(key,pmlname) # else: # cmd.hide(key,pmlname) # cmd.set_view(view) text = 'Docked Energy: %8.2f kcal/mol' % ligand.energy self.status_line.configure(text=text) # self.pose_viewer_text.clear() # self.pose_viewer_text.insert('end',ligand.info_string()) self.res_total_energy_entry.setvalue(ligand.energy) self.res_vdw_energy_entry.setvalue(ligand.vdwe) self.res_qq_energy_entry.setvalue(ligand.coulombice) self.res_apolar_energy_entry.setvalue(ligand.apolare) self.res_recdes_energy_entry.setvalue(ligand.receptordesolvatione) self.res_ligdes_energy_entry.setvalue(ligand.liganddesolvatione) self.res_hbnum_energy_entry.setvalue(ligand.hbnum) self.res_hbcor_energy_entry.setvalue(ligand.hbcorrection) if len(self.prot_sele_pose_location.get()) != 0: dis = 0 sel1 = str(value).split("::") sel2 = "%s_%s" %(sel1[0],sel1[1]) sel = "%s " %sel2 for hj in ligand.bh: print "Bridge: %i %i" %(hj[0],hj[1]) # for at1 in cmd.index(self.prot_sele_pose_location.get()): lsel0 = "id %i" %(hj[0]) for at1 in cmd.index(lsel0): if( at1[0] == self.prot_sele_pose_location.get()): lsel1 = str(value).split("::") lsel2 = "%s_%s" %(lsel1[0],lsel1[1]) lsel3 = "id %i " %(hj[1]) for at2 in cmd.index(lsel3): if( at2[0] == lsel2): dis = dis + 1 dts = lsel2 + "dist" + str(dis) cmd.dist(dts,"%s`%d" %at1,"%s`%d" %at2) # print "%s`%d - %s`%d" %(at1,at2) sel += "%s " %dts # print "Bridge: %i %i" %(at1[1],at2[1]) # print sel cmd.do("group "+sel2+"_group,"+ sel) def show_best_poses(self): name = self.pose_viewer_notebook.getcurselection() for pose in self.pose_viewer_ligand_pages[name]['poses'][:10]: self.ligand_combo_box_selected(pose) self.status_line.configure(text = 'Showing best 10 poses %s' % name) def hide_all_poses(self): name = self.pose_viewer_notebook.getcurselection() # pmlname = name.replace(' ','_') # cmd.delete(pmlname+'.*') cmd.delete(name+'_*') self.status_line.configure(text = 'Deleted all poses %s' % name) def delete_ligand(self): name = self.pose_viewer_notebook.getcurselection() cmd.delete(name+'_*') self.pose_viewer_notebook.delete(name) del self.pose_viewer_ligand_pages[name] self.status_line.configure(text = 'Deleted %s' % name) def screwup(self, title, message): warn = Pmw.MessageDialog(self.parent, title = title, defaultbutton = 0, #message_text = "The AI integrated in this plugin has detected you are trying to screw up the whole thing.\n\n%s" %(message)) message_text = "%s" %(message)) warn.iconname('Warning') warn.withdraw() warn.show() #------------------------------------------- # maps def set_mapfilename(self,filename): self.map_file_location.setvalue(filename) def remove_grid_average(self): self.combo_grids.clear() self.my_grid_lista = [] def add_grid_average(self): self.combo_grids.insert('end', self.grid_append_entry.get()) self.my_grid_lista.append(self.grid_append_entry.get()) def unload_cgrid_map(self): myworking = self.cgrid_views.get() if len(myworking) == 0: self.screwup("Oops","You have to provide a valid grid directory") return epot = 'e_pot' cpot = 'C_pot' opot = 'O_pot' spot = 'S_pot' hpot = 'H_pot' ppot = 'P_pot' npot = 'N_pot' clpot ='Cl_pot' fpot = 'F_pot' ipot = 'I_pot' brpot ='Br_pot' try: cmd.delete(epot) cmd.delete(cpot) cmd.delete(hpot) cmd.delete(opot) cmd.delete(npot) cmd.delete(ppot) cmd.delete(spot) cmd.delete(fpot) cmd.delete(clpot) cmd.delete(brpot) cmd.delete(ipot) except: self.screwup("Fatal","Error unloading gridx files\n") return epot = 'e_pot_surf' cpot = 'C_pot_surf' opot = 'O_pot_surf' spot = 'S_pot_surf' hpot = 'H_pot_surf' ppot = 'P_pot_surf' npot = 'N_pot_surf' clpot ='Cl_pot_surf' fpot = 'F_pot_surf' ipot = 'I_pot_surf' brpot ='Br_pot_surf' try: cmd.delete(epot) cmd.delete(cpot) cmd.delete(hpot) cmd.delete(opot) cmd.delete(npot) cmd.delete(ppot) cmd.delete(spot) cmd.delete(fpot) cmd.delete(clpot) cmd.delete(brpot) cmd.delete(ipot) except: self.screwup("Fatal","Error unloading surfaces\n") return def load_cgrid_map(self): view = cmd.get_view() #myworking = self.config_settings['work_dir'] myworking = self.cgrid_views.get() if len(myworking) == 0: self.screwup("Oops","You have to provide a valid grid directory") return epot = os.path.join(myworking,'e_pot.dx'); cpot = os.path.join(myworking,'C_pot.dx'); opot = os.path.join(myworking,'O_pot.dx'); spot = os.path.join(myworking,'S_pot.dx'); hpot = os.path.join(myworking,'H_pot.dx'); ppot = os.path.join(myworking,'P_pot.dx'); npot = os.path.join(myworking,'N_pot.dx'); clpot = os.path.join(myworking,'Cl_pot.dx'); fpot = os.path.join(myworking,'F_pot.dx'); ipot = os.path.join(myworking,'I_pot.dx'); brpot = os.path.join(myworking,'Br_pot.dx'); try: cmd.load(epot) cmd.load(cpot) cmd.load(hpot) cmd.load(opot) cmd.load(npot) cmd.load(ppot) cmd.load(spot) cmd.load(fpot) cmd.load(clpot) cmd.load(brpot) cmd.load(ipot) except: self.screwup("Fatal","Error loading gridx files\nCheck CGRID exit status, paths and stuff and permisions") return #cmd.isosurface("e_pot_surf","e_pot",-1.0) def split_vs(self): cmd.split_states("output_file", 1,100,"VSres") cmd.group("VSresults","VSres"+"*") cmd.delete("output_file") print 'hey' def show_hbonds_vs(self): print 'i' def show_pijaditas(self): if( self.check_wpijaditas == 1): return self.check_wpijaditas = 1 self.pijaditas_dialog = Pmw.Dialog(self.parent,title = 'Results Visualization control',command = self.close_pijaditas_dialog) self.pijaditas_dialog.withdraw() self.pijaditas_dialog.geometry('370x100') self.pijaditas_dialog.bind('',self.close_pijaditas_dialog) self.pijadas_buttonbox = Pmw.ButtonBox(self.pijaditas_dialog.interior(), padx=3) self.pijadas_buttonbox.add('Split molecules',command=self.split_vs) self.pijadas_buttonbox.add('Show hydrogen bonds',command=self.show_hbonds_vs) self.pijadas_buttonbox.pack(fill='x',side=LEFT,pady=3) self.pijadas_buttonbox.alignbuttons() self.pijaditas_dialog.show() def show_global_grid(self, name): if( self.check_wds_st == 1): return self.check_wds_st = 1 try: my_filename = name my_filename += ".data" self.dataset_st_dialog = Pmw.Dialog(self.parent,title = 'Data Set',command = self.close_ds_st_dialog) self.dataset_st_dialog.withdraw() self.dataset_st_dialog.geometry('550x280') self.dataset_st_dialog.bind('',self.close_ds_st_dialog) self.sf = Pmw.ScrolledFrame(self.dataset_st_dialog.interior(), labelpos = 'n', label_text = 'Global Data Set', usehullsize = 1, hull_width = 400, hull_height = 220, ) self.sf.pack(padx = 5, pady = 3, fill = 'both', expand = 1) self.frame = self.sf.interior() self.row = 0 self.col = 0 if self.sf.cget('horizflex') == 'expand' or \ self.sf.cget('vertflex') == 'expand': self.sf.reposition() self.addLabel('Index',16) self.addLabel('TotalEnergy',16) self.addLabel('OriginDB',16) self.addLabel('VirtualScreening',16) self.addLabel('Molecule',16) self.addLabel('Configuration',16) self.addLabel('Conformer',16) self.addLabel('Vdw Energy',16) self.addLabel('Coulombic Energy',16) self.addLabel('Desolvation Rec Energy',16) self.addLabel('Desolvation Lig Energy',16) self.addLabel('Apolar Energy',16) self.addLabel('ISM corr',16) self.addLabel('HB C-C',16) self.addLabel('HB C-N',16) self.addLabel('HB N-N',16) self.addLabel('HB Script',16) count = 0; if os.path.isfile(my_filename): try: filecillo = open(my_filename,'r') try: list = filecillo.readlines() for line in list: if count != 0: entr = line.split(";") self.addButton(entr[0],16); self.addButton(entr[6],16); self.addButton(entr[1],16); self.addButton(entr[2],16); self.addButton(entr[3],16); self.addButton(entr[4],16); self.addButton(entr[5],16); self.addButton(entr[7],16); self.addButton(entr[8],16); self.addButton(entr[9],16); self.addButton(entr[10],16); self.addButton(entr[11],16); self.addButton(entr[12],16); self.addButton(entr[13],16); self.addButton(entr[14],16); self.addButton(entr[15],16); self.addButton(entr[16:],16); try: hbnum = 0 hbnum = int(entr[15]) + int(entr[14]) + int(entr[13]) except: pass # Draw h-bonds # if len(self.vs_prot_selection_entry.get()) !=0 and hbnum !=0: # hbs = entr[16:] # bj = hbs.split(",") count = count + 1 finally: filecillo.close() except IOError: pass self.dataset_st_dialog.show() except: self.screwup("Fatal","Can not display the table.\nIn Windows environment this is due to a problem in Python mega widgets or a strange installation") return def sethscrollmode(self, tag): self.sf.configure(hscrollmode = tag) def setvscrollmode(self, tag): self.sf.configure(vscrollmode = tag) def sethflex(self, tag): self.sf.configure(horizflex = tag) def setvflex(self, tag): self.sf.configure(vertflex = tag) def addLabel(self, cont, max): button = Tkinter.Button(self.frame, text = '%s' % (cont)) button.grid(row = self.row, column = self.col, sticky = 'nsew') self.frame.grid_rowconfigure(self.row, weight = 1) self.frame.grid_columnconfigure(self.col, weight = 1) if self.sf.cget('horizflex') == 'expand' or \ self.sf.cget('vertflex') == 'expand': self.sf.reposition() if self.col == max: self.col = 0 self.row = self.row + 1 else: self.col = self.col + 1 def addButton(self, cont, max): button = Pmw.EntryField(self.frame, labelpos = 'w', value = '%s' %(cont), validate = None) button.grid(row = self.row, column = self.col, sticky = 'nsew') self.frame.grid_rowconfigure(self.row, weight = 1) self.frame.grid_columnconfigure(self.col, weight = 1) if self.sf.cget('horizflex') == 'expand' or \ self.sf.cget('vertflex') == 'expand': self.sf.reposition() """ if 'center' in self.radio.getcurselection(): self.sf.update_idletasks() self.centerPage() """ if self.col == max: self.col = 0 self.row = self.row + 1 else: self.col = self.col + 1 """ def showYView(self): print self.sf.yview() def pageDown(self): self.sf.yview('scroll', 1, 'page') def radioSelected(self, name, state): if state: self.centerPage() def centerPage(self): # Example of how to use the yview() method of Pmw.ScrolledFrame. top, bottom = self.sf.yview() size = bottom - top middle = 0.5 - size / 2 self.sf.yview('moveto', middle) """ def create_surface(self): name = self.map_viewer_notebook.getcurselection() thresh = float(self.map_threshold[name].get()) surfname = name+'.'+str(thresh) cmd.delete(surfname) if self.map_radiobuttons.getvalue()=='isosurface': mode = 'isosurface' elif self.map_radiobuttons.getvalue()=='isomesh': mode = 'isomesh' if self.map_dic[name].has_key(surfname): mmp = self.map_dic[name][surfname] else: self.map_dic[name].update({surfname:{ 'color':self.map_color, 'displ':mode, 'thresh':thresh }}) mmp = self.map_dic[name][surfname] mmp['thresh'] = float(self.map_threshold[name].get()) mmp['color'] = self.map_color self.display_map(name, mmp) self.update_mapcombo(name,self.map_dic[name]) self.map_radiobuttons.setvalue(mode) self.map_pages[name]['combo'].selectitem(-1) self.status_mapbox(surfname) def delete_surface(self): name = self.map_viewer_notebook.getcurselection() s = self.map_pages[name]['combo'].getcurselection() for mp in s: self.status_line.configure(text = "Deleting map %s" % mp) cmd.delete(mp) del self.map_dic[name][mp] self.update_mapcombo(name,self.map_dic[name]) try: self.map_pages[name]['combo'].selectitem(0) except: pass def select_map_color(self): color = tkColorChooser.Chooser( initialcolor='red',title='Choose map color').show() if color[0] is not None: self.map_color = [color[0][0]/255., color[0][1]/255., color[0][2]/255.] def status_mapbox(self,key): name = self.map_viewer_notebook.getcurselection() self.map_pages[name]['text'].clear() self.map_pages[name]['text'].insert('end',self.map_meta[key]) def update_mapcombo(self,name, map_dic): try: self.map_viewer_notebook.delete(name) except: pass self.map_pages[name] = {'name':self.map_viewer_notebook.add(name)} # self.map_pages[name].update({'maps':self.map_dic.keys()}) self.upper_part = Tkinter.Frame(self.map_pages[name]['name']) self.lower_part = Tkinter.Frame(self.map_pages[name]['name']) self.upper_part.pack(side=TOP) self.lower_part.pack(side=BOTTOM) self.upper_part1 = Tkinter.Frame(self.upper_part) self.upper_part2 = Tkinter.Frame(self.upper_part) self.upper_part1.pack(side=TOP, fill='x') self.upper_part2.pack(side=BOTTOM, fill='x') self.map_thresholdfr = Tkinter.Frame(self.upper_part1) labmap_threshold = Label(self.map_thresholdfr,text="Threshold:"); self.map_thresholdloc = Entry(self.map_thresholdfr,textvariable=self.map_threshold[name],bg='black',fg='green',width=15); self.scrmap_threshold=Scrollbar(self.map_thresholdfr,orient="horizontal",command=self.change_map_threshold) labmap_threshold.pack(side=LEFT) self.map_thresholdloc.pack(side=LEFT) self.scrmap_threshold.pack(side=LEFT) self.map_thresholdfr.pack(fill='x',padx=4,pady=3, side=LEFT) # vertical self.map_buttonbox = Pmw.ButtonBox(self.upper_part2, padx=3) self.map_buttonbox.add('Create Surface',command=self.create_surface) self.map_buttonbox.add('Delete Surface',command=self.delete_surface) self.map_buttonbox.add('Color',command=self.select_map_color) self.map_buttonbox.add('Delete Map',command=self.delete_map) self.map_buttonbox.pack(fill='x',side=LEFT,pady=3) self.map_buttonbox.alignbuttons() self.map_pages[name]['combo'] = Pmw.ComboBox(self.lower_part, label_text='Representations', labelpos='nw', scrolledlist_items= self.map_dic[name].keys(), selectioncommand=self.status_mapbox, listbox_height=15, listbox_width=1, dropdown=False) self.map_pages[name]['combo'].pack(side=LEFT, padx=3, anchor='n', fill='y') self.map_pages[name]['text'] = Pmw.ScrolledText(self.lower_part, borderframe=5, vscrollmode='dynamic', hscrollmode='dynamic', labelpos='n', label_text=name, text_width=60, text_height=15, text_wrap='none', text_background='#000000', text_foreground='green' ) self.map_pages[name]['text'].pack(fill='y') self.map_viewer_notebook.selectpage(name) self.map_radiobuttons = Pmw.RadioSelect(self.lower_part, buttontype = 'radiobutton', orient = 'horizontal', labelpos = 'w', ) for text in ('isosurface', 'isomesh'): self.map_radiobuttons.add(text) self.map_radiobuttons.setvalue('isosurface') self.map_radiobuttons.pack(padx=4,pady=1,side='top') def change_map_threshold(self,a): current = self.map_viewer_notebook.getcurselection() val=float(self.map_threshold[current].get())+float(a)*0.2 self.map_threshold[current].set(val) def fileopen(self, filename, mode): #if mode=='w' and os.path.isfile(filename): #p = os.path.abspath(filename) #b = os.path.basename(p) #pa,n= p.split(b) #tmp = '#'+b+'#' #fn = os.path.join(pa,tmp) #os.rename(filename,fn) #self.status_line.configure(text='Backing up %s to %s' % (filename,fn)) try: fp = open(filename,mode) return fp except: tkMessageBox.showerror('Error','Could not open file %s' % filename) return None #========================================================== # # FOREIGN DIALOG CLASSES # The classes PmwFileDialog and PmwExistingFileDialog and the _errorpop function # are taken from the Pmw contrib directory. The attribution given in that file # is: ################################################################################ # Filename dialogs using Pmw # # (C) Rob W.W. Hooft, Nonius BV, 1998 # # Modifications: # # J. Willem M. Nissink, Cambridge Crystallographic Data Centre, 8/2002 # Added optional information pane at top of dialog; if option # 'info' is specified, the text given will be shown (in blue). # Modified example to show both file and directory-type dialog # # No Guarantees. Distribute Freely. # Please send bug-fixes/patches/features to # ################################################################################ def quickFileValidation(s): if s == '': return Pmw.PARTIAL elif os.path.isfile(s): return Pmw.OK elif os.path.exists(s): return Pmw.PARTIAL else: return Pmw.PARTIAL class FileDialogButtonClassFactory: def get(fn,filter='*'): """This returns a FileDialogButton class that will call the specified function with the resulting file. """ class FileDialogButton(Tkinter.Button): # This is just an ordinary button with special colors. def __init__(self, master=None, cnf={}, **kw): '''when we get a file, we call fn(filename)''' self.fn = fn self.__toggle = 0 apply(Tkinter.Button.__init__, (self, master, cnf), kw) self.configure(command=self.set) def set(self): fd = PmwFileDialog(self.master,filter=filter) fd.title('Please choose a file') n=fd.askfilename() if n is not None: self.fn(n) return FileDialogButton get = staticmethod(get) class DirDialogButtonClassFactory: def get(fn): """This returns a FileDialogButton class that will call the specified function with the resulting file. """ class DirDialogButton(Tkinter.Button): # This is just an ordinary button with special colors. def __init__(self, master=None, cnf={}, **kw): '''when we get a file, we call fn(filename)''' self.fn = fn self.__toggle = 0 apply(Tkinter.Button.__init__, (self, master, cnf), kw) self.configure(command=self.set) def set(self): fd = PmwDirDialog(self.master) fd.title('Please choose a directory') n=fd.askfilename() if n is not None: self.fn(n) return DirDialogButton get = staticmethod(get) def _errorpop(master,text): d=Pmw.MessageDialog(master, title="Error", message_text=text, buttons=("OK",)) d.component('message').pack(ipadx=15,ipady=15) d.activate() d.destroy() class PmwFileDialog(Pmw.Dialog): """File Dialog using Pmw""" def __init__(self, parent = None, **kw): # Define the megawidget options. optiondefs = ( ('filter', '*', self.newfilter), ('directory', os.getcwd(), self.newdir), ('filename', '', self.newfilename), ('historylen',10, None), ('command', None, None), ('info', None, None), ) self.defineoptions(kw, optiondefs) # Initialise base class (after defining options). Pmw.Dialog.__init__(self, parent) self.withdraw() # Create the components. interior = self.interior() if self['info'] is not None: rowoffset=1 dn = self.infotxt() dn.grid(row=0,column=0,columnspan=2,padx=3,pady=3) else: rowoffset=0 dn = self.mkdn() dn.grid(row=0+rowoffset,column=0,columnspan=2,padx=3,pady=3) del dn # Create the directory list component. dnb = self.mkdnb() dnb.grid(row=1+rowoffset,column=0,sticky='news',padx=3,pady=3) del dnb # Create the filename list component. fnb = self.mkfnb() fnb.grid(row=1+rowoffset,column=1,sticky='news',padx=3,pady=3) del fnb # Create the filter entry ft = self.mkft() ft.grid(row=2+rowoffset,column=0,columnspan=2,padx=3,pady=3) del ft # Create the filename entry fn = self.mkfn() fn.grid(row=3+rowoffset,column=0,columnspan=2,padx=3,pady=3) fn.bind('',self.okbutton) del fn # Buttonbox already exists bb=self.component('buttonbox') bb.add('OK',command=self.okbutton) bb.add('Cancel',command=self.cancelbutton) del bb Pmw.alignlabels([self.component('filename'), self.component('filter'), self.component('dirname')]) def infotxt(self): """ Make information block component at the top """ return self.createcomponent( 'infobox', (), None, Tkinter.Label, (self.interior(),), width=51, relief='groove', foreground='darkblue', justify='left', text=self['info'] ) def mkdn(self): """Make directory name component""" return self.createcomponent( 'dirname', (), None, Pmw.ComboBox, (self.interior(),), entryfield_value=self['directory'], entryfield_entry_width=40, entryfield_validate=self.dirvalidate, selectioncommand=self.setdir, labelpos='w', label_text='Directory:') def mkdnb(self): """Make directory name box""" return self.createcomponent( 'dirnamebox', (), None, Pmw.ScrolledListBox, (self.interior(),), label_text='directories', labelpos='n', hscrollmode='none', dblclickcommand=self.selectdir) def mkft(self): """Make filter""" return self.createcomponent( 'filter', (), None, Pmw.ComboBox, (self.interior(),), entryfield_value=self['filter'], entryfield_entry_width=40, selectioncommand=self.setfilter, labelpos='w', label_text='Filter:') def mkfnb(self): """Make filename list box""" return self.createcomponent( 'filenamebox', (), None, Pmw.ScrolledListBox, (self.interior(),), label_text='files', labelpos='n', hscrollmode='none', selectioncommand=self.singleselectfile, dblclickcommand=self.selectfile) def mkfn(self): """Make file name entry""" return self.createcomponent( 'filename', (), None, Pmw.ComboBox, (self.interior(),), entryfield_value=self['filename'], entryfield_entry_width=40, entryfield_validate=self.filevalidate, selectioncommand=self.setfilename, labelpos='w', label_text='Filename:') def dirvalidate(self,string): if os.path.isdir(string): return Pmw.OK else: return Pmw.PARTIAL def filevalidate(self,string): if string=='': return Pmw.PARTIAL elif os.path.isfile(string): return Pmw.OK elif os.path.exists(string): return Pmw.PARTIAL else: return Pmw.OK def okbutton(self): """OK action: user thinks he has input valid data and wants to proceed. This is also called by in the filename entry""" fn=self.component('filename').get() self.setfilename(fn) if self.validate(fn): self.canceled=0 self.deactivate() def cancelbutton(self): """Cancel the operation""" self.canceled=1 self.deactivate() def tidy(self,w,v): """Insert text v into the entry and at the top of the list of the combobox w, remove duplicates""" if not v: return entry=w.component('entry') entry.delete(0,'end') entry.insert(0,v) list=w.component('scrolledlist') list.insert(0,v) index=1 while indexself['historylen']: list.delete(index) else: index=index+1 w.checkentry() def setfilename(self,value): if not value: return value=os.path.join(self['directory'],value) dir,fil=os.path.split(value) self.configure(directory=dir,filename=value) c=self['command'] if callable(c): c() def newfilename(self): """Make sure a newly set filename makes it into the combobox list""" self.tidy(self.component('filename'),self['filename']) def setfilter(self,value): self.configure(filter=value) def newfilter(self): """Make sure a newly set filter makes it into the combobox list""" self.tidy(self.component('filter'),self['filter']) self.fillit() def setdir(self,value): self.configure(directory=value) def newdir(self): """Make sure a newly set dirname makes it into the combobox list""" self.tidy(self.component('dirname'),self['directory']) self.fillit() def singleselectfile(self): """Single click in file listbox. Move file to "filename" combobox""" cs=self.component('filenamebox').curselection() if cs!=(): value=self.component('filenamebox').get(cs) self.setfilename(value) def selectfile(self): """Take the selected file from the filename, normalize it, and OK""" self.singleselectfile() value=self.component('filename').get() self.setfilename(value) if value: self.okbutton() def selectdir(self): """Take selected directory from the dirnamebox into the dirname""" cs=self.component('dirnamebox').curselection() if cs!=(): value=self.component('dirnamebox').get(cs) dir=self['directory'] if not dir: dir=os.getcwd() if value: if value=='..': dir=os.path.split(dir)[0] else: dir=os.path.join(dir,value) self.configure(directory=dir) self.fillit() def askfilename(self,directory=None,filter=None): """The actual client function. Activates the dialog, and returns only after a valid filename has been entered (return value is that filename) or when canceled (return value is None)""" if directory!=None: self.configure(directory=directory) if filter!=None: self.configure(filter=filter) self.fillit() self.canceled=1 # Needed for when user kills dialog window self.activate() if self.canceled: return None else: return self.component('filename').get() lastdir="" lastfilter=None lasttime=0 def fillit(self): """Get the directory list and show it in the two listboxes""" # Do not run unnecesarily if self.lastdir==self['directory'] and self.lastfilter==self['filter'] and self.lasttime>os.stat(self.lastdir)[8]: return self.lastdir=self['directory'] self.lastfilter=self['filter'] self.lasttime=time() dir=self['directory'] if not dir: dir=os.getcwd() dirs=['..'] files=[] try: fl=os.listdir(dir) fl.sort() except os.error,arg: if arg[0] in (2,20): return raise for f in fl: if os.path.isdir(os.path.join(dir,f)): dirs.append(f) else: filter=self['filter'] if not filter: filter='*' if fnmatch.fnmatch(f,filter): files.append(f) self.component('filenamebox').setlist(files) self.component('dirnamebox').setlist(dirs) def validate(self,filename): """Validation function. Should return 1 if the filename is valid, 0 if invalid. May pop up dialogs to tell user why. Especially suited to subclasses: i.e. only return 1 if the file does/doesn't exist""" return 1 class PmwExistingFileDialog(PmwFileDialog): def filevalidate(self,string): if os.path.isfile(string): return Pmw.OK else: return Pmw.PARTIAL def validate(self,filename): if os.path.isfile(filename): return 1 elif os.path.exists(filename): _errorpop(self.interior(),"This is not a plain file") return 0 else: _errorpop(self.interior(),"Please select an existing file") return 0 class PmwDirDialog(PmwFileDialog): """Directory Dialog using Pmw""" def __init__(self, parent = None, **kw): # Define the megawidget options. optiondefs = ( ('directory', os.getcwd(), self.newdir), ('historylen',10, None), ('command', None, None), ('info', None, None), ) self.defineoptions(kw, optiondefs) # Initialise base class (after defining options). Pmw.Dialog.__init__(self, parent) self.withdraw() # Create the components. interior = self.interior() if self['info'] is not None: rowoffset=1 dn = self.infotxt() dn.grid(row=0,column=0,columnspan=2,padx=3,pady=3) else: rowoffset=0 dn = self.mkdn() dn.grid(row=1+rowoffset,column=0,columnspan=2,padx=3,pady=3) dn.bind('',self.okbutton) del dn # Create the directory list component. dnb = self.mkdnb() dnb.grid(row=0+rowoffset,column=0,columnspan=2,sticky='news',padx=3,pady=3) del dnb # Buttonbox already exists bb=self.component('buttonbox') bb.add('OK',command=self.okbutton) bb.add('Cancel',command=self.cancelbutton) del bb lastdir="" def fillit(self): """Get the directory list and show it in the two listboxes""" # Do not run unnecesarily if self.lastdir==self['directory']: return self.lastdir=self['directory'] dir=self['directory'] if not dir: dir=os.getcwd() dirs=['..'] try: fl=os.listdir(dir) fl.sort() except os.error,arg: if arg[0] in (2,20): return raise for f in fl: if os.path.isdir(os.path.join(dir,f)): dirs.append(f) self.component('dirnamebox').setlist(dirs) def okbutton(self): """OK action: user thinks he has input valid data and wants to proceed. This is also called by in the dirname entry""" fn=self.component('dirname').get() self.configure(directory=fn) if self.validate(fn): self.canceled=0 self.deactivate() def askfilename(self,directory=None): """The actual client function. Activates the dialog, and returns only after a valid filename has been entered (return value is that filename) or when canceled (return value is None)""" if directory!=None: self.configure(directory=directory) self.fillit() self.activate() if self.canceled: return None else: return self.component('dirname').get() def dirvalidate(self,string): if os.path.isdir(string): return Pmw.OK elif os.path.exists(string): return Pmw.PARTIAL else: return Pmw.OK def validate(self,filename): """Validation function. Should return 1 if the filename is valid, 0 if invalid. May pop up dialogs to tell user why. Especially suited to subclasses: i.e. only return 1 if the file does/doesn't exist""" if filename=='': _errorpop(self.interior(),"Empty filename") return 0 if os.path.isdir(filename) or not os.path.exists(filename): return 1 else: _errorpop(self.interior(),"This is not a directory") return 0 class Tail(object): """The Tail monitor object.""" def __init__(self, path, only_new = False, min_sleep = 1, sleep_interval = 1, max_sleep = 60): """Initialize a tail monitor. path: filename to open only_new: By default, the tail monitor will start reading from the beginning of the file when first opened. Set only_new to True to have it skip to the end when it first opens, so that you only get the new additions that arrive after you start monitoring. min_sleep: Shortest interval in seconds to sleep when waiting for more input to arrive. Defaults to 1.0 second. sleep_interval: The tail monitor will dynamically recompute an appropriate sleep interval based on a sliding window of data arrival rate. You can set sleep_interval here to seed it initially if the default of 1.0 second doesn't work for you and you don't want to wait for it to converge. max_sleep: Maximum interval in seconds to sleep when waiting for more input to arrive. Also, if this many seconds have elapsed without getting any new data, the tail monitor will check to see if the log got truncated (rotated) and will quietly reopen itself if this was the case. Defaults to 60.0 seconds. """ # remember path to file in case I need to reopen self.path = abspath(path) self.f = open(self.path,"r") self.min_sleep = min_sleep * 1.0 self.sleep_interval = sleep_interval * 1.0 self.max_sleep = max_sleep * 1.0 if only_new: # seek to current end of file file_len = stat(path)[ST_SIZE] self.f.seek(file_len) self.pos = self.f.tell() # where am I in the file? self.last_read = time() # when did I last get some data? self.queue = [] # queue of lines that are ready self.window = [] # sliding window for dynamically # adjusting the sleep_interval def _recompute_rate(self, n, start, stop): """Internal function for recomputing the sleep interval. I get called with a number of lines that appeared between the start and stop times; this will get added to a sliding window, and I will recompute the average interarrival rate over the last window. """ self.window.append((n, start, stop)) purge_idx = -1 # index of the highest old record tot_n = 0 # total arrivals in the window tot_start = stop # earliest time in the window tot_stop = start # latest time in the window for i, record in enumerate(self.window): (i_n, i_start, i_stop) = record if i_stop < start - self.max_sleep: # window size is based on self.max_sleep; this record has # fallen out of the window purge_idx = i else: tot_n += i_n if i_start < tot_start: tot_start = i_start if i_stop > tot_stop: tot_stop = i_stop if purge_idx >= 0: # clean the old records out of the window (slide the window) self.window = self.window[purge_idx+1:] if tot_n > 0: # recompute; stay within bounds self.sleep_interval = (tot_stop - tot_start) / tot_n if self.sleep_interval > self.max_sleep: self.sleep_interval = self.max_sleep if self.sleep_interval < self.min_sleep: self.sleep_interval = self.min_sleep def _fill_cache(self): """Internal method for grabbing as much data out of the file as is available and caching it for future calls to nextline(). Returns the number of lines just read. """ old_len = len(self.queue) line = self.f.readline() while line != "": self.queue.append(line) line = self.f.readline() # how many did we just get? num_read = len(self.queue) - old_len if num_read > 0: self.pos = self.f.tell() now = time() self._recompute_rate(num_read, self.last_read, now) self.last_read = now return num_read def _dequeue(self): """Internal method; returns the first available line out of the cache, if any.""" if len(self.queue) > 0: line = self.queue[0] self.queue = self.queue[1:] return line else: return None def _reset(self): """Internal method; reopen the internal file handle (probably because the log file got rotated/truncated).""" self.f.close() self.f = open(self.path, "r") self.pos = self.f.tell() self.last_read = time() def nextline(self): """Return the next line from the file. Blocks if there are no lines immediately available.""" # see if we have any lines cached from the last file read line = self._dequeue() if line: return line # ok, we are out of cache; let's get some lines from the file if self._fill_cache() > 0: # got some return self._dequeue() # hmm, still no input available while True: sleep(self.sleep_interval) if self._fill_cache() > 0: return self._dequeue() now = time() if (now - self.last_read > self.max_sleep): # maybe the log got rotated out from under us? if stat(self.path)[ST_SIZE] < self.pos: # file got truncated and/or re-created self._reset() if self._fill_cache() > 0: return self._dequeue() def close(self): """Close the tail monitor, discarding any remaining input.""" self.f.close() self.f = None self.queue = [] self.window = [] def __iter__(self): """Iterator interface, so you can do: for line in filetail.Tail('log.txt'): # do stuff pass """ return self def next(self): """Kick the iterator interface. Used under the covers to support: for line in filetail.Tail('log.txt'): # do stuff pass """ return self.nextline()