Bio-EnsEMBL
view release on metacpan or search on metacpan
lib/Bio/EnsEMBL/SeqFeature.pm view on Meta::CPAN
=head1 DESCRIPTION
Do not use this module if you can avoid it. It has been replaced by
Bio::EnsEMBL::Feature. This module has a long history of usage but has
become very bloated, and quite unweildy. It was decided to replace
it completely with a smaller, light-weight feature class rather than
attempting to refactor this class, and maintain strict backwards
compatibility.
Part of the complexity of this class was in its extensive
inheritance. As an example the following is a simplified inheritance
heirarchy that was present for Bio::EnsEMBL::DnaAlignFeature:
Bio::EnsEMBL::DnaAlignFeature
Bio::EnsEMBL::BaseAlignFeature
Bio::EnsEMBL::FeaturePair
Bio::EnsEMBL::SeqFeature
Bio::SeqFeatureI
Bio::RangeI
Bio::Root::RootI
The new Bio::EnsEMBL::Feature class is much shorter, and hopefully much
easier to understand and maintain.
=head1 METHODS
=cut
# Let the code begin...
package Bio::EnsEMBL::SeqFeature;
$Bio::EnsEMBL::SeqFeature::VERSION = '114.0.0';
use vars qw(@ISA);
use strict;
use Bio::EnsEMBL::Analysis;
use Bio::EnsEMBL::Utils::Argument qw(rearrange);
sub new {
my($caller,@args) = @_;
my $self = {};
if(ref $caller) {
bless $self, ref $caller;
} else {
bless $self, $caller;
}
$self->{'_gsf_tag_hash'} = {};
$self->{'_gsf_sub_array'} = [];
$self->{'_parse_h'} = {};
$self->{'_is_splittable'} = 0;
my ($start,$end,$strand,$frame,$score,$analysis,$seqname, $source_tag,
$primary_tag, $percent_id, $p_value, $phase, $end_phase) =
&rearrange([qw(START
END
STRAND
FRAME
SCORE
ANALYSIS
SEQNAME
SOURCE_TAG
PRIMARY_TAG
PERCENT_ID
P_VALUE
PHASE
END_PHASE
)],@args);
# $gff_string && $self->_from_gff_string($gff_string);
if ( defined $analysis && $analysis ne "") { $self->analysis($analysis)};
if ( defined ($start) && $start ne "" ) { $self->start($start)};
if ( defined ($end ) && $end ne "" ) { $self->end($end)}
if ( defined $strand && $strand ne "") { $self->strand($strand)}
if ( defined $frame && $frame ne "") { $self->frame($frame)}
if ( defined $score && $score ne "") { $self->score($score)}
if ( defined $seqname && $seqname ne "") { $self->seqname($seqname)};
if ( defined $percent_id && $percent_id ne ""){ $self->percent_id($percent_id)};
if ( defined $p_value && $p_value ne "") { $self->p_value($p_value)};
if ( defined $phase && $phase ne "") { $self->phase($phase)};
if ( defined $end_phase && $end_phase ne "") { $self->end_phase($end_phase)};
return $self; # success - we hope!
}
=head2 start
Title : start
Usage : $start = $feat->start
$feat->start(20)
Function: Get/set on the start coordinate of the feature
Returns : integer
Args : none
=cut
sub start{
my ($self,$value) = @_;
if (defined($value)) {
if ($value !~ /^\-?\d+/ ) {
$self->throw("$value is not a valid start");
}
$self->{'_gsf_start'} = $value
}
return $self->{'_gsf_start'};
}
=head2 end
Title : end
Usage : $end = $feat->end
$feat->end($end)
Function: get/set on the end coordinate of the feature
Returns : integer
Args : none
=cut
sub end{
my ($self,$value) = @_;
if (defined($value)) {
if( $value !~ /^\-?\d+/ ) {
$self->throw("[$value] is not a valid end");
}
lib/Bio/EnsEMBL/SeqFeature.pm view on Meta::CPAN
=cut
sub validate {
my ($self) = @_;
$self->vthrow("Seqname not defined in feature") unless defined($self->seqname);
$self->vthrow("start not defined in feature") unless defined($self->start);
$self->vthrow("end not defined in feature") unless defined($self->end);
$self->vthrow("strand not defined in feature") unless defined($self->strand);
$self->vthrow("score not defined in feature") unless defined($self->score);
$self->vthrow("analysis not defined in feature") unless defined($self->analysis);
if ($self->end < $self->start) {
$self->vthrow("End coordinate < start coordinate");
}
}
sub vthrow {
my ($self,$message) = @_;
print(STDERR "Error validating feature [$message]\n");
print(STDERR " Seqname : [" . $self->{_seqname} . "]\n");
print(STDERR " Start : [" . $self->{_gsf_start} . "]\n");
print(STDERR " End : [" . $self->{_gsf_end} . "]\n");
print(STDERR " Strand : [" .
((defined ($self->{_gsf_strand})) ? $self->{_gsf_strand} : "undefined") . "]\n");
print(STDERR " Score : [" . $self->{_gsf_score} . "]\n");
print(STDERR " Analysis : [" . $self->{_analysis}->dbID . "]\n");
$self->throw("Invalid feature - see dump on STDERR");
}
=head2 validate_prot_feature
Title : validate_prot_feature
Usage :
Function:
Example :
Returns :
Args :
=cut
# Shouldn't this go as "validate" into Pro_SeqFeature?
sub validate_prot_feature{
my ($self,$num) = @_;
$self->throw("Seqname not defined in feature") unless defined($self->seqname);
$self->throw("start not defined in feature") unless defined($self->start);
$self->throw("end not defined in feature") unless defined($self->end);
if ($num == 1) {
$self->throw("score not defined in feature") unless defined($self->score);
$self->throw("percent_id not defined in feature") unless defined($self->percent_id);
$self->throw("evalue not defined in feature") unless defined($self->p_value);
}
$self->throw("analysis not defined in feature") unless defined($self->analysis);
}
# These methods are specified in the SeqFeatureI interface but we don't want
# people to store data in them. These are just here in order to keep
# existing code working
=head2 has_tag
Title : has_tag
Usage : $value = $self->has_tag('some_tag')
Function: Returns the value of the tag (undef if
none)
Returns :
Args :
=cut
sub has_tag{
my ($self,$tag) = (shift, shift);
return exists $self->{'_gsf_tag_hash'}->{$tag};
}
=head2 add_tag_value
Title : add_tag_value
Usage : $self->add_tag_value('note',"this is a note");
Returns : nothing
Args : tag (string) and value (any scalar)
=cut
sub add_tag_value{
my ($self,$tag,$value) = @_;
if( !defined $self->{'_gsf_tag_hash'}->{$tag} ) {
$self->{'_gsf_tag_hash'}->{$tag} = [];
}
push(@{$self->{'_gsf_tag_hash'}->{$tag}},$value);
}
=head2 each_tag_value
Title : each_tag_value
Usage :
Function:
Example :
Returns :
Args :
lib/Bio/EnsEMBL/SeqFeature.pm view on Meta::CPAN
$end = $feat->end;
}
$self->start($start);
$self->end($end);
}
} else {
if( !defined($feat->start()) || !defined($feat->end()) ||
!defined($self->start()) || !defined($self->end())) {
$self->throw( "This SeqFeature and the sub_SeqFeature must define".
" start and end.");
}
if($feat->start() > $feat->end() || $self->start() > $self->end()) {
$self->throw("This SeqFeature and the sub_SeqFeature must have " .
"start that is less than or equal to end.");
}
if($feat->start() < $self->start() || $feat->end() > $self->end() ) {
$self->throw("$feat is not contained within parent feature, " .
"and expansion is not valid");
}
}
push(@{$self->{'_gsf_sub_array'}},$feat);
}
=head2 flush_sub_SeqFeature
Title : flush_sub_SeqFeature
Usage : $sf->flush_sub_SeqFeature
Function: Removes all sub SeqFeature
(if you want to remove only a subset, take
an array of them all, flush them, and add
back only the guys you want)
Example :
Returns : none
Args : none
=cut
sub flush_sub_SeqFeature {
my ($self) = @_;
$self->{'_gsf_sub_array'} = []; # zap the array implicitly.
}
sub id {
my ($self,$value) = @_;
if (defined($value)) {
$self->{_id} = $value;
}
return $self->{_id};
}
=head2 percent_id
Title : percent_id
Usage : $pid = $feat->percent_id()
$feat->percent_id($pid)
Function: get/set on percentage identity information
Returns : float
Args : none if get, the new value if set
=cut
sub percent_id {
my ($self,$value) = @_;
if (defined($value))
{
$self->{_percent_id} = $value;
}
return $self->{_percent_id};
}
=head2 p_value
Title : p_value
Usage : $p_val = $feat->p_value()
$feat->p_value($p_val)
Function: get/set on p value information
Returns : float
Args : none if get, the new value if set
=cut
sub p_value {
my ($self,$value) = @_;
if (defined($value))
{
$self->{_p_value} = $value;
}
return $self->{_p_value};
}
=head2 phase
Title : phase
Usage : $phase = $feat->phase()
$feat->phase($phase)
Function: get/set on start phase of predicted exon feature
Returns : [0,1,2]
Args : none if get, 0,1 or 2 if set.
=cut
sub phase {
my ($self, $value) = @_;
if (defined($value) )
{
$self->throw("Valid values for Phase are [0,1,2]") if ($value < 0 || $value > 2);
$self->{_phase} = $value;
}
return $self->{_phase};
}
=head2 end_phase
Title : end_phase
Usage : $end_phase = $feat->end_phase()
$feat->end_phase($end_phase)
Function: returns end_phase based on phase and length of feature
Returns : [0,1,2]
Args : none if get, 0,1 or 2 if set.
=cut
sub end_phase {
my ($self, $value) = @_;
( run in 0.899 second using v1.01-cache-2.11-cpan-6736b670a1e )