Raw content of Bio::EnsEMBL::Analysis::Runnable::ProteinAnnotation::Tmhmm =pod =head1 NAME Bio::EnsEMBL::Analysis::Runnable::ProteinAnnotation::Tmhmm =head1 SYNOPSIS my $seqstream = Bio::SeqIO->new ( -file => $clonefile, -fmt => 'Fasta', ); $seq = $seqstream->next_seq; my $tmhmm = Bio::EnsEMBL::Analysis::Runnable::ProteinAnnotation::Tmhmm->new(-analysis => $ana, -query => $seq, -modelfile => $mf, -optionsfile => $o); $tmhmm->run; my @results = $tmhmm->output; =head1 DESCRIPTION =cut package Bio::EnsEMBL::Analysis::Runnable::ProteinAnnotation::Tmhmm; use vars qw(@ISA); use strict; use Bio::EnsEMBL::Utils::Argument qw(rearrange); use Bio::EnsEMBL::Utils::Exception qw(throw warning); use Bio::EnsEMBL::Analysis::Runnable::ProteinAnnotation; @ISA = qw(Bio::EnsEMBL::Analysis::Runnable::ProteinAnnotation); sub multiprotein{ my ($self) = @_; return 1; } sub new { my ($class, @args) = @_; my $self = $class->SUPER::new(@args); my ($options_file, $model_file) = rearrange(['OPTIONSFILE', 'MODELFILE' ], @args); throw("You must supply a model file for Tmhmm") if not defined $model_file; $self->options_file($options_file) if defined $options_file; $self->model_file($model_file); return $self; } sub run_analysis { my ($self) = @_; # run program my $cmd = "cat " . $self->queryfile . " | " . $self->program; if ($self->options_file) { $cmd .= " -f " . $self->options_file; } if ($self->options) { $cmd .= " " . $self->options; } $cmd .= " -modelfile " . $self->model_file . " > " . $self->resultsfile; print "Running $cmd\n"; # decodeanhmm returns a non-zero exit status, even when successful # So we just have to run it and wait until we parse the output # file to see whether it ran successfully system($cmd); } sub parse_results { my ($self) = @_; my ($fh, $id, @pfs); my $resfile = $self->resultsfile; if (-e $resfile) { # it's a filename if (-z $resfile) { return; } else { open ($fh, "<$resfile") or throw("Error opening $resfile"); } } else { # it'a a filehandle $fh = $resfile; } my $id_count = 0; while (<$fh>) { chomp; next if /^$/; if (/^\>(\S+)/) { $id = $1; $id_count++; } elsif (/^\%pred/) { my ($junk, $values) = split /:/; my @tm = split (/,/, $values); foreach (@tm) { /(\w+)\s+(\d+)\s+(\d+)/; my $orien = $1; my $start = $2; my $end = $3; $orien = uc ($orien); if ($orien eq "M") { my $fp = $self->create_protein_feature($start, $end, 0, $id, 0, 0, 'Tmhmm', $self->analysis, 0, 0); push @pfs, $fp; } } } } close($fh); throw("Something went wrong when running decodeanhmm; no ids found in output") if not $id_count; $self->output(\@pfs); } sub model_file { my ($self, $val) = @_; if (defined $val) { $self->{_model_file} = $val; } return $self->{_model_file}; } sub options_file { my ($self, $val) = @_; if (defined $val) { $self->{_options_file} = $val; } return $self->{_options_file}; } 1;