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 )