Beispiel #1
0
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
Beispiel #3
0
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())
Beispiel #4
0
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())