def get_tardy_model_no_density(): tardy_tree = scitbx.graph.tardy_tree.construct( n_vertices=len(sites), edge_list=[]) tardy_tree.build_tree() potential_obj = potential_object( density_map=None, geo_manager=geo_manager, reduced_geo_manager=None, prolsq_repulsion_function_changes= params.prolsq_repulsion_function_changes, real_space_gradients_delta=None, real_space_target_weight=None, ideal_sites_cart=None) return scitbx.rigid_body.tardy_model( labels=labels, sites=sites, masses=masses, tardy_tree=tardy_tree, potential_obj=potential_obj)
def run_test(params, pdb_files, other_files, callback=None, log=None): if (log is None): log = sys.stdout if (params.random_seed is not None): random.seed(params.random_seed) flex.set_random_seed(value=params.random_seed) # if (len(pdb_files) != 0): print >> log, "PDB files:" for file_name in pdb_files: print >> log, " ", file_name print >> log if (len(other_files) != 0): print >> log, "Other files:" for file_name in other_files: print >> log, " ", file_name print >> log # assert len(pdb_files) in [1, 2] # pdb_interpretation_params = pdb_interpretation.master_params.extract() pdb_interpretation_params.dihedral_function_type \ = params.dihedral_function_type processed_pdb_files = pdb_interpretation.run( args=pdb_files[-1:]+other_files, params=pdb_interpretation_params, strict_conflict_handling=False, substitute_non_crystallographic_unit_cell_if_necessary=True, return_all_processed_pdb_files=True, log=log) assert len(processed_pdb_files) == 1 print >> log # xs = processed_pdb_files[0].xray_structure() geo_manager = processed_pdb_files[0].geometry_restraints_manager() labels = [sc.label for sc in xs.scatterers()] ideal_sites_cart = xs.sites_cart() sites = ideal_sites_cart masses = xs.atomic_weights() tardy_tree_simple_connectivity = geo_manager.construct_tardy_tree(sites=sites) rmsd_calculator = tardy_tree_simple_connectivity.rmsd_calculator() # if (params.tardy_displacements is not None): def get_tardy_model_no_potential(): return scitbx.rigid_body.tardy_model( labels=labels, sites=sites, masses=masses, tardy_tree=tardy_tree_simple_connectivity, potential_obj=None) def get_tardy_model_no_density(): tardy_tree = scitbx.graph.tardy_tree.construct( n_vertices=len(sites), edge_list=[]) tardy_tree.build_tree() potential_obj = potential_object( density_map=None, geo_manager=geo_manager, reduced_geo_manager=None, prolsq_repulsion_function_changes= params.prolsq_repulsion_function_changes, real_space_gradients_delta=None, real_space_target_weight=None, ideal_sites_cart=None) return scitbx.rigid_body.tardy_model( labels=labels, sites=sites, masses=masses, tardy_tree=tardy_tree, potential_obj=potential_obj) if (params.tardy_displacements is Auto): auto_params = params.tardy_displacements_auto target_rmsd = \ params.structure_factors_high_resolution \ * auto_params.rmsd_vs_high_resolution_factor target_rmsd_tol = \ params.structure_factors_high_resolution \ * auto_params.rmsd_tolerance assert target_rmsd > 0 assert target_rmsd_tol > 0 print >> log, "Random displacements (%s):" \ % params.tardy_displacements_auto.parameterization print >> log, " high resolution: %.6g" \ % params.structure_factors_high_resolution print >> log, " target rmsd: %.6g" % target_rmsd print >> log, " target rmsd tolerance: %.6g" % target_rmsd_tol log.flush() def raise_max_steps_exceeded(var_name, rmsd_history): msg = [ "tardy_displacements_auto.max_steps exceeded:", " % -13s rmsd" % var_name] for var_rmsd in rmsd_history: msg.append(" %13.6e %13.6e" % var_rmsd) raise Sorry("\n".join(msg)) if (params.tardy_displacements_auto.parameterization == "cartesian"): multiplier = 1.5 rmsd_history = [] for i_step in xrange(auto_params.max_steps): sites = cartesian_random_displacements( sites_cart=ideal_sites_cart, target_rmsd=target_rmsd*multiplier) tardy_model = get_tardy_model_no_density() tardy_model.minimization(max_iterations=20) sites = tardy_model.sites_moved() sites_moved = sites rmsd = rmsd_calculator(sites_moved, ideal_sites_cart) rmsd_history.append((multiplier, rmsd)) print >> log, " multiplier, rmsd: %13.6e, %13.6e" \ % rmsd_history[-1] log.flush() if (rmsd < target_rmsd - target_rmsd_tol): if (rmsd != 0): multiplier = min( multiplier*2, max( multiplier*1.2, target_rmsd / rmsd)) else: multiplier *= 2 else: if (rmsd <= target_rmsd + target_rmsd_tol): tardy_model.minimization(max_iterations=500) sites = tardy_model.sites_moved() sites_moved = sites rmsd = rmsd_calculator(sites_moved, ideal_sites_cart) rmsd_history.append((0, rmsd)) print >> log, " multiplier, rmsd: %13.6e, %13.6e" \ % rmsd_history[-1] log.flush() break multiplier *= max(0.5, target_rmsd/rmsd) else: raise_max_steps_exceeded( var_name="multiplier", rmsd_history=rmsd_history) del rmsd_history print >> log, " actual rmsd: %.6g" % rmsd print >> log elif (params.tardy_displacements_auto.parameterization == "constrained"): tardy_model = get_tardy_model_no_potential() tardy_model.assign_random_velocities() delta_t = auto_params.first_delta_t rmsd_history = [] assert auto_params.max_steps > 0 for i_step in xrange(auto_params.max_steps): prev_q = tardy_model.pack_q() prev_qd = tardy_model.pack_qd() tardy_model.dynamics_step(delta_t=delta_t) sites_moved = tardy_model.sites_moved() rmsd = rmsd_calculator(sites_moved, ideal_sites_cart) rmsd_history.append((delta_t, rmsd)) if (rmsd < target_rmsd - target_rmsd_tol): delta_t *= 2 - rmsd / target_rmsd else: if (rmsd <= target_rmsd + target_rmsd_tol): break tardy_model.unpack_q(q_packed=prev_q) tardy_model.unpack_qd(qd_packed=prev_qd) delta_t *= 0.5 prev_q = None prev_qd = None else: raise_max_steps_exceeded( var_name="delta_t", rmsd_history=rmsd_history) del rmsd_history print >> log, " actual rmsd: %.6g" % rmsd print >> log, " tardy_displacements=%s" % ",".join( ["%.6g" % v for v in tardy_model.pack_q()]) print >> log sites = tardy_model.sites_moved() else: raise AssertionError else: tardy_model = get_tardy_model_no_potential() q = tardy_model.pack_q() if (len(params.tardy_displacements) != len(q)): print >> log, "tardy_displacements:", params.tardy_displacements hinge_edges = tardy_model.tardy_tree.cluster_manager.hinge_edges assert len(hinge_edges) == tardy_model.bodies_size() dofej = tardy_model.degrees_of_freedom_each_joint() qsej = tardy_model.q_size_each_joint() for ib,(i,j) in enumerate(hinge_edges): if (i == -1): si = "root" else: si = tardy_model.labels[i] sj = tardy_model.labels[j] print >> log, "%21s - %-21s: %d dof, %d q_size" % ( si, sj, dofej[ib], qsej[ib]) print >> log, "Zero displacements:" print >> log, " tardy_displacements=%s" % ",".join( [str(v) for v in q]) raise Sorry("Incompatible tardy_displacements.") tardy_model.unpack_q(q_packed=flex.double(params.tardy_displacements)) sites = tardy_model.sites_moved() # if (params.emulate_cartesian): tardy_tree = scitbx.graph.tardy_tree.construct( n_vertices=len(sites), edge_list=[]) tardy_tree.build_tree() else: tardy_tree = tardy_tree_simple_connectivity print >> log, "tardy_tree summary:" tardy_tree.show_summary(vertex_labels=labels, out=log, prefix=" ") print >> log # if (len(pdb_files) == 2): ideal_pdb_inp = iotbx.pdb.input(file_name=pdb_files[0]) ideal_pdb_hierarchy = ideal_pdb_inp.construct_hierarchy() assert ideal_pdb_hierarchy.is_similar_hierarchy( processed_pdb_files[0].all_chain_proxies.pdb_hierarchy) ideal_sites_cart = ideal_pdb_hierarchy.atoms().extract_xyz() xs.set_sites_cart(sites_cart=ideal_sites_cart) fft_map = xs.structure_factors( d_min=params.structure_factors_high_resolution).f_calc().fft_map() fft_map.apply_sigma_scaling() # assert not params.orca_experiments or not params.emulate_cartesian if (params.orca_experiments): from mmtbx.refinement import orca x = orca.expand( labels=labels, sites_cart=sites, masses=masses, geo_manager=geo_manager) labels = x.labels sites = x.sites_cart masses = x.masses geo_manager = x.geo_manager tardy_tree = x.tardy_tree x_ideal_sites_cart = flex.vec3_double() for i_orc,i_seq in x.indices: x_ideal_sites_cart.append(ideal_sites_cart[i_seq]) ideal_sites_cart = x_ideal_sites_cart rmsd_calculator = x.rmsd_calculator( tardy_tree_rmsd_calculator=rmsd_calculator) # if (params.emulate_cartesian or params.keep_all_restraints): reduced_geo_manager = None else: reduced_geo_manager = geo_manager.reduce_for_tardy(tardy_tree=tardy_tree) real_space_gradients_delta = \ params.structure_factors_high_resolution \ * params.real_space_gradients_delta_resolution_factor potential_obj = potential_object( density_map=fft_map.real_map(), geo_manager=geo_manager, reduced_geo_manager=reduced_geo_manager, prolsq_repulsion_function_changes=params.prolsq_repulsion_function_changes, real_space_gradients_delta=real_space_gradients_delta, real_space_target_weight=params.real_space_target_weight, ideal_sites_cart=ideal_sites_cart, site_labels=labels, orca_experiments=params.orca_experiments) tardy_model = scitbx.rigid_body.tardy_model( labels=labels, sites=sites, masses=masses, tardy_tree=tardy_tree, potential_obj=potential_obj) mmtbx.refinement.tardy.action( tardy_model=tardy_model, params=params, rmsd_calculator=rmsd_calculator, callback=callback, log=log) print >> log