AlignAid
view release on metacpan or search on metacpan
lib/AlignAid.pm view on Meta::CPAN
Returns : Object handle.
Required Args: dir => '' - the output directory you want created
: db => '' - the database file
: fasta => '' - the file of FASTA queries
Optional Args: queue => '' - 'single' by default, 'LSF' for an LSF queue
: program => '' - the alignment program to use. 'blastn',
: 'blastp', 'blastx', 'tblastn', 'tblastx', or
: 'cross_match'
: prog_args => '' - args to pass to the alignment program
Throws : croaks if required parameters are missing or suspect.
Comments : none
=cut
sub new {
my ( $class, %arg ) = @_;
# do some crude safety checks
if ( !$arg{db} ) { croak "new requires a database"; }
if ( !-f $arg{db} ) { croak "database [$arg{db}] does not exist"; }
if ( !$arg{dir} ) { croak "new requires an output dir"; }
if ( !-e $arg{dir} ) { croak "directory [$arg{dir}] does not exist"; }
if ( !-d $arg{dir} ) { croak "[$arg{dir}] is not a directory"; }
if ( !$arg{fasta} ) { croak "new requires a fasta file of queries"; }
if ( !-f $arg{fasta} ) { croak "fasta [$arg{fasta}] does not exist"; }
if ( !-T $arg{fasta} ) { croak "fasta [$arg{fasta}] is not a text file"; }
# set optional parameters if they were passed in or use defaults if not
$arg{queue} = defined( $arg{queue} ) ? $arg{queue} : 'single';
# only allow an LSF or PBS queue if PP loaded
if ( !$PP_loaded && ($arg{queue} eq 'LSF' || $arg{queue} eq 'PBS') ) {
croak "The PP module is required for submitting jobs to LSF or PBS queues.";
}
if ( $arg{queue} ne 'single' && $arg{queue} ne 'LSF' && $arg{queue} ne 'PBS') {
croak "$arg{queue} is not a supported queue type";
}
$arg{program} = defined( $arg{program} ) ? $arg{program} : 'blastn';
$arg{chunk} = defined( $arg{chunk} ) ? $arg{chunk} : 1;
# verify all paths are absolute paths
$arg{db} = File::Spec->rel2abs( $arg{db} );
$arg{dir} = File::Spec->rel2abs( $arg{dir} );
$arg{fasta} = File::Spec->rel2abs( $arg{fasta} );
$arg{prog_name} = $arg{program};
$arg{program} = `which $arg{program}`;
chomp $arg{program};
# setup the object
my $self = {
_queue => $arg{queue},
_dir => $arg{dir},
_database => $arg{db},
_fasta => $arg{fasta},
_program => $arg{program},
_prog_args => $arg{prog_args},
_prog_name => $arg{prog_name},
_chunk => $arg{chunk},
};
bless( $self, $class );
return ($self);
}
=head2 submit
Title : submit
Usage : AlignAid->submit();
Function : start the alignment job(s) running.
Returns : 1 upon success, 0 upon failure
Required Args: outfile => '' - the file where you want the output to go
Throws : croaks if required parameters are missing or suspect.
Comments : none
=cut
sub submit {
my ( $class, %arg ) = @_;
my @jobs;
my $ret_val = 1;
# default args
$class->{_prog_args} .= ' ';
$class->{_outfile} = $arg{outfile};
croak "must supply outfile as argument: \$job->submit(outfile => 'foo')"
unless defined( $class->{_outfile} );
# run on a single processor
if ( $class->{_queue} eq 'single' ) {
# set up output file
my $outfile = $class->{_outfile};
$class->{_prog_args} .= "> $outfile";
my $string =
"$class->{_program} $class->{_database} $class->{_fasta} $class->{_prog_args}";
$ret_val = system($string);
# invert system's return values for passing back
if ( $ret_val == 0 ) { return 1; }
else { return 0; }
}
# submit to a queueing system
else {
# open input file
my $query_fh = IO::File->new( $class->{_fasta}, "r" )
or croak "Couldn't open ", $class->{_fasta}, " :? :!";
my $counter = 0; # the counter for the blasts
my $internal = "$$" . "000";
my $ENTRIES;
my $fasta = Bio::SeqIO->new(-fh => $query_fh, '-format' => 'fasta');
while ( my $entry = $fasta->next_seq ) {
$ENTRIES .= $entry;
$counter++;
( run in 0.711 second using v1.01-cache-2.11-cpan-39bf76dae61 )