sub bandpass {
my( $aref, $loValue, $hiValue ) = @_;
return if $loValue > $aref->[-1] or $hiValue < $aref->[0];
my( $lo, $hi ) = ( 1, $#{ $aref } );
$lo += $lo while $aref->[$lo] < $loValue;
--$lo while $lo and $aref->[$lo-1] >= $loValue;
$hi >>= 1 while $aref->[$hi] > $hiValue;
++$hi while $hi < $#$aref and $aref->[$hi+1] <= $hiValue;
return @{ $aref }[ $lo .. $hi ];
}
...
my $aref = $matches{ $fasta_id }{ $sitekey };
$sets{ $fasta_id }[ $setscounter ]{ $sitekey } =
[ bandpass( $aref, $lowerlimit, $upperlimit ) ];
####
min---------loPass--hiPass------------------------------------max
####
min-------------------------------------------loPass--hiPass--max
min--loPass-------------------------------------------hiPass--max
####
sub bandpass {
my( $aref, $loValue, $hiValue ) = @_;
return if $loValue > $aref->[-1] or $hiValue < $aref->[0];
my( $lo, $hi ) = ( 0, $#{ $aref } );
while( $lo < $hi ) {
my $mid = int( ( $lo + $hi ) / 2 );
if( $aref->[ $mid ] >= $loValue and $aref->[ $mid ] <= $hiValue ) {
$lo = $hi = $mid;
last;
}
elsif( $aref->[ $mid ] < $loValue ) {
$lo = $mid + 1;
}
elsif( $aref->[ $mid ] > $hiValue ) {
$hi = $mid - 1;
}
}
return if $loValue > $aref->[ $hi ] or $hiValue < $aref->[ $lo ];
--$lo while $lo and $aref->[ $lo - 1 ] >= $loValue;
++$hi while $hi < $#{ $aref } and $aref->[ $hi + 1 ] <= $hiValue;
return @{ $aref }[ $lo .. $hi ];
}