Repository 'uniqprimer'
hg clone https://toolshed.g2.bx.psu.edu/repos/dereeper/uniqprimer

Changeset 3:3249d78ecfc2 (2022-01-03)
Previous changeset 2:7e0438dad4e9 (2022-01-03) Next changeset 4:1306b28be7c3 (2022-01-03)
Commit message:
Uploaded
added:
uniqprimer-0.5.0/PKG-INFO
uniqprimer-0.5.0/README.txt
uniqprimer-0.5.0/build/lib/primertools/__init__.py
uniqprimer-0.5.0/build/lib/primertools/eprimerparser.py
uniqprimer-0.5.0/build/lib/primertools/excludefilemanager.py
uniqprimer-0.5.0/build/lib/primertools/fastaparser.py
uniqprimer-0.5.0/build/lib/primertools/includefilemanager.py
uniqprimer-0.5.0/build/lib/primertools/nucmerparser.py
uniqprimer-0.5.0/build/lib/primertools/primermanager.py
uniqprimer-0.5.0/build/lib/primertools/primersearchutils.py
uniqprimer-0.5.0/build/lib/primertools/primersequence.py
uniqprimer-0.5.0/build/lib/primertools/programs.py
uniqprimer-0.5.0/build/lib/primertools/utils.py
uniqprimer-0.5.0/build/scripts-2.6/uniqprimer.py
uniqprimer-0.5.0/data/PX099A.fa
uniqprimer-0.5.0/data/X11-5Agenome.fasta
uniqprimer-0.5.0/data/XCCgenome.fasta
uniqprimer-0.5.0/data/Xcampestris.fasta
uniqprimer-0.5.0/data/Xoc_BLS256.fasta
uniqprimer-0.5.0/data/Xoo_KACC_10331.fasta
uniqprimer-0.5.0/log
uniqprimer-0.5.0/logfile
uniqprimer-0.5.0/logfile.txt
uniqprimer-0.5.0/nucmer_alignments.coords
uniqprimer-0.5.0/nucmer_alignments.delta
uniqprimer-0.5.0/outalex
uniqprimer-0.5.0/outfile.txt
uniqprimer-0.5.0/output
uniqprimer-0.5.0/primers.txt
uniqprimer-0.5.0/primertools/__init__.py
uniqprimer-0.5.0/primertools/__init__.pyc
uniqprimer-0.5.0/primertools/eprimerparser.py
uniqprimer-0.5.0/primertools/eprimerparser.pyc
uniqprimer-0.5.0/primertools/excludefilemanager.py
uniqprimer-0.5.0/primertools/excludefilemanager.pyc
uniqprimer-0.5.0/primertools/fastaparser.py
uniqprimer-0.5.0/primertools/fastaparser.pyc
uniqprimer-0.5.0/primertools/includefilemanager.py
uniqprimer-0.5.0/primertools/includefilemanager.pyc
uniqprimer-0.5.0/primertools/nucmerparser.py
uniqprimer-0.5.0/primertools/nucmerparser.pyc
uniqprimer-0.5.0/primertools/primermanager.py
uniqprimer-0.5.0/primertools/primermanager.pyc
uniqprimer-0.5.0/primertools/primersearchutils.py
uniqprimer-0.5.0/primertools/primersearchutils.pyc
uniqprimer-0.5.0/primertools/primersequence.py
uniqprimer-0.5.0/primertools/primersequence.pyc
uniqprimer-0.5.0/primertools/programs.py
uniqprimer-0.5.0/primertools/programs.pyc
uniqprimer-0.5.0/primertools/utils.py
uniqprimer-0.5.0/primertools/utils.pyc
uniqprimer-0.5.0/seqForPrimer3.fa
uniqprimer-0.5.0/setup.py
uniqprimer-0.5.0/stdout
uniqprimer-0.5.0/uniqprimer.py
uniqprimer-0.5.0/uniqprimer_ok.py
uniqprimer-0.5.0/utils.py
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/PKG-INFO
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/PKG-INFO Mon Jan 03 09:56:55 2022 +0000
b
@@ -0,0 +1,10 @@
+Metadata-Version: 1.0
+Name: uniqprimer
+Version: 0.5.0
+Summary: A Python tool for finding primers unique to a given genome
+Home-page: UNKNOWN
+Author: John Herndon
+Author-email: johnlherndon@gmail.com
+License: GNU GPL v3
+Description: UNKNOWN
+Platform: UNKNOWN
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/README.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/README.txt Mon Jan 03 09:56:55 2022 +0000
b
@@ -0,0 +1,5 @@
+Installing the modded python scripts
+1- copy <uniqprimer.py> to the uniqprimer installation directory
+2- copy utils.py to primertools/ directory in the install dir
+3- re-run uniqprimer setup (sudo python setup.py)
+
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/build/lib/primertools/__init__.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/build/lib/primertools/__init__.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,10 @@
+__all__ = [ 'eprimerparser', 
+            'excludefilemanager', 
+            'fastaparser', 
+            'includefilemanager', 
+            'nucmerparser', 
+            'primermanager', 
+            'primersearchutils',
+            'primersequence', 
+            'programs', 
+            'utils'  ]
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/build/lib/primertools/eprimerparser.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/build/lib/primertools/eprimerparser.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,75 @@
+'''
+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 os
+import utils
+import re
+
+def parsePrimerSequences( eprimerFile ):
+    '''
+    parse an eprimer3 output file for all primers
+    '''
+    
+    utils.logMessage( "eprimerparser::parsePrimerSequences( )", "parsing for primer sequences" )
+    if os.path.exists( eprimerFile ) == False:
+        utils.logMessage( "eprimerparser::parsePrimerSequences( )", "ERROR - eprimer file was not found" )
+        raise utils.NoFileFoundException( eprimerFile )
+    
+    
+    primers = [ ]
+    primerFile = open( eprimerFile )
+    
+    currentPrimer = None
+            
+    nextPrimerId = 0
+    for line in primerFile.readlines( ):
+        
+        if line[ 0 ] == '# ':
+            continue
+        
+        if line.find( "PRODUCT SIZE" ) != -1:
+            if currentPrimer is not None:
+                primers.append( currentPrimer )
+            currentPrimer = utils.PrimerSet( str( nextPrimerId ) )
+            nextPrimerId += 1
+            productSize = int( line.split( ':' )[ 1 ].strip( ) )
+            currentPrimer.setProductSize( productSize )
+        else:
+            tokens = re.split( ' *', line.strip( ) ) 
+            if len( tokens ) == 7:
+                
+                sequence = tokens[ 6 ]
+                temp = tokens[ 4 ]
+            
+                if tokens[ 0 ] == "FORWARD": 
+                    currentPrimer.setForwardPrimerData( sequence, temp )
+                elif tokens[ 0 ] == "REVERSE":
+                    currentPrimer.setReversePrimerData( sequence, temp )
+    
+    if currentPrimer is not None:
+        primers.append( currentPrimer )
+    
+    utils.logMessage( "eprimerparser::parsePrimerSequences( )", "finished parsing. found {0} primers".format( len( primers ) ) )
+    return primers        
+                
+            
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+    
+    
+     
+    
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/build/lib/primertools/excludefilemanager.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/build/lib/primertools/excludefilemanager.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,75 @@
+'''
+Created on Jan 16, 2011
+
+@author: jlh
+'''
+import utils
+import fastaparser
+from Bio import SeqIO
+import os
+
+class ExcludeFileManager( object ):
+    '''
+    A class to manage fasta files to be excluded
+    '''
+
+    def __init__( self ):
+        """
+        Initialize the ExcludeFileManager
+        """
+        self.excludeFiles = [ ]
+        self.outputFile = ""
+    
+    def getOutputFileName( self ):
+        """
+         get the name of the file combined-sequence fasta file
+        """
+        return self.outputFile
+    
+    def addExcludeFile( self,  excludeFile ):
+        """
+        add a file to be managed by the ExcludeFileManager
+        """
+        
+        if os.path.exists( excludeFile ) == False:
+            utils.logMessage( "ExcludeFileManager::addExcludeFile( )", "exclude file not found: {0}".format( excludeFile ) )
+            raise utils.NoFileFoundException( excludeFile )
+        
+        utils.logMessage( "ExcludeFileManager::addExcludeFile( )", "adding exclude file {0}".format( excludeFile ) )
+        self.excludeFiles.append( excludeFile )
+    
+    def buildOutputFileName( self ):
+        """
+        build a unique file name to store the combined output sequences to
+        """
+        self.outputFile = utils.getTemporaryDirectory( ) + "/combined_exlude.ffn"
+        utils.logMessage( "ExcludeFileManager::buildOutputFileName( )", " exclude file: {0}".format( self.outputFile ) )
+    
+    def exportSequences( self ):
+        """
+        combine all exclude files into a single exclude file
+        """
+        
+        utils.logMessage( "ExcludeFileManager::exportSequences( )", "parsing exclude sequences")
+        
+        #read all exclude file sequences into memory
+        sequences = [ ]
+        for excludeFile in self.excludeFiles:
+            sequences.extend( fastaparser.parseFastaFile( excludeFile ) )
+        
+        utils.logMessage( "ExcludeFileManager::exportSequences( )", "finished parsing, writing to a common file"  )
+        
+        self.buildOutputFileName( )
+        #combine the sequences and write them to a file
+        
+        SeqIO.write( sequences, open( self.outputFile, "w" ), "fasta" )
+         
+        utils.logMessage( "ExcludeFileManager::exportSequences( )", "All sequences exported" )
+        
+        
+        
+        
+        
+    
+    
+        
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/build/lib/primertools/fastaparser.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/build/lib/primertools/fastaparser.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,63 @@
+'''
+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 utils
+import primersequence
+
+from Bio import SeqIO
+from Bio import Seq
+from Bio import Alphabet
+
+def parseFastaFileAsPrimerSequence( fileName ):
+    
+    utils.logMessage("fastaparser::parseFastaFileAsPrimerSequence( )", "parsing fasta file {0}".format( fileName ) )
+    returnValue = { }
+    
+    sequences = SeqIO.parse( open( fileName ), "fasta" )
+    
+    for sequence in sequences:
+        seqdata = primersequence.PrimerSequence( sequence.id, len( sequence ), sequence.seq )
+        returnValue[ sequence.id ] = seqdata
+    
+    utils.logMessage("fastaparser::parseFastaFileAsPrimerSequence( )", "read {0} sequences".format( len( returnValue.keys( ) ) ) )
+    
+    return returnValue
+    
+def parseFastaFile( fileName ):
+    '''
+    parse a fasta file and return a list of Bio.Seq
+    '''
+    utils.logMessage("fastaparser::parseFastaFile( )", "parsing fasta file {0}".format( fileName ) )
+    
+    sequences =  SeqIO.parse( open( fileName ), "fasta" )
+    
+    return sequences
+
+def writeFastaFile( sequences, fileName ):
+    '''
+    write a set of sequences to a fasta file.
+    returns the name of the new file
+    ''' 
+    
+    primerSequenceIdent = "primer_sequences"
+    utils.logMessage( "PrimerManager::writeFastaFile( )", "Writing {0} sequences to fasta file".format( len( sequences ) ) )
+    seqRecords = [ ]
+    i = 0
+    for sequence in sequences:
+        seqStr = str( reduce( lambda x, y: str( x )+str( y ), sequence) )
+        seqRecord = SeqIO.SeqRecord( Seq.Seq( seqStr, Alphabet.IUPAC.extended_dna ),  id="seq_{0}".format( i ) )
+        seqRecords.append( seqRecord )
+        i += 1
+
+    SeqIO.write( seqRecords, open( fileName, "w" ), "fasta" )
+        
+    utils.logMessage( "PrimerManager::writeFastaFile( )", "writing fasta file complete" )    
+    return fileName
+        
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/build/lib/primertools/includefilemanager.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/build/lib/primertools/includefilemanager.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,132 @@
+'''
+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 fastaparser
+import utils
+import os
+import programs
+import nucmerparser
+import copy
+
+class IncludeFileManager( object ):
+    """
+    A class to manage include files
+    """
+    #This class needs some work. Need to come up with a way to find unique sequences between all include files....
+
+    def __init__( self ):
+        """
+        Constructor
+        """
+        self.includeFiles = [ ]
+        self.nucmer = programs.Nucmer( )
+        self.isExcludeFileInitialized = False
+        self.isReferenceFileInitialized = False
+        self.referenceFile = None
+        self.referenceSequence = None
+        self.uniqueSequences = None
+          
+    def setExcludeFile( self, excludeFileName ):
+        """
+        A function to set the exclude file that will be used when nucmer is called
+        """
+        
+        utils.logMessage( "IncludeFileManager::setExcludeFile( )", "fileName {0}".format( excludeFileName ) )
+        self.excludeFileName = excludeFileName
+        self.isExcludeFileInitialized = True
+    
+  
+    def findUniqueSequencesInFile(self, doWantFile, doNotWantFile ):
+        utils.logMessage( "IncludeFileManager::findUniqueSequence( )", "running nucmer for reference file: {0}".format( doWantFile ) )
+        coordFile = self.nucmer.execute( [ doWantFile, doNotWantFile ] )
+        
+        matches = nucmerparser.parseCoordMatchFile( coordFile )
+        sequences = fastaparser.parseFastaFileAsPrimerSequence( doWantFile )
+        
+        for match in matches:
+            if sequences.has_key( match.seqID ):
+                primerData = sequences[ match.seqID ]
+                primerData.addMatch( match )
+            else:
+                print "Warning: id from .coords file not found in sequence data..."
+                utils.logMessage( "IncludeFileManager::processMatches( )", "WARNING - an ID was read in a Match that does not correspond to a sequence read from the fasta file!" )
+        
+        returnValue = [ ]
+    
+        for key in sequences.keys( ):
+            sequence = sequences[ key ]
+            subSequences = sequence.getNonMatchedSubSequences( )
+            returnValue.extend( subSequences )
+            
+        return returnValue
+        
+        
+    def findCommonSequencesInFile(self, want, alsoWant ):
+         utils.logMessage( "IncludeFileManager::findUniqueSequence( )", "running nucmer for reference file: {0}".format( want ) )
+         
+         print want, alsoWant
+         coordFile = self.nucmer.execute( [ want, alsoWant ] )
+         
+         matches = nucmerparser.parseCoordMatchFile( coordFile )
+         sequences = fastaparser.parseFastaFileAsPrimerSequence( want )
+         
+         for match in matches:
+             if sequences.has_key( match.seqID ):
+                 primerData = sequences[ match.seqID ]
+                 primerData.addMatch( match )
+         
+         returnValue = [ ]
+         for key in sequences:
+             sequence = sequences[ key ]
+             subSequences = sequence.getMatchedSubSequences( )
+             returnValue.extend( subSequences )
+             
+             
+         return returnValue
+         

+    def processIncludeFile( self, includeFileName ):
+        """
+        A function that adds and processes and include file.
+        An exclude file must be set for this function to be called.
+        """
+        
+        utils.logMessage( "IncludeFileManager::processIncludeFile( )", "processing {0}".format( includeFileName ) )
+        
+        if self.isExcludeFileInitialized == False:
+            utils.logMessage( "IncludeFileManager::processIncludeFile( )", "no exclude file set".format( includeFileName ) )
+            raise utils.ModuleNotInitializedException( "includefilemanager", "no exclude file set" )
+        
+        if self.isReferenceFileInitialized == False:
+            
+            utils.logMessage( "IncludeFileManager::processIncludeFile( )", "running nucmer for reference file: {0}".format( includeFileName ) )
+            self.uniqueSequences = self.findUniqueSequencesInFile( includeFileName, self.excludeFileName )
+            
+            self.referenceFile = includeFileName
+            self.isReferenceFileInitialized = True
+            
+        else:
+            #write the unique sequences to a temp file
+            tempSequences = utils.getTemporaryDirectory( ) + "/tempSequences.fasta"
+            fastaparser.writeFastaFile( self.uniqueSequences, tempSequences )
+            self.findCommonSequencesInFile( includeFileName, tempSequences )
+            self.includeFiles.append( includeFileName )
+            
+
+    def getUniqueSequences( self ):
+        """
+        getUniqueSequences - return a dictionary of all sequences that are found in include fasta files, but not the 
+        combined exclude fasta files. The dictionary is indexed by the file ID
+        """
+        
+        return self.uniqueSequences
+        
+        
+   
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/build/lib/primertools/nucmerparser.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/build/lib/primertools/nucmerparser.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,68 @@
+'''
+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 utils
+import os
+import re
+
+def parseCoordMatchLine( match ):
+      
+    match = match.replace( '\t', ' ' )
+    sections = match.split( '|', 4 )
+        
+    #parse the first section, containing the start and end
+    #locations of the match
+    firstsection = sections[ 0 ].strip( )
+    firstsectiontokens = re.split( ' +', firstsection )
+    start = int( firstsectiontokens[ 0 ].strip( ) )
+    end = int( firstsectiontokens[ 1 ].strip( ) )
+    
+    #parse the last section, containing the sequenceID
+    lastsection = sections[ -1 ].strip( )
+    lastsectiontokens = re.split( " +", lastsection )
+        
+    seqid = lastsectiontokens[ 0 ].strip( )
+    
+    return utils.Match( start, end, seqid )
+        
+def parseCoordMatchFile( coordFileName ):
+    '''
+    A method to parse the coord file.
+    returns a list of utils.match objects
+    '''
+    returnValue = [ ]
+    
+    #throw if the file doesn't exist
+    if os.path.exists( coordFileName ) == False:
+        raise utils.NoFileFoundException( coordFileName )
+    
+    
+    #read the nucmer file into memory
+    lines = open( coordFileName ).readlines( )
+    
+    #skip forward to the start of the matches. 
+    i = 0
+    while lines[ i ] [ 0] != '=':
+        i += 1
+    matchLines = lines[ i+1 : ]
+    
+    #parse each line for match start, end and sequenceID
+    for matchLine in matchLines:
+        returnValue.append( parseCoordMatchLine( matchLine ) )
+    
+    utils.logMessage( "NucmerParser::parseCoordMatchFile( )", "Parse {0}, finding {1} matches".format( coordFileName, len( returnValue ) ) )
+
+    return returnValue
+    
+        
+        
+        
+        
+        
+        
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/build/lib/primertools/primermanager.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/build/lib/primertools/primermanager.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,108 @@
+'''
+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 utils
+import tempfile
+import programs
+import eprimerparser
+import primersearchutils
+import fastaparser
+import exceptions
+
+
+
+
+class PrimerManager( object ):
+    '''
+    A class used to find primers given a set of sequences.
+    '''
+
+    def __init__( self, eprimerOptions ):
+        self.eprimer = programs.Eprimer( eprimerOptions )
+        self.primersearch = programs.PrimerSearch( )
+    
+                
+    def findPrimers( self, sequences, outputFile, primerpairs = 20, returnPrimers = False ):
+        '''
+        A method to find a set of primers based on the given sequences
+        '''
+        
+        utils.logMessage( "PrimerManager::findPrimer(s )", "writing sequences to a fasta file" )
+        
+        #eleminate all sequences that are lees than the desired amplification size...
+       
+        if len( sequences ) == 4 :
+            print sequences
+        sequences = filter( lambda x: len( x ) >= 200, sequences )
+        
+        primerFastaFile = utils.getTemporaryDirectory( ) + "/sequenceForEprimer.fasta"
+        fastaparser.writeFastaFile( sequences, primerFastaFile )
+
+        utils.logMessage( "PrimerManager::findPrimers( )", "executing eprimer3 program" )
+        self.eprimer.execute( [ primerFastaFile, outputFile ] )
+        utils.logMessage( "PrimerManager::findPrimer( )", "eprimer3 file {0} created. Parsing for primers.".format( outputFile ) )
+        
+        primers = eprimerparser.parsePrimerSequences( outputFile )
+        
+        utils.logMessage( "PrimerManager::findPrimers( )", "parsing for sequences complete" )
+        
+        if returnPrimers == True:
+            return primers
+        
+    
+    def getPrimers( self, sequences ):
+        
+        utils.logMessage( "PrimerManager::getCommonPrimers", "finding primers that are common to all include files" )
+            
+        if len( sequences ) == 0:
+            raise utils.NoPrimersExistException( )
+        
+        referenceEPrimerFile = utils.getTemporaryDirectory( ) + "/referenceprimers.ep3"
+        
+        #run eprimer to find primers in the reference file
+        primers = self.findPrimers( sequences, referenceEPrimerFile, 20, True )
+        
+        
+        if len( primers ) == 0:
+             raise utils.NoPrimersExistException( )
+        
+        return primers
+        
+    def crossValidatePrimers( self, primers, excludeFile ):             
+        
+        excludeSequences = fastaparser.parseFastaFile( excludeFile )
+        
+        #write a primer search input file with using the primers argument
+        primerInputFileName = utils.getTemporaryDirectory( ) + "/tmpinputprimers.ps"
+        primerOutputFileName = utils.getTemporaryDirectory( ) + "/tmpoutputprimers.ps"
+        primersearchutils.writePrimerSearchInputFile( primers, primerInputFileName )
+        
+        utils.logMessage( "PrimerManager::crossValidatePrimers", "finding primers that are not in the supplied exclude file" )
+        #run primer search to identify the primers
+        self.primersearch.execute( [ excludeFile, primerInputFileName, primerOutputFileName, "0" ] )
+        
+        #read the found primers from the file
+        commonPrimers = primersearchutils.parsePrimerSearchFile( primerOutputFileName )
+        
+        #compose a list of primers that are not found in the exclude file...
+        returnValue = [ ]
+        
+        for primer in primers:
+            if primer.id not in commonPrimers:
+                returnValue.append( primer )
+        
+        utils.logMessage( "PrimerManager::crossValidatePrimers", "{0} unique primers identified out of {1}".format( len( returnValue ), len( primers ) ) )
+        
+        if len( returnValue  ) == 0:
+            raise utils.NoPrimersExistException( )
+        
+        return returnValue
+    
+    
+    
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/build/lib/primertools/primersearchutils.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/build/lib/primertools/primersearchutils.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,55 @@
+'''
+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 utils
+
+def writePrimerSearchInputFile( primerSets, outputFile ):
+    '''
+    A function to write primer pairs to a file formatted as primer search input.
+    primerPairs - a list of utils.PrimerSet objects
+    outputFile - a string containing the path to the output file
+    '''
+    
+    file = open( outputFile, 'w' )
+    i = 0
+    for primerSet in primerSets:
+        i += 1
+        if primerSet.reversePrimer == "":
+            print "Error - primer {0} has no reverse primer. {1} primers total".format( i, len( primerSets ) )
+            continue
+        file.write( primerSet.id + "\t" + primerSet.forwardPrimer + "\t" + primerSet.reversePrimer + "\n" )
+        
+    file.close( )
+    
+def parsePrimerSearchFile( primerSearchFileName ):
+    '''
+    return a list of primer ids that are associated with at least one amplimer in the primer search output file.
+    '''
+    found = [ ]
+    
+    amplimerFound = False
+    currentId = -1;
+    for line in open( primerSearchFileName ).readlines( ):
+        
+        if "Primer name" in line:
+            #the id of the primer is found after the string "Primer name" in the file
+            currentId = line.split( ' ' )[ 2: ][ 0 ].strip( )
+        elif "Amplimer" in line and currentId not in found:
+            found.append( currentId )
+                
+    if amplimerFound == True:
+        found.append( currentId )   
+    
+    return found
+            
+            
+        
+        
+    
+    
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/build/lib/primertools/primersequence.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/build/lib/primertools/primersequence.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,110 @@
+'''
+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 utils
+
+class PrimerSequence( object ):
+    """
+    record sequence data, and store matched parts of the sequence 
+    """
+    
+    def __init__( self, seqID, seqLength, sequence ):
+        #an unmatched sub-sequence that starts at 0 goes until the end of the the sequence, to start out with.
+        
+        self.seqID = seqID
+        self.seqLength = seqLength
+        self.matchedSubSequences = [ ] 
+        self.sequence = sequence
+        
+    def addMatch( self, match ):
+        """
+        Input: a utils.Match object
+        Removes the matched sequence from the list of valid sequence data
+        """
+        
+        self.matchedSubSequences.append( ( match.start, match.end ) )
+    
+    def findNonMatchedIndices( self ):
+        
+        utils.logMessage("PrimerSequence::findValidIndices( )", "getting unmatched sequence indices" )
+
+        sequence = set( range( self.seqLength ) )
+        
+        #find the indices that are NOT excluded
+        utils.logMessage( "PrimerSequence::findValidIndices( )", "there are {0} excluded sequences for {1}".format( len( self.matchedSubSequences ), self.seqID ) )
+        for exclude in self.matchedSubSequences:
+            excludedSequence = set( range( exclude[ 0 ], exclude[ 1 ] )  )
+            utils.logMessage("PrimerSequence::findValidIndices( )", "removing exclude sequence {0} - {1}".format( exclude[ 0 ], exclude[ 1 ] ) )
+            sequence = sequence - excludedSequence
+
+        utils.logMessage("PrimerSequence::findValidIndices( )", "{0} unique indices".format( len( sequence ) ) )
+            
+        return list( sequence )
+    
+    def findNonMatchedIndexSequences( self, indices ):
+        
+        utils.logMessage("PrimerSequence::findValidIndexSequences( )", "getting sequences from unique indices" )
+        
+        sequences = [ ]
+        curSeq = [ ]
+        for index in indices:
+            if len( curSeq ) == 0:
+                curSeq.append( index )
+            elif index == curSeq[ -1 ] + 1:
+                curSeq.append( index )
+            else:
+                sequences.append( curSeq )
+                curSeq = [ ]
+        sequences.append( curSeq )        
+        utils.logMessage("PrimerSequence::findValidIndexSequences( )", "{0} sequences found".format( len( sequences ) ) )        
+        
+        return sequences
+    
+    
+    def getNonMatchedSubSequences( self, minLength = 100 ):
+        """
+        Get all valid sub sequences after removing matches
+        """        
+
+        utils.logMessage("PrimerSequence::getNonMatchedSubSequences( )", "finding valid sub sequences for {0}".format( self.seqID ) )
+
+        indices = self.findNonMatchedIndices( ) 
+        indexSequences = self.findNonMatchedIndexSequences( indices )
+        
+        subSequences = [ ]
+        
+        for indexSequence in indexSequences:
+            subSequence = [ self.sequence[ i ] for i in indexSequence ]
+            
+            if len( subSequence ) >= minLength:
+                subSequences.append( subSequence )
+        
+        return subSequences
+    
+    def getMatchedSubSequences( self, minLength = 100 ):
+        utils.logMessage("PrimerSequence::getMatchedSubSequences( )", "finding valid sub sequences for {0}".format( self.seqID ) )
+        
+        returnValue = [ ]
+        for match in self.matchedSubSequences:
+            subSequence = self.sequence[ match[ 0 ]:match[ 1 ] ]
+            
+            if len( subSequence ) >= minLength :
+                returnValue.append( subSequence )
+            
+        return returnValue
+            
+                
+         
+        
+        
+        
+        
+        
+        
+    
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/build/lib/primertools/programs.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/build/lib/primertools/programs.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,141 @@
+'''
+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 utils
+import os
+import subprocess
+
+
+class ProgramBase( object ):
+    
+    def __init__( self ):
+    
+        self.programName = None
+        self.proc = None
+    
+    def getProcessArgs( self, args ):
+        crash #abstract
+        
+    def execute( self, args, async = False ):
+        '''
+        run the nucmer program with a given compare file and an exclude file
+        '''
+        
+        utils.logMessage( "ProgramBase::Execute( )", "Running the {0} program.".format( self.programName ) )
+        
+        args, outputFile = self.getProcessArgs( args )
+        
+        print "*** Running {0} ***".format( self.programName )
+        
+        utils.logList( "ProgramBase::Execute( )", args )
+        
+        proc = subprocess.Popen( args )
+        
+        if async == False:
+            #wait for the nucmer instance to finish
+            proc.wait( )
+            print "*** Running {0} Complete ***".format( self.programName )
+        
+        #return the name of the coords file
+        return outputFile
+    
+    def isFinished( self ):
+        ifIsFinished 
+        
+class Nucmer( ProgramBase ):
+    
+    def __init__( self ):
+        #if we can't find the nucemer binary, throw
+        nucmerPath = utils.search_file( 'nucmer' )
+        ProgramBase.__init__( self )
+        if nucmerPath is None:
+            raise utils.ProgramNotFoundException( 'nucmer', "Please ensure that the MUMmer package is installed and configured on your system." )
+        
+        self.nucmer = nucmerPath
+
+        self.programName = "nucmer"
+        self.outputExtension = ".coords"
+        
+        
+    def getProcessArgs( self, inputArgs ):
+        
+        
+        time = utils.getTimeStamp( )
+        
+        identifier =  "nucmer_alignments"
+        args = [ self.nucmer, '-p', identifier, '-o', '--minmatch', '300', '--maxgap', '1' ]
+        
+        args.extend( inputArgs )
+    
+        outputFile = "{0}.coords".format( identifier )
+        
+        return args, outputFile
+
+class Eprimer( ProgramBase ):
+    
+    def __init__( self, eprimerOptions ):
+            
+        self.programName = "EPrimer3"
+        self.options = eprimerOptions
+        
+        primer3corePath = utils.search_file( "primer3_core" )
+        if primer3corePath is None:
+            raise utils.ProgramNotFoundException( "primer3_core", "Please ensure that the primer3 package is installed on your system. It can be obtained from http://primer3.sourceforge.net/" )
+        
+        eprimerPath = utils.search_file( "eprimer3" )
+        if eprimerPath is None:
+            raise utils.ProgramNotFoundException( 'eprimer3', "Please ensure that the EMBOSS package is installed and configured on your system." )
+        
+        self.primer3core = primer3corePath
+        self.eprimer3 = eprimerPath
+        
+    def getProcessArgs( self, inputArgs ):
+
+        #todo - allow user to determine output file location/name
+        
+        inputFasta = inputArgs[ 0 ]
+        outputFile = inputArgs[ 1 ]
+        args = [ self.eprimer3, inputFasta, outputFile, '-numreturn', '2', '-prange', self.options.getProductRange( ), '-osize', str( self.options.getPrimerSize( ) ),
+                '-minsize', str( self.options.getMinPrimerSize( ) ), '-maxsize', str( self.options.getMaxPrimerSize( ) )]
+        
+        return args, outputFile
+    
+class PrimerSearch( ProgramBase ):
+    def __init__( self ):    
+
+        self.programName = "PrimerSearch"
+        primerSearchPath = utils.search_file( "primersearch" )
+        if primerSearchPath is None:
+            raise utils.ProgramNotFoundException( "primersearch", "Please ensure that the EMBOSS package is installed on your system." )
+    
+        self.primerSearch = primerSearchPath
+        
+    def getProcessArgs( self, inputArgs ):
+        '''
+        usage for this program: inputArgs is an array length 4
+        inputArgs[0] = sequence file
+        inputArgs[1] = primer pairs file
+        inputArgs[2] = output file name
+        inputArgs[3] = percent mismatch
+        '''
+        
+        args = [ self.primerSearch ]
+        args.extend( [ '-seqall', inputArgs[ 0 ] ] ) 
+        args.extend( [ '-infile', inputArgs[ 1 ] ] )
+        args.extend( [ '-mismatchpercent', inputArgs[ 3 ] ] )
+        args.extend( [ '-outfile', inputArgs[ 2 ] ] ) 
+    
+    
+        return args, inputArgs[ 2 ]
+    
+    
+    
+    
+        
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/build/lib/primertools/utils.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/build/lib/primertools/utils.py Mon Jan 03 09:56:55 2022 +0000
b
@@ -0,0 +1,207 @@
+'''
+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 time
+import os.path
+from os import pathsep
+from string import split
+import tempfile
+import shutil
+
+def getTimeStamp( ):
+    return time.strftime('%d%m%Y-%H%M%S')
+
+
+class Match( object ):
+    '''
+    record where two genomes line up. stores only alignments for one part of the genome
+    '''
+    def __init__( self, start, end, seqID ):
+        self.seqID = seqID
+        self.start = start
+        self.end = end
+    
+    def __repr__( self ):
+        return "Start: {0}, End:{1}, SeqID:{2}".format( self.start, self.end, self.seqID )
+    
+class PrimerSet( object ):
+    
+    def __init__( self, id ):
+        self.id = id
+        self.productSize = 0
+        self.forwardPrimer = ""
+        self.forwardMeltTemp = ""
+        self.reversePrimer = ""
+        self.reverseMeltTemp = ""
+        
+        
+    def setProductSize( self, productSize):
+        self.productSize = productSize
+        
+    def setForwardPrimerData( self, sequence, temp ):
+        self.forwardPrimer = sequence
+        self.forwardMeltTemp = temp
+        
+    def setReversePrimerData( self, sequence, temp):
+        self.reversePrimer = sequence
+        self.reverseMeltTemp = temp
+    
+
+#search function from http://code.activestate.com/recipes/52224-find-a-file-given-a-search-path/
+def search_file( filename ):
+    """ find file
+    """
+    search_path = os.getenv( 'PATH' )
+    logMessage( "utils::search_file", "Path: {0}".format( search_path ) )
+    file_found = 0
+    paths = split( search_path, pathsep )
+    for path in paths:
+        if os.path.exists( os.path.join( path, filename ) ):
+            file_found = 1
+            break
+    if file_found:
+        return os.path.abspath( os.path.join( path, filename ) )
+    else:
+        return None
+
+tempDir = ""
+removeTemp = True
+
+verbose = False
+
+
+def initialize( isVerbose, cleanup, lf): ##Mau: added lf
+    global removeTemp
+    global tempDir
+    global verbose
+    global logFile ##Mau: added  logFile variable
+
+    logFile = lf #:Mau add line
+    
+    verbose = isVerbose
+    tempDir = tempfile.mkdtemp( dir="" )
+    initializeLogging()
+    removeTemp = cleanup
+    logMessage( "utils::Initialize( )", "Initialization complete. Temporary directory: {0}".format( tempDir ) )
+    
+logFile = None
+
+
+def printProgressMessage( message ):
+    global verbose
+    if verbose == True:
+        print message
+
+def getTemporaryDirectory( ):
+    global tempDir
+    return tempDir
+
+def initializeLogging():
+    global logFile
+    #logFileName = "uniqprimer_{0}.log".format( getTimeStamp( ) )
+    #logFileName = "log_uniqprimer.txt"  ##Mau: commented out 
+    logFileName = logFile ##Mau: changed
+    logFile = open( logFileName, 'w' )
+    
+def shutdown( ):
+    global removeTemp
+    global tempDir
+    shutdownLogging( )
+    if removeTemp == True:
+        print "*** Removing temporary directory ***"
+        shutil.rmtree( tempDir )
+    
+def shutdownLogging( ):
+    global logFile
+    if logFile != None:
+        logFile.close( )
+
+def logList( method, list ):
+    
+    message = reduce( lambda x,y: str( x ) + " " + str( y ) , list )
+    logMessage(method, message)
+    
+    
+def logMessage( method, message ):
+    global logFile
+    if logFile == None:
+        return
+    log = "{0} - {1}".format( method, message )
+    
+    logFile.write( log + "\n" )
+    logFile.flush( )
+
+class EPrimerOptions( object ):
+    
+    def __init__( self ):
+        
+        self.minPrimerSize = 18
+        self.maxPrimerSize = 27
+        self.primerSize = 20
+        self.productRange = "200-250"
+    
+    def setPrimerSize( self, size ):
+        
+        size = int( size )
+        if size > 35:
+            size = 35
+        
+        self.primerSize = size
+        if self.primerSize < self.minPrimerSize:
+            self.maxPrimerSize = self.primerSize 
+        elif self.primerSize > self.maxPrimerSize:
+            self.maxPrimerSize = self.primerSize
+    
+    def getPrimerSize( self ):
+        return self.primerSize
+    
+    def setMinPrimerSize( self, minSize):
+        self.minPrimerSize = minSize
+    
+    def getMinPrimerSize( self  ):
+        return self.minPrimerSize
+
+    def setMaxPrimerSize( self, size ):
+        self.maxPrimerSize = size
+        
+    def getMaxPrimerSize( self ):
+        return self.maxPrimerSize
+    
+    def setProductRange( self, range ):
+        self.productRange = range
+        
+    def getProductRange( self ):
+        return self.productRange
+
+class NoPrimersExistException( exceptions.BaseException ):
+    
+    def __init__( self ):
+        exceptions.BaseException( self )
+
+class ProgramNotFoundException( exceptions.BaseException ):
+    
+    def __init__( self, programName, details ):
+        exceptions.BaseException.__init__(self)
+        self.programName = programName
+        self.details = details
+        
+class NoFileFoundException( exceptions.BaseException ):
+    
+    def __init__( self, filename ):
+        exceptions.BaseException.__init__(self)
+        self.filename = filename
+        
+        
+class ModuleNotInitializedException( exceptions.BaseException ):
+    
+    def __init__( self, moduleName, reason ):
+        self.moduleName = moduleName
+        self.reason = reason
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/build/scripts-2.6/uniqprimer.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/build/scripts-2.6/uniqprimer.py Mon Jan 03 09:56:55 2022 +0000
[
b'@@ -0,0 +1,241 @@\n+#!/SATA/bioinfo/galaxy/galaxy_env/bin/python\n+\n+\'\'\'\n+Created on Jan 1, 2011\n+\n+@author: John L. Herndon\n+@contact: herndon@cs.colostate.edu\n+@organization: Colorado State University\n+@group: Computer Science Department, Asa Ben-Hur\'s laboratory \n+Mau added the -o primerOutfile -l logfile option\n+\'\'\'\n+\n+import exceptions\n+import sys\n+import time\n+\n+import getopt\n+from primertools import *\n+\n+version="0.5.0"\n+\n+\n+class UniqPrimerFinder( object ):\n+    \n+    def __init__( self, includeFiles, excludeFiles, crossValidate, eprimerOptions):\n+        \n+        utils.logMessage( "UniqPrimerFinder::__init__()", "Initializing UniqPrimerFinder" )\n+        self.includeFiles = includeFiles\n+        self.includeFileManager = includefilemanager.IncludeFileManager( )\n+        \n+        self.excludeFiles = excludeFiles\n+        self.excludeFileManager= excludefilemanager.ExcludeFileManager( )\n+        \n+        self.primerManager = primermanager.PrimerManager( eprimerOptions )\n+        \n+        self.crossValidate = crossValidate\n+\n+       \n+        utils.logMessage( "UniqPrimerFinder::__init__()", "Initializing UniqPrimerFinder - complete" )\n+    \n+    def writeOutputFile( self, primers, outputFileName, maxresults = 100 ):\n+        \'\'\'\n+        primers: a list of PrimerSet obs\n+        \'\'\'\n+        ##outputFileName = uPrimer ##Mau: defined this..\n+        outputFile = open( outputFileName, \'w\' )\n+        \n+        i = 0\n+        for primer in primers:\n+            i += 1\n+            \n+            outputFile.write( "{0}\\t{1}\\t{2}\\t{3}\\n".format( i, primer.forwardPrimer, primer.reversePrimer, primer.productSize ) )\n+            \n+            if i > maxresults:\n+                break\n+            \n+        utils.logMessage( "UniqPrimerFinder::writeOutputFile()", "output file written." )\n+            \n+    \n+    def findPrimers( self, outputFile = "uPrimer.txt" ):\n+\toutputFile = uPrimer ## Mau adds to overwrite the above value\n+\n+        utils.logMessage( "UniqPrimerFinder::findPrimers()", "Finding primers for include files" )\n+        startTime = time.time( )\n+        #generate the combined sequence fasta file for all exclude sequences\n+        utils.printProgressMessage( "*** Creating Combined Fasta File for Exclude Files ***" )\n+        for excludeFile in self.excludeFiles:\n+            self.excludeFileManager.addExcludeFile( excludeFile )\n+        \n+        self.excludeFileManager.exportSequences( )\n+        \n+        self.includeFileManager.setExcludeFile( self.excludeFileManager.getOutputFileName( ) )\n+\n+        utils.printProgressMessage( "*** Finding Sequences Unique to Target Genome ***" )\n+\n+        #run nucmer program on all include files\n+        for includeFile in self.includeFiles:\n+            self.includeFileManager.processIncludeFile( includeFile )\n+                \n+        #get the sequences found in include files, but no the exclude file. \n+        uniqueSequences = self.includeFileManager.getUniqueSequences( )\n+        \n+        utils.printProgressMessage( "*** Finding Primers ***" )\n+        \n+        primers = self.primerManager.getPrimers( uniqueSequences )\n+         \n+        if self.crossValidate == True:\n+            utils.printProgressMessage( "*** Cross Validating Primers ***" )\n+            primers = self.primerManager.crossValidatePrimers( primers, self.excludeFileManager.getOutputFileName( ) )\n+            \n+        \n+        utils.logMessage( "UniqPrimerFinder::findPrimers( )", "found {0} unique sequences".format( len( primers ) ) ) \n+        \n+        self.writeOutputFile( primers, outputFile )\n+        \n+        utils.logMessage( "UniqPrimerFinder::findPrimers()", "Finished finding primers" )\n+        endTime = time.time()\n+        elapsedMinutes = int( ( endTime - startTime ) / 60 )\n+        elapsedSeconds = int( ( endTime - startTime ) % 60 )\n+        print "*** Time Elapsed: {0} minutes, {1} seconds ***".format( elapsedMinutes, elapsedSeconds )\n+        print "*** Output Written to {0} ***'..b'    cleanup = True\n+    optlist, args = getopt.getopt( args, opts, longopts )\n+    \n+    includeFiles = [ ]\n+    excludeFiles = [ ]\n+    eprimerOptions = utils.EPrimerOptions( )\n+    \n+    verbose = False\n+    for opt in optlist:\n+        if opt[ 0 ] == \'-i\':\n+            includeFiles.append( opt[ 1 ] )\n+        elif opt[ 0 ] == \'-x\':\n+            excludeFiles.append( opt[ 1] )\n+        elif opt[ 0 ] == \'-v\':\n+            verbose = True \n+        elif opt[ 0 ] == \'-o\': ## Mau added, if -o...\n+            uPrimer = str(opt[1])  ## Mau added, then get filename for outfile after -o\n+        elif opt[ 0 ] == \'-l\': ## Mau added, if -l...\n+            lf = str(opt[1])  ## Mau added, then get filename for logfile after -l\n+        elif opt[ 0 ] == \'--productsizerange\':\n+            eprimerOptions.setProductRange( opt[ 1 ] )\n+            productsizerange = opt[ 1 ]\n+        elif opt[ 0 ] == \'--primersize\':\n+            eprimerOptions.setPrimerSize( opt[1 ] )\n+        elif opt[ 0 ] == \'--minprimersize\':\n+            eprimerOptions.setMinPrimerSize( opt[1 ] )\n+        elif opt[ 0 ] == \'--maxprimersize\':\n+            eprimerOptions.setMaxPrimerSize( opt[1 ] )\n+        elif opt[ 0 ] == \'--crossvalidate\':\n+            crossValidate = True\n+        elif opt[ 0 ] == \'--crossvalidate\':\n+            crossValidate = True\n+        elif opt[ 0 ] == \'--keeptempfiles\':\n+            cleanup = False\n+        elif opt[ 0 ] == \'-h\':\n+            printUsageAndQuit( )\n+        else:\n+            print "Unknown option: " + str( opt[ 0 ]  )\n+            printUsageAndQuit( )\n+    #print "uPrimer: " + uPrimer + " log file name: " + lf + "\\n"\n+    if len( includeFiles ) == 0 or len( excludeFiles ) == 0:\n+        \n+        print "You must specify at least one include file and at least one exclude file"\n+        printUsageAndQuit( )\n+\n+    return includeFiles, excludeFiles, crossValidate, cleanup, verbose, eprimerOptions, lf , uPrimer  #Mau: add lf, uPrime\n+\n+def main( args, debug = False):\n+    #parse the command line arguments for include and exclude files\n+    \n+    includeFiles, excludeFiles, crossValidate, cleanup, verbose, eprimerOptions, lf, uPrimer = parseArgs( args ) ##Mau add: lf\n+    \n+    utils.initialize( True, cleanup, lf)  ##Mau: add lf\n+\n+    #find primers for the include sequences\n+    \n+    try:\n+        utils.logMessage( "uniqprimer::Main( )", "Logging include files: " )\n+        utils.logList( "uniqprimer::Main( )", includeFiles )\n+        utils.logMessage( "uniqprimer::Main( )", "Logging exclude files: " ) \n+        utils.logList( "uniqprimer::Main( )", excludeFiles)\n+        print "*** Finding Primers ***"\n+        uniqPrimer = UniqPrimerFinder( includeFiles, excludeFiles, crossValidate, eprimerOptions) \n+        uniqPrimer.findPrimers( )\n+    except utils.NoFileFoundException as nfe:\n+        print "File not found: " + str( nfe.filename )\n+        printUsageAndQuit( )\n+    except utils.ProgramNotFoundException as pnfe:\n+        print str( pnfe.programName ) + ": program is not installed or is not in your path."\n+        print str( pnfe.details )\n+    except utils.NoPrimersExistException as npe:\n+        print "Failure: No unique primers exist for this combination"\n+    except exceptions.BaseException as e:\n+        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!"\n+        print "Details:"\n+        print e    \n+    \n+    utils.shutdown( )\n+\n+    print "*** Finished ***"\n+    \n+if __name__ == \'__main__\':\n+    \n+    #temp_args = "-i data/testdata/smallinclude.ffn -x data/testdata/smallexclude.ffn".split( )\n+    \n+    #temp_args = "-i data/XOO_MAI1_scaffolds.fas -x data/KACC.ffn".split( )\n+    if len( sys.argv ) == 1:\n+        printUsageAndQuit( )\n+    main( sys.argv[ 1: ], debug = True )\n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/data/PX099A.fa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/data/PX099A.fa Mon Jan 03 09:56:55 2022 +0000
b
b'@@ -0,0 +1,87336 @@\n+>CP000967\n+CGCCTTTCTGCGCGCCGCAGCCAGCAACAGATGATCATACTTTGATGGATGCTTGGCCCC\n+GCTGTCTGGAACGTCTCGAAGCTGAATTCCCGCCCGAAGATGTCCACACCTGGTTGAAAC\n+CCCTGCAAGCCGAAGACCGCGGCGACAGCATCGTGCTGTACGCCCCGAATGCCTTCATTG\n+TCGACCAGGTCCGCGAACGCTACCTGCCGCGCATCCGCGAGTTGCTGGCGTATTTTGCCG\n+GCAATGGCGAAGTGGCGCTGGCCGTGGGGTCGCGTCCACGTGCGCCCGAGCCGGCTCCGG\n+CACCCGTCGCGGCGACCATTGCGCCGCAGGCTGCGCCGATCGCGCCGTTCGCCGGCAACC\n+TGGATTCGCATTACACCTTCGCCAACTTCGTGGAAGGCCGCAGCAACCAGCTGGGTCTGG\n+CCGCCGCGATCCAGGCCGCGCAGAAGCCCGGCGACCGGGCGCACAACCCGTTGCTGTTGT\n+ACGGCAGCACCGGCCTGGGCAAGACCCACCTGATGTTCGCGGCGGGCAATGCACTGCGGC\n+AAGCCAAACCGGCTGCCAAGGTGATGTACCTGCGTTCGGAACAGTTCTTCAGCGCGATGA\n+TCCGGGCGCTGCAGGACAAGGCGATGGATCAGTTCAAGCGCCAGTTCCAGCAGATTGATG\n+CGTTGCTGATCGACGACATCCAGTTCTTCGCGGGCAAGGACCGTACGCAGGAAGAGTTCT\n+TCCACACCTTCAACGCGCTGTTCGATGGCCGCCAGCAGATCATCCTGACCTGCGACCGCT\n+ACCCGCGCGAAGTGGAGGGCCTGGAGCCGCGGTTGAAGTCGCGCTTGGCCTGGGGCTTGT\n+CGGTCGCGATCGATCCGCCGGATTTCGAAACCCGTGCAGCCATCGTGCTGGCCAAGGCAC\n+GCGAGCGTGGCGCCGAGATTCCCGACGACGTGGCATTTCTGATCGCCAAGAAGATGCGCT\n+CCAACGTGCGCGACCTGGAAGGCGCGCTCAACACGCTGGTGGCGCGCGCCAACTTCACCG\n+GGCGCTCGATCACGGTGGAATTCGCCCAGGAGACGCTGCGCGACCTGTTGCGCGCGCAGC\n+AACAGGCCATCGGCATCCCCAACATCCAGAAAACAGTAGCCGACTACTACGGCCTGCAGA\n+TGAAGGATTTGCTCTCCAAGCGCCGCACGCGTTCGCTGGCACGTCCGCGCCAGGTGGCGA\n+TGGCGCTGGCCAAGGAGCTCACCGAACACAGCCTGCCGGAAATCGGCGATGCCTTCGCCG\n+GCCGCGACCACACCACCGTGCTGCATGCCTGCCGGCAGATCCGCACGCTGATGGAGGCAG\n+ACGGCAAGCTGCGCGAGGACTGGGAAAAGCTGATTCGCAAGCTCAGCGAGTAGGCCTCGG\n+ACCCCAATCGTGTCCGCGCTGGAGAAAAGCGTGGAAACGTTGGGGTCAAATGCGGGAGAA\n+TCTGTGGATAACGTTGCGTGGCGGTTCGATGGAAAAACTATCCACAGGTTTTGCCACCAG\n+ATCAGGCACACTAGTCCCAAGCGTTTCAGGCGCTGAAATGTGTTTGGAAACAAACAGTTA\n+TGGCGGTTATCCGCTGAAAACGGCCCTACCATCACCACCAAGCTTTTGATTTATTCCATA\n+ATCTTTTAAAGCATAGGGGCACGGAACCACATGCGTTTTACACTGCAGCGCGAAGCCTTC\n+CTCAAACCGTTGGCCCAAGTGGTCAATGTGGTCGAACGCCGTCAAACCCTGCCTGTTCTG\n+GCCAACTTGCTGGTGCAGGTCAAGGACGGACAGGTCTCGTTGACCGGCACGGATCTGGAA\n+GTCGAAATGATCGCGCGCACGATGGCGGAGGACGTGCAAGACGGCGAAACCACCATTCCC\n+GCCCGCAAGCTATTCGACATCCTGCGCGCCCTGCCGGACGGCAGCCGGGTCACCATTTCG\n+CAGACCGGTGACAAGGTGACAGTTCAGGCCGGGCGTAGCCGTTTCACGCTGGCGACGCTG\n+CCTGCGAACGACTTCCCGTCCGTGGACGAAGTCGAGGCGACCGAGCGCGTGGTGGTGCCC\n+GAGGCCGGGCTCAAAGAGCTGATCGAACGCACGGCGTTTGCGATGGCACAGCAGGATGTT\n+CGCTACTACCTCAACGGCCTGCTGTTCGACCTGCGCGACGGTTTGCTGCGCTGCGTGGCC\n+ACCGACGGCCACCGTTTGGCGCTATGCGAGATGGAGCTTGAGAATGCTGGCGGCGCCAAG\n+CGTCAGATCATCGTGCCGCGTAAGGGCGTGACCGAGCTGCTGCGTTTGCTGGAAGGCGCA\n+GACCGTGAGGTCGAATTGGAAGTCGGCCGTAGCCATATCCGCGTCAAGCGTGGCGATGTA\n+ACCTTCACTTCCAAGCTGATCGACGGCCGCTTCCCGGACTACGAGGCAGTGATTCCGATT\n+GGCGCCGATCGCGAGGTCAAGGTTGATCGTGAGGCGCTGCGTGCGTCGCTTCAGCGCGCG\n+GCCATCCTGTCGAACGAAAAGTACCGTGGCGTGCGCGTGGAAGTATCGCCAGGCCAATTG\n+AAGATCAGTGCGCACAACCCAGAGCAAGAAGAAGCGCAGGAAGAGATTGAGGCCGACACC\n+AAGGTCGACGACCTGGCGATTGGCTTCAACGTCAACTATCTGCTCGATGCGTTGTCGGCA\n+TTGCGCGATGAGCACGTGGTCATCCAGCTGCGAGACGCGAATTCGTCCGCGCTGGTGCGC\n+GAGGCCAGCAGTGAGAAGTCCCGTCATGTGGTGATGCCGCTGCGTCTCTGACGCTTTGTT\n+CCACGTGGAACACGAGAAGCCCGGCGAACGCCGGGCTTTTTATTGGTTGTTGAACCGCTT\n+GCTGTGTCTGTTTGGGTAACCCTGCTAGCTGCGATCGCACAACGCGAGGAAGTCGGCGCG\n+CTGGGGGCAGCGGTTCTAGCTGAAGCGGCAAGCCCGTTGCTCAGGCGTTGGAACGGCATC\n+TTCAGCGCGATATTTCAGGTTACTCAGCGGCTGACGCCGCTGGTGTCGCTTTTGACCCAC\n+TGCGCCAGGCGGGCTCTCACACATATACCGACGGGGGCTCCGGATTGGCAGCCCCTTATC\n+CGATGACGGCAAGCCGAGTTTTTGGGAATCGACCTGCTGGATAGACCCCGCGCGCGACCG\n+GTGTCGTGGACGCGTTCTGCGCGGAACTCGGGGGGATCCTGAATACGTATCGGTTTATCG\n+GCGGGCCTGTGCAGGTCCCGACAGAGAGGTGAATCCAGAGGCTGACACCTGGGCCGACTC\n+AAGTTCCAAGTGCAACACTTTTCTCGACTGCAGACCCGCGTTTTCTGTCAAAACACTGGC\n+TCACGTAACTTTTGCACAATCAATGGCCTGCCGGGCTGTCCGTCCATACGTTGCGCTAAC\n+AGCAGGTCTCTCGAGGTGTTGCACTTGACTCTTGAGACCGCCCTGGTTTTAACGCACAGG\n+CAACCTCACCGGCTCACGCGTGGTCGGCTGAGATGGCGAGTTCATGCGGACCCTCTCGAA\n+CGACAAAGCGCTACTTCTTTCCTGAGCGCCTCGCTTTGGCATTTATGAGACCAAGTCACT\n+TTTGTTGATTCCGGTTGAATCATCACTTGAGCCCTGAAACTGAACGGTTTTAGTTGAAAG\n+GCAGAGCAAGACCAATTGCCATTACGCCTAGCTGAAAGGTTTGCAGACATCTGATTGGCT\n+TTTCTGAGCCTGTTTCCGACTTATGCACATCACGCGTTGCTTTTAAAACTACAAATACCT\n+TAAGAGCTTGGAGGTGATGGTAGGGGCAGATTTCACCGCAAAGTAGATCAGGTTGTTGTT\n+TTTAAAGTCATTTATGGCCTCGAAAGCCCGTGTTTATCGACCTATTTGTCAGCCTACAAG\n'..b'GTCGAGCACGCGTTGCACGATGGATTCCGGCACCGGGTCGGCCCAGTCCAGCGAG\n+TCGATATTCCACATGATGGACTTCAGGCCGGCCTCGCCCAGCAGCTGCAAGCCTTCCGCA\n+GTGCGCGCGCCATACGGAAACGGGAACAACGGCGCGCGCTTGTCGTCCACCGCACGCAGC\n+AAGGTGTCGGTATCCAGTACCTGGCTGCGCTGCGCTGCGCCGGTGGTTTTGGACAACTGC\n+GCGTGGGTCAGGCTGTGGTTTCCAACTGCATACCCCTCTTCCATCAGCGTGCGGCTGATC\n+TTGGACAGCGGCGCGAGTTTGGGTTTGCCGGCGGCATCCGGGCTACCCAGATTGCGCCCT\n+ACTTCGAAGAACACCCCGGGCACGTCGTAGCGTTTGAGGATCGCCACGATCTCTTCGGTA\n+TAGGCCTTGTGCGGACCATCGTCGAAGGTCAGCACCACTGTTTTGGGTGGCAGGTCGCGG\n+CCGAACACTTCGCTGTCGCTGTCGCGTGCCGAGAACGGATACGGCTCCACCACGCCATGG\n+TCACGCAGGATCTTCTCGCGCGTGTACAGCGTGCGCAGATGCGCCACGTAGTCGTCCCAC\n+TTCTCGCGCTTGGGCACGATGGCGCGGCTGCGGTCGAAGCGACTGAAGATCTGCGTCAGC\n+TCCTTGGTGTAGCTGCGCTCGATTTCGTCCAGCGCCTCCAGATCCTCGCCGATGCGCTGA\n+TGCAGTTTCACCGCTGGCAACGCAGAGTCGCGACCGATGCGCGCATGCAGATCGCGCAAT\n+ACCTCGCCAACGGCGAGGCGGTCGGCATCGGAGAGATCCGGCGCCGATTCCACCTCGTCC\n+AGCACCGCAGCAATCGTCGCGAACCGGTTCGCGTCCTTGGATGTCAGGACTGTTTCGAAC\n+GATGCAGCGATGCGTTCGCGCTGCTCGAGATTTTCATGGAACAGCTGCTGCCCCACGCTG\n+CTGGACATGGCGCGATCGCGTGGGGTCTGCTTGTCCTCATCGGCCAGCAGCACGATGATG\n+CGGCGGTGCCGGTCCAGCTGTTCGCGCAGTTGCGCGATCAATGCCTGCGCAGCGTCGGCG\n+CTCTTGTCGGCCTGCGTTCCTGCGGTCGTTGCAGCAGAGGATTTCGCGGCGGAGGCCGCA\n+TCGCTCGCGCCCTGCTTCCCACAGCCGGCCAGCGCCAGCACTCCCACGCAACTTGCGCAC\n+AGCAGCAGGCGATGCAACGGCGATGTGGTCACGACGGCGTCCTTGGCGAAAGAGACAACA\n+GATGCGGGCTGACATGCAGAAAGCCCGCCTTGCGGCGGGCCTTCTTCAACTTACTTGGCG\n+TTGGCCCGGATGATCTTGCTCGGCTTCTCGCCGTGCTGGCGGATCATCCACCACTGGATA\n+AGCAGATTCAAACCGCCGTTGACCACCCAGTACAGCACCAGACCGGACGGCACGAAGGCC\n+ATCATGGCGCCGAACACCAGCGGCATGAACTGCATCATCTTGGCCTGCATCGGATCGATG\n+CCCGGGGTCGGGGTCAACTTCTGCGTCGCCCACATGATCGCGATGTTGAGCGCCGGGAGG\n+ATGAAGTGCGGGTCGCGCGCGGTCAGGTCCTGGATCCAGCCCAGCCACGGCGCCTGACGC\n+AGTTCCACCGACTCCACCAGCACCCAGTACAGCGCGAAGAAGATCGGCATCTGGATCAGC\n+AGCGGCAGGCAGCCGCCCATCGGGTTGATCTTTTCCTTCTTGAACAGCTCCATCGTGGCC\n+TGCTGGTACTTGACGCGATCGTCGCCGTAGCGCTCCTTGAGTTGCGCCAGGCGCGGCTGG\n+AACTTGCGCATCTTGGCACTGGACTTGTACTGCGCAGACGACAGCGGATACAGCACCAAC\n+CGCAGCAACACCACCAGGCCGACGATCGCCCAGCCCCAGTTGTGCAGGAAGCTGTGCAGA\n+TGGCTCAGCACCCAGAACAGGCCCTGGCCGATGATGGCCATGATCGAGAAGCGGCTGTAA\n+TCGATCACGCGGTCCAGCCCCTTCACGTCTTCCTTGGCGATCAGACTGACCAGCTTCGGA\n+CCCACCCACAGGCGCGCTTCGGTGGTCGCGGTCTGGCCCGGCGCCACGGTGAAAGCCGGG\n+CCGCGCAACTCGGCCACGTCGCGTGGGCCGTCCTTGTTCAACACATACAGCGAGGCTTGG\n+TCGTTCTGCGGAATCCACGCGGTGAAGAAGTGGTGCTGCAACAGCGCTATCCAGCCGCCG\n+GTGATCTGGCGATTGAGGCCGCCGTCGTCCATGTAGTCCTTGAACGCACGACGCTCGTAG\n+CCTGCCTGCGGGCTGTACCAGGTCGCCCCGTTGAAGCTGAAGGAATCCGGATTGGTCATG\n+CCGCGGCTGAGGATGGTCGGCACCCGACTCAGCTTGCGGAACACATAACCGTTCCACGGC\n+GCGGCGCTCTTGTTGATCACTTCATCCTTGATCGAGATCGCATAGCGACCACGTTCCAGG\n+GTAAAGGTGCGACGGATCGACACGCCGTTGGGGCCATTCCACACGAACGGCACCACCAGC\n+GTGTTCTGGCCCTTGGCGAGTTCAAACGTCGTGCCAGGCTGTTCTGCGCGAAAGCCGCCG\n+ACGCCCGGCACCGGCGAATGCTCACTGGCCCAGCCACTGGTGGCGTTGTACGGGTGCGCC\n+GCGTCTTCCGTCAGCAGGCTGACCGGCGCGGTGCCGTCCTTGGTCTGCGGGAACTGCAGC\n+AGCTCGGCGTCGAGCACGCTGCGGCCATCCAGCTTCAGGCGCAGCACGTCCGAGGTCAGG\n+GTGACCACCGGTGCAGTGCCGGCAGCAGCCGGTGTCGCGGTGGTGGTGCTGGTTGCCGGA\n+ACCTTACCCGGCGCACCAGCCTGCGGAATCGCCTGAGCTGCGGGCACATTCGCCGCGCTT\n+GGCGTTGCCGCATCCAGATCACGTGCCGCCGGCACCGATTGCGTCGCAGCCGCCCCGGGC\n+GCATTGGCAGCCGCTTTTTCTTTGCCCCACTCCATCCACAGCAGCGCCGCGACCATCAGC\n+CAGGCAAAAATCAGGAAAACACGGGTCTGGTTCATCGGGCAGCAACTCGCTCAGTCGGAA\n+CTACAGGTCCGGCTCTGTCGGGGAAAGGGAGGATGGGTGCATCGTCCTGGCGCGCGGCAT\n+TGTGCCGGGCGCAGCAGGTAGGGGCAATGCACCGGCACGGCGCAACAGACGCAGGAAGGC\n+GTCGCGGATCTGCGGATTGGTCGCTTTTGCAGCTGCCGAGCGCGCCACGATGACGTAATC\n+GCCACCGGCCAACTCAGGCAAGAGATGTCGCATGGCATCGCGCAACACACGTTTGATGCG\n+GTTACGTCCGACCGCACGCGTATCGACCTTGCGCGACACCGCCATGCCCAGGCGCGGCGG\n+GGTATCGCCAGTGCGCCAGTGCAGGCTCAATAGCGGATCCGAGGTGCGGCGTGCGTTGTC\n+GAAAACGACCGTATATTGCGCACGCGTACGAACCCGCGCAGAGCGAGGAAATCGCCTGCA\n+CGGGTTCGATGCGTTCACGGTAAGGACTGCCTCGGCCGCAGGGAGCGGCGCGGCAATCAA\n+GCGCTCAGGCGCTTGCGGCCCTTGGCGCGGCGGCGAGCCAGGATCTTGCGGCCGTCGGCG\n+GTTGCCATACGTGCGCGGAAGCCATGGTCGCGTGCTCGCTTGAGGTTGCTGGGTTGGAAC\n+GTACGCTTGGTGGCCATGGGGCCCTCTGCATGAATGGAGACGAATAGAACCGGTAATTCT\n+ATAGGTCCGCTACAGCCCTGGTCAACAACCCGCGCGCATCGCCGCAGCTGACGCTGACCG\n+CCGCCTGTGGATGGACCTGTGAATAACTCTGGGAAAACCGTGTCCCCGGTGCTAGTCTGG\n+CCCATCCTCTTTTCACTACCGGGCTGCGTGCACGG\n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/data/X11-5Agenome.fasta
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/data/X11-5Agenome.fasta Mon Jan 03 09:56:55 2022 +0000
b
b'@@ -0,0 +1,72836 @@\n+>X11-5A\n+CTATCCGATCAATTGTTGACACGCCCTAGCTGCGATCGCACAACGCGAGGAAGGCGGCGC\n+GCTGGGGGCAGCTGTTCCAGCTGAAGCGGCACGCCTGTTGTTCAGGGGTTGGTAGGGCAT\n+CTTCAGCGCGATATTTCAGATCACTCAGCGGCTGACGCCGCTGGCGTCGTTTTTGACCAA\n+CTATGTGCCAGGCGGGCTCACACACACATAGCGACCGGGGCTCCGGATTGGCAGCCTCTT\n+ATCCGATGACGGCAAGCCGAGTTTTCGGGAATCGACGTGCTTGATAGACCCCGCGCGCGA\n+TCGGTGTCGTGGACGCGTTCTCAGCGGAACTCCGAGGGGATCTTGAATACGTATCGATGT\n+ATCGGCGGGCCTGTGCAGGTCCCGACAGGTAGGTGAATCCAGAGGCTGACACACTGGTTG\n+TAACGCACCGGCAACTTCACCGGCTCACGCGTGGTCGGCTGAGCTGGCGAGTTCATGCGG\n+ACGCCCTCGAACGACAAAGCACCGCTTTGTTCGTGAGCGCCTCGCTTTGACGTTCATGAG\n+ACCAGGTTACTTTTTCGATGAGTTTGAATCATCGCTTGAGTCCTGAAACTGAACGGTTTT\n+AGCTAAAAGTCAGAACAAGACAAATTGCCATCACGCCAAGCTGGAAGGTTGGCAGAGATC\n+TCATTGACTTTCCTGAGCCTGTTTTTGACTTATGCACATGACGGTTTGCTTTTAAAACTA\n+GAAATAAATTAAGAGTTTGGTGATGATGGTAGGCGCAGATTGCACCGAAAAGTTTATCAA\n+GTTATTGTTTTTCAAGCAATTTATGGCATTGAAAGCCTGTGTTTATCGGCCTATTTGCCA\n+GCCTACAGGCTGTGGATAAGGCGACATCGGGCGCAGAGCCTTGTTTTTATCCACACGTTA\n+TCCCCTGCCTGTCCTAGACCATCCGTTCGCACGTCTGCGCGGGTTTCATGCCGATCACGT\n+ATCCTTTGAGCCGACCGGCATGCCGGATTACACGCCAGAGCACACCGATCAATGCATGTA\n+GTGCGGTTGTCCATTCATCGGCTTCGTCGGTTCCAGACCGTCGCGCTACATCCGGCCAGT\n+GCATTGAATCTGCTCACCGGCGACAACGGTGCAGGCAAAACCAGCGTGCTCGAGGCGCTG\n+CACCTGATGGCATATGGCCGCAGCTTCCGTGGCCGCGTCCGTGACGGCCTGATCCAACAA\n+GGCGCGAACGACCTTGAAGTCTTCGTGGAATGGAAAGAGGGCGGCAGTGCTGCAGGCGAG\n+CGGACACGTCGCGCCGGCCTACGTCATAGCGGCCAGGAATGGACGGGGCGTCTGGATGGC\n+GAAGACGTTGCACAGTTGGGATCTTTGTGTTCCGCGTTGGCCGTGGTGACTTTCGAGCCC\n+GGCAGCCACGTGTTGATCAGCGGCGGTGGTGAACCCCGCCGTCGCTTCCTGGATTGGGGT\n+CTGTTCCACGTGGAACCCGGCTTCCTGTCCTTGTGGCGTCGCTACGTGCGCGCGCTCAAA\n+CAGCGCAATGCGCTGCTCAAACAAGGCGCGCAGCCGCGCATGCTGGATGCCTGGGATCAC\n+GAACTCGCCGAATCCGGGGAAACGCTGACATCCCGGCGCATGCGCTACCTGGAACGCCTG\n+CAGGACCGGCTGATTCCGGTGGCAGACGCGATCGCGCCGTCGCTTGGGCTGTCCGCGTTG\n+ACGTTCGCCCCAGGCTGGAAACGCCACGAGGTCTCGCTTGCCGATGCCCTTTTGTTAGCC\n+CGCGATCGCGACCGCCAGAACGGTTACACCTCGCAAGGCCCACACCGCGCGGATTGGATG\n+CCTCACTTCGACGTGCTTCCTGGCAAAGATGCACTCTCTCGCGGGCAAGCCAAGCTCACT\n+GCCCTCGCCTGCCTCCTTGCACAGGCGGAAGACTTTGCGTTCGAGCGAAGCGAATGGCCG\n+GTGATCGCGCTGGACGACCTGGGTTCGGAGCTGGACCGGCACCACCAGGCGCGCGTCCTG\n+CACCGGCTGGTCTCGGCGCCAGCGCAGGTGCTGATCACCGCGACCGAGATCCCGCCCGGG\n+CTCGCGGACGCCGGTGCGCTATTGCACCGGTTCCACGTGGAACACGGTCAGGTCGCACTG\n+CAAGCCCCCTCAGACTGAGTTCAACGGACCGGGTGGGCCGACTGGTATAATTTTCCCCGT\n+TATCCCCCTTTTCCCACGGTGCAAAGCGGCTGCGGCCGTCTTTGCCTGTGTTGTGGAGCC\n+AACGGCACGCGCATGACCGACGAACAAGACACCCCGCCAACACCCAACGGCACTTACGAC\n+TCCAGCAAGATCACCGTGCTGCGTGGCCTGGAAGCCGTCCGCAAGCGCCCCGGCATGTAC\n+ATCGGCGATGTCCATGACGGTACCGGCCTGCATCACATGGTGTTCGAGGTGGTCGACAAC\n+TCGGTCGACGAAGCCCTGGCCGGGCATGCCGACGACATCGTCGTGAAAATCCTGGTCGAT\n+GGCTCGGTGGCGGTGTCCGACAACGGACGCGGCGTGCCGGTCGACATTCACAAGGAAGAA\n+GGCGTGTCCGCGGCCGAGGTGATCCTCACCGTGCTGCATGCCGGCGGCAAGTTCGACGAC\n+AACAGCTACAAGGTCTCCGGCGGCCTGCATGGCGTGGGCGTGTCGGTGGTCAACGCGCTG\n+TCCGAGCACCTGTGGCTGGACATCTGGCGCGACGGTTTCCACTACCAGCAGGAATATGCG\n+CTGGGCGAGCCGCAGTACCCGCTCAAGCAGCTGGAAGCATCGACCAAGCGCGGCACCACG\n+CTGCGCTTCAAGCCGTCCGTGGCCATCTTCAGCGACGTCGAGTTCCACTACGACATCCTG\n+GCGCGGCGCCTGCGTGAGCTGTCGTTCCTCAATTCCGGCGTCAAGATCACCCTGATCGAC\n+GAGCGTGGCGAAGGCCGTCGCGACGATTTCCATTACGAAGGCGGCATCCGCAGCTTCGTG\n+GAGCATCTGGGGCAGCTGAAGTCGCCGCTGCACCCGAACGTGATCTCGGTGACCGGCGAG\n+CACAATGGCATTGTGGTGGACGTGGCCCTGCAATGGACCGACGCCTACCAGGAAACCATG\n+TACTGCTTCACCAACAACATCCCGCAGAAGGATGGCGGCACCCACCTGGCCGGCTTCCGC\n+GCCGCGCTGACGCGTGTGCTGAGCACCTACATCGAGCAGAACGGCATCGCCAAGCAGGCC\n+AAGGTTGCGCTGACCGGCGACGACATGCGCGAAGGCATGATCGCAGTGCTGTCGGTCAAA\n+GTGCCCGACCCCAGCTTCTCCTCGCAGACCAAGGAAAAGCTGGTCAGCTCGGACGTGCGC\n+CCGGCGGTGGAAAACGCCTTCGGTGCGCGCTTGCAGGAGTTCCTGCAAGAGAACCCGAAC\n+GAAGCCAAGGCCATCACCGGCAAGATCGTCGATGCCGCGCGTGCGCGCGAAGCCGCGCGC\n+AAGGCGCGCGACCTCACCCGCCGCAAGGGCGCGCTGGATATCGCCGGCCTGCCGGGCAAG\n+CTGGCCGACTGCCAGGAAAAAGACCCGGCGCTGTCCGAACTCTTCATTGTCGAGGGTGAC\n+TCGGCAGGTGGCTCGGCCAAGCAGGGACGCAACCGCAAGAATCAGGCGGTGCTGCCGTTG\n+CGCGGCAAGATCCTCAACGTGGAACGTGCGCGCTTCGACCGCATGCTGGCGTCGGACCAG\n+GTCGGCACGCTGATCACCGCACTGGGCACCGGCATCGGTCGCGACGAGTACAACCCGGAC\n+AAACTGCGTTACCACCGCATCATCCTGATGACCGACGCCGACGTCGACGGCTCGCACATC\n+CGTACCCTGCTGCTGACCTTCTTCTACCGGCAGATGCCGGAGCTGATCGAGCGCGGCTAC\n+A'..b'GCGGCCGGCACCGATTGCGTCGCAGCAGCCACGGGCGCATCGGCAGCCGCTTTTTCT\n+TTGCCCCACTCCATCCACAGCAGCGCCGCGACCATCAGCCAGGCAAAAATCAGGAAAACA\n+CGGGTCTGGTTCATCGGGCAGCAACTCGCTCAGTCGGAACTACAGTTCCGGCTCTGTCGG\n+GAAAGGGAGGATGGGTGCATGGTCCTGGCGGGCGGCATTGTGCCGGGCGCAGCAGGTAGG\n+GGCAATGCGCCGGCACGGCGCAGCAGACGCAGGAAGGCGTCGCGGATTTGCGGATTGGTC\n+GCTTTTGCAGCTGCCGAGCGCGCCACGATGACGTAATCGCCACCGGCCAACTCAGGCAAG\n+AGGTGTCGCATGGCATCGCGCAACACACGTTTGATGCGGTTACGTCCGACTGCACGCGTA\n+TCGACCTTGCGCGACACCGCCATGCCCAGGCGCGGCGGGGTATCGCCAGTGCGCCAGTGC\n+AGGCTCAATAGCGGATCCGAGGTGCGGCGTGCGTTGTCGAAAACAACCGTGTATTGCGCA\n+CGCGTACGAACCCGCGCAGAGCGAGGAAATCGCCTGCACGGGTTCGATGCGTTCACGGTA\n+AGGACTGCCTCGGCCGCAGGGAGCGGCGCGGCAATCAAGCGCTCAGGCGCTTGCGGCCCT\n+TGGCGCGGCGGCGAGCCAGGATCTTGCGGCCGTCGGCGGTTGCCATACGTGCGCGGAAGC\n+CATGGTCGCGTGCTCGCTTGAGGTTGCTGGGTTGGAACGTACGCTTGGTGGCCATGGGGC\n+CCTCTACATGAATGGAGACGAATATAACCGGTAATTCTATAGGCCTGCTACAGCCCGGGT\n+CAACAACCCGCGCGCATCGCCGCAGCTGACAATGACCGCCGCCTGTGGATGGACCTGTGA\n+ATAACTCTGGGAAAACCGTGTCCCCGGTGCTAGTCTGGCCCATCCTCTTTTCACTACCGG\n+GCTGCGTGCACGGCGCCTTTGTGCGCGCCGCAGCCAGCAACAGATGATCATACTTTGATG\n+GATGCTTGGCCCCGCTGTCTGGAACGTCTCGAAGCTGAATTCCCGCCCGAAGATGTCCAC\n+ACCTGGTTGAAACCCCTGCAAGCCGAAGACCGCGGCGACAGCATCGTGCTGTACGCCCCG\n+AATGCCTTCATCGTCGACCAGGTCCGCGAACGCTACCTGCCGCGCATCCGCGAGTTGCTG\n+GCGTATTTTGCCGGCAATGGCGAAGTGGCGCTGGCCGTGGGGTCGCGTCCACGCGCACCC\n+GAGCCGGCTCCGGCACCCGTCGCGGCGACCATTGCGCCGCAGGCTGCGCCGATCGCGCCG\n+TTCGCCGGCAACCTGGATTCGCATTACACCTTCGCCAACTTCGTGGAAGGCCGCAGCAAC\n+CAGCTGGGTCTGGCCGCCGCGATCCAGGCCGCGCAGAAGCCCGGCGACCGGGCGCACAAC\n+CCGTTGCTGTTGTACGGCAGCACCGGCCTGGGCAAGACCCACCTGATGTTCGCGGCGGGC\n+AATGCGCTGCGGCAAGCCAACCCGGCTGCCAAGGTGATGTACCTGCGTTCGGAACAGTTC\n+TTCAGCGCGATGATCCGGGCGCTGCAGGACAAGGCGATGGACCAGTTCAAACGCCAGTTC\n+CAGCAGATCGATGCGTTGCTGATCGACGATATCCAGTTCTTCGCCGGCAAGGACCGTACG\n+CAGGAAGAGTTCTTCCACACCTTCAACGCGCTGTTCGATGGCCGCCAGCAGATCATCCTG\n+ACCTGCGACCGCTACCCGCGCGAAGTGGAGGGCCTGGAGCCGCGGTTGAAGTCGCGCCTG\n+GCCTGGGGCTTGTCGGTCGCGATCGATCCGCCGGATTTCGAAACCCGTGCAGCCATCGTG\n+CTGGCCAAGGCACGCGAGCGTGGCGCCGAGATTCCCGACGACGTGGCATTCCTGATCGCC\n+AAGAAGATGCGCTCCAACGTGCGCGATCTGGAAGGCGCGCTCAACACGCTGGTGGCGCGC\n+GCCAACTTCACCGGGCGCTCGATCACGGTGGAATTCGCCCAGGAGACGCTGCGCGACCTG\n+TTGCGCGCGCAGCAACAGGCCATCGGCATCCCCAACATCCAGAAAACAGTGGCCGACTAC\n+TACGGCCTGCAGATGAAGGATTTGCTCTCCAAGCGCCGCACGCGTTCGCTGGCACGTCCG\n+CGCCAGGTGGCGATGGCGCTGGCCAAGGAGCTCACCGAACACAGCCTGCCGGAGATCGGC\n+GATGCCTTCGCCGGCCGCGACCACACCACCGTGCTGCATGCCTGCCGGCAGATCCGCACG\n+CTGATGGAGGCCGACGGCAAGCTGCGCGAGGACTGGGAAAAGCTGATTCGCAAGCTCAGC\n+GAGTAGGCCTCGGACCGCAATCGTGTCCGCGCTGGAGAAAAGCGTGGAAACGTTGGGGTC\n+AAATGCGGGAGAATCTGTGGATAACGTTGCGCTGCGGTTCGATGGAAAAACTATCCACAG\n+GTTTTCCCGCCAGATCAGGCGCACTAGTCCCAAGCGTTTCAGGCGCTGAAATGTATTTTG\n+AAACAAATAGTTATGGTGGTTATCCGCTGAAAACGGCCCTACCATCACCACCAAGCTTTT\n+GATTTATTCCATTATCTTTTAAAGCATAGGGGCACGGAACCACATGCGTTTTACACTGCA\n+GCGCGAAGCCTTCCTCAAACCGTTGGCCCAAGTTGTCAATGTGGTCGAACGCCGTCAAAC\n+CCTGCCTGTTCTGGCCAACTTGCTGGTGCAGGTCAAGGACGGACAGGTCTCTTTGACCGG\n+CACGGACCTGGAAGTCGAAATGATCTCGCGCACGATGGTGGAGGACGCGCAGGACGGCGA\n+AACCACCATTCCTGCCCGCAAGCTATTCGACATCCTGCGCGCACTGCCGGACGGCAGCCG\n+TGTCACCATTTCGCAGACCGGTGACAAGGTGACCGTTCAGGCCGGGCGTAGCCGTTTCAC\n+GCTGGCGACGCTGCCTGCGAACGACTTCCCGTCCGTGGACGAAGTCGAGGCGACCGAGCG\n+CGTGGTGGTGCCCGAGGCCGGGCTCAAAGAGCTGATCGAACGCACGGCGTTTGCGATGGC\n+GCAGCAGGATGTTCGCTACTACCTCAACGGCCTGCTGTTCGACCTGCGCGACGGTTTGCT\n+GCGTTGCGTGGCCACCGACGGCCACCGTTTGGCGCTATGCGAGATGGAGCTGCAGAATGC\n+TGGCGGCGCCAAGCGTCAGATCATCGTGCCGCGTAAGGGCGTGACCGAGCTGCAGCGTTT\n+GCTGGAAGGCGCAGACCGTGAGGTTGAATTGGAAGTCGGCCGTAGCCATATCCGCGTCAA\n+GCGTGGCGATGTGACCTTCACTTCCAAGCTGATCGACGGCCGCTTCCCGGACTACGAGGC\n+AGTGATTCCGATTGGCGCCGATCGCGAGGTCATGGTGGATCGTGAGGCGCTGCGTGCGTC\n+GCTGCAGCGTGCGGCCATCCTGTCGAACGAAAAGTACCGTGGCGTGCGCGTGGAAGTATC\n+GCCAGGCCAATTGAAGATCAGTGCGCACAACCCCGAGCAAGAAGAAGCCCAGGAAGAGAT\n+TGAGGCCGACACCAAGGTCGACGACCTGGCCATTGGCTTCAACGTCAACTATCTGCTAGA\n+CGCGTTGTCGGCATTGCGCGATGAGCACGTGGTCATCCAGCTGCGAGACGCGAATTCGTC\n+CGCGCTGGTGCGTGAGGCCAGCAGTGAGAAGTCCCGTCATGTGGTGATGCCACTGCGTCT\n+CTGACGCTTCGTTCCACGTGGAACACGAGAAGCCCGGCGAACGCCGGGCTTTTTATTGGT\n+TGTTGAACCCCTTGCTGTATCTGTTTGGGTAACCGCCCTAGGGCGTGTAATCAATTGAGC\n+AAGATCACACACTTAATTAATTAAGTGTGTG\n+\n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/data/XCCgenome.fasta
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/data/XCCgenome.fasta Mon Jan 03 09:56:55 2022 +0000
b
b'@@ -0,0 +1,72519 @@\n+>gi|21166373|gb|AE008922.1| Xanthomonas campestris pv. campestris str. ATCC 33913, complete genome\n+TTTTCTGCGCGCCGCAGCCAGCAACAGATGATCACACTTTGATGGATGCTTGGCCCCGCTGTCTGGAACG\n+TCTCGAAGCTGAATTCCCGCCCGAGGATGTCCACACCTGGTTGAAACCCCTGCAGGCCGAAGATCGCGGC\n+GACAGCATCGTGCTGTACGCGCCGAACGCCTTCATTGTTGAGCAGGTCCGCGAGCGATACCTGCCGCGCA\n+TCCGCGAGTTGCTGGCATATTTCGCCGGCAATGGCGAGGTGGCGCTGGCGGTCGGCTCCCGTCCGCGTGC\n+GCCGGAGCCGCTGCCGGCACCGCAAGCCGTCGCCAGTGCGCCGGCGGCCGCGCCGATCGTGCCCTTCGCC\n+GGCAACCTGGATTCGCATTACACCTTTGCCAACTTCGTGGAAGGCCGCAGCAACCAGCTCGGTCTGGCCG\n+CGGCGATCCAGGCCGCGCAGAAGCCGGGCGACCGTGCACACAACCCGTTACTGCTGTACGGCAGCACCGG\n+GCTGGGCAAGACCCACCTGATGTTCGCGGCCGGCAACGCGCTGCGCCAGGCCAATCCGGCGGCCAAGGTG\n+ATGTACCTGCGCTCGGAACAGTTCTTCAGCGCGATGATCCGCGCGTTGCAGGACAAGGCAATGGACCAGT\n+TCAAGCGCCAGTTCCAGCAGATCGATGCGCTGCTGATCGACGACATCCAGTTTTTTGCCGGCAAGGACCG\n+CACGCAGGAGGAGTTTTTCCACACCTTCAACGCGCTGTTCGACGGCCGCCAGCAGATCATCCTGACCTGC\n+GACCGCTATCCGCGCGAAGTCGAGGGCCTGGAGCCGCGGCTGAAGTCGCGCCTGGCCTGGGGCCTGTCGG\n+TGGCGATCGACCCGCCGGATTTCGAGACGCGTGCGGCGATCGTGCTGGCCAAGGCGCGCGAGCGCGGCGC\n+CGAGATTCCCGACGACGTGGCGTTTCTGATCGCCAAGAAGATGCGCTCGAACGTGCGCGACCTGGAAGGG\n+GCGCTCAACACGTTGGTGGCCCGCGCCAACTTCACTGGCCGCTCGATCACTGTGGAGTTTGCGCAGGAGA\n+CGCTGCGTGACCTGTTGCGTGCGCAGCAGCAGGCGATCGGCATTCCCAACATCCAGAAGACCGTGGCCGA\n+CTACTACGGCCTGCAGATGAAGGACCTGCTTTCCAAGCGCCGCACCCGCTCATTGGCGCGCCCGCGCCAG\n+GTGGCGATGGCGCTCGCCAAGGAGTTGACCGAGCACAGCCTGCCGGAGATTGGCGATGCGTTTGCCGGCC\n+GCGACCACACCACCGTGCTGCACGCCTGCCGGCAGATCCGCACGCTGATGGAGGCCGACGGCAAGCTGCG\n+CGAGGACTGGGAAAAGCTGATTCGCAAGCTCAGCGAGTGAGCGTTTGGCGCCCTTCTCGCCCGTCTTGGA\n+AAAAAGCGTGGATGAGTTGGGGCCAAATGCGGGAGAATCTGTGGATAAATGCGGCTGCAGCGTTGAGGCG\n+AAAACTATCCACAGGTTTTCCCACCGCTCCAGGGGCACTAGTCCATAGACTTTCAAGCTCAAAATAGTTC\n+TTGGAAACAATACGTTAGTGTGGTTGTCCGCCAAAAACGGCCCTACCATCACCACCAAGCTTTTGATTTA\n+TTCCACATCTTTAAAGCATAGGGGCACGGAACCACATGCGTTTCACACTGCAGCGCGAAGCCTTCCTCAA\n+GCCGTTGGCCCAGGTGGTCAATGTCGTCGAACGGCGTCAGACATTGCCGGTACTGGCGAACTTGCTGGTG\n+CAGGTGAACAACGGCCAGCTGTCGCTGACGGGGACCGACCTGGAAGTCGAAATGATCTCGCGCACCATGG\n+TCGAGGACGCCCAGGACGGCGAAACCACGATCCCGGCGCGCAAGCTGTTCGACATCCTGCGGGCCCTGCC\n+TGACGGCAGCCGCGTCACCGTCTCGCAGACCGGAGACAAGGTTACGGTGCAGGCCGGGCGCAGCCGCTTT\n+ACGCTCGCCACGCTACCGGCCAACGACTTCCCGTCGGTGGACGAAGTCGAGGCCACCGAGCGTGTGGCGG\n+TGCCGGAAGCCGGGCTGAAGGAGCTGATGGAGCGCACGGCGTTCGCGATGGCCCAGCAGGACGTGCGTTA\n+TTACCTCAACGGCCTGCTGTTCGACCTGCGCGATGGCCTGCTGCGCTGCGTGGCGACCGATGGTCACCGC\n+CTGGCGCTGTGCGAGACCGAGCTGGAAAAGTCCGGTAGCGCGAAGCGCCAGATCATCGTGCCGCGTAAGG\n+GCGTCACCGAGCTGCTGCGCCTGCTGGAGGCGGCTGATCGCGATGTCGAGCTGGAGCTGGGCCGTAGCCA\n+TATCCGGGTCAAGCGCGGCGATGTCACCTTCACCTCGAAGCTGATCGACGGCCGTTTTCCGGATTACGAG\n+GCGGTGATACCGATCGGCGCGGACCGTGAGGTCAAGGTGGACCGCGAGGCGCTGCGTGCGTCACTGCAGC\n+GTGCGGCGATTCTGTCGAACGAAAAGTACCGCGGCGTTCGCGTCGAAGTATCGCCGGGCCAGCTGAAGAT\n+CAGCGCGCACAACCCGGAGCAGGAAGAAGCGCAGGAAGAGATCGAGGCCGATACCAAGGTCGATGATCTG\n+GCCATCGGCTTCAACGTGAACTATCTGCTGGATGCGCTCTCTGCACTGCGCGACGAGCATGTGGTGATCC\n+AGCTGCGCGATGCCAATTCGTCGGCGCTGGTGCGTGAGGCGAGCAGCGAGAAGTCCCGCCACGTCGTGAT\n+GCCGTTGCGCCTCTGACGCTGCGTTCCACGTGGAACACGAAGGGGCCCGGCTTACGCCGGGCTTTTTTGT\n+GGGCCAAGGAACATTGAGACAGATGGCTCGCTGCCATCGACGTGCCTGCCGGCGTACTCGGGGTTTCTCA\n+AGCCAATGTGCCTTGGTTTGCGGTCTGAGATGTCGTGAACGACCGTTGCTGCGAAGTCATGCGGATTGGC\n+TGGGGCAGCGAGCTTCCGCGCACGCAGGATCGACTGATGACTGGTGTCCCGTGTCACGTGGCAATGGTGG\n+GATATCGCGGGCTTGCTCTTGGCTGGCTCTGAAGACGTAAGAGCCATCACGAGCAATCAGGGAAGCGATT\n+ATCTGCTCTCTTCCAATCATGGCTCGAAAGCACTCGTGGTCTCGTGGCTAGAACACGGCGGCTATCGGCA\n+CACGCTCTCTGCTTCGGGTCGGCCTGCTCCGTAGAAACCTGAGATCGTCACTTGGTGAGGGAACATCATA\n+AACACAGGGAACCAGGGTGCGAACAAGAGACTAGGTCTTCTGCAAAAGAGTTTCGTGCGATTAGAGCACG\n+GCTTCGGAAGGTACTTTTGAGTTATGCACAACGTTCAAAGCTTTTAAATCTAGATAAATCTTAAAGGCTG\n+GGTGGTGATGGTAGGGCCAGATTTCTCCGAAAAGTAGGTTAAGCATATGTTCTTAAACACTTTTGTGGCC\n+TTGAAACCCTGTGTCTAGACCCGCTCAAACGCCCTGATTACCTGTGGATAAGCGAAACGGCCGCCATGGG\n+CATTGAAACTGTCCACAACTTGTCCCCAGTTTGTCGCCGCGTGACGGAAACGTTTGCCGCAGCATGTCCA\n+CTGCCGATCACGTATGCTCCGCCCCGTCCGATGCCGGACTTCAAGGCCAAGCAGACCGATCGATGCATGT\n+AGCGCGGTTGTCCATCCATCGACTTCGTCGCTTCGAAGCAGTCGAGTTTCATCCAGCCAGCACGTTGAAT\n+CTATTGACCGGCGACAACGGTGCCGGCAAGACCAGCGTGCTTGAAGCCCTGCATGTCATGGC'..b'TGGTCGAGCACGCGCTGCACGATCGATTCCGGCACCGG\n+GTCGGCCCAGTCCATTGAATCGATGTTCCACATGATCGATTTCAGGCCCGCTTCGCCGAGCAATTGCAGC\n+CCTTCGGCATTGCGTGCGCCATATGGAAACCGAAACAGCGGCGCGCGCTTGTCGTCCACCGCACGCAACA\n+GCGTGTCGGTATCCAGCACCTGGCTGCGCAAGGCCGCACCGGTGGTCTTGGATAGCTGTGCATGGGTGAG\n+GCTGTGATTGCCCACCGCATAGCCTTCTTCCATCAGGCTGTGGCTGATCTTGGCCAGCGGCGCCAGGGTC\n+GGCTTGCCTTGCGCATCCAGGTTGCCCAGATTGCGCCCCACTTCGAAGAACACGCCGGGCACGTCGTAGC\n+GTTTGAGGATGGCCACGATCTCTTCGGTATAGGCCTTGTGCGGGCCATCGTCGAAGGTCAGCACCACGGT\n+CTTGGGCGGCAGGTCGCGGCCGAAGATCTCGCTCTCGCTGTCGCGCGCGGAGAACGGATACGGCTCCACC\n+ACGCCGTGGTCGCGCAGGATCTTTTCGCGCGTGTACAGCGTGCGCAGATGCGCCACGTAGTCGTCCCATT\n+TCTCGCGCTTGGGCGTGATGGCGCGGCTGCGATCGAAGCGGCTGAAGATCTGGGTCAGCTCGGTGTTGTA\n+GGTGCGCTCGATTTCATCCAGCGCCTCCAGGTCTTCGCCGATGCGCTGGTGCAGTTTCACCGCCGGCAAT\n+GCCGAATCGCGGCCAATACGCGCGTGCAAATCGCGCAGCACTTCGCGAAAGGCCAGACGATCGGCATCGT\n+AGAGATCGGGCGCCGACTCGACGTCGTCCAGCACCGTGGCAAGGGTGGCAAAGCGGGTGGACGCCTTGGA\n+GGCCAGCACGGTCTCGAATCGTGCAGCAATACGCTCGCGCTGCTCCAGGTTCTCATGGAACAACTGCTGG\n+CCCACGCTGCTGGAGGTGGCACGGTCGCGCGGCGATTGCGCGGCCTCATCGGCCAGCAACACGATGATGC\n+GGCGATGCCGGTCCAGCTGTTCGCGCAACTGCGCGATCAGGACGCGCGCATCTTCGGCAGCGGGATCGTT\n+TTGCGCGGCCGGCGTGGCGGATGCGGCCGGCTTGGCAGCCTCCTGCCCATCGCGCCCGTCCTGCGGTTTG\n+CCGCAGCCAGCCAGCAGCAACAGCCCCAGACAACTGGCGCACAGCAACAGGCGGTGCAGCGGCAAAGACA\n+TCACGAACGCATCCTTGGCAATGGTCAGCACGTGCGGTGGTGCACTGCGGGGGCACATGTACAAAGCCCG\n+CCTTGCGGCGGGCCTTGTTCCACTTACTTGGCGTTGGCCTGGATGATCTTGCTCGGCTTCTCGCCGTGCT\n+GGCGGATCATCCACCACTGGATCAGCAGACCCAGGCCACCGTTGACCACCCAGTACAGCACCAGGCCGGC\n+CGGCATGAAGGCCATCATGACGCCGAACACCAGCGGCATGAACTGCATCATCTTGGCCTGCATCGGGTCC\n+ATGCCCGGGGTCGGGGTCAGCTTCTGCGTCGCCCACATGATGGCGATGTTGAGCACCGGCAGGATGAAGT\n+ACGGATCGCGCGCGGTCAGGTCCTGGATCCAGCCCAGCCACGGCGCCTGGCGCAGTTCCACCGATTCCAC\n+CAACACCCAGTACAGCGCGAAGAAGATCGGCATCTGGATCAGCAGCGGCAGGCAGCCACCCATCGGGTTG\n+ATCTTTTCCTTCTTGAACAGCTCCATCGTCGCCTGCTGGTACTTCTGGCGGTCGTCGCCGTAGCGCTCCT\n+TCAACTGCGCCAGGCGCGGCTGGAAGCGGCGCATCTTGGCACCGGACTTGTACTGCGCGGCCGACAGCGG\n+ATACAGCGCCAGGCGCAACAGCACCACCAGGCCAATGATCGCCCAGCCCCAGTTGTGCAGGAAGCTGTGC\n+AGATGGCTCAGCACCCAGAACAGGCCCTGGCCGATGATGGCCATGATCGAGAAGCGGCTGTAGTCGACCA\n+CGCGGTCCAGGCCCTTCACGTCTTCCTTGGCGAGCAGGCTGACCAGCTTCGGGCCCACCCACAGGCGCGC\n+CTCGGTGCTGGCACTCTGGCCCGGTGCCACGGTGAAGGCTGGGCCACGCAGCTCGGCCACGTCACGCGGG\n+CCATCCTGCGCCAACACGTACAGCGAGGCCTGGTCCTTCTGCGGGATCCACGCGGTGAAGAAGTGATGCT\n+GCAGCAGGGCCACCCAGCCGCCGGTGATCTGGCGATTCAGGCCACCGTCGTCCATGTAGTCCTTGAACGC\n+CCGGCGCTCATACCCTTCCTGCGGGCTGTACCAGGTCGCGCCGTTGAAGCTGAAGGAATCCGGGTTGGTC\n+ATGCCGCGGCTGAGGATGGTCGGCACCCGGCTCAGCTTGCGGAACACATAGCCATTCCACGCCGCATCGC\n+TCTTGTTGATCACCTCATCCTTGATCGAGATCGCGTAGCTGCCGCGCTGCAAGGTGAAAATGCGGCGGAT\n+CGACACGCCATTGGGGCCGTTCCACACGAACGGCACTACCAGGGTGTTCTGGCCCTTGGCCAGCTCAAAC\n+GTGGTGCCCGGCTGCTCGGCACGGAAACCGCCCACGCCCGGCACCGGCGAGCGCTCGCTGGCCCAGCCGC\n+TGGTGGCGTTATACGGATGCGCGGCGTCTTCGGTCAGCAACTTGACCGGCTCGGTGCCGTCCTTGGTCTG\n+CGGGAACTGCAACAGCTCGGCGTCGAGCACGCTGCGGCCGTCCAGCTTCAGGCGCAGCACGTCCGAGGTC\n+AGGGTGATTGCCGGCGCGGCACCGGTAGTAGCCGGCGTGGCCGTGGTGGTGCTGGTCGCCGGCACCGCGG\n+CAGGGCTGCCGGCTTGCGGAATTGCCTGTGCCGACGGCACGTTCGCCGCGGGGGCCGCGGCGTCCGGATC\n+GCGCGCCGCCGGGACCGCCTGCGAGGCGATCGGCGTCGGCGCATTGGCGGCCGCCTTGTCCTTGCCCCAC\n+TCCATCCACAGCAGTGCCGCGACCATCAGCCAGGCAAAAATCAGGAAAACACGGGTCTGGTTCATCGGGC\n+AGCAACTCGCTCAGTCGGAACGGGGGTCCGGCTCTGTCGGGGAAAGGGAGGATGGGCGCGGTGCCCTGGC\n+GGGCGGCATTGTGCCGGGCGCGGCAGGCAGGGGCAATGCGCCGGCACGGCGCAGCAGACGCACGAAGGCG\n+TCGCGGATCTGTGGATTGGTCGCTTTGGCGGCCGCCGAACGGGCCACGATGACGTAGTCACCGCCGGCAA\n+GCTCCGGCAGCAGGTGGCGCATGGCATCGCGCAGGACCCGCTTGATTCGGTTGCGTCCCACCGCACGCGT\n+ATCGACCTTGCGCGATACCGCCATGCCCAGGCGCGGCGGCGTCTCGCCACTGCGCCAGTGCAGGCTCAGC\n+AACGGGTCCGAGGTGCGGCGCGCGGTATCGAAGACGACCGTATATTGCGCACGCGTACGAACCCGCGCAG\n+AGCGAGGAAATCGCCTGCACGGGTTCGATGCGTTCACTGAAGGGATTGCCTCGGCCGCAGGGAGCGGCGC\n+GGCAATCAAGCGCTCAGGCGCTTGCGGCCCTTGGCGCGGCGGCGAGCCAGGATCTTGCGGCCGTCGGCGG\n+TTGCCATACGTGCGCGGAAGCCATGGTCGCGTGCTCGCTTCAGGTTGCTGGGTTGGAAAGTACGCTTGGT\n+GGCCATGGGGCCCTCTGCATGGATGGAGACGAATAGAACCGGAAATTCTATAGGAGCTGTTGGGGCCGGG\n+TCAACTCCCTGCTGGCTTTACCGCAAGTGACGGTGTGCATGGCCTGTGGATGGACCTGTGAATAACCCTG\n+GGAAAACCCTGCCCCGGGTGCTAGTCTGGTCCATCCTCTTTTCATGACCGGGCTGCGAGCACGGCGCN\n+\n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/data/Xcampestris.fasta
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/data/Xcampestris.fasta Mon Jan 03 09:56:55 2022 +0000
b
b'@@ -0,0 +1,72519 @@\n+>gi|21229478|ref|NC_003902.1| Xanthomonas campestris pv. campestris str. ATCC 33913 chromosome, complete genome\n+TTTTCTGCGCGCCGCAGCCAGCAACAGATGATCACACTTTGATGGATGCTTGGCCCCGCTGTCTGGAACG\n+TCTCGAAGCTGAATTCCCGCCCGAGGATGTCCACACCTGGTTGAAACCCCTGCAGGCCGAAGATCGCGGC\n+GACAGCATCGTGCTGTACGCGCCGAACGCCTTCATTGTTGAGCAGGTCCGCGAGCGATACCTGCCGCGCA\n+TCCGCGAGTTGCTGGCATATTTCGCCGGCAATGGCGAGGTGGCGCTGGCGGTCGGCTCCCGTCCGCGTGC\n+GCCGGAGCCGCTGCCGGCACCGCAAGCCGTCGCCAGTGCGCCGGCGGCCGCGCCGATCGTGCCCTTCGCC\n+GGCAACCTGGATTCGCATTACACCTTTGCCAACTTCGTGGAAGGCCGCAGCAACCAGCTCGGTCTGGCCG\n+CGGCGATCCAGGCCGCGCAGAAGCCGGGCGACCGTGCACACAACCCGTTACTGCTGTACGGCAGCACCGG\n+GCTGGGCAAGACCCACCTGATGTTCGCGGCCGGCAACGCGCTGCGCCAGGCCAATCCGGCGGCCAAGGTG\n+ATGTACCTGCGCTCGGAACAGTTCTTCAGCGCGATGATCCGCGCGTTGCAGGACAAGGCAATGGACCAGT\n+TCAAGCGCCAGTTCCAGCAGATCGATGCGCTGCTGATCGACGACATCCAGTTTTTTGCCGGCAAGGACCG\n+CACGCAGGAGGAGTTTTTCCACACCTTCAACGCGCTGTTCGACGGCCGCCAGCAGATCATCCTGACCTGC\n+GACCGCTATCCGCGCGAAGTCGAGGGCCTGGAGCCGCGGCTGAAGTCGCGCCTGGCCTGGGGCCTGTCGG\n+TGGCGATCGACCCGCCGGATTTCGAGACGCGTGCGGCGATCGTGCTGGCCAAGGCGCGCGAGCGCGGCGC\n+CGAGATTCCCGACGACGTGGCGTTTCTGATCGCCAAGAAGATGCGCTCGAACGTGCGCGACCTGGAAGGG\n+GCGCTCAACACGTTGGTGGCCCGCGCCAACTTCACTGGCCGCTCGATCACTGTGGAGTTTGCGCAGGAGA\n+CGCTGCGTGACCTGTTGCGTGCGCAGCAGCAGGCGATCGGCATTCCCAACATCCAGAAGACCGTGGCCGA\n+CTACTACGGCCTGCAGATGAAGGACCTGCTTTCCAAGCGCCGCACCCGCTCATTGGCGCGCCCGCGCCAG\n+GTGGCGATGGCGCTCGCCAAGGAGTTGACCGAGCACAGCCTGCCGGAGATTGGCGATGCGTTTGCCGGCC\n+GCGACCACACCACCGTGCTGCACGCCTGCCGGCAGATCCGCACGCTGATGGAGGCCGACGGCAAGCTGCG\n+CGAGGACTGGGAAAAGCTGATTCGCAAGCTCAGCGAGTGAGCGTTTGGCGCCCTTCTCGCCCGTCTTGGA\n+AAAAAGCGTGGATGAGTTGGGGCCAAATGCGGGAGAATCTGTGGATAAATGCGGCTGCAGCGTTGAGGCG\n+AAAACTATCCACAGGTTTTCCCACCGCTCCAGGGGCACTAGTCCATAGACTTTCAAGCTCAAAATAGTTC\n+TTGGAAACAATACGTTAGTGTGGTTGTCCGCCAAAAACGGCCCTACCATCACCACCAAGCTTTTGATTTA\n+TTCCACATCTTTAAAGCATAGGGGCACGGAACCACATGCGTTTCACACTGCAGCGCGAAGCCTTCCTCAA\n+GCCGTTGGCCCAGGTGGTCAATGTCGTCGAACGGCGTCAGACATTGCCGGTACTGGCGAACTTGCTGGTG\n+CAGGTGAACAACGGCCAGCTGTCGCTGACGGGGACCGACCTGGAAGTCGAAATGATCTCGCGCACCATGG\n+TCGAGGACGCCCAGGACGGCGAAACCACGATCCCGGCGCGCAAGCTGTTCGACATCCTGCGGGCCCTGCC\n+TGACGGCAGCCGCGTCACCGTCTCGCAGACCGGAGACAAGGTTACGGTGCAGGCCGGGCGCAGCCGCTTT\n+ACGCTCGCCACGCTACCGGCCAACGACTTCCCGTCGGTGGACGAAGTCGAGGCCACCGAGCGTGTGGCGG\n+TGCCGGAAGCCGGGCTGAAGGAGCTGATGGAGCGCACGGCGTTCGCGATGGCCCAGCAGGACGTGCGTTA\n+TTACCTCAACGGCCTGCTGTTCGACCTGCGCGATGGCCTGCTGCGCTGCGTGGCGACCGATGGTCACCGC\n+CTGGCGCTGTGCGAGACCGAGCTGGAAAAGTCCGGTAGCGCGAAGCGCCAGATCATCGTGCCGCGTAAGG\n+GCGTCACCGAGCTGCTGCGCCTGCTGGAGGCGGCTGATCGCGATGTCGAGCTGGAGCTGGGCCGTAGCCA\n+TATCCGGGTCAAGCGCGGCGATGTCACCTTCACCTCGAAGCTGATCGACGGCCGTTTTCCGGATTACGAG\n+GCGGTGATACCGATCGGCGCGGACCGTGAGGTCAAGGTGGACCGCGAGGCGCTGCGTGCGTCACTGCAGC\n+GTGCGGCGATTCTGTCGAACGAAAAGTACCGCGGCGTTCGCGTCGAAGTATCGCCGGGCCAGCTGAAGAT\n+CAGCGCGCACAACCCGGAGCAGGAAGAAGCGCAGGAAGAGATCGAGGCCGATACCAAGGTCGATGATCTG\n+GCCATCGGCTTCAACGTGAACTATCTGCTGGATGCGCTCTCTGCACTGCGCGACGAGCATGTGGTGATCC\n+AGCTGCGCGATGCCAATTCGTCGGCGCTGGTGCGTGAGGCGAGCAGCGAGAAGTCCCGCCACGTCGTGAT\n+GCCGTTGCGCCTCTGACGCTGCGTTCCACGTGGAACACGAAGGGGCCCGGCTTACGCCGGGCTTTTTTGT\n+GGGCCAAGGAACATTGAGACAGATGGCTCGCTGCCATCGACGTGCCTGCCGGCGTACTCGGGGTTTCTCA\n+AGCCAATGTGCCTTGGTTTGCGGTCTGAGATGTCGTGAACGACCGTTGCTGCGAAGTCATGCGGATTGGC\n+TGGGGCAGCGAGCTTCCGCGCACGCAGGATCGACTGATGACTGGTGTCCCGTGTCACGTGGCAATGGTGG\n+GATATCGCGGGCTTGCTCTTGGCTGGCTCTGAAGACGTAAGAGCCATCACGAGCAATCAGGGAAGCGATT\n+ATCTGCTCTCTTCCAATCATGGCTCGAAAGCACTCGTGGTCTCGTGGCTAGAACACGGCGGCTATCGGCA\n+CACGCTCTCTGCTTCGGGTCGGCCTGCTCCGTAGAAACCTGAGATCGTCACTTGGTGAGGGAACATCATA\n+AACACAGGGAACCAGGGTGCGAACAAGAGACTAGGTCTTCTGCAAAAGAGTTTCGTGCGATTAGAGCACG\n+GCTTCGGAAGGTACTTTTGAGTTATGCACAACGTTCAAAGCTTTTAAATCTAGATAAATCTTAAAGGCTG\n+GGTGGTGATGGTAGGGCCAGATTTCTCCGAAAAGTAGGTTAAGCATATGTTCTTAAACACTTTTGTGGCC\n+TTGAAACCCTGTGTCTAGACCCGCTCAAACGCCCTGATTACCTGTGGATAAGCGAAACGGCCGCCATGGG\n+CATTGAAACTGTCCACAACTTGTCCCCAGTTTGTCGCCGCGTGACGGAAACGTTTGCCGCAGCATGTCCA\n+CTGCCGATCACGTATGCTCCGCCCCGTCCGATGCCGGACTTCAAGGCCAAGCAGACCGATCGATGCATGT\n+AGCGCGGTTGTCCATCCATCGACTTCGTCGCTTCGAAGCAGTCGAGTTTCATCCAGCCAGCACGTTGAAT\n+CTATTGACCGGCGACAACGGTGCCGGCAAGACCAGCGTGCTTGAAGCCC'..b'TGGTCGAGCACGCGCTGCACGATCGATTCCGGCACCGG\n+GTCGGCCCAGTCCATTGAATCGATGTTCCACATGATCGATTTCAGGCCCGCTTCGCCGAGCAATTGCAGC\n+CCTTCGGCATTGCGTGCGCCATATGGAAACCGAAACAGCGGCGCGCGCTTGTCGTCCACCGCACGCAACA\n+GCGTGTCGGTATCCAGCACCTGGCTGCGCAAGGCCGCACCGGTGGTCTTGGATAGCTGTGCATGGGTGAG\n+GCTGTGATTGCCCACCGCATAGCCTTCTTCCATCAGGCTGTGGCTGATCTTGGCCAGCGGCGCCAGGGTC\n+GGCTTGCCTTGCGCATCCAGGTTGCCCAGATTGCGCCCCACTTCGAAGAACACGCCGGGCACGTCGTAGC\n+GTTTGAGGATGGCCACGATCTCTTCGGTATAGGCCTTGTGCGGGCCATCGTCGAAGGTCAGCACCACGGT\n+CTTGGGCGGCAGGTCGCGGCCGAAGATCTCGCTCTCGCTGTCGCGCGCGGAGAACGGATACGGCTCCACC\n+ACGCCGTGGTCGCGCAGGATCTTTTCGCGCGTGTACAGCGTGCGCAGATGCGCCACGTAGTCGTCCCATT\n+TCTCGCGCTTGGGCGTGATGGCGCGGCTGCGATCGAAGCGGCTGAAGATCTGGGTCAGCTCGGTGTTGTA\n+GGTGCGCTCGATTTCATCCAGCGCCTCCAGGTCTTCGCCGATGCGCTGGTGCAGTTTCACCGCCGGCAAT\n+GCCGAATCGCGGCCAATACGCGCGTGCAAATCGCGCAGCACTTCGCGAAAGGCCAGACGATCGGCATCGT\n+AGAGATCGGGCGCCGACTCGACGTCGTCCAGCACCGTGGCAAGGGTGGCAAAGCGGGTGGACGCCTTGGA\n+GGCCAGCACGGTCTCGAATCGTGCAGCAATACGCTCGCGCTGCTCCAGGTTCTCATGGAACAACTGCTGG\n+CCCACGCTGCTGGAGGTGGCACGGTCGCGCGGCGATTGCGCGGCCTCATCGGCCAGCAACACGATGATGC\n+GGCGATGCCGGTCCAGCTGTTCGCGCAACTGCGCGATCAGGACGCGCGCATCTTCGGCAGCGGGATCGTT\n+TTGCGCGGCCGGCGTGGCGGATGCGGCCGGCTTGGCAGCCTCCTGCCCATCGCGCCCGTCCTGCGGTTTG\n+CCGCAGCCAGCCAGCAGCAACAGCCCCAGACAACTGGCGCACAGCAACAGGCGGTGCAGCGGCAAAGACA\n+TCACGAACGCATCCTTGGCAATGGTCAGCACGTGCGGTGGTGCACTGCGGGGGCACATGTACAAAGCCCG\n+CCTTGCGGCGGGCCTTGTTCCACTTACTTGGCGTTGGCCTGGATGATCTTGCTCGGCTTCTCGCCGTGCT\n+GGCGGATCATCCACCACTGGATCAGCAGACCCAGGCCACCGTTGACCACCCAGTACAGCACCAGGCCGGC\n+CGGCATGAAGGCCATCATGACGCCGAACACCAGCGGCATGAACTGCATCATCTTGGCCTGCATCGGGTCC\n+ATGCCCGGGGTCGGGGTCAGCTTCTGCGTCGCCCACATGATGGCGATGTTGAGCACCGGCAGGATGAAGT\n+ACGGATCGCGCGCGGTCAGGTCCTGGATCCAGCCCAGCCACGGCGCCTGGCGCAGTTCCACCGATTCCAC\n+CAACACCCAGTACAGCGCGAAGAAGATCGGCATCTGGATCAGCAGCGGCAGGCAGCCACCCATCGGGTTG\n+ATCTTTTCCTTCTTGAACAGCTCCATCGTCGCCTGCTGGTACTTCTGGCGGTCGTCGCCGTAGCGCTCCT\n+TCAACTGCGCCAGGCGCGGCTGGAAGCGGCGCATCTTGGCACCGGACTTGTACTGCGCGGCCGACAGCGG\n+ATACAGCGCCAGGCGCAACAGCACCACCAGGCCAATGATCGCCCAGCCCCAGTTGTGCAGGAAGCTGTGC\n+AGATGGCTCAGCACCCAGAACAGGCCCTGGCCGATGATGGCCATGATCGAGAAGCGGCTGTAGTCGACCA\n+CGCGGTCCAGGCCCTTCACGTCTTCCTTGGCGAGCAGGCTGACCAGCTTCGGGCCCACCCACAGGCGCGC\n+CTCGGTGCTGGCACTCTGGCCCGGTGCCACGGTGAAGGCTGGGCCACGCAGCTCGGCCACGTCACGCGGG\n+CCATCCTGCGCCAACACGTACAGCGAGGCCTGGTCCTTCTGCGGGATCCACGCGGTGAAGAAGTGATGCT\n+GCAGCAGGGCCACCCAGCCGCCGGTGATCTGGCGATTCAGGCCACCGTCGTCCATGTAGTCCTTGAACGC\n+CCGGCGCTCATACCCTTCCTGCGGGCTGTACCAGGTCGCGCCGTTGAAGCTGAAGGAATCCGGGTTGGTC\n+ATGCCGCGGCTGAGGATGGTCGGCACCCGGCTCAGCTTGCGGAACACATAGCCATTCCACGCCGCATCGC\n+TCTTGTTGATCACCTCATCCTTGATCGAGATCGCGTAGCTGCCGCGCTGCAAGGTGAAAATGCGGCGGAT\n+CGACACGCCATTGGGGCCGTTCCACACGAACGGCACTACCAGGGTGTTCTGGCCCTTGGCCAGCTCAAAC\n+GTGGTGCCCGGCTGCTCGGCACGGAAACCGCCCACGCCCGGCACCGGCGAGCGCTCGCTGGCCCAGCCGC\n+TGGTGGCGTTATACGGATGCGCGGCGTCTTCGGTCAGCAACTTGACCGGCTCGGTGCCGTCCTTGGTCTG\n+CGGGAACTGCAACAGCTCGGCGTCGAGCACGCTGCGGCCGTCCAGCTTCAGGCGCAGCACGTCCGAGGTC\n+AGGGTGATTGCCGGCGCGGCACCGGTAGTAGCCGGCGTGGCCGTGGTGGTGCTGGTCGCCGGCACCGCGG\n+CAGGGCTGCCGGCTTGCGGAATTGCCTGTGCCGACGGCACGTTCGCCGCGGGGGCCGCGGCGTCCGGATC\n+GCGCGCCGCCGGGACCGCCTGCGAGGCGATCGGCGTCGGCGCATTGGCGGCCGCCTTGTCCTTGCCCCAC\n+TCCATCCACAGCAGTGCCGCGACCATCAGCCAGGCAAAAATCAGGAAAACACGGGTCTGGTTCATCGGGC\n+AGCAACTCGCTCAGTCGGAACGGGGGTCCGGCTCTGTCGGGGAAAGGGAGGATGGGCGCGGTGCCCTGGC\n+GGGCGGCATTGTGCCGGGCGCGGCAGGCAGGGGCAATGCGCCGGCACGGCGCAGCAGACGCACGAAGGCG\n+TCGCGGATCTGTGGATTGGTCGCTTTGGCGGCCGCCGAACGGGCCACGATGACGTAGTCACCGCCGGCAA\n+GCTCCGGCAGCAGGTGGCGCATGGCATCGCGCAGGACCCGCTTGATTCGGTTGCGTCCCACCGCACGCGT\n+ATCGACCTTGCGCGATACCGCCATGCCCAGGCGCGGCGGCGTCTCGCCACTGCGCCAGTGCAGGCTCAGC\n+AACGGGTCCGAGGTGCGGCGCGCGGTATCGAAGACGACCGTATATTGCGCACGCGTACGAACCCGCGCAG\n+AGCGAGGAAATCGCCTGCACGGGTTCGATGCGTTCACTGAAGGGATTGCCTCGGCCGCAGGGAGCGGCGC\n+GGCAATCAAGCGCTCAGGCGCTTGCGGCCCTTGGCGCGGCGGCGAGCCAGGATCTTGCGGCCGTCGGCGG\n+TTGCCATACGTGCGCGGAAGCCATGGTCGCGTGCTCGCTTCAGGTTGCTGGGTTGGAAAGTACGCTTGGT\n+GGCCATGGGGCCCTCTGCATGGATGGAGACGAATAGAACCGGAAATTCTATAGGAGCTGTTGGGGCCGGG\n+TCAACTCCCTGCTGGCTTTACCGCAAGTGACGGTGTGCATGGCCTGTGGATGGACCTGTGAATAACCCTG\n+GGAAAACCCTGCCCCGGGTGCTAGTCTGGTCCATCCTCTTTTCATGACCGGGCTGCGAGCACGGCGCN\n+\n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/data/Xoc_BLS256.fasta
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/data/Xoc_BLS256.fasta Mon Jan 03 09:56:55 2022 +0000
b
b'@@ -0,0 +1,69027 @@\n+>gi|868566092|ref|NC_017267.2| Xanthomonas oryzae pv. oryzicola BLS256, complete genome\n+CCTTTCTGCGCGCCGCAGCCAGCAACAGATGATCATACTTTGATGGATGCTTGGCCCCGCTGTCTGGAAC\n+GTCTCGAAGCTGAATTCCCGCCCGAAGATGTCCACACCTGGTTGAAACCCCTGCAAGCCGAAGACCGCGG\n+CGACAGCATCGTGCTGTACGCCCCAAATGCCTTCATCGTCGACCAGGTCCGCGAACGCTACCTGCCGCGC\n+ATCCGCGAGTTGCTGGCGTATTTTGCCGGCAATGGCGAAGTGGCGCTGGCCGTGGGGTCGCGTCCACGTG\n+CGCCCGAGCCGGCTCCGGCACCCATCGCGGCGACCGTTGCGCCGCAGGCTGCGCCGATCGCGCCGTTCGC\n+CGGCAACCTGGATTCGCATTACACCTTCGCCAACTTCGTGGAAGGCCGCAGCAACCAGCTGGGTCTGGCC\n+GCCGCGATCCAGGCCGCGCAGAAGCCCGGCGACCGGGCGCACAACCCGTTGCTGTTGTACGGCAGCACCG\n+GCCTGGGCAAGACCCACCTGATGTTCGCGGCGGGCAATGCACTGCGGCAAGCCAAACCGGCTGCCAAGGT\n+GATGTACCTGCGTTCGGAACAGTTCTTCAGCGCGATGATCCGGGCGCTGCAGGACAAGGCGATGGATCAG\n+TTCAAGCGCCAGTTCCAGCAGATCGATGCGTTGCTGATCGATGACATTCAGTTCTTCGCCGGCAAGGACC\n+GGACGCAGGAAGAGTTCTTCCACACCTTCAACGCGCTGTTCGATGGCCGCCAGCAGATCATCCTGACCTG\n+CGACCGCTACCCGCGCGAAGTGGAGGGCCTGGAGCCGCGGTTGAAGTCGCGCCTGGCCTGGGGCTTGTCG\n+GTCGCGATCGATCCGCCGGATTTCGAAACCCGTGCAGCCATCGTGCTGGCCAAGGCACGCGAGCGTGGCG\n+CCGAGATTCCCGACGACGTGGCATTTCTGATCGCCAAGAAGATGCGCTCCAACGTGCGCGACCTGGAAGG\n+CGCGCTCAATACGCTGGTGGCGCGCGCCAACTTCACCGGGCGCTTGATCACGGTGGAATTCGCCCAGGAG\n+ACGCTGCGCGACCTGTTGCGCGCGCAGCAACAGGCCATCGGCATCCCCAACATCCAGAAAACAGTAGCCG\n+ACTACTACGGCCTGCAGATGAAGGATTTGCTCTCCAAGCGCCGCACGCGTTCGCTGGCACGTCCGCGCCA\n+GGTGGCGATGGCGCTGGCCAAGGAGCTTACCGAACACAGCCTGCCGGAAATCGGCGATGCCTTCGCCGGC\n+CGCGACCACACCACCGTGCTGCATGCCTGCCGGCAGATCCGGACGCTGATGGAGGCCGACGGCAAGCTGC\n+GCGAGGATTGGGAAAAGCTGATTCGCAAGCTCAGCGAGTAGGCTTCGGACCCCAATCGTGTCCGCGCTGG\n+AGAAAAGCGTGGAAACGTTGGGGTCAAATGCGGGAGAATCTGTGGATAACGTTGCGTCGCGGTTCGATGG\n+AAAAACTATCCACAGGTTTTGCCACCAGATCAGGCACACTAGTCCAAAGCGTTTCAGGCGCTGAAATGTC\n+TTTGGAAACAAGTAGTTATGGCGGTTATCCGCTGAAAACGGCCCTACCATCACCACCAAGCTTTTGATTT\n+ATTCCATTATCTTTTAAAGCATAGGGGCACGGAACCACATGCGTTTTACACTGCAGCGCGAAGCCTTCCT\n+CAAACCGTTGGCCCAAGTGGTCAATGTGGTCGAACGCCGTCAAACCCTGCCTGTTCTGGCCAACTTGCTG\n+GTGCAGGTCAAGGACGGACAGGTCTCTTTGACCGGCACAGATCTGGAAGTCGAAATGATCTCGCGCACGA\n+TGGTGGAGGACGCGCAGGACGGCGAAACCACCATTCCTGCCCGCAAGCTATTCGACATCCTGCGCGCCCT\n+GCCGGACGGCAGCCGGGTCACCATTTCGCAGACCGGTGACAAGGTGACCGTTCAGGCCGGGCGTAGCCGT\n+TTCACGCTGGTGACGCTGCCGTCGAACGACTTCCCGTCCGTGGACGAAGTCGAGGCGACCGAGCGCGTGG\n+TGGTGCCCGAGGCCGGGCTCAAAGAGCTGATCGAACGCACGGCGTTTGCGATGGCGCAGCAGGATGTTCG\n+CTACTACCTCAACGGCCTGCTGTTCGACCTGCGCGACGGTTTGTTGCGCTGCGTGGCCACCGACGGCCAC\n+CGTTTGGCGCTATGCGAGATGGAGCTGGAGAATGCTGGCGGCGCCAAGCGTCAGATCATCGTGCCGCGTA\n+AGGGCGTGACCGAGCTGCAGCGTTTGCTGGAAGGCGCAGACCGTGAGGTCGAATTGGAAGTCGGCCGTAG\n+CCATATCCGCGTCAAGCGTGGCGATGTGACCTTTACGTCCAAGCTGATCGACGGCCGCTTCCCGGACTAC\n+GAGGCAGTGATGCCGATTGGCGCCGATCGCGAGGTCAAGGTGGATCGTGAGGCGCTGCGTGCGTCGCTGC\n+AGCGTGCGGCCATCCTGTCGAACGAAAAGTACCGTGGCGTGCGCGTGGAAGTATCGCCAGGCCAATTGAA\n+GATCAGTGCGCACAACCCCGAGCAAGAAGAAGCGCAGGAAGAGATTGAGGCCGACACCAAGGTCGACGAT\n+CTGGCCATTGGCTTCAACGTCAACTATTTGCTCGACGCGTTGTCGGCATTGCGCGATGAGCACGTGGTCA\n+TCCAGCTGCGAGACGCGAATTCGTCCGCGCTGGTGCGCGAGGCCAGTAGTGAGAAGTCACGTCATGTGGT\n+GATGCCGCTGCGTCTCTGACGCTTCGTTCCACGTGGAACACGAGAAGCCCGGCGAACGCCGGGCTTTTTA\n+TTGGTTGTTGAACCTCTTGTTGTGTCTGTTTGGGTAACCCTGCTGGCTGCGATCGCACAACGCGAGGAAG\n+GCGACGCGCTGGGGGCAGCGGTTCTAGCTGAAGCGGCAAGCTCGTTGCTCAGGCGTTGGAACGGCATCTT\n+CAGCGCGCTATGTCAGGTTACTCAGCGGCTGACGCCGCTTGCGTCGCTTTTGACCCACTGCGCCAGGCGG\n+TCTCTCACACGTATACCGACAGGGGCTCCGGATTGACAGCCTCTTATCCGACGACGGCAAGCCGAGTTTT\n+TGGGAATCGACGTGCTGGATAGACCCCGCGCGCGACCGGTATCGTGGACGCCTTCTGCGCGGAACGCGGG\n+GGTCCTGAATACGCATCGGTGTATCGACGGGTCTGTGCAGGTCCCGACAGGTAGGTGAATCCAGAGGCTG\n+ACACACCGGTTTTAACGCACCGGCGACCTCACCGGCTCACGCGTGGTCGGCTGAGATGGCGAGTTCATGC\n+GGACGCTCTCGAACGCCAAAGCCCCGCTTTGTTCCTGAGTGCTTCGCTTTAACATTTATGAGACCAAGTC\n+ACTTTTATTGATGCCGGTTGAATCATCGCTTGCGCCCTGAAACTGAACGGTTTTAGTTGAAAGACAGAGC\n+GACACACATTGCCATCACGCCTGGCTGAAAGGTTTGCAGATATCTGATTGGCTTTCCTGAGCCTGTTTTC\n+GACTTATGCACATCGCGCGTTGCTTTTTAAAACTAGAAATAATGTAAGAGCTTGGTGGTGATGGTAGGGG\n+CAGATTTCACCGCAAAGTAGATCAGGTTGTTGTTTTTAAAGTCATTTATGGCCTCGAAAGCCTGTGTTTA\n+TCGGCCTATTTGTCAGCCTACAAGCTGTGGGTAAGGTGATATCGGGCGCAGAGCCTTGGTTTTATCCACA\n+CGTTATCCCCTGCCTGTCCAAGAGCATCCGTTCGCACGTCTGCGCGGGTTCCATGCCGATCACGTATCCT\n+T'..b'GCCTTGTTCACTTGGTCGAGCACGCGTTGCACGATGGATT\n+CCGGCACCGGGTCGGCCCAGTCCAGCGAGTCGATATTCCACATGATGGACTTCAGGCCGGCCTCGCCCAG\n+CAGCTGCAAGCCTTCCGCAGTGCGCGCGCCATACGGAGACCGGAACAACGGCGCGCGCTTGTCGTCCACC\n+GCACGCAGCAAGGTGTCGGTATCCAGTACCTGGCTGCGCTGCGCTGCGCCGGTGGTTTTGGACAACTGCG\n+CGTGGGTCAGGCTGTGGTTTCCAACGGCATACCCCTCTTCCATCAGCGTGCGGCTGATCTTGGACAGCGG\n+CGCGAGTTTGGGTTTGCCGGCGGCATCCAGGCTACCCAGATTGCGCCCTACTTCGAAGAACACCCCGGGC\n+ACGTCGTCGCGTTTGAGGATCGCCACGATCTCTTCGGTAAAGGCCTTGTGCGGACCATCGTCGAAGGTCA\n+GCACCACTGTTTTGGGTGGCAGGTCGCGGCCGAACACTTCGCTGTCGCTGTCGCGTGCCGAGAACGGATA\n+CGGCTCCACCACGCCATGGTCACGCAGGATCTTCTCGCGCGTGTACAGCGTGCGCAGATGCGCCACGTAG\n+TCGTCCCACTTCTCGCGCTTGGGCACGATGGCGCGGCTGCGGTCGAAGCGACTGAAGATCTGCGTCAGCT\n+CCTTGGTGTAGCTGCGCTCGATTTCGTCCAGCGCCTCCAGATCCCCGCCGATGCGCTGATGCAGTTTCAC\n+CGCTGGCAACGCAGAGTCGCGACCGATGCGCGCATGCAGATCGCGCAATACCTCGCCAAAGGCGAGGCGG\n+TCGGCATCGGAGAGATCCGGCGCCGATTCCACCTCGTCCAGCACCGCAGCAATCGTCGCAAACCGGTTCG\n+CGTGCTTGGATGTCAGCACTGTTTCGAACGATGCAGCGATGCGTTCGCGCTGCTCGAGATTTTCATGGAA\n+CAGCTGCTGCCCCACGCTGCTGGACGTGGCGCGATCGCGTGGGGTCTGCTTGTCCTCATCGGCCAGCAGC\n+ACGATGATGCGGCGGTGCCGGTCCAGCTGTTCGCGCAGTTGCGCGATCAATGCCTGCGCGGCGTCGGCGC\n+TCTTGTCGGCCTGCGTTCCTGCGGTCGTTGCAGCAGAGGATTTCGCGGCGGAGGCCGCATCGCTCGCGCC\n+CTGCTTCCCACAGCCGGCCAGCGCCAGCACTCCCACGCAACTTGCGCACAGCAGCAGGCGATGCAACGGC\n+GATGTGGTCACGACGGCGTCCTTGGCGAAAGAGACAACAGATGCGGGCTGACATGCAGAAAGCCCGCCTT\n+GCGGCGGGCCTTCTTCAACTTACTTGGCGTTGGCCCGGATGATCTTGCTCGGCTTCTCGCCGTGCTGGCG\n+GATCATCCACCACTGGATAAGCAGATTCAAACCGCCGTTGACCACCCAGTACAGCACCAGACCGGACGGC\n+ACGAAGGCCATCATGGCGCCGAACACCAGCGGCATGAACTGCATCATCTTGGCCTGCATCGGGTCTATGC\n+CCGGGGTCGGGGTCAGCTTCTGCGTCGCCCACATGATCGCGATGTTGAGCGCCGGGAGGATGAAGTGCGG\n+GTCGCGCGCGGTCAGGTCCTGGATCCAGCCCAGCCACGGCGCCTGACGCAGTTCCACCGACTCCACCAGC\n+ACCCAGTACAGCGCGAAGAAGATCGGCATCTGGATCAGCAGCGGCAGGCAGCCGCCCATCGGGTTGATCT\n+TTTCCTTCTTGAACAGCTCCATCGTGGCCTGCTGGTACTTGACGCGATCGTCGCCGTAGCGCTCCTTGAG\n+TTGCGCCAGGCGCGGCTGGAACTTGCGCATCTTGGCACTGGACTTGTACTGCGCAGACGACAGCGGATAC\n+AGCACCAACCGCAGCAACACCACCAGGCCGACGATCGCCCAGCCCCAGTTGTGCAGGAAGCTGTGCAGAT\n+GGCTCAGCACCCAGAACAGGCCCTGGCCGATGATGGCCATGATCGAGAAGCGGCTGTAATCGATCACGCG\n+GTCCAGCCCCTTCACGTCTTCCTTGGCGATCAGGCTGACCAGCTTCGGACCCACCCACAGGCGCGCTTCG\n+GTGGTCGCGGTCTGGCCCGGCGCCACGGTGAAAGCCGGGCCGCGCAACTCGGCCACGTCGCGTGGGCCGT\n+CCTTGTTCAACACATACAGCGAGGCCTGGTCGTTCTGCGGAATCCACGCGGTGAAGAAGTGGTGCTGCAA\n+CAGCGCTATCCAACCGCCGGTGATCTGGCGATTGAGGCCGCCGTCGTCCATGTAGTCCTTGAACGCACGA\n+CGCTCGTAGCCTGCCTGCGGGCTGTACCAGGTCGCCCCGTTGAAGCTGAAGGAATCCGGATTGGTCATGC\n+CGCGGCTGAGGATGGTCGGCACCCGGCTCAGCTTGCGGAACACATAACCGTTCCACGGCGCGGCGCTCTT\n+GTTGATCACTTCATCCTTGATCGAGATCGCATAGCGACCACGTTCCAGGGTAAAGGTGCGACGGATCGAC\n+ACGCCGTTGGGGCCATTCCACACGAACGGCACCACCAGCGTGTTCTGGCCCTTGGCGAGTTCGAACGTCG\n+TGCCAGGCTGTTCTGCGCGAAAGCCGCCGACGCCCGGCACCGGCGAATGCTCACTGGCCCAGCCACTGGT\n+GGCGTTGTACGGGTGCGCCGCGTCTTCCGTCAGCAGGCTGACCGGCGCGGTGCCGTCCTTGGTCTGCGGG\n+AACTGCAGCAGCTCGGCGTCGAGCACGCTGCGGCCATCCAGCTTCAGGCGCAGCACGTCCGAGGTCAGGG\n+TGACCACCGGTGCAGTGCCGGCAGCAGCCGGTGTCGCGGTGGTGGTGCTGGTTGCCGGAACCTTACCCGG\n+CGCACCAGCCTGCGGAATGGCCTGAGCTGCGGGCACATTCGCCGCGCTTGGCGTTGCCGCATCCAGATCA\n+CGTGCCGCCGGCACCGATTGCGTCGCAGCCGCCACGGGCGCATTGGCAGCCGCTTTTTCTTTGCCCCACT\n+CCATCCACAGCAGCGCCGCGACCATCAGCCAGGCAAAAATCAGGAAAACACGGGTCTGGTTCATCGGTCA\n+GCAACTCGCTCAGTCGGAACTACAGGTCCGGCTCTGTCGGGGGAAGGGAGGATGGGTGCATCGTCCTGGC\n+GGGCGGCATTGTGCCGGGCGCAGCAGGTAGGGGCAATGCGCCGGCACGGCGCAGCAGACGCAGGAAGGCG\n+TCGCGGATCTGCGGATTGGTCGCTTTTGCAGCTGCCGAGCGCGCCACGATGACGTAATCGCCACCGGCCA\n+ACTCAGGCAAGAGATGTCGCATGGCATCGCGCAACACACGTTTGATGCGGTTACGTCCGACCGCACGCGT\n+ATCGACCTTGCGCGACACCGCCATGCCCAGGCGCGGCGGGGTATCGCCAGTGCGCCAGTGCAGACTCAAT\n+AGCGGATCCGAGGTGCGGCGTGCGTTGTCGAAAACGACCGTATATTGCGCACGCGTACGAACCCGCGCAG\n+AGCGAGGAAATCGCTTGCACGGGTTCGATGCGTTCACGGTAAGGACTGCCTCGGCCGCAGGGAGCGGCGC\n+GGCAATCAAGCGCTCAGGCGCTTGCGGCCCTTGGCGCGGCGGCGAGCCAGGATCTTGCGGCCGTCGGCGG\n+TTGCCATACGTGCGCGGAAGCCATGGTCGCGTGCTCGCTTGAGGTTGCTGGGTTGGAACGTACGCTTGGT\n+GGCCATGGGGCCCTCTGCATGAATGGAGACGAATAGAACCGGCAATTCTATTGGTCCGCTACAGCCCAGG\n+TCAACAACCCGCGCGCATCGCCGCAGCCGACGATGACCGCCGCCTGTGGATGGGCCTGTGAATAACTCTG\n+GGAAAACCGTGTCCCCGGTGCTAGTCTGGCCCATCCTCTTTTCACTACCGGGCTGCGTGCACGGCG\n+\n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/data/Xoo_KACC_10331.fasta
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/data/Xoo_KACC_10331.fasta Mon Jan 03 09:56:55 2022 +0000
b
b'@@ -0,0 +1,70594 @@\n+>gi|58579623|ref|NC_006834.1| Xanthomonas oryzae pv. oryzae KACC 10331, complete genome\n+CGCCTTTCTGCGCGCCGCAGCCAGCAACAGATGATCATACTTTGATGGATGCTTGGCCCCGCTGTCTGGA\n+ACGTCTCGAAGCTGAATTCCCGCCCGAAGATGTCCACACCTGGTTGAAACCCCTGCAAGCCGAAGACCGC\n+GGCGACAGCATCGTGCTGTACGCCCCGAATGCCTTCATTGTCGACCAGGTCCGCGAACGCTACCTGCCGC\n+GCATCCGCGAGTTGCTGGCGTATTTTGCCGGCAATGGCGAAGTGGCGCTGGCCGTGGGGTCGCGTCCACG\n+TGCGCCCGAGCCGGCTCCGGCACCCGTCGCGGCGACCATTGCGCCGCAGGCTGCGCCGATCGCGCCGTTC\n+GCCGGCAACCTGGATTCGCATTACACCTTCGCCAACTTCGTGGAAGGCCGCAGCAACCAGCTGGGTCTGG\n+CCGCCGCGATCCAGGCCGCGCAGAAGCCCGGCGACCGGGCGCACAACCCGTTGCTGTTGTACGGCAGCAC\n+CGGCCTGGGCAAGACCCACCTGATGTTCGCGGCGGGCAATGCACTGCGGCAAGCCAAACCGGCTGCCAAG\n+GTGATGTACCTGCGTTCGGAACAGTTCTTCAGCGCGATGATCCGGGCGCTGCAGGACAAGGCGATGGATC\n+AGTTCAAGCGCCAGTTCCAGCAGATTGATGCGTTGCTGATCGACGACATCCAGTTCTTCGCGGGCAAGGA\n+CCGTACGCAGGAAGAGTTCTTCCACACCTTCAACGCGCTGTTCGATGGCCGCCAGCAGATCATCCTGACC\n+TGCGACCGCTACCCGCGCGAAGTGGAGGGCCTGGAGCCGCGGTTGAAGTCGCGCTTGGCCTGGGGCTTGT\n+CGGTCGCGATCGATCCGCCGGATTTCGAAACCCGTGCAGCCATCGTGCTGGCCAAGGCACGCGAGCGTGG\n+CGCCGAGATTCCCGACGACGTGGCATTTCTGATCGCCAAGAAGATGCGCTCCAACGTGCGCGACCTGGAA\n+GGCGCGCTCAACACGCTGGTGGCGCGCGCCAACTTCACCGGGCGCTCGATCACGGTGGAATTCGCCCAGG\n+AGACGCTGCGCGACCTGTTGCGCGCGCAGCAACAGGCCATCGGCATCCCCAACATCCAGAAAACAGTAGC\n+CGACTACTACGGCCTGCAGATGAAGGATTTGCTCTCCAAGCGCCGCACGCGTTCGCTGGCACGTCCGCGC\n+CAGGTGGCGATGGCGCTGGCCAAGGAGCTCACCGAACACAGCCTGCCGGAAATCGGCGATGCCTTCGCCG\n+GCCGCGACCACACCACCGTGCTGCATGCCTGCCGGCAGATCCGCACGCTGATGGAGGCAGACGGCAAGCT\n+GCGCGAGGACTGGGAAAAGCTGATTCGCAAGCTCAGCGAGTAGGCCTCGGACCCCAATCGTGTCCGCGCT\n+GGAGAAAAGCGTGGAAACGTTGGGGTCAAATGCGGGAGAATCTGTGGATAACGTTGCGTGGCGGTTCGAT\n+GGAAAAACTATCCACAGGTTTTGCCACCAGATCAGGCACACTAGTCCCAAGCGTTTCAGGCGCTGAAATG\n+TGTTTGGAAACAAACAGTTATGGCGGTTATCCGCTGAAAACGGCCCTACCATCACCACCAAGCTTTTGAT\n+TTATTCCATAATCTTTTAAAGCATAGGGGCACGGAACCACATGCGTTTTACACTGCAGCGCGAAGCCTTC\n+CTCAAACCGTTGGCCCAAGTGGTCAATGTGGTCGAACGCCGTCAAACCCTGCCTGTTCTGGCCAACTTGC\n+TGGTGCAGGTCAAGGACGGACAGGTCTCGTTGACCGGCACGGATCTGGAAGTCGAAATGATCGCGCGCAC\n+GATGGCGGAGGACGTGCAAGACGGCGAAACCACCATTCCCGCCCGCAAGCTATTCGACATCCTGCGCGCC\n+CTGCCGGACGGCAGCCGGGTCACCATTTCGCAGACCGGTGACAAGGTGACAGTTCAGGCCGGGCGTAGCC\n+GTTTCACGCTGGCGACGCTGCCTGCGAACGACTTCCCGTCCGTGGACGAAGTCGAGGCGACCGAGCGCGT\n+GGTGGTGCCCGAGGCCGGGCTCAAAGAGCTGATCGAACGCACGGCGTTTGCGATGGCACAGCAGGATGTT\n+CGCTACTACCTCAACGGCCTGCTGTTCGACCTGCGCGACGGTTTGCTGCGCTGCGTGGCCACCGACGGCC\n+ACCGTTTGGCGCTATGCGAGATGGAGCTTGAGAATGCTGGCGGCGCCAAGCGTCAGATCATCGTGCCGCG\n+TAAGGGCGTGACCGAGCTGCTGCGTTTGCTGGAAGGCGCAGACCGTGAGGTCGAATTGGAAGTCGGCCGT\n+AGCCATATCCGCGTCAAGCGTGGCGATGTAACCTTCACTTCCAAGCTGATCGACGGCCGCTTCCCGGACT\n+ACGAGGCAGTGATTCCGATTGGCGCCGATCGCGAGGTCAAGGTTGATCGTGAGGCGCTGCGTGCGTCGCT\n+TCAGCGCGCGGCCATCCTGTCGAACGAAAAGTACCGTGGCGTGCGCGTGGAAGTATCGCCAGGCCAATTG\n+AAGATCAGTGCGCACAACCCAGAGCAAGAAGAAGCGCAGGAAGAGATTGAGGCCGACACCAAGGTCGACG\n+ACCTGGCGATTGGCTTCAACGTCAACTATCTGCTCGATGCGTTGTCGGCATTGCGCGATGAGCACGTGGT\n+CATCCAGCTGCGAGACGCGAATTCGTCCGCGCTGGTGCGCGAGGCCAGCAGTGAGAAGTCCCGTCATGTG\n+GTGATGCCGCTGCGTCTCTGACGCTTTGTTCCACGTGGAACACGAGAAGCCCGGCGAACGCCGGGCTTTT\n+TATTGGTTGTTGAACCGCTTGCTGTGTCTGTTTGGGTAACCCTGCTAGCTGCGATCGCACAACGCGAGGA\n+AGTCGGCGCGCTGGGGGCAGCGGTTCTAGCTGAAGCGGCAAGCCCGTTGCTCAGGCGTTGGAACGGCATC\n+TTCAGCGCGATATTTCAGGTTACTCAGCGGCTGACGCCGCTGGTGTCGCTTTTGACCCACTGCGCCAGGC\n+GGGCTCTCACACATATACCGACGGGGGCTCCGGATTGGCAGCCCCTTATCCGATGACGGCAAGCCGAGTT\n+TTTGGGAATCGACCTGCTGGATAGACCCCGCGCGCGACCGGTGTCGTGGACGCGTTCTGCGCGGAACTCG\n+GGGGGATCCTGAATACGTATCGGTTTATCGGCGGGCCTGTGCAGGTCCCGACAGAGAGGTGAATCCAGAG\n+GCTGACACCTGGGCCGACTCAAGTTCCAAGTGCAACACTTTTCTCGACTGCAGACCCGCGTTTTCTGTCA\n+AAACACTGGCTCACGTAACTTTTGCACAATCAATGGCCTGCCGGGCTGTCCGTCCATACGTTGCGCTAAC\n+AGCAGGTCTCTCGAGGTGTTGCACTTGACTCTTGAGACCGCCCTGGTTTTAACGCACAGGCAACCTCACC\n+GGCTCACGCGTGGTCGGCTGAGATGGCGAGTTCATGCGGACCCTCTCGAACGACAAAGCGCTACTTCTTT\n+CCTGAGCGCCTCGCTTTGGCATTTATGAGACCAAGTCACTTTTGTTGATTCCGGTTGAATCATCACTTGA\n+GCCCTGAAACTGAACGGTTTTAGTTGAAAGGCAGAGCAAGACCAATTGCCATTACGCCTAGCTGAAAGGT\n+TTGCAGACATCTGATTGGCTTTTCTGAGCCTGTTTCCGACTTATGCACATCACGCGTTGCTTTTAAAACT\n+ACAAATACCTTAAGAGCTTGGAGGTGATGGTAGGGGCAGATTTCACCGCAAAGTAGATCAGGTTGTTGTT\n+T'..b'GCGCCTTGTTCACTTGGTCGAGCACGCGTTGCACGAT\n+GGATTCCGGCACCGGGTCGGCCCAGTCCAGCGAGTCGATATTCCACATGATGGACTTCAGGCCGGCCTCG\n+CCCAGCAGCTGCAAGCCTTCCGCAGTGCGCGCGCCATACGGAAACGGGAACAACGGCGCGCGCTTGTCGT\n+CCACCGCACGCAGCAAGGTGTCGGTATCCAGTACCTGGCTGCGCTGCGCTGCGCCGGTGGTTTTGGACAA\n+CTGCGCGTGGGTCAGGCTGTGGTTTCCAACTGCATACCCCTCTTCCATCAGCGTGCGGCTGATCTTGGAC\n+AGCGGCGCGAGTTTGGGTTTGCCGGCGGCATCCGGGCTACCCAGATTGCGCCCTACTTCGAAGAACACCC\n+CGGGCACGTCGTAGCGTTTGAGGATCGCCACGATCTCTTCGGTATAGGCCTTGTGCGGACCATCGTCGAA\n+GGTCAGCACCACTGTTTTGGGTGGCAGGTCGCGGCCGAACACTTCGCTGTCGCTGTCGCGTGCCGAGAAC\n+GGATACGGCTCCACCACGCCATGGTCACGCAGGATCTTCTCGCGCGTGTACAGCGTGCGCAGATGCGCCA\n+CGTAGTCGTCCCACTTCTCGCGCTTGGGCACGATGGCGCGGCTGCGGTCGAAGCGACTGAAGATCTGCGT\n+CAGCTCCTTGGTGTAGCTGCGCTCGATTTCGTCCAGCGCCTCCAGATCCTCGCCGATGCGCTGATGCAGT\n+TTCACCGCTGGCAACGCAGAGTCGCGACCGATGCGCGCATGCAGATCGCGCAATACCTCGCCAACGGCGA\n+GGCGGTCGGCATCGGAGAGATCCGGCGCCGATTCCACCTCGTCCAGCACCGCAGCAATCGTCGCGAACCG\n+GTTCGCGTGCTTGGATGTCAGCACTGTTTCGAACGATGCAGCGATGCGTTCGCGCTGCTCGAGATTTTCA\n+TGGAACAGCTGCTGCCCCACGCTGCTGGACATGGCGCGATCGCGTGGGGTCTGCTTGTCCTCATCGGCCA\n+GCAGCACGATGATGCGGCGGTGCCGGTCCAGCTGTTCGCGCAGTTGCGCGATCAATGCCTGCGCAGCGTC\n+GGCGCTCTTGTCGGCCTGCGTTCCTGCGGTCGTTGCAGCAGAGGATTTCGCGGCGTAGGCCGCATCGCTC\n+GCGCCCTGCTTCCCACAGCCGGCCAGCGCCAGCACTCCCACGCAACTTGCGCACATCAGCAGGCGATGCA\n+ACGGCGATGTGGTCACGACGGCGTCCTTGGCGAAAGAGACAACAGATGCGGGCTGACATGCAGAAAGCCC\n+GCCTTGCGGCGGGCCTTCTTCAACTTACTTGGCGTTGGCCCGGATGATCTTGCTCGGCTTCTCGCCGTGC\n+TGGCGGATCATCCACCACTGGATAAGCAGATTCAAACCGCCGTTGACCACCCAGTACAGCACCAGACCGG\n+ACGGCACGAAGGCCATCATGGCGCCGAACACCAGCGGCATGAACTGCATCATCTTGGCCTGCATCGGGTC\n+TATGCCCGGGGTCGGGGTCAGCTTCTGCGTCGCCCACATGATCGCGATGTTGAGCGCCGGGAGGATGAAG\n+TGCGGGTCGCGCGCGGTCAGGTCCTGGATCCAGCCCAGCCACGGCGCCTGACGCAGTTCCACCGACTCCA\n+CCAGCACCCAGTACAGCGCGAAGAAGATCGGCATCTGGATCAGCAGCGGCAGGCAGCCGCCCATCGGGTT\n+GATCTTTTCCTTCTTGAACAGCTCCATCGTGGCCTGCTGGTACTTGACGCGATCGTCGCCGTAGCGCTCC\n+TTGAGTTGCGCCAGGCGCGGCTGGAACTTGCGCATCTTGGCACTGGACTTGTACTGCGCAGACGACAGCG\n+GATACAGCACCAACCGCAGCAACACCACCAGGCCGACGATCGCCCAGCCCCAGTTGTGCAGGAAGCTGTG\n+CAGATGGCTCAGCACCCAGAACAGGCCCTGGCCGATGATGGCCATGATCGAGAAGCGGCTGTAATCGATC\n+ACGCGGTCCAGCCCCTTCACGTCTTCCTTGGCGATCAGACTGACCAGCTTCGGACCCACCCACAGGCGCG\n+CTTCGGTGGTCGCGGTCTGGCCCGGCGCCACGGTGAAAGCCGGGCCGCGCAACTCGGCCACGTCGCGTGG\n+GCCGTCCTTGTTCAACACATACAGCGAGGCTTGGTCGTTCTGCGGAATCCACGCGGTGAAGAAGTGGTGC\n+TGCAACAGCGCTATCCAGCCGCCGGTGATCTGGCGATTGAGGCCGCCGTCGTCCATGTAGTCCTTGAACG\n+CACGACGCTCGTAGCCTGCCTGCGGGCTGTACCAGGTCGCCCCGTTGAAGCTGAAGGAATCCGGATTGGT\n+CATGCCGCGGCTGAGGATGGTCGGCACCCGACTCAGCTTGCGGAACACATAACCGTTCCACGGCGCGGCG\n+CTCTTGTTGATCACTTCATCCTTGATCGAGATCGCATAGCGACCACGTTCCAGGGTAAAGGTGCGACGGA\n+TCGACACGCCGTTGGGGCCATTCCACACGAACGGCACCACCAGCGTGTTCTGGCCCTTGGCGAGTTCGAA\n+CGTCGTGCCAGGCTGTTCTGCGCGAAAGCCGCCGACGCCCGGCACCGGCGAATGCTCACTGGCCCAGCCA\n+CTGGTGGCGTTGTACGGGTGCGCCGCGTCTTCCGTCAGCAGGCTGACCGGCGCGGTGCCGTCCTTGGTCT\n+GCGGGAACTGCAGCAGCTCGGCGTCGAGCACGCTGCGGCCATCCAGCTTCAGGCGCAGCACGTCCGAGGT\n+CAGGGTGACCACCGGTGCAGTGCCGGCAGCAGCCGGTGTCGCGGTGGTGGTGCTGGTTGCCGGAACCTTA\n+CCCGGCGCACCAGCCTGCGGAATCGCCTGAGCTGCGGGCACATTCGCCGCGCTTGGCGTTGCCGCATCCA\n+GATCACGTGCCGCCGGCACCGATTGCGTCGCAGCCGCCACGGGCGCATTGGCAGCCGCTTTTTCTTTGCC\n+CCACTCCATCCACAGCAGCGCCGCGACCATCAGCCAGGCAAAAATCAGGAAAACACGGGTCTGGTTCATC\n+GGGCAGCAACTCGCTCAGTCGGAACTACAGGTCCGGCTCTGTCGGGGAAAGGGAGGATGGGTGCATCGTC\n+CTGGCGGGCGGCATTGTGCCGGGCGCAGCAGGTAGGGGCAATGCGCCGGCACGGCGCAGCAGACGCAGGA\n+AGGCGTCGCGGATCTGCGGATTGGTCGCTTTTGCAGCTGCCGAGCGCGCCACGATGACGTAATCGCCACC\n+GGGCAACTCAGGCAAGAGATGTCGCATGGCATCGCGCAACACACGTTTGATGCGGTTACGTCCGACCGCA\n+CGCGTATCGACCTTGCGCGACACCGCCATGCCCAGGCGCGGCGGGGTATCGCCAGTGCGCCAGTGCAGAC\n+TCAATAGCGGATCCGAGGTGCGGCGTGCGTTGTCGAAAACGACCGTATATTGCGCACGCGTACGAACCCG\n+CGCAGAGCGAGGAAATCGCCTGCACGGGTTCGATGCGTTCACGGTAAGGACTGCCTTGGCCGCAGGGAGC\n+GGCGCGGCAGTCAAGCGCTCAGGCGCTTGCGGCCCTTGGCGCGGCGGCGAGCCAGGATCTTGCGGCCGTC\n+GGCGGTTGCCATACGTGCGCGGAAGCCATGGTCGCGTGCTCGCTTGAGGTTGCTGGGTTGGAACGTACGC\n+TTGGTGGCCATGGGGCCCTCTGCATGAATGGAGACGAATATAACCGGTAATTCTATAGGTCCGCTACAGC\n+CCTGGTCAACAACCCGCGCGCATCGCCGCAGCTGACGCTGACCGCCGCCTGTGGATGGACCTGTGAATAA\n+CTCTGGGAAAACCGTGTCCCCGGTGCTAGTCTGGCCCATCCTCTTTTCACTACCGGGCTGCGTGCACGG\n+\n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/log
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/log Mon Jan 03 09:56:55 2022 +0000
b
b'@@ -0,0 +1,38 @@\n+utils::Initialize( ) - Initialization complete. Temporary directory: tmpJuP2tr\n+uniqprimer::Main( ) - Logging include files: \n+uniqprimer::Main( ) - data/X11-5Agenome.fasta\n+uniqprimer::Main( ) - Logging exclude files: \n+uniqprimer::Main( ) - data/XCCgenome.fasta\n+UniqPrimerFinder::__init__() - Initializing UniqPrimerFinder\n+utils::search_file - Path: /SATA/bioinfo/galaxy/galaxy_env/bin:/usr/local/bioinfo/galaxy/galaxy-python:/SGE/n1ge62/bin/lx24-amd64:/usr/lib64/qt-3.3/bin::/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/bioinfo/bin:/usr/local/bioinfo/abyss/bin:/usr/local/bioinfo/al2co:/usr/local/bioinfo/amos/bin:/usr/local/bioinfo/bambus/bin:/usr/local/bioinfo/bedtools/bin:/usr/local/bioinfo/bimbam:/usr/local/bioinfo/blast/bin:/usr/local/bioinfo/blast+/bin:/usr/local/bioinfo/bowtie:/usr/local/bioinfo/bowtie2:/usr/local/bioinfo/bwa:/usr/local/bioinfo/caftools/bin:/usr/local/bioinfo/CAP3:/usr/local/bioinfo/carthagene:/usr/local/bioinfo/cdhit:/usr/local/bioinfo/censor/bin:/usr/local/bioinfo/clustalw:/usr/local/bioinfo/consed/bin:/usr/local/bioinfo/cross_match:/usr/local/bioinfo/cufflinks:/usr/local/bioinfo/decoder:/usr/local/bioinfo/dssp:/usr/local/bioinfo/EIG3.0/bin:/usr/local/bioinfo/EMBOSS/bin:/usr/local/bioinfo/ESTScan:/usr/local/bioinfo/eval:/usr/local/bioinfo/eugene-3.2/bin:/usr/local/bioinfo/eugene-3.5g/bin:/usr/local/bioinfo/exonerate/bin:/usr/local/bioinfo/FastME:/usr/local/bioinfo/fastx_toolkit:/usr/local/bioinfo/flexbar:/usr/local/bioinfo/FINDMite:/usr/local/bioinfo/fpc:/usr/local/bioinfo/fpocket2:/usr/local/bioinfo/freebayes:/usr/local/bioinfo/GERP:/usr/local/bioinfo/gevalt:/usr/local/bioinfo/gnuplot/bin:/usr/local/bioinfo/GTH/bin:/usr/local/bioinfo/hmmer/bin:/usr/local/bioinfo/hcluster_sg:/usr/local/bioinfo/ImageMagick/bin:/usr/local/bioinfo/i-adhore:/usr/local/bioinfo/JimKent:/usr/local/bioinfo/LTR_BMC:/usr/local/bioinfo/LTR_FINDER:/usr/local/bioinfo/LTRharvest/bin:/usr/local/bioinfo/mafft/bin:/usr/local/bioinfo/mapmaker:/usr/local/bioinfo/MapSplice/bin:/usr/local/bioinfo/maxcluster:/usr/local/bioinfo/mcl/bin:/usr/local/bioinfo/MCQTL/bin/Linux:/usr/local/bioinfo/meme/bin:/usr/local/bioinfo/mfold_util/bin:/usr/local/bioinfo/mira/bin:/usr/local/bioinfo/mistral:/usr/local/bioinfo/modeller9v7/bin:/usr/local/bioinfo/mreps:/usr/local/bioinfo/MUMmer:/usr/local/bioinfo/MUSTANG:/usr/local/bioinfo/MultiProtInstall:/usr/local/bioinfo/multalin:/usr/local/bioinfo/muscle:/usr/local/bioinfo/paircoil2:/usr/local/bioinfo/PHYML:/usr/local/bioinfo/pals:/usr/local/bioinfo/paml/bin:/usr/local/bioinfo/phase:/usr/local/bioinfo/phred:/usr/local/bioinfo/piler:/usr/local/bioinfo/plink:/usr/local/bioinfo/polyscan:/usr/local/bioinfo/oases:/usr/local/bioinfo/prank:/usr/local/bioinfo/primer3:/usr/local/bioinfo/psipred30:/usr/local/bioinfo/Prokov/bin:/usr/local/bioinfo/qmean/bin:/usr/local/bioinfo/quicktree:/usr/local/bioinfo/R/bin:/usr/local/bioinfo/RepeatMasker:/usr/local/bioinfo/recon/bin:/usr/local/bioinfo/RepSeek/bin:/usr/local/bioinfo/REPET/bin:/usr/local/bioinfo/rnammer:/usr/local/bioinfo/scip/bin:/usr/local/bioinfo/semphy:/usr/local/bioinfo/shapeIT:/usr/local/bioinfo/signalp:/usr/local/bioinfo/SpliceMachine/bin:/usr/local/bioinfo/sratoolkit:/usr/local/bioinfo/ssaha2:/usr/local/bioinfo/sspro4/bin:/usr/local/bioinfo/staden/bin:/usr/local/bioinfo/structure:/usr/local/bioinfo/T-COFFEE/bin:/usr/local/bioinfo/TRF:/usr/local/bioinfo/tassel:/usr/local/bioinfo/tgicl:/usr/local/bioinfo/tgicl/bin:/usr/local/bioinfo/tophat:/usr/local/bioinfo/treebest:/usr/local/bioinfo/tRNAscan-SE/bin:/usr/local/bioinfo/unafold/bin:/usr/local/bioinfo/vcftools/bin:/usr/local/bioinfo/velvet:/usr/local/bioinfo/ViennaRNA/bin:/usr/local/bioinfo/wgs/bin:/usr/local/bioinfo/wublast:/usr/local/bioinfo/xslt/bin:/usr/local/bioinfo/tmhmm/bin:/usr/local/bioinfo/trinity:/usr/local/bioinfo/bpp/bin:/SATA/bioinfo/galaxy/galaxy_dist/tools/idfixe20120705/bin:/SATA/bioinfo/galaxy/galaxy_dist/tools/idfixe/bin:.:/opt/IBM_DS/jre/bin\n+utils::search_file - Path'..b'ller9v7/bin:/usr/local/bioinfo/mreps:/usr/local/bioinfo/MUMmer:/usr/local/bioinfo/MUSTANG:/usr/local/bioinfo/MultiProtInstall:/usr/local/bioinfo/multalin:/usr/local/bioinfo/muscle:/usr/local/bioinfo/paircoil2:/usr/local/bioinfo/PHYML:/usr/local/bioinfo/pals:/usr/local/bioinfo/paml/bin:/usr/local/bioinfo/phase:/usr/local/bioinfo/phred:/usr/local/bioinfo/piler:/usr/local/bioinfo/plink:/usr/local/bioinfo/polyscan:/usr/local/bioinfo/oases:/usr/local/bioinfo/prank:/usr/local/bioinfo/primer3:/usr/local/bioinfo/psipred30:/usr/local/bioinfo/Prokov/bin:/usr/local/bioinfo/qmean/bin:/usr/local/bioinfo/quicktree:/usr/local/bioinfo/R/bin:/usr/local/bioinfo/RepeatMasker:/usr/local/bioinfo/recon/bin:/usr/local/bioinfo/RepSeek/bin:/usr/local/bioinfo/REPET/bin:/usr/local/bioinfo/rnammer:/usr/local/bioinfo/scip/bin:/usr/local/bioinfo/semphy:/usr/local/bioinfo/shapeIT:/usr/local/bioinfo/signalp:/usr/local/bioinfo/SpliceMachine/bin:/usr/local/bioinfo/sratoolkit:/usr/local/bioinfo/ssaha2:/usr/local/bioinfo/sspro4/bin:/usr/local/bioinfo/staden/bin:/usr/local/bioinfo/structure:/usr/local/bioinfo/T-COFFEE/bin:/usr/local/bioinfo/TRF:/usr/local/bioinfo/tassel:/usr/local/bioinfo/tgicl:/usr/local/bioinfo/tgicl/bin:/usr/local/bioinfo/tophat:/usr/local/bioinfo/treebest:/usr/local/bioinfo/tRNAscan-SE/bin:/usr/local/bioinfo/unafold/bin:/usr/local/bioinfo/vcftools/bin:/usr/local/bioinfo/velvet:/usr/local/bioinfo/ViennaRNA/bin:/usr/local/bioinfo/wgs/bin:/usr/local/bioinfo/wublast:/usr/local/bioinfo/xslt/bin:/usr/local/bioinfo/tmhmm/bin:/usr/local/bioinfo/trinity:/usr/local/bioinfo/bpp/bin:/SATA/bioinfo/galaxy/galaxy_dist/tools/idfixe20120705/bin:/SATA/bioinfo/galaxy/galaxy_dist/tools/idfixe/bin:.:/opt/IBM_DS/jre/bin\n+UniqPrimerFinder::__init__() - Initializing UniqPrimerFinder - complete\n+UniqPrimerFinder::findPrimers() - Finding primers for include files\n+ExcludeFileManager::addExcludeFile( ) - adding exclude file data/XCCgenome.fasta\n+ExcludeFileManager::exportSequences( ) - parsing exclude sequences\n+fastaparser::parseFastaFile( ) - parsing fasta file data/XCCgenome.fasta\n+ExcludeFileManager::exportSequences( ) - finished parsing, writing to a common file\n+ExcludeFileManager::buildOutputFileName( ) -  exclude file: tmpJuP2tr/combined_exlude.ffn\n+ExcludeFileManager::exportSequences( ) - All sequences exported\n+IncludeFileManager::setExcludeFile( ) - fileName tmpJuP2tr/combined_exlude.ffn\n+IncludeFileManager::processIncludeFile( ) - processing data/X11-5Agenome.fasta\n+IncludeFileManager::processIncludeFile( ) - running nucmer for reference file: data/X11-5Agenome.fasta\n+IncludeFileManager::findUniqueSequence( ) - running nucmer for reference file: data/X11-5Agenome.fasta\n+ProgramBase::Execute( ) - Running the nucmer program.\n+ProgramBase::Execute( ) - /usr/local/bioinfo/MUMmer/nucmer -p nucmer_alignments -o --minmatch 300 --maxgap 1 data/X11-5Agenome.fasta tmpJuP2tr/combined_exlude.ffn\n+NucmerParser::parseCoordMatchFile( ) - Parse nucmer_alignments.coords, finding 2 matches\n+fastaparser::parseFastaFileAsPrimerSequence( ) - parsing fasta file data/X11-5Agenome.fasta\n+fastaparser::parseFastaFileAsPrimerSequence( ) - read 1 sequences\n+PrimerSequence::getNonMatchedSubSequences( ) - finding valid sub sequences for X11-5A\n+PrimerSequence::findValidIndices( ) - getting unmatched sequence indices\n+PrimerSequence::findValidIndices( ) - there are 2 excluded sequences for X11-5A\n+PrimerSequence::findValidIndices( ) - removing exclude sequence 1958030 - 1963613\n+PrimerSequence::findValidIndices( ) - removing exclude sequence 1958145 - 1963613\n+PrimerSequence::findValidIndices( ) - 4341162 unique indices\n+PrimerSequence::findValidIndexSequences( ) - getting sequences from unique indices\n+PrimerSequence::findValidIndexSequences( ) - 2 sequences found\n+PrimerManager::getCommonPrimers - finding primers that are common to all include files\n+PrimerManager::findPrimer(s ) - writing sequences to a fasta file\n+PrimerManager::writeFastaFile( ) - Writing 2 sequences to fasta file\n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/logfile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/logfile Mon Jan 03 09:56:55 2022 +0000
b
b'@@ -0,0 +1,49 @@\n+utils::Initialize( ) - Initialization complete. Temporary directory: tmpFDxzqF\n+uniqprimer::Main( ) - Logging include files: \n+uniqprimer::Main( ) - data/X11-5Agenome.fasta\n+uniqprimer::Main( ) - Logging exclude files: \n+uniqprimer::Main( ) - data/XCCgenome.fasta\n+UniqPrimerFinder::__init__() - Initializing UniqPrimerFinder\n+utils::search_file - Path: /SATA/bioinfo/galaxy/galaxy_env/bin:/usr/local/bioinfo/galaxy/galaxy-python:/SGE/n1ge62/bin/lx24-amd64:/tmp/8261175.1.bioinfo.q:/SATA/bioinfo/galaxy/galaxy_env/bin:/usr/local/bioinfo/galaxy/galaxy-python:/SGE/n1ge62/bin/lx24-amd64:/usr/lib64/qt-3.3/bin::/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/bioinfo/bin:/usr/local/bioinfo/abyss/bin:/usr/local/bioinfo/al2co:/usr/local/bioinfo/amos/bin:/usr/local/bioinfo/bambus/bin:/usr/local/bioinfo/bedtools/bin:/usr/local/bioinfo/bimbam:/usr/local/bioinfo/blast/bin:/usr/local/bioinfo/blast+/bin:/usr/local/bioinfo/bowtie:/usr/local/bioinfo/bowtie2:/usr/local/bioinfo/bwa:/usr/local/bioinfo/caftools/bin:/usr/local/bioinfo/CAP3:/usr/local/bioinfo/carthagene:/usr/local/bioinfo/cdhit:/usr/local/bioinfo/censor/bin:/usr/local/bioinfo/clustalw:/usr/local/bioinfo/consed/bin:/usr/local/bioinfo/cross_match:/usr/local/bioinfo/cufflinks:/usr/local/bioinfo/decoder:/usr/local/bioinfo/dssp:/usr/local/bioinfo/EIG3.0/bin:/usr/local/bioinfo/EMBOSS/bin:/usr/local/bioinfo/ESTScan:/usr/local/bioinfo/eval:/usr/local/bioinfo/eugene-3.2/bin:/usr/local/bioinfo/eugene-3.5g/bin:/usr/local/bioinfo/exonerate/bin:/usr/local/bioinfo/FastME:/usr/local/bioinfo/fastx_toolkit:/usr/local/bioinfo/flexbar:/usr/local/bioinfo/FINDMite:/usr/local/bioinfo/fpc:/usr/local/bioinfo/fpocket2:/usr/local/bioinfo/freebayes:/usr/local/bioinfo/GERP:/usr/local/bioinfo/gevalt:/usr/local/bioinfo/gnuplot/bin:/usr/local/bioinfo/GTH/bin:/usr/local/bioinfo/hmmer/bin:/usr/local/bioinfo/hcluster_sg:/usr/local/bioinfo/ImageMagick/bin:/usr/local/bioinfo/i-adhore:/usr/local/bioinfo/JimKent:/usr/local/bioinfo/LTR_BMC:/usr/local/bioinfo/LTR_FINDER:/usr/local/bioinfo/LTRharvest/bin:/usr/local/bioinfo/mafft/bin:/usr/local/bioinfo/mapmaker:/usr/local/bioinfo/MapSplice/bin:/usr/local/bioinfo/maxcluster:/usr/local/bioinfo/mcl/bin:/usr/local/bioinfo/MCQTL/bin/Linux:/usr/local/bioinfo/meme/bin:/usr/local/bioinfo/mfold_util/bin:/usr/local/bioinfo/mira/bin:/usr/local/bioinfo/mistral:/usr/local/bioinfo/modeller9v7/bin:/usr/local/bioinfo/mreps:/usr/local/bioinfo/MUMmer:/usr/local/bioinfo/MUSTANG:/usr/local/bioinfo/MultiProtInstall:/usr/local/bioinfo/multalin:/usr/local/bioinfo/muscle:/usr/local/bioinfo/paircoil2:/usr/local/bioinfo/PHYML:/usr/local/bioinfo/pals:/usr/local/bioinfo/paml/bin:/usr/local/bioinfo/phase:/usr/local/bioinfo/phred:/usr/local/bioinfo/piler:/usr/local/bioinfo/plink:/usr/local/bioinfo/polyscan:/usr/local/bioinfo/oases:/usr/local/bioinfo/prank:/usr/local/bioinfo/primer3:/usr/local/bioinfo/psipred30:/usr/local/bioinfo/Prokov/bin:/usr/local/bioinfo/qmean/bin:/usr/local/bioinfo/quicktree:/usr/local/bioinfo/R/bin:/usr/local/bioinfo/RepeatMasker:/usr/local/bioinfo/recon/bin:/usr/local/bioinfo/RepSeek/bin:/usr/local/bioinfo/REPET/bin:/usr/local/bioinfo/rnammer:/usr/local/bioinfo/scip/bin:/usr/local/bioinfo/semphy:/usr/local/bioinfo/shapeIT:/usr/local/bioinfo/signalp:/usr/local/bioinfo/SpliceMachine/bin:/usr/local/bioinfo/sratoolkit:/usr/local/bioinfo/ssaha2:/usr/local/bioinfo/sspro4/bin:/usr/local/bioinfo/staden/bin:/usr/local/bioinfo/structure:/usr/local/bioinfo/T-COFFEE/bin:/usr/local/bioinfo/TRF:/usr/local/bioinfo/tassel:/usr/local/bioinfo/tgicl:/usr/local/bioinfo/tgicl/bin:/usr/local/bioinfo/tophat:/usr/local/bioinfo/treebest:/usr/local/bioinfo/tRNAscan-SE/bin:/usr/local/bioinfo/unafold/bin:/usr/local/bioinfo/vcftools/bin:/usr/local/bioinfo/velvet:/usr/local/bioinfo/ViennaRNA/bin:/usr/local/bioinfo/wgs/bin:/usr/local/bioinfo/wublast:/usr/local/bioinfo/xslt/bin:/usr/local/bioinfo/tmhmm/bin:/usr/local/bioinfo/trinity:/usr/local/bioinfo/bpp/bin:/SATA/bioinfo/galaxy/galaxy_'..b'oinfo/signalp:/usr/local/bioinfo/SpliceMachine/bin:/usr/local/bioinfo/sratoolkit:/usr/local/bioinfo/ssaha2:/usr/local/bioinfo/sspro4/bin:/usr/local/bioinfo/staden/bin:/usr/local/bioinfo/structure:/usr/local/bioinfo/T-COFFEE/bin:/usr/local/bioinfo/TRF:/usr/local/bioinfo/tassel:/usr/local/bioinfo/tgicl:/usr/local/bioinfo/tgicl/bin:/usr/local/bioinfo/tophat:/usr/local/bioinfo/treebest:/usr/local/bioinfo/tRNAscan-SE/bin:/usr/local/bioinfo/unafold/bin:/usr/local/bioinfo/vcftools/bin:/usr/local/bioinfo/velvet:/usr/local/bioinfo/ViennaRNA/bin:/usr/local/bioinfo/wgs/bin:/usr/local/bioinfo/wublast:/usr/local/bioinfo/xslt/bin:/usr/local/bioinfo/tmhmm/bin:/usr/local/bioinfo/trinity:/usr/local/bioinfo/bpp/bin:/SATA/bioinfo/galaxy/galaxy_dist/tools/idfixe20120705/bin:/SATA/bioinfo/galaxy/galaxy_dist/tools/idfixe/bin:.:/opt/IBM_DS/jre/bin\n+UniqPrimerFinder::__init__() - Initializing UniqPrimerFinder - complete\n+UniqPrimerFinder::findPrimers() - Finding primers for include files\n+ExcludeFileManager::addExcludeFile( ) - adding exclude file data/XCCgenome.fasta\n+ExcludeFileManager::exportSequences( ) - parsing exclude sequences\n+fastaparser::parseFastaFile( ) - parsing fasta file data/XCCgenome.fasta\n+ExcludeFileManager::exportSequences( ) - finished parsing, writing to a common file\n+ExcludeFileManager::buildOutputFileName( ) -  exclude file: tmpFDxzqF/combined_exlude.ffn\n+ExcludeFileManager::exportSequences( ) - All sequences exported\n+IncludeFileManager::setExcludeFile( ) - fileName tmpFDxzqF/combined_exlude.ffn\n+IncludeFileManager::processIncludeFile( ) - processing data/X11-5Agenome.fasta\n+IncludeFileManager::processIncludeFile( ) - running nucmer for reference file: data/X11-5Agenome.fasta\n+IncludeFileManager::findUniqueSequence( ) - running nucmer for reference file: data/X11-5Agenome.fasta\n+ProgramBase::Execute( ) - Running the nucmer program.\n+ProgramBase::Execute( ) - /usr/local/bioinfo/MUMmer/nucmer -p nucmer_alignments -o --minmatch 300 --maxgap 1 data/X11-5Agenome.fasta tmpFDxzqF/combined_exlude.ffn\n+NucmerParser::parseCoordMatchFile( ) - Parse nucmer_alignments.coords, finding 2 matches\n+fastaparser::parseFastaFileAsPrimerSequence( ) - parsing fasta file data/X11-5Agenome.fasta\n+fastaparser::parseFastaFileAsPrimerSequence( ) - read 1 sequences\n+PrimerSequence::getNonMatchedSubSequences( ) - finding valid sub sequences for X11-5A\n+PrimerSequence::findValidIndices( ) - getting unmatched sequence indices\n+PrimerSequence::findValidIndices( ) - there are 2 excluded sequences for X11-5A\n+PrimerSequence::findValidIndices( ) - removing exclude sequence 1958030 - 1963613\n+PrimerSequence::findValidIndices( ) - removing exclude sequence 1958145 - 1963613\n+PrimerSequence::findValidIndices( ) - 4341162 unique indices\n+PrimerSequence::findValidIndexSequences( ) - getting sequences from unique indices\n+PrimerSequence::findValidIndexSequences( ) - 2 sequences found\n+PrimerManager::getCommonPrimers - finding primers that are common to all include files\n+PrimerManager::findPrimer(s ) - writing sequences to a fasta file\n+PrimerManager::writeFastaFile( ) - Writing 2 sequences to fasta file\n+PrimerManager::writeFastaFile( ) - writing fasta file complete\n+PrimerManager::findPrimers( ) - executing eprimer3 program\n+ProgramBase::Execute( ) - Running the EPrimer3 program.\n+ProgramBase::Execute( ) - /usr/local/bioinfo/EMBOSS/bin/eprimer3 tmpFDxzqF/sequenceForEprimer.fasta tmpFDxzqF/referenceprimers.ep3 -numreturn 2 -prange 300-400 -osize 20 -minsize 18 -maxsize 27\n+PrimerManager::findPrimer( ) - eprimer3 file tmpFDxzqF/referenceprimers.ep3 created. Parsing for primers.\n+eprimerparser::parsePrimerSequences( ) - parsing for primer sequences\n+eprimerparser::parsePrimerSequences( ) - finished parsing. found 4 primers\n+PrimerManager::findPrimers( ) - parsing for sequences complete\n+UniqPrimerFinder::findPrimers( ) - found 4 unique sequences\n+UniqPrimerFinder::writeOutputFile() - output file written.\n+UniqPrimerFinder::findPrimers() - Finished finding primers\n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/logfile.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/logfile.txt Mon Jan 03 09:56:55 2022 +0000
b
b'@@ -0,0 +1,1971 @@\n+utils::Initialize( ) - Initialization complete. Temporary directory: tmpz0OJOq\n+uniqprimer::Main( ) - Logging include files: \n+uniqprimer::Main( ) - data/PX099A.fa data/Xoc_BLS256.fasta\n+uniqprimer::Main( ) - Logging exclude files: \n+uniqprimer::Main( ) - data/Xoo_KACC_10331.fasta data/Xoc_BLS256.fasta\n+UniqPrimerFinder::__init__() - Initializing UniqPrimerFinder\n+utils::search_file - Path: /usr/local/bioinfo/primer3/1.1.1:/usr/local/bioinfo/EMBOSS/6.6.0/bin:/usr/local/bioinfo/primer3/2.2.3:/usr/local/bioinfo/MUMmer/3.23/aux_bin:/usr/local/bioinfo/MUMmer/3.23:/usr/local/bioinfo/python/2.7.9_build2/bin:/homedir/galaxy/galaxy_env/bin:/usr/local/bioinfo/R/3.1.3/bin:/usr/local/bioinfo/geos/3.4.2/bin:/usr/local/bioinfo/gdal/1.9.2/bin:/usr/local/java/jre8/bin:/usr/local/bioinfo/samtools/1.2/bin:/opt/cluster/compilers/gcc/gcc-4.9.2/bin:/SGE/8.1.8/bin:/SGE/8.1.8/bin/lx-amd64:/usr/lib64/qt-3.3/bin:/usr/lpp/mmfs/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/galaxy/bin\n+utils::search_file - Path: /usr/local/bioinfo/primer3/1.1.1:/usr/local/bioinfo/EMBOSS/6.6.0/bin:/usr/local/bioinfo/primer3/2.2.3:/usr/local/bioinfo/MUMmer/3.23/aux_bin:/usr/local/bioinfo/MUMmer/3.23:/usr/local/bioinfo/python/2.7.9_build2/bin:/homedir/galaxy/galaxy_env/bin:/usr/local/bioinfo/R/3.1.3/bin:/usr/local/bioinfo/geos/3.4.2/bin:/usr/local/bioinfo/gdal/1.9.2/bin:/usr/local/java/jre8/bin:/usr/local/bioinfo/samtools/1.2/bin:/opt/cluster/compilers/gcc/gcc-4.9.2/bin:/SGE/8.1.8/bin:/SGE/8.1.8/bin/lx-amd64:/usr/lib64/qt-3.3/bin:/usr/lpp/mmfs/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/galaxy/bin\n+utils::search_file - Path: /usr/local/bioinfo/primer3/1.1.1:/usr/local/bioinfo/EMBOSS/6.6.0/bin:/usr/local/bioinfo/primer3/2.2.3:/usr/local/bioinfo/MUMmer/3.23/aux_bin:/usr/local/bioinfo/MUMmer/3.23:/usr/local/bioinfo/python/2.7.9_build2/bin:/homedir/galaxy/galaxy_env/bin:/usr/local/bioinfo/R/3.1.3/bin:/usr/local/bioinfo/geos/3.4.2/bin:/usr/local/bioinfo/gdal/1.9.2/bin:/usr/local/java/jre8/bin:/usr/local/bioinfo/samtools/1.2/bin:/opt/cluster/compilers/gcc/gcc-4.9.2/bin:/SGE/8.1.8/bin:/SGE/8.1.8/bin/lx-amd64:/usr/lib64/qt-3.3/bin:/usr/lpp/mmfs/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/galaxy/bin\n+utils::search_file - Path: /usr/local/bioinfo/primer3/1.1.1:/usr/local/bioinfo/EMBOSS/6.6.0/bin:/usr/local/bioinfo/primer3/2.2.3:/usr/local/bioinfo/MUMmer/3.23/aux_bin:/usr/local/bioinfo/MUMmer/3.23:/usr/local/bioinfo/python/2.7.9_build2/bin:/homedir/galaxy/galaxy_env/bin:/usr/local/bioinfo/R/3.1.3/bin:/usr/local/bioinfo/geos/3.4.2/bin:/usr/local/bioinfo/gdal/1.9.2/bin:/usr/local/java/jre8/bin:/usr/local/bioinfo/samtools/1.2/bin:/opt/cluster/compilers/gcc/gcc-4.9.2/bin:/SGE/8.1.8/bin:/SGE/8.1.8/bin/lx-amd64:/usr/lib64/qt-3.3/bin:/usr/lpp/mmfs/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/galaxy/bin\n+UniqPrimerFinder::__init__() - Initializing UniqPrimerFinder - complete\n+UniqPrimerFinder::findPrimers() - Finding primers for include files\n+ExcludeFileManager::addExcludeFile( ) - adding exclude file data/Xoo_KACC_10331.fasta\n+ExcludeFileManager::addExcludeFile( ) - adding exclude file data/Xoc_BLS256.fasta\n+ExcludeFileManager::exportSequences( ) - parsing exclude sequences\n+fastaparser::parseFastaFile( ) - parsing fasta file data/Xoo_KACC_10331.fasta\n+fastaparser::parseFastaFile( ) - parsing fasta file data/Xoc_BLS256.fasta\n+ExcludeFileManager::exportSequences( ) - finished parsing, writing to a common file\n+ExcludeFileManager::buildOutputFileName( ) -  exclude file: tmpz0OJOq/combined_exlude.ffn\n+ExcludeFileManager::exportSequences( ) - All sequences exported\n+IncludeFileManager::setExcludeFile( ) - fileName tmpz0OJOq/combined_exlude.ffn\n+IncludeFileManager::processIncludeFile( ) - processing data/PX099A.fa\n+IncludeFileManager::processIncludeFile( ) - running nucmer for reference file: data/PX099A.fa\n+IncludeFileManager::findUniqueSequence( ) - running nucmer for reference file: data/PX099A.fa\n+ProgramBase::Execute( ) - Ru'..b'- 5214344\n+PrimerSequence::findValidIndices( ) - removing exclude sequence 5212825 - 5214344\n+PrimerSequence::findValidIndices( ) - removing exclude sequence 5217226 - 5240075\n+PrimerSequence::findValidIndices( ) - removing exclude sequence 5218688 - 5222451\n+PrimerSequence::findValidIndices( ) - removing exclude sequence 5222647 - 5226290\n+PrimerSequence::findValidIndices( ) - removing exclude sequence 5227136 - 5240075\n+PrimerSequence::findValidIndices( ) - 591528 unique indices\n+PrimerSequence::findValidIndexSequences( ) - getting sequences from unique indices\n+PrimerSequence::findValidIndexSequences( ) - 84976 sequences found\n+IncludeFileManager::processIncludeFile( ) - processing data/Xoc_BLS256.fasta\n+PrimerManager::writeFastaFile( ) - Writing 326 sequences to fasta file\n+PrimerManager::writeFastaFile( ) - writing fasta file complete\n+IncludeFileManager::findUniqueSequence( ) - running nucmer for reference file: data/Xoc_BLS256.fasta\n+ProgramBase::Execute( ) - Running the nucmer program.\n+ProgramBase::Execute( ) - /usr/local/bioinfo/MUMmer/3.23/nucmer -p nucmer_alignments -o --minmatch 300 --maxgap 1 data/Xoc_BLS256.fasta tmpz0OJOq/tempSequences.fasta\n+NucmerParser::parseCoordMatchFile( ) - Parse nucmer_alignments.coords, finding 28 matches\n+fastaparser::parseFastaFileAsPrimerSequence( ) - parsing fasta file data/Xoc_BLS256.fasta\n+fastaparser::parseFastaFileAsPrimerSequence( ) - read 1 sequences\n+PrimerSequence::getMatchedSubSequences( ) - finding valid sub sequences for gi|868566092|ref|NC_017267.2|\n+PrimerManager::getCommonPrimers - finding primers that are common to all include files\n+PrimerManager::findPrimer(s ) - writing sequences to a fasta file\n+PrimerManager::writeFastaFile( ) - Writing 149 sequences to fasta file\n+PrimerManager::writeFastaFile( ) - writing fasta file complete\n+PrimerManager::findPrimers( ) - executing eprimer3 program\n+ProgramBase::Execute( ) - Running the EPrimer3 program.\n+ProgramBase::Execute( ) - /usr/local/bioinfo/EMBOSS/6.6.0/bin/eprimer3 tmpz0OJOq/sequenceForEprimer.fasta tmpz0OJOq/referenceprimers.ep3 -numreturn 2 -prange 200-250 -osize 20 -minsize 18 -maxsize 27\n+PrimerManager::findPrimer( ) - eprimer3 file tmpz0OJOq/referenceprimers.ep3 created. Parsing for primers.\n+eprimerparser::parsePrimerSequences( ) - parsing for primer sequences\n+eprimerparser::parsePrimerSequences( ) - finished parsing. found 272 primers\n+PrimerManager::findPrimers( ) - parsing for sequences complete\n+fastaparser::parseFastaFile( ) - parsing fasta file tmpz0OJOq/combined_exlude.ffn\n+PrimerManager::crossValidatePrimers - finding primers that are not in the supplied exclude file\n+ProgramBase::Execute( ) - Running the PrimerSearch program.\n+ProgramBase::Execute( ) - /usr/local/bioinfo/EMBOSS/6.6.0/bin/primersearch -seqall tmpz0OJOq/combined_exlude.ffn -infile tmpz0OJOq/tmpinputprimers.ps -mismatchpercent 0 -outfile tmpz0OJOq/tmpoutputprimers.ps\n+PrimerManager::crossValidatePrimers - 79 unique primers identified out of 272\n+fastaparser::parseFastaFile( ) - parsing fasta file data/PX099A.fa\n+PrimerManager::crossValidatePrimers - finding primers that are in the supplied include file\n+ProgramBase::Execute( ) - Running the PrimerSearch program.\n+ProgramBase::Execute( ) - /usr/local/bioinfo/EMBOSS/6.6.0/bin/primersearch -seqall data/PX099A.fa -infile tmpz0OJOq/tmpinputprimers2.ps1 -mismatchpercent 0 -outfile tmpz0OJOq/tmpoutputprimers2.ps1\n+PrimerManager::crossValidatePrimers - 79 unique primers identified out of 79\n+fastaparser::parseFastaFile( ) - parsing fasta file data/Xoc_BLS256.fasta\n+PrimerManager::crossValidatePrimers - finding primers that are in the supplied include file\n+ProgramBase::Execute( ) - Running the PrimerSearch program.\n+ProgramBase::Execute( ) - /usr/local/bioinfo/EMBOSS/6.6.0/bin/primersearch -seqall data/Xoc_BLS256.fasta -infile tmpz0OJOq/tmpinputprimers2.ps2 -mismatchpercent 0 -outfile tmpz0OJOq/tmpoutputprimers2.ps2\n+PrimerManager::crossValidatePrimers - 0 unique primers identified out of 79\n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/nucmer_alignments.coords
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/nucmer_alignments.coords Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,33 @@
+/homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqprimer/uniqprimer-0.5.0/data/Xoc_BLS256.fasta /homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqprimer/uniqprimer-0.5.0/tmpz0OJOq/tempSequences.fasta
+NUCMER
+
+    [S1]     [E1]  |     [S2]     [E2]  |  [LEN 1]  [LEN 2]  |  [% IDY]  | [TAGS]
+=====================================================================================
+   67528    69135  |     4241     5848  |     1608     1608  |    98.26  | gi|868566092|ref|NC_017267.2| seq_126
+   72101    73244  |        1     1144  |     1144     1144  |    99.39  | gi|868566092|ref|NC_017267.2| seq_54
+   88411    89039  |        1      629  |      629      629  |    99.68  | gi|868566092|ref|NC_017267.2| seq_55
+  475277   477524  |     9615     7376  |     2248     2240  |    95.33  | gi|868566092|ref|NC_017267.2| seq_126
+  475277   477120  |     1844        1  |     1844     1844  |    95.88  | gi|868566092|ref|NC_017267.2| seq_273
+  476847   477524  |      935      266  |      678      670  |    96.17  | gi|868566092|ref|NC_017267.2| seq_129
+  791641   792784  |        1     1144  |     1144     1144  |    99.65  | gi|868566092|ref|NC_017267.2| seq_54
+ 1445967  1447021  |     1057        1  |     1055     1057  |    99.15  | gi|868566092|ref|NC_017267.2| seq_2
+ 1688199  1688875  |      266      935  |      677      670  |    96.75  | gi|868566092|ref|NC_017267.2| seq_129
+ 2011235  2013180  |     1946        1  |     1946     1946  |    95.84  | gi|868566092|ref|NC_017267.2| seq_273
+ 2011335  2013585  |     9617     7376  |     2251     2242  |    95.60  | gi|868566092|ref|NC_017267.2| seq_126
+ 2018762  2019833  |     4926     3855  |     1072     1072  |    98.97  | gi|868566092|ref|NC_017267.2| seq_116
+ 2018942  2019835  |     1136      243  |      894      894  |    98.99  | gi|868566092|ref|NC_017267.2| seq_96
+ 2343460  2347223  |     3789        1  |     3764     3789  |    97.89  | gi|868566092|ref|NC_017267.2| seq_116
+ 2348101  2357453  |     9353        1  |     9353     9353  |    97.16  | gi|868566092|ref|NC_017267.2| seq_113
+ 2363803  2368395  |     4604        1  |     4593     4604  |    98.07  | gi|868566092|ref|NC_017267.2| seq_107
+ 2394983  2395425  |      443        1  |      443      443  |    99.32  | gi|868566092|ref|NC_017267.2| seq_168
+ 2508983  2511231  |     7376     9617  |     2249     2242  |    95.38  | gi|868566092|ref|NC_017267.2| seq_126
+ 2509386  2511534  |        1     2149  |     2149     2149  |    95.58  | gi|868566092|ref|NC_017267.2| seq_273
+ 2913061  2914164  |       41     1144  |     1104     1104  |    99.73  | gi|868566092|ref|NC_017267.2| seq_54
+ 2913061  2914164  |       57     1160  |     1104     1104  |    99.64  | gi|868566092|ref|NC_017267.2| seq_87
+ 3038349  3038977  |        1      629  |      629      629  |    99.52  | gi|868566092|ref|NC_017267.2| seq_55
+ 3899121  3900177  |        1     1057  |     1057     1057  |    99.24  | gi|868566092|ref|NC_017267.2| seq_2
+ 3995466  3996094  |      629        1  |      629      629  |    99.36  | gi|868566092|ref|NC_017267.2| seq_55
+ 4189285  4190427  |     1143        1  |     1143     1143  |    99.65  | gi|868566092|ref|NC_017267.2| seq_54
+ 4269203  4270813  |     5847     4239  |     1611     1609  |    98.01  | gi|868566092|ref|NC_017267.2| seq_126
+ 4515876  4517347  |     1472        1  |     1472     1472  |    98.71  | gi|868566092|ref|NC_017267.2| seq_25
+ 4516051  4516679  |      629        1  |      629      629  |    99.52  | gi|868566092|ref|NC_017267.2| seq_55
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/nucmer_alignments.delta
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/nucmer_alignments.delta Mon Jan 03 09:56:55 2022 +0000
b
@@ -0,0 +1,216 @@
+/homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqprimer/uniqprimer-0.5.0/data/Xoc_BLS256.fasta /homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqprimer/uniqprimer-0.5.0/tmpz0OJOq/tempSequences.fasta
+NUCMER
+>gi|868566092|ref|NC_017267.2| seq_2 4831746 1059
+1445967 1447021 1057 1 9 9 0
+-426
+-1
+0
+3899121 3900177 1 1057 8 8 0
+0
+>gi|868566092|ref|NC_017267.2| seq_25 4831746 1646
+4515876 4517347 1472 1 19 19 0
+0
+>gi|868566092|ref|NC_017267.2| seq_54 4831746 1172
+72101 73244 1 1144 7 7 0
+0
+791641 792784 1 1144 4 4 0
+0
+2913061 2914164 41 1144 3 3 0
+0
+4189285 4190427 1143 1 4 4 0
+0
+>gi|868566092|ref|NC_017267.2| seq_55 4831746 629
+88411 89039 1 629 2 2 0
+0
+3038349 3038977 1 629 3 3 0
+0
+3995466 3996094 629 1 4 4 0
+0
+4516051 4516679 629 1 3 3 0
+0
+>gi|868566092|ref|NC_017267.2| seq_87 4831746 1161
+2913061 2914164 57 1160 4 4 0
+0
+>gi|868566092|ref|NC_017267.2| seq_96 4831746 1136
+2018942 2019835 1136 243 9 9 0
+0
+>gi|868566092|ref|NC_017267.2| seq_107 4831746 4923
+2363803 2368395 4604 1 89 89 0
+-39
+-1
+-1
+-1
+-1
+-1
+-1
+-1
+-1341
+-1
+-1
+-1
+-1
+-1
+-2
+-1
+-1
+2160
+1
+1
+-552
+-1
+-1
+-1
+-1
+-1
+294
+1
+1
+34
+1
+1
+1
+1
+1
+0
+>gi|868566092|ref|NC_017267.2| seq_113 4831746 9353
+2348101 2357453 9353 1 266 266 0
+-1180
+-1
+-1
+-1
+-1
+-1
+-1
+-1
+-1
+-1
+-1
+-1
+-817
+239
+3344
+1
+1
+1
+1
+1
+1
+1
+3
+1
+1
+1
+2
+1
+11
+1
+1
+1
+1
+1
+-141
+-5
+-1672
+-2
+-1
+-1
+-1
+-1
+0
+>gi|868566092|ref|NC_017267.2| seq_116 4831746 7769
+2018762 2019833 4926 3855 11 11 0
+0
+2343460 2347223 3789 1 80 80 0
+-252
+-1
+-1
+-1
+-74
+-1
+-1
+-1
+-1
+-1
+-6
+-2
+-1
+-1
+-1
+-1
+-1
+-2
+-6
+-1
+-1
+-1
+-1
+-1
+-1
+0
+>gi|868566092|ref|NC_017267.2| seq_126 4831746 9617
+67528 69135 4241 5848 28 28 0
+0
+475277 477524 9615 7376 105 105 0
+2162
+5
+1
+1
+1
+1
+1
+1
+0
+2011335 2013585 9617 7376 99 99 0
+2164
+1
+5
+1
+1
+1
+1
+1
+1
+0
+2508983 2511231 7376 9617 104 104 0
+76
+1
+1
+1
+1
+2
+1
+0
+4269203 4270813 5847 4239 32 32 0
+5
+1596
+0
+>gi|868566092|ref|NC_017267.2| seq_129 4831746 935
+476847 477524 935 266 26 26 0
+592
+5
+1
+1
+1
+1
+1
+1
+0
+1688199 1688875 266 935 22 22 0
+74
+1
+1
+1
+1
+1
+1
+0
+>gi|868566092|ref|NC_017267.2| seq_168 4831746 443
+2394983 2395425 443 1 3 3 0
+0
+>gi|868566092|ref|NC_017267.2| seq_273 4831746 2149
+475277 477120 1844 1 76 76 0
+0
+2011235 2013180 1946 1 81 81 0
+0
+2509386 2511534 1 2149 95 95 0
+0
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/outalex
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/outalex Mon Jan 03 09:56:55 2022 +0000
b
@@ -0,0 +1,4 @@
+1 TGCGTTGGAAGAAGTCACAG GGGAAGAGTACGAGCGTCTG 300
+2 GACACCTTACGGGCATCTGT GGCCAAATACAGCACCTTGT 301
+3 TCGGGCACTCCTTCAATATC CCGTACGTCAACTTCCTGGT 300
+4 TCAGCATGATACGCCATGAT ACGCCCTTACAATGCAAAAC 300
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/outfile.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/outfile.txt Mon Jan 03 09:56:55 2022 +0000
b
@@ -0,0 +1,4 @@
+1 TTCGATGCGCACTACAAAAG GTCTCGCAGGTGAGTCCTTC 200
+2 AGAACTCCTGCCAACTCGAA TGCAGTGTCGATCTTCAAGG 200
+3 CCAACAGTTCATTGGTGTCG GACCATGGATTTGGTCATCC 200
+4 TGAAGCTCAACACGCCATAG GTTTCTGCTGGGCTTTCTTG 200
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/output
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/output Mon Jan 03 09:56:55 2022 +0000
b
@@ -0,0 +1,4 @@
+1 TTCGATGCGCACTACAAAAG GTCTCGCAGGTGAGTCCTTC 200
+2 AGAACTCCTGCCAACTCGAA TGCAGTGTCGATCTTCAAGG 200
+3 CCAACAGTTCATTGGTGTCG GACCATGGATTTGGTCATCC 200
+4 TGAAGCTCAACACGCCATAG GTTTCTGCTGGGCTTTCTTG 200
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primers.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/primers.txt Mon Jan 03 09:56:55 2022 +0000
b
@@ -0,0 +1,8 @@
+1 GAAGTCGCTCAGGTCAGGTC GAAGGTGGCATGGCTGTAAT 200
+2 CAATGAAGTCGCTCAGGTCA GAAGGTGGCATGGCTGTAAT 204
+3 ACCTGCAACAGCCTTGATTT GAGTGGTGAAAGTCCTGCATC 201
+4 CGTGACATTCAGTCGTCGTT ACCGGCATCAACATCAGATA 206
+5 TGACGCGTTTAAGTCTGTGC GATCGAGTGCAATCTCGTTG 206
+6 TGACGCGTTTAAGTCTGTGC CGATCGAGTGCAATCTCGT 207
+7 ACGACAAGCATGAGGGCTAC TTGGTATTGATGCCCTTGCT 202
+8 ACGACAAGCATGAGGGCTAC CTTGGTATTGATGCCCTTGC 203
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/__init__.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/primertools/__init__.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,10 @@
+__all__ = [ 'eprimerparser', 
+            'excludefilemanager', 
+            'fastaparser', 
+            'includefilemanager', 
+            'nucmerparser', 
+            'primermanager', 
+            'primersearchutils',
+            'primersequence', 
+            'programs', 
+            'utils'  ]
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/__init__.pyc
b
Binary file uniqprimer-0.5.0/primertools/__init__.pyc has changed
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/eprimerparser.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/primertools/eprimerparser.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,75 @@
+'''
+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 os
+import utils
+import re
+
+def parsePrimerSequences( eprimerFile ):
+    '''
+    parse an eprimer3 output file for all primers
+    '''
+    
+    utils.logMessage( "eprimerparser::parsePrimerSequences( )", "parsing for primer sequences" )
+    if os.path.exists( eprimerFile ) == False:
+        utils.logMessage( "eprimerparser::parsePrimerSequences( )", "ERROR - eprimer file was not found" )
+        raise utils.NoFileFoundException( eprimerFile )
+    
+    
+    primers = [ ]
+    primerFile = open( eprimerFile )
+    
+    currentPrimer = None
+            
+    nextPrimerId = 0
+    for line in primerFile.readlines( ):
+        
+        if line[ 0 ] == '# ':
+            continue
+        
+        if line.find( "PRODUCT SIZE" ) != -1:
+            if currentPrimer is not None:
+                primers.append( currentPrimer )
+            currentPrimer = utils.PrimerSet( str( nextPrimerId ) )
+            nextPrimerId += 1
+            productSize = int( line.split( ':' )[ 1 ].strip( ) )
+            currentPrimer.setProductSize( productSize )
+        else:
+            tokens = re.split( ' *', line.strip( ) ) 
+            if len( tokens ) == 7:
+                
+                sequence = tokens[ 6 ]
+                temp = tokens[ 4 ]
+            
+                if tokens[ 0 ] == "FORWARD": 
+                    currentPrimer.setForwardPrimerData( sequence, temp )
+                elif tokens[ 0 ] == "REVERSE":
+                    currentPrimer.setReversePrimerData( sequence, temp )
+    
+    if currentPrimer is not None:
+        primers.append( currentPrimer )
+    
+    utils.logMessage( "eprimerparser::parsePrimerSequences( )", "finished parsing. found {0} primers".format( len( primers ) ) )
+    return primers        
+                
+            
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+    
+    
+     
+    
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/eprimerparser.pyc
b
Binary file uniqprimer-0.5.0/primertools/eprimerparser.pyc has changed
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/excludefilemanager.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/primertools/excludefilemanager.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,75 @@
+'''
+Created on Jan 16, 2011
+
+@author: jlh
+'''
+import utils
+import fastaparser
+from Bio import SeqIO
+import os
+
+class ExcludeFileManager( object ):
+    '''
+    A class to manage fasta files to be excluded
+    '''
+
+    def __init__( self ):
+        """
+        Initialize the ExcludeFileManager
+        """
+        self.excludeFiles = [ ]
+        self.outputFile = ""
+    
+    def getOutputFileName( self ):
+        """
+         get the name of the file combined-sequence fasta file
+        """
+        return self.outputFile
+    
+    def addExcludeFile( self,  excludeFile ):
+        """
+        add a file to be managed by the ExcludeFileManager
+        """
+        
+        if os.path.exists( excludeFile ) == False:
+            utils.logMessage( "ExcludeFileManager::addExcludeFile( )", "exclude file not found: {0}".format( excludeFile ) )
+            raise utils.NoFileFoundException( excludeFile )
+        
+        utils.logMessage( "ExcludeFileManager::addExcludeFile( )", "adding exclude file {0}".format( excludeFile ) )
+        self.excludeFiles.append( excludeFile )
+    
+    def buildOutputFileName( self ):
+        """
+        build a unique file name to store the combined output sequences to
+        """
+        self.outputFile = utils.getTemporaryDirectory( ) + "/combined_exlude.ffn"
+        utils.logMessage( "ExcludeFileManager::buildOutputFileName( )", " exclude file: {0}".format( self.outputFile ) )
+    
+    def exportSequences( self ):
+        """
+        combine all exclude files into a single exclude file
+        """
+        
+        utils.logMessage( "ExcludeFileManager::exportSequences( )", "parsing exclude sequences")
+        
+        #read all exclude file sequences into memory
+        sequences = [ ]
+        for excludeFile in self.excludeFiles:
+            sequences.extend( fastaparser.parseFastaFile( excludeFile ) )
+        
+        utils.logMessage( "ExcludeFileManager::exportSequences( )", "finished parsing, writing to a common file"  )
+        
+        self.buildOutputFileName( )
+        #combine the sequences and write them to a file
+        
+        SeqIO.write( sequences, open( self.outputFile, "w" ), "fasta" )
+         
+        utils.logMessage( "ExcludeFileManager::exportSequences( )", "All sequences exported" )
+        
+        
+        
+        
+        
+    
+    
+        
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/excludefilemanager.pyc
b
Binary file uniqprimer-0.5.0/primertools/excludefilemanager.pyc has changed
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/fastaparser.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/primertools/fastaparser.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,63 @@
+'''
+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 utils
+import primersequence
+
+from Bio import SeqIO
+from Bio import Seq
+from Bio import Alphabet
+
+def parseFastaFileAsPrimerSequence( fileName ):
+    
+    utils.logMessage("fastaparser::parseFastaFileAsPrimerSequence( )", "parsing fasta file {0}".format( fileName ) )
+    returnValue = { }
+    
+    sequences = SeqIO.parse( open( fileName ), "fasta" )
+    
+    for sequence in sequences:
+        seqdata = primersequence.PrimerSequence( sequence.id, len( sequence ), sequence.seq )
+        returnValue[ sequence.id ] = seqdata
+    
+    utils.logMessage("fastaparser::parseFastaFileAsPrimerSequence( )", "read {0} sequences".format( len( returnValue.keys( ) ) ) )
+    
+    return returnValue
+    
+def parseFastaFile( fileName ):
+    '''
+    parse a fasta file and return a list of Bio.Seq
+    '''
+    utils.logMessage("fastaparser::parseFastaFile( )", "parsing fasta file {0}".format( fileName ) )
+    
+    sequences =  SeqIO.parse( open( fileName ), "fasta" )
+    
+    return sequences
+
+def writeFastaFile( sequences, fileName ):
+    '''
+    write a set of sequences to a fasta file.
+    returns the name of the new file
+    ''' 
+    
+    primerSequenceIdent = "primer_sequences"
+    utils.logMessage( "PrimerManager::writeFastaFile( )", "Writing {0} sequences to fasta file".format( len( sequences ) ) )
+    seqRecords = [ ]
+    i = 0
+    for sequence in sequences:
+        seqStr = str( reduce( lambda x, y: str( x )+str( y ), sequence) )
+        seqRecord = SeqIO.SeqRecord( Seq.Seq( seqStr, Alphabet.IUPAC.extended_dna ),  id="seq_{0}".format( i ) )
+        seqRecords.append( seqRecord )
+        i += 1
+
+    SeqIO.write( seqRecords, open( fileName, "w" ), "fasta" )
+        
+    utils.logMessage( "PrimerManager::writeFastaFile( )", "writing fasta file complete" )    
+    return fileName
+        
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/fastaparser.pyc
b
Binary file uniqprimer-0.5.0/primertools/fastaparser.pyc has changed
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/includefilemanager.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/primertools/includefilemanager.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,132 @@
+'''
+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 fastaparser
+import utils
+import os
+import programs
+import nucmerparser
+import copy
+
+class IncludeFileManager( object ):
+    """
+    A class to manage include files
+    """
+    #This class needs some work. Need to come up with a way to find unique sequences between all include files....
+
+    def __init__( self ):
+        """
+        Constructor
+        """
+        self.includeFiles = [ ]
+        self.nucmer = programs.Nucmer( )
+        self.isExcludeFileInitialized = False
+        self.isReferenceFileInitialized = False
+        self.referenceFile = None
+        self.referenceSequence = None
+        self.uniqueSequences = None
+          
+    def setExcludeFile( self, excludeFileName ):
+        """
+        A function to set the exclude file that will be used when nucmer is called
+        """
+        
+        utils.logMessage( "IncludeFileManager::setExcludeFile( )", "fileName {0}".format( excludeFileName ) )
+        self.excludeFileName = excludeFileName
+        self.isExcludeFileInitialized = True
+    
+  
+    def findUniqueSequencesInFile(self, doWantFile, doNotWantFile ):
+        utils.logMessage( "IncludeFileManager::findUniqueSequence( )", "running nucmer for reference file: {0}".format( doWantFile ) )
+        coordFile = self.nucmer.execute( [ doWantFile, doNotWantFile ] )
+        
+        matches = nucmerparser.parseCoordMatchFile( coordFile )
+        sequences = fastaparser.parseFastaFileAsPrimerSequence( doWantFile )
+        
+        for match in matches:
+            if sequences.has_key( match.seqID ):
+                primerData = sequences[ match.seqID ]
+                primerData.addMatch( match )
+            else:
+                print "Warning: id from .coords file not found in sequence data..."
+                utils.logMessage( "IncludeFileManager::processMatches( )", "WARNING - an ID was read in a Match that does not correspond to a sequence read from the fasta file!" )
+        
+        returnValue = [ ]
+    
+        for key in sequences.keys( ):
+            sequence = sequences[ key ]
+            subSequences = sequence.getNonMatchedSubSequences( )
+            returnValue.extend( subSequences )
+            
+        return returnValue
+        
+        
+    def findCommonSequencesInFile(self, want, alsoWant ):
+         utils.logMessage( "IncludeFileManager::findUniqueSequence( )", "running nucmer for reference file: {0}".format( want ) )
+         
+         print want, alsoWant
+         coordFile = self.nucmer.execute( [ want, alsoWant ] )
+         
+         matches = nucmerparser.parseCoordMatchFile( coordFile )
+         sequences = fastaparser.parseFastaFileAsPrimerSequence( want )
+         
+         for match in matches:
+             if sequences.has_key( match.seqID ):
+                 primerData = sequences[ match.seqID ]
+                 primerData.addMatch( match )
+         
+         returnValue = [ ]
+         for key in sequences:
+             sequence = sequences[ key ]
+             subSequences = sequence.getMatchedSubSequences( )
+             returnValue.extend( subSequences )
+             
+             
+         return returnValue
+         

+    def processIncludeFile( self, includeFileName ):
+        """
+        A function that adds and processes and include file.
+        An exclude file must be set for this function to be called.
+        """
+        
+        utils.logMessage( "IncludeFileManager::processIncludeFile( )", "processing {0}".format( includeFileName ) )
+        
+        if self.isExcludeFileInitialized == False:
+            utils.logMessage( "IncludeFileManager::processIncludeFile( )", "no exclude file set".format( includeFileName ) )
+            raise utils.ModuleNotInitializedException( "includefilemanager", "no exclude file set" )
+        
+        if self.isReferenceFileInitialized == False:
+            
+            utils.logMessage( "IncludeFileManager::processIncludeFile( )", "running nucmer for reference file: {0}".format( includeFileName ) )
+            self.uniqueSequences = self.findUniqueSequencesInFile( includeFileName, self.excludeFileName )
+            
+            self.referenceFile = includeFileName
+            self.isReferenceFileInitialized = True
+            
+        else:
+            #write the unique sequences to a temp file
+            tempSequences = utils.getTemporaryDirectory( ) + "/tempSequences.fasta"
+            fastaparser.writeFastaFile( self.uniqueSequences, tempSequences )
+            self.findCommonSequencesInFile( includeFileName, tempSequences )
+            self.includeFiles.append( includeFileName )
+            
+
+    def getUniqueSequences( self ):
+        """
+        getUniqueSequences - return a dictionary of all sequences that are found in include fasta files, but not the 
+        combined exclude fasta files. The dictionary is indexed by the file ID
+        """
+        
+        return self.uniqueSequences
+        
+        
+   
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/includefilemanager.pyc
b
Binary file uniqprimer-0.5.0/primertools/includefilemanager.pyc has changed
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/nucmerparser.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/primertools/nucmerparser.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,68 @@
+'''
+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 utils
+import os
+import re
+
+def parseCoordMatchLine( match ):
+      
+    match = match.replace( '\t', ' ' )
+    sections = match.split( '|', 4 )
+        
+    #parse the first section, containing the start and end
+    #locations of the match
+    firstsection = sections[ 0 ].strip( )
+    firstsectiontokens = re.split( ' +', firstsection )
+    start = int( firstsectiontokens[ 0 ].strip( ) )
+    end = int( firstsectiontokens[ 1 ].strip( ) )
+    
+    #parse the last section, containing the sequenceID
+    lastsection = sections[ -1 ].strip( )
+    lastsectiontokens = re.split( " +", lastsection )
+        
+    seqid = lastsectiontokens[ 0 ].strip( )
+    
+    return utils.Match( start, end, seqid )
+        
+def parseCoordMatchFile( coordFileName ):
+    '''
+    A method to parse the coord file.
+    returns a list of utils.match objects
+    '''
+    returnValue = [ ]
+    
+    #throw if the file doesn't exist
+    if os.path.exists( coordFileName ) == False:
+        raise utils.NoFileFoundException( coordFileName )
+    
+    
+    #read the nucmer file into memory
+    lines = open( coordFileName ).readlines( )
+    
+    #skip forward to the start of the matches. 
+    i = 0
+    while lines[ i ] [ 0] != '=':
+        i += 1
+    matchLines = lines[ i+1 : ]
+    
+    #parse each line for match start, end and sequenceID
+    for matchLine in matchLines:
+        returnValue.append( parseCoordMatchLine( matchLine ) )
+    
+    utils.logMessage( "NucmerParser::parseCoordMatchFile( )", "Parse {0}, finding {1} matches".format( coordFileName, len( returnValue ) ) )
+
+    return returnValue
+    
+        
+        
+        
+        
+        
+        
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/nucmerparser.pyc
b
Binary file uniqprimer-0.5.0/primertools/nucmerparser.pyc has changed
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/primermanager.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/primertools/primermanager.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,137 @@
+'''
+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 utils
+import tempfile
+import programs
+import eprimerparser
+import primersearchutils
+import fastaparser
+import exceptions
+
+
+
+
+class PrimerManager( object ):
+    '''
+    A class used to find primers given a set of sequences.
+    '''
+
+    def __init__( self, eprimerOptions ):
+        self.eprimer = programs.Eprimer( eprimerOptions )
+        self.primersearch = programs.PrimerSearch( )
+    
+                
+    def findPrimers( self, sequences, outputFile, primerpairs = 20, returnPrimers = False ):
+        '''
+        A method to find a set of primers based on the given sequences
+        '''
+        
+        utils.logMessage( "PrimerManager::findPrimer(s )", "writing sequences to a fasta file" )
+        
+        #eleminate all sequences that are lees than the desired amplification size...
+       
+        if len( sequences ) == 4 :
+            print sequences
+        sequences = filter( lambda x: len( x ) >= 200, sequences )
+        
+        primerFastaFile = utils.getTemporaryDirectory( ) + "/sequenceForEprimer.fasta"
+        fastaparser.writeFastaFile( sequences, primerFastaFile )
+
+        utils.logMessage( "PrimerManager::findPrimers( )", "executing eprimer3 program" )
+        self.eprimer.execute( [ primerFastaFile, outputFile ] )
+        utils.logMessage( "PrimerManager::findPrimer( )", "eprimer3 file {0} created. Parsing for primers.".format( outputFile ) )
+        
+        primers = eprimerparser.parsePrimerSequences( outputFile )
+        
+        utils.logMessage( "PrimerManager::findPrimers( )", "parsing for sequences complete" )
+        
+        if returnPrimers == True:
+            return primers
+        
+    
+    def getPrimers( self, sequences ):
+        
+        utils.logMessage( "PrimerManager::getCommonPrimers", "finding primers that are common to all include files" )
+            
+        if len( sequences ) == 0:
+            raise utils.NoPrimersExistException( )
+        
+        referenceEPrimerFile = utils.getTemporaryDirectory( ) + "/referenceprimers.ep3"
+        
+        #run eprimer to find primers in the reference file
+        primers = self.findPrimers( sequences, referenceEPrimerFile, 20, True )
+        
+        
+        if len( primers ) == 0:
+             raise utils.NoPrimersExistException( )
+        
+        return primers

+    def crossValidatePrimers2( self, primers, includeFile, j ):    
+        includeSequences = fastaparser.parseFastaFile( includeFile )
+        #write a primer search input file with using the primers argument
+        primerInputFileName = utils.getTemporaryDirectory( ) + "/tmpinputprimers2.ps" + str(j)
+        primerOutputFileName = utils.getTemporaryDirectory( ) + "/tmpoutputprimers2.ps" + str(j)
+        primersearchutils.writePrimerSearchInputFile( primers, primerInputFileName )
+
+        utils.logMessage( "PrimerManager::crossValidatePrimers", "finding primers that are in the supplied include file" )
+        #run primer search to identify the primers
+        self.primersearch.execute( [ includeFile, primerInputFileName, primerOutputFileName, "0" ] )
+
+        #read the found primers from the file
+        commonPrimers = primersearchutils.parsePrimerSearchFile( primerOutputFileName )
+
+        #compose a list of primers that are not found in the exclude file...
+        returnValue = [ ]
+
+        for primer in primers:
+            if primer.id in commonPrimers:
+                returnValue.append( primer )
+
+        utils.logMessage( "PrimerManager::crossValidatePrimers", "{0} unique primers identified out of {1}".format( len( returnValue ), len( primers ) ) )
+
+        if len( returnValue  ) == 0:
+            raise utils.NoPrimersExistException( )
+
+        return returnValue
+
+    
+    def crossValidatePrimers( self, primers, excludeFile ):             
+        
+        excludeSequences = fastaparser.parseFastaFile( excludeFile )
+        
+        #write a primer search input file with using the primers argument
+        primerInputFileName = utils.getTemporaryDirectory( ) + "/tmpinputprimers.ps"
+        primerOutputFileName = utils.getTemporaryDirectory( ) + "/tmpoutputprimers.ps"
+        primersearchutils.writePrimerSearchInputFile( primers, primerInputFileName )
+        
+        utils.logMessage( "PrimerManager::crossValidatePrimers", "finding primers that are not in the supplied exclude file" )
+        #run primer search to identify the primers
+        self.primersearch.execute( [ excludeFile, primerInputFileName, primerOutputFileName, "10" ] )
+        
+        #read the found primers from the file
+        commonPrimers = primersearchutils.parsePrimerSearchFile( primerOutputFileName )
+        
+        #compose a list of primers that are not found in the exclude file...
+        returnValue = [ ]
+        
+        for primer in primers:
+            if primer.id not in commonPrimers:
+                returnValue.append( primer )
+        
+        utils.logMessage( "PrimerManager::crossValidatePrimers", "{0} unique primers identified out of {1}".format( len( returnValue ), len( primers ) ) )
+        
+        if len( returnValue  ) == 0:
+            raise utils.NoPrimersExistException( )
+        
+        return returnValue
+    
+    
+    
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/primermanager.pyc
b
Binary file uniqprimer-0.5.0/primertools/primermanager.pyc has changed
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/primersearchutils.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/primertools/primersearchutils.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,55 @@
+'''
+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 utils
+
+def writePrimerSearchInputFile( primerSets, outputFile ):
+    '''
+    A function to write primer pairs to a file formatted as primer search input.
+    primerPairs - a list of utils.PrimerSet objects
+    outputFile - a string containing the path to the output file
+    '''
+    
+    file = open( outputFile, 'w' )
+    i = 0
+    for primerSet in primerSets:
+        i += 1
+        if primerSet.reversePrimer == "":
+            print "Error - primer {0} has no reverse primer. {1} primers total".format( i, len( primerSets ) )
+            continue
+        file.write( primerSet.id + "\t" + primerSet.forwardPrimer + "\t" + primerSet.reversePrimer + "\n" )
+        
+    file.close( )
+    
+def parsePrimerSearchFile( primerSearchFileName ):
+    '''
+    return a list of primer ids that are associated with at least one amplimer in the primer search output file.
+    '''
+    found = [ ]
+    
+    amplimerFound = False
+    currentId = -1;
+    for line in open( primerSearchFileName ).readlines( ):
+        
+        if "Primer name" in line:
+            #the id of the primer is found after the string "Primer name" in the file
+            currentId = line.split( ' ' )[ 2: ][ 0 ].strip( )
+        elif "Amplimer" in line and currentId not in found:
+            found.append( currentId )
+                
+    if amplimerFound == True:
+        found.append( currentId )   
+    
+    return found
+            
+            
+        
+        
+    
+    
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/primersearchutils.pyc
b
Binary file uniqprimer-0.5.0/primertools/primersearchutils.pyc has changed
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/primersequence.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/primertools/primersequence.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,110 @@
+'''
+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 utils
+
+class PrimerSequence( object ):
+    """
+    record sequence data, and store matched parts of the sequence 
+    """
+    
+    def __init__( self, seqID, seqLength, sequence ):
+        #an unmatched sub-sequence that starts at 0 goes until the end of the the sequence, to start out with.
+        
+        self.seqID = seqID
+        self.seqLength = seqLength
+        self.matchedSubSequences = [ ] 
+        self.sequence = sequence
+        
+    def addMatch( self, match ):
+        """
+        Input: a utils.Match object
+        Removes the matched sequence from the list of valid sequence data
+        """
+        
+        self.matchedSubSequences.append( ( match.start, match.end ) )
+    
+    def findNonMatchedIndices( self ):
+        
+        utils.logMessage("PrimerSequence::findValidIndices( )", "getting unmatched sequence indices" )
+
+        sequence = set( range( self.seqLength ) )
+        
+        #find the indices that are NOT excluded
+        utils.logMessage( "PrimerSequence::findValidIndices( )", "there are {0} excluded sequences for {1}".format( len( self.matchedSubSequences ), self.seqID ) )
+        for exclude in self.matchedSubSequences:
+            excludedSequence = set( range( exclude[ 0 ], exclude[ 1 ] )  )
+            utils.logMessage("PrimerSequence::findValidIndices( )", "removing exclude sequence {0} - {1}".format( exclude[ 0 ], exclude[ 1 ] ) )
+            sequence = sequence - excludedSequence
+
+        utils.logMessage("PrimerSequence::findValidIndices( )", "{0} unique indices".format( len( sequence ) ) )
+            
+        return list( sequence )
+    
+    def findNonMatchedIndexSequences( self, indices ):
+        
+        utils.logMessage("PrimerSequence::findValidIndexSequences( )", "getting sequences from unique indices" )
+        
+        sequences = [ ]
+        curSeq = [ ]
+        for index in indices:
+            if len( curSeq ) == 0:
+                curSeq.append( index )
+            elif index == curSeq[ -1 ] + 1:
+                curSeq.append( index )
+            else:
+                sequences.append( curSeq )
+                curSeq = [ ]
+        sequences.append( curSeq )        
+        utils.logMessage("PrimerSequence::findValidIndexSequences( )", "{0} sequences found".format( len( sequences ) ) )        
+        
+        return sequences
+    
+    
+    def getNonMatchedSubSequences( self, minLength = 100 ):
+        """
+        Get all valid sub sequences after removing matches
+        """        
+
+        utils.logMessage("PrimerSequence::getNonMatchedSubSequences( )", "finding valid sub sequences for {0}".format( self.seqID ) )
+
+        indices = self.findNonMatchedIndices( ) 
+        indexSequences = self.findNonMatchedIndexSequences( indices )
+        
+        subSequences = [ ]
+        
+        for indexSequence in indexSequences:
+            subSequence = [ self.sequence[ i ] for i in indexSequence ]
+            
+            if len( subSequence ) >= minLength:
+                subSequences.append( subSequence )
+        
+        return subSequences
+    
+    def getMatchedSubSequences( self, minLength = 100 ):
+        utils.logMessage("PrimerSequence::getMatchedSubSequences( )", "finding valid sub sequences for {0}".format( self.seqID ) )
+        
+        returnValue = [ ]
+        for match in self.matchedSubSequences:
+            subSequence = self.sequence[ match[ 0 ]:match[ 1 ] ]
+            
+            if len( subSequence ) >= minLength :
+                returnValue.append( subSequence )
+            
+        return returnValue
+            
+                
+         
+        
+        
+        
+        
+        
+        
+    
\ No newline at end of file
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/primersequence.pyc
b
Binary file uniqprimer-0.5.0/primertools/primersequence.pyc has changed
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/programs.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/primertools/programs.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,141 @@
+'''
+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 utils
+import os
+import subprocess
+
+
+class ProgramBase( object ):
+    
+    def __init__( self ):
+    
+        self.programName = None
+        self.proc = None
+    
+    def getProcessArgs( self, args ):
+        crash #abstract
+        
+    def execute( self, args, async = False ):
+        '''
+        run the nucmer program with a given compare file and an exclude file
+        '''
+        
+        utils.logMessage( "ProgramBase::Execute( )", "Running the {0} program.".format( self.programName ) )
+        
+        args, outputFile = self.getProcessArgs( args )
+        
+        print "*** Running {0} ***".format( self.programName )
+        
+        utils.logList( "ProgramBase::Execute( )", args )
+        
+        proc = subprocess.Popen( args )
+        
+        if async == False:
+            #wait for the nucmer instance to finish
+            proc.wait( )
+            print "*** Running {0} Complete ***".format( self.programName )
+        
+        #return the name of the coords file
+        return outputFile
+    
+    def isFinished( self ):
+        ifIsFinished 
+        
+class Nucmer( ProgramBase ):
+    
+    def __init__( self ):
+        #if we can't find the nucemer binary, throw
+        nucmerPath = utils.search_file( 'nucmer' )
+        ProgramBase.__init__( self )
+        if nucmerPath is None:
+            raise utils.ProgramNotFoundException( 'nucmer', "Please ensure that the MUMmer package is installed and configured on your system." )
+        
+        self.nucmer = nucmerPath
+
+        self.programName = "nucmer"
+        self.outputExtension = ".coords"
+        
+        
+    def getProcessArgs( self, inputArgs ):
+        
+        
+        time = utils.getTimeStamp( )
+        
+        identifier =  "nucmer_alignments"
+        args = [ self.nucmer, '-p', identifier, '-o', '--minmatch', '300', '--maxgap', '1' ]
+        
+        args.extend( inputArgs )
+    
+        outputFile = "{0}.coords".format( identifier )
+        
+        return args, outputFile
+
+class Eprimer( ProgramBase ):
+    
+    def __init__( self, eprimerOptions ):
+            
+        self.programName = "EPrimer3"
+        self.options = eprimerOptions
+        
+        primer3corePath = utils.search_file( "primer3_core" )
+        if primer3corePath is None:
+            raise utils.ProgramNotFoundException( "primer3_core", "Please ensure that the primer3 package is installed on your system. It can be obtained from http://primer3.sourceforge.net/" )
+        
+        eprimerPath = utils.search_file( "eprimer3" )
+        if eprimerPath is None:
+            raise utils.ProgramNotFoundException( 'eprimer3', "Please ensure that the EMBOSS package is installed and configured on your system." )
+        
+        self.primer3core = primer3corePath
+        self.eprimer3 = eprimerPath
+        
+    def getProcessArgs( self, inputArgs ):
+
+        #todo - allow user to determine output file location/name
+        
+        inputFasta = inputArgs[ 0 ]
+        outputFile = inputArgs[ 1 ]
+        args = [ self.eprimer3, inputFasta, outputFile, '-numreturn', '2', '-prange', self.options.getProductRange( ), '-osize', str( self.options.getPrimerSize( ) ),
+                '-minsize', str( self.options.getMinPrimerSize( ) ), '-maxsize', str( self.options.getMaxPrimerSize( ) )]
+        
+        return args, outputFile
+    
+class PrimerSearch( ProgramBase ):
+    def __init__( self ):    
+
+        self.programName = "PrimerSearch"
+        primerSearchPath = utils.search_file( "primersearch" )
+        if primerSearchPath is None:
+            raise utils.ProgramNotFoundException( "primersearch", "Please ensure that the EMBOSS package is installed on your system." )
+    
+        self.primerSearch = primerSearchPath
+        
+    def getProcessArgs( self, inputArgs ):
+        '''
+        usage for this program: inputArgs is an array length 4
+        inputArgs[0] = sequence file
+        inputArgs[1] = primer pairs file
+        inputArgs[2] = output file name
+        inputArgs[3] = percent mismatch
+        '''
+        
+        args = [ self.primerSearch ]
+        args.extend( [ '-seqall', inputArgs[ 0 ] ] ) 
+        args.extend( [ '-infile', inputArgs[ 1 ] ] )
+        args.extend( [ '-mismatchpercent', inputArgs[ 3 ] ] )
+        args.extend( [ '-outfile', inputArgs[ 2 ] ] ) 
+    
+    
+        return args, inputArgs[ 2 ]
+    
+    
+    
+    
+        
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/programs.pyc
b
Binary file uniqprimer-0.5.0/primertools/programs.pyc has changed
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/utils.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/primertools/utils.py Mon Jan 03 09:56:55 2022 +0000
b
@@ -0,0 +1,207 @@
+'''
+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 time
+import os.path
+from os import pathsep
+from string import split
+import tempfile
+import shutil
+
+def getTimeStamp( ):
+    return time.strftime('%d%m%Y-%H%M%S')
+
+
+class Match( object ):
+    '''
+    record where two genomes line up. stores only alignments for one part of the genome
+    '''
+    def __init__( self, start, end, seqID ):
+        self.seqID = seqID
+        self.start = start
+        self.end = end
+    
+    def __repr__( self ):
+        return "Start: {0}, End:{1}, SeqID:{2}".format( self.start, self.end, self.seqID )
+    
+class PrimerSet( object ):
+    
+    def __init__( self, id ):
+        self.id = id
+        self.productSize = 0
+        self.forwardPrimer = ""
+        self.forwardMeltTemp = ""
+        self.reversePrimer = ""
+        self.reverseMeltTemp = ""
+        
+        
+    def setProductSize( self, productSize):
+        self.productSize = productSize
+        
+    def setForwardPrimerData( self, sequence, temp ):
+        self.forwardPrimer = sequence
+        self.forwardMeltTemp = temp
+        
+    def setReversePrimerData( self, sequence, temp):
+        self.reversePrimer = sequence
+        self.reverseMeltTemp = temp
+    
+
+#search function from http://code.activestate.com/recipes/52224-find-a-file-given-a-search-path/
+def search_file( filename ):
+    """ find file
+    """
+    search_path = os.getenv( 'PATH' )
+    logMessage( "utils::search_file", "Path: {0}".format( search_path ) )
+    file_found = 0
+    paths = split( search_path, pathsep )
+    for path in paths:
+        if os.path.exists( os.path.join( path, filename ) ):
+            file_found = 1
+            break
+    if file_found:
+        return os.path.abspath( os.path.join( path, filename ) )
+    else:
+        return None
+
+tempDir = ""
+removeTemp = True
+
+verbose = False
+
+
+def initialize( isVerbose, cleanup, lf): ##Mau: added lf
+    global removeTemp
+    global tempDir
+    global verbose
+    global logFile ##Mau: added  logFile variable
+
+    logFile = lf #:Mau add line
+    
+    verbose = isVerbose
+    tempDir = tempfile.mkdtemp( dir="" )
+    initializeLogging()
+    removeTemp = cleanup
+    logMessage( "utils::Initialize( )", "Initialization complete. Temporary directory: {0}".format( tempDir ) )
+    
+logFile = None
+
+
+def printProgressMessage( message ):
+    global verbose
+    if verbose == True:
+        print message
+
+def getTemporaryDirectory( ):
+    global tempDir
+    return tempDir
+
+def initializeLogging():
+    global logFile
+    #logFileName = "uniqprimer_{0}.log".format( getTimeStamp( ) )
+    #logFileName = "log_uniqprimer.txt"  ##Mau: commented out 
+    logFileName = logFile ##Mau: changed
+    logFile = open( logFileName, 'w' )
+    
+def shutdown( ):
+    global removeTemp
+    global tempDir
+    shutdownLogging( )
+    if removeTemp == True:
+        print "*** Removing temporary directory ***"
+        shutil.rmtree( tempDir )
+    
+def shutdownLogging( ):
+    global logFile
+    if logFile != None:
+        logFile.close( )
+
+def logList( method, list ):
+    
+    message = reduce( lambda x,y: str( x ) + " " + str( y ) , list )
+    logMessage(method, message)
+    
+    
+def logMessage( method, message ):
+    global logFile
+    if logFile == None:
+        return
+    log = "{0} - {1}".format( method, message )
+    
+    logFile.write( log + "\n" )
+    logFile.flush( )
+
+class EPrimerOptions( object ):
+    
+    def __init__( self ):
+        
+        self.minPrimerSize = 18
+        self.maxPrimerSize = 27
+        self.primerSize = 20
+        self.productRange = "200-250"
+    
+    def setPrimerSize( self, size ):
+        
+        size = int( size )
+        if size > 35:
+            size = 35
+        
+        self.primerSize = size
+        if self.primerSize < self.minPrimerSize:
+            self.maxPrimerSize = self.primerSize 
+        elif self.primerSize > self.maxPrimerSize:
+            self.maxPrimerSize = self.primerSize
+    
+    def getPrimerSize( self ):
+        return self.primerSize
+    
+    def setMinPrimerSize( self, minSize):
+        self.minPrimerSize = minSize
+    
+    def getMinPrimerSize( self  ):
+        return self.minPrimerSize
+
+    def setMaxPrimerSize( self, size ):
+        self.maxPrimerSize = size
+        
+    def getMaxPrimerSize( self ):
+        return self.maxPrimerSize
+    
+    def setProductRange( self, range ):
+        self.productRange = range
+        
+    def getProductRange( self ):
+        return self.productRange
+
+class NoPrimersExistException( exceptions.BaseException ):
+    
+    def __init__( self ):
+        exceptions.BaseException( self )
+
+class ProgramNotFoundException( exceptions.BaseException ):
+    
+    def __init__( self, programName, details ):
+        exceptions.BaseException.__init__(self)
+        self.programName = programName
+        self.details = details
+        
+class NoFileFoundException( exceptions.BaseException ):
+    
+    def __init__( self, filename ):
+        exceptions.BaseException.__init__(self)
+        self.filename = filename
+        
+        
+class ModuleNotInitializedException( exceptions.BaseException ):
+    
+    def __init__( self, moduleName, reason ):
+        self.moduleName = moduleName
+        self.reason = reason
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/primertools/utils.pyc
b
Binary file uniqprimer-0.5.0/primertools/utils.pyc has changed
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/seqForPrimer3.fa
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/seqForPrimer3.fa Mon Jan 03 09:56:55 2022 +0000
b
b'@@ -0,0 +1,2630 @@\n+>seq_0 <unknown description>\n+TGATTAGCCCTGACCTTCAGCTGCAGCACCTCCGCGCTTATCGCTAAACCGGCCCAATGC\n+CAGGCCGCCATGGGGCCCTGGCTGAAAGAACTTCGCACCGGCTCCTCGCGTCAGGAGCGC\n+CAAGATCAGACATCATGGAACACATCGGTAAAACGAAGCTATTTGCAGGACTGCAACAAA\n+AATCCAGCTGAGGGTCAGGGCTAATCAGTA\n+>seq_1 <unknown description>\n+AACCTGTTCACAATCTTATTCAAACCGTGCAAACTCCACGAATGCGCGAGAAGAACTATC\n+CAAGTGACGTGAGCCGTGAGCGGTTCGAGCAAATCCGCCCGATTCTGGAGCAAGCCCGCA\n+AGCGCACCAAGCCTGTGACAGTGGATATGTATGAGGTGTGGTGCGCAGTGCTGTATCTGC\n+TACGGACAGGTTGCCCGTGGCGTGCGTTGCCCAGTGATTTTCCGAAGTGGCGCACGGTGC\n+ATTCCTACTTTGCCAAGTGGAGCGAAGTGGACGATGGAGGAATAAGCCTGCTGGAGCGGG\n+CGCTTAAAAAATCAGGTTGGCGCGGCCCGCGAGAAACAGGGGCGCAAGGCCTGCAGCACG\n+TTCTTGATCGTGGACGCGCAGAGCGTGAAGAACAGTGATACAGCCGGTCAGAAAGGCTAT\n+GACGCGGGCAAGAAGGTATCGGGGATCAAGCGCCACATCGCGGTGGATACGCAAGGCTTT\n+CCACATGCCGTTGCGGTGACCACGGCGGAAGTCACCGATCGTCAAGGTGCGCTGGAGGCA\n+TTGAAACGCTGCCGATCGGGTTTAGGTCGGGTGAAACGCCTGCTGTGCGACAGCGGCTAC\n+ACCGGAGATCCCTTCGCCGAGGGCGTACAGGACATTCTGGGCAAGCATGTCACCGTACAG\n+ATTGCCAAGCGCAGCGAGCTGCATACCTTCAAGGTCATGCCCAAGCGCTAGAGTGTCGAA\n+CGCAGCTTTGCCTGGCTGGAGAAGAACCGGAGGCTATGGAAGAACTGCGAGCGAAGGCTC\n+AATACCAGCTTGCAGTTCATCTACCTGGCGTTCCTGGCACTGCTGCTCAGGAGATCGTGA\n+ACAGGTTCTAAGGGCGGTCGGCCCCGCACACGACCGATGCGCGATAGCGCACATGCGCCG\n+ATCTCGGTACATGAAGTCGCGCAGAGCTTGCCCGCAAGGACGTATCGGCAGGTCAGCTGG\n+CGCCAGGGCAGCGACGCCACGCTCAGTTCGCGGTTCGCGGCGGTGCGGGTTCGTGCCGCA\n+CACAATCGCCAGGCACATGACGAGCAGTGGCTGCTGATCGAGTGGCCGCCGGGAGAGTCC\n+GAGCCCCGCCACTACTGGTTCTCGACGCGACCAAAGCAAACGCCGGTCAAGACACTGGTT\n+GCCACGGCACAAGGCCGATGGCGGATTGAACGCGATTATCAGGAGCTGAAGTCGGAGTTG\n+GGCCTGCATCACTATGAAGGGCGCAACTGGCGTGGTTTTCACCATCACGCCAGTCTGTGC\n+ATCGCCGCATACGGGTTCTTGATGCGCGAGCGCCTGCGCAGTAAAAAAAACTCCGTCGCA\n+TTCAAGATGCCTGCAGTATCCAAAAGCGTCCGCCCGCGCGGGTCTGGCCCCAATGCAACG\n+TCACCATCCCAACTCGATTGCCACGCTGGCCTTCGGACTGGCTAGGCTTATCGCCAGAAG\n+CCTCCCACACTGCCCGTGTTGCGGGGTCTCACCGTACCAACGGATTTGTATTTAGTAACA\n+CAGTAGAAT\n+>seq_2 <unknown description>\n+CCTGATTAGCACGATCTTTCAGCACAGTCGCAGCCAGTGAGAGCCGACCGGTCGATGCTA\n+GGACCGTCGCTCCACCGAGACCAGATCATGGCCATGAATCGTGTGCAGTTCCAAGCCGGG\n+CTGTCGTTGCCGGCGTTCCTCAAGCGCTATGGCAACGCGCAGCAGTGCGAGCAGGCGTTG\n+GAGATCTCGCGCTGGCCACAGGGCTTTGTTTGTCCGCGTTGCGCCGCTACCGCGCACAGT\n+CGATTCCAGCGTCACGGCACCACGTACTGGCAGTGCACGGCCTGCTATCGCCAGACCAGC\n+CTGCGCTCGGGCACGGTGATGGACAACAGCAAGCTGCCGCTACGCACCTGGCTGCTTGGC\n+ATGTATCTGCTGGGCCAGAGCAAGACGAACCTGTCGGCGCTGGAGTTGATGCGACACCTG\n+GGATTGAGCTACCCGACAGCGTGGCCAATGAAGCACAAGCTGATGCAGGCCATGACCCAA\n+CGCGAGGCGAACCGCAAGTTGGGCGGGATCGTGCAACTGGACGATGCCTACCTGGGCGGA\n+GAACGCAACGGTGGCAAGGCCGGGCGCGGCTCGGAGAACAAGCGCCCTTTCGTGATCGCC\n+GTGGAGACCACTGAAGACGGTCGTCCATTGCGCGCGGTGATGGATCCGGTCCCAGGCTTC\n+ACCAAGGCGGCGCTGTCGGAATGGATCGGGCAACGCCTGCATCCTGGAGCAGATGTCTAC\n+AGTGATGGACTCGGTGCGTTTCGAGCACTGGAAGCCGAGCACGCGCACACGGTGATCGAA\n+GGCAGCGGTCGAAGTCGCTGCGAGGCAGAGAACGCACGCTGGGTCAACGTGGTGTTGTCC\n+AACCTAAAGCGTTCGCTGGACGGTGCCTATCACGCCTTCAAATTCGCCAAATACGCCCAG\n+CGCTACCTGGCAGAGACGATGTGGCGGTTCAACCGCCGTTTCGATCTGACCCGGCTGGTG\n+CCCAGCTTGCTGGCCGCCGCAGCCGCCAGCAAGCCGTGGTCCGAGCGGGCCCTGCGTGAT\n+GTCACCATGTTCACCGCTGAAAGTGCGTGCTAATCAGGG\n+>seq_3 <unknown description>\n+CCTGATTAGCCCCATCCTTCAGCCATGGAAGTTGCTTGCCATACGCAAAACGCGCTCTGG\n+GCAAGGTGTGCAGCGCAGCAGTGCCGTCGCCAGCCGCGGCAGCATCTGTTTCAGGTCGAA\n+TCGGCGGTTGAAGCGATAGGCCGCCTCGGCCAGGTAGCGCCTTGCATACTTGGCCTGGCC\n+CACCGCATGGTAGGTCCCGCTGATGGCGCGTTTGACATTGCCCAGCACCACATTCAACCA\n+ACGTGCTCCCTGGACGTCGGTTGCAGCACGACCGCCACCGGTATCGAGCGTGGTGTGGGC\n+ATGCCCGGCCTCCTCCAGACGGCGAAAGCATGCCAGGCCGTCGCTATAGACCTCACACTC\n+CGGCTCCAGACGGCGCGCGATCCAGTCCTCCAGCGAGGCGTTGTCAAAGGCCTTCACCGG\n+CTCGATCACCGCAAAGACGGGGTGTTCGTGGGTGTGGTCCACT\n+>seq_4 <unknown description>\n+GCACCGCGATCACGAACGGCTGTTTGTTCTCCGAACCTCGTCCGCGCTTGCCGCCGCTGC\n+GCTCACCGCCCAGATACGCGTCATCGATCTGCACGAATCCCTTGAGTTTTCGCGGTTCTT\n+CGCGCTCGGTCATCGCCTGCATGATCTTGTGCTTCATGCGCCAGGCCGCCTTGTAGGTCA\n+CCCCAAGATGCCGCTTCAACTCCAGTGCTGCCAGG\n+>seq_5 <unknown description>\n+TGGTCTTGCTGGAGGTCAACAGGTACATCGCCTGCATCCACAGGCGCAAAGACAGCTTGC\n+TCGATTGCAACAGCGTGCCGGCACGCAAGGTGGTTTGATGCCGGCACGCCCGGCATTGGT\n+AGTACACCTGATCATCGCGTCGAAAGCGCGAGCGCGCGCGACCGTCGCACTGCGGGCAGC\n+GAAATCCCTTCGGCCAGCGCCACCGATACAACGCCCG'..b'\n+ATTCCTACTTTGCCAAGTGGAGCGAAGTGGACGATGAAGGAATGAGCCTGCTGGAGCGGG\n+CGCTTAAAAAATCAGGTTGGCGCGGCCCGCGAGAAACAGGGGCGCAAGGCCTGCAGTACG\n+TTCTTGATCGTGGACGCGCAGAGCGTGAAGAACAGTGATACAGCCGGCCAGAAAGGCTAT\n+GACGCGGGCAAGAAGGTATCGGGGATCAAGCGCCACATCGCGGTGGATACGCAAGGCTTT\n+CCACATGCCGTTGCGGTGACCA\n+>seq_141 <unknown description>\n+AGGTGCGCTGGAGGCATTGAAACGCTGCCGATCGGGTTTAGGTCGGGTGAAACGCCTGCT\n+GTGCGACAGCGGCTACACCGGAGATCCCTTCGCCGAGGGCGTACAGGACATTCTGGGCAA\n+GCATGTCACCGTACAGATTGCCAAGCGCAGCGAGCTGCATACCTTCAAGGTCATGCCCAA\n+GCGCTGGATTGTCGAACGCAGCTTTGCCTGGCTGGAGAAGAACCGGAGGCTATGGAAGAA\n+CTGCGAGCGAAGGCTCAATACCAGCTTGCAGTTCATCCACCTGGCGTTCCTGGCACTGCT\n+GCTCAGGAGATCGTGAACAGGTTCTTAGAGCGGCTAAACAACGTAGCGAGCAACTGCGAC\n+GTGGGTGCGGACGGCGGGCGGGAACCGGAGTGTACGAGCACCACATGCCGCACCGAGTAA\n+CGGCCACGCCCGCCTGACGGCTGCGCAGTAGTTTGTTAGCTGCTCTCAGCCGATCCGCTC\n+GATGCCGCCCATGTAAGGACGCAGCACCTGCGGCACATCGATCGACCCATCGGCGTTCTG\n+GTAGTTCTCCATCACCGCGATCATCGCGCGGCCCACAGCAGTGCCGGAGCCGTTGAGCGT\n+GTGCAGCAGTTCCAGCTTGCCGCTGACCGGGTTGCGCCAGCGCGCCTGCATGCGCCGCGC\n+CTGGAAATCGCCGCAATTGGAGCACGACGAAATTTCGCGATAAGTGTTCTGCGACGGCAA\n+CCAGACCTCCAGATCGTAGGTCTTGATCGCGGAAAAACCCATATCTCCCGTGCACAGCAA\n+CACCTTGCGATACGGCAGGCCGAGTTGCTCCAACACCACTTCGGCGCAACGCGTCATGCG\n+CTGATGTTCGGCGTCGCTGTCTTCCGGCGCGCAGGCAGTGACCAGCTCCACTTTTTCGA\n+>seq_142 <unknown description>\n+ACATGATCCTTAACCGGGAAATCGAACTGGCGCGGCGTGCCCCAACGCGATTGCTCGACG\n+TTGTCAGCCTCACTTTTCCCAAGAGGCACGTCTGCATGCGGCAGGTTGGGAATTACCGCG\n+TAAATCTTTTCCAACTCGTGCTGAACGACCGTCAGTCTGCCATGAGAGTGCAAAAGTTCA\n+TCGCCGACACCGGCCACCTCGG\n+>seq_143 <unknown description>\n+CGGTGGCCGGCAGCACGGACATCCCATTCGAGTTCAAACCTGCGCAGTAAGCGCGGCGAA\n+ACCCTCTTGTACTGCTGCCCGCGCCAGCACGCGCGGACGCCCGAGTCAGGTGTCACCGGC\n+CTCAGCCAACGCTGCGTAGCCACAAACACCATGCAGATTAACCGCGCCGCAATGTCAGCT\n+TGACTAAGCTGAACCTCCAAGAAGCTCTAGCGTCGCTGTTGCGCGCTGCCTTAGCTCTCC\n+CTCAGGTACCGCCGACCAGACTGGCCCCGTCATCCCGCAGATGCGCCAGGAGGCCGGCCA\n+TGTCCTTCATTTCGAATCCCTCATCCGCCCATCCGTCATCGCTACCTCAACAGGGCAAGC\n+GCGCGTTGGAGCGGCAGCAGAACGAGCACAGCGACGGCGCTTCACCCTGGCTGTGGGCGA\n+CGCCGATTGTGTTGTTGATCGTGGTTCCGAGTTGGTGGTGGGCACGTCATAGCGACGAAT\n+CCT\n+>seq_144 <unknown description>\n+TCGGCATGAGCGCCAGTGCGCTGCGCTATCGCCCGCGCGAGGACCGCAACGTTGAGCTGC\n+GCGAGCACAGTGTTGCGTTGGCGCATCGCCATCGCCGCTACGGCGTGGGGATGATCTCTC\n+TCAAGCTGCGGCAGGAAGGGCGTCTCGTGAACTATAAGCGGGTGGAGCGGTTGTATCGCC\n+AGCAGCAGCTACAAGTCCGGCGCCGCAAGCGCAAGAAGGTACCGGTTGGCGAGCGTCAGC\n+CGATGCTGCGGCCCACCAAGGCCAACCCGGTGTGGTCGATGGACGTCGTGTTCGACCGCA\n+CCGCCGAAGGTCGGGCGATCAAGTCTCTGGTGATCGTGGACGACGCGACACACCAGGCAG\n+TCGCCATCGACGTGGAACGCGCCATCTCCGGCCACGGGGTAGCACGCGTGCTGGATCGGT\n+TGGCACACAGTCGTGGCCTGCCGAAGGTGATTCGCACGGACAACGGCAAGGAGTTCTGTG\n+GCAAGGCC\n+>seq_145 <unknown description>\n+TGGTCGCCTGGGCGCATGCCAATCGTGTGCAGCTACGCCAGATCCAGCCTGGCAAGCCGA\n+ACCAGAATGCCTATGTCGAATCCTTCAACGGCCGGCTACGCGACGAATGCCTCAACGAAC\n+ATGGGTTCCCAACGCTGCTGCATGCGCGCACCGAGATCGAACGCTGGCGCCGCGAATACA\n+ACCAACACCGCCCAAAGAAAGCAATCGGCGCAATGACGCCGGCAACGTATGCCCAGCAGT\n+TGGCCAATAGCGAGATCATCAACCCCGGACTCTAAACCCGACTGCTACTCAGGATGGGGG\n+GACGTCGATCGCACGGCAAGCAGGTCTGGAACACCGCCTCGCCGGTGAAGAACTGCCAGT\n+ACGGATTTTCCAGCCAGCGCTCGCAGACCGCCTCGTCGGACA\n+>seq_146 <unknown description>\n+GTGTCCGCATGGGCGAAAACTGCCAGAAACTTAGTTTCACTGTGTTACAAATAATCGTAC\n+CTTTGTGCCACTATTGGAAGACCTTCAGGCCGCGCGGGAGAGCTGTGTTGAATAGGACAC\n+TGGAAGTGCGTTTTGAACAGTACGGGGAAGTAGTTGCTGCGGCCCTGTCCCATGCGGATC\n+GCAAACAGCCCGCACACTGGTACCTGAAGGGGTTGCTACTG\n+>seq_147 <unknown description>\n+GGCTTGGTGCGCTTGCGGGCTCCTGATTAGCACGATCTTTCAGCACAGTCGCAGCCAGTG\n+AGAGCCGACCGGTCGATGCTAGGACCGTCGCTCCACCGAGACCAGATCATGGCCATGAAT\n+CGTGTGCAGTTCCAAGCCGGGCTGTCGTTGCCGGCGTTCCTCAAGCGCTATGGCAACGCG\n+CAGCAGTGCGAGCAGGCGTTGGAGATCTCGCGCTGGCCACAGGGCTTTGTTTGTCCGCGT\n+TGCGCCGCTACCGCGCACAGTCGATTCCAGCGTCACGGCACCACGTACTGGCAGTGCACG\n+GCCTGCTATCGCCAGACCAGCCTGCGCTCGGGCACGGTGATGGACAACAGCAAGCTGCCG\n+>seq_148 <unknown description>\n+CACATCGTCTGGAATCAGTGCCCTGAGCTGCTGCAAAAAGCGTTTCTCCGCGCCTGGCGA\n+TCCCTGCTGTTTCCCGGAAACCACCATATCCAGCAAGGTGAGCGTGCGTCCACCGACCGG\n+CACGGCTGCGCGCAGCAGACACCACGACTTGTCCGGCTTCAAATCGCTCCAGTCGATGAC\n+GATCACCGGCTGGTCGCCGCGCAGTAGCCAATGCGCCATGTCCTGCTCGATGGCTGATCG\n+CTCGACCTGCAACGCGCGATTGCATAGCAGGCGGTCACATGCCTTGAGGGGCGCACG\n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/setup.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/setup.py Mon Jan 03 09:56:55 2022 +0000
[
@@ -0,0 +1,22 @@
+from distutils.core import setup
+import distutils.command.install
+import os
+
+class create_link(distutils.core.Command):
+    
+    def run( self ):
+        #create a sym link to uniqprimer.py inside of /usr/local/bin
+       os.symlink(  ) 
+        
+
+setup( name='uniqprimer',
+       description='A Python tool for finding primers unique to a given genome',
+       author='John Herndon',
+       author_email='johnlherndon@gmail.com',
+       version='0.5.0',
+       packages=[ 'primertools' ],
+       scripts=[ 'uniqprimer.py' ],
+       data_files=[ ( '/usr/local/bin', [ 'uniqprimer.py' ] ) ] 
+       
+       )
+
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/stdout
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/stdout Mon Jan 03 09:56:55 2022 +0000
b
b'@@ -0,0 +1,504 @@\n+1: PREPARING DATA\n+2,3: RUNNING mummer AND CREATING CLUSTERS\n+# reading input file "nucmer_alignments.ntref" of length 4831747\n+# construct suffix tree for sequence of length 4831747\n+# (maximum reference length is 536870908)\n+# (maximum query length is 4294967295)\n+# process 48317 characters per dot\n+#....................................................................................................\n+# CONSTRUCTIONTIME /usr/local/bioinfo/MUMmer/3.23/mummer nucmer_alignments.ntref 1.55\n+# reading input file "/homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqprimer/uniqprimer-0.5.0/tmpgd6MOr/combined_exlude.ffn" of length 4941439\n+# matching query-file "/homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqprimer/uniqprimer-0.5.0/tmpgd6MOr/combined_exlude.ffn"\n+# against subject-file "nucmer_alignments.ntref"\n+# COMPLETETIME /usr/local/bioinfo/MUMmer/3.23/mummer nucmer_alignments.ntref 4.99\n+# SPACE /usr/local/bioinfo/MUMmer/3.23/mummer nucmer_alignments.ntref 9.48\n+4: FINISHING DATA\n+5: GENERATING COORDS FILE\n+1: PREPARING DATA\n+2,3: RUNNING mummer AND CREATING CLUSTERS\n+# reading input file "nucmer_alignments.ntref" of length 5240076\n+# construct suffix tree for sequence of length 5240076\n+# (maximum reference length is 536870908)\n+# (maximum query length is 4294967295)\n+# process 52400 characters per dot\n+#....................................................................................................\n+# CONSTRUCTIONTIME /usr/local/bioinfo/MUMmer/3.23/mummer nucmer_alignments.ntref 1.58\n+# reading input file "/homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqprimer/uniqprimer-0.5.0/tmpgd6MOr/tempSequences.fasta" of length 366574\n+# matching query-file "/homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqprimer/uniqprimer-0.5.0/tmpgd6MOr/tempSequences.fasta"\n+# against subject-file "nucmer_alignments.ntref"\n+# COMPLETETIME /usr/local/bioinfo/MUMmer/3.23/mummer nucmer_alignments.ntref 1.83\n+# SPACE /usr/local/bioinfo/MUMmer/3.23/mummer nucmer_alignments.ntref 5.47\n+4: FINISHING DATA\n+5: GENERATING COORDS FILE\n+Pick PCR primers and hybridization oligos\n+Search DNA sequences for matches with primer pairs\n+Search DNA sequences for matches with primer pairs\n+Search DNA sequences for matches with primer pairs\n+*** Finding Primers ***\n+*** Creating Combined Fasta File for Exclude Files ***\n+*** Finding Sequences Unique to Target Genome ***\n+*** Running nucmer ***\n+*** Running nucmer Complete ***\n+data/PX099A.fa tmpgd6MOr/tempSequences.fasta\n+*** Running nucmer ***\n+*** Running nucmer Complete ***\n+*** Finding Primers ***\n+*** Running EPrimer3 ***\n+*** Running EPrimer3 Complete ***\n+*** Cross Validating Primers ***\n+*** Running PrimerSearch ***\n+*** Running PrimerSearch Complete ***\n+*** Running PrimerSearch ***\n+*** Running PrimerSearch Complete ***\n+*** Running PrimerSearch ***\n+*** Running PrimerSearch Complete ***\n+*** Time Elapsed: 7 minutes, 25 seconds ***\n+*** Output Written to primers.txt ***\n+*** Finished ***\n+1: PREPARING DATA\n+2,3: RUNNING mummer AND CREATING CLUSTERS\n+# reading input file "nucmer_alignments.ntref" of length 5240076\n+# construct suffix tree for sequence of length 5240076\n+# (maximum reference length is 536870908)\n+# (maximum query length is 4294967295)\n+# process 52400 characters per dot\n+#....................................................................................................\n+# CONSTRUCTIONTIME /usr/local/bioinfo/MUMmer/3.23/mummer nucmer_alignments.ntref 1.94\n+# reading input file "/homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqprimer/uniqprimer-0.5.0/tmpzf5wS8/combined_exlude.ffn" of length 4941439\n+# matching query-file "/homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqpri'..b'+Search DNA sequences for matches with primer pairs\n+Search DNA sequences for matches with primer pairs\n+Search DNA sequences for matches with primer pairs\n+*** Finding Primers ***\n+*** Creating Combined Fasta File for Exclude Files ***\n+*** Finding Sequences Unique to Target Genome ***\n+*** Running nucmer ***\n+*** Running nucmer Complete ***\n+data/Xoc_BLS256.fasta tmpPHilD4/tempSequences.fasta\n+*** Running nucmer ***\n+*** Running nucmer Complete ***\n+*** Finding Primers ***\n+*** Running EPrimer3 ***\n+*** Running EPrimer3 Complete ***\n+*** Cross Validating Primers ***\n+*** Running PrimerSearch ***\n+*** Running PrimerSearch Complete ***\n+*** Running PrimerSearch ***\n+*** Running PrimerSearch Complete ***\n+*** Running PrimerSearch ***\n+*** Running PrimerSearch Complete ***\n+Failure: No unique primers exist for this combination\n+*** Finished ***\n+1: PREPARING DATA\n+2,3: RUNNING mummer AND CREATING CLUSTERS\n+# reading input file "nucmer_alignments.ntref" of length 5240076\n+# construct suffix tree for sequence of length 5240076\n+# (maximum reference length is 536870908)\n+# (maximum query length is 4294967295)\n+# process 52400 characters per dot\n+#....................................................................................................\n+# CONSTRUCTIONTIME /usr/local/bioinfo/MUMmer/3.23/mummer nucmer_alignments.ntref 1.13\n+# reading input file "/homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqprimer/uniqprimer-0.5.0/tmpz0OJOq/combined_exlude.ffn" of length 9773186\n+# matching query-file "/homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqprimer/uniqprimer-0.5.0/tmpz0OJOq/combined_exlude.ffn"\n+# against subject-file "nucmer_alignments.ntref"\n+# COMPLETETIME /usr/local/bioinfo/MUMmer/3.23/mummer nucmer_alignments.ntref 6.27\n+# SPACE /usr/local/bioinfo/MUMmer/3.23/mummer nucmer_alignments.ntref 14.56\n+4: FINISHING DATA\n+5: GENERATING COORDS FILE\n+1: PREPARING DATA\n+2,3: RUNNING mummer AND CREATING CLUSTERS\n+# reading input file "nucmer_alignments.ntref" of length 4831747\n+# construct suffix tree for sequence of length 4831747\n+# (maximum reference length is 536870908)\n+# (maximum query length is 4294967295)\n+# process 48317 characters per dot\n+#....................................................................................................\n+# CONSTRUCTIONTIME /usr/local/bioinfo/MUMmer/3.23/mummer nucmer_alignments.ntref 1.24\n+# reading input file "/homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqprimer/uniqprimer-0.5.0/tmpz0OJOq/tempSequences.fasta" of length 169503\n+# matching query-file "/homedir/galaxy/shed_tools/galaxy.southgreen.fr/toolshed/repos/dereeper/uniqprimer/631882b4244e/uniqprimer/uniqprimer-0.5.0/tmpz0OJOq/tempSequences.fasta"\n+# against subject-file "nucmer_alignments.ntref"\n+# COMPLETETIME /usr/local/bioinfo/MUMmer/3.23/mummer nucmer_alignments.ntref 1.33\n+# SPACE /usr/local/bioinfo/MUMmer/3.23/mummer nucmer_alignments.ntref 4.86\n+4: FINISHING DATA\n+5: GENERATING COORDS FILE\n+Pick PCR primers and hybridization oligos\n+Search DNA sequences for matches with primer pairs\n+Search DNA sequences for matches with primer pairs\n+Search DNA sequences for matches with primer pairs\n+*** Finding Primers ***\n+*** Creating Combined Fasta File for Exclude Files ***\n+*** Finding Sequences Unique to Target Genome ***\n+*** Running nucmer ***\n+*** Running nucmer Complete ***\n+data/Xoc_BLS256.fasta tmpz0OJOq/tempSequences.fasta\n+*** Running nucmer ***\n+*** Running nucmer Complete ***\n+*** Finding Primers ***\n+*** Running EPrimer3 ***\n+*** Running EPrimer3 Complete ***\n+*** Cross Validating Primers ***\n+*** Running PrimerSearch ***\n+*** Running PrimerSearch Complete ***\n+*** Running PrimerSearch ***\n+*** Running PrimerSearch Complete ***\n+*** Running PrimerSearch ***\n+*** Running PrimerSearch Complete ***\n+Failure: No unique primers exist for this combination\n+*** Finished ***\n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/uniqprimer.py
--- /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
[
b'@@ -0,0 +1,256 @@\n+#!/usr/bin/python\n+\n+\'\'\'\n+Created on Jan 1, 2011\n+\n+@author: John L. Herndon\n+@contact: herndon@cs.colostate.edu\n+@organization: Colorado State University\n+@group: Computer Science Department, Asa Ben-Hur\'s laboratory \n+\'\'\'\n+\n+import exceptions\n+import sys\n+import time\n+import os ## added by Alexis\n+\n+sys.path.append("/gs7k1/home/galaxy/galaxy_env/lib/python2.7/site-packages")\n+\n+import getopt\n+from primertools import *\n+\n+version="0.5.0"\n+\n+\n+class UniqPrimerFinder( object ):\n+    \n+    def __init__( self, includeFiles, excludeFiles, crossValidate, eprimerOptions):\n+        \n+        utils.logMessage( "UniqPrimerFinder::__init__()", "Initializing UniqPrimerFinder" )\n+        self.includeFiles = includeFiles\n+        self.includeFileManager = includefilemanager.IncludeFileManager( )\n+        \n+        self.excludeFiles = excludeFiles\n+        self.excludeFileManager= excludefilemanager.ExcludeFileManager( )\n+        \n+        self.primerManager = primermanager.PrimerManager( eprimerOptions )\n+        \n+        self.crossValidate = crossValidate\n+\n+       \n+        utils.logMessage( "UniqPrimerFinder::__init__()", "Initializing UniqPrimerFinder - complete" )\n+    \n+    def writeOutputFile( self, primers, outputFileName, maxresults = 100 ):\n+        \'\'\'\n+        primers: a list of PrimerSet obs\n+        \'\'\'\n+        ##outputFileName = uPrimer ##Mau: defined this..\n+        outputFile = open( outputFileName, \'w\' )\n+        \n+        i = 0\n+        for primer in primers:\n+            i += 1\n+            \n+            outputFile.write( "{0}\\t{1}\\t{2}\\t{3}\\n".format( i, primer.forwardPrimer, primer.reversePrimer, primer.productSize ) )\n+            \n+            if i > maxresults:\n+                break\n+            \n+        utils.logMessage( "UniqPrimerFinder::writeOutputFile()", "output file written." )\n+            \n+    \n+    def findPrimers( self, outputFile = "uPrimer.txt" ):\n+\toutputFile = uPrimer ## Mau adds to overwrite the above value\n+\t\n+\n+        utils.logMessage( "UniqPrimerFinder::findPrimers()", "Finding primers for include files" )\n+        startTime = time.time( )\n+        #generate the combined sequence fasta file for all exclude sequences\n+        utils.printProgressMessage( "*** Creating Combined Fasta File for Exclude Files ***" )\n+        for excludeFile in self.excludeFiles:\n+            self.excludeFileManager.addExcludeFile( excludeFile )\n+        \n+        self.excludeFileManager.exportSequences( )\n+        \n+        self.includeFileManager.setExcludeFile( self.excludeFileManager.getOutputFileName( ) )\n+\n+        utils.printProgressMessage( "*** Finding Sequences Unique to Target Genome ***" )\n+\n+        #run nucmer program on all include files\n+        for includeFile in self.includeFiles:\n+            self.includeFileManager.processIncludeFile( includeFile )\n+                \n+        #get the sequences found in include files, but no the exclude file. \n+        uniqueSequences = self.includeFileManager.getUniqueSequences( )\n+        \n+        utils.printProgressMessage( "*** Finding Primers ***" )\n+        \n+        primers = self.primerManager.getPrimers( uniqueSequences )\n+         \n+        if self.crossValidate == True:\n+            utils.printProgressMessage( "*** Cross Validating Primers ***" )\n+            primers = self.primerManager.crossValidatePrimers( primers, self.excludeFileManager.getOutputFileName( ) )\n+            # added by Alexis, primersearch also against all include files\n+            #run primersearch program on all include files\n+            j=0\n+            for includeFile in self.includeFiles: # added by Alexis\n+                j = j + 1\n+                primers = self.primerManager.crossValidatePrimers2( primers, includeFile, j) # added by Alexis\n+       \t\t\n+ \n+        utils.logMessage( "UniqPrimerFinder::findPrimers( )", "found {0} unique sequences".format( len( primers ) ) ) \n+        \n+        self.writeOutputFile( primers, outputFile )\n+        \n+        '..b'opt[ 0 ] == \'-v\':\n+            verbose = True \n+        elif opt[ 0 ] == \'-o\': ## Mau added, if -o...\n+            uPrimer = str(opt[1])  ## Mau added, then get filename for outfile after -o\n+        elif opt[ 0 ] == \'-l\': ## Mau added, if -l...\n+            lf = str(opt[1])  ## Mau added, then get filename for logfile after -l\n+        elif opt[ 0 ] == \'-f\': ## Alexis added, if -f\n+            fastaDiff = str(opt[1]) ## Alexis added, then get filename for fasta file after -f\n+        elif opt[ 0 ] == \'--productsizerange\':\n+            eprimerOptions.setProductRange( opt[ 1 ] )\n+            productsizerange = opt[ 1 ]\n+        elif opt[ 0 ] == \'--primersize\':\n+            eprimerOptions.setPrimerSize( opt[1 ] )\n+        elif opt[ 0 ] == \'--minprimersize\':\n+            eprimerOptions.setMinPrimerSize( opt[1 ] )\n+        elif opt[ 0 ] == \'--maxprimersize\':\n+            eprimerOptions.setMaxPrimerSize( opt[1 ] )\n+        elif opt[ 0 ] == \'--crossvalidate\':\n+            crossValidate = True\n+        elif opt[ 0 ] == \'--crossvalidate\':\n+            crossValidate = True\n+        elif opt[ 0 ] == \'--keeptempfiles\':\n+            cleanup = False\n+        elif opt[ 0 ] == \'-h\':\n+            printUsageAndQuit( )\n+        else:\n+            print "Unknown option: " + str( opt[ 0 ]  )\n+            printUsageAndQuit( )\n+    #print "uPrimer: " + uPrimer + " log file name: " + lf + "\\n"\n+    if len( includeFiles ) == 0 or len( excludeFiles ) == 0:\n+        \n+        print "You must specify at least one include file and at least one exclude file"\n+        printUsageAndQuit( )\n+\n+    return includeFiles, excludeFiles, crossValidate, cleanup, verbose, eprimerOptions, lf , uPrimer, fastaDiff  #Mau: add lf, uPrime\n+\n+def main( args, debug = False):\n+    #parse the command line arguments for include and exclude files\n+    \n+    includeFiles, excludeFiles, crossValidate, cleanup, verbose, eprimerOptions, lf, uPrimer, fastaDiff = parseArgs( args ) ##Mau add: lf\n+    utils.initialize( True, cleanup, lf)  ##Mau: add lf\n+    #find primers for the include sequences\n+   \n+    tmpdir = utils.getTemporaryDirectory() ## added by Alexis\n+    command = "cp -rf " + tmpdir + "/sequenceForEprimer.fasta" + " " + fastaDiff\n+ \n+    try:\n+        utils.logMessage( "uniqprimer::Main( )", "Logging include files: " )\n+        utils.logList( "uniqprimer::Main( )", includeFiles )\n+        utils.logMessage( "uniqprimer::Main( )", "Logging exclude files: " ) \n+        utils.logList( "uniqprimer::Main( )", excludeFiles)\n+        print "*** Finding Primers ***"\n+        uniqPrimer = UniqPrimerFinder( includeFiles, excludeFiles, crossValidate, eprimerOptions) \n+        uniqPrimer.findPrimers( )\n+    except utils.NoFileFoundException as nfe:\n+        print "File not found: " + str( nfe.filename )\n+        printUsageAndQuit( )\n+    except utils.ProgramNotFoundException as pnfe:\n+        print str( pnfe.programName ) + ": program is not installed or is not in your path."\n+        print str( pnfe.details )\n+    except utils.NoPrimersExistException as npe:\n+        print "Failure: No unique primers exist for this combination"\n+    except exceptions.BaseException as e:\n+        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!"\n+        print "Details:"\n+        print e    \n+    \n+    os.system("cp -rf " + tmpdir + "/sequenceForEprimer.fasta" + " " + fastaDiff)\n+    utils.shutdown( )\n+\n+    print "*** Finished ***"\n+    \n+if __name__ == \'__main__\':\n+    \n+    #temp_args = "-i data/testdata/smallinclude.ffn -x data/testdata/smallexclude.ffn".split( )\n+    \n+    #temp_args = "-i data/XOO_MAI1_scaffolds.fas -x data/KACC.ffn".split( )\n+    if len( sys.argv ) == 1:\n+        printUsageAndQuit( )\n+    main( sys.argv[ 1: ], debug = True )\n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/uniqprimer_ok.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/uniqprimer_ok.py Mon Jan 03 09:56:55 2022 +0000
[
b'@@ -0,0 +1,241 @@\n+#!/usr/bin/python\n+\n+\'\'\'\n+Created on Jan 1, 2011\n+\n+@author: John L. Herndon\n+@contact: herndon@cs.colostate.edu\n+@organization: Colorado State University\n+@group: Computer Science Department, Asa Ben-Hur\'s laboratory \n+Mau added the -o primerOutfile -l logfile option\n+\'\'\'\n+\n+import exceptions\n+import sys\n+import time\n+\n+import getopt\n+from primertools import *\n+\n+version="0.5.0"\n+\n+\n+class UniqPrimerFinder( object ):\n+    \n+    def __init__( self, includeFiles, excludeFiles, crossValidate, eprimerOptions):\n+        \n+        utils.logMessage( "UniqPrimerFinder::__init__()", "Initializing UniqPrimerFinder" )\n+        self.includeFiles = includeFiles\n+        self.includeFileManager = includefilemanager.IncludeFileManager( )\n+        \n+        self.excludeFiles = excludeFiles\n+        self.excludeFileManager= excludefilemanager.ExcludeFileManager( )\n+        \n+        self.primerManager = primermanager.PrimerManager( eprimerOptions )\n+        \n+        self.crossValidate = crossValidate\n+\n+       \n+        utils.logMessage( "UniqPrimerFinder::__init__()", "Initializing UniqPrimerFinder - complete" )\n+    \n+    def writeOutputFile( self, primers, outputFileName, maxresults = 100 ):\n+        \'\'\'\n+        primers: a list of PrimerSet obs\n+        \'\'\'\n+        ##outputFileName = uPrimer ##Mau: defined this..\n+        outputFile = open( outputFileName, \'w\' )\n+        \n+        i = 0\n+        for primer in primers:\n+            i += 1\n+            \n+            outputFile.write( "{0}\\t{1}\\t{2}\\t{3}\\n".format( i, primer.forwardPrimer, primer.reversePrimer, primer.productSize ) )\n+            \n+            if i > maxresults:\n+                break\n+            \n+        utils.logMessage( "UniqPrimerFinder::writeOutputFile()", "output file written." )\n+            \n+    \n+    def findPrimers( self, outputFile = "uPrimer.txt" ):\n+\toutputFile = uPrimer ## Mau adds to overwrite the above value\n+\n+        utils.logMessage( "UniqPrimerFinder::findPrimers()", "Finding primers for include files" )\n+        startTime = time.time( )\n+        #generate the combined sequence fasta file for all exclude sequences\n+        utils.printProgressMessage( "*** Creating Combined Fasta File for Exclude Files ***" )\n+        for excludeFile in self.excludeFiles:\n+            self.excludeFileManager.addExcludeFile( excludeFile )\n+        \n+        self.excludeFileManager.exportSequences( )\n+        \n+        self.includeFileManager.setExcludeFile( self.excludeFileManager.getOutputFileName( ) )\n+\n+        utils.printProgressMessage( "*** Finding Sequences Unique to Target Genome ***" )\n+\n+        #run nucmer program on all include files\n+        for includeFile in self.includeFiles:\n+            self.includeFileManager.processIncludeFile( includeFile )\n+                \n+        #get the sequences found in include files, but no the exclude file. \n+        uniqueSequences = self.includeFileManager.getUniqueSequences( )\n+        \n+        utils.printProgressMessage( "*** Finding Primers ***" )\n+        \n+        primers = self.primerManager.getPrimers( uniqueSequences )\n+         \n+        if self.crossValidate == True:\n+            utils.printProgressMessage( "*** Cross Validating Primers ***" )\n+            primers = self.primerManager.crossValidatePrimers( primers, self.excludeFileManager.getOutputFileName( ) )\n+            \n+        \n+        utils.logMessage( "UniqPrimerFinder::findPrimers( )", "found {0} unique sequences".format( len( primers ) ) ) \n+        \n+        self.writeOutputFile( primers, outputFile )\n+        \n+        utils.logMessage( "UniqPrimerFinder::findPrimers()", "Finished finding primers" )\n+        endTime = time.time()\n+        elapsedMinutes = int( ( endTime - startTime ) / 60 )\n+        elapsedSeconds = int( ( endTime - startTime ) % 60 )\n+        print "*** Time Elapsed: {0} minutes, {1} seconds ***".format( elapsedMinutes, elapsedSeconds )\n+        print "*** Output Written to {0} ***".format( outputFile )\n+   '..b'    cleanup = True\n+    optlist, args = getopt.getopt( args, opts, longopts )\n+    \n+    includeFiles = [ ]\n+    excludeFiles = [ ]\n+    eprimerOptions = utils.EPrimerOptions( )\n+    \n+    verbose = False\n+    for opt in optlist:\n+        if opt[ 0 ] == \'-i\':\n+            includeFiles.append( opt[ 1 ] )\n+        elif opt[ 0 ] == \'-x\':\n+            excludeFiles.append( opt[ 1] )\n+        elif opt[ 0 ] == \'-v\':\n+            verbose = True \n+        elif opt[ 0 ] == \'-o\': ## Mau added, if -o...\n+            uPrimer = str(opt[1])  ## Mau added, then get filename for outfile after -o\n+        elif opt[ 0 ] == \'-l\': ## Mau added, if -l...\n+            lf = str(opt[1])  ## Mau added, then get filename for logfile after -l\n+        elif opt[ 0 ] == \'--productsizerange\':\n+            eprimerOptions.setProductRange( opt[ 1 ] )\n+            productsizerange = opt[ 1 ]\n+        elif opt[ 0 ] == \'--primersize\':\n+            eprimerOptions.setPrimerSize( opt[1 ] )\n+        elif opt[ 0 ] == \'--minprimersize\':\n+            eprimerOptions.setMinPrimerSize( opt[1 ] )\n+        elif opt[ 0 ] == \'--maxprimersize\':\n+            eprimerOptions.setMaxPrimerSize( opt[1 ] )\n+        elif opt[ 0 ] == \'--crossvalidate\':\n+            crossValidate = True\n+        elif opt[ 0 ] == \'--crossvalidate\':\n+            crossValidate = True\n+        elif opt[ 0 ] == \'--keeptempfiles\':\n+            cleanup = False\n+        elif opt[ 0 ] == \'-h\':\n+            printUsageAndQuit( )\n+        else:\n+            print "Unknown option: " + str( opt[ 0 ]  )\n+            printUsageAndQuit( )\n+    #print "uPrimer: " + uPrimer + " log file name: " + lf + "\\n"\n+    if len( includeFiles ) == 0 or len( excludeFiles ) == 0:\n+        \n+        print "You must specify at least one include file and at least one exclude file"\n+        printUsageAndQuit( )\n+\n+    return includeFiles, excludeFiles, crossValidate, cleanup, verbose, eprimerOptions, lf , uPrimer  #Mau: add lf, uPrime\n+\n+def main( args, debug = False):\n+    #parse the command line arguments for include and exclude files\n+    \n+    includeFiles, excludeFiles, crossValidate, cleanup, verbose, eprimerOptions, lf, uPrimer = parseArgs( args ) ##Mau add: lf\n+    \n+    utils.initialize( True, cleanup, lf)  ##Mau: add lf\n+\n+    #find primers for the include sequences\n+    \n+    try:\n+        utils.logMessage( "uniqprimer::Main( )", "Logging include files: " )\n+        utils.logList( "uniqprimer::Main( )", includeFiles )\n+        utils.logMessage( "uniqprimer::Main( )", "Logging exclude files: " ) \n+        utils.logList( "uniqprimer::Main( )", excludeFiles)\n+        print "*** Finding Primers ***"\n+        uniqPrimer = UniqPrimerFinder( includeFiles, excludeFiles, crossValidate, eprimerOptions) \n+        uniqPrimer.findPrimers( )\n+    except utils.NoFileFoundException as nfe:\n+        print "File not found: " + str( nfe.filename )\n+        printUsageAndQuit( )\n+    except utils.ProgramNotFoundException as pnfe:\n+        print str( pnfe.programName ) + ": program is not installed or is not in your path."\n+        print str( pnfe.details )\n+    except utils.NoPrimersExistException as npe:\n+        print "Failure: No unique primers exist for this combination"\n+    except exceptions.BaseException as e:\n+        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!"\n+        print "Details:"\n+        print e    \n+    \n+    utils.shutdown( )\n+\n+    print "*** Finished ***"\n+    \n+if __name__ == \'__main__\':\n+    \n+    #temp_args = "-i data/testdata/smallinclude.ffn -x data/testdata/smallexclude.ffn".split( )\n+    \n+    #temp_args = "-i data/XOO_MAI1_scaffolds.fas -x data/KACC.ffn".split( )\n+    if len( sys.argv ) == 1:\n+        printUsageAndQuit( )\n+    main( sys.argv[ 1: ], debug = True )\n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n+    \n'
b
diff -r 7e0438dad4e9 -r 3249d78ecfc2 uniqprimer-0.5.0/utils.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uniqprimer-0.5.0/utils.py Mon Jan 03 09:56:55 2022 +0000
b
@@ -0,0 +1,207 @@
+'''
+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 time
+import os.path
+from os import pathsep
+from string import split
+import tempfile
+import shutil
+
+def getTimeStamp( ):
+    return time.strftime('%d%m%Y-%H%M%S')
+
+
+class Match( object ):
+    '''
+    record where two genomes line up. stores only alignments for one part of the genome
+    '''
+    def __init__( self, start, end, seqID ):
+        self.seqID = seqID
+        self.start = start
+        self.end = end
+    
+    def __repr__( self ):
+        return "Start: {0}, End:{1}, SeqID:{2}".format( self.start, self.end, self.seqID )
+    
+class PrimerSet( object ):
+    
+    def __init__( self, id ):
+        self.id = id
+        self.productSize = 0
+        self.forwardPrimer = ""
+        self.forwardMeltTemp = ""
+        self.reversePrimer = ""
+        self.reverseMeltTemp = ""
+        
+        
+    def setProductSize( self, productSize):
+        self.productSize = productSize
+        
+    def setForwardPrimerData( self, sequence, temp ):
+        self.forwardPrimer = sequence
+        self.forwardMeltTemp = temp
+        
+    def setReversePrimerData( self, sequence, temp):
+        self.reversePrimer = sequence
+        self.reverseMeltTemp = temp
+    
+
+#search function from http://code.activestate.com/recipes/52224-find-a-file-given-a-search-path/
+def search_file( filename ):
+    """ find file
+    """
+    search_path = os.getenv( 'PATH' )
+    logMessage( "utils::search_file", "Path: {0}".format( search_path ) )
+    file_found = 0
+    paths = split( search_path, pathsep )
+    for path in paths:
+        if os.path.exists( os.path.join( path, filename ) ):
+            file_found = 1
+            break
+    if file_found:
+        return os.path.abspath( os.path.join( path, filename ) )
+    else:
+        return None
+
+tempDir = ""
+removeTemp = True
+
+verbose = False
+
+
+def initialize( isVerbose, cleanup, lf): ##Mau: added lf
+    global removeTemp
+    global tempDir
+    global verbose
+    global logFile ##Mau: added  logFile variable
+
+    logFile = lf #:Mau add line
+    
+    verbose = isVerbose
+    tempDir = tempfile.mkdtemp( dir="" )
+    initializeLogging()
+    removeTemp = cleanup
+    logMessage( "utils::Initialize( )", "Initialization complete. Temporary directory: {0}".format( tempDir ) )
+    
+logFile = None
+
+
+def printProgressMessage( message ):
+    global verbose
+    if verbose == True:
+        print message
+
+def getTemporaryDirectory( ):
+    global tempDir
+    return tempDir
+
+def initializeLogging():
+    global logFile
+    #logFileName = "uniqprimer_{0}.log".format( getTimeStamp( ) )
+    #logFileName = "log_uniqprimer.txt"  ##Mau: commented out 
+    logFileName = logFile ##Mau: changed
+    logFile = open( logFileName, 'w' )
+    
+def shutdown( ):
+    global removeTemp
+    global tempDir
+    shutdownLogging( )
+    if removeTemp == True:
+        print "*** Removing temporary directory ***"
+        shutil.rmtree( tempDir )
+    
+def shutdownLogging( ):
+    global logFile
+    if logFile != None:
+        logFile.close( )
+
+def logList( method, list ):
+    
+    message = reduce( lambda x,y: str( x ) + " " + str( y ) , list )
+    logMessage(method, message)
+    
+    
+def logMessage( method, message ):
+    global logFile
+    if logFile == None:
+        return
+    log = "{0} - {1}".format( method, message )
+    
+    logFile.write( log + "\n" )
+    logFile.flush( )
+
+class EPrimerOptions( object ):
+    
+    def __init__( self ):
+        
+        self.minPrimerSize = 18
+        self.maxPrimerSize = 27
+        self.primerSize = 20
+        self.productRange = "200-250"
+    
+    def setPrimerSize( self, size ):
+        
+        size = int( size )
+        if size > 35:
+            size = 35
+        
+        self.primerSize = size
+        if self.primerSize < self.minPrimerSize:
+            self.maxPrimerSize = self.primerSize 
+        elif self.primerSize > self.maxPrimerSize:
+            self.maxPrimerSize = self.primerSize
+    
+    def getPrimerSize( self ):
+        return self.primerSize
+    
+    def setMinPrimerSize( self, minSize):
+        self.minPrimerSize = minSize
+    
+    def getMinPrimerSize( self  ):
+        return self.minPrimerSize
+
+    def setMaxPrimerSize( self, size ):
+        self.maxPrimerSize = size
+        
+    def getMaxPrimerSize( self ):
+        return self.maxPrimerSize
+    
+    def setProductRange( self, range ):
+        self.productRange = range
+        
+    def getProductRange( self ):
+        return self.productRange
+
+class NoPrimersExistException( exceptions.BaseException ):
+    
+    def __init__( self ):
+        exceptions.BaseException( self )
+
+class ProgramNotFoundException( exceptions.BaseException ):
+    
+    def __init__( self, programName, details ):
+        exceptions.BaseException.__init__(self)
+        self.programName = programName
+        self.details = details
+        
+class NoFileFoundException( exceptions.BaseException ):
+    
+    def __init__( self, filename ):
+        exceptions.BaseException.__init__(self)
+        self.filename = filename
+        
+        
+class ModuleNotInitializedException( exceptions.BaseException ):
+    
+    def __init__( self, moduleName, reason ):
+        self.moduleName = moduleName
+        self.reason = reason