Source code for schrodinger.structutils.rings
"""
Tools for detecting and characterizing rings in Structures.
"""
from schrodinger import structure
from schrodinger.infra import structure as infrastructure
[docs]def find_ring_systems(st, want_spiro=False, sort=False):
    """
    Find groups of atoms that are in conjoined rings.
    If want_spiro is True, rings are part of the same system if they share any
    atom. If False, rings must share a bond.
    :param st: Molecule to identify ring systems in
    :type st: Structure
    :param want_spiro: True if a ring system can be defined by just a common
                atom (default False)
    :type want_spiro: bool
    :param sort: True if ring systems should be sorted by minimum element
    :type sort: bool
    :return: List of the different ring systems defined by the index of the
                atoms, sorted by the minimum element in each set.
    :rtype: tuple of tuple of int
    """
    ring_systems = infrastructure.find_ring_systems(st, want_spiro)
    if sort:
        return sorted(ring_systems, key=min)
    return ring_systems 
[docs]def find_ring_atoms(st):
    """
    Find the set of all atoms which are in some ring
    :param st: Molecule to identify ring systems in
    :type st: Structure
    :return: tuple of atoms ids which are in some ring
    :rtype: tuple of int
    """
    return infrastructure.find_ring_atoms(st) 
[docs]def find_rings(st, sort=True):
    """
    Return the smallest set of smallest rings (SSSR) in `st`.
    See also the `schrodinger.structure.Structure.find_rings` method and
    the `schrodinger.structure.Structure.ring` iterator. This method may be
    deprecated at some point in favor of those methods.
    The return value is a list of lists of ints. Each list of ints
    corresponds to a ring, and the integer values are the atom indices. Each
    ring is ordered by connectivity.
    :type st: `Structure`
    :param st: Structure holding rings.
    :type sort: bool
    :param sort: Deprecated and unused
    :rtype: list
    :return: Each value is a list corresponding to the atom indices of a ring.
    """
    # Allow for use of integer handles to provide backward compatibility of
    # this function with version 1.25 of this file.
    if not isinstance(st, structure.Structure):
        st = structure.Structure(st)
    return st.find_rings(sort) 
[docs]def find_ring_bonds(st, max_size=None):
    """
    Find all bonds that form the edge of a ring.
    The return uses frozenset to represent each atom pair to allow comparisons
    without worrying about the order of the atoms. If it used a tuple you'd
    need to do both way checks.
    Examples::
        # Operate on each ring bond:
        for atom_index0, atom_index1 in find_ring_bonds(st):
            atom0 = st.atom[atom_index0]
            atom1 = st.atom[atom_index1]
            # Do something with the atoms
        # Operate on each non-ring bond:
        ring_bonds = find_ring_bonds(st)
        for bond in st.bond:
            # skip ring bonds. Use a set for comparison:
            if {bond.atom1.index, bond.atom2.index} in ring_bonds:
                continue
    :type max_size: int or None
    :param max_size: if supplied, only include bonds that are in rings of size
        max_size or smaller
    :rtype: set of frozenset of int
    :return: set of pairs of atom indices that comprise a ring bond.
    """
    return infrastructure.find_ring_bonds(st, max_size or 0) 
[docs]def find_all_rings(st, max_ring_size=50, max_seconds=1):
    """
    Find the set of all simple rings in a given structure. A simple ring is a
    cycle with no repeating atoms.
    :type max_ring_size: int
    :param max_ring_size: only include rings that are of max_ring_size or
        smaller. Default is max_ring_size = 50.
    :type max_seconds: int
    :param max_seconds: time in seconds to run find_all_rings() before timing
        out. Throws a RuntimeError if max_seconds is exceeded.
    :rtype: tuple of tuple of int
    :return: set of all simple rings in `st` of size less than or equal to
        max_ring_size
    """
    return infrastructure.find_all_rings(st, max_ring_size, max_seconds)