#include "mltaln.h" #include "dp.h" #define MEMSAVE 1 #define DEBUG 0 #define USE_PENALTY_EX 0 #define FASTMATCHCALC 1 #define STOREWM 0 #define DPTANNI 100 #define ATO 1 static TLS int reccycle = 0; // [seq][alphabet] static void match_calc_add( double **scoringmtx, double *match, double **cpmx1, double **cpmx2, int i1, int lgth2, double **doublework, int **intwork, int initialize ) { int j, k, l; // double scarr[26]; double **cpmxpd = doublework; int **cpmxpdn = intwork; int count = 0; double *matchpt; double **cpmxpdpt; int **cpmxpdnpt; int cpkd; double *scarr; scarr = calloc( nalphabets, sizeof( double ) ); if( initialize ) { for( j=0; j -1 ) *fpt2 += scarr[*ipt++] * *fpt++; fpt2++,iptpt++,fptpt++; } } for( j=0; j-1; k++ ) match[j] += scarr[cpmxpdn[j][k]] * cpmxpd[j][k]; } #else matchpt = match; cpmxpdnpt = cpmxpdn; cpmxpdpt = cpmxpd; while( lgth2-- ) { // *matchpt = 0.0; // add dakara for( k=0; (cpkd=(*cpmxpdnpt)[k])>-1; k++ ) *matchpt += scarr[cpkd] * (*cpmxpdpt)[k]; matchpt++; cpmxpdnpt++; cpmxpdpt++; } #endif free( scarr ); } #if 0 // [seq][alphabet] static void match_calc( double **n_dynamicmtx, double *match, double **cpmx1, double **cpmx2, int i1, int lgth2, double **doublework, int **intwork, int initialize ) { int j, k, l; // double scarr[26]; double **cpmxpd = doublework; int **cpmxpdn = intwork; int count = 0; double *matchpt; double **cpmxpdpt; int **cpmxpdnpt; int cpkd; double *scarr; scarr = calloc( nalphabets, sizeof( double ) ); if( initialize ) { for( j=0; j -1 ) *fpt2 += scarr[*ipt++] * *fpt++; fpt2++,iptpt++,fptpt++; } } for( j=0; j-1; k++ ) match[j] += scarr[cpmxpdn[j][k]] * cpmxpd[j][k]; } #else matchpt = match; cpmxpdnpt = cpmxpdn; cpmxpdpt = cpmxpd; while( lgth2-- ) { *matchpt = 0.0; for( k=0; (cpkd=(*cpmxpdnpt)[k])>-1; k++ ) *matchpt += scarr[cpkd] * (*cpmxpdpt)[k]; matchpt++; cpmxpdnpt++; cpmxpdpt++; } #endif free( scarr ); } #endif // [alphabet][seq] static void match_calc_alphabet_seq( double **n_dynamicmtx, double *match, double **cpmx1, double **cpmx2, int i1, int start2, int lgth2, double **doublework, int **intwork, int initialize ) { #if FASTMATCHCALC // fprintf( stderr, "\nmatch_calc... %d", i1 ); int j, l, p; // double scarr[26]; double **cpmxpd = doublework; int **cpmxpdn = intwork; double *matchpt, *cpmxpdpt, **cpmxpdptpt; int *cpmxpdnpt, **cpmxpdnptpt; double *scarr; scarr = calloc( nalphabets, sizeof( double ) ); // reporterr( "lgth2=%d. j=%d-%d, p=%d-%d\n", lgth2, 0, lgth2, start2, start2+lgth2 ); if( initialize ) { int count = 0; for( j=0,p=start2; j-1 ) *matchpt += scarr[*cpmxpdnpt++] * *cpmxpdpt++; matchpt++; } } free( scarr ); // fprintf( stderr, "done\n" ); #else int j, k, l, p; // double scarr[26]; double **cpmxpd = doublework; int **cpmxpdn = intwork; double *scarr; scarr = calloc( nalphabets, sizeof( double ) ); // simple if( initialize ) { int count = 0; for( j=0,p=start2; j-1; k++ ) match[j] += scarr[cpmxpdn[k][j]] * cpmxpd[k][j]; } free( scarr ); #endif } static void createcpmxresult( double **cpmxresult, double eff1, double eff2, double **cpmx1, double **cpmx2, char *gaptable1, char *gaptable2 ) { int i, j, p; int alen = strlen( gaptable1 ); // reporterr( "eff1 = %f, eff2=%f\n", eff1, eff2 ); #if 1 // sukoshi osoi for( i=0; i= wm ) { wm = lastverticalw[i]; iin = i; jin = lgth2-1; ijp[lgth1][lgth2] = +( lgth1 - i ); } } for( j=0; j= wm ) { wm = lasthorizontalw[j]; iin = lgth1-1; jin = j; ijp[lgth1][lgth2] = -( lgth2 - j ); } } } #if 0 else if( jen == fulllen2-1 ) { fprintf( stderr, "searching lastverticalw\n" ); wm = lastverticalw[0]; for( i=0; i= wm ) { wm = lastverticalw[i]; iin = i; jin = lgth2-1; ijp[lgth1][lgth2] = +( lgth1 - i ); } } } else if( ien == fulllen1-1 ) { fprintf( stderr, "searching lasthorizontalw\n" ); wm = lasthorizontalw[0]; for( j=0; j= wm ) { wm = lasthorizontalw[j]; iin = lgth1-1; jin = j; ijp[lgth1][lgth2] = -( lgth2 - j ); } } } #endif 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 ) { *--gaptable1 = 'o'; *--gaptable2 = '-'; k++; } l= jin - jfi; while( --l ) { *--gaptable1 = '-'; *--gaptable2 = 'o'; k++; } if( iin <= 0 || jin <= 0 ) break; *--gaptable1 = 'o'; *--gaptable2 = 'o'; k++; iin = ifi; jin = jfi; } klim = gt1bk + lgth1+lgth2 - gaptable1; // reporterr( "klim = %d, strlen=%d\n", klim, strlen( gaptable1 ) ); // klim = strlen( gaptable1 ); if( strchr( gaptable1, '-' ) ) for( i=0; i 0 ) headgapfreq1 = gapfreq1f[-1]; else headgapfreq1 = headgapfreq1_g; if( jst > 0 ) headgapfreq2 = gapfreq2f[-1]; else headgapfreq2 = headgapfreq2_g; #if STOREWM char ttt1[10000], ttt2[10000]; #endif lgth1 = ien-ist+1; lgth2 = jen-jst+1; #if STOREWM strncpy( ttt1, seq1[0]+ist, lgth1 ); ttt1[lgth1] = 0; strncpy( ttt2, seq2[0]+jst, lgth2 ); ttt2[lgth2] = 0; fprintf( stderr, "in _tanni ist,ien = %d,%d, lgth1=%d\n", ist, ien, lgth1 ); fprintf( stderr, "in _tanni jst,jen = %d,%d, lgth2=%d\n", jst, jen, lgth2 ); fprintf( stderr, "ttt1 = %s\n", ttt1 ); fprintf( stderr, "ttt2 = %s\n", ttt2 ); #endif #if 0 fprintf( stderr, "in _tanni ist,ien = %d,%d, fulllen1=%d\n", ist, ien, fulllen1 ); fprintf( stderr, "in _tanni jst,jen = %d,%d, fulllen2=%d\n", jst, jen, fulllen2 ); fprintf( stderr, "in _tanni seq1[0] = %-*.*s\n", ien-ist+1, ien-ist+1, seq1[0]+ist ); fprintf( stderr, "in _tanni seq2[0] = %-*.*s\n", jen-jst+1, jen-jst+1, seq2[0]+jst ); #endif ll1 = ( (int)(lgth1) ) + 100; ll2 = ( (int)(lgth2) ) + 100; // aseq1 = AllocateCharMtx( icyc, 0 ); // aseq2 = AllocateCharMtx( jcyc, 0 ); // aseq1bk = AllocateCharMtx( icyc, lgth1+lgth2+100 ); // aseq2bk = AllocateCharMtx( jcyc, lgth1+lgth2+100 ); // for( i=0; i", wm ); #endif g = mi + fgcp2[j-1] * gapfreq1f[i]; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = -( j - mpi ); } g = *prept + ogcp2[j] * gapfreq1f[i-1]; if( g >= mi ) { mi = g; mpi = j-1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif g = *mjpt + fgcp1[i-1] * gapfreq2f[j]; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = +( i - *mpjpt ); } g = *prept + ogcp1[i] * gapfreq2f[j-1]; 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]; } // fprintf( stderr, "wm = %f\n", wm ); gt1 = gt1bk = AllocateCharVec( ien-ist+jen-jst+3 ); gt2 = gt2bk = AllocateCharVec( ien-ist+jen-jst+3 ); Atracking( currentw, lastverticalw, seq1, seq2, mseq1, mseq2, ijp, icyc, jcyc, ist, ien, jst, jen, fulllen1, fulllen2, tailgp, >1, >2 ); strcpy( mgt1, gt1 ); strcpy( mgt2, gt2 ); #if 0 fprintf( stderr, "res after _tanni = %s\n", mseq1[0] ); fprintf( stderr, "res after _tanni = %s\n", mseq2[0] ); fprintf( stderr, "gt1 after _tanni = %s\n", gt1 ); fprintf( stderr, "gt1 after _tanni = %s\n", gt2 ); #endif free( gt1bk ); free( gt2bk ); // for( i=0; i 0 ) headgapfreq1 = gapfreq1f[-1]; else headgapfreq1 = headgapfreq1_g; if( jst > 0 ) headgapfreq2 = gapfreq2f[-1]; else headgapfreq2 = headgapfreq2_g; depth++; reccycle++; lgth1 = ien-ist+1; lgth2 = jen-jst+1; // if( lgth1 < 5 ) // fprintf( stderr, "\nWARNING: lgth1 = %d\n", lgth1 ); // if( lgth2 < 5 ) // fprintf( stderr, "\nWARNING: lgth2 = %d\n", lgth2 ); // #if STOREWM fprintf( stderr, "==== MSalign (depth=%d, reccycle=%d), ist=%d, ien=%d, jst=%d, jen=%d\n", depth, reccycle, ist, ien, jst, jen ); strncpy( ttt1, seq1[0]+ist, lgth1 ); strncpy( ttt2, seq2[0]+jst, lgth2 ); ttt1[lgth1] = 0; ttt2[lgth2] = 0; fprintf( stderr, "seq1 = %s\n", ttt1 ); fprintf( stderr, "seq2 = %s\n", ttt2 ); #endif if( lgth2 <= 0 ) // lgth1 <= 0 ha? { // fprintf( stderr, "\n\n==== jimei\n\n" ); // exit( 1 ); for( i=0; i", wm ); #endif g = mi + fgcp2[j-1] * gapfreq1f[i]; // g = mi + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; // *ijppt = -( j - mpi ); } g = *prept + ogcp2[j] * gapfreq1f[i-1]; // g = *prept; if( g >= mi ) { mi = g; mpi = j-1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif g = *mjpt + fgcp1[i-1] * gapfreq2f[j]; // g = *mjpt + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; // *ijppt = +( i - *mpjpt ); } g = *prept + ogcp1[i] * gapfreq2f[j-1]; // 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; #if STOREWM WMMTX[i][j] = *curpt; WMMTX2[i][j] = *mjpt; #endif if( i == imid ) //muda { jumpbackj[j] = *mpjpt; // muda atode matomeru jumpbacki[j] = mpi; // muda atode matomeru // fprintf( stderr, "jumpbackj[%d] in forward dp is %d\n", j, *mpjpt ); // fprintf( stderr, "jumpbacki[%d] in forward dp is %d\n", j, mpi ); midw[j] = *curpt; midm[j] = *mjpt; midn[j] = mi; } // fprintf( stderr, "m[%d] = %f\n", j, m[j] ); mjpt++; prept++; mpjpt++; curpt++; } lastverticalw[i] = currentw[lgth2-1]; #if STOREWM WMMTX2[i][lgth2] = m[lgth2-1]; #endif #if 0 // ue if( i == imid ) { for( j=0; j0; --j ) { m[j-1] = currentw[j] + fgcp2[lgth2-2]; // m[j-1] = currentw[j]; mp[j] = lgth1-1; } #else for( j=lgth2-1; j>-1; --j ) { m[j] = currentw[j+1] + fgcp1[lgth1-2] * gapfreq2f[j+1]; // m[j-1] = currentw[j]; mp[j] = lgth1-1; } #endif // for( j=0; j=imid; i-- ) firstm = -9999999.9; // firstmp = lgth1-1; firstmp = lgth1; for( i=lgth1-2; i>-1; i-- ) { #ifdef enablemultithread // fprintf( stderr, "chudan = %d, %d\n", *chudanpt, chudanref ); if( chudanpt && *chudanpt != chudanref ) { // fprintf( stderr, "\n\n## CHUUDAN!!! kouhan\n" ); *chudanres = 1; freearrays_rec1 ( w1, w2, initverticalw, lastverticalw, midw, midm, midn, jumpbacki, jumpbackj, jumpforwi, jumpforwj, jumpdummi, jumpdummj, m, mp, doublework, intwork #if STOREWM , WMMTX, WMMTX2 #endif ); freearrays_rec2( gaps, aseq1, aseq2 ); return( -1.0 ); } #endif wtmp = previousw; previousw = currentw; currentw = wtmp; previousw[lgth2-1] = initverticalw[i+1]; // match_calc( currentw, seq1, seq2, i, lgth2 ); // match_calc( n_dynamicmtx, currentw, cpmx1+ist, cpmx2+jst, i, lgth2, doublework, intwork, 0 ); match_calc_alphabet_seq( n_dynamicmtx, currentw, cpmx1pt, cpmx2pt, ist+i, jst, lgth2, doublework, intwork, 0 ); currentw[lgth2-1] = initverticalw[i]; // m[lgth2] = fgcp1[i]; // WMMTX2[i][lgth2] += m[lgth2]; // fprintf( stderr, "m[] = %f\n", m[lgth2] ); mi = previousw[lgth2-1] + fgcp2[lgth2-2] * gapfreq1f[i+1]; // mi = previousw[lgth2-1]; mpi = 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; ijpi = i+1; ijpj = j+1; g = mi + ogcp2[j+1] * gapfreq1f[i]; // g = mi + fpenalty; if( g > wm ) { wm = g; ijpj = mpi; ijpi = i+1; } g = *prept + fgcp2[j] * gapfreq1f[i+1]; // g = *prept; if( g >= mi ) { // fprintf( stderr, "i,j=%d,%d - renewed! mpi = %d\n", i, j, j+1 ); 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 + ogcp1[i+1] * gapfreq2f[j]; // g = *mjpt + fpenalty; if( g > wm ) { wm = g; ijpi = *mpjpt; ijpj = j+1; } // if( i == imid )fprintf( stderr, "i,j=%d,%d \n", i, j ); g = *prept + fgcp1[i] * gapfreq2f[j+1]; // g = *prept; if( g >= *mjpt ) { *mjpt = g; *mpjpt = i + 1; } #if USE_PENALTY_EX m[j] += fpenalty_ex; #endif if( i == jumpi || i == imid - 1 ) { jumpforwi[j] = ijpi; //muda jumpforwj[j] = ijpj; //muda // fprintf( stderr, "jumpfori[%d] = %d\n", j, ijpi ); // fprintf( stderr, "jumpforj[%d] = %d\n", j, ijpj ); } if( i == imid ) // muda { midw[j] += wm; // midm[j+1] += *mjpt + fpenalty; //?????? midm[j+1] += *mjpt; //?????? } if( i == imid - 1 ) { // midn[j] += mi + fpenalty; //???? midn[j] += mi; //???? } #if STOREWM WMMTX[i][j] += wm; // WMMTX2[i][j+1] += *mjpt + fpenalty; WMMTX2[i][j+1] += *mjpt; #endif *curpt += wm; mjpt--; prept--; mpjpt--; curpt--; } // fprintf( stderr, "adding *mjpt (=%f) to WMMTX2[%d][%d]\n", *mjpt, i, j+1 ); g = *prept + fgcp1[i]; if( firstm < g ) { firstm = g; firstmp = i + 1; } #if STOREWM WMMTX2[i][j+1] += firstm; #endif if( i == imid ) midm[j+1] += firstm; if( i == imid - 1 ) { maxwm = midw[1]; jmid = 0; // if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); for( j=2; j maxwm ) { jmid = j; maxwm = wm; } // if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); } for( j=0; j maxwm ) { jmid = j; maxwm = wm; } // if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); } // if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); // fprintf( stderr, "### imid=%d, jmid=%d\n", imid, jmid ); wm = midw[jmid]; jumpi = imid-1; jumpj = jmid-1; if( jmid > 0 && midn[jmid-1] > wm ) //060413 { jumpi = imid-1; jumpj = jumpbacki[jmid]; wm = midn[jmid-1]; // fprintf( stderr, "rejump (n)\n" ); } if( midm[jmid] > wm ) { jumpi = jumpbackj[jmid]; jumpj = jmid-1; wm = midm[jmid]; // fprintf( stderr, "rejump (m) jumpi=%d\n", jumpi ); } // fprintf( stderr, "--> imid=%d, jmid=%d\n", imid, jmid ); // fprintf( stderr, "--> jumpi=%d, jumpj=%d\n", jumpi, jumpj ); #if STOREWM fprintf( stderr, "imid = %d\n", imid ); fprintf( stderr, "midn = \n" ); for( j=0; j 100 ) // naze 100 if( imid < firstmp-1 ) // naze 100 { jumpi = firstmp; imid = firstmp+1; } #if 0 else { jumpi = 0; imid = 1; } #endif #endif } #if 0 else if( jmid == lgth2 ) { fprintf( stderr, "CHUI1!\n" ); jumpi=0; jumpj=0; imid=jumpforwi[0]; jmid=lgth2-1; } #else // 060414 else if( jmid >= lgth2 ) { // fprintf( stderr, "CHUI1!\n" ); jumpi=imid-1; jmid=lgth2; jumpj = lgth2-1; } #endif else { // fprintf( stderr, "#### CHUI3!\n" ); imid = jumpforwi[jumpj]; jmid = jumpforwj[jumpj]; if( imid == jumpi ) jumpi = imid-1; } #if 0 fprintf( stderr, "jumpi -> %d\n", jumpi ); fprintf( stderr, "jumpj -> %d\n", jumpj ); fprintf( stderr, "imid -> %d\n", imid ); fprintf( stderr, "jmid -> %d\n", jmid ); #endif // fprintf( stderr, "#### FINAL i=%d, jumpi N ) { fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); ErrorExit( "LENGTH OVER!\n" ); } #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 freearrays_rec1 ( w1, w2, initverticalw, lastverticalw, midw, midm, midn, jumpbacki, jumpbackj, jumpforwi, jumpforwj, jumpdummi, jumpdummj, m, mp, doublework, intwork #if STOREWM , WMMTX, WMMTX2 #endif ); // fprintf( stderr, "==== calling myself (first), depth=%d\n", depth ); #if 0 fprintf( stderr, "seq1[0] = %.*s\n", lgth1, seq1[0] ); fprintf( stderr, "seq2[0] = %.*s\n", lgth2, seq2[0] ); #endif value = MSalignmm_rec( n_dynamicmtx, icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1pt, cpmx2pt, ist, ist+jumpi, jst, jst+jumpj, alloclen, fulllen1, fulllen2, aseq1, aseq2, agt1, agt2, depth, gapinfo, NULL, 0, NULL, headgp, tailgp, headgapfreq1_g, headgapfreq2_g ); // chudan mada #if 0 reporterr( "length1=%d -> %d? %d?\n", lgth1, strlen(seq1[0]), strlen(aseq1[0]) ); reporterr( "after first _rec\n" ); if( strlen( aseq1[0] ) != strlen( agt1 ) ) reporterr( "WARNING\n" ); fprintf( stderr, "aseq1[0] = %s\n", aseq1[0] ); fprintf( stderr, "aseq2[0] = %s\n", aseq2[0] ); fprintf( stderr, "agt1 = %s\n", agt1 ); fprintf( stderr, "agt2 = %s\n", agt2 ); #endif #if MEMSAVE #else for( i=0; i 0 ) { // for( i=0; i 0 ) { // for( i=0; i 1 || maxwm - value > 1 ) { fprintf( stderr, "WARNING value = %f, but maxwm = %f\n", value, maxwm ); for( i=0; i1-%d\n%s\n", i, mseq1[i] ); fprintf( stderr, "%s\n", aseq1[i] ); } for( i=0; i2-%d\n%s\n", i, mseq2[i] ); fprintf( stderr, "%s\n", aseq2[i] ); } // exit( 1 ); } else { fprintf( stderr, "value = %.0f, maxwm = %.0f -> ok\n", value, maxwm ); } #endif #if MEMSAVE #else 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( n_dynamicmtx, icyc, jcyc, eff1, eff2, seq1, seq2, cpmx1pt, cpmx2pt, 0, lgth1-1, 0, lgth2-1, alloclen, lgth1, lgth2, mseq1, mseq2, mgt1, mgt2, 0, gapinfo, chudanpt, chudanref, chudanres, headgp, tailgp, headgapfreq1, headgapfreq2 ); #ifdef enablemultithread if( chudanres && *chudanres ) { // fprintf( stderr, "\n\n## CHUUDAN!!! relay\n" ); *chudanres = 1; freearrays( ogcp1, ogcp2, ogcp1o, ogcp2o, fgcp1, fgcp2, fgcp1o, fgcp2o, cpmx1, cpmx2, gapfreq1f, gapfreq2f, gapinfo, mseq1, mseq2, mgt1, mgt2 ); return( -1.0 ); } #endif #if 1 if( cpmxresult ) { if( icyc + jcyc > 20 ) // if( 0 ) // if( 1 ) { #if 1 // marume gosa wo teigen suru tame double totaleff1 = 0.0; double totaleff2 = 0.0; for( i=0; i0.001 || fabs(totaleff2-1.0)>0.001 ) { reporterr( "Warning: rounding error may be large. totaleff1 = %50.40f\n", totaleff1 ); reporterr( "Warning: rounding error may be large. totaleff2 = %50.40f\n", totaleff2 ); exit( 1 ); } totaleff1 = totaleff1 * orieff1 / (orieff1 + orieff2); totaleff2 = totaleff2 * orieff2 / (orieff1 + orieff2); #else double totaleff1 = orieff1 / ( orieff1 + orieff2 ); double totaleff2 = orieff2 / ( orieff1 + orieff2 ); #endif *cpmxresult = AllocateDoubleMtx( nalphabets+3, strlen( mgt1 )+1 ); // gapcount, opg, fng no bun de +3 createcpmxresult( *cpmxresult, totaleff1, totaleff2, cpmx1pt, cpmx2pt, mgt1, mgt2 ); #if ATO creategapfreqresult( (*cpmxresult)[nalphabets], totaleff1, totaleff2, gapfreq1pt, gapfreq2pt, mgt1, mgt2 ); createogresult( (*cpmxresult)[nalphabets+1], totaleff1, totaleff2, ogcp1o, ogcp2o, gapfreq1pt, gapfreq2pt, mgt1, mgt2 ); createfgresult( (*cpmxresult)[nalphabets+2], totaleff1, totaleff2, fgcp1o, fgcp2o, gapfreq1pt, gapfreq2pt, mgt1, mgt2 ); #endif #if 0 reporterr( "\n" ); for( j=0; j 0 ) headgapfreq1 = gapfreq1f[-1]; else headgapfreq1 = headgapfreq1_g; if( jst > 0 ) headgapfreq2 = gapfreq2f[-1]; else headgapfreq2 = headgapfreq2_g; #if STOREWM char ttt1[10000], ttt2[10000]; #endif lgth1 = ien-ist+1; lgth2 = jen-jst+1; #if STOREWM strncpy( ttt1, seq1[0]+ist, lgth1 ); ttt1[lgth1] = 0; strncpy( ttt2, seq2[0]+jst, lgth2 ); ttt2[lgth2] = 0; fprintf( stderr, "in _tanni ist,ien = %d,%d, lgth1=%d\n", ist, ien, lgth1 ); fprintf( stderr, "in _tanni jst,jen = %d,%d, lgth2=%d\n", jst, jen, lgth2 ); fprintf( stderr, "ttt1 = %s\n", ttt1 ); fprintf( stderr, "ttt2 = %s\n", ttt2 ); #endif #if 0 fprintf( stderr, "in _tanni ist,ien = %d,%d, fulllen1=%d\n", ist, ien, fulllen1 ); fprintf( stderr, "in _tanni jst,jen = %d,%d, fulllen2=%d\n", jst, jen, fulllen2 ); fprintf( stderr, "in _tanni seq1[0] = %-*.*s\n", ien-ist+1, ien-ist+1, seq1[0]+ist ); fprintf( stderr, "in _tanni seq2[0] = %-*.*s\n", jen-jst+1, jen-jst+1, seq2[0]+jst ); #endif ll1 = ( (int)(lgth1) ) + 100; ll2 = ( (int)(lgth2) ) + 100; // aseq1 = AllocateCharMtx( icyc, 0 ); // aseq2 = AllocateCharMtx( jcyc, 0 ); // aseq1bk = AllocateCharMtx( icyc, lgth1+lgth2+100 ); // aseq2bk = AllocateCharMtx( jcyc, lgth1+lgth2+100 ); // for( i=0; i", wm ); #endif g = mi + fgcp2[j-1] * gapfreq1f[i]; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = -( j - mpi ); } g = *prept + ogcp2[j] * gapfreq1f[i-1]; if( g >= mi ) { mi = g; mpi = j-1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif g = *mjpt + fgcp1[i-1] * gapfreq2f[j]; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; *ijppt = +( i - *mpjpt ); } g = *prept + ogcp1[i] * gapfreq2f[j-1]; 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]; } // fprintf( stderr, "wm = %f\n", wm ); Atracking( currentw, lastverticalw, seq1, seq2, mseq1, mseq2, ijp, icyc, jcyc, ist, ien, jst, jen, fulllen1, fulllen2, tailgp, NULL, NULL ); #if 0 fprintf( stderr, "res in _tanni mseq1[0] = %s\n", mseq1[0] ); fprintf( stderr, "res in _tanni mseq2[0] = %s\n", mseq2[0] ); #endif // for( i=0; i 0 ) headgapfreq1 = gapfreq1f[-1]; else headgapfreq1 = headgapfreq1_g; if( jst > 0 ) headgapfreq2 = gapfreq2f[-1]; else headgapfreq2 = headgapfreq2_g; depth++; reccycle++; lgth1 = ien-ist+1; lgth2 = jen-jst+1; // if( lgth1 < 5 ) // fprintf( stderr, "\nWARNING: lgth1 = %d\n", lgth1 ); // if( lgth2 < 5 ) // fprintf( stderr, "\nWARNING: lgth2 = %d\n", lgth2 ); // #if STOREWM fprintf( stderr, "==== MSalign (depth=%d, reccycle=%d), ist=%d, ien=%d, jst=%d, jen=%d\n", depth, reccycle, ist, ien, jst, jen ); strncpy( ttt1, seq1[0]+ist, lgth1 ); strncpy( ttt2, seq2[0]+jst, lgth2 ); ttt1[lgth1] = 0; ttt2[lgth2] = 0; fprintf( stderr, "seq1 = %s\n", ttt1 ); fprintf( stderr, "seq2 = %s\n", ttt2 ); #endif if( lgth2 <= 0 ) // lgth1 <= 0 ha? { // fprintf( stderr, "\n\n==== jimei\n\n" ); // exit( 1 ); for( i=0; i", wm ); #endif g = mi + fgcp2[j-1] * gapfreq1f[i]; // g = mi + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; // *ijppt = -( j - mpi ); } g = *prept + ogcp2[j] * gapfreq1f[i-1]; // g = *prept; if( g >= mi ) { mi = g; mpi = j-1; } #if USE_PENALTY_EX mi += fpenalty_ex; #endif g = *mjpt + fgcp1[i-1] * gapfreq2f[j]; // g = *mjpt + fpenalty; #if 0 fprintf( stderr, "%5.0f?", g ); #endif if( g > wm ) { wm = g; // *ijppt = +( i - *mpjpt ); } g = *prept + ogcp1[i] * gapfreq2f[j-1]; // 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; #if STOREWM WMMTX[i][j] = *curpt; WMMTX2[i][j] = *mjpt; #endif if( i == imid ) //muda { jumpbackj[j] = *mpjpt; // muda atode matomeru jumpbacki[j] = mpi; // muda atode matomeru // fprintf( stderr, "jumpbackj[%d] in forward dp is %d\n", j, *mpjpt ); // fprintf( stderr, "jumpbacki[%d] in forward dp is %d\n", j, mpi ); midw[j] = *curpt; midm[j] = *mjpt; midn[j] = mi; } // fprintf( stderr, "m[%d] = %f\n", j, m[j] ); mjpt++; prept++; mpjpt++; curpt++; } lastverticalw[i] = currentw[lgth2-1]; #if STOREWM WMMTX2[i][lgth2] = m[lgth2-1]; #endif #if 0 // ue if( i == imid ) { for( j=0; j0; --j ) { m[j-1] = currentw[j] + fgcp2[lgth2-2]; // m[j-1] = currentw[j]; mp[j] = lgth1-1; } #else for( j=lgth2-1; j>-1; --j ) { m[j] = currentw[j+1] + fgcp1[lgth1-2] * gapfreq2f[j+1]; // m[j-1] = currentw[j]; mp[j] = lgth1-1; } #endif // for( j=0; j=imid; i-- ) firstm = -9999999.9; // firstmp = lgth1-1; firstmp = lgth1; for( i=lgth1-2; i>-1; i-- ) { #ifdef enablemultithread // fprintf( stderr, "chudan = %d, %d\n", *chudanpt, chudanref ); if( chudanpt && *chudanpt != chudanref ) { // fprintf( stderr, "\n\n## CHUUDAN!!! kouhan\n" ); *chudanres = 1; freearrays_rec1_variousdist ( w1, w2, initverticalw, lastverticalw, midw, midm, midn, jumpbacki, jumpbackj, jumpforwi, jumpforwj, jumpdummi, jumpdummj, m, mp, doublework, intwork #if STOREWM , WMMTX, WMMTX2 #endif ); freearrays_rec2( gaps, aseq1, aseq2 ); return( -1.0 ); } #endif wtmp = previousw; previousw = currentw; currentw = wtmp; previousw[lgth2-1] = initverticalw[i+1]; #if 0 match_calc( n_dynamicmtx, currentw, cpmx1+ist, cpmx2+jst, i, lgth2, doublework, intwork, 0 ); #else fillzero( currentw, lgth2 ); for( c=0; c-1; j-- ) { wm = *prept; ijpi = i+1; ijpj = j+1; g = mi + ogcp2[j+1] * gapfreq1f[i]; // g = mi + fpenalty; if( g > wm ) { wm = g; ijpj = mpi; ijpi = i+1; } g = *prept + fgcp2[j] * gapfreq1f[i+1]; // g = *prept; if( g >= mi ) { // fprintf( stderr, "i,j=%d,%d - renewed! mpi = %d\n", i, j, j+1 ); 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 + ogcp1[i+1] * gapfreq2f[j]; // g = *mjpt + fpenalty; if( g > wm ) { wm = g; ijpi = *mpjpt; ijpj = j+1; } // if( i == imid )fprintf( stderr, "i,j=%d,%d \n", i, j ); g = *prept + fgcp1[i] * gapfreq2f[j+1]; // g = *prept; if( g >= *mjpt ) { *mjpt = g; *mpjpt = i + 1; } #if USE_PENALTY_EX m[j] += fpenalty_ex; #endif if( i == jumpi || i == imid - 1 ) { jumpforwi[j] = ijpi; //muda jumpforwj[j] = ijpj; //muda // fprintf( stderr, "jumpfori[%d] = %d\n", j, ijpi ); // fprintf( stderr, "jumpforj[%d] = %d\n", j, ijpj ); } if( i == imid ) // muda { midw[j] += wm; // midm[j+1] += *mjpt + fpenalty; //?????? midm[j+1] += *mjpt; //?????? } if( i == imid - 1 ) { // midn[j] += mi + fpenalty; //???? midn[j] += mi; //???? } #if STOREWM WMMTX[i][j] += wm; // WMMTX2[i][j+1] += *mjpt + fpenalty; WMMTX2[i][j+1] += *mjpt; #endif *curpt += wm; mjpt--; prept--; mpjpt--; curpt--; } // fprintf( stderr, "adding *mjpt (=%f) to WMMTX2[%d][%d]\n", *mjpt, i, j+1 ); g = *prept + fgcp1[i]; if( firstm < g ) { firstm = g; firstmp = i + 1; } #if STOREWM WMMTX2[i][j+1] += firstm; #endif if( i == imid ) midm[j+1] += firstm; if( i == imid - 1 ) { maxwm = midw[1]; jmid = 0; // if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); for( j=2; j maxwm ) { jmid = j; maxwm = wm; } // if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); } for( j=0; j maxwm ) { jmid = j; maxwm = wm; } // if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); } // if( depth == 1 ) fprintf( stderr, "maxwm!! = %f\n", maxwm ); // fprintf( stderr, "### imid=%d, jmid=%d\n", imid, jmid ); wm = midw[jmid]; jumpi = imid-1; jumpj = jmid-1; if( jmid > 0 && midn[jmid-1] > wm ) //060413 { jumpi = imid-1; jumpj = jumpbacki[jmid]; wm = midn[jmid-1]; // fprintf( stderr, "rejump (n)\n" ); } if( midm[jmid] > wm ) { jumpi = jumpbackj[jmid]; jumpj = jmid-1; wm = midm[jmid]; // fprintf( stderr, "rejump (m) jumpi=%d\n", jumpi ); } // fprintf( stderr, "--> imid=%d, jmid=%d\n", imid, jmid ); // fprintf( stderr, "--> jumpi=%d, jumpj=%d\n", jumpi, jumpj ); #if STOREWM fprintf( stderr, "imid = %d\n", imid ); fprintf( stderr, "midn = \n" ); for( j=0; j 100 ) // naze 100 if( imid < firstmp-1 ) // naze 100 { jumpi = firstmp; imid = firstmp+1; } #if 0 else { jumpi = 0; imid = 1; } #endif #endif } #if 0 else if( jmid == lgth2 ) { fprintf( stderr, "CHUI1!\n" ); jumpi=0; jumpj=0; imid=jumpforwi[0]; jmid=lgth2-1; } #else // 060414 else if( jmid >= lgth2 ) { // fprintf( stderr, "CHUI1!\n" ); jumpi=imid-1; jmid=lgth2; jumpj = lgth2-1; } #endif else { // fprintf( stderr, "#### CHUI3!\n" ); imid = jumpforwi[jumpj]; jmid = jumpforwj[jumpj]; if( imid == jumpi ) jumpi = imid-1; } #if 0 fprintf( stderr, "jumpi -> %d\n", jumpi ); fprintf( stderr, "jumpj -> %d\n", jumpj ); fprintf( stderr, "imid -> %d\n", imid ); fprintf( stderr, "jmid -> %d\n", jmid ); #endif // fprintf( stderr, "#### FINAL i=%d, jumpi N ) { fprintf( stderr, "alloclen=%d, resultlen=%d, N=%d\n", alloclen, resultlen, N ); ErrorExit( "LENGTH OVER!\n" ); } #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 freearrays_rec1_variousdist ( w1, w2, initverticalw, lastverticalw, midw, midm, midn, jumpbacki, jumpbackj, jumpforwi, jumpforwj, jumpdummi, jumpdummj, m, mp, doublework, intwork #if STOREWM , WMMTX, WMMTX2 #endif ); // fprintf( stderr, "==== calling myself (first)\n" ); value = MSalignmm_rec_variousdist( matrices, icyc, jcyc, seq1, seq2, cpmx1s, cpmx2s, ist, ist+jumpi, jst, jst+jumpj, alloclen, fulllen1, fulllen2, aseq1, aseq2, depth, gapinfo, NULL, 0, NULL, headgp, tailgp, headgapfreq1_g, headgapfreq2_g ); // chudan mada #if 0 fprintf( stderr, "aseq1[0] = %s\n", aseq1[0] ); fprintf( stderr, "aseq2[0] = %s\n", aseq2[0] ); #endif #if MEMSAVE #else for( i=0; i 0 ) { // for( i=0; i 0 ) { // for( i=0; i 1 || maxwm - value > 1 ) { fprintf( stderr, "WARNING value = %f, but maxwm = %f\n", value, maxwm ); for( i=0; i1-%d\n%s\n", i, mseq1[i] ); fprintf( stderr, "%s\n", aseq1[i] ); } for( i=0; i2-%d\n%s\n", i, mseq2[i] ); fprintf( stderr, "%s\n", aseq2[i] ); } // exit( 1 ); } else { fprintf( stderr, "value = %.0f, maxwm = %.0f -> ok\n", value, maxwm ); } #endif #if MEMSAVE #else 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_variousdist( matrices, icyc, jcyc, seq1, seq2, cpmx1s, cpmx2s, 0, lgth1-1, 0, lgth2-1, alloclen, lgth1, lgth2, mseq1, mseq2, 0, gapinfo, chudanpt, chudanref, chudanres, headgp, tailgp, headgapfreq1, headgapfreq2 ); #ifdef enablemultithread if( chudanres && *chudanres ) { // fprintf( stderr, "\n\n## CHUUDAN!!! relay\n" ); *chudanres = 1; freearrays_variousdist( ogcp1, ogcp2, fgcp1, fgcp2, cpmx1s, cpmx2s, gapfreq1f, gapfreq2f, gapinfo, mseq1, mseq2 ); return( -1.0 ); } #endif #if 0 fprintf( stderr, "\n" ); fprintf( stderr, " seq1[0] = %s\n", seq1[0] ); fprintf( stderr, " seq2[0] = %s\n", seq2[0] ); fprintf( stderr, "mseq1[0] = %s\n", mseq1[0] ); fprintf( stderr, "mseq2[0] = %s\n", mseq2[0] ); fprintf( stderr, "\n" ); #endif // fprintf( stderr, "wm = %f\n", wm ); for( i=0; i