1 | /* Change int h to int gh everywhere DES June 1994 */ |
---|
2 | #include <stdio.h> |
---|
3 | #include <stdlib.h> |
---|
4 | #include <string.h> |
---|
5 | #include <math.h> |
---|
6 | #include "clustalw.h" |
---|
7 | |
---|
8 | #define MIN(a,b) ((a)<(b)?(a):(b)) |
---|
9 | #define MAX(a,b) ((a)>(b)?(a):(b)) |
---|
10 | |
---|
11 | #define gap(k) ((k) <= 0 ? 0 : g + gh * (k)) |
---|
12 | #define tbgap(k) ((k) <= 0 ? 0 : tb + gh * (k)) |
---|
13 | #define tegap(k) ((k) <= 0 ? 0 : te + gh * (k)) |
---|
14 | |
---|
15 | /* |
---|
16 | * Prototypes |
---|
17 | */ |
---|
18 | static void add(sint v); |
---|
19 | static sint calc_score(sint iat, sint jat, sint v1, sint v2); |
---|
20 | static float tracepath(sint tsb1,sint tsb2); |
---|
21 | static void forward_pass(char *ia, char *ib, sint n, sint m); |
---|
22 | static void reverse_pass(char *ia, char *ib); |
---|
23 | static sint diff(sint A, sint B, sint M, sint N, sint tb, sint te); |
---|
24 | static void del(sint k); |
---|
25 | |
---|
26 | /* |
---|
27 | * Global variables |
---|
28 | */ |
---|
29 | #ifdef MAC |
---|
30 | #define pwint short |
---|
31 | #else |
---|
32 | #define pwint int |
---|
33 | #endif |
---|
34 | static sint int_scale; |
---|
35 | |
---|
36 | extern double **tmat; |
---|
37 | extern float pw_go_penalty; |
---|
38 | extern float pw_ge_penalty; |
---|
39 | extern float transition_weight; |
---|
40 | extern sint nseqs; |
---|
41 | extern sint max_aa; |
---|
42 | extern sint gap_pos1,gap_pos2; |
---|
43 | extern sint max_aln_length; |
---|
44 | extern sint *seqlen_array; |
---|
45 | extern sint debug; |
---|
46 | extern sint mat_avscore; |
---|
47 | extern short blosum30mt[],pam350mt[],idmat[],pw_usermat[],pw_userdnamat[]; |
---|
48 | extern short clustalvdnamt[],swgapdnamt[]; |
---|
49 | extern short gon250mt[]; |
---|
50 | extern short def_dna_xref[],def_aa_xref[],pw_dna_xref[],pw_aa_xref[]; |
---|
51 | extern Boolean dnaflag; |
---|
52 | extern char **seq_array; |
---|
53 | extern char *amino_acid_codes; |
---|
54 | extern char pw_mtrxname[]; |
---|
55 | extern char pw_dnamtrxname[]; |
---|
56 | |
---|
57 | static float mm_score; |
---|
58 | static sint print_ptr,last_print; |
---|
59 | static sint *displ; |
---|
60 | static pwint *HH, *DD, *RR, *SS; |
---|
61 | static sint g, gh; |
---|
62 | static sint seq1, seq2; |
---|
63 | static sint matrix[NUMRES][NUMRES]; |
---|
64 | static pwint maxscore; |
---|
65 | static sint sb1, sb2, se1, se2; |
---|
66 | |
---|
67 | |
---|
68 | sint pairalign(sint istart, sint iend, sint jstart, sint jend) |
---|
69 | { |
---|
70 | short *mat_xref; |
---|
71 | static sint si, sj, i; |
---|
72 | static sint n,m,len1,len2; |
---|
73 | static sint maxres; |
---|
74 | static short *matptr; |
---|
75 | static char c; |
---|
76 | static float gscale,ghscale; |
---|
77 | |
---|
78 | displ = (sint *)ckalloc((2*max_aln_length+1) * sizeof(sint)); |
---|
79 | HH = (pwint *)ckalloc((max_aln_length) * sizeof(pwint)); |
---|
80 | DD = (pwint *)ckalloc((max_aln_length) * sizeof(pwint)); |
---|
81 | RR = (pwint *)ckalloc((max_aln_length) * sizeof(pwint)); |
---|
82 | SS = (pwint *)ckalloc((max_aln_length) * sizeof(pwint)); |
---|
83 | |
---|
84 | #ifdef MAC |
---|
85 | int_scale = 10; |
---|
86 | #else |
---|
87 | int_scale = 100; |
---|
88 | #endif |
---|
89 | gscale=ghscale=1.0; |
---|
90 | if (dnaflag) |
---|
91 | { |
---|
92 | if (debug>1) fprintf(stdout,"matrix %s\n",pw_dnamtrxname); |
---|
93 | if (strcmp(pw_dnamtrxname, "iub") == 0) |
---|
94 | { |
---|
95 | matptr = swgapdnamt; |
---|
96 | mat_xref = def_dna_xref; |
---|
97 | } |
---|
98 | else if (strcmp(pw_dnamtrxname, "clustalw") == 0) |
---|
99 | { |
---|
100 | matptr = clustalvdnamt; |
---|
101 | mat_xref = def_dna_xref; |
---|
102 | gscale=0.6667; |
---|
103 | ghscale=0.751; |
---|
104 | } |
---|
105 | else |
---|
106 | { |
---|
107 | matptr = pw_userdnamat; |
---|
108 | mat_xref = pw_dna_xref; |
---|
109 | } |
---|
110 | maxres = get_matrix(matptr, mat_xref, matrix, TRUE, int_scale); |
---|
111 | if (maxres == 0) return((sint)-1); |
---|
112 | |
---|
113 | matrix[0][4]=transition_weight*matrix[0][0]; |
---|
114 | matrix[4][0]=transition_weight*matrix[0][0]; |
---|
115 | matrix[2][11]=transition_weight*matrix[0][0]; |
---|
116 | matrix[11][2]=transition_weight*matrix[0][0]; |
---|
117 | matrix[2][12]=transition_weight*matrix[0][0]; |
---|
118 | matrix[12][2]=transition_weight*matrix[0][0]; |
---|
119 | } |
---|
120 | else |
---|
121 | { |
---|
122 | if (debug>1) fprintf(stdout,"matrix %s\n",pw_mtrxname); |
---|
123 | if (strcmp(pw_mtrxname, "blosum") == 0) |
---|
124 | { |
---|
125 | matptr = blosum30mt; |
---|
126 | mat_xref = def_aa_xref; |
---|
127 | } |
---|
128 | else if (strcmp(pw_mtrxname, "pam") == 0) |
---|
129 | { |
---|
130 | matptr = pam350mt; |
---|
131 | mat_xref = def_aa_xref; |
---|
132 | } |
---|
133 | else if (strcmp(pw_mtrxname, "gonnet") == 0) |
---|
134 | { |
---|
135 | matptr = gon250mt; |
---|
136 | int_scale /= 10; |
---|
137 | mat_xref = def_aa_xref; |
---|
138 | } |
---|
139 | else if (strcmp(pw_mtrxname, "id") == 0) |
---|
140 | { |
---|
141 | matptr = idmat; |
---|
142 | mat_xref = def_aa_xref; |
---|
143 | } |
---|
144 | else |
---|
145 | { |
---|
146 | matptr = pw_usermat; |
---|
147 | mat_xref = pw_aa_xref; |
---|
148 | } |
---|
149 | |
---|
150 | maxres = get_matrix(matptr, mat_xref, matrix, TRUE, int_scale); |
---|
151 | if (maxres == 0) return((sint)-1); |
---|
152 | } |
---|
153 | |
---|
154 | |
---|
155 | for (si=MAX(0,istart);si<nseqs && si<iend;si++) |
---|
156 | { |
---|
157 | n = seqlen_array[si+1]; |
---|
158 | len1 = 0; |
---|
159 | for (i=1;i<=n;i++) { |
---|
160 | c = seq_array[si+1][i]; |
---|
161 | if ((c!=gap_pos1) && (c != gap_pos2)) len1++; |
---|
162 | } |
---|
163 | |
---|
164 | for (sj=MAX(si+1,jstart+1);sj<nseqs && sj<jend;sj++) |
---|
165 | { |
---|
166 | m = seqlen_array[sj+1]; |
---|
167 | if(n==0 || m==0) { |
---|
168 | tmat[si+1][sj+1]=1.0; |
---|
169 | tmat[sj+1][si+1]=1.0; |
---|
170 | continue; |
---|
171 | } |
---|
172 | len2 = 0; |
---|
173 | for (i=1;i<=m;i++) { |
---|
174 | c = seq_array[sj+1][i]; |
---|
175 | if ((c!=gap_pos1) && (c != gap_pos2)) len2++; |
---|
176 | } |
---|
177 | |
---|
178 | if (dnaflag) { |
---|
179 | g = 2 * (float)pw_go_penalty * int_scale*gscale; |
---|
180 | gh = pw_ge_penalty * int_scale*ghscale; |
---|
181 | } |
---|
182 | else { |
---|
183 | if (mat_avscore <= 0) |
---|
184 | g = 2 * (float)(pw_go_penalty + log((double)(MIN(n,m))))*int_scale; |
---|
185 | else |
---|
186 | g = 2 * mat_avscore * (float)(pw_go_penalty + |
---|
187 | log((double)(MIN(n,m))))*gscale; |
---|
188 | gh = pw_ge_penalty * int_scale; |
---|
189 | } |
---|
190 | |
---|
191 | if (debug>1) fprintf(stdout,"go %d ge %d\n",(pint)g,(pint)gh); |
---|
192 | |
---|
193 | /* |
---|
194 | align the sequences |
---|
195 | */ |
---|
196 | seq1 = si+1; |
---|
197 | seq2 = sj+1; |
---|
198 | |
---|
199 | forward_pass(&seq_array[seq1][0], &seq_array[seq2][0], |
---|
200 | n, m); |
---|
201 | |
---|
202 | reverse_pass(&seq_array[seq1][0], &seq_array[seq2][0]); |
---|
203 | |
---|
204 | last_print = 0; |
---|
205 | print_ptr = 1; |
---|
206 | /* |
---|
207 | sb1 = sb2 = 1; |
---|
208 | se1 = n-1; |
---|
209 | se2 = m-1; |
---|
210 | */ |
---|
211 | |
---|
212 | /* use Myers and Miller to align two sequences */ |
---|
213 | |
---|
214 | maxscore = diff(sb1-1, sb2-1, se1-sb1+1, se2-sb2+1, |
---|
215 | (sint)0, (sint)0); |
---|
216 | |
---|
217 | /* calculate percentage residue identity */ |
---|
218 | |
---|
219 | mm_score = tracepath(sb1,sb2); |
---|
220 | |
---|
221 | if(len1==0 || len2==0) mm_score=0; |
---|
222 | else |
---|
223 | mm_score /= (float)MIN(len1,len2); |
---|
224 | |
---|
225 | tmat[si+1][sj+1] = ((float)100.0 - mm_score)/(float)100.0; |
---|
226 | tmat[sj+1][si+1] = ((float)100.0 - mm_score)/(float)100.0; |
---|
227 | |
---|
228 | if (debug>1) |
---|
229 | { |
---|
230 | fprintf(stdout,"Sequences (%d:%d) Aligned. Score: %d CompScore: %d\n", |
---|
231 | (pint)si+1,(pint)sj+1, |
---|
232 | (pint)mm_score, |
---|
233 | (pint)maxscore/(MIN(len1,len2)*100)); |
---|
234 | } |
---|
235 | else |
---|
236 | { |
---|
237 | info("Sequences (%d:%d) Aligned. Score: %d", |
---|
238 | (pint)si+1,(pint)sj+1, |
---|
239 | (pint)mm_score); |
---|
240 | } |
---|
241 | |
---|
242 | } |
---|
243 | } |
---|
244 | displ=ckfree((void *)displ); |
---|
245 | HH=ckfree((void *)HH); |
---|
246 | DD=ckfree((void *)DD); |
---|
247 | RR=ckfree((void *)RR); |
---|
248 | SS=ckfree((void *)SS); |
---|
249 | |
---|
250 | |
---|
251 | return((sint)1); |
---|
252 | } |
---|
253 | |
---|
254 | static void add(sint v) |
---|
255 | { |
---|
256 | |
---|
257 | if(last_print<0) { |
---|
258 | displ[print_ptr-1] = v; |
---|
259 | displ[print_ptr++] = last_print; |
---|
260 | } |
---|
261 | else |
---|
262 | last_print = displ[print_ptr++] = v; |
---|
263 | } |
---|
264 | |
---|
265 | static sint calc_score(sint iat,sint jat,sint v1,sint v2) |
---|
266 | { |
---|
267 | sint ipos,jpos; |
---|
268 | sint ret; |
---|
269 | |
---|
270 | ipos = v1 + iat; |
---|
271 | jpos = v2 + jat; |
---|
272 | |
---|
273 | ret=matrix[(int)seq_array[seq1][ipos]][(int)seq_array[seq2][jpos]]; |
---|
274 | |
---|
275 | return(ret); |
---|
276 | } |
---|
277 | |
---|
278 | |
---|
279 | static float tracepath(sint tsb1,sint tsb2) |
---|
280 | { |
---|
281 | char c1,c2; |
---|
282 | sint i1,i2,r; |
---|
283 | sint i,k,pos,to_do; |
---|
284 | sint count; |
---|
285 | float score; |
---|
286 | char s1[600], s2[600]; |
---|
287 | |
---|
288 | to_do=print_ptr-1; |
---|
289 | i1 = tsb1; |
---|
290 | i2 = tsb2; |
---|
291 | |
---|
292 | pos = 0; |
---|
293 | count = 0; |
---|
294 | for(i=1;i<=to_do;++i) { |
---|
295 | |
---|
296 | if (debug>1) fprintf(stdout,"%d ",(pint)displ[i]); |
---|
297 | if(displ[i]==0) { |
---|
298 | c1 = seq_array[seq1][i1]; |
---|
299 | c2 = seq_array[seq2][i2]; |
---|
300 | |
---|
301 | if (debug>0) |
---|
302 | { |
---|
303 | if (c1>max_aa) s1[pos] = '-'; |
---|
304 | else s1[pos]=amino_acid_codes[c1]; |
---|
305 | if (c2>max_aa) s2[pos] = '-'; |
---|
306 | else s2[pos]=amino_acid_codes[c2]; |
---|
307 | } |
---|
308 | |
---|
309 | if ((c1!=gap_pos1) && (c1 != gap_pos2) && |
---|
310 | (c1 == c2)) count++; |
---|
311 | ++i1; |
---|
312 | ++i2; |
---|
313 | ++pos; |
---|
314 | } |
---|
315 | else { |
---|
316 | if((k=displ[i])>0) { |
---|
317 | |
---|
318 | if (debug>0) |
---|
319 | for (r=0;r<k;r++) |
---|
320 | { |
---|
321 | s1[pos+r]='-'; |
---|
322 | if (seq_array[seq2][i2+r]>max_aa) s2[pos+r] = '-'; |
---|
323 | else s2[pos+r]=amino_acid_codes[seq_array[seq2][i2+r]]; |
---|
324 | } |
---|
325 | |
---|
326 | i2 += k; |
---|
327 | pos += k; |
---|
328 | } |
---|
329 | else { |
---|
330 | |
---|
331 | if (debug>0) |
---|
332 | for (r=0;r<(-k);r++) |
---|
333 | { |
---|
334 | s2[pos+r]='-'; |
---|
335 | if (seq_array[seq1][i1+r]>max_aa) s1[pos+r] = '-'; |
---|
336 | else s1[pos+r]=amino_acid_codes[seq_array[seq1][i1+r]]; |
---|
337 | } |
---|
338 | |
---|
339 | i1 -= k; |
---|
340 | pos -= k; |
---|
341 | } |
---|
342 | } |
---|
343 | } |
---|
344 | if (debug>0) fprintf(stdout,"\n"); |
---|
345 | if (debug>0) |
---|
346 | { |
---|
347 | for (i=0;i<pos;i++) fprintf(stdout,"%c",s1[i]); |
---|
348 | fprintf(stdout,"\n"); |
---|
349 | for (i=0;i<pos;i++) fprintf(stdout,"%c",s2[i]); |
---|
350 | fprintf(stdout,"\n"); |
---|
351 | } |
---|
352 | /* |
---|
353 | if (count <= 0) count = 1; |
---|
354 | */ |
---|
355 | score = 100.0 * (float)count; |
---|
356 | return(score); |
---|
357 | } |
---|
358 | |
---|
359 | |
---|
360 | static void forward_pass(char *ia, char *ib, sint n, sint m) |
---|
361 | { |
---|
362 | |
---|
363 | sint i,j; |
---|
364 | pwint f,hh,p,t; |
---|
365 | |
---|
366 | maxscore = 0; |
---|
367 | se1 = se2 = 0; |
---|
368 | for (i=0;i<=m;i++) |
---|
369 | { |
---|
370 | HH[i] = 0; |
---|
371 | DD[i] = -g; |
---|
372 | } |
---|
373 | |
---|
374 | for (i=1;i<=n;i++) |
---|
375 | { |
---|
376 | hh = p = 0; |
---|
377 | f = -g; |
---|
378 | |
---|
379 | for (j=1;j<=m;j++) |
---|
380 | { |
---|
381 | |
---|
382 | f -= gh; |
---|
383 | t = hh - g - gh; |
---|
384 | if (f<t) f = t; |
---|
385 | |
---|
386 | DD[j] -= gh; |
---|
387 | t = HH[j] - g - gh; |
---|
388 | if (DD[j]<t) DD[j] = t; |
---|
389 | |
---|
390 | hh = p + matrix[(int)ia[i]][(int)ib[j]]; |
---|
391 | if (hh<f) hh = f; |
---|
392 | if (hh<DD[j]) hh = DD[j]; |
---|
393 | if (hh<0) hh = 0; |
---|
394 | |
---|
395 | p = HH[j]; |
---|
396 | HH[j] = hh; |
---|
397 | |
---|
398 | if (hh > maxscore) |
---|
399 | { |
---|
400 | maxscore = hh; |
---|
401 | se1 = i; |
---|
402 | se2 = j; |
---|
403 | } |
---|
404 | } |
---|
405 | } |
---|
406 | |
---|
407 | } |
---|
408 | |
---|
409 | |
---|
410 | static void reverse_pass(char *ia, char *ib) |
---|
411 | { |
---|
412 | |
---|
413 | sint i,j; |
---|
414 | pwint f,hh,p,t; |
---|
415 | pwint cost; |
---|
416 | |
---|
417 | cost = 0; |
---|
418 | sb1 = sb2 = 1; |
---|
419 | for (i=se2;i>0;i--) |
---|
420 | { |
---|
421 | HH[i] = -1; |
---|
422 | DD[i] = -1; |
---|
423 | } |
---|
424 | |
---|
425 | for (i=se1;i>0;i--) |
---|
426 | { |
---|
427 | hh = f = -1; |
---|
428 | if (i == se1) p = 0; |
---|
429 | else p = -1; |
---|
430 | |
---|
431 | for (j=se2;j>0;j--) |
---|
432 | { |
---|
433 | |
---|
434 | f -= gh; |
---|
435 | t = hh - g - gh; |
---|
436 | if (f<t) f = t; |
---|
437 | |
---|
438 | DD[j] -= gh; |
---|
439 | t = HH[j] - g - gh; |
---|
440 | if (DD[j]<t) DD[j] = t; |
---|
441 | |
---|
442 | hh = p + matrix[(int)ia[i]][(int)ib[j]]; |
---|
443 | if (hh<f) hh = f; |
---|
444 | if (hh<DD[j]) hh = DD[j]; |
---|
445 | |
---|
446 | p = HH[j]; |
---|
447 | HH[j] = hh; |
---|
448 | |
---|
449 | if (hh > cost) |
---|
450 | { |
---|
451 | cost = hh; |
---|
452 | sb1 = i; |
---|
453 | sb2 = j; |
---|
454 | if (cost >= maxscore) break; |
---|
455 | } |
---|
456 | } |
---|
457 | if (cost >= maxscore) break; |
---|
458 | } |
---|
459 | |
---|
460 | } |
---|
461 | |
---|
462 | static int diff(sint A,sint B,sint M,sint N,sint tb,sint te) |
---|
463 | { |
---|
464 | sint type; |
---|
465 | sint midi,midj,i,j; |
---|
466 | int midh; |
---|
467 | static pwint f, hh, e, s, t; |
---|
468 | |
---|
469 | if(N<=0) { |
---|
470 | if(M>0) { |
---|
471 | del(M); |
---|
472 | } |
---|
473 | |
---|
474 | return(-(int)tbgap(M)); |
---|
475 | } |
---|
476 | |
---|
477 | if(M<=1) { |
---|
478 | if(M<=0) { |
---|
479 | add(N); |
---|
480 | return(-(int)tbgap(N)); |
---|
481 | } |
---|
482 | |
---|
483 | midh = -(tb+gh) - tegap(N); |
---|
484 | hh = -(te+gh) - tbgap(N); |
---|
485 | if (hh>midh) midh = hh; |
---|
486 | midj = 0; |
---|
487 | for(j=1;j<=N;j++) { |
---|
488 | hh = calc_score(1,j,A,B) |
---|
489 | - tegap(N-j) - tbgap(j-1); |
---|
490 | if(hh>midh) { |
---|
491 | midh = hh; |
---|
492 | midj = j; |
---|
493 | } |
---|
494 | } |
---|
495 | |
---|
496 | if(midj==0) { |
---|
497 | del(1); |
---|
498 | add(N); |
---|
499 | } |
---|
500 | else { |
---|
501 | if(midj>1) |
---|
502 | add(midj-1); |
---|
503 | displ[print_ptr++] = last_print = 0; |
---|
504 | if(midj<N) |
---|
505 | add(N-midj); |
---|
506 | } |
---|
507 | return midh; |
---|
508 | } |
---|
509 | |
---|
510 | /* Divide: Find optimum midpoint (midi,midj) of cost midh */ |
---|
511 | |
---|
512 | midi = M / 2; |
---|
513 | HH[0] = 0.0; |
---|
514 | t = -tb; |
---|
515 | for(j=1;j<=N;j++) { |
---|
516 | HH[j] = t = t-gh; |
---|
517 | DD[j] = t-g; |
---|
518 | } |
---|
519 | |
---|
520 | t = -tb; |
---|
521 | for(i=1;i<=midi;i++) { |
---|
522 | s=HH[0]; |
---|
523 | HH[0] = hh = t = t-gh; |
---|
524 | f = t-g; |
---|
525 | for(j=1;j<=N;j++) { |
---|
526 | if ((hh=hh-g-gh) > (f=f-gh)) f=hh; |
---|
527 | if ((hh=HH[j]-g-gh) > (e=DD[j]-gh)) e=hh; |
---|
528 | hh = s + calc_score(i,j,A,B); |
---|
529 | if (f>hh) hh = f; |
---|
530 | if (e>hh) hh = e; |
---|
531 | |
---|
532 | s = HH[j]; |
---|
533 | HH[j] = hh; |
---|
534 | DD[j] = e; |
---|
535 | } |
---|
536 | } |
---|
537 | |
---|
538 | DD[0]=HH[0]; |
---|
539 | |
---|
540 | RR[N]=0; |
---|
541 | t = -te; |
---|
542 | for(j=N-1;j>=0;j--) { |
---|
543 | RR[j] = t = t-gh; |
---|
544 | SS[j] = t-g; |
---|
545 | } |
---|
546 | |
---|
547 | t = -te; |
---|
548 | for(i=M-1;i>=midi;i--) { |
---|
549 | s = RR[N]; |
---|
550 | RR[N] = hh = t = t-gh; |
---|
551 | f = t-g; |
---|
552 | |
---|
553 | for(j=N-1;j>=0;j--) { |
---|
554 | |
---|
555 | if ((hh=hh-g-gh) > (f=f-gh)) f=hh; |
---|
556 | if ((hh=RR[j]-g-gh) > (e=SS[j]-gh)) e=hh; |
---|
557 | hh = s + calc_score(i+1,j+1,A,B); |
---|
558 | if (f>hh) hh = f; |
---|
559 | if (e>hh) hh = e; |
---|
560 | |
---|
561 | s = RR[j]; |
---|
562 | RR[j] = hh; |
---|
563 | SS[j] = e; |
---|
564 | |
---|
565 | } |
---|
566 | } |
---|
567 | |
---|
568 | SS[N]=RR[N]; |
---|
569 | |
---|
570 | midh=HH[0]+RR[0]; |
---|
571 | midj=0; |
---|
572 | type=1; |
---|
573 | for(j=0;j<=N;j++) { |
---|
574 | hh = HH[j] + RR[j]; |
---|
575 | if(hh>=midh) |
---|
576 | if(hh>midh || (HH[j]!=DD[j] && RR[j]==SS[j])) { |
---|
577 | midh=hh; |
---|
578 | midj=j; |
---|
579 | } |
---|
580 | } |
---|
581 | |
---|
582 | for(j=N;j>=0;j--) { |
---|
583 | hh = DD[j] + SS[j] + g; |
---|
584 | if(hh>midh) { |
---|
585 | midh=hh; |
---|
586 | midj=j; |
---|
587 | type=2; |
---|
588 | } |
---|
589 | } |
---|
590 | |
---|
591 | /* Conquer recursively around midpoint */ |
---|
592 | |
---|
593 | |
---|
594 | if(type==1) { /* Type 1 gaps */ |
---|
595 | diff(A,B,midi,midj,tb,g); |
---|
596 | diff(A+midi,B+midj,M-midi,N-midj,g,te); |
---|
597 | } |
---|
598 | else { |
---|
599 | diff(A,B,midi-1,midj,tb,0.0); |
---|
600 | del(2); |
---|
601 | diff(A+midi+1,B+midj,M-midi-1,N-midj,0.0,te); |
---|
602 | } |
---|
603 | |
---|
604 | return midh; /* Return the score of the best alignment */ |
---|
605 | } |
---|
606 | |
---|
607 | static void del(sint k) |
---|
608 | { |
---|
609 | if(last_print<0) |
---|
610 | last_print = displ[print_ptr-1] -= k; |
---|
611 | else |
---|
612 | last_print = displ[print_ptr++] = -(k); |
---|
613 | } |
---|
614 | |
---|
615 | |
---|