3 #define SEGMENTSIZE 150
8 void keika( char *str, int current, int all )
11 fprintf( stderr, "%s : ", str );
13 fprintf( stderr, "\b\b\b\b\b\b\b\b" );
14 fprintf( stderr, "%3d /%3d", current+1, all+1 );
16 if( current+1 == all )
17 fprintf( stderr, "\b\b\b\b\b\b\b\bdone. \n" );
20 double maxItch( double *soukan, int size )
25 for( i=0; i<size; i++ )
26 if( ( cand = soukan[i] ) > value ) value = cand;
30 void calcNaiseki( Fukusosuu *value, Fukusosuu *x, Fukusosuu *y )
32 value->R = x->R * y->R + x->I * y->I;
33 value->I = -x->R * y->I + x->I * y->R;
36 Fukusosuu *AllocateFukusosuuVec( int l1 )
39 value = (Fukusosuu *)calloc( l1, sizeof( Fukusosuu ) );
42 fprintf( stderr, "Cannot allocate %d FukusosuuVec\n", l1 );
48 Fukusosuu **AllocateFukusosuuMtx( int l1, int l2 )
52 // fprintf( stderr, "allocating %d x %d FukusosuuMtx\n", l1, l2 );
53 value = (Fukusosuu **)calloc( l1+1, sizeof( Fukusosuu * ) );
56 fprintf( stderr, "Cannot allocate %d x %d FukusosuuVecMtx\n", l1, l2 );
61 value[j] = AllocateFukusosuuVec( l2 );
64 fprintf( stderr, "Cannot allocate %d x %d FukusosuuVecMtx\n", l1, l2 );
72 Fukusosuu ***AllocateFukusosuuCub( int l1, int l2, int l3 )
76 value = calloc( l1+1, sizeof( Fukusosuu ** ) );
77 if( !value ) ErrorExit( "Cannot allocate Fukusosuu" );
78 for( i=0; i<l1; i++ ) value[i] = AllocateFukusosuuMtx( l2, l3 );
83 void FreeFukusosuuVec( Fukusosuu *vec )
88 void FreeFukusosuuMtx( Fukusosuu **mtx )
92 for( i=0; mtx[i]; i++ )
93 free( (void *)mtx[i] );
97 int getKouho( int *kouho, int nkouho, double *soukan, int nlen2 )
100 int nlen4 = nlen2 / 2;
103 int ikouho = 0; // by D.Mathog, iinoka?
104 for( j=0; j<nkouho; j++ )
107 for( i=0; i<nlen2; i++ )
109 if( ( tmp = soukan[i] ) > max )
122 fprintf( stderr, "Kouho No.%d, pos=%d, score=%f, lag=%d\n", j, ikouho, soukan[ikouho], ikouho-nlen4 );
124 soukan[ikouho] = -9999.9;
125 kouho[j] = ( ikouho - nlen4 );
130 void zurasu2( int lag, int clus1, int clus2,
131 char **seq1, char **seq2,
132 char **aseq1, char **aseq2 )
136 fprintf( stderr, "### lag = %d\n", lag );
140 for( i=0; i<clus1; i++ ) aseq1[i] = seq1[i];
141 for( i=0; i<clus2; i++ ) aseq2[i] = seq2[i]+lag;
145 for( i=0; i<clus1; i++ ) aseq1[i] = seq1[i]-lag;
146 for( i=0; i<clus2; i++ ) aseq2[i] = seq2[i];
150 void zurasu( int lag, int clus1, int clus2,
151 char **seq1, char **seq2,
152 char **aseq1, char **aseq2 )
156 fprintf( stderr, "lag = %d\n", lag );
160 for( i=0; i<clus1; i++ ) strcpy( aseq1[i], seq1[i] );
161 for( i=0; i<clus2; i++ ) strcpy( aseq2[i], seq2[i]+lag );
165 for( i=0; i<clus1; i++ ) strcpy( aseq1[i], seq1[i]-lag );
166 for( i=0; i<clus2; i++ ) strcpy( aseq2[i], seq2[i] );
171 int alignableReagion( int clus1, int clus2,
172 char **seq1, char **seq2,
173 double *eff1, double *eff2,
177 int status, starttmp = 0; // by D.Mathog, a gess
181 int length = 0; // by D.Mathog, a gess
182 static double *stra = NULL;
183 static int alloclen = 0;
186 static double threshold;
187 static double prf1[26], prf2[26];
188 static int hat1[27], hat2[27];
198 fprintf( stderr, "### In alignableRegion, clus1=%d, clus2=%d \n", clus1, clus2 );
199 fprintf( stderr, "seq1[0] = %s\n", seq1[0] );
200 fprintf( stderr, "seq2[0] = %s\n", seq2[0] );
201 fprintf( stderr, "eff1[0] = %f\n", eff1[0] );
202 fprintf( stderr, "eff2[0] = %f\n", eff2[0] );
205 len = MIN( strlen( seq1[0] ), strlen( seq2[0] ) );
206 maxlen = MAX( strlen( seq1[0] ), strlen( seq2[0] ) ) + fftWinSize;
207 if( alloclen < maxlen )
211 FreeDoubleVec( stra );
215 threshold = (int)fftThreshold / 100.0 * 600.0 * fftWinSize;
217 stra = AllocateDoubleVec( maxlen );
223 for( i=0; i<clus1; i++ ) for( j=0; j<clus2; j++ ) totaleff += eff1[i] * eff2[j];
224 for( i=0; i<len; i++ )
227 for( j=0; j<26; j++ )
236 while( j-- ) prf1[amino_n[(*seq1pt++)[i]]] += *eff1pt++;
238 for( j=0; j<clus1; j++ ) prf1[amino_n[(int)seq1[j][i]]] += eff1[j];
240 for( j=0; j<clus2; j++ ) prf2[amino_n[(int)seq2[j][i]]] += eff2[j];
244 for( j=25; j>=0; j-- )
260 /* make site score */
262 for( k=hat1[26]; k!=-1; k=hat1[k] )
263 for( j=hat2[26]; j!=-1; j=hat2[j] )
264 // stra[i] += n_dis[k][j] * prf1[k] * prf2[j];
265 stra[i] += n_disFFT[k][j] * prf1[k] * prf2[j];
269 (seg+0)->skipForeward = 0;
270 (seg+1)->skipBackward = 0;
274 for( j=0; j<fftWinSize; j++ ) score += stra[j];
276 for( i=1; i<len-fftWinSize; i++ )
278 score = score - stra[i-1] + stra[i+fftWinSize-1];
280 fprintf( stderr, "%d %10.0f ? %10.0f\n", i, score, threshold );
283 if( score > threshold )
288 seg->center = ( seg->start + seg->end + fftWinSize ) / 2 ;
304 if( score <= threshold || length > SEGMENTSIZE )
308 if( length > fftWinSize )
310 seg->start = starttmp;
312 seg->center = ( seg->start + seg->end + fftWinSize ) / 2 ;
313 seg->score = cumscore;
315 fprintf( stderr, "%d-%d length = %d, score = %f, value = %d\n", seg->start, seg->end, length, cumscore, value );
317 if( length > SEGMENTSIZE )
319 (seg+0)->skipForeward = 1;
320 (seg+1)->skipBackward = 1;
324 (seg+0)->skipForeward = 0;
325 (seg+1)->skipBackward = 0;
334 if( value > MAXSEG - 3 ) ErrorExit( "TOO MANY SEGMENTS!");
338 if( status && length > fftWinSize )
341 seg->start = starttmp;
342 seg->center = ( starttmp + i + fftWinSize ) / 2 ;
343 seg->score = cumscore;
345 fprintf( stderr, "%d-%d length = %d\n", seg->start, seg->end, length );
352 // fprintf( stderr, "returning %d\n", value );
356 void blockAlign( int *cut1, int *cut2, double **ocrossscore, int *ncut )
358 int i, j, shift, cur1, cur2, count;
359 static int result1[MAXSEG], result2[MAXSEG];
360 static int ocut1[MAXSEG], ocut2[MAXSEG];
362 static double max[MAXSEG], maxi;
363 static double point[MAXSEG], pointi;
364 static double **crossscore = NULL;
365 static int **track = NULL;
367 if( crossscore == NULL )
369 crossscore = AllocateDoubleMtx( MAXSEG, MAXSEG );
370 track = AllocateIntMtx( MAXSEG, MAXSEG );
374 for( i=0; i<*ncut; i++ )
375 fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] );
376 for( i=0; i<*ncut; i++ )
378 for( j=0; j<*ncut; j++ )
379 fprintf( stderr, "%#4.0f ", ocrossscore[i][j]/100 );
380 fprintf( stderr, "\n" );
384 for( i=0; i<*ncut; i++ ) for( j=0; j<*ncut; j++ ) /* mudadanaa */
385 crossscore[i][j] = ocrossscore[i][j];
386 for( i=0; i<*ncut; i++ )
392 for( j=0; j<*ncut; j++ )
398 for( i=1; i<*ncut; i++ )
402 for( j=1; j<*ncut; j++ )
404 maximum = crossscore[i-1][j-1];
407 if( maximum < max[j] + penalty )
409 maximum = max[j] + penalty;
410 track[i][j] = point[j] - i;
412 if( maximum < maxi + penalty )
414 maximum = maxi + penalty;
415 track[i][j] = j - pointi;
417 crossscore[i][j] += maximum;
419 if( maxi < crossscore[i-1][j-1] )
421 maxi = crossscore[i-1][j-1];
424 if( max[j] < crossscore[i-1][j-1] )
426 max[j] = crossscore[i-1][j-1];
432 for( i=0; i<*ncut; i++ )
434 for( j=0; j<*ncut; j++ )
435 fprintf( stderr, "%3d ", track[i][j] );
436 fprintf( stderr, "\n" );
441 result1[MAXSEG-1] = *ncut-1;
442 result2[MAXSEG-1] = *ncut-1;
444 for( i=MAXSEG-1; i>=1; i-- )
448 if( cur1 == 0 || cur2 == 0 ) break;
449 shift = track[cur1][cur2];
452 result1[i-1] = cur1 - 1;
453 result2[i-1] = cur2 - 1;
458 result1[i-1] = cur1 - 1;
459 result2[i-1] = cur2 - shift;
463 result1[i-1] = cur1 + shift;
464 result2[i-1] = cur2 - 1;
469 for( j=i; j<MAXSEG; j++ )
471 if( ocrossscore[result1[j]][result2[j]] == 0.0 ) continue;
473 if( result1[j] == result1[j-1] || result2[j] == result2[j-1] )
474 if( ocrossscore[result1[j]][result2[j]] > ocrossscore[result1[j-1]][result2[j-1]] )
477 cut1[count] = ocut1[result1[j]];
478 cut2[count] = ocut2[result2[j]];
484 for( i=0; i<*ncut; i++ )
485 fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] );
489 static int permit( Segment *seg1, Segment *seg2 )
492 if( seg1->end >= seg2->start ) return( 0 );
493 if( seg1->pair->end >= seg2->pair->start ) return( 0 );
497 void blockAlign2( int *cut1, int *cut2, Segment **seg1, Segment **seg2, double **ocrossscore, int *ncut )
499 int i, j, k, shift, cur1, cur2, count, klim;
500 static int crossscoresize = 0;
501 static int result1[MAXSEG], result2[MAXSEG];
502 static int ocut1[MAXSEG], ocut2[MAXSEG];
504 static double **crossscore = NULL;
505 static int **track = NULL;
506 static double maxj, maxi;
507 static int pointj, pointi;
510 if( crossscoresize < *ncut+2 )
512 crossscoresize = *ncut+2;
513 if( fftkeika ) fprintf( stderr, "allocating crossscore and track, size = %d\n", crossscoresize );
514 if( track ) FreeIntMtx( track );
515 if( crossscore ) FreeDoubleMtx( crossscore );
516 track = AllocateIntMtx( crossscoresize, crossscoresize );
517 crossscore = AllocateDoubleMtx( crossscoresize, crossscoresize );
521 for( i=0; i<*ncut-2; i++ )
522 fprintf( stderr, "%d.start = %d, score = %f\n", i, seg1[i]->start, seg1[i]->score );
524 for( i=0; i<*ncut; i++ )
525 fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] );
526 for( i=0; i<*ncut; i++ )
528 for( j=0; j<*ncut; j++ )
529 fprintf( stderr, "%#4.0f ", ocrossscore[i][j] );
530 fprintf( stderr, "\n" );
534 for( i=0; i<*ncut; i++ ) for( j=0; j<*ncut; j++ ) /* mudadanaa */
535 crossscore[i][j] = ocrossscore[i][j];
536 for( i=0; i<*ncut; i++ )
542 for( i=1; i<*ncut; i++ )
545 fprintf( stderr, "### i=%d/%d\n", i,*ncut );
547 for( j=1; j<*ncut; j++ )
549 pointi = 0; maxi = 0.0;
551 for( k=0; k<klim; k++ )
554 fprintf( stderr, "k=%d, i=%d\n", k, i );
556 if( k && k<*ncut-1 && j<*ncut-1 && !permit( seg1[k-1], seg1[j-1] ) ) continue;
557 if( crossscore[i-1][k] > maxj )
560 maxi = crossscore[i-1][k];
564 pointj = 0; maxj = 0.0;
566 for( k=0; k<klim; k++ )
568 if( k && k<*ncut-1 && i<*ncut-1 && !permit( seg2[k-1], seg2[i-1] ) ) continue;
569 if( crossscore[k][j-1] > maxj )
572 maxj = crossscore[k][j-1];
579 maximum = crossscore[i-1][j-1];
585 track[i][j] = j - pointi;
591 track[i][j] = pointj - i;
594 crossscore[i][j] += maximum;
598 for( i=0; i<*ncut; i++ )
600 for( j=0; j<*ncut; j++ )
601 fprintf( stderr, "%3d ", track[i][j] );
602 fprintf( stderr, "\n" );
607 result1[MAXSEG-1] = *ncut-1;
608 result2[MAXSEG-1] = *ncut-1;
610 for( i=MAXSEG-1; i>=1; i-- )
614 if( cur1 == 0 || cur2 == 0 ) break;
615 shift = track[cur1][cur2];
618 result1[i-1] = cur1 - 1;
619 result2[i-1] = cur2 - 1;
624 result1[i-1] = cur1 - 1;
625 result2[i-1] = cur2 - shift;
629 result1[i-1] = cur1 + shift;
630 result2[i-1] = cur2 - 1;
635 for( j=i; j<MAXSEG; j++ )
637 if( ocrossscore[result1[j]][result2[j]] == 0.0 ) continue;
639 if( result1[j] == result1[j-1] || result2[j] == result2[j-1] )
640 if( ocrossscore[result1[j]][result2[j]] > ocrossscore[result1[j-1]][result2[j-1]] )
643 cut1[count] = ocut1[result1[j]];
644 cut2[count] = ocut2[result2[j]];
651 for( i=0; i<*ncut; i++ )
652 fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] );
655 void blockAlign3( int *cut1, int *cut2, Segment **seg1, Segment **seg2, double **ocrossscore, int *ncut )
656 // memory complexity = O(n^3), time complexity = O(n^2)
658 int i, j, shift, cur1, cur2, count;
659 static int crossscoresize = 0;
660 static int jumpposi, *jumppos;
661 static double jumpscorei, *jumpscore;
662 static int result1[MAXSEG], result2[MAXSEG];
663 static int ocut1[MAXSEG], ocut2[MAXSEG];
665 static double **crossscore = NULL;
666 static int **track = NULL;
668 if( crossscoresize < *ncut+2 )
670 crossscoresize = *ncut+2;
671 if( fftkeika ) fprintf( stderr, "allocating crossscore and track, size = %d\n", crossscoresize );
672 if( track ) FreeIntMtx( track );
673 if( crossscore ) FreeDoubleMtx( crossscore );
674 if( jumppos ) FreeIntVec( jumppos );
675 if( jumpscore ) FreeDoubleVec( jumpscore );
676 track = AllocateIntMtx( crossscoresize, crossscoresize );
677 crossscore = AllocateDoubleMtx( crossscoresize, crossscoresize );
678 jumppos = AllocateIntVec( crossscoresize );
679 jumpscore = AllocateDoubleVec( crossscoresize );
683 for( i=0; i<*ncut-2; i++ )
684 fprintf( stderr, "%d.start = %d, score = %f\n", i, seg1[i]->start, seg1[i]->score );
686 for( i=0; i<*ncut; i++ )
687 fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] );
688 for( i=0; i<*ncut; i++ )
690 for( j=0; j<*ncut; j++ )
691 fprintf( stderr, "%#4.0f ", ocrossscore[i][j] );
692 fprintf( stderr, "\n" );
696 for( i=0; i<*ncut; i++ ) for( j=0; j<*ncut; j++ ) /* mudadanaa */
697 crossscore[i][j] = ocrossscore[i][j];
698 for( i=0; i<*ncut; i++ )
703 for( j=0; j<*ncut; j++ )
705 jumpscore[j] = -999.999;
709 for( i=1; i<*ncut; i++ )
712 jumpscorei = -999.999;
715 for( j=1; j<*ncut; j++ )
718 fprintf( stderr, "in blockalign3, ### i=%d, j=%d\n", i, j );
723 for( k=0; k<j-2; k++ )
726 fprintf( stderr, "k=%d, i=%d\n", k, i );
728 if( k && k<*ncut-1 && j<*ncut-1 && !permit( seg1[k-1], seg1[j-1] ) ) continue;
729 if( crossscore[i-1][k] > maxj )
732 maxi = crossscore[i-1][k];
736 pointj = 0; maxj = 0.0;
737 for( k=0; k<i-2; k++ )
739 if( k && k<*ncut-1 && i<*ncut-1 && !permit( seg2[k-1], seg2[i-1] ) ) continue;
740 if( crossscore[k][j-1] > maxj )
743 maxj = crossscore[k][j-1];
751 maximum = crossscore[i-1][j-1];
754 if( maximum < jumpscorei && permit( seg1[jumpposi], seg1[i] ) )
756 maximum = jumpscorei;
757 track[i][j] = j - jumpposi;
760 if( maximum < jumpscore[j] && permit( seg2[jumppos[j]], seg2[j] ) )
762 maximum = jumpscore[j];
763 track[i][j] = jumpscore[j] - i;
766 crossscore[i][j] += maximum;
768 if( jumpscorei < crossscore[i-1][j] )
770 jumpscorei = crossscore[i-1][j];
774 if( jumpscore[j] < crossscore[i][j-1] )
776 jumpscore[j] = crossscore[i][j-1];
782 for( i=0; i<*ncut; i++ )
784 for( j=0; j<*ncut; j++ )
785 fprintf( stderr, "%3d ", track[i][j] );
786 fprintf( stderr, "\n" );
791 result1[MAXSEG-1] = *ncut-1;
792 result2[MAXSEG-1] = *ncut-1;
794 for( i=MAXSEG-1; i>=1; i-- )
798 if( cur1 == 0 || cur2 == 0 ) break;
799 shift = track[cur1][cur2];
802 result1[i-1] = cur1 - 1;
803 result2[i-1] = cur2 - 1;
808 result1[i-1] = cur1 - 1;
809 result2[i-1] = cur2 - shift;
813 result1[i-1] = cur1 + shift;
814 result2[i-1] = cur2 - 1;
819 for( j=i; j<MAXSEG; j++ )
821 if( ocrossscore[result1[j]][result2[j]] == 0.0 ) continue;
823 if( result1[j] == result1[j-1] || result2[j] == result2[j-1] )
824 if( ocrossscore[result1[j]][result2[j]] > ocrossscore[result1[j-1]][result2[j-1]] )
827 cut1[count] = ocut1[result1[j]];
828 cut2[count] = ocut2[result2[j]];
835 for( i=0; i<*ncut; i++ )
836 fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] );