diff fibronectin/NWalign_PAM30.f @ 0:0c6cfb9906f3 draft default tip

Uploaded
author cbib
date Wed, 10 Nov 2021 15:15:50 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fibronectin/NWalign_PAM30.f	Wed Nov 10 15:15:50 2021 +0000
@@ -0,0 +1,1258 @@
+*************************************************************************
+*     This is a program for protein sequence alignment using the standard
+*     Needleman-Wunsch dynamic programming. The mutation matrix is from 
+*     PAM30 with gap openning penaly=-11 and gap extension panalty=-1. 
+*     The program can be freely copied and modified provided the notices 
+*     on the head are retained. Comments and bug report should be addressed 
+*     to Yang Zhang (Email: zhng@umich.edu). Last update is in 2010/08/03.
+*
+*     Instructions:
+*     1, the program can be compiled by 
+*        >gfortran -static -O3 -ffast-math -lm -o align align.f
+*     2, simply running the program will give a brief note on how to use it
+*     3, You can run the program in following convenient ways:
+*        >align F1.fasta F2.fasta (align two sequences in fasta file)
+*        >align F1.pdb F2.pdb 1   (align two sequences in PDB file)
+*        >align F1.fasta F2.pdb 2 (align Sequence 1 in fasta and 2 in pdb)
+*        >align GKDGL EVADELVSE 3 (align sequences typed by keyboard)
+*        >align GKDGL F.fasta 4   (align Seq-1 by keyboard and 2 in fasta)
+*        >align GKDGL F.pdb 5     (align Seq-1 by keyboard and 2 in pdb)
+*************************************************************************
+      
+      program compares
+      PARAMETER(ndim=6000)
+      parameter(naa=24) !number of amino acid
+      common/dpc/score(ndim,ndim),gap_open,gap_extn,j2i(ndim)
+     &     ,nseq1,nseq2
+      common/matra/imut(naa,naa)     !b,z,x are additional
+
+      integer seq1(ndim),seq2(ndim)
+      character*10000 fnam1,fnam2,fnam3,fnam4
+      character*10000 s
+      character*3 aa(naa),aanam
+      character seqw(naa),upper
+      character*100 du,ad
+      character sequenceA(ndim),sequenceB(ndim),sequenceM(ndim)
+
+*---------------------- 24 amino acids ---------------------
+      data aa/'ALA','ARG','ASN','ASP','CYS','GLN','GLU',
+     &     'GLY','HIS','ILE','LEU','LYS','MET','PHE','PRO','SER',
+     &     'THR','TRP','TYR','VAL','ASX','GLX','UNK','STOP'/
+      data seqw/'A','R','N','D','C','Q','E','G','H','I','L','K',
+     &     'M','F','P','S','T','W','Y','V','B','Z','X','*'/
+
+      call getarg(1,fnam1)
+      call getarg(2,fnam2)
+      call getarg(3,fnam3)
+      call getarg(4,fnam4)
+
+      if(fnam1.eq.' ')then
+         write(*,*)'align F1.fasta F2.fasta ',
+     &        '(align two sequences in fasta file)'
+         write(*,*)'align F1.pdb F2.pdb 1   ',
+     &        '(align two sequences in PDB file)'
+         write(*,*)'align F1.fasta F2.pdb 2 ',
+     &        '(align Sequence 1 in fasta and 2 in pdb)'
+         write(*,*)'align GKDGL EVADELVSE 3 ',
+     &        '(align two sequences typed by keyboard)'
+         write(*,*)'align GKDGL F.fasta 4   ',
+     &        '(align Sequence 1 by keyboard and 2 in fasta)'
+         write(*,*)'align GKDGL F.pdb 5     ',
+     &        '(align Sequence 1 by keyboard and 2 in pdb)'
+         goto 999
+      endif
+      
+*1******* read sequences ------------------------->
+      if(fnam3.eq.'5')then      !direct, 555555555555555555
+***   read sequence1:
+         i=0
+         do k=1,10000
+            fnam1(k:k)=upper(fnam1(k:k))
+            do j=1,naa
+               if(fnam1(k:k).eq.seqw(j))then
+                  i=i+1
+                  seq1(i)=j
+                  goto 5
+               endif
+            enddo
+            if(fnam1(k:k).ne.'-')goto 55 !same time
+ 5          continue
+            if(i.ge.ndim)goto 55
+         enddo
+ 55      continue
+         nseq1=i
+***   read sequence2:
+         open(unit=10,file=fnam2,status='old')
+         i=0
+         do while (.true.)
+            read(10,1,end=551) s
+            if(i.gt.0.and.s(1:3).eq.'TER')goto 551
+            if(s(1:3).eq.'ATO')then
+               if(s(13:16).eq.'CA  '.or.s(13:16).eq.' CA '.
+     &              or.s(13:16).eq.'  CA')then
+                  i=i+1
+                  read(s,111)du,aanam
+                  do j=1,naa
+                     if(aanam.eq.aa(j))seq2(i)=j
+                  enddo
+               endif
+            endif
+            if(i.ge.ndim)goto 551
+         enddo
+ 551     continue
+         close(10)
+         nseq2=i
+      elseif(fnam3.eq.'4')then  !direct, 444444444444444444444444444
+***   read sequence1:
+         i=0
+         do k=1,10000
+            fnam1(k:k)=upper(fnam1(k:k))
+            do j=1,naa
+               if(fnam1(k:k).eq.seqw(j))then
+                  i=i+1
+                  seq1(i)=j
+                  goto 4
+               endif
+            enddo
+            if(fnam1(k:k).ne.'-')goto 44
+ 4          continue
+            if(i.ge.ndim)goto 44
+         enddo
+ 44      continue
+         nseq1=i
+***   read sequence2:
+         open(unit=10,file=fnam2,status='old')
+         i=0
+         do while(.true.)
+            read(10,1,end=443)s
+            if(s(1:1).eq.'>')goto 442
+            do k=1,10000
+               s(k:k)=upper(s(k:k))
+               do j=1,naa
+                  if(s(k:k).eq.seqw(j))then
+                     i=i+1
+                     seq2(i)=j
+                     goto 441
+                  endif
+               enddo
+               if(s(k:k).ne.'-')goto 442 !same time
+ 441           continue
+            enddo
+ 442        continue
+            if(i.ge.ndim)goto 443
+         enddo
+ 443     continue
+         close(10)
+         nseq2=i
+
+
+      elseif(fnam3.eq.'3')then  !direct, 33333333333333333333333333333333333
+***   read sequence1:
+         i=0
+         do k=1,10000
+            fnam1(k:k)=upper(fnam1(k:k))
+            do j=1,naa
+               if(fnam1(k:k).eq.seqw(j))then
+                  i=i+1
+                  seq1(i)=j
+                  goto 3
+               endif
+            enddo
+            if(fnam1(k:k).ne.'-')goto 33
+ 3          continue
+            if(i.ge.ndim)goto 33
+         enddo
+ 33      continue
+         nseq1=i
+***   read sequence2:
+         i=0
+         do k=1,10000
+            fnam2(k:k)=upper(fnam2(k:k))
+            do j=1,naa
+               if(fnam2(k:k).eq.seqw(j))then
+                  i=i+1
+                  seq2(i)=j
+                  goto 331
+               endif
+            enddo
+            if(fnam2(k:k).ne.'-')goto 332
+ 331        continue
+            if(i.ge.ndim)goto 332
+         enddo
+ 332     continue
+         nseq2=i
+      elseif(fnam3.eq.'1')then  !pdb,pdb, 11111111111111111111111111111
+***   read sequence1:
+         open(unit=10,file=fnam1,status='old')
+         i=0
+         do while (.true.)
+            read(10,1,end=11) s
+            if(i.gt.0.and.s(1:3).eq.'TER')goto 11
+            if(s(1:3).eq.'ATO')then
+               if(s(13:16).eq.'CA  '.or.s(13:16).eq.' CA '.
+     &              or.s(13:16).eq.'  CA')then
+                  i=i+1
+                  read(s,111)du,aanam
+                  do j=1,naa
+                     if(aanam.eq.aa(j))seq1(i)=j
+                  enddo
+               endif
+            endif
+            if(i.ge.ndim)goto 11
+         enddo
+ 1       format(A10000)
+ 11      continue
+ 111     format(A17,A3)
+         close(10)
+         nseq1=i
+***   read sequence2:
+         open(unit=10,file=fnam2,status='old')
+         i=0
+         do while (.true.)
+            read(10,1,end=112) s
+            if(i.gt.0.and.s(1:3).eq.'TER')goto 112
+            if(s(1:3).eq.'ATO')then
+               if(s(13:16).eq.'CA  '.or.s(13:16).eq.' CA '.
+     &              or.s(13:16).eq.'  CA')then
+                  i=i+1
+                  read(s,111)du,aanam
+                  do j=1,naa
+                     if(aanam.eq.aa(j))seq2(i)=j
+                  enddo
+               endif
+            endif
+            if(i.ge.ndim)goto 112
+         enddo
+ 112     continue
+         close(10)
+         nseq2=i
+      elseif(fnam3.eq.'2')then  !seq,pdb 2222222222222222222222222222222
+***   read sequence1:
+         open(unit=10,file=fnam1,status='old')
+         i=0
+         do while(.true.)
+            read(10,1,end=221)s
+            if(s(1:1).eq.'>')goto 22
+            do k=1,10000
+               s(k:k)=upper(s(k:k))
+               do j=1,naa
+                  if(s(k:k).eq.seqw(j))then
+                     i=i+1
+                     seq1(i)=j
+                     goto 2
+                  endif
+               enddo
+               if(s(k:k).ne.'-')goto 22
+ 2             continue
+            enddo
+ 22         continue
+            if(i.ge.ndim)goto 221
+         enddo
+ 221     continue
+         close(10)
+         nseq1=i
+***   read sequence2:
+         open(unit=10,file=fnam2,status='old')
+         i=0
+         do while (.true.)
+            read(10,1,end=222) s
+            if(i.gt.0.and.s(1:3).eq.'TER')goto 222
+            if(s(1:3).eq.'ATO')then
+               if(s(13:16).eq.'CA  '.or.s(13:16).eq.' CA '.
+     &              or.s(13:16).eq.'  CA')then
+                  i=i+1
+                  read(s,111)du,aanam
+                  do j=1,naa
+                     if(aanam.eq.aa(j))seq2(i)=j
+                  enddo
+               endif
+            endif
+            if(i.ge.ndim)goto 222
+         enddo
+ 222     continue
+         close(10)
+         nseq2=i
+      else                      !seq,seq 00000000000000000000000000000000
+***   read sequence1:
+         open(unit=10,file=fnam1,status='old')
+         i=0
+         do while(.true.)
+            read(10,1,end=881)s
+            if(s(1:1).eq.'>')goto 88
+            do k=1,10000
+               s(k:k)=upper(s(k:k))
+               do j=1,naa
+                  if(s(k:k).eq.seqw(j))then
+                     i=i+1
+                     seq1(i)=j
+                     goto 8
+                  endif
+               enddo
+               if(s(k:k).ne.'-')goto 88
+ 8             continue
+            enddo
+ 88         continue
+            if(i.ge.ndim)goto 881
+         enddo
+ 881     continue
+         close(10)
+         nseq1=i
+***   read sequence2:
+         open(unit=10,file=fnam2,status='old')
+         i=0
+         do while(.true.)
+            read(10,1,end=884)s
+            if(s(1:1).eq.'>')goto 883
+            do k=1,10000
+               s(k:k)=upper(s(k:k))
+               do j=1,naa
+                  if(s(k:k).eq.seqw(j))then
+                     i=i+1
+                     seq2(i)=j
+                     goto 882
+                  endif
+               enddo
+               if(s(k:k).ne.'-')goto 883
+ 882           continue
+            enddo
+ 883        continue
+            if(i.ge.ndim)goto 884
+         enddo
+ 884     continue
+         close(10)
+         nseq2=i
+      endif
+      
+*2**   read mutation matrix ---------->
+      call matrix               !take pam
+***   set unit mutation matrix ---------->
+c      do i=1,naa
+c         do j=1,naa
+c            imut(i,j)=0
+c         enddo
+c      enddo
+c      do i=1,naa
+c         imut(i,i)=1
+c      enddo
+
+*3**   score------------------>
+      do i=1,nseq1
+         do j=1,nseq2
+            score(i,j)=imut(seq1(i),seq2(j))
+         enddo
+      enddo
+
+*4*****************************************************************
+*     dynamatic program:
+******************************************************************
+      gap_open=-11
+      gap_extn=-1
+      call DP(score0)           !W(k)=Go+Ge*k1+Go+Ge*k2, standard NW
+c      call DPalt(score0)        !W(k)=Go+Ge*k1+Ge*k2, alternative NW
+      
+*5**   calculate sequence identity---------------------------->
+      L_id=0
+      L_ali=0
+      do j=1,nseq2
+         if(j2i(j).gt.0)then
+            i=j2i(j)
+            L_ali=L_ali+1
+            if(seq1(i).eq.seq2(j))L_id=L_id+1
+         endif
+      enddo
+      
+      write(*,*)
+      write(*,101)nseq1,fnam1
+ 101  format('Length of sequence 1: ',I4,' ->',A10)
+      write(*,102)nseq2,fnam2
+ 102  format('Length of sequence 2: ',I4,' ->',A10)
+      write(*,103)L_ali
+ 103  format('Aligned length: ',I4)
+      write(*,104)L_id
+ 104  format('Identical length: ',I4)
+      write(*,105)float(L_id)/(nseq2+0.00000001),L_id,nseq2
+ 105  format('Sequence identity: ',F8.3,' (=',I4,'/',I4,')')
+      write(*,*)
+
+*6******************************************************************
+***   output aligned sequences
+      k=0                       !final aligned order
+      i=1                       !on sequence 1
+      j=1                       !on sequence 2
+ 800  continue
+      if(i.gt.nseq1.and.j.gt.nseq2)goto 802
+      if(i.gt.nseq1.and.j.le.nseq2)then !unaligned C on 1
+         k=k+1
+         sequenceA(k)='-'
+         sequenceB(k)=seqw(seq2(j))
+         sequenceM(k)=' '
+         j=j+1
+         goto 800
+      endif
+      if(i.le.nseq1.and.j.gt.nseq2)then !unaligned C on 2
+         k=k+1
+         sequenceA(k)=seqw(seq1(i))
+         sequenceB(k)='-'
+         sequenceM(k)=' '
+         i=i+1
+         goto 800
+      endif
+      if(i.eq.j2i(j))then    !if aligned
+         k=k+1
+         sequenceA(k)=seqw(seq1(i))
+         sequenceB(k)=seqw(seq2(j))
+         if(seq1(i).eq.seq2(j))then !identical
+            sequenceM(k)=':'
+         else
+            sequenceM(k)=' '
+         endif
+         i=i+1
+         j=j+1
+         goto 800
+      elseif(j2i(j).lt.0)then !if gap on 1
+         k=k+1
+         sequenceA(k)='-'
+         sequenceB(k)=seqw(seq2(j))
+         sequenceM(k)=' '
+         j=j+1
+         goto 800
+      elseif(j2i(j).gt.0)then !if gap on 2
+         k=k+1
+         sequenceA(k)=seqW(seq1(i))
+         sequenceB(k)='-'
+         sequenceM(k)=' '
+         i=i+1
+         goto 800
+      endif
+ 802  continue
+
+      write(*,601)(sequenceA(i),i=1,k)
+      write(*,601)(sequenceM(i),i=1,k)
+      write(*,601)(sequenceB(i),i=1,k)
+      write(*,602)(mod(i,10),i=1,k)
+ 601  format(2000A1)
+ 602  format(2000I1)
+      write(*,*)
+
+c^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+c      STOP
+ 999  END
+      
+********************************************************************
+*     This is a standard Needleman-Wunsch dynamic program (by Y. Zhang 2005)
+*     1. Count multiple-gap.
+*     2. The gap penality W(k)=Go+Ge*k1+Go+Ge*k2 if gap open on both sequences
+*     
+*     Input: score(i,j), gap_open, gap_extn
+*     Output: j2i(j)
+*     idir(i,j)=1,2,3, from diagonal, horizontal, vertical
+*     val(i,j) is the cumulative score of (i,j)
+********************************************************************
+      subroutine DP(score0)
+      PARAMETER(ndim=6000)
+      common/dpc/score(ndim,ndim),gap_open,gap_extn,j2i(ndim)
+     &     ,nseq1,nseq2
+      
+      dimension val(0:ndim,0:ndim),idir(0:ndim,0:ndim)
+      dimension jpV(0:ndim,0:ndim),jpH(0:ndim,0:ndim)
+      dimension preV(0:ndim,0:ndim),preH(0:ndim,0:ndim)
+      real D,V,H
+      
+ccc   initializations --------------->
+      val(0,0)=0.0 
+      do i=1,nseq1
+         val(i,0)=gap_extn*i
+         preV(i,0)=val(i,0) !not use preV at the beginning
+         idir(i,0)=0            !useless
+         jpV(i,0)=1             !useless
+         jpH(i,0)=i             !useless
+      enddo
+      do j=1,nseq2
+         val(0,j)=gap_extn*j
+         preH(0,j)=val(0,j)
+         idir(0,j)=0
+         jpV(0,j)=j
+         jpH(0,j)=1
+      enddo
+      
+ccc   DP ------------------------------>
+      do 111 j=1,nseq2
+         do 222 i=1,nseq1
+ccc   D=VAL(i-1,j-1)+SCORE(i,j)--------------->
+            D=val(i-1,j-1)+score(i,j) !from diagonal, val(i,j) is val(i-1,j-1)
+ccc   H=H+gap_open ------->
+            jpH(i,j)=1
+            val1=val(i-1,j)+gap_open !gap_open from both D and V
+            val2=preH(i-1,j)+gap_extn !gap_extn from horizontal
+            if(val1.gt.val2) then !last step from D or V
+               H=val1
+            else                !last step from H
+               H=val2
+               if(i.gt.1)jpH(i,j)=jpH(i-1,j)+1 !record long-gap
+            endif
+ccc   V=V+gap_open --------->
+            jpV(i,j)=1
+            val1=val(i,j-1)+gap_open
+            val2=preV(i,j-1)+gap_extn
+            if(val1.gt.val2) then
+               V=val1
+            else
+               V=val2
+               if(j.gt.1)jpV(i,j)=jpV(i,j-1)+1
+            endif
+            preH(i,j)=H         !unaccepted H
+            preV(i,j)=V         !unaccepted V
+            
+            if(D.gt.H.and.D.gt.V)then
+               idir(i,j)=1
+               val(i,j)=D
+            elseif(H.gt.V)then
+               idir(i,j)=2
+               val(i,j)=H
+            else
+               idir(i,j)=3
+               val(i,j)=V
+            endif
+ 222     continue
+ 111  continue
+      score0=val(nseq1,nseq2)   !alignment score
+      
+c     tracing back the pathway:
+      do j=1,nseq2
+         j2i(j)=-1              !all are not aligned
+      enddo
+      i=nseq1
+      j=nseq2
+      do while(i.gt.0.and.j.gt.0)
+         if(idir(i,j).eq.1)then !from diagonal
+            j2i(j)=i
+            i=i-1
+            j=j-1
+         elseif(idir(i,j).eq.2)then !from horizonal
+            it=jpH(i,j)
+            do me=1,it
+               if(i.gt.0) then
+                  i=i-1                       
+               endif
+            enddo
+         else
+            it=jpV(i,j)
+            do me=1,it
+               if(j.gt.0) then
+                  j=j-1                       
+               endif
+            enddo
+         endif
+      enddo
+      
+*^^^^^^^^^^^DP finished ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^      
+      return
+      end
+      
+********************************************************************
+*     This is an alternative implementation of Needleman-Wunsch dynamic program 
+*     (by Y. Zhang 2005)
+*     1. Count two-layer iteration and multiple-gaps
+*     2. The gap penality W(k)=Go+Ge*k1+Ge*k2 if gap open on both sequences
+*     
+*     Input: score(i,j), gap_open, gap_extn
+*     Output: j2i(j)
+*     idir(i,j)=1,2,3, from diagonal, horizontal, vertical
+*     val(i,j) is the cumulative score of (i,j)
+********************************************************************
+      subroutine DPalt(score0)
+      PARAMETER(ndim=6000)
+      common/dpc/score(ndim,ndim),gap_open,gap_extn,j2i(ndim)
+     &     ,nseq1,nseq2
+      
+      dimension val(0:ndim,0:ndim),idir(0:ndim,0:ndim)
+      dimension preV(0:ndim,0:ndim),preH(0:ndim,0:ndim),
+     &     preD(0:ndim,0:ndim)
+      dimension idirH(0:ndim,0:ndim),idirV(0:ndim,0:ndim)
+      
+ccc   initializations --------------->
+      val(0,0)=0.0
+      do i=1,nseq1
+        val(i,0)=0
+        idir(i,0)=0
+        preD(i,0)=0.0
+        preH(i,0)=-1000.0
+        preV(i,0)=-1000.0
+      enddo
+      do j=1,nseq2
+        val(0,j)=0
+        idir(0,j)=0
+        preD(0,j)=0.0
+        preH(0,j)=-1000.0
+        preV(0,j)=-1000.0
+      enddo
+      
+ccc   DP ------------------------------>
+      do 111 j=1,nseq2
+         do 222 i=1,nseq1
+ccc   preD=VAL(i-1,j-1)+SCORE(i,j)--------------->
+            preD(i,j)=val(i-1,j-1)+score(i,j)
+ccc   preH: pre-accepted H----------------------->
+            D=preD(i-1,j)+gap_open
+            H=preH(i-1,j)+gap_extn
+            V=preV(i-1,j)+gap_extn
+            if(D.gt.H.and.D.gt.V)then
+               preH(i,j)=D
+               idirH(i-1,j)=1
+            elseif(H.gt.V)then
+               preH(i,j)=H
+               idirH(i-1,j)=2
+            else
+               preH(i,j)=V
+               idirH(i-1,j)=3
+            endif
+ccc   preV: pre-accepted V----------------------->
+            D=preD(i,j-1)+gap_open
+            H=preH(i,j-1)+gap_extn
+            V=preV(i,j-1)+gap_extn
+            if(D.gt.H.and.D.gt.V)then
+               preV(i,j)=D
+               idirV(i,j-1)=1
+            elseif(H.gt.V)then
+               preV(i,j)=H
+               idirV(i,j-1)=2
+            else
+               preV(i,j)=V
+               idirV(i,j-1)=3
+            endif
+            
+ccc   decide idir(i,j)----------->
+            if(preD(i,j).gt.preH(i,j).and.preD(i,j).gt.preV(i,j))then
+               idir(i,j)=1
+               val(i,j)=preD(i,j)
+            elseif(preH(i,j).gt.preV(i,j))then
+               idir(i,j)=2
+               val(i,j)=preH(i,j)
+            else
+               idir(i,j)=3
+               val(i,j)=preV(i,j)
+            endif
+ 222     continue
+ 111  continue
+      score0=val(nseq1,nseq2)   !alignment score
+      
+ccc   tracing back the pathway:
+      do j=1,nseq2
+        j2i(j)=-1              !all are not aligned
+      enddo
+      i=nseq1
+      j=nseq2
+      do while(i.gt.0.and.j.gt.0)
+         if(idir(i,j).eq.1)then !from diagonal
+            j2i(j)=i
+            i=i-1
+            j=j-1
+         elseif(idir(i,j).eq.2)then
+            i=i-1
+            idir(i,j)=idirH(i,j)
+         else
+            j=j-1
+            idir(i,j)=idirV(i,j)
+         endif
+      enddo
+      
+*^^^^^^^^^^^DP finished ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^      
+      return
+      end
+      
+********************************************************************
+*     read matrix
+*     
+      subroutine matrix
+      parameter(naa=24) !number of amino acid
+      common/matra/imut(naa,naa)     !b,z,x are additional
+
+*     following from PAM30:      
+      imut(1,1)=6
+      imut(1,2)=-7
+      imut(1,3)=-4
+      imut(1,4)=-3
+      imut(1,5)=-6
+      imut(1,6)=-4
+      imut(1,7)=-2
+      imut(1,8)=-2
+      imut(1,9)=-7
+      imut(1,10)=-5
+      imut(1,11)=-6
+      imut(1,12)=-7
+      imut(1,13)=-5
+      imut(1,14)=-8
+      imut(1,15)=-2
+      imut(1,16)=0
+      imut(1,17)=-1
+      imut(1,18)=-13
+      imut(1,19)=-8
+      imut(1,20)=-2
+      imut(1,21)=-3
+      imut(1,22)=-3
+      imut(1,23)=-1
+      imut(1,24)=-17
+      imut(2,1)=-7
+      imut(2,2)=8
+      imut(2,3)=-6
+      imut(2,4)=-10
+      imut(2,5)=-8
+      imut(2,6)=-2
+      imut(2,7)=-9
+      imut(2,8)=-9
+      imut(2,9)=-2
+      imut(2,10)=-5
+      imut(2,11)=-8
+      imut(2,12)=0
+      imut(2,13)=-4
+      imut(2,14)=-9
+      imut(2,15)=-4
+      imut(2,16)=-3
+      imut(2,17)=-6
+      imut(2,18)=-2
+      imut(2,19)=-10
+      imut(2,20)=-8
+      imut(2,21)=-7
+      imut(2,22)=-4
+      imut(2,23)=-1
+      imut(2,24)=-17
+      imut(3,1)=-4
+      imut(3,2)=-6
+      imut(3,3)=8
+      imut(3,4)=2
+      imut(3,5)=-11
+      imut(3,6)=-3
+      imut(3,7)=-2
+      imut(3,8)=-3
+      imut(3,9)=0
+      imut(3,10)=-5
+      imut(3,11)=-7
+      imut(3,12)=-1
+      imut(3,13)=-9
+      imut(3,14)=-9
+      imut(3,15)=-6
+      imut(3,16)=0
+      imut(3,17)=-2
+      imut(3,18)=-8
+      imut(3,19)=-4
+      imut(3,20)=-8
+      imut(3,21)=6
+      imut(3,22)=-3
+      imut(3,23)=-1
+      imut(3,24)=-17
+      imut(4,1)=-3
+      imut(4,2)=-10
+      imut(4,3)=2
+      imut(4,4)=8
+      imut(4,5)=-14
+      imut(4,6)=-2
+      imut(4,7)=2
+      imut(4,8)=-3
+      imut(4,9)=-4
+      imut(4,10)=-7
+      imut(4,11)=-12
+      imut(4,12)=-4
+      imut(4,13)=-11
+      imut(4,14)=-15
+      imut(4,15)=-8
+      imut(4,16)=-4
+      imut(4,17)=-5
+      imut(4,18)=-15
+      imut(4,19)=-11
+      imut(4,20)=-8
+      imut(4,21)=6
+      imut(4,22)=1
+      imut(4,23)=-1
+      imut(4,24)=-17
+      imut(5,1)=-6
+      imut(5,2)=-8
+      imut(5,3)=-11
+      imut(5,4)=-14
+      imut(5,5)=10
+      imut(5,6)=-14
+      imut(5,7)=-14
+      imut(5,8)=-9
+      imut(5,9)=-7
+      imut(5,10)=-6
+      imut(5,11)=-15
+      imut(5,12)=-14
+      imut(5,13)=-13
+      imut(5,14)=-13
+      imut(5,15)=-8
+      imut(5,16)=-3
+      imut(5,17)=-8
+      imut(5,18)=-15
+      imut(5,19)=-4
+      imut(5,20)=-6
+      imut(5,21)=-12
+      imut(5,22)=-14
+      imut(5,23)=-1
+      imut(5,24)=-17
+      imut(6,1)=-4
+      imut(6,2)=-2
+      imut(6,3)=-3
+      imut(6,4)=-2
+      imut(6,5)=-14
+      imut(6,6)=8
+      imut(6,7)=1
+      imut(6,8)=-7
+      imut(6,9)=1
+      imut(6,10)=-8
+      imut(6,11)=-5
+      imut(6,12)=-3
+      imut(6,13)=-4
+      imut(6,14)=-13
+      imut(6,15)=-3
+      imut(6,16)=-5
+      imut(6,17)=-5
+      imut(6,18)=-13
+      imut(6,19)=-12
+      imut(6,20)=-7
+      imut(6,21)=-3
+      imut(6,22)=6
+      imut(6,23)=-1
+      imut(6,24)=-17
+      imut(7,1)=-2
+      imut(7,2)=-9
+      imut(7,3)=-2
+      imut(7,4)=2
+      imut(7,5)=-14
+      imut(7,6)=1
+      imut(7,7)=8
+      imut(7,8)=-4
+      imut(7,9)=-5
+      imut(7,10)=-5
+      imut(7,11)=-9
+      imut(7,12)=-4
+      imut(7,13)=-7
+      imut(7,14)=-14
+      imut(7,15)=-5
+      imut(7,16)=-4
+      imut(7,17)=-6
+      imut(7,18)=-17
+      imut(7,19)=-8
+      imut(7,20)=-6
+      imut(7,21)=1
+      imut(7,22)=6
+      imut(7,23)=-1
+      imut(7,24)=-17
+      imut(8,1)=-2
+      imut(8,2)=-9
+      imut(8,3)=-3
+      imut(8,4)=-3
+      imut(8,5)=-9
+      imut(8,6)=-7
+      imut(8,7)=-4
+      imut(8,8)=6
+      imut(8,9)=-9
+      imut(8,10)=-11
+      imut(8,11)=-10
+      imut(8,12)=-7
+      imut(8,13)=-8
+      imut(8,14)=-9
+      imut(8,15)=-6
+      imut(8,16)=-2
+      imut(8,17)=-6
+      imut(8,18)=-15
+      imut(8,19)=-14
+      imut(8,20)=-5
+      imut(8,21)=-3
+      imut(8,22)=-5
+      imut(8,23)=-1
+      imut(8,24)=-17
+      imut(9,1)=-7
+      imut(9,2)=-2
+      imut(9,3)=0
+      imut(9,4)=-4
+      imut(9,5)=-7
+      imut(9,6)=1
+      imut(9,7)=-5
+      imut(9,8)=-9
+      imut(9,9)=9
+      imut(9,10)=-9
+      imut(9,11)=-6
+      imut(9,12)=-6
+      imut(9,13)=-10
+      imut(9,14)=-6
+      imut(9,15)=-4
+      imut(9,16)=-6
+      imut(9,17)=-7
+      imut(9,18)=-7
+      imut(9,19)=-3
+      imut(9,20)=-6
+      imut(9,21)=-1
+      imut(9,22)=-1
+      imut(9,23)=-1
+      imut(9,24)=-17
+      imut(10,1)=-5
+      imut(10,2)=-5
+      imut(10,3)=-5
+      imut(10,4)=-7
+      imut(10,5)=-6
+      imut(10,6)=-8
+      imut(10,7)=-5
+      imut(10,8)=-11
+      imut(10,9)=-9
+      imut(10,10)=8
+      imut(10,11)=-1
+      imut(10,12)=-6
+      imut(10,13)=-1
+      imut(10,14)=-2
+      imut(10,15)=-8
+      imut(10,16)=-7
+      imut(10,17)=-2
+      imut(10,18)=-14
+      imut(10,19)=-6
+      imut(10,20)=2
+      imut(10,21)=-6
+      imut(10,22)=-6
+      imut(10,23)=-1
+      imut(10,24)=-17
+      imut(11,1)=-6
+      imut(11,2)=-8
+      imut(11,3)=-7
+      imut(11,4)=-12
+      imut(11,5)=-15
+      imut(11,6)=-5
+      imut(11,7)=-9
+      imut(11,8)=-10
+      imut(11,9)=-6
+      imut(11,10)=-1
+      imut(11,11)=7
+      imut(11,12)=-8
+      imut(11,13)=1
+      imut(11,14)=-3
+      imut(11,15)=-7
+      imut(11,16)=-8
+      imut(11,17)=-7
+      imut(11,18)=-6
+      imut(11,19)=-7
+      imut(11,20)=-2
+      imut(11,21)=-9
+      imut(11,22)=-7
+      imut(11,23)=-1
+      imut(11,24)=-17
+      imut(12,1)=-7
+      imut(12,2)=0
+      imut(12,3)=-1
+      imut(12,4)=-4
+      imut(12,5)=-14
+      imut(12,6)=-3
+      imut(12,7)=-4
+      imut(12,8)=-7
+      imut(12,9)=-6
+      imut(12,10)=-6
+      imut(12,11)=-8
+      imut(12,12)=7
+      imut(12,13)=-2
+      imut(12,14)=-14
+      imut(12,15)=-6
+      imut(12,16)=-4
+      imut(12,17)=-3
+      imut(12,18)=-12
+      imut(12,19)=-9
+      imut(12,20)=-9
+      imut(12,21)=-2
+      imut(12,22)=-4
+      imut(12,23)=-1
+      imut(12,24)=-17
+      imut(13,1)=-5
+      imut(13,2)=-4
+      imut(13,3)=-9
+      imut(13,4)=-11
+      imut(13,5)=-13
+      imut(13,6)=-4
+      imut(13,7)=-7
+      imut(13,8)=-8
+      imut(13,9)=-10
+      imut(13,10)=-1
+      imut(13,11)=1
+      imut(13,12)=-2
+      imut(13,13)=11
+      imut(13,14)=-4
+      imut(13,15)=-8
+      imut(13,16)=-5
+      imut(13,17)=-4
+      imut(13,18)=-13
+      imut(13,19)=-11
+      imut(13,20)=-1
+      imut(13,21)=-10
+      imut(13,22)=-5
+      imut(13,23)=-1
+      imut(13,24)=-17
+      imut(14,1)=-8
+      imut(14,2)=-9
+      imut(14,3)=-9
+      imut(14,4)=-15
+      imut(14,5)=-13
+      imut(14,6)=-13
+      imut(14,7)=-14
+      imut(14,8)=-9
+      imut(14,9)=-6
+      imut(14,10)=-2
+      imut(14,11)=-3
+      imut(14,12)=-14
+      imut(14,13)=-4
+      imut(14,14)=9
+      imut(14,15)=-10
+      imut(14,16)=-6
+      imut(14,17)=-9
+      imut(14,18)=-4
+      imut(14,19)=2
+      imut(14,20)=-8
+      imut(14,21)=-10
+      imut(14,22)=-13
+      imut(14,23)=-1
+      imut(14,24)=-17
+      imut(15,1)=-2
+      imut(15,2)=-4
+      imut(15,3)=-6
+      imut(15,4)=-8
+      imut(15,5)=-8
+      imut(15,6)=-3
+      imut(15,7)=-5
+      imut(15,8)=-6
+      imut(15,9)=-4
+      imut(15,10)=-8
+      imut(15,11)=-7
+      imut(15,12)=-6
+      imut(15,13)=-8
+      imut(15,14)=-10
+      imut(15,15)=8
+      imut(15,16)=-2
+      imut(15,17)=-4
+      imut(15,18)=-14
+      imut(15,19)=-13
+      imut(15,20)=-6
+      imut(15,21)=-7
+      imut(15,22)=-4
+      imut(15,23)=-1
+      imut(15,24)=-17
+      imut(16,1)=0
+      imut(16,2)=-3
+      imut(16,3)=0
+      imut(16,4)=-4
+      imut(16,5)=-3
+      imut(16,6)=-5
+      imut(16,7)=-4
+      imut(16,8)=-2
+      imut(16,9)=-6
+      imut(16,10)=-7
+      imut(16,11)=-8
+      imut(16,12)=-4
+      imut(16,13)=-5
+      imut(16,14)=-6
+      imut(16,15)=-2
+      imut(16,16)=6
+      imut(16,17)=0
+      imut(16,18)=-5
+      imut(16,19)=-7
+      imut(16,20)=-6
+      imut(16,21)=-1
+      imut(16,22)=-5
+      imut(16,23)=-1
+      imut(16,24)=-17
+      imut(17,1)=-1
+      imut(17,2)=-6
+      imut(17,3)=-2
+      imut(17,4)=-5
+      imut(17,5)=-8
+      imut(17,6)=-5
+      imut(17,7)=-6
+      imut(17,8)=-6
+      imut(17,9)=-7
+      imut(17,10)=-2
+      imut(17,11)=-7
+      imut(17,12)=-3
+      imut(17,13)=-4
+      imut(17,14)=-9
+      imut(17,15)=-4
+      imut(17,16)=0
+      imut(17,17)=7
+      imut(17,18)=-13
+      imut(17,19)=-6
+      imut(17,20)=-3
+      imut(17,21)=-3
+      imut(17,22)=-6
+      imut(17,23)=-1
+      imut(17,24)=-17
+      imut(18,1)=-13
+      imut(18,2)=-2
+      imut(18,3)=-8
+      imut(18,4)=-15
+      imut(18,5)=-15
+      imut(18,6)=-13
+      imut(18,7)=-17
+      imut(18,8)=-15
+      imut(18,9)=-7
+      imut(18,10)=-14
+      imut(18,11)=-6
+      imut(18,12)=-12
+      imut(18,13)=-13
+      imut(18,14)=-4
+      imut(18,15)=-14
+      imut(18,16)=-5
+      imut(18,17)=-13
+      imut(18,18)=13
+      imut(18,19)=-5
+      imut(18,20)=-15
+      imut(18,21)=-10
+      imut(18,22)=-14
+      imut(18,23)=-1
+      imut(18,24)=-17
+      imut(19,1)=-8
+      imut(19,2)=-10
+      imut(19,3)=-4
+      imut(19,4)=-11
+      imut(19,5)=-4
+      imut(19,6)=-12
+      imut(19,7)=-8
+      imut(19,8)=-14
+      imut(19,9)=-3
+      imut(19,10)=-6
+      imut(19,11)=-7
+      imut(19,12)=-9
+      imut(19,13)=-11
+      imut(19,14)=2
+      imut(19,15)=-13
+      imut(19,16)=-7
+      imut(19,17)=-6
+      imut(19,18)=-5
+      imut(19,19)=10
+      imut(19,20)=-7
+      imut(19,21)=-6
+      imut(19,22)=-9
+      imut(19,23)=-1
+      imut(19,24)=-17
+      imut(20,1)=-2
+      imut(20,2)=-8
+      imut(20,3)=-8
+      imut(20,4)=-8
+      imut(20,5)=-6
+      imut(20,6)=-7
+      imut(20,7)=-6
+      imut(20,8)=-5
+      imut(20,9)=-6
+      imut(20,10)=2
+      imut(20,11)=-2
+      imut(20,12)=-9
+      imut(20,13)=-1
+      imut(20,14)=-8
+      imut(20,15)=-6
+      imut(20,16)=-6
+      imut(20,17)=-3
+      imut(20,18)=-15
+      imut(20,19)=-7
+      imut(20,20)=7
+      imut(20,21)=-8
+      imut(20,22)=-6
+      imut(20,23)=-1
+      imut(20,24)=-17
+      imut(21,1)=-3
+      imut(21,2)=-7
+      imut(21,3)=6
+      imut(21,4)=6
+      imut(21,5)=-12
+      imut(21,6)=-3
+      imut(21,7)=1
+      imut(21,8)=-3
+      imut(21,9)=-1
+      imut(21,10)=-6
+      imut(21,11)=-9
+      imut(21,12)=-2
+      imut(21,13)=-10
+      imut(21,14)=-10
+      imut(21,15)=-7
+      imut(21,16)=-1
+      imut(21,17)=-3
+      imut(21,18)=-10
+      imut(21,19)=-6
+      imut(21,20)=-8
+      imut(21,21)=6
+      imut(21,22)=0
+      imut(21,23)=-1
+      imut(21,24)=-17
+      imut(22,1)=-3
+      imut(22,2)=-4
+      imut(22,3)=-3
+      imut(22,4)=1
+      imut(22,5)=-14
+      imut(22,6)=6
+      imut(22,7)=6
+      imut(22,8)=-5
+      imut(22,9)=-1
+      imut(22,10)=-6
+      imut(22,11)=-7
+      imut(22,12)=-4
+      imut(22,13)=-5
+      imut(22,14)=-13
+      imut(22,15)=-4
+      imut(22,16)=-5
+      imut(22,17)=-6
+      imut(22,18)=-14
+      imut(22,19)=-9
+      imut(22,20)=-6
+      imut(22,21)=0
+      imut(22,22)=6
+      imut(22,23)=-1
+      imut(22,24)=-17
+      imut(23,1)=-1
+      imut(23,2)=-1
+      imut(23,3)=-1
+      imut(23,4)=-1
+      imut(23,5)=-1
+      imut(23,6)=-1
+      imut(23,7)=-1
+      imut(23,8)=-1
+      imut(23,9)=-1
+      imut(23,10)=-1
+      imut(23,11)=-1
+      imut(23,12)=-1
+      imut(23,13)=-1
+      imut(23,14)=-1
+      imut(23,15)=-1
+      imut(23,16)=-1
+      imut(23,17)=-1
+      imut(23,18)=-1
+      imut(23,19)=-1
+      imut(23,20)=-1
+      imut(23,21)=-1
+      imut(23,22)=-1
+      imut(23,23)=-1
+      imut(23,24)=-17
+      imut(24,1)=-17
+      imut(24,2)=-17
+      imut(24,3)=-17
+      imut(24,4)=-17
+      imut(24,5)=-17
+      imut(24,6)=-17
+      imut(24,7)=-17
+      imut(24,8)=-17
+      imut(24,9)=-17
+      imut(24,10)=-17
+      imut(24,11)=-17
+      imut(24,12)=-17
+      imut(24,13)=-17
+      imut(24,14)=-17
+      imut(24,15)=-17
+      imut(24,16)=-17
+      imut(24,17)=-17
+      imut(24,18)=-17
+      imut(24,19)=-17
+      imut(24,20)=-17
+      imut(24,21)=-17
+      imut(24,22)=-17
+      imut(24,23)=-17
+      imut(24,24)=1
+      
+      return
+      end
+      
+      function upper(A)
+      CHARACTER A,upper
+      IF(A.LE.'z'.and.A.GE.'a')then
+         A=CHAR(ICHAR(A)-32)
+      endif
+      upper=A
+      RETURN
+      END