Mercurial > repos > nick > duplex
diff mafft/core/dvtditr.c @ 18:e4d75f9efb90 draft
planemo upload commit b'4303231da9e48b2719b4429a29b72421d24310f4\n'-dirty
author | nick |
---|---|
date | Thu, 02 Feb 2017 18:44:31 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mafft/core/dvtditr.c Thu Feb 02 18:44:31 2017 -0500 @@ -0,0 +1,1076 @@ + /* Tree-dependent-iteration */ + /* Devide to segments */ + +#include "mltaln.h" + +extern char **seq_g; +extern char **res_g; +static int subalignment; +static int subalignmentoffset; + +static int intop; +static int intree; +static double autosubalignment; + + +static void calcmaxdistclass( void ) +{ + int c; + float rep; + for( c=0; c<ndistclass; c++ ) + { + rep = (double) 2 * c / ndistclass; // dist:0-2 for dist2offset +// fprintf( stderr, "c=%d, rep=%f, offset=%f\n", c, rep, dist2offset( rep ) ); + if( dist2offset( rep ) == 0.0 ) + break; + } + fprintf( stderr, "ndistclass = %d, maxdistclass = %d\n", ndistclass, c+1 ); + maxdistclass = c + 1; +// maxdistclass = ndistclass; // CHUUI!!!! + return; +} + +void arguments( int argc, char *argv[] ) +{ + int c; + char *argkey; + + outnumber = 0; + nthread = 1; + randomseed = 0; + scoreout = 0; + spscoreout = 0; + parallelizationstrategy = BAATARI1; + intop = 0; + intree = 0; + inputfile = NULL; + rnakozo = 0; + rnaprediction = 'm'; + nevermemsave = 0; + score_check = 1; + fftkeika = 1; + constraint = 0; + fmodel = 0; + kobetsubunkatsu = 1; + bunkatsu = 1; + nblosum = 62; + niter = 100; + calledByXced = 0; + devide = 1; + divWinSize = 20; /* 70 */ + divThreshold = 65; + fftscore = 1; + fftRepeatStop = 0; + fftNoAnchStop = 0; + scmtd = 5; + cooling = 1; + weight = 4; + utree = 1; + refine = 1; + check = 1; + cut = 0.0; + disp = 0; + outgap = 1; + use_fft = 0; // CHUUI dochira demo mafft.tmpl deha F + force_fft = 0; + alg = 'A'; /* chuui */ + mix = 0; + checkC = 0; + tbitr = 0; + treemethod = 'X'; + sueff_global = 0.1; + scoremtx = 1; + dorp = 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; + subalignment = 0; + subalignmentoffset = 0; + legacygapcost = 0; + specificityconsideration = 0.0; + autosubalignment = 0.0; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'I': + niter = myatoi( *++argv ); + fprintf( stderr, "niter = %d\n", niter ); + --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 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); +// fprintf( stderr, "ppenalty = %d\n", ppenalty ); + --argc; + goto nextoption; + case 'Q': + penalty_shift_factor = atof( *++argv ); + if( penalty_shift_factor < 100.0 && penalty_shift_factor != 2.0 ) + { + fprintf( stderr, "%f, penalty_shift is fixed to penalty x 2 in the iterative refinement phase.\n", penalty_shift_factor ); + penalty_shift_factor = 2.0; + } + --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': + nthread = myatoi( *++argv ); + fprintf( stderr, "nthread = %d\n", nthread ); + --argc; + goto nextoption; + case 'H': + subalignment = 1; + subalignmentoffset = myatoi( *++argv ); + --argc; + goto nextoption; + case 't': + randomseed = myatoi( *++argv ); + fprintf( stderr, "randomseed = %d\n", randomseed ); + --argc; + goto nextoption; + case 'p': + argkey = *++argv; + if( !strcmp( argkey, "BESTFIRST" ) ) parallelizationstrategy = BESTFIRST; + else if( !strcmp( argkey, "BAATARI0" ) ) parallelizationstrategy = BAATARI0; + else if( !strcmp( argkey, "BAATARI1" ) ) parallelizationstrategy = BAATARI1; + else if( !strcmp( argkey, "BAATARI2" ) ) parallelizationstrategy = BAATARI2; + else + { + fprintf( stderr, "Unknown parallelization strategy, %s\n", argkey ); + exit( 1 ); + } +// exit( 1 ); + --argc; + goto nextoption; + case 's': + specificityconsideration = (double)myatof( *++argv ); +// fprintf( stderr, "specificityconsideration = %f\n", specificityconsideration ); + --argc; + goto nextoption; +#if 0 + case 'S' : + scoreout = 1; // for checking parallel calculation + break; +#else + case 'S' : + spscoreout = 1; // 2014/Dec/30, sp score + break; +#endif +#if 0 + case 's' : + RNAscoremtx = 'r'; + break; +#endif +#if 1 + case 'a': + fmodel = 1; + break; +#endif + case 'N': + nevermemsave = 1; + break; + case 'D': + dorp = 'd'; + break; + case 'P': + dorp = 'p'; + break; +#if 0 + case 'Q': + alg = 'Q'; + break; +#endif + case 'R': + rnaprediction = 'r'; + break; + case 'O': + fftNoAnchStop = 1; + break; +#if 0 + case 'e': + fftscore = 0; + break; + case 'r': + fmodel = -1; + break; + case 'R': + fftRepeatStop = 1; + break; +#endif + case 'T': + kobetsubunkatsu = 0; + break; + case 'B': + bunkatsu = 0; + break; +#if 0 + case 'c': + cooling = 1; + break; + case 'a': + alg = 'a'; + break; + case 's' : + treemethod = 's'; + break; + case 'H': + alg = 'H'; + break; +#endif + case 'A': + alg = 'A'; + break; + case 'M': + alg = 'M'; + break; + case 'F': + use_fft = 1; + break; +#if 0 + case 't': + weight = 4; + break; +#endif + case 'u': + weight = 0; + break; + case 'U': + intree = 1; + break; + case 'V': + intop = 1; + break; + case 'J': + utree = 0; + break; + case 'd': + disp = 1; + break; + case 'Z': + score_check = 0; + break; + case 'Y': + score_check = 2; + break; + case 'L': + legacygapcost = 1; + break; +#if 0 + case 'n' : + treemethod = 'n'; + break; +#endif + case 'n' : + outnumber = 1; + break; + case 'X': + treemethod = 'X'; + sueff_global = atof( *++argv ); + fprintf( stderr, "sueff_global = %f\n", sueff_global ); + --argc; + goto nextoption; +#if 0 + case 'E' : + treemethod = 'E'; + break; + case 'q' : + treemethod = 'q'; + break; +#endif + case 'E': + autosubalignment = atof( *++argv ); + fprintf( stderr, "autosubalignment = %f\n", autosubalignment ); + --argc; + goto nextoption; + case 'z': + fftThreshold = myatoi( *++argv ); + --argc; + goto nextoption; + case 'w': + fftWinSize = myatoi( *++argv ); + --argc; + goto nextoption; + default: + fprintf( stderr, "illegal option %c\n", c ); + argc = 0; + break; + } + } + nextoption: + ; + } + if( argc == 1 ) + { + cut = atof( (*argv) ); + argc--; + } + if( argc != 0 ) + { + fprintf( stderr, "options : Check source file!\n" ); + exit( 1 ); + } +#if 0 + if( alg == 'A' && weight == 0 ) + ErrorExit( "ERROR : Algorithm A+ and un-weighted\n" ); +#endif +} + + +int main( int argc, char *argv[] ) +{ + int identity; + static int nlen[M]; + static char **name, **seq, **aseq, **bseq; + static Segment *segment = NULL; + static int anchors[MAXSEG]; + int i, j; + int iseg, nseg; + int ***topol; + double **len; + double **eff; + FILE *prep; + FILE *infp; + FILE *orderfp; + int alloclen; + int returnvalue; + char c; + int ocut; + char **seq_g_bk; + LocalHom **localhomtable = NULL; // by D.Mathog + RNApair ***singlerna; + int nogaplen; + static char **nogap1seq; + static char *kozoarivec; + int nkozo; + int alignmentlength; + int **skipthisbranch; + int foundthebranch; + int nsubalignments, maxmem; + int **subtable; + int *insubtable; + int *preservegaps; + char ***subalnpt; + + arguments( argc, argv ); +#ifndef enablemultithread + nthread = 0; +#endif + if( fastathreshold < 0.0001 ) constraint = 0; + + if( inputfile ) + { + infp = fopen( inputfile, "r" ); + if( !infp ) + { + fprintf( stderr, "Cannot open %s\n", inputfile ); + exit( 1 ); + } + } + else + infp = stdin; + +#if 0 + PreRead( stdin, &njob, &nlenmax ); +#else + getnumlen( infp ); +#endif + rewind( infp ); + + nkozo = 0; + + if( njob < 2 ) + { + fprintf( stderr, "At least 2 sequences should be input!\n" + "Only %d sequence found.\n", njob ); + exit( 1 ); + } + + + if( subalignment ) + { + readsubalignmentstable( njob, NULL, NULL, &nsubalignments, &maxmem ); + fprintf( stderr, "nsubalignments = %d\n", nsubalignments ); + fprintf( stderr, "maxmem = %d\n", maxmem ); + subtable = AllocateIntMtx( nsubalignments, maxmem+1 ); + insubtable = AllocateIntVec( njob ); + preservegaps = AllocateIntVec( njob ); + for( i=0; i<njob; i++ ) insubtable[i] = 0; + for( i=0; i<njob; i++ ) preservegaps[i] = 0; + subalnpt = AllocateCharCub( nsubalignments, maxmem, 0 ); + readsubalignmentstable( njob, subtable, preservegaps, NULL, NULL ); + for( i=0; i<nsubalignments; i++ ) for( j=0; j<insubtable[i]; j++ ) + { + if( subtable[i][j] < 0 ) + { + fprintf( stderr, "Not supported in the iterative refinmenment mode.\n" ); + fprintf( stderr, "Please use a positive number to represent a sequence.\n" ); + } + } + } + + ocut = cut; + + segment = (Segment *)calloc( MAXSEG, sizeof( Segment ) ); +// if( treemethod == 'X' || treemethod == 'E' || treemethod == 'q' ) + topol = AllocateIntCub( njob, 2, njob ); + len = AllocateDoubleMtx( njob, 2 ); + eff = AllocateDoubleMtx( njob, njob ); + seq = AllocateCharMtx( njob, nlenmax*9+1 ); + name = AllocateCharMtx( njob, B+1 ); + seq_g = AllocateCharMtx( njob, nlenmax*9+1 ); + res_g = AllocateCharMtx( njob, nlenmax*9+1 ); + aseq = AllocateCharMtx( njob, nlenmax*9+1 ); + bseq = AllocateCharMtx( njob, nlenmax*9+1 ); + nogap1seq = AllocateCharMtx( 1, nlenmax*1+1 ); + alloclen = nlenmax * 9; + seq_g_bk = AllocateCharMtx( njob, 0 ); + for( i=0; i<njob; i++ ) seq_g_bk[i] = seq_g[i]; + kozoarivec = AllocateCharVec( njob ); + skipthisbranch = AllocateIntMtx( njob, 2 ); + for( i=0; i<njob; i++ ) skipthisbranch[i][0] = skipthisbranch[i][1] = 0; + + if( constraint ) + { + localhomtable = (LocalHom **)calloc( njob, sizeof( LocalHom *) ); + for( i=0; i<njob; i++) + { + localhomtable[i] = (LocalHom *)calloc( njob, sizeof( LocalHom ) ); + for( j=0; j<njob; j++) + { + localhomtable[i][j].start1 = -1; + localhomtable[i][j].end1 = -1; + localhomtable[i][j].start2 = -1; + localhomtable[i][j].end2 = -1; + localhomtable[i][j].overlapaa = -1.0; + localhomtable[i][j].opt = -1.0; + localhomtable[i][j].importance = -1.0; + localhomtable[i][j].next = NULL; + localhomtable[i][j].nokori = 0; + localhomtable[i][j].extended = -1; + localhomtable[i][j].last = localhomtable[i]+j; + localhomtable[i][j].korh = 'h'; + } + } + fprintf( stderr, "Loading 'hat3' ... " ); + fflush( stderr ); + prep = fopen( "hat3", "r" ); + if( prep == NULL ) ErrorExit( "Make hat3." ); + readlocalhomtable2( prep, njob, localhomtable, kozoarivec ); + fclose( prep ); +// for( i=0; i<njob-1; i++ ) for( j=i+1; j<njob; j++ ) +// fprintf( stdout, "%d %d %d %d %d %d %d\n", i, j, localhomtable[i][j].opt, localhomtable[i][j].start1, localhomtable[i][j].end1, localhomtable[i][j].start2, localhomtable[i][j].end2 ); + fprintf( stderr, "done.\n" ); + fflush( stderr ); +#if 0 + fprintf( stderr, "Extending localhom ... " ); + extendlocalhom( njob, localhomtable ); + fprintf( stderr, "done.\n" ); +#endif + nkozo = 0; + for( i=0; i<njob; i++ ) if( kozoarivec[i] ) nkozo++; + } + + +// if( nlenmax > 30000 ) + if( nlenmax > 50000 ) // version >= 6.823 + { +#if 0 + if( constraint ) + { + fprintf( stderr, "\nnlenmax=%d, nagasugi!\n", nlenmax ); + exit( 1 ); + } + if( nevermemsave ) + { + fprintf( stderr, "\nnevermemsave=1, nlenmax=%d, nagasugi!\n", nlenmax ); + exit( 1 ); + } +#endif + if( !constraint && !nevermemsave && alg != 'M' ) + { + fprintf( stderr, "\nnlenmax=%d, Switching to the memsave mode\n", nlenmax ); + alg = 'M'; + } + } + +#if 0 + Read( name, nlen, seq_g ); +#else + readData_pointer( infp, name, nlen, seq_g ); +#endif + fclose( infp ); + + if( specificityconsideration ) calcmaxdistclass(); + + for( i=0; i<njob; i++ ) + { + res_g[i][0] = 0; + } + + identity = 1; + for( i=0; i<njob; i++ ) + { + identity *= ( nlen[i] == nlen[0] ); + } + if( !identity ) + { + fprintf( stderr, "Input pre-aligned data\n" ); + exit( 1 ); + } + constants( njob, seq_g ); + +#if 0 + fprintf( stderr, "penalty = %d\n", penalty ); + fprintf( stderr, "penalty_ex = %d\n", penalty_ex ); + fprintf( stderr, "offset = %d\n", offset ); +#endif + + initSignalSM(); + + initFiles(); + +#if 0 + if( njob == 2 ) + { + writePre( njob, name, nlen, seq_g, 1 ); + SHOWVERSION; + return( 0 ); + } +#else + if( njob == 2 ) + { + weight = 0; + niter = 1; + } +#endif + + c = seqcheck( seq_g ); + if( c ) + { + fprintf( stderr, "Illegal character %c\n", c ); + exit( 1 ); + } + commongappick( njob, seq_g ); + + if( rnakozo && rnaprediction == 'm' ) + { + singlerna = (RNApair ***)calloc( njob, sizeof( RNApair ** ) ); + prep = fopen( "hat4", "r" ); + if( prep == NULL ) ErrorExit( "Make hat4 using mccaskill." ); + fprintf( stderr, "Loading 'hat4' ... " ); + fflush( stderr ); + for( i=0; i<njob; i++ ) + { + gappick0( nogap1seq[0], seq_g[i] ); + nogaplen = strlen( nogap1seq[0] ); + singlerna[i] = (RNApair **)calloc( nogaplen+1, sizeof( RNApair * ) ); + for( j=0; j<nogaplen; j++ ) + { + singlerna[i][j] = (RNApair *)calloc( 1, sizeof( RNApair ) ); + singlerna[i][j][0].bestpos = -1; + singlerna[i][j][0].bestscore = -1.0; + } + singlerna[i][nogaplen] = NULL; + readmccaskill( prep, singlerna[i], nogaplen ); + } + fclose( prep ); + fprintf( stderr, "\ndone.\n" ); + fflush( stderr ); + } + else + singlerna = NULL; + + + + if( utree ) + { + prep = fopen( "hat2", "r" ); + if( !prep ) ErrorExit( "Make hat2." ); + readhat2_pointer( prep, njob, name, eff ); + fclose( prep ); +#if 0 + fprintf( stderr, "eff = \n" ); + for( i=0; i<njob-1; i++ ) + { + for( j=i+1; j<njob; j++ ) + { + fprintf( stderr, "%d-%d, %f\n", i, j, eff[i][j] ); + } + fprintf( stderr, "\n" ); + } +#endif + if( intree ) + { + veryfastsupg_double_loadtree( njob, eff, topol, len, name ); +#if 0 + fprintf( stderr, "eff = \n" ); + for( i=0; i<njob-1; i++ ) + { + for( j=i+1; j<njob; j++ ) + { + fprintf( stderr, "%d-%d, %f\n", i, j, eff[i][j] ); + } + fprintf( stderr, "\n" ); + } +exit( 1 ); +#endif + } + else if( intop ) // v6.528 deha if( intop ) dattanode intree ga mukou datta. + { + fprintf( stderr, "--topin has been disabled\n" ); + exit( 1 ); +// veryfastsupg_double_loadtop( njob, eff, topol, len ); + } + else if( subalignment ) + fixed_supg_double_treeout_constrained( njob, eff, topol, len, name, nsubalignments, subtable ); + else if( treemethod == 'X' || treemethod == 'E' || treemethod == 'q' ) +// veryfastsupg_double_outtree( njob, eff, topol, len, name ); + fixed_musclesupg_double_treeout( njob, eff, topol, len, name ); + else if( treemethod == 'n' ) + nj( njob, eff, topol, len ); + else if( treemethod == 's' ) + spg( njob, eff, topol, len ); + else if( treemethod == 'p' ) + upg2( njob, eff, topol, len ); + else ErrorExit( "Incorrect treemethod.\n" ); + } +#if DEBUG + printf( "utree = %d\n", utree ); +#endif + + if( autosubalignment > 0.0 && subalignment == 0 ) + { +// reporterr( "Computing skipthisbranch..\n" ); + insubtable = AllocateIntVec( njob ); + preservegaps = AllocateIntVec( njob ); + subtable = calloc( 1, sizeof( char * ) ); + subtable[0] = NULL; // for FreeIntMtx + for( i=0; i<njob; i++ ) insubtable[i] = 0; + for( i=0; i<njob; i++ ) preservegaps[i] = 0; // tsukawanaikamo + if( generatesubalignmentstable( njob, &subtable, &nsubalignments, &maxmem, topol, len, autosubalignment ) ) // subtable ha allocate sareru. + { + reporterr( "################################################################################################ \n" ); + reporterr( "#\n" ); + reporterr( "# WARNING: Iterative refinment was not done because you gave a large --fix value (%6.3f).\n", autosubalignment ); + reporterr( "#\n" ); + reporterr( "################################################################################################ \n" ); + writePre( njob, name, nlen, seq_g, 1 ); + + FreeCharMtx( seq_g_bk ); + FreeIntCub( topol ); + FreeDoubleMtx( len ); + FreeDoubleMtx( eff ); + FreeIntMtx( skipthisbranch ); + FreeIntMtx( subtable ); + free( preservegaps ); + free( insubtable ); + SHOWVERSION; + return( 0 ); + } +// subtable = AllocateIntMtx( nsubalignments, maxmem+1 ); + fprintf( stderr, "nsubalignments = %d, maxmem = %d\n", nsubalignments, maxmem ); + subalnpt = AllocateCharCub( nsubalignments, maxmem, 0 ); +#if 0 + for( i=0; i<nsubalignments; i++ ) + { + reporterr( "subalignment %d\n", i ); + for( j=0; subtable[i][j]!=-1; j++ ) + { + reporterr( "%5d", subtable[i][j] ); + } + reporterr( "\n" ); + } +#endif +#if 0 // wakaran + for( i=0; i<nsubalignments; i++ ) for( j=0; j<insubtable[i]; j++ ) + { + if( subtable[i][j] < 0 ) + { + fprintf( stderr, "Not supported in the iterative refinmenment mode.\n" ); + fprintf( stderr, "Please use a positive number to represent a sequence.\n" ); + } + } +#endif +// reporterr( "done.\n" ); + } + + + orderfp = fopen( "order", "w" ); + if( !orderfp ) + { + fprintf( stderr, "Cannot open 'order'\n" ); + exit( 1 ); + } + for( i=0; (j=topol[njob-2][0][i])!=-1; i++ ) + { + fprintf( orderfp, "%d\n", j ); + } + for( i=0; (j=topol[njob-2][1][i])!=-1; i++ ) + { + fprintf( orderfp, "%d\n", j ); + } + fclose( orderfp ); + + + + fprintf( stderr, "\n" ); + if( ( !utree && kobetsubunkatsu ) || constraint || !bunkatsu ) + { + nseg = 0; + anchors[0] =0; + anchors[1] =strlen( seq_g[0] ); + nseg += 2; + } + else + { + nseg = searchAnchors( njob, seq_g, segment ); +#if 0 + fprintf( stderr, "### nseg = %d\n", nseg ); + fprintf( stderr, "### seq_g[0] = %s\n", seq_g[0] ); + fprintf( stderr, "### nlenmax = %d\n", nlenmax ); + fprintf( stderr, "### len = %d\n", strlen( seq_g[0] ) ); + +#endif + + anchors[0] = 0; + for( i=0; i<nseg; i++ ) anchors[i+1] = segment[i].center; + anchors[nseg+1] = strlen( seq_g[0] ); + nseg +=2; + +#if 0 + for( i=0; i<nseg; i++ ) + fprintf( stderr, "anchor[%d] = %d\n", i, anchors[i] ); +#endif + } + + +//--------------- kokokara ---- + if( subalignment || autosubalignment ) + { + for( i=0; i<nsubalignments; i++ ) + { + fprintf( stderr, "\nChecking subalignment %d:\n", i+1 ); + alignmentlength = strlen( seq[subtable[i][0]] ); + for( j=0; subtable[i][j]!=-1; j++ ) + fprintf( stderr, " %d ", subtable[i][j]+1 ); +// fprintf( stderr, " ##### %d-%d. %-30.30s\n", i, subtable[i][j]+1, name[subtable[i][j]]+1 ); + fprintf( stderr, "\n" ); + for( j=0; subtable[i][j]!=-1; j++ ) + { + if( subtable[i][j] >= 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<njob-1; j++ ) + { +#if 0 + int k; + reporterr( "#### STEP%d\n", j ); + for( k=0; topol[j][0][k]!=-1; k++ ) reporterr( "%3d ", topol[j][0][k] ); + reporterr( "len=%f\n", len[j][0] ); + for( k=0; topol[j][1][k]!=-1; k++ ) reporterr( "%3d ", topol[j][1][k] ); + reporterr( "len=%f\n", len[j][1] ); + reporterr( "\n" ); +#endif + if( includemember( topol[j][0], subtable[i] ) && !samemember( topol[j][0], subtable[i] ) ) + { + skipthisbranch[j][0] = 1; +// reporterr( "SKIP 0 !!!!!!\n" ); + } + if( includemember( topol[j][1], subtable[i] ) && !samemember( topol[j][1], subtable[i] ) ) + { + skipthisbranch[j][1] = 1; +// reporterr( "SKIP 1 !!!!!!\n" ); + } + } + foundthebranch = 0; + for( j=0; j<njob-1; j++ ) + { + if( samemember( topol[j][0], subtable[i] ) || samemember( topol[j][1], subtable[i] ) ) + { + foundthebranch = 1; + fprintf( stderr, " -> 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 seem to 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<njob-1; i++ ) + { + fprintf( stderr, "STEP %d\n", i+1 ); + fprintf( stderr, "group1 = " ); + for( j=0; topol[i][0][j] != -1; j++ ) + fprintf( stderr, "%d ", topol[i][0][j]+1 ); + fprintf( stderr, "\n" ); + fprintf( stderr, "SKIP -> %d\n\n", skipthisbranch[i][0] ); + fprintf( stderr, "group2 = " ); + for( j=0; topol[i][1][j] != -1; j++ ) + fprintf( stderr, "%d ", topol[i][1][j]+1 ); + fprintf( stderr, "\n" ); + fprintf( stderr, "SKIP -> %d\n\n", skipthisbranch[i][1] ); + } +#endif + + for( i=0; i<njob; i++ ) + { + if( insubtable[i] ) strcpy( bseq[i], seq[i] ); + else gappick0( bseq[i], seq[i] ); + } + + for( i=0; i<nsubalignments; i++ ) + { + for( j=0; subtable[i][j]!=-1; j++ ) subalnpt[i][j] = bseq[subtable[i][j]]; + commongappick( j, subalnpt[i] ); + } + + FreeIntMtx( subtable ); + free( insubtable ); + for( i=0; i<nsubalignments; i++ ) free( subalnpt[i] ); + free( subalnpt ); + free( preservegaps ); + } +//--------------- kokomade ---- + + + + + for( i=0; i<njob; i++ ) res_g[i][0] = 0; + + for( iseg=0; iseg<nseg-1; iseg++ ) + { + int tmplen = anchors[iseg+1]-anchors[iseg]; + int pos = strlen( res_g[0] ); + for( j=0; j<njob; j++ ) + { + strncpy( seq[j], seq_g[j], tmplen ); + seq[j][tmplen]= 0; + seq_g[j] += tmplen; + + } + fprintf( stderr, "Segment %3d/%3d %4d-%4d\n", iseg+1, nseg-1, pos+1, pos+1+tmplen ); + fflush( stderr ); + fprintf( trap_g, "Segment %3d/%3d %4d-%4d\n", iseg+1, nseg-1, pos+1, pos+1+tmplen ); + + cut = ocut; + returnvalue = TreeDependentIteration( njob, name, nlen, seq, bseq, topol, len, eff, skipthisbranch, alloclen, localhomtable, singlerna, nkozo, kozoarivec ); + + for( i=0; i<njob; i++ ) + strcat( res_g[i], bseq[i] ); + } + FreeCharMtx( seq_g_bk ); + FreeIntCub( topol ); + FreeDoubleMtx( len ); + FreeDoubleMtx( eff ); + FreeIntMtx( skipthisbranch ); + free( kozoarivec ); + if( constraint ) FreeLocalHomTable( localhomtable, njob ); + if( rnakozo && rnaprediction == 'm' ) + { + if( singlerna ) // nen no tame + { + for( i=0; i<njob; i++ ) + { + for( j=0; singlerna[i][j]!=NULL; j++ ) + { + if( singlerna[i][j] ) free( singlerna[i][j] ); + } + if( singlerna[i] ) free( singlerna[i] ); + } + free( singlerna ); + singlerna = NULL; + } + } + +#if 0 + Write( stdout, njob, name, nlen, bseq ); +#endif + + fprintf( stderr, "done\n" ); + fprintf( trap_g, "done\n" ); + fclose( trap_g ); + + + devide = 0; + writePre( njob, name, nlen, res_g, 1 ); +#if 0 + writeData( stdout, njob, name, nlen, res_g, 1 ); +#endif + + + if( spscoreout ) reporterr( "Unweighted sum-of-pairs score = %10.5f\n", sumofpairsscore( njob, res_g ) ); + + SHOWVERSION; + return( 0 ); +} + +#if 0 +signed int main( int argc, char *argv[] ) +{ + int i, nlen[M]; + char b[B]; + char a[] = "="; + int value; + + gets( b ); njob = atoi( b ); + +/* + scoremtx = 0; + if( strstr( b, "ayhoff" ) ) scoremtx = 1; + else if( strstr( b, "dna" ) || strstr( b, "DNA" ) ) scoremtx = -1; + else if( strstr( b, "M-Y" ) || strstr( b, "iyata" ) ) scoremtx = 2; + else scoremtx = 0; +*/ + if( strstr( b, "constraint" ) ) cnst = 1; + + nlenmax = 0; + i = 0; + while( i<njob ) + { + gets( b ); + if( !strncmp( b, a, 1 ) ) + { + gets( b ); nlen[i] = atoi( b ); + if( nlen[i] > nlenmax ) nlenmax = nlen[i]; + i++; + } + } + if( nlenmax > N || njob > M ) + { + fprintf( stderr, "ERROR in main\n" ); + exit( 1 ); + } + /* + nlenmax = Na; + */ + rewind( stdin ); + value = main1( nlen, argc, argv ); + exit( 0 ); +} +#endif