Mercurial > repos > nick > duplex
diff mafft/core/dndpre.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/dndpre.c Thu Feb 02 18:44:31 2017 -0500 @@ -0,0 +1,399 @@ +#include "mltaln.h" + +#define TEST 0 + +static int treeout = 0; +static int maxdist = 1; +static int nadd = 0; + +#ifdef enablemultithread +typedef struct _jobtable +{ + int i; + int j; +} Jobtable; + +typedef struct _thread_arg +{ + int njob; + int thread_no; + float *selfscore; + double **mtx; + char **seq; + int **skiptable; + Jobtable *jobpospt; + pthread_mutex_t *mutex; +} thread_arg_t; + +void *athread( void *arg ) +{ + thread_arg_t *targ = (thread_arg_t *)arg; + int njob = targ->njob; + int thread_no = targ->thread_no; + float *selfscore = targ->selfscore; + double **mtx = targ->mtx; + char **seq = targ->seq; + int **skiptable = targ->skiptable; + Jobtable *jobpospt = targ->jobpospt; + + int i, j; + float ssi, ssj, bunbo; + double mtxv; + + if( njob == 1 ) return( NULL ); + + while( 1 ) + { + pthread_mutex_lock( targ->mutex ); + j = jobpospt->j; + i = jobpospt->i; + j++; +// fprintf( stderr, "\n i=%d, j=%d before check\n", i, j ); + if( j == njob ) + { +// fprintf( stderr, "\n j = %d, i = %d, njob = %d\n", j, i, njob ); + fprintf( stderr, "%4d/%4d (thread %4d), dndpre\r", i+1, njob, thread_no ); + i++; + j = i + 1; + if( i == njob-1 ) + { +// fprintf( stderr, "\n i=%d, njob-1=%d\n", i, njob-1 ); + pthread_mutex_unlock( targ->mutex ); + return( NULL ); + } + } +// fprintf( stderr, "\n i=%d, j=%d after check\n", i, j ); + jobpospt->j = j; + jobpospt->i = i; + pthread_mutex_unlock( targ->mutex ); + + ssi = selfscore[i]; + ssj = selfscore[j]; + + bunbo = MIN( ssi, ssj ); + if( bunbo == 0.0 ) + mtxv = maxdist; + else +// mtxv = maxdist * ( 1.0 - (double)naivepairscore11( seq[i], seq[j], penalty ) / bunbo ); + mtxv = maxdist * ( 1.0 - (double)naivepairscorefast( seq[i], seq[j], skiptable[i], skiptable[j], penalty ) / bunbo ); +#if 1 + if( mtxv > 9.0 || mtxv < 0.0 ) + { + fprintf( stderr, "Distance %d-%d is strange, %f.\n", i, j, mtxv ); + exit( 1 ); + } +#else // CHUUI!!! 2012/05/16 + if( mtxv > 2.0 ) + { + mtxv = 2.0; + } + if( mtxv < 0.0 ) + { + fprintf( stderr, "Distance %d-%d is strange, %f.\n", i, j, mtxv ); + exit( 1 ); + } +#endif + mtx[i][j] = mtxv; + } +} + +#endif + +void arguments( int argc, char *argv[] ) +{ + int c; + + nadd = 0; + nthread = 1; + alg = 'X'; + fmodel = 0; + treeout = 0; + scoremtx = 1; + nblosum = 62; + dorp = NOTSPECIFIED; + inputfile = NULL; + ppenalty = NOTSPECIFIED; //? + ppenalty_ex = NOTSPECIFIED; //? + poffset = NOTSPECIFIED; //? + kimuraR = NOTSPECIFIED; + pamN = NOTSPECIFIED; + + while( --argc > 0 && (*++argv)[0] == '-' ) + { + while ( (c = *++argv[0]) ) + { + switch( c ) + { + case 't': + treeout = '1'; + break; + case 'D': + dorp = 'd'; + break; + case 'a': + fmodel = 1; + break; + case 'P': + dorp = 'p'; + break; + case 'K': // Hontou ha iranai. disttbfast.c, tbfast.c to awaserutame. + break; + case 'I': + nadd = myatoi( *++argv ); + fprintf( stderr, "nadd = %d\n", nadd ); + --argc; + goto nextoption; + case 'f': + ppenalty = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'g': + ppenalty_ex = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'h': + poffset = (int)( atof( *++argv ) * 1000 - 0.5 ); + --argc; + goto nextoption; + case 'k': + kimuraR = myatoi( *++argv ); +// fprintf( stderr, "kimuraR = %d\n", kimuraR ); + --argc; + goto nextoption; + case 'b': + nblosum = myatoi( *++argv ); + scoremtx = 1; +// fprintf( stderr, "blosum %d\n", nblosum ); + --argc; + goto nextoption; + case 'j': + pamN = myatoi( *++argv ); + scoremtx = 0; + TMorJTT = JTT; + fprintf( stderr, "jtt %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 'i': + inputfile = *++argv; + fprintf( stderr, "inputfile = %s\n", inputfile ); + --argc; + goto nextoption; + case 'M': + maxdist = myatoi( *++argv ); + fprintf( stderr, "maxdist = %d\n", maxdist ); + --argc; + goto nextoption; + case 'C': + nthread = myatoi( *++argv ); + fprintf( stderr, "nthread = %d\n", nthread ); + --argc; + goto nextoption; + } + } + nextoption: + ; + } + if( argc != 0 ) + { + fprintf( stderr, "options: Check source file !\n" ); + exit( 1 ); + } +} + +int main( int argc, char **argv ) +{ + int i, j, ilim; + char **seq; + static char **name; + int *nlen; + float *selfscore; + double **mtx; + double mtxv; + FILE *fp; + FILE *infp; + float ssi, ssj, bunbo; + int **skiptable = NULL; + + + arguments( argc, argv ); +#ifndef enablemultithread + nthread = 0; +#endif + + 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 ); + + njob -= nadd; // atarashii hairetsu ha mushi + + seq = AllocateCharMtx( njob, nlenmax+1 ); + name = AllocateCharMtx( njob, B+1 ); + mtx = AllocateDoubleMtx( njob, njob ); + selfscore = AllocateFloatVec( njob ); + nlen = AllocateIntVec( njob ); + + +#if 0 + FRead( stdin, name, nlen, seq ); +#else + readData_pointer( infp, name, nlen, seq ); +#endif + fclose( infp ); + + + for( i=1; i<njob; i++ ) + { + if( nlen[i] != nlen[0] ) + { + reporterr( "Not aligned!\n" ); + exit( 1 ); + } + } + + constants( njob, seq ); + +#if 0 + for( i=0; i<njob-1; i++ ) + { + fprintf( stderr, "%4d/%4d\r", i+1, njob ); + for( j=i+1; j<njob; j++ ) + mtx[i][j] = (double)substitution_hosei( seq[i], seq[j] ); +// fprintf( stderr, "i=%d,j=%d, l=%d &&& %f\n", i, j, nlen[0], mtx[i][j] ); + } +#else // 061003 + for( i=0; i<njob; i++ ) + { + selfscore[i] = (float)naivepairscore11( seq[i], seq[i], penalty ); + } + + skiptable = AllocateIntMtx( njob, 0 ); + makeskiptable( njob, skiptable, seq ); // allocate suru. + +#ifdef enablemultithread + if( nthread > 0 ) + { + thread_arg_t *targ; + Jobtable jobpos; + pthread_t *handle; + pthread_mutex_t mutex; + + jobpos.i = 0; + jobpos.j = 0; + + targ = calloc( nthread, sizeof( thread_arg_t ) ); + handle = calloc( nthread, sizeof( pthread_t ) ); + pthread_mutex_init( &mutex, NULL ); + + for( i=0; i<nthread; i++ ) + { + targ[i].thread_no = i; + targ[i].njob = njob; + targ[i].selfscore = selfscore; + targ[i].mtx = mtx; + targ[i].seq = seq; + targ[i].skiptable = skiptable; + targ[i].jobpospt = &jobpos; + targ[i].mutex = &mutex; + + pthread_create( handle+i, NULL, athread, (void *)(targ+i) ); + } + + for( i=0; i<nthread; i++ ) + { + pthread_join( handle[i], NULL ); + } + pthread_mutex_destroy( &mutex ); + } + else +#endif + { + ilim = njob-1; + for( i=0; i<ilim; i++ ) + { + ssi = selfscore[i]; + fprintf( stderr, "%4d/%4d\r", i+1, njob ); + for( j=i+1; j<njob; j++ ) + { + ssj = selfscore[j]; + bunbo = MIN( ssi, ssj ); + if( bunbo == 0.0 ) + mtxv = maxdist; + else + mtxv = maxdist * ( 1.0 - (double)naivepairscorefast( seq[i], seq[j], skiptable[i], skiptable[j], penalty ) / bunbo ); +// mtxv = maxdist * ( 1.0 - (double)naivepairscore11( seq[i], seq[j], penalty ) / bunbo ); +// mtxv = 1.0 - (double)naivepairscore11( seq[i], seq[j], penalty ) / MIN( selfscore[i], selfscore[j] ); +// fprintf( stderr, "i=%d,j=%d, l=%d### %f, score = %f, %f, %f\n", i, j, nlen[0], mtxv, naivepairscore11( seq[i], seq[j], penalty ), ssi, ssj ); + +#if 1 + if( mtxv > 9.0 || mtxv < 0.0 ) + { + fprintf( stderr, "Distance %d-%d is strange, %f.\n", i, j, mtxv ); + exit( 1 ); + } +#else // CHUUI!!! 2012/05/16 + if( mtxv > 2.0 ) + { + mtxv = 2.0; + } + if( mtxv < 0.0 ) + { + fprintf( stderr, "Distance %d-%d is strange, %f.\n", i, j, mtxv ); + exit( 1 ); + } +#endif + mtx[i][j] = mtxv; + } + } + } +#endif + +#if TEST + for( i=0; i<njob-1; i++ ) for( j=i+1; j<njob; j++ ) + fprintf( stdout, "i=%d, j=%d, mtx[][] = %f\n", i, j, mtx[i][j] ); +#endif + + fp = fopen( "hat2", "w" ); + WriteHat2_pointer( fp, njob, name, mtx ); + fclose( fp ); +#if 0 + if( treeout ) + { + int ***topol; + double **len; + + topol = AllocateIntCub( njob, 2, njob ); + len = AllocateDoubleMtx( njob, njob ); + veryfastsupg_double_outtree( njob, mtx, topol, len ); + } +#endif + if( skiptable ) FreeIntMtx( skiptable ); skiptable = NULL; + SHOWVERSION; + exit( 0 ); +/* + res = system( ALNDIR "/spgsdl < hat2" ); + if( res ) exit( 1 ); + else exit( 0 ); +*/ +}