Skip to content

Protein sites and GL1X

/sites draws the orbital layer on a site inside a protein: the electron pairs that hold a zinc, the zinc's empty orbitals that accept them, and the π systems of the stretch around it. Every surface lands on the whole protein in Mol*, in the protein's own coordinates.

The protein is never computed whole. A motif is found in the sequence, the matched stretch is cut out, made chemically complete, and given to the same orbital layer as any molecule. So the cost depends on the site, not on the size of the protein: about a second for the 384 atoms of a zinc finger, whether it sits in a 30-residue domain or in a ribosome.

How a site is built

  1. The structure. PDB, PDBx/mmCIF or BinaryCIF, plain, gzip-compressed or base64-wrapped (the form in which MolNFT v2 records keep it on chain). Only the first model and the first alternate location are read. Hydrogens in the file are ignored and rebuilt.

  2. The motif is written in PROSITE syntax (Bairoch 1991):

    • single residues (C), any residue (x), sets ([ST]) and exclusions ({P});
    • repeats x(3) and ranges x(3,5) on any element;
    • the N- and C-terminal anchors < and >;
    • a bare sequence such as QEEY.

    Like GL1X, an occurrence never crosses a chain break (C–N longer than 2 Å), and overlapping occurrences are all listed. Ranges matter for zinc fingers: the user's pattern C-x(2)-C-x(12)-H-x(3)-H misses ADR1, whose histidines are H-x(4)-H; C-x(2,4)-C-x(12)-H-x(3,5)-H finds both.

  3. The cut.

    • "The whole stretch" keeps every residue of the occurrence, backbone included. Where the chain continues, it is capped with the neighbouring residue's own atoms: an acetyl group before and an N-methylamide after. Every peptide bond inside stays an amide.
    • "Ligand side chains" keeps only the residues that hold the metal. Cα is replaced by a hydrogen on the Cβ→Cα line: the link-atom cap of QM/MM (Singh & Kollman 1986; Field, Bash & Karplus 1990).
    • A metal ligand from outside the motif is added. A disulfide partner outside the fragment is capped as SH.
  4. Protonation comes from residue templates at the chosen pH: Asp/Glu −1, Lys/Arg +1, His neutral (Nε2-H), the termini charged. At a metal, a cysteine is a thiolate, and a histidine carries its H on the nitrogen that does not bind. Side chains with atoms missing from the file are kept to Cβ, and the report says so.

  5. The metal.

    • A metal in the file is used where it is.
    • Its ligands are the side-chain donors (Cys Sγ, His Nδ1/Nε2, Asp/Glu O, water O) within 2.9 Å. While there are fewer than four, side-chain donors up to 3.5 Å are counted too and flagged; low resolution often leaves one long.
    • With no metal in the file (every AlphaFold model) and three or more Cys/His/Asp/Glu among the motif's specified residues, a zinc is placed by least squares. The fit uses Harding's target distances (Zn–S 2.31, Zn–N 2.03, Zn–O 1.99, Zn–O(water) 2.09 Å) and a term for each donor's geometry. Every choice of three or four ligands and of donor atom is tried.
    • The report gives the fit and the next-best alternatives.
    • For a zinc in the file, it also says where these ligands would hold one at ideal distances ("refit").

What is drawn

  • Donor pairs. On each ligand atom the hybrids are recomputed with the zinc as one more σ partner (Coulson's method, as for any bond). The hybrid toward the zinc is the donated pair. Its angle to the donor→Zn line is in the report. A histidine can only bend in its ring plane, so a zinc above the plane shows up there.
  • Zinc's empty 4s/4p. These are the virtual orbitals of Hartree–Fock Zn²⁺: ε = −0.605 and −0.408 hartree against the measured −0.660 and −0.437 (tools/sites/RESULTS.md).
    • One acceptor hybrid is built per ligand by the criterion of maximum overlap with that ligand's pair.
    • With fewer than four ligands, what is left of the 4s/4p space is the open-site orbital. It points where a catalytic zinc binds its water or substrate.
    • The report gives each donor–acceptor overlap.
  • π systems of the stretch: every amide, ring, carboxylate and guanidinium, from the Hückel layer, as π density, the HOMO or LUMO of each π system, its interference part or the electric potential on it.
  • Everything else (σ bonds, lone pairs) on request: "every orbital of the metal-binding residues" or of the whole fragment.

First view. A motif opens on the quick view: the donor pairs and the zinc's open site (without a metal, the lone pairs of the motif's specified residues), with the π density of the stretch. A ligand opens on its own quick view (Ligands). Each mode keeps its own choice of orbitals and π field, so going from a ligand back to a motif never draws every orbital of the fragment. If the surfaces would exceed what Mol* takes in one file (400 000 triangles), that draw uses low quality and says so; the quality control keeps its value.

Colours: amber/teal are the two signs of an occupied orbital or of a π HOMO; lilac and violet the two signs of an empty zinc acceptor or of a π LUMO; pink the open-site orbital; blue the π density. The legend under the viewer lists only what is drawn.

GL1X

GL1X, the GenesisL1 explorer, indexes the MolNFT structure collections and searches them by motif. Its record pages show a hit in Mol*, with the motif's residues as ball-and-stick. /sites takes a hit from there to the orbital layer:

  • From GL1X to here. /sites?gl1x=<contract>/<token>&motif=<pattern>&chain=<chain>&occ=<k>. The record can also be pasted as a gl1x.com link.
    • The browser fetches the structure file from https://gl1x.com/api/tokens/<contract>/instances/<token>/structure; GL1X allows cross-origin requests.
    • If that fails, the server fetches it, from gl1x.com only, with a 20 MB limit and a cache.
    • Collections: PDB Bank (MolNFT v2, BinaryCIF on chain) 0xd58b…0102; PDB (v1) 0xde37…7eba; AlphaFold (v1) 0xbf74…21ed.
  • From here back to GL1X. "Open on GL1X" links to the record page with the find bar set: https://gl1x.com/token/<contract>/instance/<token>?find=<pattern>&chain=<chain>.

A GL1X motif hit can therefore link straight to its orbitals: append the record, the pattern and the chain to https://app.lcserve.com/sites?.

Ligands

A ligand of the structure can be picked instead of a motif: its SMILES is worked out four ways and checked against the atoms, and its orbitals are drawn where it sits, with its pocket. See Ligands.

The API

POST /api/site with a JSON body:

field
structure / structure_b64 / gl1x / exampleone oftext, base64 bytes, "<contract>/<token>", or 5a7u / 7ddo / 1hvr / 1a28 / 19hc; with structure(_b64), gl1x only labels the source
ligandoptionala ligand instead of a motif: see Ligands for this and its other fields
motifoptionalPROSITE pattern; without it a metal site is used
chainoptionalrestrict the search to one chain
occurrence / metal_siteoptionalwhich one (index, default 0)
scopesegment \| ligandsthe whole stretch, or ligand side chains
metalauto \| refit \| zn \| noneas in the file, refitted, placed from the motif, or no metal
ph0–14default 7.4
list_onlyboolonly list occurrences and metal sites
return_structurebooladd the whole structure as PDB (or mmCIF) text, for viewers that cannot read the original

The answer (schema: qo-site/1) holds:

  • structure, source, occurrences, metal_sites, selected;
  • site: the report with ligands, distances, angles, protonation, confidence, warnings and notes;
  • model: shaped like /api/model, with atoms, orbitals, pi_field, molblock and metal_bonds, all in the protein's frame;
  • fragment_pdb and timing_ms.

Errors are HTTP 400 with an error message and a code: no_occurrence, invalid_motif, motif_too_general, site_too_large, gl1x, busy.

curl -s https://app.lcserve.com/api/site -H 'Content-Type: application/json' \
  -d '{"example":"5a7u","motif":"C-x(2,4)-C-x(12)-H-x(3,5)-H"}' | jq '.site.metal.ligands'

GET /api/site-health reports the zinc radial table, the limits and whether the server fetches from GL1X.

Limits

  • Fragment size. At most 1500 atoms with hydrogens (server.py --max-site-atoms). A 22-residue stretch has about 380; the orbital layer costs about 1 ms per atom on one core.
  • Files. At most 20 MB (GL1X's own upload limit). At most two sites are computed at once, to keep a 2-core, 3 GB server responsive.
  • Metals. Zinc gets donor and acceptor orbitals. Mg, Ca, Na and K are drawn as ions. Other metals are shown but have no orbital model.
  • Residues. Nucleic acids and non-standard residues are not built. They appear as X in the sequence, so x matches them.
  • Model. No SCF, DFT or correlation is computed for the site. The chemistry is the orbital layer's, and the coordinates are the file's.

Tested, and not yet

  • tests/test_structure.py:
    • BinaryCIF against the mmCIF text of the same entry;
    • motifs, overlapping occurrences and ranges;
    • every fragment valence-complete and free of clashes;
    • zinc placement on 7DDO and 5A7U with the zinc deleted;
    • an orthonormal 4s/4p acceptor set and the open-site direction;
    • overlap quadrature against the analytic overlaps;
    • the service and its errors.
  • tests/test_orbitals.js: radial tables, closed donor and acceptor surfaces, and donor lobes along their hybrids.
  • A headless-browser run of /sites with recording stand-ins for Mol* and 3Dmol.js checks the page end to end:
    • the protein and the fragment in the same frame (R check), the PLY and the camera;
    • the report, the 3Dmol tab and its arrows, the downloads and the URL;
    • a GL1X record fetched by the browser as a gzip file;
    • no horizontal scroll at 390 px.
  • Not tested here:
    • the real Mol* and 3Dmol.js bundles, which could not be downloaded in the sandbox;
    • gl1x.com itself, which was not reachable;
    • a MolNFT v2 BinaryCIF record. The decoder is tested on Biotite's test files.

Source: PROTEIN_SITES.md in the server package · updated