def compute_target(self, compute_gradients): target_and_grads = self.geometry_restraints.energies_sites( sites_cart = self.xray_structure.sites_cart(), compute_gradients = True) self.f = target_and_grads.target if(compute_gradients): #self.g = target_and_grads.gradients.as_double() self.grads = target_and_grads.gradients # ----------------------------------------------------- # if use_riding hydrogen, modify the gradients if self.use_riding: modify_gradients.modify_gradients( sites_cart = self.xray_structure.sites_cart(), h_parameterization = self.h_parameterization, grads = self.grads) # ----------------------------------------------------- self.g = self.grads.as_double()
def exercise(pdb_str, eps): mon_lib_srv = monomer_library.server.server() ener_lib = monomer_library.server.ener_lib() processed_pdb_file = monomer_library.pdb_interpretation.process( mon_lib_srv = mon_lib_srv, ener_lib = ener_lib, raw_records = pdb_str, force_symmetry = True) pdb_hierarchy = processed_pdb_file.all_chain_proxies.pdb_hierarchy xray_structure = processed_pdb_file.xray_structure() sites_cart = xray_structure.sites_cart() geometry = processed_pdb_file.geometry_restraints_manager( show_energies = False, plain_pairs_radius = 5.0) es = geometry.energies_sites( sites_cart = sites_cart, compute_gradients = True) g_analytical = es.gradients # riding_h_manager = riding.manager( pdb_hierarchy = pdb_hierarchy, geometry_restraints = geometry) h_parameterization = riding_h_manager.h_parameterization riding_h_manager.idealize_hydrogens_inplace( pdb_hierarchy=pdb_hierarchy, xray_structure=xray_structure) #sites_cart = pdb_hierarchy.atoms().extract_xyz() sites_cart = xray_structure.sites_cart() #for i in g_analytical: # print i #print '----------' g_analytical = geometry.energies_sites( sites_cart = sites_cart, compute_gradients = True).gradients modify_gradients.modify_gradients( sites_cart = sites_cart, h_parameterization = h_parameterization, grads = g_analytical) # ex = [eps,0,0] ey = [0,eps,0] ez = [0,0,eps] g_fd = flex.vec3_double() for i_site in xrange(sites_cart.size()): g_fd_i = [] for e in [ex,ey,ez]: ts = [] for sign in [-1,1]: sites_cart_ = sites_cart.deep_copy() xray_structure_ = xray_structure.deep_copy_scatterers() sites_cart_[i_site] = [ sites_cart_[i_site][j]+e[j]*sign for j in xrange(3)] xray_structure_.set_sites_cart(sites_cart_) # after shift, recalculate H position riding_h_manager.idealize_hydrogens_inplace( xray_structure=xray_structure_) sites_cart_ = xray_structure_.sites_cart() ts.append(geometry.energies_sites( sites_cart = sites_cart_, compute_gradients = False).target) g_fd_i.append((ts[1]-ts[0])/(2*eps)) g_fd.append(g_fd_i) for g1, g2 in zip(g_analytical, g_fd): #print g1,g2 assert approx_equal(g1,g2, 1.e-4)