comparison variant_effect_predictor/Bio/Graphics/Glyph/generic.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1f6dce3d34e0
1 package Bio::Graphics::Glyph::generic;
2
3 use strict;
4 use Bio::Graphics::Glyph;
5 use vars '@ISA';
6 @ISA = 'Bio::Graphics::Glyph';
7
8 my %complement = (g=>'c',a=>'t',t=>'a',c=>'g',
9 G=>'C',A=>'T',T=>'A',C=>'G');
10
11 # new options are 'label' -- short label to print over glyph
12 # 'description' -- long label to print under glyph
13 # label and description can be flags or coderefs.
14 # If a flag, label will be taken from seqname, if it exists or primary_tag().
15 # description will be taken from source_tag().
16
17 sub pad_top {
18 my $self = shift;
19 my $top = $self->option('pad_top');
20 return $top if defined $top;
21 my $pad = $self->SUPER::pad_top;
22 $pad += $self->labelheight if $self->label;
23 $pad;
24 }
25 sub pad_bottom {
26 my $self = shift;
27 my $bottom = $self->option('pad_bottom');
28 return $bottom if defined $bottom;
29 my $pad = $self->SUPER::pad_bottom;
30 $pad += $self->labelheight if $self->description;
31 $pad;
32 }
33 sub pad_right {
34 my $self = shift;
35 my $pad = $self->SUPER::pad_right;
36 my $label_width = length($self->label||'') * $self->font->width;
37 my $description_width = length($self->description||'') * $self->font->width;
38 my $max = $label_width > $description_width ? $label_width : $description_width;
39 my $right = $max - $self->width;
40 return $pad > $right ? $pad : $right;
41 }
42
43 sub labelheight {
44 my $self = shift;
45 return $self->{labelheight} ||= $self->font->height;
46 }
47 sub label {
48 my $self = shift;
49 return if $self->{overbumped}; # set by the bumper when we have hit bump limit
50 return unless $self->{level} == 0;
51 return exists $self->{label} ? $self->{label}
52 : ($self->{label} = $self->_label);
53 }
54 sub description {
55 my $self = shift;
56 return if $self->{overbumped}; # set by the bumper when we have hit bump limit
57 return unless $self->{level} == 0;
58 return exists $self->{description} ? $self->{description}
59 : ($self->{description} = $self->_description);
60 }
61 sub _label {
62 my $self = shift;
63
64 # allow caller to specify the label
65 my $label = $self->option('label');
66 return unless defined $label;
67 return $label unless $label eq '1';
68 return "1" if $label eq '1 '; # 1 with a space
69
70
71 # figure it out ourselves
72 my $f = $self->feature;
73
74 return $f->display_name if $f->can('display_name');
75 return $f->info if $f->can('info'); # deprecated API
76 return $f->seq_id if $f->can('seq_id');
77 return eval{$f->primary_tag};
78 }
79 sub _description {
80 my $self = shift;
81
82 # allow caller to specify the long label
83 my $label = $self->option('description');
84 return unless defined $label;
85 return $label unless $label eq '1';
86 return "1" if $label eq '1 ';
87
88 return $self->{_description} if exists $self->{_description};
89 return $self->{_description} = $self->get_description($self->feature);
90 }
91
92 sub get_description {
93 my $self = shift;
94 my $feature = shift;
95
96 # common places where we can get descriptions
97 return join '; ',$feature->notes if $feature->can('notes');
98 return $feature->desc if $feature->can('desc');
99
100 my $tag = $feature->source_tag;
101 return undef if $tag eq '';
102 $tag;
103 }
104
105 sub draw {
106 my $self = shift;
107 $self->SUPER::draw(@_);
108 $self->draw_label(@_) if $self->option('label');
109 $self->draw_description(@_) if $self->option('description');
110 }
111
112 sub draw_label {
113 my $self = shift;
114 my ($gd,$left,$top,$partno,$total_parts) = @_;
115 my $label = $self->label or return;
116 my $x = $self->left + $left;
117 $x = $self->panel->left + 1 if $x <= $self->panel->left;
118 my $font = $self->option('labelfont') || $self->font;
119 $gd->string($font,
120 $x,
121 $self->top + $top,
122 $label,
123 $self->fontcolor);
124 }
125 sub draw_description {
126 my $self = shift;
127 my ($gd,$left,$top,$partno,$total_parts) = @_;
128 my $label = $self->description or return;
129 my $x = $self->left + $left;
130 $x = $self->panel->left + 1 if $x <= $self->panel->left;
131 $gd->string($self->font,
132 $x,
133 $self->bottom - $self->pad_bottom + $top,
134 $label,
135 $self->font2color);
136 }
137
138 sub dna_fits {
139 my $self = shift;
140
141 my $pixels_per_base = $self->scale;
142 my $font = $self->font;
143 my $font_width = $font->width;
144
145 return $pixels_per_base >= $font_width;
146 }
147
148 sub arrowhead {
149 my $self = shift;
150 my $gd = shift;
151 my ($x,$y,$height,$orientation) = @_;
152
153 my $fg = $self->set_pen;
154 my $style = $self->option('arrowstyle') || 'regular';
155
156 if ($style eq 'filled') {
157 my $poly = new GD::Polygon;
158 if ($orientation >= 0) {
159 $poly->addPt($x-$height,$y-$height);
160 $poly->addPt($x,$y);
161 $poly->addPt($x-$height,$y+$height,$y);
162 } else {
163 $poly->addPt($x+$height,$y-$height);
164 $poly->addPt($x,$y);
165 $poly->addPt($x+$height,$y+$height,$y);
166 }
167 $gd->filledPolygon($poly,$fg);
168 } else {
169 if ($orientation >= 0) {
170 $gd->line($x-$height,$y-$height,$x,$y,$fg);
171 $gd->line($x,$y,$x-$height,$y+$height,$fg);
172 } else {
173 $gd->line($x+$height,$y-$height,$x,$y,$fg);
174 $gd->line($x,$y,$x+$height,$y+$height,$fg);
175 }
176 }
177 }
178
179 sub arrow {
180 my $self = shift;
181 my $gd = shift;
182 my ($x1,$x2,$y) = @_;
183
184 my $fg = $self->set_pen;
185 my $height = $self->height/3;
186
187 $gd->line($x1,$y,$x2,$y,$fg);
188 $self->arrowhead($gd,$x2,$y,$height,+1) if $x1 < $x2;
189 $self->arrowhead($gd,$x2,$y,$height,-1) if $x2 < $x1;
190 }
191
192 sub reversec {
193 $_[1]=~tr/gatcGATC/ctagCTAG/;
194 return scalar reverse $_[1];
195 }
196
197 1;
198
199 =head1 NAME
200
201 Bio::Graphics::Glyph::generic - The "generic" glyph
202
203 =head1 SYNOPSIS
204
205 See L<Bio::Graphics::Panel> and L<Bio::Graphics::Glyph>.
206
207 =head1 DESCRIPTION
208
209 This is identical to the "box" glyph. It is the default glyph used
210 when not otherwise specified.
211
212 =head2 OPTIONS
213
214 The following options are standard among all Glyphs. See
215 L<Bio::Graphics::Glyph> for a full explanation.
216
217 Option Description Default
218 ------ ----------- -------
219
220 -fgcolor Foreground color black
221
222 -outlinecolor Synonym for -fgcolor
223
224 -bgcolor Background color turquoise
225
226 -fillcolor Synonym for -bgcolor
227
228 -linewidth Line width 1
229
230 -height Height of glyph 10
231
232 -font Glyph font gdSmallFont
233
234 -connector Connector type 0 (false)
235
236 -connector_color
237 Connector color black
238
239 -pad_top Top padding 0
240
241 -pad_bottom Bottom padding 0
242
243 -label Whether to draw a label 0 (false)
244
245 -description Whether to draw a description 0 (false)
246
247 -strand_arrow Whether to indicate 0 (false)
248 strandedness
249
250 -pad_top and -pad_bottom allow you to insert some blank space between
251 the glyph's boundary and its contents. This is useful if you are
252 changing the glyph's height dynamically based on its feature's score.
253
254 =head1 BUGS
255
256 Please report them.
257
258 =head1 SEE ALSO
259
260 L<Bio::Graphics::Panel>,
261 L<Bio::Graphics::Glyph>,
262 L<Bio::Graphics::Glyph::arrow>,
263 L<Bio::Graphics::Glyph::cds>,
264 L<Bio::Graphics::Glyph::crossbox>,
265 L<Bio::Graphics::Glyph::diamond>,
266 L<Bio::Graphics::Glyph::dna>,
267 L<Bio::Graphics::Glyph::dot>,
268 L<Bio::Graphics::Glyph::ellipse>,
269 L<Bio::Graphics::Glyph::extending_arrow>,
270 L<Bio::Graphics::Glyph::generic>,
271 L<Bio::Graphics::Glyph::graded_segments>,
272 L<Bio::Graphics::Glyph::heterogeneous_segments>,
273 L<Bio::Graphics::Glyph::line>,
274 L<Bio::Graphics::Glyph::pinsertion>,
275 L<Bio::Graphics::Glyph::primers>,
276 L<Bio::Graphics::Glyph::rndrect>,
277 L<Bio::Graphics::Glyph::segments>,
278 L<Bio::Graphics::Glyph::ruler_arrow>,
279 L<Bio::Graphics::Glyph::toomany>,
280 L<Bio::Graphics::Glyph::transcript>,
281 L<Bio::Graphics::Glyph::transcript2>,
282 L<Bio::Graphics::Glyph::translation>,
283 L<Bio::Graphics::Glyph::triangle>,
284 L<Bio::DB::GFF>,
285 L<Bio::SeqI>,
286 L<Bio::SeqFeatureI>,
287 L<Bio::Das>,
288 L<GD>
289
290 =head1 AUTHOR
291
292 Allen Day E<lt>day@cshl.orgE<gt>.
293
294 Copyright (c) 2001 Cold Spring Harbor Laboratory
295
296 This library is free software; you can redistribute it and/or modify
297 it under the same terms as Perl itself. See DISCLAIMER.txt for
298 disclaimers of warranty.
299
300 =cut