view commons/launcher/NWalignProgramLauncher.py @ 19:9bcfa7936eec

Deleted selected files
author m-zytnicki
date Mon, 29 Apr 2013 03:23:29 -0400
parents 94ab73e8a190
children
line wrap: on
line source

#!/usr/bin/env python

##@file
# Launch NWalign (pairwise alignment).
#
# options:
#      -h: this help
#      -i: name of the input file (queries, format='fasta')
#      -s: name of the subject file (format='fasta')
#      -p: parameters for 'NWalign' (default='-d 2')
#      -o: name of the output file (format='align', default=inFile+'.align')
#      -c: clean
#      -v: verbosity level (default=0/1)


import os
import sys

from pyRepet.launcher.AbstractProgramLauncher import AbstractProgramLauncher
from commons.core.seq.AlignedBioseqDB import AlignedBioseqDB
from commons.core.coord.AlignUtils import AlignUtils


class NWalignProgramLauncher( AbstractProgramLauncher ):
    """
    Launch NWalign (pairwise alignment).
    """
    
    def __init__( self ):
        """
        Constructor.
        """
        AbstractProgramLauncher.__init__( self )
        self._prgName = "NWalign"
        self._formatInFile = "fasta"
        self._sbjFile = ""
        self._prgParam = ""
        self._cmdLineSpecificOptions = "s:p:o:"
        
        
    def getSpecificHelpAsString( self ):
        """
        Return the specific help as a string.
        """
        string = ""
        string += "\nspecific options:"
        string += "\n     -s: name of the subject file (format='fasta')"
        string += "\n     -p: parameters for '%s'" % ( self.getProgramName() )
        string += "\n     -o: name of the output file (format='align', default=inFile+'.align')"
        return string
    
    
    def setASpecificAttributeFromCmdLine( self, o, a="" ):
        """
        Set a specific attribute from the command-line arguments.
        """
        if o =="-s":
            self.setSubjectFile( a )
        elif o == "-p":
            self.setProgramParameters( a )
        elif o == "-o":
            self.setOutputFile( a )
            
            
    def setSubjectFile( self, arg ):
        self._sbjFile = arg
        
        
    def getSubjectFile( self ):
        return self._sbjFile
    
    
    def checkSpecificAttributes( self ):
        """
        Check the specific attributes before running the program.
        """
        if self._sbjFile == "":
            string = "ERROR: missing subject file (-s)"
            print string
            print self.getHelpAsString()
            sys.exit(1)
        if self.getOutputFile() == "":
            self.setOutputFile( "%s.align" % ( self.getInputFile() ) )
            
            
    def setWrapperCommandLine( self ):
        """
        Set the command-line of the wrapper.
        Required for NWalignClusterLauncher.
        """
        self._wrpCmdLine = self.getWrapperName()
        self._wrpCmdLine += " -i %s" % ( self.getInputFile() )
        self._wrpCmdLine += " -s %s" % ( self.getSubjectFile() )
        if self.getProgramParameters() != "":
            self._wrpCmdLine += " -p '%s'" % ( self.getProgramParameters() )
        if self.getOutputFile() == "":
            self.setOutputFile( "%s.align" % ( self.getInputFile() ) )
        self._wrpCmdLine += " -o %s" % ( self.getOutputFile() )
        if self.getClean():
            self._wrpCmdLine += " -c"
        self._wrpCmdLine += " -v %i" % ( self.getVerbosityLevel() )
        
        
    def setProgramCommandLine( self ):
        """
        Set the command-line of the program.
        """
        self._prgCmdLine = self.getProgramName()
        if self.getProgramParameters() != "":
            self._prgCmdLine += " %s" % ( self.getProgramParameters() )
        self._prgCmdLine += " -o %s.afa" % ( self.getInputFile() )
        self._prgCmdLine += " -v %i" % ( self.getVerbosityLevel() )
        self._prgCmdLine += " %s" % ( self.getSubjectFile() )
        self._prgCmdLine += " %s" % ( self.getInputFile() )
        
        
    def setListFilesToKeep( self ):
        """
        Set the list of files to keep.
        """
        if self.getOutputFile() == "":
            self.setOutputFile( "%s.afa" % ( self.getInputFile() ) )
        self.appendFileToKeep( self.getOutputFile() )
        
        
    def postprocess( self ):
        absDB = AlignedBioseqDB( "%s.afa" % ( self.getInputFile() ) )
        lHeaders = absDB.getHeaderList()
        queryHeader = lHeaders[0]
        subjectHeader = lHeaders[1]
        queryLength = absDB.fetch( queryHeader ).getLength()
        subjectLength = absDB.fetch( subjectHeader ).getLength()
        lAligns = absDB.getAlignList( queryHeader, subjectHeader )
        for i in lAligns:
            if "re-oriented" in i.getQueryName():
                i.setQueryName( queryHeader.replace(" re-oriented","") )
                start = i.getQueryStart()
                end = i.getQueryEnd()
                i.setQueryStart( queryLength - end + 1 )
                i.setQueryEnd( queryLength - start + 1 )
            if "re-oriented" in i.getSubjectName():
                i.setSubjectName( subjectHeader.replace(" re-oriented","") )
                start = i.getSubjectStart()
                end = i.getSubjectEnd()
                i.setSubjectEnd( subjectLength - end + 1 )
                i.setSubjectStart( subjectLength - start + 1 )
            if not i.isQueryOnDirectStrand():
                i.reverse()
        AlignUtils.writeListInFile( lAligns, self.getOutputFile() )
        os.remove( "%s.afa" % ( self.getInputFile() ) )
        
        
    def setSummary( self ):
        self._summary = "input file: %s" % ( self.getInputFile() )
        self._summary += "\nsubject file: %s" % ( self.getSubjectFile() )
        self._summary += "\nparameters: %s" % ( self.getProgramParameters() )
        if self.getOutputFile() == "":
            self.setOutputFile( "%s.align" % ( self.getInputFile() ) )
        self._summary += "\noutput file: %s" % ( self.getOutputFile() )
        
        
    def run( self ):
        """
        Run the program.
        """
        self.start()
        
        self.setProgramCommandLine()
        cmd = self.getProgramCommandLine()
        if self.getVerbosityLevel() > 0:
            print "LAUNCH: %s" % ( cmd )
            sys.stdout.flush()
        exitStatus = os.system( cmd )
        if exitStatus != 0:
            string = "ERROR: program '%s' returned exit status '%i'" % ( self.getProgramName(), exitStatus )
            print string
            sys.exit(1)
            
        self.postprocess()
        
        self.end()
        
        
if __name__ == "__main__":
    i = NWalignProgramLauncher()
    i.setAttributesFromCmdLine()
    i.run()