Пример #1
0
 def _add_chiral(i_seqs, geometry_proxy_registries, value, esd, both_signs=False):
   proxy = geometry_restraints.chirality_proxy(
     i_seqs=i_seqs,
     volume_ideal=value,
     both_signs=both_signs,
     weight=1/esd**2,
     )
   geometry_proxy_registries.chirality.add_if_not_duplicated(proxy=proxy)
Пример #2
0
 def _add_chiral(i_seqs, geometry_proxy_registries, value, esd, both_signs=False):
   proxy = geometry_restraints.chirality_proxy(
     i_seqs=i_seqs,
     volume_ideal=value,
     both_signs=both_signs,
     weight=1/esd**2,
     )
   geometry_proxy_registries.chirality.add_if_not_duplicated(proxy=proxy)
Пример #3
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
Пример #4
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
Пример #5
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),
    ))
    chirality_proxies = geometry_restraints.shared_chirality_proxy((
        geometry_restraints.chirality_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")),
            volume_ideal=1.2,
            both_signs=False,
            weight=2),
        geometry_restraints.chirality_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")),
            volume_ideal=1.2,
            both_signs=True,
            weight=2),
    ))
    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,
        chirality_proxies=chirality_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_chirality_atom_site_label_1
  _restr_chirality_atom_site_label_2
  _restr_chirality_atom_site_label_3
  _restr_chirality_atom_site_label_4
  _restr_chirality_site_symmetry_1
  _restr_chirality_site_symmetry_2
  _restr_chirality_site_symmetry_3
  _restr_chirality_site_symmetry_4
  _restr_chirality_volume_target
  _restr_chirality_weight_param
  _restr_chirality_diff
  O  Si  O  Si  3_664  1  2_554  7_655  1.2000  0.7071   2.4415
  O  Si  O  Si  3_664  1  2_554  7_655  1.2000  0.7071  -0.0415

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

""")