Mercurial > repos > dereeper > uniqprimer
diff uniqprimer-0.5.0/uniqprimer.py @ 3:3249d78ecfc2 draft
Uploaded
author | dereeper |
---|---|
date | Mon, 03 Jan 2022 09:56:55 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uniqprimer-0.5.0/uniqprimer.py Mon Jan 03 09:56:55 2022 +0000 @@ -0,0 +1,256 @@ +#!/usr/bin/python + +''' +Created on Jan 1, 2011 + +@author: John L. Herndon +@contact: herndon@cs.colostate.edu +@organization: Colorado State University +@group: Computer Science Department, Asa Ben-Hur's laboratory +''' + +import exceptions +import sys +import time +import os ## added by Alexis + +sys.path.append("/gs7k1/home/galaxy/galaxy_env/lib/python2.7/site-packages") + +import getopt +from primertools import * + +version="0.5.0" + + +class UniqPrimerFinder( object ): + + def __init__( self, includeFiles, excludeFiles, crossValidate, eprimerOptions): + + utils.logMessage( "UniqPrimerFinder::__init__()", "Initializing UniqPrimerFinder" ) + self.includeFiles = includeFiles + self.includeFileManager = includefilemanager.IncludeFileManager( ) + + self.excludeFiles = excludeFiles + self.excludeFileManager= excludefilemanager.ExcludeFileManager( ) + + self.primerManager = primermanager.PrimerManager( eprimerOptions ) + + self.crossValidate = crossValidate + + + utils.logMessage( "UniqPrimerFinder::__init__()", "Initializing UniqPrimerFinder - complete" ) + + def writeOutputFile( self, primers, outputFileName, maxresults = 100 ): + ''' + primers: a list of PrimerSet obs + ''' + ##outputFileName = uPrimer ##Mau: defined this.. + outputFile = open( outputFileName, 'w' ) + + i = 0 + for primer in primers: + i += 1 + + outputFile.write( "{0}\t{1}\t{2}\t{3}\n".format( i, primer.forwardPrimer, primer.reversePrimer, primer.productSize ) ) + + if i > maxresults: + break + + utils.logMessage( "UniqPrimerFinder::writeOutputFile()", "output file written." ) + + + def findPrimers( self, outputFile = "uPrimer.txt" ): + outputFile = uPrimer ## Mau adds to overwrite the above value + + + utils.logMessage( "UniqPrimerFinder::findPrimers()", "Finding primers for include files" ) + startTime = time.time( ) + #generate the combined sequence fasta file for all exclude sequences + utils.printProgressMessage( "*** Creating Combined Fasta File for Exclude Files ***" ) + for excludeFile in self.excludeFiles: + self.excludeFileManager.addExcludeFile( excludeFile ) + + self.excludeFileManager.exportSequences( ) + + self.includeFileManager.setExcludeFile( self.excludeFileManager.getOutputFileName( ) ) + + utils.printProgressMessage( "*** Finding Sequences Unique to Target Genome ***" ) + + #run nucmer program on all include files + for includeFile in self.includeFiles: + self.includeFileManager.processIncludeFile( includeFile ) + + #get the sequences found in include files, but no the exclude file. + uniqueSequences = self.includeFileManager.getUniqueSequences( ) + + utils.printProgressMessage( "*** Finding Primers ***" ) + + primers = self.primerManager.getPrimers( uniqueSequences ) + + if self.crossValidate == True: + utils.printProgressMessage( "*** Cross Validating Primers ***" ) + primers = self.primerManager.crossValidatePrimers( primers, self.excludeFileManager.getOutputFileName( ) ) + # added by Alexis, primersearch also against all include files + #run primersearch program on all include files + j=0 + for includeFile in self.includeFiles: # added by Alexis + j = j + 1 + primers = self.primerManager.crossValidatePrimers2( primers, includeFile, j) # added by Alexis + + + utils.logMessage( "UniqPrimerFinder::findPrimers( )", "found {0} unique sequences".format( len( primers ) ) ) + + self.writeOutputFile( primers, outputFile ) + + utils.logMessage( "UniqPrimerFinder::findPrimers()", "Finished finding primers" ) + endTime = time.time() + elapsedMinutes = int( ( endTime - startTime ) / 60 ) + elapsedSeconds = int( ( endTime - startTime ) % 60 ) + print "*** Time Elapsed: {0} minutes, {1} seconds ***".format( elapsedMinutes, elapsedSeconds ) + print "*** Output Written to {0} ***".format( outputFile ) + + +def printUsageAndQuit( ): + global version + print "uniqprimer - finds primers unique to a genome" + print "Version: " + str( version ) + print "Summary of Options." + print "Required Arguments:" + print " -i <filename>: use <filename> as an include file. Primers will be identified for this genome" + print " -x <filename>: use <filename> as an exclude file. Primers for this genome will be excluded" + print " -o <filename>: specify the name of the unique primer output file (default is uPrimer.txt)" ## Mau added.. + print " -l <filename>: specify the name of the log output file" ## Mau added.. + print " -f <filename>: specify the name of the Fasta of differential sequences" ## Alexis added.. + + print "\nOptional Arguments:" + print " --productsizerage: set a range for the desired size of PCR product (default=200-250). Example: ./uniqprimer -productsizerage 100-150" + print " --primersize: set the desired primer size (default=20)" + print " --minprimersize: set the minimum primer size (default=27)" + print " --maxprimersize: set the maximum primer size (default=18)" + print " --crossvalidate: force the program to cross validate primers against exclude files for extra certainty" + print " --keeptempfiles: force the program to keep temporary files" + + print "\n\nExample:" + print "uniqprimer -i <includefile1> -i <includefile2> ... -i <includefileN> -x <excludefile1> -x <excludefile2> ... -x <excludefileN> -o primers.txt -l logfile.txt -f seqForPrimer3.fa" + utils.shutdownLogging( ) + sys.exit( ) + + +opts = 'i:x:h:o:l:f:' # Mau added :o & :l for outfile specification, Alexis added :f +longopts=[ "productsizerange=", "primersize=", "minprimersize=", "maxprimersize=", "crossvalidate", "keeptempfiles" ] + +def parseArgs( args ): + + + global uPrimer ## Mau added lf, brute force... + global lf # Mau added lf, brute force... + global fastaDiff # Alexis added fastaDiff + #uPrimer = "uPrimer.txt" ##the default value... + + crossValidate = False + cleanup = True + optlist, args = getopt.getopt( args, opts, longopts ) + + includeFiles = [ ] + excludeFiles = [ ] + eprimerOptions = utils.EPrimerOptions( ) + + verbose = False + for opt in optlist: + if opt[ 0 ] == '-i': + includeFiles.append( opt[ 1 ] ) + elif opt[ 0 ] == '-x': + excludeFiles.append( opt[ 1] ) + elif opt[ 0 ] == '-v': + verbose = True + elif opt[ 0 ] == '-o': ## Mau added, if -o... + uPrimer = str(opt[1]) ## Mau added, then get filename for outfile after -o + elif opt[ 0 ] == '-l': ## Mau added, if -l... + lf = str(opt[1]) ## Mau added, then get filename for logfile after -l + elif opt[ 0 ] == '-f': ## Alexis added, if -f + fastaDiff = str(opt[1]) ## Alexis added, then get filename for fasta file after -f + elif opt[ 0 ] == '--productsizerange': + eprimerOptions.setProductRange( opt[ 1 ] ) + productsizerange = opt[ 1 ] + elif opt[ 0 ] == '--primersize': + eprimerOptions.setPrimerSize( opt[1 ] ) + elif opt[ 0 ] == '--minprimersize': + eprimerOptions.setMinPrimerSize( opt[1 ] ) + elif opt[ 0 ] == '--maxprimersize': + eprimerOptions.setMaxPrimerSize( opt[1 ] ) + elif opt[ 0 ] == '--crossvalidate': + crossValidate = True + elif opt[ 0 ] == '--crossvalidate': + crossValidate = True + elif opt[ 0 ] == '--keeptempfiles': + cleanup = False + elif opt[ 0 ] == '-h': + printUsageAndQuit( ) + else: + print "Unknown option: " + str( opt[ 0 ] ) + printUsageAndQuit( ) + #print "uPrimer: " + uPrimer + " log file name: " + lf + "\n" + if len( includeFiles ) == 0 or len( excludeFiles ) == 0: + + print "You must specify at least one include file and at least one exclude file" + printUsageAndQuit( ) + + return includeFiles, excludeFiles, crossValidate, cleanup, verbose, eprimerOptions, lf , uPrimer, fastaDiff #Mau: add lf, uPrime + +def main( args, debug = False): + #parse the command line arguments for include and exclude files + + includeFiles, excludeFiles, crossValidate, cleanup, verbose, eprimerOptions, lf, uPrimer, fastaDiff = parseArgs( args ) ##Mau add: lf + utils.initialize( True, cleanup, lf) ##Mau: add lf + #find primers for the include sequences + + tmpdir = utils.getTemporaryDirectory() ## added by Alexis + command = "cp -rf " + tmpdir + "/sequenceForEprimer.fasta" + " " + fastaDiff + + try: + utils.logMessage( "uniqprimer::Main( )", "Logging include files: " ) + utils.logList( "uniqprimer::Main( )", includeFiles ) + utils.logMessage( "uniqprimer::Main( )", "Logging exclude files: " ) + utils.logList( "uniqprimer::Main( )", excludeFiles) + print "*** Finding Primers ***" + uniqPrimer = UniqPrimerFinder( includeFiles, excludeFiles, crossValidate, eprimerOptions) + uniqPrimer.findPrimers( ) + except utils.NoFileFoundException as nfe: + print "File not found: " + str( nfe.filename ) + printUsageAndQuit( ) + except utils.ProgramNotFoundException as pnfe: + print str( pnfe.programName ) + ": program is not installed or is not in your path." + print str( pnfe.details ) + except utils.NoPrimersExistException as npe: + print "Failure: No unique primers exist for this combination" + except exceptions.BaseException as e: + print "It appears that an unknown sequence of events has resulted in the internal explosion of this program. Please send the file called \'log_uniqprimer.txt\' to herndon@cs.colostate.edu and tell that bonehead John to fix it!" + print "Details:" + print e + + os.system("cp -rf " + tmpdir + "/sequenceForEprimer.fasta" + " " + fastaDiff) + utils.shutdown( ) + + print "*** Finished ***" + +if __name__ == '__main__': + + #temp_args = "-i data/testdata/smallinclude.ffn -x data/testdata/smallexclude.ffn".split( ) + + #temp_args = "-i data/XOO_MAI1_scaffolds.fas -x data/KACC.ffn".split( ) + if len( sys.argv ) == 1: + printUsageAndQuit( ) + main( sys.argv[ 1: ], debug = True ) + + + + + + + + + + + + +