def exercise_core_LS(target_class, verbose): n_refl = 10 f_calc = flex.polar( flex.random_double(n_refl) * 10 - 5, flex.random_double(n_refl) * 10 - 5) f_obs = flex.abs(f_calc) + (flex.random_double(n_refl) * 2 - 1) weights = flex.random_double(n_refl) r = xray.targets_least_squares_residual(f_obs, weights, f_calc, True, 0) scale_factor = r.scale_factor() gr_ana = r.derivatives() gr_fin = flex.complex_double() eps = 1.e-6 for i_refl in xrange(n_refl): gc = [] for i_part in [0, 1]: fc0 = f_calc[i_refl] ts = [] for signed_eps in [eps, -eps]: if (i_part == 0): f_calc[i_refl] = complex(fc0.real + signed_eps, fc0.imag) else: f_calc[i_refl] = complex(fc0.real, fc0.imag + signed_eps) r = xray.targets_least_squares_residual( f_obs, weights, f_calc, False, scale_factor) ts.append(r.target()) f_calc[i_refl] = fc0 gc.append((ts[0] - ts[1]) / (2 * eps)) gr_fin.append(complex(*gc)) if (verbose): print "ana:", list(gr_ana) print "fin:", list(gr_fin) assert approx_equal(gr_fin, gr_ana)
def exercise_core_LS(target_class, verbose): n_refl = 10 f_calc = flex.polar( flex.random_double(n_refl)*10-5, flex.random_double(n_refl)*10-5) f_obs = flex.abs(f_calc) + (flex.random_double(n_refl)*2-1) weights = flex.random_double(n_refl) r = xray.targets_least_squares_residual( f_obs, weights, f_calc, True, 0) scale_factor = r.scale_factor() gr_ana = r.derivatives() gr_fin = flex.complex_double() eps = 1.e-6 for i_refl in xrange(n_refl): gc = [] for i_part in [0,1]: fc0 = f_calc[i_refl] ts = [] for signed_eps in [eps,-eps]: if (i_part == 0): f_calc[i_refl] = complex(fc0.real + signed_eps, fc0.imag) else: f_calc[i_refl] = complex(fc0.real, fc0.imag + signed_eps) r = xray.targets_least_squares_residual( f_obs, weights, f_calc, False, scale_factor) ts.append(r.target()) f_calc[i_refl] = fc0 gc.append((ts[0]-ts[1])/(2*eps)) gr_fin.append(complex(*gc)) if (verbose): print "ana:", list(gr_ana) print "fin:", list(gr_fin) assert approx_equal(gr_fin, gr_ana)
def shift_all(structure_ideal, f_obs, anomalous_flag): sh = shifted_site(None, structure_ideal, 0, 0, 0.01) sh = shifted_u_iso(None, sh.structure_shifted, 0, 0.05) sh = shifted_u_star(None, sh.structure_shifted, 0, 0, 0.0001) sh = shifted_occupancy(None, sh.structure_shifted, 0, 0.2) if (anomalous_flag): sh = shifted_fdp(None, sh.structure_shifted, 0, 2) sh = shifted_fp(f_obs, sh.structure_shifted, 0, -0.2) ls = xray.targets_least_squares_residual( f_obs.data(), sh.f_calc.data(), True, 1) return sh, ls
def site(structure_ideal, d_min, f_obs, verbose=0): sh = shifted_site(f_obs, structure_ideal, 0, 0, 0.01) if (0 or verbose): print("site") 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(site=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) 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) sfd_d_target_d_site_cart = sfd.d_target_d_site_cart() top_gradient = None for i_scatterer, scatterer in enumerate(sh.structure_shifted.scatterers()): for i_xyz in (0, 1, 2): direct_summ = sfd_d_target_d_site_cart[i_scatterer][i_xyz] if (top_gradient is None): top_gradient = direct_summ fast_gradie = map0.d_target_d_site_cart()[i_scatterer][i_xyz] match = judge(scatterer, "site", direct_summ, fast_gradie, top_gradient) if (0 or verbose): print("direct summ[%d][%d]: " % (i_scatterer, i_xyz), direct_summ) print("fast gradie[%d][%d]: " % (i_scatterer, i_xyz), fast_gradie, match) print() assert not match.is_bad sys.stdout.flush()
def site(structure_ideal, d_min, f_obs, verbose=0): sh = shifted_site(f_obs, structure_ideal, 0, 0, 0.01) if (0 or verbose): print "site" 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(site=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) 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) sfd_d_target_d_site_cart = sfd.d_target_d_site_cart() top_gradient = None for i_scatterer,scatterer in enumerate(sh.structure_shifted.scatterers()): for i_xyz in (0,1,2): direct_summ = sfd_d_target_d_site_cart[i_scatterer][i_xyz] if (top_gradient is None): top_gradient = direct_summ fast_gradie = map0.d_target_d_site_cart()[i_scatterer][i_xyz] match = judge(scatterer, "site", direct_summ, fast_gradie, top_gradient) if (0 or verbose): print "direct summ[%d][%d]: " % (i_scatterer,i_xyz), direct_summ print "fast gradie[%d][%d]: " % (i_scatterer,i_xyz), fast_gradie, match print assert not match.is_bad sys.stdout.flush()
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 timings(structure, d_min, fft_only=False, wing_cutoff_reference=1.e-6, wing_cutoff_others=1.e-3): structure_ng = structure.deep_copy_scatterers() structure_5g = structure.deep_copy_scatterers() structure_4g = structure.deep_copy_scatterers() structure_2g = structure.deep_copy_scatterers() structure_1g = structure.deep_copy_scatterers() structure_ng.scattering_type_registry(d_min=d_min, table="n_gaussian") structure_5g.scattering_type_registry(table="wk1995") structure_4g.scattering_type_registry(table="it1992") custom_dict = {} custom_dict.update(eltbx.xray_scattering.two_gaussian_agarwal_isaacs.table) structure_2g.scattering_type_registry(custom_dict=custom_dict) custom_dict.update(eltbx.xray_scattering.one_gaussian_agarwal_1978.table) structure_1g.scattering_type_registry(custom_dict=custom_dict) miller_set = miller.build_set( crystal_symmetry=structure, d_min=d_min, anomalous_flag=False) miller_set.show_summary() print "d_min:", d_min if (fft_only): timer = user_plus_sys_time() f_calc_reference = xray.structure_factors.from_scatterers( miller_set=miller_set, wing_cutoff=wing_cutoff_reference, exp_table_one_over_step_size=0)( xray_structure=structure, miller_set=miller_set, algorithm="fft").f_calc().data() print "fft exp function wing_cutoff=%3.1e: %.2f seconds" % ( wing_cutoff_reference, timer.elapsed()) else: timer = user_plus_sys_time() f_calc_reference = xray.structure_factors_simple( structure_5g.unit_cell(), structure_5g.space_group(), miller_set.indices(), structure_5g.scatterers(), structure_5g.scattering_type_registry()).f_calc() print "direct simple: %.2f seconds" % timer.elapsed() f_calc_reference = flex.abs(f_calc_reference) print "wing_cutoff for following fft calculations: %3.1e"%wing_cutoff_others for structure in (structure_ng, structure_5g, structure_4g, structure_2g, structure_1g): structure.scattering_type_registry().show_summary() if (not fft_only): for calc_type,cos_sin_flag in (("direct cos+sin function:",False), ("direct cos+sin table:",True)): timer = user_plus_sys_time() f_calc = miller_set.structure_factors_from_scatterers( xray_structure=structure, algorithm="direct", cos_sin_table=cos_sin_flag).f_calc() print " %-24s %.2f seconds," % (calc_type, timer.elapsed()), ls = xray.targets_least_squares_residual( f_calc_reference, f_calc.data(), False, 1) print "r-factor: %.6f" % ls.target() for calc_type,exp_table_one_over_step_size in (("fft exp function:",0), ("fft exp table:",-100)): timer = user_plus_sys_time() f_calc = xray.structure_factors.from_scatterers( miller_set=miller_set, wing_cutoff=wing_cutoff_others, exp_table_one_over_step_size=exp_table_one_over_step_size)( xray_structure=structure, miller_set=miller_set, algorithm="fft").f_calc() print " %-24s %.2f seconds," % (calc_type, timer.elapsed()), ls = xray.targets_least_squares_residual( f_calc_reference, f_calc.data(), False, 1) print "r-factor: %.6f" % ls.target() print
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 timings(structure, d_min, fft_only=False, wing_cutoff_reference=1.e-6, wing_cutoff_others=1.e-3): structure_ng = structure.deep_copy_scatterers() structure_5g = structure.deep_copy_scatterers() structure_4g = structure.deep_copy_scatterers() structure_2g = structure.deep_copy_scatterers() structure_1g = structure.deep_copy_scatterers() structure_ng.scattering_type_registry(d_min=d_min, table="n_gaussian") structure_5g.scattering_type_registry(table="wk1995") structure_4g.scattering_type_registry(table="it1992") custom_dict = {} custom_dict.update(eltbx.xray_scattering.two_gaussian_agarwal_isaacs.table) structure_2g.scattering_type_registry(custom_dict=custom_dict) custom_dict.update(eltbx.xray_scattering.one_gaussian_agarwal_1978.table) structure_1g.scattering_type_registry(custom_dict=custom_dict) miller_set = miller.build_set(crystal_symmetry=structure, d_min=d_min, anomalous_flag=False) miller_set.show_summary() print("d_min:", d_min) if (fft_only): timer = user_plus_sys_time() f_calc_reference = xray.structure_factors.from_scatterers( miller_set=miller_set, wing_cutoff=wing_cutoff_reference, exp_table_one_over_step_size=0)(xray_structure=structure, miller_set=miller_set, algorithm="fft").f_calc().data() print("fft exp function wing_cutoff=%3.1e: %.2f seconds" % (wing_cutoff_reference, timer.elapsed())) else: timer = user_plus_sys_time() f_calc_reference = xray.structure_factors_simple( structure_5g.unit_cell(), structure_5g.space_group(), miller_set.indices(), structure_5g.scatterers(), structure_5g.scattering_type_registry()).f_calc() print("direct simple: %.2f seconds" % timer.elapsed()) f_calc_reference = flex.abs(f_calc_reference) print("wing_cutoff for following fft calculations: %3.1e" % wing_cutoff_others) for structure in (structure_ng, structure_5g, structure_4g, structure_2g, structure_1g): structure.scattering_type_registry().show_summary() if (not fft_only): for calc_type, cos_sin_flag in (("direct cos+sin function:", False), ("direct cos+sin table:", True)): timer = user_plus_sys_time() f_calc = miller_set.structure_factors_from_scatterers( xray_structure=structure, algorithm="direct", cos_sin_table=cos_sin_flag).f_calc() print(" %-24s %.2f seconds," % (calc_type, timer.elapsed()), end=' ') ls = xray.targets_least_squares_residual( f_calc_reference, f_calc.data(), False, 1) print("r-factor: %.6f" % ls.target()) for calc_type, exp_table_one_over_step_size in (("fft exp function:", 0), ("fft exp table:", -100)): timer = user_plus_sys_time() f_calc = xray.structure_factors.from_scatterers( miller_set=miller_set, wing_cutoff=wing_cutoff_others, exp_table_one_over_step_size=exp_table_one_over_step_size)( xray_structure=structure, miller_set=miller_set, algorithm="fft").f_calc() print(" %-24s %.2f seconds," % (calc_type, timer.elapsed()), end=' ') ls = xray.targets_least_squares_residual(f_calc_reference, f_calc.data(), False, 1) print("r-factor: %.6f" % ls.target()) print()