from __future__ import division import olex import olx import olexex import os import sys import OlexVFS from olexFunctions import OlexFunctions OV = OlexFunctions() debug = bool(OV.GetParam('olex2.debug',False)) timer = debug import glob global have_found_python_error have_found_python_error= False global last_formula last_formula = "" global last_element_html last_element_html = "" global current_sNum current_sNum = "" haveGUI = OV.HasGUI() import olexex import gui import re import time import math global regex_l regex_l = {} global cache cache = {} gui_green = OV.GetParam('gui.green') gui_orange = OV.GetParam('gui.orange') gui_red = OV.GetParam('gui.red') gui_grey = OV.GetParam('gui.grey') gui_yellow = OV.GetParam('gui.dark_yellow') import subprocess class FolderView: root = None class node: name = None full_name = None parent = None content = None def __init__(self, name, full_name=None): self.name = name if full_name: self.full_name = full_name else: self.full_name = name def toStr(self, prefix=""): s = prefix+self.name s += "\n%s" %(self.full_name) if self.content: prefix += '\t' for c in self.content: s += '\n%s%s' %(prefix,c.toStr(prefix)) return s def expand(self, mask, fname=""): self.content = [] if not fname: fname = self.name for i in os.listdir(fname): dn = os.path.normpath(fname + '/' + i) if os.path.isdir(dn) and i != '.olex' and i != 'olex2': dr = FolderView.node(i, dn) dr.expand(mask, dn) if len(dr.content): self.content.append(dr) else: if( os.path.splitext(i)[1] in mask): self.content.append(FolderView.node(i, dn)) def list(self, mask=".ins;.res;.cif;.oxm"): r = OV.GetParam('user.folder_view_root') if not r: r = "." try: f = olx.ChooseDir('Select folder', '%s' %r) except RuntimeError: f = None if f: self.root = FolderView.node(f) self.root.expand(mask=set(mask.split(';'))) olx.html.Update() def generateHtml(self): import OlexVFS if not self.root: return " " OV.SetParam('user.folder_view_root', self.root.name) data = self.root.toStr() OlexVFS.write_to_olex('folder_view.data', data.encode('utf-8')) return "" def loadStructure(self, v): if os.path.isfile(v): olex.m("reap '%s'" %v) fv = FolderView() olex.registerFunction(fv.list, False, "gui.tools.folder_view") olex.registerFunction(fv.generateHtml, False, "gui.tools.folder_view") olex.registerFunction(fv.loadStructure, False, "gui.tools.folder_view") def start_where(): if olx.IsFileLoaded() == "false": return from gui import SwitchPanel # if olx.xf.au.GetAtomCount() == "0" and olx.IsFileType('ires') == "true": # SwitchPanel('work') # flash_gui_control('btn-solve') # print "Use 'Solve' button in tab 'Work' to solve the structure." # return if olx.IsVar('start_where') == 'false': where = OV.GetParam('user.start_where').lower() SwitchPanel(where) olx.SetVar('start_where',False) olex.registerFunction(start_where, False, "gui.tools") def flash_gui_control(control, wait=300): ''' Flashes a control on the GUI in order to highlight it's position ''' if ';' in control: n = int(control.split(';')[1]) control = control.split(';')[0] else: n = 2 control_name = "IMG_%s" %control.upper() if '@' in control: print "@ in control" control_image = control.lower().split('@')[0] else: control_image = control if not olx.fs.Exists("%son.png" %control_image): print "This image %s does not exist. So I can't make it blink" %control_image return for i in xrange(n): if "element" in control: new_image = "up=%son.png" %control_image olx.html.SetImage(control_name,new_image) elif control.endswith('_bg'): cmd = 'html.setBG(%s,%s)' %(control_image.rstrip('_bg'), OV.GetParam('gui.html.highlight_colour','##ff0000')) olex.m(cmd) else: new_image = "up=%soff.png" %control_image olx.html.SetImage(control_name,new_image) OV.Refresh() olx.Wait(wait) if "element" in control: new_image = "up=%soff.png" %control olx.html.SetImage(control_name,new_image) elif control.endswith('_bg'): cmd = 'html.setBG(%s,%s)' %(control.rstrip('_bg'), '#fffff') olex.m(cmd) else: new_image = "up=%shighlight.png" %control_image olx.html.SetImage(control_name,new_image) OV.Refresh() olx.Wait(wait) if not control.endswith('_bg'): new_image = "up=%soff.png" %control_image olx.html.SetImage(control_name,new_image) olex.registerFunction(flash_gui_control, False, "gui.tools") def make_single_gui_image(img_txt="", img_type='h2', force=False): import PilTools import OlexVFS TI = PilTools.TI states = ["on", "off", "highlight", "", "hover", "hoveron"] alias = img_type for state in states: if img_type == "h2": alias = "h1" elif img_type == "h1": alias = img_type img_type = "h2" image = TI.make_timage(item_type=alias, item=img_txt, state=state, titleCase=False, force=force) name = "%s-%s%s.png" %(img_type, img_txt.lower(), state) OlexVFS.save_image_to_olex(image, name, 0) def inject_into_tool(tool, t, where, befaf='before'): import OlexVFS txt = OlexVFS.read_from_olex('%s/%s' %(OV.BaseDir(),tool)) if befaf == 'before': txt = txt.replace(where, "%s%s" %(t, where)) else: txt = txt.replace(where, "%s%s" %(where, t)) OlexVFS.write_to_olex('%s/%s' %(OV.BaseDir(), tool),txt) def __inject_into_tool(tool, t, where,befaf='before'): import OlexVFS txt = OlexVFS.read_from_olex('%s/%s' %(OV.BaseDir(),tool)) if befaf == 'before': txt = txt.replace(where, "%s%s" %(t, where)) else: txt = txt.replace(where, "%s%s" %(where, t)) OlexVFS.write_to_olex('%s%s' %(OV.BaseDir(), tool), u, txt) def add_tool_to_index(scope="", link="", path="", location="", before="", filetype="", level="h2", state="2", image="", onclick=""): import OlexVFS if not OV.HasGUI: return if not scope: return if not link: return if not path: return ''' Automatically add a link to GUI to an Olex2 index file. ''' if not location: location = OV.GetParam('%s.gui.location' %scope) if not before: before = OV.GetParam('%s.gui.before' %scope) if not location: return _ = r"%s/%s" %(OV.BaseDir(), location) if os.path.exists(_): file_to_write_to = _ else: file_to_write_to = r'%s/etc/gui/blocks/index-%s.htm' %(OV.BaseDir().replace(r"//","/"), location) if not os.path.exists(file_to_write_to): print "This location does not exist: %s" %file_to_write_to file_to_write_to = '%s/etc/gui/blocks/index-%s.htm' %(OV.BaseDir().replace(r"//","/"), "tools") before = "top" file_to_write_to = file_to_write_to.replace(r"//","/") txt = OlexVFS.read_from_olex(file_to_write_to) if onclick: OlexVFS.write_to_olex('%s/%s.htm' %(path, link), "") if not filetype: t = r''' ''' %(level, location, scope, link, path, link, image, onclick, state) else: t = r''' ''' %(filetype, level, location, scope, link, path, link, image, onclick, state) index_text = "" if t not in txt: if before.lower() == "top": u = "%s\n%s" %(t, txt) elif before not in txt or before.lower() == "end": u = "%s\n%s" %(txt, t) else: u = "" for line in txt.strip().split("\r\n"): if not line: continue li = line if r"" %fn #return fn OV.registerFunction(makeFormulaForsNumInfo) def make_cell_dimensions_display(): t1 = time.time() global current_sNum #if OV.FileName() == current_sNum: #return "" l = ['a', 'b', 'c', 'alpha', 'beta', 'gamma'] d = {} for x in l: val = olx.xf.uc.CellEx(x) if "90.0" in val and "(" in val or '90(' in val and not "." in val: help_txt = "Help from File does not exist. Apologies." help = ''' $spy.MakeHoverButton('btn-info@cell@%s',"spy.make_help_box -name=cell-not-quite-90 -popout='False' -helpTxt='%s'")''' %(x, help_txt) _ = os.path.join(OV.BaseDir(), "etc", "gui", "help", "cell_angle_not_quite_90.htm") if os.path.exists(_): help_txt = open(_,'r').read() href = "spy.make_help_box -name=cell-angle-not-quite-90 -popout=False -helpTxt='%s'" %help_txt val = '%s' %(href, OV.GetParam('gui.red').hexadecimal, val) d[x] = val d['volume'] = olx.xf.uc.VolumeEx() d['Z'] = olx.xf.au.GetZ() d['Zprime'] = olx.xf.au.GetZprime() t = '''  a = %(a)s  α = %(alpha)s°  Z = %(Z)s  b = %(b)s  β = %(beta)s°  Z' = %(Zprime)s  c = %(c)s  γ = %(gamma)s°  V = %(volume)s ''' %d OV.write_to_olex('celldimensiondisplay.htm', t) #if debug: #print "Cell: %.5f" %(time.time() - t1) return "" OV.registerFunction(make_cell_dimensions_display,True,"gui.tools") def weightGuiDisplay_new(): if olx.IsFileType('ires').lower() == 'false': return '' longest = 0 retVal = "" current_weight = olx.Ins('weight') if current_weight == "n/a": return "" current_weight = current_weight.split() if len(current_weight) == 1: current_weight = [current_weight[0], '0'] length_current = len(current_weight) suggested_weight = OV.GetParam('snum.refinement.suggested_weight') if suggested_weight is None: suggested_weight = [] if len(suggested_weight) < length_current: for i in xrange (length_current - len(suggested_weight)): suggested_weight.append(0) if suggested_weight: for curr, sugg in zip(current_weight, suggested_weight): curr = float(curr) if curr-curr*0.01 <= sugg <= curr+curr*0.01: colour = gui_green elif curr-curr*0.1 < sugg < curr+curr*0.1: colour = gui_orange else: colour = gui_red sign = "▲" if curr-sugg == 0: sign = "" sugg = 0 elif curr-sugg > 0: sign = "▼" retVal += "%.3f %s  | " %(curr, colour, sign) html_scheme = retVal.strip("| ") else: html_scheme = current_weight wght_str = "" for i in suggested_weight: wght_str += " %.3f" %i txt_tick_the_box = OV.TranslatePhrase("Tick the box to automatically update") html = "%s" %html_scheme return html OV.registerFunction(weightGuiDisplay_new,True,"gui.tools") def weightGuiDisplay(): if olx.IsFileType('ires').lower() == 'false': return '' html_scheme = "" tol_green, tol_orange = 0.01, 0.1 current_weight = olx.Ins('weight') if current_weight == "n/a": return "" current_weight = current_weight.split() if len(current_weight) == 1: current_weight = [current_weight[0], '0'] length_current = len(current_weight) suggested_weight = OV.GetParam('snum.refinement.suggested_weight') if suggested_weight is None: suggested_weight = [] if len(suggested_weight) < length_current: for i in xrange (length_current - len(suggested_weight)): suggested_weight.append(0) if suggested_weight: d = {} i = 0 for curr, sugg in zip(current_weight, suggested_weight): i += 1 curr = float(curr) if curr < 1: prec = 3 elif curr < 10: prec = 2 elif curr < 100: prec = 1 else: prec = 0 if sugg >= curr*(1-tol_green) and sugg <= curr*(1+tol_green): colour = gui_green elif sugg >= curr*(1-tol_orange) and sugg <= curr*(1+tol_orange): colour = gui_orange else: colour = gui_red _ = "%%.%sf"%prec curr = (_ %curr).lstrip('0') sugg = (_ %sugg).lstrip('0') dd = {'curr_%i' %i:curr, 'sugg_%i' %i:sugg, 'col_%i' %i:colour, } d.update(dd) if html_scheme: html_scheme += "| " html_scheme += "%s(%s)" %(colour, curr, sugg) else: html_scheme = current_weight html_scheme= "%s"%html_scheme txt_tick_the_box = OV.TranslatePhrase("Tick the box to automatically update") txt_Weight = OV.TranslatePhrase("Weight") html = ''' %s ''' %("Update Weighting Scheme", html_scheme) weight_display = gui.tools.TemplateProvider.get_template('weight_button', force=debug)%d return weight_display OV.registerFunction(weightGuiDisplay,True,"gui.tools") def number_non_hydrogen_atoms(): return sum(atom['occu'][0] for atom in self.atoms() if atom['type'] not in ('H','Q')) def getExpectedPeaks(): orm = olexex.OlexRefinementModel() return orm.getExpectedPeaks() def refine_extinction(): retVal = "" _ = olx.xf.rm.Exti() if "n/a" not in _.lower() and _ != '0': if "(" in _: _ = _.split('(') exti = _[0] esd = _[1].rstrip(')') exti_f = float(exti) _ = len(exti) - len(esd) -2 esd_f = float("0.%s%s" %(_*"0", esd)) else: exti = _ esd = "" OV.SetParam('snum.refinement.refine_extinction',1) OV.SetParam('snum.refinement.refine_extinction_tickbox', True) retVal = "%s(%s)"%(exti,esd) else: OV.SetParam('snum.refinement.refine_extinction',0) OV.SetParam('snum.refinement.refine_extinction_tickbox', False) return retVal ### The stuff below needs careful thinking about. For now, revert back to simple on/off operation. Sorry Guys! ## snmum.refine_extinction 0: DO NOT refine extinction AGAIN ## snmum.refine_extinction 1: Try and refine extinction ## snmum.refine_extinction 2: Refine in any case #if getExpectedPeaks() > 2: #OV.SetParam('snum.refinement.refine_extinction',1) #return "Not Tested" #retVal = "n/a" #_ = olx.xf.rm.Exti() #if "n/a" not in _.lower() and _ != '0': #_ = _.split('(') #exti = _[0] #esd = _[1].rstrip(')') #exti_f = float(exti) #_ = len(exti) - len(esd) -2 #esd_f = float("0.%s%s" %(_*"0", esd)) #_ = OV.GetParam('snum.refinement.refine_extinction',1) #if _ == 3: #retVal = "%s(%s)"%(exti,esd) #retVal += "" %gui_green #if _ == 0: #OV.SetParam('snum.refinement.refine_extinction_tickbox',False) #retVal="not refined" %gui_red #else: #OV.SetParam('snum.refinement.refine_extinction_tickbox', True) #if exti_f/esd_f < 2: #print "Extinction was refined to %s(%s). From now on, it will no longer be refined, unless you tick the box in the refinement settings" %(exti, esd) #OV.SetParam('snum.refinement.refine_extinction',1) #olex.m("DelIns EXTI") #retVal = "%s(%s)"%(exti,esd) #else: #retVal = "%s(%s)"%(exti,esd) #else: #if OV.GetParam('snum.refinement.refine_extinction_tickbox'): #olex.m("AddIns EXTI") #return retVal OV.registerFunction(refine_extinction,True,"gui.tools") def deal_with_gui_phil(action): skin_name = OV.GetParam('gui.skin.name', 'default') skin_extension = OV.GetParam('gui.skin.extension', None) gui_phil_path = "%s/gui.phil" %(OV.DataDir()) if action == 'load': OV.SetHtmlFontSize() OV.SetHtmlFontSizeControls() olx.gui_phil_handler.reset_scope('gui') gui_skin_phil_path = "%s/etc/skins/%s.phil" %(OV.BaseDir(), skin_name) if not os.path.isfile(gui_skin_phil_path): gui_skin_phil_path = "%s/gui.params" %(OV.BaseDir()) if os.path.isfile(gui_skin_phil_path): gui_skin_phil_file = open(gui_skin_phil_path, 'r') gui_skin_phil = gui_skin_phil_file.read() gui_skin_phil_file.close() olx.gui_phil_handler.update(phil_string=gui_skin_phil) if skin_extension: gui_skin_phil_path = "%s/etc/skins/%s.phil" %(OV.BaseDir(), skin_extension) if os.path.isfile(gui_skin_phil_path): gui_skin_phil_file = open(gui_skin_phil_path, 'r') gui_skin_phil = gui_skin_phil_file.read() gui_skin_phil_file.close() olx.gui_phil_handler.update(phil_string=gui_skin_phil) else: olx.gui_phil_handler.save_param_file( file_name=gui_phil_path, scope_name='gui', diff_only=True) def get_regex_l(src_file, base=None): global regex_l if not src_file: return False #if not src_file in regex_l: re_l = [] l = None try: l = gui.file_open(src_file, base=base, readlines=True) except: l = open(src_file, 'r').readlines() if not l: return None for item in l: item = item.strip() if item.startswith('#') or not item: continue item_l = item.split("::") find = item_l[0].strip().strip("%%") replace = item_l[1].strip() re_l.append((find,replace)) regex_l.setdefault('%s'%src_file,re_l) return regex_l[src_file] def run_regular_expressions(txt, src_file=None, re_l=None, specific="", base=None): try: global regex_l if not re_l: re_l = get_regex_l(src_file, base=base) if timer: t_timer=time.time() for pair in re_l: if specific: if pair[0] != specific: continue regex = re.compile(r"%s" %pair[0], re.X|re.M|re.S|re.U) replace = pair[1].strip("'") replace = pair[1].strip('"') try: txt = regex.sub(r"%s" %replace, txt) except Exception, err: print err if timer: print_timer(tt, t_timer, pad=" ", sep="..") except Exception: if debug: PrintException() finally: return txt class LogListen(): def __init__(self): self.printed = [] OV.registerCallback("onlog", self.onListen) def onListen(self, txt): self.printed.append(txt) def endListen(self): OV.unregisterCallback("onlog", self.onListen) l = [] for item in self.printed: item = item.split('\r\n') for tem in item: if type(tem) == unicode: l.append(tem) else: for em in tem: l.append(em) return l class Templates(): def __init__(self): self.templates = {} self.get_all_templates() def get_template(self, name=None, force=debug, path=None, mask="*.*", marker='{-}', base=None, template_file=None): ''' Returns a particular template from the Template.templates dictionary. If it doesn't exist, then it will try and get it, and return a 'not found' string if this does not succeed. -- if force==True, then the template will be reloaded -- if path is provided, then this location will also be searched. ''' if not name: self.get_all_templates(path=path, mask=mask, marker=marker, template_file=template_file) return retVal = self.templates.get(name, None) if not retVal or force: self.get_all_templates(path=path, mask=mask, marker=marker, template_file=template_file) retVal = self.templates.get(name, None) #if not retVal: #import OlexVFS #path = os.path.join(path, name) #path = path.replace("\\","/") #retVal = OlexVFS.read_from_olex(path) if not retVal: return "Template %s has not been found."%name else: return retVal def get_all_templates(self, template_file=None, path=None, mask="*.*", marker='{-}'): ''' Parses the path for template files. ''' if template_file: g = [] p = os.path.join(path, template_file) g.append(p) else: if not path: path = os.path.join(OV.BaseDir(), 'util', 'pyUtil', 'gui', 'templates') if path[-4:-3] != ".": #i.e. a specific template file has been provided g = glob.glob("%s%s%s" %(path,os.sep,mask)) else: g = [path] _ = os.path.join(OV.DataDir(), 'custom_templates.html') if os.path.exists(_): g.append(_) for f_path in g: include = ["txt", "html", "htm"] ext = f_path.split(".")[-1:][0] if ext: if ext not in include: continue fc = gui.file_open(f_path, mode='r', base=path) if not fc: continue if not self._extract_templates_from_text(fc,marker=marker): name = os.path.basename(os.path.normpath(f_path)) self.templates[name] = fc #for name in self.templates: #OlexVFS.write_to_olex(name, self.templates[name]) def _extract_templates_from_text(self, t, marker): mark = marker.split('-') regex = re.compile(r't:(.*?)\%s(.*?)\%s' %(mark[0], mark[1]),re.DOTALL) m=regex.findall(t) if m: for item in m: name = item[0] content = item[1] self.templates[name] = content return True else: return False TemplateProvider = Templates() def get_diagnostics_colour(scope, item, val, number_only=False): grade_1_colour = OV.GetParam('gui.skin.diagnostics.colour_grade1').hexadecimal grade_2_colour = OV.GetParam('gui.skin.diagnostics.colour_grade2').hexadecimal grade_3_colour = OV.GetParam('gui.skin.diagnostics.colour_grade3').hexadecimal grade_4_colour = OV.GetParam('gui.skin.diagnostics.colour_grade4').hexadecimal try: val = float(val) if "shift" in item: if val < 0: val = -val except: val = 0 mindfac = 1 if item == 'MinD': mindfac = float(olx.xf.exptl.Radiation())/0.71 op = OV.GetParam('user.diagnostics.%s.%s.op' %(scope, item)) if op == "between": soll = OV.GetParam('user.diagnostics.%s.%s.soll' %(scope, item)) for i in xrange(4): i += 1 if op == "greater": if val >= OV.GetParam('user.diagnostics.%s.%s.grade%s' %(scope, item, i)) * mindfac: break elif op == 'smaller': if val <= OV.GetParam('user.diagnostics.%s.%s.grade%s' %(scope, item, i)) * mindfac: break elif op == 'between': if val - (OV.GetParam('user.diagnostics.%s.%s.grade%s' %(scope, item, i))) * mindfac <= soll <= val + (OV.GetParam('user.diagnostics.%s.%s.grade%s' %(scope, item, i))) * mindfac: break if number_only: return i if i == 1: retVal = grade_1_colour elif i == 2: retVal = grade_2_colour elif i == 3: retVal = grade_3_colour elif i == 4: retVal = grade_4_colour return retVal def get_battery_image(colour, colourize=True): from PIL import Image, ImageDraw from ImageTools import IT as IT name = "battery_%s.png" %colour if OlexVFS.exists(name): return name d_col = {'green':gui_green, 'yellow':gui_yellow, 'orange':gui_orange, 'red':gui_red} max_dots = 4 d_dots = {'green':4, 'yellow':3, 'orange':2, 'red':1} n_dots = d_dots[colour] src_battery = os.path.join(OV.BaseDir(), "etc", "gui", "images", "src", "battery_rgb.png") IM_battery = Image.open(src_battery) bg = Image.new('RGBA', IM_battery.size, OV.GetParam('gui.html.table_bg_colour').rgb) im = Image.alpha_composite(bg, IM_battery) draw = ImageDraw.Draw(im) width, height = bg.size col = d_col[colour].rgb top_gap = int(height*0.11) bot_gap = int(height*0.04) gaps = int(height*0.06) avail_height = height - top_gap - bot_gap - gaps*(max_dots+1) boxHeight = int(avail_height/max_dots) boxWidth = int(width*0.6) for dot in range(n_dots): i = max_dots-dot top = height-bot_gap - (boxHeight+gaps)*(dot+1) left = int((width - boxWidth)/2) box = (left,top,boxWidth+left,boxHeight+top) draw.rectangle(box, fill=col) new_width = 18 new_height = int(im.size[1]/im.size[0] * 18) IM = im.resize((new_width,new_height), Image.ANTIALIAS) OlexVFS.save_image_to_olex(IM, name, 0) return name def get_data_number(): try: import olex_core hkl_stats = olex_core.GetHklStat() data = hkl_stats.get('DataCount', None) absences = hkl_stats.get('SystematicAbsencesRemoved', 0) if not data: try: data = int(olx.Cif('_reflns_number_gt')) except: return data if OV.GetParam('user.diagnostics.refinement.dpr.halve_for_non_centro'): if not olex_core.SGInfo()['Centrosymmetric']: data = int(data/2) return data except Exception as err: print("An error occured: %s" %err) def get_Z_prime_from_fraction(string): val = string if "/" in val: _ = val.split("/") val = int(_[0])/int(_[1]) olx.xf.au.SetZprime(val) olex.registerFunction(get_Z_prime_from_fraction, False, "gui") def get_parameter_number(): parameters = OV.GetParam('snum.refinement.parameters', None) if not parameters: try: parameters = int(olx.Cif('_refine_ls_number_parameters')) except: pass return parameters def GetDPRInfo(): hklsrc=OV.HKLSrc() retVal = "" data = get_data_number() parameters = get_parameter_number() dpr = None if data and parameters: dpr = data/parameters if dpr: if dpr in cache: return cache[dpr] else: return dpr_col_number = gui.tools.get_diagnostics_colour('refinement','dpr', dpr, number_only=True) text_output= ["Data/Parameter ratio is very good", "Data/Parameter ratio is adequate", "Data/Parameter ratio is low", "Data/Parameter ratio is VERY LOW"] colour_txt= ["green", "yellow", "orange", "red"] idx = 4 - dpr_col_number colour = colour_txt[idx] name = "battery_%s.png" %colour if not OlexVFS.exists(name): try: name = get_battery_image(colour) except: name = os.path.join(OV.BaseDir(), "etc", "gui", "images", "src", "battery_%s.png" %colour) image = """ """%(name, text_output[idx]) image = """ """%(text_output[idx],text_output[idx],name) if dpr <= 10: disp_dpr = "%.2f"%dpr else: disp_dpr = "%.1f"%dpr d = { 'dpr':disp_dpr, 'image':image, } t = """
%(image)s
  %(dpr)s 
""" %d retVal = t cache[dpr] = t return retVal OV.registerFunction(GetDPRInfo) def GetRInfo(txt="",d_format='html'): if not OV.HasGUI(): return t = "ERROR!" if olx.IsFileType('cif') == "true": R1 = olx.Cif('_refine_ls_R_factor_gt') wR2 = olx.Cif('_refine_ls_wR_factor_ref') else: R1 = OV.GetParam('snum.refinement.last_R1') wR2 = OV.GetParam('snum.refinement.last_wR2') if not R1 or R1 == 'n/a' or not wR2 or wR2 == 'n/a': import History try: _ = History.tree.active_node except: R1 = wR2 = 'n/a' return if _ is not None: R1 = _.R1 wR2 = _.wR2 else: try: look = olex.f('IsVar(snum_refinement_last_R1)') if look == "true": R1 = olex.f('GetVar(snum_refinement_last_R1)') else: if olx.IsFileType('cif') == "true": R1 = olx.Cif('_refine_ls_R_factor_gt') else: R1 = olex.f('Lst(R1)') except: R1 = 'n/s' return R1 if R1 == cache.get('R1', None) and wR2 == cache.get('wR2', None) and cache.has_key('GetRInfo'): if d_format == 'html': return cache.get('GetRInfo', 'XXX') return FormatRInfo(R1, wR2, d_format) OV.registerFunction(GetRInfo) def FormatRInfo(R1, wR2,d_format): cache['R1'] = R1 cache['wR2'] = wR2 font_size_R1 = olx.GetVar('HtmlFontSizeExtraLarge') font_size_wR2 = olx.GetVar('HtmlFontSizeMedium') if 'html' in d_format: try: R1 = float(R1) col_R1 = gui.tools.get_diagnostics_colour('refinement','R1', R1) R1 = "%.2f" %(R1*100) wR2 = float(wR2) col_wR2 = gui.tools.get_diagnostics_colour('refinement','wR2', wR2) wR2 = "%.2f" %(wR2*100) d = { 'R1':R1, 'wR2':wR2, 'font_size_R1':font_size_R1, 'font_size_wR2':font_size_wR2, 'font_size_label':str(int(font_size_wR2) - 1), 'font_colour_R1':col_R1, 'font_colour_wR2':col_wR2, 'grey':gui_grey } if 'report' in d_format: t =gett('R_factor_display_report')%d else: t =gett('R_factor_display')%d except: disp = R1 if not R1: disp = "No R factors!" t = "%s" %(font_size_wR2, gui_grey, disp) finally: retVal = t elif d_format == 'float': try: t = float(R1) except: t = 0 finally: retVal = t cache['GetRInfo'] = retVal return retVal def launchWithoutConsole(command, args): """Launches 'command' windowless and waits until finished""" startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW return subprocess.Popen([command] + args, startupinfo=startupinfo).wait() def resize_pdf(f_in, setting='printer'): if ".pdf" in f_in: small_file = f_in.split(".")[0] + "_small" + f_in.split(".")[1] big_file = f_in else: small_file = f_in + "_small.pdf" big_file = f_in + ".pdf" options = "-sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/%s -dNOPAUSE -dQUIET -dBATCH -sOutputFile=%s %s" %(setting, small_file, big_file) cmd = r'"C:\Program Files\gs\gs9.06\bin\gswin64" ' + options os.system(cmd) OV.registerFunction(resize_pdf,False,'gui.tools') gett = TemplateProvider.get_template def make_input_html_tool(scope, tool): fn = "%s_%s_tool.htm" %(scope, tool) if OlexVFS.exists(fn) and not debug: return fn name = "%s_%s" %(scope.upper(), tool.upper()) d = {'scope':scope, 'tool':tool, 'image': tool, 'name': name, 'onclick':"",} OlexVFS.write_to_olex(fn, gett('input_html_tool')%d) return fn OV.registerFunction(make_input_html_tool,False,'gui.tools') def scrub(cmd): log = gui.tools.LogListen() olex.m(cmd) return log.endListen() from GetMaskInfo import get_mask_info global twinlawsfromhklsrc twinlawsfromhklsrc = {} def get_twin_law_from_hklf5(): try: global twinlawsfromhklsrc src = OV.HKLSrc() if src not in twinlawsfromhklsrc: cmd = "HKLF5 %s" %src res = scrub(cmd) if "HKLF5 file is expected" in " ".join(res): htm = "This is not an HKLF5 format hkl file." elif "negative batch numbers" in " ".join(res): htm = "This is not an HKLF5 format hkl file (no negative batch numbers)." else: htm = "Batch %s : " %res[2][-1] htm += " | ".join([res[4], res[6], res[8]]) twinlawsfromhklsrc.setdefault(src, htm) return twinlawsfromhklsrc[src] except: return "ERR: Please check 'tools.get_twin_law_from_hklf5'" OV.registerFunction(get_twin_law_from_hklf5, False, 'tools') def hklf_5_to_4(filename): ''' Creates a hklf4 file corresponding to the first component of the structure This function will only retrieve component 1. Need to seperate double-lines based on basf which is harder - making seperate function (Laura Midgely) ''' hklf4name="%s_hklf4.hkl"%filename hklf4=open(hklf4name,"w") #put in a thing to note 'you seem to have positive numbers which correlate to things not in the first component - maybe try with basfs'. base_file=open("%s.hkl"%filename,"r") for line in base_file: line=line.rstrip() right=line[-2:] if (right==" 1" or right=="-1"): hklf4.write(line[:-2]+"\n") base_file.close() hklf4.close() print "done. HKLF4 base file at %s"%hklf4name return OV.registerFunction(hklf_5_to_4, False, 'tools') def record_commands(): res = scrub() def show_nsff(): retVal = False if OV.have_nsff(): retVal = True return retVal OV.registerFunction(show_nsff, False, 'tools') class DisorderDisplayTools(object): def __init__(self): self.unique_selection = "" ##self.haveHighlights = False OV.registerFunction(self.hasDisorder,False,'gui.tools') OV.registerFunction(self.show_unique_only,False,'gui.tools') OV.registerFunction(self.make_unique,False,'gui.tools') OV.registerFunction(self.sel_part,False,'gui.tools') OV.registerFunction(self.make_disorder_quicktools,False,'gui.tools') OV.registerFunction(self.set_part_display,False,'gui.tools') def hasDisorder(self): olx_atoms = olexex.OlexRefinementModel() parts = olx_atoms.disorder_parts() if not parts: return False else: sp = set(parts) if len(sp) == 1 and 0 in sp: return False else: return True def show_unique_only(self): if OV.GetParam('user.parts.keep_unique') == True: self.make_unique(add_to=True) if self.unique_selection: olex.m('Sel -u') olx.Uniq() olx.Sel(self.unique_selection) olx.Uniq() def make_unique(self, add_to=False): if not self.unique_selection: add_to = True if add_to: olex.m('sel -a') _ = " ".join(scrub('Sel')) _ = _.replace('Sel',' ') while " " in _: _ = _.replace(" ", " ").strip() _l = _.split() if _: if add_to and self.unique_selection: _l += self.unique_selection.split() _l = list(set(_l)) unique_selection = " ".join(_l) olx.Sel(self.unique_selection) olx.Uniq() def sel_part(self, part,sel_bonds=True): select = OV.GetParam('user.parts.select') if not select: return else: olex.m("sel part %s" %part) if sel_bonds: olex.m("sel bonds where xbond.a.selected==true||xbond.b.selected==true") def make_disorder_quicktools(self, scope='main', show_options=True): import olexex if 'scope' in scope: scope = scope.split('scope=')[1] parts = set(olexex.OlexRefinementModel().disorder_parts()) select = OV.GetParam('user.parts.select') display = OV.GetParam('user.parts.display') parts_display = "" sel = "" d = {} for item in parts: _ = None if item == 0: continue else: d['part'] = item d['parts'] = item d['scope'] = scope d['show_options'] = show_options if select: sel = ">>sel part %s" %item parts_display += gui.tools.TemplateProvider.get_template('part_0_and_n', force=debug)%d dd={'parts_display':parts_display, 'scope':scope, 'show_options':show_options} return self.load_disorder_tool_template(dd) def load_disorder_tool_template(self, d): if d['show_options']: retVal = gui.tools.TemplateProvider.get_template('disorder_quicktool', force=debug)%d else: retVal = gui.tools.TemplateProvider.get_template('disorder_quicktool_no_options', force=debug)%d return retVal #def clear_higlights(self): #if self.haveHighlights: #olex.m("sel %s"%self.haveHighlights) #olex.m("mask 48") #olex.m("Individualise") #self.haveHighlights = False def set_part_display(self, parts,part): self.show_unique_only() olex.m("ShowP 0 %s -v=spy.GetParam(user.parts.keep_unique)" %parts) if OV.GetParam('user.parts.select'): olex.m('sel part %s' %parts) DisorderDisplayTools_instance = DisorderDisplayTools()