def callback_after_step(self, minimizer): if self.verbose > 0: print "xray.minimization step: f,iter,nfun:", print self.f, minimizer.iter(), minimizer.nfun() if self.verbose > 1 and self.reference_structure is not None: xray.meaningful_site_cart_differences( self.xray_structure, self.reference_structure).show()
def check_refinement_stability(self): if not self.shall_refine_thermal_displacements: for sc in self.xray_structure.scatterers(): sc.flags.set_grad_site(True) if sc.flags.use_u_aniso(): sc.flags.set_grad_u_aniso(False) if sc.flags.use_u_iso(): sc.flags.set_grad_u_iso(False) xs = self.xray_structure xs0 = self.reference_xray_structure = xs.deep_copy_scatterers() mi = xs0.build_miller_set(anomalous_flag=False, d_min=0.5) fo_sq = mi.structure_factors_from_scatterers( xs0, algorithm="direct").f_calc().norm() fo_sq = fo_sq.customized_copy(sigmas=flex.double(fo_sq.size(), 1)) xs.shake_sites_in_place(rms_difference=0.1) if self.shall_refine_thermal_displacements: # a spread of 10 for u_iso's would be enormous for our low temperature # test structures if those u_iso's were not constrained xs.shake_adp( spread=10, # absolute aniso_spread=0.2) # relative self.reparametrisation = constraints.reparametrisation( xs, self.constraints, self.connectivity_table, temperature=self.t_celsius) obs = fo_sq.as_xray_observations() ls = least_squares.crystallographic_ls( obs, self.reparametrisation, weighting_scheme=least_squares.mainstream_shelx_weighting()) self.cycles = self.normal_eqns_solving_method(ls) print("%i %s iterations to recover from shaking" % (self.cycles.n_iterations, self.cycles)) if 0: from crys3d.qttbx.xray_structure_viewer import display display(xray_structure=xs) diff = xray.meaningful_site_cart_differences(xs0, xs) assert diff.max_absolute() < self.site_refinement_tolerance,\ self.__class__.__name__ if self.shall_refine_thermal_displacements: delta_u = [] for sc, sc0 in itertools.izip(xs.scatterers(), xs0.scatterers()): if not sc.flags.use_u_aniso() or not sc0.flags.use_u_aniso(): continue delta_u.extend(matrix.col(sc.u_star) - matrix.col(sc0.u_star)) delta_u = flex.double(delta_u) assert flex.max_absolute(delta_u) < self.u_star_refinement_tolerance,\ self.__class__.__name__
def check_refinement_stability(self): if not self.shall_refine_thermal_displacements: for sc in self.xray_structure.scatterers(): sc.flags.set_grad_site(True) if sc.flags.use_u_aniso(): sc.flags.set_grad_u_aniso(False) if sc.flags.use_u_iso(): sc.flags.set_grad_u_iso(False) xs = self.xray_structure xs0 = self.reference_xray_structure = xs.deep_copy_scatterers() mi = xs0.build_miller_set(anomalous_flag=False, d_min=0.5) fo_sq = mi.structure_factors_from_scatterers( xs0, algorithm="direct").f_calc().norm() fo_sq = fo_sq.customized_copy(sigmas=flex.double(fo_sq.size(), 1)) xs.shake_sites_in_place(rms_difference=0.1) if self.shall_refine_thermal_displacements: # a spread of 10 for u_iso's would be enormous for our low temperature # test structures if those u_iso's were not constrained xs.shake_adp(spread=10, # absolute aniso_spread=0.2) # relative self.reparametrisation = constraints.reparametrisation( xs, self.constraints, self.connectivity_table, temperature=self.t_celsius) obs = fo_sq.as_xray_observations() ls = least_squares.crystallographic_ls( obs, self.reparametrisation, weighting_scheme=least_squares.mainstream_shelx_weighting()) self.cycles = self.normal_eqns_solving_method(ls) print ("%i %s iterations to recover from shaking" % (self.cycles.n_iterations, self.cycles)) if 0: from crys3d.qttbx.xray_structure_viewer import display display(xray_structure=xs) diff = xray.meaningful_site_cart_differences(xs0, xs) assert diff.max_absolute() < self.site_refinement_tolerance,\ self.__class__.__name__ if self.shall_refine_thermal_displacements: delta_u = [] for sc, sc0 in itertools.izip(xs.scatterers(), xs0.scatterers()): if not sc.flags.use_u_aniso() or not sc0.flags.use_u_aniso(): continue delta_u.extend(matrix.col(sc.u_star) - matrix.col(sc0.u_star)) delta_u = flex.double(delta_u) assert flex.max_absolute(delta_u) < self.u_star_refinement_tolerance,\ self.__class__.__name__
def exercise_constrained_lbfgs(xray_structure, constraints_list, t_celsius, d_min=0.5, shake_sites_rmsd=0.5, shake_u_iso_spread=0, shake_u_aniso_spread=0, grad_site=True, grad_u_iso=True, grad_u_aniso=False, grad_occupancy=False, grad_fp_fdp=False, lbfgs_m=5, lbfgs_max_iterations=1000, verbose=0): xs = xray_structure xray.set_scatterer_grad_flags(scatterers=xs.scatterers(), site=grad_site, u_iso=grad_u_iso, u_aniso=grad_u_aniso, occupancy=grad_occupancy, fp=grad_fp_fdp, fdp=grad_fp_fdp, tan_u_iso=False, param=0) xs0 = xs.deep_copy_scatterers() mi = xs0.build_miller_set(anomalous_flag=False, d_min=d_min) fo_sq = mi.structure_factors_from_scatterers( xs0, algorithm="direct").f_calc().norm() fo_sq = fo_sq.customized_copy(sigmas=flex.double(fo_sq.size(), 1)) fo_sq.set_observation_type_xray_intensity() y_obs = fo_sq #y_obs = fo_sq.f_sq_as_f() if grad_site: xs.shake_sites_in_place(rms_difference=shake_sites_rmsd) if not grad_u_aniso: shake_u_aniso_spread = 0 if not grad_u_iso: shake_u_iso_spread = 0 if grad_u_aniso or grad_u_iso: xs.shake_adp(spread=shake_u_iso_spread, aniso_spread=shake_u_aniso_spread) xs1 = xs.deep_copy_scatterers() core_params = scitbx.lbfgs.core_parameters(m=lbfgs_m, maxfev=100, xtol=1e-5) connectivity_table = smtbx.utils.connectivity_table(xs0) if constraints_list is None: from smtbx.development import generate_hydrogen_constraints constraints_list = generate_hydrogen_constraints( structure=xs0, connectivity_table=connectivity_table) reparametrisation = constraints.reparametrisation(xs, constraints_list, connectivity_table, temperature=t_celsius) lbfgs_termination_params = scitbx.lbfgs.termination_parameters( traditional_convergence_test=False, drop_convergence_test_max_drop_eps=1.e-20, drop_convergence_test_iteration_coefficient=1, min_iterations=500, max_iterations=lbfgs_max_iterations) minimizer = lbfgs( target_functor=xray.target_functors.unified_least_squares_residual( y_obs), xray_structure=xs, reparametrisation=reparametrisation, structure_factor_algorithm="direct", lbfgs_termination_params=lbfgs_termination_params, lbfgs_core_params=core_params, reference_structure=xs0, verbose=verbose) if verbose > 0: print "Total parameters: ", xs.n_parameters() print "Independent parameters: ", reparametrisation.n_independents print "Reference model: " xs0.show_angles(distance_cutoff=1.5) print print "Starting model: " xs1.show_angles(distance_cutoff=1.5) print print "Refined model: " xs.show_angles(distance_cutoff=1.5) print print "n_iter, n_fun: ", minimizer.minimizer.iter( ), minimizer.minimizer.nfun() h_selection = xs.element_selection('H') diff = xray.meaningful_site_cart_differences( xs0.select(h_selection, negate=True), xs.select(h_selection, negate=True)) #diff = xray.meaningful_site_cart_differences(xs0, xs) #assert diff.max_absolute() < 1e-3 if verbose > 0: diff.show() print assert diff.max_absolute() < 2e-2, diff.max_absolute() diff = xray.meaningful_site_cart_differences(xs0, xs) if verbose > 0: diff.show() print # XXX why does this tolerance have to be so high? assert diff.max_absolute() < 0.5, diff.max_absolute()
def exercise_constrained_lbfgs(xray_structure, constraints_list, t_celsius, d_min=0.5, shake_sites_rmsd=0.5, shake_u_iso_spread=0, shake_u_aniso_spread=0, grad_site=True, grad_u_iso=True, grad_u_aniso=False, grad_occupancy=False, grad_fp_fdp=False, lbfgs_m=5, lbfgs_max_iterations=1000, verbose=0): xs = xray_structure xray.set_scatterer_grad_flags(scatterers=xs.scatterers(), site=grad_site, u_iso=grad_u_iso, u_aniso=grad_u_aniso, occupancy=grad_occupancy, fp=grad_fp_fdp, fdp=grad_fp_fdp, tan_u_iso=False, param=0) xs0 = xs.deep_copy_scatterers() mi = xs0.build_miller_set(anomalous_flag=False, d_min=d_min) fo_sq = mi.structure_factors_from_scatterers( xs0, algorithm="direct").f_calc().norm() fo_sq = fo_sq.customized_copy(sigmas=flex.double(fo_sq.size(), 1)) fo_sq.set_observation_type_xray_intensity() y_obs = fo_sq #y_obs = fo_sq.f_sq_as_f() if grad_site: xs.shake_sites_in_place(rms_difference=shake_sites_rmsd) if not grad_u_aniso: shake_u_aniso_spread = 0 if not grad_u_iso: shake_u_iso_spread = 0 if grad_u_aniso or grad_u_iso: xs.shake_adp(spread=shake_u_iso_spread, aniso_spread=shake_u_aniso_spread) xs1 = xs.deep_copy_scatterers() core_params = scitbx.lbfgs.core_parameters(m=lbfgs_m, maxfev=100, xtol=1e-5) connectivity_table = smtbx.utils.connectivity_table(xs0) if constraints_list is None: from smtbx.development import generate_hydrogen_constraints constraints_list = generate_hydrogen_constraints( structure=xs0, connectivity_table=connectivity_table) reparametrisation = constraints.reparametrisation( xs, constraints_list, connectivity_table, temperature=t_celsius) lbfgs_termination_params=scitbx.lbfgs.termination_parameters( traditional_convergence_test=False, drop_convergence_test_max_drop_eps=1.e-20, drop_convergence_test_iteration_coefficient=1, min_iterations=500, max_iterations=lbfgs_max_iterations) minimizer = lbfgs( target_functor=xray.target_functors.unified_least_squares_residual(y_obs), xray_structure=xs, reparametrisation=reparametrisation, structure_factor_algorithm="direct", lbfgs_termination_params=lbfgs_termination_params, lbfgs_core_params=core_params, reference_structure=xs0, verbose=verbose) if verbose > 0: print "Total parameters: ", xs.n_parameters() print "Independent parameters: ", reparametrisation.n_independents print "Reference model: " xs0.show_angles(distance_cutoff=1.5) print print "Starting model: " xs1.show_angles(distance_cutoff=1.5) print print "Refined model: " xs.show_angles(distance_cutoff=1.5) print print "n_iter, n_fun: ", minimizer.minimizer.iter(), minimizer.minimizer.nfun() h_selection = xs.element_selection('H') diff = xray.meaningful_site_cart_differences( xs0.select(h_selection, negate=True), xs.select(h_selection, negate=True)) #diff = xray.meaningful_site_cart_differences(xs0, xs) #assert diff.max_absolute() < 1e-3 if verbose > 0: diff.show() print assert diff.max_absolute() < 2e-2, diff.max_absolute() diff = xray.meaningful_site_cart_differences(xs0, xs) if verbose > 0: diff.show() print # XXX why does this tolerance have to be so high? assert diff.max_absolute() < 0.5, diff.max_absolute()
def callback_after_step(self, minimizer): if self.verbose > 0: print "xray.minimization step: f,iter,nfun:", print self.f,minimizer.iter(),minimizer.nfun() if self.verbose > 1 and self.reference_structure is not None: xray.meaningful_site_cart_differences(self.xray_structure, self.reference_structure).show()