annotate variant_effect_predictor/Bio/Graphics/Glyph/xyplot.pm @ 0:21066c0abaf5 draft

Uploaded
author willmclaren
date Fri, 03 Aug 2012 10:04:48 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1 package Bio::Graphics::Glyph::xyplot;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4 use Bio::Graphics::Glyph::segments;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5 use vars '@ISA';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 use GD 'gdTinyFont';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8 @ISA = 'Bio::Graphics::Glyph::segments';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10 use constant DEFAULT_POINT_RADIUS=>1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12 my %SYMBOLS = (
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 triangle => \&draw_triangle,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14 square => \&draw_square,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15 disc => \&draw_disc,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16 point => \&draw_point,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 sub point_radius {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20 shift->option('point_radius') || DEFAULT_POINT_RADIUS;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 sub pad_top { 0 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 sub draw {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 my ($gd,$dx,$dy) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28 my ($left,$top,$right,$bottom) = $self->calculate_boundaries($dx,$dy);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 my @parts = $self->parts;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 return $self->SUPER::draw(@_) unless @parts > 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 # figure out the scale and such like
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 my $max_score = $self->option('max_score');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 my $min_score = $self->option('min_score');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 unless (defined $max_score && defined $min_score) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38 my $first = $parts[0];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 $max_score = $min_score = eval { $first->feature->score} || 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 for my $part (@parts) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 my $s = eval { $part->feature->score };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42 next unless defined $s;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 $max_score = $s if $s > $max_score;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44 $min_score = $s if $s < $min_score;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 # if a scale is called for, then we adjust the max and min to be even
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 # multiples of a power of 10.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 if ($self->option('scale')) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51 $max_score = max10($max_score);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 $min_score = min10($min_score);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55 my $height = $self->option('height');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 my $scale = $max_score > $min_score ? $height/($max_score-$min_score)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 : 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 my $x = $dx;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 my $y = $dy + $self->top + $self->pad_top;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 # now seed all the parts with the information they need to draw their positions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 foreach (@parts) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 my $s = eval {$_->feature->score};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64 next unless defined $s;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 my $position = ($s-$min_score) * $scale;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 $_->{_y_position} = $bottom - $position;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 my $type = $self->option('graph_type');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70 $self->_draw_histogram($gd,$x,$y) if $type eq 'histogram';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 $self->_draw_boxes($gd,$x,$y) if $type eq 'boxes';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 $self->_draw_line ($gd,$x,$y) if $type eq 'line'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 or $type eq 'linepoints';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 $self->_draw_points($gd,$x,$y) if $type eq 'points'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 or $type eq 'linepoints';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 $self->_draw_scale($gd,$scale,$min_score,$max_score,$dx,$dy) if $self->option('scale');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80 sub log10 { log(shift)/log(10) }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 sub max10 {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82 my $a = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 $a = 1 if $a <= 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 my $l=int(log10($a));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 $l = 10**$l;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 my $r = $a/$l;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 return $r*$l if int($r) == $r;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 return $l*int(($a+$l)/$l);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90 sub min10 {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 my $a = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 $a = 1 if $a <= 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 my $l=int(log10($a));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 $l = 10**$l;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 my $r = $a/$l;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 return $r*$l if int($r) == $r;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 return $l*int($a/$l);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 sub _draw_histogram {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 my ($gd,$left,$top) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 my @parts = $self->parts;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 my $fgcolor = $self->fgcolor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 # draw each of the component lines of the histogram surface
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 for (my $i = 0; $i < @parts; $i++) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 my $part = $parts[$i];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 my $next = $parts[$i+1];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 my ($x1,$y1,$x2,$y2) = $part->calculate_boundaries($left,$top);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 $gd->line($x1,$part->{_y_position},$x2,$part->{_y_position},$fgcolor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 next unless $next;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114 my ($x3,$y3,$x4,$y4) = $next->calculate_boundaries($left,$top);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 if ($x2 == $x3) {# connect vertically to next level
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 $gd->line($x2,$part->{_y_position},$x2,$next->{_y_position},$fgcolor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 $gd->line($x2,$part->{_y_position},$x2,$y2,$fgcolor); # to bottom
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 $gd->line($x2,$y2,$x3,$y2,$fgcolor); # to right
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 $gd->line($x3,$y4,$x3,$next->{_y_position},$fgcolor); # up
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 # end points: from bottom to first
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 my ($x1,$y1,$x2,$y2) = $parts[0]->calculate_boundaries($left,$top);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 $gd->line($x1,$y2,$x1,$parts[0]->{_y_position},$fgcolor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 # from last to bottom
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 my ($x3,$y3,$x4,$y4) = $parts[-1]->calculate_boundaries($left,$top);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129 $gd->line($x4,$parts[-1]->{_y_position},$x4,$y4,$fgcolor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131 # from left to right -- don't like this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 # $gd->line($x1,$y2,$x4,$y4,$fgcolor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 # That's it. Not too hard.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 sub _draw_boxes {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 my ($gd,$left,$top) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 my @parts = $self->parts;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 my $fgcolor = $self->fgcolor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 my $bgcolor = $self->bgcolor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 my $height = $self->height;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 # draw each of the component lines of the histogram surface
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 for (my $i = 0; $i < @parts; $i++) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148 my $part = $parts[$i];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 my $next = $parts[$i+1];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 my ($x1,$y1,$x2,$y2) = $part->calculate_boundaries($left,$top);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 $self->filled_box($gd,$x1,$part->{_y_position},$x2,$y2,$bgcolor,$fgcolor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 next unless $next;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153 my ($x3,$y3,$x4,$y4) = $next->calculate_boundaries($left,$top);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154 $gd->line($x2,$y2,$x3,$y4,$fgcolor) if $x2 < $x3;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 # That's it.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 sub _draw_line {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 my ($gd,$left,$top) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 my @parts = $self->parts;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165 my $fgcolor = $self->fgcolor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 my $bgcolor = $self->bgcolor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 # connect to center positions of each interval
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 my $first_part = shift @parts;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 my ($x1,$y1,$x2,$y2) = $first_part->calculate_boundaries($left,$top);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 my $current_x = ($x1+$x2)/2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 my $current_y = $first_part->{_y_position};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 for my $part (@parts) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 my ($x1,$y1,$x2,$y2) = $part->calculate_boundaries($left,$top);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 my $next_x = ($x1+$x2)/2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 my $next_y = $part->{_y_position};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 $gd->line($current_x,$current_y,$next_x,$next_y,$fgcolor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 ($current_x,$current_y) = ($next_x,$next_y);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 sub _draw_points {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 my ($gd,$left,$top) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 my $symbol_name = $self->option('point_symbol') || 'point';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 my $symbol_ref = $SYMBOLS{$symbol_name};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 my @parts = $self->parts;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191 my $bgcolor = $self->bgcolor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192 my $pr = $self->point_radius;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 for my $part (@parts) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 my ($x1,$y1,$x2,$y2) = $part->calculate_boundaries($left,$top);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 my $x = ($x1+$x2)/2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 my $y = $part->{_y_position};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 $symbol_ref->($gd,$x,$y,$pr,$bgcolor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 sub _draw_scale {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 my ($gd,$scale,$min,$max,$dx,$dy) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 my ($x1,$y1,$x2,$y2) = $self->calculate_boundaries($dx,$dy);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 my $side = $self->option('scale');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 return if $side eq 'none';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 $side ||= 'both';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211 my $fg = $self->fgcolor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 my $half = ($y1+$y2)/2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 $gd->line($x1+1,$y1,$x1+1,$y2,$fg) if $side eq 'left' || $side eq 'both';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 $gd->line($x2-2,$y1,$x2-2,$y2,$fg) if $side eq 'right' || $side eq 'both';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 for ([$y1,$max],[$half,int(($max-$min)/2+0.5)]) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 $gd->line($x1,$_->[0],$x1+3,$_->[0],$fg) if $side eq 'left' || $side eq 'both';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 $gd->line($x2-4,$_->[0],$x2,$_->[0],$fg) if $side eq 'right' || $side eq 'both';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220 if ($side eq 'left' or $side eq 'both') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 $gd->string(gdTinyFont,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 $x1 + 5,$_->[0]-(gdTinyFont->height/3),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 $_->[1],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 $fg);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 if ($side eq 'right' or $side eq 'both') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227 $gd->string(gdTinyFont,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 $x2-5 - (length($_->[1])*gdTinyFont->width),$_->[0]-(gdTinyFont->height/3),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 $_->[1],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 $fg);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 # we are unbumpable!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 sub bump {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 return 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 sub connector {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 my $type = $self->option('graph_type');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 return 1 if $type eq 'line' or $type eq 'linepoints';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 sub height {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 return $self->option('graph_height') || $self->SUPER::height;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 sub draw_triangle {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 my ($gd,$x,$y,$pr,$color) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 my ($vx1,$vy1) = ($x-$pr,$y+$pr);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 my ($vx2,$vy2) = ($x, $y-$pr);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 my ($vx3,$vy3) = ($x+$pr,$y+$pr);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256 $gd->line($vx1,$vy1,$vx2,$vy2,$color);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257 $gd->line($vx2,$vy2,$vx3,$vy3,$color);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258 $gd->line($vx3,$vy3,$vx1,$vy1,$color);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 sub draw_square {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 my ($gd,$x,$y,$pr,$color) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262 $gd->line($x-$pr,$y-$pr,$x+$pr,$y-$pr,$color);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 $gd->line($x+$pr,$y-$pr,$x+$pr,$y+$pr,$color);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264 $gd->line($x+$pr,$y+$pr,$x-$pr,$y+$pr,$color);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265 $gd->line($x-$pr,$y+$pr,$x-$pr,$y-$pr,$color);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 sub draw_disc {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268 my ($gd,$x,$y,$pr,$color) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 $gd->arc($x,$y,$pr,$pr,0,360,$color);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 sub draw_point {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 my ($gd,$x,$y,$pr,$color) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273 $gd->setPixel($x,$y,$color);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 sub _subseq {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277 my $class = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278 my $feature = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 return $feature->segments if $feature->can('segments');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 my @split = eval { my $id = $feature->location->seq_id;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281 my @subs = $feature->location->sub_Location;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 grep {$id eq $_->seq_id} @subs};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283 return @split if @split;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284 return $feature->sub_SeqFeature if $feature->can('sub_SeqFeature');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 return;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288 sub keyglyph {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 my $scale = 1/$self->scale; # base pairs/pixel
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 my $feature =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 Bio::Graphics::Feature->new(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295 -segments=>[ [ 0*$scale,9*$scale],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 [ 10*$scale,19*$scale],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297 [ 20*$scale, 29*$scale]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 ],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 -name => 'foo bar',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300 -strand => '+1');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 ($feature->segments)[0]->score(10);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302 ($feature->segments)[1]->score(50);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303 ($feature->segments)[2]->score(25);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 my $factory = $self->factory->clone;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 $factory->set_option(label => 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306 $factory->set_option(bump => 0);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 $factory->set_option(connector => 'solid');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 my $glyph = $factory->make_glyph(0,$feature);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 return $glyph;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315 __END__
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 Bio::Graphics::Glyph::xyplot - The xyplot glyph
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 See L<Bio::Graphics::Panel> and L<Bio::Graphics::Glyph>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 This glyph is used for drawing features that have a position on the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 genome and a numeric value. It can be used to represent gene
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 prediction scores, motif-calling scores, percent similarity,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 microarray intensities, or other features that require a line plot.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 The X axis represents the position on the genome, as per all other
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 glyphs. The Y axis represents the score. Options allow you to set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334 the height of the glyph, the maximum and minimum scores, the color of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 the line and axis, and the symbol to draw.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337 The plot is designed to work on a single feature group that contains
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338 subfeatures. It is the subfeatures that carry the score
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 information. The best way to arrange for this is to create an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340 aggregator for the feature. We'll take as an example a histogram of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341 repeat density in which interval are spaced every megabase and the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342 score indicates the number of repeats in the interval; we'll assume
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 that the database has been loaded in in such a way that each interval
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 is a distinct feature with the method name "density" and the source
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 name "repeat". Furthermore, all the repeat features are grouped
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346 together into a single group (the name of the group is irrelevant).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 If you are using Bio::DB::GFF and Bio::Graphics directly, the sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 of events would look like this:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350 my $agg = Bio::DB::GFF::Aggregator->new(-method => 'repeat_density',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351 -sub_parts => 'density:repeat');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352 my $db = Bio::DB::GFF->new(-dsn=>'my_database',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353 -aggregators => $agg);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354 my $segment = $db->segment('Chr1');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 my @features = $segment->features('repeat_density');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 my $panel = Bio::Graphics::Panel->new;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358 $panel->add_track(\@features,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359 -glyph => 'xyplot');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361 If you are using Generic Genome Browser, you will add this to the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362 configuration file:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 aggregators = repeat_density{density:repeat}
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365 clone alignment etc
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367 =head2 OPTIONS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369 The following options are standard among all Glyphs. See
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 L<Bio::Graphics::Glyph> for a full explanation.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 Option Description Default
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373 ------ ----------- -------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 -fgcolor Foreground color black
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 -outlinecolor Synonym for -fgcolor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379 -bgcolor Background color turquoise
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 -fillcolor Synonym for -bgcolor
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 -linewidth Line width 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 -height Height of glyph 10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387 -font Glyph font gdSmallFont
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389 -label Whether to draw a label 0 (false)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 -description Whether to draw a description 0 (false)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393 In addition, the alignment glyph recognizes the following
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 glyph-specific options:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 Option Description Default
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 ------ ----------- -------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 -max_score Maximum value of the Calculated
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400 feature's "score" attribute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402 -min_score Minimum value of the Calculated
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403 feature's "score" attribute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 -graph_type Type of graph to generate. Histogram
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406 Options are: "histogram",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 "boxes", "line", "points",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 or "linepoints".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 -point_symbol Symbol to use. Options are none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411 "triangle", "square", "disc",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412 "point", and "none".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414 -point_radius Radius of the symbol, in 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 pixels
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 -scale Position where the Y axis none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 scale is drawn if any.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419 It should be one of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 "left", "right" or "none"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422 -graph_height Specify height of the graph Same as the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423 "height" option.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425 =head1 BUGS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427 Please report them.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429 =head1 SEE ALSO
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431 L<Bio::Graphics::Panel>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432 L<Bio::Graphics::Track>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433 L<Bio::Graphics::Glyph::transcript2>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434 L<Bio::Graphics::Glyph::anchored_arrow>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435 L<Bio::Graphics::Glyph::arrow>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436 L<Bio::Graphics::Glyph::box>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
437 L<Bio::Graphics::Glyph::primers>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
438 L<Bio::Graphics::Glyph::segments>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
439 L<Bio::Graphics::Glyph::toomany>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
440 L<Bio::Graphics::Glyph::transcript>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442 =head1 AUTHOR
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444 Lincoln Stein E<lt>lstein@cshl.orgE<gt>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446 Copyright (c) 2001 Cold Spring Harbor Laboratory
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448 This library is free software; you can redistribute it and/or modify
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
449 it under the same terms as Perl itself. See DISCLAIMER.txt for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
450 disclaimers of warranty.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
451
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
452 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
453