#include "mltaln.h" #include "dp.h" #define DEBUG 0 void tracking( char **nseq, char **aseq, char *seq, int **ijp, int icyc ) { int i, k, l; int iin, ifi, jin, jfi; int lgth = strlen( aseq[0] ); int lgth1 = strlen( seq ); char gap[] = "-"; for( i=0; i<=icyc+1; i++ ) { nseq[i] += lgth+lgth1; *nseq[i] = 0; } iin = lgth; jin = lgth1; for( k=0; k<=lgth+lgth1; ) { if( ijp[iin][jin] < 0 ) { ifi = iin-1; jfi = jin+ijp[iin][jin]; } else if( ijp[iin][jin] > 0 ) { ifi = iin-ijp[iin][jin]; jfi = jin-1; } else { ifi = iin-1; jfi = jin-1; /* if( ifi < 0 ) jfi = -1; if( jfi < 0 ) ifi = -1; */ } for( l=1; l 0 && orlgth1 > 0 ) for( i=0; i orlgth || lgth1 > orlgth1 ) { int ll1, ll2; if( orlgth > 0 && orlgth1 > 0 ) { FreeFloatMtx( v ); FreeFloatCub( g ); FreeFloatTri( gl ); FreeFloatTri( gs ); FreeFloatVec( m ); FreeIntVec( mp ); #if 0 FreeCharMtx( nseq ); #endif FreeCharMtx( mseq ); FreeFloatVec( gvsa ); FreeFloatMtx( scmx ); } ll1 = MAX( (int)(1.1*lgth), orlgth ); ll2 = MAX( (int)(1.1*lgth1), orlgth1 ); ll1 = MAX( ll1, ll2 ); #if DEBUG fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); #endif v = AllocateFloatMtx( ll1+2, ll2+2 ); g = AllocateFloatCub( ll1+2, 3, 3 ); gl = AllocateFloatTri( MAX( ll1, ll2 ) + 3 ); gs = AllocateFloatTri( MAX( ll1, ll2 ) + 3 ); m = AllocateFloatVec( ll1+2 ); mp = AllocateIntVec( ll1+2 ); mseq = AllocateCharMtx( njob+1, 1 ); nseq = AllocateCharMtx( njob+1, ll1+ll2 ); for( i=0; i commonAlloc1 || orlgth1 > commonAlloc2 ) { int ll1, ll2; if( commonAlloc1 && commonAlloc2 ) { FreeIntMtx( commonIP ); } ll1 = MAX( commonAlloc1, orlgth ); ll2 = MAX( commonAlloc2, orlgth1 ); #if DEBUG fprintf( stderr, "\n\ntrying to allocate %dx%d matrices ... ", ll1+1, ll2+1 ); #endif commonIP = AllocateIntMtx( ll1+10, ll2+10 ); #if DEBUG fprintf( stderr, "succeeded\n\n" ); #endif commonAlloc1 = ll1; commonAlloc2 = ll2; } ijp = commonIP; scmx_calc( icyc, aseq, effarr, scmx ); for( i=0; i0; j-- ) gl[i][j] += gl[i][j+1]; } /* for( i=0; i 1 ) { x = w[i-1][j-2] + g[i-0][0][2] + n_dis[24][0] * totaleff; mi += g[i-1][2][2] + n_dis[24][0] * totaleff; if( mi < x ) { mi = x; mpi = j-2; } } else { mi = w[i-1][0] + g[i-0][0][2]/* + n_dis[24][0] * totaleff */; /* 0.0? */ /* fprintf( stderr, " i == %d j == 1, w[i][0] == %f, mi == %f, g[i][0][2] == %f\n", i, w[i][0], mi, g[i][0][2] ); */ /* mi = 0.0 + g[i-0][0][2]; * 0.0? * */ mpi = 0; } if( i > 1 ) { x = w[i-2][j-1] + g[i-1][0][1] + gvsa[i-1]; m[j] += g[i-1][1][1] + gl[i-2][i-mp[j]-2] + gvsa[i-1]; /* ??? */ if( m[j] < x ) { m[j] = x; mp[j] = i-2; } } else { m[j] = w[0][j-1]+ g[i][0][1]/* + gvsa[1] */; /* 0.0? */ mp[j] = 0; } wmax = w[i-1][j-1] + g[i][0][0]; /* ip[i][j]=i-1; jp[i][j]=j-1; */ ijp[i][j] = 0; x = mi + g[i][2][0]; if( x > wmax ) { wmax = x; /* ip[i][j] = i-1; jp[i][j] = mpi; */ ijp[i][j] = -( j - mpi ); /* ijp[][] < 0 -> j ni gap */ } x = m[j] + g[i][1][0] + gs[i][i-mp[j]]; if( x > wmax ) { wmax = x; /* ip[i][j] = mp[j]; jp[i][j] = j-1; */ ijp[i][j] = +( i - mp[j] ); } w[i][j] += wmax; } } if( cnst ) { w[lgth][lgth1] = w[lgth-1][lgth1-1] + g[lgth][0][0]; /* ip[lgth][lgth1] = lgth-1; jp[lgth][lgth1] = lgth1-1; */ ijp[lgth][lgth1] = 0; } *wm = w[lgth][lgth1]; for( i=0; i 0 ) { gb1 = ( seq[i][k-1] == '-' ); gb2 = ( seq[ex][k-1] == '-' ); } else { gb1 = 0; gb2 = 0; } if( gb1 ) glen1[i]++; else glen1[i] = 0; if( gb2 ) glen2[i]++; else glen2[i] = 0; gc1 = ( seq[i][k] == '-' ); gc2 = ( seq[ex][k] == '-' ); if( glen1[i] >= glen2[i] ) tmp1 = 1; else tmp1 = 0; if( glen1[i] <= glen2[i] ) tmp2 = 1; else tmp2 = 0; cob = !gb1 * gc1 * !gb2 * !gc2 + !gb1 * !gc1 * !gb2 * gc2 + !gb1 * gc1 * gb2 * !gc2 + gb1 * !gc1 * !gb2 * gc2 + gb1 * !gc1 * gb2 * gc2 * tmp1 + gb1 * gc1 * gb2 * !gc2 * tmp2 ; pen += (double)cob * penalty * efficient; tmpscore += (double)amino_dis[(int)seq[i][k]][(int)seq[ex][k]] * efficient; /* nglen += ( !gc1 * !gc2 ); */ /* if( k == 0 ) { printf( "%c<->%c * %f = %f\n", seq[ex][k], seq[i][k], efficient, amino_dis[seq[i][k]][seq[ex][k]] * efficient ); } */ } score += tmpscore; score += pen; /* if( 1 ) fprintf( stdout, "%c %f ", seq[ex][k], score / (locnjob-1) ); if( 1 ) fprintf( stdout, "penalty %f\n", (double)pen / (locnjob - 1 ) ); */ } /* fprintf( stdout, "in Cscore_m_1 %f\n", score ); */ /* fprintf( stdout, "%s\n", seq[ex] ); */ free( glen1 ); free( glen2 ); return( (double)score /*/ nglen + 400.0*/ ); }