comparison variant_effect_predictor/Bio/Graphics/Glyph/Factory.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 =head1 NAME
2
3 Bio::Graphics::Glyph::Factory - Factory for Bio::Graphics::Glyph objects
4
5 =head1 SYNOPSIS
6
7 See L<Bio::Graphics::Panel>.
8
9 =head1 DESCRIPTION
10
11 This class is used internally by Bio::Graphics to generate new Glyph
12 objects by combining a list of features with the user's desired
13 configuration. It is intended to be used internally by Bio::Graphics.
14
15 =head1 FEEDBACK
16
17 =head2 Mailing Lists
18
19 User feedback is an integral part of the evolution of this and other
20 Bioperl modules. Send your comments and suggestions preferably to one
21 of the Bioperl mailing lists. Your participation is much appreciated.
22
23 bioperl-l@bioperl.org - General discussion
24 http://bioperl.org/MailList.shtml - About the mailing lists
25
26 =head2 Reporting Bugs
27
28 Report bugs to the Bioperl bug tracking system to help us keep track
29 the bugs and their resolution. Bug reports can be submitted via
30 email or the web:
31
32 bioperl-bugs@bio.perl.org
33 http://bugzilla.bioperl.org/
34
35 =head1 AUTHOR - Lincoln Stein
36
37 Email - lstein@cshl.org
38
39 =head1 SEE ALSO
40
41 L<Bio::Graphics::Panel>
42
43 =head1 APPENDIX
44
45 The rest of the documentation details each of the object
46 methods. Internal methods are usually preceded with an "_"
47 (underscore).
48
49 =cut
50
51 package Bio::Graphics::Glyph::Factory;
52
53 use strict;
54 use Carp qw(:DEFAULT cluck);
55 use GD;
56
57 my %LOADED_GLYPHS = ();
58 my %GENERIC_OPTIONS = (
59 bgcolor => 'turquoise',
60 fgcolor => 'black',
61 fontcolor => 'black',
62 font2color => 'turquoise',
63 height => 8,
64 font => gdSmallFont,
65 bump => +1, # bump by default (perhaps a mistake?)
66 );
67
68 =head2 new
69
70 Title : new
71 Usage : $f = Bio::Graphics::Glyph::Factory->new(
72 -stylesheet => $stylesheet,
73 -glyph_map => $glyph_map,
74 -options => $options);
75 Function : create a new Bio::Graphics::Glyph::Factory object
76 Returns : the new object
77 Args : $stylesheet is a Bio::Das::Stylesheet object that can
78 convert Bio::Das feature objects into glyph names and
79 associated options.
80 $glyph_map is a hash that maps primary tags to glyph names.
81 $options is a hash that maps option names to their values.
82 Status : Internal to Bio::Graphics
83
84 =cut
85
86 sub new {
87 my $class = shift;
88 my $panel = shift;
89 my %args = @_;
90 my $stylesheet = $args{-stylesheet}; # optional, for Bio::Das compatibility
91 my $map = $args{-map}; # map type name to glyph name
92 my $options = $args{-options}; # map type name to glyph options
93 return bless {
94 stylesheet => $stylesheet,
95 glyph_map => $map,
96 options => $options,
97 panel => $panel,
98 },$class;
99 }
100
101 =head2 clone
102
103 Title : clone
104 Usage : $f2 = $f->clone
105 Function : Deep copy of a factory object
106 Returns : a deep copy of the factory object
107 Args : None
108 Status : Internal to Bio::Graphics
109
110 =cut
111
112 sub clone {
113 my $self = shift;
114 my %new = %$self;
115 my $new = bless \%new,ref($self);
116 $new;
117 }
118
119 =head2 stylesheet
120
121 Title : stylesheet
122 Usage : $stylesheet = $f->stylesheet
123 Function : accessor for stylesheet
124 Returns : a Bio::Das::Stylesheet object
125 Args : None
126 Status : Internal to Bio::Graphics
127
128 =cut
129
130 sub stylesheet { shift->{stylesheet} }
131
132 =head2 glyph_map
133
134 Title : glyph_map
135 Usage : $map = $f->glyph_map
136 Function : accessor for the glyph map
137 Returns : a hash mapping primary tags to glyphs
138 Args : None
139 Status : Internal to Bio::Graphics
140
141 =cut
142
143 sub glyph_map { shift->{glyph_map} }
144
145 =head2 option_map
146
147 Title : option_map
148 Usage : $map = $f->option_map
149 Function : accessor for the option map
150 Returns : a hash mapping option names to values
151 Args : None
152 Status : Internal to Bio::Graphics
153
154 =cut
155
156 sub option_map { shift->{options} }
157
158 =head2 global_opts
159
160 Title : global_opts
161 Usage : $map = $f->global_opts
162 Function : accessor for global options
163 Returns : a hash mapping option names to values
164 Args : None
165 Status : Internal to Bio::Graphics
166
167 This returns a set of defaults for option values.
168
169 =cut
170
171 sub global_opts{ shift->{global_opts} }
172
173 =head2 panel
174
175 Title : panel
176 Usage : $panel = $f->panel
177 Function : accessor for Bio::Graphics::Panel
178 Returns : a Bio::Graphics::Panel
179 Args : None
180 Status : Internal to Bio::Graphics
181
182 This returns the panel with which the factory is associated.
183
184 =cut
185
186 sub panel { shift->{panel} }
187
188 =head2 scale
189
190 Title : scale
191 Usage : $scale = $f->scale
192 Function : accessor for the scale
193 Returns : a floating point number
194 Args : None
195 Status : Internal to Bio::Graphics
196
197 This returns the scale, in pixels/bp for glyphs constructed by this
198 factory.
199
200 =cut
201
202 sub scale { shift->{panel}->scale }
203
204 =head2 font
205
206 Title : font
207 Usage : $font = $f->font
208 Function : accessor for the font
209 Returns : a font name
210 Args : None
211 Status : Internal to Bio::Graphics
212
213 This returns a GD font name.
214
215 =cut
216
217 sub font {
218 my $self = shift;
219 my $glyph = shift;
220 $self->option($glyph,'font') || $self->{font};
221 }
222
223 =head2 map_pt
224
225 Title : map_pt
226 Usage : @pixel_positions = $f->map_pt(@bp_positions)
227 Function : map bp positions to pixel positions
228 Returns : a list of pixel positions
229 Args : a list of bp positions
230 Status : Internal to Bio::Graphics
231
232 The real work is done by the panel, but factory subclasses can
233 override if desired.
234
235 =cut
236
237 sub map_pt {
238 my $self = shift;
239 my @result = $self->panel->map_pt(@_);
240 return wantarray ? @result : $result[0];
241 }
242
243 =head2 map_no_trunc
244
245 Title : map_no_trunc
246 Usage : @pixel_positions = $f->map_no_trunc(@bp_positions)
247 Function : map bp positions to pixel positions
248 Returns : a list of pixel positions
249 Args : a list of bp positions
250 Status : Internal to Bio::Graphics
251
252 Same as map_pt(), but it will NOT clip pixel positions to be within
253 the drawing frame.
254
255 =cut
256
257 sub map_no_trunc {
258 my $self = shift;
259 my @result = $self->panel->map_no_trunc(@_);
260 return wantarray ? @result : $result[0];
261 }
262
263 =head2 translate_color
264
265 Title : translate_color
266 Usage : $index = $f->translate_color($color_name)
267 Function : translate symbolic color names into GD indexes
268 Returns : an integer
269 Args : a color name in format "green" or "#00FF00"
270 Status : Internal to Bio::Graphics
271
272 The real work is done by the panel, but factory subclasses can
273 override if desired.
274
275 =cut
276
277 sub translate_color {
278 my $self = shift;
279 my $color_name = shift;
280 $self->panel->translate_color($color_name);
281 }
282
283 =head2 glyph
284
285 Title : glyph
286 Usage : @glyphs = $f->glyph($level,$feature1,$feature2...)
287 Function : transform features into glyphs.
288 Returns : a list of Bio::Graphics::Glyph objects
289 Args : a feature "level", followed by a list of FeatureI objects.
290 Status : Internal to Bio::Graphics
291
292 The level is used to track the level of nesting of features that have
293 subfeatures.
294
295 =cut
296
297 # create a glyph
298 sub make_glyph {
299 my $self = shift;
300 my $level = shift;
301 my @result;
302 my $panel = $self->panel;
303 my ($leftmost,$rightmost) = ($panel->left,$panel->right);
304 my $flip = $panel->flip;
305
306 for my $f (@_) {
307
308 my $type = $self->feature_to_glyph($f);
309 my $glyphclass = 'Bio::Graphics::Glyph';
310 $type ||= 'generic';
311 $glyphclass .= "\:\:\L$type";
312
313 unless ($LOADED_GLYPHS{$glyphclass}++) {
314 carp("the requested glyph class, ``$type'' is not available: $@")
315 unless (eval "require $glyphclass");
316 }
317 my $glyph = $glyphclass->new(-feature => $f,
318 -factory => $self,
319 -flip => $flip,
320 -level => $level);
321
322 # this is removing glyphs that are not onscreen at all.
323 # But never remove tracks!
324 push @result,$glyph if $type eq 'track'
325 || ($glyph->{left} + $glyph->{width} > $leftmost && $glyph->{left} < $rightmost);
326
327 }
328 return wantarray ? @result : $result[0];
329 }
330
331 =head2 feature_to_glyph
332
333 Title : feature_to_glyph
334 Usage : $glyph_name = $f->feature_to_glyph($feature)
335 Function : choose the glyph name given a feature
336 Returns : a glyph name
337 Args : a Bio::Seq::FeatureI object
338 Status : Internal to Bio::Graphics
339
340 =cut
341
342 sub feature_to_glyph {
343 my $self = shift;
344 my $feature = shift;
345
346 return scalar $self->{stylesheet}->glyph($feature) if $self->{stylesheet};
347 my $map = $self->glyph_map or return 'generic';
348 if (ref($map) eq 'CODE') {
349 my $val = eval {$map->($feature)};
350 warn $@ if $@;
351 return $val || 'generic';
352 }
353 return $map->{$feature->primary_tag} || 'generic';
354 }
355
356
357 =head2 set_option
358
359 Title : set_option
360 Usage : $f->set_option($option_name=>$option_value)
361 Function : set or change an option
362 Returns : nothing
363 Args : a name/value pair
364 Status : Internal to Bio::Graphics
365
366 =cut
367
368 sub set_option {
369 my $self = shift;
370 my ($option_name,$option_value) = @_;
371 $self->{overriding_options}{lc $option_name} = $option_value;
372 }
373
374 # options:
375 # the overriding_options hash has precedence
376 # ...followed by the option_map
377 # ...followed by the stylesheet
378 # ...followed by generic options
379 sub option {
380 my $self = shift;
381 my ($glyph,$option_name,$partno,$total_parts) = @_;
382 return unless defined $option_name;
383 $option_name = lc $option_name; # canonicalize
384
385 return $self->{overriding_options}{$option_name}
386 if exists $self->{overriding_options} && exists $self->{overriding_options}{$option_name};
387
388 if (my $map = $self->option_map) {
389 if (defined(my $value = $map->{$option_name})) {
390 my $feature = $glyph->feature;
391 return $value unless ref $value eq 'CODE';
392 return unless $feature->isa('Bio::SeqFeatureI');
393 my $val = eval { $value->($feature,$option_name,$partno,$total_parts,$glyph)};
394 warn $@ if $@;
395 return defined $val && $val eq '*default*' ? $GENERIC_OPTIONS{$option_name} : $val;
396 }
397 }
398
399 if (my $ss = $self->stylesheet) {
400 my($glyph,%options) = $ss->glyph($glyph->feature);
401 my $value = $options{$option_name};
402 return $value if defined $value;
403 }
404
405 return $GENERIC_OPTIONS{$option_name};
406 }
407
408
409 =head2 options
410
411 Title : options
412 Usage : @option_names = $f->options
413 Function : return all configured option names
414 Returns : a list of option names
415 Args : none
416 Status : Internal to Bio::Graphics
417
418 =cut
419
420 # return names of all the options in the option hashes
421 sub options {
422 my $self = shift;
423 my %options;
424 if (my $map = $self->option_map) {
425 $options{lc($_)}++ foreach keys %$map;
426 }
427 $options{lc($_)}++ foreach keys %GENERIC_OPTIONS;
428 return keys %options;
429 }
430
431 1;