new mafft v 6.857 with extensions
[jabaws.git] / binaries / src / mafft / core / dndpre.c
diff --git a/binaries/src/mafft/core/dndpre.c b/binaries/src/mafft/core/dndpre.c
new file mode 100644 (file)
index 0000000..c0be891
--- /dev/null
@@ -0,0 +1,277 @@
+#include "mltaln.h"
+
+#define TEST 0
+
+static int treeout = 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;
+       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;
+       Jobtable *jobpospt = targ->jobpospt;
+
+       int i, j;
+       float ssi, ssj, bunbo;
+       
+       while( 1 )
+       {
+               pthread_mutex_lock( targ->mutex );
+               j = jobpospt->j;
+               i = jobpospt->i;
+               j++;
+               if( j == njob )
+               {
+                       fprintf( stderr, "%4d/%4d (thread %4d), dndpre\r", i+1, njob, thread_no );
+                       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 );
+
+               ssi = selfscore[i];
+               ssj = selfscore[j];
+
+               bunbo = MIN( ssi, ssj );
+               if( bunbo == 0.0 )
+                       mtx[i][j] = 1.0;
+               else
+                       mtx[i][j] = 1.0 - (double)naivepairscore11( seq[i], seq[j], penalty ) / bunbo;
+       }
+}
+
+#endif
+
+void arguments( int argc, char *argv[] )
+{
+    int c;
+
+       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 'i':
+                                       inputfile = *++argv;
+                                       fprintf( stderr, "inputfile = %s\n", inputfile );
+                                       --argc;
+                                       goto nextoption;
+                               case 'C':
+                                       nthread = atoi( *++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;
+       char **seq;
+       static char **name;
+       static int nlen[M];
+       float *selfscore;
+       double **mtx;
+       FILE *fp;
+       FILE *infp;
+       float ssi, ssj, bunbo;
+
+
+       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 );
+
+       seq = AllocateCharMtx( njob, nlenmax+1 );
+       name = AllocateCharMtx( njob, B+1 );
+       mtx = AllocateDoubleMtx( njob, njob );
+       selfscore = AllocateFloatVec( njob );
+
+#if 0
+       FRead( stdin, name, nlen, seq );
+#else
+       readData_pointer( infp, name, nlen, seq );
+#endif
+       fclose( infp );
+
+       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 );
+
+       }
+#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].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
+       {
+               for( i=0; i<njob-1; 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 )
+                                       mtx[i][j] = 1.0;
+                               else
+                                       mtx[i][j] = 1.0 - (double)naivepairscore11( seq[i], seq[j], penalty ) / bunbo;
+//                                     mtx[i][j] = 1.0 - (double)naivepairscore11( seq[i], seq[j], penalty ) / MIN( selfscore[i], selfscore[j] );
+//                             fprintf( stderr, "i=%d,j=%d, l=%d### %f, score = %d\n", i, j, nlen[0], mtx[i][j], naivepairscore11( seq[i], seq[j], penalty )  );
+                       }
+               }
+       }
+#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
+       SHOWVERSION;
+       exit( 0 );
+/*
+       res = system( ALNDIR "/spgsdl < hat2"  );
+       if( res ) exit( 1 );
+       else exit( 0 );
+*/
+}