Skip to content

Skeleton

The skeleton of a multidentate ligand is the part that connects donor atoms to each other. Intuitively, it’s the “cage-defining” core of the ligand, while everything else is substituent decoration.

Skeleton definition

Definition (graph view)

Given a molecular graph and a set of donor atoms:

  • Compute the shortest paths between every donor pair.
  • Take the union of all atoms that appear on those paths.
  • The skeleton is: donors + all connector atoms on shortest paths.

When a donor pair has multiple shortest paths (common in rings), cTopo keeps the union of those paths so the skeleton remains deterministic.

Why shortest paths?

Shortest paths are a simple, reproducible way to define “minimal connectors” without introducing chemistry-specific heuristics for ring selection, aromaticity, etc. The skeleton is not a “scaffold” in the medicinal chemistry sense — it is explicitly donor-centric.

Working with skeletons

from ctopo import ligand_from_smiles, get_ligands_skeleton

lig = ligand_from_smiles("[NH2:1]CC[NH:2]CC[NH2:3]")
G_skel = get_ligands_skeleton(lig.G)

v = lig.visualize_skeleton()
print(v.smiles)

Skeleton in complexes

For Complex objects, skeleton extraction is done with metal atoms removed from the graph. This avoids a trivial “path through the metal” for any donor pair.

Practical notes

  • The skeleton depends on which atoms are donors. Garbage-in → garbage-out.
  • For very flexible ligands, the graph skeleton is a topological summary (it does not encode 3D conformations).
  • Bridging ligands in complexes can be tricky when extracting ligands by “removing metals” (see fragments).