File Coverage

blib/lib/Bio/Tools/Run/Match.pm
Criterion Covered Total %
statement 13 15 86.6
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 18 20 90.0


line stmt bran cond sub pod time code
1             #
2             # BioPerl module for Bio::Tools::Run::Match
3             #
4             # Please direct questions and support issues to
5             #
6             # Cared for by Sendu Bala
7             #
8             # Copyright Sendu Bala
9             #
10             # You may distribute this module under the same terms as perl itself
11              
12             # POD documentation - main docs before the code
13              
14             =head1 NAME
15              
16             Bio::Tools::Run::Match - Wrapper for Transfac's match(TM)
17              
18             =head1 SYNOPSIS
19              
20             use Bio::Tools::Run::Match;
21              
22             # Make a Match factory
23             $factory = Bio::Tools::Run::Match->new(-mxlib => '/path/to/matrix.dat');
24              
25             # Run Match on an sequence object
26             my @results = $factory->run($bio_seq);
27              
28             # look at the results
29             foreach my $feat (@results) {
30             my $seq_id = $feat->seq_id;
31             my $start = $feat->start;
32             my $end = $feat->end;
33             my $score = $feat->score;
34             my ($pvalue) = $feat->get_tag_values('pvalue');
35             }
36              
37             =head1 DESCRIPTION
38              
39             This is a wrapper for running the match(TM) program supplied with Transfac Pro
40             distributions.
41              
42             You can try supplying normal match command-line arguments to new(), eg.
43             new(-b => 1) or calling arg-named methods (excluding the initial
44             hyphens, eg. $factory->b(1) to set the -b option to true).
45              
46             Histogram output isn't supported. -p is supported by using -mxprf, see the
47             docs of new() for details.
48              
49             You will need to enable this match wrapper to find the match executable.
50             This can be done in (at least) three ways:
51              
52             1. Make sure match is in your path.
53             2. Define an environmental variable MATCHDIR which is a
54             directory which contains the match executable:
55             In bash:
56              
57             export MATCHDIR=/home/username/match/
58              
59             In csh/tcsh:
60              
61             setenv MATCHDIR /home/username/match
62              
63             3. Include a definition of an environmental variable MATCHDIR in
64             every script that will use this match wrapper module, e.g.:
65              
66             BEGIN { $ENV{MATCHDIR} = '/home/username/match/' }
67             use Bio::Tools::Run::Match;
68              
69             =head1 FEEDBACK
70              
71             =head2 Mailing Lists
72              
73             User feedback is an integral part of the evolution of this and other
74             Bioperl modules. Send your comments and suggestions preferably to
75             the Bioperl mailing list. Your participation is much appreciated.
76              
77             bioperl-l@bioperl.org - General discussion
78             http://bioperl.org/wiki/Mailing_lists - About the mailing lists
79              
80             =head2 Support
81              
82             Please direct usage questions or support issues to the mailing list:
83              
84             I
85              
86             rather than to the module maintainer directly. Many experienced and
87             reponsive experts will be able look at the problem and quickly
88             address it. Please include a thorough description of the problem
89             with code and data examples if at all possible.
90              
91             =head2 Reporting Bugs
92              
93             Report bugs to the Bioperl bug tracking system to help us keep track
94             of the bugs and their resolution. Bug reports can be submitted via
95             the web:
96              
97             http://redmine.open-bio.org/projects/bioperl/
98              
99             =head1 AUTHOR - Sendu Bala
100              
101             Email bix@sendu.me.uk
102              
103             =head1 APPENDIX
104              
105             The rest of the documentation details each of the object methods.
106             Internal methods are usually preceded with a _
107              
108             =cut
109              
110             package Bio::Tools::Run::Match;
111 1     1   107221 use strict;
  1         1  
  1         23  
112              
113 1     1   3 use Cwd;
  1         1  
  1         46  
114 1     1   3 use File::Spec;
  1         1  
  1         20  
115 1     1   459 use Bio::SeqIO;
  1         38306  
  1         25  
116 1     1   164 use Bio::FeatureIO;
  0            
  0            
117             use Bio::Annotation::SimpleValue;
118             use Bio::Tools::Match;
119              
120             use base qw(Bio::Tools::Run::WrapperBase);
121              
122             our $PROGRAM_NAME = 'match';
123             our $PROGRAM_DIR = $ENV{'MATCHDIR'};
124              
125             # methods for the match args we support
126             our @PARAMS = qw(mxlib mxprf imcut); # these aren't actually match args, but
127             # are methods we use internally
128             our @SWITCHES = qw(b u);
129              
130             # just to be explicit, args we don't support (yet) or we handle ourselves
131             our @UNSUPPORTED = qw(H HH pp ppg pn png pr jkn i p);
132              
133              
134             =head2 program_name
135              
136             Title : program_name
137             Usage : $factory>program_name()
138             Function: holds the program name
139             Returns : string
140             Args : None
141              
142             =cut
143              
144             sub program_name {
145             return $PROGRAM_NAME;
146             }
147              
148             =head2 program_dir
149              
150             Title : program_dir
151             Usage : $factory->program_dir(@params)
152             Function: returns the program directory, obtained from ENV variable.
153             Returns : string
154             Args : None
155              
156             =cut
157              
158             sub program_dir {
159             return $PROGRAM_DIR;
160             }
161              
162             =head2 new
163              
164             Title : new
165             Usage : $factory = Bio::Tools::Run::Match->new()
166             Function: creates a new MCS factory
167             Returns : Bio::Tools::Run::MCS
168             Args : The following args can either be supplied here or set by calling
169             arg-named methods (eg. $factory->imcut(2) ).
170              
171             -mxlib => path to the matrix.dat file containing Transfac matricies
172             -mxprf => path to a profile file | [core_thresh, [matrix_thresh]]
173             (defaults to a standard one based on the mxlib provided if
174             file not supplied, using core_thresh and matrix_thresh
175             values if those are supplied instead)
176             -imcut => floating point number, the importance cutoff
177             -b | -u => boolean, mutually exclusive
178              
179             =cut
180              
181             sub new {
182             my ($class, @args) = @_;
183             my $self = $class->SUPER::new(@args);
184            
185             $self->_set_from_args(\@args, -methods => [@PARAMS, @SWITCHES, 'quiet'],
186             -create => 1);
187            
188             return $self;
189             }
190              
191             =head2 run
192              
193             Title : run
194             Usage : $result = $factory->run($bio_seqi_object);
195             Function: Runs match on a sequence.
196             Returns : list of Bio::SeqFeatureI feature objects
197             Args : Bio::SeqI compliant object
198              
199             NB: mxlib has to have been set prior to calling run(), either as an
200             argument to new() or by calling mxlib().
201              
202             =cut
203              
204             sub run {
205             my ($self, $seq) = @_;
206             $self->mxlib || $self->throw("mxlib has to have been set first");
207            
208             return $self->_run($seq);
209             }
210              
211             sub _run {
212             my ($self, $seq) = @_;
213            
214             my $exe = $self->executable || return;
215            
216             my $mxlib = File::Spec->rel2abs($self->mxlib());
217             my $mxprf_file = $self->mxprf();
218             if ($mxprf_file && -e $mxprf_file) {
219             $mxprf_file = File::Spec->rel2abs($mxprf_file);
220             }
221            
222             # cd to a temp dir
223             my $temp_dir = $self->tempdir;
224             my $cwd = Cwd->cwd();
225             chdir($temp_dir) || $self->throw("Couldn't change to temp dir '$temp_dir'");
226            
227             # make the profile file if necessary
228             if (! $mxprf_file || ! -e $mxprf_file) {
229             my @thresh;
230             if ($mxprf_file && ref($mxprf_file) eq 'ARRAY') {
231             @thresh = @{$mxprf_file};
232             }
233            
234             $mxprf_file = 'mxprf';
235             system("$exe $mxlib ignored ignored $mxprf_file -p @thresh") && $self->throw("Something went wrong whist creating profile: $! | $?");
236             }
237            
238             # output the sequence to a fasta file
239             my $seq_file = 'sequence.fa';
240             my $so = Bio::SeqIO->new(-file => ">$seq_file", -format => 'fasta');
241             $so->write_seq($seq);
242             $so->close();
243            
244             # run match
245             my $result_file = 'out';
246             my $param_str = $self->_setparams();
247             my $cmd_line = "$exe $mxlib $seq_file $result_file $mxprf_file".$param_str;
248            
249             system($cmd_line) && $self->throw("Something went wrong whist running '$cmd_line': $! | $?");
250            
251             # parse the results
252             my $parser = Bio::Tools::Match->new(-file => $result_file);
253            
254             # correct the coords
255             my @feats;
256             while (my $feat = $parser->next_result) {
257             push(@feats, $feat);
258             }
259            
260             # cd back again
261             chdir($cwd) || $self->throw("Couldn't change back to working directory '$cwd'");
262            
263             return @feats;
264             }
265              
266             =head2 _setparams
267              
268             Title : _setparams
269             Usage : Internal function, not to be called directly
270             Function: Creates a string of params to be used in the command string
271             Returns : string of params
272             Args : none
273              
274             =cut
275              
276             sub _setparams {
277             my $self = shift;
278            
279             my $param_string = $self->SUPER::_setparams(-switches => \@SWITCHES,
280             -dash => 1);
281            
282             my $null = ($^O =~ m/mswin/i) ? 'NUL' : '/dev/null';
283             $param_string .= " 1>$null" if $self->quiet;
284            
285             return $param_string;
286             }
287              
288             1;