def _create_hbond_angles_proxies( N_atom, O_atom, prev_atoms, angle_restraint_type=0, # 0-No restraint, 1-outside, 2-inside, 3-beta ): result = [] if angle_restraint_type == 0: return result # print "Making angles for bond:", N_atom.id_str(), "---", O_atom.id_str() # print "prev_atoms:" # for a in prev_atoms: # print " ", a.id_str() C_atoms = [] CA_atoms = [] C_1_atoms = [] # print " C_atoms:", for atom in O_atom.parent().atoms(): if atom.name == " C " and _ac_match(O_atom, atom): C_atoms.append(atom) # print " ",atom.id_str() # print " CA_atoms:", for atom in N_atom.parent().atoms(): if atom.name == " CA " and _ac_match(N_atom, atom): CA_atoms.append(atom) # print " ",atom.id_str() # print " C_1_atoms:", for atom in prev_atoms: if atom.name == " C " and _ac_match(N_atom, atom): C_1_atoms.append(atom) # print " ",atom.id_str() # building angle restraints for C_atom in C_atoms: p = geometry_restraints.angle_proxy( i_seqs=[C_atom.i_seq, O_atom.i_seq, N_atom.i_seq], angle_ideal=angle_restraints_values[angle_restraint_type - 1]["C"][0], weight=1. / angle_restraints_values[angle_restraint_type - 1]["C"][1]**2, origin_id=origin_ids.get_origin_id('hydrogen bonds')) result.append(p) for CA_atom in CA_atoms: p = geometry_restraints.angle_proxy( i_seqs=[CA_atom.i_seq, N_atom.i_seq, O_atom.i_seq], angle_ideal=angle_restraints_values[angle_restraint_type - 1]["CA"][0], weight=1. / angle_restraints_values[angle_restraint_type - 1]["CA"][1]**2, origin_id=origin_ids.get_origin_id('hydrogen bonds')) result.append(p) for C_1_atom in C_1_atoms: p = geometry_restraints.angle_proxy( i_seqs=[C_1_atom.i_seq, N_atom.i_seq, O_atom.i_seq], angle_ideal=angle_restraints_values[angle_restraint_type - 1]["C-1"][0], weight=1. / angle_restraints_values[angle_restraint_type - 1]["C-1"][1]**2, origin_id=origin_ids.get_origin_id('hydrogen bonds')) result.append(p) return result
def _add_angle(i_seqs, geometry_proxy_registries, value, esd, origin_id): proxy = geometry_restraints.angle_proxy( i_seqs=i_seqs, angle_ideal=value, weight=1/esd**2, origin_id=origin_id) geometry_proxy_registries.angle.add_if_not_duplicated(proxy=proxy)
def get_angle_proxies_for_bond(coordination): # # works for SF4 # does not work for F3S # angles = [] if coordination is None: return angles for a1, a2 in coordination: assert a1.name.find("FE") > -1 if a1.parent().resname in ['F3S']: break assert a1.parent().resname in ['SF4'] ii = int(a1.name.strip()[-1]) for i in range(1, 5): if i == ii: continue name = 'S%d' % i a3 = a1.parent().get_atom(name) angle_ideal = sf4_coordination[('S', 'FE', 'S')][0] weight = sf4_coordination[('S', 'FE', 'S')][1] p = geometry_restraints.angle_proxy( i_seqs=[a3.i_seq, a1.i_seq, a2.i_seq], angle_ideal=angle_ideal, weight=1. / weight**2, origin_id=origin_ids.get_origin_id('metal coordination')) angles.append(p) return angles
def get_proxies(coordination): # # TODO # - check that only one link is made to each resiude # e.g. 1a6y "2080 ZN ZN B 451 .*." "1874 CB CYS B 153 .*." # def _bond_generator(atoms): for atom in atoms['others']: yield atoms['metal'], atom def _angle_generator(atoms): for i, a1 in enumerate(atoms['others']): for j, a2 in enumerate(atoms['others']): if i == j: break yield a1, atoms['metal'], a2 bonds = [] angles = [] if coordination is None: return bonds, angles atoms = None for metal_i_seq, atoms in coordination.items(): if len(atoms['others']) < 4: continue cyss = [] hiss = [] for atom in atoms['others']: if atom.parent().resname == 'CYS': cyss.append(atom) elif atom.parent().resname == 'HIS': hiss.append(atom) key = (len(cyss), len(hiss)) metal_name = atoms['metal'].name.strip() ideals = database[metal_name][key] if not atoms: continue #return None, None for a1, a2 in _bond_generator(atoms): key = (a1.name.strip(), a2.name.strip()) if key not in ideals: continue t = ideals[key] p = geometry_restraints.bond_simple_proxy( i_seqs=[a1.i_seq, a2.i_seq], distance_ideal=t[0], weight=1.0 / t[1]**2, slack=0, top_out=False, limit=1, origin_id=origin_ids.get_origin_id('metal coordination')) bonds.append(p) for a1, a2, a3 in _angle_generator(atoms): key = (a1.name.strip(), a2.name.strip(), a3.name.strip()) if key not in ideals: continue t = ideals[key] p = geometry_restraints.angle_proxy( i_seqs=[a1.i_seq, a2.i_seq, a3.i_seq], angle_ideal=t[0], weight=1.0 / t[1]**2, origin_id=origin_ids.get_origin_id('metal coordination')) angles.append(p) return bonds, angles
def run(args): assert len(args) == 0 # r = geometry_restraints.angle_proxy_registry( strict_conflict_handling=True) r.initialize_table() r.process( source_info=source_info_server(), proxy=geometry_restraints.angle_proxy( i_seqs=(4,2,7), angle_ideal=0, weight=1)) r.process( source_info=source_info_server(), proxy=geometry_restraints.angle_proxy( i_seqs=(5,2,3), angle_ideal=0, weight=1)) assert r.lookup_i_proxy((4,2,7)) == 0 assert r.lookup_i_proxy((7,2,4)) == 0 assert r.lookup_i_proxy((2,7,4)) is None assert r.lookup_i_proxy((3,2,5)) == 1 assert r.lookup_i_proxy((5,2,3)) == 1 assert r.lookup_i_proxy((5,3,2)) is None # r = geometry_restraints.dihedral_proxy_registry( strict_conflict_handling=True) r.initialize_table() r.process( source_info=source_info_server(), proxy=geometry_restraints.dihedral_proxy( i_seqs=(4,7,2,3), angle_ideal=0, weight=1)) r.process( source_info=source_info_server(), proxy=geometry_restraints.dihedral_proxy( i_seqs=(8,2,3,5), angle_ideal=0, weight=1)) r.process( source_info=source_info_server(), proxy=geometry_restraints.dihedral_proxy( i_seqs=(6,3,1,9), angle_ideal=0, weight=1)) assert r.lookup_i_proxy((3,2,7,4)) == (0, 1) assert r.lookup_i_proxy((4,2,7,3)) == (0, -1) assert r.lookup_i_proxy((4,7,2,3)) == (0, 1) assert r.lookup_i_proxy((3,7,2,4)) == (0, -1) assert r.lookup_i_proxy((5,2,3,8)) == (1, 1) assert r.lookup_i_proxy((6,3,1,9)) == (2, -1) # print "OK"
def run(args): assert len(args) == 0 # r = geometry_restraints.angle_proxy_registry(strict_conflict_handling=True) r.initialize_table() r.process(source_info=source_info_server(), proxy=geometry_restraints.angle_proxy(i_seqs=(4, 2, 7), angle_ideal=0, weight=1)) r.process(source_info=source_info_server(), proxy=geometry_restraints.angle_proxy(i_seqs=(5, 2, 3), angle_ideal=0, weight=1)) assert r.lookup_i_proxy((4, 2, 7)) == 0 assert r.lookup_i_proxy((7, 2, 4)) == 0 assert r.lookup_i_proxy((2, 7, 4)) is None assert r.lookup_i_proxy((3, 2, 5)) == 1 assert r.lookup_i_proxy((5, 2, 3)) == 1 assert r.lookup_i_proxy((5, 3, 2)) is None # r = geometry_restraints.dihedral_proxy_registry( strict_conflict_handling=True) r.initialize_table() r.process(source_info=source_info_server(), proxy=geometry_restraints.dihedral_proxy(i_seqs=(4, 7, 2, 3), angle_ideal=0, weight=1)) r.process(source_info=source_info_server(), proxy=geometry_restraints.dihedral_proxy(i_seqs=(8, 2, 3, 5), angle_ideal=0, weight=1)) r.process(source_info=source_info_server(), proxy=geometry_restraints.dihedral_proxy(i_seqs=(6, 3, 1, 9), angle_ideal=0, weight=1)) assert r.lookup_i_proxy((3, 2, 7, 4)) == (0, 1) assert r.lookup_i_proxy((4, 2, 7, 3)) == (0, -1) assert r.lookup_i_proxy((4, 7, 2, 3)) == (0, 1) assert r.lookup_i_proxy((3, 7, 2, 4)) == (0, -1) assert r.lookup_i_proxy((5, 2, 3, 8)) == (1, 1) assert r.lookup_i_proxy((6, 3, 1, 9)) == (2, -1) # print("OK")
def get_angle_proxies_for_bond(atoms): angle_values = { 'O6 N4': [(122.8, 3.00), (117.3, 2.86)], 'N4 O6': [(117.3, 2.86), (122.8, 3.00)], 'N2 O2': [(122.2, 2.88), (120.7, 2.20)], 'O2 N2': [(120.7, 2.20), (122.2, 2.88)], 'N6 O4': [(115.6, 8.34), (121.2, 4.22)], 'O4 N6': [(121.2, 4.22), (115.6, 8.34)] } proxies = [] anames = [atoms[0].name.strip(), atoms[1].name.strip()] rnames = [atoms[0].id_str().split()[1], atoms[1].id_str().split()[1]] if sorted(anames) == ['N1', 'N3']: if get_one_letter_rna_dna_name(rnames[0]) in ['G', 'C']: if anames[0] == 'N1': vals = [(119.1, 2.59), (116.3, 2.66)] else: vals = [(116.3, 2.66), (119.1, 2.59)] else: if anames[0] == 'N1': vals = [(116.2, 3.46), (115.8, 2.88)] else: vals = [(115.8, 2.88), (116.2, 3.46)] else: key = "%s %s" % (anames[0], anames[1]) vals = angle_values.get(key, None) if vals is not None: for i in range(2): atoms_for_angle = [None, None, None] aname = anames[i] if (aname == 'N1' or aname == 'N2' or aname == 'N3' or aname == 'O2'): atoms_for_angle[0] = atoms[i].parent().get_atom('C2') elif (aname == 'N4' or aname == 'O4'): atoms_for_angle[0] = atoms[i].parent().get_atom('C4') elif (aname == 'N6' or aname == 'O6'): atoms_for_angle[0] = atoms[i].parent().get_atom('C6') if atoms_for_angle[0] is not None: atoms_for_angle[1] = atoms[i] atoms_for_angle[2] = atoms[1 - i] if atoms_for_angle.count(None) == 0: i_seqs_for_angle = [x.i_seq for x in atoms_for_angle] p = geometry_restraints.angle_proxy( i_seqs=i_seqs_for_angle, angle_ideal=vals[i][0], weight=1. / vals[i][1]**2, origin_id=origin_ids.get_origin_id('hydrogen bonds')) proxies.append(p) return proxies
def get_angle_proxies_for_bond(atoms): angle_values = {'O6 N4': [(122.8, 3.00), (117.3, 2.86)], 'N4 O6': [(117.3, 2.86), (122.8, 3.00)], 'N2 O2': [(122.2, 2.88), (120.7, 2.20)], 'O2 N2': [(120.7, 2.20), (122.2, 2.88)], 'N6 O4': [(115.6, 8.34), (121.2, 4.22)], 'O4 N6': [(121.2, 4.22), (115.6, 8.34)]} proxies = [] anames = [atoms[0].name.strip(), atoms[1].name.strip()] rnames = [atoms[0].id_str().split()[1], atoms[1].id_str().split()[1]] if sorted(anames) == ['N1', 'N3']: if get_one_letter_rna_dna_name(rnames[0]) in ['G', 'C']: if anames[0] == 'N1': vals = [(119.1, 2.59), (116.3, 2.66)] else: vals = [(116.3, 2.66), (119.1, 2.59)] else: if anames[0] == 'N1': vals = [(116.2, 3.46), (115.8, 2.88)] else: vals = [(115.8, 2.88), (116.2, 3.46)] else: key = "%s %s" % (anames[0], anames[1]) vals = angle_values.get(key, None) if vals is not None: for i in range(2): atoms_for_angle = [None, None, None] aname = anames[i] if (aname == 'N1' or aname == 'N2' or aname == 'N3' or aname == 'O2'): atoms_for_angle[0] = atoms[i].parent().get_atom('C2') elif (aname == 'N4' or aname == 'O4'): atoms_for_angle[0] = atoms[i].parent().get_atom('C4') elif (aname == 'N6' or aname == 'O6'): atoms_for_angle[0] = atoms[i].parent().get_atom('C6') if atoms_for_angle[0] is not None: atoms_for_angle[1] = atoms[i] atoms_for_angle[2] = atoms[1-i] if atoms_for_angle.count(None) == 0: i_seqs_for_angle = [x.i_seq for x in atoms_for_angle] p = geometry_restraints.angle_proxy( i_seqs=i_seqs_for_angle, angle_ideal=vals[i][0], weight=1./vals[i][1]**2, origin_id=1) proxies.append(p) return proxies
def get_angle_proxies_for_bond(coordination): # def _get_angle_atoms(a1, a2, resname, second_residues): atoms = [] ii = int(a1.name.strip()[-1]) if resname == 'F3S': for i in range(1, 5): if i == f3s_naming.get(ii, -1): continue name = 'S%d' % i a3 = a1.parent().get_atom(name) if a3: atoms.append(a3) else: # SF4 has a special naming scheme for i in range(1, 5): if i == ii: continue name = 'S%d' % i a3 = a1.parent().get_atom(name) if a3: atoms.append(a3) if resname in ['FES']: for ag in second_residues: if ag.id_str() == a2.parent().id_str(): continue for name in ['SG']: sg = ag.get_atom(name) if sg and sg.distance(a1) < 3.5: atoms.append(sg) return atoms # angles = [] if coordination is None: return angles second_residues = [] for a1, a2 in coordination: second_residues.append(a2.parent()) for a1, a2 in coordination: assert a1.name.find("FE") > -1 resname = get_cluster_name(a1, a2) if resname in sf_clusters: atoms = _get_angle_atoms(a1, a2, resname, second_residues) for a3 in atoms: angle_ideal, weight = get_angle_ideal_and_weight(a3, a1, a2) if angle_ideal is None: continue p = geometry_restraints.angle_proxy( i_seqs=[a3.i_seq, a1.i_seq, a2.i_seq], angle_ideal=angle_ideal, weight=weight, origin_id=origin_ids.get_origin_id('metal coordination')) angles.append(p) return angles
def exercise(verbose=0): distance_ideal = 1.8 default_vdw_distance = 3.6 vdw_1_4_factor = 3.5 / 3.6 sites_cart_manual = flex.vec3_double([(1, 3, 0), (2, 3, 0), (3, 2, 0), (3, 1, 0), (4, 1, 0), (3, 4, 0), (4, 3, 0), (5, 3, 0), (6, 2, 0), (7, 2, 0), (8, 3, 0), (7, 4, 0), (6, 4, 0), (7, 5, 0), (6, 6, 0), (8, 6, 0)]) bond_proxies = geometry_restraints.bond_sorted_asu_proxies( asu_mappings=None) for i_seqs in [(0, 1), (1, 2), (2, 3), (3, 4), (1, 5), (2, 6), (5, 6), (6, 7), (7, 8), (8, 9), (9, 10), (10, 11), (11, 12), (12, 7), (11, 13), (13, 14), (14, 15), (15, 13)]: bond_proxies.process( geometry_restraints.bond_simple_proxy( i_seqs=i_seqs, distance_ideal=distance_ideal, weight=100)) angle_proxies = geometry_restraints.shared_angle_proxy() for i_seqs, angle_ideal in [[(0, 1, 2), 135], [(0, 1, 5), 135], [(1, 2, 3), 135], [(3, 2, 6), 135], [(2, 3, 4), 120], [(1, 2, 6), 90], [(2, 6, 5), 90], [(6, 5, 1), 90], [(5, 1, 2), 90], [(2, 6, 7), 135], [(5, 6, 7), 135], [(6, 7, 8), 120], [(6, 7, 12), 120], [(7, 8, 9), 120], [(8, 9, 10), 120], [(9, 10, 11), 120], [(10, 11, 12), 120], [(11, 12, 7), 120], [(12, 7, 8), 120], [(10, 11, 13), 120], [(12, 11, 13), 120], [(11, 13, 15), 150], [(11, 13, 14), 150], [(13, 15, 14), 60], [(15, 14, 13), 60], [(14, 13, 15), 60]]: angle_proxies.append( geometry_restraints.angle_proxy(i_seqs=i_seqs, angle_ideal=angle_ideal, weight=1)) if (0 or verbose): dump_pdb(file_name="manual.pdb", sites_cart=sites_cart_manual) for traditional_convergence_test in [True, False]: for sites_cart_selection in [True, False]: sites_cart = sites_cart_manual.deep_copy() if sites_cart_selection: sites_cart_selection = flex.bool(sites_cart.size(), True) sites_cart_selection[1] = False assert bond_proxies.asu.size() == 0 bond_params_table = geometry_restraints.extract_bond_params( n_seq=sites_cart.size(), bond_simple_proxies=bond_proxies.simple) manager = geometry_restraints.manager.manager( bond_params_table=bond_params_table, angle_proxies=angle_proxies) minimized = geometry_restraints.lbfgs.lbfgs( sites_cart=sites_cart, geometry_restraints_manager=manager, lbfgs_termination_params=scitbx.lbfgs.termination_parameters( traditional_convergence_test=traditional_convergence_test, drop_convergence_test_max_drop_eps=1.e-20, drop_convergence_test_iteration_coefficient=1, max_iterations=1000), sites_cart_selection=sites_cart_selection, ) assert minimized.minimizer.iter() > 100 sites_cart_minimized_1 = sites_cart.deep_copy() if (0 or verbose): dump_pdb(file_name="minimized_1.pdb", sites_cart=sites_cart_minimized_1) bond_deltas = geometry_restraints.bond_deltas( sites_cart=sites_cart_minimized_1, proxies=bond_proxies.simple) angle_deltas = geometry_restraints.angle_deltas( sites_cart=sites_cart_minimized_1, proxies=angle_proxies) if (0 or verbose): for proxy, delta in zip(bond_proxies.simple, bond_deltas): print "bond:", proxy.i_seqs, delta for proxy, delta in zip(angle_proxies, angle_deltas): print "angle:", proxy.i_seqs, delta assert is_below_limit(value=flex.max(flex.abs(bond_deltas)), limit=0, eps=1.e-6) assert is_below_limit(value=flex.max(flex.abs(angle_deltas)), limit=0, eps=2.e-6) sites_cart += matrix.col((1, 1, 0)) - matrix.col(sites_cart.min()) unit_cell_lengths = list( matrix.col(sites_cart.max()) + matrix.col((1, -1.2, 4))) unit_cell_lengths[1] *= 2 unit_cell_lengths[2] *= 2 xray_structure = xray.structure(crystal_symmetry=crystal.symmetry( unit_cell=unit_cell_lengths, space_group_symbol="P112")) for serial, site in zip(count(1), sites_cart): xray_structure.add_scatterer( xray.scatterer( label="C%02d" % serial, site=xray_structure.unit_cell().fractionalize(site))) if (0 or verbose): xray_structure.show_summary().show_scatterers() p1_structure = (xray_structure.apply_shift( (-.5, -.5, 0)).expand_to_p1().apply_shift((.5, .5, 0))) for shift in [(1, 0, 0), (0, 1, 0), (0, 0, 1)]: p1_structure.add_scatterers( p1_structure.apply_shift(shift).scatterers()) if (0 or verbose): open("p1_structure.pdb", "w").write(p1_structure.as_pdb_file()) nonbonded_cutoff = 6.5 asu_mappings = xray_structure.asu_mappings( buffer_thickness=nonbonded_cutoff) bond_asu_table = crystal.pair_asu_table(asu_mappings=asu_mappings) geometry_restraints.add_pairs(bond_asu_table, bond_proxies.simple) shell_asu_tables = crystal.coordination_sequences.shell_asu_tables( pair_asu_table=bond_asu_table, max_shell=3) shell_sym_tables = [ shell_asu_table.extract_pair_sym_table() for shell_asu_table in shell_asu_tables ] bond_params_table = geometry_restraints.extract_bond_params( n_seq=sites_cart.size(), bond_simple_proxies=bond_proxies.simple) atom_energy_types = flex.std_string(sites_cart.size(), "Default") nonbonded_params = geometry_restraints.nonbonded_params( factor_1_4_interactions=vdw_1_4_factor, const_shrink_1_4_interactions=0, default_distance=default_vdw_distance) nonbonded_params.distance_table.setdefault( "Default")["Default"] = default_vdw_distance pair_proxies = geometry_restraints.pair_proxies( bond_params_table=bond_params_table, shell_asu_tables=shell_asu_tables, model_indices=None, conformer_indices=None, nonbonded_params=nonbonded_params, nonbonded_types=atom_energy_types, nonbonded_distance_cutoff_plus_buffer=nonbonded_cutoff) if (0 or verbose): print "pair_proxies.bond_proxies.n_total():", \ pair_proxies.bond_proxies.n_total(), print "simple:", pair_proxies.bond_proxies.simple.size(), print "sym:", pair_proxies.bond_proxies.asu.size() print "pair_proxies.nonbonded_proxies.n_total():", \ pair_proxies.nonbonded_proxies.n_total(), print "simple:", pair_proxies.nonbonded_proxies.simple.size(), print "sym:", pair_proxies.nonbonded_proxies.asu.size() print "min_distance_nonbonded: %.2f" % flex.min( geometry_restraints.nonbonded_deltas( sites_cart=sites_cart, sorted_asu_proxies=pair_proxies.nonbonded_proxies)) s = StringIO() pair_proxies.bond_proxies.show_histogram_of_model_distances( sites_cart=sites_cart, f=s, prefix="[]") assert s.getvalue().splitlines()[0] == "[]Histogram of bond lengths:" assert s.getvalue().splitlines()[5].startswith("[] 1.80 - 1.80:") s = StringIO() pair_proxies.bond_proxies.show_histogram_of_deltas(sites_cart=sites_cart, f=s, prefix="][") assert s.getvalue().splitlines()[0] == "][Histogram of bond deltas:" assert s.getvalue().splitlines()[5].startswith("][ 0.000 - 0.000:") s = StringIO() pair_proxies.bond_proxies.show_sorted(by_value="residual", sites_cart=sites_cart, max_items=3, f=s, prefix=":;") l = s.getvalue().splitlines() assert l[0] == ":;Bond restraints: 18" assert l[1] == ":;Sorted by residual:" assert l[2].startswith(":;bond ") assert l[3].startswith(":; ") assert l[4] == ":; ideal model delta sigma weight residual" for i in [5, -2]: assert l[i].startswith(":; 1.800 1.800 ") assert l[-1] == ":;... (remaining 15 not shown)" s = StringIO() pair_proxies.nonbonded_proxies.show_histogram_of_model_distances( sites_cart=sites_cart, f=s, prefix="]^") assert not show_diff( s.getvalue(), """\ ]^Histogram of nonbonded interaction distances: ]^ 2.16 - 3.03: 3 ]^ 3.03 - 3.89: 12 ]^ 3.89 - 4.75: 28 ]^ 4.75 - 5.61: 44 ]^ 5.61 - 6.48: 54 """) s = StringIO() pair_proxies.nonbonded_proxies.show_sorted(by_value="delta", sites_cart=sites_cart, max_items=7, f=s, prefix=">,") assert not show_diff(s.getvalue(), """\ >,Nonbonded interactions: 141 >,Sorted by model distance: >,nonbonded 15 >, 15 >, model vdw sym.op. >, 2.164 3.600 -x+2,-y+1,z ... >,nonbonded 4 >, 8 >, model vdw >, 3.414 3.600 >,... (remaining 134 not shown) """, selections=[range(6), range(-5, 0)]) vdw_1_sticks = [] vdw_2_sticks = [] for proxy in pair_proxies.nonbonded_proxies.simple: if (proxy.vdw_distance == default_vdw_distance): vdw_1_sticks.append( pml_stick(begin=sites_cart[proxy.i_seqs[0]], end=sites_cart[proxy.i_seqs[1]])) else: vdw_2_sticks.append( pml_stick(begin=sites_cart[proxy.i_seqs[0]], end=sites_cart[proxy.i_seqs[1]])) mps = asu_mappings.mappings() for proxy in pair_proxies.nonbonded_proxies.asu: if (proxy.vdw_distance == default_vdw_distance): vdw_1_sticks.append( pml_stick(begin=mps[proxy.i_seq][0].mapped_site(), end=mps[proxy.j_seq][proxy.j_sym].mapped_site())) else: vdw_2_sticks.append( pml_stick(begin=mps[proxy.i_seq][0].mapped_site(), end=mps[proxy.j_seq][proxy.j_sym].mapped_site())) if (0 or verbose): pml_write(f=open("vdw_1.pml", "w"), label="vdw_1", sticks=vdw_1_sticks) pml_write(f=open("vdw_2.pml", "w"), label="vdw_2", sticks=vdw_2_sticks) # i_pdb = count(2) for use_crystal_symmetry in [False, True]: if (not use_crystal_symmetry): crystal_symmetry = None site_symmetry_table = None else: crystal_symmetry = xray_structure site_symmetry_table = xray_structure.site_symmetry_table() for sites_cart in [ sites_cart_manual.deep_copy(), sites_cart_minimized_1.deep_copy() ]: manager = geometry_restraints.manager.manager( crystal_symmetry=crystal_symmetry, site_symmetry_table=site_symmetry_table, nonbonded_params=nonbonded_params, nonbonded_types=atom_energy_types, nonbonded_function=geometry_restraints. prolsq_repulsion_function(), bond_params_table=bond_params_table, shell_sym_tables=shell_sym_tables, nonbonded_distance_cutoff=nonbonded_cutoff, nonbonded_buffer=1, angle_proxies=angle_proxies, plain_pairs_radius=5) manager = manager.select( selection=flex.bool(sites_cart.size(), True)) manager = manager.select(iselection=flex.size_t_range( stop=sites_cart.size())) pair_proxies = manager.pair_proxies(sites_cart=sites_cart) minimized = geometry_restraints.lbfgs.lbfgs( sites_cart=sites_cart, geometry_restraints_manager=manager, lbfgs_termination_params=scitbx.lbfgs.termination_parameters( max_iterations=1000)) if (0 or verbose): minimized.final_target_result.show() print "number of function evaluations:", minimized.minimizer.nfun( ) print "n_updates_pair_proxies:", manager.n_updates_pair_proxies if (not use_crystal_symmetry): assert minimized.final_target_result.bond_residual_sum < 1.e-3 assert minimized.final_target_result.nonbonded_residual_sum < 0.1 else: assert minimized.final_target_result.bond_residual_sum < 1.e-2 assert minimized.final_target_result.nonbonded_residual_sum < 0.1 assert minimized.final_target_result.angle_residual_sum < 1.e-3 if (0 or verbose): pdb_file_name = "minimized_%d.pdb" % i_pdb.next() print "Writing file:", pdb_file_name dump_pdb(file_name=pdb_file_name, sites_cart=sites_cart) if (manager.site_symmetry_table is None): additional_site_symmetry_table = None else: additional_site_symmetry_table = sgtbx.site_symmetry_table() assert manager.new_including_isolated_sites( n_additional_sites=0, site_symmetry_table=additional_site_symmetry_table, nonbonded_types=flex.std_string()).plain_pairs_radius \ == manager.plain_pairs_radius if (crystal_symmetry is not None): assert len(manager.plain_pair_sym_table) == 16 if (0 or verbose): manager.plain_pair_sym_table.show() # xray_structure.set_u_iso(values=flex.double([ 0.77599982480241358, 0.38745781137212021, 0.20667558236418682, 0.99759840171302094, 0.8917287406687805, 0.64780251325379845, 0.24878590382983534, 0.59480621182194615, 0.58695637792905142, 0.33997130213653637, 0.51258699130743735, 0.79760289141276675, 0.39996577657875021, 0.4329328819341467, 0.70422156561726479, 0.87260110626999332 ])) class parameters: pass parameters.sphere_radius = 5 parameters.distance_power = 0.7 parameters.average_power = 0.9 parameters.wilson_b_weight = 1.3952 parameters.wilson_b_weight_auto = False adp_energies = adp_restraints.energies_iso( geometry_restraints_manager=manager, xray_structure=xray_structure, parameters=parameters, wilson_b=None, use_hd=False, use_u_local_only=False, compute_gradients=False, gradients=None, normalization=False, collect=True) assert adp_energies.number_of_restraints == 69 assert approx_equal(adp_energies.residual_sum, 6.24865382467) assert adp_energies.gradients is None assert adp_energies.u_i.size() == adp_energies.number_of_restraints assert adp_energies.u_j.size() == adp_energies.number_of_restraints assert adp_energies.r_ij.size() == adp_energies.number_of_restraints for wilson_b in [None, 10, 100]: finite_difference_gradients = flex.double() eps = 1.e-6 for i_scatterer in xrange(xray_structure.scatterers().size()): rs = [] for signed_eps in [eps, -eps]: xray_structure_eps = xray_structure.deep_copy_scatterers() xray_structure_eps.scatterers( )[i_scatterer].u_iso += signed_eps adp_energies = adp_restraints.energies_iso( geometry_restraints_manager=manager, xray_structure=xray_structure_eps, parameters=parameters, wilson_b=wilson_b, use_u_local_only=False, use_hd=False, compute_gradients=True, gradients=None, normalization=False, collect=False) rs.append(adp_energies.residual_sum) assert adp_energies.gradients.size() \ == xray_structure.scatterers().size() assert adp_energies.u_i == None assert adp_energies.u_j == None assert adp_energies.r_ij == None finite_difference_gradients.append((rs[0] - rs[1]) / (2 * eps)) sel = flex.bool(xray_structure.scatterers().size(), True) xray_structure.scatterers().flags_set_grad_u_iso(sel.iselection()) adp_energies = adp_restraints.energies_iso( geometry_restraints_manager=manager, xray_structure=xray_structure, parameters=parameters, wilson_b=wilson_b, use_u_local_only=False, use_hd=False, compute_gradients=True, gradients=None, normalization=False, collect=False) assert approx_equal(adp_energies.gradients, finite_difference_gradients) print "OK"
def read_pdb(): pdbstring = """\ ATOM 0 CA GLY A 3 5.804 -2.100 7.324 1.00 1.36 C ATOM 1 C GLY A 3 4.651 -1.149 7.578 1.00 1.01 C ATOM 2 O GLY A 3 3.598 -1.553 8.071 1.00 1.38 O ATOM 3 N GLY A 3 6.706 -1.622 6.294 1.00 1.11 N ATOM 4 CA PHE A 4 3.819 1.134 7.419 1.00 0.89 C ATOM 5 CB PHE A 4 4.397 2.380 8.094 1.00 1.13 C ATOM 6 C PHE A 4 3.185 1.509 6.084 1.00 0.94 C ATOM 7 N PHE A 4 4.852 0.121 7.242 1.00 0.88 N ATOM 8 O PHE A 4 2.361 2.421 6.010 1.00 1.47 O ATOM 9 CA LEU A 5 3.055 1.059 3.693 1.00 0.87 C ATOM 10 CB LEU A 5 3.965 0.435 2.634 1.00 1.13 C ATOM 11 C LEU A 5 1.634 0.527 3.541 1.00 0.87 C ATOM 12 N LEU A 5 3.576 0.800 5.030 1.00 0.92 N ATOM 13 O LEU A 5 1.246 -0.440 4.196 1.00 1.23 O """ pdb_inp = iotbx.pdb.input(lines=flex.split_lines(pdbstring), source_info=None) sites_cart = pdb_inp.atoms().extract_xyz() # TRANS phi 1 C 2 N 2 CA 2 C 60.00 20.0 3 # TRANS psi 1 N 1 CA 1 C 2 N 160.00 30.0 2 dihedral_proxies = geometry_restraints.shared_dihedral_proxy() # residue 1 psi = geometry_restraints.dihedral_proxy(i_seqs=[3, 0, 1, 7], angle_ideal=160.0, weight=1 / 30.0**2, periodicity=3) dihedral_proxies.append(psi) # residue 2 phi = geometry_restraints.dihedral_proxy(i_seqs=[1, 7, 4, 6], angle_ideal=60.0, weight=1 / 20.0**2, periodicity=3) dihedral_proxies.append(phi) psi = geometry_restraints.dihedral_proxy(i_seqs=[7, 4, 6, 8], angle_ideal=160.0, weight=1 / 30.0**2, periodicity=3) dihedral_proxies.append(psi) # residue 3 phi = geometry_restraints.dihedral_proxy(i_seqs=[6, 12, 9, 11], angle_ideal=60.0, weight=1 / 20.0**2, periodicity=3) dihedral_proxies.append(phi) angle_proxies = geometry_restraints.shared_angle_proxy() ## Residue 1 # a3 a = geometry_restraints.angle_proxy(i_seqs=[3, 0, 1], angle_ideal=0, weight=1) angle_proxies.append(a) # a7 a = geometry_restraints.angle_proxy(i_seqs=[2, 1, 7], angle_ideal=0, weight=1) angle_proxies.append(a) ## Residue 2 # a1 a = geometry_restraints.angle_proxy(i_seqs=[1, 7, 4], angle_ideal=0, weight=1) angle_proxies.append(a) # a3 a = geometry_restraints.angle_proxy(i_seqs=[7, 4, 6], angle_ideal=0, weight=1) angle_proxies.append(a) # a7 a = geometry_restraints.angle_proxy(i_seqs=[8, 6, 12], angle_ideal=0, weight=1) angle_proxies.append(a) ## Residue 3 # a1 a = geometry_restraints.angle_proxy(i_seqs=[6, 12, 9], angle_ideal=0, weight=1) angle_proxies.append(a) # a3 a = geometry_restraints.angle_proxy(i_seqs=[12, 9, 11], angle_ideal=0, weight=1) angle_proxies.append(a) # compute dihedral #dihedral = geometry_restraints.dihedral( # sites_cart=sites_cart, # proxy=dihedral_proxies[0]) # Shows real dihedral value #print dihedral.angle_model, dihedral.delta cfd_list = [] cfd = conformation_dependent_restraints.conformation_dependent_restraints( residue_name='GLY', next_residue_name='PHE', conformation_proxies=None, i_phi_proxy=None, # index into dihedral_proxies i_psi_proxy=0, i_dynamic_angles=[None, None, 0, None, None, None, 1], # indexes into angles in angle_proxies i_dynamic_dihedrals=None) cfd_list.append(cfd) cfd = conformation_dependent_restraints.conformation_dependent_restraints( residue_name='PHE', next_residue_name='LEU', conformation_proxies=None, i_phi_proxy=1, # index into dihedral_proxies i_psi_proxy=2, i_dynamic_angles=[2, None, 3, None, None, None, 4], # indexes into angles in angle_proxies i_dynamic_dihedrals=None) cfd_list.append(cfd) cfd = conformation_dependent_restraints.conformation_dependent_restraints( residue_name='LEU', next_residue_name=None, conformation_proxies=None, i_phi_proxy=3, # index into dihedral_proxies i_psi_proxy=None, i_dynamic_angles=[5, None, 6, None, None, None, None], # indexes into angles in angle_proxies i_dynamic_dihedrals=None) cfd_list.append(cfd) for x in range(1, 4): print print 'Starting cycle', x print for cfd in cfd_list: cfd.update_restraints(sites_cart, dihedral_proxies, angle_proxies)
def adjust_geometry_restraints_manager(hierarchy, grm, error_i_seqs, log=None, ): # obsolete t0=time.time() mon_lib_srv = server.server() pdb_atoms = hierarchy.atoms() sites_cart = pdb_atoms.extract_xyz() resnames=[] bond_counters = [0,0] angle_counters = [0,0] checked=[] for i_seq in error_i_seqs: atom = pdb_atoms[i_seq] ag = atom.parent() if ag.resname in checked: continue rg = ag.parent() # need to be able to check in user defined location monomer_restraints = mon_lib_srv.get_comp_comp_id_direct( ag.resname, pH_range="low", ) checked.append(ag.resname) if monomer_restraints is None: continue resnames.append('"%s%s %s%5s"' % (' ', ag.resname, rg.parent().id, rg.resseq, )) for bond in monomer_restraints.bond_list: bond.show() atom1 = ag.get_atom(bond.atom_id_1) atom2 = ag.get_atom(bond.atom_id_2) i_seqs = (atom1.i_seq, atom2.i_seq) bond_param = grm.bond_params_table.lookup(*list(i_seqs)) if bond_param: bond_param.distance_ideal = bond.value_dist bond_counters[0]+=1 else: proxy = geometry_restraints.bond_simple_proxy( i_seqs=i_seqs, distance_ideal=bond.value_dist, weight=1/(bond.value_dist_esd**2), ) grm.add_new_bond_restraints_in_place([proxy], sites_cart) bond_counters[1]+=1 lookup={} for angle in monomer_restraints.angle_list: atom1 = ag.get_atom(angle.atom_id_1) atom2 = ag.get_atom(angle.atom_id_2) atom3 = ag.get_atom(angle.atom_id_3) i_seqs = (atom1.i_seq, atom2.i_seq, atom3.i_seq) lookup[i_seqs]=angle i_seqs = (atom3.i_seq, atom2.i_seq, atom1.i_seq) lookup[i_seqs]=angle for angle_proxy in grm.angle_proxies: if angle_proxy.i_seqs in lookup: i_seqs = angle_proxy.i_seqs angle = lookup[i_seqs] angle_proxy.angle_ideal = angle.value_angle angle_proxy.weight = 1/angle.value_angle_esd**2 angle_counters[0]+=1 del lookup[i_seqs] i_seqs = list(i_seqs) i_seqs.reverse() del lookup[tuple(i_seqs)] if lookup: done = [] for i_seqs in lookup: if i_seqs in done: continue proxy = geometry_restraints.angle_proxy( i_seqs=i_seqs, angle_ideal=angle.value_angle, weight=1/angle.value_angle_esd**2, ) grm.add_angles_in_place([proxy]) angle_counters[1]+=1 i_seqs=list(i_seqs) i_seqs.reverse() done.append(tuple(i_seqs))
def update_restraints(self, sites_cart, dihedral_proxies, angle_proxies): if (1): from libtbx.utils import null_out log = null_out() else: import sys log = sys.stdout try: phi = self._get_dihedral( sites_cart=sites_cart, dihedral_proxies=self.conformation_proxies, i_proxy=self.i_phi_proxy) except Exception: # XXX BAD phi = None try: psi = self._get_dihedral( sites_cart=sites_cart, dihedral_proxies=self.conformation_proxies, i_proxy=self.i_psi_proxy) except Exception: # XXX BAD psi = None # Shows real dihedral value if phi is not None: print('phi', phi.angle_model, phi.delta, file=log) if psi is not None: print('psi', psi.angle_model, psi.delta, file=log) if phi is not None and psi is not None: # get restraint from our database here geometry = pgd_lib.lookup(residue=self.residue_name, next_residue=self.next_residue_name, phi=phi.angle_model, psi=psi.angle_model) # grab angles from our database # using zip() on i_dynamic_angles and our values # plug it into restraints in angle proxies angles = [ self._get_angle(sites_cart=sites_cart, angle_proxies=angle_proxies, i_proxy=i_proxy) for i_proxy in self.i_dynamic_angles ] for angle, angle_name, i_proxy in zip( angles, conformation_dependent_geometry.angles.angle_names, self.i_dynamic_angles): # i_dynamic_angles contains None for angles/atoms that don't # exist so don't have restraints to update. if i_proxy is not None: new_angle_ideal, new_weight = \ self._get_average_and_weight(geometry, angle_name) # Create a new angle proxy here with our restraint new_angle_proxy = geometry_restraints.angle_proxy( i_seqs=angle_proxies[i_proxy].i_seqs, angle_ideal=new_angle_ideal, weight=new_weight) # Overwrite the old proxy angle_proxies[i_proxy] = new_angle_proxy # Show that we actually did update the proxy proxy = angle_proxies[i_proxy] print(self.residue_name, self.next_residue_name, end=' ', file=log) print(angle_name, proxy.i_seqs, proxy.angle_ideal, proxy.weight, file=log) # grab dihedrals from our database # using zip() on i_dynamic_dihedrals and our values # plug it into restraints in dihedral proxies dihedrals = [ self._get_dihedral(sites_cart=sites_cart, dihedral_proxies=dihedral_proxies, i_proxy=i_proxy) for i_proxy in self.i_dynamic_dihedrals ] for dihedral, dihedral_name, i_proxy in zip( dihedrals, conformation_dependent_geometry.angles.dihedral_names, self.i_dynamic_dihedrals): # i_dynamic_dihedrals contains None for dihedrals/atoms that don't # exist so don't have restraints to update. if i_proxy is not None: new_angle_ideal, new_weight = \ self._get_average_and_weight(geometry, dihedral_name) new_angle_ideal = dihedral_proxies[i_proxy].angle_ideal new_weight = dihedral_proxies[i_proxy].weight # Create a new dihedral proxy here with our restraint new_dihedral_proxy = geometry_restraints.dihedral_proxy( i_seqs=dihedral_proxies[i_proxy].i_seqs, angle_ideal=new_angle_ideal, weight=new_weight) # Overwrite the old proxy dihedral_proxies[i_proxy] = new_dihedral_proxy # Show that we actually did update the proxy proxy = dihedral_proxies[i_proxy] print(self.residue_name, self.next_residue_name, end=' ', file=log) print(dihedral_name, proxy.i_seqs, proxy.angle_ideal, proxy.weight, file=log)
def update_restraints(self, sites_cart, dihedral_proxies, angle_proxies): if 1: from libtbx.utils import null_out log = null_out() else: import sys log = sys.stdout try: phi = self._get_dihedral( sites_cart=sites_cart, dihedral_proxies=self.conformation_proxies, i_proxy=self.i_phi_proxy ) except Exception: # XXX BAD phi = None try: psi = self._get_dihedral( sites_cart=sites_cart, dihedral_proxies=self.conformation_proxies, i_proxy=self.i_psi_proxy ) except Exception: # XXX BAD psi = None # Shows real dihedral value if phi is not None: print >> log, "phi", phi.angle_model, phi.delta if psi is not None: print >> log, "psi", psi.angle_model, psi.delta if phi is not None and psi is not None: # get restraint from our database here geometry = pgd_lib.lookup( residue=self.residue_name, next_residue=self.next_residue_name, phi=phi.angle_model, psi=psi.angle_model ) # grab angles from our database # using zip() on i_dynamic_angles and our values # plug it into restraints in angle proxies angles = [ self._get_angle(sites_cart=sites_cart, angle_proxies=angle_proxies, i_proxy=i_proxy) for i_proxy in self.i_dynamic_angles ] for angle, angle_name, i_proxy in zip( angles, conformation_dependent_geometry.angles.angle_names, self.i_dynamic_angles ): # i_dynamic_angles contains None for angles/atoms that don't # exist so don't have restraints to update. if i_proxy is not None: new_angle_ideal, new_weight = self._get_average_and_weight(geometry, angle_name) # Create a new angle proxy here with our restraint new_angle_proxy = geometry_restraints.angle_proxy( i_seqs=angle_proxies[i_proxy].i_seqs, angle_ideal=new_angle_ideal, weight=new_weight ) # Overwrite the old proxy angle_proxies[i_proxy] = new_angle_proxy # Show that we actually did update the proxy proxy = angle_proxies[i_proxy] print >> log, self.residue_name, self.next_residue_name, print >> log, angle_name, proxy.i_seqs, proxy.angle_ideal, proxy.weight # grab dihedrals from our database # using zip() on i_dynamic_dihedrals and our values # plug it into restraints in dihedral proxies dihedrals = [ self._get_dihedral(sites_cart=sites_cart, dihedral_proxies=dihedral_proxies, i_proxy=i_proxy) for i_proxy in self.i_dynamic_dihedrals ] for dihedral, dihedral_name, i_proxy in zip( dihedrals, conformation_dependent_geometry.angles.dihedral_names, self.i_dynamic_dihedrals ): # i_dynamic_dihedrals contains None for dihedrals/atoms that don't # exist so don't have restraints to update. if i_proxy is not None: new_angle_ideal, new_weight = self._get_average_and_weight(geometry, dihedral_name) new_angle_ideal = dihedral_proxies[i_proxy].angle_ideal new_weight = dihedral_proxies[i_proxy].weight # Create a new dihedral proxy here with our restraint new_dihedral_proxy = geometry_restraints.dihedral_proxy( i_seqs=dihedral_proxies[i_proxy].i_seqs, angle_ideal=new_angle_ideal, weight=new_weight ) # Overwrite the old proxy dihedral_proxies[i_proxy] = new_dihedral_proxy # Show that we actually did update the proxy proxy = dihedral_proxies[i_proxy] print >> log, self.residue_name, self.next_residue_name, print >> log, dihedral_name, proxy.i_seqs, proxy.angle_ideal, proxy.weight
def adjust_geometry_proxies_registeries(hierarchy, #bond_params_table, #bond_asu_table, gpr, error_i_seqs, log=None, ): t0=time.time() mon_lib_srv = server.server() pdb_atoms = hierarchy.atoms() sites_cart = pdb_atoms.extract_xyz() resnames=[] bond_counters = [0,0] angle_counters = [0,0] checked=[] atoms_added={} for i_seq in error_i_seqs: atom = pdb_atoms[i_seq] ag = atom.parent() if ag.resname in checked: continue rg = ag.parent() # need to be able to check in user defined location monomer_restraints = mon_lib_srv.get_comp_comp_id_direct( ag.resname, pH_range="low", ) checked.append(ag.resname) if monomer_restraints is None: continue atom_dict = monomer_restraints.atom_dict() resnames.append('"%s%s %s%5s"' % (' ', ag.resname, rg.parent().id, rg.resseq, )) for bond in monomer_restraints.bond_list: atom1 = ag.get_atom(bond.atom_id_1) if atom1 is None: continue atom2 = ag.get_atom(bond.atom_id_2) if atom2 is None: continue i_seqs = [atom1.i_seq, atom2.i_seq] i_seqs.sort() bond_table_entry = gpr.bond_simple.table[i_seqs[0]] if i_seqs[1] in bond_table_entry: bond_simple = gpr.bond_simple.proxies[i_seqs[0]] bond_simple.distance_ideal = bond.value_dist bond_simple.weight=1/bond.value_dist_esd**2 bond_counters[0]+=1 else: proxy = geometry_restraints.bond_simple_proxy( i_seqs=i_seqs, distance_ideal=bond.value_dist, weight=1/(bond.value_dist_esd**2), ) gpr.bond_simple.proxies.append(proxy) atoms_added[atom1.i_seq] = atom_dict.get(atom1.name.strip(), None) atoms_added[atom2.i_seq] = atom_dict.get(atom2.name.strip(), None) bond_counters[1]+=1 lookup={} for angle in monomer_restraints.angle_list: atom1 = ag.get_atom(angle.atom_id_1) if atom1 is None: continue atom2 = ag.get_atom(angle.atom_id_2) if atom2 is None: continue atom3 = ag.get_atom(angle.atom_id_3) if atom3 is None: continue i_seqs = (atom1.i_seq, atom2.i_seq, atom3.i_seq) lookup[i_seqs]=angle i_seqs = (atom3.i_seq, atom2.i_seq, atom1.i_seq) lookup[i_seqs]=angle for angle_proxy in gpr.angle.proxies: if angle_proxy.i_seqs in lookup: i_seqs = angle_proxy.i_seqs angle = lookup[i_seqs] angle_proxy.angle_ideal = angle.value_angle angle_proxy.weight = 1/angle.value_angle_esd**2 angle_counters[0]+=1 del lookup[i_seqs] i_seqs = list(i_seqs) i_seqs.reverse() del lookup[tuple(i_seqs)] if lookup: done = [] for i_seqs in lookup: if i_seqs in done: continue proxy = geometry_restraints.angle_proxy( i_seqs=i_seqs, angle_ideal=angle.value_angle, weight=1/angle.value_angle_esd**2, ) gpr.angle.add_if_not_duplicated(proxy) angle_counters[1]+=1 i_seqs=list(i_seqs) i_seqs.reverse() done.append(tuple(i_seqs)) if resnames: print >> log, "\n Adjusted restraints in %d residue(s) for low pH in %0.1fs" % ( len(resnames), time.time()-t0, ) print >> log, " Residues changed" for resname in resnames: print >> log, " %s" % resname print >> log, " Changed %d bond restraint(s), added %d bond restraint(s)" % ( bond_counters[0], bond_counters[1], ) print >> log, " Changed %d angle restraint(s), added %d angle restraint(s)\n" % ( angle_counters[0], angle_counters[1], ) #else: # print >> log, " Time to perform restraint checks: %0.1f" % (time.time()-t0) return atoms_added
def adjust_geometry_proxies_registeries( hierarchy, #bond_params_table, #bond_asu_table, gpr, error_i_seqs, log=None, ): t0 = time.time() mon_lib_srv = server.server() pdb_atoms = hierarchy.atoms() sites_cart = pdb_atoms.extract_xyz() resnames = [] bond_counters = [0, 0] angle_counters = [0, 0] checked = [] atoms_added = {} for i_seq in error_i_seqs: atom = pdb_atoms[i_seq] ag = atom.parent() if ag.resname in checked: continue rg = ag.parent() # need to be able to check in user defined location monomer_restraints = mon_lib_srv.get_comp_comp_id_direct( ag.resname, pH_range="low", ) checked.append(ag.resname) if monomer_restraints is None: continue atom_dict = monomer_restraints.atom_dict() resnames.append('"%s%s %s%5s"' % ( ' ', ag.resname, rg.parent().id, rg.resseq, )) for bond in monomer_restraints.bond_list: atom1, name1, neutron1 = _get_atom_neutron( ag, bond.atom_id_1, bondlength=bond.value_dist) if atom1 is None: continue atom2, name2, neutron2 = _get_atom_neutron( ag, bond.atom_id_2, bondlength=bond.value_dist) if atom2 is None: continue i_seqs = [atom1.i_seq, atom2.i_seq] k = 0 l = 1 bond_table_entry = gpr.bond_simple.table[i_seqs[k]] if (not bond_table_entry or i_seqs[l] not in gpr.bond_simple.table[i_seqs[k]]): k = 1 l = 0 bond_table_entry = gpr.bond_simple.table[i_seqs[k]] if i_seqs[l] in bond_table_entry: bond_simple = gpr.bond_simple.proxies[i_seqs[k]] bond_simple.distance_ideal = bond.value_dist bond_simple.weight = 1 / bond.value_dist_esd**2 bond_counters[0] += 1 # changed else: if neutron1 or neutron2: proxy = geometry_restraints.bond_simple_proxy( i_seqs=i_seqs, distance_ideal=bond.value_dist_neutron, weight=1 / (bond.value_dist_esd**2), ) else: proxy = geometry_restraints.bond_simple_proxy( i_seqs=i_seqs, distance_ideal=bond.value_dist, weight=1 / (bond.value_dist_esd**2), ) gpr.bond_simple.proxies.append(proxy) atoms_added[atom1.i_seq] = atom_dict.get(name1.strip(), None) atoms_added[atom2.i_seq] = atom_dict.get(name2.strip(), None) bond_counters[1] += 1 lookup = {} for angle in monomer_restraints.angle_list: atom1, name1, neutron1 = _get_atom_neutron( ag, angle.atom_id_1, ) if atom1 is None: continue atom2, name2, neutron2 = _get_atom_neutron( ag, angle.atom_id_2, ) if atom2 is None: continue atom3, name3, neutron3 = _get_atom_neutron( ag, angle.atom_id_3, ) if atom3 is None: continue i_seqs = (atom1.i_seq, atom2.i_seq, atom3.i_seq) lookup[i_seqs] = angle i_seqs = (atom3.i_seq, atom2.i_seq, atom1.i_seq) lookup[i_seqs] = angle for angle_proxy in gpr.angle.proxies: if angle_proxy.i_seqs in lookup: i_seqs = angle_proxy.i_seqs angle = lookup[i_seqs] angle_proxy.angle_ideal = angle.value_angle angle_proxy.weight = 1 / angle.value_angle_esd**2 angle_counters[0] += 1 del lookup[i_seqs] i_seqs = list(i_seqs) i_seqs.reverse() del lookup[tuple(i_seqs)] if lookup: done = [] for i_seqs in lookup: if i_seqs in done: continue angle = lookup[i_seqs] proxy = geometry_restraints.angle_proxy( i_seqs=i_seqs, angle_ideal=angle.value_angle, weight=1 / angle.value_angle_esd**2, ) gpr.angle.add_if_not_duplicated(proxy) angle_counters[1] += 1 i_seqs = list(i_seqs) i_seqs.reverse() done.append(tuple(i_seqs)) if resnames: print >> log, "\n Adjusted restraints in %d residue(s) for low pH in %0.1fs" % ( len(resnames), time.time() - t0, ) print >> log, " Residues changed" for resname in resnames: print >> log, " %s" % resname print >> log, " Changed %d bond restraint(s), added %d bond restraint(s)" % ( bond_counters[0], bond_counters[1], ) print >> log, " Changed %d angle restraint(s), added %d angle restraint(s)\n" % ( angle_counters[0], angle_counters[1], ) #else: # print >> log, " Time to perform restraint checks: %0.1f" % (time.time()-t0) return atoms_added
def _add_angle(i_seqs, geometry_proxy_registries, value, esd): proxy = geometry_restraints.angle_proxy( i_seqs=i_seqs, angle_ideal=value, weight=1/esd**2) geometry_proxy_registries.angle.add_if_not_duplicated(proxy=proxy)
def adjust_geometry_restraints_manager( hierarchy, grm, error_i_seqs, log=None, ): # obsolete assert 0 t0 = time.time() mon_lib_srv = server.server() pdb_atoms = hierarchy.atoms() sites_cart = pdb_atoms.extract_xyz() resnames = [] bond_counters = [0, 0] angle_counters = [0, 0] checked = [] for i_seq in error_i_seqs: atom = pdb_atoms[i_seq] ag = atom.parent() if ag.resname in checked: continue rg = ag.parent() # need to be able to check in user defined location monomer_restraints = mon_lib_srv.get_comp_comp_id_direct( ag.resname, pH_range="low", ) checked.append(ag.resname) if monomer_restraints is None: continue resnames.append('"%s%s %s%5s"' % ( ' ', ag.resname, rg.parent().id, rg.resseq, )) for bond in monomer_restraints.bond_list: bond.show() atom1 = ag.get_atom(bond.atom_id_1) atom2 = ag.get_atom(bond.atom_id_2) i_seqs = (atom1.i_seq, atom2.i_seq) bond_param = grm.bond_params_table.lookup(*list(i_seqs)) if bond_param: bond_param.distance_ideal = bond.value_dist bond_counters[0] += 1 else: proxy = geometry_restraints.bond_simple_proxy( i_seqs=i_seqs, distance_ideal=bond.value_dist, weight=1 / (bond.value_dist_esd**2), ) grm.add_new_bond_restraints_in_place([proxy], sites_cart) bond_counters[1] += 1 lookup = {} for angle in monomer_restraints.angle_list: atom1 = ag.get_atom(angle.atom_id_1) atom2 = ag.get_atom(angle.atom_id_2) atom3 = ag.get_atom(angle.atom_id_3) i_seqs = (atom1.i_seq, atom2.i_seq, atom3.i_seq) lookup[i_seqs] = angle i_seqs = (atom3.i_seq, atom2.i_seq, atom1.i_seq) lookup[i_seqs] = angle for angle_proxy in grm.angle_proxies: if angle_proxy.i_seqs in lookup: i_seqs = angle_proxy.i_seqs angle = lookup[i_seqs] angle_proxy.angle_ideal = angle.value_angle angle_proxy.weight = 1 / angle.value_angle_esd**2 angle_counters[0] += 1 del lookup[i_seqs] i_seqs = list(i_seqs) i_seqs.reverse() del lookup[tuple(i_seqs)] if lookup: done = [] for i_seqs in lookup: if i_seqs in done: continue proxy = geometry_restraints.angle_proxy( i_seqs=i_seqs, angle_ideal=angle.value_angle, weight=1 / angle.value_angle_esd**2, ) grm.add_angles_in_place([proxy]) angle_counters[1] += 1 i_seqs = list(i_seqs) i_seqs.reverse() done.append(tuple(i_seqs))
def exercise_geometry_restraints_as_cif(): quartz = xray.structure( crystal_symmetry=crystal.symmetry( (5.01,5.01,5.47,90,90,120), "P6222"), scatterers=flex.xray_scatterer([ xray.scatterer("Si", (1/2.,1/2.,1/3.)), xray.scatterer("O", (0.197,-0.197,0.83333))])) bond_proxies = geometry_restraints.shared_bond_simple_proxy(( geometry_restraints.bond_simple_proxy( i_seqs=[0,1], rt_mx_ji=sgtbx.rt_mx("x-y,x,z-2/3"), distance_ideal=1.6, weight=3.2), geometry_restraints.bond_simple_proxy( i_seqs=[0,1], distance_ideal=1.7, weight=1.8), )) dihedral_proxies = geometry_restraints.shared_dihedral_proxy(( geometry_restraints.dihedral_proxy( i_seqs = [1,0,1,0], sym_ops = (sgtbx.rt_mx("1+y,1-x+y, z-1/3"), sgtbx.rt_mx(), sgtbx.rt_mx("x-y,x,z-2/3"), sgtbx.rt_mx("1-x,y-x,1/3-z")), angle_ideal=-30, weight=2), geometry_restraints.dihedral_proxy( i_seqs = [1,0,1,0], sym_ops = (sgtbx.rt_mx("1+y,1-x+y, z-1/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-y,x-y,z-1/3"), sgtbx.rt_mx("x-y,x,1/3+z")), angle_ideal=90, weight=3), )) angle_proxies = geometry_restraints.shared_angle_proxy(( geometry_restraints.angle_proxy( i_seqs = [1,0,1], sym_ops = (sgtbx.rt_mx("x-y,x,z-2/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-y,x-y,z-1/3")), angle_ideal=103, weight=2), geometry_restraints.angle_proxy( i_seqs = [1,0,1], sym_ops = (sgtbx.rt_mx("y+1,-x+y+1,z-1/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-y,x-y,z-1/3")), angle_ideal=110, weight=5), geometry_restraints.angle_proxy( i_seqs = [0,1,0], sym_ops = (sgtbx.rt_mx("y,-x+y,z+2/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-x+y,-x,z+1/3")), angle_ideal=150, weight=5), )) bond_similarity_proxies = geometry_restraints.shared_bond_similarity_proxy(( geometry_restraints.bond_similarity_proxy( i_seqs=[(0,1),(0,1),(0,1)], sym_ops=(sgtbx.rt_mx("x-y,x,z-2/3"), sgtbx.rt_mx("-y,x-y,z-1/3"), sgtbx.rt_mx("y+1,-x+y+1,z-1/3")), weights=(1,1,1)), )) cif_block = iotbx.cif.model.block() iotbx.cif.restraints.add_to_cif_block( cif_block, quartz, bond_proxies=bond_proxies, angle_proxies=angle_proxies, dihedral_proxies=dihedral_proxies, bond_similarity_proxies=bond_similarity_proxies) s = StringIO() cif_block.show(out=s) assert not show_diff(s.getvalue(), """\ loop_ _restr_distance_atom_site_label_1 _restr_distance_atom_site_label_2 _restr_distance_site_symmetry_2 _restr_distance_target _restr_distance_target_weight_param _restr_distance_diff Si O 2_554 1.6000 0.5590 -0.0160 Si O 1 1.7000 0.7454 -2.3838 loop_ _restr_angle_atom_site_label_1 _restr_angle_atom_site_label_2 _restr_angle_atom_site_label_3 _restr_angle_site_symmetry_1 _restr_angle_site_symmetry_2 _restr_angle_site_symmetry_3 _restr_angle_target _restr_angle_target_weight_param _restr_angle_diff O Si O 2_554 1 4_554 103.0000 0.7071 1.6926 O Si O 3_664 1 4_554 110.0000 0.4472 -1.3127 Si O Si 3 1 5 150.0000 0.4472 3.0700 loop_ _restr_torsion_atom_site_label_1 _restr_torsion_atom_site_label_2 _restr_torsion_atom_site_label_3 _restr_torsion_atom_site_label_4 _restr_torsion_site_symmetry_1 _restr_torsion_site_symmetry_2 _restr_torsion_site_symmetry_3 _restr_torsion_site_symmetry_4 _restr_torsion_angle_target _restr_torsion_weight_param _restr_torsion_diff O Si O Si 3_664 1 2_554 7_655 -30.0000 0.7071 6.9078 O Si O Si 3_664 1 4_554 2 90.0000 0.5774 11.7036 loop_ _restr_equal_distance_class_class_id _restr_equal_distance_class_target_weight_param _restr_equal_distance_class_average _restr_equal_distance_class_esd _restr_equal_distance_class_diff_max 1 1.0000 1.6160 0.0000 0.0000 loop_ _restr_equal_distance_atom_site_label_1 _restr_equal_distance_atom_site_label_2 _restr_equal_distance_site_symmetry_2 _restr_equal_distance_class_id Si O 2_554 1 Si O 4_554 1 Si O 3_664 1 """)
def _apply_link_using_proxies(link, atom_group1, atom_group2, bond_params_table, bond_asu_table, geometry_proxy_registries, # distance, rt_mx_ji, ): ###################################### def _get_restraint_i_seqs(atom_group1, atom_group2, restraint, ): i_seqs = [] keys = restraint.cif_keywords() if "value_dist" in keys: attrs = [ "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", ] elif "period" in keys: attrs = [ "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", "atom_4_comp_id", "atom_id_4", ] elif "value_angle" in keys: attrs = [ "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", ] elif "volume_sign" in keys: attrs = [ "atom_centre_comp_id", "atom_id_centre", "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", ] elif "plane_id" in keys: attrs = [ "atom_comp_id", "atom_id", ] else: assert 0 for i, attr in enumerate(attrs): if i%2: # name name = getattr(restraint, attr) for atom in atoms: # uses names to confirm link if atom.name.strip()==name.strip(): i_seqs.append(atom.i_seq) break else: # name not found, could be hydrogen or ... return None else: # atoms if getattr(restraint, attr)==1: atoms = atom_group1.atoms() else: atoms = atom_group2.atoms() return i_seqs ############### def _check_i_seqs(atom_group1, atom_group2, i_seqs): atoms = [] for i_seq in i_seqs: for atom in list(atom_group1.atoms())+list(atom_group2.atoms()): if atom.i_seq==i_seq: atoms.append(atom) break d2 = linking_utils.get_distance2(*atoms) # XXXX needs to be sym aware if d2>9: return False return True ############# assert link count = 0 # bond_i_seqs = [] for bond in link.bond_list: i_seqs = _get_restraint_i_seqs(atom_group1, atom_group2, bond, ) if i_seqs is None: continue if not _check_i_seqs(atom_group1, atom_group2, i_seqs): # check distances tmp = atom_group2 atom_group2 = atom_group1 atom_group1 = tmp i_seqs = _get_restraint_i_seqs(atom_group1, atom_group2, bond, ) if i_seqs is None: continue value = "value_dist" proxy = geometry_restraints.bond_simple_proxy( i_seqs=i_seqs, distance_ideal=getattr(bond, value), weight=1/bond.value_dist_esd**2) bond_params_table.update(i_seq=i_seqs[0], j_seq=i_seqs[1], params=proxy) #if rt_mx_ji is None: continue bond_asu_table.add_pair( i_seq=i_seqs[0], j_seq=i_seqs[1], rt_mx_ji=rt_mx_ji, ) count+=1 bond_i_seqs.append(i_seqs) # for angle in link.angle_list: i_seqs = _get_restraint_i_seqs(atom_group1, atom_group2, angle, ) if i_seqs is None: continue proxy = geometry_restraints.angle_proxy( i_seqs=i_seqs, angle_ideal=angle.value_angle, weight=1/angle.value_angle_esd**2) geometry_proxy_registries.angle.add_if_not_duplicated(proxy=proxy) # for tor in link.tor_list: i_seqs = _get_restraint_i_seqs(atom_group1, atom_group2, tor, ) if i_seqs is None: continue proxy = geometry_restraints.dihedral_proxy( i_seqs=i_seqs, angle_ideal=tor.value_angle, weight=1/tor.value_angle_esd**2, periodicity=tor.period, ) geometry_proxy_registries.dihedral.add_if_not_duplicated(proxy=proxy) # for chir in link.chir_list: i_seqs = _get_restraint_i_seqs(atom_group1, atom_group2, chir, ) if i_seqs is None: continue volume_ideal = 2.4 if chir.volume_sign[:4].lower()=="nega": volume_ideal = -2.4 elif chir.volume_sign[:4].lower()=="zero": volume_ideal = 0. proxy = geometry_restraints.chirality_proxy( i_seqs=i_seqs, volume_ideal=volume_ideal, both_signs=False, weight=25., ) geometry_proxy_registries.chirality.add_if_not_duplicated(proxy=proxy) # planes = {} weights = {} for plane in link.plane_list: i_seqs = _get_restraint_i_seqs(atom_group1, atom_group2, plane, ) if i_seqs is None: continue planes.setdefault(plane.plane_id, []) planes[plane.plane_id]+=i_seqs weights.setdefault(plane.plane_id, []) weights[plane.plane_id].append(1/plane.dist_esd**2) if planes: for plane_id in planes: if len(planes[plane_id])<4: continue proxy = geometry_restraints.planarity_proxy( i_seqs=planes[plane_id], weights=weights[plane_id], ) geometry_proxy_registries.planarity.add_if_not_duplicated(proxy=proxy) return count, bond_i_seqs
def read_pdb(): pdbstring = """\ ATOM 0 CA GLY A 3 5.804 -2.100 7.324 1.00 1.36 C ATOM 1 C GLY A 3 4.651 -1.149 7.578 1.00 1.01 C ATOM 2 O GLY A 3 3.598 -1.553 8.071 1.00 1.38 O ATOM 3 N GLY A 3 6.706 -1.622 6.294 1.00 1.11 N ATOM 4 CA PHE A 4 3.819 1.134 7.419 1.00 0.89 C ATOM 5 CB PHE A 4 4.397 2.380 8.094 1.00 1.13 C ATOM 6 C PHE A 4 3.185 1.509 6.084 1.00 0.94 C ATOM 7 N PHE A 4 4.852 0.121 7.242 1.00 0.88 N ATOM 8 O PHE A 4 2.361 2.421 6.010 1.00 1.47 O ATOM 9 CA LEU A 5 3.055 1.059 3.693 1.00 0.87 C ATOM 10 CB LEU A 5 3.965 0.435 2.634 1.00 1.13 C ATOM 11 C LEU A 5 1.634 0.527 3.541 1.00 0.87 C ATOM 12 N LEU A 5 3.576 0.800 5.030 1.00 0.92 N ATOM 13 O LEU A 5 1.246 -0.440 4.196 1.00 1.23 O """ pdb_inp = iotbx.pdb.input( lines=flex.split_lines(pdbstring), source_info=None) sites_cart = pdb_inp.atoms().extract_xyz() # TRANS phi 1 C 2 N 2 CA 2 C 60.00 20.0 3 # TRANS psi 1 N 1 CA 1 C 2 N 160.00 30.0 2 dihedral_proxies = geometry_restraints.shared_dihedral_proxy() # residue 1 psi = geometry_restraints.dihedral_proxy( i_seqs=[3, 0, 1, 7], angle_ideal=160.0, weight=1/30.0**2, periodicity=3 ) dihedral_proxies.append(psi) # residue 2 phi = geometry_restraints.dihedral_proxy( i_seqs=[1, 7, 4, 6], angle_ideal=60.0, weight=1/20.0**2, periodicity=3 ) dihedral_proxies.append(phi) psi = geometry_restraints.dihedral_proxy( i_seqs=[7, 4, 6, 8], angle_ideal=160.0, weight=1/30.0**2, periodicity=3 ) dihedral_proxies.append(psi) # residue 3 phi = geometry_restraints.dihedral_proxy( i_seqs=[6, 12, 9, 11], angle_ideal=60.0, weight=1/20.0**2, periodicity=3 ) dihedral_proxies.append(phi) angle_proxies = geometry_restraints.shared_angle_proxy() ## Residue 1 # a3 a = geometry_restraints.angle_proxy( i_seqs=[3, 0, 1], angle_ideal=0, weight=1 ) angle_proxies.append(a) # a7 a = geometry_restraints.angle_proxy( i_seqs=[2, 1, 7], angle_ideal=0, weight=1 ) angle_proxies.append(a) ## Residue 2 # a1 a = geometry_restraints.angle_proxy( i_seqs=[1, 7, 4], angle_ideal=0, weight=1 ) angle_proxies.append(a) # a3 a = geometry_restraints.angle_proxy( i_seqs=[7, 4, 6], angle_ideal=0, weight=1 ) angle_proxies.append(a) # a7 a = geometry_restraints.angle_proxy( i_seqs=[8, 6, 12], angle_ideal=0, weight=1 ) angle_proxies.append(a) ## Residue 3 # a1 a = geometry_restraints.angle_proxy( i_seqs=[6, 12, 9], angle_ideal=0, weight=1 ) angle_proxies.append(a) # a3 a = geometry_restraints.angle_proxy( i_seqs=[12, 9, 11], angle_ideal=0, weight=1 ) angle_proxies.append(a) # compute dihedral #dihedral = geometry_restraints.dihedral( # sites_cart=sites_cart, # proxy=dihedral_proxies[0]) # Shows real dihedral value #print dihedral.angle_model, dihedral.delta cfd_list = [] cfd = conformation_dependent_restraints.conformation_dependent_restraints( residue_name='GLY', next_residue_name='PHE', conformation_proxies=None, i_phi_proxy=None, # index into dihedral_proxies i_psi_proxy=0, i_dynamic_angles=[None, None, 0, None, None, None, 1], # indexes into angles in angle_proxies i_dynamic_dihedrals=None ) cfd_list.append(cfd) cfd = conformation_dependent_restraints.conformation_dependent_restraints( residue_name='PHE', next_residue_name='LEU', conformation_proxies=None, i_phi_proxy=1, # index into dihedral_proxies i_psi_proxy=2, i_dynamic_angles=[2, None, 3, None, None, None, 4], # indexes into angles in angle_proxies i_dynamic_dihedrals=None ) cfd_list.append(cfd) cfd = conformation_dependent_restraints.conformation_dependent_restraints( residue_name='LEU', next_residue_name=None, conformation_proxies=None, i_phi_proxy=3, # index into dihedral_proxies i_psi_proxy=None, i_dynamic_angles=[5, None, 6, None, None, None, None], # indexes into angles in angle_proxies i_dynamic_dihedrals=None ) cfd_list.append(cfd) for x in range(1, 4): print print 'Starting cycle', x print for cfd in cfd_list: cfd.update_restraints(sites_cart, dihedral_proxies, angle_proxies)
def exercise_geometry_restraints_as_cif(): quartz = xray.structure(crystal_symmetry=crystal.symmetry( (5.01, 5.01, 5.47, 90, 90, 120), "P6222"), scatterers=flex.xray_scatterer([ xray.scatterer("Si", (1 / 2., 1 / 2., 1 / 3.)), xray.scatterer("O", (0.197, -0.197, 0.83333)) ])) bond_proxies = geometry_restraints.shared_bond_simple_proxy(( geometry_restraints.bond_simple_proxy( i_seqs=[0, 1], rt_mx_ji=sgtbx.rt_mx("x-y,x,z-2/3"), distance_ideal=1.6, weight=3.2), geometry_restraints.bond_simple_proxy(i_seqs=[0, 1], distance_ideal=1.7, weight=1.8), )) dihedral_proxies = geometry_restraints.shared_dihedral_proxy(( geometry_restraints.dihedral_proxy( i_seqs=[1, 0, 1, 0], sym_ops=(sgtbx.rt_mx("1+y,1-x+y, z-1/3"), sgtbx.rt_mx(), sgtbx.rt_mx("x-y,x,z-2/3"), sgtbx.rt_mx("1-x,y-x,1/3-z")), angle_ideal=-30, weight=2), geometry_restraints.dihedral_proxy( i_seqs=[1, 0, 1, 0], sym_ops=(sgtbx.rt_mx("1+y,1-x+y, z-1/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-y,x-y,z-1/3"), sgtbx.rt_mx("x-y,x,1/3+z")), angle_ideal=90, weight=3), )) angle_proxies = geometry_restraints.shared_angle_proxy(( geometry_restraints.angle_proxy(i_seqs=[1, 0, 1], sym_ops=(sgtbx.rt_mx("x-y,x,z-2/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-y,x-y,z-1/3")), angle_ideal=103, weight=2), geometry_restraints.angle_proxy( i_seqs=[1, 0, 1], sym_ops=(sgtbx.rt_mx("y+1,-x+y+1,z-1/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-y,x-y,z-1/3")), angle_ideal=110, weight=5), geometry_restraints.angle_proxy(i_seqs=[0, 1, 0], sym_ops=(sgtbx.rt_mx("y,-x+y,z+2/3"), sgtbx.rt_mx(), sgtbx.rt_mx("-x+y,-x,z+1/3")), angle_ideal=150, weight=5), )) bond_similarity_proxies = geometry_restraints.shared_bond_similarity_proxy( (geometry_restraints.bond_similarity_proxy( i_seqs=[(0, 1), (0, 1), (0, 1)], sym_ops=(sgtbx.rt_mx("x-y,x,z-2/3"), sgtbx.rt_mx("-y,x-y,z-1/3"), sgtbx.rt_mx("y+1,-x+y+1,z-1/3")), weights=(1, 1, 1)), )) cif_block = iotbx.cif.model.block() iotbx.cif.restraints.add_to_cif_block( cif_block, quartz, bond_proxies=bond_proxies, angle_proxies=angle_proxies, dihedral_proxies=dihedral_proxies, bond_similarity_proxies=bond_similarity_proxies) s = StringIO() cif_block.show(out=s) assert not show_diff( s.getvalue(), """\ loop_ _restr_distance_atom_site_label_1 _restr_distance_atom_site_label_2 _restr_distance_site_symmetry_2 _restr_distance_target _restr_distance_target_weight_param _restr_distance_diff Si O 2_554 1.6000 0.5590 -0.0160 Si O 1 1.7000 0.7454 -2.3838 loop_ _restr_angle_atom_site_label_1 _restr_angle_atom_site_label_2 _restr_angle_atom_site_label_3 _restr_angle_site_symmetry_1 _restr_angle_site_symmetry_2 _restr_angle_site_symmetry_3 _restr_angle_target _restr_angle_target_weight_param _restr_angle_diff O Si O 2_554 1 4_554 103.0000 0.7071 1.6926 O Si O 3_664 1 4_554 110.0000 0.4472 -1.3127 Si O Si 3 1 5 150.0000 0.4472 3.0700 loop_ _restr_torsion_atom_site_label_1 _restr_torsion_atom_site_label_2 _restr_torsion_atom_site_label_3 _restr_torsion_atom_site_label_4 _restr_torsion_site_symmetry_1 _restr_torsion_site_symmetry_2 _restr_torsion_site_symmetry_3 _restr_torsion_site_symmetry_4 _restr_torsion_angle_target _restr_torsion_weight_param _restr_torsion_diff O Si O Si 3_664 1 2_554 7_655 -30.0000 0.7071 6.9078 O Si O Si 3_664 1 4_554 2 90.0000 0.5774 11.7036 loop_ _restr_equal_distance_class_class_id _restr_equal_distance_class_target_weight_param _restr_equal_distance_class_average _restr_equal_distance_class_esd _restr_equal_distance_class_diff_max 1 1.0000 1.6160 0.0000 0.0000 loop_ _restr_equal_distance_atom_site_label_1 _restr_equal_distance_atom_site_label_2 _restr_equal_distance_site_symmetry_2 _restr_equal_distance_class_id Si O 2_554 1 Si O 4_554 1 Si O 3_664 1 """)
def _apply_link_using_proxies( link, atom_group1, atom_group2, bond_params_table, bond_asu_table, geometry_proxy_registries, # distance, rt_mx_ji, origin_id=None, ): assert origin_id ###################################### def _get_restraint_i_seqs( atom_group1, atom_group2, restraint, ): i_seqs = [] keys = restraint.cif_keywords() if "value_dist" in keys: attrs = [ "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", ] elif "period" in keys: attrs = [ "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", "atom_4_comp_id", "atom_id_4", ] elif "value_angle" in keys: attrs = [ "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", ] elif "volume_sign" in keys: attrs = [ "atom_centre_comp_id", "atom_id_centre", "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", ] elif "plane_id" in keys: attrs = [ "atom_comp_id", "atom_id", ] else: assert 0 for i, attr in enumerate(attrs): if i % 2: # name name = getattr(restraint, attr) for atom in atoms: # uses names to confirm link if atom.name.strip() == name.strip(): i_seqs.append(atom.i_seq) break else: # name not found, could be hydrogen or ... return None else: # atoms if getattr(restraint, attr) == 1: atoms = atom_group1.atoms() else: atoms = atom_group2.atoms() return i_seqs ############### def _check_i_seqs(atom_group1, atom_group2, i_seqs): atoms = [] for i_seq in i_seqs: for atom in list(atom_group1.atoms()) + list(atom_group2.atoms()): if atom.i_seq == i_seq: atoms.append(atom) break d2 = linking_utils.get_distance2(*atoms) # XXXX needs to be sym aware if d2 > 9: return False return True ############# assert link count = 0 # bond_i_seqs = [] for bond in link.bond_list: i_seqs = _get_restraint_i_seqs( atom_group1, atom_group2, bond, ) if i_seqs is None: continue if not _check_i_seqs(atom_group1, atom_group2, i_seqs): # check distances tmp = atom_group2 atom_group2 = atom_group1 atom_group1 = tmp i_seqs = _get_restraint_i_seqs( atom_group1, atom_group2, bond, ) if i_seqs is None: continue value = "value_dist" assert origin_id proxy = geometry_restraints.bond_simple_proxy( i_seqs=i_seqs, distance_ideal=getattr(bond, value), weight=1 / bond.value_dist_esd**2, origin_id=origin_id, ) bond_params_table.update(i_seq=i_seqs[0], j_seq=i_seqs[1], params=proxy) #if rt_mx_ji is None: continue bond_asu_table.add_pair( i_seq=i_seqs[0], j_seq=i_seqs[1], rt_mx_ji=rt_mx_ji, ) count += 1 bond_i_seqs.append(i_seqs) # for angle in link.angle_list: i_seqs = _get_restraint_i_seqs( atom_group1, atom_group2, angle, ) if i_seqs is None: continue proxy = geometry_restraints.angle_proxy( i_seqs=i_seqs, angle_ideal=angle.value_angle, weight=1 / angle.value_angle_esd**2, origin_id=origin_id, ) geometry_proxy_registries.angle.add_if_not_duplicated(proxy=proxy) # for tor in link.tor_list: i_seqs = _get_restraint_i_seqs( atom_group1, atom_group2, tor, ) if i_seqs is None: continue proxy = geometry_restraints.dihedral_proxy( i_seqs=i_seqs, angle_ideal=tor.value_angle, weight=1 / tor.value_angle_esd**2, periodicity=tor.period, origin_id=origin_id, ) geometry_proxy_registries.dihedral.add_if_not_duplicated(proxy=proxy) # for chir in link.chir_list: i_seqs = _get_restraint_i_seqs( atom_group1, atom_group2, chir, ) if i_seqs is None: continue volume_ideal = 2.4 if chir.volume_sign[:4].lower() == "nega": volume_ideal = -2.4 elif chir.volume_sign[:4].lower() == "zero": volume_ideal = 0. both_signs = False if chir.volume_sign == 'both': both_signs = True proxy = geometry_restraints.chirality_proxy( i_seqs=i_seqs, volume_ideal=volume_ideal, both_signs=both_signs, weight=25., origin_id=origin_id, ) geometry_proxy_registries.chirality.add_if_not_duplicated(proxy=proxy) # planes = {} weights = {} for plane in link.plane_list: i_seqs = _get_restraint_i_seqs( atom_group1, atom_group2, plane, ) if i_seqs is None: continue planes.setdefault(plane.plane_id, []) planes[plane.plane_id] += i_seqs weights.setdefault(plane.plane_id, []) weights[plane.plane_id].append(1 / plane.dist_esd**2) if planes: for plane_id in planes: if len(planes[plane_id]) < 4: continue proxy = geometry_restraints.planarity_proxy( i_seqs=planes[plane_id], weights=weights[plane_id], origin_id=origin_id, ) geometry_proxy_registries.planarity.add_if_not_duplicated( proxy=proxy) return count, bond_i_seqs
def exercise(verbose=0): distance_ideal = 1.8 default_vdw_distance = 3.6 vdw_1_4_factor = 3.5/3.6 sites_cart_manual = flex.vec3_double([ (1,3,0), (2,3,0), (3,2,0), (3,1,0), (4,1,0), (3,4,0), (4,3,0), (5,3,0), (6,2,0), (7,2,0), (8,3,0), (7,4,0), (6,4,0), (7,5,0), (6,6,0), (8,6,0)]) bond_proxies = geometry_restraints.bond_sorted_asu_proxies(asu_mappings=None) for i_seqs in [(0,1),(1,2),(2,3),(3,4),(1,5),(2,6),(5,6), (6,7),(7,8),(8,9),(9,10),(10,11),(11,12), (12,7),(11,13),(13,14),(14,15),(15,13)]: bond_proxies.process(geometry_restraints.bond_simple_proxy( i_seqs=i_seqs, distance_ideal=distance_ideal, weight=100)) angle_proxies = geometry_restraints.shared_angle_proxy() for i_seqs,angle_ideal in [[(0,1,2),135], [(0,1,5),135], [(1,2,3),135], [(3,2,6),135], [(2,3,4),120], [(1,2,6),90], [(2,6,5),90], [(6,5,1),90], [(5,1,2),90], [(2,6,7),135], [(5,6,7),135], [(6,7,8),120], [(6,7,12),120], [(7,8,9),120], [(8,9,10),120], [(9,10,11),120], [(10,11,12),120], [(11,12,7),120], [(12,7,8),120], [(10,11,13),120], [(12,11,13),120], [(11,13,15),150], [(11,13,14),150], [(13,15,14),60], [(15,14,13),60], [(14,13,15),60]]: angle_proxies.append(geometry_restraints.angle_proxy( i_seqs=i_seqs, angle_ideal=angle_ideal, weight=1)) if (0 or verbose): dump_pdb(file_name="manual.pdb", sites_cart=sites_cart_manual) for traditional_convergence_test in [True,False]: for sites_cart_selection in [True, False]: sites_cart = sites_cart_manual.deep_copy() if sites_cart_selection: sites_cart_selection = flex.bool(sites_cart.size(), True) sites_cart_selection[1] = False assert bond_proxies.asu.size() == 0 bond_params_table = geometry_restraints.extract_bond_params( n_seq=sites_cart.size(), bond_simple_proxies=bond_proxies.simple) manager = geometry_restraints.manager.manager( bond_params_table=bond_params_table, angle_proxies=angle_proxies) minimized = geometry_restraints.lbfgs.lbfgs( sites_cart=sites_cart, geometry_restraints_manager=manager, lbfgs_termination_params=scitbx.lbfgs.termination_parameters( traditional_convergence_test=traditional_convergence_test, drop_convergence_test_max_drop_eps=1.e-20, drop_convergence_test_iteration_coefficient=1, max_iterations=1000), sites_cart_selection=sites_cart_selection, ) assert minimized.minimizer.iter() > 100 sites_cart_minimized_1 = sites_cart.deep_copy() if (0 or verbose): dump_pdb( file_name="minimized_1.pdb", sites_cart=sites_cart_minimized_1) bond_deltas = geometry_restraints.bond_deltas( sites_cart=sites_cart_minimized_1, proxies=bond_proxies.simple) angle_deltas = geometry_restraints.angle_deltas( sites_cart=sites_cart_minimized_1, proxies=angle_proxies) if (0 or verbose): for proxy,delta in zip(bond_proxies.simple, bond_deltas): print "bond:", proxy.i_seqs, delta for proxy,delta in zip(angle_proxies, angle_deltas): print "angle:", proxy.i_seqs, delta assert is_below_limit( value=flex.max(flex.abs(bond_deltas)), limit=0, eps=1.e-6) assert is_below_limit( value=flex.max(flex.abs(angle_deltas)), limit=0, eps=2.e-6) sites_cart += matrix.col((1,1,0)) - matrix.col(sites_cart.min()) unit_cell_lengths = list( matrix.col(sites_cart.max()) + matrix.col((1,-1.2,4))) unit_cell_lengths[1] *= 2 unit_cell_lengths[2] *= 2 xray_structure = xray.structure( crystal_symmetry=crystal.symmetry( unit_cell=unit_cell_lengths, space_group_symbol="P112")) for serial,site in zip(count(1), sites_cart): xray_structure.add_scatterer(xray.scatterer( label="C%02d"%serial, site=xray_structure.unit_cell().fractionalize(site))) if (0 or verbose): xray_structure.show_summary().show_scatterers() p1_structure = (xray_structure .apply_shift((-.5,-.5,0)) .expand_to_p1() .apply_shift((.5,.5,0))) for shift in [(1,0,0), (0,1,0), (0,0,1)]: p1_structure.add_scatterers(p1_structure.apply_shift(shift).scatterers()) if (0 or verbose): open("p1_structure.pdb", "w").write(p1_structure.as_pdb_file()) nonbonded_cutoff = 6.5 asu_mappings = xray_structure.asu_mappings( buffer_thickness=nonbonded_cutoff) bond_asu_table = crystal.pair_asu_table(asu_mappings=asu_mappings) geometry_restraints.add_pairs(bond_asu_table, bond_proxies.simple) shell_asu_tables = crystal.coordination_sequences.shell_asu_tables( pair_asu_table=bond_asu_table, max_shell=3) shell_sym_tables = [shell_asu_table.extract_pair_sym_table() for shell_asu_table in shell_asu_tables] bond_params_table = geometry_restraints.extract_bond_params( n_seq=sites_cart.size(), bond_simple_proxies=bond_proxies.simple) atom_energy_types = flex.std_string(sites_cart.size(), "Default") nonbonded_params = geometry_restraints.nonbonded_params( factor_1_4_interactions=vdw_1_4_factor, const_shrink_1_4_interactions=0, default_distance=default_vdw_distance) nonbonded_params.distance_table.setdefault( "Default")["Default"] = default_vdw_distance pair_proxies = geometry_restraints.pair_proxies( bond_params_table=bond_params_table, shell_asu_tables=shell_asu_tables, model_indices=None, conformer_indices=None, nonbonded_params=nonbonded_params, nonbonded_types=atom_energy_types, nonbonded_distance_cutoff_plus_buffer=nonbonded_cutoff) if (0 or verbose): print "pair_proxies.bond_proxies.n_total():", \ pair_proxies.bond_proxies.n_total(), print "simple:", pair_proxies.bond_proxies.simple.size(), print "sym:", pair_proxies.bond_proxies.asu.size() print "pair_proxies.nonbonded_proxies.n_total():", \ pair_proxies.nonbonded_proxies.n_total(), print "simple:", pair_proxies.nonbonded_proxies.simple.size(), print "sym:", pair_proxies.nonbonded_proxies.asu.size() print "min_distance_nonbonded: %.2f" % flex.min( geometry_restraints.nonbonded_deltas( sites_cart=sites_cart, sorted_asu_proxies=pair_proxies.nonbonded_proxies)) s = StringIO() pair_proxies.bond_proxies.show_histogram_of_model_distances( sites_cart=sites_cart, f=s, prefix="[]") assert s.getvalue().splitlines()[0] == "[]Histogram of bond lengths:" assert s.getvalue().splitlines()[5].startswith("[] 1.80 - 1.80:") s = StringIO() pair_proxies.bond_proxies.show_histogram_of_deltas( sites_cart=sites_cart, f=s, prefix="][") assert s.getvalue().splitlines()[0] == "][Histogram of bond deltas:" assert s.getvalue().splitlines()[5].startswith("][ 0.000 - 0.000:") s = StringIO() pair_proxies.bond_proxies.show_sorted( by_value="residual", sites_cart=sites_cart, max_items=3, f=s, prefix=":;") l = s.getvalue().splitlines() assert l[0] == ":;Bond restraints: 18" assert l[1] == ":;Sorted by residual:" assert l[2].startswith(":;bond ") assert l[3].startswith(":; ") assert l[4] == ":; ideal model delta sigma weight residual" for i in [5,-2]: assert l[i].startswith(":; 1.800 1.800 ") assert l[-1] == ":;... (remaining 15 not shown)" s = StringIO() pair_proxies.nonbonded_proxies.show_histogram_of_model_distances( sites_cart=sites_cart, f=s, prefix="]^") assert not show_diff(s.getvalue(), """\ ]^Histogram of nonbonded interaction distances: ]^ 2.16 - 3.03: 3 ]^ 3.03 - 3.89: 12 ]^ 3.89 - 4.75: 28 ]^ 4.75 - 5.61: 44 ]^ 5.61 - 6.48: 54 """) s = StringIO() pair_proxies.nonbonded_proxies.show_sorted( by_value="delta", sites_cart=sites_cart, max_items=7, f=s, prefix=">,") assert not show_diff(s.getvalue(), """\ >,Nonbonded interactions: 141 >,Sorted by model distance: >,nonbonded 15 >, 15 >, model vdw sym.op. >, 2.164 3.600 -x+2,-y+1,z ... >,nonbonded 4 >, 8 >, model vdw >, 3.414 3.600 >,... (remaining 134 not shown) """, selections=[range(6), range(-5,0)]) vdw_1_sticks = [] vdw_2_sticks = [] for proxy in pair_proxies.nonbonded_proxies.simple: if (proxy.vdw_distance == default_vdw_distance): vdw_1_sticks.append(pml_stick( begin=sites_cart[proxy.i_seqs[0]], end=sites_cart[proxy.i_seqs[1]])) else: vdw_2_sticks.append(pml_stick( begin=sites_cart[proxy.i_seqs[0]], end=sites_cart[proxy.i_seqs[1]])) mps = asu_mappings.mappings() for proxy in pair_proxies.nonbonded_proxies.asu: if (proxy.vdw_distance == default_vdw_distance): vdw_1_sticks.append(pml_stick( begin=mps[proxy.i_seq][0].mapped_site(), end=mps[proxy.j_seq][proxy.j_sym].mapped_site())) else: vdw_2_sticks.append(pml_stick( begin=mps[proxy.i_seq][0].mapped_site(), end=mps[proxy.j_seq][proxy.j_sym].mapped_site())) if (0 or verbose): pml_write(f=open("vdw_1.pml", "w"), label="vdw_1", sticks=vdw_1_sticks) pml_write(f=open("vdw_2.pml", "w"), label="vdw_2", sticks=vdw_2_sticks) # i_pdb = count(2) for use_crystal_symmetry in [False, True]: if (not use_crystal_symmetry): crystal_symmetry = None site_symmetry_table = None else: crystal_symmetry = xray_structure site_symmetry_table = xray_structure.site_symmetry_table() for sites_cart in [sites_cart_manual.deep_copy(), sites_cart_minimized_1.deep_copy()]: manager = geometry_restraints.manager.manager( crystal_symmetry=crystal_symmetry, site_symmetry_table=site_symmetry_table, nonbonded_params=nonbonded_params, nonbonded_types=atom_energy_types, nonbonded_function=geometry_restraints.prolsq_repulsion_function(), bond_params_table=bond_params_table, shell_sym_tables=shell_sym_tables, nonbonded_distance_cutoff=nonbonded_cutoff, nonbonded_buffer=1, angle_proxies=angle_proxies, plain_pairs_radius=5) manager = manager.select(selection=flex.bool(sites_cart.size(), True)) manager = manager.select( iselection=flex.size_t_range(stop=sites_cart.size())) pair_proxies = manager.pair_proxies(sites_cart=sites_cart) minimized = geometry_restraints.lbfgs.lbfgs( sites_cart=sites_cart, geometry_restraints_manager=manager, lbfgs_termination_params=scitbx.lbfgs.termination_parameters( max_iterations=1000)) if (0 or verbose): minimized.final_target_result.show() print "number of function evaluations:", minimized.minimizer.nfun() print "n_updates_pair_proxies:", manager.n_updates_pair_proxies if (not use_crystal_symmetry): assert minimized.final_target_result.bond_residual_sum < 1.e-3 assert minimized.final_target_result.nonbonded_residual_sum < 0.1 else: assert minimized.final_target_result.bond_residual_sum < 1.e-2 assert minimized.final_target_result.nonbonded_residual_sum < 0.1 assert minimized.final_target_result.angle_residual_sum < 1.e-3 if (0 or verbose): pdb_file_name = "minimized_%d.pdb" % i_pdb.next() print "Writing file:", pdb_file_name dump_pdb(file_name=pdb_file_name, sites_cart=sites_cart) if (manager.site_symmetry_table is None): additional_site_symmetry_table = None else: additional_site_symmetry_table = sgtbx.site_symmetry_table() assert manager.new_including_isolated_sites( n_additional_sites=0, site_symmetry_table=additional_site_symmetry_table, nonbonded_types=flex.std_string()).plain_pairs_radius \ == manager.plain_pairs_radius if (crystal_symmetry is not None): assert len(manager.plain_pair_sym_table) == 16 if (0 or verbose): manager.plain_pair_sym_table.show() # xray_structure.set_u_iso(values=flex.double([ 0.77599982480241358, 0.38745781137212021, 0.20667558236418682, 0.99759840171302094, 0.8917287406687805, 0.64780251325379845, 0.24878590382983534, 0.59480621182194615, 0.58695637792905142, 0.33997130213653637, 0.51258699130743735, 0.79760289141276675, 0.39996577657875021, 0.4329328819341467, 0.70422156561726479, 0.87260110626999332])) class parameters: pass parameters.sphere_radius = 5 parameters.distance_power = 0.7 parameters.average_power = 0.9 parameters.wilson_b_weight = 1.3952 parameters.wilson_b_weight_auto = False adp_energies = adp_restraints.energies_iso( geometry_restraints_manager=manager, xray_structure=xray_structure, parameters=parameters, wilson_b=None, use_hd=False, use_u_local_only = False, compute_gradients=False, gradients=None, normalization=False, collect=True) assert adp_energies.number_of_restraints == 69 assert approx_equal(adp_energies.residual_sum, 6.24865382467) assert adp_energies.gradients is None assert adp_energies.u_i.size() == adp_energies.number_of_restraints assert adp_energies.u_j.size() == adp_energies.number_of_restraints assert adp_energies.r_ij.size() == adp_energies.number_of_restraints for wilson_b in [None, 10, 100]: finite_difference_gradients = flex.double() eps = 1.e-6 for i_scatterer in xrange(xray_structure.scatterers().size()): rs = [] for signed_eps in [eps, -eps]: xray_structure_eps = xray_structure.deep_copy_scatterers() xray_structure_eps.scatterers()[i_scatterer].u_iso += signed_eps adp_energies = adp_restraints.energies_iso( geometry_restraints_manager=manager, xray_structure=xray_structure_eps, parameters=parameters, wilson_b=wilson_b, use_u_local_only = False, use_hd=False, compute_gradients=True, gradients=None, normalization=False, collect=False) rs.append(adp_energies.residual_sum) assert adp_energies.gradients.size() \ == xray_structure.scatterers().size() assert adp_energies.u_i == None assert adp_energies.u_j == None assert adp_energies.r_ij == None finite_difference_gradients.append((rs[0]-rs[1])/(2*eps)) sel = flex.bool(xray_structure.scatterers().size(), True) xray_structure.scatterers().flags_set_grad_u_iso(sel.iselection()) adp_energies = adp_restraints.energies_iso( geometry_restraints_manager=manager, xray_structure=xray_structure, parameters=parameters, wilson_b=wilson_b, use_u_local_only = False, use_hd=False, compute_gradients=True, gradients=None, normalization=False, collect=False) assert approx_equal(adp_energies.gradients, finite_difference_gradients) print "OK"