Skip to content

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:

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

  2. The name. GL1X and the file give a name ("PROGESTERONE", "2-acetamido-2-deoxy-beta-D-glucopyranose"), which OPSIN can turn into a structure.

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

Source: tools/ligands/FORECAST.md in the server package · updated