schrodinger.structutils.rings module

Tools for detecting and characterizing rings in Structures.

schrodinger.structutils.rings.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.

  • st (Structure) – Molecule to identify ring systems in

  • want_spiro (bool) – True if a ring system can be defined by just a common atom (default False)

  • sort (bool) – True if ring systems should be sorted by minimum element


List of the different ring systems defined by the index of the atoms, sorted by the minimum element in each set.

Return type

tuple of tuple of int


Find the set of all atoms which are in some ring


st (Structure) – Molecule to identify ring systems in


tuple of atoms ids which are in some ring

Return type

tuple of int

schrodinger.structutils.rings.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.

  • st (Structure) – Structure holding rings.

  • sort (bool) – Deprecated and unused

Return type



Each value is a list corresponding to the atom indices of a ring.

schrodinger.structutils.rings.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.


# 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
    # skip ring bonds. Use a set for comparison:
    if {bond.atom1.index, bond.atom2.index} in ring_bonds:

max_size (int or None) – if supplied, only include bonds that are in rings of size max_size or smaller

Return type

set of frozenset of int


set of pairs of atom indices that comprise a ring bond.

schrodinger.structutils.rings.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.

  • max_ring_size (int) – only include rings that are of max_ring_size or smaller. Default is max_ring_size = 50.

  • max_seconds (int) – time in seconds to run find_all_rings() before timing out. Throws a RuntimeError if max_seconds is exceeded.

Return type

tuple of tuple of int


set of all simple rings in st of size less than or equal to max_ring_size