WSTester updated to work plus hopefully all the other changes that need to go into...
[jabaws.git] / binaries / src / ViennaRNA / Progs / RNAplot.c
diff --git a/binaries/src/ViennaRNA/Progs/RNAplot.c b/binaries/src/ViennaRNA/Progs/RNAplot.c
new file mode 100644 (file)
index 0000000..42ebede
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+  Plot RNA structures using different layout algorithms
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <ctype.h>
+#include <string.h>
+#include <unistd.h>
+#include "utils.h"
+#include "PS_dot.h"
+#include "RNAplot_cmdl.h"
+
+#define PRIVATE static
+
+int main(int argc, char *argv[]){
+  struct        RNAplot_args_info args_info;
+  char          *structure, *pre, *post;
+  char          fname[FILENAME_MAX_LENGTH], ffname[FILENAME_MAX_LENGTH];
+  char          *rec_sequence, *rec_id, **rec_rest;
+  int           i, length;
+  int           istty;
+  char          format[5]="ps";
+  unsigned int  rec_type, read_opt;
+
+  structure = pre = post = NULL;
+  length = 0;
+
+  /*
+  #############################################
+  # check the command line parameters
+  #############################################
+  */
+  if(RNAplot_cmdline_parser (argc, argv, &args_info) != 0) exit(1);
+
+  if(args_info.layout_type_given) rna_plot_type = args_info.layout_type_arg;
+  if(args_info.pre_given)         pre           = strdup(args_info.pre_arg);
+  if(args_info.post_given)        post          = strdup(args_info.post_arg);
+  if(args_info.output_format_given){
+    strncpy(format, args_info.output_format_arg, 4); format[4] = '\0';
+  }
+
+  /* free allocated memory of command line data structure */
+  RNAplot_cmdline_parser_free (&args_info);
+
+  /*
+  #############################################
+  # begin initializing
+  #############################################
+  */
+  rec_type      = read_opt = 0;
+  rec_id        = rec_sequence = NULL;
+  rec_rest      = NULL;
+  istty         = isatty(fileno(stdout)) && isatty(fileno(stdin));
+
+  /* set options we wanna pass to read_record */
+  if(istty){
+    read_opt |= VRNA_INPUT_NOSKIP_BLANK_LINES;
+    print_tty_input_seq_str("Input sequence (upper or lower case) followed by structure");
+  }
+
+  /* print user help if we get input from tty */
+  if(istty){
+    print_tty_input_seq();
+    read_opt |= VRNA_INPUT_NOSKIP_BLANK_LINES;
+  }
+
+  /*
+  #############################################
+  # main loop: continue until end of file
+  #############################################
+  */
+  while(
+    !((rec_type = read_record(&rec_id, &rec_sequence, &rec_rest, read_opt))
+        & (VRNA_INPUT_ERROR | VRNA_INPUT_QUIT))){
+
+    if(rec_id){
+      (void) sscanf(rec_id, ">%" XSTR(FILENAME_ID_LENGTH) "s", fname);
+    }
+    else fname[0] = '\0';
+
+    length = (int)strlen(rec_sequence);
+
+    structure = extract_record_rest_structure((const char **)rec_rest, 0, (rec_id) ? VRNA_OPTION_MULTILINE : 0);
+
+    if(!structure) nrerror("structure missing");
+    if((int)strlen(structure) != length) nrerror("structure and sequence differ in length!");
+
+    if (fname[0]!='\0'){
+      strcpy(ffname, fname);
+      strcat(ffname, "_ss");
+    } else
+      strcpy(ffname, "rna");
+
+    structure = NULL;
+    unsigned int struct_options = (rec_id) ? VRNA_CONSTRAINT_MULTILINE : 0;
+    struct_options |= VRNA_CONSTRAINT_ALL;
+    getConstraint(&structure, (const char **)rec_rest, struct_options);
+
+    if(strlen(rec_sequence) != strlen(structure))
+      nrerror("sequence and structure have unequal length");
+
+    switch (format[0]) {
+      case 'p':
+        strcat(ffname, ".ps");
+
+        (void) PS_rna_plot_a_gquad(rec_sequence, structure, ffname, pre, post);
+
+        /* PS_rna_plot_a(rec_sequence, structure, ffname, pre, post); */
+
+        break;
+      case 'g':
+        strcat(ffname, ".gml");
+        gmlRNA(rec_sequence, structure, ffname, 'x');
+        break;
+      case 'x':
+        strcat(ffname, ".ss");
+        xrna_plot(rec_sequence, structure, ffname);
+        break;
+      case 's':
+        strcat(ffname, ".svg");
+        svg_rna_plot(rec_sequence, structure, ffname);
+        break;
+      default:
+        RNAplot_cmdline_parser_print_help(); exit(EXIT_FAILURE);
+    }
+
+    fflush(stdout);
+
+    /* clean up */
+    if(rec_id) free(rec_id);
+    free(rec_sequence);
+    free(structure);
+    /* free the rest of current dataset */
+    if(rec_rest){
+      for(i=0;rec_rest[i];i++) free(rec_rest[i]);
+      free(rec_rest);
+    }
+    rec_id = rec_sequence = structure = NULL;
+    rec_rest = NULL;
+
+    /* print user help for the next round if we get input from tty */
+    if(istty){
+      print_tty_input_seq_str("Input sequence (upper or lower case) followed by structure");
+    }
+  }
+
+  return EXIT_SUCCESS;
+}