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.
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).