1 /*
2  * Various wrappers to create simplified interfaces for Minimum Free Energy
3  * prediction
4  */
5 
6 #ifdef HAVE_CONFIG_H
7 #include "config.h"
8 #endif
9 
10 #include <stdio.h>
11 #include <stdlib.h>
12 
13 #include "ViennaRNA/fold_compound.h"
14 #include "ViennaRNA/model.h"
15 #include "ViennaRNA/utils/basic.h"
16 #include "ViennaRNA/mfe_window.h"
17 
18 
19 /* wrappers for local MFE prediction */
20 PUBLIC float
vrna_Lfold(const char * string,int window_size,FILE * file)21 vrna_Lfold(const char *string,
22            int        window_size,
23            FILE       *file)
24 {
25   float                 energy;
26   vrna_fold_compound_t  *vc;
27   vrna_md_t             md;
28 
29   vrna_md_set_default(&md);
30 
31   md.window_size  = window_size;
32   md.max_bp_span  = window_size;
33 
34   vc = vrna_fold_compound(string, &md, VRNA_OPTION_WINDOW);
35 
36   energy = vrna_mfe_window(vc, file);
37 
38   vrna_fold_compound_free(vc);
39 
40   return energy;
41 }
42 
43 
44 PUBLIC float
vrna_Lfold_cb(const char * string,int window_size,vrna_mfe_window_callback * cb,void * data)45 vrna_Lfold_cb(const char                *string,
46               int                       window_size,
47               vrna_mfe_window_callback  *cb,
48               void                      *data)
49 {
50   float                 energy;
51   vrna_fold_compound_t  *vc;
52   vrna_md_t             md;
53 
54   vrna_md_set_default(&md);
55 
56   md.window_size  = window_size;
57   md.max_bp_span  = window_size;
58 
59   vc = vrna_fold_compound(string, &md, VRNA_OPTION_WINDOW);
60 
61   energy = vrna_mfe_window_cb(vc, cb, data);
62 
63   vrna_fold_compound_free(vc);
64 
65   return energy;
66 }
67 
68 
69 #ifdef VRNA_WITH_SVM
70 
71 PUBLIC float
vrna_Lfoldz(const char * string,int window_size,double min_z,FILE * file)72 vrna_Lfoldz(const char  *string,
73             int         window_size,
74             double      min_z,
75             FILE        *file)
76 {
77   float                 energy;
78   vrna_fold_compound_t  *vc;
79   vrna_md_t             md;
80 
81   vrna_md_set_default(&md);
82 
83   md.window_size  = window_size;
84   md.max_bp_span  = window_size;
85 
86   vc = vrna_fold_compound(string, &md, VRNA_OPTION_WINDOW);
87 
88   energy = vrna_mfe_window_zscore(vc, min_z, file);
89 
90   vrna_fold_compound_free(vc);
91 
92   return energy;
93 }
94 
95 
96 PUBLIC float
vrna_Lfoldz_cb(const char * string,int window_size,double min_z,vrna_mfe_window_zscore_callback * cb,void * data)97 vrna_Lfoldz_cb(const char                       *string,
98                int                              window_size,
99                double                           min_z,
100                vrna_mfe_window_zscore_callback  *cb,
101                void                             *data)
102 {
103   float                 energy;
104   vrna_fold_compound_t  *vc;
105   vrna_md_t             md;
106 
107   vrna_md_set_default(&md);
108 
109   md.window_size  = window_size;
110   md.max_bp_span  = window_size;
111 
112   vc = vrna_fold_compound(string, &md, VRNA_OPTION_WINDOW);
113 
114   energy = vrna_mfe_window_zscore_cb(vc, min_z, cb, data);
115 
116   vrna_fold_compound_free(vc);
117 
118   return energy;
119 }
120 
121 
122 #endif
123 
124 /* wrappers for local MFE prediction using multiple sequence alignments */
125 PUBLIC float
vrna_aliLfold(const char ** AS,int window_size,FILE * file)126 vrna_aliLfold(const char  **AS,
127               int         window_size,
128               FILE        *file)
129 {
130   float                 energy;
131   vrna_fold_compound_t  *vc;
132   vrna_md_t             md;
133 
134   vrna_md_set_default(&md);
135 
136   md.window_size  = window_size;
137   md.max_bp_span  = window_size;
138 
139   vc = vrna_fold_compound_comparative(AS, &md, VRNA_OPTION_MFE | VRNA_OPTION_WINDOW);
140 
141   energy = vrna_mfe_window(vc, file);
142 
143   vrna_fold_compound_free(vc);
144 
145   return energy;
146 }
147 
148 
149 PUBLIC float
vrna_aliLfold_cb(const char ** AS,int window_size,vrna_mfe_window_callback * cb,void * data)150 vrna_aliLfold_cb(const char               **AS,
151                  int                      window_size,
152                  vrna_mfe_window_callback *cb,
153                  void                     *data)
154 {
155   float                 energy;
156   vrna_fold_compound_t  *vc;
157   vrna_md_t             md;
158 
159   vrna_md_set_default(&md);
160 
161   md.window_size  = window_size;
162   md.max_bp_span  = window_size;
163 
164   vc = vrna_fold_compound_comparative(AS, &md, VRNA_OPTION_MFE | VRNA_OPTION_WINDOW);
165 
166   energy = vrna_mfe_window_cb(vc, cb, data);
167 
168   vrna_fold_compound_free(vc);
169 
170   return energy;
171 }
172