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