Mercurial > repos > willmclaren > ensembl_vep
diff variant_effect_predictor/Bio/Graphics/Glyph/generic.pm @ 0:21066c0abaf5 draft
Uploaded
author | willmclaren |
---|---|
date | Fri, 03 Aug 2012 10:04:48 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/Graphics/Glyph/generic.pm Fri Aug 03 10:04:48 2012 -0400 @@ -0,0 +1,300 @@ +package Bio::Graphics::Glyph::generic; + +use strict; +use Bio::Graphics::Glyph; +use vars '@ISA'; +@ISA = 'Bio::Graphics::Glyph'; + +my %complement = (g=>'c',a=>'t',t=>'a',c=>'g', + G=>'C',A=>'T',T=>'A',C=>'G'); + +# new options are 'label' -- short label to print over glyph +# 'description' -- long label to print under glyph +# label and description can be flags or coderefs. +# If a flag, label will be taken from seqname, if it exists or primary_tag(). +# description will be taken from source_tag(). + +sub pad_top { + my $self = shift; + my $top = $self->option('pad_top'); + return $top if defined $top; + my $pad = $self->SUPER::pad_top; + $pad += $self->labelheight if $self->label; + $pad; +} +sub pad_bottom { + my $self = shift; + my $bottom = $self->option('pad_bottom'); + return $bottom if defined $bottom; + my $pad = $self->SUPER::pad_bottom; + $pad += $self->labelheight if $self->description; + $pad; +} +sub pad_right { + my $self = shift; + my $pad = $self->SUPER::pad_right; + my $label_width = length($self->label||'') * $self->font->width; + my $description_width = length($self->description||'') * $self->font->width; + my $max = $label_width > $description_width ? $label_width : $description_width; + my $right = $max - $self->width; + return $pad > $right ? $pad : $right; +} + +sub labelheight { + my $self = shift; + return $self->{labelheight} ||= $self->font->height; +} +sub label { + my $self = shift; + return if $self->{overbumped}; # set by the bumper when we have hit bump limit + return unless $self->{level} == 0; + return exists $self->{label} ? $self->{label} + : ($self->{label} = $self->_label); +} +sub description { + my $self = shift; + return if $self->{overbumped}; # set by the bumper when we have hit bump limit + return unless $self->{level} == 0; + return exists $self->{description} ? $self->{description} + : ($self->{description} = $self->_description); +} +sub _label { + my $self = shift; + + # allow caller to specify the label + my $label = $self->option('label'); + return unless defined $label; + return $label unless $label eq '1'; + return "1" if $label eq '1 '; # 1 with a space + + + # figure it out ourselves + my $f = $self->feature; + + return $f->display_name if $f->can('display_name'); + return $f->info if $f->can('info'); # deprecated API + return $f->seq_id if $f->can('seq_id'); + return eval{$f->primary_tag}; +} +sub _description { + my $self = shift; + + # allow caller to specify the long label + my $label = $self->option('description'); + return unless defined $label; + return $label unless $label eq '1'; + return "1" if $label eq '1 '; + + return $self->{_description} if exists $self->{_description}; + return $self->{_description} = $self->get_description($self->feature); +} + +sub get_description { + my $self = shift; + my $feature = shift; + + # common places where we can get descriptions + return join '; ',$feature->notes if $feature->can('notes'); + return $feature->desc if $feature->can('desc'); + + my $tag = $feature->source_tag; + return undef if $tag eq ''; + $tag; +} + +sub draw { + my $self = shift; + $self->SUPER::draw(@_); + $self->draw_label(@_) if $self->option('label'); + $self->draw_description(@_) if $self->option('description'); +} + +sub draw_label { + my $self = shift; + my ($gd,$left,$top,$partno,$total_parts) = @_; + my $label = $self->label or return; + my $x = $self->left + $left; + $x = $self->panel->left + 1 if $x <= $self->panel->left; + my $font = $self->option('labelfont') || $self->font; + $gd->string($font, + $x, + $self->top + $top, + $label, + $self->fontcolor); +} +sub draw_description { + my $self = shift; + my ($gd,$left,$top,$partno,$total_parts) = @_; + my $label = $self->description or return; + my $x = $self->left + $left; + $x = $self->panel->left + 1 if $x <= $self->panel->left; + $gd->string($self->font, + $x, + $self->bottom - $self->pad_bottom + $top, + $label, + $self->font2color); +} + +sub dna_fits { + my $self = shift; + + my $pixels_per_base = $self->scale; + my $font = $self->font; + my $font_width = $font->width; + + return $pixels_per_base >= $font_width; +} + +sub arrowhead { + my $self = shift; + my $gd = shift; + my ($x,$y,$height,$orientation) = @_; + + my $fg = $self->set_pen; + my $style = $self->option('arrowstyle') || 'regular'; + + if ($style eq 'filled') { + my $poly = new GD::Polygon; + if ($orientation >= 0) { + $poly->addPt($x-$height,$y-$height); + $poly->addPt($x,$y); + $poly->addPt($x-$height,$y+$height,$y); + } else { + $poly->addPt($x+$height,$y-$height); + $poly->addPt($x,$y); + $poly->addPt($x+$height,$y+$height,$y); + } + $gd->filledPolygon($poly,$fg); + } else { + if ($orientation >= 0) { + $gd->line($x-$height,$y-$height,$x,$y,$fg); + $gd->line($x,$y,$x-$height,$y+$height,$fg); + } else { + $gd->line($x+$height,$y-$height,$x,$y,$fg); + $gd->line($x,$y,$x+$height,$y+$height,$fg); + } + } +} + +sub arrow { + my $self = shift; + my $gd = shift; + my ($x1,$x2,$y) = @_; + + my $fg = $self->set_pen; + my $height = $self->height/3; + + $gd->line($x1,$y,$x2,$y,$fg); + $self->arrowhead($gd,$x2,$y,$height,+1) if $x1 < $x2; + $self->arrowhead($gd,$x2,$y,$height,-1) if $x2 < $x1; +} + +sub reversec { + $_[1]=~tr/gatcGATC/ctagCTAG/; + return scalar reverse $_[1]; +} + +1; + +=head1 NAME + +Bio::Graphics::Glyph::generic - The "generic" glyph + +=head1 SYNOPSIS + + See L<Bio::Graphics::Panel> and L<Bio::Graphics::Glyph>. + +=head1 DESCRIPTION + +This is identical to the "box" glyph. It is the default glyph used +when not otherwise specified. + +=head2 OPTIONS + +The following options are standard among all Glyphs. See +L<Bio::Graphics::Glyph> for a full explanation. + + Option Description Default + ------ ----------- ------- + + -fgcolor Foreground color black + + -outlinecolor Synonym for -fgcolor + + -bgcolor Background color turquoise + + -fillcolor Synonym for -bgcolor + + -linewidth Line width 1 + + -height Height of glyph 10 + + -font Glyph font gdSmallFont + + -connector Connector type 0 (false) + + -connector_color + Connector color black + + -pad_top Top padding 0 + + -pad_bottom Bottom padding 0 + + -label Whether to draw a label 0 (false) + + -description Whether to draw a description 0 (false) + + -strand_arrow Whether to indicate 0 (false) + strandedness + +-pad_top and -pad_bottom allow you to insert some blank space between +the glyph's boundary and its contents. This is useful if you are +changing the glyph's height dynamically based on its feature's score. + +=head1 BUGS + +Please report them. + +=head1 SEE ALSO + +L<Bio::Graphics::Panel>, +L<Bio::Graphics::Glyph>, +L<Bio::Graphics::Glyph::arrow>, +L<Bio::Graphics::Glyph::cds>, +L<Bio::Graphics::Glyph::crossbox>, +L<Bio::Graphics::Glyph::diamond>, +L<Bio::Graphics::Glyph::dna>, +L<Bio::Graphics::Glyph::dot>, +L<Bio::Graphics::Glyph::ellipse>, +L<Bio::Graphics::Glyph::extending_arrow>, +L<Bio::Graphics::Glyph::generic>, +L<Bio::Graphics::Glyph::graded_segments>, +L<Bio::Graphics::Glyph::heterogeneous_segments>, +L<Bio::Graphics::Glyph::line>, +L<Bio::Graphics::Glyph::pinsertion>, +L<Bio::Graphics::Glyph::primers>, +L<Bio::Graphics::Glyph::rndrect>, +L<Bio::Graphics::Glyph::segments>, +L<Bio::Graphics::Glyph::ruler_arrow>, +L<Bio::Graphics::Glyph::toomany>, +L<Bio::Graphics::Glyph::transcript>, +L<Bio::Graphics::Glyph::transcript2>, +L<Bio::Graphics::Glyph::translation>, +L<Bio::Graphics::Glyph::triangle>, +L<Bio::DB::GFF>, +L<Bio::SeqI>, +L<Bio::SeqFeatureI>, +L<Bio::Das>, +L<GD> + +=head1 AUTHOR + +Allen Day E<lt>day@cshl.orgE<gt>. + +Copyright (c) 2001 Cold Spring Harbor Laboratory + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. See DISCLAIMER.txt for +disclaimers of warranty. + +=cut