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 exercise_subtract_continuous_allowed_origin_shifts(space_group_info, use_niggli_cell, n_elements=3): structure = random_structure.xray_structure(space_group_info, elements=["Si"] * n_elements, volume_per_atom=300, min_distance=3., general_positions_only=False) if (use_niggli_cell): structure = structure.niggli_cell() f_obs = abs( structure.structure_factors(d_min=3, algorithm="direct").f_calc()) assert f_obs.indices().size() >= 10 transl = matrix.col(flex.random_double_point_on_sphere()) * 2.345 transl_no_cont = matrix.col( structure.subtract_continuous_allowed_origin_shifts( translation_cart=transl)) transl_cont = transl - transl_no_cont structure_transl = structure.apply_shift( shift=structure.unit_cell().fractionalize(transl_cont), recompute_site_symmetries=True) f_transl = abs( f_obs.structure_factors_from_scatterers( xray_structure=structure_transl, algorithm="direct").f_calc()) assert approx_equal(f_transl.data(), f_obs.data())
def exercise_subtract_continuous_allowed_origin_shifts( space_group_info, use_niggli_cell, n_elements=3): structure = random_structure.xray_structure( space_group_info, elements=["Si"]*n_elements, volume_per_atom=300, min_distance=3., general_positions_only=False) if (use_niggli_cell): structure = structure.niggli_cell() f_obs = abs(structure.structure_factors( d_min=3, algorithm="direct").f_calc()) assert f_obs.indices().size() >= 10 transl = matrix.col(flex.random_double_point_on_sphere()) * 2.345 transl_no_cont = matrix.col( structure.subtract_continuous_allowed_origin_shifts( translation_cart=transl)) transl_cont = transl - transl_no_cont structure_transl = structure.apply_shift( shift=structure.unit_cell().fractionalize(transl_cont), recompute_site_symmetries=True) f_transl = abs(f_obs.structure_factors_from_scatterers( xray_structure=structure_transl, algorithm="direct").f_calc()) assert approx_equal(f_transl.data(), f_obs.data())