Mercurial > repos > yufei-luo > s_mart
diff commons/core/coord/test/Test_MatchUtils.py @ 6:769e306b7933
Change the repository level.
author | yufei-luo |
---|---|
date | Fri, 18 Jan 2013 04:54:14 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commons/core/coord/test/Test_MatchUtils.py Fri Jan 18 04:54:14 2013 -0500 @@ -0,0 +1,439 @@ +# Copyright INRA (Institut National de la Recherche Agronomique) +# http://www.inra.fr +# http://urgi.versailles.inra.fr +# +# This software is governed by the CeCILL license under French law and +# abiding by the rules of distribution of free software. You can use, +# modify and/ or redistribute the software under the terms of the CeCILL +# license as circulated by CEA, CNRS and INRIA at the following URL +# "http://www.cecill.info". +# +# As a counterpart to the access to the source code and rights to copy, +# modify and redistribute granted by the license, users are provided only +# with a limited warranty and the software's author, the holder of the +# economic rights, and the successive licensors have only limited +# liability. +# +# In this respect, the user's attention is drawn to the risks associated +# with loading, using, modifying and/or developing or reproducing the +# software by the user in light of its specific status of free software, +# that may mean that it is complicated to manipulate, and that also +# therefore means that it is reserved for developers and experienced +# professionals having in-depth computer knowledge. Users are therefore +# encouraged to load and test the software's suitability as regards their +# requirements in conditions enabling the security of their systems and/or +# data to be ensured and, more generally, to use and operate it in the +# same conditions as regards security. +# +# The fact that you are presently reading this means that you have had +# knowledge of the CeCILL license and that you accept its terms. + + +import unittest +import os +from commons.core.utils.FileUtils import FileUtils +from commons.core.coord.MatchUtils import MatchUtils +from commons.core.coord.Match import Match +from commons.core.seq.BioseqDB import BioseqDB + + +class Test_MatchUtils( unittest.TestCase ): + + def test_getMatchListFromFile( self ): + inFile = "dummyInFile" + inFileHandler = open( inFile, "w" ) + inFileHandler.write( "query.name\tquery.start\tquery.end\tquery.length\tquery.length.%\tmatch.length.%\tsubject.name\tsubject.start\tsubject.end\tsubject.length\tsubject.length.%\tE.value\tScore\tIdentity\tpath\n" ) + m1 = Match() + m1.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName1", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 1) ) + m1.write( inFileHandler ) + m2 = Match() + m2.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName2", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 1) ) + m2.write( inFileHandler ) + inFileHandler.close() + + lExp = [ m1, m2 ] + + lObs = MatchUtils.getMatchListFromFile( inFile ) + + self.assertEquals( lExp, lObs ) + + os.remove( inFile ) + + def test_getDictOfListsWithSubjectAsKey( self ): + m1 = Match() + m1.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName1", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 1) ) + m2 = Match() + m2.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName2", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 1) ) + lMatch = [ m1, m2 ] + + dExp = { "SName1": [ m1 ], "SName2": [ m2 ] } + + dObs = MatchUtils.getDictOfListsWithSubjectAsKey( lMatch ) + + self.assertEquals( dExp, dObs ) + + def test_getDictOfListsWithQueryAsKey( self ): + m1 = Match() + m1.setFromTuple( ("QName1", 1, 5, 5, 0.1, 0.2, "SName1", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 1) ) + m2 = Match() + m2.setFromTuple( ("QName2", 1, 5, 5, 0.1, 0.2, "SName2", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 1) ) + m3 = Match() + m3.setFromTuple( ("QName1", 1, 5, 5, 0.1, 0.2, "SName3", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 1) ) + lMatch = [ m1, m2, m3 ] + + dExp = { "QName1": [ m1, m3 ], "QName2": [ m2 ] } + + dObs = MatchUtils.getDictOfListsWithQueryAsKey( lMatch ) + + self.assertEquals( dExp, dObs ) + + def test_getIdListFromMatchList( self ): + m1 = Match() + m1.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName1", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 1) ) + m2 = Match() + m2.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName2", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 10) ) + lMatch = [ m1, m2 ] + + lExp = [1, 10] + + lObs = MatchUtils.getIdListFromMatchList( lMatch ) + + self.assertEquals(lExp, lObs) + + def test_getIdListFromMatchList_empty_list( self ): + lMatch = [] + lExp = [] + + lObs = MatchUtils.getIdListFromMatchList( lMatch ) + + self.assertEquals(lExp, lObs) + + def test_writeListInFile_without_header( self ): + m1 = Match() + m1.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName1", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 1) ) + m2 = Match() + m2.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName2", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 10) ) + lMatch = [ m1, m2 ] + + line1 = "QName\t1\t5\t5\t0.100000\t0.200000\tSName1\t5\t25\t20\t0.150000\t1e-20\t15\t87.200000\t1\n" + line2 = "QName\t1\t5\t5\t0.100000\t0.200000\tSName2\t5\t25\t20\t0.150000\t1e-20\t15\t87.200000\t10\n" + + expFileName = "expFileName.match" + expFileHandle = open ( expFileName, 'w' ) + expFileHandle.write(line1) + expFileHandle.write(line2) + expFileHandle.close() + + obsFileName = "obsFileName.match" + + MatchUtils.writeListInFile( lMatch, obsFileName ) + + self.assertTrue( FileUtils.are2FilesIdentical( expFileName, obsFileName ) ) + + os.remove( obsFileName ) + os.remove( expFileName ) + + def test_writeListInFile_with_header( self ): + m1 = Match() + m1.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName1", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 1) ) + m2 = Match() + m2.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName2", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 10) ) + lMatch = [ m1, m2 ] + + headerLine = "query.name\tquery.start\tquery.end\tquery.length\tquery.length.%\tmatch.length.%\tsubject.name\tsubject.start\tsubject.end\tsubject.length\tsubject.length.%\tE.value\tScore\tIdentity\tpath\n" + + line1 = headerLine + line2 = "QName\t1\t5\t5\t0.100000\t0.200000\tSName1\t5\t25\t20\t0.150000\t1e-20\t15\t87.200000\t1\n" + line3 = "QName\t1\t5\t5\t0.100000\t0.200000\tSName2\t5\t25\t20\t0.150000\t1e-20\t15\t87.200000\t10\n" + + expFileName = "expFileName.match" + expFileHandle = open ( expFileName, 'w' ) + expFileHandle.write(line1) + expFileHandle.write(line2) + expFileHandle.write(line3) + expFileHandle.close() + + obsFileName = "obsFileName.match" + + MatchUtils.writeListInFile( lMatch, obsFileName, header=headerLine ) + + self.assertTrue( FileUtils.are2FilesIdentical( expFileName, obsFileName ) ) + + os.remove( obsFileName ) + os.remove( expFileName ) + + def test_writeListInFile_with_append_mode( self ): + m1 = Match() + m1.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName1", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 1) ) + m2 = Match() + m2.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName2", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 10) ) + lMatch = [ m1, m2 ] + + line1 = "QName\t1\t5\t5\t0.100000\t0.200000\tSName1\t5\t25\t20\t0.150000\t1e-20\t15\t87.200000\t1\n" + line2 = "QName\t1\t5\t5\t0.100000\t0.200000\tSName2\t5\t25\t20\t0.150000\t1e-20\t15\t87.200000\t10\n" + + expFileName = "expFileName.match" + expFileHandle = open ( expFileName, 'w' ) + expFileHandle.write(line1) + expFileHandle.write(line1) + expFileHandle.write(line2) + expFileHandle.close() + + obsFileName = "obsFileName.match" + obsFileHandle = open ( obsFileName, 'w' ) + obsFileHandle.write(line1) + obsFileHandle.close() + + MatchUtils.writeListInFile( lMatch, obsFileName, 'a' ) + + self.assertTrue( FileUtils.are2FilesIdentical( expFileName, obsFileName ) ) + + os.remove( obsFileName ) + os.remove( expFileName ) + + def test_rmvDuplicateMatches(self): + m1 = Match() + m1.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 1) ) + m2 = Match() + m2.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName2", 5, 25, 20, 0.15, 1e-20, 15, 86.2, 1) ) + m3 = Match() + m3.setFromTuple( ("QName", 1, 5, 5, 0.1, 0.2, "SName", 5, 25, 20, 0.15, 1e-20, 15, 87.2, 1) ) + lMatch = [ m1, m3, m2 ] + + lExp = [m1, m2] + lObs = MatchUtils.rmvDuplicateMatches(lMatch) + + self.assertEquals(lExp, lObs) + + def test_filterDiffQrySbj_same_seq(self): + fastaFileName = "file.fa" + self._writeFastaFile(fastaFileName) + qryDB = BioseqDB(fastaFileName) + tabFileName = "file.tab" + self._writeMatchFile(tabFileName) + + expListToKeep = ["HELITRON2"] + obsListToKeep = MatchUtils.filterDiffQrySbj(qryDB,tabFileName, 0.95, 0.98, 2) + self.assertEquals(expListToKeep, obsListToKeep) + os.remove(fastaFileName) + os.remove(tabFileName) + + def test_filterDiffQrySbj_TE_included_in_67percent_in_other_TE(self): + fastaFileName = "file.fa" + self._writeFastaFile2(fastaFileName) + qryDB = BioseqDB(fastaFileName) + tabFileName = "file.tab" + self._writeMatchFile2(tabFileName) + expListToKeep = [] + obsListToKeep = MatchUtils.filterDiffQrySbj(qryDB, tabFileName, 0.95, 0.98, 2) + self.assertEquals(expListToKeep, obsListToKeep) + os.remove(fastaFileName) + os.remove(tabFileName) + + def test_getNbDistinctSequencesInsideMatchesWithThresh_query(self): + tabFileName = "file.tab" + self._writeMatchFile3(tabFileName) + lMatches = MatchUtils.getMatchListFromFile(tabFileName) + expNbDistinctMatches = 1 + obsNbDistinctMatches = MatchUtils.getNbDistinctSequencesInsideMatchesWithThresh(lMatches,0.95, 0.98,"query") + self.assertEquals(expNbDistinctMatches, obsNbDistinctMatches) + os.remove(tabFileName) + + def test_getNbDistinctSequencesInsideMatchesWithThresh_subject(self): + tabFileName = "file.tab" + self._writeMatchFile3(tabFileName) + lMatches = MatchUtils.getMatchListFromFile(tabFileName) + expNbDistinctMatches = 1 + obsNbDistinctMatches = MatchUtils.getNbDistinctSequencesInsideMatchesWithThresh(lMatches,0.95, 0.98,"subject") + self.assertEquals(expNbDistinctMatches, obsNbDistinctMatches) + os.remove(tabFileName) + + def test_convertMatchFileToAlignFile(self): + inputMatchFileName = "file.tab" + expAlignFileName = "expected.align" + obsAlignFileName = "file.align" + + self._writeExpAlignFile(expAlignFileName) + self._writeMatchFile4(inputMatchFileName) + MatchUtils.convertMatchFileToAlignFile(inputMatchFileName) + + self.assertTrue(FileUtils.are2FilesIdentical(expAlignFileName, obsAlignFileName)) + + os.remove(inputMatchFileName) + os.remove(expAlignFileName) + os.remove(obsAlignFileName) + + def test_convertMatchFileToAlignFile_empty_file(self): + inputMatchFileName = "file.tab" + expAlignFileName = "expected.align" + obsAlignFileName = "file.align" + + f = open(expAlignFileName, "w") + f.close() + f = open(inputMatchFileName, "w") + f.close() + MatchUtils.convertMatchFileToAlignFile(inputMatchFileName) + + self.assertTrue(FileUtils.are2FilesIdentical(expAlignFileName, obsAlignFileName)) + + os.remove(inputMatchFileName) + os.remove(expAlignFileName) + os.remove(obsAlignFileName) + + def test_generateMatchFileWithNewPathId(self): + inputMatchFileName = "file.tab" + expMatchFileName = "expected.tab" + obsMatchFileName = "obsFile.tab" + + self._writeMatchFile5(inputMatchFileName) + self._writeExpMatchFile(expMatchFileName) + MatchUtils.generateMatchFileWithNewPathId(inputMatchFileName, obsMatchFileName) + + self.assertTrue(FileUtils.are2FilesIdentical(expMatchFileName, obsMatchFileName)) + + os.remove(inputMatchFileName) + os.remove(expMatchFileName) + os.remove(obsMatchFileName) + + def test_generateMatchFileWithNewPathId_empty_file(self): + inputMatchFileName = "file.tab" + expMatchFileName = "expected.tab" + obsMatchFileName = "obsFile.tab" + + f = open(expMatchFileName, "w") + f.write("query.name\tquery.start\tquery.end\tquery.length\tquery.length.%\tmatch.length.%\tsubject.name\tsubject.start\tsubject.end\tsubject.length\tsubject.length.%\tE.value\tScore\tIdentity\tpath\n") + f.close() + f = open(inputMatchFileName, "w") + f.close() + MatchUtils.generateMatchFileWithNewPathId(inputMatchFileName, obsMatchFileName) + + self.assertTrue(FileUtils.are2FilesIdentical(expMatchFileName, obsMatchFileName)) + + os.remove(inputMatchFileName) + os.remove(expMatchFileName) + os.remove(obsMatchFileName) + + def test_convertMatchFileIntoABCFileOnQueryCoverage(self): + matchFileName = "dummy.tab" + with open(matchFileName, "w") as f: + f.write("query.name\tquery.start\tquery.end\tquery.length\tquery.length.%\tmatch.length.%\tsubject.name\tsubject.start\tsubject.end\tsubject.length\tsubject.length.%\tE.value\tScore\tIdentity\tpath\n") + f.write("chr3\t1\t100\t100\t0.98\t0.95\tchr5\t11\t110\t100\t0.95\t1e-52\t133\t87.200000\n") + f.write("chr7\t1\t200\t200\t0.98\t0.95\tchr2\t11\t210\t200\t0.95\t1e-78\t235\t98.900000\n") + f.write("chr5\t1\t100\t100\t0.95\t0.95\tchr3\t11\t110\t100\t0.98\t1e-52\t133\t87.200000\n") + f.write("chr2\t1\t200\t200\t0.95\t0.95\tchr7\t11\t210\t200\t0.98\t1e-78\t235\t98.900000\n") + expFileName = "exp.abc" + with open(expFileName, "w") as f: + f.write("chr3\tchr5\t0.98\n") + f.write("chr7\tchr2\t0.98\n") + f.write("chr5\tchr3\t0.95\n") + f.write("chr2\tchr7\t0.95\n") + obsFileName = "obs.abc" + + MatchUtils.convertMatchFileIntoABCFileOnQueryCoverage(matchFileName, obsFileName) + + self.assertTrue(FileUtils.are2FilesIdentical(expFileName, obsFileName)) + + os.remove(matchFileName) + os.remove(expFileName) + os.remove(obsFileName) + + def test_convertMatchFileIntoABCFileOnQueryCoverage_coverage_threshold_85(self): + matchFileName = "dummy.tab" + with open(matchFileName, "w") as f: + f.write("query.name\tquery.start\tquery.end\tquery.length\tquery.length.%\tmatch.length.%\tsubject.name\tsubject.start\tsubject.end\tsubject.length\tsubject.length.%\tE.value\tScore\tIdentity\tpath\n") + f.write("chr3\t1\t100\t100\t0.98\t0.95\tchr5\t11\t110\t100\t0.95\t1e-52\t133\t87.200000\n") + f.write("chr7\t1\t200\t200\t0.98\t0.95\tchr2\t11\t210\t200\t0.95\t1e-78\t235\t98.900000\n") + f.write("chr5\t1\t100\t100\t0.85\t0.95\tchr3\t11\t110\t100\t0.98\t1e-52\t133\t87.200000\n") + f.write("chr2\t1\t200\t200\t0.80\t0.95\tchr7\t11\t210\t200\t0.98\t1e-78\t235\t98.900000\n") + expFileName = "exp.abc" + with open(expFileName, "w") as f: + f.write("chr3\tchr5\t0.98\n") + f.write("chr7\tchr2\t0.98\n") + f.write("chr5\tchr3\t0.85\n") + obsFileName = "obs.abc" + + MatchUtils.convertMatchFileIntoABCFileOnQueryCoverage(matchFileName, obsFileName, coverage = 0.85) + + self.assertTrue(FileUtils.are2FilesIdentical(expFileName, obsFileName)) + + os.remove(matchFileName) + os.remove(expFileName) + os.remove(obsFileName) + + def _writeFastaFile(self, fileName): + f = open(fileName, "w") + f.write(">HELITRON3\n") + f.write("GGCCAGTCACAATGGGGGTTTCACTGGTGTGTCATGCACATTTAATAGGGGTAAGACTGA\n") + f.write("ATAAAAAATGATTATTTGCATGAAATGGGGATGAGAGAGAAGGAAAGAGTTTCATCCTGG\n") + f.write("GATTCGTTTCATTCACCGGATCTCTTGCGTCCGCCTCCGCCGTGCGACCTCCGCATTCTC\n") + f.write(">HELITRON2\n") + f.write("GGCCAGTCACAATGGGGGTTTCACTGGTGTGTCATGCACATTTAATAGGGGTAAGACTGA\n") + f.write("ATAAAAAATGATTATTTGCATGAAATGGGGATGAGAGAGAAGGAAAGAGTTTCATCCTGG\n") + f.write("GATTCGTTTCATTCACCGGATCTCTTGCGTCCGCCTCCGCCGTGCGACCTCCGCATTCTC\n") + f.close() + + def _writeMatchFile(self, fileName): + f = open(fileName, "w") + f.write("query.name\tquery.start\tquery.end\tquery.length\tquery.length.%\tmatch.length.%\tsubject.name\tsubject.start\tsubject.end\tsubject.length\tsubject.length.%\tE.value\tScore\tIdentity\tpath\n") + f.write("HELITRON3\t1\t180\t180\t1\t1\tHELITRON2\t1\t180\t180\t1\t2e-103\t357\t100\t1\n") + f.close() + + def _writeFastaFile2(self, fileName): + f = open(fileName, "w") + f.write(">header2\n") + f.write("TTTCACTGGTGTGTCATGCACATTTAATAGGGGTAAGACTGAATAAAAAATGATTATTTG\n") + f.write("CATGAAATGGGGATGAGAGAGAAGGAAAGAGTTTCATCCTGGGATTCGTTTCATTCACCG\n") + f.close() + + def _writeMatchFile2(self, fileName): + f = open(fileName, "w") + f.write("query.name\tquery.start\tquery.end\tquery.length\tquery.length.%\tmatch.length.%\tsubject.name\tsubject.start\tsubject.end\tsubject.length\tsubject.length.%\tE.value\tScore\tIdentity\tpath\n") + f.write("header2\t1\t120\t120\t1\t0.674157\tBS31790\t19\t138\t120\t0.674157\t3e-68\t238\t100\t1\n") + f.close() + + def _writeMatchFile3(self, fileName): + f = open(fileName, "w") + f.write("query.name\tquery.start\tquery.end\tquery.length\tquery.length.%\tmatch.length.%\tsubject.name\tsubject.start\tsubject.end\tsubject.length\tsubject.length.%\tE.value\tScore\tIdentity\tpath\n") + f.write("header2\t1\t120\t120\t0.674157\t0.674157\tBS31790\t19\t138\t120\t0.674157\t3e-68\t238\t100\t1\n") + f.write("header3\t1\t120\t120\t0.99\t0.994157\tBS31790\t19\t138\t120\t0.994157\t3e-68\t238\t100\t1\n") + f.write("header4\t1\t120\t120\t1\t0.94157\tBS31790\t19\t138\t120\t0.674157\t3e-68\t238\t67\t1\n") + f.close() + + def _writeMatchFile4(self, fileName): + f = open(fileName, "w") + f.write("query.name\tquery.start\tquery.end\tquery.length\tquery.length.%\tmatch.length.%\tsubject.name\tsubject.start\tsubject.end\tsubject.length\tsubject.length.%\tE.value\tScore\tIdentity\tpath\n") + f.write("header2\t1\t120\t120\t0.674157\t0.674157\tBS31790\t19\t138\t120\t0.674157\t3e-68\t238\t100\t1\n") + f.write("header3\t120\t220\t120\t0.99\t0.994157\tBS31790\t19\t138\t120\t0.994157\t3e-65\t238\t100\t1\n") + f.write("header4\t1\t120\t120\t1\t0.94157\tBS31790\t19\t138\t120\t0.674157\t3e-67\t244\t90\t1\n") + f.close() + + def _writeExpAlignFile(self,fileName): + f = open(fileName, "w") + f.write("header2\t1\t120\tBS31790\t19\t138\t3e-68\t238.0\t100.0\n") + f.write("header3\t120\t220\tBS31790\t19\t138\t3e-65\t238.0\t100.0\n") + f.write("header4\t1\t120\tBS31790\t19\t138\t3e-67\t244.0\t90.0\n") + f.close() + + def _writeMatchFile5(self,fileName): + f = open(fileName, "w") + f.write("query.name\tquery.start\tquery.end\tquery.length\tquery.length.%\tmatch.length.%\tsubject.name\tsubject.start\tsubject.end\tsubject.length\tsubject.length.%\tE.value\tScore\tIdentity\tpath\n") + f.write("header2\t1\t120\t120\t0.674157\t0.674157\tBS31790\t19\t138\t120\t0.674157\t3e-68\t238\t100\t1\n") + f.write("header2\t124\t144\t120\t0.674157\t0.674157\tBS31790\t19\t138\t120\t0.674157\t3e-68\t238\t100\t1\n") + f.write("header3\t120\t220\t120\t0.99\t0.994157\tBS31790\t19\t138\t120\t0.994157\t3e-65\t238\t100\t1\n") + f.write("header4\t1\t120\t120\t1\t0.94157\tBS31790\t19\t138\t120\t0.674157\t3e-67\t244\t90\t1\n") + f.close() + + def _writeExpMatchFile(self,fileName): + f = open(fileName, "w") + f.write("query.name\tquery.start\tquery.end\tquery.length\tquery.length.%\tmatch.length.%\tsubject.name\tsubject.start\tsubject.end\tsubject.length\tsubject.length.%\tE.value\tScore\tIdentity\tpath\n") + f.write("header2\t1\t120\t120\t0.674157\t0.674157\tBS31790\t19\t138\t120\t0.674157\t3e-68\t238\t100.000000\t1\n") + f.write("header2\t124\t144\t120\t0.674157\t0.674157\tBS31790\t19\t138\t120\t0.674157\t3e-68\t238\t100.000000\t1\n") + f.write("header3\t120\t220\t120\t0.990000\t0.994157\tBS31790\t19\t138\t120\t0.994157\t3e-65\t238\t100.000000\t2\n") + f.write("header4\t1\t120\t120\t1.000000\t0.941570\tBS31790\t19\t138\t120\t0.674157\t3e-67\t244\t90.000000\t3\n") + f.close() + + +test_suite = unittest.TestSuite() +test_suite.addTest( unittest.makeSuite( Test_MatchUtils ) ) +if __name__ == "__main__": + unittest.TextTestRunner(verbosity=2).run( test_suite )