#include "mltaln.h" #include "dp.h" #define DEBUG 0 #define XXXXXXX 0 #define USE_PENALTY_EX 0 static void extendmseq( char **mseq1, char **mseq2, char **seq1, char **seq2, int i, int j, int prevhiti, int prevhitj ) { char gap[] = "-"; int l; fprintf( stderr, "i=%d, prevhiti=%d\n", i, prevhiti ); fprintf( stderr, "j=%d, prevhitj=%d\n", j, prevhitj ); l = prevhiti - i - 1; fprintf( stderr, "l=%d\n", l ); while( l>0 ) { *--mseq1[0] = seq1[0][i+l--]; *--mseq2[0] = *gap; } l= prevhitj - j - 1; fprintf( stderr, "l=%d\n", l ); while( l>0 ) { *--mseq1[0] = *gap; *--mseq2[0] = seq2[0][j+l--]; } if( i < 0 || j < 0 ) return; *--mseq1[0] = seq1[0][i]; *--mseq2[0] = seq2[0][j]; fprintf( stderr, "added %c to mseq1, mseq1 = %s \n", seq1[0][i], mseq1[0] ); fprintf( stderr, "added %c to mseq2, mseq2 = %s \n", seq2[0][j], mseq2[0] ); } static void match_calc( float *match, char **s1, char **s2, int i1, int lgth2 ) { char tmpc = s1[0][i1]; char *seq2 = s2[0]; while( lgth2-- ) *match++ = amino_dis[(int)tmpc][(int)*seq2++]; } static float Atracking( float *lasthorizontalw, float *lastverticalw, char **seq1, char **seq2, char **mseq1, char **mseq2, float **cpmx1, float **cpmx2, int **ijp ) { int i, j, l, iin, jin, ifi, jfi, lgth1, lgth2, k, limk; char gap[] = "-"; lgth1 = strlen( seq1[0] ); lgth2 = strlen( seq2[0] ); #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 ) { *--mseq1[0] = seq1[0][ifi+l]; *--mseq2[0] = *gap; k++; } l= jin - jfi; while( --l ) { *--mseq1[0] = *gap; *--mseq2[0] = seq2[0][jfi+l]; k++; } if( iin <= 0 || jin <= 0 ) break; *--mseq1[0] = seq1[0][ifi]; *--mseq2[0] = seq2[0][jfi]; k++; iin = ifi; jin = jfi; } return( 0.0 ); } void backdp( float **WMMTX, float wmmax, float *maxinw, float *maxinh, int lgth1, int lgth2, int alloclen, float *w1, float *w2, float *initverticalw, float *m, int *mp, int iin, int jin, char **seq1, char **seq2, char **mseq1, char **mseq2 ) { register int i, j; int prevhiti, prevhitj; // int lasti, lastj; float g; float fpenalty = (float)penalty; #if USE_PENALTY_EX float fpenalty_ex = (float)penalty_ex; #endif float *currentw, *previousw, *wtmp; float mi; int mpi; int *mpjpt; float *mjpt, *prept, *curpt; float wm = 0.0; float forwwm; currentw = w1; previousw = w2; match_calc( initverticalw, seq2, seq1, lgth2-1, lgth1 ); match_calc( currentw, seq1, seq2, lgth1-1, lgth2 ); prevhiti = iin; prevhitj = jin; fprintf( stderr, "prevhiti = %d, lgth1 = %d\n", prevhiti, lgth1 ); fprintf( stderr, "prevhitj = %d, lgth2 = %d\n", prevhitj, lgth2 ); extendmseq( mseq1, mseq2, seq1, seq2, prevhiti, prevhitj, lgth1, lgth2 ); for( i=0; i0; --j ) { m[j-1] = currentw[j]; mp[j] = 0; // iranai } for( j=0; j-1; i-- ) { wtmp = previousw; previousw = currentw; currentw = wtmp; previousw[lgth2-1] = initverticalw[i+1]; match_calc( currentw, seq1, seq2, i, lgth2 ); #if 0 fprintf( stderr, "i=%d, currentw = \n", i ); for( j=0; j-1; j-- ) { // fprintf( stderr, "i,j=%d,%d %c-%c ", i, j, seq1[0][i], seq2[0][j] ); wm = *prept; g = mi + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; } g = *prept; if( g >= mi ) { mi = g; mpi = j+1; //iranai } #if USE_PENALTY_EX mi += fpenalty_ex; #endif g = *mjpt + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; } g = *prept; if( g >= *mjpt ) { *mjpt = g; *mpjpt = i-1; //iranai } #if USE_PENALTY_EX m[j] += fpenalty_ex; #endif #if 0 fprintf( stderr, "*curpt = %5.0f \n", *curpt ); #endif // forwwm = wm + MIN( maxinw[i], maxinh[j] ); forwwm = wm + MIN( maxinw[i], maxinh[j] ); WMMTX[i][j] = forwwm; if( forwwm == wmmax && i orlgth1 || lgth2 > orlgth2 ) { int ll1, ll2; if( orlgth1 > 0 && orlgth2 > 0 ) { FreeFloatVec( w1 ); FreeFloatVec( w2 ); FreeFloatVec( match ); FreeFloatVec( initverticalw ); FreeFloatVec( lastverticalw ); FreeFloatVec( maxinw ); FreeFloatVec( maxinh ); FreeFloatVec( m ); FreeIntVec( mp ); FreeCharMtx( mseq ); FreeFloatMtx( cpmx1 ); FreeFloatMtx( cpmx2 ); FreeFloatMtx( floatwork ); FreeIntMtx( intwork ); } ll1 = MAX( (int)(1.3*lgth1), orlgth1 ) + 100; ll2 = MAX( (int)(1.3*lgth2), orlgth2 ) + 100; #if DEBUG fprintf( stderr, "\ntrying to allocate (%d+%d)xn matrices ... ", ll1, ll2 ); #endif w1 = AllocateFloatVec( ll2+2 ); w2 = AllocateFloatVec( ll2+2 ); match = AllocateFloatVec( ll2+2 ); initverticalw = AllocateFloatVec( ll1+2 ); lastverticalw = AllocateFloatVec( ll1+2 ); maxinw = AllocateFloatVec( ll1+2 ); m = AllocateFloatVec( ll2+2 ); mp = AllocateIntVec( ll2+2 ); maxinh = AllocateFloatVec( ll2+2 ); mseq = AllocateCharMtx( njob, ll1+ll2 ); cpmx1 = AllocateFloatMtx( 26, ll1+2 ); cpmx2 = AllocateFloatMtx( 26, ll2+2 ); floatwork = AllocateFloatMtx( 26, MAX( ll1, ll2 )+2 ); intwork = AllocateIntMtx( 26, MAX( ll1, ll2 )+2 ); #if DEBUG fprintf( stderr, "succeeded\n" ); #endif orlgth1 = ll1 - 100; orlgth2 = ll2 - 100; } mseq1[0] = mseq[0]; mseq2[0] = mseq[1]; if( orlgth1 > commonAlloc1 || orlgth2 > commonAlloc2 ) { int ll1, ll2; if( commonAlloc1 && commonAlloc2 ) { FreeIntMtx( commonIP ); FreeFloatMtx( WMMTX ); } ll1 = MAX( orlgth1, commonAlloc1 ); ll2 = MAX( orlgth2, commonAlloc2 ); #if DEBUG fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); #endif commonIP = AllocateIntMtx( ll1+10, ll2+10 ); WMMTX = AllocateFloatMtx( ll1+10, ll2+10 ); #if DEBUG fprintf( stderr, "succeeded\n\n" ); #endif commonAlloc1 = ll1; commonAlloc2 = ll2; } ijp = commonIP; #if 0 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; if( j wmmax ) { wmmax = g; iin = i; jin = lgth2-1; } } for( j=0; j wmmax ) { wmmax = g; iin = lgth1-1; jin = j; } } for( i=0; iMSres\n%s\n", mseq1[0] ); fprintf( stderr, ">MSres\n%s\n", mseq2[0] ); #endif #if 0 for( i=0; i N ) { fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); ErrorExit( "LENGTH OVER!\n" ); } strcpy( seq1[0], mseq1[0] ); strcpy( seq2[0], mseq2[0] ); #if 1 fprintf( stderr, "\n" ); fprintf( stderr, ">\n%s\n", mseq1[0] ); fprintf( stderr, ">\n%s\n", mseq2[0] ); #endif return( wm ); }