annotate cpt_psm_prep/lib/CPT/Analysis/PAUSE/SVG.pm @ 0:e4de0a0e90c8 draft

Uploaded
author cpt
date Tue, 05 Jul 2022 05:38:34 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
1 package CPT::Analysis::PAUSE::SVG;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
2
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
3 # ABSTRACT: Library for use in PAUSE analysis
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
4 use strict;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
5 use warnings;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
6 use Moose;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
7 use Data::Dumper;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
8 use List::MoreUtils qw(each_array);
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
9 use SVG;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
10
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
11 has 'svg' => ( is => 'rw' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
12 has 'width' => ( is => 'rw', isa => 'Int' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
13 has 'height' => ( is => 'rw', isa => 'Int' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
14 has 'vertical_offset' => ( is => 'rw', isa => 'Int' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
15 has 'start_end_max_num' => ( is => 'rw', isa => 'Int' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
16 has 'num_rows' => ( is => 'rw', isa => 'Int' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
17 has 'row_size' => ( is => 'rw', isa => 'Int' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
18 has 'row_width' => ( is => 'rw', isa => 'Int' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
19 has 'x_border' => ( is => 'rw', isa => 'Int' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
20 has 'y_border' => ( is => 'rw', isa => 'Int' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
21 has 'line_height' => ( is => 'rw', isa => 'Int' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
22 has 'inter_line_spacing' => ( is => 'rw', isa => 'Int' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
23 has 'max' => ( is => 'rw', isa => 'Int' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
24 has 'fasta_id' => ( is => 'rw', isa => 'Any' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
25
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
26 sub setup {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
27 my ($self) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
28 $self->svg(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
29 SVG->new(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
30 width => $self->width(),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
31 height => $self->height(),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
32 )
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
33 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
34 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
35
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
36 sub add_header {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
37 my ( $self, @refs ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
38
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
39 $self->plot_title( 'Plot of ' . $self->fasta_id() );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
40
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
41 my $i = 0;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
42 foreach (@refs) {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
43 my @subrefs = @{$_};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
44 foreach (@subrefs) {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
45 $i++;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
46 my %d = %{$_};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
47 $self->plot_key( $d{name}, $d{line}, $d{fill}, $i );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
48 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
49 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
50 $self->vertical_offset( $self->vertical_offset() - ( $i - 1 ) * 20 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
51 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
52
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
53 my $global_pline_idx = 0;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
54
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
55 sub plot_track {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
56 my ( $self, $points_ref, $stroke, $fill, $id ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
57
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
58 $global_pline_idx++;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
59 $self->svg()->polyline(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
60 %{$points_ref},
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
61 id => 'pline_' . $id . '-' . $global_pline_idx,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
62 style => {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
63 'fill-opacity' => .5,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
64 'stroke' => $stroke,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
65 'fill' => $fill,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
66 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
67 )
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
68
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
69 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
70
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
71 sub make_scale {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
72 my ( $self, $i, $start, $stop ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
73
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
74 # Left axis label, must be rotated
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
75 my $tmp_x = $self->fix_x_value(-30); #$self->x_border()-30;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
76 my $tmp_y = $self->fix_y_value($i) + 50;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
77 $self->svg()->text(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
78 id => 'left_side_label_row_' . $i,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
79 x => $tmp_x - 20,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
80 y => $tmp_y - 20,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
81 'font-family' => 'Helvetica, sans-serif',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
82 'transform' => sprintf( 'rotate(-90 %s %s)', $tmp_x, $tmp_y ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
83 )->cdata('Start/End Hit Count Scale');
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
84
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
85 # Right axis label, must be rotated
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
86 $tmp_x = $self->fix_x_value( $self->row_width() + 60 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
87 $tmp_y = $self->fix_y_value($i);
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
88 $self->svg()->text(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
89 id => 'right_side_label_row_' . $i,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
90 x => $tmp_x - 20,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
91 y => $tmp_y,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
92 'font-family' => 'Helvetica, sans-serif',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
93 'transform' => sprintf( 'rotate(-90 %s %s)', $tmp_x, $tmp_y ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
94 )->cdata('Coverage Density');
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
95
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
96 # Horizontal increments
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
97 for ( my $k = -4 ; $k <= 4 ; $k++ ) {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
98
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
99 # Left side label
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
100 my $y_position = $k / 4 * $self->line_height();
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
101 $self->svg()->text(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
102 id => sprintf( 'label_left_side_row_%s_%s', $i, $k ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
103 x => $self->fix_x_value(-30),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
104 y => $self->fix_y_value( $i, $y_position ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
105 'font-family' => 'Helvetica, sans-serif',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
106 )->cdata( int( $self->start_end_max_num() * abs( $k / 4 ) ) );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
107
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
108 # Right side label
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
109 $self->svg()->text(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
110 id => sprintf( 'label_right_side_row_%s_%s', $i, $k ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
111 x => $self->fix_x_value( $self->row_width() + 10 ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
112 y => $self->fix_y_value( $i, $y_position ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
113 'font-family' => 'Helvetica, sans-serif',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
114 )->cdata( int( $self->max() * abs( $k / 4 ) ) );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
115
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
116 # Vertical lines
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
117 $self->svg()->line(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
118 x1 => $self->fix_x_value( $self->row_width() ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
119 x2 => $self->fix_x_value(0),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
120 y1 => $self->fix_y_value( $i, $y_position ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
121 y2 => $self->fix_y_value( $i, $y_position ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
122 id => sprintf( 'vertical_increment_row_%s_%s', $i, $k ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
123 opacity => .25,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
124 stroke => 'rgb(0,0,0)',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
125 'stroke-width' => '2',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
126 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
127 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
128
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
129 # Vertical Increments
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
130 my $number_of_increments = 10;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
131 for (
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
132 my $k = 0 ;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
133 $k <= $self->row_width() ;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
134 $k += ( $self->row_width() / $number_of_increments )
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
135 )
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
136 {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
137 # We get % of way across (k/num_inc) and we multiply by the width value, to get % of width which we adjust with start to get correct value
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
138 my $b =
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
139 ( $k / $self->row_width() ) * ( $stop - $start ) + $start;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
140 my $kb = $b / 1000;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
141 $self->svg()->text(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
142 id =>
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
143 sprintf( 'vertical_line_label_row_%s_%s', $i, $k ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
144 x => $self->fix_x_value($k),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
145 y =>
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
146 $self->fix_y_value( $i, $self->line_height() + 20 ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
147 'font-family' => 'Helvetica, sans-serif',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
148 )->cdata( ($kb) . ' kb' );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
149
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
150 $self->svg()->line(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
151 x1 => $self->fix_x_value($k),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
152 x2 => $self->fix_x_value($k),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
153 y1 => $self->fix_y_value( $i, -$self->line_height() ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
154 y2 => $self->fix_y_value( $i, $self->line_height() ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
155 id => sprintf( 'vertical_line_row_%s_%s', $i, $k ),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
156 opacity => .5,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
157 stroke => 'rgb(0,0,0)',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
158 'stroke-width' => '1',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
159 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
160 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
161 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
162
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
163 sub plot_title {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
164 my ( $self, $string ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
165 $self->svg()->text(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
166 id => 'label_plot_title',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
167 x => $self->x_border(),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
168 y => 50 + $self->vertical_offset(),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
169 'font-family' => 'Helvetica, sans-serif',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
170 'font-size' => '150%',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
171 )->cdata($string);
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
172 $self->vertical_offset( $self->vertical_offset() + 25 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
173 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
174
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
175 sub plot_key {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
176 my ( $self, $text, $stroke, $colour, $i ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
177
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
178 $self->svg()->rectangle(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
179 x => $self->x_border(),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
180 y => 50 + $self->vertical_offset() - 15,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
181 width => 15,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
182 height => 15,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
183 id => 'label_key_example' . $i,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
184 'fill-opacity' => .5,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
185 'stroke' => $stroke,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
186 'fill' => $colour,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
187 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
188 $self->svg()->text(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
189 id => 'label_key_string' . $i,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
190 x => $self->x_border() + 20,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
191 y => 50 + $self->vertical_offset(),
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
192 'font-family' => 'Helvetica, sans-serif',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
193 )->cdata($text);
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
194 $self->vertical_offset( $self->vertical_offset + 20 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
195 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
196
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
197 sub xmlify {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
198 my ($self) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
199 return $self->svg()->xmlify();
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
200 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
201
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
202 sub x_values_for_range_scaled {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
203 my ( $self, $start, $end, $pieces ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
204 my @vals = ($start);
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
205 my $by = ( $end - $start ) / $pieces;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
206 ## For all values from the x_border to xborder+row_width, add a value of row_width split/row_size (i.e., how far for EACH INDIVIDUAL value)
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
207 for ( my $i = $start ; $i < $end ; $i += $by ) {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
208 push( @vals, $i );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
209 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
210 push( @vals, $end );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
211 return @vals;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
212 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
213
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
214 sub fix_x_values {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
215 my ( $self, @values ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
216 return map { $self->fix_x_value($_) } @values;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
217 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
218
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
219 sub fix_x_value {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
220 my ( $self, $val ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
221 return $val + $self->x_border();
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
222 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
223
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
224 sub fix_y_value {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
225 my ( $self, $i, $val ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
226 return (
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
227 $self->vertical_offset() + $val - $self->line_height() + (
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
228 ( ( 2 + $i ) * $self->line_height() ) +
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
229 ( $i * $self->inter_line_spacing() ) +
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
230 $self->y_border()
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
231 )
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
232 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
233 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
234
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
235 sub fix_all_y_values {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
236 my ( $self, $i, @arrays_to_fix, ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
237 for ( my $j = 0 ; $j < scalar @arrays_to_fix ; $j++ ) {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
238
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
239 # For each array in postive_y (AoA)
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
240 #
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
241 # we cast to array, then we map this, then we have this
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
242 # in an anonymous array which means we can just
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
243 # replace. This is probably not as efficient as looking
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
244 # at every value directly and doing "in place"
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
245 # replacement, but I don't know how that would be
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
246 # written here...
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
247 $arrays_to_fix[$j] =
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
248 [ map { $self->fix_y_value( $i, $_ ) }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
249 @{ $arrays_to_fix[$j] } ];
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
250 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
251 return @arrays_to_fix;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
252 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
253
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
254 sub copy_data {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
255 my ( $self, $start, $stop, $data_to_ref, $data_from_ref, $max ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
256
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
257 # Copy data from the original array to the new one, transforming out
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
258 # the subset of interest. This is done across an AoA
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
259 my @data_to = @{$data_to_ref};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
260 my @data_from = @{$data_from_ref};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
261 for ( my $k = 0 ; $k < scalar @data_from ; $k++ ) {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
262 foreach ( my $j = $start ; $j < $stop ; $j++ )
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
263 { #1 to 10_000 in the genome
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
264 if ( defined ${ $data_from[$k] }[$j] ) {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
265 push(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
266 @{ $data_to[$k] },
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
267 -(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
268 $self->line_height() *
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
269 ${ $data_from[$k] }[$j] /
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
270 $max
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
271 )
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
272 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
273 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
274 else {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
275 push( @{ $data_to[$k] }, 0 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
276 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
277 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
278 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
279 return @data_to;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
280 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
281
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
282 sub plot_individual_row {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
283 my ( $self, $start, $stop, $i, $regular_ref, $rescale_ref ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
284
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
285 my @regular = map { ${$_}{data} } @{$regular_ref};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
286 my @rescale = map { ${$_}{data} } @{$rescale_ref};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
287 my @regular_y;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
288 my @rescale_y;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
289 ## Ensure we duplicate the number of arrays.
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
290 foreach (@regular) {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
291 push( @regular_y, [] );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
292 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
293 foreach (@rescale) {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
294 push( @rescale_y, [] );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
295 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
296
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
297 # Determine bounds of row
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
298 $self->push_all( \@regular_y, 0 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
299 $self->push_all( \@rescale_y, 0 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
300
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
301 @regular_y =
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
302 $self->copy_data( $start, $stop, \@regular_y, \@regular,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
303 $self->start_end_max_num() );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
304 @rescale_y =
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
305 $self->copy_data( $start, $stop, \@rescale_y, \@rescale,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
306 $self->max() );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
307
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
308 #print @rescale_y;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
309
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
310 # Set up our X values
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
311 my @x_values = $self->fix_x_values(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
312 $self->x_values_for_range_scaled(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
313 0, $self->row_width(), ( $stop - $start )
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
314 )
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
315 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
316
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
317 #my @x_values_rescale = $self->fix_x_values( $self->x_values_for_range_scaled(0, $self->row_width(), ( $stop - $start )));
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
318
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
319 $self->push_all( \@regular_y, 0 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
320 $self->push_all( \@rescale_y, 0 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
321
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
322 # Fix the ys
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
323 @regular_y = $self->fix_all_y_values( $i, @regular_y );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
324 @rescale_y = $self->fix_all_y_values( $i, @rescale_y );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
325
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
326 # Prepare our styling
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
327 my @regular_line = map { ${$_}{line} } @{$regular_ref};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
328 my @rescale_line = map { ${$_}{line} } @{$rescale_ref};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
329 my @regular_fill = map { ${$_}{fill} } @{$regular_ref};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
330 my @rescale_fill = map { ${$_}{fill} } @{$rescale_ref};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
331
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
332 # Add data to plot
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
333 $self->svg_add_track(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
334 \@x_values, \@regular_y, \@regular_line,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
335 \@regular_fill, "$i-$start-$stop"
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
336 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
337 $self->svg_add_track(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
338 \@x_values, \@rescale_y, \@rescale_line,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
339 \@rescale_fill, "$i-$start-$stop"
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
340 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
341
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
342 # scale
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
343 $self->make_scale( $i, $start, $stop );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
344 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
345
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
346 sub debug {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
347 my ( $self, $title, @arrs ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
348 print "=" x 16 . "\n";
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
349 foreach (@arrs) {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
350 my @arr = @{$_};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
351 printf "Array %s : %s\n", $title, scalar @arr;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
352 print "\t"
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
353 . join( ',',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
354 map { sprintf( '%-10d', int($_) ) } @arr[ 0 .. 10 ] )
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
355 . "\n";
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
356 my $a = scalar(@arr) - 11;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
357 my $b = scalar(@arr) - 1;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
358 print "\t"
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
359 . join( ',',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
360 map { sprintf( '%-10d', int($_) ) } @arr[ $a .. $b ] )
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
361 . "\n";
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
362 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
363 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
364
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
365 sub svg_add_track {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
366 my (
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
367 $self, $x_values_ref, $data_ref,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
368 $line_ref, $fill_ref, $base_track_id
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
369 ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
370 my @x_values = @{$x_values_ref};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
371 my @data = @{$data_ref};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
372 my @lines = @{$line_ref};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
373 my @fills = @{$fill_ref};
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
374
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
375 my $it = each_array( @data, @lines, @fills );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
376 while ( my ( $pry, $prl, $prf ) = $it->() ) {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
377 my $plot_data = $self->svg()->get_path(
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
378 x => \@x_values,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
379 y => $pry,
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
380 -type => 'polyline',
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
381 -closed => 'false' #specify that the polyline is closed.
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
382 );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
383 $self->plot_track( $plot_data, $prl, $prf, "$base_track_id" );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
384 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
385 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
386
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
387 sub plot_data {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
388 my ( $self, %d ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
389 $self->add_header( $d{regular}, $d{rescale} );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
390
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
391 ##loop through rows
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
392 foreach ( my $i = 0 ; $i < $self->num_rows() ; $i++ ) {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
393 my ( $start, $stop ) =
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
394 ( $i * $self->row_size(), ( $i + 1 ) * $self->row_size() );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
395 $self->plot_individual_row( $start, $stop, $i, $d{regular},
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
396 $d{rescale}, );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
397 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
398 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
399
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
400 sub plot_data_subset {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
401 my ( $self, %d ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
402
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
403 $self->add_header( $d{regular}, $d{rescale} );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
404 ##loop through rows
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
405 $self->plot_individual_row( $d{from}, $d{to}, 0, $d{regular},
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
406 $d{rescale}, );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
407 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
408
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
409 sub push_all {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
410 my ( $self, $array_ref, @values ) = @_;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
411 foreach ( @{$array_ref} ) {
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
412 push( @{$_}, @values );
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
413 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
414 }
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
415
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
416 no Moose;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
417 1;
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
418
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
419 __END__
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
420
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
421 =pod
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
422
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
423 =encoding UTF-8
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
424
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
425 =head1 NAME
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
426
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
427 CPT::Analysis::PAUSE::SVG - Library for use in PAUSE analysis
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
428
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
429 =head1 VERSION
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
430
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
431 version 1.96
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
432
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
433 =head1 AUTHOR
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
434
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
435 Eric Rasche <rasche.eric@yandex.ru>
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
436
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
437 =head1 COPYRIGHT AND LICENSE
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
438
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
439 This software is Copyright (c) 2014 by Eric Rasche.
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
440
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
441 This is free software, licensed under:
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
442
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
443 The GNU General Public License, Version 3, June 2007
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
444
e4de0a0e90c8 Uploaded
cpt
parents:
diff changeset
445 =cut