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

Uploaded
author cbib
date Wed, 10 Nov 2021 15:15:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:0c6cfb9906f3
1 *************************************************************************
2 * This is a program for protein sequence alignment using the standard
3 * Needleman-Wunsch dynamic programming. The mutation matrix is from
4 * PAM30 with gap openning penaly=-11 and gap extension panalty=-1.
5 * The program can be freely copied and modified provided the notices
6 * on the head are retained. Comments and bug report should be addressed
7 * to Yang Zhang (Email: zhng@umich.edu). Last update is in 2010/08/03.
8 *
9 * Instructions:
10 * 1, the program can be compiled by
11 * >gfortran -static -O3 -ffast-math -lm -o align align.f
12 * 2, simply running the program will give a brief note on how to use it
13 * 3, You can run the program in following convenient ways:
14 * >align F1.fasta F2.fasta (align two sequences in fasta file)
15 * >align F1.pdb F2.pdb 1 (align two sequences in PDB file)
16 * >align F1.fasta F2.pdb 2 (align Sequence 1 in fasta and 2 in pdb)
17 * >align GKDGL EVADELVSE 3 (align sequences typed by keyboard)
18 * >align GKDGL F.fasta 4 (align Seq-1 by keyboard and 2 in fasta)
19 * >align GKDGL F.pdb 5 (align Seq-1 by keyboard and 2 in pdb)
20 *************************************************************************
21
22 program compares
23 PARAMETER(ndim=6000)
24 parameter(naa=24) !number of amino acid
25 common/dpc/score(ndim,ndim),gap_open,gap_extn,j2i(ndim)
26 & ,nseq1,nseq2
27 common/matra/imut(naa,naa) !b,z,x are additional
28
29 integer seq1(ndim),seq2(ndim)
30 character*10000 fnam1,fnam2,fnam3,fnam4
31 character*10000 s
32 character*3 aa(naa),aanam
33 character seqw(naa),upper
34 character*100 du,ad
35 character sequenceA(ndim),sequenceB(ndim),sequenceM(ndim)
36
37 *---------------------- 24 amino acids ---------------------
38 data aa/'ALA','ARG','ASN','ASP','CYS','GLN','GLU',
39 & 'GLY','HIS','ILE','LEU','LYS','MET','PHE','PRO','SER',
40 & 'THR','TRP','TYR','VAL','ASX','GLX','UNK','STOP'/
41 data seqw/'A','R','N','D','C','Q','E','G','H','I','L','K',
42 & 'M','F','P','S','T','W','Y','V','B','Z','X','*'/
43
44 call getarg(1,fnam1)
45 call getarg(2,fnam2)
46 call getarg(3,fnam3)
47 call getarg(4,fnam4)
48
49 if(fnam1.eq.' ')then
50 write(*,*)'align F1.fasta F2.fasta ',
51 & '(align two sequences in fasta file)'
52 write(*,*)'align F1.pdb F2.pdb 1 ',
53 & '(align two sequences in PDB file)'
54 write(*,*)'align F1.fasta F2.pdb 2 ',
55 & '(align Sequence 1 in fasta and 2 in pdb)'
56 write(*,*)'align GKDGL EVADELVSE 3 ',
57 & '(align two sequences typed by keyboard)'
58 write(*,*)'align GKDGL F.fasta 4 ',
59 & '(align Sequence 1 by keyboard and 2 in fasta)'
60 write(*,*)'align GKDGL F.pdb 5 ',
61 & '(align Sequence 1 by keyboard and 2 in pdb)'
62 goto 999
63 endif
64
65 *1******* read sequences ------------------------->
66 if(fnam3.eq.'5')then !direct, 555555555555555555
67 *** read sequence1:
68 i=0
69 do k=1,10000
70 fnam1(k:k)=upper(fnam1(k:k))
71 do j=1,naa
72 if(fnam1(k:k).eq.seqw(j))then
73 i=i+1
74 seq1(i)=j
75 goto 5
76 endif
77 enddo
78 if(fnam1(k:k).ne.'-')goto 55 !same time
79 5 continue
80 if(i.ge.ndim)goto 55
81 enddo
82 55 continue
83 nseq1=i
84 *** read sequence2:
85 open(unit=10,file=fnam2,status='old')
86 i=0
87 do while (.true.)
88 read(10,1,end=551) s
89 if(i.gt.0.and.s(1:3).eq.'TER')goto 551
90 if(s(1:3).eq.'ATO')then
91 if(s(13:16).eq.'CA '.or.s(13:16).eq.' CA '.
92 & or.s(13:16).eq.' CA')then
93 i=i+1
94 read(s,111)du,aanam
95 do j=1,naa
96 if(aanam.eq.aa(j))seq2(i)=j
97 enddo
98 endif
99 endif
100 if(i.ge.ndim)goto 551
101 enddo
102 551 continue
103 close(10)
104 nseq2=i
105 elseif(fnam3.eq.'4')then !direct, 444444444444444444444444444
106 *** read sequence1:
107 i=0
108 do k=1,10000
109 fnam1(k:k)=upper(fnam1(k:k))
110 do j=1,naa
111 if(fnam1(k:k).eq.seqw(j))then
112 i=i+1
113 seq1(i)=j
114 goto 4
115 endif
116 enddo
117 if(fnam1(k:k).ne.'-')goto 44
118 4 continue
119 if(i.ge.ndim)goto 44
120 enddo
121 44 continue
122 nseq1=i
123 *** read sequence2:
124 open(unit=10,file=fnam2,status='old')
125 i=0
126 do while(.true.)
127 read(10,1,end=443)s
128 if(s(1:1).eq.'>')goto 442
129 do k=1,10000
130 s(k:k)=upper(s(k:k))
131 do j=1,naa
132 if(s(k:k).eq.seqw(j))then
133 i=i+1
134 seq2(i)=j
135 goto 441
136 endif
137 enddo
138 if(s(k:k).ne.'-')goto 442 !same time
139 441 continue
140 enddo
141 442 continue
142 if(i.ge.ndim)goto 443
143 enddo
144 443 continue
145 close(10)
146 nseq2=i
147
148
149 elseif(fnam3.eq.'3')then !direct, 33333333333333333333333333333333333
150 *** read sequence1:
151 i=0
152 do k=1,10000
153 fnam1(k:k)=upper(fnam1(k:k))
154 do j=1,naa
155 if(fnam1(k:k).eq.seqw(j))then
156 i=i+1
157 seq1(i)=j
158 goto 3
159 endif
160 enddo
161 if(fnam1(k:k).ne.'-')goto 33
162 3 continue
163 if(i.ge.ndim)goto 33
164 enddo
165 33 continue
166 nseq1=i
167 *** read sequence2:
168 i=0
169 do k=1,10000
170 fnam2(k:k)=upper(fnam2(k:k))
171 do j=1,naa
172 if(fnam2(k:k).eq.seqw(j))then
173 i=i+1
174 seq2(i)=j
175 goto 331
176 endif
177 enddo
178 if(fnam2(k:k).ne.'-')goto 332
179 331 continue
180 if(i.ge.ndim)goto 332
181 enddo
182 332 continue
183 nseq2=i
184 elseif(fnam3.eq.'1')then !pdb,pdb, 11111111111111111111111111111
185 *** read sequence1:
186 open(unit=10,file=fnam1,status='old')
187 i=0
188 do while (.true.)
189 read(10,1,end=11) s
190 if(i.gt.0.and.s(1:3).eq.'TER')goto 11
191 if(s(1:3).eq.'ATO')then
192 if(s(13:16).eq.'CA '.or.s(13:16).eq.' CA '.
193 & or.s(13:16).eq.' CA')then
194 i=i+1
195 read(s,111)du,aanam
196 do j=1,naa
197 if(aanam.eq.aa(j))seq1(i)=j
198 enddo
199 endif
200 endif
201 if(i.ge.ndim)goto 11
202 enddo
203 1 format(A10000)
204 11 continue
205 111 format(A17,A3)
206 close(10)
207 nseq1=i
208 *** read sequence2:
209 open(unit=10,file=fnam2,status='old')
210 i=0
211 do while (.true.)
212 read(10,1,end=112) s
213 if(i.gt.0.and.s(1:3).eq.'TER')goto 112
214 if(s(1:3).eq.'ATO')then
215 if(s(13:16).eq.'CA '.or.s(13:16).eq.' CA '.
216 & or.s(13:16).eq.' CA')then
217 i=i+1
218 read(s,111)du,aanam
219 do j=1,naa
220 if(aanam.eq.aa(j))seq2(i)=j
221 enddo
222 endif
223 endif
224 if(i.ge.ndim)goto 112
225 enddo
226 112 continue
227 close(10)
228 nseq2=i
229 elseif(fnam3.eq.'2')then !seq,pdb 2222222222222222222222222222222
230 *** read sequence1:
231 open(unit=10,file=fnam1,status='old')
232 i=0
233 do while(.true.)
234 read(10,1,end=221)s
235 if(s(1:1).eq.'>')goto 22
236 do k=1,10000
237 s(k:k)=upper(s(k:k))
238 do j=1,naa
239 if(s(k:k).eq.seqw(j))then
240 i=i+1
241 seq1(i)=j
242 goto 2
243 endif
244 enddo
245 if(s(k:k).ne.'-')goto 22
246 2 continue
247 enddo
248 22 continue
249 if(i.ge.ndim)goto 221
250 enddo
251 221 continue
252 close(10)
253 nseq1=i
254 *** read sequence2:
255 open(unit=10,file=fnam2,status='old')
256 i=0
257 do while (.true.)
258 read(10,1,end=222) s
259 if(i.gt.0.and.s(1:3).eq.'TER')goto 222
260 if(s(1:3).eq.'ATO')then
261 if(s(13:16).eq.'CA '.or.s(13:16).eq.' CA '.
262 & or.s(13:16).eq.' CA')then
263 i=i+1
264 read(s,111)du,aanam
265 do j=1,naa
266 if(aanam.eq.aa(j))seq2(i)=j
267 enddo
268 endif
269 endif
270 if(i.ge.ndim)goto 222
271 enddo
272 222 continue
273 close(10)
274 nseq2=i
275 else !seq,seq 00000000000000000000000000000000
276 *** read sequence1:
277 open(unit=10,file=fnam1,status='old')
278 i=0
279 do while(.true.)
280 read(10,1,end=881)s
281 if(s(1:1).eq.'>')goto 88
282 do k=1,10000
283 s(k:k)=upper(s(k:k))
284 do j=1,naa
285 if(s(k:k).eq.seqw(j))then
286 i=i+1
287 seq1(i)=j
288 goto 8
289 endif
290 enddo
291 if(s(k:k).ne.'-')goto 88
292 8 continue
293 enddo
294 88 continue
295 if(i.ge.ndim)goto 881
296 enddo
297 881 continue
298 close(10)
299 nseq1=i
300 *** read sequence2:
301 open(unit=10,file=fnam2,status='old')
302 i=0
303 do while(.true.)
304 read(10,1,end=884)s
305 if(s(1:1).eq.'>')goto 883
306 do k=1,10000
307 s(k:k)=upper(s(k:k))
308 do j=1,naa
309 if(s(k:k).eq.seqw(j))then
310 i=i+1
311 seq2(i)=j
312 goto 882
313 endif
314 enddo
315 if(s(k:k).ne.'-')goto 883
316 882 continue
317 enddo
318 883 continue
319 if(i.ge.ndim)goto 884
320 enddo
321 884 continue
322 close(10)
323 nseq2=i
324 endif
325
326 *2** read mutation matrix ---------->
327 call matrix !take pam
328 *** set unit mutation matrix ---------->
329 c do i=1,naa
330 c do j=1,naa
331 c imut(i,j)=0
332 c enddo
333 c enddo
334 c do i=1,naa
335 c imut(i,i)=1
336 c enddo
337
338 *3** score------------------>
339 do i=1,nseq1
340 do j=1,nseq2
341 score(i,j)=imut(seq1(i),seq2(j))
342 enddo
343 enddo
344
345 *4*****************************************************************
346 * dynamatic program:
347 ******************************************************************
348 gap_open=-11
349 gap_extn=-1
350 call DP(score0) !W(k)=Go+Ge*k1+Go+Ge*k2, standard NW
351 c call DPalt(score0) !W(k)=Go+Ge*k1+Ge*k2, alternative NW
352
353 *5** calculate sequence identity---------------------------->
354 L_id=0
355 L_ali=0
356 do j=1,nseq2
357 if(j2i(j).gt.0)then
358 i=j2i(j)
359 L_ali=L_ali+1
360 if(seq1(i).eq.seq2(j))L_id=L_id+1
361 endif
362 enddo
363
364 write(*,*)
365 write(*,101)nseq1,fnam1
366 101 format('Length of sequence 1: ',I4,' ->',A10)
367 write(*,102)nseq2,fnam2
368 102 format('Length of sequence 2: ',I4,' ->',A10)
369 write(*,103)L_ali
370 103 format('Aligned length: ',I4)
371 write(*,104)L_id
372 104 format('Identical length: ',I4)
373 write(*,105)float(L_id)/(nseq2+0.00000001),L_id,nseq2
374 105 format('Sequence identity: ',F8.3,' (=',I4,'/',I4,')')
375 write(*,*)
376
377 *6******************************************************************
378 *** output aligned sequences
379 k=0 !final aligned order
380 i=1 !on sequence 1
381 j=1 !on sequence 2
382 800 continue
383 if(i.gt.nseq1.and.j.gt.nseq2)goto 802
384 if(i.gt.nseq1.and.j.le.nseq2)then !unaligned C on 1
385 k=k+1
386 sequenceA(k)='-'
387 sequenceB(k)=seqw(seq2(j))
388 sequenceM(k)=' '
389 j=j+1
390 goto 800
391 endif
392 if(i.le.nseq1.and.j.gt.nseq2)then !unaligned C on 2
393 k=k+1
394 sequenceA(k)=seqw(seq1(i))
395 sequenceB(k)='-'
396 sequenceM(k)=' '
397 i=i+1
398 goto 800
399 endif
400 if(i.eq.j2i(j))then !if aligned
401 k=k+1
402 sequenceA(k)=seqw(seq1(i))
403 sequenceB(k)=seqw(seq2(j))
404 if(seq1(i).eq.seq2(j))then !identical
405 sequenceM(k)=':'
406 else
407 sequenceM(k)=' '
408 endif
409 i=i+1
410 j=j+1
411 goto 800
412 elseif(j2i(j).lt.0)then !if gap on 1
413 k=k+1
414 sequenceA(k)='-'
415 sequenceB(k)=seqw(seq2(j))
416 sequenceM(k)=' '
417 j=j+1
418 goto 800
419 elseif(j2i(j).gt.0)then !if gap on 2
420 k=k+1
421 sequenceA(k)=seqW(seq1(i))
422 sequenceB(k)='-'
423 sequenceM(k)=' '
424 i=i+1
425 goto 800
426 endif
427 802 continue
428
429 write(*,601)(sequenceA(i),i=1,k)
430 write(*,601)(sequenceM(i),i=1,k)
431 write(*,601)(sequenceB(i),i=1,k)
432 write(*,602)(mod(i,10),i=1,k)
433 601 format(2000A1)
434 602 format(2000I1)
435 write(*,*)
436
437 c^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
438 c STOP
439 999 END
440
441 ********************************************************************
442 * This is a standard Needleman-Wunsch dynamic program (by Y. Zhang 2005)
443 * 1. Count multiple-gap.
444 * 2. The gap penality W(k)=Go+Ge*k1+Go+Ge*k2 if gap open on both sequences
445 *
446 * Input: score(i,j), gap_open, gap_extn
447 * Output: j2i(j)
448 * idir(i,j)=1,2,3, from diagonal, horizontal, vertical
449 * val(i,j) is the cumulative score of (i,j)
450 ********************************************************************
451 subroutine DP(score0)
452 PARAMETER(ndim=6000)
453 common/dpc/score(ndim,ndim),gap_open,gap_extn,j2i(ndim)
454 & ,nseq1,nseq2
455
456 dimension val(0:ndim,0:ndim),idir(0:ndim,0:ndim)
457 dimension jpV(0:ndim,0:ndim),jpH(0:ndim,0:ndim)
458 dimension preV(0:ndim,0:ndim),preH(0:ndim,0:ndim)
459 real D,V,H
460
461 ccc initializations --------------->
462 val(0,0)=0.0
463 do i=1,nseq1
464 val(i,0)=gap_extn*i
465 preV(i,0)=val(i,0) !not use preV at the beginning
466 idir(i,0)=0 !useless
467 jpV(i,0)=1 !useless
468 jpH(i,0)=i !useless
469 enddo
470 do j=1,nseq2
471 val(0,j)=gap_extn*j
472 preH(0,j)=val(0,j)
473 idir(0,j)=0
474 jpV(0,j)=j
475 jpH(0,j)=1
476 enddo
477
478 ccc DP ------------------------------>
479 do 111 j=1,nseq2
480 do 222 i=1,nseq1
481 ccc D=VAL(i-1,j-1)+SCORE(i,j)--------------->
482 D=val(i-1,j-1)+score(i,j) !from diagonal, val(i,j) is val(i-1,j-1)
483 ccc H=H+gap_open ------->
484 jpH(i,j)=1
485 val1=val(i-1,j)+gap_open !gap_open from both D and V
486 val2=preH(i-1,j)+gap_extn !gap_extn from horizontal
487 if(val1.gt.val2) then !last step from D or V
488 H=val1
489 else !last step from H
490 H=val2
491 if(i.gt.1)jpH(i,j)=jpH(i-1,j)+1 !record long-gap
492 endif
493 ccc V=V+gap_open --------->
494 jpV(i,j)=1
495 val1=val(i,j-1)+gap_open
496 val2=preV(i,j-1)+gap_extn
497 if(val1.gt.val2) then
498 V=val1
499 else
500 V=val2
501 if(j.gt.1)jpV(i,j)=jpV(i,j-1)+1
502 endif
503 preH(i,j)=H !unaccepted H
504 preV(i,j)=V !unaccepted V
505
506 if(D.gt.H.and.D.gt.V)then
507 idir(i,j)=1
508 val(i,j)=D
509 elseif(H.gt.V)then
510 idir(i,j)=2
511 val(i,j)=H
512 else
513 idir(i,j)=3
514 val(i,j)=V
515 endif
516 222 continue
517 111 continue
518 score0=val(nseq1,nseq2) !alignment score
519
520 c tracing back the pathway:
521 do j=1,nseq2
522 j2i(j)=-1 !all are not aligned
523 enddo
524 i=nseq1
525 j=nseq2
526 do while(i.gt.0.and.j.gt.0)
527 if(idir(i,j).eq.1)then !from diagonal
528 j2i(j)=i
529 i=i-1
530 j=j-1
531 elseif(idir(i,j).eq.2)then !from horizonal
532 it=jpH(i,j)
533 do me=1,it
534 if(i.gt.0) then
535 i=i-1
536 endif
537 enddo
538 else
539 it=jpV(i,j)
540 do me=1,it
541 if(j.gt.0) then
542 j=j-1
543 endif
544 enddo
545 endif
546 enddo
547
548 *^^^^^^^^^^^DP finished ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
549 return
550 end
551
552 ********************************************************************
553 * This is an alternative implementation of Needleman-Wunsch dynamic program
554 * (by Y. Zhang 2005)
555 * 1. Count two-layer iteration and multiple-gaps
556 * 2. The gap penality W(k)=Go+Ge*k1+Ge*k2 if gap open on both sequences
557 *
558 * Input: score(i,j), gap_open, gap_extn
559 * Output: j2i(j)
560 * idir(i,j)=1,2,3, from diagonal, horizontal, vertical
561 * val(i,j) is the cumulative score of (i,j)
562 ********************************************************************
563 subroutine DPalt(score0)
564 PARAMETER(ndim=6000)
565 common/dpc/score(ndim,ndim),gap_open,gap_extn,j2i(ndim)
566 & ,nseq1,nseq2
567
568 dimension val(0:ndim,0:ndim),idir(0:ndim,0:ndim)
569 dimension preV(0:ndim,0:ndim),preH(0:ndim,0:ndim),
570 & preD(0:ndim,0:ndim)
571 dimension idirH(0:ndim,0:ndim),idirV(0:ndim,0:ndim)
572
573 ccc initializations --------------->
574 val(0,0)=0.0
575 do i=1,nseq1
576 val(i,0)=0
577 idir(i,0)=0
578 preD(i,0)=0.0
579 preH(i,0)=-1000.0
580 preV(i,0)=-1000.0
581 enddo
582 do j=1,nseq2
583 val(0,j)=0
584 idir(0,j)=0
585 preD(0,j)=0.0
586 preH(0,j)=-1000.0
587 preV(0,j)=-1000.0
588 enddo
589
590 ccc DP ------------------------------>
591 do 111 j=1,nseq2
592 do 222 i=1,nseq1
593 ccc preD=VAL(i-1,j-1)+SCORE(i,j)--------------->
594 preD(i,j)=val(i-1,j-1)+score(i,j)
595 ccc preH: pre-accepted H----------------------->
596 D=preD(i-1,j)+gap_open
597 H=preH(i-1,j)+gap_extn
598 V=preV(i-1,j)+gap_extn
599 if(D.gt.H.and.D.gt.V)then
600 preH(i,j)=D
601 idirH(i-1,j)=1
602 elseif(H.gt.V)then
603 preH(i,j)=H
604 idirH(i-1,j)=2
605 else
606 preH(i,j)=V
607 idirH(i-1,j)=3
608 endif
609 ccc preV: pre-accepted V----------------------->
610 D=preD(i,j-1)+gap_open
611 H=preH(i,j-1)+gap_extn
612 V=preV(i,j-1)+gap_extn
613 if(D.gt.H.and.D.gt.V)then
614 preV(i,j)=D
615 idirV(i,j-1)=1
616 elseif(H.gt.V)then
617 preV(i,j)=H
618 idirV(i,j-1)=2
619 else
620 preV(i,j)=V
621 idirV(i,j-1)=3
622 endif
623
624 ccc decide idir(i,j)----------->
625 if(preD(i,j).gt.preH(i,j).and.preD(i,j).gt.preV(i,j))then
626 idir(i,j)=1
627 val(i,j)=preD(i,j)
628 elseif(preH(i,j).gt.preV(i,j))then
629 idir(i,j)=2
630 val(i,j)=preH(i,j)
631 else
632 idir(i,j)=3
633 val(i,j)=preV(i,j)
634 endif
635 222 continue
636 111 continue
637 score0=val(nseq1,nseq2) !alignment score
638
639 ccc tracing back the pathway:
640 do j=1,nseq2
641 j2i(j)=-1 !all are not aligned
642 enddo
643 i=nseq1
644 j=nseq2
645 do while(i.gt.0.and.j.gt.0)
646 if(idir(i,j).eq.1)then !from diagonal
647 j2i(j)=i
648 i=i-1
649 j=j-1
650 elseif(idir(i,j).eq.2)then
651 i=i-1
652 idir(i,j)=idirH(i,j)
653 else
654 j=j-1
655 idir(i,j)=idirV(i,j)
656 endif
657 enddo
658
659 *^^^^^^^^^^^DP finished ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
660 return
661 end
662
663 ********************************************************************
664 * read matrix
665 *
666 subroutine matrix
667 parameter(naa=24) !number of amino acid
668 common/matra/imut(naa,naa) !b,z,x are additional
669
670 * following from PAM30:
671 imut(1,1)=6
672 imut(1,2)=-7
673 imut(1,3)=-4
674 imut(1,4)=-3
675 imut(1,5)=-6
676 imut(1,6)=-4
677 imut(1,7)=-2
678 imut(1,8)=-2
679 imut(1,9)=-7
680 imut(1,10)=-5
681 imut(1,11)=-6
682 imut(1,12)=-7
683 imut(1,13)=-5
684 imut(1,14)=-8
685 imut(1,15)=-2
686 imut(1,16)=0
687 imut(1,17)=-1
688 imut(1,18)=-13
689 imut(1,19)=-8
690 imut(1,20)=-2
691 imut(1,21)=-3
692 imut(1,22)=-3
693 imut(1,23)=-1
694 imut(1,24)=-17
695 imut(2,1)=-7
696 imut(2,2)=8
697 imut(2,3)=-6
698 imut(2,4)=-10
699 imut(2,5)=-8
700 imut(2,6)=-2
701 imut(2,7)=-9
702 imut(2,8)=-9
703 imut(2,9)=-2
704 imut(2,10)=-5
705 imut(2,11)=-8
706 imut(2,12)=0
707 imut(2,13)=-4
708 imut(2,14)=-9
709 imut(2,15)=-4
710 imut(2,16)=-3
711 imut(2,17)=-6
712 imut(2,18)=-2
713 imut(2,19)=-10
714 imut(2,20)=-8
715 imut(2,21)=-7
716 imut(2,22)=-4
717 imut(2,23)=-1
718 imut(2,24)=-17
719 imut(3,1)=-4
720 imut(3,2)=-6
721 imut(3,3)=8
722 imut(3,4)=2
723 imut(3,5)=-11
724 imut(3,6)=-3
725 imut(3,7)=-2
726 imut(3,8)=-3
727 imut(3,9)=0
728 imut(3,10)=-5
729 imut(3,11)=-7
730 imut(3,12)=-1
731 imut(3,13)=-9
732 imut(3,14)=-9
733 imut(3,15)=-6
734 imut(3,16)=0
735 imut(3,17)=-2
736 imut(3,18)=-8
737 imut(3,19)=-4
738 imut(3,20)=-8
739 imut(3,21)=6
740 imut(3,22)=-3
741 imut(3,23)=-1
742 imut(3,24)=-17
743 imut(4,1)=-3
744 imut(4,2)=-10
745 imut(4,3)=2
746 imut(4,4)=8
747 imut(4,5)=-14
748 imut(4,6)=-2
749 imut(4,7)=2
750 imut(4,8)=-3
751 imut(4,9)=-4
752 imut(4,10)=-7
753 imut(4,11)=-12
754 imut(4,12)=-4
755 imut(4,13)=-11
756 imut(4,14)=-15
757 imut(4,15)=-8
758 imut(4,16)=-4
759 imut(4,17)=-5
760 imut(4,18)=-15
761 imut(4,19)=-11
762 imut(4,20)=-8
763 imut(4,21)=6
764 imut(4,22)=1
765 imut(4,23)=-1
766 imut(4,24)=-17
767 imut(5,1)=-6
768 imut(5,2)=-8
769 imut(5,3)=-11
770 imut(5,4)=-14
771 imut(5,5)=10
772 imut(5,6)=-14
773 imut(5,7)=-14
774 imut(5,8)=-9
775 imut(5,9)=-7
776 imut(5,10)=-6
777 imut(5,11)=-15
778 imut(5,12)=-14
779 imut(5,13)=-13
780 imut(5,14)=-13
781 imut(5,15)=-8
782 imut(5,16)=-3
783 imut(5,17)=-8
784 imut(5,18)=-15
785 imut(5,19)=-4
786 imut(5,20)=-6
787 imut(5,21)=-12
788 imut(5,22)=-14
789 imut(5,23)=-1
790 imut(5,24)=-17
791 imut(6,1)=-4
792 imut(6,2)=-2
793 imut(6,3)=-3
794 imut(6,4)=-2
795 imut(6,5)=-14
796 imut(6,6)=8
797 imut(6,7)=1
798 imut(6,8)=-7
799 imut(6,9)=1
800 imut(6,10)=-8
801 imut(6,11)=-5
802 imut(6,12)=-3
803 imut(6,13)=-4
804 imut(6,14)=-13
805 imut(6,15)=-3
806 imut(6,16)=-5
807 imut(6,17)=-5
808 imut(6,18)=-13
809 imut(6,19)=-12
810 imut(6,20)=-7
811 imut(6,21)=-3
812 imut(6,22)=6
813 imut(6,23)=-1
814 imut(6,24)=-17
815 imut(7,1)=-2
816 imut(7,2)=-9
817 imut(7,3)=-2
818 imut(7,4)=2
819 imut(7,5)=-14
820 imut(7,6)=1
821 imut(7,7)=8
822 imut(7,8)=-4
823 imut(7,9)=-5
824 imut(7,10)=-5
825 imut(7,11)=-9
826 imut(7,12)=-4
827 imut(7,13)=-7
828 imut(7,14)=-14
829 imut(7,15)=-5
830 imut(7,16)=-4
831 imut(7,17)=-6
832 imut(7,18)=-17
833 imut(7,19)=-8
834 imut(7,20)=-6
835 imut(7,21)=1
836 imut(7,22)=6
837 imut(7,23)=-1
838 imut(7,24)=-17
839 imut(8,1)=-2
840 imut(8,2)=-9
841 imut(8,3)=-3
842 imut(8,4)=-3
843 imut(8,5)=-9
844 imut(8,6)=-7
845 imut(8,7)=-4
846 imut(8,8)=6
847 imut(8,9)=-9
848 imut(8,10)=-11
849 imut(8,11)=-10
850 imut(8,12)=-7
851 imut(8,13)=-8
852 imut(8,14)=-9
853 imut(8,15)=-6
854 imut(8,16)=-2
855 imut(8,17)=-6
856 imut(8,18)=-15
857 imut(8,19)=-14
858 imut(8,20)=-5
859 imut(8,21)=-3
860 imut(8,22)=-5
861 imut(8,23)=-1
862 imut(8,24)=-17
863 imut(9,1)=-7
864 imut(9,2)=-2
865 imut(9,3)=0
866 imut(9,4)=-4
867 imut(9,5)=-7
868 imut(9,6)=1
869 imut(9,7)=-5
870 imut(9,8)=-9
871 imut(9,9)=9
872 imut(9,10)=-9
873 imut(9,11)=-6
874 imut(9,12)=-6
875 imut(9,13)=-10
876 imut(9,14)=-6
877 imut(9,15)=-4
878 imut(9,16)=-6
879 imut(9,17)=-7
880 imut(9,18)=-7
881 imut(9,19)=-3
882 imut(9,20)=-6
883 imut(9,21)=-1
884 imut(9,22)=-1
885 imut(9,23)=-1
886 imut(9,24)=-17
887 imut(10,1)=-5
888 imut(10,2)=-5
889 imut(10,3)=-5
890 imut(10,4)=-7
891 imut(10,5)=-6
892 imut(10,6)=-8
893 imut(10,7)=-5
894 imut(10,8)=-11
895 imut(10,9)=-9
896 imut(10,10)=8
897 imut(10,11)=-1
898 imut(10,12)=-6
899 imut(10,13)=-1
900 imut(10,14)=-2
901 imut(10,15)=-8
902 imut(10,16)=-7
903 imut(10,17)=-2
904 imut(10,18)=-14
905 imut(10,19)=-6
906 imut(10,20)=2
907 imut(10,21)=-6
908 imut(10,22)=-6
909 imut(10,23)=-1
910 imut(10,24)=-17
911 imut(11,1)=-6
912 imut(11,2)=-8
913 imut(11,3)=-7
914 imut(11,4)=-12
915 imut(11,5)=-15
916 imut(11,6)=-5
917 imut(11,7)=-9
918 imut(11,8)=-10
919 imut(11,9)=-6
920 imut(11,10)=-1
921 imut(11,11)=7
922 imut(11,12)=-8
923 imut(11,13)=1
924 imut(11,14)=-3
925 imut(11,15)=-7
926 imut(11,16)=-8
927 imut(11,17)=-7
928 imut(11,18)=-6
929 imut(11,19)=-7
930 imut(11,20)=-2
931 imut(11,21)=-9
932 imut(11,22)=-7
933 imut(11,23)=-1
934 imut(11,24)=-17
935 imut(12,1)=-7
936 imut(12,2)=0
937 imut(12,3)=-1
938 imut(12,4)=-4
939 imut(12,5)=-14
940 imut(12,6)=-3
941 imut(12,7)=-4
942 imut(12,8)=-7
943 imut(12,9)=-6
944 imut(12,10)=-6
945 imut(12,11)=-8
946 imut(12,12)=7
947 imut(12,13)=-2
948 imut(12,14)=-14
949 imut(12,15)=-6
950 imut(12,16)=-4
951 imut(12,17)=-3
952 imut(12,18)=-12
953 imut(12,19)=-9
954 imut(12,20)=-9
955 imut(12,21)=-2
956 imut(12,22)=-4
957 imut(12,23)=-1
958 imut(12,24)=-17
959 imut(13,1)=-5
960 imut(13,2)=-4
961 imut(13,3)=-9
962 imut(13,4)=-11
963 imut(13,5)=-13
964 imut(13,6)=-4
965 imut(13,7)=-7
966 imut(13,8)=-8
967 imut(13,9)=-10
968 imut(13,10)=-1
969 imut(13,11)=1
970 imut(13,12)=-2
971 imut(13,13)=11
972 imut(13,14)=-4
973 imut(13,15)=-8
974 imut(13,16)=-5
975 imut(13,17)=-4
976 imut(13,18)=-13
977 imut(13,19)=-11
978 imut(13,20)=-1
979 imut(13,21)=-10
980 imut(13,22)=-5
981 imut(13,23)=-1
982 imut(13,24)=-17
983 imut(14,1)=-8
984 imut(14,2)=-9
985 imut(14,3)=-9
986 imut(14,4)=-15
987 imut(14,5)=-13
988 imut(14,6)=-13
989 imut(14,7)=-14
990 imut(14,8)=-9
991 imut(14,9)=-6
992 imut(14,10)=-2
993 imut(14,11)=-3
994 imut(14,12)=-14
995 imut(14,13)=-4
996 imut(14,14)=9
997 imut(14,15)=-10
998 imut(14,16)=-6
999 imut(14,17)=-9
1000 imut(14,18)=-4
1001 imut(14,19)=2
1002 imut(14,20)=-8
1003 imut(14,21)=-10
1004 imut(14,22)=-13
1005 imut(14,23)=-1
1006 imut(14,24)=-17
1007 imut(15,1)=-2
1008 imut(15,2)=-4
1009 imut(15,3)=-6
1010 imut(15,4)=-8
1011 imut(15,5)=-8
1012 imut(15,6)=-3
1013 imut(15,7)=-5
1014 imut(15,8)=-6
1015 imut(15,9)=-4
1016 imut(15,10)=-8
1017 imut(15,11)=-7
1018 imut(15,12)=-6
1019 imut(15,13)=-8
1020 imut(15,14)=-10
1021 imut(15,15)=8
1022 imut(15,16)=-2
1023 imut(15,17)=-4
1024 imut(15,18)=-14
1025 imut(15,19)=-13
1026 imut(15,20)=-6
1027 imut(15,21)=-7
1028 imut(15,22)=-4
1029 imut(15,23)=-1
1030 imut(15,24)=-17
1031 imut(16,1)=0
1032 imut(16,2)=-3
1033 imut(16,3)=0
1034 imut(16,4)=-4
1035 imut(16,5)=-3
1036 imut(16,6)=-5
1037 imut(16,7)=-4
1038 imut(16,8)=-2
1039 imut(16,9)=-6
1040 imut(16,10)=-7
1041 imut(16,11)=-8
1042 imut(16,12)=-4
1043 imut(16,13)=-5
1044 imut(16,14)=-6
1045 imut(16,15)=-2
1046 imut(16,16)=6
1047 imut(16,17)=0
1048 imut(16,18)=-5
1049 imut(16,19)=-7
1050 imut(16,20)=-6
1051 imut(16,21)=-1
1052 imut(16,22)=-5
1053 imut(16,23)=-1
1054 imut(16,24)=-17
1055 imut(17,1)=-1
1056 imut(17,2)=-6
1057 imut(17,3)=-2
1058 imut(17,4)=-5
1059 imut(17,5)=-8
1060 imut(17,6)=-5
1061 imut(17,7)=-6
1062 imut(17,8)=-6
1063 imut(17,9)=-7
1064 imut(17,10)=-2
1065 imut(17,11)=-7
1066 imut(17,12)=-3
1067 imut(17,13)=-4
1068 imut(17,14)=-9
1069 imut(17,15)=-4
1070 imut(17,16)=0
1071 imut(17,17)=7
1072 imut(17,18)=-13
1073 imut(17,19)=-6
1074 imut(17,20)=-3
1075 imut(17,21)=-3
1076 imut(17,22)=-6
1077 imut(17,23)=-1
1078 imut(17,24)=-17
1079 imut(18,1)=-13
1080 imut(18,2)=-2
1081 imut(18,3)=-8
1082 imut(18,4)=-15
1083 imut(18,5)=-15
1084 imut(18,6)=-13
1085 imut(18,7)=-17
1086 imut(18,8)=-15
1087 imut(18,9)=-7
1088 imut(18,10)=-14
1089 imut(18,11)=-6
1090 imut(18,12)=-12
1091 imut(18,13)=-13
1092 imut(18,14)=-4
1093 imut(18,15)=-14
1094 imut(18,16)=-5
1095 imut(18,17)=-13
1096 imut(18,18)=13
1097 imut(18,19)=-5
1098 imut(18,20)=-15
1099 imut(18,21)=-10
1100 imut(18,22)=-14
1101 imut(18,23)=-1
1102 imut(18,24)=-17
1103 imut(19,1)=-8
1104 imut(19,2)=-10
1105 imut(19,3)=-4
1106 imut(19,4)=-11
1107 imut(19,5)=-4
1108 imut(19,6)=-12
1109 imut(19,7)=-8
1110 imut(19,8)=-14
1111 imut(19,9)=-3
1112 imut(19,10)=-6
1113 imut(19,11)=-7
1114 imut(19,12)=-9
1115 imut(19,13)=-11
1116 imut(19,14)=2
1117 imut(19,15)=-13
1118 imut(19,16)=-7
1119 imut(19,17)=-6
1120 imut(19,18)=-5
1121 imut(19,19)=10
1122 imut(19,20)=-7
1123 imut(19,21)=-6
1124 imut(19,22)=-9
1125 imut(19,23)=-1
1126 imut(19,24)=-17
1127 imut(20,1)=-2
1128 imut(20,2)=-8
1129 imut(20,3)=-8
1130 imut(20,4)=-8
1131 imut(20,5)=-6
1132 imut(20,6)=-7
1133 imut(20,7)=-6
1134 imut(20,8)=-5
1135 imut(20,9)=-6
1136 imut(20,10)=2
1137 imut(20,11)=-2
1138 imut(20,12)=-9
1139 imut(20,13)=-1
1140 imut(20,14)=-8
1141 imut(20,15)=-6
1142 imut(20,16)=-6
1143 imut(20,17)=-3
1144 imut(20,18)=-15
1145 imut(20,19)=-7
1146 imut(20,20)=7
1147 imut(20,21)=-8
1148 imut(20,22)=-6
1149 imut(20,23)=-1
1150 imut(20,24)=-17
1151 imut(21,1)=-3
1152 imut(21,2)=-7
1153 imut(21,3)=6
1154 imut(21,4)=6
1155 imut(21,5)=-12
1156 imut(21,6)=-3
1157 imut(21,7)=1
1158 imut(21,8)=-3
1159 imut(21,9)=-1
1160 imut(21,10)=-6
1161 imut(21,11)=-9
1162 imut(21,12)=-2
1163 imut(21,13)=-10
1164 imut(21,14)=-10
1165 imut(21,15)=-7
1166 imut(21,16)=-1
1167 imut(21,17)=-3
1168 imut(21,18)=-10
1169 imut(21,19)=-6
1170 imut(21,20)=-8
1171 imut(21,21)=6
1172 imut(21,22)=0
1173 imut(21,23)=-1
1174 imut(21,24)=-17
1175 imut(22,1)=-3
1176 imut(22,2)=-4
1177 imut(22,3)=-3
1178 imut(22,4)=1
1179 imut(22,5)=-14
1180 imut(22,6)=6
1181 imut(22,7)=6
1182 imut(22,8)=-5
1183 imut(22,9)=-1
1184 imut(22,10)=-6
1185 imut(22,11)=-7
1186 imut(22,12)=-4
1187 imut(22,13)=-5
1188 imut(22,14)=-13
1189 imut(22,15)=-4
1190 imut(22,16)=-5
1191 imut(22,17)=-6
1192 imut(22,18)=-14
1193 imut(22,19)=-9
1194 imut(22,20)=-6
1195 imut(22,21)=0
1196 imut(22,22)=6
1197 imut(22,23)=-1
1198 imut(22,24)=-17
1199 imut(23,1)=-1
1200 imut(23,2)=-1
1201 imut(23,3)=-1
1202 imut(23,4)=-1
1203 imut(23,5)=-1
1204 imut(23,6)=-1
1205 imut(23,7)=-1
1206 imut(23,8)=-1
1207 imut(23,9)=-1
1208 imut(23,10)=-1
1209 imut(23,11)=-1
1210 imut(23,12)=-1
1211 imut(23,13)=-1
1212 imut(23,14)=-1
1213 imut(23,15)=-1
1214 imut(23,16)=-1
1215 imut(23,17)=-1
1216 imut(23,18)=-1
1217 imut(23,19)=-1
1218 imut(23,20)=-1
1219 imut(23,21)=-1
1220 imut(23,22)=-1
1221 imut(23,23)=-1
1222 imut(23,24)=-17
1223 imut(24,1)=-17
1224 imut(24,2)=-17
1225 imut(24,3)=-17
1226 imut(24,4)=-17
1227 imut(24,5)=-17
1228 imut(24,6)=-17
1229 imut(24,7)=-17
1230 imut(24,8)=-17
1231 imut(24,9)=-17
1232 imut(24,10)=-17
1233 imut(24,11)=-17
1234 imut(24,12)=-17
1235 imut(24,13)=-17
1236 imut(24,14)=-17
1237 imut(24,15)=-17
1238 imut(24,16)=-17
1239 imut(24,17)=-17
1240 imut(24,18)=-17
1241 imut(24,19)=-17
1242 imut(24,20)=-17
1243 imut(24,21)=-17
1244 imut(24,22)=-17
1245 imut(24,23)=-17
1246 imut(24,24)=1
1247
1248 return
1249 end
1250
1251 function upper(A)
1252 CHARACTER A,upper
1253 IF(A.LE.'z'.and.A.GE.'a')then
1254 A=CHAR(ICHAR(A)-32)
1255 endif
1256 upper=A
1257 RETURN
1258 END