Raw content of Bio::EnsEMBL::Analysis::Tools::BasicFilter
# Ensembl module for Bio::EnsEMBL::Analysis::Tools::FeatureFilter
#
# Copyright (c) 2004 Ensembl
#
=head1 NAME
Bio::EnsEMBL::Analysis::Tools::BasicFilter
=head1 SYNOPSIS
my $filter = Bio::EnsEMBL::Analysis::Tools::BasicFilter
->new(
-methods => {
score => 'greaterthan 500',
percent_id => 90,
}
);
my $filtered_results = $filter->filter_results($features);
=head1 DESCRIPTION
This module will take a hash keyed on method name with the
value either being a straight cut off which it is then assumed
all features should have a value greater than or if the cut off
number is prefaced with either lessthan or greaterthan you can
vary what comparison is made. It is important to note that
features passed in must beable to call the method specified in
as the key and all cut offs must be numeric
=head1 CONTACT
Post questions to the Ensembl development list: ensembl-dev@ebi.ac.uk
=cut
package Bio::EnsEMBL::Analysis::Tools::BasicFilter;
use strict;
use Bio::EnsEMBL::Utils::Exception qw(verbose throw warning info);
use Bio::EnsEMBL::Utils::Argument qw( rearrange );
=head2 new
Arg [1] : hashref, containing list of method names and
cut off values
Function : create a Bio::EnsEMBL::Analysis::Tools::
BasicFilter object
Returntype: Bio::EnsEMBL::Analysis::Tools::BasicFilter
Exceptions: none
Example : see docs above
=cut
sub new {
my ($class, @args) = @_;
my $self = bless {},$class;
my ($methods) = rearrange(['METHODS'], @args);
$self->methods($methods);
return $self;
}
=head2 methods
Arg [1] : Bio::EnsEMBL::Analysis::Tools::BasicFilter
Arg [2] : hashref containing a list of method names and cut
off values
Function : container method
Returntype: hashref
Exceptions: throw if not passed a hashref
Example :
=cut
sub methods{
my ($self, $methods) = @_;
if($methods){
throw("The value passed into BasicFilter::methods ".
"must be a hash ref not a ".$methods)
if(ref($methods) ne 'HASH');
$self->{'methods'} = $methods;
}
return $self->{'methods'};
}
=head2 filter_results
Arg [1] : Bio::EnsEMBL::Analysis::Tools::BasicFilter
Arg [2] : arryref of objects
Function : to filter objects on specific criteria
Returntype: arrayref of objects
Exceptions: throws if not passed an arrayref or if objects
cant do the specified methods
Example :
=cut
sub filter_results{
my ($self, $features) = @_;
if(!$features || ref($features) ne 'ARRAY'){
throw("Must pass filter_results an arrayref not ".
$features." BasicFilter::filter_results");
}
my $methods = $self->methods;
my @filtered_features;
FEATURE:foreach my $feature(@$features){
foreach my $method(keys(%$methods)){
throw("The features passed in ".$feature->[0].
" must have the method specified ".$method)
unless($feature->can($method));
my $value = $methods->{$method};
my @values = split /\s+/, $value;
my ($checkmethod, $cutoff);
if(@values == 1){
$cutoff = $values[0];
$checkmethod = 'greaterthan';
}elsif(@values == 2){
$cutoff = $values[1];
$checkmethod = $values[0];
}else{
throw("String ".$value." from ".$method." key isn't ".
"in the expected format\n");
}
throw("Cut off ".$cutoff." must be a numeric value from".
" ".$method." ")
unless($cutoff =~ /\d+/);
next FEATURE unless($self->$checkmethod($feature,
$method,
$cutoff));
}
push(@filtered_features, $feature);
}
return \@filtered_features;
}
=head2 lessthan/greaterthan
Arg [1] : Bio::EnsEMBL::Analysis::Tools::BasicFilter
Arg [2] : object
Arg [3] : string which is method to call on object
Arg [4] : cutoff object needs to have value greater or
lesser than
Function : returns object if method returns value greater
or lesser than specific cutoff
Returntype: object
Exceptions: none
Example :
=cut
sub lessthan{
my ($self, $feature, $method, $cutoff) = @_;
return $feature if($feature->$method < $cutoff);
}
sub greaterthan{
my ($self, $feature, $method, $cutoff) = @_;
return $feature if($feature->$method > $cutoff);
}
1;