This website provides a means to calculate lattice contacts for protein structures in Protein Data Bank (PDB) format. Note that these are only the crystallographic lattice contacts and therefore they will probably not be biologically relevant. To calculate internal contacts or assess the significance of possible multimeric forms of the protein, then other services such as Arpeggio and PDBePISA should be used.

The distance threshold or cutoff for the contacts may be changed by the user and potential hydrogen bonds and salt bridges are highlighted in yellow and blue, respectively, in the output. The unit cell and symmetry are read from the CRYST1 line in the PDB file and the program should work with almost all of the enantiomorphic space groups and some of the common non-standard ones, as long as they are given in exactly the PDB format. The calculations are done by your browser so no files are uploaded to the server.

The centroid of the Cα coordinates is calculated and is fractionalised assuming the PDB convention for aligning orthonormal axes with the unit cell vectors i.e. the X-axis is parallel with a, the vector b lies in the XY plane and Z is parallel with the reciprocal lattice vector c*. This is described in more detail here.

Each of the space group symmetry operations is applied initially to fractional coordinates of the centroid. Since the deposited structure can be far from the unit cell origin (0, 0, 0) a shift which brings each symmetry mate close to the original molecule is calculated and is optimised by moving the centroid stepwise by -2, -1, 0, +1 and +2 unit cell shifts on a, b and c i.e. 5 x 5 x 5 or 125 combinations. The shift which brings the symmetry mate's centroid closest to the original centroid is used to shift all of the atoms once that particular symmetry operation has been applied to the whole structure. Since the protein coordinates are stored in orthogonal form, the symmetry operations and any necessary shifts are orthogonalised before being applied to the PDB coordinates.

The program then tries to find atoms which are within a boundary around the original molecule by shifting the symmetry mates -1, 0 and +1 on a, b and c i.e. 3 x 3 x 3 or 27 combinations. At each step the first stored atom in each residue is tested to see if it is within a generous boundary distance of the original molecule on X, Y and Z. If so, each atom in that residue is tested to see if it lies close to the starting structure and, if so, it is saved for later.

Having filled the boundary box with residues close to the original structure, the first stored atom of each residue in the original molecule is taken. For each residue within the surrounding box, the first stored atom of that residue is taken and tested to see if it is within a certain generous distance threshold of the atom chosen from the original molecule. If so, then all atoms in both residues are tested to see if they come within a stricter distance cutoff (which can be varied by the user) and, if so, they are listed as potential crystal contacts.

I have tested that it generates all of the symmetry related molecules for essentially all of the enantiomorphic space groups when the structure is randomly shifted many unit cells away from the deposited coordinates and I think it is OK. The business of using just the centroid and a random atom from each residue makes things a bit faster.

The script (which can be downloaded within the html of the main page) is written in Lua and uses Fengari to communicate with your browser and Math.js. Please report any problems or corrections to jbcooper_at_fastmail_dot_net who will be glad to help.

Finally, no one ever does, but feel free to...