Supply TEMPLATE and SUFFIX for temporary query sequence files.
[bioperl-run.git] / t / SABlastPlus.t
blob9811c7088f2ffe1185881bf645ac01f38644cbc5
1 #-*-perl-*-
2 #$Id$
3 # testing StandAloneBlastPlus.pm
5 use strict;
6 use warnings;
7 use lib '../lib';
8 our $home;
9 BEGIN {
10     use Bio::Root::Test;
11     test_begin(-tests => 73);
12 #               -requires_modules => [qw( Bio::Tools::Run::BlastPlus)]);
15 use_ok( 'Bio::Tools::Run::StandAloneBlastPlus' );
16 use_ok( 'Bio::Tools::Run::WrapperBase' );
17 use_ok( 'Bio::Tools::Run::WrapperBase::CommandExts' );
18 use Bio::SeqIO;
19 use Bio::AlignIO;
21 ok my $bpfac = Bio::Tools::Run::BlastPlus->new(-command => 'makeblastdb'),
22     "BlastPlus factory";
24 SKIP : {
25     test_skip( -tests => 65,
26                -requires_executable => $bpfac);
27     diag('DB and mask make tests');
29     # testing using fasta files as input...
30     ok my $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
31         -db_data => test_input_file('test-spa.fas'),
32         -create  => 1
33     ), "make factory";
34     ok $fac->make_db, "test db made with fasta";
35     like $fac->db, qr/DB.{5}/, "temp db";
36     is ($fac->db_type, 'nucl', "right type");
37     $fac->cleanup;
39     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
40         -db_name => 'test',
41         -db_data => test_input_file('test-spa.fas'),
42         -create => 1
43     );
45     like($fac->program_version, qr/2\.\d+\.\d+/, 'program version');
46     like($fac->package_version, qr/2\.\d+\.\d+/, 'package version');
48     ok $fac->make_db, "named db made";
49     ok $fac->check_db, "check_db";
50     is $fac->db, 'test', "correct name";
51     is ref $fac->db_info, 'HASH', "dbinfo hash returned";
52     is $fac->db_type, 'nucl', "correct type";
54     ok $fac->make_mask(
55         -data   => test_input_file('test-spa.fas'),
56         -masker => 'windowmasker'
57     ), "windowmasker mask made";
58     ok $fac->make_mask(
59         -data   => test_input_file('test-spa.fas'),
60         -masker => 'dustmasker'
61     ), "dustmasker mask made";
62     $fac->cleanup;
64     $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
65         -db_data => test_input_file('test-spa-p.fas'),
66         -create  => 1
67     );
68     ok $fac->check_db('test'), "check_db with arg";
69     is $fac->db_info('test')->{_db_type}, 'nucl', "db_info with arg";
70     ok $fac->make_db, "protein db made";
71     is $fac->db_type, 'prot', "correct type";
72     ok $fac->make_mask(-data=>$fac->db, -masker=>'segmasker'), "segmasker mask made";
73     ok $fac->make_mask(
74         -data   => $fac->db,
75         -masker => 'segmasker'
76     ), "segmasker mask made; blastdb as data";
77     $fac->_register_temp_for_cleanup('test');
78     $fac->cleanup;
80     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
81         -db_data   => test_input_file('test-spa-p.fas'),
82         -mask_file => test_input_file('segmask_data.asn'),
83         -create    => 1
84     );
85     ok $fac->make_db, "protein db made with pre-built mask";
86     is $fac->db_filter_algorithms->[0]{algorithm_name}, 'seg', "db_info records mask info";
87     $fac->cleanup;
89     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
90         -db_data   => test_input_file('test-spa.fas'),
91         -masker    => 'windowmasker',
92         -mask_data => test_input_file('test-spa.fas'),
93         -create    => 1
94     );
95     $fac->no_throw_on_crash(1);
96     ok $fac->make_db, "mask built and db made on construction (windowmasker)";
97     $fac->cleanup;
99     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
100         -db_data   => test_input_file('test-spa-p.fas'),
101         -masker    => 'segmasker',
102         -mask_data => test_input_file('test-spa-p.fas'),
103         -create    => 1
104     );
105     $fac->no_throw_on_crash(1);
106     ok $fac->make_db, "mask built and db made on construction (segmasker)";
107     $fac->cleanup;
109     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
110         -db_data   => test_input_file('test-spa.fas'),
111         -masker    => 'dustmasker',
112         -mask_data => test_input_file('test-spa.fas'),
113         -create    => 1
114     );
115     $fac->no_throw_on_crash(1);
116     ok $fac->make_db, "mask built and db made on construction (dustmasker)";
117     $fac->cleanup;
119     # tests with Bio:: objects as input
120     ok my $sio = Bio::SeqIO->new(-file => test_input_file('test-spa.fas'));
121     ok my $aio = Bio::AlignIO->new(-file => test_input_file('test-spa-p.fas'));
123     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
124         -db_name => 'siodb',
125         -db_data => $sio,
126         -create  => 1
127     );
128     ok $fac->make_db, "make db from Bio::SeqIO";
129     $fac->cleanup;
131     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
132         -db_name => 'aiodb',
133         -db_data => $aio,
134         -create  => 1
135     );
136     ok $fac->make_db, "make db from Bio::AlignIO";
137     $fac->cleanup;
139     $aio = Bio::AlignIO->new(-file => test_input_file('test-aln.msf'));
140     my @seqs = $aio->next_aln->each_seq;
141     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
142         -db_name => 'aiodb',
143         -db_data => \@seqs,
144         -create  => 1
145     );
146     ok $fac->make_db, 'make db from \@seqs';
148     $fac->_register_temp_for_cleanup( 'aiodb', 'siodb' );
149     $fac->cleanup;
151     # bug#3003 :
152     #$DB::single=1;
153     mkdir "./a"; mkdir "./a/b";
154     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
155         -db_dir  => "./a/b",
156         -db_name => "test",
157         -db_data => test_input_file('test-spa.fas'),
158         -create  => 1
159     ), "dbdir : ./a/b; dbname : test; create";
160     ok $fac->make_db, "make db";
161     lives_ok { Bio::Tools::Run::StandAloneBlastPlus->new(
162         -db_dir  => "./a",
163         -db_name => "b/test"
164     ) };
165     lives_ok { Bio::Tools::Run::StandAloneBlastPlus->new(
166         -db_dir  => ".",
167         -db_name => "a/b/test"
168     ) };
169     lives_ok { Bio::Tools::Run::StandAloneBlastPlus->new(
170         -db_name => "a/b/test"
171     ) };
172     dies_ok { Bio::Tools::Run::StandAloneBlastPlus->new(
173         -db_name => "/a/b/test"
174     ) };
175     $fac->_register_temp_for_cleanup('a/b/test');
176     $fac->cleanup;
177     rmdir 'a/b';
178     rmdir 'a';
179     # exception tests here someday.
181     # blast method tests
182     diag("run BLAST methods");
184     $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
185         -db_data => test_input_file('test-spa.fas'),
186         -create  => 1
187     );
189     ok my $result = $fac->run(-method => 'blastn',
190                               -query  => test_input_file('test-query.fas')
191     ), "run blastn";
192     is $result->num_hits, 291, "default hit limit";
193     ok $result = $fac->blastn(-query       => test_input_file('test-query.fas'),
194                               -method_args => [ -num_alignments => 1000 ]
195     ), "return more alignments (arg spec)";
196     is $result->num_hits, 291, "got more hits";
197     $fac->cleanup;
199     my $ntseq = Bio::Seq->new(-seq => 'GACGATCCTTCGGTGAGCAAAGAAATTTTAGCAGAAGCTAAAAAGCTAAACGATGCTCAAGCACCAAAAG',
200                               -id  => 'SA009');
201     my $aaseq = $ntseq->translate;
203     ok $result = $fac->blastn( -query => $ntseq  ), "run blastn with Bio::Seq query";
204     $fac->no_throw_on_crash(1);
205     ok $result = $fac->tblastn( -query => $aaseq ), "run tblastn";
206     is $result->num_hits, 299, "tblastn hits";
207     ok $result = $fac->tblastx( -query => $ntseq ), "run tblastx";
208     is $result->num_hits, 299, "tblastx hits";
209     $fac->cleanup;
211     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
212         -db_data => test_input_file('test-spa-p.fas'),
213         -create  => 1
214     );
215     ok $result = $fac->blastp( -query => $aaseq ), "run blastp";
216     is $result->num_hits, 222, "blastp hits";
217     $fac->cleanup;
219     $sio = Bio::SeqIO->new(-file=>test_input_file('test-spa.fas'));
220     $sio->next_seq;
221     my $seq1 = $sio->next_seq;
222     my $seq2 = $sio->next_seq;
224     ok $result = $fac->bl2seq(-method  => 'blastn',
225                               -query   => $seq1,
226                               -subject => $seq2
227     ), "bl2seq (blastn)";
228     is $result->num_hits, 1, "got hit";
230     ok $result = $fac->bl2seq(-method  => 'tblastx',
231                               -query   => $seq1,
232                               -subject => $seq2,
233     ), "bl2seq (tblastx)";
234     is $result->num_hits, 1, "got hit";
236     $seq2 = $seq2->translate(-frame => 1);
237     ok $result = $fac->bl2seq(-method  => 'blastx',
238                               -query   => $seq1,
239                               -subject => $seq2
240     ), "bl2seq (blastx)";
241     is $result->num_hits, 1, "got hit";
243     # There is no similarity between the sequences
244     # at these reading frames, so there should be no hits
245     my $seq1_frame0 = $seq1->translate;
246     ok $result = $fac->bl2seq(-method  => 'blastp',
247                               -query   => $seq1_frame0,
248                               -subject => $seq2
249     ), "bl2seq (blastp)";
250     is $result->num_hits, 0, "no hit";
252     # There is similarity between the sequences
253     # at these reading frames, so there should be hits
254     $seq1 = $seq1->translate(-frame => 2);
255     ok $result = $fac->bl2seq(-method  => 'blastp',
256                               -query   => $seq1,
257                               -subject => $seq2
258     ), "bl2seq (blastp)";
259     is $result->num_hits, 1, "got hit";
261     # issue #12 (https://github.com/bioperl/bioperl-run/issues/12) : 4 tests
262     $sio = Bio::SeqIO->new(-file=>test_input_file('test-spa.fas'));
263     $sio->next_seq;
264     $seq1 = $sio->next_seq;
265     $seq2 = $sio->next_seq;
267     lives_ok { $fac->bl2seq(-method => 'tblastx',
268                             -query => $seq1,
269                             -subject => $seq2,
270                             -method_args => [ '-outfmt' => '"6 qseqid sseqid"' ]
271                            ) } "bl2seq (tblastx) - multiple outfmt options";
273     lives_ok { $fac->bl2seq(-method => 'tblastx',
274                             -query => $seq1,
275                             -subject => $seq2,
276                             -outformat => '"6 qseqid sseqid"',
277                            ) } "bl2seq (tblastx) - multiple outfmt options (use method arg)";
279     lives_ok { $fac->bl2seq(-method => 'tblastx',
280                             -query => $seq1,
281                             -subject => $seq2,
282                             -outformat => '6 qseqid sseqid',
283                            ) } "bl2seq (tblastx) - multiple outfmt options (no explict quotes should also work)";
285     lives_ok { $fac->bl2seq(-method => 'tblastx',
286                             -query => $seq1,
287                             -subject => $seq2,
288                             -outformat => '"6"'
289                            ) } "bl2seq (tblastx) - multiple outfmt options (a single format number in quotes";
291     $fac->cleanup;
292 } # SKIP to here