Bio-Polloc
view release on metacpan or search on metacpan
lib/Bio/Polloc/Rule/composition.pm view on Meta::CPAN
# Include safe_value parameters
$self->value($self->value);
# Run it
my @feats;
my $ln = $seq->length();
my $al = $self->letters();
my $oc = 0;
my $sq = $seq->seq;
for ( ; $sq =~ s/[$al]// ; $oc++ ) {}
$sq=undef;
my $perc = 100 * $oc / $ln;
if($perc > $self->min_perc && $perc < $self->max_perc){
my $id = $self->_next_child_id;
push @feats, Bio::Polloc::LocusI->new(
-type=>$self->type, -rule=>$self, -seq=>$seq,
-from=>1, -to=>$ln, -strand=>'+',
-name=>$self->name,
-id=>(defined $id ? $id : ''),
-letters=>$self->letters,
-composition=>$perc );
}
return wantarray ? @feats : \@feats;
}
=head2 stringify_value
Stringifies the rule.
=cut
sub stringify_value {
my ($self,@args) = @_;
my $out = "";
$out.= $self->min_perc if defined $self->min_perc;
$out.= "..";
$out.= $self->max_perc if defined $self->max_perc;
return $out;
}
=head2 letters
Sets/gets the residues
=head2 Arguments
Residues (str, optional)
=head2 Returns
Residues (str or undef)
=cut
sub letters { shift->_search_value("letters", shift) }
=head2 min_perc
Sets/gets the minimum percentage
=head2 Arguments
Percentage (float, optional)
=head2 Returns
Percentage (float or undef)
=cut
sub min_perc { shift->_search_value("min_perc", shift) }
=head2 max_perc
Sets/gets the maximum percentage
=head2 Arguments
Percentage (float, optional)
=head2 Returns
Percentage (float or undef)
=cut
sub max_perc { shift->_search_value("max_perc", shift) }
=head1 INTERNAL METHODS
Methods intended to be used only within the scope of Bio::Polloc::*
=head2 _qualify_value
Implements the _qualify_value from the Bio::Polloc::RuleI interface
=head2 Arguments
Value (str or ref-to-hash or ref-to-array). The supported keys are:
=over
=item -letters
The residues to take into account as a string
=item -range
The allowed (perc.) range in the format 20..50
=item -min_perc
The minimum percentage (ignored if range is set)
=item -max_perc
The maximum percentage (ignored if range is set)
=back
=head2 Returns
Value (ref-to-hash or undef)
=cut
sub _qualify_value {
my($self,$value) = @_;
return unless defined $value;
if(ref($value) =~ m/hash/i){
my @arr = %{$value};
$value = \@arr;
}
my @args = ref($value) =~ /array/i ? @{$value} : split(/\s+/, $value);
my($letters,$range,$min_perc,$max_perc) =
$self->_rearrange([qw(LETTERS RANGE MIN_PERC MAX_PERC)], @args);
my $out = {};
if($letters && $letters =~ /^[A-Za-z]+$/){
$out->{'-letters'} = uc $letters;
}elsif($letters){
$self->warn("Unknown signs within the letters", $letters);
return;
}
if(defined $min_perc and defined $max_perc and not $range){
$range = "$min_perc..$max_perc";
}
if($range && $range =~ /^([\d\.]+)\.\.([\d\.]+)$/){
$out->{'-min_perc'} = $1+0;
$out->{'-max_perc'} = $2+0;
}elsif($range){
$self->warn("Unexpected range", $range);
return;
}
return $out;
}
=head2 _initialize
=cut
sub _initialize {
my($self,@args) = @_;
$self->type('composition');
}
1;
( run in 3.272 seconds using v1.01-cache-2.11-cpan-d8267643d1d )