Bio-Graphics
view release on metacpan or search on metacpan
lib/Bio/Graphics/Glyph/segments.pm view on Meta::CPAN
my $ragged = $self->option('ragged_start')
? RAGGED_START_FUZZ
: $self->option('ragged_extra');
return $self->SUPER::pad_left
unless $self->draw_target && $ragged && $self->dna_fits;
my $extra = 0;
my $target = eval {$self->feature->hit} or return $self->SUPER::pad_left + $extra;
return $self->SUPER::pad_left + $extra unless $target->start<$target->end && $target->start < $ragged;
return ($target->start-1) * $self->scale + $extra;
}
sub pad_right {
my $self = shift;
return $self->SUPER::pad_right unless $self->level > 0;
my $ragged = $self->option('ragged_start')
? RAGGED_START_FUZZ
: $self->option('ragged_extra');
return $self->SUPER::pad_right
unless $self->draw_target && $ragged && $self->dna_fits;
my $target = eval {$self->feature->hit} or return $self->SUPER::pad_right;
return $self->SUPER::pad_right unless $target->end < $target->start && $target->start < $ragged;
return ($target->end-1) * $self->scale;
}
sub labelwidth {
my $self = shift;
return $self->SUPER::labelwidth unless $self->draw_target && $self->dna_fits && $self->label_position eq 'left';
return $self->{labelwidth} ||= (length($self->label||'')+1) * $self->mono_font->width;
}
sub draw_target {
my $self = shift;
return if $self->option('draw_dna');
return $self->option('draw_target');
}
sub draw_protein_target {
my $self = shift;
return if $self->option('draw_protein');
return $self->option('draw_protein_target');
return $self->option('draw_target');
}
sub height {
my $self = shift;
my $height = $self->SUPER::height;
return $height unless $self->draw_target || $self->draw_protein_target;
if ($self->draw_target) {
return $height unless $self->dna_fits;
}
if ($self->draw_protein_target) {
return $height unless $self->protein_fits;
}
my $fontheight = $self->mono_font->height;
return $fontheight if $fontheight > $height;
}
# group sets connector to 'solid'
sub connector {
my $self = shift;
return $self->SUPER::connector(@_) if $self->all_callbacks;
return ($self->SUPER::connector(@_) || 'solid');
}
# never allow our components to bump
sub bump {
my $self = shift;
my $bump = $self->SUPER::bump(@_);
return $bump if $self->all_callbacks;
return $self->parts_overlap ? $bump : 0;
}
sub maxdepth {
my $self = shift;
my $md = $self->Bio::Graphics::Glyph::maxdepth;
return $md if defined $md;
return 1;
}
# this was willfully confusing
#sub fontcolor {
# my $self = shift;
# return $self->SUPER::fontcolor unless $self->draw_target;# || $self->option('draw_dna');
# return $self->SUPER::fontcolor unless $self->dna_fits;
# return $self->bgcolor;
#}
# Override _subfeat() method to make it appear that a top-level feature that
# has no subfeatures appears as a feature that has a single subfeature.
# Otherwise at high mags gaps will be drawn as components rather than
# as connectors. Because of differing representations of split features
# in Bio::DB::GFF::Feature and Bio::SeqFeature::Generic, there is
# some breakage of encapsulation here.
sub _subfeat {
my $self = shift;
my $feature = shift;
my @subfeat = $self->SUPER::_subfeat($feature);
if (!@subfeat && $self->option('split_on_cigar')) {
my $cigar = $self->_get_cigar($feature);
if ($cigar && @$cigar) {
return $self->_split_on_cigar($feature,$cigar);
}
}
return @subfeat if @subfeat;
if ($self->level == 0 && !@subfeat && !$self->feature_has_subparts) {
return $self->feature;
} else {
return;
}
}
sub _split_on_cigar {
my $self = shift;
my ($feature,$cigar) = @_;
my $source_start = $feature->start;
my $source_end = $feature->end;
my $ss = $feature->strand;
my $ts = $feature->hit->strand;
# Render -/- alignments on the + strand
if ($ss == -1 && $ts == -1) {
$ss = 1;
}
my $target_start = eval {$feature->hit->start} || return $feature;
( run in 0.740 second using v1.01-cache-2.11-cpan-39bf76dae61 )