#include "mltaln.h" #include "dp.h" #define DEBUG 1 #define XXXXXXX 0 #define USE_PENALTY_EX 0 #define DPTANNI 100 static void OpeningGapCount( double *ogcp, int clus, char **seq, double *eff ) { int i, j, gc, gb; int len = strlen( seq[0] ); double totaleff = 0.0; for( i=0; i -1 ) *fpt2 += scarr[*ipt++] * *fpt++; fpt2++,iptpt++,fptpt++; } } #else for( j=0; j-1; k++ ) match[j] += scarr[cpmxpdn[j][k]] * cpmxpd[j][k]; } #endif } static float Atracking( float *lasthorizontalw, float *lastverticalw, char **seq1, char **seq2, char **mseq1, char **mseq2, float **cpmx1, float **cpmx2, short **ijp, int icyc, int jcyc, int ist, int ien, int jst, int jen ) { int i, j, l, iin, jin, ifi, jfi, lgth1, lgth2, k, klim; char gap[] = "-"; float wm; lgth1 = ien-ist+1; lgth2 = jen-jst+1; #if 1 for( i=0; i 0 ) { ifi = iin-ijp[iin][jin]; jfi = jin-1; } else { ifi = iin-1; jfi = jin-1; } l = iin - ifi; while( --l ) { for( i=0; i", wm ); #endif g = mi + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = -( j - mpi ); } g = *prept; if( g >= mi ) { mi = g; mpi = j-1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif g = *mjpt + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = +( i - *mpjpt ); } g = *prept; if( g >= *mjpt ) { *mjpt = g; *mpjpt = i-1; } #if USE_PENALTY_EX m[j] += fpenalty_ex; #endif #if 0 fprintf( stderr, "%5.0f ", wm ); #endif *curpt += wm; WMMTX[i][j] = *curpt; ijppt++; mjpt++; prept++; mpjpt++; curpt++; fprintf( stderr, "j=%d end\n", j ); } lastverticalw[i] = currentw[lgth2-1]; fprintf( stderr, "i=%d end\n", i ); } #if 1 for( i=0; i", wm ); #endif g = mi + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = -( j - mpi ); } g = *prept; if( g >= mi ) { mi = g; mpi = j-1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif g = *mjpt + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = +( i - *mpjpt ); } g = *prept; if( g >= *mjpt ) { *mjpt = g; *mpjpt = i-1; } #if USE_PENALTY_EX m[j] += fpenalty_ex; #endif #if 0 fprintf( stderr, "%5.0f ", wm ); #endif *curpt += wm; WMMTX[i][j] = *curpt; ijppt++; mjpt++; prept++; mpjpt++; curpt++; } lastverticalw[i] = currentw[lgth2-1]; } #if 0 for( i=0; i0; --j ) { m[j-1] = currentw[j]; } // for( j=0; j=imid; i-- ) // for( i=lgth1-2; i>-1; i-- ) { wtmp = previousw; previousw = currentw; currentw = wtmp; previousw[lgth2-1] = initverticalw[i+1]; // match_calc( currentw, seq1, seq2, i, lgth2 ); match_calc( currentw, cpmx1+ist, cpmx2+jst, i, lgth2, floatwork, intwork, 0 ); currentw[lgth2-1] = initverticalw[i]; mi = previousw[lgth2-1]; mjpt = m + lgth2 - 2; prept = previousw + lgth2 - 1; curpt = currentw + lgth2 - 2; mpjpt = mp + lgth2 - 2; for( j=lgth2-2; j>-1; j-- ) { wm = *prept; g = mi + fpenalty; if( g > wm ) wm = g; g = *prept; if( g >= mi ) mi = g; #if USE_PENALTY_EX mi += fpenalty_ex; #endif g = *mjpt + fpenalty; if( g > wm ) wm = g; g = *prept; if( g >= *mjpt ) *mjpt = g; #if USE_PENALTY_EX m[j] += fpenalty_ex; #endif WMMTX[i][j] += wm; *curpt += wm; mjpt--; prept--; mpjpt--; curpt--; } } #if 0 for( i=0; i N ) { fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); ErrorExit( "LENGTH OVER!\n" ); } #endif maxwm = -999999999.9; jmid = -100; for( j=0; j maxwm ) { jmid = j; maxwm = wm; } } // gap no tochu de kirrareru kanousei ari. fprintf( stderr, "wm = %f\n", wm ); fprintf( stderr, "imid = %d\n", imid ); fprintf( stderr, "jmid = %d\n", jmid ); FreeFloatVec( w1 ); FreeFloatVec( w2 ); FreeFloatVec( match ); FreeFloatVec( initverticalw ); FreeFloatVec( lastverticalw ); FreeFloatVec( m ); FreeIntVec( mp ); FreeFloatMtx( floatwork ); FreeIntMtx( intwork ); FreeShortMtx( shortmtx ); FreeFloatMtx( WMMTX ); fprintf( stderr, "==== calling myself (first)\n" ); MSalignmm_rec( icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1, cpmx2, ist, ist+imid, jst, jst+jmid, alloclen, aseq1, aseq2, depth ); for( i=0; i