diff commons/tools/GetMultAlignAndPhylogenyPerTErefSeq.py @ 18:94ab73e8a190

Uploaded
author m-zytnicki
date Mon, 29 Apr 2013 03:20:15 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commons/tools/GetMultAlignAndPhylogenyPerTErefSeq.py	Mon Apr 29 03:20:15 2013 -0400
@@ -0,0 +1,547 @@
+#!/usr/bin/env python
+
+##@file
+# For each TE reference sequence, it computes a multiple alignment and a phylogeny of all its copies.
+# usage: GetMultAlignAndPhylogenyPerTErefSeq.py [ options ]
+# options:
+#      -h: this help
+#      -S: step (0: all steps [default], 1:file generation, 2:multiple alignements, 3:phylogenies)
+#      -p: table with the annotations (format=path)
+#      -s: table with the TE reference sequences (format=seq)
+#      -g: table with the genome sequence (format=seq)
+#      -r: name or file with TE reference sequence(s) (all by default)
+#      -m: MSA method (default=Refalign/Map)
+#      -l: minimum length of copies (default=100)
+#      -n: number of longest copies to use (default=20)
+#      -y: minimum  copy proportion compare to references (default=0.5)
+#      -R: keep the reference sequence (only with Refalign)
+#      -C: configuration file
+#      -q: queue name
+#      -c: clean
+#      -d: temporary directory
+#      -v: verbosity level (default=0/1)
+
+import os
+import sys
+import glob
+import ConfigParser
+
+import pyRepet.launcher.programLauncher
+
+from commons.core.coord.PathUtils import PathUtils
+from commons.core.seq.FastaUtils import FastaUtils
+from commons.core.coord.SetUtils import SetUtils
+from commons.core.sql.TablePathAdaptator import TablePathAdaptator
+from commons.core.sql.TableSeqAdaptator import TableSeqAdaptator
+from commons.tools.OrientSequences import OrientSequences
+from ConfigParser import MissingSectionHeaderError
+from commons.core.utils.RepetOptionParser import RepetOptionParser
+from commons.core.LoggerFactory import LoggerFactory
+from commons.core.seq.AlignedBioseqDB import AlignedBioseqDB
+from commons.launcher import LaunchMap
+from commons.core.sql.DbFactory import DbFactory
+from commons.core.sql.TableJobAdaptatorFactory import TableJobAdaptatorFactory
+from commons.core.launcher.Launcher import Launcher
+from commons.core.utils.FileUtils import FileUtils
+
+
+LOG_DEPTH = "repet.tools"
+
+## For each TE reference sequence, it computes a multiple alignment and a phylogeny of all its copies.
+#
+class GetMultAlignAndPhylogenyPerTErefSeq(object):
+    
+    def __init__(self, pathTableName="",refSeqTableName="", genomeSeqTableName="", step=0, mSAmethod="RefAlign",keepRefseq=False, configFileName= "", clean = True, verbosity=3):
+        """
+        Constructor.
+        """
+        self.step = step
+        self._pathTable = pathTableName
+        self._refSeqTable = refSeqTableName
+        self._genomeSeqTable = genomeSeqTableName
+        self._TErefseq = ""
+        self._MSAmethod = mSAmethod
+        self._minCopyLength = 100
+        self._nbLongestCopies = 20
+        self._minPropCopy = 0.5
+        self._keepRefseq = keepRefseq
+        self.setConfigFileName(configFileName)
+        self._queue = ""
+        self._tmpDir = ""
+        self._clean = clean
+        self._verbosity = verbosity
+        self._db = None
+        self._tpaAnnot = None
+        self._tsaRef = None
+        self._pL = pyRepet.launcher.programLauncher.programLauncher()
+        self._log = LoggerFactory.createLogger("%s.%s" % (LOG_DEPTH, self.__class__.__name__), self._verbosity)
+              
+    def _logAndRaise(self, errorMsg):
+        self._log.error(errorMsg)
+        raise Exception(errorMsg)
+    
+    def setAttributesFromCmdLine(self):
+        desc = "For each TE reference sequence, it computes a multiple alignment and a phylogeny of all its copies.\n"
+        #Commented: it's not true, Config File is mandatory!
+#        desc += "Connection to the database parameters are retrieved from the environment"
+        
+        #TODO: format options as other scripts (have a look at LaunchTemplate)
+        parser = RepetOptionParser(description = desc, epilog = "")
+        parser.add_option("-S", "--step",      dest = "step" ,              action = "store", type = "int", help = "step (0: all steps [default], 1:file generation, 2:multiple alignments, 3:phylogenies)", default = 0 )
+        parser.add_option("-p", "--pathTable", dest = "path",               action= "store",  type = "string", help = "(mandatory) table with the annotations (format=path)",  default = "")
+        parser.add_option("-s", "--refSeqTable",dest = "refSeqTable",       action= "store", type = "string", help = "(mandatory) table with the TE reference sequences (format=seq)",  default = "")
+        parser.add_option("-g", "--genomeSeqTable",dest = "genomeSeqTable",action= "store", type = "string", help = "(mandatory) table with the genome sequence (format=seq)",  default = "")
+        parser.add_option("-r", "--TErefseq",dest = "TErefseq",         action= "store", type = "string", help = "name or file with TE reference sequence(s) (all by default)",  default = "")
+        parser.add_option("-m", "--MSAmethod",dest = "MSAmethod",         action= "store", type = "string", help = "MSA method (default=RefAlign/Map)",  default = "RefAlign")
+        parser.add_option("-l", "--minCopyLength",dest = "minCopyLength",         action= "store", type = "int", help = "minimum length of copies (default=100)",  default = 100)
+        parser.add_option("-n", "--nbLongestCopies",dest = "nbLongestCopies",         action= "store", type = "int", help = "number of longest copies to use (default=20)",  default = 20)
+        parser.add_option("-y", "--minPropCopy",dest = "minPropCopy",         action= "store", type = "float", help = "minimum  copy proportion compare to references (default=0.5)",  default = 0.5)
+        parser.add_option("-R", "--keepRefseq",dest = "keepRefseq",         action="store_true", help = "keep the reference sequence (only with Refalign)",  default = False)
+        parser.add_option("-C", "--config",    dest = "configFileName",     action = "store", type = "string", help = "(mandatory) config file name to set database connection", default = "")
+        parser.add_option("-q", "--queue",dest = "queue",         action= "store", type = "string", help = "queue name",  default = "")
+        parser.add_option("-c", "--clean", action="store_false", dest = "clean", help = "don't clean", default = True) 
+        parser.add_option("-d", "--tmpDir",dest = "tmpDir",         action= "store", type = "string", help = "temporary directory",  default = "")
+        parser.add_option("-v", "--verbosity",   dest = "verbosity",             action = "store", type = "int",    help = "verbosity level (default=0)", default = 0)
+        options = parser.parse_args()[0]
+        self._setAttributesFromOptions(options)
+        
+    def _setAttributesFromOptions(self, options):
+        self.setConfigFileName(options.configFileName)
+        self.setStep(options.step)
+        self.setPathTable(options.path)
+        self.setRefSeqTable(options.refSeqTable)
+        self.setGenomeSeqTable(options.genomeSeqTable)
+        self.setTErefseq(options.TErefseq)
+        self.setMSAmethod(options.MSAmethod)
+        self.setMinCopyLength(options.minCopyLength)
+        self.setNbLongestCopies(options.nbLongestCopies)
+        self.setMinPropCopy(options.minPropCopy)
+        self.setKeepRefseq(options.keepRefseq)
+        self.setQueue(options.queue)
+        self.setClean(options.clean)
+        self.setTmpDir(options.tmpDir)
+        self.setVerbosity(options.verbosity)
+        
+    def setStep(self, step):
+        self.step = step
+       
+    def setPathTable(self, path):
+        self._pathTable = path
+       
+    def setRefSeqTable(self, refSeqTable):
+        self._refSeqTable = refSeqTable
+       
+    def setGenomeSeqTable(self, genomeSeqTable):
+        self._genomeSeqTable = genomeSeqTable
+       
+    def setTErefseq(self, TErefseq):
+        self._TErefseq = TErefseq
+       
+    def setMSAmethod(self, MSAmethod):
+        self._MSAmethod = MSAmethod
+        
+    def setMinCopyLength(self, minCopyLength):
+        self._minCopyLength = minCopyLength
+        
+    def setNbLongestCopies(self, nbLongestCopies):
+        self._nbLongestCopies = nbLongestCopies
+        
+    def setMinPropCopy(self, minPropCopy):
+        self._minPropCopy = minPropCopy
+        
+    def setKeepRefseq(self, keepRefseq):
+        self._keepRefseq = keepRefseq
+        
+    def setQueue(self, queue):
+        self._queue = queue
+
+    def setClean(self, clean):
+        self._clean = clean
+ 
+    def setTmpDir(self, tmpDir):
+        self._tmpDir = tmpDir 
+                
+    def setVerbosity(self, verbosity):        
+        self._verbosity = verbosity     
+               
+    def setup_env(self):
+        configFileHandle = open(self._configFileName)
+        # Use RepetConfigParser?
+        config = ConfigParser.ConfigParser()
+        try :
+            config.readfp(configFileHandle)
+        except MissingSectionHeaderError:
+            self._logAndRaise("Configuration file %s must begin with a section header" % self._configFileName) 
+
+        os.environ["REPET_HOST"] = config.get("repet_env", "repet_host")
+        os.environ["REPET_USER"] = config.get("repet_env", "repet_user")
+        os.environ["REPET_PW"] = config.get("repet_env", "repet_pw")
+        os.environ["REPET_DB"] = config.get("repet_env", "repet_db")
+        os.environ["REPET_PORT"] = config.get("repet_env", "repet_port")
+        os.environ["REPET_JOB_MANAGER"] = config.get("repet_env", "repet_job_manager")
+                  
+    def setConfigFileName(self, configFileName):
+        self._configFileName = configFileName
+                    
+    def checkAttributes( self ):
+        """
+        Check the attributes are valid before running the algorithm.
+        """
+        if self._pathTable == "":
+            self._logAndRaise("PathTable is mandatory")
+        if self._refSeqTable == "":
+            self._logAndRaise("RefSeqTable is mandatory")  
+        if self._genomeSeqTable == "":
+            self._logAndRaise("GenomeSeqTable is mandatory")
+        if self._configFileName == "":
+            self._logAndRaise("Configuration file is mandatory")
+        else:
+            if FileUtils.isRessourceExists(self._configFileName):
+                self.setup_env()
+            else:
+                self._logAndRaise("Configuration file '%s' does not exist!" % self._configFileName)
+            
+        if ( self.step == 2 or self.step == 3 ) and self._MSAmethod not in ["RefAlign","Map"]:
+            if self._MSAmethod == None or self._MSAmethod == "":
+                self._logAndRaise("Missing method option")
+            self._logAndRaise("Method '%s' not yet available" % ( self._MSAmethod ))
+            
+        if self._tmpDir == "":
+            self._tmpDir  = os.getcwd()    
+            
+    def connectSql(self):  
+        self._db =  DbFactory().createInstance(configFileName = self._configFileName, verbosity = 1)
+        self._tpaAnnot = TablePathAdaptator(self._db, self._pathTable)
+        self._tsaRef = TableSeqAdaptator(self._db,self._refSeqTable)
+                
+    def getNamesOfTErefSeq( self ):
+        """
+        Return a list with the names of reference TEs.
+        """
+        lNamesTErefSeq = []
+        if self._TErefseq == "":
+            lNamesTErefSeq = self._tsaRef.getAccessionsList()
+        else:
+            if os.path.isfile( self._TErefseq ):
+                refseqFileHandler = open( self._TErefseq, "r" )
+                while True:
+                    line = refseqFileHandler.readline()
+                    if line == "":
+                        break
+                    lNamesTErefSeq.append( line[:-1].split("\t")[0] )
+                refseqFileHandler.close()
+            else:
+                lNamesTErefSeq = [ self._TErefseq ]
+                for name in lNamesTErefSeq:
+                    if not self._tsaRef.isAccessionInTable( name ):
+                        self._log.warning("'%s' not in table '%s'" % (name, self._refSeqTable))
+                        lNamesTErefSeq.remove( name )
+        lNamesTErefSeq.sort()
+        self._log.info("nb of TE reference sequences: %d" % (len(lNamesTErefSeq)))
+        return lNamesTErefSeq
+    
+    
+    def getTErefSeqInFastaFiles( self, lNamesTErefSeq ):
+        """
+        Save sequences of reference TEs in fasta files.
+        """
+        for name in lNamesTErefSeq:
+            self._log.debug("save sequence of '%s'..." % ( name ))
+            self._tsaRef.saveAccessionsListInFastaFile( [name], name+".fa" )
+            
+    def getCopiesInFastaFilesPerTErefSeq( self, lNamesTErefSeq ):
+        """
+        Save sequences of TE copies in fasta files.
+        """
+        self._log.info("retrieve the copies...")
+        tsaChr = TableSeqAdaptator( self._db, self._genomeSeqTable )
+        totalNbCopies = 0
+        totalNbSavedCopies = 0
+        for name in lNamesTErefSeq:
+            nbCopies = 0
+            if os.path.exists(name+"_copies.fa"):
+                continue
+            outFile = open( name+"_copies.fa", "w" )
+            self._log.debug("Fetching path nums for subject: %s " % name)
+            lPathNums = self._tpaAnnot.getIdListSortedByDecreasingChainLengthFromSubject(name)
+            nbCopies = len(lPathNums)
+            totalNbCopies += nbCopies
+            self._log.debug("refseq '%s': %d copies" % ( name, nbCopies ))
+            i = 0
+            nbSavedCopies = 0
+            nbSavedFragments = 0
+            lengthRefseq = self._tsaRef.getSeqLengthFromAccession( name )
+            while i < len(lPathNums) and nbSavedCopies < self._nbLongestCopies:
+                lPaths = self._tpaAnnot.getPathListFromId( lPathNums[i] )
+                lSets = PathUtils.getSetListFromQueries( lPaths )
+                copyLength = SetUtils.getCumulLength( lSets )
+                if copyLength >= self._minCopyLength \
+                and copyLength >= self._minPropCopy * lengthRefseq:
+                    bs = tsaChr.getBioseqFromSetList( lSets )
+                    bs.write(outFile)
+                    nbSavedCopies += 1
+                    nbSavedFragments += len(lPaths)
+                i += 1
+            
+            self._log.debug(" (saved: %d copies, %d fragments)\n" % ( nbSavedCopies, nbSavedFragments ) )
+            outFile.close()
+            totalNbSavedCopies += nbSavedCopies
+            if nbSavedCopies == 0 and nbCopies != 0:
+                self._log.warning("No copy >= %d" % ( self._minCopyLength ))
+        self._log.info("nb of copies: %d (%d saved)" % ( totalNbCopies, totalNbSavedCopies ))
+            
+    def filter4Alignments( self, lNamesTErefSeq ):
+        """
+        Filter TE copy sequences according to their length.
+        """
+        self._log.info("filtering copies...")
+        if len(lNamesTErefSeq) == 1:
+            if not os.path.exists( "%s_copies.fa" % ( lNamesTErefSeq[0] ) ):
+                self._logAndRaise("first run step 1")
+            lInFiles = [ "%s_copies.fa" % ( lNamesTErefSeq[0] ) ]
+        else:
+            lInFiles = glob.glob( "*_copies.fa" )
+            if len(lInFiles) == 0:
+                self._logAndRaise("no file '*_copies.fa'")
+        count = 0
+        for inFileName in lInFiles:
+            if os.path.exists( "%s.filtered" % ( inFileName ) ):
+                continue
+            count += 1
+            self._log.debug("TE %d --> %s" %(count,inFileName))
+            FastaUtils.dbLengthFilter( self._minCopyLength, inFileName, verbose=self._verbosity )
+            FastaUtils.dbLongestSequences( self._nbLongestCopies, inFileName+".Sup"+str(self._minCopyLength), verbose=self._verbosity )
+            os.rename( inFileName+".Sup"+str(self._minCopyLength)+".best"+str(self._nbLongestCopies), inFileName+".filtered" )
+            os.remove( inFileName+".Sup"+str(self._minCopyLength) )
+            os.remove( inFileName+".Inf"+str(self._minCopyLength) )
+        self._log.info("files filtered: %d" % (count))
+            
+    def buildInFiles4Launcher( self, lNamesTErefSeq ):
+        """
+        Save sequences of TE copies with reference in fasta files for launcher usage.
+        """
+        self._log.info("building input files for launcher...")
+        for name in lNamesTErefSeq:
+            if os.path.exists( "%s_all.fa.oriented" % ( name ) ):
+                continue
+            if FastaUtils.dbSize( "%s_copies.fa.filtered" % ( name ) ) > 0:
+                os.system( "cat "+name+".fa "+ name+"_copies.fa.filtered > " + name+"_all.fa" )
+                ors = OrientSequences(inFileName= "%s_all.fa" %(name), prgToOrient="mummer", clean=True, verbosity =self._verbosity - 1)
+                ors.run()
+                ors.clean()
+        if len( glob.glob("*_all.fa.oriented") ) == 0:
+            self._logAndRaise("no copies")
+        self._log.info("done building input files for launcher...")   
+            
+    def renameFile( self, fromName, toName):
+        lFiles = glob.glob( "*%s" %fromName )
+        for f in lFiles:
+            os.rename( f, f.replace(fromName,toName))
+    
+    def _preparejobs(self, iLauncher, cDir):
+        self._log.info("Preparing Align jobs")
+        lCmdsTuples = []
+        print(self.queriesDir,self.alignFileSuffix)
+        queryFiles = glob.glob("%s/%s" % (self.queriesDir,self.alignFileSuffix))
+        print("queryFiles",queryFiles)
+        for queryFile in queryFiles:#os.listdir(self.queriesDir):
+            lCmds = []
+            lCmdStart = []
+            lCmdFinish = [] #['shutil.move("%s/*" %newDir, "../" )']
+            queryFilePath = os.path.join(self.queriesDir,queryFile)
+            lCmds.append(self._createLaunchAlignCommands(iLauncher, queryFilePath))
+            #lCmdFinish.append("shutil.move(\"%s.%s\", \"%s/%s.%s\")" % (benchName,self.outputformat,self.resultsDir,benchName,self.outputformat))
+            lCmdsTuples.append(iLauncher.prepareCommands_withoutIndentation(lCmds, lCmdStart, lCmdFinish))   
+        self._log.info("Finished preparing Align jobs")
+        return  lCmdsTuples
+
+    def _preparePhyMljobs(self, iLauncher, cDir):
+        self._log.info("Preparing PhyMl jobs")
+        lCmdsTuples = []
+        queryFiles = glob.glob("%s/%s" % (self.queriesDir,self.phyloFileSuffix))
+        print("queryFiles",queryFiles)
+        for queryFile in queryFiles:#os.listdir(self.queriesDir):
+            lCmds = []
+            lCmdStart = []
+            lCmdFinish = [] #['shutil.move("%s/*" %newDir, "../" )']
+            queryFilePath = os.path.join(self.queriesDir,queryFile)
+            lCmds.append(self._createLaunchPhyMLCommands(iLauncher, queryFilePath))
+            lCmdsTuples.append(iLauncher.prepareCommands_withoutIndentation(lCmds, lCmdStart, lCmdFinish))   
+        self._log.info("Finished preparing PhyMl jobs")
+        return  lCmdsTuples
+    
+    def _createLaunchAlignCommands(self, iLauncher, query):
+        if self._MSAmethod == "Map":
+            prg = "LaunchMap.py"
+        elif self._MSAmethod == "RefAlign":
+            prg = "LaunchRefAlign.py"
+            
+        lArgs = []
+        lArgs.append("-i %s" % query)
+        lArgs.append(" -o %s.fa_aln" % query)    
+        lArgs.append("-v 1" )
+        
+        if self._MSAmethod == "RefAlign" and self._keepRefseq:
+            lArgs.append("-r " )
+        
+        self._log.debug("Prepared Align commands : %s %s" % (prg, " ".join(lArgs)))
+        
+        
+        return iLauncher.getSystemCommand("%s" % prg, lArgs)
+                 
+    def launchMultAlignments(self, lNamesTErefSeq):
+        """
+            Make multiple alignments via Map for each TE family
+        """
+        self.queriesDir =  os.getcwd()
+        
+        if len(lNamesTErefSeq) == 1:
+            self.alignFileSuffix = "%s_all.fa.oriented" % (lNamesTErefSeq[0])
+        else:
+            self.alignFileSuffix = "*_all.fa.oriented"
+        
+        queue = self._queue
+        cDir = os.getcwd()
+        tmpDir =  self._tmpDir 
+        groupid = "%s_%s" % ( self._refSeqTable, self._MSAmethod )
+        acronym = "Align"
+        iDb = DbFactory.createInstance(configFileName=self._configFileName)
+        iTJA = TableJobAdaptatorFactory.createInstance(iDb, "jobs")
+        iLauncher = Launcher(iTJA, os.getcwd(), "", "", cDir, tmpDir, "jobs", queue, groupid)
+        lCmdsTuples = self._preparejobs(iLauncher, cDir)
+        iLauncher.runLauncherForMultipleJobs(acronym, lCmdsTuples, self._clean) 
+            
+        self.renameFile("_all.fa.oriented.fa_aln", "_all.fa.oriented_%s.fa_aln" % (self._MSAmethod.lower()) )
+            
+#    def __makeMultAlignments( self, lNamesTErefSeq ):
+#        """
+#        Make multiple alignments via Map or Refalign for each TE family
+#        """
+#        self._pL.reset("")
+#        if self._MSAmethod == "Map":
+#            
+#            prg = os.environ["REPET_PATH"] + "/bin/srptMAP.py"
+#        elif self._MSAmethod == "RefAlign":
+#            prg = os.environ["REPET_PATH"] + "/bin/srptRefalign.py"
+#        cmd = prg
+#        cmd += " -g %s_%s" % ( self._refSeqTable, self._MSAmethod )
+#        cmd += " -q %s" % ( os.getcwd() )
+#        if len(lNamesTErefSeq) == 1:
+#            cmd += " -S %s_all.fa.oriented" % ( lNamesTErefSeq[0] )
+#        else:
+#            cmd += " -S '*_all.fa.oriented'"
+#        cmd += " -Q %s" % ( self._queue )
+#        cmd += " -C %s" % ( self._configFileName )
+#        if self._MSAmethod == "Refalign" and self._keepRefseq:
+#            cmd += " -r"
+#        if not self._clean :
+#            cmd += " -c"
+#        if self._tmpDir != "":
+#            cmd += " -d %s" % ( self._tmpDir )
+#        cmd += " -v %d" % ( self._verbosity )
+#        self._pL.launch( prg, cmd )
+#        lFiles = glob.glob( "*_all.fa.oriented.fa_aln" )
+#        for f in lFiles:
+#            os.rename( f, f.replace("_all.fa.oriented.fa_aln","_all.fa.oriented_%s.fa_aln" % (self._MSAmethod.lower()) ) )
+            
+            
+    def filter4phylogenies( self, verbosity=0 ):
+        """
+        Filter TE copy alignment for better phylogenies.
+        """
+        self._log.info("Filtering MSA")
+        lInFiles = glob.glob( "*_all.fa.oriented_%s.fa_aln" % ( self._MSAmethod.lower() ) )
+        count = 0
+        for inFileName in lInFiles:
+            count += 1    
+            self._log.debug("clean MSA %d --> %s" % (count,inFileName))  
+            alignDB = AlignedBioseqDB()
+            alignDB.load(inFileName)
+            alignDB.cleanMSA()
+            if alignDB.getSize() > 2:                
+                alignDB.save( inFileName + ".clean" )
+                self._log.debug("clean!")
+            else:
+                self._log.debug("skip!")
+        self._log.info("MSA cleaned: %d" % count)
+            
+
+    def _createLaunchPhyMLCommands(self, iLauncher, query):
+#        prg = os.environ["REPET_PATH"] + "/bin/srptPhyML.py"
+#        cmd = prg
+#        cmd += " -g %s_PHY_%s" % ( self._refSeqTable, os.getpid() )
+#        cmd += " -q %s" % ( os.getcwd() )
+#        cmd += " -S '*_all.fa.oriented_%s.fa_aln.clean'" % ( self._MSAmethod.lower() )
+#        cmd += " -Q %s" % ( self._queue )
+#        cmd += " -C %s" % ( self._configFileName )
+
+        prg = "LaunchPhyML.py"
+        lArgs = []
+        lArgs.append("-i %s" % query)
+        lArgs.append("-o %s.fa_phylo" % query)    
+        lArgs.append("-v %d" % (self._verbosity-1))
+        
+        self._log.debug("Prepared Phyml commands : %s %s" % (prg, " ".join(lArgs)))
+        return iLauncher.getSystemCommand("%s" % prg, lArgs)
+   
+    def makePhylogenies( self ):
+        """
+        Launch PhyML on each TE family.
+        """
+        self.phyloFileSuffix = "*_all.fa.oriented_%s.fa_aln.clean" % ( self._MSAmethod.lower() )
+        
+        queue = self._queue
+        cDir = os.getcwd()
+        tmpDir =  self._tmpDir 
+        groupid = "%s_PHY_%s" % ( self._refSeqTable, os.getpid() )
+        acronym = "Phylo"
+        iDb = DbFactory.createInstance(configFileName=self._configFileName)
+        iTJA = TableJobAdaptatorFactory.createInstance(iDb, "jobs")
+        iLauncher = Launcher(iTJA, os.getcwd(), "", "", cDir, tmpDir, "jobs", queue, groupid)
+        lCmdsTuples = self._preparePhyMljobs(iLauncher, cDir)
+        iLauncher.runLauncherForMultipleJobs(acronym, lCmdsTuples, self._clean) 
+
+        
+    def start( self ):
+        """
+        Useful commands before running the program.
+        """
+        self.checkAttributes()
+        self._log.info("START GetMultAlignAndPhylogenyPerTErefSeq.py STEP %d" % self.step)
+        self.connectSql()
+            
+    def end( self ):
+        """
+        Useful commands before ending the program.
+        """
+        self._db.close()
+        self._log.info("END GetMultAlignAndPhylogenyPerTErefSeq.py STEP %d" % self.step)
+            
+    def run( self ):
+        """
+        Run the program.
+        """
+        LoggerFactory.setLevel(self._log, self._verbosity)
+        self.start()
+        lNamesTErefSeq = self.getNamesOfTErefSeq()
+        self._log.debug("lNamesTErefSeq: %s" %  " ".join(lNamesTErefSeq))
+        
+        if self.step in [0, 1]:
+            self.getTErefSeqInFastaFiles( lNamesTErefSeq )
+            self.getCopiesInFastaFilesPerTErefSeq( lNamesTErefSeq )
+            
+        if self.step in [0, 2]:
+            self.filter4Alignments(lNamesTErefSeq)
+            self.buildInFiles4Launcher(lNamesTErefSeq)
+            self.launchMultAlignments(lNamesTErefSeq)
+            
+        if self.step in [0, 3]:
+            self.filter4phylogenies(verbosity=self._verbosity)
+            self.makePhylogenies()
+        self.end()
+        
+if __name__ == "__main__":
+    iGetMultAlignAndPhylogenyPerTErefSeq = GetMultAlignAndPhylogenyPerTErefSeq()
+    iGetMultAlignAndPhylogenyPerTErefSeq.setAttributesFromCmdLine()
+    iGetMultAlignAndPhylogenyPerTErefSeq.run()
+