From Code to Community: Sponsoring The Perl and Raku Conference 2025 Learn more

# $Id: transcript.pm,v 1.23.4.1 2006/10/02 23:10:20 sendu Exp $
use strict;
sub pad_left {
my $self = shift;
return 0 unless $self->{level} == 0;
my $pad = $self->SUPER::pad_left;
my $strand = $self->feature->strand;
return $pad unless defined $strand && $strand < 0;
return $self->arrow_length > $pad ? $self->arrow_length : $pad;
}
sub pad_right {
my $self = shift;
return 0 unless $self->{level} == 0;
my $pad = $self->SUPER::pad_right;
my $strand = $self->feature->strand;
return $pad unless defined($strand) && $strand > 0;
return $self->arrow_length > $pad ? $self->arrow_length : $pad;
}
sub draw_component {
my $self = shift;
return unless $self->level > 0;
$self->SUPER::draw_component(@_);
}
sub part_label_merge {
my $self = shift;
my $label = $self->SUPER::part_label_merge;
return $label if defined $label;
1;
}
sub draw_connectors {
my $self = shift;
my $gd = shift;
my ($left,$top) = @_;
$self->SUPER::draw_connectors($gd,$left,$top);
my @parts = $self->parts; # or return;
# H'mmm. No parts. Must be in an intron, so draw intron
# spanning entire range
if (!@parts) {
return unless $self->feature_has_subparts;
my($x1,$y1,$x2,$y2) = $self->bounds(0,0);
$self->_connector($gd,$left,$top,$x1,$y1,$x1,$y2,$x2,$y1,$x2,$y2);
@parts = ($self);
}
# flip argument makes this confusing
# certainly there's a simpler way to express this idea
my $strand = $self->feature->strand;
my ($first,$last) = ($parts[0],$parts[-1]);
($first,$last) = ($last,$first) if exists $self->{flip};
if ($strand > 0) {
my($x1,$y1,$x2,$y2) = $last->bounds(@_);
my $center = ($y2+$y1)/2;
$self->{flip} ?
$self->arrow($gd,$x1,$x1-$self->arrow_length,$center)
:
$self->arrow($gd,$x2,$x2+$self->arrow_length,$center);
}
elsif ($strand < 0) {
my($x1,$y1,$x2,$y2) = $first->bounds(@_);
my $center = ($y2+$y1)/2;
$self->{flip } ?
$self->arrow($gd,$x2,$x2+$self->arrow_length,$center)
:
$self->arrow($gd,$x1,$x1 - $self->arrow_length,$center);
}
}
sub arrow_length {
my $self = shift;
return $self->option('arrow_length') || 8;
}
# override option() for force the "hat" type of connector
sub connector {
my $self = shift;
return $self->SUPER::connector(@_) if $self->all_callbacks;
return ($self->option('connector') || 'hat');
}
1;
__END__
=head1 NAME
Bio::Graphics::Glyph::transcript - The "transcript" glyph
=head1 SYNOPSIS
See L<Bio::Graphics::Panel> and L<Bio::Graphics::Glyph>.
=head1 DESCRIPTION
This glyph is used for drawing transcripts. It is essentially a
"segments" glyph in which the connecting segments are hats. The
direction of the transcript is indicated by an arrow attached to the
end of the glyph.
=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
-label Whether to draw a label 0 (false)
-description Whether to draw a description 0 (false)
-hilite Highlight color undef (no color)
In addition, the alignment glyph recognizes the following
glyph-specific options:
Option Description Default
------ ----------- -------
-arrow_length Length of the directional 8
arrow.
=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
Lincoln Stein E<lt>lstein@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