def exercise_grad_u_transformations(): uc = uctbx.unit_cell((12.296512479074615, 15.985466222796999, 20.904071214426843, 83.0, 109.0, 129.0)) grad_u_star = ( 1681615.347859645, 1740095.5140965185, 2212142.6517873215, -2802250.0492254314, -1934508.748421974, 1503834.0901063806, ) grad_u_cart = adptbx.grad_u_star_as_u_cart(uc, grad_u_star) assert approx_equal( grad_u_cart, ( 11121.484290152286, 3713.1538936460488, 4293.4422553333607, -332.12536958297818, -340.3709419122527, 406.25522344235526, ), ) assert approx_equal(grad_u_star, adptbx.grad_u_cart_as_u_star(uc, grad_u_cart)) grad_u_star_array = flex.sym_mat3_double([grad_u_star] * 3) grad_u_cart_array = adptbx.grad_u_star_as_u_cart(uc, grad_u_star_array) for g in grad_u_cart_array: assert approx_equal(grad_u_cart, g) grad_u_star_array = adptbx.grad_u_cart_as_u_star(uc, grad_u_cart_array) for g in grad_u_star_array: assert approx_equal(grad_u_star, g)
def exercise_grad_u_transformations(): uc = uctbx.unit_cell((12.296512479074615, 15.985466222796999, 20.904071214426843, 83.0, 109.0, 129.0)) grad_u_star = (1681615.347859645, 1740095.5140965185, 2212142.6517873215, -2802250.0492254314, -1934508.748421974, 1503834.0901063806) grad_u_cart = adptbx.grad_u_star_as_u_cart(uc, grad_u_star) assert approx_equal( grad_u_cart, (11121.484290152286, 3713.1538936460488, 4293.4422553333607, -332.12536958297818, -340.3709419122527, 406.25522344235526)) assert approx_equal(grad_u_star, adptbx.grad_u_cart_as_u_star(uc, grad_u_cart)) grad_u_star_array = flex.sym_mat3_double([grad_u_star] * 3) grad_u_cart_array = adptbx.grad_u_star_as_u_cart(uc, grad_u_star_array) for g in grad_u_cart_array: assert approx_equal(grad_u_cart, g) grad_u_star_array = adptbx.grad_u_cart_as_u_star(uc, grad_u_cart_array) for g in grad_u_star_array: assert approx_equal(grad_u_star, g)
def __init__(self, xray_structure, restraints_manager, use_hd, selection=None): # Pairwise ADP restraints: 3 mix cases supported: # o - () # o - o # () - () # In SHELX this called SIMU restraints unit_cell = xray_structure.unit_cell() n_grad_u_iso = xray_structure.n_grad_u_iso() u_cart = xray_structure.scatterers().extract_u_cart(unit_cell) u_iso = xray_structure.scatterers().extract_u_iso() scatterers = xray_structure.scatterers() sites_cart = xray_structure.sites_cart() if (selection is not None): sites_cart = sites_cart.select(selection) bond_proxies_simple = restraints_manager.pair_proxies( sites_cart=sites_cart).bond_proxies.simple if (selection is None): selection = flex.bool(scatterers.size(), True) hd_selection = xray_structure.hd_selection() result = eval_adp_aniso_restraints(scatterers=scatterers, u_cart=u_cart, u_iso=u_iso, bond_proxies=bond_proxies_simple, selection=selection, hd_selection=hd_selection, n_grad_u_iso=n_grad_u_iso, use_hd=use_hd) self.target = result.target self.number_of_restraints = result.number_of_restraints if (n_grad_u_iso == 0): self.gradients_iso = None else: self.gradients_iso = result.gradients_iso() self.gradients_aniso_cart = result.gradients_aniso_cart() self.gradients_aniso_star = adptbx.grad_u_cart_as_u_star( unit_cell, self.gradients_aniso_cart)
def __init__(self, xray_structure, restraints_manager, use_hd, selection = None): # Pairwise ADP restraints: 3 mix cases supported: # o - () # o - o # () - () # In SHELX this called SIMU restraints unit_cell = xray_structure.unit_cell() n_grad_u_iso = xray_structure.n_grad_u_iso() u_cart = xray_structure.scatterers().extract_u_cart(unit_cell) u_iso = xray_structure.scatterers().extract_u_iso() scatterers = xray_structure.scatterers() sites_cart = xray_structure.sites_cart() if(selection is not None): sites_cart = sites_cart.select(selection) bond_proxies_simple = restraints_manager.pair_proxies(sites_cart = sites_cart).bond_proxies.simple if(selection is None): selection = flex.bool(scatterers.size(), True) hd_selection = xray_structure.hd_selection() result = eval_adp_aniso_restraints( scatterers=scatterers, u_cart=u_cart, u_iso=u_iso, bond_proxies=bond_proxies_simple, selection=selection, hd_selection=hd_selection, n_grad_u_iso=n_grad_u_iso, use_hd=use_hd) self.target = result.target self.number_of_restraints = result.number_of_restraints if (n_grad_u_iso == 0) : self.gradients_iso = None else : self.gradients_iso = result.gradients_iso() self.gradients_aniso_cart = result.gradients_aniso_cart() self.gradients_aniso_star = adptbx.grad_u_cart_as_u_star(unit_cell, self.gradients_aniso_cart)
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 d_target_d_u_star(self): if (self.d_target_d_u_star_was_used): raise RuntimeError(expensive_function_call_message) self.d_target_d_u_star_was_used = True return adptbx.grad_u_cart_as_u_star(self.xray_structure().unit_cell(), self.d_target_d_u_cart())
def d_target_d_u_star(self): if (self.d_target_d_u_star_was_used): raise RuntimeError(expensive_function_call_message) self.d_target_d_u_star_was_used = True return adptbx.grad_u_cart_as_u_star( self.xray_structure().unit_cell(), self.d_target_d_u_cart())
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()