def exercise_packed(structure_ideal, f_obs, anomalous_flag, verbose=0): sh, ls = shift_all(structure_ideal, f_obs, anomalous_flag) flag = (random.random() > 0.5) gradient_flags = randomize_gradient_flags( xray.structure_factors.gradient_flags(site=flag, u=not flag), f_obs.anomalous_flag(), thresholds=(1/2.,0)) u_iso_refinable_params = flex.double() for scatterer in sh.structure_shifted.scatterers(): scatterer.flags.set_grad_site(gradient_flags.site) scatterer.flags.set_grad_u_iso(gradient_flags.u_iso) scatterer.flags.set_grad_u_aniso(gradient_flags.u_aniso) scatterer.flags.set_grad_occupancy(gradient_flags.occupancy) scatterer.flags.set_grad_fp(gradient_flags.fp) scatterer.flags.set_grad_fdp(gradient_flags.fdp) scatterer.flags.set_tan_u_iso(True) param = random.randint(90,120) scatterer.flags.param= param value = math.tan(scatterer.u_iso*math.pi/adptbx.b_as_u(param)-math.pi/2) u_iso_refinable_params.append(value) n_parameters = xray.scatterer_grad_flags_counts( sh.structure_shifted.scatterers()).n_parameters() assert n_parameters == sh.structure_shifted.n_parameters() if (n_parameters > 0): sfd = xray.structure_factors.gradients_direct( xray_structure=sh.structure_shifted, u_iso_refinable_params=u_iso_refinable_params, miller_set=f_obs, d_target_d_f_calc=ls.derivatives(), n_parameters=n_parameters) assert sfd.packed().size() == n_parameters re = resampling(miller_set=f_obs) map0 = re( xray_structure=sh.structure_shifted, u_iso_refinable_params=u_iso_refinable_params, dp=miller.array(miller_set=f_obs, data=ls.derivatives()), n_parameters=n_parameters, verbose=verbose) assert map0.packed().size() == n_parameters correlation = flex.linear_correlation(sfd.packed(), map0.packed()) assert correlation.is_well_defined() assert correlation.coefficient() > 0.999
def exercise(target_functor, data_type, parameter_name, space_group_info, anomalous_flag, cartesian_flag, n_elements=9, d_min=2.5, shake_sigma=0.25, test_hard=True, verbose=0): assert data_type == 'F' or data_type == 'F^2' if (data_type == 'F^2' and not target_functor == xray.unified_least_squares_residual): return if (parameter_name != "site" and cartesian_flag == True): return if (parameter_name == "fdp" and not anomalous_flag): return structure_ideal = random_structure.xray_structure( space_group_info, elements=(("O", "N", "C") * (n_elements))[:n_elements], volume_per_atom=100, random_f_prime_d_min=d_min, random_f_double_prime=anomalous_flag, use_u_aniso=True, use_u_iso=False, random_u_cart_scale=0.3, random_u_iso=False, random_occupancy=True) if (parameter_name in ["u_star", "u_iso"]): shake_sigma = shake_sigma / 2. random_structure.random_modify_adp_and_adp_flags( scatterers=structure_ideal.scatterers(), random_u_iso_scale=0.3, random_u_iso_min=0.0, parameter_name=parameter_name) rnd_f_calc = structure_ideal.structure_factors( anomalous_flag=anomalous_flag, d_min=d_min, algorithm="direct").f_calc() if data_type == 'F': y_obs = abs(rnd_f_calc) elif data_type == 'F^2': y_obs = rnd_f_calc.norm() y_obs.set_observation_type_xray_intensity() structure_shake = structure_ideal.random_modify_parameters( parameter_name, shake_sigma, vary_z_only=False) assert tuple(structure_ideal.special_position_indices()) \ == tuple(structure_shake.special_position_indices()) target_ftor = target_functor(y_obs) for structure in (structure_ideal, structure_shake)[:]: #SWITCH f_calc = y_obs.structure_factors_from_scatterers( xray_structure=structure, algorithm="direct").f_calc() target_result = target_ftor(f_calc, compute_derivatives=True) if (structure == structure_ideal): assert abs(target_result.target()) < 1.e-5 gradient_flags = xray.structure_factors.gradient_flags( site=(parameter_name == "site" or random.choice((False, True))), u_iso=(parameter_name == "u_iso" or random.choice((False, True))), u_aniso=(parameter_name == "u_star" or random.choice((False, True))), occupancy=(parameter_name == "occupancy" or random.choice( (False, True))), fp=(parameter_name == "fp" or random.choice((False, True))), fdp=(parameter_name == "fdp" or (anomalous_flag and random.choice( (False, True))))) xray.set_scatterer_grad_flags(scatterers=structure.scatterers(), site=gradient_flags.site, u_iso=gradient_flags.u_iso, u_aniso=gradient_flags.u_aniso, occupancy=gradient_flags.occupancy, fp=gradient_flags.fp, fdp=gradient_flags.fdp) grad_flags_counts = xray.scatterer_grad_flags_counts( structure.scatterers()) sf = xray.structure_factors.gradients_direct( xray_structure=structure, u_iso_refinable_params=None, miller_set=y_obs, d_target_d_f_calc=target_result.derivatives(), n_parameters=0) if (parameter_name == "site"): d_analytical = sf.d_target_d_site_frac() if (cartesian_flag ): # average d_analytical or d_numerical, but not both structure_ideal.apply_special_position_ops_d_target_d_site( d_analytical) if (cartesian_flag): d_analytical = sf.d_target_d_site_cart() d_numerical = finite_differences_site(cartesian_flag, target_ftor, structure) if (not cartesian_flag ): # aver. d_analytical or d_numerical, but not both structure_ideal.apply_special_position_ops_d_target_d_site( d_numerical) elif (parameter_name == "u_star" and grad_flags_counts.use_u_aniso > 0): d_analytical = sf.d_target_d_u_star() d_numerical = finite_differences_u_star(target_ftor, structure) else: if (parameter_name == "occupancy"): d_analytical = sf.d_target_d_occupancy() elif (parameter_name == "u_iso" and grad_flags_counts.use_u_iso > 0): d_analytical = sf.d_target_d_u_iso() elif (parameter_name == "fp"): d_analytical = sf.d_target_d_fp() elif (parameter_name == "fdp"): d_analytical = sf.d_target_d_fdp() else: raise RuntimeError d_numerical = finite_differences_scalar(parameter_name, target_ftor, structure) linear_regression_test(d_analytical, d_numerical, test_hard, verbose=verbose) if (parameter_name == "u_iso" and grad_flags_counts.use_u_iso > 0): u_iso_refinable_params = flex.double() for scatterer in structure.scatterers(): scatterer.flags.set_tan_u_iso(True) scatterer.flags.set_grad_u_iso(gradient_flags.u_iso) param = random.randint(90, 120) scatterer.flags.param = param value = math.tan(scatterer.u_iso * math.pi / adptbx.b_as_u(param) - math.pi / 2) u_iso_refinable_params.append(value) sf = xray.structure_factors.gradients_direct( xray_structure=structure, u_iso_refinable_params=u_iso_refinable_params, miller_set=y_obs, d_target_d_f_calc=target_result.derivatives(), n_parameters=0) d_analytical = sf.d_target_d_u_iso() d_numerical = finite_differences_scalar("tan_u_iso", target_ftor, structure) linear_regression_test(d_analytical, d_numerical, test_hard, verbose=verbose)
def exercise_gradient_manager(structure_ideal, f_obs, anomalous_flag, verbose=0): sh, ls = shift_all(structure_ideal, f_obs, anomalous_flag) grad_manager = xray.structure_factors.gradients( miller_set=f_obs, quality_factor=100000, wing_cutoff=1.e-10) gradient_flags=xray.structure_factors.gradient_flags(default=True) xray.set_scatterer_grad_flags(scatterers = sh.structure_shifted.scatterers(), site = gradient_flags.site, u_iso = gradient_flags.u_iso, u_aniso = gradient_flags.u_aniso, occupancy = gradient_flags.occupancy, fp = gradient_flags.fp, fdp = gradient_flags.fdp) if (0): print "exercise_gradient_manager" print "gradient_flags.site ", gradient_flags.site print "gradient_flags.u_iso ", gradient_flags.u_iso print "gradient_flags.u_aniso ", gradient_flags.u_aniso print "gradient_flags.occupancy ", gradient_flags.occupancy print "gradient_flags.fp ", gradient_flags.fp print "gradient_flags.fdp ", gradient_flags.fdp cntr_use_u_iso = 0 cntr_use_u_aniso = 0 cntr_grad_u_iso = 0 cntr_grad_u_aniso = 0 for scatterer in sh.structure_shifted.scatterers(): if (scatterer.flags.use_u_iso()): cntr_use_u_iso += 1 if (scatterer.flags.use_u_aniso()): cntr_use_u_aniso += 1 if (scatterer.flags.grad_u_iso()): cntr_grad_u_iso += 1 if (scatterer.flags.grad_u_aniso()): cntr_grad_u_aniso += 1 print "use_u_iso ", cntr_use_u_iso,cntr_grad_u_iso print "use_u_aniso ", cntr_use_u_aniso,cntr_grad_u_aniso if (random.random() > 0.5): n_parameters = 0 else: n_parameters = xray.scatterer_grad_flags_counts( sh.structure_shifted.scatterers()).n_parameters() assert n_parameters == sh.structure_shifted.n_parameters() gd = grad_manager( xray_structure=sh.structure_shifted, u_iso_refinable_params=None, miller_set=f_obs, d_target_d_f_calc=ls.derivatives(), n_parameters=n_parameters, algorithm="direct") gf = grad_manager( xray_structure=sh.structure_shifted, u_iso_refinable_params=None, miller_set=f_obs, d_target_d_f_calc=ls.derivatives(), n_parameters=n_parameters, algorithm="fft") grad_flags_counts = \ xray.scatterer_grad_flags_counts(sh.structure_shifted.scatterers()) if (n_parameters == 0): d = gd.d_target_d_site_frac() f = gf.d_target_d_site_frac() linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose) d = gd.d_target_d_site_cart() f = gf.d_target_d_site_cart() linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose) if(grad_flags_counts.u_iso > 0): d = gd.d_target_d_u_iso() f = gf.d_target_d_u_iso() linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose) if(grad_flags_counts.u_aniso > 0): linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose) d = gd.d_target_d_u_cart() f = gf.d_target_d_u_cart() linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose) d = gd.d_target_d_occupancy() f = gf.d_target_d_occupancy() linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose) d = gd.d_target_d_fp() f = gf.d_target_d_fp() linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose) if (anomalous_flag): d = gd.d_target_d_fdp() f = gf.d_target_d_fdp() linear_regression_test(d, f, slope_tolerance=1.e-2, verbose=verbose) else: correlation = flex.linear_correlation(gd.packed(), gf.packed()) assert correlation.is_well_defined() assert correlation.coefficient() > 0.995, correlation.coefficient()
def u_star(structure_ideal, d_min, f_obs, verbose=0): sh = shifted_u_star(f_obs, structure_ideal, 0, 0, 0.0001) if (0 or verbose): print "u_star" sh.structure_shifted.show_summary().show_scatterers() print ls = xray.targets_least_squares_residual( f_obs.data(), sh.f_calc.data(), True, 1) gradient_flags = randomize_gradient_flags( xray.structure_factors.gradient_flags(u_aniso=True), f_obs.anomalous_flag()) xray.set_scatterer_grad_flags(scatterers = sh.structure_shifted.scatterers(), site = gradient_flags.site, u_iso = gradient_flags.u_iso, u_aniso = gradient_flags.u_aniso, occupancy = gradient_flags.occupancy, fp = gradient_flags.fp, fdp = gradient_flags.fdp) grad_flags_counts = xray.scatterer_grad_flags_counts(sh.structure_shifted.scatterers()) if(grad_flags_counts.n_parameters() > 0): if (0): print "u_aniso" print "gradient_flags.site ", gradient_flags.site print "gradient_flags.u_iso ", gradient_flags.u_iso print "gradient_flags.u_aniso ", gradient_flags.u_aniso print "gradient_flags.occupancy ", gradient_flags.occupancy print "gradient_flags.fp ", gradient_flags.fp print "gradient_flags.fdp ", gradient_flags.fdp cntr_use_u_iso = 0 cntr_use_u_aniso = 0 cntr_grad_u_iso = 0 cntr_grad_u_aniso = 0 for scatterer in sh.structure_shifted.scatterers(): if (scatterer.flags.use_u_iso()): cntr_use_u_iso += 1 if (scatterer.flags.use_u_aniso()): cntr_use_u_aniso += 1 if (scatterer.flags.grad_u_iso()): cntr_grad_u_iso += 1 if (scatterer.flags.grad_u_aniso()): cntr_grad_u_aniso += 1 print "use_u_iso ", cntr_use_u_iso,cntr_grad_u_iso print "use_u_aniso ", cntr_use_u_aniso,cntr_grad_u_aniso sfd = xray.structure_factors.gradients_direct( xray_structure=sh.structure_shifted, u_iso_refinable_params=None, miller_set=f_obs, d_target_d_f_calc=ls.derivatives(), n_parameters= 0 ) re = resampling(miller_set=f_obs) map0 = re( xray_structure=sh.structure_shifted, u_iso_refinable_params=None, dp=miller.array(miller_set=f_obs, data=ls.derivatives()), n_parameters= 0, verbose=verbose) grad_flags_counts = xray.scatterer_grad_flags_counts(sh.structure_shifted.scatterers()) if(grad_flags_counts.u_aniso): sfd_d_target_d_u_cart = sfd.d_target_d_u_cart() map0_d_target_d_u_cart = map0.d_target_d_u_cart() top_gradient = None gradients_1 = [] for i_scatterer,scatterer in enumerate(sh.structure_shifted.scatterers()): if(scatterer.flags.use_u_iso()): parameter_name = "u_iso" if(scatterer.flags.use_u_aniso()): parameter_name = "u_star" if(parameter_name == "u_iso" and scatterer.flags.grad_u_iso()): direct_summ = sfd.d_target_d_u_iso()[i_scatterer] if (top_gradient is None): top_gradient = direct_summ fast_gradie = map0.d_target_d_u_iso()[i_scatterer] sys.stdout.flush() gradients_1.append([direct_summ, fast_gradie]) match = judge(scatterer, parameter_name, direct_summ, fast_gradie, top_gradient) if (0 or verbose): print "direct summ[%d]: " % i_scatterer, direct_summ print "fast gradie[%d]: " % i_scatterer, fast_gradie, match print assert not match.is_bad if parameter_name == "u_star" and scatterer.flags.grad_u_aniso(): sfd_star = sfd.d_target_d_u_star()[i_scatterer] sfd_cart = adptbx.grad_u_star_as_u_cart( structure_ideal.unit_cell(), sfd_star) assert approx_equal( sfd_star, adptbx.grad_u_cart_as_u_star(structure_ideal.unit_cell(), sfd_cart)) for ij in xrange(6): direct_summ = sfd_d_target_d_u_cart[i_scatterer][ij] if (top_gradient is None): top_gradient = direct_summ fast_gradie = map0_d_target_d_u_cart[i_scatterer][ij] gradients_1.append([direct_summ, fast_gradie]) match =judge(scatterer,"u_star",direct_summ,fast_gradie,top_gradient) if (0 or verbose or match.is_bad): print "direct summ[%d][%d]: " % (i_scatterer, ij), direct_summ print "fast gradie[%d][%d]: " % (i_scatterer, ij),fast_gradie,match print assert not match.is_bad # Making sure that gradients_1 = gradients_2 for i_scatterer,scatterer in enumerate(sh.structure_shifted.scatterers()): if(not scatterer.flags.use_u_iso()): scatterer.u_iso = -12345.0 if(not scatterer.flags.use_u_aniso()): scatterer.u_star =(-999.,-999.,-999.,-999.,-999.,-999.) sfd = xray.structure_factors.gradients_direct( xray_structure=sh.structure_shifted, u_iso_refinable_params=None, miller_set=f_obs, d_target_d_f_calc=ls.derivatives(), n_parameters= 0 ) re = resampling(miller_set=f_obs) map0 = re( xray_structure=sh.structure_shifted, u_iso_refinable_params=None, dp=miller.array(miller_set=f_obs, data=ls.derivatives()), n_parameters= 0, verbose=verbose) grad_flags_counts = \ xray.scatterer_grad_flags_counts(sh.structure_shifted.scatterers()) if(grad_flags_counts.u_aniso): sfd_d_target_d_u_cart = sfd.d_target_d_u_cart() map0_d_target_d_u_cart = map0.d_target_d_u_cart() gradients_2 = [] for i_scatterer,scatterer in enumerate(sh.structure_shifted.scatterers()): if(scatterer.flags.use_u_iso()): parameter_name = "u_iso" if(scatterer.flags.use_u_aniso()): parameter_name = "u_star" if(parameter_name == "u_iso" and scatterer.flags.grad_u_iso()): direct_summ = sfd.d_target_d_u_iso()[i_scatterer] fast_gradie = map0.d_target_d_u_iso()[i_scatterer] gradients_2.append([direct_summ, fast_gradie]) if parameter_name == "u_star" and scatterer.flags.grad_u_aniso(): sfd_star = sfd.d_target_d_u_star()[i_scatterer] sfd_cart = adptbx.grad_u_star_as_u_cart( structure_ideal.unit_cell(), sfd_star) assert approx_equal( sfd_star, adptbx.grad_u_cart_as_u_star(structure_ideal.unit_cell(), sfd_cart)) for ij in xrange(6): direct_summ = sfd_d_target_d_u_cart[i_scatterer][ij] fast_gradie = map0_d_target_d_u_cart[i_scatterer][ij] gradients_2.append([direct_summ, fast_gradie]) for g1,g2 in zip(gradients_1, gradients_2): assert approx_equal(g1, g2) sys.stdout.flush()
def u_iso(structure_ideal, d_min, f_obs, tan_u_iso, verbose=0): sh = shifted_u_iso(f_obs, structure_ideal, 0, 0.05) if (0 or verbose): print("u_iso") sh.structure_shifted.show_summary().show_scatterers() print() ls = xray.targets_least_squares_residual(f_obs.data(), sh.f_calc.data(), True, 1) gradient_flags = randomize_gradient_flags( xray.structure_factors.gradient_flags(u_iso=True), f_obs.anomalous_flag()) if (tan_u_iso): u_iso_refinable_params = flex.double() else: u_iso_refinable_params = None for scatterer in sh.structure_shifted.scatterers(): scatterer.flags.set_grad_site(gradient_flags.site) scatterer.flags.set_grad_u_iso(gradient_flags.u_iso) scatterer.flags.set_grad_u_aniso(gradient_flags.u_aniso) scatterer.flags.set_grad_occupancy(gradient_flags.occupancy) scatterer.flags.set_grad_fp(gradient_flags.fp) scatterer.flags.set_grad_fdp(gradient_flags.fdp) if (tan_u_iso): scatterer.flags.set_tan_u_iso(True) param = random.randint(90, 120) scatterer.flags.param = param value = math.tan(scatterer.u_iso * math.pi / adptbx.b_as_u(param) - math.pi / 2) u_iso_refinable_params.append(value) if (0): print("u_iso") print("gradient_flags.site ", gradient_flags.site) print("gradient_flags.u_iso ", gradient_flags.u_iso) print("gradient_flags.u_aniso ", gradient_flags.u_aniso) print("gradient_flags.occupancy ", gradient_flags.occupancy) print("gradient_flags.fp ", gradient_flags.fp) print("gradient_flags.fdp ", gradient_flags.fdp) cntr_use_u_iso = 0 cntr_use_u_aniso = 0 cntr_grad_u_iso = 0 cntr_grad_u_aniso = 0 for scatterer in sh.structure_shifted.scatterers(): if (scatterer.flags.use_u_iso()): cntr_use_u_iso += 1 if (scatterer.flags.use_u_aniso()): cntr_use_u_aniso += 1 if (scatterer.flags.grad_u_iso()): cntr_grad_u_iso += 1 if (scatterer.flags.grad_u_aniso()): cntr_grad_u_aniso += 1 print("use_u_iso ", cntr_use_u_iso, cntr_grad_u_iso) print("use_u_aniso ", cntr_use_u_aniso, cntr_grad_u_aniso) grad_flags_counts = \ xray.scatterer_grad_flags_counts(sh.structure_shifted.scatterers()) if (grad_flags_counts.n_parameters() > 0): sfd = xray.structure_factors.gradients_direct( xray_structure=sh.structure_shifted, u_iso_refinable_params=u_iso_refinable_params, miller_set=f_obs, d_target_d_f_calc=ls.derivatives(), n_parameters=0) re = resampling(miller_set=f_obs) map0 = re(xray_structure=sh.structure_shifted, u_iso_refinable_params=u_iso_refinable_params, dp=miller.array(miller_set=f_obs, data=ls.derivatives()), n_parameters=0, verbose=verbose) if (grad_flags_counts.u_aniso > 0): sfd_d_target_d_u_cart = sfd.d_target_d_u_cart() map0_d_target_d_u_cart = map0.d_target_d_u_cart() top_gradient = None gradients_1 = [] for i_scatterer, scatterer in enumerate( sh.structure_shifted.scatterers()): if (0): print("i_scatterer= ", i_scatterer,scatterer.flags.use_u_iso(),\ scatterer.flags.grad_u_iso(), scatterer.flags.use_u_aniso(),\ scatterer.flags.grad_u_aniso(), scatterer.u_iso, scatterer.u_star) if (scatterer.flags.use_u_iso()): parameter_name = "u_iso" if (scatterer.flags.use_u_aniso()): parameter_name = "u_star" if (parameter_name == "u_iso" and scatterer.flags.grad_u_iso() and scatterer.flags.use_u_iso()): direct_summ = sfd.d_target_d_u_iso()[i_scatterer] if (top_gradient is None): top_gradient = direct_summ fast_gradie = map0.d_target_d_u_iso()[i_scatterer] sys.stdout.flush() gradients_1.append([direct_summ, fast_gradie]) match = judge(scatterer, parameter_name, direct_summ, fast_gradie, top_gradient) if (0 or verbose): print("direct summ[%d]: " % i_scatterer, direct_summ) print("fast gradie[%d]: " % i_scatterer, fast_gradie, match) print() assert not match.is_bad if (parameter_name == "u_star" and scatterer.flags.grad_u_aniso() and scatterer.flags.use_u_aniso()): sfd_star = sfd.d_target_d_u_star()[i_scatterer] sfd_cart = adptbx.grad_u_star_as_u_cart( structure_ideal.unit_cell(), sfd_star) assert approx_equal( sfd_star, adptbx.grad_u_cart_as_u_star(structure_ideal.unit_cell(), sfd_cart)) for ij in range(6): direct_summ = sfd_d_target_d_u_cart[i_scatterer][ij] if (top_gradient is None): top_gradient = direct_summ fast_gradie = map0_d_target_d_u_cart[i_scatterer][ij] gradients_1.append([direct_summ, fast_gradie]) match = judge(scatterer, "u_star", direct_summ, fast_gradie, top_gradient) if (0 or verbose or match.is_bad): print("direct summ[%d][%d]: " % (i_scatterer, ij), direct_summ) print("fast gradie[%d][%d]: " % (i_scatterer, ij), fast_gradie, match) print() assert not match.is_bad # Making sure that gradients_1 = gradients_2 for i_scatterer, scatterer in enumerate( sh.structure_shifted.scatterers()): if (not scatterer.flags.use_u_iso()): scatterer.u_iso = -12345.0 if (not scatterer.flags.use_u_aniso()): scatterer.u_star = (-999., -999., -999., -999., -999., -999.) sfd = xray.structure_factors.gradients_direct( xray_structure=sh.structure_shifted, u_iso_refinable_params=u_iso_refinable_params, miller_set=f_obs, d_target_d_f_calc=ls.derivatives(), n_parameters=0) re = resampling(miller_set=f_obs) map0 = re(xray_structure=sh.structure_shifted, u_iso_refinable_params=u_iso_refinable_params, dp=miller.array(miller_set=f_obs, data=ls.derivatives()), n_parameters=0, verbose=verbose) grad_flags_counts = \ xray.scatterer_grad_flags_counts(sh.structure_shifted.scatterers()) if (grad_flags_counts.u_aniso): sfd_d_target_d_u_cart = sfd.d_target_d_u_cart() map0_d_target_d_u_cart = map0.d_target_d_u_cart() gradients_2 = [] for i_scatterer, scatterer in enumerate( sh.structure_shifted.scatterers()): if (scatterer.flags.use_u_iso()): parameter_name = "u_iso" if (scatterer.flags.use_u_aniso()): parameter_name = "u_star" if (parameter_name == "u_iso" and scatterer.flags.grad_u_iso() and scatterer.flags.use_u_iso()): direct_summ = sfd.d_target_d_u_iso()[i_scatterer] fast_gradie = map0.d_target_d_u_iso()[i_scatterer] gradients_2.append([direct_summ, fast_gradie]) if (parameter_name == "u_star" and scatterer.flags.grad_u_aniso() and scatterer.flags.use_u_aniso()): sfd_star = sfd.d_target_d_u_star()[i_scatterer] sfd_cart = adptbx.grad_u_star_as_u_cart( structure_ideal.unit_cell(), sfd_star) assert approx_equal( sfd_star, adptbx.grad_u_cart_as_u_star(structure_ideal.unit_cell(), sfd_cart)) for ij in range(6): direct_summ = sfd_d_target_d_u_cart[i_scatterer][ij] fast_gradie = map0_d_target_d_u_cart[i_scatterer][ij] gradients_2.append([direct_summ, fast_gradie]) for g1, g2 in zip(gradients_1, gradients_2): assert approx_equal(g1, g2) sys.stdout.flush()
def exercise(target_functor, data_type, parameter_name, space_group_info, anomalous_flag, cartesian_flag, n_elements=9, d_min=2.5, shake_sigma=0.25, test_hard=True, verbose=0): assert data_type == 'F' or data_type == 'F^2' if (data_type == 'F^2' and not target_functor == xray.unified_least_squares_residual): return if (parameter_name != "site" and cartesian_flag == True): return if (parameter_name == "fdp" and not anomalous_flag): return structure_ideal = random_structure.xray_structure( space_group_info, elements=(("O","N","C")*(n_elements))[:n_elements], volume_per_atom=100, random_f_prime_d_min=d_min, random_f_double_prime=anomalous_flag, use_u_aniso = True, use_u_iso = False, random_u_cart_scale = 0.3, random_u_iso = False, random_occupancy=True) if(parameter_name in ["u_star", "u_iso"]): shake_sigma = shake_sigma / 2. random_structure.random_modify_adp_and_adp_flags( scatterers = structure_ideal.scatterers(), random_u_iso_scale = 0.3, random_u_iso_min = 0.0, parameter_name = parameter_name) rnd_f_calc = structure_ideal.structure_factors( anomalous_flag=anomalous_flag, d_min=d_min, algorithm="direct").f_calc() if data_type == 'F': y_obs = abs(rnd_f_calc) elif data_type == 'F^2': y_obs = rnd_f_calc.norm() y_obs.set_observation_type_xray_intensity() structure_shake = structure_ideal.random_modify_parameters( parameter_name, shake_sigma, vary_z_only=False) assert tuple(structure_ideal.special_position_indices()) \ == tuple(structure_shake.special_position_indices()) target_ftor = target_functor(y_obs) for structure in (structure_ideal, structure_shake)[:]: #SWITCH f_calc = y_obs.structure_factors_from_scatterers( xray_structure=structure, algorithm="direct").f_calc() target_result = target_ftor(f_calc, compute_derivatives=True) if (structure == structure_ideal): assert abs(target_result.target()) < 1.e-5 gradient_flags=xray.structure_factors.gradient_flags( site=(parameter_name=="site" or random.choice((False,True))), u_iso=(parameter_name=="u_iso" or random.choice((False,True))), u_aniso=(parameter_name=="u_star" or random.choice((False,True))), occupancy=(parameter_name=="occupancy" or random.choice((False,True))), fp=(parameter_name=="fp" or random.choice((False,True))), fdp=(parameter_name=="fdp" or (anomalous_flag and random.choice((False,True))))) xray.set_scatterer_grad_flags(scatterers = structure.scatterers(), site = gradient_flags.site, u_iso = gradient_flags.u_iso, u_aniso = gradient_flags.u_aniso, occupancy = gradient_flags.occupancy, fp = gradient_flags.fp, fdp = gradient_flags.fdp) grad_flags_counts = xray.scatterer_grad_flags_counts(structure.scatterers()) sf = xray.structure_factors.gradients_direct( xray_structure=structure, u_iso_refinable_params=None, miller_set=y_obs, d_target_d_f_calc=target_result.derivatives(), n_parameters=0) if (parameter_name == "site"): d_analytical = sf.d_target_d_site_frac() if (cartesian_flag): # average d_analytical or d_numerical, but not both structure_ideal.apply_special_position_ops_d_target_d_site(d_analytical) if (cartesian_flag): d_analytical = sf.d_target_d_site_cart() d_numerical = finite_differences_site( cartesian_flag, target_ftor, structure) if (not cartesian_flag): # aver. d_analytical or d_numerical, but not both structure_ideal.apply_special_position_ops_d_target_d_site(d_numerical) elif (parameter_name == "u_star" and grad_flags_counts.use_u_aniso > 0): d_analytical = sf.d_target_d_u_star() d_numerical = finite_differences_u_star(target_ftor, structure) else: if (parameter_name == "occupancy"): d_analytical = sf.d_target_d_occupancy() elif (parameter_name == "u_iso" and grad_flags_counts.use_u_iso > 0): d_analytical = sf.d_target_d_u_iso() elif (parameter_name == "fp"): d_analytical = sf.d_target_d_fp() elif (parameter_name == "fdp"): d_analytical = sf.d_target_d_fdp() else: raise RuntimeError d_numerical = finite_differences_scalar( parameter_name, target_ftor, structure) linear_regression_test(d_analytical, d_numerical, test_hard, verbose=verbose) if (parameter_name == "u_iso" and grad_flags_counts.use_u_iso > 0): u_iso_refinable_params = flex.double() for scatterer in structure.scatterers(): scatterer.flags.set_tan_u_iso(True) scatterer.flags.set_grad_u_iso(gradient_flags.u_iso) param = random.randint(90,120) scatterer.flags.param= param value = math.tan(scatterer.u_iso*math.pi/adptbx.b_as_u(param)-math.pi/2) u_iso_refinable_params.append(value) sf = xray.structure_factors.gradients_direct( xray_structure=structure, u_iso_refinable_params = u_iso_refinable_params, miller_set=y_obs, d_target_d_f_calc=target_result.derivatives(), n_parameters=0) d_analytical = sf.d_target_d_u_iso() d_numerical = finite_differences_scalar("tan_u_iso",target_ftor, structure) linear_regression_test(d_analytical, d_numerical, test_hard, verbose=verbose)