X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=binaries%2Fsrc%2Fmafft%2Fcore%2FfftFunctions.c;fp=binaries%2Fsrc%2Fmafft%2Fcore%2FfftFunctions.c;h=927dc3fdbe03a031befe8af34b990b5728a558b5;hb=063b30bb5e8161134ae764742636ab538e10eea7;hp=0000000000000000000000000000000000000000;hpb=6e0ce943f09b5ac30f3eb8dc0f20bc75114669ce;p=jabaws.git diff --git a/binaries/src/mafft/core/fftFunctions.c b/binaries/src/mafft/core/fftFunctions.c new file mode 100644 index 0000000..927dc3f --- /dev/null +++ b/binaries/src/mafft/core/fftFunctions.c @@ -0,0 +1,760 @@ +#include "mltaln.h" + +#define SEGMENTSIZE 150 +#define TMPTMPTMP 0 + +#define DEBUG 0 + +void keika( char *str, int current, int all ) +{ + if( current == 0 ) + fprintf( stderr, "%s : ", str ); + + fprintf( stderr, "\b\b\b\b\b\b\b\b" ); + fprintf( stderr, "%3d /%3d", current+1, all+1 ); + + if( current+1 == all ) + fprintf( stderr, "\b\b\b\b\b\b\b\bdone. \n" ); +} + +double maxItch( double *soukan, int size ) +{ + int i; + double value = 0.0; + double cand; + for( i=0; i value ) value = cand; + return( value ); +} + +void calcNaiseki( Fukusosuu *value, Fukusosuu *x, Fukusosuu *y ) +{ + value->R = x->R * y->R + x->I * y->I; + value->I = -x->R * y->I + x->I * y->R; +} + +Fukusosuu *AllocateFukusosuuVec( int l1 ) +{ + Fukusosuu *value; + value = (Fukusosuu *)calloc( l1, sizeof( Fukusosuu ) ); + if( !value ) + { + fprintf( stderr, "Cannot allocate %d FukusosuuVec\n", l1 ); + return( NULL ); + } + return( value ); +} + +Fukusosuu **AllocateFukusosuuMtx( int l1, int l2 ) +{ + Fukusosuu **value; + int j; +// fprintf( stderr, "allocating %d x %d FukusosuuMtx\n", l1, l2 ); + value = (Fukusosuu **)calloc( l1+1, sizeof( Fukusosuu * ) ); + if( !value ) + { + fprintf( stderr, "Cannot allocate %d x %d FukusosuuVecMtx\n", l1, l2 ); + exit( 1 ); + } + for( j=0; j max ) + { + ikouho = i; + max = tmp; + } + } +#if 0 + if( max < 0.15 ) + { + break; + } +#endif +#if 0 + fprintf( stderr, "Kouho No.%d, pos=%d, score=%f, lag=%d\n", j, ikouho, soukan[ikouho], ikouho-nlen4 ); +#endif + soukan[ikouho] = -9999.9; + kouho[j] = ( ikouho - nlen4 ); + } + return( j ); +} + +void zurasu2( int lag, int clus1, int clus2, + char **seq1, char **seq2, + char **aseq1, char **aseq2 ) +{ + int i; +#if 0 + fprintf( stderr, "### lag = %d\n", lag ); +#endif + if( lag > 0 ) + { + for( i=0; i 0 ) + { + for( i=0; i=0; j-- ) + { + if( prf1[j] ) + { + hat1[pre1] = j; + pre1 = j; + } + if( prf2[j] ) + { + hat2[pre2] = j; + pre2 = j; + } + } + hat1[pre1] = -1; + hat2[pre2] = -1; + + /* make site score */ + stra[i] = 0.0; + for( k=hat1[26]; k!=-1; k=hat1[k] ) + for( j=hat2[26]; j!=-1; j=hat2[j] ) +// stra[i] += n_dis[k][j] * prf1[k] * prf2[j]; + stra[i] += n_disFFT[k][j] * prf1[k] * prf2[j]; + stra[i] /= totaleff; + } + + (seg+0)->skipForeward = 0; + (seg+1)->skipBackward = 0; + status = 0; + cumscore = 0.0; + score = 0.0; + for( j=0; j threshold ) + { +#if 0 + seg->start = i; + seg->end = i; + seg->center = ( seg->start + seg->end + fftWinSize ) / 2 ; + seg->score = score; + status = 0; + value++; +#else + if( !status ) + { + status = 1; + starttmp = i; + length = 0; + cumscore = 0.0; + } + length++; + cumscore += score; +#endif + } + if( score <= threshold || length > SEGMENTSIZE ) + { + if( status ) + { + if( length > fftWinSize ) + { + seg->start = starttmp; + seg->end = i; + seg->center = ( seg->start + seg->end + fftWinSize ) / 2 ; + seg->score = cumscore; +#if 0 + fprintf( stderr, "%d-%d length = %d, score = %f, value = %d\n", seg->start, seg->end, length, cumscore, value ); +#endif + if( length > SEGMENTSIZE ) + { + (seg+0)->skipForeward = 1; + (seg+1)->skipBackward = 1; + } + else + { + (seg+0)->skipForeward = 0; + (seg+1)->skipBackward = 0; + } + value++; + seg++; + } + length = 0; + cumscore = 0.0; + status = 0; + starttmp = i; + if( value > MAXSEG - 3 ) ErrorExit( "TOO MANY SEGMENTS!"); + } + } + } + if( status && length > fftWinSize ) + { + seg->end = i; + seg->start = starttmp; + seg->center = ( starttmp + i + fftWinSize ) / 2 ; + seg->score = cumscore; +#if 0 +fprintf( stderr, "%d-%d length = %d\n", seg->start, seg->end, length ); +#endif + value++; + } +#if TMPTMPTMP + exit( 0 ); +#endif +// fprintf( stderr, "returning %d\n", value ); + return( value ); +} + + +static int permit( Segment *seg1, Segment *seg2 ) +{ + return( 0 ); + if( seg1->end >= seg2->start ) return( 0 ); + if( seg1->pair->end >= seg2->pair->start ) return( 0 ); + else return( 1 ); +} + +void blockAlign2( int *cut1, int *cut2, Segment **seg1, Segment **seg2, double **ocrossscore, int *ncut ) +{ + int i, j, k, shift, cur1, cur2, count, klim; + static TLS int crossscoresize = 0; + static TLS int *result1 = NULL; + static TLS int *result2 = NULL; + static TLS int *ocut1 = NULL; + static TLS int *ocut2 = NULL; + double maximum; + static TLS double **crossscore = NULL; + static TLS int **track = NULL; + static TLS double maxj, maxi; + static TLS int pointj, pointi; + + if( cut1 == NULL) + { + if( result1 ) + { + free( result1 ); + free( result2 ); + free( ocut1 ); + free( ocut2 ); + FreeIntMtx( track ); + FreeDoubleMtx( crossscore ); + } + return; + } + + if( result1 == NULL ) + { + result1 = AllocateIntVec( MAXSEG ); + result2 = AllocateIntVec( MAXSEG ); + ocut1 = AllocateIntVec( MAXSEG ); + ocut2 = AllocateIntVec( MAXSEG ); + } + + if( crossscoresize < *ncut+2 ) + { + crossscoresize = *ncut+2; + if( fftkeika ) fprintf( stderr, "allocating crossscore and track, size = %d\n", crossscoresize ); + if( track ) FreeIntMtx( track ); + if( crossscore ) FreeDoubleMtx( crossscore ); + track = AllocateIntMtx( crossscoresize, crossscoresize ); + crossscore = AllocateDoubleMtx( crossscoresize, crossscoresize ); + } + +#if 0 + for( i=0; i<*ncut-2; i++ ) + fprintf( stderr, "%d.start = %d, score = %f\n", i, seg1[i]->start, seg1[i]->score ); + + for( i=0; i<*ncut; i++ ) + fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] ); + for( i=0; i<*ncut; i++ ) + { + for( j=0; j<*ncut; j++ ) + fprintf( stderr, "%#4.0f ", ocrossscore[i][j] ); + fprintf( stderr, "\n" ); + } +#endif + + for( i=0; i<*ncut; i++ ) for( j=0; j<*ncut; j++ ) /* mudadanaa */ + crossscore[i][j] = ocrossscore[i][j]; + for( i=0; i<*ncut; i++ ) + { + ocut1[i] = cut1[i]; + ocut2[i] = cut2[i]; + } + + for( i=1; i<*ncut; i++ ) + { +#if 0 + fprintf( stderr, "### i=%d/%d\n", i,*ncut ); +#endif + for( j=1; j<*ncut; j++ ) + { + pointi = 0; maxi = 0.0; + klim = j-2; + for( k=0; k maxj ) + { + pointi = k; + maxi = crossscore[i-1][k]; + } + } + + pointj = 0; maxj = 0.0; + klim = i-2; + for( k=0; k maxj ) + { + pointj = k; + maxj = crossscore[k][j-1]; + } + } + + maxi += penalty; + maxj += penalty; + + maximum = crossscore[i-1][j-1]; + track[i][j] = 0; + + if( maximum < maxi ) + { + maximum = maxi ; + track[i][j] = j - pointi; + } + + if( maximum < maxj ) + { + maximum = maxj ; + track[i][j] = pointj - i; + } + + crossscore[i][j] += maximum; + } + } +#if 0 + for( i=0; i<*ncut; i++ ) + { + for( j=0; j<*ncut; j++ ) + fprintf( stderr, "%3d ", track[i][j] ); + fprintf( stderr, "\n" ); + } +#endif + + + result1[MAXSEG-1] = *ncut-1; + result2[MAXSEG-1] = *ncut-1; + + for( i=MAXSEG-1; i>=1; i-- ) + { + cur1 = result1[i]; + cur2 = result2[i]; + if( cur1 == 0 || cur2 == 0 ) break; + shift = track[cur1][cur2]; + if( shift == 0 ) + { + result1[i-1] = cur1 - 1; + result2[i-1] = cur2 - 1; + continue; + } + else if( shift > 0 ) + { + result1[i-1] = cur1 - 1; + result2[i-1] = cur2 - shift; + } + else if( shift < 0 ) + { + result1[i-1] = cur1 + shift; + result2[i-1] = cur2 - 1; + } + } + + count = 0; + for( j=i; j ocrossscore[result1[j-1]][result2[j-1]] ) + count--; + + cut1[count] = ocut1[result1[j]]; + cut2[count] = ocut2[result2[j]]; + + count++; + } + + *ncut = count; +#if 0 + for( i=0; i<*ncut; i++ ) + fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] ); +#endif +} + +void blockAlign3( int *cut1, int *cut2, Segment **seg1, Segment **seg2, double **ocrossscore, int *ncut ) +// memory complexity = O(n^3), time complexity = O(n^2) +{ + int i, j, shift, cur1, cur2, count; + static TLS int crossscoresize = 0; + static TLS int jumpposi, *jumppos; + static TLS double jumpscorei, *jumpscore; + static TLS int *result1 = NULL; + static TLS int *result2 = NULL; + static TLS int *ocut1 = NULL; + static TLS int *ocut2 = NULL; + double maximum; + static TLS double **crossscore = NULL; + static TLS int **track = NULL; + + if( result1 == NULL ) + { + result1 = AllocateIntVec( MAXSEG ); + result2 = AllocateIntVec( MAXSEG ); + ocut1 = AllocateIntVec( MAXSEG ); + ocut2 = AllocateIntVec( MAXSEG ); + } + if( crossscoresize < *ncut+2 ) + { + crossscoresize = *ncut+2; + if( fftkeika ) fprintf( stderr, "allocating crossscore and track, size = %d\n", crossscoresize ); + if( track ) FreeIntMtx( track ); + if( crossscore ) FreeDoubleMtx( crossscore ); + if( jumppos ) FreeIntVec( jumppos ); + if( jumpscore ) FreeDoubleVec( jumpscore ); + track = AllocateIntMtx( crossscoresize, crossscoresize ); + crossscore = AllocateDoubleMtx( crossscoresize, crossscoresize ); + jumppos = AllocateIntVec( crossscoresize ); + jumpscore = AllocateDoubleVec( crossscoresize ); + } + +#if 0 + for( i=0; i<*ncut-2; i++ ) + fprintf( stderr, "%d.start = %d, score = %f\n", i, seg1[i]->start, seg1[i]->score ); + + for( i=0; i<*ncut; i++ ) + fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] ); + for( i=0; i<*ncut; i++ ) + { + for( j=0; j<*ncut; j++ ) + fprintf( stderr, "%#4.0f ", ocrossscore[i][j] ); + fprintf( stderr, "\n" ); + } +#endif + + for( i=0; i<*ncut; i++ ) for( j=0; j<*ncut; j++ ) /* mudadanaa */ + crossscore[i][j] = ocrossscore[i][j]; + for( i=0; i<*ncut; i++ ) + { + ocut1[i] = cut1[i]; + ocut2[i] = cut2[i]; + } + for( j=0; j<*ncut; j++ ) + { + jumpscore[j] = -999.999; + jumppos[j] = -1; + } + + for( i=1; i<*ncut; i++ ) + { + + jumpscorei = -999.999; + jumpposi = -1; + + for( j=1; j<*ncut; j++ ) + { +#if 1 + fprintf( stderr, "in blockalign3, ### i=%d, j=%d\n", i, j ); +#endif + + +#if 0 + for( k=0; k maxj ) + { + pointi = k; + maxi = crossscore[i-1][k]; + } + } + + pointj = 0; maxj = 0.0; + for( k=0; k maxj ) + { + pointj = k; + maxj = crossscore[k][j-1]; + } + } + + + maxi += penalty; + maxj += penalty; +#endif + maximum = crossscore[i-1][j-1]; + track[i][j] = 0; + + if( maximum < jumpscorei && permit( seg1[jumpposi], seg1[i] ) ) + { + maximum = jumpscorei; + track[i][j] = j - jumpposi; + } + + if( maximum < jumpscore[j] && permit( seg2[jumppos[j]], seg2[j] ) ) + { + maximum = jumpscore[j]; + track[i][j] = jumpscore[j] - i; + } + + crossscore[i][j] += maximum; + + if( jumpscorei < crossscore[i-1][j] ) + { + jumpscorei = crossscore[i-1][j]; + jumpposi = j; + } + + if( jumpscore[j] < crossscore[i][j-1] ) + { + jumpscore[j] = crossscore[i][j-1]; + jumppos[j] = i; + } + } + } +#if 0 + for( i=0; i<*ncut; i++ ) + { + for( j=0; j<*ncut; j++ ) + fprintf( stderr, "%3d ", track[i][j] ); + fprintf( stderr, "\n" ); + } +#endif + + + result1[MAXSEG-1] = *ncut-1; + result2[MAXSEG-1] = *ncut-1; + + for( i=MAXSEG-1; i>=1; i-- ) + { + cur1 = result1[i]; + cur2 = result2[i]; + if( cur1 == 0 || cur2 == 0 ) break; + shift = track[cur1][cur2]; + if( shift == 0 ) + { + result1[i-1] = cur1 - 1; + result2[i-1] = cur2 - 1; + continue; + } + else if( shift > 0 ) + { + result1[i-1] = cur1 - 1; + result2[i-1] = cur2 - shift; + } + else if( shift < 0 ) + { + result1[i-1] = cur1 + shift; + result2[i-1] = cur2 - 1; + } + } + + count = 0; + for( j=i; j ocrossscore[result1[j-1]][result2[j-1]] ) + count--; + + cut1[count] = ocut1[result1[j]]; + cut2[count] = ocut2[result2[j]]; + + count++; + } + + *ncut = count; +#if 0 + for( i=0; i<*ncut; i++ ) + fprintf( stderr, "i=%d, cut1 = %d, cut2 = %d\n", i, cut1[i], cut2[i] ); +#endif +} +