def exercise_lbfgs(test_case, use_geo, out, d_min=2): sites_cart, geo_manager = cctbx.geometry_restraints.manager.\ construct_non_crystallographic_conserving_bonds_and_angles( sites_cart=flex.vec3_double(test_case.sites), edge_list_bonds=test_case.bonds, edge_list_angles=test_case.angles()) scatterers = flex.xray_scatterer(sites_cart.size(), xray.scatterer(scattering_type="C", b=20)) for sc, lbl in zip(scatterers, test_case.labels): sc.label = lbl structure = xray.structure(crystal_symmetry=geo_manager.crystal_symmetry, scatterers=scatterers) structure.set_sites_cart(sites_cart=sites_cart) f_calc = structure.structure_factors(d_min=d_min, anomalous_flag=False).f_calc() fft_map = f_calc.fft_map() fft_map.apply_sigma_scaling() if (use_geo): axis = matrix.col(flex.random_double_point_on_sphere()) rot = scitbx.math.r3_rotation_axis_and_angle_as_matrix(axis=axis, angle=25, deg=True) trans = matrix.col(flex.random_double_point_on_sphere()) * 1.0 structure.apply_rigid_body_shift(rot=rot, trans=trans) geo_manager.energies_sites(sites_cart=structure.sites_cart()).show( f=out) minimized = real_space_refinement_simple.lbfgs( sites_cart=structure.sites_cart(), density_map=fft_map.real_map(), geometry_restraints_manager=geo_manager, gradients_method="fd", real_space_target_weight=1, real_space_gradients_delta=d_min / 3) geo_manager.energies_sites(sites_cart=minimized.sites_cart).show(f=out) else: minimized = real_space_refinement_simple.lbfgs( sites_cart=structure.sites_cart(), density_map=fft_map.real_map(), unit_cell=structure.unit_cell(), gradients_method="fd", real_space_gradients_delta=d_min / 3) rmsd_start = sites_cart.rms_difference(structure.sites_cart()) rmsd_final = sites_cart.rms_difference(minimized.sites_cart) print("RMSD start, final:", rmsd_start, rmsd_final, file=out) if (use_geo): assert rmsd_start >= 1 - 1e-6 assert rmsd_final < 0.2 def show_f_g(label, f, g): print(label, "f, |g|:", f, flex.mean_sq(g)**0.5, file=out) show_f_g(label="start", f=minimized.f_start, g=minimized.g_start) show_f_g(label="final", f=minimized.f_final, g=minimized.g_final) assert minimized.f_final <= minimized.f_start return minimized
def exercise_lbfgs(test_case, use_geo, out, d_min=2): sites_cart, geo_manager = cctbx.geometry_restraints.manager.construct_non_crystallographic_conserving_bonds_and_angles( sites_cart=flex.vec3_double(test_case.sites), edge_list_bonds=test_case.bonds, edge_list_angles=test_case.angles()) scatterers = flex.xray_scatterer( sites_cart.size(), xray.scatterer(scattering_type="C", b=20)) for sc,lbl in zip(scatterers, test_case.labels): sc.label = lbl structure = xray.structure( crystal_symmetry=geo_manager.crystal_symmetry, scatterers=scatterers) structure.set_sites_cart(sites_cart=sites_cart) f_calc = structure.structure_factors( d_min=d_min, anomalous_flag=False).f_calc() fft_map = f_calc.fft_map() fft_map.apply_sigma_scaling() if (use_geo): axis = matrix.col(flex.random_double_point_on_sphere()) rot = scitbx.math.r3_rotation_axis_and_angle_as_matrix( axis=axis, angle=25, deg=True) trans = matrix.col(flex.random_double_point_on_sphere()) * 1.0 structure.apply_rigid_body_shift(rot=rot, trans=trans) geo_manager.energies_sites(sites_cart=structure.sites_cart()).show(f=out) minimized = real_space_refinement_simple.lbfgs( sites_cart=structure.sites_cart(), density_map=fft_map.real_map(), geometry_restraints_manager=geo_manager, real_space_target_weight=1, real_space_gradients_delta=d_min/3) geo_manager.energies_sites(sites_cart=minimized.sites_cart).show(f=out) else: minimized = real_space_refinement_simple.lbfgs( sites_cart=structure.sites_cart(), density_map=fft_map.real_map(), unit_cell=structure.unit_cell(), real_space_gradients_delta=d_min/3) rmsd_start = sites_cart.rms_difference(structure.sites_cart()) rmsd_final = sites_cart.rms_difference(minimized.sites_cart) print >> out, "RMSD start, final:", rmsd_start, rmsd_final if (use_geo): assert rmsd_start >= 1-1e-6 assert rmsd_final < 0.2 def show_f_g(label, f, g): print >> out, label, "f, |g|:", f, flex.mean_sq(g)**0.5 show_f_g(label="start", f=minimized.f_start, g=minimized.g_start) show_f_g(label="final", f=minimized.f_final, g=minimized.g_final) assert minimized.f_final <= minimized.f_start return minimized
def run(): def compute_map(xray_structure, d_min=1.5, resolution_factor=1. / 4): fc = xray_structure.structure_factors(d_min=d_min).f_calc() fft_map = fc.fft_map(resolution_factor=resolution_factor) fft_map.apply_sigma_scaling() result = fft_map.real_map_unpadded() return result, fc, fft_map xrs = random_structure.xray_structure( space_group_info=sgtbx.space_group_info("P212121"), elements=["N", "C", "O", "S", "P"] * 10, volume_per_atom=50) map_target, tmp, tmp = compute_map(xray_structure=xrs) xrs_sh = xrs.deep_copy_scatterers() xrs_sh.shake_sites_in_place(mean_distance=0.8) start_error = flex.mean(xrs.distances(other=xrs_sh)) print "Start:", start_error map_current, miller_array, crystal_gridding = compute_map( xray_structure=xrs_sh) for step in [miller_array.d_min() / 4] * 5: if (1): minimized = real_space_target_and_gradients.minimization( xray_structure=xrs_sh, miller_array=miller_array, crystal_gridding=crystal_gridding, map_target=map_target, max_iterations=500, min_iterations=25, step=step, geometry_restraints_manager=None, target_type="diff_map") xrs_sh = minimized.xray_structure map_current = minimized.map_current final_error = flex.mean( xrs.distances(other=minimized.xray_structure)) if (0): minimized = real_space_refinement_simple.lbfgs( sites_cart=xrs_sh.sites_cart(), density_map=map_target, unit_cell=xrs_sh.unit_cell(), geometry_restraints_manager=None, real_space_gradients_delta=step) xrs_sh = xrs_sh.replace_sites_cart(minimized.sites_cart) final_error = flex.mean(xrs.distances(other=xrs_sh)) print "Final:", final_error assert approx_equal(start_error, 0.8, 1.e-3) assert final_error < 1.e-4 print "OK"
def run(): def compute_map(xray_structure, d_min=1.5, resolution_factor=1./4): fc = xray_structure.structure_factors(d_min = d_min).f_calc() fft_map = fc.fft_map(resolution_factor=resolution_factor) fft_map.apply_sigma_scaling() result = fft_map.real_map_unpadded() return result, fc, fft_map xrs = random_structure.xray_structure( space_group_info = sgtbx.space_group_info("P212121"), elements = ["N","C","O","S","P"]*10, volume_per_atom = 50) map_target,tmp,tmp = compute_map(xray_structure = xrs) xrs_sh = xrs.deep_copy_scatterers() xrs_sh.shake_sites_in_place(mean_distance=0.8) start_error = flex.mean(xrs.distances(other = xrs_sh)) print "Start:", start_error map_current, miller_array, crystal_gridding = compute_map( xray_structure = xrs_sh) for step in [miller_array.d_min()/4]*5: if(1): minimized = real_space_target_and_gradients.minimization( xray_structure = xrs_sh, miller_array = miller_array, crystal_gridding = crystal_gridding, map_target = map_target, max_iterations = 500, min_iterations = 25, step = step, geometry_restraints_manager = None, target_type = "diff_map") xrs_sh = minimized.xray_structure map_current = minimized.map_current final_error = flex.mean(xrs.distances(other = minimized.xray_structure)) if(0): minimized = real_space_refinement_simple.lbfgs( sites_cart=xrs_sh.sites_cart(), density_map=map_target, unit_cell=xrs_sh.unit_cell(), geometry_restraints_manager=None, real_space_gradients_delta=step) xrs_sh = xrs_sh.replace_sites_cart(minimized.sites_cart) final_error = flex.mean(xrs.distances(other = xrs_sh)) print "Final:", final_error assert approx_equal(start_error, 0.8, 1.e-3) assert final_error < 1.e-4 print "OK"