Raw content of Bio::EnsEMBL::Analysis::Runnable::Snap
# Ensembl module for Bio::EnsEMBL::Analysis::Runnable::Snap
#
# Copyright (c) 2005 Ensembl
#
=head1 NAME
Bio::EnsEMBL::Analysis::Runnable::Snap
=head1 SYNOPSIS
my $runnable = Bio::EnsEMBL::Analysis::Runnable::Snap->new(
-query => $slice,
-program => 'snap',
);
$runnable->run;
my @predictions = @{$runnable->output};
=head1 DESCRIPTION
Wrapper to run the genefinder gene predictor and then parse the results
into prediction transcripts
=head1 CONTACT
Post questions to the Ensembl development list: ensembl-dev@ebi.ac.uk
=cut
package Bio::EnsEMBL::Analysis::Runnable::Snap;
use strict;
use warnings;
use Bio::EnsEMBL::Analysis::Runnable::BaseAbInitio;
use Bio::SeqIO;
use Bio::Seq;
use Bio::EnsEMBL::Utils::Exception qw(throw warning);
use Bio::EnsEMBL::Utils::Argument qw( rearrange );
use vars qw(@ISA);
@ISA = qw(Bio::EnsEMBL::Analysis::Runnable::BaseAbInitio);
sub new {
my ($class,@args) = @_;
my $self = $class->SUPER::new(@args);
######################
#SETTING THE DEFAULTS#
######################
$self->program('snap') if(!$self->program);
######################
throw("Must defined a matrix file like ".
"/usr/local/ensembl/Zoe/HMM/worm with the -matrix option ")
if(!$self->matrix);
$self->unaltered_slice($self->query);
my $new_seq = Bio::Seq->new(
-seq => $self->query->seq,
-id => $self->query->name,
);
$self->query($new_seq);
return $self;
}
=head2 run_analysis
Arg [1] : Bio::EnsEMBL::Analysis::Runnable::Snap
Arg [2] : string, program name
Function : create and open a commandline for the program genefinder
Returntype: none
Exceptions: throws if the program in not executable or the system
command fails to execute
Example :
=cut
sub run_analysis{
my ($self, $program) = @_;
if(!$program){
$program = $self->program;
}
throw($program." is not executable Snap::run_analysis ")
unless($program && -x $program);
my $command = $self->program." ".$self->matrix." ".$self->queryfile.
" > ".$self->resultsfile;
print STDERR "Running analysis ".$command."\n";
system($command) == 0 or throw("FAILED to run ".$command);
}
=head2 parse_results
Arg [1] : Bio::EnsEMBL::Analysis::Runnable::Snap
Arg [2] : string, resultsfile name
Function : parse the results file into prediction exons then
collate them into prediction transcripts and calculate their
phases
Returntype: none
Exceptions: throws if cant open or close results file or the parsing
doesnt work
Example :
=cut
sub parse_results{
my ($self, $results) = @_;
if(!$results){
$results = $self->resultsfile;
}
$self->query($self->unaltered_slice);
my $ff = $self->feature_factory;
my $exon_count;
my $current_trans;
open(OUT, "<".$results) or throw("FAILED to open ".$results.
"Snap:parse_results");
while(){
/^\>/ and next;
my @element = split;
throw("Unable to parse Snap output ".@element." in output ".
"array expecting 9") if(@element != 9);
if (!$current_trans ||
$current_trans ne $element[8]) {
$exon_count = 0;
$current_trans = $element[8];
}
$exon_count++;
my $name = $current_trans.".".$exon_count;
my $start = $element[1];
my $end = $element[2];
my $score = $element[4];
throw("strand wrongly formated $element[6] not + or -")
unless ($element[3] eq '+' || $element[3] eq '-');
my $strand = 1;
$strand = -1 if($element[3] eq '-');
my $start_phase = (3 - $element[5]) % 3;
my $exon = $ff->create_prediction_exon($start,
$end,
$strand,
$score,
0,
$start_phase,
$name,
$self->query,
$self->analysis);
$self->exon_groups($current_trans, $exon);
}
$self->create_transcripts;
close(OUT) or throw("FAILED to close ".$results.
"Snap:parse_results");
}
=head2 unaltered_slice
Arg [1] : Bio::EnsEMBL::Analysis::Runnable::Snap
Arg [2] : Bio::EnsEMBL::Slice
Function : holder for the given slice as the one passed
to Snap has to have desc removed otherwise parser doesnt
work properly
Returntype: Bio::EnsEMBL::Slice
Exceptions:
Example :
=cut
sub unaltered_slice{
my ($self, $arg) = @_;
if($arg){
$self->{'unaltered_slice'} = $arg;
}
return $self->{'unaltered_slice'};
}
1;