BR's crystallographic computing tutorials


Superposition of two molecules

The problem of superpositioning two (or more) molecules onto each other is a common task and one would assume it is also very simple. In fact, there exist several techniques to solve this problem, but there are a few details to consider which can make coding of the problem subtle. In the following I will discuss a FORTRAN program which superimposes two pdb files using the elegant quaternion method.

Code

The code that implements the quaternion method as described in [1] operates as follows :

First, two pdb files are opened and the pairwise correspondence of atoms is checked on several levels of increasing strictness : same number of atoms, same residues, same atom type. At any point a discrepancy is detected, one has the option to proceed or not, which may depend on the particulars of your problem.

In the next section, the program determines the centers of the molecules and creates the positve and negative pairwise differences of the atomic coordinates (all variables with *m refer to the moving probe, all with *f to the fixed target) are :

c --- sum up all coordinates (in dble precision) to find centre ---     PDBS0131
      do k=1,imov                                                       PDBS0132
         do i=1,3                                                       PDBS0133
            sumf(i)=sumf(i)+xf(k,i)                                     PDBS0134
            summ(i)=summ(i)+xm(k,i)                                     PDBS0135
         end do                                                         PDBS0136
      end do                                                            PDBS0137
      do i=1,3                                                          PDBS0138
         cm(i)=sngl(summ(i)/imov)                                       PDBS0139
         cf(i)=sngl(sumf(i)/imov)                                       PDBS0140
         tr(i)=cf(i)-cm(i)                                              PDBS0141
      end do                                                            PDBS0142
                                                                        PDBS0143
      write(*,'(/a,3f8.3)')' Centre of target molecule  =',(cf(i),i=1,3)PDBS0144
      write(*,'(a,3f8.3)') ' Centre of moving molecule  =',(cm(i),i=1,3)PDBS0145
      write(*,'(a,3f8.3/)')' T - vector probe -> target =',(tr(i),i=1,3)PDBS0146
                                                                        PDBS0147
      write (*,'(a)')' Creating coordinate differences.......'          PDBS0148
c --- create coordinate differences delta x plus (dxp) and minus (dxm)  PDBS0149
      do k=1,imov                                                       PDBS0150
         do j=1,3                                                       PDBS0151
            dxm(k,j)=xm(k,j)-cm(j)-(xf(k,j)-cf(j))                      PDBS0152
            dxp(k,j)=xm(k,j)-cm(j)+(xf(k,j)-cf(j))                      PDBS0153
         end do                                                         PDBS0154
      end do                                                            PDBS0155

Now we are ready to fill the quaternion matrix q as described by Kearsley with the pairwise coordinate differences we just obtained :

c --- fill upper triangle of (symmetric) quaternion matrix --           PDBS0157
      write (*,'(a)')' Filling quaternion matrix ............'          PDBS0158
      do k=1,imov                                                       PDBS0159
c ---    diags are sums of squared cyclic coordinate differences        PDBS0160
         q(1,1)=q(1,1)+dxm(k,1)**2+dxm(k,2)**2+dxm(k,3)**2              PDBS0161
         q(2,2)=q(2,2)+dxp(k,2)**2+dxp(k,3)**2+dxm(k,1)**2              PDBS0162
         q(3,3)=q(3,3)+dxp(k,1)**2+dxp(k,3)**2+dxm(k,2)**2              PDBS0163
         q(4,4)=q(4,4)+dxp(k,1)**2+dxp(k,2)**2+dxm(k,3)**2              PDBS0164
c ---    cross differences                                              PDBS0165
         q(1,2)=q(1,2)+dxp(k,2)*dxm(k,3)-dxm(k,2)*dxp(k,3)              PDBS0166
         q(1,3)=q(1,3)+dxm(k,1)*dxp(k,3)-dxp(k,1)*dxm(k,3)              PDBS0167
         q(1,4)=q(1,4)+dxp(k,1)*dxm(k,2)-dxm(k,1)*dxp(k,2)              PDBS0168
         q(2,3)=q(2,3)+dxm(k,1)*dxm(k,2)-dxp(k,1)*dxp(k,2)              PDBS0169
         q(2,4)=q(2,4)+dxm(k,1)*dxm(k,3)-dxp(k,1)*dxp(k,3)              PDBS0170
         q(3,4)=q(3,4)+dxm(k,2)*dxm(k,3)-dxp(k,2)*dxp(k,3)              PDBS0171
      end do                                                            PDBS0172
c --- fill the rest by transposing it onto itself                       PDBS0173
      call trpmat(4,q,q)                                                PDBS0174
      write (*,'(/a)')                                                  PDBS0175
     &     '       q(1)         q(2)         q(3)        q(4)'          PDBS0176
      do i=1,4                                                          PDBS0177
         write(*,'(4e13.5)') (q(i,j),j=1,4)                             PDBS0178
      end do                                                            PDBS0179

The solution of the eigenvalue problem by Jacobi orthogonalization is straight forward using a canned routine from Numerical recipes :

c --- orthogonalization by jacobi rotation = solution of EV -problem -- PDBS0181
      write (*,'(/a)')' Jacobi orthogonalization ..........'            PDBS0182
      n=4                                                               PDBS0183
      ns=4                                                              PDBS0184
      call jacobi(q,n,ns,dm,vm,nmrot)                                   PDBS0185
c --- sort eigenvectors after eigenvalues, descending --                PDBS0186
      write (*,'(a/)')' Sorting eigenvalues/vectors .......'            PDBS0187
      call eigsrt(dm,vm,n,ns)                                           PDBS0188
      write (*,'(a,i2,a)')' Eigenvalues and Eigenvectors (',            PDBS0189
     & nmrot,' Jacobi rotations)'                                       PDBS0190
      write (*,'(a)') '      e(1)        e(2)        e(4)        e(4)'  PDBS0191
      write (*,'(4e12.5,i5)') (dm(j),j=1,4)                             PDBS0192
      write (*,'(a)') '      ev(1)       ev(2)       ev(3)       ev(4)' PDBS0193
      do i=1,4                                                          PDBS0194
         write(*,'(4f12.6)') (vm(i,j),j=1,4)                            PDBS0195
      end do                                                            PDBS0196

The smallest eigenvalue is the s.r.s.(sum of residuals squared) for the best rotation and the associated eigenvector contains element from which the 3x3 rotation matrix t for the best superposition is constructed.

c --- fill the rotation matrix which is made of elements from 4th EV    PDBS0206
      t(1,1)=vm(1,4)**2+vm(2,4)**2-vm(3,4)**2-vm(4,4)**2                PDBS0207
      t(2,1)=2*(vm(2,4)*vm(3,4)+vm(1,4)*vm(4,4))                        PDBS0208
      t(3,1)=2*(vm(2,4)*vm(4,4)-vm(1,4)*vm(3,4))                        PDBS0209
      t(1,2)=2*(vm(2,4)*vm(3,4)-vm(1,4)*vm(4,4))                        PDBS0210
      t(2,2)=vm(1,4)**2+vm(3,4)**2-vm(2,4)**2-vm(4,4)**2                PDBS0211
      t(3,2)=2*(vm(3,4)*vm(4,4)+vm(1,4)*vm(2,4))                        PDBS0212
      t(1,3)=2*(vm(2,4)*vm(4,4)+vm(1,4)*vm(3,4))                        PDBS0213
      t(2,3)=2*(vm(3,4)*vm(4,4)-vm(1,4)*vm(2,4))                        PDBS0214
      t(3,3)=vm(1,4)**2+vm(4,4)**2-vm(2,4)**2-vm(3,4)**2                PDBS0215
                                                                        PDBS0216
      do i=1,3                                                          PDBS0217
         write(*,'(3f11.5)') (t(i,j),j=1,3)                             PDBS0218
      end do                                                            PDBS0219

The application of the rotation and the back-translation of the molecule are trivial final steps :

c --- reset dxm to store the individual rmsd's in it now -              PDBS0221
      call filmat(nat,3,dxm,0)                                          PDBS0222
                                                                        PDBS0223
c --- xm and xf are not translated - do now                             PDBS0224
      do k=1,imov                                                       PDBS0225
c ---    subtract cm                                                    PDBS0226
         xm(k,1:3)=xm(k,1:3)-cm                                         PDBS0227
c ---    rotate it                                                      PDBS0228
         call rotvec(3,xm(k,1:3),t)                                     PDBS0229
c ---    now add cf                                                     PDBS0230
         xm(k,1:3)=xm(k,1:3)+cf                                         PDBS0231
         do i=1,3                                                       PDBS0232
            dxm(k,i)=sqrt((xf(k,i)-xm(k,i))**2)                         PDBS0233
         end do                                                         PDBS0234
      end do                                                            PDBS0235
                                                                        PDBS0236

Finally, we create a new file and we can apply the same transformation to another molecule, if desired.

Get the program (PDBSUP)


[1] S.K.Kearsley, On the orthogonal transformation used for structural comparisons, Acta Cryst. A45, 208 (1989)
[2] W.H.Press, S.A.Teukolsky, W.T.Vettering and B.P. Flannery, Numerical Recipes, 2nd edition, Cambridge University Press (1992)


Back to X-ray Facility Introduction
LLNL Disclaimer
This World Wide Web site conceived and maintained by Bernhard Rupp (br@llnl.gov)
Last revised April 06, 1999 11:04
UCRL-MI-125269