MS
view release on metacpan or search on metacpan
lib/MS/Search/DB.pm view on Meta::CPAN
package MS::Search::DB;
use strict;
use warnings;
use BioX::Seq::Stream;
use BioX::Seq::Fetch;
use Net::FTP;
use HTTP::Tiny;
use URI;
use File::Temp;
use List::Util qw/shuffle/;
use Module::Pluggable
require => 1, sub_name => 'sources', search_path => ['MS::Search::DB::Source'];
sub new {
my ($class, $fn) = @_;
my $self = bless {} => $class;
$self->add_from_file($fn) if (defined $fn);
return $self;
}
sub add_decoys {
my ($self, %args) = @_;
$self->{decoys} = [];
my $type = $args{type} // 'reverse';
my $prefix = $args{prefix} // 'DECOY_';
my $added = 0;
for my $seq (@{ $self->{seqs} }) {
my $new = $type eq 'reverse' ? reverse $seq
: $type eq 'shuffle' ? join( '', shuffle( split '', $seq ) )
: die "Unknown decoy type: $type\n";
my $decoy = BioX::Seq->new(
$new,
$prefix . $seq->id,
$seq->desc,
undef
);
push @{ $self->{decoys} }, $decoy;
++$added;
}
return $added;
}
sub add_from_source {
my ($self, %args) = @_;
my $suffix = $args{id_suffix} // '';
my $added = 0;
for my $src ($self->sources) {
next if ($src ne "MS::Search::DB::Source::$args{source}");
delete $args{source};
my $f = $src->new(%args);
my ($fh, $pid) = $f->_fetch_fh;
my $p = BioX::Seq::Stream->new($fh);
while (my $seq = $p->next_seq) {
$seq->id = $seq->id . $suffix;
push @{ $self->{seqs} }, $seq;
++$added;
}
close $fh;
waitpid($pid, 0);
last;
}
return $added;
( run in 0.523 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )