6 void mdfymtx( char pair[njob][njob], int s1, double **partialmtx, double **mtx )
8 void mdfymtx( char **pair, int s1, double **partialmtx, double **mtx )
15 static char name[M][B];
17 for( i=0; i<M; i++ ) name[i][0] = 0;
18 fprintf( stdout, "s1 = %d\n", s1 );
19 for( i=0; i<njob; i++ )
21 for( j=0; j<njob; j++ )
23 printf( "%#2d", pair[i][j] );
29 for( i=0, icount=0; i<njob-1; i++ )
31 if( !pair[s1][i] ) continue;
32 for( j=i+1, jcount=icount+1; j<njob; j++ )
34 if( !pair[s1][j] ) continue;
35 partialmtx[icount][jcount] = mtx[i][j];
41 fp = fopen( "hat2.org", "w" );
42 WriteHat2( fp, njob, name, mtx );
44 fp = fopen( "hat2.mdf", "w" );
45 WriteHat2( fp, icount, name, partialmtx );
52 float score_calc( char **seq, int s ) /* method 3 */
55 int len = strlen( seq[0] );
61 for( i=0; i<s-1; i++ )
63 for( j=i+1; j<s; j++ )
69 for( k=0; k<len; k++ )
71 if( mseq1[k] == '-' && mseq2[k] == '-' ) continue;
73 tmpscore += amino_dis[(int)mseq1[k]][(int)mseq2[k]];
77 while( mseq1[++k] == '-' )
80 if( k > len-2 ) break;
86 while( mseq2[++k] == '-' )
89 if( k > len-2 ) break;
94 if( mseq1[0] == '-' || mseq2[0] == '-' )
96 for( k=0; k<len; k++ )
98 if( mseq1[k] == '-' && mseq2[k] == '-' ) continue;
99 if( !( mseq1[k] != '-' && mseq2[k] != '-' ) )
108 if( mseq1[len-1] == '-' || mseq2[len-1] == '-' )
110 for( k=0; k<len; k++ )
112 if( mseq1[k] == '-' && mseq2[k] == '-' ) continue;
113 if( !( mseq1[k] != '-' && mseq2[k] != '-' ) )
123 score += (double)tmpscore / (double)c;
126 score = (float)score / ( ( (double)s * ((double)s-1.0) ) / 2.0 );
127 fprintf( stderr, "score in score_calc = %f\n", score );
131 void cpmx_calc( char **seq, float **cpmx, double *eff, int lgth, int clus )
134 double totaleff = 0.0;
136 for( i=0; i<clus; i++ ) totaleff += eff[i];
137 for( i=0; i<26; i++ ) for( j=0; j<lgth; j++ ) cpmx[i][j] = 0.0;
138 for( j=0; j<lgth; j++ ) for( k=0; k<clus; k++ )
139 cpmx[(int)amino_n[(int)seq[k][j]]][j] += (float)eff[k] / totaleff;
143 void cpmx_calc_new_bk( char **seq, float **cpmx, double *eff, int lgth, int clus ) // summ eff must be 1.0
148 for( i=0; i<26; i++ ) for( j=0; j<lgth; j++ ) cpmx[i][j] = 0.0;
149 for( k=0; k<clus; k++ )
151 feff = (float)eff[k];
152 for( j=0; j<lgth; j++ )
154 cpmx[(int)amino_n[(int)seq[k][j]]][j] += feff;
159 void cpmx_calc_new( char **seq, float **cpmx, double *eff, int lgth, int clus ) // summ eff must be 1.0
163 float *cpmxpt, **cpmxptpt;
170 cpmxpt = *cpmxptpt++;
175 for( k=0; k<clus; k++ )
177 feff = (float)eff[k];
179 // fprintf( stderr, "seqpt = %s, lgth=%d\n", seqpt, lgth );
180 for( j=0; j<lgth; j++ )
182 cpmx[(int)amino_n[(int)*seqpt++]][j] += feff;
186 void MScpmx_calc_new( char **seq, float **cpmx, double *eff, int lgth, int clus ) // summ eff must be 1.0
190 float **cpmxptpt, *cpmxpt;
197 cpmxpt = *cpmxptpt++;
202 for( k=0; k<clus; k++ )
204 feff = (float)eff[k];
209 (*cpmxptpt++)[(int)amino_n[(int)*seqpt++]] += feff;
212 for( j=0; j<lgth; j++ ) for( i=0; i<26; i++ ) cpmx[j][i] = 0.0;
213 for( k=0; k<clus; k++ )
215 feff = (float)eff[k];
216 for( j=0; j<lgth; j++ )
217 cpmx[j][(int)amino_n[(int)seq[k][j]]] += feff;
222 void cpmx_ribosum( char **seq, char **seqr, char *dir, float **cpmx, double *eff, int lgth, int clus ) // summ eff must be 1.0
226 float **cpmxptpt, *cpmxpt;
227 char *seqpt, *seqrpt, *dirpt;
228 int code, code1, code2;
234 cpmxpt = *cpmxptpt++;
239 for( k=0; k<clus; k++ )
241 feff = (float)eff[k];
250 code1 = amino_n[(int)*seqpt];
251 if( code1 > 3 ) code = 36;
255 code1 = amino_n[(int)*seqpt];
256 code2 = amino_n[(int)*seqrpt];
265 else if( *dirpt == '5' )
267 code = 4 + code2 * 4 + code1;
269 else if( *dirpt == '3' )
271 code = 20 + code2 * 4 + code1;
273 else // if( *dirpt == 'o' ) // nai
279 // fprintf( stderr, "%c -> code=%d toa=%d, tog=%d, toc=%d, tot=%d, ton=%d, efee=%f\n", *seqpt, code%4, ribosumdis[code][4+0], ribosumdis[code][4+1], ribosumdis[code][4+2], ribosumdis[code][20+3], ribosumdis[code][36], feff );
285 (*cpmxptpt++)[code] += feff;
290 void mseqcat( char **seq1, char **seq2, double **eff, double *effarr1, double *effarr2, char name1[M][B], char name2[M][B], int clus1, int clus2 )
293 for( i=0; i<clus2; i++ )
294 seq1[clus1+i] = seq2[i];
295 for( i=0; i<clus2; i++ ) strcpy( name1[clus1+i], name2[i] );
297 for( i=0; i<clus1; i++ ) for( j=0; j<clus1; j++ ) eff[i][j] = effarr1[i]* effarr1[j];
298 for( i=0; i<clus1; i++ ) for( j=clus1; j<clus1+clus2; j++ ) eff[i][j] = effarr1[i]* effarr2[j-clus1];
299 for( i=clus1; i<clus1+clus2; i++ ) for( j=0; j<clus1; j++ ) eff[i][j] = effarr2[i-clus1] * effarr1[j];
300 for( i=clus1; i<clus1+clus2; i++ ) for( j=clus1; j<clus1+clus2; j++ ) eff[i][j] = effarr2[i-clus1] * effarr2[j-clus1];
305 void strnbcat( char *s1, char *s2, int m ) /* s1 + s2 ---> s2 */
308 strncpy( b, s1, m ); b[m] = 0;
314 int conjuction( char pair[njob][njob], int s, char **seq, char **aseq, double *peff, double *eff, char name[M][B], char aname[M][B], char *d )
316 int conjuctionforgaln( int s0, int s1, char **seq, char **aseq, double *peff, double *eff, char **name, char **aname, char *d )
324 fprintf( stderr, "s0 = %d, s1 = %d\n", s0, s1 );
329 for( m=s0, k=0; m<s1; m++ )
332 sprintf( b, " %d", m+1 );
334 if( strlen( d ) < 100 ) strcat( d, b );
342 strcpy( aname[k], name[m] );
351 // fprintf( stderr, "peff[%d] = %f\n", m, peff[m] );
357 void makegrouprna( RNApair ***group, RNApair ***all, int *memlist )
360 for( k=0; (m=*memlist)!=-1; memlist++, k++ )
366 void makegrouprnait( RNApair ***group, RNApair ***all, char **pair, int s )
369 for( m=s, k=0; m<njob; m++ )
371 if( pair[s][m] != 0 )
378 int fastconjuction_noweight( int *memlist, char **seq, char **aseq, double *peff, char *d )
385 fprintf( stderr, "s = %d\n", s );
391 for( k=0; *memlist!=-1; memlist++, k++ )
394 dln += sprintf( b, " %d", m+1 );
396 if( dln < 100 ) strcat( d, b );
411 int fastconjuction_noname_kozo( int *memlist, char **seq, char **aseq, double *peff, double *eff, double *peff_kozo, double *eff_kozo, char *d )
419 fprintf( stderr, "s = %d\n", s );
426 for( k=0; *memlist!=-1; memlist++, k++ )
429 dln += sprintf( b, " %d", m+1 );
431 if( dln < 100 ) strcat( d, b );
437 peff_kozo[k] = eff_kozo[m];
439 total_kozo += peff_kozo[k];
444 // fprintf( stderr, "peff[%d] = %f\n", m, peff[m] );
451 // fprintf( stderr, "peff[%d] = %f\n", m, peff[m] );
452 peff_kozo[m] /= total_kozo;
453 if( peff_kozo[m] > 0.0 ) peff_kozo[m] += peff[m];
465 // fprintf( stderr, "\n\ntbfast_total_kozo = %f\n\n", total_kozo );
470 int fastconjuction_noname( int *memlist, char **seq, char **aseq, double *peff, double *eff, char *d )
477 fprintf( stderr, "s = %d\n", s );
483 for( k=0; *memlist!=-1; memlist++, k++ )
486 dln += sprintf( b, " %d", m+1 );
488 if( dln < 100 ) strcat( d, b );
499 // fprintf( stderr, "peff[%d] = %f\n", m, peff[m] );
506 int fastconjuction( int *memlist, char **seq, char **aseq, double *peff, double *eff, char name[M][B], char aname[M][B], char *d )
513 fprintf( stderr, "s = %d\n", s );
519 for( k=0; *memlist!=-1; memlist++, k++ )
522 dln += sprintf( b, " %d", m+1 );
524 if( dln < 100 ) strcat( d, b );
532 strcpy( aname[k], name[m] );
543 int conjuctionfortbfast_kozo( double *tmptmptmp, char **pair, int s, char **seq, char **aseq, double *peff, double *eff, double *peff_kozo, double *eff_kozo, char *d )
551 fprintf( stderr, "s = %d\n", s );
556 total_kozo = *tmptmptmp; // masaka
558 for( m=s, k=0; m<njob; m++ )
560 if( pair[s][m] != 0 )
562 sprintf( b, " %d", m+1 );
564 if( strlen( d ) < 100 ) strcat( d, b );
570 peff_kozo[k] = eff_kozo[m];
572 total_kozo += peff_kozo[k];
574 strcpy( aname[k], name[m] );
582 if( total_kozo > 0.0 )
586 peff_kozo[m] /= total_kozo;
587 if( peff_kozo[m] > 0.0 ) peff_kozo[m] += peff[m];
592 for( m=0; m<k; m++ ) peff_kozo[m] = 0.0;
595 // fprintf( stderr, "\n\ndvtditr_total_kozo = %f\n\n", total_kozo );
596 *tmptmptmp = total_kozo;
600 int conjuctionfortbfast( char **pair, int s, char **seq, char **aseq, double *peff, double *eff, char *d )
607 fprintf( stderr, "s = %d\n", s );
612 for( m=s, k=0; m<njob; m++ )
614 if( pair[s][m] != 0 )
616 sprintf( b, " %d", m+1 );
618 if( strlen( d ) < 100 ) strcat( d, b );
626 strcpy( aname[k], name[m] );
637 int conjuction( char **pair, int s, char **seq, char **aseq, double *peff, double *eff, char name[M][B], char aname[M][B], char *d )
644 fprintf( stderr, "s = %d\n", s );
649 for( m=s, k=0; m<njob; m++ )
651 if( pair[s][m] != 0 )
653 sprintf( b, " %d", m+1 );
655 if( strlen( d ) < 100 ) strcat( d, b );
663 strcpy( aname[k], name[m] );
675 void floatdelete( float **cpmx, int d, int len )
679 for( i=d; i<len-1; i++ )
681 for( j=0; j<26; j++ )
683 cpmx[j][i] = cpmx[j][i+1];
688 void chardelete( char *seq, int d )
692 strcpy( b, seq+d+1 );
696 int RootBranchNode( int nseq, int ***topol, int step, int branch )
698 int i, j, s1, s2, value;
701 for( i=step+1; i<nseq-2; i++ )
703 for( j=0; (s1=topol[i][0][j])>-1; j++ )
704 if( s1 == topol[step][branch][0] ) value++;
705 for( j=0; (s2=topol[i][1][j])>-1; j++ )
706 if( s2 == topol[step][branch][0] ) value++;
711 void BranchLeafNode( int nseq, int ***topol, int *node, int step, int branch )
715 for( i=0; i<nseq; i++ ) node[i] = 0;
716 for( i=0; i<step-1; i++ )
718 for( j=0; (s=topol[i][k][j])>-1; j++ )
720 for( k=0; k<branch+1; k++ )
721 for( j=0; (s=topol[step][k][j])>-1; j++ )
725 void RootLeafNode( int nseq, int ***topol, int *node )
728 for( i=0; i<nseq; i++ ) node[i] = 0;
729 for( i=0; i<nseq-2; i++ )
731 for( j=0; (s=topol[i][k][j])>-1; j++ )
735 void nodeFromABranch( int nseq, int *result, int **pairwisenode, int ***topol, double **len, int step, int num )
741 int outergroup2[nseq];
744 static int *outergroup2 = NULL;
745 static int *table = NULL;
746 if( outergroup2 == NULL )
748 outergroup2 = AllocateIntVec( nseq );
749 table = AllocateIntVec( nseq );
752 innergroup = topol[step][num];
753 outergroup1 = topol[step][!num];
754 for( i=0; i<nseq; i++ ) table[i] = 1;
755 for( i=0; (s=innergroup[i])>-1; i++ ) table[s] = 0;
756 for( i=0; (s=outergroup1[i])>-1; i++ ) table[s] = 0;
757 for( i=0, count=0; i<nseq; i++ )
761 outergroup2[count] = i;
765 outergroup2[count] = -1;
767 for( i=0; (s=innergroup[i])>-1; i++ )
769 result[s] = pairwisenode[s][outergroup1[0]]
770 + pairwisenode[s][outergroup2[0]]
771 - pairwisenode[outergroup1[0]][outergroup2[0]] - 1;
774 for( i=0; (s=outergroup1[i])>-1; i++ )
776 result[s] = pairwisenode[s][outergroup2[0]]
777 + pairwisenode[s][innergroup[0]]
778 - pairwisenode[innergroup[0]][outergroup2[0]] + 1;
781 for( i=0; (s=outergroup2[i])>-1; i++ )
783 result[s] = pairwisenode[s][outergroup1[0]]
784 + pairwisenode[s][innergroup[0]]
785 - pairwisenode[innergroup[0]][outergroup1[0]] + 1;
790 for( i=0; i<nseq; i++ )
791 fprintf( stderr, "result[%d] = %d\n", i+1, result[i] );
810 void OneClusterAndTheOther( int locnjob, char pair[njob][njob], int *s1, int *s2, int ***topol, int step, int branch )
812 void OneClusterAndTheOther( int locnjob, char **pair, int *s1, int *s2, int ***topol, int step, int branch )
818 *s1 = topol[step][branch][0];
819 for( i=0; (r1=topol[step][branch][i])>-1; i++ )
821 for( i=0; i<locnjob; i++ )
829 for( i=*s2; i<locnjob; i++ )
836 void makeEffMtx( int nseq, double **mtx, double *vec )
839 for( i=0; i<nseq; i++ ) for( j=0; j<nseq; j++ )
840 mtx[i][j] = vec[i] * vec[j];
843 void node_eff( int nseq, double *eff, int *node )
846 extern double ipower( double, int );
847 for( i=0; i<nseq; i++ )
848 eff[i] = ipower( 0.5, node[i] ) + geta2;
850 eff[i] = ipower( 0.5, node[i] ) + 0;
853 for( i=0; i<nseq; i++ )
858 int shrinklocalhom( char **pair, int s1, int s2, LocalHom **localhom, LocalHom ***localhomshrink )
862 for( m1=s1, k1=0; m1<njob; m1++ )
864 if( pair[s1][m1] != 0 )
866 for( m2=s2, k2=0; m2<njob; m2++ )
868 if( pair[s2][m2] != 0 )
870 if( localhom[m1][m2].opt == -1 )
871 localhomshrink[k1][k2] = NULL;
873 localhomshrink[k1][k2] = localhom[m1]+m2;
882 int msshrinklocalhom( char **pair, int s1, int s2, LocalHom **localhom, LocalHom ***localhomshrink )
884 int m1, k1, n1, m2, k2, n2;
886 for( m1=s1, k1=0; m1<njob; m1++ )
888 if( pair[s1][m1] != 0 )
890 for( m2=s2, k2=0; m2<njob; m2++ )
892 if( pair[s2][m2] != 0 )
894 n1 = MIN(m1,m2); n2=MAX(m1,m2);
895 if( localhom[m1][m2].opt == -1 )
896 localhomshrink[k1][k2] = NULL;
898 localhomshrink[k1][k2] = localhom[n1]+n2;
908 int fastshrinklocalhom( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink )
911 int *intpt1, *intpt2;
914 for( intpt1=mem1, k1=0; *intpt1!=-1; intpt1++, k1++ )
916 for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ )
918 if( localhom[*intpt1][*intpt2].opt == -1 )
919 localhomshrink[k1][k2] = NULL;
921 localhomshrink[k1][k2] = localhom[*intpt1]+*intpt2;
927 int msfastshrinklocalhom( int *mem1, int *mem2, LocalHom **localhom, LocalHom ***localhomshrink )
930 int *intpt1, *intpt2;
933 for( intpt1=mem1, k1=0; *intpt1!=-1; intpt1++, k1++ )
935 for( intpt2=mem2, k2=0; *intpt2!=-1; intpt2++, k2++ )
937 m1 = MIN(*intpt1,*intpt2); m2 = MAX(*intpt1,*intpt2);
938 if( localhom[m1][m2].opt == -1 )
939 localhomshrink[k1][k2] = NULL;
941 localhomshrink[k1][k2] = localhom[m1]+m2;