Change Eclipse configuration
[jabaws.git] / website / archive / binaries / mac / src / mafft / core / Falign_localhom.c
1 #include "mltaln.h"
2
3 //static FILE *fftfp;
4 static TLS int n20or4or2;
5
6 #define KEIKA 0
7 #define RND   0
8 #define DEBUG 0
9
10 extern int fft( int, Fukusosuu *, int );
11
12
13 #if 0
14 static void generateRndSeq( char *seq, int len )
15 {
16         while( len-- )
17 #if 1
18                 *seq++ = (int)( rnd() * n20or4or2 );
19 #else
20                 *seq++ = (int)1;
21 #endif
22 }
23 #endif
24
25 static void vec_init( Fukusosuu *result, int nlen )
26 {
27         while( nlen-- )
28         {
29                 result->R = result->I = 0.0;
30                 result++;
31         }
32 }
33
34 #if 0
35 static void vec_init2( Fukusosuu **result, char *seq, double eff, int st, int ed )
36 {
37         int i;
38         for( i=st; i<ed; i++ )
39                 result[(int)*seq++][i].R += eff;
40 }
41 #endif
42
43 static void seq_vec_2( Fukusosuu *result, double *score, double incr, char *seq )
44 {
45         static TLS int n;
46         for( ; *seq; result++ )
47         {
48                 n = amino_n[(int)*seq++];
49                 if( n < 20 && n >= 0 ) result->R += incr * score[n];
50 #if 0
51                 fprintf( stderr, "n=%d, score=%f, inc=%f R=%f\n",n,  score[n], incr * score[n], result->R );
52 #endif
53         }
54 }
55
56 static void seq_vec_3( Fukusosuu **result, double incr, char *seq )
57 {
58         int i;
59         int n;
60         for( i=0; *seq; i++ )
61         {
62                 n = amino_n[(int)*seq++];
63                 if( n < n20or4or2 && n >= 0 ) result[n][i].R += incr;
64         }
65 }
66
67         
68 #if 0
69 static void seq_vec( Fukusosuu *result, char query, double incr, char *seq )
70 {
71 #if 0
72         int bk = nlen;
73 #endif
74         while( *seq )
75         {
76                 if( *seq++ == query ) result->R += incr;
77                 result++;
78 #if 0
79 fprintf( stderr, "i = %d result->R = %f\n", bk-nlen, (result-1)->R );
80 #endif
81         }
82 }
83
84 static int checkRepeat( int num, int *cutpos )
85 {
86         int tmp, buf;
87
88         buf = *cutpos;
89         while( num-- )
90         {
91                 if( ( tmp = *cutpos++ ) < buf ) return( 1 );
92                 buf = tmp;
93         }
94         return( 0 );
95 }
96
97 static int segcmp( void *ptr1, void *ptr2 )
98 {
99         int diff;
100         Segment **seg1 = (Segment **)ptr1;
101         Segment **seg2 = (Segment **)ptr2;
102 #if 0
103         return( (*seg1)->center - (*seg2)->center );
104 #else
105         diff = (*seg1)->center - (*seg2)->center;
106         if( diff ) return( diff );
107
108         diff = (*seg1)->start - (*seg2)->start;
109         if( diff ) return( diff );
110
111         diff = (*seg1)->end - (*seg2)->end;
112         if( diff ) return( diff );
113
114         fprintf( stderr, "USE STABLE SORT !!\n" );
115         exit( 1 );
116         return( 0 );
117 #endif
118 }
119
120 #endif
121
122
123 static void mymergesort( int first, int last, Segment **seg )
124 {
125         int middle;
126         static TLS int i, j, k, p;
127         static TLS int allo = 0;
128         static TLS Segment **work = NULL;
129
130         if( seg == NULL )
131         {
132                 free( work ); work = NULL;
133                 return;
134         }
135
136         if( last > allo )
137         {
138                 allo = last;
139                 if( work ) free( work );
140                 work = (Segment **)calloc( allo / 2 + 1, sizeof( Segment *) );
141         }
142
143         if( first < last )
144         {
145                 middle = ( first + last ) / 2;
146                 mymergesort( first, middle, seg );
147                 mymergesort( middle+1, last, seg );
148                 p = 0;
149                 for( i=first; i<=middle; i++ ) work[p++] = seg[i];
150                 i = middle + 1; j = 0; k = first;
151                 while( i <= last && j < p )
152                 {
153                         if( work[j]->center <= seg[i]->center ) 
154                                 seg[k++] = work[j++];
155                         else
156                                 seg[k++] = seg[i++];
157                 }
158                 while( j < p ) seg[k++] = work[j++];
159         }
160 }
161
162
163 float Falign_localhom( char  **seq1, char  **seq2, 
164                           double *eff1, double *eff2, 
165                           int    clus1, int    clus2,
166                           int alloclen, 
167                            LocalHom ***localhom, float *totalimpmatch,
168                            int *gapmap1, int *gapmap2,
169                                 int *chudanpt, int chudanref, int *chudanres )
170 {
171    // tditeration.c deha alloclen ha huhen nanode
172    // prevalloclen ha iranai.
173         int i, j, k, l, m, maxk;
174         int nlen, nlen2, nlen4;
175         static TLS int crossscoresize = 0;
176         static TLS char **tmpseq1 = NULL;
177         static TLS char **tmpseq2 = NULL;
178         static TLS char **tmpptr1 = NULL;
179         static TLS char **tmpptr2 = NULL;
180         static TLS char **tmpres1 = NULL;
181         static TLS char **tmpres2 = NULL;
182         static TLS char **result1 = NULL;
183         static TLS char **result2 = NULL;
184 #if RND
185         static TLS char **rndseq1 = NULL;
186         static TLS char **rndseq2 = NULL;
187 #endif
188         static TLS Fukusosuu **seqVector1 = NULL;
189         static TLS Fukusosuu **seqVector2 = NULL;
190         static TLS Fukusosuu **naiseki = NULL;   
191         static TLS Fukusosuu *naisekiNoWa = NULL; 
192         static TLS double *soukan = NULL;
193         static TLS double **crossscore = NULL;
194         int nlentmp;
195         static TLS int *kouho = NULL;
196         static TLS Segment *segment = NULL;
197         static TLS Segment *segment1 = NULL;
198         static TLS Segment *segment2 = NULL;
199         static TLS Segment **sortedseg1 = NULL;
200         static TLS Segment **sortedseg2 = NULL;
201         static TLS int *cut1 = NULL;
202         static TLS int *cut2 = NULL;
203         static TLS char *sgap1, *egap1, *sgap2, *egap2;
204         static TLS int localalloclen = 0;
205         int lag;
206         int tmpint;
207         int count, count0;
208         int len1, len2;
209         int totallen;
210         float totalscore;
211         float impmatch;
212
213         extern Fukusosuu   *AllocateFukusosuuVec();
214         extern Fukusosuu  **AllocateFukusosuuMtx();
215
216         if( seq1 == NULL )
217         {
218                 if( result1 ) 
219                 {
220 //                      fprintf( stderr, "Freeing localarrays in Falign\n" );
221                         localalloclen = 0;
222                         mymergesort( 0, 0, NULL );
223                         alignableReagion( 0, 0, NULL, NULL, NULL, NULL, NULL );
224                         fft( 0, NULL, 1 );
225                         A__align( NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0 );
226                         G__align11( NULL, NULL, 0, 0, 0 );
227                         partA__align( NULL, NULL, NULL, NULL, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL );
228                         blockAlign2( NULL, NULL, NULL, NULL, NULL, NULL );
229                         if( crossscore ) FreeDoubleMtx( crossscore );
230                         FreeCharMtx( result1 );
231                         FreeCharMtx( result2 );
232                         FreeCharMtx( tmpres1 );
233                         FreeCharMtx( tmpres2 );
234                         FreeCharMtx( tmpseq1 );
235                         FreeCharMtx( tmpseq2 );
236                         free( sgap1 );
237                         free( egap1 );
238                         free( sgap2 );
239                         free( egap2 );
240                         free( kouho );
241                         free( cut1 );
242                         free( cut2 );
243                         free( tmpptr1 );
244                         free( tmpptr2 );
245                         free( segment );
246                         free( segment1 );
247                         free( segment2 );
248                         free( sortedseg1 );
249                         free( sortedseg2 );
250                         if( !kobetsubunkatsu )
251                         {
252                                 FreeFukusosuuMtx ( seqVector1 );
253                                 FreeFukusosuuMtx ( seqVector2 );
254                                 FreeFukusosuuVec( naisekiNoWa );
255                                 FreeFukusosuuMtx( naiseki );
256                                 FreeDoubleVec( soukan );
257                         }
258                 }
259                 else
260                 {
261 //                      fprintf( stderr, "Did not allocate localarrays in Falign\n" );
262                 }
263
264                 return( 0.0 );
265         }
266
267         len1 = strlen( seq1[0] );
268         len2 = strlen( seq2[0] );
269         nlentmp = MAX( len1, len2 );
270
271         nlen = 1;
272         while( nlentmp >= nlen ) nlen <<= 1;
273 #if 0
274         fprintf( stderr, "###   nlen    = %d\n", nlen );
275 #endif
276
277         nlen2 = nlen/2; nlen4 = nlen2 / 2;
278
279 #if DEBUG
280         fprintf( stderr, "len1 = %d, len2 = %d\n", len1, len2 );
281         fprintf( stderr, "nlentmp = %d, nlen = %d\n", nlentmp, nlen );
282 #endif
283
284         if( !localalloclen )
285         {
286                 sgap1 = AllocateCharVec( njob ); 
287                 egap1 = AllocateCharVec( njob ); 
288                 sgap2 = AllocateCharVec( njob ); 
289                 egap2 = AllocateCharVec( njob ); 
290                 kouho = AllocateIntVec( NKOUHO );
291                 cut1 = AllocateIntVec( MAXSEG );
292                 cut2 = AllocateIntVec( MAXSEG );
293                 tmpptr1 = AllocateCharMtx( njob, 0 );
294                 tmpptr2 = AllocateCharMtx( njob, 0 );
295                 result1 = AllocateCharMtx( njob, alloclen );
296                 result2 = AllocateCharMtx( njob, alloclen );
297                 tmpres1 = AllocateCharMtx( njob, alloclen );
298                 tmpres2 = AllocateCharMtx( njob, alloclen );
299 //              crossscore = AllocateDoubleMtx( MAXSEG, MAXSEG );
300                 segment = (Segment *)calloc( MAXSEG, sizeof( Segment ) );
301                 segment1 = (Segment *)calloc( MAXSEG, sizeof( Segment ) );
302                 segment2 = (Segment *)calloc( MAXSEG, sizeof( Segment ) );
303                 sortedseg1 = (Segment **)calloc( MAXSEG, sizeof( Segment * ) );
304                 sortedseg2 = (Segment **)calloc( MAXSEG, sizeof( Segment * ) );
305                 if( !( segment && segment1 && segment2 && sortedseg1 && sortedseg2 ) )
306                         ErrorExit( "Allocation error\n" );
307
308                 if     ( scoremtx == -1 ) n20or4or2 = 4;
309                 else if( fftscore == 1  ) n20or4or2 = 2;
310                 else                      n20or4or2 = 20;
311         }
312         if( localalloclen < nlen )
313         {
314                 if( localalloclen )
315                 {
316 #if 1
317                         if( !kobetsubunkatsu )
318                         {
319                                 FreeFukusosuuMtx ( seqVector1 );
320                                 FreeFukusosuuMtx ( seqVector2 );
321                                 FreeFukusosuuVec( naisekiNoWa );
322                                 FreeFukusosuuMtx( naiseki );
323                                 FreeDoubleVec( soukan );
324                         }
325                         FreeCharMtx( tmpseq1 );
326                         FreeCharMtx( tmpseq2 );
327 #endif
328 #if RND
329                         FreeCharMtx( rndseq1 );
330                         FreeCharMtx( rndseq2 );
331 #endif
332                 }
333
334                 tmpseq1 = AllocateCharMtx( njob, nlen );
335                 tmpseq2 = AllocateCharMtx( njob, nlen );
336                 if( !kobetsubunkatsu )
337                 {
338                         naisekiNoWa = AllocateFukusosuuVec( nlen );
339                         naiseki = AllocateFukusosuuMtx( n20or4or2, nlen );
340                         seqVector1 = AllocateFukusosuuMtx( n20or4or2+1, nlen+1 );
341                         seqVector2 = AllocateFukusosuuMtx( n20or4or2+1, nlen+1 );
342                         soukan = AllocateDoubleVec( nlen+1 );
343                 }
344 #if RND
345                 rndseq1 = AllocateCharMtx( njob, nlen );
346                 rndseq2 = AllocateCharMtx( njob, nlen );
347                 for( i=0; i<njob; i++ )
348                 {
349                         generateRndSeq( rndseq1[i], nlen );
350                         generateRndSeq( rndseq2[i], nlen );
351                 }
352 #endif
353                 localalloclen = nlen;
354         }
355         
356         for( j=0; j<clus1; j++ ) strcpy( tmpseq1[j], seq1[j] );
357         for( j=0; j<clus2; j++ ) strcpy( tmpseq2[j], seq2[j] );
358
359 #if 0
360 fftfp = fopen( "input_of_Falign", "w" );
361 fprintf( fftfp, "nlen = %d\n", nlen );
362 fprintf( fftfp, "seq1: ( %d sequences ) \n", clus1 );
363 for( i=0; i<clus1; i++ )
364         fprintf( fftfp, "%s\n", seq1[i] );
365 fprintf( fftfp, "seq2: ( %d sequences ) \n", clus2 );
366 for( i=0; i<clus2; i++ )
367         fprintf( fftfp, "%s\n", seq2[i] );
368 fclose( fftfp );
369 system( "less input_of_Falign < /dev/tty > /dev/tty" );
370 #endif
371         if( !kobetsubunkatsu )
372         {
373                 fprintf( stderr,  "FFT ... " );
374
375                 for( j=0; j<n20or4or2; j++ ) vec_init( seqVector1[j], nlen );
376                 if( fftscore && scoremtx != -1 )
377                 {
378                         for( i=0; i<clus1; i++ )
379                         {
380                                 seq_vec_2( seqVector1[0], polarity, eff1[i], tmpseq1[i] );
381                                 seq_vec_2( seqVector1[1], volume,   eff1[i], tmpseq1[i] );
382                         }
383                 }
384                 else
385                 {
386 #if 0
387                         for( i=0; i<clus1; i++ ) for( j=0; j<n20or4or2; j++ ) 
388                                 seq_vec( seqVector1[j], amino[j], eff1[i], tmpseq1[i] );
389 #else
390                         for( i=0; i<clus1; i++ )
391                                 seq_vec_3( seqVector1, eff1[i], tmpseq1[i] );
392 #endif
393                 }
394 #if RND
395                 for( i=0; i<clus1; i++ )
396                 {
397                         vec_init2( seqVector1, rndseq1[i], eff1[i], len1, nlen );
398                 }
399 #endif
400 #if 0
401 fftfp = fopen( "seqVec", "w" );
402 fprintf( fftfp, "before transform\n" );
403 for( k=0; k<n20or4or2; k++ ) 
404 {
405    fprintf( fftfp, "nlen=%d\n", nlen );
406    fprintf( fftfp, "%c\n", amino[k] );
407    for( l=0; l<nlen; l++ )
408    fprintf( fftfp, "%f %f\n", seqVector1[k][l].R, seqVector1[k][l].I );
409 }
410 fclose( fftfp );
411 system( "less seqVec < /dev/tty > /dev/tty" );
412 #endif
413
414                 for( j=0; j<n20or4or2; j++ ) vec_init( seqVector2[j], nlen );
415                 if( fftscore && scoremtx != -1 )
416                 {
417                         for( i=0; i<clus2; i++ )
418                         {
419                                 seq_vec_2( seqVector2[0], polarity, eff2[i], tmpseq2[i] );
420                                 seq_vec_2( seqVector2[1], volume,   eff2[i], tmpseq2[i] );
421                         }
422                 }
423                 else
424                 {
425 #if 0
426                         for( i=0; i<clus2; i++ ) for( j=0; j<n20or4or2; j++ ) 
427                                 seq_vec( seqVector2[j], amino[j], eff2[i], tmpseq2[i] );
428 #else
429                         for( i=0; i<clus2; i++ )
430                                 seq_vec_3( seqVector2, eff2[i], tmpseq2[i] );
431 #endif
432                 }
433 #if RND
434                 for( i=0; i<clus2; i++ )
435                 {
436                         vec_init2( seqVector2, rndseq2[i], eff2[i], len2, nlen );
437                 }
438 #endif
439
440 #if 0
441 fftfp = fopen( "seqVec2", "w" );
442 fprintf( fftfp, "before fft\n" );
443 for( k=0; k<n20or4or2; k++ ) 
444 {
445    fprintf( fftfp, "%c\n", amino[k] );
446    for( l=0; l<nlen; l++ )
447    fprintf( fftfp, "%f %f\n", seqVector2[k][l].R, seqVector2[k][l].I );
448 }
449 fclose( fftfp );
450 system( "less seqVec2 < /dev/tty > /dev/tty" );
451 #endif
452
453                 for( j=0; j<n20or4or2; j++ )
454                 {
455                         fft( nlen, seqVector2[j], (j==0) );
456                         fft( nlen, seqVector1[j], 0 );
457                 }
458 #if 0
459 fftfp = fopen( "seqVec2", "w" );
460 fprintf( fftfp, "#after fft\n" );
461 for( k=0; k<n20or4or2; k++ ) 
462 {
463    fprintf( fftfp, "#%c\n", amino[k] );
464    for( l=0; l<nlen; l++ )
465            fprintf( fftfp, "%f %f\n", seqVector2[k][l].R, seqVector2[k][l].I );
466 }
467 fclose( fftfp );
468 system( "less seqVec2 < /dev/tty > /dev/tty" );
469 #endif
470
471                 for( k=0; k<n20or4or2; k++ ) 
472                 {
473                         for( l=0; l<nlen; l++ ) 
474                                 calcNaiseki( naiseki[k]+l, seqVector1[k]+l, seqVector2[k]+l );
475                 }
476                 for( l=0; l<nlen; l++ ) 
477                 {
478                         naisekiNoWa[l].R = 0.0;
479                         naisekiNoWa[l].I = 0.0;
480                         for( k=0; k<n20or4or2; k++ ) 
481                         {
482                                 naisekiNoWa[l].R += naiseki[k][l].R;
483                                 naisekiNoWa[l].I += naiseki[k][l].I;
484                         }
485                 }
486         
487 #if 0
488         fftfp = fopen( "naisekiNoWa", "w" );
489         fprintf( fftfp, "#Before fft\n" );
490         for( l=0; l<nlen; l++ )
491                 fprintf( fftfp, "%d  %f %f\n", l, naisekiNoWa[l].R, naisekiNoWa[l].I ); 
492         fclose( fftfp );
493         system( "less naisekiNoWa < /dev/tty > /dev/tty " );
494 #endif
495
496                 fft( -nlen, naisekiNoWa, 0 );
497         
498                 for( m=0; m<=nlen2; m++ ) 
499                         soukan[m] = naisekiNoWa[nlen2-m].R;
500                 for( m=nlen2+1; m<nlen; m++ ) 
501                         soukan[m] = naisekiNoWa[nlen+nlen2-m].R;
502
503 #if 0
504         fftfp = fopen( "naisekiNoWa", "w" );
505         fprintf( fftfp, "#After fft\n" );
506         for( l=0; l<nlen; l++ )
507                 fprintf( fftfp, "%d  %f\n", l, naisekiNoWa[l].R ); 
508         fclose( fftfp );
509         fftfp = fopen( "list.plot", "w"  );
510         fprintf( fftfp, "plot 'naisekiNoWa'\npause -1" );
511         fclose( fftfp );
512         system( "/usr/bin/gnuplot list.plot &" );
513 #endif
514 #if 0
515         fprintf( stderr, "frt write start\n" );
516         fftfp = fopen( "frt", "w" );
517         for( l=0; l<nlen; l++ )
518                 fprintf( fftfp, "%d  %f\n", l-nlen2, soukan[l] ); 
519         fclose( fftfp );
520         system( "less frt < /dev/tty > /dev/tty" );
521 #if 0
522         fftfp = fopen( "list.plot", "w"  );
523         fprintf( fftfp, "plot 'frt'\n pause +1" );
524         fclose( fftfp );
525         system( "/usr/bin/gnuplot list.plot" );
526 #endif
527 #endif
528
529
530                 getKouho( kouho, NKOUHO, soukan, nlen );
531
532 #if 0
533                 for( i=0; i<NKOUHO; i++ )
534                 {
535                         fprintf( stderr, "kouho[%d] = %d\n", i, kouho[i] );
536                 }
537 #endif
538         }
539
540 #if KEIKA
541         fprintf( stderr, "Searching anchors ... " );
542 #endif
543         count = 0;
544
545
546
547 #define CAND 0
548 #if CAND
549         fftfp = fopen( "cand", "w" );
550         fclose( fftfp );
551 #endif
552         if( kobetsubunkatsu )
553         {
554                 maxk = 1;
555                 kouho[0] = 0;
556         }
557         else
558         {
559                 maxk = NKOUHO;
560         }
561
562         for( k=0; k<maxk; k++ ) 
563         {
564                 lag = kouho[k];
565                 zurasu2( lag, clus1, clus2, seq1, seq2, tmpptr1, tmpptr2 );
566 #if CAND
567                 fftfp = fopen( "cand", "a" );
568                 fprintf( fftfp, "Candidate No.%d lag = %d\n", k+1, lag );
569                 fprintf( fftfp, "%s\n", tmpptr1[0] );
570                 fprintf( fftfp, "%s\n", tmpptr2[0] );
571                 fclose( fftfp );
572 #endif
573                 tmpint = alignableReagion( clus1, clus2, tmpptr1, tmpptr2, eff1, eff2, segment+count );
574                 
575                 if( count+tmpint > MAXSEG -3 ) ErrorExit( "TOO MANY SEGMENTS.\n" );
576
577
578                 while( tmpint-- > 0 )
579                 {
580                         if( lag > 0 )
581                         {
582                                 segment1[count].start  = segment[count].start ;
583                                 segment1[count].end    = segment[count].end   ;
584                                 segment1[count].center = segment[count].center;
585                                 segment1[count].score  = segment[count].score;
586
587                                 segment2[count].start  = segment[count].start  + lag;
588                                 segment2[count].end    = segment[count].end    + lag;
589                                 segment2[count].center = segment[count].center + lag;
590                                 segment2[count].score  = segment[count].score       ;
591                         }
592                         else
593                         {
594                                 segment1[count].start  = segment[count].start  - lag;
595                                 segment1[count].end    = segment[count].end    - lag;
596                                 segment1[count].center = segment[count].center - lag;
597                                 segment1[count].score  = segment[count].score       ;
598
599                                 segment2[count].start  = segment[count].start ;
600                                 segment2[count].end    = segment[count].end   ;
601                                 segment2[count].center = segment[count].center;
602                                 segment2[count].score  = segment[count].score ;
603                         }
604 #if 0
605                         fftfp = fopen( "cand", "a" );
606                         fprintf( fftfp, "Goukaku=%dko\n", tmpint ); 
607                         fprintf( fftfp, "in 1 %d\n", segment1[count].center );
608                         fprintf( fftfp, "in 2 %d\n", segment2[count].center );
609                         fclose( fftfp );
610 #endif
611                         segment1[count].pair = &segment2[count];
612                         segment2[count].pair = &segment1[count];
613                         count++;
614 #if 0
615                         fprintf( stderr, "count=%d\n", count );
616 #endif
617                 }
618         }
619 #if 1
620         if( !kobetsubunkatsu )
621                 fprintf( stderr, "%d segments found\n", count );
622 #endif
623         if( !count && fftNoAnchStop )
624                 ErrorExit( "Cannot detect anchor!" );
625 #if 0
626         fftfp = fopen( "fft", "a" );
627         fprintf( fftfp, "RESULT before sort:\n" );
628         for( l=0; l<count; l++ )
629         {
630                 fprintf( fftfp, "cut[%d]=%d, ", l, segment1[l].center );
631                 fprintf( fftfp, "%d score = %f\n", segment2[l].center, segment1[l].score );
632         }
633         fclose( fftfp );
634 #endif
635
636 #if KEIKA
637         fprintf( stderr, "Aligning anchors ... " );
638 #endif
639         for( i=0; i<count; i++ )
640         {
641                 sortedseg1[i] = &segment1[i];
642                 sortedseg2[i] = &segment2[i];
643         }
644 #if 0
645         tmpsort( count, sortedseg1 ); 
646         tmpsort( count, sortedseg2 ); 
647         qsort( sortedseg1, count, sizeof( Segment * ), segcmp );
648         qsort( sortedseg2, count, sizeof( Segment * ), segcmp );
649 #else
650         mymergesort( 0, count-1, sortedseg1 ); 
651         mymergesort( 0, count-1, sortedseg2 ); 
652 #endif
653         for( i=0; i<count; i++ ) sortedseg1[i]->number = i;
654         for( i=0; i<count; i++ ) sortedseg2[i]->number = i;
655
656
657         if( kobetsubunkatsu )
658         {
659                 for( i=0; i<count; i++ )
660             {
661                         cut1[i+1] = sortedseg1[i]->center;
662                         cut2[i+1] = sortedseg2[i]->center;
663                 }
664                 cut1[0] = 0;
665                 cut2[0] = 0;
666                 cut1[count+1] = len1;
667                 cut2[count+1] = len2;
668                 count += 2;
669         }
670         else
671         {
672                 if( crossscoresize < count+2 )
673                 {
674                         crossscoresize = count+2;
675 #if 1
676                         fprintf( stderr, "######allocating crossscore, size = %d\n", crossscoresize );
677 #endif
678                         if( crossscore ) FreeDoubleMtx( crossscore );
679                         crossscore = AllocateDoubleMtx( crossscoresize, crossscoresize );
680                 }
681                 for( i=0; i<count+2; i++ ) for( j=0; j<count+2; j++ )
682                         crossscore[i][j] = 0.0;
683                 for( i=0; i<count; i++ )
684                 {
685                         crossscore[segment1[i].number+1][segment1[i].pair->number+1] = segment1[i].score;
686                         cut1[i+1] = sortedseg1[i]->center;
687                         cut2[i+1] = sortedseg2[i]->center;
688                 }
689
690 #if DEBUG
691                 fprintf( stderr, "AFTER SORT\n" );
692                 for( i=0; i<count; i++ ) fprintf( stderr, "%d, %d\n", segment1[i].start, segment2[i].start );
693 #endif
694
695                 crossscore[0][0] = 10000000.0;
696                 cut1[0] = 0; 
697                 cut2[0] = 0;
698                 crossscore[count+1][count+1] = 10000000.0;
699                 cut1[count+1] = len1;
700                 cut2[count+1] = len2;
701                 count += 2;
702                 count0 = count;
703         
704                 blockAlign2( cut1, cut2, sortedseg1, sortedseg2, crossscore, &count );
705                 if( count0 > count )
706                 {
707 #if 0
708                         fprintf( stderr, "\7 REPEAT!? \n" ); 
709 #else
710                         fprintf( stderr, "REPEAT!? \n" ); 
711 #endif
712                         if( fftRepeatStop ) exit( 1 );
713                 }
714 #if KEIKA
715                 else fprintf( stderr, "done\n" );
716 #endif
717         }
718
719 #if 0
720         fftfp = fopen( "fft", "a" );
721         fprintf( fftfp, "RESULT after sort:\n" );
722         for( l=0; l<count; l++ )
723         {
724                 fprintf( fftfp, "cut[%d]=%d, ", l, segment1[l].center );
725                 fprintf( fftfp, "%d\n", segment2[l].center );
726         }
727         fclose( fftfp );
728 #endif
729
730 #if 0
731         fftfp = fopen( "fft", "a" );
732         fprintf( fftfp, "RESULT after sort:\n" );
733         for( l=0; l<count; l++ )
734         {
735                 fprintf( fftfp, "cut : %d %d\n", cut1[l], cut2[l] );
736         }
737         fclose( fftfp );
738 #endif
739
740 #if KEIKA
741         fprintf( trap_g, "Devided to %d segments\n", count-1 );
742         fprintf( trap_g, "%d  %d forg\n", MIN( clus1, clus2 ), count-1 );
743 #endif
744
745         totallen = 0;
746         for( j=0; j<clus1; j++ ) result1[j][0] = 0;
747         for( j=0; j<clus2; j++ ) result2[j][0] = 0;
748         totalscore = 0.0;
749         *totalimpmatch = 0.0;
750         for( i=0; i<count-1; i++ )
751         {
752 #if DEBUG
753                 fprintf( stderr, "DP %03d / %03d %4d to ", i+1, count-1, totallen );
754 #else
755 #if KEIKA
756                 fprintf( stderr, "DP %03d / %03d\r", i+1, count-1 );
757 #endif
758 #endif
759
760                 if( cut1[i] ) 
761                 {
762                         getkyokaigap( sgap1, seq1, cut1[i]-1, clus1 );
763                         getkyokaigap( sgap2, seq2, cut2[i]-1, clus2 );
764                 }
765                 else
766                 {
767                         for( j=0; j<clus1; j++ ) sgap1[j] = 'o';
768                         for( j=0; j<clus2; j++ ) sgap2[j] = 'o';
769                 }
770                 if( cut1[i+1] != len1 )
771                 {
772                         getkyokaigap( egap1, seq1, cut1[i+1], clus1 );
773                         getkyokaigap( egap2, seq2, cut2[i+1], clus2 );
774                 }
775                 else
776                 {
777                         for( j=0; j<clus1; j++ ) egap1[j] = 'o';
778                         for( j=0; j<clus2; j++ ) egap2[j] = 'o';
779                 }
780
781                 for( j=0; j<clus1; j++ )
782                 {
783                         strncpy( tmpres1[j], seq1[j]+cut1[i], cut1[i+1]-cut1[i] );
784                         tmpres1[j][cut1[i+1]-cut1[i]] = 0;
785                 }
786                 if( kobetsubunkatsu ) commongappick_record( clus1, tmpres1, gapmap1 );
787                 for( j=0; j<clus2; j++ )
788                 {
789                         strncpy( tmpres2[j], seq2[j]+cut2[i], cut2[i+1]-cut2[i] );
790                         tmpres2[j][cut2[i+1]-cut2[i]] = 0;
791                 }
792                 if( kobetsubunkatsu ) commongappick_record( clus2, tmpres2, gapmap2 );
793
794 #if 0
795                 fprintf( stderr, "count = %d\n", count );
796                 fprintf( stderr, "### reg1 = %d-%d\n", cut1[i], cut1[i+1]-1 );
797                 fprintf( stderr, "### reg2 = %d-%d\n", cut2[i], cut2[i+1]-1 );
798 #endif
799
800                 switch( alg )
801                 {
802                         case( 'a' ):
803                                 totalscore += Aalign( tmpres1, tmpres2, eff1, eff2, clus1, clus2, alloclen );
804                                 break;
805                         case( 'Q' ):
806                                 totalscore += partQ__align( tmpres1, tmpres2, eff1, eff2, clus1, clus2, alloclen, localhom, &impmatch, cut1[i], cut1[i+1]-1, cut2[i], cut2[i+1]-1, gapmap1, gapmap2, sgap1, sgap2, egap1, egap2 );
807                                 *totalimpmatch += impmatch;
808 //                              fprintf( stderr, "*totalimpmatch in Falign_localhom = %f\n", *totalimpmatch );
809                                 break;
810                         case( 'A' ):
811                                 totalscore += partA__align( tmpres1, tmpres2, eff1, eff2, clus1, clus2, alloclen, localhom, &impmatch, cut1[i], cut1[i+1]-1, cut2[i], cut2[i+1]-1, gapmap1, gapmap2, sgap1, sgap2, egap1, egap2, chudanpt, chudanref, chudanres );
812                                 *totalimpmatch += impmatch;
813 //                              fprintf( stderr, "*totalimpmatch in Falign_localhom = %f\n", *totalimpmatch );
814
815
816                                 break;
817                         default:
818                                 fprintf( stderr, "alg = %c\n", alg );
819                                 ErrorExit( "ERROR IN SOURCE FILE Falign.c" );
820                                 break;
821                 }
822 #ifdef enablemultithread
823                 if( chudanres && *chudanres )
824                 {
825 //                      fprintf( stderr, "\n\n## CHUUDAN!!! at Falign_localhom\n" );
826                         return( -1.0 );
827                 }
828 #endif
829
830                 nlen = strlen( tmpres1[0] );
831                 if( totallen + nlen > alloclen )
832                 {
833                         fprintf( stderr, "totallen=%d +  nlen=%d > alloclen = %d\n", totallen, nlen, alloclen );
834                         ErrorExit( "LENGTH OVER in Falign\n " );
835                 }
836                 for( j=0; j<clus1; j++ ) strcat( result1[j], tmpres1[j] );
837                 for( j=0; j<clus2; j++ ) strcat( result2[j], tmpres2[j] );
838                 totallen += nlen;
839 #if 0
840                 fprintf( stderr, "%4d\r", totallen );
841                 fprintf( stderr, "\n\n" );
842                 for( j=0; j<clus1; j++ ) 
843                 {
844                         fprintf( stderr, "%s\n", tmpres1[j] );
845                 }
846                 fprintf( stderr, "-------\n" );
847                 for( j=0; j<clus2; j++ ) 
848                 {
849                         fprintf( stderr, "%s\n", tmpres2[j] );
850                 }
851 #endif
852         }
853 #if KEIKA
854         fprintf( stderr, "DP ... done   \n" );
855 #endif
856
857         for( j=0; j<clus1; j++ ) strcpy( seq1[j], result1[j] );
858         for( j=0; j<clus2; j++ ) strcpy( seq2[j], result2[j] );
859 #if 0
860         for( j=0; j<clus1; j++ ) 
861         {
862                 fprintf( stderr, "%s\n", result1[j] );
863         }
864         fprintf( stderr, "- - - - - - - - - - -\n" );
865         for( j=0; j<clus2; j++ ) 
866         {
867                 fprintf( stderr, "%s\n", result2[j] );
868         }
869 #endif
870         return( totalscore );
871 }