This glyph draws arrows. Depending on options, the arrows can be
labeled, be oriented vertically or horizontally, or can contain major
and minor ticks suitable for use as a scale.
The following options are standard among all Glyphs. See
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)
In addition to the common options, the following glyph-specific
options are recognized:
Option Description Default
------ ----------- -------
-tick Whether to draw major 0
and minor ticks.
0 = no ticks
1 = major ticks
2 = minor ticks
-parallel Whether to draw the arrow true
parallel to the sequence
or perpendicular to it.
-northeast Force a north or east true
arrowhead(depending
on orientation)
-east synonym of above
-southwest Force a south or west true
arrowhead(depending
on orientation)
-west synonym of above
-double force-doubleheaded arrow
-base Draw a vertical base at the false
non-arrowhead side
-scale Reset the labels on the arrow false
to reflect an externally
established scale.
-arrowstyle "regular" to create a simple arrowhead ->
"filled" to create a thick filled arrowhead
Set -parallel to false to display a point-like feature such as a
polymorphism, or to indicate an important location. If the feature
start == end, then the glyph will draw a single arrow at the
designated location:
^
|
Otherwise, there will be two arrows at the start and end:
^ ^
| |
Scale: Pass in a externally established scale to reset the labels on
the arrow. This is particularly useful for manually constructed
images where the founding parameters of the panel are not 1-based.
For example, a genetic map interval ranging from 0.1 - 0.3 can be
constructed by first multiplying every value by 100. Passing
arrow(-scale=>100);
will draw tick marks labelled appropriately to your external scale.
None available.
sub draw_perpendicular
{ my $self = shift;
my $gd = shift;
my ($dx,$dy) = @_;
my ($x1,$y1,$x2,$y2) = $self->bounds(@_);
my $ne = $self->option('northeast');
my $sw = $self->option('southwest');
$ne = $sw = 1 unless defined($ne) || defined($sw);
my $fg = $self->set_pen;
my $a2 = ($y2-$y1)/4;
my @positions = $x1 == $x2 ? ($x1) : ($x1,$x2);
for my $x (@positions) {
if ($ne) {
$gd->line($x,$y1,$x,$y2,$fg);
$gd->line($x-$a2,$y1+$a2,$x,$y1,$fg);
$gd->line($x+$a2,$y1+$a2,$x,$y1,$fg);
}
if ($sw) {
$gd->line($x,$y1,$x,$y2,$fg);
$gd->line($x-$a2,$y2-$a2,$x,$y2,$fg);
$gd->line($x+$a2,$y2-$a2,$x,$y2,$fg);
}
}
$self->draw_label($gd,$dx,$dy) if $self->option('label');
} |
sub draw_parallel
{ my $self = shift;
my $gd = shift;
my ($dx,$dy) = @_;
my ($x1,$y1,$x2,$y2) = $self->bounds(@_);
my $fg = $self->set_pen;
my $a2 = ($self->height)/2; my $center = $y1+$a2;
$x1 = $self->panel->left if $x1 < $self->panel->left;
$x2 = $self->panel->right if $x2 > $self->panel->right;
my ($sw,$ne,$base_w,$base_e) = $self->arrowheads;
$gd->line($x1,$center,$x2,$center,$fg);
$self->arrowhead($gd,$x1,$center,$a2,-1) if $sw; $self->arrowhead($gd,$x2,$center,$a2,+1) if $ne; $gd->line($x2,$center-$a2,$x2,$center+$a2,$fg) if $base_e; $gd->line($x1,$center-$a2,$x1,$center+$a2,$fg) if $base_w;
if ($self->option('tick')) {
local $^W = 0; my $font = $self->font;
my $width = $font->width;
my $font_color = $self->fontcolor;
my $height = $self->height;
my $relative = $self->option('relative_coords');
my $start = $relative ? 1 : $self->feature->start;
my $stop = $start + $self->feature->length - 1;
my $offset = $relative ? $self->feature->start-1 : 0;
my $reversed = $relative && $self->feature->strand < 0;
my $units = $self->option('units') || $self->calculate_units($start,$self->feature->length);
my $divisor = $UNITS{$units} || 1;
my $format = min($self->feature->length,$self->panel->length)/$divisor > 10 ? "%d$units" : "%.6g$units";
my $scale = $self->option('scale') || 1;
my $model = sprintf("$format ",$stop/($divisor*$scale)); my $minlen = $width * length($model);
my ($major_interval,$minor_interval) = $self->panel->ticks($stop-$start+1,$minlen);
my $left = $sw ? $x1+$height : $x1;
my $right = $ne ? $x2-$height : $x2;
$start += $self->panel->start - $self->feature->start
if $self->feature->start < $self->panel->start;
$stop -= $self->feature->end - $self->panel->end
if $self->feature->end > $self->panel->end;
my $first_tick = $major_interval * int(0.5 + $start/$major_interval); my $last_tick = $major_interval * int(0.5 + $stop/$major_interval);
for (my $i = $first_tick; $i <= $last_tick; $i += $major_interval) {
my $tickpos = $dx + ($reversed ? $self->map_pt($stop - $i + $offset)
: $self->map_pt($i + $offset));
next if $tickpos < $left or $tickpos > $right;
$gd->line($tickpos,$center-$a2,$tickpos,$center+$a2,$fg);
my $label = $scale ? $i / $scale : $i; if ($units) {
my $scaled = $label/$divisor; $label = sprintf($format,$scaled);
}
my $middle = $tickpos - (length($label) * $width)/2; next if $middle < $left or $middle > $right;
$gd->string($font,$middle,$center+$a2-1,$label,$font_color)
unless ($self->option('no_tick_label'));
}
if ($self->option('tick') >= 2) {
$first_tick = $minor_interval * int(0.5 + $start/$minor_interval); $last_tick = $minor_interval * int(0.5 + $stop/$minor_interval);
my $a4 = $self->height/4; for (my $i = $first_tick; $i <= $last_tick; $i += $minor_interval) {
my $tickpos = $dx + ($reversed ? $self->map_pt($stop - $i + $offset)
: $self->map_pt($i + $offset));
next if $tickpos < $left or $tickpos > $right;
$gd->line($tickpos,$center-$a4,$tickpos,$center+$a4,$fg);
}
}
}
$self->draw_label($gd,$dx,$dy) if $self->option('label');
$self->draw_description($gd,$dx,$dy) if $self->option('description'); } |
sub arrowheads
{ my $self = shift;
my ($ne,$sw,$base_e,$base_w);
if ($self->option('double')) {
$ne = $sw = 1;
} else {
$ne = $self->option('northeast') || $self->option('east');
$sw = $self->option('southwest') || $self->option('west');
}
unless (defined($ne) || defined($sw)) {
$ne = 1 if $self->feature->strand > 0;
$sw = 1 if $self->feature->strand < 0;
}
return ($sw,$ne,0,0) unless $self->option('base');
return ($sw,$ne,
(!$sw && $self->feature->start>= $self->panel->start),
(!$ne && $self->feature->end <= $self->panel->end));} |
Please report them.
Lincoln Stein <lstein@cshl.org>.
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.