1 /* Last changed Time-stamp: <2008-09-02 10:47:24 ivo> */
4 Calculate Energy of given Sequences and Structures
14 #include <sys/types.h>
15 #include "fold_vars.h"
18 #include "read_epars.h"
19 #include "RNAeval_cmdl.h"
22 #define UNUSED __attribute__ ((unused))
28 static char UNUSED rcsid[]="$Id: RNAeval.c,v 1.10 2008/10/09 07:08:40 ivo Exp $";
30 PRIVATE char *costring(char *string);
31 PRIVATE char *tokenize(char *line);
33 int main(int argc, char *argv[]){
34 struct RNAeval_args_info args_info;
35 char *string, *structure, *orig_sequence, *tmp;
36 char *rec_sequence, *rec_id, **rec_rest;
37 char fname[FILENAME_MAX_LENGTH];
39 int i, length1, length2;
45 unsigned int rec_type, read_opt;
47 string = orig_sequence = ParamFile = NULL;
52 #############################################
53 # check the command line parameters
54 #############################################
56 if(RNAeval_cmdline_parser (argc, argv, &args_info) != 0) exit(1);
58 if(args_info.temp_given) temperature = args_info.temp_arg;
59 /* do not take special tetra loop energies into account */
60 if(args_info.noTetra_given) tetra_loop=0;
61 /* set dangle model */
62 if(args_info.dangles_given){
63 if((args_info.dangles_arg < 0) || (args_info.dangles_arg > 3))
64 warn_user("required dangle model not implemented, falling back to default dangles=2");
66 dangles = args_info.dangles_arg;
68 /* do not convert DNA nucleotide "T" to appropriate RNA "U" */
69 if(args_info.noconv_given) noconv = 1;
70 /* set energy model */
71 if(args_info.energyModel_given) energy_set = args_info.energyModel_arg;
72 /* take another energy parameter set */
73 if(args_info.paramFile_given) ParamFile = strdup(args_info.paramFile_arg);
74 /* assume RNA sequence to be circular */
75 if(args_info.circ_given) circular=1;
76 /* logarithmic multiloop energies */
77 if(args_info.logML_given) logML = 1;
79 if(args_info.verbose_given) verbose = 1;
80 /* gquadruplex support */
81 if(args_info.gquad_given) gquad = 1;
83 /* free allocated memory of command line data structure */
84 RNAeval_cmdline_parser_free (&args_info);
87 #############################################
89 #############################################
92 if (ParamFile!=NULL) read_parameter_file(ParamFile);
94 rec_type = read_opt = 0;
95 rec_id = rec_sequence = NULL;
97 istty = isatty(fileno(stdout)) && isatty(fileno(stdin));
99 if(circular && gquad){
100 nrerror("G-Quadruplex support is currently not available for circular RNA structures");
103 /* set options we wanna pass to read_record */
105 read_opt |= VRNA_INPUT_NOSKIP_BLANK_LINES;
106 print_tty_input_seq_str("Use '&' to connect 2 sequences that shall form a complex.\n"
107 "Input sequence (upper or lower case) followed by structure");
111 #############################################
112 # main loop: continue until end of file
113 #############################################
116 !((rec_type = read_record(&rec_id, &rec_sequence, &rec_rest, read_opt))
117 & (VRNA_INPUT_ERROR | VRNA_INPUT_QUIT))){
120 (void) sscanf(rec_id, ">%" XSTR(FILENAME_ID_LENGTH) "s", fname);
122 else fname[0] = '\0';
126 string = tokenize(rec_sequence);
127 length2 = (int) strlen(string);
128 tmp = extract_record_rest_structure((const char **)rec_rest, 0, (rec_id) ? VRNA_OPTION_MULTILINE : 0);
131 nrerror("structure missing");
133 structure = tokenize(tmp);
134 length1 = (int) strlen(structure);
135 if(length1 != length2)
136 nrerror("structure and sequence differ in length!");
140 /* convert DNA alphabet to RNA if not explicitely switched off */
141 if(!noconv) str_DNA2RNA(string);
142 /* store case-unmodified sequence */
143 orig_sequence = strdup(string);
144 /* convert sequence to uppercase letters only */
145 str_uppercase(string);
149 printf("length = %d\n", length1);
151 printf("length1 = %d\nlength2 = %d\n", cut_point-1, length1-cut_point+1);
155 energy = energy_of_gquad_structure(string, structure, verbose);
157 energy = (circular) ? energy_of_circ_structure(string, structure, verbose) : energy_of_structure(string, structure, verbose);
160 printf("%s\n%s", orig_sequence, structure);
162 char *pstring, *pstruct;
163 pstring = costring(orig_sequence);
164 pstruct = costring(structure);
165 printf("%s\n%s", pstring, pstruct);
170 printf("\n energy = %6.2f\n", energy);
172 printf(" (%6.2f)\n", energy);
175 (void) fflush(stdout);
176 if(rec_id) free(rec_id);
179 /* free the rest of current dataset */
181 for(i=0;rec_rest[i];i++) free(rec_rest[i]);
184 rec_id = rec_sequence = structure = NULL;
189 string = orig_sequence = NULL;
191 /* print user help for the next round if we get input from tty */
193 print_tty_input_seq_str("Use '&' to connect 2 sequences that shall form a complex.\n"
194 "Input sequence (upper or lower case) followed by structure");
200 PRIVATE char *tokenize(char *line)
202 char *token, *copy, *ctmp;
205 copy = (char *) space(strlen(line)+1);
206 ctmp = (char *) space(strlen(line)+1);
207 (void) sscanf(line, "%s", copy);
209 token = strtok(copy, "&");
210 cut = strlen(token)+1;
213 token = strtok(NULL, "&");
215 if (cut > strlen(ctmp)) cut = -1;
217 if (cut_point==-1) cut_point = cut;
218 else if (cut_point != cut) {
219 fprintf(stderr,"cut_point = %d cut = %d\n", cut_point, cut);
220 nrerror("Sequence and Structure have different cut points.");
228 PRIVATE char *costring(char *string)
233 len = strlen(string);
234 ctmp = (char *)space((len+2) * sizeof(char));
236 (void) strncpy(ctmp, string, cut_point-1);
238 ctmp[cut_point-1] = '&';
239 /* second sequence */
240 (void) strcat(ctmp, string+cut_point-1);