annotate variant_effect_predictor/Bio/Graphics/Glyph/arrow.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 package Bio::Graphics::Glyph::arrow;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2 # package to use for drawing an arrow
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5 use vars '@ISA';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 use Bio::Graphics::Glyph::generic;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 @ISA = 'Bio::Graphics::Glyph::generic';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9 my %UNITS = (n => 1e-12,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10 n => 1e-9,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 u => 1e-6,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12 m => 0.001,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 c => 0.01,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14 k => 1000,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15 M => 1_000_000,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16 G => 1_000_000_000);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18 sub pad_bottom {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20 my $val = $self->SUPER::pad_bottom(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21 $val += $self->font->height if $self->option('tick');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22 $val;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25 # override draw method
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26 sub draw {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28 my $parallel = $self->option('parallel');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 $parallel = 1 unless defined $parallel;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30 $self->draw_parallel(@_) if $parallel;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 $self->draw_perpendicular(@_) unless $parallel;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34 sub draw_perpendicular {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36 my $gd = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 my ($dx,$dy) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38 my ($x1,$y1,$x2,$y2) = $self->bounds(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 my $ne = $self->option('northeast');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41 my $sw = $self->option('southwest');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 $ne = $sw = 1 unless defined($ne) || defined($sw);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 # draw a perpendicular arrow at position indicated by $x1
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 my $fg = $self->set_pen;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 my $a2 = ($y2-$y1)/4;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 my @positions = $x1 == $x2 ? ($x1) : ($x1,$x2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49 for my $x (@positions) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50 if ($ne) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 $gd->line($x,$y1,$x,$y2,$fg);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 $gd->line($x-$a2,$y1+$a2,$x,$y1,$fg);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53 $gd->line($x+$a2,$y1+$a2,$x,$y1,$fg);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55 if ($sw) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56 $gd->line($x,$y1,$x,$y2,$fg);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 $gd->line($x-$a2,$y2-$a2,$x,$y2,$fg);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58 $gd->line($x+$a2,$y2-$a2,$x,$y2,$fg);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62 # add a label if requested
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 $self->draw_label($gd,$dx,$dy) if $self->option('label'); # this draws the label aligned to the left
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 sub draw_parallel {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 my $gd = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69 my ($dx,$dy) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 my ($x1,$y1,$x2,$y2) = $self->bounds(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72 my $fg = $self->set_pen;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73 my $a2 = ($self->height)/2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 my $center = $y1+$a2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 my $trunc_left = $x1 < $self->panel->left;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77 my $trunc_right = $x2 > $self->panel->right;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79 $x1 = $self->panel->left if $trunc_left;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 $x2 = $self->panel->right if $trunc_right;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 $trunc_left = 0 if $self->no_trunc;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 $trunc_right = 0 if $self->no_trunc;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85 my ($sw,$ne,$base_w,$base_e) = $self->arrowheads;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 $gd->line($x1,$center,$x2,$center,$fg);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87 $self->arrowhead($gd,$x1,$center,$a2,-1) if $sw && !$trunc_left; # west arrow
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 $self->arrowhead($gd,$x2,$center,$a2,+1) if $ne && !$trunc_right; # east arrow
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 $gd->line($x1,$center-$a2,$x1,$center+$a2,$fg) if $base_w && !$trunc_left; #west base
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90 $gd->line($x2,$center-$a2,$x2,$center+$a2,$fg) if $base_e && !$trunc_right; #east base
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92 # turn on ticks
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 if ($self->option('tick')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 local $^W = 0; # dumb uninitialized variable warning
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 my $font = $self->font;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 my $width = $font->width;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 my $font_color = $self->fontcolor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 my $height = $self->height;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 my $relative = $self->option('relative_coords');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 my $relative_coords_offset = $self->option('relative_coords_offset');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 $relative_coords_offset = 1 unless ($relative_coords_offset);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 my $start = $relative ? $relative_coords_offset : $self->feature->start-1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105 my $stop = $start + $self->feature->length - 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107 my $offset = $relative ? ($self->feature->start - $relative_coords_offset) : 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 my $reversed = exists $self->{flip} || ($relative && $self->feature->strand < 0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110 my $unit_label = $self->option('units') || '';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 my $unit_divider = $self->option('unit_divider') || 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 my $units = $self->calculate_units($start/$unit_divider,$self->feature->length/$unit_divider);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 my $divisor = $UNITS{$units} || 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 $divisor *= $unit_divider;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118 my $format = min($self->feature->length,$self->panel->length)/$divisor > 10
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 ? "%d$units%s" : "%.6g$units%s";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 my $scale = $self->option('scale') || 1; ## Does the user want to override the internal scale?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 my $model = sprintf("$format ",$stop/($divisor*$scale),$unit_label);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 my $minlen = $width * length($model);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 my ($major_interval,$minor_interval) = $self->panel->ticks(($stop-$start+1)/$unit_divider,$minlen);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 my $left = $sw ? $x1+$height : $x1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 my $right = $ne ? $x2-$height : $x2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 # adjust for portions of arrow that are outside panel
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 $start += $self->panel->start - $self->feature->start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133 if $self->feature->start < $self->panel->start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 $stop -= $self->feature->end - $self->panel->end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 if $self->feature->end > $self->panel->end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137 my $first_tick = $major_interval * int(0.5 + $start/$major_interval);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 my $last_tick = $major_interval * int(0.5 + $stop/$major_interval);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 for (my $i = $first_tick; $i <= $last_tick; $i += $major_interval) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 my $tickpos = $dx + ($reversed ? $self->map_pt($stop - $i + $offset)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 : $self->map_pt($i + $offset));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 next if $tickpos < $left or $tickpos > $right;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 $gd->line($tickpos,$center-$a2,$tickpos,$center+$a2,$fg);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147 my $label = $scale ? $i / $scale : $i;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 my $scaled = $label/$divisor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 $label = sprintf($format,$scaled,$unit_label);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 my $middle = $tickpos - (length($label) * $width)/2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 next if $middle < $left or $middle > $right;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 $gd->string($font,$middle,$center+$a2-1,$label,$font_color)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 unless ($self->option('no_tick_label'));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 if ($self->option('tick') >= 2) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 $first_tick = $minor_interval * int(0.5 + $start/$minor_interval);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 $last_tick = $minor_interval * int(0.5 + $stop/$minor_interval);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 my $a4 = $self->height/4;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 for (my $i = $first_tick; $i <= $last_tick; $i += $minor_interval) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 my $tickpos = $dx + ($reversed ? $self->map_pt($stop - $i + $offset)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 : $self->map_pt($i + $offset));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 next if $tickpos < $left or $tickpos > $right;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 $gd->line($tickpos,$center-$a4,$tickpos,$center+$a4,$fg);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174 # add a label if requested
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 $self->draw_label($gd,$dx,$dy) if $self->option('label');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 $self->draw_description($gd,$dx,$dy) if $self->option('description');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 sub arrowheads {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 my ($ne,$sw,$base_e,$base_w);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182 if ($self->option('double')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183 $ne = $sw = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 $ne = $self->option('northeast') || $self->option('east');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 $sw = $self->option('southwest') || $self->option('west');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188 # otherwise use strandedness to define the arrow
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 unless (defined($ne) || defined($sw)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 # turn on both if neither specified
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191 $ne = 1 if $self->feature->strand > 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 $sw = 1 if $self->feature->strand < 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 ($ne,$sw) = ($sw,$ne) if $self->{flip};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 return ($sw,$ne,0,0) unless $self->option('base');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 return ($sw,$ne,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 (!$sw && $self->feature->start>= $self->panel->start),
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 (!$ne && $self->feature->end <= $self->panel->end));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 sub no_trunc { 0; }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 sub calculate_units {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 my ($start,$length) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 return 'G' if $length >= 1e9;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 return 'M' if $length >= 1e6;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 return 'k' if $length >= 1e3;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 return '' if $length >= 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 return 'c' if $length >= 1e-2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211 return 'm' if $length >= 1e-3;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 return 'u' if $length >= 1e-6;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 return 'n' if $length >= 1e-9;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 return 'p';
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 sub min { $_[0]<$_[1] ? $_[0] : $_[1] }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 __END__
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 Ace::Graphics::Glyph::arrow - The "arrow" glyph
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 See L<Ace::Graphics::Panel> and L<Ace::Graphics::Glyph>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 This glyph draws arrows. Depending on options, the arrows can be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 labeled, be oriented vertically or horizontally, or can contain major
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 and minor ticks suitable for use as a scale.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 =head2 OPTIONS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 The following options are standard among all Glyphs. See
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 L<Bio::Graphics::Glyph> for a full explanation.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 Option Description Default
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 ------ ----------- -------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245 -fgcolor Foreground color black
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 -outlinecolor Synonym for -fgcolor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249 -bgcolor Background color turquoise
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 -fillcolor Synonym for -bgcolor
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253 -linewidth Line width 1
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255 -height Height of glyph 10
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 -font Glyph font gdSmallFont
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 -connector Connector type 0 (false)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 -connector_color
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 Connector color black
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264 -label Whether to draw a label 0 (false)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 -description Whether to draw a description 0 (false)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 In addition to the common options, the following glyph-specific
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 options are recognized:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 Option Description Default
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 ------ ----------- -------
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 -tick Whether to draw major 0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 and minor ticks.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 0 = no ticks
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 1 = major ticks
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278 2 = minor ticks
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 -parallel Whether to draw the arrow 1 (true)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 parallel to the sequence
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 or perpendicular to it.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 -northeast Force a north or east 1 (true)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285 arrowhead(depending
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 on orientation)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 -east synonym of above
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 -southwest Force a south or west 1 (true)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 arrowhead(depending
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 on orientation)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294 -west synonym of above
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 -double force-doubleheaded arrow 0 (false)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 -base Draw a vertical base at the 0 (false)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 non-arrowhead side
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 -scale Reset the labels on the arrow 0 (false)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 to reflect an externally
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 established scale.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 -arrowstyle "regular" to create a simple regular
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 arrowhead. "filled" to create
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307 a thick filled arrowhead
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 -units add units to the tick labels none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310 e.g. bp
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 -unit_divider 1
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313 divide tick labels by the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 indicated amount prior to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 displaying (use, for example
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 if you want to display in
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 cR units)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 Set -parallel to 0 (false) to display a point-like feature such as a
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320 polymorphism, or to indicate an important location. If the feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 start == end, then the glyph will draw a single arrow at the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 designated location:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 ^
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 |
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 Otherwise, there will be two arrows at the start and end:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 ^ ^
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 | |
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332 Scale: Pass in a externally established scale to reset the labels on
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 the arrow. This is particularly useful for manually constructed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 images where the founding parameters of the panel are not 1-based.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335 For example, a genetic map interval ranging from 0.1 - 0.3 can be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 constructed by first multiplying every value by 100. Passing
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 arrow(-scale=>100);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 will draw tick marks labelled appropriately to your external scale.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 =head1 BUGS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 Please report them.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 =head1 SEE ALSO
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 L<Bio::Graphics::Panel>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 L<Bio::Graphics::Glyph>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 L<Bio::Graphics::Glyph::arrow>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 L<Bio::Graphics::Glyph::cds>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 L<Bio::Graphics::Glyph::crossbox>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 L<Bio::Graphics::Glyph::diamond>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 L<Bio::Graphics::Glyph::dna>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 L<Bio::Graphics::Glyph::dot>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 L<Bio::Graphics::Glyph::ellipse>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 L<Bio::Graphics::Glyph::extending_arrow>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 L<Bio::Graphics::Glyph::generic>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 L<Bio::Graphics::Glyph::graded_segments>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 L<Bio::Graphics::Glyph::heterogeneous_segments>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 L<Bio::Graphics::Glyph::line>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 L<Bio::Graphics::Glyph::pinsertion>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 L<Bio::Graphics::Glyph::primers>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 L<Bio::Graphics::Glyph::rndrect>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 L<Bio::Graphics::Glyph::segments>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 L<Bio::Graphics::Glyph::ruler_arrow>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 L<Bio::Graphics::Glyph::toomany>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 L<Bio::Graphics::Glyph::transcript>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 L<Bio::Graphics::Glyph::transcript2>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 L<Bio::Graphics::Glyph::translation>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 L<Bio::Graphics::Glyph::triangle>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 L<Bio::DB::GFF>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 L<Bio::SeqI>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 L<Bio::SeqFeatureI>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 L<Bio::Das>,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 L<GD>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378 =head1 AUTHOR
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 Lincoln Stein E<lt>lstein@cshl.orgE<gt>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 Copyright (c) 2001 Cold Spring Harbor Laboratory
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384 This library is free software; you can redistribute it and/or modify
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385 it under the same terms as Perl itself. See DISCLAIMER.txt for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 disclaimers of warranty.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 =cut