]> git.donarmstrong.com Git - biopieces.git/blob - bp_bin/plot_scores
added ugly fix to ruby gnuplot dumb print problem
[biopieces.git] / bp_bin / plot_scores
1 #!/usr/bin/env ruby
2
3 # Copyright (C) 2007-2012 Martin A. Hansen.
4
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
9
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18
19 # http://www.gnu.org/copyleft/gpl.html
20
21 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
22
23 # Plot a histogram of mean sequence quality scores.
24
25 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
26
27 require 'maasha/biopieces'
28 require 'maasha/seq'
29 require 'gnuplot'
30 require 'narray'
31
32 terminals = "dumb,x11,aqua,post,pdf,png,svg"
33 title     = "Mean Quality Scores"
34 xlabel    = "Sequence position"
35 ylabel    = "Mean score"
36
37 casts = []
38 casts << {:long=>'no_stream', :short=>'x', :type=>'flag',   :mandatory=>false, :default=>nil,    :allowed=>nil,       :disallowed=>nil}
39 casts << {:long=>'count',     :short=>'c', :type=>'flag',   :mandatory=>false, :default=>nil,    :allowed=>nil,       :disallowed=>nil}
40 casts << {:long=>'data_out',  :short=>'o', :type=>'file',   :mandatory=>false, :default=>nil,    :allowed=>nil,       :disallowed=>nil}
41 casts << {:long=>'terminal',  :short=>'t', :type=>'string', :mandatory=>false, :default=>'dumb', :allowed=>terminals, :disallowed=>nil}
42 casts << {:long=>'title',     :short=>'T', :type=>'string', :mandatory=>false, :default=>title,  :allowed=>nil,       :disallowed=>nil}
43 casts << {:long=>'xlabel',    :short=>'X', :type=>'string', :mandatory=>false, :default=>xlabel, :allowed=>nil,       :disallowed=>nil}
44 casts << {:long=>'ylabel',    :short=>'Y', :type=>'string', :mandatory=>false, :default=>ylabel, :allowed=>nil,       :disallowed=>nil}
45
46 options = Biopieces.options_parse(ARGV, casts)
47
48 SCORES_MAX = 100_000
49
50 scores_vec = NArray.int(SCORES_MAX)
51 count_vec  = NArray.int(SCORES_MAX)
52 max        = 0
53
54 Biopieces.open(options[:stream_in], options[:stream_out]) do |input, output|
55   input.each_record do |record|
56     if record[:SCORES]
57       scores = record[:SCORES]
58
59       if scores.length > 0
60         raise BiopiecesError, "score string too long: #{scores.length} > #{SCORES_MAX}" if scores.length > SCORES_MAX
61
62         scores_vec[0 ... scores.length] += NArray.to_na(scores, "byte") - Seq::SCORE_BASE
63         count_vec[0 ... scores.length]  += 1
64
65         max = scores.length if scores.length > max
66       end
67     end
68
69     output.puts record unless options[:no_stream]
70   end
71 end
72
73 mean_vec   = NArray.sfloat(max)
74 mean_vec   = scores_vec[0 ... max].to_f / count_vec[0 ... max]
75 count_vec  = count_vec[0 ... max].to_f
76 count_vec *= (Seq::SCORE_MAX / count_vec.max(0).to_f)
77
78 x  = (1 .. max).to_a
79 y1 = mean_vec.to_a
80 y2 = count_vec.to_a
81
82 Gnuplot.open do |gp|
83   Gnuplot::Plot.new(gp) do |plot|
84     plot.terminal options[:terminal]
85     plot.title    options[:title]
86     plot.xlabel   options[:xlabel]
87     plot.ylabel   options[:ylabel]
88     plot.output   options[:data_out] || "/dev/stderr"
89     plot.xrange   "[#{x.min - 1}:#{x.max + 1}]"
90     plot.yrange   "[#{Seq::SCORE_MIN}:#{Seq::SCORE_MAX}]"
91     plot.style    "fill solid 0.5 border"
92     plot.xtics    "out"
93     plot.ytics    "out"
94     
95     plot.data << Gnuplot::DataSet.new([x, y1]) do |ds|
96       ds.with  = "boxes"
97       ds.title = "mean score"
98     end
99
100     if options[:count]
101       plot.data << Gnuplot::DataSet.new([x, y2]) do |ds|
102         ds.with  = "lines lt rgb \"black\""
103         ds.title = "relative count"
104       end
105     end
106   end
107 end
108
109
110 # >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
111
112
113 __END__