#include "mltaln.h" #include "dp.h" #define DEBUG 0 #define XXXXXXX 0 #define USE_PENALTY_EX 0 #define DPTANNI 1000 static reccycle = 0; static void OpeningGapCount( float *ogcp, int clus, char **seq, double *eff ) { int i, j, gc, gb; int len = strlen( seq[0] ); float 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 0 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 * fgcp2[j-1]; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = -( j - mpi ); } g = *prept + fpenalty * ogcp2[j]; if( g >= mi ) { mi = g; mpi = j-1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif g = *mjpt + fpenalty * fgcp1[i-1]; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = +( i - *mpjpt ); } g = *prept + fpenalty * ogcp1[i]; 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; ijppt++; mjpt++; prept++; mpjpt++; curpt++; } lastverticalw[i] = currentw[lgth2-1]; } Atracking( currentw, lastverticalw, seq1, seq2, aseq1, aseq2, cpmx1+ist, cpmx2+jst, ijp, icyc, jcyc, ist, ien, jst, jen ); for( i=0; i", wm ); #endif g = mi + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *jumppt = +mpi; // muda atode matomeru // *ijppt = -( j - mpi ); } g = *prept; if( g >= mi ) { mi = g; mpi = j-1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif // fprintf( stderr, "i,j=%d,%d *mpjpt (f)= %d\n", i, j, *mpjpt ); g = *mjpt + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; // *ijppt = +( i - *mpjpt ); *jumppt = -*mpjpt; // muda atode matomeru } 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; // WMMTX2[i][j] = *mjpt; if( i == imid ) //muda { midw[j] = *curpt; midm[j] = *mjpt; } // ijppt++; mjpt++; prept++; mpjpt++; curpt++; jumppt++; } lastverticalw[i] = currentw[lgth2-1]; #if 0 // ue if( i == imid ) { for( j=0; j0; --j ) { m[j-1] = currentw[j]; mp[j] = lgth1-1; } // 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]; mpi = lgth2 - 1; mjpt = m + lgth2 - 2; prept = previousw + lgth2 - 1; curpt = currentw + lgth2 - 2; mpjpt = mp + lgth2 - 2; if( i == imid ) jumppt = jumpforw + lgth2 - 2; else jumppt = jumpdumm + lgth2 - 2; for( j=lgth2-2; j>-1; j-- ) { wm = *prept; *jumppt = 0; //muda g = mi + fpenalty; if( g > wm ) { wm = g; *jumppt = +mpi; //muda } g = *prept; if( g > mi ) { mi = g; mpi = j + 1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif // fprintf( stderr, "i,j=%d,%d *mpjpt = %d\n", i, j, *mpjpt ); g = *mjpt + fpenalty; if( g > wm ) { wm = g; *jumppt = -*mpjpt; //muda } g = *prept; if( g > *mjpt ) { // fprintf( stderr, "mjpt: %f->%f (%d,%d)\n", *mjpt, g, i, j ); *mjpt = g; *mpjpt = i + 1; } #if USE_PENALTY_EX m[j] += fpenalty_ex; #endif if( i == imid ) // muda { midw[j] += wm; midm[j+1] += *mjpt + fpenalty; } // WMMTX[i][j] += wm; // WMMTX2[i][j+1] += *mjpt + fpenalty; *curpt += wm; mjpt--; prept--; // mpjpt--; curpt--; jumppt--; } } // for( j=0; j 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; } wm = midm[j]; if( wm > maxwm ) { jmid = j; maxwm = wm; } } #if 0 fprintf( stderr, "jmid=%d, maxwm = %f\n", jmid, maxwm ); fprintf( stderr, "jumpforw[%d] = %d\n", jmid, jumpforw[jmid] ); fprintf( stderr, "jumpback[%d] = %d\n", jmid, jumpback[jmid] ); if( jumpback[jmid] == 0 ) { jumpi = imid-1; jumpj = jmid-1; } else if( jumpback[jmid] < 0 ) { jumpi = - jumpback[jmid]; jumpj = jmid-1; } else { jumpi = imid-1; jumpj = jumpback[jmid]; } if( jumpforw[jmid] == 0 ) { ; } else if( jumpforw[jmid] < 0 ) { imid = - jumpforw[jmid]; fprintf( stderr, "XXXX imid = %d", imid ); } else { fprintf( stderr, "OXOXO" ); jmid = jumpforw[jmid]; } #else jumpi = imid-1; jumpj = jmid-1; #endif #if 0 fprintf( stderr, "jumpi = %d, imid = %d\n", jumpi, imid ); fprintf( stderr, "jumpj = %d, jmid = %d\n", jumpj, jmid ); fprintf( stderr, "imid = %d\n", imid ); fprintf( stderr, "jmid = %d\n", jmid ); #endif FreeFloatVec( w1 ); FreeFloatVec( w2 ); // FreeFloatVec( match ); FreeFloatVec( initverticalw ); FreeFloatVec( lastverticalw ); FreeFloatVec( midw ); FreeFloatVec( midm ); FreeIntVec( jumpback ); FreeIntVec( jumpforw ); FreeIntVec( jumpdumm ); free( gaps ); FreeFloatVec( m ); FreeIntVec( mp ); FreeFloatMtx( floatwork ); FreeIntMtx( intwork ); // FreeShortMtx( shortmtx ); // FreeFloatMtx( WMMTX ); // FreeFloatMtx( WMMTX2 ); // fprintf( stderr, "==== calling myself (first)\n" ); MSalignmm_rec( icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1, cpmx2, ist, ist+jumpi, jst, jst+jumpj, alloclen, aseq1, aseq2, depth, gapinfo ); for( i=0; i 0 ) { fprintf( stderr, "l=%d\n", l ); for( i=0; i 0 ) { fprintf( stderr, "l=%d\n", l ); for( i=0; i%d of GROUP1\n", i ); fprintf( stdout, "%s\n", seq1[i] ); } for( i=0; i%d of GROUP2\n", i ); fprintf( stdout, "%s\n", seq2[i] ); } fflush( stdout ); #endif wm = MSalignmm_rec( icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1, cpmx2, 0, lgth1-1, 0, lgth2-1, alloclen, mseq1, mseq2, 0, gapinfo ); for( i=0; i