from Method import Method_refinement, Method_solution
import phil_interface
from olexFunctions import OV
import olx
import olex
import os
class Method_cctbx_refinement(Method_refinement):
flack = None
version = "(default)"
def __init__(self, phil_object):
super(Method_cctbx_refinement, self).__init__(phil_object)
_ = os.environ.get('OLEX2_CCTBX_DIR')
if _ is not None:
self.version = _
def pre_refinement(self, RunPrgObject):
import gui
RunPrgObject.make_unique_names = True
self.cycles = OV.GetParam('snum.refinement.max_cycles')
self.table_file_name = None
use_aspherical = False
hide_nsff = OV.GetParam('user.refinement.hide_nsff')
if not hide_nsff:
html = "Using spherical form factors"
OV.SetVar('gui_notification', html)
use_aspherical = OV.IsNoSpherA2()
else:
self.table_file_name = os.path.join(OV.FilePath(), OV.FileName() + '.tsc')
if not os.path.exists(self.table_file_name):
self.table_file_name = None
if use_aspherical == True:
self.method = OV.GetParam('snum.refinement.method')
self.table_file_name = OV.GetParam('snum.NoSpherA2.file')
html = "smtbx.refine using tabulated Form Factors from %s" %os.path.basename(self.table_file_name)
OV.SetVar('gui_notification', html)
if not os.path.exists(self.table_file_name):
self.table_file_name = None
if self.table_file_name:
self.table_file_name = self.table_file_name.encode("utf-8")
OV.SetParam('snum.auto_hydrogen_naming', False)
print("Using tabulated atomic form factors")
Method_refinement.pre_refinement(self, RunPrgObject)
def do_run(self, RunPrgObject):
import time
from refinement import FullMatrixRefine
from smtbx.refinement.constraints import InvalidConstraint
import gui
timer = OV.IsDebugging()
self.failure = True
print('\n+++ STARTING olex2.refine +++++ %s' %self.version)
verbose = OV.GetParam('olex2.verbose')
RunPrgObject.cctbx = cctbx = FullMatrixRefine(
max_cycles=RunPrgObject.params.snum.refinement.max_cycles,
max_peaks=RunPrgObject.params.snum.refinement.max_peaks,
verbose=verbose,
on_completion=self.writeRefinementInfoForGui)
try:
if timer:
t1 = time.time()
cctbx.run(table_file_name=self.table_file_name,
ed_refinement=OV.IsEDRefinement())
if timer:
print("-- do_run(): %.3f" %(time.time() - t1))
except InvalidConstraint as e:
print(e)
except NotImplementedError as e:
print(e)
else:
self.failure = cctbx.failure
if not self.failure:
OV.SetVar('cctbx_R1',cctbx.r1[0])
OV.SetVar('cctbx_wR2',cctbx.wR2_factor())
OV.File('%s.res' %OV.FileName())
finally:
#print '+++ FINISHED olex2.refine ++++++++++++++++++++++++++++++++++++\n'
OV.DeleteBitmap('refine')
self.interrupted = cctbx.interrupted
def post_refinement(self, RunPrgObject):
OV.SetParam('snum.refinement.max_cycles',self.cycles)
self.writeRefinementInfoIntoRes(self.cif)
txt = '''
R1_all=%(_refine_ls_R_factor_all)s;
R1_gt = %(_refine_ls_R_factor_gt)s;
wR_ref = %(_refine_ls_wR_factor_ref)s;
GOOF = %(_refine_ls_goodness_of_fit_ref)s;
Shift_max = %(_refine_ls_shift/su_max)s;
Shift_mean = %(_refine_ls_shift/su_mean)s;
Reflections_all = %(_reflns_number_total)s;
Reflections_gt = %(_reflns_number_gt)s;
Parameters = %(_refine_ls_number_parameters)s;
Hole = %(_refine_diff_density_min)s;
Peak = %(_refine_diff_density_max)s;
Flack = %(_refine_ls_abs_structure_Flack)s;
''' %self.cif
try:
olx.xf.RefinementInfo(txt)
except:
pass
def writeRefinementInfoForGui(self, cif):
#for key, value in cif.items():
# if "." in value:
# try:
# cif[key] = "%.4f" %float(value)
# except:
# pass
f = open("%s/etc/CIF/olex2refinedata.html" %OV.BaseDir())
t = f.read() %cif
f.close()
OV.write_to_olex('refinedata.htm',t)
self.cif = cif
class Method_cctbx_ChargeFlip(Method_solution):
def do_run(self, RunPrgObject):
from cctbx_olex_adapter import OlexCctbxSolve
import traceback
print('+++ STARTING olex2.solve ++++++++++++++++++++++++++++++++++++')
RunPrgObject.solve = True
cctbx = OlexCctbxSolve()
#solving_interval = int(float(self.getArgs().split()[1]))
solving_interval = self.phil_index.params.flipping_interval
formula_l = olx.xf.GetFormula('list')
formula_l = formula_l.split(",")
formula_d = {}
for item in formula_l:
item = item.split(":")
formula_d.setdefault(item[0], {'count':float(item[1])})
try:
have_solution = cctbx.runChargeFlippingSolution(solving_interval=solving_interval)
if not have_solution:
print("*** No solution found ***")
except Exception as err:
print(err)
traceback.print_exc()
if OV.HasGUI():
try:
olx.Freeze(True)
olx.xf.EndUpdate()
olx.Move()
finally:
olx.Freeze(False)
#olx.VSS(True)
#olex.m("sel -a")
#olex.m("name sel 1")
OV.DeleteBitmap('solve')
file_name = r"%s/%s.res" %(olx.FilePath(), RunPrgObject.fileName)
olx.xf.SaveSolution(file_name)
olx.Atreap('"%s"' %file_name)
def post_solution(self, RunPrgObject):
if OV.GetParam('user.solution.run_auto_vss'):
RunPrgObject.please_run_auto_vss = True
charge_flipping_phil = phil_interface.parse("""
name = 'Charge Flipping'
.type=str
display = 'Charge Flipping'
.type=str
atom_sites_solution=iterative
.type=str
flipping_interval=60
.type=int
instructions {
cf {
values {
amplitude_type = F E *quasi-E
.type = choice
.caption = AMPT
max_attempts_to_get_phase_transition = 5
.type = int
.caption = MAPT
max_attempts_to_get_sharp_correlation_map = 5
.type = int
.caption = MACM
max_solving_iterations = 500
.type = int
.caption = MASI
}
default=True
.type=bool
}
}
""")
gauss_newton_phil = phil_interface.parse("""
name = 'Gauss-Newton'
.type=str
display = 'G-N'
.type=str
""")
levenberg_marquardt_phil = phil_interface.parse("""
name = 'Levenberg-Marquardt'
.type=str
display = 'L-M'
.type=str
""")
NSFF_phil = phil_interface.parse("""
name = 'NSFF'
.type=str
display = 'NSFF'
.type=str
""")