diff --git a/modules/bindings/pymod/blast.py b/modules/bindings/pymod/blast.py index 8f14d64dc27f259c7bd7756d27c7d9313b5e6731..30784713f3990df9802f8292204c38dfe8d027a1 100644 --- a/modules/bindings/pymod/blast.py +++ b/modules/bindings/pymod/blast.py @@ -125,6 +125,20 @@ def ParseBlastOutput(string): hits.append(BlastHit(hit_id, aligned_patches)) return hits +def BlastVersion(blast_location=None): + """ + Returns the version of the BLAST executable, e.g. 2.2.24 as a string + """ + blastall_exe=settings.Locate('blastall', explicit_file_name=blast_location) + blast_pipe=subprocess.Popen(blastall_exe, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + lines=blast_pipe.stdout.readlines() + pattern=re.compile(r'blastall (\d+\.\d+\.\d+)\s+arguments:\s*') + for line in lines: + m=pattern.match(line) + if m: + return m.group(1) + raise IOError("could not determine blast version for '%s'" % blastall_exe) def Blast(query, database, gap_open=11, gap_ext=1, matrix='BLOSUM62', blast_location=None): diff --git a/modules/bindings/tests/test_blast.py b/modules/bindings/tests/test_blast.py index 8b4215faa45d71660a7799f3211885f519745a56..707f5c93b3bc49a71d0059dbfc74252768626373 100644 --- a/modules/bindings/tests/test_blast.py +++ b/modules/bindings/tests/test_blast.py @@ -26,11 +26,20 @@ class TestBlastBindings(unittest.TestCase): def testParseBlastOutput(self): hits=blast.Blast(self.query, 'testfiles/seqdb') - expected_output=[{'evalue':2.366130E-59,'bitscore':211.460,'score':537}, - {'evalue':4.808930E-59,'bitscore':210.305,'score':534}, - {'evalue':5.361450E-58,'bitscore':206.838,'score':525}, - {'evalue':3.277500E+00,'bitscore':15.0086,'score':27}, - {'evalue':9.696520E+00,'bitscore':13.4678,'score':23}] + blast_version=blast.BlastVersion() + if blast_version=='2.2.16': + expected_output=[{'evalue':4.808930E-59,'bitscore':210.305,'score':534}, + {'evalue':2.366130E-59,'bitscore':210.305,'score':534}, + {'evalue':5.361450E-58,'bitscore':206.068,'score':523}, + {'evalue':2.965230E+00,'bitscore':15.0086,'score':27}, + {'evalue':9.696520E+00,'bitscore':13.4678,'score':23}] + + else: + expected_output=[{'evalue':2.366130E-59,'bitscore':211.460,'score':537}, + {'evalue':4.808930E-59,'bitscore':210.305,'score':534}, + {'evalue':5.361450E-58,'bitscore':206.838,'score':525}, + {'evalue':3.277500E+00,'bitscore':15.0086,'score':27}, + {'evalue':9.696520E+00,'bitscore':13.4678,'score':23}] self.assertEqual(len(hits), 4) for expected, hit in zip(expected_output, hits): patch=hit.aligned_patches[0]