WSTester updated to work plus hopefully all the other changes that need to go into...
[jabaws.git] / binaries / src / ViennaRNA / Utils / relplot.pl
diff --git a/binaries/src/ViennaRNA/Utils/relplot.pl b/binaries/src/ViennaRNA/Utils/relplot.pl
new file mode 100644 (file)
index 0000000..26d6733
--- /dev/null
@@ -0,0 +1,190 @@
+#!/usr/bin/perl -w
+# -*-CPerl-*-
+# Last changed Time-stamp: <2012-11-19 17:22:03 ivo>
+# $Id: relplot.pl,v 1.10 2008/10/09 07:11:21 ivo Exp $
+# colorize a secondary structure plot with reliability annotation
+# from positional entropy
+use strict;
+use Getopt::Std;
+$main::VERSION = 1.3;
+$Getopt::Std::STANDARD_HELP_VERSION=1;
+
+our ($opt_p, $opt_a);
+getopts('pa');
+
+sub HELP_MESSAGE {
+  print STDERR "\nusage: $0 [-p] FOO_ss.ps FOO_dp.ps > FOO_rss.ps\n";
+  print STDERR "For more details run\n\tperldoc -F $0\n";
+}
+
+HELP_MESSAGE() unless $#ARGV >0;
+my $macro_seen= 0;
+my %mfe = ();        # hash of mfe pairs
+my @ss_ps = ('',''); # head and tail of the ss.ps file
+
+my $n = swallow_ss_ps();    # read ss plot
+my @sp = posent();   # read dot plot and compute entropies
+my $Smax = ($opt_p || $opt_a) ? 1 : 0;
+if (!$opt_p) {
+  foreach (@sp) {
+    $Smax = $_ if $_>$Smax;
+  }
+  $Smax = ($Smax>0.2) ? sprintf("%3.1f", $Smax) : 0.2 ;
+
+}
+print $ss_ps[0];     # print head
+if (!$macro_seen) {
+  print <<_E_O_F_
+/range 0.8 def
+/drawreliability {
+  /Smax $Smax def
+  0
+  coor {
+    aload pop
+    S 3 index get
+    Smax div range mul
+    invert {range exch sub} if
+    1 1 sethsbcolor
+    newpath
+    fsize 2 div 0 360 arc
+    fill
+    1 add
+  } forall
+} bind def
+/colorbar { % xloc yloc colorbar -> []
+  /STR 8 string def
+  gsave
+    xmin xmax add size sub 2 div
+    ymin ymax add size sub 2 div translate
+    size dup scale
+    translate
+    0.015 dup scale
+    /tics 64 def
+    gsave
+      10 tics div 1 scale
+      0 1 tics
+      {
+         dup 0 moveto 0.5 add
+         tics div range mul
+         invert {range exch sub} if
+         1 1 sethsbcolor
+         1 0 rlineto 0 1 rlineto -1 0 rlineto closepath fill
+      } for
+    grestore
+    0 setgray
+    -0.1 1.01 moveto (0) gsave 0.1 dup scale show grestore
+    10 1.01 moveto Smax STR cvs
+    gsave 0.1 dup scale dup stringwidth pop -2 div 0 rmoveto show grestore
+  grestore
+} bind def
+_E_O_F_
+}
+print "/S [\n";
+foreach (@sp) {
+  printf "  %7.5f\n", $_;
+}
+print "] def\n\n";
+print "/invert ", $opt_p||$opt_a ? 'true' : 'false', " def\n";
+print "drawreliability\n";
+print "0.1 0.1 colorbar\n";
+print $ss_ps[1];  # print tail
+
+sub swallow_ss_ps {
+  # read the secondary structure plot
+  my $length=0;
+  my $tail=0;
+  while (<>) {
+    $macro_seen=1 if /drawreliability /;
+    $length ++ if /^\/coor/ .. /^\] def/;
+    if (/^\/pairs/ .. /^\] def/) {
+      $mfe{$1,$2}=1 if /(\d+)\s+(\d+)/;
+    }
+    $tail=1 if /^drawoutline/;
+    $ss_ps[$tail] .= $_;
+    last if eof;
+  }
+  return $length-2;
+}
+
+sub posent {
+  # compute positional entropy from pair probs in the dot plot file
+  # or, with $opt_p, find pair probs corresponding to mfe pairs
+  my @pp;
+  my @sp;
+  while (<>) {
+    next unless /(\d+)\s+(\d+)\s+([0-9.Ee-]+)\s+ubox/;
+    my ($i, $j, $p) = ($1, $2, $3);
+
+    $p *= $p;
+    if ($opt_p) {
+      $sp[$i] = $sp[$j] = $p if exists  $mfe{$i,$j};
+    } else {
+      if ($opt_a) {
+       $sp[$i] = $sp[$j] = 1-$p if exists  $mfe{$i,$j};
+      } else {
+       my $ss = ($p>0)?$p*log($p):0;
+       $sp[$i] += $ss;
+       $sp[$j] += $ss;
+      }
+    }
+    $pp[$i] += $p;
+    $pp[$j] += $p;
+  }
+  my $log2 = log(2);
+  for my $i (1..$n) {
+    no warnings;  # $p[$i] may be undef
+    if ($opt_p || $opt_a) {
+      $sp[$i] = 1-$pp[$i] if !defined $sp[$i];
+    } else {
+      $sp[$i] += ($pp[$i]<1) ? (1-$pp[$i])*log(1-$pp[$i]) : 0;
+      $sp[$i] /= -$log2;
+    }
+  }
+  shift @sp; # get rid of [0] entry
+  return @sp;
+}
+
+=head1 NAME
+
+relplot - annotate a secdonary structure plot with reliability information
+
+=head1 SYNOPSIS
+
+   relplot [-p] [-a] file_ss.ps file_dp.ps > file_rss.ps
+
+=head1 DESCRIPTION
+
+relplot reads an RNA secondary structure plot and a dot plot
+containing pair probabilities, as produces by C<RNAfold -p>, and
+writes a new secondary structure with reliability annotation to
+stdout.  The anotation is used to colorize the plot and can use either
+"positional entropy" (default), or pair probabilities (with -p).
+
+Positional entropies are computed from the pair probabilities as
+C<S(i) = - Sum_i p(ij) log(p(ij))>. Low entropy regions have little
+structural flexibility and the reliability of the predicted structure
+is high. High entropy implies many structural alternatives. While
+these alternatives may be functionally important, they make structure
+prediction more difficult and thus less reliable.
+
+If the -p switch is given, the script colors base pairs by their pair
+probability, unpaired bases use the probability of being unpaired.
+
+If the -a switch is given, the script colors base pairs by their accessibility, i.e. the probability of being unpaired.
+
+Entropy (repsectively probability) is encoded as color hue, ranging
+from red for low entropy, well-defined regions, (high probability
+pairs) via yellow and green to blue and violet for regions with very
+high entropy (low probability).
+
+You may have to manually move the color legend to a convenient
+position. Just edit the postscript file and change the two numbers in the
+line reading C<0.1 0.1 colobar>. Or delete the line to remove the legend.
+
+=head1 AUTHOR
+
+Ivo L. Hofacker <ivo@tbi.univie.ac.at>
+
+=cut
+
+#  End of file