Raw content of Bio::EnsEMBL::Analysis::Tools::IgTranscriptFilter
# Ensembl module for Bio::EnsEMBL::Analysis::Tools::IgTranscriptFilter
#
# Copyright (c) 2004 Ensembl
#
package Bio::EnsEMBL::Analysis::Tools::IgTranscriptFilter;
use strict;
use warnings;
use Bio::EnsEMBL::Root;
use Bio::EnsEMBL::Utils::Exception qw(verbose throw warning);
use Bio::EnsEMBL::Utils::Argument qw( rearrange );
sub new{
my ($class, @args) = @_;
my $self = bless {},$class;
my ($percent_range,
$min_percent,
$min_score) =
rearrange([
'PERCENTRANGE',
'MINPERCENT',
'MINSCORE'
], @args);
$self->percent_range($percent_range) if defined $percent_range;
$self->min_percent($min_percent) if defined $min_percent;
$self->min_score($min_score) if defined $min_score;
return $self;
}
sub filter_results{
my ($self, $transcripts) = @_;
#############
# assumption: transcripts are sorted by score, best to worst.
# This is how ExonerateTranscript returns them.
#############
my (@keep, %by_hit);
foreach my $t (@$transcripts) {
my ($sf) = @{$t->get_all_supporting_features};
next if $sf->percent_id < $self->min_percent;
next if $sf->score < $self->min_score;
push @{$by_hit{$sf->hseqname}}, [$t, $sf];
}
foreach my $hid (keys %by_hit) {
my @entries = @{$by_hit{$hid}};
# only consider hits that have coverage at least as good as first,
# and with percent_id within percent_range of the first
my $best_cov = $entries[0]->[1]->score;
my $best_percent = $entries[0]->[1]->percent_id;
foreach my $hit (@entries) {
if ($hit->[1]->score >= $best_cov and
($hit->[1]->percent_id >= $best_percent or
$best_percent - $hit->[-1]->percent_id <= $self->percent_range)) {
push @keep, $hit->[0];
}
}
}
return \@keep;
}
sub percent_range {
my ($self, $val) = @_;
if (defined $val) {
$self->{_percent_range} = $val;
}
if (exists $self->{_percent_range}) {
return $self->{_percent_range};
} else {
return 0;
}
}
sub min_percent {
my ($self, $val) = @_;
if (defined $val) {
$self->{_min_percent} = $val;
}
if (exists $self->{_min_percent}) {
return $self->{_min_percent};
} else {
return 0;
}
}
sub min_score {
my ($self, $val) = @_;
if (defined $val) {
$self->{_min_score} = $val;
}
if (exists $self->{_min_score}) {
return $self->{_min_score};
} else {
return 0;
}
}
1;