Updating Mauricio's email
[bioperl-run.git] / t / SABlastPlus.t
blob9fcbc27fcd9fe6078a23032c0abbfdcddc662818
1 #-*-perl-*-
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_module => "IPC::Run");
13     use_ok( 'Bio::Tools::Run::StandAloneBlastPlus' );
14     use_ok( 'Bio::Tools::Run::WrapperBase' );
15     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 => 69,
26                -requires_executable => $bpfac);
28     diag('DB and mask make tests');
30     # testing using fasta files as input...
31     ok my $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
32         -db_data => test_input_file('test-spa.fas'),
33         -create  => 1
34     ), "make factory";
35     ok $fac->make_db, "test db made with fasta";
36     like $fac->db, qr/DB.{5}/, "temp db";
37     is ($fac->db_type, 'nucl', "right type");
38     $fac->cleanup;
40     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
41         -db_name => 'test',
42         -db_data => test_input_file('test-spa.fas'),
43         -create => 1
44     );
46     like($fac->program_version, qr/2\.\d+\.\d+/, 'program version');
47     like($fac->package_version, qr/2\.\d+\.\d+/, 'package version');
49     ok $fac->make_db, "named db made";
50     ok $fac->check_db, "check_db";
51     is $fac->db, 'test', "correct name";
52     is ref $fac->db_info, 'HASH', "dbinfo hash returned";
53     is $fac->db_type, 'nucl', "correct type";
55     ok $fac->make_mask(
56         -data   => test_input_file('test-spa.fas'),
57         -masker => 'windowmasker'
58     ), "windowmasker mask made";
59     ok $fac->make_mask(
60         -data   => test_input_file('test-spa.fas'),
61         -masker => 'dustmasker'
62     ), "dustmasker mask made";
63     $fac->cleanup;
65     $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
66         -db_data => test_input_file('test-spa-p.fas'),
67         -create  => 1
68     );
69     ok $fac->check_db('test'), "check_db with arg";
70     is $fac->db_info('test')->{_db_type}, 'nucl', "db_info with arg";
71     ok $fac->make_db, "protein db made";
72     is $fac->db_type, 'prot', "correct type";
73     ok $fac->make_mask(-data=>$fac->db, -masker=>'segmasker'), "segmasker mask made";
74     ok $fac->make_mask(
75         -data   => $fac->db,
76         -masker => 'segmasker'
77     ), "segmasker mask made; blastdb as data";
78     $fac->_register_temp_for_cleanup('test');
79     $fac->cleanup;
81     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
82         -db_data   => test_input_file('test-spa-p.fas'),
83         -mask_file => test_input_file('segmask_data.asn'),
84         -create    => 1
85     );
86     ok $fac->make_db, "protein db made with pre-built mask";
87     is $fac->db_filter_algorithms->[0]{algorithm_name}, 'seg', "db_info records mask info";
88     $fac->cleanup;
90     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
91         -db_data   => test_input_file('test-spa.fas'),
92         -masker    => 'windowmasker',
93         -mask_data => test_input_file('test-spa.fas'),
94         -create    => 1
95     );
96     $fac->no_throw_on_crash(1);
97     ok $fac->make_db, "mask built and db made on construction (windowmasker)";
98     $fac->cleanup;
100     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
101         -db_data   => test_input_file('test-spa-p.fas'),
102         -masker    => 'segmasker',
103         -mask_data => test_input_file('test-spa-p.fas'),
104         -create    => 1
105     );
106     $fac->no_throw_on_crash(1);
107     ok $fac->make_db, "mask built and db made on construction (segmasker)";
108     $fac->cleanup;
110     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
111         -db_data   => test_input_file('test-spa.fas'),
112         -masker    => 'dustmasker',
113         -mask_data => test_input_file('test-spa.fas'),
114         -create    => 1
115     );
116     $fac->no_throw_on_crash(1);
117     ok $fac->make_db, "mask built and db made on construction (dustmasker)";
118     $fac->cleanup;
120     # tests with Bio:: objects as input
121     ok my $sio = Bio::SeqIO->new(-file => test_input_file('test-spa.fas'));
122     ok my $aio = Bio::AlignIO->new(-file => test_input_file('test-spa-p.fas'));
124     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
125         -db_name => 'siodb',
126         -db_data => $sio,
127         -create  => 1
128     );
129     ok $fac->make_db, "make db from Bio::SeqIO";
130     $fac->cleanup;
132     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
133         -db_name => 'aiodb',
134         -db_data => $aio,
135         -create  => 1
136     );
137     ok $fac->make_db, "make db from Bio::AlignIO";
138     $fac->cleanup;
140     $aio = Bio::AlignIO->new(-file => test_input_file('test-aln.msf'));
141     my @seqs = $aio->next_aln->each_seq;
142     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
143         -db_name => 'aiodb',
144         -db_data => \@seqs,
145         -create  => 1
146     );
147     ok $fac->make_db, 'make db from \@seqs';
149     $fac->_register_temp_for_cleanup( 'aiodb', 'siodb' );
150     $fac->cleanup;
152     # bug#3003 :
153     #$DB::single=1;
154     mkdir "./a"; mkdir "./a/b";
155     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
156         -db_dir  => "./a/b",
157         -db_name => "test",
158         -db_data => test_input_file('test-spa.fas'),
159         -create  => 1
160     ), "dbdir : ./a/b; dbname : test; create";
161     ok $fac->make_db, "make db";
162     lives_ok { Bio::Tools::Run::StandAloneBlastPlus->new(
163         -db_dir  => "./a",
164         -db_name => "b/test"
165     ) };
166     lives_ok { Bio::Tools::Run::StandAloneBlastPlus->new(
167         -db_dir  => ".",
168         -db_name => "a/b/test"
169     ) };
170     lives_ok { Bio::Tools::Run::StandAloneBlastPlus->new(
171         -db_name => "a/b/test"
172     ) };
173     dies_ok { Bio::Tools::Run::StandAloneBlastPlus->new(
174         -db_name => "/a/b/test"
175     ) };
176     $fac->_register_temp_for_cleanup('a/b/test');
177     $fac->cleanup;
178     rmdir 'a/b';
179     rmdir 'a';
180     # exception tests here someday.
182     # blast method tests
183     diag("run BLAST methods");
185     $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
186         -db_data => test_input_file('test-spa.fas'),
187         -create  => 1
188     );
190     ok my $result = $fac->run(-method => 'blastn',
191                               -query  => test_input_file('test-query.fas')
192     ), "run blastn";
193     is $result->num_hits, 291, "default hit limit";
194     ok $result = $fac->blastn(-query       => test_input_file('test-query.fas'),
195                               -method_args => [ -num_alignments => 1000 ]
196     ), "return more alignments (arg spec)";
197     is $result->num_hits, 291, "got more hits";
198     $fac->cleanup;
200     my $ntseq = Bio::Seq->new(-seq => 'GACGATCCTTCGGTGAGCAAAGAAATTTTAGCAGAAGCTAAAAAGCTAAACGATGCTCAAGCACCAAAAG',
201                               -id  => 'SA009');
202     my $aaseq = $ntseq->translate;
204     ok $result = $fac->blastn( -query => $ntseq  ), "run blastn with Bio::Seq query";
205     $fac->no_throw_on_crash(1);
206     ok $result = $fac->tblastn( -query => $aaseq ), "run tblastn";
207     is $result->num_hits, 299, "tblastn hits";
208     ok $result = $fac->tblastx( -query => $ntseq ), "run tblastx";
209     is $result->num_hits, 299, "tblastx hits";
210     $fac->cleanup;
212     ok $fac = Bio::Tools::Run::StandAloneBlastPlus->new(
213         -db_data => test_input_file('test-spa-p.fas'),
214         -create  => 1
215     );
216     ok $result = $fac->blastp( -query => $aaseq ), "run blastp";
217     is $result->num_hits, 222, "blastp hits";
218     $fac->cleanup;
220     $sio = Bio::SeqIO->new(-file=>test_input_file('test-spa.fas'));
221     $sio->next_seq;
222     my $seq1 = $sio->next_seq;
223     my $seq2 = $sio->next_seq;
225     ok $result = $fac->bl2seq(-method  => 'blastn',
226                               -query   => $seq1,
227                               -subject => $seq2
228     ), "bl2seq (blastn)";
229     is $result->num_hits, 1, "got hit";
231     ok $result = $fac->bl2seq(-method  => 'tblastx',
232                               -query   => $seq1,
233                               -subject => $seq2,
234     ), "bl2seq (tblastx)";
235     is $result->num_hits, 1, "got hit";
237     $seq2 = $seq2->translate(-frame => 1);
238     ok $result = $fac->bl2seq(-method  => 'blastx',
239                               -query   => $seq1,
240                               -subject => $seq2
241     ), "bl2seq (blastx)";
242     is $result->num_hits, 1, "got hit";
244     # There is no similarity between the sequences
245     # at these reading frames, so there should be no hits
246     my $seq1_frame0 = $seq1->translate;
247     ok $result = $fac->bl2seq(-method  => 'blastp',
248                               -query   => $seq1_frame0,
249                               -subject => $seq2
250     ), "bl2seq (blastp)";
251     is $result->num_hits, 0, "no hit";
253     # There is similarity between the sequences
254     # at these reading frames, so there should be hits
255     $seq1 = $seq1->translate(-frame => 2);
256     ok $result = $fac->bl2seq(-method  => 'blastp',
257                               -query   => $seq1,
258                               -subject => $seq2
259     ), "bl2seq (blastp)";
260     is $result->num_hits, 1, "got hit";
262     # issue #12 (https://github.com/bioperl/bioperl-run/issues/12) : 4 tests
263     $sio = Bio::SeqIO->new(-file=>test_input_file('test-spa.fas'));
264     $sio->next_seq;
265     $seq1 = $sio->next_seq;
266     $seq2 = $sio->next_seq;
268     lives_ok { $fac->bl2seq(-method => 'tblastx',
269                             -query => $seq1,
270                             -subject => $seq2,
271                             -method_args => [ '-outfmt' => '"6 qseqid sseqid"' ]
272                            ) } "bl2seq (tblastx) - multiple outfmt options";
274     lives_ok { $fac->bl2seq(-method => 'tblastx',
275                             -query => $seq1,
276                             -subject => $seq2,
277                             -outformat => '"6 qseqid sseqid"',
278                            ) } "bl2seq (tblastx) - multiple outfmt options (use method arg)";
280     lives_ok { $fac->bl2seq(-method => 'tblastx',
281                             -query => $seq1,
282                             -subject => $seq2,
283                             -outformat => '6 qseqid sseqid',
284                            ) } "bl2seq (tblastx) - multiple outfmt options (no explict quotes should also work)";
286     lives_ok { $fac->bl2seq(-method => 'tblastx',
287                             -query => $seq1,
288                             -subject => $seq2,
289                             -outformat => '"6"'
290                            ) } "bl2seq (tblastx) - multiple outfmt options (a single format number in quotes";
292     $fac->cleanup;
293 } # SKIP to here