import os
import re
from fractions import Fraction
from olexFunctions import OV
import OlexVFS
try:
from_outside = False
p_path = os.path.dirname(os.path.abspath(__file__))
except:
from_outside = True
p_path = os.path.dirname(os.path.abspath("__file__"))
import olx
import olex
import iotbx.cif.model
import CifInfo
debug = OV.IsDebugging()
global mask_info_has_updated
mask_info_has_updated = False
gui_green = OV.GetParam('gui.green').hexadecimal
gui_orange = OV.GetParam('gui.orange').hexadecimal
gui_red = OV.GetParam('gui.red').hexadecimal
gui_grey = OV.GetParam('gui.grey').hexadecimal
gui_light_grey = OV.GetParam('gui.light_grey').hexadecimal
gui_highlight = OV.GetParam('gui.html.highlight_colour').hexadecimal
gui_width = OV.GetParam('gui.htmlpanelwidth')
OV.SetParam('snum.masks.special_detail_colour', gui_green)
from PeriodicTable import PeriodicTable
PT = PeriodicTable()
pt = PT.PeriodicTable()
import gui
template_path = os.path.join(OV.DataDir(), 'mask_output.htm')
if not os.path.exists(template_path):
template_path = os.path.join(p_path, 'mask_output.htm')
def get_mask_info():
if not olx.cif_model:
import CifInfo
CifInfo.ExtractCifInfo()
global mask_info_has_updated
import gui
output_fn = '%s_masking_info.htm' % OV.ModelSrc()
get_template = gui.tools.TemplateProvider.get_template
if olx.IsFileLoaded() != 'true':
return return_note("")
if (olx.IsFileType('cif') == 'true'):
return return_note("")
based_on = OV.GetParam('user.masks.based_on')
based_on_display = "Asymmetric Unit"
if based_on == "FU":
based_on_display = "Formula Unit"
elif based_on == "Cell":
based_on_display = "Unit Cell"
# print ".. %s .." %template_path
global current_sNum
current_sNum = OV.ModelSrc()
prg = OV.GetParam('snum.refinement.recompute_mask_before_refinement_prg', "Olex2")
if prg == "Platon":
base = "platon_squeeze"
else:
base = "smtbx_masks"
# change_hklsrc_according_to_mask_prg(prg)
d = {}
d['table_bg'] = olx.GetVar('HtmlTableBgColour')
d['based_on'] = based_on
d['based_on_display'] = based_on_display
d['row_begin'] = get_template('row_begin', path=template_path, force=debug) % d
d['row_end'] = get_template('row_end', path=template_path, force=debug) % d
d['table_begin'] = get_template('table_begin', path=template_path, force=debug) % d
d["note"] = "No Masking Information"
d["note_bg"] = OV.GetVar('HtmlHighlightCOlour')
_ = escape_param_names(name=OV.ModelSrc())
mask_special_details_vn = "%s_%s" % (_, "mask_special_details")
is_CIF = (olx.IsFileType('cif') == 'true')
sqf = None
if is_CIF:
volumes = olx.Cif('_%s_void_volume' % base).split(",")
electrons = olx.Cif('_%s_void_count_electrons' % base).split(",")
contents = olx.Cif('_%s_void_content' % base).split(",")
details = olx.Cif('_%s_details' % base).split(",")
mask_special_details = olx.Cif('_%s_special_details' % base).split(",")
mask_special_details = mask_special_details[0].strip().lstrip("'").rstrip("'")
else:
try:
sqf_f = get_sqf_name(base=base)
rFile = open(sqf_f, 'r').read()
if "platon_squeeze" in rFile:
base = "platon_squeeze"
if not rFile.startswith("data_"):
rFile = "data_%s\n" % str(current_sNum) + rFile
sqf = iotbx.cif.fast_reader(input_string=rFile).model()
except Exception as err:
return return_note(note="No masking info yet! ", col=gui_green)
if sqf:
if current_sNum not in sqf:
sqf_block = sqf[sqf.keys()[0]]
OV.PrintMaskHKLWarning(
"Warning: mask data name (%s) does not match file name (%s) - check HKL file used for the refinement!"
% (sqf.keys()[0], current_sNum))
else:
sqf_block = sqf[current_sNum]
olx.cif_model[current_sNum].update(sqf_block)
volumes = olx.cif_model[current_sNum].get('_%s_void_volume' % base)
if not volumes:
return return_note(note="No void has been found.", col=gui_orange)
electrons = olx.cif_model[current_sNum].get('_%s_void_count_electrons' % base)
contents = olx.cif_model[current_sNum].get('_%s_void_content' % base)
details = olx.cif_model[current_sNum].get('_%s_details' % base)
mask_special_details = olx.cif_model[current_sNum].get('_%s_special_details' % base)
if mask_special_details:
mask_special_details = mask_special_details.strip()
numbers = olx.cif_model[current_sNum].get('_%s_void_nr' % base, None)
if numbers == ['n/a']:
return return_note(note="No Voids Found", col=gui_green)
if not numbers:
numbers = olx.cif_model[current_sNum].get('_%s_void_nr' % base)
if not numbers:
if is_CIF:
numbers = olx.Cif('_%s_void_nr' % base).split(",")
if not numbers:
return return_note(note="No Voids in CIF", col=gui_green)
Z = float(olx.xf.au.GetZ())
Zprime = float(olx.xf.au.GetZprime())
number_of_symm_op = round(Z / Zprime)
Z = round(Z)
Zprime = Z / number_of_symm_op
t = get_template('mask_output_table_begin', path=template_path, force=debug) % d
t += get_template('mask_output_table_header_rp', path=template_path, force=debug) % d
ident_l = []
for number, volume, electron, content in zip(numbers, volumes, electrons, contents):
volume = "%.0f" % round(float(volume), 0)
electron = "%.0f" % round(float(electron), 0)
ident_l.append((volume, electron))
accounted_for = {}
sum_content = []
sum_e = 0
total_void_volume = 0
total_void_electrons = 0
total_void_accounted_for_electrons = 0
total_void_no = 0
f = get_adjust_for_base_factor()
for number, volume, electron, content in zip(numbers, volumes, electrons, contents):
multi_idx = []
electrons_accounted_for = 0
non_h_accounted_for = 0
volume = float(volume)
electron = float(electron)
volume = "%.0f" % round(volume, 0)
electron = "%.0f" % round(electron, 0)
_ = (volume, electron)
got_it = False
for accounted_for_entry in accounted_for:
if volume in accounted_for_entry:
got_it = True
if got_it:
continue
multiplicity = 0
i = 1
_idx = []
for occ in ident_l:
# if _ == occ:
if volume == occ[0]:
multiplicity += 1
_idx.append(str(i))
i += 1
for bit in _idx:
multi_idx.append("%s|%s" % (bit, multiplicity))
accounted_for.setdefault(volume, [])
accounted_for[volume].append(_[0])
moiety = OV.get_cif_item('_chemical_formula_moiety', None)
if not moiety or "[]" in moiety or "[+ solvents]" in moiety:
moiety = olx.xf.latt.GetMoiety()
electron = float(electron) * multiplicity
volume = float(volume) * multiplicity
if float(volume) < 15:
continue
#f = get_adjust_for_base_factor()
#volume *= f
#electron *= f
d['number'] = number
d['electron'] = "%.0f" % float(electron)
d['volume'] = "%.0f" % float(volume)
d['multiplicity'] = format_number(multiplicity)
d['formula'] = get_rounded_formula(as_string_sep=" ")
d['moiety'] = moiety
d['based_on'] = based_on
d['based_on_display'] = based_on_display
total_void_electrons += electron
total_void_volume += volume
total_void_no += 1
content = content.strip("'")
_ = content.split(",")
content_disp_l = []
for entry in _:
if not entry or entry == "?":
continue
sum_content.append((multiplicity, entry))
entity, user_number = split_entity(entry)
user_number = float(user_number)
ent = moieties.get(entity.lower(), entity)
ent = formula_cleaner(str(ent))
try:
Z, N = get_sum_electrons_from_formula(ent)
electrons_accounted_for += Z * user_number
non_h_accounted_for += N * user_number
except:
electrons_accounted_for += 0
if entity and entity != "?":
_ = "%s %s" % (format_number(multiplicity * user_number / f), entity)
if ent:
content_disp_l.append(_)
else:
content_disp_l.append("%s" % (gui.red, _))
else:
_ = "%s" % (gui.red, entity)
content_disp_l.append(_)
content_disp = ", ".join(content_disp_l)
electrons_accounted_for = electrons_accounted_for * multiplicity
non_h_accounted_for = non_h_accounted_for * multiplicity
if volume == "n/a":
return
total_void_accounted_for_electrons += electrons_accounted_for
eaf = electrons_accounted_for
eafd = "%.0f" % (electrons_accounted_for / f)
electron_bg = gui_red
electron_fg = "#eeeeee"
if eaf - (0.1 * eaf) < float(electron) < eaf + (0.1 * eaf):
electron_bg = gui_green
elif eaf - (0.2 * eaf) < float(electron) < eaf + (0.2 * eaf):
electron_bg = gui_orange
e_accounted_for_display = eafd
if float(electron) != 0:
v_over_e = float(volume) / float(electron)
if v_over_e < OV.GetParam('user.masks.v_over_e.lower'):
v_over_e_html = "%.1f " % (gui_red, v_over_e)
elif v_over_e > OV.GetParam('user.masks.v_over_e.upper'):
v_over_e_html = "%.1f " % (gui_red, v_over_e)
else:
v_over_e_html = "%.1f " % (gui_green, v_over_e)
else:
v_over_e_html = "n/a"
d['v_over_e'] = v_over_e_html
if float(volume) != 0:
v_over_n_html = "n/a"
if non_h_accounted_for != 0:
v_over_n = float(volume) / non_h_accounted_for
if v_over_n < 20:
v_over_n_html = "%.1f " % (gui_red, v_over_n)
elif v_over_n > 50:
v_over_n_html = "%.1f " % (gui_red, v_over_n)
else:
v_over_n_html = "%.1f " % (gui_green, v_over_n)
try:
float(content_disp)
content_disp = ""
except:
pass
d['v_over_n'] = v_over_n_html
d['content_disp'] = content_disp
d['multi_idx'] = ":".join(multi_idx)
content = get_template('mask_content_with_edit', path=template_path, force=debug) % d
details = ' (Edit)' % ":".join(multi_idx)
d['content'] = content
d['details'] = details
d['e_accounted_for_display'] = e_accounted_for_display
d['electron_bg'] = electron_bg
d['electron_fg'] = electron_fg
d['electrons_disp'] = electron / f
d['volume_disp'] = volume / f
d['e_accounted_for_raw'] = electrons_accounted_for
t += get_template('mask_output_table_row_rp', path=template_path, force=debug) % d
t += get_template('mask_output_based_on', path=template_path, force=debug) % d
#-- FINAL BLOCK ###############
total_formula = get_rounded_formula()
total_electrons_accounted_for = 0
add_to_formula = ""
add_to_moiety = ""
for entry in sum_content:
entity = entry[1]
if "?" in entity:
add_to_moiety = "[+ solvents]"
continue
multiplicity = float(entry[0])
entity, multi = split_entity(entity)
multi = float(multi)
ent = moieties.get(entity.lower(), entity)
ent_disp = ent.replace(" ", "")
ent = " ".join(re.findall(r'\d+|[A-Z][a-z]*', ent))
ent = formula_cleaner(str(ent))
try:
total_electrons_accounted_for += get_sum_electrons_from_formula(ent)[0] * user_number * number_of_symm_op
except:
total_electrons_accounted_for += 0
f = number_of_symm_op * Zprime
add_to_formula = _add_formula(add_to_formula, ent, multi / f * multiplicity)
add_to_moiety += "%s[%s], " % (format_number(multi / f * multiplicity), ent_disp)
total_formula = _add_formula(total_formula, add_to_formula, 1)
add_to_moiety = add_to_moiety.rstrip(", ")
if not add_to_moiety:
add_to_moiety = OV.GetVar(get_sqf_name() + "_add_to_moiety", "")
OV.SetVar(get_sqf_name() + "_add_to_moiety", add_to_moiety)
suggested_moiety = "%s, %s" % (olx.xf.latt.GetMoiety(), add_to_moiety)
if "[+ solvents]" in suggested_moiety:
olex.m("spy.set_cif_item(_chemical_formula_moiety,'%s')" % suggested_moiety)
total_void_no_plural = ""
if total_void_no > 1:
total_void_no_plural = "s"
d['suggested_moiety'] = suggested_moiety
d['add_to_moiety'] = add_to_moiety
d['suggested_sum'] = total_formula.replace(".0 ", " ")
d['add_to_formula'] = add_to_formula.replace(".0 ", " ")
d['base'] = base
d['current_sNum'] = current_sNum
d['escaped_model_src'] = escape_param_names(OV.ModelSrc())
d['total_void_electrons'] = total_void_electrons
d['total_void_accounted_for_electrons'] = total_void_accounted_for_electrons
d['total_void_volume'] = total_void_volume
d['total_void_no_plural'] = total_void_no_plural
d['total_void_no'] = total_void_no
# If auto-add is on, updat the formulae
if bool(OV.GetParam('snum.refinement.auto_add_masked_moieties')):
if olx.xf.GetFormula() != d['suggested_sum']:
olx.xf.SetFormula("%(suggested_sum)s" % d)
if add_to_moiety not in olx.xf.latt.GetMoiety():
olex.m("spy.set_cif_item(_chemical_formula_moiety,'%s')" % suggested_moiety)
# Set the background colour of the Formula + and Moiety + buttons.
if add_to_moiety not in OV.get_cif_item('_chemical_formula_moiety'):
if OV.IsControl("ADD_TO_MASK_MOIETY"):
olx.html.SetBG("ADD_TO_MASK_MOIETY", gui_red)
OV.SetVar("ADD_TO_MASK_MOIETY_BG", gui_red)
else:
OV.SetVar("ADD_TO_MASK_MOIETY_BG", OV.GetParam('gui.green').hexadecimal)
if gui.tools.is_masked_moiety_in_formula(olx.xf.GetFormula('', 3)):
if OV.IsControl("ADD_TO_MASK_FORMULA"):
olx.html.SetBG("ADD_TO_MASK_FORMULA", gui_red)
OV.SetVar("ADD_TO_MASK_FORMULA_BG", gui_red)
else:
OV.SetVar("ADD_TO_MASK_FORMULA_BG", gui_green)
####################################################################
template_value = get_template('mask_special_detail_default', path=template_path, force=debug) % d
template_value = template_value.strip()
if mask_special_details:
if "[]" in mask_special_details:
mask_special_details = template_value
if mask_special_details == "?" or not mask_special_details or mask_info_has_updated:
mask_special_details = template_value
mask_info_has_updated = False
if mask_special_details == template_value:
OV.SetParam('snum.masks.special_detail_colour', gui_red)
OV.SetParam('snum.masks.special_detail_button_text', 'Use & Edit')
else:
OV.SetParam('snum.masks.special_detail_colour', gui_green)
OV.SetParam('snum.masks.special_detail_button_text', 'Edit')
# if add_to_formula:
#mask_special_details = get_template('mask_special_detail_default', path=template_path, force=debug)%d
# else:
#mask_special_details = ""
if mask_special_details:
mask_special_details = mask_special_details.strip().lstrip('"').rstrip('"').replace("\r", " ")
if mask_info_has_updated:
olx.cif_model[current_sNum]['_%s_special_details' % base] = mask_special_details
update_sqf_file(current_sNum, '_%s_special_details' % base)
if mask_special_details is None:
mask_special_details = ''
d['mask_special_details'] = mask_special_details
d['mask_special_details_vn'] = mask_special_details_vn
d['ADD_TO_MASK_FORMULA_BG'] = OV.GetVar('ADD_TO_MASK_FORMULA_BG')
OV.SetVar(mask_special_details_vn, mask_special_details)
if add_to_formula:
if not OV.GetParam('snum.refinement.auto_add_masked_moieties'):
t += get_template('mask_output_end_rp', path=template_path, force=debug) % d
t += get_template('mask_special_details', path=template_path, force=debug) % d
t += get_template('mask_output_table_end', path=template_path, force=debug) % d
OlexVFS.write_to_olex(output_fn, t)
return output_fn
OV.registerFunction(get_mask_info, False, 'gui.tools')
def get_moieties_from_list():
moieties = {}
_ = os.path.join(OV.DataDir(), 'moieties.cvs')
if os.path.exists(_):
pass
else:
_ = os.path.join(p_path, 'moieties.csv')
rFile = open(_, 'r').readlines()
for line in rFile:
if line.startswith("#") or line == '\n':
continue
nick, formula = line.split(";")
nick = nick.strip()
formula = formula.strip()
if nick and formula:
moieties.setdefault(nick, formula)
return moieties
moieties = get_moieties_from_list()
import decimal
import random
def get_rounded_formula(rnd=2, as_string_sep=""):
# get actual and not user formula
formula = olx.xf.GetFormula('list', rnd, True)
if as_string_sep:
formula = formula.split(",")
formula = as_string_sep.join(formula).replace(":", "")
return formula
# def format_number(num):
# return round(num,3)
def format_number(num):
if "." in str(num):
_ = str(num).split(".")[1]
if _.startswith('99'):
num = round(num, 0)
elif _.startswith('00'):
num = round(num, 0)
s = str(num)
if s.endswith(".0"):
retVal = int(num)
elif s.endswith(".5"):
retVal = round(num, 1)
elif s.endswith(".25") or s.endswith(".25"):
retVal = round(num, 2)
else:
retVal = round(num, 3)
return retVal
def get_sum_electrons_from_formula(f):
Z = 0
N = 0
if not f:
return retVal
f = f.split()
for entry in f:
element = entry.rstrip('0123456789')
try:
number = float(entry[len(element):])
except:
number = 1
Z += int(pt[element].get('Z')) * number
if element != "H":
N += number
return Z, N
def split_entity(entry):
try:
entry = entry.strip()
entity = entry.lstrip('0123456789./(')
multi = entry[:(len(entry) - len(entity))]
if not multi:
multi = 1
else:
if "/" in multi:
#multi = float(multi.split("/")[0])/float(multi.split("/")[1])
multi = Fraction(int(multi.split("/")[0]), int(multi.split("/")[1]))
entity = entity.strip().rstrip("(")
except:
entity = ""
multi = 1
return entity, multi
# !HP remove once updated in main!
#from gui.tools import Templates
# class TemplatesTemp(object):
# def __init__(self,):
#nparent = gui.tools.TemplateProvider
#self.parent.get_all_templates = self.get_all_templates
# def get_all_templates(self, path=None, mask="*.*", marker='{-}'):
# '''
# Parses the path for template files.
# '''
# 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]
# for f_path in g:
#fc = open(f_path, 'r').read()
# if not self.parent._extract_templates_from_text(fc,marker=marker):
#name = os.path.basename(os.path.normpath(f_path))
#self.templates[name] = fc
# TemplatesTemp()
cleaned_formulae = {}
def formula_cleaner(formula):
formula = formula.replace(" ", "").replace(" ", "")
# formula = unicode(formula) #py3HP
if formula in cleaned_formulae:
return cleaned_formulae[formula]
retVal = ""
el = ""
n = ""
i = 0
for char in formula:
if str.isnumeric(char) or str.isspace(char) or str.islower(char):
continue
while str.isalpha(char):
i += 1
if not el:
el += char
else:
if str.islower(char):
el += char
elif str.isupper(char):
n = "1"
i -= 1
break
char = formula[i:(i + 1)]
while str.isnumeric(char):
i += 1
n += char
char = formula[i:(i + 1)]
if el and n == "":
n = 1
retVal += "%s%s " % (el, n)
n = ""
el = ""
if debug:
print("%s --> %s" % (formula, retVal.strip()))
cleaned_formulae[formula] = retVal
return retVal.strip()
def update_metacif(sNum, file_name):
pass
ciflist = OV.GetCifMergeFilesList()
if file_name not in ciflist:
gui.report.publication.add_cif_to_merge_list.__func__(file_name)
try:
olex.m("spy.gui.report.publication.add_cif_to_merge_list(%s)" % file_name)
except:
return
# ATTEMPT 2
from CifInfo import CifTools
CT = CifTools()
CT.update_cif_block(olx.cif_model[sNum], force=True)
# ATTEMPT 1
#metacif_path = '%s%s%s.metacif' %(OV.StrDir(), os.sep, sNum)
# with open(metacif_path, 'wb') as f:
#print >> f, olx.cif_model[sNum]
# olex.m('cifmerge')
def get_sqf_name(full=True, base=None):
if not base:
base = _get_mask_base()
if full:
l = [".sqf", "_sq.sqf", "_sqd.sqf"]
for ending in l:
if "platon" in base.lower():
if "_sq" not in ending:
continue
retVal = os.path.splitext(OV.HKLSrc())[0] + ending
if os.path.exists(retVal):
return retVal
else:
retVal = "%s.sqf" % (current_sNum)
return retVal
def edit_mask_special_details(txt, base, sNum):
user_value = str(OV.GetUserInput(0, "Edit _mask_special_details", txt))
if user_value == "None":
return
if user_value:
olx.cif_model[current_sNum]['_%s_special_details' % base] = user_value
update_sqf_file(current_sNum, '_%s_special_details' % base)
OV.SetParam('snum.masks.special_detail_colour', gui_green)
OV.SetParam('snum.masks.special_detail_button_text', 'Edit')
OV.UpdateHtml(force=True)
OV.registerFunction(edit_mask_special_details)
def update_sqf_file(current_sNum, scope, scope2=None):
sqf_file = get_sqf_name()
if os.path.exists(sqf_file):
with open(sqf_file, 'r') as original:
data = original.read()
with open(sqf_file, 'w') as modified:
modified.write("data_%s\n" % OV.ModelSrc() + data)
with open(sqf_file, 'r') as f:
cif_block = iotbx.cif.reader(file_object=f).model()
if not scope2:
cif_block[current_sNum][scope] = olx.cif_model[current_sNum][scope]
else:
cif_block[current_sNum][scope][scope2] = olx.cif_model[current_sNum][scope][scope2]
with open(sqf_file, 'w') as f:
print(cif_block, file=f)
if os.path.exists(sqf_file.replace(".sqf", ".cif")):
CifInfo.MergeCif()
def _get_mask_base():
if OV.IsControl('SNUM_REFINEMENT_RECOMPUTE_MASK_BEFORE_REFINEMENT_PRG'):
base = olx.html.GetValue('SNUM_REFINEMENT_RECOMPUTE_MASK_BEFORE_REFINEMENT_PRG').lower()
if "platon" in base.lower():
base = "platon_squeeze"
elif "olex2" in base.lower():
base = "smtbx_masks"
else:
if OV.HKLSrc().rstrip(".hkl").endswith("_sq"):
base = "platon_squeeze"
else:
base = "smtbx_masks"
return base
def add_mask_content(i, which):
global mask_info_has_updated
global current_sNum
current_sNum = OV.ModelSrc()
base = _get_mask_base()
is_CIF = (olx.IsFileType('cif') == 'true')
if ":" not in i:
i_l = [str(i)]
else:
i_l = i.split(":")
current_sNum = OV.ModelSrc()
contents = olx.cif_model[current_sNum].get('_%s_void_%s' % (base, which))
if not contents:
if is_CIF:
contents = olx.Cif('_%s_void_nr' % base).split(",")
else:
contents = olx.cif_model[current_sNum].get('_%s_void_%s' % (base, which))
if not contents:
return return_note(note="No void has been found.", col=gui_orange)
try:
disp = ",".join(i_l)
except:
disp = "fix me!"
based_on = OV.GetParam('user.masks.based_on')
based_on_display = "Asymmetric unit"
if based_on == "FU":
based_on_display = "Formula Unit"
elif based_on == "Cell":
based_on_display = "Unit Cell"
f = get_adjust_for_base_factor()
c = contents[int(i_l[0].split("|")[0]) - 1]
multiplicity = int(i_l[0].split("|")[1])
if c == "?":
c = ""
c = c.lstrip("'").rstrip("'")
c_l = c.split(",")
c_new_l = []
for c in c_l:
c = c.strip()
n = 1
m = c
if " " in c:
n, m = c.split()
n = format_number(multiplicity * float(n) / f)
if m != "?" and m != "":
c = "%s %s" % (n, m)
else:
c = m
c_new_l.append(c)
c = ", ".join(c_new_l)
user_value = str(OV.GetUserInput(0, "Edit Mask %s for Void No %s based on %s" % (which, disp, based_on_display), c)).strip()
if user_value == "None":
return
if not user_value:
user_value = "?"
user_value_l = user_value.split(",")
user_value_new_l = []
for string in user_value_l:
string = string.lstrip().rstrip()
if " " in string:
val, entity = string.split()
elif "(" in string:
val, entity = string.split("(")
val = int(val)
entity = entity.rstrip().rstrip(")")
else:
entity = string
val = "1"
if "/" in val:
_ = val.split("/")
val = Fraction(int(_[0]), int(_[1]))
_ = format_number(float(val) * f / multiplicity)
user_value_new_l.append("%s %s" % (format_number(float(val) * f / multiplicity), entity))
user_value = ",".join(user_value_new_l)
_ = list(contents)
for idx in i_l:
idx = int(idx.split("|")[0]) - 1
_[idx] = user_value
#mask = OV.get_cif_item('_%s_void' %base)
olx.cif_model[current_sNum]['_%s_void' % base]['_%s_void_content' % base] = _
update_sqf_file(current_sNum, '_%s_void' % base, '_%s_void_content' % base)
mask_info_has_updated = True
# olex.m("spy.makeFormulaForsNumInfo()")
get_mask_info()
OV.UpdateHtml(force=True)
# change_based_on_button_states()
def get_adjust_for_base_factor():
Z = float(olx.xf.au.GetZ())
Zprime = float(olx.xf.au.GetZprime())
number_of_symm_op = round(Z / Zprime)
based_on = OV.GetParam('user.masks.based_on')
if based_on == "ASU":
f = number_of_symm_op
elif based_on == "FU":
f = number_of_symm_op * Zprime
elif based_on == "Cell":
f = 1
return round(f)
def _add_formula(curr, new, multi=1):
if "," in curr:
curr_l = curr.split(",")
else:
curr_l = curr.split()
new_l = new.split()
updated_d = {}
# if len(new_l) == 1:
#retVal = "please adjust manually!"
_ = [curr_l, new_l]
i = 0
for item in _:
if not item:
i += 1
continue
for tem in item:
if not tem:
continue
if ":" in tem:
head = tem.split(":")[0]
tail = tem.split(":")[1]
else:
head = tem.rstrip('0123456789./')
tail = tem[len(head):]
if tail:
tail = float(tail)
else:
tail = 1.0
if i == 1: # don't mulitply the already existing bits
tail = round(tail * multi, 2)
updated_d.setdefault(head, 0)
updated_d[head] += tail
i += 1
l = []
l_beginning = []
for item in updated_d:
if item == "C" or item == "H":
l_beginning.append("%s%s " % (item, format_number(updated_d[item])))
else:
l.append("%s%s " % (item, format_number(updated_d[item])))
l.sort()
l_beginning.sort()
l = l_beginning + l
retVal = ""
for item in l:
retVal += item
return retVal
def status_bg(var, val, status='on'):
var = OV.GetParam(var)
if var.lower() == val.lower():
return gui_highlight
OV.registerFunction(status_bg)
def return_note(note, note_details="", col=OV.GetVar('HtmlHighlightCOlour')):
output_fn = '%s_masking_info.htm' % OV.ModelSrc()
d = {"note": note,
"note_details": note_details,
"note_bg": col}
t = gui.tools.TemplateProvider.get_template('masking_note', path=template_path, force=debug) % d
OlexVFS.write_to_olex(output_fn, t)
return output_fn
def escape_param_names(name):
l = ["[", "]", "(", ")"]
for item in l:
name = name.replace(item, "_")
return name
def change_hklsrc_according_to_mask_prg(prg):
OV.SetParam('snum.refinement.recompute_mask_before_refinement_prg', prg)
target = ""
# sort_out_masking_hkl()
#import glob
#files_to_delete = glob.glob("*.sqf")
# for fn in files_to_delete:
# os.remove(fn)
if target and OV.HasGUI() and OV.IsControl("SET_REFLECTIONS_parent_name"):
olx.html.SetBG('SET_REFLECTIONS_parent_name', OV.GetParam('gui.green').hexadecimal)
olx.html.SetValue('SET_REFLECTIONS_parent_name', os.path.basename(target))
get_mask_info()
OV.UpdateHtml(force=True)
def change_based_on_button_states():
l = ["BASE_ON_CELL", "BASE_ON_FU", "BASE_ON_ASU"]
based_on = OV.GetParam('user.masks.based_on')
for btn in l:
if not OV.IsControl(btn):
return
if btn == "BASE_ON_CELL" and based_on == 'Cell':
state = "true"
elif btn == "BASE_ON_FU" and based_on == 'FU':
state = "true"
elif btn == "BASE_ON_ASU" and based_on == 'ASU':
state = "true"
else:
state = "false"
if state == "true":
olx.html.SetBG(btn, 'gui_green')
l.remove(btn)
for btn in l:
olx.html.SetBG(btn, 'gui_light_grey')
break
def sort_out_masking_hkl():
pass
#_ = OV.GetParam("snum.refinement.recompute_mask_before_refinement_prg")
# if _ == "Platon":
# if "_sq" not in OV.HKLSrc():
#fn = OV.HKLSrc().replace(".", "_sq.")
# if os.path.exists(fn):
# OV.HKLSrc(fn)
# else:
# if "_sq" in OV.HKLSrc():
#fn = OV.HKLSrc().replace("_sq.", ".")
# if not os.path.exists(fn):
#import shutil
#shutil.copy2(OV.HKLSrc(), fn)
# OV.HKLSrc(fn)
OV.registerFunction(change_based_on_button_states)
OV.registerFunction(change_hklsrc_according_to_mask_prg)
OV.registerFunction(add_mask_content)
OV.registerFunction(formula_cleaner)