source: trunk/GDE/MAFFT/mafft-7.055-with-extensions/core/rna.c

Last change on this file was 19480, checked in by westram, 15 months ago
File size: 15.9 KB
Line 
1#include "mltaln.h"
2#include "dp.h"
3
4#define MEMSAVE 1
5
6#define DEBUG 1
7#define USE_PENALTY_EX  1
8#define STOREWM 1
9
10
11
12static float singleribosumscore( int n1, int n2, char **s1, char **s2, double *eff1, double *eff2, int p1, int p2 )
13{
14        float val;
15        int i, j;
16        int code1, code2;
17
18        val = 0.0;
19        for( i=0; i<n1; i++ ) for( j=0; j<n2; j++ )
20        {
21                code1 = amino_n[(int)s1[i][p1]];
22                if( code1 > 3 ) code1 = 36;
23                code2 = amino_n[(int)s2[j][p2]];
24                if( code2 > 3 ) code2 = 36;
25
26//              fprintf( stderr, "'l'%c-%c: %f\n", s1[i][p1], s2[j][p2], (float)ribosumdis[code1][code2] );
27
28                val += (float)ribosumdis[code1][code2] * eff1[i] * eff2[j];
29        }
30        return( val );
31}
32static float pairedribosumscore53( int n1, int n2, char **s1, char **s2, double *eff1, double *eff2, int p1, int p2, int c1, int c2 )
33{
34        float val;
35        int i, j;
36        int code1o, code1u, code2o, code2u, code1, code2;
37
38        val = 0.0;
39        for( i=0; i<n1; i++ ) for( j=0; j<n2; j++ )
40        {
41                code1o = amino_n[(int)s1[i][p1]];
42                code1u = amino_n[(int)s1[i][c1]];
43                if( code1o > 3 ) code1 = code1o = 36;
44                else if( code1u > 3 ) code1 = 36;
45                else code1 = 4 + code1o * 4 + code1u;
46
47                code2o = amino_n[(int)s2[j][p2]];
48                code2u = amino_n[(int)s2[j][c2]];
49                if( code2o > 3 ) code2 = code1o = 36;
50                else if( code2u > 3 ) code2 = 36;
51                else code2 = 4 + code2o * 4 + code2u;
52
53
54//              fprintf( stderr, "%c%c-%c%c: %f\n", s1[i][p1], s1[i][c1], s2[j][p2], s2[j][c2], (float)ribosumdis[code1][code2] );
55
56                if( code1 == 36 || code2 == 36 )
57                        val += (float)n_dis[code1o][code2o] * eff1[i] * eff2[j];
58                else
59                        val += (float)ribosumdis[code1][code2] * eff1[i] * eff2[j];
60        }
61        return( val );
62}
63
64static float pairedribosumscore35( int n1, int n2, char **s1, char **s2, double *eff1, double *eff2, int p1, int p2, int c1, int c2 )
65{
66        float val;
67        int i, j;
68        int code1o, code1u, code2o, code2u, code1, code2;
69
70        val = 0.0;
71        for( i=0; i<n1; i++ ) for( j=0; j<n2; j++ )
72        {
73                code1o = amino_n[(int)s1[i][p1]];
74                code1u = amino_n[(int)s1[i][c1]];
75                if( code1o > 3 ) code1 = code1o = 36;
76                else if( code1u > 3 ) code1 = 36;
77                else code1 = 4 + code1u * 4 + code1o;
78
79                code2o = amino_n[(int)s2[j][p2]];
80                code2u = amino_n[(int)s2[j][c2]];
81                if( code2o > 3 ) code2 = code1o = 36;
82                else if( code2u > 3 ) code2 = 36;
83                else code2 = 4 + code2u * 4 + code2o;
84
85
86//              fprintf( stderr, "%c%c-%c%c: %f\n", s1[i][p1], s1[i][c1], s2[j][p2], s2[j][c2], (float)ribosumdis[code1][code2] );
87
88                if( code1 == 36 || code2 == 36 )
89                        val += (float)n_dis[code1o][code2o] * eff1[i] * eff2[j];
90                else
91                        val += (float)ribosumdis[code1][code2] * eff1[i] * eff2[j];
92        }
93        return( val );
94}
95
96
97static void mccaskillextract( char **seq, char **nogap, int nseq, RNApair **pairprob, RNApair ***single, int **sgapmap, double *eff )
98{
99        int lgth;
100        int nogaplgth;
101        int i, j;
102        int left, right, adpos;
103        float prob;
104        static TLS int *pairnum;
105        RNApair *pt, *pt2;
106
107        lgth = strlen( seq[0] );
108        pairnum = calloc( lgth, sizeof( int ) );
109        for( i=0; i<lgth; i++ ) pairnum[i] = 0;
110
111        for( i=0; i<nseq; i++ )
112        {
113                nogaplgth = strlen( nogap[i] );
114                for( j=0; j<nogaplgth; j++ ) for( pt=single[i][j]; pt->bestpos!=-1; pt++ )
115                {
116                        left = sgapmap[i][j];
117                        right = sgapmap[i][pt->bestpos];
118                        prob = pt->bestscore;
119
120
121                        for( pt2=pairprob[left]; pt2->bestpos!=-1; pt2++ )
122                                if( pt2->bestpos == right ) break;
123
124//                      fprintf( stderr, "i,j=%d,%d, left=%d, right=%d, pt=%d, pt2->bestpos = %d\n", i, j, left, right, pt-single[i][j], pt2->bestpos );
125                        if( pt2->bestpos == -1 )
126                        {
127                                pairprob[left] = (RNApair *)realloc( pairprob[left], (pairnum[left]+2) * sizeof( RNApair ) );
128                                adpos = pairnum[left];
129                                pairnum[left]++;
130                                pairprob[left][adpos].bestscore = 0.0;
131                                pairprob[left][adpos].bestpos = right;
132                                pairprob[left][adpos+1].bestscore = -1.0;
133                                pairprob[left][adpos+1].bestpos = -1;
134                                pt2 = pairprob[left]+adpos;
135                        }
136                        else
137                                adpos = pt2-pairprob[left];
138
139                        pt2->bestscore += prob * eff[i];
140
141                        if( pt2->bestpos != right )
142                        {
143                                fprintf( stderr, "okashii!\n" );
144                                exit( 1 );
145                        }
146//                      fprintf( stderr, "adding %d-%d, %f\n", left, right, prob );
147//                      fprintf( stderr, "pairprob[0][0].bestpos=%d\n", pairprob[0][0].bestpos );
148//                      fprintf( stderr, "pairprob[0][0].bestscore=%f\n", pairprob[0][0].bestscore );
149                }
150        }
151
152//      fprintf( stderr, "before taikakuka\n" );
153        for( i=0; i<lgth; i++ ) for( j=0; j<pairnum[i]; j++ )
154        {
155                if( pairprob[i][j].bestpos > -1 )
156                {
157//                      pairprob[i][j].bestscore /= (float)nseq;
158//                      fprintf( stderr, "pair of %d = %d (%f) %c:%c\n", i, pairprob[i][j].bestpos, pairprob[i][j].bestscore, seq[0][i], seq[0][pairprob[i][j].bestpos] );
159                }
160        }
161
162#if 0
163        for( i=0; i<lgth; i++ ) for( j=0; j<pairnum[i]; j++ )
164        {
165                right=pairprob[i][j].bestpos;
166                if( right < i ) continue;
167                fprintf( stderr, "no%d-%d, adding %d -> %d\n", i, j, right, i );
168                pairprob[right] = (RNApair *)realloc( pairprob[right], (pairnum[right]+2) * sizeof( RNApair ) );
169                pairprob[right][pairnum[right]].bestscore = pairprob[i][j].bestscore;
170                pairprob[right][pairnum[right]].bestpos = i;
171                pairnum[right]++;
172                pairprob[right][pairnum[right]].bestscore = -1.0;
173                pairprob[right][pairnum[right]].bestpos = -1;
174        }
175#endif
176
177        free( pairnum );
178
179}
180
181void system_WARN_NONZERO_EXITCODE(const char *cmd) {
182    int res = system( cmd );
183    if (res != 0) {
184        fprintf(stderr, "Result of command '%s' was non-zero: %i\n", cmd, res);
185    }
186}
187
188void rnaalifoldcall( char **seq, int nseq, RNApair **pairprob )
189{
190    int lgth;
191        int i;
192        static TLS int *order = NULL;
193        static TLS char **name = NULL;
194        char gett[1000];
195        FILE *fp;
196        int left, right, dumm;
197        float prob;
198        static TLS int pid;
199        static TLS char fnamein[100];
200        static TLS char cmd[1000];
201        static TLS int *pairnum;
202
203        lgth = strlen( seq[0] );
204        if( order == NULL )
205        {
206                pid = (int)getpid();
207                sprintf( fnamein, "/tmp/_rnaalifoldin.%d", pid );
208                order = AllocateIntVec( njob );
209                name = AllocateCharMtx( njob, 10 );
210                for( i=0; i<njob; i++ )
211                {
212                        order[i] = i;
213                        sprintf( name[i], "seq%d", i );
214                }
215        }
216        pairnum = calloc( lgth, sizeof( int ) );
217        for( i=0; i<lgth; i++ ) pairnum[i] = 0;
218
219        fp = fopen( fnamein, "w" );
220        if( !fp )
221        {
222                fprintf( stderr, "Cannot open /tmp/_rnaalifoldin\n" );
223                exit( 1 );
224        }
225        clustalout_pointer( fp, nseq, lgth, seq, name, NULL, NULL, order, 15 );
226        fclose( fp );
227
228        sprintf( cmd, "RNAalifold -p %s", fnamein );
229        system_WARN_NONZERO_EXITCODE( cmd );
230
231        fp = fopen( "alifold.out", "r" );
232        if( !fp )
233        {
234                fprintf( stderr, "Cannot open /tmp/_rnaalifoldin\n" );
235                exit( 1 );
236        }
237
238#if 0
239        for( i=0; i<lgth; i++ ) // atode kesu
240        {
241                pairprob[i] = (RNApair *)realloc( pairprob[i], (2) * sizeof( RNApair ) ); // atode kesu
242                pairprob[i][1].bestscore = -1.0;
243                pairprob[i][1].bestpos = -1;
244        }
245#endif
246
247        while( 1 )
248        {
249            {
250                char *result = fgets( gett, 999, fp );
251                if (!result) {
252                    fprintf(stderr, "fgets() fails, but we ignore that fact[2].\n");
253                }
254            }
255            if( gett[0] == '(' ) break;
256            if( gett[0] == '{' ) break;
257            if( gett[0] == '.' ) break;
258            if( gett[0] == ',' ) break;
259            if( gett[0] != ' ' ) continue;
260
261            sscanf( gett, "%d %d %d %f", &left, &right, &dumm, &prob );
262            left--;
263            right--;
264
265
266#if 0
267            if( prob > 50.0 && prob > pairprob[left][0].bestscore )
268            {
269                pairprob[left][0].bestscore = prob;
270                pairprob[left][0].bestpos = right;
271            }
272#else
273            if( prob > 0.0 )
274            {
275                pairprob[left] = (RNApair *)realloc( pairprob[left], (pairnum[left]+2) * sizeof( RNApair ) );
276                pairprob[left][pairnum[left]].bestscore = prob / 100.0;
277                pairprob[left][pairnum[left]].bestpos = right;
278                pairnum[left]++;
279                pairprob[left][pairnum[left]].bestscore = -1.0;
280                pairprob[left][pairnum[left]].bestpos = -1;
281                fprintf( stderr, "%d-%d, %f\n", left, right, prob );
282
283                pairprob[right] = (RNApair *)realloc( pairprob[right], (pairnum[right]+2) * sizeof( RNApair ) );
284                pairprob[right][pairnum[right]].bestscore = prob / 100.0;
285                pairprob[right][pairnum[right]].bestpos = left;
286                pairnum[right]++;
287                pairprob[right][pairnum[right]].bestscore = -1.0;
288                pairprob[right][pairnum[right]].bestpos = -1;
289                fprintf( stderr, "%d-%d, %f\n", left, right, prob );
290            }
291#endif
292        }
293        fclose( fp );
294        sprintf( cmd, "rm -f %s", fnamein );
295        system_WARN_NONZERO_EXITCODE( cmd );
296
297        for( i=0; i<lgth; i++ )
298        {
299                if( (right=pairprob[i][0].bestpos) > -1 )
300                {
301                        pairprob[right][0].bestpos = i;
302                        pairprob[right][0].bestscore = pairprob[i][0].bestscore;
303                }
304        }
305
306#if 0
307        for( i=0; i<lgth; i++ ) // atode kesu
308                if( pairprob[i][0].bestscore > -1 ) pairprob[i][0].bestscore = 1.0; // atode kesu
309#endif
310
311//      fprintf( stderr, "after taikakuka in rnaalifoldcall\n" );
312//      for( i=0; i<lgth; i++ )
313//      {
314//              fprintf( stderr, "pair of %d = %d (%f) %c:%c\n", i, pairprob[i][0].bestpos, pairprob[i][0].bestscore, seq[0][i], seq[0][pairprob[i][0].bestpos] );
315//      }
316
317        free( pairnum );
318}
319
320
321static void utot( int n, int l, char **s )
322{
323        int i, j;
324        for( i=0; i<l; i++ )
325        {
326                for( j=0; j<n; j++ )
327                {
328                        if     ( s[j][i] == 'a' ) s[j][i] = 'a';
329                        else if( s[j][i] == 't' ) s[j][i] = 't';
330                        else if( s[j][i] == 'u' ) s[j][i] = 't';
331                        else if( s[j][i] == 'g' ) s[j][i] = 'g';
332                        else if( s[j][i] == 'c' ) s[j][i] = 'c';
333                        else if( s[j][i] == '-' ) s[j][i] = '-';
334                        else                                      s[j][i] = 'n';
335                }
336        }
337}
338
339
340void foldrna( int nseq1, int nseq2, char **seq1, char **seq2, double *eff1, double *eff2, RNApair ***grouprna1, RNApair ***grouprna2, float **impmtx, int *gapmap1, int *gapmap2, RNApair *additionalpair )
341{
342        int i, j;
343//      int ui, uj;
344//      int uiup, ujup;
345        int uido, ujdo;
346        static TLS char **useq1, **useq2;
347        static TLS char **oseq1, **oseq2, **oseq1r, **oseq2r, *odir1, *odir2;
348        static TLS RNApair **pairprob1, **pairprob2;
349        static TLS RNApair *pairpt1, *pairpt2;
350        int lgth1 = strlen( seq1[0] );
351        int lgth2 = strlen( seq2[0] );
352        static TLS float **impmtx2;
353        static TLS float **map;
354//      double lenfac;
355        float prob;
356        int **sgapmap1, **sgapmap2;
357//      char *nogapdum;
358        float **tbppmtx;
359
360
361//      fprintf( stderr, "nseq1=%d, lgth1=%d\n", nseq1, lgth1 );
362        useq1 = AllocateCharMtx( nseq1, lgth1+10 );
363        useq2 = AllocateCharMtx( nseq2, lgth2+10 );
364        oseq1 = AllocateCharMtx( nseq1, lgth1+10 );
365        oseq2 = AllocateCharMtx( nseq2, lgth2+10 );
366        oseq1r = AllocateCharMtx( nseq1, lgth1+10 );
367        oseq2r = AllocateCharMtx( nseq2, lgth2+10 );
368        odir1 = AllocateCharVec( lgth1+10 );
369        odir2 = AllocateCharVec( lgth2+10 );
370        sgapmap1 = AllocateIntMtx( nseq1, lgth1+1 );
371        sgapmap2 = AllocateIntMtx( nseq2, lgth2+1 );
372//      nogapdum = AllocateCharVec( MAX( lgth1, lgth2 ) );
373        pairprob1 = (RNApair **)calloc( lgth1, sizeof( RNApair *) );
374        pairprob2 = (RNApair **)calloc( lgth2, sizeof( RNApair *) );
375        map = AllocateFloatMtx( lgth1, lgth2 );
376        impmtx2 = AllocateFloatMtx( lgth1, lgth2 );
377        tbppmtx = AllocateFloatMtx( lgth1, lgth2 );
378
379        for( i=0; i<nseq1; i++ ) strcpy( useq1[i], seq1[i] );
380        for( i=0; i<nseq2; i++ ) strcpy( useq2[i], seq2[i] );
381        for( i=0; i<nseq1; i++ ) strcpy( oseq1[i], seq1[i] );
382        for( i=0; i<nseq2; i++ ) strcpy( oseq2[i], seq2[i] );
383
384        for( i=0; i<nseq1; i++ ) commongappick_record( 1, useq1+i, sgapmap1[i] );
385        for( i=0; i<nseq2; i++ ) commongappick_record( 1, useq2+i, sgapmap2[i] );
386
387        for( i=0; i<lgth1; i++ )
388        {
389                pairprob1[i] = (RNApair *)calloc( 1, sizeof( RNApair ) );
390                pairprob1[i][0].bestpos = -1;
391                pairprob1[i][0].bestscore = -1;
392        }
393        for( i=0; i<lgth2; i++ )
394        {
395                pairprob2[i] = (RNApair *)calloc( 1, sizeof( RNApair ) );
396                pairprob2[i][0].bestpos = -1;
397                pairprob2[i][0].bestscore = -1;
398        }
399
400        utot( nseq1, lgth1, oseq1 );
401        utot( nseq2, lgth2, oseq2 );
402
403//      fprintf( stderr, "folding group1\n" );
404//      rnalocal( oseq1, useq1, eff1, eff1, nseq1, nseq1, lgth1+10, pair1 );
405
406/* base-pairing probability of group 1 */
407        if( rnaprediction == 'r' )
408                rnaalifoldcall( oseq1, nseq1, pairprob1 );
409        else
410                mccaskillextract( oseq1, useq1, nseq1, pairprob1, grouprna1, sgapmap1, eff1 );
411
412
413//      fprintf( stderr, "folding group2\n" );
414//      rnalocal( oseq2, useq2, eff2, eff2, nseq2, nseq2, lgth2+10, pair2 );
415
416/* base-pairing probability of group 2 */
417        if( rnaprediction == 'r' )
418                rnaalifoldcall( oseq2, nseq2, pairprob2 );
419        else
420                mccaskillextract( oseq2, useq2, nseq2, pairprob2, grouprna2, sgapmap2, eff2 );
421
422
423
424#if 0
425        makerseq( oseq1, oseq1r, odir1, pairprob1, nseq1, lgth1 );
426        makerseq( oseq2, oseq2r, odir2, pairprob2, nseq2, lgth2 );
427
428        fprintf( stderr, "%s\n", odir2 );
429
430        for( i=0; i<nseq1; i++ )
431        {
432                fprintf( stdout, ">ori\n%s\n", oseq1[0] );
433                fprintf( stdout, ">rev\n%s\n", oseq1r[0] );
434        }
435#endif
436
437/* similarity score */
438        Lalignmm_hmout( oseq1, oseq2, eff1, eff2, nseq1, nseq2, 10000, NULL, NULL, NULL, NULL, map );
439
440        if( 1 )
441        {
442                if( RNAscoremtx == 'n' )
443                {
444                        for( i=0; i<lgth1; i++ ) for( j=0; j<lgth2; j++ )
445                        {
446//                              impmtx2[i][j] = osoiaveragescore( nseq1, nseq2, oseq1, oseq2, eff1, eff2, i, j ) * consweight_multi;
447                                impmtx2[i][j] = 0.0;
448                        }
449                }
450                else if( RNAscoremtx == 'r' )
451                {
452                        for( i=0; i<lgth1; i++ ) for( j=0; j<lgth2; j++ ) 
453                        {
454                                tbppmtx[i][j] = 1.0;
455                                impmtx2[i][j] = 0.0;
456                        }
457                        for( i=0; i<lgth1; i++ ) for( pairpt1=pairprob1[i]; pairpt1->bestpos!=-1; pairpt1++ )
458                        {
459                                for( j=0; j<lgth2; j++ ) for( pairpt2=pairprob2[j]; pairpt2->bestpos!=-1; pairpt2++ )
460                                {
461                                        uido = pairpt1->bestpos;
462                                        ujdo = pairpt2->bestpos;
463                                        prob = pairpt1->bestscore * pairpt2->bestscore;
464                                        if( uido > -1  && ujdo > -1 )
465                                        {
466                                                if( uido > i && j > ujdo )
467                                                {
468                                                        impmtx2[i][j] += prob * pairedribosumscore53( nseq1, nseq2, oseq1, oseq2, eff1, eff2, i, j, uido, ujdo ) * consweight_multi;
469                                                        tbppmtx[i][j] -= prob;
470                                                }
471                                                else if( i < uido && j < ujdo )
472                                                {
473                                                        impmtx2[i][j] += prob * pairedribosumscore35( nseq1, nseq2, oseq1, oseq2, eff1, eff2, i, j, uido, ujdo ) * consweight_multi;
474                                                        tbppmtx[i][j] -= prob;
475                                                }
476                                        }
477                                }
478                        }
479       
480       
481                        for( i=0; i<lgth1; i++ )
482                        {
483                                for( j=0; j<lgth2; j++ )
484                                {
485                                        impmtx2[i][j] += tbppmtx[i][j] * singleribosumscore( nseq1, nseq2, oseq1, oseq2, eff1, eff2, i, j ) * consweight_multi;
486                                }
487                        }
488                }
489
490
491/* four-way consistency */
492
493                for( i=0; i<lgth1; i++ ) for( pairpt1=pairprob1[i]; pairpt1->bestpos!=-1; pairpt1++ )
494                {
495
496//                      if( pairprob1[i] == NULL ) continue;
497
498                        for( j=0; j<lgth2; j++ ) for( pairpt2=pairprob2[j]; pairpt2->bestpos!=-1; pairpt2++ )
499                        {
500//                              fprintf( stderr, "i=%d, j=%d, pn1=%d, pn2=%d\n", i, j, pairpt1-pairprob1[i], pairpt2-pairprob2[j] );
501//                              if( pairprob2[j] == NULL ) continue;
502
503                                uido = pairpt1->bestpos;
504                                ujdo = pairpt2->bestpos;
505                                prob = pairpt1->bestscore * pairpt2->bestscore;
506//                              prob = 1.0;
507//                              fprintf( stderr, "i=%d->uido=%d, j=%d->ujdo=%d\n", i, uido, j, ujdo );
508
509//                              fprintf( stderr, "impmtx2[%d][%d] = %f\n", i, j, impmtx2[i][j] );
510
511//                              if( i < uido && j > ujdo ) continue;
512//                              if( i > uido && j < ujdo ) continue;
513
514
515//                              posdistj = abs( ujdo-j );
516
517//                              if( uido > -1 && ujdo > -1 ) 
518                                if( uido > -1 && ujdo > -1 && ( ( i > uido && j > ujdo ) || ( i < uido && j < ujdo ) ) )
519                                {
520                                        {
521                                                impmtx2[i][j] += MAX( 0, map[uido][ujdo] ) * consweight_rna * 600 * prob; // osoi
522                                        }
523                                }
524
525                        }
526                }
527                for( i=0; i<lgth1; i++ ) for( j=0; j<lgth2; j++ )
528                {
529                        impmtx[i][j] += impmtx2[i][j];
530//                      fprintf( stderr, "fastathreshold=%f, consweight_multi=%f, consweight_rna=%f\n", fastathreshold, consweight_multi, consweight_rna );
531//                      impmtx[i][j] *= 0.5;
532                }
533
534//              impmtx[0][0] += 10000.0;
535//              impmtx[lgth1-1][lgth2-1] += 10000.0;
536
537
538
539#if 0
540                fprintf( stdout, "#impmtx2 = \n" );
541                for( i=0; i<lgth1; i++ )
542                {
543                        for( j=0; j<lgth2; j++ )
544                        {
545                                fprintf( stdout, "%d %d %f\n", i, j, impmtx2[i][j] );
546                        }
547                        fprintf( stdout, "\n" );
548                }
549                exit( 1 );
550#endif
551        }
552
553        FreeCharMtx( useq1 );
554        FreeCharMtx( useq2 );
555        FreeCharMtx( oseq1 );
556        FreeCharMtx( oseq2 );
557        FreeCharMtx( oseq1r );
558        FreeCharMtx( oseq2r );
559        free( odir1 );
560        free( odir2 );
561        FreeFloatMtx( impmtx2 );
562        FreeFloatMtx( map );
563        FreeIntMtx( sgapmap1 );
564        FreeIntMtx( sgapmap2 );
565        FreeFloatMtx( tbppmtx );
566
567        for( i=0; i<lgth1; i++ ) free( pairprob1[i] );
568        for( i=0; i<lgth2; i++ ) free( pairprob2[i] );
569        free( pairprob1 );
570        free( pairprob2 );
571}
572
Note: See TracBrowser for help on using the repository browser.