示例#1
0
def get_bp_plan_proxies(a1, a2, base_pair, grm, mon_lib_srv, plane_cache):
    result_plan_p = []
    result_parr_p = []
    seqs = get_plane_i_seqs_from_residues(a1.parent(), a2.parent(), grm,
                                          mon_lib_srv, plane_cache)
    for i_seqs, j_seqs in seqs:
        if len(i_seqs) > 2 and len(j_seqs) > 2:
            if base_pair.restrain_parallelity:
                if base_pair.parallelity_sigma < 1e-5:
                    raise Sorry(
                        "Sigma for parallelity basepair restraints should be > 1e-5"
                    )
                proxy = geometry_restraints.parallelity_proxy(
                    i_seqs=flex.size_t(i_seqs),
                    j_seqs=flex.size_t(j_seqs),
                    weight=1 / (base_pair.parallelity_sigma**2),
                    target_angle_deg=0,
                    slack=0,
                    top_out=False,
                    limit=1,
                    origin_id=origin_ids.get_origin_id('hydrogen bonds'))
                result_parr_p.append(proxy)
            if base_pair.restrain_planarity:
                if base_pair.planarity_sigma < 1e-5:
                    raise Sorry(
                        "Sigma for planarity basepair restraints should be > 1e-5"
                    )
                w = 1. / (base_pair.planarity_sigma**2)
                proxy = geometry_restraints.planarity_proxy(
                    i_seqs=flex.size_t(i_seqs + j_seqs),
                    weights=[w] * len(i_seqs + j_seqs),
                    origin_id=origin_ids.get_origin_id('hydrogen bonds'))
                result_plan_p.append(proxy)
    return result_plan_p, result_parr_p
示例#2
0
def get_basepair_plane_proxies(pdb_hierarchy, bp_phil_params, grm, mon_lib_srv,
                               plane_cache):
    assert pdb_hierarchy is not None
    result_planarities = []
    result_parallelities = []
    if len(bp_phil_params) < 1:
        return result_planarities, result_parallelities
    if grm is None:
        return result_planarities, result_parallelities
    selection_cache = pdb_hierarchy.atom_selection_cache()
    pdb_atoms = pdb_hierarchy.atoms()
    for base_pair in bp_phil_params:
        if (base_pair.base1 is not None and base_pair.base2 is not None
                and base_pair.enabled):
            selected_atoms_1 = selection_cache.iselection(base_pair.base1)
            selected_atoms_2 = selection_cache.iselection(base_pair.base2)
            if len(selected_atoms_1) == 0:
                raise Sorry(
                    "Selection %s in base_pair retusulted in 0 atoms." %
                    (base_pair.base1))
            if len(selected_atoms_2) == 0:
                raise Sorry(
                    "Selection %s in base_pair retusulted in 0 atoms." %
                    (base_pair.base2))
            a1 = pdb_atoms[selected_atoms_1[0]]
            a2 = pdb_atoms[selected_atoms_2[0]]
            r1 = a1.parent()
            r2 = a2.parent()
            seqs = get_plane_i_seqs_from_residues(r1, r2, grm, mon_lib_srv,
                                                  plane_cache)
            for i_seqs, j_seqs in seqs:
                if len(i_seqs) > 2 and len(j_seqs) > 2:
                    if base_pair.restrain_parallelity:
                        if base_pair.parallelity_sigma < 1e-5:
                            raise Sorry(
                                "Sigma for parallelity basepair restraints should be > 1e-5"
                            )
                        proxy = geometry_restraints.parallelity_proxy(
                            i_seqs=flex.size_t(i_seqs),
                            j_seqs=flex.size_t(j_seqs),
                            weight=1 / (base_pair.parallelity_sigma**2),
                            target_angle_deg=0,
                            slack=0,
                            top_out=False,
                            limit=1,
                            origin_id=1)
                        result_parallelities.append(proxy)
                    if base_pair.restrain_planarity:
                        if base_pair.planarity_sigma < 1e-5:
                            raise Sorry(
                                "Sigma for planarity basepair restraints should be > 1e-5"
                            )
                        w = 1. / (base_pair.planarity_sigma**2)
                        proxy = geometry_restraints.planarity_proxy(
                            i_seqs=flex.size_t(i_seqs + j_seqs),
                            weights=[w] * len(i_seqs + j_seqs),
                            origin_id=1)
                        result_planarities.append(proxy)
    return result_planarities, result_parallelities
def get_basepair_plane_proxies(
    pdb_hierarchy,
    bp_phil_params,
    grm,
    mon_lib_srv,
    plane_cache):
  assert pdb_hierarchy is not None
  result_planarities = []
  result_parallelities = []
  if len(bp_phil_params) < 1:
    return result_planarities, result_parallelities
  if grm is None:
    return result_planarities, result_parallelities
  selection_cache = pdb_hierarchy.atom_selection_cache()
  pdb_atoms = pdb_hierarchy.atoms()
  for base_pair in bp_phil_params:
    if (base_pair.base1 is not None and base_pair.base2 is not None
        and base_pair.enabled):
      selected_atoms_1 = selection_cache.iselection(base_pair.base1)
      selected_atoms_2 = selection_cache.iselection(base_pair.base2)
      if len(selected_atoms_1) == 0:
        raise Sorry("Selection %s in base_pair retusulted in 0 atoms." % (
            base_pair.base1))
      if len(selected_atoms_2) == 0:
        raise Sorry("Selection %s in base_pair retusulted in 0 atoms." % (
            base_pair.base2))
      a1 = pdb_atoms[selected_atoms_1[0]]
      a2 = pdb_atoms[selected_atoms_2[0]]
      r1 = a1.parent()
      r2 = a2.parent()
      seqs = get_plane_i_seqs_from_residues(r1, r2, grm,mon_lib_srv, plane_cache)
      for i_seqs, j_seqs in seqs:
        if len(i_seqs) > 2 and len(j_seqs) > 2:
          if base_pair.restrain_parallelity:
            if base_pair.parallelity_sigma < 1e-5:
              raise Sorry("Sigma for parallelity basepair restraints should be > 1e-5")
            proxy=geometry_restraints.parallelity_proxy(
              i_seqs=flex.size_t(i_seqs),
              j_seqs=flex.size_t(j_seqs),
              weight=1/(base_pair.parallelity_sigma**2),
              target_angle_deg=0,
              slack=0,
              top_out=False,
              limit=1,
              origin_id=1)
            result_parallelities.append(proxy)
          if base_pair.restrain_planarity:
            if base_pair.planarity_sigma < 1e-5:
              raise Sorry("Sigma for planarity basepair restraints should be > 1e-5")
            w = 1./(base_pair.planarity_sigma**2)
            proxy=geometry_restraints.planarity_proxy(
              i_seqs=flex.size_t(i_seqs+j_seqs),
              weights=[w]*len(i_seqs+j_seqs),
              origin_id=1)
            result_planarities.append(proxy)
  return result_planarities, result_parallelities
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
示例#5
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