Forecast: written 2026-10-16 18:00 CEST, before any ligand was perceived or matched
Question: a ligand in a protein structure arrives as heavy atoms with coordinates and a three-letter code, usually without hydrogens and without bond orders. Can the app turn that into a SMILES string (the input of every other page) and into a molecule the orbital layer can compute where it sits, without a lookup table it cannot reach?
Three routes to a SMILES are compared. Each is checked against the atoms actually in the file:
The dictionary. The PDB's Chemical Component Dictionary (CCD) holds a reference SMILES for every code. The browser can fetch it from the RCSB; the server may not reach it.
The name. GL1X and the file give a name ("PROGESTERONE", "2-acetamido-2-deoxy-beta-D-glucopyranose"), which OPSIN can turn into a structure.
The atoms themselves. Bonds are found from interatomic distances, and bond orders from the geometry:
- bond lengths;
- angles: 120° for a planar sp² atom, 109.5° for tetrahedral sp³;
- flat rings.
Then one double bond is given to every atom that needs one, by matching, the way a Kekulé structure is found. This is the old problem of the Cambridge Structural Database (Baber & Hodgkin, 1992) and of every PDB reader since.
The test. Ligands from deposited X-ray, NMR and cryo-EM structures in the test data of open-source libraries are compared with their CCD definitions (tests/data/ligands/reference.json):
- XK2 (HIV protease inhibitor), progesterone, cholesterol, a bile-acid derivative and palmitate;
- SAH, ADP and ATPγS, ZM241385 and two benzamidine-like fragments;
- a bromothiophene, NAG and mannose;
- heme;
- the usual buffer molecules.
What counts as the same molecule. The same heavy-atom graph, and the same number of hydrogens on every heavy atom once both are neutralised (acetate and acetic acid count as one). Swaps of symmetry-equivalent atoms are allowed, such as the two oxygens of a carboxyl group. Bond orders then agree up to resonance (Kekulé structures). Protonation at a given pH is a separate step, done afterwards with the app's site pKa model.
Forecasts
L1. Connectivity. Distances alone reproduce the CCD heavy-atom graph of every complete ligand instance. Where they do not, the deposited model has missing or clashing atoms, and the formula check says so.
L2. Bond orders from geometry. By the definition above:
- saturated or simple ligands (glycerol, methanol, DMSO, mercaptoethanol, palmitate, cholesterol, the bile acid, NAG, mannose, progesterone): ≥ 95 % of instances right;
- aromatic and heteroaromatic ligands (XK2, ZM241385, SAH, ADP, ATPγS, the benzamidines, the thiophene, heme): ≥ 75 %;
- over all instances: ≥ 85 %.
L3. Where it fails. The failures will be tautomers that geometry cannot separate:
- the guanidine of GBS, whose three C–N bonds are equally long;
- the amidoxime of ZYB;
- nitrogen in five-membered heteroaromatic rings (which N carries the H).
Phosphates and sulfates will not fail: their P–O and S–O bonds are resonance forms of one structure.
L4. Heme. With the iron left out of the organic graph, the perceived porphyrin has two N⁻ facing the iron and two imine N. It forms one conjugated π system over the macrocycle and both vinyl groups. Formula C₃₄H₃₂N₄O₄²⁻ in the neutral-acid form.
L5. A wrong name. One test file (a molecular-dynamics input) calls p-xylene "TMP", which in the CCD is thymidine 5'-monophosphate. The formula check flags the mismatch, and the geometry route still gives p-xylene.
L6. Speed. Perception and matching of a 50-atom ligand take < 50 ms in Python. The bound ligand with its pocket (side chains within 4.5 Å, ≤ 600 atoms) and its orbital layer take < 1.5 s.
L7. Names. OPSIN reads ≥ 60 % of the CCD names in the test set into the CCD structure. It fails on trivial or descriptive names such as "PROTOPORPHYRIN IX CONTAINING FE" and "PHOSPHOTHIOPHOSPHORIC ACID-ADENYLATE ESTER". This one can only be measured where OPSIN runs, on the server (
tools/ligands/name_benchmark.py).
What would change the plan
- If L2 falls below 70 % overall, the geometry route is shown only as a check, never as the SMILES that is used.
- If L1 fails on complete instances, the distance rule is wrong for some element pair, and the covalent radii need per-pair tolerances.