0
|
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
|