WSTester updated to work plus hopefully all the other changes that need to go into...
[jabaws.git] / binaries / src / ViennaRNA / Progs / RNAsnoop.c
diff --git a/binaries/src/ViennaRNA/Progs/RNAsnoop.c b/binaries/src/ViennaRNA/Progs/RNAsnoop.c
new file mode 100644 (file)
index 0000000..3306ee9
--- /dev/null
@@ -0,0 +1,1083 @@
+/* Last changed Time-stamp: <2007-12-05 13:55:42 ronny> */
+/*
+                  Ineractive Access to folding Routines
+
+                  c Ivo L Hofacker
+                  Vienna RNA package
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <string.h>
+#include <time.h>
+#include "snofold.h"
+#include "fold.h"
+#include "energy_par.h"
+#include "snoop.h"
+#include "part_func.h"
+#include "fold_vars.h"
+#include "PS_dot.h"
+#include "utils.h"
+#include "aln_util.h"
+#include "RNAsnoop_cmdl.h"
+static void  aliprint_struc(snoopT *dup, const char **s1, const char **s2, char**,char**,int count, int);
+static void  print_struc(snoopT *dup, const char *s1, const char *s2, char*, char*, int,int);
+/* static void  print_struc_L(snoopT const *dup, const char *s1, const char *s2, char*, char*); */
+
+
+static void redraw_output(char *fname, char *output, int plfold_up_flag, char *suffix, char *access, char *sname, char *tname);
+static int ** read_plfold_i(char *fname, const int beg, const int end); /* read plfold profiles */
+static int ** read_rnaup(char *fname, const int beg, const int end);
+static int get_max_u(const char *s, char delim);
+extern int cut_point;
+/*@unused@*/
+static char UNUSED rcsid[] = "$Id: RNAfold.c,v 1.23 2007/12/05 13:04:08 ivo Exp $";
+
+#define PRIVATE static
+#define MAX_NUM_NAMES    500
+
+/*--------------------------------------------------------------------------*/
+
+int main(int argc, char *argv[])
+{
+  struct        RNAsnoop_args_info args_info;  
+  char *string_s, *line_s, *name_s, *temp_s; /*string for snoRNA*/
+  char *string_t, *line_t, *temp_t; /*string for target RNA*/
+  char *structure=NULL, *cstruc=NULL;
+  char  *sname=NULL,*tname=NULL/*name of the sno RNa file, mRNA file respectively*/;
+  char *name=NULL;
+  char *access;char *result_file;
+  char *output_directory;
+  int fullStemEnergy;
+  output_directory=NULL;
+  result_file=NULL;
+  access=NULL;
+  char *suffix;
+  suffix=NULL;
+  FILE *sno, *mrna;
+  int fast;fast=0;
+  /* long int elapTicks; */
+  /* clock_t Begin, End; */
+  int plfold_up_flag=0;
+  int   nice,i,r,l,length_s,/* , length_t,  */
+   penalty,         /*extension penalty*/
+   threshloop,         /*energy threshold on loop*/
+   threshLE,         /*energy threshold on the S2 part*/
+   threshRE,        /*energy threshold on the S1 part*/
+   threshDE,         /*Total duplex energy threshold*/
+   threshTE,        /*Total duplex + Loop energy*/
+   threshSE,        /*Sum of all energies*/
+   threshD,            /*lower stem energy*/
+   half_stem,         /*minimal length of stem*/
+   max_half_stem,        /*maximal length of stem*/
+   max_s2                /*maximale position wo stem anfangen darf in 3->5*/,
+   min_s2                 /*minimale position wo stem anfangen darf in 3->5*/,
+   max_s1                /*minimal position wo stem enden darf in 3->5 */,
+   min_s1                /*maximale position wo stem enden darf in 3->5*/,
+   distance        /*distance between two subopts*/,
+   min_d1                /*minimal distance between 5' sno and first duplex*/,
+   min_d2                /*minimal distance between 3' sno and second duplex*/,
+   max_asymm        /*maximal asymmetry in the stem interior loop*/,
+   alignment_length/*maximal target RNA alignment length*/,
+   alignment       /*flag to use ali version*/,
+    delta,
+   redraw          /*if used (option I) allow to redraw command line output into ps files */;
+  
+  int  noconv=0;
+  string_s=NULL;
+  string_t=NULL;
+  plfold_up_flag=0;
+  alignment=0;
+  redraw=0;
+  nice=0;
+  fast=0;
+  snoop_subopt_sorted=0;
+  /*
+  #############################################
+  # check the command line parameters
+  #############################################
+  */
+  if(RNAsnoop_cmdline_parser(argc,argv, &args_info)!=0) exit(1);
+  /* Redraw results from RNAsnoop */
+  if(args_info.constraint_given)  fold_constrained=1;
+  /* structure constraint */
+  if(args_info.produce_ps_given)  redraw=1;
+  /*output directory for RNAsnoop results */
+  output_directory=strdup(args_info.output_directory_arg);
+  /* Draw directly nice pictures from RNAsnoop*/
+  if(args_info.direct_redraw_given)  nice=1;
+  /*Accessibility files are coming from RNAup*/
+  if(args_info.from_RNAup_given) {plfold_up_flag=2;access=strdup(args_info.from_RNAup_arg);}
+  /*Suffix for the name of the accessibility files*/
+  suffix=strdup(args_info.suffix_arg);
+  /*Accessibility files are coming from RNAup*/
+  if(args_info.from_RNAplfold_given) {plfold_up_flag=1;access=strdup(args_info.from_RNAplfold_arg);}
+  /*Check if we are in alignment mode*/
+  if(args_info.alignment_mode_given) alignment=1;
+  /*Name of the stems file*/
+  if(args_info.query_given) sname=strdup(args_info.query_arg);
+  /*Name of the target file*/
+  if(args_info.target_given) tname=strdup(args_info.target_arg);
+  /*Delta for suboptimals*/
+  delta=(int) (100*(args_info.energy_threshold_arg+0.1));
+  /*fast folding and target search*/
+  fast=args_info.fast_folding_arg;
+  /*Penalty for duplex extension*/
+  penalty=args_info.extension_cost_arg;
+  /*threshold on loop energy*/
+  threshloop=args_info.minimal_loop_energy_arg;
+  /*threshold on right duplex*/
+  threshRE=args_info.minimal_right_duplex_arg;
+  /*threshold on left duplex*/
+  threshLE=args_info.minimal_left_duplex_arg;
+  /*threshold on minimal duplex*/
+  threshDE=args_info.minimal_duplex_arg;
+  /*threshold on duplex distance*/
+  distance=args_info.duplex_distance_arg;
+  /*threshold on minimal stem length*/
+  half_stem=args_info.minimal_stem_length_arg;
+  /*threshold on maximal stem length*/
+  max_half_stem=args_info.maximal_stem_length_arg;
+  /*threshold on minimal duplex box length*/
+  min_s2=args_info.minimal_duplex_box_length_arg;
+  /*threshold on maximal duplex box length*/
+  max_s2=args_info.maximal_duplex_box_length_arg;
+  /*threshold on minimal snoRNA stem loop length*/
+  min_s1=args_info.minimal_snoRNA_stem_loop_length_arg;
+  /*thrshold on maximal snoRNA stem loop length*/
+  max_s1=args_info.maximal_snoRNA_stem_loop_length_arg;
+  /*threshold on minimal snoRNA duplex length*/
+  min_d1=args_info.minimal_snoRNA_duplex_length_arg;
+  /*threshold on minimal snoRNA duplex length*/
+  min_d2=args_info.minimal_snoRNA_duplex_length_arg;
+  /*threshold on minimal duplex stem energy*/
+  threshTE=args_info.minimal_duplex_stem_energy_arg;
+  /*threshold on minimal total energy*/
+  threshSE=args_info.minimal_total_energy_arg;
+  /*threshold on maximal stem asymmetry*/
+  max_asymm=args_info.maximal_stem_asymmetry_arg;
+  /*threshold on minimal lower stem energy*/
+  threshD=args_info.minimal_lower_stem_energy_arg;
+  /*threshold on minimal lower stem energy*/
+  alignment_length=args_info.alignmentLength_arg;
+    
+  threshloop=MIN2(threshloop,0);
+
+/*   if(plfold_up_flag && !fast){ */
+/*     printf("Sorry, no accessibility implementation with the non fast implementation\n"); */
+/*     printf("If you want to include accessibility information please run RNAsnoop with the -f option\n"); */
+/*     printf("If you want to run RNAsnoop with the slow algorithm, please remove run RNAsnoop without -P\n"); */
+/*     exit(0); */
+/*   } */
+  
+  
+  if(plfold_up_flag==2 && suffix==NULL){
+    printf("RNAsnoop needs a suffix (-S u1-to-30) for the RNAup accessibility file in order to localize them\n");
+    exit(0);
+  }
+  if(redraw){
+    if(!alignment){
+      redraw_output(result_file, output_directory, plfold_up_flag, suffix, access,NULL,NULL);
+    }
+    else{
+      redraw_output(result_file, output_directory, plfold_up_flag, suffix, access,sname,tname);
+    }
+  
+    /* readfile */
+    /* parse lines */
+    /* use current ploting function to output the results */
+    exit(0);
+  }
+  /* istty = isatty(fileno(stdout))&&isatty(fileno(stdin)); */
+   
+  min_s2+=5;
+  max_s2+=5;
+  min_s1+=5;
+  max_s1+=5;
+  min_d1+=5;
+  min_d2+=5;
+  
+
+  if(!alignment) {
+    if(tname==NULL || sname==NULL) RNAsnoop_cmdline_parser_print_help();
+    sno=fopen(sname, "r");
+    if(sno==NULL){printf("%s: Wrong snoRNA file name\n", sname);return 0;}
+    mrna=fopen(tname, "r");
+    if(mrna==NULL){printf("%s: Wrong target file name\n", tname);return 0;}
+    do {                                /* main loop: continue until end of file */
+      if ((line_s = get_line(sno))==NULL) {
+        free(line_s);
+        break;
+      }
+      
+      /*   skip comment lines and get filenames */
+      while ((*line_s=='*')||(*line_s=='\0')||(*line_s=='>')) {
+        if (*line_s=='>')
+          name_s = (char *) space(strlen(line_s)+1);
+        (void) sscanf(line_s,"%s",name_s);
+        free(line_s);
+        if ((line_s = get_line(sno))==NULL) {
+          free(line_s);
+          break;
+        }
+      }
+      if(name_s == NULL) {printf("Your snoRNA sequence: \n%s\nhas no header. Please update your fasta file\n", line_s); exit(0);}
+      /*   if ((line ==NULL) || (strcmp(line, "@") == 0)) break; */
+      temp_s = (char *) space(strlen(line_s)+1);
+      (void) sscanf(line_s,"%s",temp_s);
+      free(line_s);
+      length_s = (int) strlen(temp_s);
+      for (l = 0; l < length_s; l++) {
+        temp_s[l] = toupper(temp_s[l]);
+        if (!noconv && temp_s[l] == 'T') temp_s[l] = 'U';
+      }
+      string_s = (char*) space(length_s + 11);
+      strcpy(string_s, "NNNNN");
+      strcat(string_s+5, temp_s);
+      strcat(string_s+5+length_s, "NNNNN\0");
+      free(temp_s); 
+      /* We declare the structure variable here as it will also contains the final stem structure */
+      structure=(char *)space((unsigned) length_s+11);
+      if(fold_constrained){
+       cstruc = get_line(sno);
+       if(cstruc!=NULL){
+         int dn3=strlen(cstruc)-(length_s-10);
+         strcpy(structure,".....");
+         strcat(structure, cstruc);
+         if(dn3>=0){
+           strcat(structure,".....\0");
+         }
+         else{
+           while(dn3++){
+             strcat(structure,".");
+           }
+           strcat(structure,"\0");
+         }
+         /* Now we fold with constraints the  */
+       }
+      }
+      fullStemEnergy = snofold(string_s, structure, max_asymm, threshloop, min_s2, max_s2, half_stem, max_half_stem);
+      do{                                /* main loop for target continue until end of file */
+        snoopT mfe;
+        if ((line_t = get_line(mrna))==NULL) {
+          /* free(line_t); */
+          break;
+        }
+        char *name_t=NULL;
+        
+        /* skip comment lines and get filenames */
+        while ((*line_t=='*')||(*line_t=='\0')||(*line_t=='>')) {
+          if (*line_t=='>'){
+            printf("%s\n", name_s);
+            name_t = (char*) space(strlen(line_t)+1);
+            (void) sscanf(line_t,"%s",name_t);
+            
+            printf("%s\n", name_t);
+            free(line_t);
+            /*             free(string_t); */
+              } 
+          if ((line_t = get_line(mrna))==NULL) {
+            free(line_t);
+            break;
+          }
+        }
+        if(name_t == NULL) {printf("Your target sequence: \n%s\nhas no header. Please update your fasta file\n", line_t); exit(0);}
+        /*   if ((line ==NULL) || (strcmp(line, "@") == 0)) break; */
+        temp_t = (char *) space(strlen(line_t)+1);
+        (void) sscanf(line_t,"%s",temp_t);
+        int length_t;
+        length_t = (int) strlen(temp_t);
+        for (l = 0; l < length_t; l++) {
+          temp_t[l] = toupper(temp_t[l]);
+          if (!noconv && temp_t[l] == 'T') temp_t[l] = 'U';
+        }
+        string_t =(char *) space(length_t +11);
+        strcpy(string_t, "NNNNN");
+        strcat(string_t+5, temp_t);
+        strcat(string_t+5+length_t, "NNNNN");
+        free(temp_t);
+        char *name_output;
+        name_output=NULL;
+        if(nice){
+          name_output = (char*) space(sizeof(char)*(length_t+length_s+2));
+          strcpy(name_output, name_t+1);
+          strcat(name_output, "_");
+          strcat(name_output, name_s+1);
+          name_output[length_t + length_s +1]='\0';
+        }
+        if(delta>=0){
+          snoopT* subopt;
+          snoopT* sub;
+          if(!fast && !plfold_up_flag){
+            subopt = snoop_subopt(string_t, string_s, delta, 5, penalty, threshloop, 
+                                  threshLE,threshRE, threshDE,threshTE,threshSE,threshD,distance,
+                                  half_stem, max_half_stem, min_s2, max_s2, min_s1, max_s1, min_d1, min_d2,fullStemEnergy);
+            if(subopt==NULL){printf("no target found under the given constraints\n");free(subopt); free(string_t);free(line_t);continue;}
+            int count=0;
+            for (sub=subopt; sub->structure !=NULL; sub++) {
+              print_struc(sub, string_t, string_s, name_s, name_t, count++,nice);
+              free(sub->structure);
+            }
+            free(subopt);
+            free(string_t);
+            free(line_t);
+          }
+          else if(!plfold_up_flag){
+            Lsnoop_subopt_list(string_t, string_s, delta, 5, penalty, threshloop, 
+                               threshLE,threshRE,threshDE,threshTE,threshSE,threshD,distance,
+                               half_stem, max_half_stem, min_s2, max_s2, min_s1, max_s1, min_d1, min_d2, alignment_length,name_output,fullStemEnergy);
+            free(string_t);
+            free(line_t);
+          }
+          else {
+            if(plfold_up_flag==1){
+              int **access_s1; 
+              char *file_s1;
+              int s1_len;/* k;*/ /*,j; */
+              s1_len=strlen(string_t); 
+              file_s1 = (char *) space(sizeof(char) * (strlen(name_t+1)+strlen(access)+9));
+              strcpy(file_s1, access);
+              strcat(file_s1, "/");
+              strcat(file_s1, name_t+1);
+              strcat(file_s1, "_openen");
+              access_s1 = read_plfold_i(file_s1, 1, s1_len);
+              if(fast) { 
+                Lsnoop_subopt_list_XS(string_t, string_s, (const int**) access_s1, delta, 5, penalty, threshloop,  
+                                      threshLE,threshRE,threshDE,threshTE,threshSE,threshD,distance, 
+                                      half_stem, max_half_stem, min_s2, max_s2, min_s1, max_s1, min_d1, min_d2, alignment_length,name_output, fullStemEnergy); 
+              }
+              else{
+                snoop_subopt_XS(string_t, string_s, (const int **) access_s1, delta, 5, penalty, threshloop,  
+                                threshLE,threshRE,threshDE,threshTE,threshSE,threshD,distance, 
+                                half_stem, max_half_stem, min_s2, max_s2, min_s1, max_s1, min_d1, min_d2, alignment_length,name_output,fullStemEnergy); 
+              }
+/*                for(j=0; j<s1_len; j++){  */
+/*                  for(k=0; k<access_s1[0][0];k++){  */
+/*                    printf("%d \t",access_s1[k][j]);  */
+/*                  }  */
+/*                  printf("\n");  */
+/*                }  */
+              free(file_s1);free(string_t);free(line_t);
+              int i = access_s1[0][0];
+              while(--i>-1){
+                free(access_s1[i]);
+              }
+              free(access_s1);
+            }
+            else if(plfold_up_flag==2){
+              int **access_s1; 
+              char *file_s1;
+              int s1_len,k;/* ,j; */
+              s1_len=strlen(string_t); 
+              file_s1 = (char *) space(sizeof(char) * (strlen(name_t+1)+strlen(suffix) + strlen(access)+3));
+              strcpy(file_s1, access);
+              strcat(file_s1, "/");
+              strcat(file_s1, name_t+1);
+              strcat(file_s1, "_");
+              strcat(file_s1, suffix);
+              access_s1 = read_rnaup(file_s1, 1, s1_len);
+              if(fast){
+                Lsnoop_subopt_list_XS(string_t, string_s, (const int**) access_s1, delta, 5, penalty, threshloop,  
+                                      threshLE,threshRE,threshDE,threshTE,threshSE,threshD,distance, 
+                                      half_stem, max_half_stem, min_s2, max_s2, min_s1, max_s1, min_d1, min_d2, alignment_length, name_output, fullStemEnergy); 
+              }
+              else{
+                snoop_subopt_XS(string_t, string_s, (const int**) access_s1, delta, 5, penalty, threshloop,
+                                threshLE,threshRE,threshDE,threshTE,threshSE,threshD,distance,
+                                half_stem, max_half_stem, min_s2, max_s2, min_s1, max_s1, min_d1, min_d2, alignment_length,name_output, fullStemEnergy);
+              }
+                
+
+/*                for(j=0; j<s1_len; j++){  */
+/*                  for(k=0; k<access_s1[0][0];k++){  */
+/*                    printf("%d \t",access_s1[k][j]);  */
+/*                  }  */
+/*                  printf("\n");  */
+/*                }  */
+              free(file_s1);free(string_t);free(line_t);
+              k = access_s1[0][0];
+              while(--k>-1){
+                free(access_s1[k]);
+              }
+              free(access_s1);
+            }
+          }
+        }
+        else{
+          mfe=snoopfold(string_t, string_s, penalty, threshloop, threshLE, threshRE,threshDE,  threshD,
+                        half_stem, max_half_stem, min_s2, max_s2, min_s1, max_s1, min_d1, min_d2, fullStemEnergy);
+          if(mfe.energy < INF){
+            print_struc(&mfe, string_t, string_s, name_s, name_t,0,1);
+            free(mfe.structure);
+          }
+          free(line_t);
+          length_t= (int) strlen(string_t);
+          free(string_t);
+        }
+        free(name_t);
+        if(nice){
+          free(name_output);
+        }
+      } while(1);
+      rewind(mrna);
+      snofree_arrays(strlen(string_s));  /* free's base_pair */
+      free(string_s);string_s=NULL;
+      free(name_s);name_s=NULL;
+    } while (1);
+  }
+  else{
+    if(tname==NULL || sname==NULL) RNAsnoop_cmdline_parser_print_help();
+    sno=fopen(sname, "r");
+    if(sno==NULL){printf("%s: Wrong snoRNA file name\n", sname);return 0;}
+    mrna=fopen(tname, "r");
+    if(mrna==NULL){printf("%s: Wrong target file name\n", tname);return 0;}
+    char *temp1[MAX_NUM_NAMES], *temp2[MAX_NUM_NAMES],*AS1[MAX_NUM_NAMES], *AS2[MAX_NUM_NAMES], *names1[MAX_NUM_NAMES], *names2[MAX_NUM_NAMES];
+    int n_seq, n_seq2;
+    n_seq =  read_clustal(mrna, temp1, names1);
+    n_seq2 = read_clustal(sno, temp2, names2);
+    if (n_seq != n_seq2){
+      for (i=0; temp1[i]; i++) {
+        free(temp1[i]); 
+        free(temp2[i]); 
+      }  
+      nrerror("unequal number of seqs in alignments");
+    }
+    for(i=0;temp1[i];i++){
+      AS1[i] = (char*) space((strlen(temp1[i])+11)*sizeof(char));
+      AS2[i] = (char*) space((strlen(temp2[i])+11)*sizeof(char));
+      strcpy(AS1[i],"NNNNN");
+      strcpy(AS2[i],"NNNNN");
+      strcat(AS1[i],temp1[i]);
+      strcat(AS2[i],temp2[i]);
+      strcat(AS1[i],"NNNNN\0");
+      strcat(AS2[i],"NNNNN\0");
+    }
+    for (i=0; temp1[i]; i++) {
+      free(temp1[i]); 
+      free(temp2[i]); 
+    }  
+    AS1[n_seq]=NULL;
+    AS2[n_seq]=NULL;
+    update_fold_params();
+    alisnofold((const char **)AS2, max_asymm, threshloop, min_s2, max_s2, half_stem, max_half_stem);
+     snoopT struc; 
+     struc = alisnoopfold((const char**) AS1, (const char**) AS2,  
+                  penalty, threshloop,   
+                          threshLE,threshRE,threshDE,threshD, 
+                  half_stem, max_half_stem,  
+                  min_s2, max_s2, min_s1, 
+                         max_s1, min_d1, min_d2); 
+     if(!(struc.structure==NULL)){ 
+       aliprint_struc(&struc, (const char**) AS1,(const char**) AS2, names1, names2,0,nice); 
+       free(struc.structure); 
+     }
+    
+
+
+    snoopT* subopt = alisnoop_subopt((const char**) AS1, (const char**) AS2, delta, 5, penalty, threshloop,                              
+                                      threshLE,threshRE, threshDE, threshD,
+                                      threshTE,threshSE,distance,                     
+                                      half_stem, max_half_stem, min_s2, max_s2,  
+                                      min_s1, max_s1, min_d1, min_d2); 
+    
+
+    snoopT *sub; 
+    if(subopt==NULL){
+      printf("no target found under the given constraints\n");
+    }else{
+      int count=1;
+      for (sub=subopt; !(sub->structure ==NULL); sub++) { 
+        aliprint_struc(sub, (const char**) AS1,(const char**) AS2,names1,names2,count,nice); 
+        free(sub->structure); 
+        count++;
+      } 
+    }
+
+     alisnofree_arrays(strlen(AS2[0])); 
+     free(subopt); 
+    for (i=0; temp1[i]; i++) {
+      free(AS1[i]); 
+      free(AS2[i]); 
+      free(names1[i]);
+      free(names2[i]);
+    }  
+    
+  } 
+  fclose(sno);
+  fclose(mrna);
+  return 0;
+}
+
+static void print_struc(snoopT  *dup, const char *s1, const char *s2, char *name_s, char *name_t, int count, int nice) {
+  int l1;
+  l1 = strchr(dup->structure, '&')-dup->structure;
+  char *target_struct;
+  int shift=0, n2;
+  char* psoutput;
+  psoutput = (char*) space(100*sizeof(char));
+/*   if(dup->i > strlen(s1)-10){ */
+/*         dup->i--; */
+/*         l1--; */
+/*   } */
+/*   if(dup->i-l1< 0){ */
+/*         l1--; */
+/*         shift++; */
+/*   } */
+  target_struct = (char*) space(sizeof(char) * (strlen(dup->structure)+1));
+  strncpy(target_struct, dup->structure+shift, l1);
+  strncat(target_struct, dup->structure + (strchr(dup->structure, '&')-dup->structure), strlen(dup->structure) - (strchr(dup->structure, '&')-dup->structure));
+  strcat(target_struct,"\0");
+  char *target;
+  target = (char *) space(l1+1);
+  strncpy(target, (s1+dup->i-l1+5), l1);
+  target[l1]='\0';
+  char *s4;
+  n2 = strlen(s2);
+  s4 = (char*) space(sizeof(char) *(n2-9));
+  strncpy(s4, s2+5, n2-10);
+  s4[n2-10]='\0';
+  printf("%s %3d,%-3d;%3d : %3d,%-3d (%5.2f = %5.2f + %5.2f + %5.2f + %5.2f + 4.1 ) (%5.2f) \n%s&%s\n", 
+        target_struct, dup->i+1-l1,
+         dup->i, dup->u, dup->j+1, dup->j + (strrchr(dup->structure,'>') - strchr(dup->structure, '>'))+1, 
+         (dup->Loop_D + dup->Duplex_El + dup->Duplex_Er + dup->Loop_E) + 4.10, 
+         dup->Duplex_El, dup->Duplex_Er, dup->Loop_E, dup->Loop_D,dup->fullStemEnergy,target,s4);
+  if(nice){
+    char *temp_seq;
+    char *temp_struc;
+    temp_seq = (char*) space(sizeof(char)*(l1+n2-9));
+    temp_struc = (char*) space(sizeof(char)*(l1+n2-9));
+    strcpy(temp_seq, target);
+    strcat(temp_seq, s4);
+    strncpy(temp_struc, target_struct, l1);
+    strcat(temp_struc, target_struct+l1+1);
+    temp_seq[n2+l1-10]='\0';
+    temp_struc[n2+l1-10]='\0';
+    cut_point = l1+1;
+    char str[16];char upos[16];
+    char *temp; 
+    int length_name = strlen(name_t)+strlen(name_s);
+    temp = (char *) space(sizeof(char)*(length_name+1));
+    strcpy(temp,name_t+1);
+    strcat(temp,"_");
+    strcat(temp,name_s + 1);
+    temp[length_name] = '\0';
+    strcpy(psoutput,"sno_");
+    sprintf(str,"%d",count);
+    strcat(psoutput,str);
+    sprintf(upos,"%d",dup->u);
+    strcat(psoutput,"_u_");
+    strcat(psoutput,upos);
+    strcat(psoutput,"_");
+    strcat(psoutput,temp);
+    strcat(psoutput,".ps\0");
+    PS_rna_plot_snoop_a(temp_seq, temp_struc, psoutput, NULL, NULL);
+    cut_point = -1;
+    free(temp_seq);free(temp_struc);free(psoutput);free(temp);
+  }
+free(s4);
+free(target_struct);
+free(target);
+}
+
+
+static void aliprint_struc(snoopT  *dup, const char **s1, const char **s2, char **name_t, char **name_s,int count,int nice) {
+  int l1;
+  l1 = strchr(dup->structure, '&')-dup->structure;
+  char *target_struct;
+  int shift=0;
+/*   if(dup->i > strlen(s1[0])-10){ */
+/*     dup->i--; */
+/*     l1--; */
+/*   } */
+/*   if(dup->i-l1< 0){ */
+/*     l1--; */
+/*     shift++; */
+/*   } */
+  int length_struct = strlen(dup->structure);
+  target_struct = (char*) space(sizeof(char) * (length_struct+1));
+  strncpy(target_struct, dup->structure+shift, l1);
+  strncat(target_struct, dup->structure + (strchr(dup->structure, '&')-dup->structure), length_struct - (strchr(dup->structure, '&')-dup->structure));
+  strcat(target_struct,"\0");
+  /* get the corresponding alignment slice */
+  int n_seq,s;
+  for(s=0; s1[s]!=NULL; s++);
+  n_seq=s;
+  int n1,n2;
+  n1=strlen(s1[0]);n2=strlen(s2[0]);  
+  char **target;
+  target = (char**) space((n_seq+1)*sizeof(char*));
+  for(s=0;s<n_seq;s++){
+    target[s] = (char *) space((l1 + n2-8)*sizeof(char));
+    strncpy(target[s], (s1[s]+dup->i-l1+5), l1);
+    strcat(target[s],"&");
+    strncat(target[s], (s2[s]+5), n2-10);
+    target[s][l1+n2-9]='\0';
+  }
+  char * consens;
+  consens =  consens_mis((const char**)target);  
+  consens[l1]='&';
+
+  printf("%s %3d,%-3d;%3d : %3d,%-3d (%5.2f = %5.2f + %5.2f + %5.2f + %5.2f + 4.1; duplex cov = %5.2f; stem cov = %5.2f )\n%s\n",  
+          dup->structure, dup->i+1-l1, 
+          dup->i, dup->u, dup->j+1, dup->j + (strrchr(dup->structure,'>') - strchr(dup->structure, '>'))+1,
+          (dup->Loop_D + dup->Duplex_El + dup->Duplex_Er + dup->Loop_E)/n_seq + 4.10,  
+          dup->Duplex_El/n_seq, dup->Duplex_Er/n_seq, dup->Loop_E/n_seq, dup->Loop_D/n_seq,dup->pscd/n_seq, dup->psct/n_seq,consens ); 
+  if(nice){
+    char* psoutput;
+    psoutput = (char*) space(100*sizeof(char));
+    
+    char *temp_seq, *temp_struct, **temp_target;  
+    temp_seq    = (char*) space((l1 + n2 -9)*sizeof(char));
+    temp_struct = (char*) space((l1 + n2 -9)*sizeof(char));
+    temp_target = (char**) space((n_seq+1)*sizeof(char*));
+    for(s=0;s<n_seq;s++){
+      temp_target[s] = (char *) space((l1 + n2-9)*sizeof(char));
+      strncpy(temp_target[s], (s1[s]+dup->i-l1+5), l1);
+      strncat(temp_target[s], (s2[s]+5), n2-10);
+      temp_target[s][l1+n2-10]='\0';
+    }
+    strncpy(temp_seq, consens, l1);
+    strncpy(temp_struct, target_struct, l1);
+    strcat(temp_seq, consens+l1+1);
+    strcat(temp_struct, target_struct+l1+1);
+    temp_seq[n2-10+l1]='\0';
+    temp_struct[n2-10+l1]='\0';
+    char str[16];
+    char upos[16];
+    char *temp; 
+    int length_name = strlen(name_t[0]) + strlen(name_s[0])+1;
+    temp = (char *) space(sizeof(char)*(length_name+1));
+    strcpy(temp,name_t[0]);
+    strcat(temp,"_");
+    strcat(temp, name_s[0]);
+    temp[length_name] = '\0';
+    strcpy(psoutput,"snoaln_");
+    sprintf(str,"%d",count);
+    strcat(psoutput,str);
+    sprintf(upos,"%d",dup->u);
+    strcat(psoutput,"_u_");
+    strcat(psoutput,upos);
+    strcat(psoutput,"_");
+    for(s=0; s<length_name; s++){
+      if(temp[s]=='/') temp[s]='-';
+    }
+    strcat(psoutput,temp);
+    strcat(psoutput,".ps\0");
+    /*   psoutput[strlen(temp)+4+strlen(str)+39]='\0'; */
+    cut_point = l1+1;
+    aliPS_color_aln(dup->structure, psoutput, (const char**) target, (const char**) name_t);  
+    psoutput[1]='t';
+    psoutput[2]='r';
+    PS_rna_plot_snoop_a(temp_seq, temp_struct, psoutput, NULL, (const char**) temp_target);
+    cut_point = -1;
+    free(psoutput);
+    for(s=0; s<n_seq; s++){
+      free(temp_target[s]);
+    } 
+    free(temp);
+    free(temp_seq);
+    free(temp_struct);
+    free(temp_target);
+  }
+  for(s=0; s<n_seq; s++){
+    free(target[s]);
+  }
+  free(consens);
+  free(target_struct);
+  free(target);
+}
+
+static int get_max_u(const char *s, char delim){
+  char * pch;
+  int total;
+  total=0;
+  pch = strchr(s, delim);
+  total++;
+  while(pch!=NULL){
+    pch=strchr(pch+1, delim);
+    total++;
+  }
+  return total-2;
+}
+
+
+
+static int ** read_rnaup(char *fname, const int beg, const int end)
+{
+  FILE *in = fopen(fname,"r"); /*  open RNA_up file */
+        
+  int i,j;
+  int **access;
+  int offset, temp;
+  temp=0; offset=0;
+  int seq_pos;
+  int beg_r, end_r;
+  beg_r=beg;
+  end_r=end;
+
+  if(in==NULL){
+    printf("%s", fname);
+    perror("RNAup File open error here, Computing next target");
+    exit(EXIT_FAILURE);
+  }
+  char tmp[2048]={0x0};
+  /* char *ptr; */
+
+
+  if(fgets(tmp,sizeof(tmp),in)==0){
+    perror("Empty File");
+  }
+  if(strchr(tmp,'>')){
+    fprintf(stderr,"file %s is not in RNAup format\n",fname);
+    exit(EXIT_FAILURE);
+  }
+  
+  while(!strstr(fgets(tmp,sizeof(tmp),in), "pos")){};
+ /*  (void) fgets(tmp,sizeof(tmp),in); //Datum  */
+/*   (void) fgets(tmp,sizeof(tmp),in); //white line */
+/*   (void) fgets(tmp,sizeof(tmp),in); //RNAup  */
+/*   (void) fgets(tmp,sizeof(tmp),in); //sequence length */
+/*   (void) fgets(tmp,sizeof(tmp),in); //sequence */
+
+  int dim_x;
+  dim_x = get_max_u(tmp,'S'); /*  get unpaired regions by conting tabs in second line */
+  access = (int**) space(sizeof(int *) * (dim_x+2));
+  for(i=0; i< dim_x+2; i++){
+    access[i] =(int *) space(sizeof(int) * (end_r-beg_r+7));
+  }
+  for(i=0;i<end_r -  beg_r +6;i++){
+    for(j=0;j<dim_x+2;j++){
+      access[j][i]=INF;
+    }
+  }
+  access[0][0]=dim_x+2;
+  while(fgets(tmp,sizeof(tmp),in)!=0 && --end_r > -1) /* read a record */
+  {
+    float n;
+    /* int i; */
+    /* int u; */
+    beg_r--;
+    if(beg_r<1){ 
+      if(sscanf(tmp,"%d%n",&seq_pos,&temp)==1){ /*  read sequenz pos = 1. spalte */
+        offset+=temp;
+        int count;
+        count=1;
+        while(sscanf(tmp+offset,"%f%n",&n,&temp)==1){ /* read columns */
+          offset+=temp;
+          access[count][-beg_r+5+1]=(int) rint(100*n); /* seq_pos+5 */
+          /*           printf("%d %d %f\n", count, -beg_r, access[count][-beg_r]); */
+          count++;
+        }
+        offset=0;
+      }
+    }
+  }
+  fclose(in);
+  return access;
+}
+
+
+
+
+
+
+
+static int ** read_plfold_i(char *fname, const int beg, const int end)
+{
+  FILE *in=fopen(fname,"r");
+  int i,j;
+  int **access;
+  int offset,temp;
+  temp=0;offset=0;
+  int seq_pos;
+  int beg_r, end_r;
+  beg_r=beg;
+  end_r=end;
+  
+  if(in==NULL){
+    perror(" open error");
+    exit(EXIT_FAILURE);
+  }
+  
+  char tmp[2048]={0x0};
+  /* char *ptr; */
+  if(fgets(tmp,sizeof(tmp),in)==0){
+    perror("Empty File");
+  }
+  if(strchr(tmp,'>')){
+    fprintf(stderr,"file %s is not in RNAplfold format",fname);
+    exit(EXIT_FAILURE);
+  }
+  if(fgets(tmp,sizeof(tmp),in)==0){
+    perror("No accessibility data");
+  }
+  int dim_x;
+  dim_x=get_max_u(tmp,'\t');
+  access = (int**) space(sizeof(int *) * (dim_x+2));
+  for(i=0; i< dim_x+2; i++){
+    access[i] =(int *) space(sizeof(int) * (end_r-beg_r+1));
+  }
+  
+  for(i=0;i<end_r -  beg_r +1;i++){
+    for(j=0;j<dim_x+2;j++){
+      access[j][i]=INF;
+    }
+  }
+  access[0][0]=dim_x+2;
+  while(fgets(tmp,sizeof(tmp),in)!=0 && --end_r > -1) /* read a record */
+    {
+      float n;
+      /* int i; */
+      /* int u; */
+      beg_r--;
+      if(beg_r<1){
+        if(sscanf(tmp,"%d\t%n",&seq_pos,&temp)==1){
+          offset+=temp;
+          int count;
+          count=1;
+          while(sscanf(tmp+offset,"%f%n",&n,&temp)==1 ){
+            offset+=temp;
+            access[count][seq_pos+5]=(int)  rint( 100 * n); /* round the number */
+            count++;
+          }
+          offset=0;
+        }
+      }
+      
+    }
+  fclose(in);
+  return access;
+}
+
+
+
+static void redraw_output(char *fname, char *output, int plfold_up_flag, char *suffix, char *access, char *sname, char *tname)
+{
+  char *line;
+  line=NULL;
+  int count;
+  short two_seq = 0;
+  char *results;
+  char *sequence;
+  char *query;
+  char *target;
+  char *structure;
+  char *pos;
+  int posi;
+  int begin=0, end=0, u=0;
+  if(output==NULL){
+    output = (char*) space(sizeof(char)*2);
+    strcpy(output,".\0");
+  }
+  count=0;
+  if(sname==NULL && tname==NULL){
+    while((line=get_line(stdin))!=NULL) {
+      count++;
+      if(two_seq==0 && *line =='>'){
+        query=(char*) space(strlen(line)+1);
+        (void) sscanf(line,"%s",query);
+        free(line);
+        line=NULL;
+        memmove(query, query+1, strlen(query));
+        two_seq++;
+      }
+      else if(two_seq==1 && *line =='>'){
+        target=(char*) space(strlen(line)+1);
+        (void) sscanf(line,"%s",target);
+        free(line);
+        line=NULL;
+        memmove(target, target+1, strlen(target));
+        two_seq++;
+      }
+      else if(two_seq == 2) {
+        int *relative_access;
+        relative_access=NULL;
+        printf("%s %s\n", target,query);
+        if(strchr(line, '(') && strchr(line,'&') && strchr(line, '(')&& strchr(line, ',') && strchr(line,':') && strchr(line, '-')){
+          results=line;
+          int length;
+          pos = strchr(results, ' ');
+          posi = (int)  (pos - results);
+          length = posi;
+          structure = (char *) space((length+1) * sizeof(char));
+          sscanf(results,"%s",structure); /* parse structure */
+          char *line2;
+          if((line2=get_line(stdin))!=NULL){
+            sequence=(char *) space((length+1)* sizeof(char));
+            sscanf(line2,"%s",sequence);
+            if(line2!=NULL){
+              free(line2);
+            }
+          }
+          else{
+            printf("your file is fucked up");exit(0);
+          } /* parse sequence */
+          
+          sscanf(pos, "%10d,%10d;%10d", &begin,&end,&u); /* parse coordinates */
+          if(plfold_up_flag){
+            int **access_s1;
+            char *file_s1;
+            /* read_rnaup_file */
+            file_s1 = (char*) space(sizeof(char) * (strlen(target)+strlen(suffix)+strlen(access)+3));
+            strcpy(file_s1, access);
+            strcat(file_s1, "/");
+            strcat(file_s1, target);
+            strcat(file_s1, "_");
+            strcat(file_s1, suffix);
+            access_s1 = read_rnaup(file_s1, begin, end);
+            free(file_s1);
+            relative_access = (int*) space(sizeof(int)*(end-begin+2));
+            relative_access[0]=access_s1[1][1+5];
+            int i;
+            for(i=2;i<(end-begin+2);i++){
+              relative_access[i-1]=access_s1[i+1][i+5] - access_s1[i][i+4];
+            }
+            int l = access_s1[0][0];
+            while(--l>-1){
+              free(access_s1[l]);
+            }
+            free(access_s1);
+          }
+          char *catseq, *catstruct,*output_file;
+          catseq = (char*) space(strlen(sequence)  *sizeof(char));
+          catstruct = (char*) space(strlen(structure)  *sizeof(char));
+          int l1 = strchr(structure, '&')-structure;
+          strncpy(catseq, sequence, l1);
+          strcat(catseq, sequence+l1+1);
+          strncpy(catstruct, structure, l1);
+          strcat(catstruct, structure+l1+1);
+          strcat(catseq,"\0");
+          strcat(catstruct,"\0");
+          
+          /* printf("%s\n%s\n%s\n%s", catseq,sequence,catstruct,structure); */
+          cut_point=l1+1;
+          output_file = (char*) space((strlen(output) + strlen(query)+strlen(target)+50)*sizeof(char));
+          strcpy(output_file,output);
+          strcat(output_file, "/");
+          strcat(output_file,"sno_");
+          strcat(output_file,query);
+          strcat(output_file,"_");
+          strcat(output_file, target);
+          strcat(output_file,"_u_");
+          char str[9];
+          sprintf(str,"%d",u);
+          strcat(output_file,str);
+          strcat(output_file,"_");
+          sprintf(str,"%d",count);
+          strcat(output_file,str);
+          strcat(output_file,".ps\0");
+          PS_rna_plot_snoop_a(catseq, catstruct, output_file,relative_access,NULL);
+          if(relative_access){
+            free(relative_access);
+          }
+          free(output_file);output_file=NULL;
+          free(catseq);catseq=NULL;
+          free(catstruct);catstruct=NULL;
+          free(structure);
+          free(sequence);     
+          free(line);
+          line=NULL;
+        }
+        else if(*line=='>'){
+          free(query);free(target);
+          two_seq=1;
+          query = (char*) space(sizeof(char)*(strlen(line)+1));
+          (void) sscanf(line,"%s",query); 
+          free(line);
+          memmove(query, query+1, strlen(query));
+        }
+      }
+    }
+    free(target);
+    free(query);
+  }
+  else if(!(tname==NULL && sname==NULL)) {
+    FILE* sno, *mrna;
+    int i;
+    sno=fopen(sname, "r");
+    if(sno==NULL){printf("%s: Wrong snoRNA file name\n", sname);}
+    mrna=fopen(tname, "r");
+    if(mrna==NULL){printf("%s: Wrong target file name\n", tname);}
+    char *temp1[MAX_NUM_NAMES], *temp2[MAX_NUM_NAMES], *AS1[MAX_NUM_NAMES], *AS2[MAX_NUM_NAMES], *names1[MAX_NUM_NAMES], *names2[MAX_NUM_NAMES];
+    int n_seq, n_seq2;
+    n_seq =  read_clustal(mrna, temp1, names1);
+    n_seq2 = read_clustal(sno, temp2, names2);
+    if (n_seq != n_seq2){
+      for (i=0; temp1[i]; i++) {
+        free(temp1[i]); 
+        free(temp2[i]); 
+      }  
+      nrerror("unequal number of seqs in alignments");
+    }
+    for(i=0;temp1[i];i++){
+      AS1[i] = (char*) space((strlen(temp1[i])+11)*sizeof(char));
+      AS2[i] = (char*) space((strlen(temp2[i])+11)*sizeof(char));
+      strcpy(AS1[i],"NNNNN");
+      strcpy(AS2[i],"NNNNN");
+      strcat(AS1[i],temp1[i]);
+      strcat(AS2[i],temp2[i]);
+      strcat(AS1[i],"NNNNN\0");
+      strcat(AS2[i],"NNNNN\0");
+    }
+    for (i=0; temp1[i]; i++) {
+      free(temp1[i]); 
+      free(temp2[i]); 
+    }  
+    AS1[n_seq]=NULL;
+    AS2[n_seq]=NULL;
+    int count=0;
+    while((line=get_line(stdin))!=NULL) {
+      results=line;
+      if(strchr(line, '(') && strchr(line,'&') && strchr(line, '(')&& strchr(line, ',') && strchr(line,':') && strchr(line, '-')) {
+        count++;
+        int length;
+        /* int sbegin, send; */
+        /* int energy; */
+        snoopT dup;
+        pos = strchr(results, ' ');
+        posi = (int)  (pos - results);
+        length = posi;
+        dup.structure = (char *) space((length+1) * sizeof(char));
+        sscanf(results,"%s %10d,%10d;%10d : %10d,%10d (%10f = %10f + %10f + %10f + %10f + 4.1; duplex cov = %10f; stem cov = %10f",
+               dup.structure,
+               &begin,
+               &(dup.i),
+               &(dup.u),
+               &(dup.j),
+               &end,
+               &(dup.energy),
+               &(dup.Duplex_El),
+               &(dup.Duplex_Er),
+               &(dup.Loop_E),
+               &(dup.Loop_D),
+               &(dup.pscd),
+               &(dup.psct)); /* parse duplex stuff; */
+        dup.energy*=n_seq;
+        dup.Duplex_El*=n_seq;
+        dup.Duplex_Er*=n_seq;
+        dup.Loop_E*=n_seq;
+        dup.Loop_D*=n_seq;
+        aliprint_struc(&dup, (const char**) AS1, (const char**)AS2, names1, names2,count,1);
+        free(dup.structure);
+        free(line);
+      }
+      else{
+        free(line);
+      }
+    }
+    
+    for (i=0; AS1[i]; i++) {
+      free(AS1[i]); 
+      free(AS2[i]); 
+        free(names1[i]); 
+      free(names2[i]);
+    }  
+    fclose(mrna);
+    fclose(sno);
+  }
+  /*   free(output); */
+}