def exercise_mean_square_displacement(options, n_trials): if options.fix_random_seeds: scitbx.random.set_random_seed(0) # check adptbx.mean_square_displacement_difference # against adp_restraints.rigid_bond_pair for i in xrange(n_trials): x1 = matrix.col(site_coord(3)) x2 = matrix.col(site_coord(3)) u1 = matrix.col(as_sym_mat3(symm_mat(u_eigenval(3)))) u2 = matrix.col(as_sym_mat3(symm_mat(u_eigenval(3)))) g = as_sym_mat3(symm_mat(g_eigenval(3))) uc = uctbx.unit_cell(metrical_matrix=g) hirshfeld = adptbx.mean_square_displacement(uc, x1-x2) rigid = adp_restraints.rigid_bond_pair(x1, x2, u1, u2, uc) del uc assert hirshfeld.well_defined h1 = hirshfeld(u1).value h2 = hirshfeld(u2).value assert approx_equal(abs(h1 - h2), rigid.delta_z(), eps=1e-12) # check gradients with finite difference finite_difference_computation = scitbx.math.finite_difference_computation() best_delta = finite_difference_computation.best_delta for i in xrange(n_trials): z = site_coord(3) dz = best_delta(z, site_coord(3)) z = matrix.col(z) dz = matrix.col(dz) u_eigen = u_eigenval(3) du_eigen = best_delta(u_eigen, direction(3)) u = matrix.col(as_sym_mat3(symm_mat(u_eigen))) du = matrix.col(as_sym_mat3(symm_mat(du_eigen))) g_eigen = g_eigenval(3) dg_eigen = best_delta(g_eigen, direction(3)) g = matrix.col(as_sym_mat3(symm_mat(g_eigen))) dg = matrix.col(as_sym_mat3(symm_mat(dg_eigen))) uc = uctbx.unit_cell(metrical_matrix=g) h = adptbx.mean_square_displacement(uc, z)(u) uc_p = uctbx.unit_cell(metrical_matrix=g+dg) h_p = adptbx.mean_square_displacement(uc_p, z+dz)(u+du).value uc_m = uctbx.unit_cell(metrical_matrix=g-dg) h_m = adptbx.mean_square_displacement(uc_m, z-dz)(u-du).value finite_diff = (h_p - h_m)/2 taylor_diff = ( matrix.col(h.grad_u).dot(du) + matrix.col(h.grad_z).dot(dz) + matrix.col(h.grad_g).dot(dg) ) assert approx_equal(taylor_diff, finite_diff, eps=5*finite_difference_computation.precision),\ (taylor_diff, finite_diff)
def exercise_mean_square_displacement(options, n_trials): if options.fix_random_seeds: scitbx.random.set_random_seed(0) # check adptbx.mean_square_displacement_difference # against adp_restraints.rigid_bond_pair for i in range(n_trials): x1 = matrix.col(site_coord(3)) x2 = matrix.col(site_coord(3)) u1 = matrix.col(as_sym_mat3(symm_mat(u_eigenval(3)))) u2 = matrix.col(as_sym_mat3(symm_mat(u_eigenval(3)))) g = as_sym_mat3(symm_mat(g_eigenval(3))) uc = uctbx.unit_cell(metrical_matrix=g) hirshfeld = adptbx.mean_square_displacement(uc, x1 - x2) rigid = adp_restraints.rigid_bond_pair(x1, x2, u1, u2, uc) del uc assert hirshfeld.well_defined h1 = hirshfeld(u1).value h2 = hirshfeld(u2).value assert approx_equal(abs(h1 - h2), rigid.delta_z(), eps=1e-12) # check gradients with finite difference finite_difference_computation = scitbx.math.finite_difference_computation() best_delta = finite_difference_computation.best_delta for i in range(n_trials): z = site_coord(3) dz = best_delta(z, site_coord(3)) z = matrix.col(z) dz = matrix.col(dz) u_eigen = u_eigenval(3) du_eigen = best_delta(u_eigen, direction(3)) u = matrix.col(as_sym_mat3(symm_mat(u_eigen))) du = matrix.col(as_sym_mat3(symm_mat(du_eigen))) g_eigen = g_eigenval(3) dg_eigen = best_delta(g_eigen, direction(3)) g = matrix.col(as_sym_mat3(symm_mat(g_eigen))) dg = matrix.col(as_sym_mat3(symm_mat(dg_eigen))) uc = uctbx.unit_cell(metrical_matrix=g) h = adptbx.mean_square_displacement(uc, z)(u) uc_p = uctbx.unit_cell(metrical_matrix=g + dg) h_p = adptbx.mean_square_displacement(uc_p, z + dz)(u + du).value uc_m = uctbx.unit_cell(metrical_matrix=g - dg) h_m = adptbx.mean_square_displacement(uc_m, z - dz)(u - du).value finite_diff = (h_p - h_m) / 2 taylor_diff = (matrix.col(h.grad_u).dot(du) + matrix.col(h.grad_z).dot(dz) + matrix.col(h.grad_g).dot(dg)) assert approx_equal(taylor_diff, finite_diff, eps=5*finite_difference_computation.precision),\ (taylor_diff, finite_diff)
def exercise_rigid_bond_test(): """ Results compared with THMA11 (Ver. 20-04-91) - TLS Thermal Motion Analysis used as a part of WinGX (WinGX - Crystallographic Program System for Windows) """ ins_file = libtbx.env.find_in_repositories( relative_path="phenix_regression/pdb/enk_11i.res", test=os.path.isfile) if (ins_file is None): print("Skipping exercise_rigid_bond_test(): input file not available") return with open(ins_file) as f: ins_xray_structure = cctbx.xray.structure.from_shelx(file=f) sites_frac = ins_xray_structure.sites_frac() sites_cart = ins_xray_structure.sites_cart() ustars = ins_xray_structure.scatterers().extract_u_star() scatterers = ins_xray_structure.scatterers() j = 0 for site_cart_1,site_frac_1,ustar_1,scat_1 in zip(sites_cart,sites_frac,ustars,scatterers): for site_cart_2,site_frac_2,ustar_2, scat_2 in zip(sites_cart,sites_frac,ustars,scatterers): d = math.sqrt(flex.sum(flex.pow2(flex.double(site_cart_1)-\ flex.double(site_cart_2)))) if(d > 1.1 and d < 1.55): p = adp_restraints.rigid_bond_pair(site_frac_1, site_frac_2, ustar_1, ustar_2, ins_xray_structure.unit_cell()) if(0): print("%4s %4s %7.4f %7.4f %7.4f" % \ (scat_1.label,scat_2.label,p.delta_z(),p.z_12(),p.z_21())) r = result[j] assert r[0] == scat_1.label assert r[1] == scat_2.label assert approx_equal(r[2], p.delta_z(), 1.e-4) assert approx_equal(r[3], p.z_12(), 1.e-4) assert approx_equal(r[4], p.z_21(), 1.e-4) j += 1 assert j == 56
def exercise_rigid_bond_test(): """ Results compared with THMA11 (Ver. 20-04-91) - TLS Thermal Motion Analysis used as a part of WinGX (WinGX - Crystallographic Program System for Windows) """ ins_file = libtbx.env.find_in_repositories( relative_path="phenix_regression/pdb/enk_11i.res", test=os.path.isfile) if (ins_file is None): print "Skipping exercise_rigid_bond_test(): input file not available" return ins_xray_structure = cctbx.xray.structure.from_shelx(file=open(ins_file)) sites_frac = ins_xray_structure.sites_frac() sites_cart = ins_xray_structure.sites_cart() ustars = ins_xray_structure.scatterers().extract_u_star() scatterers = ins_xray_structure.scatterers() j = 0 for site_cart_1,site_frac_1,ustar_1,scat_1 in zip(sites_cart,sites_frac,ustars,scatterers): for site_cart_2,site_frac_2,ustar_2, scat_2 in zip(sites_cart,sites_frac,ustars,scatterers): d = math.sqrt(flex.sum(flex.pow2(flex.double(site_cart_1)-\ flex.double(site_cart_2)))) if(d > 1.1 and d < 1.55): p = adp_restraints.rigid_bond_pair(site_frac_1, site_frac_2, ustar_1, ustar_2, ins_xray_structure.unit_cell()) if(0): print "%4s %4s %7.4f %7.4f %7.4f" % \ (scat_1.label,scat_2.label,p.delta_z(),p.z_12(),p.z_21()) r = result[j] assert r[0] == scat_1.label assert r[1] == scat_2.label assert approx_equal(r[2], p.delta_z(), 1.e-4) assert approx_equal(r[3], p.z_12(), 1.e-4) assert approx_equal(r[4], p.z_21(), 1.e-4) j += 1 assert j == 56
def exercise_rigid_bond(): i_seqs = (1,2) weight = 1 p = adp_restraints.rigid_bond_proxy(i_seqs=i_seqs,weight=weight) assert p.i_seqs == i_seqs assert p.weight == weight sites = ((1,2,3),(2,3,4)) u_cart = ((1,2,3,4,5,6), (3,4,5,6,7,8)) expected_gradients = ((-4, -4, -4, -8, -8, -8), (4, 4, 4, 8, 8, 8)) r = adp_restraints.rigid_bond(sites=sites, u_cart=u_cart, weight=weight) assert r.weight == weight assert approx_equal(r.delta_z(), -6) assert approx_equal(r.residual(), 36) assert approx_equal(r.gradients(), expected_gradients) sites_cart = flex.vec3_double(((1,2,3),(2,5,4),(3,4,5))) u_cart = flex.sym_mat3_double(((1,2,3,4,5,6), (2,3,3,5,7,7), (3,4,5,3,7,8))) r = adp_restraints.rigid_bond( adp_restraint_params(sites_cart=sites_cart, u_cart=u_cart), proxy=p) assert approx_equal(r.weight, weight) unit_cell = uctbx.unit_cell([15,25,30,90,90,90]) sites_frac = unit_cell.fractionalize(sites_cart=sites_cart) u_star = flex.sym_mat3_double([ adptbx.u_cart_as_u_star(unit_cell, u_cart_i) for u_cart_i in u_cart]) pair = adp_restraints.rigid_bond_pair(sites_frac[1], sites_frac[2], u_star[1], u_star[2], unit_cell) assert approx_equal(pair.delta_z(), abs(r.delta_z())) assert approx_equal(pair.z_12(), r.z_12()) assert approx_equal(pair.z_21(), r.z_21()) # gradients_aniso_cart = flex.sym_mat3_double(sites_cart.size(), (0,0,0,0,0,0)) gradients_iso = flex.double(sites_cart.size(), 0) proxies = adp_restraints.shared_rigid_bond_proxy([p,p]) params = adp_restraint_params(sites_cart=sites_cart, u_cart=u_cart) residuals = adp_restraints.rigid_bond_residuals(params, proxies=proxies) assert approx_equal(residuals, (r.residual(),r.residual())) deltas = adp_restraints.rigid_bond_deltas(params, proxies=proxies) assert approx_equal(deltas, (r.delta_z(),r.delta_z())) residual_sum = adp_restraints.rigid_bond_residual_sum( params=params, proxies=proxies, gradients_aniso_cart=gradients_aniso_cart) assert approx_equal(residual_sum, 2 * r.residual()) for g,e in zip(gradients_aniso_cart[1:3], r.gradients()): assert approx_equal(g, matrix.col(e)*2) fd_grads_aniso, fd_grads_iso = finite_difference_gradients( restraint_type=adp_restraints.rigid_bond, proxy=p, sites_cart=sites_cart, u_cart=u_cart) for g,e in zip(gradients_aniso_cart, fd_grads_aniso): assert approx_equal(g, matrix.col(e)*2) # # check frame invariance of residual # u_cart_1 = matrix.sym(sym_mat3=(0.1,0.2,0.05,0.03,0.02,0.01)) u_cart_2 = matrix.sym(sym_mat3=(0.21,0.32,0.11,0.02,0.02,0.07)) u_cart = (u_cart_1.as_sym_mat3(),u_cart_2.as_sym_mat3()) site_cart_1 = matrix.col((1,2,3)) site_cart_2 = matrix.col((3,1,4.2)) sites = (tuple(site_cart_1),tuple(site_cart_2)) a = adp_restraints.rigid_bond(sites=sites, u_cart=u_cart, weight=1) expected_residual = a.residual() gen = flex.mersenne_twister() for i in range(20): R = matrix.rec(gen.random_double_r3_rotation_matrix(),(3,3)) u_cart_1_rot = R * u_cart_1 * R.transpose() u_cart_2_rot = R * u_cart_2 * R.transpose() u_cart = (u_cart_1_rot.as_sym_mat3(),u_cart_2_rot.as_sym_mat3()) site_cart_1_rot = R * site_cart_1 site_cart_2_rot = R * site_cart_2 sites = (tuple(site_cart_1_rot),tuple(site_cart_2_rot)) a = adp_restraints.rigid_bond( sites=sites, u_cart=u_cart, weight=1) assert approx_equal(a.residual(), expected_residual)