import sys import olex import olx import olex_core import os import olexex import OlexVFS from ArgumentParser import ArgumentParser from History import hist from olexFunctions import OlexFunctions OV = OlexFunctions() debug = bool(OV.GetParam('olex2.debug',False)) timer = debug import ExternalPrgParameters from CifInfo import MergeCif import TimeWatch import time import shutil # The listeners expect a function class ListenerManager(object): def __init__(self): self.onStart_listeners = [] self.onEnd_listeners = [] def register_listener(self, listener,event): if event == "onEnd": for l in self.onEnd_listeners: if type(l.__self__) == type(listener.__self__): return False self.onEnd_listeners.append(listener) elif event == "onStart": for l in self.onStart_listeners: if type(l.__self__) == type(listener.__self__): return False self.onStart_listeners.append(listener) def startRun(self, caller): for item in self.onStart_listeners: item(caller) def endRun(self, caller): for item in self.onEnd_listeners: item(caller) LM = ListenerManager() class RunPrg(ArgumentParser): running = False def __init__(self): super(RunPrg, self).__init__() self.demote = False self.SPD, self.RPD = ExternalPrgParameters.get_program_dictionaries() self.terminate = False self.tidy = False self.method = None self.Ralpha = 0 self.Nqual = 0 self.CFOM = 0 self.HasGUI = OV.HasGUI() self.make_unique_names = False self.shelx_files = r"%s/util/SHELX/" %self.basedir self.isAllQ = False #If all atoms are q-peaks, this will be assigned to True self.his_file = None self.please_run_auto_vss = False self.demo_mode = OV.FindValue('autochem_demo_mode',False) self.broadcast_mode = OV.FindValue('broadcast_mode',False) if self.demo_mode: OV.demo_mode = True if self.HasGUI: from Analysis import PrgAnalysis self.PrgAnalysis = PrgAnalysis OV.registerFunction(self.run_auto_vss,False,'runprg') self.params = olx.phil_handler.get_python_object() OV.SetVar('SlideQPeaksVal','0') # reset q peak slider to display all peaks if not self.filename: print "No structure loaded" return self.original_filename = self.filename olx.Stop('listen') self.shelx_alias = OV.FileName().replace(' ', '').lower() os.environ['FORT_BUFFERED'] = 'TRUE' self.post_prg_output_html_message = "" def __del__(self): if self.method is not None and \ hasattr(self.method, "unregisterCallback") and \ callable(self.method.unregisterCallback): self.method.unregisterCallback() def run(self): import time if RunPrg.running: print("Already running. Please wait...") return RunPrg.running = True try: token = TimeWatch.start("Running %s" %self.program.name) if timer: t1 = time.time() res = self.method.run(self) if timer: print "REFINEMENT: %.3f" %(time.time() - t1) if res == False: return False if not self.method.failure: if timer: t1 = time.time() self.runAfterProcess() if timer: print "runAfterProcess: %.3f" %(time.time() - t1) if timer: t1 = time.time() self.endRun() if timer: print "endRun: %.3f" %(time.time() - t1) TimeWatch.finish(token) sys.stdout.refresh = False sys.stdout.graph = False finally: if self.HasGUI: pass #olx.html.Update() RunPrg.running = False if self.please_run_auto_vss: self.run_auto_vss() def run_auto_vss(self): olx.Freeze(True) olex.m('compaq') olex.m('compaq -a') olx.VSS(True) olex.m('compaq') olex.m('refine 2 10') olex.m('compaq') olx.ATA() olex.m('refine 2 10') olx.Freeze(False) def which_shelx(self, type="xl"): a = olexex.which_program(type) if a == "": OV.Alert("Error", "ShelX %s is not found on this system.\nPlease make sure that the ShelX executable files can be found on system PATH." %type, "O") OV.Cursor() self.terminate = True return a def doBroadcast(self): if "smtbx" not in self.program.name: ext = "res" else: ext = "res" copy_from = "%s/%s.%s" %(self.tempPath, self.shelx_alias, ext) copy_to = "%s/listen.res" %(self.datadir) if os.path.isfile(copy_from): if copy_from.lower() != copy_to.lower(): shutil.copyfile(copy_from, copy_to) def doFileResInsMagic(self): extensions = ['res', 'lst', 'cif', 'fcf', 'mat', 'pdb'] if "xt" in self.program.name.lower(): extensions.append('hkl') if self.broadcast_mode: self.doBroadcast() for ext in extensions: if timer: t = time.time() if "xt" in self.program.name.lower() and ext != 'lst': copy_from = "%s/%s_a.%s" %(self.tempPath, self.shelx_alias, ext) else: copy_from = "%s/%s.%s" %(self.tempPath, self.shelx_alias, ext) copy_to = "%s/%s.%s" %(self.filePath, self.original_filename, ext) if os.path.isfile(copy_from): if copy_from.lower() != copy_to.lower(): shutil.copyfile(copy_from, copy_to) if timer: print "---- copying %s: %.3f" %(copy_from, time.time() -t) def doHistoryCreation(self, type="normal"): if type == "first": historyPath = "%s/%s.history" %(OV.StrDir(), OV.FileName()) if not os.path.exists(historyPath): type = 'normal' if type != "normal": return def setupFiles(self): olx.User("%s" %OV.FilePath()) self.filePath = OV.FilePath() self.fileName = OV.FileName() self.tempPath = "%s/.olex/temp" %OV.FilePath() if not os.path.exists(self.tempPath): os.mkdir(self.tempPath) ## clear temp folder to avoid problems old_temp_files = os.listdir(self.tempPath) for file_n in old_temp_files: try: if "_.res" or "_.hkl" not in file_n: os.remove(r'%s/%s' %(self.tempPath,file_n)) except OSError: continue self.hkl_src = OV.HKLSrc() if not os.path.exists(self.hkl_src): self.hkl_src = os.path.splitext(OV.FileFull())[0] + '.hkl' if os.path.exists(self.hkl_src): OV.HKLSrc(self.hkl_src) print "HKL Source Filename reset to default file!" else: raise Exception("Please choose a reflection file") self.hkl_src_name = os.path.splitext(os.path.basename(self.hkl_src))[0] self.curr_file = OV.FileName() copy_from = "%s" %(self.hkl_src) ## All files will be copied to the temp directory in lower case. This is to be compatible with the Linux incarnations of ShelX copy_to = "%s%s%s.hkl" %(self.tempPath, os.sep, self.shelx_alias) if not os.path.exists(copy_to): shutil.copyfile(copy_from, copy_to) copy_from = "%s%s%s.ins" %(self.filePath, os.sep, self.curr_file) copy_to = "%s%s%s.ins" %(self.tempPath, os.sep, self.shelx_alias) if not os.path.exists(copy_to): shutil.copyfile(copy_from, copy_to) #fab file... # copy_from = "%s%s%s.fab" %(self.filePath, os.sep, self.curr_file) copy_from = ".".join(OV.HKLSrc().split(".")[:-1]) + ".fab" copy_to = "%s%s%s.fab" %(self.tempPath, os.sep, self.shelx_alias) if os.path.exists(copy_from): if not os.path.exists(copy_to): shutil.copyfile(copy_from, copy_to) def runCctbxAutoChem(self): from AutoChem import OlexSetupRefineCctbxAuto print '+++ STARTING olex2.refine ++++++++++++++++++++++++++++++++++++' OV.reloadStructureAtreap(self.filePath, self.curr_file) #olx.Atreap(r"%s" %(r"%s/%s.ins" %(self.filePath, self.curr_file))) cctbx = OlexSetupRefineCctbxAuto('refine', self.params.snum.refinement.max_cycles) try: cctbx.run() except Exception, err: print err olex.f('GetVar(cctbx_R1)') print '+++ END olex2.refine +++++++++++++++++++++++++++++++++++++++++' def runAfterProcess(self): #olex.m("spy.run_skin sNumTitle") if 'olex2' not in self.program.name: if timer: t = time.time() self.doFileResInsMagic() if timer: print "--- doFilseResInsMagic: %.3f" %(time.time() - t) if timer: t = time.time() if self.HasGUI: olx.Freeze(True) OV.reloadStructureAtreap(self.filePath, self.curr_file, update_gui=False) if self.HasGUI: olx.Freeze(False) if timer: print "--- reloadStructureAtreap: %.3f" %(time.time() - t) # XT changes the HKL file - so it *will* match the file name if 'xt' not in self.program.name.lower(): OV.HKLSrc(self.hkl_src) else: if self.broadcast_mode: if timer: t = time.time() self.doBroadcast() if timer: print "--- doBroacast: %.3f" %(time.time() - t) lstFile = '%s/%s.lst' %(self.filePath, self.original_filename) if os.path.exists(lstFile): os.remove(lstFile) olx.DelIns("TREF") if self.params.snum.refinement.auto.max_peaks: max_peaks = olexex.OlexRefinementModel().getExpectedPeaks() if max_peaks <= 5: self.params.snum.refinement.auto.pruneQ = 0.5 self.params.snum.refinement.auto.assignQ = 6.0 OV.SetParam('snum.refinement.auto.pruneQ', 0.5) OV.SetParam('snum.refinement.auto.assignQ', 6.0) else: self.params.snum.refinement.auto.pruneQ = 1.5 self.params.snum.refinement.auto.assignQ = 2.0 OV.SetParam('snum.refinement.auto.pruneQ', 1.5) OV.SetParam('snum.refinement.auto.assignQ', 2.0) def getProgramMethod(self, fun): if fun == 'refine': self.prgType = prgType = 'refinement' prgDict = self.RPD prg = self.params.snum.refinement.program method = self.params.snum.refinement.method else: self.prgType = prgType = 'solution' prgDict = self.SPD prg = self.params.snum.solution.program method = self.params.snum.solution.method try: program = prgDict.programs[prg] except KeyError: print "Please choose a valid %s program" %prgType return None, None try: prgMethod = program.methods[method] except KeyError: print "Please choose a valid method for the %s program %s" %(prgType, prg) return None, None return program, prgMethod def startRun(self): OV.CreateBitmap('%s' %self.bitmap) LM.startRun(self) def endRun(self): self.method.unregisterCallback() OV.DeleteBitmap('%s' %self.bitmap) OV.Cursor() LM.endRun(self) def post_prg_html(self): if not OV.HasGUI(): return import gui.tools debug = bool(OV.GetParam('olex2.debug',False)) typ = self.prgType.lower() if typ=='refinement': return extra_msg = "" if typ == "refinement": extra_msg = "$spy.MakeHoverButton('small-Assign@refinement','ATA(1)')" elif typ == "solution" and self.program.name.lower() != "shelxt": extra_msg = gui.tools.TemplateProvider.get_template('run_auto_vss_box', force=debug) message = "