Пример #1
0
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
Пример #2
0
 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)
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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"
Пример #6
0
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")
Пример #7
0
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
Пример #10
0
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
Пример #17
0
 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))
Пример #19
0
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

""")
Пример #20
0
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)
Пример #22
0
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

""")
Пример #23
0
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"