Raw content of Bio::EnsEMBL::Analysis::RunnableDB::ProteinAnnotation =head1 NAME ProteinAnnotation.pm - DESCRIPTION of Object =head1 SYNOPSIS this is the base class for the ProteinAnnotation runnabledbs =head1 DESCRIPTION =head1 CONTACT ensembl-dev@ebi.ac.uk =cut package Bio::EnsEMBL::Analysis::RunnableDB::ProteinAnnotation; use vars qw(@ISA); use strict; use Bio::EnsEMBL::Analysis::RunnableDB::BaseGeneBuild; use Bio::EnsEMBL::DBSQL::ProteinFeatureAdaptor; use Bio::EnsEMBL::Analysis::Config::ProteinAnnotation; use Bio::EnsEMBL::Utils::Exception qw(throw warning); @ISA = qw (Bio::EnsEMBL::Analysis::RunnableDB::BaseGeneBuild); ################################ sub new { my ($class, @args) = @_; my $self = $class->SUPER::new(@args); throw("Analysis object required") unless ($self->analysis); $self->read_and_check_config; return $self; } ################################ sub fetch_input { my ($self) = @_; my $input_id; my $db; if ($self->GENEDB) { $db = $self->get_dbadaptor($self->GENEDB); } else { $db = $self->db; } my $error = "For logic " . $self->analysis->logic_name . ", Input id must be:\n"; $error .= "(a) a valid translation dbID; or\n"; $error .= "(b) the fully qualified directory/name of a fasta peptide file; or\n"; $error .= "(c) the name only of a peptide fasta file (with BASE_DIR defined)\n"; $error .= $self->input_id . " is none of these\n"; if ($self->input_id =~ /^(\d+)$/) { my $prot; eval { $prot = $db->get_TranslationAdaptor->fetch_by_dbID($self->input_id); }; if($@ or not defined $prot) { throw($error); } $input_id = Bio::PrimarySeq->new(-seq => $prot->seq, -id => $self->input_id, -accession => $self->input_id, -moltype => 'protein'); } elsif ($self->input_id =~ /^\// and -e $self->input_id) { # assume fully-qualified file name $input_id = $self->input_id; } elsif (defined $self->BASE_DIR and $self->BASE_DIR and -e $self->BASE_DIR . "/" . $self->input_id) { $input_id = $self->BASE_DIR . "/" . $self->input_id; } else { throw($error); } $self->query($input_id); } ################################## sub write_output { my($self) = @_; my @features = @{$self->output()}; my $db; if ($self->GENEDB) { $db = $self->get_dbadaptor($self->GENEDB); } else { $db =$self->db; } my $adap = $db->get_ProteinFeatureAdaptor; foreach my $feat(@features) { $adap->store($feat, $feat->seqname); } return 1; } ################################## sub run { my ($self,$dir) = @_; throw("Runnable module not set") unless ($self->runnable()); my $db; if ($self->GENEDB) { $db = $self->get_dbadaptor($self->GENEDB); } else { $db =$self->db; } $db->dbc->disconnect_when_inactive(1); my ($run) = @{$self->runnable}; $run->run($dir); $db->dbc->disconnect_when_inactive(0); $self->output($run->output); } ################################### sub query{ my ($self, $query) = @_; if(defined $query){ if (ref($query)) { if (not $query->isa('Bio::PrimarySeqI')) { throw("Must pass RunnableDB:query a Bio::PrimarySeqI " . "not a ".$query); } } elsif (not -e $query) { throw("Must pass RunnableDB::query a filename that exists " . ref($query)); } $self->{_query} = $query; } return $self->{_query}; } ##################################### sub output { my ($self, $output) = @_; if(!$self->{'output'}){ $self->{'output'} = []; } if($output){ if(ref($output) ne 'ARRAY'){ throw('Must pass RunnableDB:output an array ref not a '.$output); } $self->{'output'} = $output; } return $self->{'output'}; } #################################### ############################################################# # Declare and set up config variables ############################################################# sub read_and_check_config { my $self = shift; $self->SUPER::read_and_check_config($PROTEINANNOTATION_CONFIG_BY_LOGIC); ########## # CHECKS ########## my $logic = $self->analysis->logic_name; # check that compulsory options have values if (defined $self->BASE_DIR and $self->BASE_DIR and not -d $self->BASE_DIR) { throw("BASE_DIR " . $self->BASE_DIR . " could not be found") } } sub BASE_DIR { my ($self, $val) = @_; if (defined $val) { $self->{_base_dir} = $val; } if (not exists $self->{_base_dir}) { return undef; } else { return $self->{_base_dir}; } } sub GENEDB { my ($self, $val) = @_; if (defined $val) { $self->{_gene_db} = $val; } if (not exists $self->{_gene_db}) { return undef; } else { return $self->{_gene_db}; } } 1;