Ejemplo n.º 1
0
def exercise(xray_structure, anomalous_flag, max_n_indices, out):
    xray_structure.show_summary(f=out).show_scatterers(f=out)
    miller_set = miller.build_set(
        crystal_symmetry=xray_structure,
        anomalous_flag=anomalous_flag,
        d_min=max(1,
                  min(xray_structure.unit_cell().parameters()[:3]) / 2.5))
    n_indices = miller_set.indices().size()
    if (n_indices > max_n_indices):
        miller_set = miller_set.select(
            flex.random_size_t(size=max_n_indices) % n_indices)
    sf = structure_factors(xray_structure=xray_structure,
                           miller_set=miller_set)
    f_calc = miller_set.structure_factors_from_scatterers(
        xray_structure=xray_structure, algorithm="direct",
        cos_sin_table=False).f_calc()
    f_calc.show_summary(f=out)
    assert approx_equal(sf.fs(), f_calc.data())
    f_obs = miller_set.array(data=flex.abs(sf.fs()))
    noise_fin = compare_analytical_and_finite(f_obs=f_obs,
                                              xray_structure=xray_structure,
                                              gradients_should_be_zero=True,
                                              eps=1.e-5,
                                              out=out)
    compare_analytical_and_finite(f_obs=f_obs.customized_copy(
        data=f_obs.data() * (flex.random_double(size=f_obs.size()) + 0.5)),
                                  xray_structure=xray_structure,
                                  gradients_should_be_zero=False,
                                  eps=max(1.e-5, noise_fin),
                                  out=out)
def compare_analytical_and_finite(
      f_obs,
      xray_structure,
      gradients_should_be_zero,
      eps,
      out):
  grads_fin = d_target_d_params_finite(
    d_order=1, f_obs=f_obs, xray_structure=xray_structure)
  print >> out, "grads_fin:", list(grads_fin)
  sf = structure_factors(
    xray_structure=xray_structure, miller_set=f_obs)
  grads_ana = sf.d_target_d_params(f_obs=f_obs, target_type=least_squares)
  print >> out, "grads_ana:", list(grads_ana)
  if (gradients_should_be_zero):
    flex.compare_derivatives(grads_ana, flex.double(grads_ana.size(), 0), eps)
  else:
    flex.compare_derivatives(grads_ana, grads_fin, eps)
  curvs_fin = d_target_d_params_finite(
    d_order=2, f_obs=f_obs, xray_structure=xray_structure)
  print >> out, "curvs_fin:", list(curvs_fin)
  curvs_ana = sf.d2_target_d_params(f_obs=f_obs, target_type=least_squares)
  print >> out, "curvs_ana:", list(curvs_ana)
  flex.compare_derivatives(curvs_ana.as_1d(), curvs_fin, eps)
  assert curvs_ana.matrix_is_symmetric(relative_epsilon=1e-10)
  print >> out
  #
  for i_method,curvs_method in enumerate([
        sf.d2_target_d_params_diag,
        sf.d2_target_d_params_diag_cpp]):
    curvs_diag_ana = curvs_method(f_obs=f_obs, target_type=least_squares)
    if (i_method != 0):
      flex.compare_derivatives(grads_ana, curvs_diag_ana.grads, eps=1e-12)
      curvs_diag_ana = curvs_diag_ana.curvs
    assert curvs_diag_ana.size() == curvs_ana.focus()[0]
    flex.compare_derivatives(
      curvs_ana.matrix_diagonal().as_1d(), curvs_diag_ana, eps=1e-12)
  #
  if (gradients_should_be_zero):
    return flex.max(flex.abs(grads_fin))
def exercise(
      xray_structure,
      anomalous_flag,
      max_n_indices,
      out):
  xray_structure.show_summary(f=out).show_scatterers(f=out)
  miller_set = miller.build_set(
    crystal_symmetry=xray_structure,
    anomalous_flag=anomalous_flag,
    d_min=max(1, min(xray_structure.unit_cell().parameters()[:3])/2.5))
  n_indices = miller_set.indices().size()
  if (n_indices > max_n_indices):
    miller_set = miller_set.select(
      flex.random_size_t(size=max_n_indices) % n_indices)
  sf = structure_factors(
    xray_structure=xray_structure,
    miller_set=miller_set)
  f_calc = miller_set.structure_factors_from_scatterers(
    xray_structure=xray_structure,
    algorithm="direct",
    cos_sin_table=False).f_calc()
  f_calc.show_summary(f=out)
  assert approx_equal(sf.fs(), f_calc.data())
  f_obs = miller_set.array(data=flex.abs(sf.fs()))
  noise_fin = compare_analytical_and_finite(
    f_obs=f_obs,
    xray_structure=xray_structure,
    gradients_should_be_zero=True,
    eps=1.e-5,
    out=out)
  compare_analytical_and_finite(
    f_obs=f_obs.customized_copy(
      data=f_obs.data()*(flex.random_double(size=f_obs.size())+0.5)),
    xray_structure=xray_structure,
    gradients_should_be_zero=False,
    eps=max(1.e-5, noise_fin),
    out=out)
def d_target_d_params_finite(d_order, f_obs, xray_structure, eps=1.e-8):
  assert d_order in [1,2]
  result = flex.double()
  scatterers = xray_structure.scatterers()
  site_symmetry_table = xray_structure.site_symmetry_table()
  xray_structure_eps = xray_structure.deep_copy_scatterers()
  scatterers_eps = xray_structure_eps.scatterers()
  for i_scatterer,scatterer in enumerate(scatterers):
    if (not site_symmetry_table.is_special_position(i_scatterer)):
      site_symmetry_ops = None
      if (not scatterer.flags.use_u_aniso()):
        ips = range(7)
      else:
        ips = range(12)
    else:
      site_symmetry_ops = site_symmetry_table.get(i_scatterer)
      site_constraints = site_symmetry_ops.site_constraints()
      ips = list(site_constraints.independent_indices)
      if (not scatterer.flags.use_u_aniso()):
        ips.extend(range(3,7))
      else:
        adp_constraints = site_symmetry_ops.adp_constraints()
        ips.extend([i+3 for i in adp_constraints.independent_indices])
        ips.extend(range(9,12))
    dx = []
    for ip in ips:
      vs = []
      for signed_eps in [eps, -eps]:
        si_eps = scatterer_as_list(scatterer)
        si_eps[ip] += signed_eps
        if (site_symmetry_ops is not None):
          if (ip < 3):
            all_params = site_constraints.all_params(
              independent_params=site_constraints.independent_params(
              all_params=si_eps[:3]))
            si_eps = list(all_params) + si_eps[3:]
          elif (scatterer.flags.use_u_aniso() and ip < 9):
            all_params = adp_constraints.all_params(
              independent_params=adp_constraints.independent_params(
                all_params=si_eps[3:9]))
            si_eps = si_eps[:3] + list(all_params) + si_eps[9:]
        scatterers_eps[i_scatterer] = scatterer_from_list(si_eps)
        scatterers_eps[i_scatterer].scattering_type = scatterer.scattering_type
        xray_structure_eps.re_apply_symmetry(i_scatterer)
        sf = structure_factors(
          xray_structure=xray_structure_eps, miller_set=f_obs)
        if (d_order == 1):
          sum_target_f = 0
          for obs,f in zip(f_obs.data(), sf.fs()):
            target = least_squares(obs=obs, calc=f)
            sum_target_f += target.f()
          vs.append(sum_target_f)
        else:
          dp = sf.d_target_d_params(f_obs=f_obs, target_type=least_squares)
          vs.append(dp)
      diff = (vs[0]-vs[1])/(2*eps)
      if (d_order == 1):
        result.append(diff)
      else:
        result.extend(diff)
    scatterers_eps[i_scatterer] = scatterer
  return result