annotate variant_effect_predictor/Bio/Graphics/Panel.pm @ 1:d6778b5d8382 draft default tip

Deleted selected files
author willmclaren
date Fri, 03 Aug 2012 10:05:43 -0400
parents 21066c0abaf5
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::Panel;
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::Factory;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5 use Bio::Graphics::Feature;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 use GD;;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 use constant KEYLABELFONT => gdMediumBoldFont;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10 use constant KEYSPACING => 5; # extra space between key columns
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 use constant KEYPADTOP => 5; # extra padding before the key starts
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12 use constant KEYCOLOR => 'wheat';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 use constant KEYSTYLE => 'bottom';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14 use constant KEYALIGN => 'left';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15 use constant GRIDCOLOR => 'lightcyan';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16 use constant MISSING_TRACK_COLOR =>'gray';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18 my %COLORS; # translation table for symbolic color names to RGB triple
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20 # Create a new panel of a given width and height, and add lists of features
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 # one by one
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 my $class = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24 my %options = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 $class->read_colors() unless %COLORS;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28 my $length = $options{-length} || 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 my $offset = $options{-offset} || 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 my $spacing = $options{-spacing} || 5;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 my $bgcolor = $options{-bgcolor} || 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32 my $keyfont = $options{-key_font} || KEYLABELFONT;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 my $keycolor = $options{-key_color} || KEYCOLOR;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 my $keyspacing = $options{-key_spacing} || KEYSPACING;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 my $keystyle = $options{-key_style} || KEYSTYLE;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 my $keyalign = $options{-key_align} || KEYALIGN;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 my $allcallbacks = $options{-all_callbacks} || 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38 my $gridcolor = $options{-gridcolor} || GRIDCOLOR;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 my $grid = $options{-grid} || 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 my $flip = $options{-flip} || 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 my $empty_track_style = $options{-empty_tracks} || 'key';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42 my $truecolor = $options{-truecolor} || 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44 if (my $seg = $options{-segment}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45 $offset = eval {$seg->start-1} || 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 $length = $seg->length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 $offset ||= $options{-start}-1 if defined $options{-start};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 $length ||= $options{-stop}-$options{-start}+1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51 if defined $options{-start} && defined $options{-stop};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53 return bless {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 tracks => [],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55 width => $options{-width} || 600,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 pad_top => $options{-pad_top}||0,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 pad_bottom => $options{-pad_bottom}||0,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 pad_left => $options{-pad_left}||0,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 pad_right => $options{-pad_right}||0,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 length => $length,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61 offset => $offset,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 gridcolor => $gridcolor,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 grid => $grid,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64 bgcolor => $bgcolor,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 height => 0, # AUTO
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 spacing => $spacing,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67 key_font => $keyfont,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68 key_color => $keycolor,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 key_spacing => $keyspacing,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70 key_style => $keystyle,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 key_align => $keyalign,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 all_callbacks => $allcallbacks,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 truecolor => $truecolor,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 flip => $flip,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 empty_track_style => $empty_track_style,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76 },$class;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79 sub pad_left {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 my $g = $self->{pad_left};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82 $self->{pad_left} = shift if @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 $g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 sub pad_right {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 my $g = $self->{pad_right};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88 $self->{pad_right} = shift if @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 $g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 sub pad_top {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 my $g = $self->{pad_top};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 $self->{pad_top} = shift if @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 $g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 sub pad_bottom {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 my $g = $self->{pad_bottom};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100 $self->{pad_bottom} = shift if @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 $g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104 sub flip {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 my $g = $self->{flip};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 $self->{flip} = shift if @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 $g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 # values of empty_track_style are:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 # "suppress" -- suppress empty tracks entirely (default)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 # "key" -- show just the key in "between" mode
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114 # "line" -- draw a thin grey line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 # "dashed" -- draw a dashed line
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 sub empty_track_style {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118 my $g = $self->{empty_track_style};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 $self->{empty_track_style} = shift if @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 $g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 sub key_style {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 my $g = $self->{key_style};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 $self->{key_style} = shift if @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 $g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 # public routine for mapping from a base pair
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131 # location to pixel coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 sub location2pixel {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 my $end = $self->end + 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 my @coords = $self->{flip} ? map { $end-$_ } @_ : @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 $self->map_pt(@coords);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 # numerous direct calls into array used here for performance considerations
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 sub map_pt {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 my $offset = $self->{offset};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 my $scale = $self->{scale} || $self->scale;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 my $pl = $self->{pad_left};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145 my $pr = $self->{width} - $self->{pad_right};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 my $flip = $self->{flip};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 my $length = $self->{length};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148 my @result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 foreach (@_) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 my $val = $flip ? int (0.5 + $pr - ($length - ($_- 1)) * $scale) : int (0.5 + $pl + ($_-$offset-1) * $scale);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 $val = $pl-1 if $val < $pl;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 $val = $pr+1 if $val > $pr;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153 push @result,$val;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 @result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 sub map_no_trunc {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 my $offset = $self->{offset};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161 my $scale = $self->scale;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162 my $pl = $self->{pad_left};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163 my $pr = $self->{width} - $self->{pad_right};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 my $flip = $self->{flip};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165 my $length = $self->{length};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 my $end = $offset+$length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 my @result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 foreach (@_) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 my $val = $flip ? int (0.5 + $pl + ($end - ($_- 1)) * $scale) : int (0.5 + $pl + ($_-$offset-1) * $scale);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 push @result,$val;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 @result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 sub scale {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 $self->{scale} ||= ($self->{width}-$self->pad_left-$self->pad_right)/($self->length);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 sub start { shift->{offset}+1}
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 sub end { $_[0]->start + $_[0]->{length}-1}
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183 sub offset { shift->{offset} }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184 sub width {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 my $d = $self->{width};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 $self->{width} = shift if @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 $d;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 # $d + $self->pad_left + $self->pad_right;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192 sub left {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 $self->pad_left;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 sub right {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 $self->width - $self->pad_right;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201 sub spacing {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 my $d = $self->{spacing};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 $self->{spacing} = shift if @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 $d;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 sub key_spacing {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 my $d = $self->{key_spacing};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211 $self->{key_spacing} = shift if @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 $d;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 sub length {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 my $d = $self->{length};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 if (@_) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 my $l = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220 $l = $l->length if ref($l) && $l->can('length');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 $self->{length} = $l;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 $d;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 sub gridcolor {shift->{gridcolor}}
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 sub all_callbacks { shift->{all_callbacks} }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 sub add_track {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 $self->_do_add_track(scalar(@{$self->{tracks}}),@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 sub unshift_track {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 $self->_do_add_track(0,@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 sub insert_track {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 my $position = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 $self->_do_add_track($position,@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 # create a feature and factory pair
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 # see Factory.pm for the format of the options
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 # The thing returned is actually a generic Glyph
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 sub _do_add_track {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 my $position = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 # due to indecision, we accept features
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 # and/or glyph types in the first two arguments
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256 my ($features,$glyph_name) = ([],undef);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257 while ( @_ && $_[0] !~ /^-/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258 my $arg = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259 $features = $arg and next if ref($arg);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 $glyph_name = $arg and next unless ref($arg);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 my %args = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264 my ($map,$ss,%options);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266 foreach (keys %args) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 (my $canonical = lc $_) =~ s/^-//;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268 if ($canonical eq 'glyph') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 $map = $args{$_};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 delete $args{$_};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 } elsif ($canonical eq 'stylesheet') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 $ss = $args{$_};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273 delete $args{$_};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275 $options{$canonical} = $args{$_};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 $glyph_name = $map if defined $map;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 $glyph_name ||= 'generic';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 local $^W = 0; # uninitialized variable warnings under 5.00503
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284 my $panel_map =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 ref($map) eq 'CODE' ? sub {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286 my $feature = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287 return 'track' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'track' };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288 return 'group' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'group' };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 return $map->($feature);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 : ref($map) eq 'HASH' ? sub {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292 my $feature = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 return 'track' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'track' };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 return 'group' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'group' };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295 return eval {$map->{$feature->primary_tag}} || 'generic';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297 : sub {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 my $feature = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 return 'track' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'track' };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300 return 'group' if eval { defined $feature->primary_tag && $feature->primary_tag eq 'group' };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 return $glyph_name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302 };
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 $self->_add_track($position,$features,-map=>$panel_map,-stylesheet=>$ss,-options=>\%options);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 sub _add_track {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 my ($position,$features,@options) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311 # build the list of features into a Bio::Graphics::Feature object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312 $features = [$features] unless ref $features eq 'ARRAY';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314 # optional middle-level glyph is the group
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315 foreach my $f (grep {ref $_ eq 'ARRAY'} @$features) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316 next unless ref $f eq 'ARRAY';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 $f = Bio::Graphics::Feature->new(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318 -segments=>$f,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 -type => 'group'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 # top-level glyph is the track
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324 my $feature = Bio::Graphics::Feature->new(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 -segments=>$features,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326 -start => $self->offset+1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 -stop => $self->offset+$self->length,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 -type => 'track'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331 my $factory = Bio::Graphics::Glyph::Factory->new($self,@options);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 my $track = $factory->make_glyph(-1,$feature);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334 splice(@{$self->{tracks}},$position,0,$track);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 return $track;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338 sub height {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340 my $spacing = $self->spacing;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341 my $key_height = $self->format_key;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342 my $empty_track_style = $self->empty_track_style;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 my $key_style = $self->key_style;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 my $bottom_key = $key_style eq 'bottom';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 my $between_key = $key_style eq 'between';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346 my $draw_empty = $empty_track_style =~ /^(line|dashed)$/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 my $keyheight = $self->{key_font}->height;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 my $height = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349 for my $track (@{$self->{tracks}}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350 my $draw_between = $between_key && $track->option('key');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351 my $has_parts = $track->parts;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352 next if !$has_parts && ($empty_track_style eq 'suppress'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353 or $empty_track_style eq 'key' && $bottom_key);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354 $height += $keyheight if $draw_between;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 $height += $self->spacing;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356 $height += $track->layout_height;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359 # get rid of spacing under last track
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360 $height -= $self->spacing unless $bottom_key;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361 return $height + $key_height + $self->pad_top + $self->pad_bottom;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 sub gd {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366 my $existing_gd = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368 local $^W = 0; # can't track down the uninitialized variable warning
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 return $self->{gd} if $self->{gd};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 my $width = $self->width;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373 my $height = $self->height;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 my $gd = $existing_gd || GD::Image->new($width,$height,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376 ($self->{truecolor} && GD::Image->can('isTrueColor') ? 1 : ())
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379 my %translation_table;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380 for my $name ('white','black',keys %COLORS) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 my $idx = $gd->colorAllocate(@{$COLORS{$name}});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 $translation_table{$name} = $idx;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 $self->{translations} = \%translation_table;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386 $self->{gd} = $gd;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387 if ($self->bgcolor) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388 $gd->fill(0,0,$self->bgcolor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389 } elsif (eval {$gd->isTrueColor}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 $gd->fill(0,0,$translation_table{'white'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393 my $pl = $self->pad_left;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 my $pt = $self->pad_top;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395 my $offset = $pt;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 my $keyheight = $self->{key_font}->height;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 my $bottom_key = $self->{key_style} eq 'bottom';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 my $between_key = $self->{key_style} eq 'between';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 my $left_key = $self->{key_style} eq 'left';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400 my $right_key = $self->{key_style} eq 'right';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401 my $empty_track_style = $self->empty_track_style;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402 my $spacing = $self->spacing;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404 # we draw in two steps, once for background of tracks, and once for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 # the contents. This allows the grid to sit on top of the track background.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406 for my $track (@{$self->{tracks}}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 my $draw_between = $between_key && $track->option('key');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 next if !$track->parts && ($empty_track_style eq 'suppress'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409 or $empty_track_style eq 'key' && $bottom_key);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 $gd->filledRectangle($pl,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411 $offset,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412 $width-$self->pad_right,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413 $offset+$track->layout_height
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414 + ($between_key ? $self->{key_font}->height : 0),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 $track->tkcolor)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416 if defined $track->tkcolor;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 $offset += $keyheight if $draw_between;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 $offset += $track->layout_height + $spacing;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421 $self->draw_grid($gd) if $self->{grid};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423 $offset = $pt;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424 for my $track (@{$self->{tracks}}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425 my $draw_between = $between_key && $track->option('key');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426 my $has_parts = $track->parts;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427 next if !$has_parts && ($empty_track_style eq 'suppress'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428 or $empty_track_style eq 'key' && $bottom_key);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430 if ($draw_between) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431 $offset += $self->draw_between_key($gd,$track,$offset);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434 elsif ($self->{key_style} =~ /^(left|right)$/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435 $self->draw_side_key($gd,$track,$offset,$self->{key_style});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
437
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
438 $self->draw_empty($gd,$offset,$empty_track_style)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
439 if !$has_parts && $empty_track_style=~/^(line|dashed)$/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
440
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441 $track->draw($gd,0,$offset,0,1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442 $self->track_position($track,$offset);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443 $offset += $track->layout_height + $spacing;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447 $self->draw_bottom_key($gd,$pl,$offset) if $self->{key_style} eq 'bottom';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
449 return $self->{gd} = $gd;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
450 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
451
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
452 sub boxes {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
453 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
454 my @boxes;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
455 my $offset = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
456
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
457 my $pl = $self->pad_left;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
458 my $pt = $self->pad_top;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
459 my $between_key = $self->{key_style} eq 'between';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
460 my $bottom_key = $self->{key_style} eq 'bottom';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
461 my $empty_track_style = $self->empty_track_style;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
462 my $keyheight = $self->{key_font}->height;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
463 my $spacing = $self->spacing;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
464
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
465 for my $track (@{$self->{tracks}}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
466 my $draw_between = $between_key && $track->option('key');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
467 next if !$track->parts && ($empty_track_style eq 'suppress'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
468 or $empty_track_style eq 'key' && $bottom_key);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
469 $offset += $keyheight if $draw_between;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
470 my $boxes = $track->boxes(0,$offset+$pt);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
471 $self->track_position($track,$offset);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
472 push @boxes,@$boxes;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
473 $offset += $track->layout_height + $self->spacing;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
474 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
475 return wantarray ? @boxes : \@boxes;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
476 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
477
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
478 sub track_position {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
479 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
480 my $track = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
481 my $d = $self->{_track_position}{$track};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
482 $self->{_track_position}{$track} = shift if @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
483 $d;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
484 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
485
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
486 # draw the keys -- between
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
487 sub draw_between_key {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
488 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
489 my ($gd,$track,$offset) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
490 my $key = $track->option('key') or return 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
491 my $x = $self->{key_align} eq 'center' ? $self->width - (CORE::length($key) * $self->{key_font}->width)/2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
492 : $self->{key_align} eq 'right' ? $self->width - CORE::length($key)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
493 : $self->pad_left;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
494 $gd->string($self->{key_font},$x,$offset,$key,1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
495 return $self->{key_font}->height;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
496 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
497
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
498 # draw the keys -- left or right side
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
499 sub draw_side_key {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
500 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
501 my ($gd,$track,$offset,$side) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
502 my $key = $track->option('key') or return;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
503 my $pos = $side eq 'left' ? $self->pad_left - $self->{key_font}->width * CORE::length($key)-3
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
504 : $self->width - $self->pad_right+3;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
505 $gd->string($self->{key_font},$pos,$offset,$key,1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
506 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
507
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
508 # draw the keys -- bottom
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
509 sub draw_bottom_key {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
510 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
511 my ($gd,$left,$top) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
512 my $key_glyphs = $self->{key_glyphs} or return;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
513
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
514 my $color = $self->translate_color($self->{key_color});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
515 $gd->filledRectangle($left,$top,$self->width - $self->pad_right,$self->height-$self->pad_bottom,$color);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
516 $gd->string($self->{key_font},$left,KEYPADTOP+$top,"KEY:",1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
517 $top += $self->{key_font}->height + KEYPADTOP;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
518
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
519 $_->draw($gd,$left,$top) foreach @$key_glyphs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
520 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
521
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
522 # Format the key section, and return its height
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
523 sub format_key {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
524 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
525 return 0 unless $self->key_style eq 'bottom';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
526
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
527 return $self->{key_height} if defined $self->{key_height};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
528
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
529 my $suppress = $self->{empty_track_style} eq 'suppress';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
530 my $between = $self->{key_style} eq 'between';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
531
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
532 if ($between) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
533 my @key_tracks = $suppress
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
534 ? grep {$_->option('key') && $_->parts} @{$self->{tracks}}
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
535 : grep {$_->option('key')} @{$self->{tracks}};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
536 return $self->{key_height} = @key_tracks * $self->{key_font}->height;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
537 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
538
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
539 elsif ($self->{key_style} eq 'bottom') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
540
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
541 my ($height,$width) = (0,0);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
542 my %tracks;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
543 my @glyphs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
544
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
545 # determine how many glyphs become part of the key
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
546 # and their max size
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
547 for my $track (@{$self->{tracks}}) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
548
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
549 next unless $track->option('key');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
550 next if $suppress && !$track->parts;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
551
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
552 my $glyph;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
553 if (my @parts = $track->parts) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
554 $glyph = $parts[0]->keyglyph;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
555 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
556 my $t = Bio::Graphics::Feature->new(-segments=>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
557 [Bio::Graphics::Feature->new(-start => $self->offset,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
558 -stop => $self->offset+$self->length)]);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
559 my $g = $track->factory->make_glyph(0,$t);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
560 $glyph = $g->keyglyph;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
561 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
562 next unless $glyph;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
563
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
564
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
565 $tracks{$track} = $glyph;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
566 my ($h,$w) = ($glyph->layout_height,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
567 $glyph->layout_width);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
568 $height = $h if $h > $height;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
569 $width = $w if $w > $width;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
570 push @glyphs,$glyph;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
571
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
572 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
573
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
574 $width += $self->key_spacing;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
575
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
576 # no key glyphs, no key
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
577 return $self->{key_height} = 0 unless @glyphs;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
578
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
579 # now height and width hold the largest glyph, and $glyph_count
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
580 # contains the number of glyphs. We will format them into a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
581 # box that is roughly 3 height/4 width (golden mean)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
582 my $rows = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
583 my $cols = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
584 my $maxwidth = $self->width - $self->pad_left - $self->pad_right;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
585 while (++$rows) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
586 $cols = @glyphs / $rows;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
587 $cols = int ($cols+1) if $cols =~ /\./; # round upward for fractions
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
588 my $total_width = $cols * $width;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
589 my $total_height = $rows * $width;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
590 last if $total_width < $maxwidth;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
591 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
592
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
593 # move glyphs into row-major format
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
594 my $spacing = $self->key_spacing;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
595 my $i = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
596 for (my $c = 0; $c < $cols; $c++) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
597 for (my $r = 0; $r < $rows; $r++) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
598 my $x = $c * ($width + $spacing);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
599 my $y = $r * ($height + $spacing);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
600 next unless defined $glyphs[$i];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
601 $glyphs[$i]->move($x,$y);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
602 $i++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
603 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
604 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
605
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
606 $self->{key_glyphs} = \@glyphs; # remember our key glyphs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
607 # remember our key height
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
608 return $self->{key_height} =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
609 ($height+$spacing) * $rows + $self->{key_font}->height +KEYPADTOP;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
610 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
611
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
612 else { # no known key style, neither "between" nor "bottom"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
613 return $self->{key_height} = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
614 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
615 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
616
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
617 sub draw_empty {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
618 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
619 my ($gd,$offset,$style) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
620 $offset += $self->spacing/2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
621 my $left = $self->pad_left;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
622 my $right = $self->width-$self->pad_right;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
623 my $color = $self->translate_color(MISSING_TRACK_COLOR);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
624 if ($style eq 'dashed') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
625 $gd->setStyle($color,$color,gdTransparent,gdTransparent);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
626 $gd->line($left,$offset,$right,$offset,gdStyled);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
627 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
628 $gd->line($left,$offset,$right,$offset,$color);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
629 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
630 $offset;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
631 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
632
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
633 # draw a grid
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
634 sub draw_grid {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
635 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
636 my $gd = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
637
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
638 my $gridcolor = $self->translate_color($self->{gridcolor});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
639 my @positions;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
640 if (ref $self->{grid} eq 'ARRAY') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
641 @positions = @{$self->{grid}};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
642 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
643 my ($major,$minor) = $self->ticks;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
644 my $first_tick = $minor * int(0.5 + $self->start/$minor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
645 for (my $i = $first_tick; $i < $self->end; $i += $minor) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
646 push @positions,$i;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
647 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
648 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
649 my $pl = $self->pad_left;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
650 my $pt = $self->pad_top;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
651 my $pb = $self->height - $self->pad_bottom;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
652 local $self->{flip} = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
653 for my $tick (@positions) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
654 my ($pos) = $self->map_pt($tick);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
655 $gd->line($pos,$pt,$pos,$pb,$gridcolor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
656 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
657 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
658
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
659 # calculate major and minor ticks, given a start position
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
660 sub ticks {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
661 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
662 my ($length,$minwidth) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
663
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
664 $length = $self->{length} unless defined $length;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
665 $minwidth = gdSmallFont->width*7 unless defined $minwidth;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
666
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
667 my ($major,$minor);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
668
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
669 # figure out tick mark scale
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
670 # we want no more than 1 major tick mark every 40 pixels
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
671 # and enough room for the labels
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
672 my $scale = $self->scale;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
673
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
674 my $interval = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
675
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
676 while (1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
677 my $pixels = $interval * $scale;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
678 last if $pixels >= $minwidth;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
679 $interval *= 10;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
680 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
681
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
682 # to make sure a major tick shows up somewhere in the first half
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
683 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
684 $interval *= .5 if ($interval > 0.5*$length);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
685
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
686 return ($interval,$interval/10);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
687 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
688
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
689 # reverse of translate(); given index, return rgb triplet
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
690 sub rgb {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
691 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
692 my $idx = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
693 my $gd = $self->{gd} or return;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
694 return $gd->rgb($idx);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
695 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
696
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
697 sub translate_color {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
698 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
699 my @colors = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
700 if (@colors == 3) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
701 my $gd = $self->gd or return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
702 return $self->colorClosest($gd,@colors);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
703 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
704 elsif ($colors[0] =~ /^\#([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
705 my $gd = $self->gd or return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
706 my ($r,$g,$b) = (hex($1),hex($2),hex($3));
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
707 return $self->colorClosest($gd,$r,$g,$b);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
708 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
709 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
710 my $color = $colors[0];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
711 my $table = $self->{translations} or return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
712 return defined $table->{$color} ? $table->{$color} : 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
713 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
714 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
715
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
716 # workaround for bad GD
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
717 sub colorClosest {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
718 my ($self,$gd,@c) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
719 return $self->{closestcache}{"@c"} if exists $self->{closestcache}{"@c"};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
720 return $self->{closestcache}{"@c"} = $gd->colorClosest(@c) if $GD::VERSION < 2.04;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
721 my ($value,$index);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
722 for (keys %COLORS) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
723 my ($r,$g,$b) = @{$COLORS{$_}};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
724 my $dist = ($r-$c[0])**2 + ($g-$c[1])**2 + ($b-$c[2])**2;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
725 ($value,$index) = ($dist,$_) if !defined($value) || $dist < $value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
726 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
727 return $self->{closestcache}{"@c"} = $self->{translations}{$index};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
728 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
729
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
730 sub bgcolor {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
731 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
732 return unless $self->{bgcolor};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
733 $self->translate_color($self->{bgcolor});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
734 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
735
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
736 sub set_pen {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
737 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
738 my ($linewidth,$color) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
739 return $self->{pens}{$linewidth,$color} if $self->{pens}{$linewidth,$color};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
740
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
741 my $pen = $self->{pens}{$linewidth} = GD::Image->new($linewidth,$linewidth);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
742 my @rgb = $self->rgb($color);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
743 my $bg = $pen->colorAllocate(255,255,255);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
744 my $fg = $pen->colorAllocate(@rgb);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
745 $pen->fill(0,0,$fg);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
746 $self->{gd}->setBrush($pen);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
747 return gdBrushed;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
748 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
749
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
750 sub png {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
751 my $gd = shift->gd;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
752 $gd->png;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
753 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
754
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
755 sub read_colors {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
756 my $class = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
757 while (<DATA>) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
758 chomp;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
759 last if /^__END__/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
760 my ($name,$r,$g,$b) = split /\s+/;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
761 $COLORS{$name} = [hex $r,hex $g,hex $b];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
762 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
763 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
764
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
765 sub color_name_to_rgb {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
766 my $class = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
767 my $color_name = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
768 $class->read_colors() unless %COLORS;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
769 return unless $COLORS{$color_name};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
770 return wantarray ? @{$COLORS{$color_name}}
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
771 : $COLORS{$color_name};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
772 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
773
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
774 sub color_names {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
775 my $class = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
776 $class->read_colors unless %COLORS;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
777 return wantarray ? keys %COLORS : [keys %COLORS];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
778 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
779
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
780 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
781
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
782 __DATA__
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
783 white FF FF FF
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
784 black 00 00 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
785 aliceblue F0 F8 FF
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
786 antiquewhite FA EB D7
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
787 aqua 00 FF FF
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
788 aquamarine 7F FF D4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
789 azure F0 FF FF
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
790 beige F5 F5 DC
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
791 bisque FF E4 C4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
792 blanchedalmond FF EB CD
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
793 blue 00 00 FF
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
794 blueviolet 8A 2B E2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
795 brown A5 2A 2A
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
796 burlywood DE B8 87
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
797 cadetblue 5F 9E A0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
798 chartreuse 7F FF 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
799 chocolate D2 69 1E
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
800 coral FF 7F 50
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
801 cornflowerblue 64 95 ED
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
802 cornsilk FF F8 DC
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
803 crimson DC 14 3C
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
804 cyan 00 FF FF
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
805 darkblue 00 00 8B
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
806 darkcyan 00 8B 8B
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
807 darkgoldenrod B8 86 0B
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
808 darkgray A9 A9 A9
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
809 darkgreen 00 64 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
810 darkkhaki BD B7 6B
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
811 darkmagenta 8B 00 8B
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
812 darkolivegreen 55 6B 2F
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
813 darkorange FF 8C 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
814 darkorchid 99 32 CC
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
815 darkred 8B 00 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
816 darksalmon E9 96 7A
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
817 darkseagreen 8F BC 8F
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
818 darkslateblue 48 3D 8B
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
819 darkslategray 2F 4F 4F
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
820 darkturquoise 00 CE D1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
821 darkviolet 94 00 D3
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
822 deeppink FF 14 100
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
823 deepskyblue 00 BF FF
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
824 dimgray 69 69 69
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
825 dodgerblue 1E 90 FF
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
826 firebrick B2 22 22
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
827 floralwhite FF FA F0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
828 forestgreen 22 8B 22
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
829 fuchsia FF 00 FF
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
830 gainsboro DC DC DC
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
831 ghostwhite F8 F8 FF
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
832 gold FF D7 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
833 goldenrod DA A5 20
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
834 gray 80 80 80
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
835 green 00 80 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
836 greenyellow AD FF 2F
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
837 honeydew F0 FF F0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
838 hotpink FF 69 B4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
839 indianred CD 5C 5C
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
840 indigo 4B 00 82
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
841 ivory FF FF F0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
842 khaki F0 E6 8C
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
843 lavender E6 E6 FA
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
844 lavenderblush FF F0 F5
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
845 lawngreen 7C FC 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
846 lemonchiffon FF FA CD
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
847 lightblue AD D8 E6
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
848 lightcoral F0 80 80
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
849 lightcyan E0 FF FF
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
850 lightgoldenrodyellow FA FA D2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
851 lightgreen 90 EE 90
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
852 lightgrey D3 D3 D3
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
853 lightpink FF B6 C1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
854 lightsalmon FF A0 7A
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
855 lightseagreen 20 B2 AA
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
856 lightskyblue 87 CE FA
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
857 lightslategray 77 88 99
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
858 lightsteelblue B0 C4 DE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
859 lightyellow FF FF E0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
860 lime 00 FF 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
861 limegreen 32 CD 32
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
862 linen FA F0 E6
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
863 magenta FF 00 FF
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
864 maroon 80 00 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
865 mediumaquamarine 66 CD AA
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
866 mediumblue 00 00 CD
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
867 mediumorchid BA 55 D3
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
868 mediumpurple 100 70 DB
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
869 mediumseagreen 3C B3 71
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
870 mediumslateblue 7B 68 EE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
871 mediumspringgreen 00 FA 9A
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
872 mediumturquoise 48 D1 CC
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
873 mediumvioletred C7 15 85
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
874 midnightblue 19 19 70
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
875 mintcream F5 FF FA
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
876 mistyrose FF E4 E1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
877 moccasin FF E4 B5
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
878 navajowhite FF DE AD
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
879 navy 00 00 80
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
880 oldlace FD F5 E6
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
881 olive 80 80 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
882 olivedrab 6B 8E 23
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
883 orange FF A5 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
884 orangered FF 45 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
885 orchid DA 70 D6
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
886 palegoldenrod EE E8 AA
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
887 palegreen 98 FB 98
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
888 paleturquoise AF EE EE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
889 palevioletred DB 70 100
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
890 papayawhip FF EF D5
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
891 peachpuff FF DA B9
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
892 peru CD 85 3F
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
893 pink FF C0 CB
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
894 plum DD A0 DD
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
895 powderblue B0 E0 E6
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
896 purple 80 00 80
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
897 red FF 00 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
898 rosybrown BC 8F 8F
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
899 royalblue 41 69 E1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
900 saddlebrown 8B 45 13
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
901 salmon FA 80 72
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
902 sandybrown F4 A4 60
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
903 seagreen 2E 8B 57
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
904 seashell FF F5 EE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
905 sienna A0 52 2D
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
906 silver C0 C0 C0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
907 skyblue 87 CE EB
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
908 slateblue 6A 5A CD
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
909 slategray 70 80 90
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
910 snow FF FA FA
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
911 springgreen 00 FF 7F
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
912 steelblue 46 82 B4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
913 tan D2 B4 8C
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
914 teal 00 80 80
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
915 thistle D8 BF D8
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
916 tomato FF 63 47
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
917 turquoise 40 E0 D0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
918 violet EE 82 EE
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
919 wheat F5 DE B3
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
920 whitesmoke F5 F5 F5
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
921 yellow FF FF 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
922 yellowgreen 9A CD 32
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
923 gradient1 00 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
924 gradient2 0a ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
925 gradient3 14 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
926 gradient4 1e ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
927 gradient5 28 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
928 gradient6 32 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
929 gradient7 3d ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
930 gradient8 47 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
931 gradient9 51 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
932 gradient10 5b ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
933 gradient11 65 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
934 gradient12 70 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
935 gradient13 7a ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
936 gradient14 84 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
937 gradient15 8e ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
938 gradient16 99 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
939 gradient17 a3 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
940 gradient18 ad ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
941 gradient19 b7 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
942 gradient20 c1 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
943 gradient21 cc ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
944 gradient22 d6 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
945 gradient23 e0 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
946 gradient24 ea ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
947 gradient25 f4 ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
948 gradient26 ff ff 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
949 gradient27 ff f4 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
950 gradient28 ff ea 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
951 gradient29 ff e0 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
952 gradient30 ff d6 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
953 gradient31 ff cc 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
954 gradient32 ff c1 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
955 gradient33 ff b7 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
956 gradient34 ff ad 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
957 gradient35 ff a3 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
958 gradient36 ff 99 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
959 gradient37 ff 8e 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
960 gradient38 ff 84 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
961 gradient39 ff 7a 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
962 gradient40 ff 70 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
963 gradient41 ff 65 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
964 gradient42 ff 5b 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
965 gradient43 ff 51 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
966 gradient44 ff 47 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
967 gradient45 ff 3d 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
968 gradient46 ff 32 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
969 gradient47 ff 28 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
970 gradient48 ff 1e 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
971 gradient49 ff 14 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
972 gradient50 ff 0a 00
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
973 __END__
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
974
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
975 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
976
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
977 Bio::Graphics::Panel - Generate GD images of Bio::Seq objects
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
978
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
979 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
980
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
981 # This script parses a GenBank or EMBL file named on the command
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
982 # line and produces a PNG rendering of it. Call it like this:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
983 # render.pl my_file.embl | display -
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
984
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
985 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
986 use Bio::Graphics;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
987 use Bio::SeqIO;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
988
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
989 my $file = shift or die "provide a sequence file as the argument";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
990 my $io = Bio::SeqIO->new(-file=>$file) or die "could not create Bio::SeqIO";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
991 my $seq = $io->next_seq or die "could not find a sequence in the file";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
992
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
993 my @features = $seq->all_SeqFeatures;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
994
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
995 # sort features by their primary tags
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
996 my %sorted_features;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
997 for my $f (@features) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
998 my $tag = $f->primary_tag;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
999 push @{$sorted_features{$tag}},$f;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1000 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1001
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1002 my $panel = Bio::Graphics::Panel->new(
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1003 -length => $seq->length,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1004 -key_style => 'between',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1005 -width => 800,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1006 -pad_left => 10,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1007 -pad_right => 10,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1008 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1009 $panel->add_track( arrow => Bio::SeqFeature::Generic->new(-start=>1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1010 -end=>$seq->length),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1011 -bump => 0,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1012 -double=>1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1013 -tick => 2);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1014 $panel->add_track(generic => Bio::SeqFeature::Generic->new(-start=>1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1015 -end=>$seq->length),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1016 -glyph => 'generic',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1017 -bgcolor => 'blue',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1018 -label => 1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1019 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1020
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1021 # general case
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1022 my @colors = qw(cyan orange blue purple green chartreuse magenta yellow aqua);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1023 my $idx = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1024 for my $tag (sort keys %sorted_features) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1025 my $features = $sorted_features{$tag};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1026 $panel->add_track($features,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1027 -glyph => 'generic',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1028 -bgcolor => $colors[$idx++ % @colors],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1029 -fgcolor => 'black',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1030 -font2color => 'red',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1031 -key => "${tag}s",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1032 -bump => +1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1033 -height => 8,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1034 -label => 1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1035 -description => 1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1036 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1037 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1038
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1039 print $panel->png;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1040 exit 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1041
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1042 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1043
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1044 The Bio::Graphics::Panel class provides drawing and formatting
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1045 services for any object that implements the Bio::SeqFeatureI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1046 interface, including Ace::Sequence::Feature and Das::Segment::Feature
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1047 objects. It can be used to draw sequence annotations, physical
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1048 (contig) maps, or any other type of map in which a set of discrete
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1049 ranges need to be laid out on the number line.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1050
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1051 The module supports a drawing style in which each type of feature
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1052 occupies a discrete "track" that spans the width of the display. Each
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1053 track will have its own distinctive "glyph", a configurable graphical
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1054 representation of the feature.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1055
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1056 The module also supports a more flexible style in which several
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1057 different feature types and their associated glyphs can occupy the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1058 same track. The choice of glyph is under run-time control.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1059
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1060 Semantic zooming (for instance, changing the type of glyph depending
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1061 on the density of features) is supported by a callback system for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1062 configuration variables. The module has built-in support for Bio::Das
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1063 stylesheets, and stylesheet-driven configuration can be intermixed
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1064 with semantic zooming, if desired.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1065
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1066 You can add a key to the generated image using either of two key
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1067 styles. One style places the key captions at the top of each track.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1068 The other style generates a graphical key at the bottom of the image.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1069
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1070 Note that this modules depends on GD.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1071
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1072 =head1 METHODS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1073
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1074 This section describes the class and object methods for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1075 Bio::Graphics::Panel.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1076
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1077 Typically you will begin by creating a new Bio::Graphics::Panel
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1078 object, passing it the desired width of the image to generate and an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1079 origin and length describing the coordinate range to display. The
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1080 Bio::Graphics::Panel-E<gt>new() method has may configuration variables
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1081 that allow you to control the appearance of the image.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1082
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1083 You will then call add_track() one or more times to add sets of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1084 related features to the picture. add_track() places a new horizontal
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1085 track on the image, and is likewise highly configurable. When you
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1086 have added all the features you desire, you may call png() to convert
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1087 the image into a PNG-format image, or boxes() to return coordinate
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1088 information that can be used to create an imagemap.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1089
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1090 =head2 CONSTRUCTORS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1091
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1092 new() is the constructor for Bio::Graphics::Panel:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1093
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1094 =over 4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1095
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1096 =item $panel = Bio::Graphics::Panel-E<gt>new(@options)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1097
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1098 The new() method creates a new panel object. The options are
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1099 a set of tag/value pairs as follows:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1100
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1101 Option Value Default
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1102 ------ ----- -------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1103
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1104 -offset Base pair to place at extreme left none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1105 of image, in zero-based coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1106
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1107 -length Length of sequence segment, in bp none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1108
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1109 -start Start of range, in 1-based none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1110 coordinates.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1111
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1112 -stop Stop of range, in 1-based none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1113 coordinates.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1114
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1115 -segment A Bio::SeqI or Das::Segment none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1116 object, used to derive sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1117 range if not otherwise specified.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1118
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1119 -width Desired width of image, in pixels 600
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1120
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1121 -spacing Spacing between tracks, in pixels 5
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1122
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1123 -pad_top Additional whitespace between top 0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1124 of image and contents, in pixels
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1125
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1126 -pad_bottom Additional whitespace between top 0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1127 of image and bottom, in pixels
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1128
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1129 -pad_left Additional whitespace between left 0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1130 of image and contents, in pixels
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1131
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1132 -pad_right Additional whitespace between right 0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1133 of image and bottom, in pixels
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1134
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1135 -bgcolor Background color for the panel as a white
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1136 whole
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1137
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1138 -key_color Background color for the key printed wheat
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1139 at bottom of panel (if any)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1140
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1141 -key_spacing Spacing between key glyphs in the 10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1142 key printed at bottom of panel
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1143 (if any)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1144
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1145 -key_font Font to use in printed key gdMediumBoldFont
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1146 captions.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1147
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1148 -key_style Whether to print key at bottom of none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1149 panel ("bottom"), between each
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1150 track ("between"), to the left of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1151 each track ("left"), to the right
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1152 of each track ("right") or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1153 not at all ("none").
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1154
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1155 -empty_tracks What to do when a track is empty. suppress
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1156 Options are to suppress the track
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1157 completely ("suppress"), to show just
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1158 the key in "between" mode ("key"),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1159 to draw a thin grey line ("line"),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1160 or to draw a dashed line ("dashed").
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1161
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1162 -flip flip the drawing coordinates left false
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1163 to right, so that lower coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1164 are to the right. This can be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1165 useful for drawing (-) strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1166 features.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1167
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1168 -all_callbacks Whether to invoke callbacks on false
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1169 the automatic "track" and "group"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1170 glyphs.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1171
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1172 -grid Whether to draw a vertical grid in false
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1173 the background. Pass a scalar true
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1174 value to have a grid drawn at
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1175 regular intervals (corresponding
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1176 to the minor ticks of the arrow
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1177 glyph). Pass an array reference
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1178 to draw the grid at the specified
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1179 positions.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1180
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1181 -gridcolor Color of the grid lightcyan
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1182
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1183
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1184 Typically you will pass new() an object that implements the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1185 Bio::RangeI interface, providing a length() method, from which the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1186 panel will derive its scale.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1187
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1188 $panel = Bio::Graphics::Panel->new(-segment => $sequence,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1189 -width => 800);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1190
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1191 new() will return undef in case of an error.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1192
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1193 Note that if you use the "left" or "right" key styles, you are
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1194 responsible for allocating sufficient -pad_left or -pad_right room for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1195 the labels to appear. The necessary width is the number of characters
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1196 in the longest key times the font width (gdMediumBoldFont by default)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1197 plus 3 pixels of internal padding. The simplest way to calculate this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1198 is to iterate over the possible track labels, find the largest one,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1199 and then to compute its width using the formula:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1200
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1201 $width = gdMediumBoldFont->width * length($longest_key) +3;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1202
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1203 =back
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1204
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1205 =head2 OBJECT METHODS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1206
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1207 =over 4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1208
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1209 =item $track = $panel-E<gt>add_track($glyph,$features,@options)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1210
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1211 The add_track() method adds a new track to the image.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1212
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1213 Tracks are horizontal bands which span the entire width of the panel.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1214 Each track contains a number of graphical elements called "glyphs",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1215 corresponding to a sequence feature.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1216
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1217 There are a large number of glyph types. By default, each track will
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1218 be homogeneous on a single glyph type, but you can mix several glyph
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1219 types on the same track by providing a code reference to the -glyph
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1220 argument. Other options passed to add_track() control the color and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1221 size of the glyphs, whether they are allowed to overlap, and other
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1222 formatting attributes. The height of a track is determined from its
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1223 contents and cannot be directly influenced.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1224
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1225 The first two arguments are the glyph name and an array reference
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1226 containing the list of features to display. The order of the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1227 arguments is irrelevant, allowing either of these idioms:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1228
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1229 $panel->add_track(arrow => \@features);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1230 $panel->add_track(\@features => 'arrow');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1231
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1232
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1233 The glyph name indicates how each feature is to be rendered. A
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1234 variety of glyphs are available, and the number is growing. You may
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1235 omit the glyph name entirely by providing a B<-glyph> argument among
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1236 @options, as described below.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1237
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1238 Currently, the following glyphs are available:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1239
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1240 Name Description
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1241 ---- -----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1242
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1243 anchored_arrow
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1244 a span with vertical bases |---------|. If one or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1245 the other end of the feature is off-screen, the base
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1246 will be replaced by an arrow.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1247
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1248 arrow An arrow; can be unidirectional or bidirectional.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1249 It is also capable of displaying a scale with
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1250 major and minor tickmarks, and can be oriented
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1251 horizontally or vertically.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1252
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1253 cds Draws CDS features, using the phase information to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1254 show the reading frame usage. At high magnifications
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1255 draws the protein translation.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1256
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1257 crossbox A box with a big "X" inside it.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1258
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1259 diamond A diamond, useful for point features like SNPs.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1260
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1261 dna At high magnification draws the DNA sequence. At
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1262 low magnifications draws the GC content.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1263
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1264 dot A circle, useful for point features like SNPs, stop
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1265 codons, or promoter elements.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1266
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1267 ellipse An oval.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1268
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1269 extending_arrow
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1270 Similar to arrow, but a dotted line indicates when the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1271 feature extends beyond the end of the canvas.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1272
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1273 generic A filled rectangle, nondirectional.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1274
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1275 graded_segments
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1276 Similar to segments, but the intensity of the color
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1277 is proportional to the score of the feature. This
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1278 is used for showing the intensity of blast hits or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1279 other alignment features.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1280
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1281 group A group of related features connected by a dashed line.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1282 This is used internally by Panel.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1283
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1284 heterogeneous_segments
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1285 Like segments, but you can use the source field of the feature
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1286 to change the color of each segment.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1287
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1288 line A simple line.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1289
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1290 pinsertion A triangle designed to look like an insertion location
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1291 (e.g. a transposon insertion).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1292
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1293 processed_transcript multi-purpose representation of a spliced mRNA, including
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1294 positions of UTRs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1295
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1296 primers Two inward pointing arrows connected by a line.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1297 Used for STSs.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1298
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1299 redgreen_box A box that changes from green->yellow->red as the score
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1300 of the feature increases from 0.0 to 1.0. Useful for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1301 representing microarray results.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1302
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1303 rndrect A round-cornered rectangle.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1304
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1305 segments A set of filled rectangles connected by solid lines.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1306 Used for interrupted features, such as gapped
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1307 alignments.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1308
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1309 ruler_arrow An arrow with major and minor tick marks and interval
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1310 labels.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1311
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1312 toomany Tries to show many features as a cloud. Not very successful.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1313
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1314 track A group of related features not connected by a line.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1315 This is used internally by Panel.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1316
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1317 transcript Similar to segments, but the connecting line is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1318 a "hat" shape, and the direction of transcription
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1319 is indicated by a small arrow.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1320
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1321 transcript2 Similar to transcript, but the direction of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1322 transcription is indicated by a terminal exon
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1323 in the shape of an arrow.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1324
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1325 translation 1, 2 and 3-frame translations. At low magnifications,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1326 can be configured to show start and stop codon locations.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1327 At high magnifications, shows the multi-frame protein
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1328 translation.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1329
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1330 triangle A triangle whose width and orientation can be altered.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1331
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1332 xyplot Histograms and other graphs plotted against the genome.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1333
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1334 If the glyph name is omitted from add_track(), the "generic" glyph
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1335 will be used by default. To get more information about a glyph, run
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1336 perldoc on "Bio::Graphics::Glyph::glyphname", replacing "glyphname"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1337 with the name of the glyph you are interested in.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1338
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1339 The @options array is a list of name/value pairs that control the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1340 attributes of the track. Some options are interpretered directly by
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1341 the track. Others are passed down to the individual glyphs (see
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1342 L<"GLYPH OPTIONS">). The following options are track-specific:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1343
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1344 Option Description Default
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1345 ------ ----------- -------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1346
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1347 -tkcolor Track color white
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1348
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1349 -glyph Glyph class to use. "generic"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1350
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1351 -stylesheet Bio::Das::Stylesheet to none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1352 use to generate glyph
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1353 classes and options.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1354
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1355 B<-tkcolor> controls the background color of the track as a whole.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1356
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1357 B<-glyph> controls the glyph type. If present, it supersedes the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1358 glyph name given in the first or second argument to add_track(). The
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1359 value of B<-glyph> may be a constant string, a hash reference, or a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1360 code reference. In the case of a constant string, that string will be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1361 used as the class name for all generated glyphs. If a hash reference
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1362 is passed, then the feature's primary_tag() will be used as the key to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1363 the hash, and the value, if any, used to generate the glyph type. If
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1364 a code reference is passed, then this callback will be passed each
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1365 feature in turn as its single argument. The callback is expected to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1366 examine the feature and return a glyph name as its single result.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1367
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1368 Example:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1369
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1370 $panel->add_track(\@exons,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1371 -glyph => sub { my $feature = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1372 $feature->source_tag eq 'curated'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1373 ? 'ellipse' : 'generic'; }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1374 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1375
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1376 The B<-stylesheet> argument is used to pass a Bio::Das stylesheet
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1377 object to the panel. This stylesheet will be called to determine both
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1378 the glyph and the glyph options. If both a stylesheet and direct
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1379 options are provided, the latter take precedence.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1380
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1381 If successful, add_track() returns an Bio::Graphics::Glyph object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1382 You can use this object to add additional features or to control the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1383 appearance of the track with greater detail, or just ignore it.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1384 Tracks are added in order from the top of the image to the bottom. To
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1385 add tracks to the top of the image, use unshift_track().
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1386
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1387 B<Adding groups of features:> It is not uncommon to add a group of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1388 features which are logically connected, such as the 5' and 3' ends of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1389 EST reads. To group features into sets that remain on the same
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1390 horizontal position and bump together, pass the sets as an anonymous
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1391 array. For example:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1392
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1393 $panel->add_track(segments => [[$abc_5,$abc_3],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1394 [$xxx_5,$xxx_3],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1395 [$yyy_5,$yyy_3]]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1396 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1397
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1398 Typical usage is:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1399
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1400 $panel->add_track( transcript => \@genes,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1401 -fillcolor => 'green',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1402 -fgcolor => 'black',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1403 -bump => +1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1404 -height => 10,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1405 -label => 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1406
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1407 =item $track = unshift_track($glyph,$features,@options)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1408
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1409 unshift_track() works like add_track(), except that the new track is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1410 added to the top of the image rather than the bottom.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1411
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1412 =item $gd = $panel-E<gt>gd([$gd])
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1413
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1414 The gd() method lays out the image and returns a GD::Image object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1415 containing it. You may then call the GD::Image object's png() or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1416 jpeg() methods to get the image data.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1417
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1418 Optionally, you may pass gd() a preexisting GD::Image object that you
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1419 wish to draw on top of. If you do so, you should call the width() and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1420 height() methods first to ensure that the image has sufficient
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1421 dimensions.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1422
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1423 =item $png = $panel-E<gt>png
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1424
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1425 The png() method returns the image as a PNG-format drawing, without
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1426 the intermediate step of returning a GD::Image object.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1427
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1428 =item $boxes = $panel-E<gt>boxes
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1429
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1430 =item @boxes = $panel-E<gt>boxes
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1431
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1432 The boxes() method returns the coordinates of each glyph, useful for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1433 constructing an image map. In a scalar context, boxes() returns an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1434 array ref. In an list context, the method returns the array directly.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1435
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1436 Each member of the list is an anonymous array of the following format:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1437
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1438 [ $feature, $x1, $y1, $x2, $y2 ]
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1439
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1440 The first element is the feature object; either an
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1441 Ace::Sequence::Feature, a Das::Segment::Feature, or another Bioperl
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1442 Bio::SeqFeatureI object. The coordinates are the topleft and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1443 bottomright corners of the glyph, including any space allocated for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1444 labels.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1445
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1446 =item $position = $panel-E<gt>track_position($track)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1447
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1448 After calling gd() or boxes(), you can learn the resulting Y
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1449 coordinate of a track by calling track_position() with the value
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1450 returned by add_track() or unshift_track(). This will return undef if
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1451 called before gd() or boxes() or with an invalid track.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1452
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1453 =item @pixel_coords = $panel-E<gt>location2pixel(@feature_coords)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1454
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1455 Public routine to map feature coordinates (in base pairs) into pixel
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1456 coordinates relative to the left-hand edge of the picture.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1457
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1458 =back
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1459
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1460 =head1 GLYPH OPTIONS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1461
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1462 Each glyph has its own specialized subset of options, but
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1463 some are shared by all glyphs:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1464
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1465 Option Description Default
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1466 ------ ----------- -------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1467
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1468 -fgcolor Foreground color black
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1469
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1470 -bgcolor Background color turquoise
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1471
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1472 -linewidth Width of lines drawn by 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1473 glyph
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1474
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1475 -height Height of glyph 10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1476
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1477 -font Glyph font gdSmallFont
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1478
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1479 -fontcolor Primary font color black
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1480
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1481 -font2color Secondary font color turquoise
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1482
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1483 -label Whether to draw a label false
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1484
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1485 -description Whether to draw a false
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1486 description
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1487
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1488 -bump Bump direction 0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1489
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1490 -sort_order Specify layout sort order "default"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1491
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1492 -bump_limit Maximum number of levels undef (unlimited)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1493 to bump
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1494
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1495 -strand_arrow Whether to indicate undef (false)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1496 strandedness
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1497
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1498 -stranded Synonym for -strand_arrow undef (false)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1499
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1500 -connector Type of connector to none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1501 use to connect related
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1502 features. Options are
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1503 "solid," "hat", "dashed",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1504 "quill" and "none".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1505
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1506 -key Description of track for undef
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1507 use in key.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1508
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1509 -all_callbacks Whether to invoke undef
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1510 callbacks for autogenerated
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1511 "track" and "group" glyphs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1512
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1513 -box_subparts Return boxes around feature false
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1514 subparts rather than around the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1515 feature itself.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1516
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1517
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1518 B<Specifying colors:> Colors can be expressed in either of two ways:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1519 as symbolic names such as "cyan" and as HTML-style #RRGGBB triples.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1520 The symbolic names are the 140 colors defined in the Netscape/Internet
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1521 Explorer color cube, and can be retrieved using the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1522 Bio::Graphics::Panel-E<gt>color_names() method.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1523
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1524 B<Foreground color:> The -fgcolor option controls the foreground
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1525 color, including the edges of boxes and the like.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1526
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1527 B<Background color:> The -bgcolor option controls the background used
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1528 for filled boxes and other "solid" glyphs. The foreground color
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1529 controls the color of lines and strings. The -tkcolor argument
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1530 controls the background color of the entire track.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1531
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1532 B<Track color:> The -tkcolor option used to specify the background of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1533 the entire track.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1534
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1535 B<Font color:> The -fontcolor option controls the color of primary
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1536 text, such as labels
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1537
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1538 B<Secondary Font color:> The -font2color option controls the color of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1539 secondary text, such as descriptions.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1540
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1541 B<Labels:> The -label argument controls whether or not the ID of the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1542 feature should be printed next to the feature. It is accepted by all
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1543 glyphs. By default, the label is printed just above the glyph and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1544 left aligned with it.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1545
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1546 -label can be a constant string or a code reference. Values can be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1547 any of:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1548
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1549 -label value Description
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1550 ------------ -----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1551
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1552 0 Don't draw a label
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1553 1 Calculate a label based on primary tag of sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1554 "a string" Use "a string" as the label
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1555 code ref Invoke the code reference to compute the label
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1556
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1557 A known bug with this naming scheme is that you can't label a feature
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1558 with the string "1". To work around this, use "1 " (note the terminal
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1559 space).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1560
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1561 B<Descriptions:> The -description argument controls whether or not a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1562 brief description of the feature should be printed next to it. By
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1563 default, the description is printed just below the glyph and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1564 left-aligned with it. A value of 0 will suppress the description. A
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1565 value of 1 will call the source_tag() method of the feature. A code
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1566 reference will be invoked to calculate the description on the fly.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1567 Anything else will be treated as a string and used verbatim.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1568
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1569 B<Connectors:> A glyph can contain subglyphs, recursively. The top
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1570 level glyph is the track, which contains one or more groups, which
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1571 contain features, which contain subfeatures, and so forth. By
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1572 default, the "group" glyph draws dotted lines between each of its
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1573 subglyphs, the "segment" glyph draws a solid line between each of its
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1574 subglyphs, and the "transcript" and "transcript2" glyphs draw
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1575 hat-shaped lines between their subglyphs. All other glyphs do not
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1576 connect their components. You can override this behavior by providing
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1577 a -connector option, to explicitly set the type of connector. Valid
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1578 options are:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1579
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1580
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1581 "hat" an upward-angling conector
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1582 "solid" a straight horizontal connector
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1583 "quill" a decorated line with small arrows indicating strandedness
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1584 (like the UCSC Genome Browser uses)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1585 "dashed" a horizontal dashed line.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1586
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1587 The B<-connector_color> option controls the color of the connector, if
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1588 any.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1589
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1590 B<Collision control:> The -bump argument controls what happens when
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1591 glyphs collide. By default, they will simply overlap (value 0). A
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1592 -bump value of +1 will cause overlapping glyphs to bump downwards
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1593 until there is room for them. A -bump value of -1 will cause
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1594 overlapping glyphs to bump upwards. The bump argument can also be a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1595 code reference; see below.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1596
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1597 B<Keys:> The -key argument declares that the track is to be shown in a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1598 key appended to the bottom of the image. The key contains a picture
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1599 of a glyph and a label describing what the glyph means. The label is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1600 specified in the argument to -key.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1601
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1602 B<box_subparts:> Ordinarily, when you invoke the boxes() methods to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1603 retrieve the rectangles surrounding the glyphs (which you need to do
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1604 to create clickable imagemaps, for example), the rectangles will
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1605 surround the top level features. If you wish for the rectangles to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1606 surround subpieces of the glyph, such as the exons in a transcript,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1607 set box_subparts to a true value.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1608
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1609 B<strand_arrow:> If set to true, some glyphs will indicate their
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1610 strandedness, usually by drawing an arrow. For this to work, the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1611 Bio::SeqFeature must have a strand of +1 or -1. The glyph will ignore
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1612 this directive if the underlying feature has a strand of zero or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1613 undef.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1614
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1615 B<sort_order>: By default, features are drawn with a layout based only on the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1616 position of the feature, assuring a maximal "packing" of the glyphs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1617 when bumped. In some cases, however, it makes sense to display the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1618 glyphs sorted by score or some other comparison, e.g. such that more
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1619 "important" features are nearer the top of the display, stacked above
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1620 less important features. The -sort_order option allows a few
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1621 different built-in values for changing the default sort order (which
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1622 is by "left" position): "low_score" (or "high_score") will cause
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1623 features to be sorted from lowest to highest score (or vice versa).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1624 "left" (or "default") and "right" values will cause features to be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1625 sorted by their position in the sequence. "longer" (or "shorter")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1626 will cause the longest (or shortest) features to be sorted first, and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1627 "strand" will cause the features to be sorted by strand: "+1"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1628 (forward) then "0" (unknown, or NA) then "-1" (reverse).
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1629
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1630 In all cases, the "left" position will be used to break any ties. To
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1631 break ties using another field, options may be strung together using a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1632 "|" character; e.g. "strand|low_score|right" would cause the features
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1633 to be sorted first by strand, then score (lowest to highest), then by
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1634 "right" position in the sequence. Finally, a subroutine coderef can
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1635 be provided, which should expect to receive two feature objects (via
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1636 the special sort variables $a and $b), and should return -1, 0 or 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1637 (see Perl's sort() function for more information); this subroutine
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1638 will be used without further modification for sorting. For example,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1639 to sort a set of database search hits by bits (stored in the features'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1640 "score" fields), scaled by the log of the alignment length (with
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1641 "left" position breaking any ties):
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1642
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1643 sort_order = sub { ( $b->score/log($b->length)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1644 <=>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1645 $a->score/log($a->length) )
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1646 ||
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1647 ( $a->start <=> $b->start )
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1648 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1649
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1650 B<bump_limit>: When bumping is chosen, colliding features will
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1651 ordinarily move upward or downward without limit. When many features
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1652 collide, this can lead to excessively high images. You can limit the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1653 number of levels that features will bump by providing a numeric
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1654 B<bump_limit> option.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1655
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1656 =head2 Options and Callbacks
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1657
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1658 Instead of providing a constant value to an option, you may subsitute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1659 a code reference. This code reference will be called every time the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1660 panel needs to configure a glyph. The callback will be called with
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1661 three arguments like this:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1662
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1663 sub callback {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1664 my ($feature,$option_name,$part_no,$total_parts,$glyph) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1665 # do something which results in $option_value being set
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1666 return $option_value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1667 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1668
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1669 The five arguments are C<$feature>, a reference to the IO::SeqFeatureI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1670 object, C<$option_name>, the name of the option to configure,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1671 C<$part_no>, an integer index indicating which subpart of the feature
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1672 is being drawn, C<$total_parts>, an integer indicating the total
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1673 number of subfeatures in the feature, and finally C<$glyph>, the Glyph
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1674 object itself. The latter fields are useful in the case of treating
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1675 the first or last subfeature differently, such as using a different
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1676 color for the terminal exon of a gene. Usually you will only need to
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1677 examine the first argument. This example shows a callback examining
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1678 the score() attribute of a feature (possibly a BLAST hit) and return
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1679 the color "red" for high-scoring features, and "green" for low-scoring
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1680 features:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1681
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1682 sub callback {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1683 my $feature = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1684 if ($feature->score > 90) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1685 return 'red';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1686 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1687 return 'green';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1688 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1689 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1690
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1691 The callback should return a string indicating the desired value of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1692 the option. To tell the panel to use the default value for this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1693 option, return the string "*default*".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1694
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1695 When you install a callback for a feature that contains subparts, the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1696 callback will be invoked first for the top-level feature, and then for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1697 each of its subparts (recursively). You should make sure to examine
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1698 the feature's type to determine whether the option is appropriate.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1699
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1700 Some glyphs deliberately disable this recursive feature. The "track",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1701 "group", "transcript", "transcript2" and "segments" glyphs selectively
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1702 disable the -bump, -label and -description options. This is to avoid,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1703 for example, a label being attached to each exon in a transcript, or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1704 the various segments of a gapped alignment bumping each other. You
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1705 can override this behavior and force your callback to be invoked by
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1706 providing add_track() with a true B<-all_callbacks> argument. In this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1707 case, you must be prepared to handle configuring options for the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1708 "group" and "track" glyphs.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1709
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1710 In particular, this means that in order to control the -bump option
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1711 with a callback, you should specify -all_callbacks=E<gt>1, and turn on
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1712 bumping when the callback is in the track or group glyphs.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1713
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1714 =head2 ACCESSORS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1715
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1716 The following accessor methods provide access to various attributes of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1717 the panel object. Called with no arguments, they each return the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1718 current value of the attribute. Called with a single argument, they
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1719 set the attribute and return its previous value.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1720
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1721 Note that in most cases you must change attributes prior to invoking
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1722 gd(), png() or boxes(). These three methods all invoke an internal
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1723 layout() method which places the tracks and the glyphs within them,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1724 and then caches the result.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1725
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1726 Accessor Name Description
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1727 ------------- -----------
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1728
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1729 width() Get/set width of panel
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1730 spacing() Get/set spacing between tracks
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1731 key_spacing() Get/set spacing between keys
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1732 length() Get/set length of segment (bp)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1733 flip() Get/set coordinate flipping
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1734 pad_top() Get/set top padding
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1735 pad_left() Get/set left padding
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1736 pad_bottom() Get/set bottom padding
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1737 pad_right() Get/set right padding
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1738 start() Get the start of the sequence (bp; read only)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1739 end() Get the end of the sequence (bp; read only)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1740 left() Get the left side of the drawing area (pixels; read only)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1741 right() Get the right side of the drawing area (pixels; read only)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1742
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1743 =head2 COLOR METHODS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1744
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1745 The following methods are used internally, but may be useful for those
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1746 implementing new glyph types.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1747
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1748 =over 4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1749
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1750 =item @names = Bio::Graphics::Panel-E<gt>color_names
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1751
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1752 Return the symbolic names of the colors recognized by the panel
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1753 object. In a scalar context, returns an array reference.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1754
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1755 =item ($red,$green,$blue) = Bio::Graphics::Panel-E<gt>color_name_to_rgb($color)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1756
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1757 Given a symbolic color name, returns the red, green, blue components
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1758 of the color. In a scalar context, returns an array reference to the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1759 rgb triplet. Returns undef for an invalid color name.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1760
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1761 =item @rgb = $panel-E<gt>rgb($index)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1762
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1763 Given a GD color index (between 0 and 140), returns the RGB triplet
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1764 corresponding to this index. This method is only useful within a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1765 glyph's draw() routine, after the panel has allocated a GD::Image and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1766 is populating it.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1767
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1768 =item $index = $panel-E<gt>translate_color($color)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1769
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1770 Given a color, returns the GD::Image index. The color may be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1771 symbolic, such as "turquoise", or a #RRGGBB triple, as in #F0E0A8.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1772 This method is only useful within a glyph's draw() routine, after the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1773 panel has allocated a GD::Image and is populating it.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1774
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1775 =item $panel-E<gt>set_pen($width,$color)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1776
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1777 Changes the width and color of the GD drawing pen to the values
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1778 indicated. This is called automatically by the GlyphFactory fgcolor()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1779 method. It returns the GD value gdBrushed, which should be used for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1780 drawing.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1781
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1782 =back
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1783
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1784 =head1 BUGS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1785
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1786 Please report them.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1787
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1788 =head1 SEE ALSO
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1789
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1790 L<Bio::Graphics::Glyph>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1791 L<Bio::Graphics::Glyph::arrow>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1792 L<Bio::Graphics::Glyph::cds>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1793 L<Bio::Graphics::Glyph::crossbox>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1794 L<Bio::Graphics::Glyph::diamond>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1795 L<Bio::Graphics::Glyph::dna>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1796 L<Bio::Graphics::Glyph::dot>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1797 L<Bio::Graphics::Glyph::ellipse>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1798 L<Bio::Graphics::Glyph::extending_arrow>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1799 L<Bio::Graphics::Glyph::generic>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1800 L<Bio::Graphics::Glyph::graded_segments>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1801 L<Bio::Graphics::Glyph::heterogeneous_segments>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1802 L<Bio::Graphics::Glyph::line>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1803 L<Bio::Graphics::Glyph::pinsertion>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1804 L<Bio::Graphics::Glyph::primers>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1805 L<Bio::Graphics::Glyph::rndrect>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1806 L<Bio::Graphics::Glyph::segments>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1807 L<Bio::Graphics::Glyph::redgreen_box>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1808 L<Bio::Graphics::Glyph::ruler_arrow>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1809 L<Bio::Graphics::Glyph::toomany>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1810 L<Bio::Graphics::Glyph::transcript>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1811 L<Bio::Graphics::Glyph::transcript2>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1812 L<Bio::Graphics::Glyph::translation>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1813 L<Bio::Graphics::Glyph::triangle>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1814 L<Bio::Graphics::Glyph::xyplot>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1815 L<Bio::SeqI>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1816 L<Bio::SeqFeatureI>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1817 L<Bio::Das>,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1818 L<GD>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1819
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1820 =head1 AUTHOR
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1821
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1822 Lincoln Stein E<lt>lstein@cshl.orgE<gt>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1823
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1824 Copyright (c) 2001 Cold Spring Harbor Laboratory
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1825
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1826 This library is free software; you can redistribute it and/or modify
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1827 it under the same terms as Perl itself. See DISCLAIMER.txt for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1828 disclaimers of warranty.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1829
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1830 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1831