modules/pymol/wizard/cleanup.py (137 lines of code) (raw):

import sys import time import os from pymol.wizard import Wizard from pymol import cmd import pymol SZYBKI_EXE = "" undo_object = "_w_cleanup_undo" redo_object = "_w_cleanup_redo" def auto_configure(): result = -1 global SZYBKI_EXE OE_DIR = os.environ.get("OE_DIR",None) if OE_DIR == None: OE_DIR = os.environ.get("OEDIR",None) if OE_DIR != None: SZYBKI_EXE = os.path.join(OE_DIR,"bin/szybki") if os.path.exists(SZYBKI_EXE): result = 1 else: SZYBKI_EXE = SZYBKI_EXE + ".exe" # print SZYBKI_EXE if os.path.exists(SZYBKI_EXE): result=1 if result<0: SZYBKI_EXE = os.path.join(OE_DIR,"arch/microsoft-win32-i586/bin/szybki-1.0b7.exe") if os.path.exists(SZYBKI_EXE): result = 1 return result class Cleanup(Wizard): def update_menus(self): ligand = [ [2, 'Ligand', '']] target = [ [2, 'Target', ''], [1, '(none)',' cmd.get_wizard().set_target("(none)")' ]] for a in self.cmd.get_names("public_objects"): ligand.append([1, a, 'cmd.get_wizard().set_ligand("'+a+'")']) if a!=self.ligand: target.append([1, a, 'cmd.get_wizard().set_target("'+a+'")']) self.menu['ligand'] = ligand self.menu['target'] = target def __init__(self,_self=cmd): Wizard.__init__(self,_self) self.ligand = "" for a in self.cmd.get_names("public_objects",1): if self.cmd.count_atoms(a) < 1000: self.ligand = a break self.target = "(none)" self.message = [] self.menu = {} self.update_menus() self.cmd.edit_mode() def save_undo(self): self.cmd.delete(undo_object) self.cmd.create(undo_object,self.ligand,zoom=0) self.cmd.disable(undo_object) def undo(self): if undo_object in self.cmd.get_names("objects"): if self.ligand in self.cmd.get_names("objects"): self.cmd.delete(redo_object) self.cmd.set_name(self.ligand,redo_object) self.cmd.disable(redo_object) self.cmd.create(self.ligand,undo_object,zoom=0) def redo(self): if redo_object in self.cmd.get_names("objects"): if self.ligand in self.cmd.get_names("objects"): self.cmd.delete(undo_object) self.cmd.set_name(self.ligand,undo_object) self.cmd.disable(undo_object) self.cmd.create(self.ligand,redo_object,zoom=0) def run(self): exe = SZYBKI_EXE inp = "ligand_inp.mol" out = "ligand_out.mol" tmp_obj = "_cleanup_tmp_obj" if self.ligand in self.cmd.get_names("objects"): self.save_undo() if os.path.exists(inp): os.unlink(inp) if os.path.exists(out): os.unlink(out) self.cmd.save(inp,self.ligand) # MOL file will be written using internal order while 1: if not os.path.exists(inp): time.sleep(0.05) else: break; self.cmd.system(exe+" -i ligand_inp.mol -o ligand_out.mol") for a in range(1,20): if not os.path.exists(out): time.sleep(0.05) else: break; self.cmd.load(out,tmp_obj,zoom=0) self.cmd.alter(self.ligand,"ID=index") self.cmd.fit(tmp_obj,self.ligand,matchmaker=2) self.cmd.update(self.ligand,tmp_obj,matchmaker=2) self.cmd.delete(tmp_obj) self.cmd.sculpt_deactivate(self.ligand) self.cmd.sculpt_purge() def set_target(self,target): self.target = target self.cmd.refresh_wizard() def set_ligand(self,ligand): self.ligand = ligand self.cmd.refresh_wizard() def get_panel(self): return [ [ 1, 'Cleanup',''], [ 2, 'Run','cmd.get_wizard().run()'], [ 2, "Undo", 'cmd.get_wizard().undo()' ], [ 2, "Redo", 'cmd.get_wizard().redo()' ], [ 3, "\\999Ligand:\\000 "+self.ligand,'ligand'], # [ 3, "\\999Target:\\000 "+self.target,'target'], [ 2, 'Refresh','cmd.get_wizard().update()'], [ 2, 'Done','cmd.set_wizard()'], ] def update(self): self.update_menus() self.cmd.refresh_wizard() def cleanup(self): self.clear() self.cmd.delete(undo_object) self.cmd.delete(redo_object) def clear(self): self.cmd.unpick() self.cmd.refresh_wizard() def get_prompt(self): self.prompt = [] if self.ligand=="": self.prompt = [ 'Please pick a ligand...' ] if self.message!=None: self.prompt.append(self.message) return self.prompt def set_status(self,status): self.status = status self.cmd.refresh_wizard() def do_pick(self,bondFlag): obj = self.cmd.get_object_list("pkmol") if self.ligand=="" and len(obj)==1: self.ligand= obj[0] self.cmd.refresh_wizard()