#include "mltaln.h" #define DEBUG 0 #define IODEBUG 0 #define SCOREOUT 0 #define SHISHAGONYU 0 // for debug #define REPORTCOSTS 0 static int treein; static int topin; static int treeout; static int distout; static int noalign; static int multidist; static int subalignment; static int subalignmentoffset; static int keeplength; static int ndeleted; static int mapout; static int smoothing; static int callpairlocalalign; static int outputhat23; static int nthreadtb; typedef struct _jobtable { int i; int j; } Jobtable; typedef struct _msacompactdistmtxthread_arg // single thread demo tsukau { int njob; int thread_no; int *selfscore; double **partmtx; char **seq; int **skiptable; double *mindist; int *mindistfrom; int *jobpospt; #ifdef enablemultithread pthread_mutex_t *mutex; #endif } msacompactdistmtxthread_arg_t; #ifdef enablemultithread typedef struct _distancematrixthread_arg { int njob; int thread_no; int *selfscore; double **iscore; char **seq; int **skiptable; Jobtable *jobpospt; pthread_mutex_t *mutex; } distancematrixthread_arg_t; typedef struct _treebasethread_arg { int thread_no; int *nrunpt; int njob; int *nlen; int *jobpospt; int ***topol; Treedep *dep; char **aseq; double *effarr; int *alloclenpt; LocalHom **localhomtable; RNApair ***singlerna; double *effarr_kozo; int *fftlog; char *mergeoralign; int *targetmap; int *uselh; pthread_mutex_t *mutex; pthread_cond_t *treecond; } treebasethread_arg_t; #endif static void arguments( int argc, char *argv[], int *pac, char **pav, int *tac, char **tav ) // 2 kai yobaremasu. { int c; int i; nthread = 1; nthreadtb = 1; nthreadpair = 1; outnumber = 0; scoreout = 0; spscoreout = 0; treein = 0; topin = 0; rnaprediction = 'm'; rnakozo = 0; nevermemsave = 0; inputfile = NULL; addfile = NULL; addprofile = 1; fftkeika = 0; constraint = 0; nblosum = 62; fmodel = 0; calledByXced = 0; devide = 0; use_fft = 0; // chuui force_fft = 0; fftscore = 1; fftRepeatStop = 0; fftNoAnchStop = 0; weight = 3; utree = 1; tbutree = 1; refine = 0; check = 1; cut = 0.0; disp = 0; outgap = 1; alg = 'A'; mix = 0; tbitr = 0; scmtd = 5; tbweight = 0; tbrweight = 3; checkC = 0; treemethod = 'X'; sueff_global = 0.1; contin = 0; scoremtx = 1; kobetsubunkatsu = 0; // dorp = NOTSPECIFIED; ppenalty_dist = NOTSPECIFIED; ppenalty = NOTSPECIFIED; penalty_shift_factor = 1000.0; ppenalty_ex = NOTSPECIFIED; poffset = NOTSPECIFIED; kimuraR = NOTSPECIFIED; pamN = NOTSPECIFIED; geta2 = GETA2; fftWinSize = NOTSPECIFIED; fftThreshold = NOTSPECIFIED; RNAppenalty = NOTSPECIFIED; RNAppenalty_ex = NOTSPECIFIED; RNApthr = NOTSPECIFIED; TMorJTT = JTT; consweight_multi = 1.0; consweight_rna = 0.0; multidist = 0; subalignment = 0; subalignmentoffset = 0; legacygapcost = 0; specificityconsideration = 0.0; keeplength = 0; mapout = 0; smoothing = 0; specifictarget = 0; callpairlocalalign = 0; outputhat23 = 0; nwildcard = 0; nadd = 0; if( pac ) { pav[0] = "tbfast-pair"; *pac = 1; tav[0] = "tbfast"; *tac = 1; for( i=0; i 0 && (*++argv)[0] == '-' ) { // reporterr( "(*argv)[0] = %s\n", (*argv) ); while ( ( c = *++argv[0] ) ) { // reporterr( "c=%c\n", c ); switch( c ) { case 'i': inputfile = *++argv; // fprintf( stderr, "inputfile = %s\n", inputfile ); --argc; goto nextoption; case 'I': nadd = myatoi( *++argv ); // fprintf( stderr, "nadd = %d\n", nadd ); --argc; goto nextoption; case 'e': RNApthr = (int)( atof( *++argv ) * 1000 - 0.5 ); --argc; goto nextoption; case 'o': RNAppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); --argc; goto nextoption; case 'V': ppenalty_dist = (int)( atof( *++argv ) * 1000 - 0.5 ); // fprintf( stderr, "ppenalty = %d\n", ppenalty ); --argc; goto nextoption; case 'f': ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); // fprintf( stderr, "ppenalty = %d\n", ppenalty ); --argc; goto nextoption; case 'Q': penalty_shift_factor = atof( *++argv ); --argc; goto nextoption; case 'g': ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); // fprintf( stderr, "ppenalty_ex = %d\n", ppenalty_ex ); --argc; goto nextoption; case 'h': poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); // fprintf( stderr, "poffset = %d\n", poffset ); --argc; goto nextoption; case 'k': kimuraR = myatoi( *++argv ); // fprintf( stderr, "kappa = %d\n", kimuraR ); --argc; goto nextoption; case 'b': nblosum = myatoi( *++argv ); scoremtx = 1; // fprintf( stderr, "blosum %d / kimura 200\n", nblosum ); --argc; goto nextoption; case 'j': pamN = myatoi( *++argv ); scoremtx = 0; TMorJTT = JTT; // fprintf( stderr, "jtt/kimura %d\n", pamN ); --argc; goto nextoption; case 'm': pamN = myatoi( *++argv ); scoremtx = 0; TMorJTT = TM; // fprintf( stderr, "tm %d\n", pamN ); --argc; goto nextoption; case 'l': fastathreshold = atof( *++argv ); constraint = 2; --argc; goto nextoption; case 'r': consweight_rna = atof( *++argv ); rnakozo = 1; --argc; goto nextoption; case 'c': consweight_multi = atof( *++argv ); --argc; goto nextoption; case 'C': nthreadpair = nthread = myatoi( *++argv ); // fprintf( stderr, "nthread = %d\n", nthread ); --argc; #ifndef enablemultithread nthread = 0; #endif goto nextoption; case 's': specificityconsideration = (double)myatof( *++argv ); // fprintf( stderr, "specificityconsideration = %f\n", specificityconsideration ); --argc; goto nextoption; case 'R': rnaprediction = 'r'; #if 1 case 'a': fmodel = 1; break; #endif case 'K': addprofile = 0; break; case 'y': distout = 1; break; case 't': treeout = 1; break; case '^': treeout = 2; break; case 'T': noalign = 1; break; case 'D': dorp = 'd'; break; case 'P': dorp = 'p'; break; case 'L': legacygapcost = 1; break; #if 1 case 'O': outgap = 0; break; #else case 'O': fftNoAnchStop = 1; break; #endif #if 0 case 'S' : scoreout = 1; // for checking parallel calculation break; #else case 'S' : spscoreout = 1; // 2014/Dec/30, sp score break; #endif case 'H': subalignment = 1; subalignmentoffset = myatoi( *++argv ); --argc; goto nextoption; #if 0 case 'e': fftscore = 0; break; case 'r': fmodel = -1; break; case 'R': fftRepeatStop = 1; break; case 's': treemethod = 's'; break; #endif case 'X': treemethod = 'X'; sueff_global = atof( *++argv ); // fprintf( stderr, "sueff_global = %f\n", sueff_global ); --argc; goto nextoption; case 'E': treemethod = 'E'; break; case 'q': treemethod = 'q'; break; case 'n' : outnumber = 1; break; #if 0 case 'a': alg = 'a'; break; case 'H': alg = 'H'; break; case 'Q': alg = 'Q'; break; #endif case '@': alg = 'd'; break; case 'A': alg = 'A'; break; case 'M': alg = 'M'; break; case 'N': nevermemsave = 1; break; case 'B': // hitsuyou! memopt -M -B no tame break; case 'F': use_fft = 1; break; case 'G': force_fft = 1; use_fft = 1; break; case 'U': treein = 1; break; #if 0 case 'V': topin = 1; break; #endif case 'u': tbrweight = 0; weight = 0; break; case 'v': tbrweight = 3; break; case 'd': multidist = 1; break; #if 0 case 'd': disp = 1; break; #endif /* Modified 01/08/27, default: user tree */ case 'J': tbutree = 0; break; /* modification end. */ case 'z': fftThreshold = myatoi( *++argv ); --argc; goto nextoption; case 'w': fftWinSize = myatoi( *++argv ); --argc; goto nextoption; case 'W': minimumweight = atof( *++argv ); // fprintf( stderr, "minimumweight = %f\n", minimumweight ); --argc; goto nextoption; #if 0 case 'Z': checkC = 1; break; #endif case 'Y': keeplength = 1; break; case 'Z': mapout = 1; break; case 'p': smoothing = 1; break; case '=': specifictarget = 1; break; case ':': nwildcard = 1; break; case '+': outputhat23 = myatoi( *++argv ); reporterr( "outputhat23=%d\n", outputhat23 ); --argc; goto nextoption; default: fprintf( stderr, "illegal option %c\n", c ); argc = 0; break; } } nextoption: ; } // reporterr( "argc=%d\n", argc ); if( argc == 1 ) { cut = atof( (*argv) ); argc--; } if( argc != 0 ) { fprintf( stderr, "argc=%d, tbfast options: Check source file !\n", argc ); exit( 1 ); } if( tbitr == 1 && outgap == 0 ) { fprintf( stderr, "conflicting options : o, m or u\n" ); exit( 1 ); } if( alg == 'C' && outgap == 0 ) { fprintf( stderr, "conflicting options : C, o\n" ); exit( 1 ); } } #if 0 static void *distancematrixthread2( void *arg ) { distancematrixthread_arg_t *targ = (distancematrixthread_arg_t *)arg; int njob = targ->njob; int thread_no = targ->thread_no; double *selfscore = targ->selfscore; double **iscore = targ->iscore; char **seq = targ->seq; Jobtable *jobpospt = targ->jobpospt; double ssi, ssj, bunbo; int i, j; while( 1 ) { pthread_mutex_lock( targ->mutex ); i = jobpospt->i; i++; if( i == njob-1 ) { pthread_mutex_unlock( targ->mutex ); return( NULL ); } jobpospt->i = i; pthread_mutex_unlock( targ->mutex ); ssi = selfscore[i]; if( i % 10 == 0 ) fprintf( stderr, "\r% 5d / %d (thread %4d)", i, njob, thread_no ); for( j=i+1; jnjob; int thread_no = targ->thread_no; int *selfscore = targ->selfscore; double **partmtx = targ->partmtx; char **seq = targ->seq; int **skiptable = targ->skiptable; double *mindist = targ->mindist; int *mindistfrom = targ->mindistfrom; int *jobpospt = targ->jobpospt; double tmpdist, preference, tmpdistx, tmpdisty; int i, j; while( 1 ) { #ifdef enablemultithread if( nthreadpair ) { pthread_mutex_lock( targ->mutex ); i = *jobpospt; if( i == njob-1 ) { pthread_mutex_unlock( targ->mutex ); return( NULL ); } *jobpospt = i+1; pthread_mutex_unlock( targ->mutex ); } else #endif { i = *jobpospt; if( i == njob-1 ) { return( NULL ); } *jobpospt = i+1; } if( i % 100 == 0 ) { if( nthreadpair ) fprintf( stderr, "\r% 5d / %d (thread %4d)", i, njob, thread_no ); else fprintf( stderr, "\r% 5d / %d", i, njob ); } for( j=i+1; jnjob; int thread_no = targ->thread_no; double *selfscore = targ->selfscore; double **iscore = targ->iscore; char **seq = targ->seq; int **skiptable = targ->skiptable; Jobtable *jobpospt = targ->jobpospt; double ssi, ssj, bunbo; int i, j; while( 1 ) { pthread_mutex_lock( targ->mutex ); j = jobpospt->j; i = jobpospt->i; j++; if( j == njob ) { i++; j = i + 1; if( i == njob-1 ) { pthread_mutex_unlock( targ->mutex ); return( NULL ); } } jobpospt->j = j; jobpospt->i = i; pthread_mutex_unlock( targ->mutex ); if( j==i+1 && i % 10 == 0 ) fprintf( stderr, "\r% 5d / %d (thread %4d)", i, njob, thread_no ); ssi = selfscore[i]; ssj = selfscore[j]; bunbo = MIN( ssi, ssj ); if( bunbo == 0.0 ) iscore[i][j-i] = 2.0; // 2013/Oct/17 else // iscore[i][j-i] = ( 1.0 - naivepairscore11( seq[i], seq[j], penalty_dist ) / bunbo ) * 2.0; // 2013/Oct/17 iscore[i][j-i] = ( 1.0 - naivepairscorefast( seq[i], seq[j], skiptable[i], skiptable[j], penalty_dist ) / bunbo ) * 2.0; // 2014/Aug/15 fast if( iscore[i][j-i] > 10 ) iscore[i][j-i] = 10.0; // 2015/Mar/17 } } #else static void *distancematrixthread( void *arg ) // v7.2 ijou deha tsukawanaihazu { distancematrixthread_arg_t *targ = (distancematrixthread_arg_t *)arg; int njob = targ->njob; int thread_no = targ->thread_no; int *selfscore = targ->selfscore; double **iscore = targ->iscore; char **seq = targ->seq; int **skiptable = targ->skiptable; Jobtable *jobpospt = targ->jobpospt; int ssi, ssj, bunbo; int i, j; while( 1 ) { pthread_mutex_lock( targ->mutex ); i = jobpospt->i; // (jobpospt-i)++ dato, shuuryou hantei no mae ni ++ surunode, tomaranakunaru. if( i == njob-1 ) { pthread_mutex_unlock( targ->mutex ); return( NULL ); } jobpospt->i += 1; pthread_mutex_unlock( targ->mutex ); if( i % 100 == 0 ) fprintf( stderr, "\r% 5d / %d (thread %4d)", i, njob, thread_no ); ssi = selfscore[i]; for( j=i+1; j 10.0 ) iscore[i][j-i] = 10.0; // 2015/Mar/17 } } } #endif static void *treebasethread( void *arg ) // seed && compacttree==3 niha taioushinai. { treebasethread_arg_t *targ = (treebasethread_arg_t *)arg; int *nrunpt = targ->nrunpt; int thread_no = targ->thread_no; int njob = targ->njob; int *nlen = targ->nlen; int *jobpospt = targ->jobpospt; int ***topol = targ->topol; Treedep *dep = targ->dep; char **aseq = targ->aseq; double *effarr = targ->effarr; int *alloclen = targ->alloclenpt; LocalHom **localhomtable = targ->localhomtable; RNApair ***singlerna = targ->singlerna; double *effarr_kozo = targ->effarr_kozo; int *fftlog = targ->fftlog; int *targetmap = targ->targetmap; int *uselh = targ->uselh; char *mergeoralign = targ->mergeoralign; char **mseq1, **mseq2; char **localcopy; int i, j, l; int len1, len2; int clus1, clus2; double pscore; char *indication1, *indication2; double *effarr1 = NULL; double *effarr2 = NULL; double *effarr1_kozo = NULL; double *effarr2_kozo = NULL; LocalHom ***localhomshrink = NULL; char *swaplist = NULL; int m1, m2; // double dumfl = 0.0; double dumdb = 0.0; int ffttry; RNApair ***grouprna1 = NULL, ***grouprna2 = NULL; double **dynamicmtx; int **localmem = NULL; int posinmem; #if REPORTCOSTS time_t starttime, startclock; starttime = time(NULL); startclock = clock(); #endif if( compacttree == 3 ) { reporterr( "bug. treebasethread() is no longer used when compacttree==3.\n" ); exit( 1 ); } mseq1 = AllocateCharMtx( njob, 0 ); mseq2 = AllocateCharMtx( njob, 0 ); localcopy = calloc( njob, sizeof( char * ) ); dynamicmtx = AllocateDoubleMtx( nalphabets, nalphabets ); localmem = AllocateIntMtx( 2, njob+1 ); // memhist mitaiou if( rnakozo && rnaprediction == 'm' ) { grouprna1 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); grouprna2 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); } else { grouprna1 = grouprna2 = NULL; } effarr1 = AllocateDoubleVec( njob ); effarr2 = AllocateDoubleVec( njob ); indication1 = AllocateCharVec( 150 ); indication2 = AllocateCharVec( 150 ); #if 0 reporterr( "before allocating localhomshrink (--thread >0), constraint=%d, njob=%d\n", constraint, njob ); use_getrusage(); #endif swaplist = NULL; // if( constraint ) if( constraint && compacttree != 3 ) { if( specifictarget ) swaplist = calloc( njob, sizeof( char ) ); // use_getrusage(); localhomshrink = (LocalHom ***)calloc( njob, sizeof( LocalHom ** ) ); for( i=0; i main thread if( constraint ) calcimportance( njob, effarr, aseq, localhomtable ); #endif // writePre( njob, name, nlen, aseq, 0 ); // for( l=0; lmutex ); l = *jobpospt; if( l == njob-1 ) { pthread_mutex_unlock( targ->mutex ); if( commonIP ) FreeIntMtx( commonIP ); commonIP = NULL; Falign( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, 0, NULL ); Falign_udpari_long( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, NULL ); A__align( NULL, 0, 0, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); D__align( NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0 ); partA__align( NULL, NULL, NULL, NULL, 0, 0, 0, 0, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL ); G__align11( NULL, NULL, NULL, 0, 0, 0 ); // iru? free( mseq1 ); free( mseq2 ); free( localcopy ); free( effarr1 ); free( effarr2 ); free( effarr1_kozo ); free( effarr2_kozo ); free( indication1 ); free( indication2 ); FreeDoubleMtx( dynamicmtx ); FreeIntMtx( localmem ); if( rnakozo && rnaprediction == 'm' ) { if( grouprna1 ) free( grouprna1 ); // nakami ha? if( grouprna2 ) free( grouprna2 ); // nakami ha? grouprna1 = grouprna2 = NULL; } if( constraint && compacttree != 3 ) { if( localhomshrink ) // nen no tame { for( i=0; itreecond, targ->mutex ); } if( dep[l].child1 != -1 ) { while( dep[dep[l].child1].done == 0 ) pthread_cond_wait( targ->treecond, targ->mutex ); } // while( *nrunpt >= nthread ) // pthread_cond_wait( targ->treecond, targ->mutex ); // iranai no?? (*nrunpt)++; // pthread_mutex_unlock( targ->mutex ); if( mergeoralign[l] == 'n' ) { // fprintf( stderr, "SKIP!\n" ); dep[l].done = 1; (*nrunpt)--; pthread_cond_broadcast( targ->treecond ); // free( topol[l][0] ); // free( topol[l][1] ); // free( topol[l] ); pthread_mutex_unlock( targ->mutex ); // free( localmem[0] ); // free( localmem[1] ); continue; } m1 = topol[l][0][0]; m2 = topol[l][1][0]; // fprintf( stderr, "\ndistfromtip = %f\n", dep[l].distfromtip ); // makedynamicmtx( dynamicmtx, n_dis_consweight_multi, dep[l].distfromtip - 0.5 ); makedynamicmtx( dynamicmtx, n_dis_consweight_multi, dep[l].distfromtip ); // pthread_mutex_lock( targ->mutex ); len1 = strlen( aseq[m1] ); len2 = strlen( aseq[m2] ); if( *alloclen <= len1 + len2 ) { fprintf( stderr, "\nReallocating (by thread %d) ..", thread_no ); *alloclen = ( len1 + len2 ) + 1000; ReallocateCharMtx( aseq, njob, *alloclen + 10 ); fprintf( stderr, "done. *alloclen = %d\n", *alloclen ); } localmem[0][0] = -1; posinmem=topolorderz( localmem[0], topol, dep, l, 0 ) - localmem[0]; localmem[1][0] = -1; posinmem=topolorderz( localmem[1], topol, dep, l, 1 ) - localmem[1]; for( i=0; (j=localmem[0][i])!=-1; i++ ) { localcopy[j] = calloc( *alloclen, sizeof( char ) ); strcpy( localcopy[j], aseq[j] ); } for( i=0; (j=localmem[1][i])!=-1; i++ ) { localcopy[j] = calloc( *alloclen, sizeof( char ) ); strcpy( localcopy[j], aseq[j] ); } pthread_mutex_unlock( targ->mutex ); if( effarr_kozo ) { clus1 = fastconjuction_noname_kozo( localmem[0], localcopy, mseq1, effarr1, effarr, effarr1_kozo, effarr_kozo, indication1 ); clus2 = fastconjuction_noname_kozo( localmem[1], localcopy, mseq2, effarr2, effarr, effarr2_kozo, effarr_kozo, indication2 ); } #if 0 else if( specifictarget ) { clus1 = fastconjuction_target( topol[l][0], localcopy, mseq1, effarr1, effarr, indication1, minimumweight, targetmap ); clus2 = fastconjuction_target( topol[l][1], localcopy, mseq2, effarr2, effarr, indication2, minimumweight, targetmap ); } #endif else { clus1 = fastconjuction_noname( localmem[0], localcopy, mseq1, effarr1, effarr, indication1, minimumweight, NULL ); clus2 = fastconjuction_noname( localmem[1], localcopy, mseq2, effarr2, effarr, indication2, minimumweight, NULL ); } #if 1 if( l < 1000 || l % 100 == 0 ) fprintf( stderr, "\rSTEP % 5d /%d (thread %4d) ", l+1, njob-1, thread_no ); #else fprintf( stderr, "STEP %d /%d (thread %d) \n", l+1, njob-1, thread_no ); fprintf( stderr, "group1 = %.66s", indication1 ); if( strlen( indication1 ) > 66 ) fprintf( stderr, "..." ); fprintf( stderr, ", child1 = %d\n", dep[l].child0 ); fprintf( stderr, "group2 = %.66s", indication2 ); if( strlen( indication2 ) > 66 ) fprintf( stderr, "..." ); fprintf( stderr, ", child2 = %d\n", dep[l].child1 ); fprintf( stderr, "Group1's lengths = " ); for( i=0; i 30000 || len2 > 30000 ) ) ) { fprintf( stderr, "\nlen1=%d, len2=%d, Switching to the memsave mode.\n", len1, len2 ); alg = 'M'; if( commonIP ) FreeIntMtx( commonIP ); commonIP = NULL; commonAlloc1 = 0; commonAlloc2 = 0; } // if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 1000 && clus2 < 1000 ); else ffttry = 0; // ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 5000 && clus2 < 5000 ); // v6.708 // fprintf( stderr, "f=%d, len1/fftlog[m1]=%f, clus1=%d, len2/fftlog[m2]=%f, clus2=%d\n", ffttry, (double)len1/fftlog[m1], clus1, (double)len2/fftlog[m2], clus2 ); // fprintf( stderr, "f=%d, clus1=%d, fftlog[m1]=%d, clus2=%d, fftlog[m2]=%d\n", ffttry, clus1, fftlog[m1], clus2, fftlog[m2] ); if( constraint == 2 ) { if( alg == 'M' ) { fprintf( stderr, "\n\nMemory saving mode is not supported.\n\n" ); exit( 1 ); } // fprintf( stderr, "c" ); if( alg == 'A' ) { imp_match_init_strict( NULL, clus1, clus2, strlen( mseq1[0] ), strlen( mseq2[0] ), mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, localmem[0], localmem[1], uselh, NULL, NULL, (compacttree==3)?l:-1, 0 ); // seedinlh, nfiles ni ha taiou shiteinai if( rnakozo ) imp_rna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, NULL, NULL, NULL ); pscore = A__align( dynamicmtx, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, constraint, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); // cpmxhist mitaiou } if( alg == 'd' ) { imp_match_init_strictD( NULL, clus1, clus2, strlen( mseq1[0] ), strlen( mseq2[0] ), mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, localmem[0], localmem[1], uselh, NULL, NULL, (compacttree==3)?l:-1, 0 ); if( rnakozo ) imp_rnaD( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, NULL, NULL, NULL ); pscore = D__align( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, constraint, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap ); } else if( alg == 'Q' ) { fprintf( stderr, "Not supported\n" ); exit( 1 ); } } else if( force_fft || ( use_fft && ffttry ) ) { fprintf( stderr, " f\b\b" ); if( alg == 'M' ) { fprintf( stderr, "m" ); pscore = Falign_udpari_long( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1 ); } else pscore = Falign( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1, NULL, 0, NULL ); } else { fprintf( stderr, " d\b\b" ); fftlog[m1] = 0; switch( alg ) { case( 'a' ): pscore = Aalign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen ); break; case( 'M' ): fprintf( stderr, "m" ); pscore = MSalignmm( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, NULL, NULL, NULL, 0.0, 0.0 ); // cpmxhist mitaiou break; case( 'A' ): pscore = A__align( dynamicmtx, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, -1, -1, NULL, NULL, NULL, 0.0, 0.0 ); // cpmxhist mitaiou break; case( 'd' ): pscore = D__align( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap ); break; default: ErrorExit( "ERROR IN SOURCE FILE" ); } } nlen[m1] = 0.5 * ( nlen[m1] + nlen[m2] ); #if SCOREOUT fprintf( stderr, "score = %10.2f\n", pscore ); #endif /* fprintf( stderr, "after align 1 %s \n", indication1 ); display( mseq1, clus1 ); fprintf( stderr, "\n" ); fprintf( stderr, "after align 2 %s \n", indication2 ); display( mseq2, clus2 ); fprintf( stderr, "\n" ); */ // writePre( njob, name, nlen, localcopy, 0 ); if( disp ) display( localcopy, njob ); pthread_mutex_lock( targ->mutex ); dep[l].done = 1; (*nrunpt)--; pthread_cond_broadcast( targ->treecond ); for( i=0; (j=localmem[0][i])!=-1; i++ ) strcpy( aseq[j], localcopy[j] ); for( i=0; (j=localmem[1][i])!=-1; i++ ) strcpy( aseq[j], localcopy[j] ); pthread_mutex_unlock( targ->mutex ); for( i=0; (j=localmem[0][i])!=-1; i++ ) free( localcopy[j] ); for( i=0; (j=localmem[1][i])!=-1; i++ ) free( localcopy[j] ); // free( topol[l][0] ); // free( topol[l][1] ); // free( topol[l] ); #if REPORTCOSTS if( l < 1000 || l % 100 == 0 ) { use_getrusage(); reporterr( "real = %f min\n", (float)(time(NULL) - starttime)/60.0 ); reporterr( "user = %f min\n", (float)(clock()-startclock)/CLOCKS_PER_SEC/60); } #endif } } #endif void treebase( int *nlen, char **aseq, int nadd, char *mergeoralign, char **mseq1, char **mseq2, int ***topol, Treedep *dep, double *effarr, int *alloclen, LocalHom **localhomtable, RNApair ***singlerna, double *effarr_kozo, int *targetmap, int *targetmapr, int ntarget, int *uselh, int nseed, int *nfilesfornode ) { int i, l, m; int len1nocommongap, len2nocommongap; int len1, len2; int clus1, clus2; double pscore, tscore; char *indication1, *indication2; double *effarr1 = NULL; double *effarr2 = NULL; double *effarr1_kozo = NULL; double *effarr2_kozo = NULL; LocalHom ***localhomshrink = NULL; int *seedinlh1 = NULL; int *seedinlh2 = NULL; char *swaplist = NULL; int *fftlog; int m1, m2; int *gaplen; int *gapmap; int *alreadyaligned; // double dumfl = 0.0; double dumdb = 0.0; int ffttry; RNApair ***grouprna1 = NULL, ***grouprna2 = NULL; static double **dynamicmtx; int gapmaplen; int **localmem = NULL; int posinmem; int nfiles; double ***cpmxhist = NULL; int **memhist = NULL; double **cpmxchild0, **cpmxchild1; double orieff1, orieff2; #if REPORTCOSTS time_t starttime, startclock; starttime = time(NULL); startclock = clock(); #endif if( rnakozo && rnaprediction == 'm' ) { grouprna1 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); grouprna2 = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); } else { grouprna1 = grouprna2 = NULL; } fftlog = AllocateIntVec( njob ); effarr1 = AllocateDoubleVec( njob ); effarr2 = AllocateDoubleVec( njob ); indication1 = AllocateCharVec( 150 ); indication2 = AllocateCharVec( 150 ); gaplen = AllocateIntVec( *alloclen+10 ); gapmap = AllocateIntVec( *alloclen+10 ); alreadyaligned = AllocateIntVec( njob ); dynamicmtx = AllocateDoubleMtx( nalphabets, nalphabets ); localmem = calloc( sizeof( int * ), 2 ); cpmxhist = (double ***)calloc( njob-1, sizeof( double ** ) ); for( i=0; i0, nseed > 0 { localhomshrink = (LocalHom ***)calloc( nseed, sizeof( LocalHom ** ) ); for( i=0; i 0, compacttree == 3 && nseed == 0 { seedinlh1 = NULL; // nakutemo seedinlh2 = NULL; // nakutemo localhomshrink = NULL; // nakutemo } effarr1_kozo = AllocateDoubleVec( njob ); //tsuneni allocate sareru. effarr2_kozo = AllocateDoubleVec( njob ); //tsuneni allocate sareru. for( i=0; i 0 { dontcalcimportance_half( nseed, effarr, aseq, localhomtable ); //CHUUI } // writePre( njob, name, nlen, aseq, 0 ); tscore = 0.0; for( l=0; l 66 ) fprintf( stderr, "..." ); fprintf( stderr, "\n" ); fprintf( stderr, "group2 = %.66s", indication2 ); if( strlen( indication2 ) > 66 ) fprintf( stderr, "..." ); fprintf( stderr, "\n" ); #endif #if REPORTCOSTS if( l < 1000 || l % 100 == 0 ) reporterr( "\nclus1=%d, clus2=%d\n", clus1, clus2 ); #endif // for( i=0; i 0 && compacttree == 3 && nseed > 0 { fastshrinklocalhom_half_seed( localmem[0], localmem[1], nseed, seedinlh1, seedinlh2, localhomtable, localhomshrink ); for( i=0; i 30000 || len2 > 30000 ) ) ) { fprintf( stderr, "\nlen1=%d, len2=%d, Switching to the memsave mode.\n", len1, len2 ); alg = 'M'; if( commonIP ) FreeIntMtx( commonIP ); commonIP = NULL; commonAlloc1 = 0; commonAlloc2 = 0; } // if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 ); if( fftlog[m1] && fftlog[m2] ) ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 1000 && clus2 < 1000 ); else ffttry = 0; // ffttry = ( nlen[m1] > clus1 && nlen[m2] > clus2 && clus1 < 5000 && clus2 < 5000 ); // v6.708 // fprintf( stderr, "f=%d, len1/fftlog[m1]=%f, clus1=%d, len2/fftlog[m2]=%f, clus2=%d\n", ffttry, (double)len1/fftlog[m1], clus1, (double)len2/fftlog[m2], clus2 ); // fprintf( stderr, "f=%d, clus1=%d, fftlog[m1]=%d, clus2=%d, fftlog[m2]=%d\n", ffttry, clus1, fftlog[m1], clus2, fftlog[m2] ); if( constraint == 2 ) { if( alg == 'M' ) { fprintf( stderr, "\n\nMemory saving mode is not supported.\n\n" ); exit( 1 ); } // fprintf( stderr, "c" ); if( alg == 'A' ) { imp_match_init_strict( NULL, clus1, clus2, strlen( mseq1[0] ), strlen( mseq2[0] ), mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, localmem[0], localmem[1], uselh, seedinlh1, seedinlh2, (compacttree==3)?l:-1, nfiles ); if( rnakozo ) imp_rna( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, NULL, NULL, NULL ); #if REPORTCOSTS // reporterr( "\n\n %d - %d (%d x %d) : \n", topol[l][0][0], topol[l][1][0], clus1, clus2 ); #endif pscore = A__align( dynamicmtx, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, constraint, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, localmem[0][0], 1, cpmxchild0, cpmxchild1, cpmxhist+l, orieff1, orieff2 ); } if( alg == 'd' ) { imp_match_init_strictD( NULL, clus1, clus2, strlen( mseq1[0] ), strlen( mseq2[0] ), mseq1, mseq2, effarr1, effarr2, effarr1_kozo, effarr2_kozo, localhomshrink, swaplist, 1, localmem[0], localmem[1], uselh, seedinlh1, seedinlh2, (compacttree==3)?l:-1, nfiles ); if( rnakozo ) imp_rnaD( clus1, clus2, mseq1, mseq2, effarr1, effarr2, grouprna1, grouprna2, NULL, NULL, NULL ); pscore = D__align( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, constraint, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap ); } else if( alg == 'Q' ) { fprintf( stderr, "Not supported\n" ); exit( 1 ); } } else if( force_fft || ( use_fft && ffttry ) ) { fprintf( stderr, " f\b\b" ); if( alg == 'M' ) { fprintf( stderr, "m" ); pscore = Falign_udpari_long( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1 ); } else pscore = Falign( NULL, NULL, dynamicmtx, mseq1, mseq2, effarr1, effarr2, NULL, NULL, clus1, clus2, *alloclen, fftlog+m1, NULL, 0, NULL ); } else { fprintf( stderr, " d\b\b" ); fftlog[m1] = 0; switch( alg ) { case( 'a' ): pscore = Aalign( mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen ); break; case( 'M' ): fprintf( stderr, "m" ); pscore = MSalignmm( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, cpmxchild0, cpmxchild1, cpmxhist+l, orieff1, orieff2 ); break; case( 'A' ): pscore = A__align( dynamicmtx, penalty, penalty_ex, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap, localmem[0][0], 1, cpmxchild0, cpmxchild1, cpmxhist+l, orieff1, orieff2 ); break; case( 'd' ): pscore = D__align( dynamicmtx, mseq1, mseq2, effarr1, effarr2, clus1, clus2, *alloclen, 0, &dumdb, NULL, NULL, NULL, NULL, NULL, 0, NULL, outgap, outgap ); break; default: ErrorExit( "ERROR IN SOURCE FILE" ); } } nlen[m1] = 0.5 * ( nlen[m1] + nlen[m2] ); #if SCOREOUT fprintf( stderr, "score = %10.2f\n", pscore ); #endif tscore += pscore; /* fprintf( stderr, "after align 1 %s \n", indication1 ); display( mseq1, clus1 ); fprintf( stderr, "\n" ); fprintf( stderr, "after align 2 %s \n", indication2 ); display( mseq2, clus2 ); fprintf( stderr, "\n" ); */ // writePre( njob, name, nlen, aseq, 0 ); if( disp ) display( aseq, njob ); if( mergeoralign[l] == '1' ) // jissainiha nai. atarashii hairetsu ha saigo dakara. { reporterr( "Check source!!\n" ); exit( 1 ); } if( mergeoralign[l] == '2' ) { // fprintf( stderr, ">mseq1[0] = \n%s\n", mseq1[0] ); // fprintf( stderr, ">mseq2[0] = \n%s\n", mseq2[0] ); // if( keeplength ) ndeleted += deletenewinsertions( clus1, clus2, mseq1, mseq2, NULL ); gapmaplen = strlen( mseq1[0] )-len1nocommongap+len1; adjustgapmap( gapmaplen, gapmap, mseq1[0] ); if( smoothing ) { restorecommongapssmoothly( njob, njob-(clus1+clus2), aseq, localmem[0], localmem[1], gapmap, *alloclen, '-' ); findnewgaps( clus1, 0, mseq1, gaplen ); insertnewgaps_bothorders( njob, alreadyaligned, aseq, localmem[0], localmem[1], gaplen, gapmap, gapmaplen, *alloclen, alg, '-' ); } else { restorecommongaps( njob, njob-(clus1+clus2), aseq, localmem[0], localmem[1], gapmap, *alloclen, '-' ); findnewgaps( clus1, 0, mseq1, gaplen ); insertnewgaps( njob, alreadyaligned, aseq, localmem[0], localmem[1], gaplen, gapmap, *alloclen, alg, '-' ); } #if 0 for( i=0; i-1; i++ ) alreadyaligned[m] = 1; } // free( topol[l][0] ); // free( topol[l][1] ); // free( topol[l] ); free( localmem[0] ); free( localmem[1] ); #if REPORTCOSTS if( l < 1000 || l % 100 == 0 ) { use_getrusage(); reporterr( "real = %f min\n", (float)(time(NULL) - starttime)/60.0 ); reporterr( "user = %f min\n", (float)(clock()-startclock)/CLOCKS_PER_SEC/60); } #endif } #if REPORTCOSTS use_getrusage(); reporterr( "real = %f min\n", (float)(time(NULL) - starttime)/60.0 ); reporterr( "user = %f min\n", (float)(clock()-startclock)/CLOCKS_PER_SEC/60); #endif if( cpmxhist[njob-2] ) { // reporterr( "freeing cpmxhist[njob-2]\n" ); FreeDoubleMtx( cpmxhist[njob-2] ); cpmxhist[njob-2] = NULL; } free( cpmxhist ); cpmxhist = NULL; free( memhist ); memhist = NULL; #if SCOREOUT fprintf( stderr, "totalscore = %10.2f\n\n", tscore ); #endif if( rnakozo && rnaprediction == 'm' ) { if( grouprna1 ) free( grouprna1 ); // nakami ha? if( grouprna2 ) free( grouprna2 ); // nakami ha? grouprna1 = grouprna2 = NULL; } // if( constraint && compacttree != 3 ) if( constraint ) { if( localhomshrink ) // nen no tame { if( compacttree == 3 ) m = nseed; else m = njob; for( i=0; inext ) { if( tmpptr->opt == -1.0 ) continue; #if SHISHAGONYU // for debug char buff[100]; sprintf( buff, "%10.5f", tmpptr->opt ); tmpptr->opt = 0.0; sscanf( buff, "%lf", &(tmpptr->opt) ); #endif tmpptr->opt = ( tmpptr->opt ) / 5.8 * 600; } } if( !specifictarget ) ilim--; } prep = fopen( "hat3.seed", "r" ); if( prep ) { fprintf( stderr, "Loading 'hat3.seed' ... " ); if( specifictarget ) readlocalhomtable2_target( prep, njob, localhomtable, kozoarivec, targetmap ); // uwagakisarerukara koredehadame. else readlocalhomtable2_half( prep, njob, localhomtable, kozoarivec ); // uwagakisarerukara koredehadame. fclose( prep ); fprintf( stderr, "\ndone.\n" ); } else fprintf( stderr, "No hat3.seed. No problem.\n" ); if( outputhat23 ) { prep = fopen( "hat3", "w" ); if( !prep ) ErrorExit( "Cannot open hat3 to write." ); fprintf( stderr, "Writing hat3 for iterative refinement\n" ); if( specifictarget ) ilim = ntarget; else ilim = njob-1; for( i=0; inext ) { if( tmpptr->opt == -1.0 ) continue; if( targetmap[j] == -1 || targetmap[i] < targetmap[j] ) fprintf( prep, "%d %d %d %7.5f %d %d %d %d %c\n", targetmapr[i], j, tmpptr->overlapaa, tmpptr->opt/600*5.8, tmpptr->start1, tmpptr->end1, tmpptr->start2, tmpptr->end2, tmpptr->korh ); } } } fclose( prep ); prep = fopen( "hat2", "w" ); WriteFloatHat2_pointer_halfmtx( prep, njob, name, iscore ); fclose( prep ); } else if( distout ) // choufuku shiterukedo, muda deha nai. { prep = fopen( "hat2", "w" ); WriteFloatHat2_pointer_halfmtx( prep, njob, name, iscore ); fclose( prep ); } } else { /* compacttree==3 no toki hat3.seed ha mada yomenai */ prep = fopen( "hat3.seed", "r" ); if( prep ) { char r; r=fgetc(prep); if( isalnum( r ) || r == ' ' ) { reporterr( "Structural alignment is not yet supported in the --memsavepair mode. Try normal mode,\n" ); exit( 1 ); } fclose( prep ); } } } // else if( compacttree != 3 ) else { fprintf( stderr, "Loading 'hat3' ... " ); prep = fopen( "hat3", "r" ); if( prep == NULL ) ErrorExit( "Make hat3." ); if( specifictarget ) readlocalhomtable2_target( prep, njob, localhomtable, kozoarivec, targetmap ); else readlocalhomtable2_half( prep, njob, localhomtable, kozoarivec ); fclose( prep ); fprintf( stderr, "\ndone.\n" ); } nkozo = 0; for( i=0; i 0 ) { msacompactdistmtxthread_arg_t *targ; int jobpos; pthread_t *handle; pthread_mutex_t mutex; double **mindistthread; int **mindistfromthread; mindistthread = AllocateDoubleMtx( nthreadpair, njob ); mindistfromthread = AllocateIntMtx( nthreadpair, njob ); targ = calloc( nthreadpair, sizeof( msacompactdistmtxthread_arg_t ) ); handle = calloc( nthreadpair, sizeof( pthread_t ) ); pthread_mutex_init( &mutex, NULL ); jobpos = 0; for( i=0; i=7.2. Please email katoh@ifrec.osaka-u.ac.jp\n" ); // fflush( stderr ); // exit( 1 ); iscore = AllocateFloatHalfMtx( njob ); // tbutree == 0 no baai ha allocate sareteinainode for( i=1; i 0 ) { distancematrixthread_arg_t *targ; Jobtable jobpos; pthread_t *handle; pthread_mutex_t mutex; jobpos.i = 0; jobpos.j = 0; targ = calloc( nthreadpair, sizeof( distancematrixthread_arg_t ) ); handle = calloc( nthreadpair, sizeof( pthread_t ) ); pthread_mutex_init( &mutex, NULL ); for( i=0; i 10 ) iscore[i][j-i] = 10.0; // 2015/Mar/17 //exit( 1 ); #if 0 fprintf( stderr, "### ssj = %f\n", ssj ); fprintf( stderr, "### selfscore[i] = %f\n", selfscore[i] ); fprintf( stderr, "### selfscore[j] = %f\n", selfscore[j] ); fprintf( stderr, "### rawscore = %f\n", naivepairscore11( seq[i], seq[j], penalty_dist ) ); #endif } } } // fprintf( stderr, "\ndone.\n\n" ); FreeIntMtx( skiptable ); // fflush( stderr ); reporterr( "\rdone. \n" ); } else { if( callpairlocalalign ) { if( multidist ) { reporterr( "Bug in v7.290. Please email katoh@ifrec.osaka-u.ac.jp\n" ); exit( 1 ); } #if 0 prep = fopen( "hat2", "w" ); if( !prep ) ErrorExit( "Cannot open hat2." ); WriteFloatHat2_pointer_halfmtx( prep, njob, name, iscore ); // jissiha double fclose( prep ); #endif } else { if( multidist ) { fprintf( stderr, "Loading 'hat2n' (aligned sequences - new sequences) ... " ); prep = fopen( "hat2n", "r" ); if( prep == NULL ) ErrorExit( "Make hat2." ); readhat2_doublehalf_pointer( prep, njob, name, iscore ); fclose( prep ); fprintf( stderr, "done.\n" ); fprintf( stderr, "Loading 'hat2i' (aligned sequences) ... " ); prep = fopen( "hat2i", "r" ); if( prep == NULL ) ErrorExit( "Make hat2i." ); readhat2_doublehalf_pointer( prep, njob-nadd, name, iscore ); fclose( prep ); fprintf( stderr, "done.\n" ); } else { fprintf( stderr, "Loading 'hat2' ... " ); prep = fopen( "hat2", "r" ); if( prep == NULL ) ErrorExit( "Make hat2." ); readhat2_doublehalf_pointer( prep, njob, name, iscore ); fclose( prep ); fprintf( stderr, "done.\n" ); } if( distout ) // callpairlocalalign == 1 no toki ha ue de shorizumi. { reporterr( "\nwriting hat2 (2)\n" ); hat2p = fopen( "hat2", "w" ); WriteFloatHat2_pointer_halfmtx( hat2p, njob, name, iscore ); fclose( hat2p ); } } // for( i=0; imtx) ha, 6merdistance -> disttbfast.c; dp distance -> muzukashii { reporterr( "Constructing a tree ... nthread=%d", nthread ); compacttree_memsaveselectable( njob, partmtx, mindistfrom, mindist, NULL, selfscore, seq, skiptable, topol, len, name, NULL, dep, treeout, compacttree, 1 ); // compacttreegivendist( njob, mindist, mindistfrom, topol, len, name, dep, treeout ); if( mindistfrom ) free( mindistfrom ); mindistfrom = NULL; if( mindist ) free( mindist );; mindist = NULL; // if( selfscore ) free( selfscore ); selfscore = NULL; // matomete free if( skiptable) FreeIntMtx( skiptable ); skiptable = NULL; // nikaime dake free( partmtx ); } else if( treeout ) { fprintf( stderr, "Constructing a UPGMA tree ... " ); fixed_musclesupg_double_realloc_nobk_halfmtx_treeout_memsave( njob, iscore, topol, len, name, nlen, dep, 1, treeout ); // _memsave demo iihazu } else { fprintf( stderr, "Constructing a UPGMA tree ... " ); fixed_musclesupg_double_realloc_nobk_halfmtx_memsave( njob, iscore, topol, len, dep, 1, 1 ); // _memsave demo iihazu } // else // ErrorExit( "Incorrect tree\n" ); if( nkozo ) // atode kakukamo { // for( i=0; i= njob ) { fprintf( stderr, "No such sequence, %d.\n", subtable[i][j]+1 ); exit( 1 ); } if( alignmentlength != strlen( seq[subtable[i][j]] ) ) { fprintf( stderr, "\n" ); fprintf( stderr, "###############################################################################\n" ); fprintf( stderr, "# ERROR!\n" ); fprintf( stderr, "# Subalignment %d must be aligned.\n", i+1 ); fprintf( stderr, "# Please check the alignment lengths of following sequences.\n" ); fprintf( stderr, "#\n" ); fprintf( stderr, "# %d. %-10.10s -> %d letters (including gaps)\n", subtable[i][0]+1, name[subtable[i][0]]+1, alignmentlength ); fprintf( stderr, "# %d. %-10.10s -> %d letters (including gaps)\n", subtable[i][j]+1, name[subtable[i][j]]+1, (int)strlen( seq[subtable[i][j]] ) ); fprintf( stderr, "#\n" ); fprintf( stderr, "# See http://mafft.cbrc.jp/alignment/software/merge.html for details.\n" ); if( subalignmentoffset ) { fprintf( stderr, "#\n" ); fprintf( stderr, "# You specified seed alignment(s) consisting of %d sequences.\n", subalignmentoffset ); fprintf( stderr, "# In this case, the rule of numbering is:\n" ); fprintf( stderr, "# The aligned seed sequences are numbered as 1 .. %d\n", subalignmentoffset ); fprintf( stderr, "# The input sequences to be aligned are numbered as %d .. %d\n", subalignmentoffset+1, subalignmentoffset+njob ); } fprintf( stderr, "###############################################################################\n" ); fprintf( stderr, "\n" ); exit( 1 ); } insubtable[subtable[i][j]] = 1; } for( j=0; j OK\n" ); break; } } if( !foundthebranch ) { system( "cp infile.tree GuideTree" ); // tekitou fprintf( stderr, "\n" ); fprintf( stderr, "###############################################################################\n" ); fprintf( stderr, "# ERROR!\n" ); fprintf( stderr, "# Subalignment %d does not form a monophyletic cluster\n", i+1 ); fprintf( stderr, "# in the guide tree ('GuideTree' in this directory) internally computed.\n" ); fprintf( stderr, "# If you really want to use this subalignment, pelase give a tree with --treein \n" ); fprintf( stderr, "# http://mafft.cbrc.jp/alignment/software/treein.html\n" ); fprintf( stderr, "# http://mafft.cbrc.jp/alignment/software/merge.html\n" ); if( subalignmentoffset ) { fprintf( stderr, "#\n" ); fprintf( stderr, "# You specified seed alignment(s) consisting of %d sequences.\n", subalignmentoffset ); fprintf( stderr, "# In this case, the rule of numbering is:\n" ); fprintf( stderr, "# The aligned seed sequences are numbered as 1 .. %d\n", subalignmentoffset ); fprintf( stderr, "# The input sequences to be aligned are numbered as %d .. %d\n", subalignmentoffset+1, subalignmentoffset+njob ); } fprintf( stderr, "############################################################################### \n" ); fprintf( stderr, "\n" ); exit( 1 ); } // commongappick( seq[subtable[i]], subalignment[i] ); // irukamo } #if 0 for( i=0; i %c\n\n", i, mergeoralign[i] ); } #endif for( i=0; i 0 && nadd == 0 ) { treebasethread_arg_t *targ; int jobpos; pthread_t *handle; pthread_mutex_t mutex; pthread_cond_t treecond; int *fftlog; int nrun; int nthread_yoyu; nthread_yoyu = nthreadtb * 1; nrun = 0; jobpos = 0; targ = calloc( nthread_yoyu, sizeof( treebasethread_arg_t ) ); fftlog = AllocateIntVec( njob ); handle = calloc( nthread_yoyu, sizeof( pthread_t ) ); pthread_mutex_init( &mutex, NULL ); pthread_cond_init( &treecond, NULL ); for( i=0; inext ) { free( (void *)tmppt1 ); tmppt1 = tmppt2; } free( (void *)tmppt1 ); } free( (void *)(localhomtable[i]+j) ); } free( (void *)localhomtable ); } #endif fprintf( trap_g, "done.\n" ); // fclose( trap_g ); free( mergeoralign ); freeconstants(); if( rnakozo && rnaprediction == 'm' ) { if( singlerna ) // nen no tame { for( i=0; i 0 ) { reporterr( "\nTo keep the alignment length, %d letters were DELETED.\n", ndeleted ); if( mapout ) reporterr( "The deleted letters are shown in the (filename).map file.\n" ); else reporterr( "To know the positions of deleted letters, rerun the same command with the --mapout option.\n" ); } free( kozoarivec ); FreeCharMtx( seq ); FreeCharMtx( bseq ); free( mseq1 ); free( mseq2 ); FreeCharMtx( name ); free( nlen ); free( selfscore ); FreeIntCub( topol ); topol = NULL; // for( i=0; i