comparison lib/CPT/External/TMHMM.pm @ 1:97ef96676b48 draft

planemo upload commit 94b0cd1fff0826c6db3e7dc0c91c0c5a8be8bb0c
author cpt
date Mon, 05 Jun 2023 02:51:26 +0000
parents
children
comparison
equal deleted inserted replaced
0:b18e8268bf4e 1:97ef96676b48
1 package CPT::External::TMHMM;
2 no warnings;
3 use Moose;
4 use File::Temp qw(tempfile);
5 use IPC::Run qw(run);
6 use File::Temp qw(tempdir);
7 use File::Copy qw(move);
8
9 has 'sequence' => ( is => 'rw', isa => 'Str' );
10 has 'response' => ( is => 'rw', isa => 'Str' );
11
12 has 'num_predicted' => ( is => 'rw', isa => 'Int' );
13 has 'predicted_locations' => ( is => 'rw', isa => 'ArrayRef' );
14 has 'prob_n_in' => ( is => 'rw', isa => 'Str' );
15 has 'hash' => ( is => 'rw', isa => 'Str' );
16 has 'picture_location' => ( is => 'rw', isa => 'Str' );
17
18 my ( $fh, $filename, $image );
19
20 sub create_fasta_file {
21 my ( $self, $seq ) = @_;
22 ( $fh, $filename ) = tempfile( "cpt.tmhmm.XXXXXXX", UNLINK => 1 );
23
24 #printf $fh ">%s\n%s\n", 'seq', $seq;
25 printf $fh "%s\n", $seq;
26 return $filename;
27 }
28
29 sub parse_text {
30 my ($self) = @_;
31 unless ( $self->predicted_locations() ) {
32 $self->predicted_locations( [] );
33 }
34 unless ( $self->num_predicted() ) {
35 $self->num_predicted(0);
36 }
37 foreach my $line ( split( /\n/, $self->response() ) ) {
38 if ( $line =~ /Number of predicted TMHs:\s*(\d+)/ ) {
39 $self->num_predicted($1);
40 }
41 elsif ( $line =~ /Total prob of N-in:\s*([0-9.]*)/ ) {
42 $self->prob_n_in($1);
43 }
44 elsif ( $line =~ /TMHMM2.0\s*TMhelix\s*([0-9]+)\s*([0-9]+)/ ) {
45
46 #$self->num_predicted($self->num_predicted()+1);
47 push( @{ $self->predicted_locations() }, [ $1, $2 ] );
48 }
49 }
50
51 # # seq Length: 145
52 # # seq Number of predicted TMHs: 1
53 # # seq Exp number of AAs in TMHs: 20.91302
54 # # seq Exp number, first 60 AAs: 20.91265
55 # # seq Total prob of N-in: 0.04659
56 # # seq POSSIBLE N-term signal sequence
57 # seq TMHMM2.0 outside 1 3
58 # seq TMHMM2.0 TMhelix 4 23
59 # seq TMHMM2.0 inside 24 145
60 }
61
62 sub analyze {
63 my ( $self, $seq ) = @_;
64
65 # Set our hash
66 require Digest::MD5;
67 $self->hash( Digest::MD5::md5_hex($seq) );
68
69 # Set our sequence
70 $self->sequence($seq);
71
72 # Tmp dir to run in
73 my $dir = tempdir( CLEANUP => 1 );
74 my $tmpfile = $self->create_fasta_file($seq);
75
76 # Plot and use specified workdir
77 my @cmd = ( 'tmhmm.pl', '-plot', '-workdir', $dir, '<', $tmpfile );
78
79 # Run the command
80 my ( $in, $out, $err );
81 run \@cmd, \$in, \$out, \$err;
82
83 # If error,we error
84 if ($err) {
85
86 # print STDERR "Error: $err\n";
87 # Kinda a crappy way to handle this...
88 $self->response($err);
89 return 0;
90 }
91 {
92
93 # Move the created plot to a known location
94 my @tmhmm_files = glob("$dir/*/*.png");
95
96 # There's really only one png but this is just as easy to write
97 for my $png (@tmhmm_files) {
98 $image = sprintf( "/tmp/cpt.ext.tmhmm.%s.png", $self->hash() );
99 move( $png, $image );
100 }
101
102 # Module to remove the temporary dir so we clean up after
103 # ourselves quickly, since this programme seems to open a LARGE
104 # number of file handles.
105 require File::Path;
106 File::Path::remove_tree($dir);
107
108 # set response and parse it, then return OK.
109 $self->response($out);
110 $self->parse_text();
111 return 1;
112 }
113 }
114
115 sub cleanup {
116 if ( defined($fh) ) {
117 close($fh);
118 unlink($filename);
119 if ( -e $image ) {
120 unlink($image);
121 }
122 }
123 }
124
125 END {
126 if ( defined($fh) ) {
127 close($fh);
128 unlink($filename);
129 if ( -e $image ) {
130 unlink($image);
131 }
132 }
133 }
134
135 no Moose;
136 1;
137
138 __END__
139
140 =pod
141
142 =encoding UTF-8
143
144 =head1 NAME
145
146 CPT::External::TMHMM
147
148 =head1 VERSION
149
150 version 1.99.4
151
152 =head1 AUTHOR
153
154 Eric Rasche <rasche.eric@yandex.ru>
155
156 =head1 COPYRIGHT AND LICENSE
157
158 This software is Copyright (c) 2014 by Eric Rasche.
159
160 This is free software, licensed under:
161
162 The GNU General Public License, Version 3, June 2007
163
164 =cut