Bio-DB-Das-Chado
view release on metacpan or search on metacpan
lib/Bio/DB/Das/Chado/Segment/Feature.pm view on Meta::CPAN
is equivalent to this call:
@exons = $feature->sub_SeqFeature('exon');
=cut
sub AUTOLOAD {
my($pack,$func_name) = $AUTOLOAD=~/(.+)::([^:]+)$/;
my $sub = $AUTOLOAD;
my $self = $_[0];
# ignore DESTROY calls
return if $func_name eq 'DESTROY';
# fetch subfeatures if func_name has an initial cap
#return sort {$a->start <=> $b->start} $self->sub_SeqFeature($func_name) if $func_name =~ /^[A-Z]/;
return $self->sub_SeqFeature($func_name) if $func_name =~ /^[A-Z]/;
# error message of last resort
#$self->throw(qq(Can't locate object method "$func_name" via package "$pack"));
}
=head2 adjust_bounds()
Title : adjust_bounds
Usage : $feature->adjust_bounds
Function: adjust the bounds of a feature
Returns : ($start,$stop,$strand)
Args : none
Status : Public
This method adjusts the boundaries of the feature to enclose all its
subfeatures. It returns the new start, stop and strand of the
enclosing feature.
=cut
# adjust a feature so that its boundaries are synched with its subparts' boundaries.
# this works recursively, so subfeatures can contain other features
sub adjust_bounds {
my $self = shift;
my $g = $self->{group};
$self->warn("this method appears to be broken, check subfeatures() return value");
if (my $subfeat = $self->subfeatures) {
for my $list (values %$subfeat) {
for my $feat (@$list) {
# fix up our bounds to hold largest subfeature
my($start,$stop,$strand) = $feat->adjust_bounds;
$self->{strand} = $strand unless defined $self->{strand};
if ($start <= $stop) {
$self->{start} = $start if !defined($self->{start}) || $start < $self->{start};
$self->{stop} = $stop if !defined($self->{stop}) || $stop > $self->{stop};
} else {
$self->{start} = $start if !defined($self->{start}) || $start > $self->{start};
$self->{stop} = $stop if !defined($self->{stop}) || $stop < $self->{stop};
}
# fix up endpoints of targets too (for homologies only)
# my $h = $feat->group;
# next unless $h && $h->isa('Bio::DB::GFF::Homol'); # always false (for now)
# next unless $g && $g->isa('Bio::DB::GFF::Homol');
# ($start,$stop) = ($h->{start},$h->{stop});
# if ($h->strand >= 0) {
# $g->{start} = $start if !defined($g->{start}) || $start < $g->{start};
# $g->{stop} = $stop if !defined($g->{stop}) || $stop > $g->{stop};
# } else {
# $g->{start} = $start if !defined($g->{start}) || $start > $g->{start};
# $g->{stop} = $stop if !defined($g->{stop}) || $stop < $g->{stop};
# }
}
}
}
( $self->start(),$self->stop(),$self->strand() );
}
=head2 sort_features()
Title : sort_features
Usage : $feature->sort_features
Function: sort features
Returns : nothing
Args : none
Status : Public
This method sorts subfeatures in ascending order by their start
position. For reverse strand features, it sorts subfeatures in
descending order. After this is called sub_SeqFeature will return the
features in order.
This method is called internally by merged_segments().
=cut
# sort features
sub sort_features {
my $self = shift;
return if $self->{sorted}++;
my $strand = $self->strand or return;
my $subfeat = $self->subfeatures or return;
for my $type (keys %$subfeat) {
$subfeat->{$type} = [map { $_->[0] }
sort {$a->[1] <=> $b->[1] }
map { [$_,$_->start] }
@{$subfeat->{$type}}] if $strand > 0;
$subfeat->{$type} = [map { $_->[0] }
sort {$b->[1] <=> $a->[1]}
map { [$_,$_->start] }
@{$subfeat->{$type}}] if $strand < 0;
}
}
=head2 asString()
Title : asString
Usage : $string = $feature->asString
Function: return human-readabled representation of feature
Returns : a string
( run in 0.809 second using v1.01-cache-2.11-cpan-ceb78f64989 )