3
|
1 '''
|
|
2 Created on Jan 1, 2011
|
|
3
|
|
4 @author: John L. Herndon
|
|
5 @contact: herndon@cs.colostate.edu
|
|
6 @organization: Colorado State University
|
|
7 @group: Computer Science Department, Asa Ben-Hur's laboratory
|
|
8 '''
|
|
9
|
|
10
|
|
11 import exceptions
|
|
12 import time
|
|
13 import os.path
|
|
14 from os import pathsep
|
|
15 from string import split
|
|
16 import tempfile
|
|
17 import shutil
|
|
18
|
|
19 def getTimeStamp( ):
|
|
20 return time.strftime('%d%m%Y-%H%M%S')
|
|
21
|
|
22
|
|
23 class Match( object ):
|
|
24 '''
|
|
25 record where two genomes line up. stores only alignments for one part of the genome
|
|
26 '''
|
|
27 def __init__( self, start, end, seqID ):
|
|
28 self.seqID = seqID
|
|
29 self.start = start
|
|
30 self.end = end
|
|
31
|
|
32 def __repr__( self ):
|
|
33 return "Start: {0}, End:{1}, SeqID:{2}".format( self.start, self.end, self.seqID )
|
|
34
|
|
35 class PrimerSet( object ):
|
|
36
|
|
37 def __init__( self, id ):
|
|
38 self.id = id
|
|
39 self.productSize = 0
|
|
40 self.forwardPrimer = ""
|
|
41 self.forwardMeltTemp = ""
|
|
42 self.reversePrimer = ""
|
|
43 self.reverseMeltTemp = ""
|
|
44
|
|
45
|
|
46 def setProductSize( self, productSize):
|
|
47 self.productSize = productSize
|
|
48
|
|
49 def setForwardPrimerData( self, sequence, temp ):
|
|
50 self.forwardPrimer = sequence
|
|
51 self.forwardMeltTemp = temp
|
|
52
|
|
53 def setReversePrimerData( self, sequence, temp):
|
|
54 self.reversePrimer = sequence
|
|
55 self.reverseMeltTemp = temp
|
|
56
|
|
57
|
|
58 #search function from http://code.activestate.com/recipes/52224-find-a-file-given-a-search-path/
|
|
59 def search_file( filename ):
|
|
60 """ find file
|
|
61 """
|
|
62 search_path = os.getenv( 'PATH' )
|
|
63 logMessage( "utils::search_file", "Path: {0}".format( search_path ) )
|
|
64 file_found = 0
|
|
65 paths = split( search_path, pathsep )
|
|
66 for path in paths:
|
|
67 if os.path.exists( os.path.join( path, filename ) ):
|
|
68 file_found = 1
|
|
69 break
|
|
70 if file_found:
|
|
71 return os.path.abspath( os.path.join( path, filename ) )
|
|
72 else:
|
|
73 return None
|
|
74
|
|
75 tempDir = ""
|
|
76 removeTemp = True
|
|
77
|
|
78 verbose = False
|
|
79
|
|
80
|
|
81 def initialize( isVerbose, cleanup, lf): ##Mau: added lf
|
|
82 global removeTemp
|
|
83 global tempDir
|
|
84 global verbose
|
|
85 global logFile ##Mau: added logFile variable
|
|
86
|
|
87 logFile = lf #:Mau add line
|
|
88
|
|
89 verbose = isVerbose
|
|
90 tempDir = tempfile.mkdtemp( dir="" )
|
|
91 initializeLogging()
|
|
92 removeTemp = cleanup
|
|
93 logMessage( "utils::Initialize( )", "Initialization complete. Temporary directory: {0}".format( tempDir ) )
|
|
94
|
|
95 logFile = None
|
|
96
|
|
97
|
|
98 def printProgressMessage( message ):
|
|
99 global verbose
|
|
100 if verbose == True:
|
|
101 print message
|
|
102
|
|
103 def getTemporaryDirectory( ):
|
|
104 global tempDir
|
|
105 return tempDir
|
|
106
|
|
107 def initializeLogging():
|
|
108 global logFile
|
|
109 #logFileName = "uniqprimer_{0}.log".format( getTimeStamp( ) )
|
|
110 #logFileName = "log_uniqprimer.txt" ##Mau: commented out
|
|
111 logFileName = logFile ##Mau: changed
|
|
112 logFile = open( logFileName, 'w' )
|
|
113
|
|
114 def shutdown( ):
|
|
115 global removeTemp
|
|
116 global tempDir
|
|
117 shutdownLogging( )
|
|
118 if removeTemp == True:
|
|
119 print "*** Removing temporary directory ***"
|
|
120 shutil.rmtree( tempDir )
|
|
121
|
|
122 def shutdownLogging( ):
|
|
123 global logFile
|
|
124 if logFile != None:
|
|
125 logFile.close( )
|
|
126
|
|
127 def logList( method, list ):
|
|
128
|
|
129 message = reduce( lambda x,y: str( x ) + " " + str( y ) , list )
|
|
130 logMessage(method, message)
|
|
131
|
|
132
|
|
133 def logMessage( method, message ):
|
|
134 global logFile
|
|
135 if logFile == None:
|
|
136 return
|
|
137 log = "{0} - {1}".format( method, message )
|
|
138
|
|
139 logFile.write( log + "\n" )
|
|
140 logFile.flush( )
|
|
141
|
|
142 class EPrimerOptions( object ):
|
|
143
|
|
144 def __init__( self ):
|
|
145
|
|
146 self.minPrimerSize = 18
|
|
147 self.maxPrimerSize = 27
|
|
148 self.primerSize = 20
|
|
149 self.productRange = "200-250"
|
|
150
|
|
151 def setPrimerSize( self, size ):
|
|
152
|
|
153 size = int( size )
|
|
154 if size > 35:
|
|
155 size = 35
|
|
156
|
|
157 self.primerSize = size
|
|
158 if self.primerSize < self.minPrimerSize:
|
|
159 self.maxPrimerSize = self.primerSize
|
|
160 elif self.primerSize > self.maxPrimerSize:
|
|
161 self.maxPrimerSize = self.primerSize
|
|
162
|
|
163 def getPrimerSize( self ):
|
|
164 return self.primerSize
|
|
165
|
|
166 def setMinPrimerSize( self, minSize):
|
|
167 self.minPrimerSize = minSize
|
|
168
|
|
169 def getMinPrimerSize( self ):
|
|
170 return self.minPrimerSize
|
|
171
|
|
172 def setMaxPrimerSize( self, size ):
|
|
173 self.maxPrimerSize = size
|
|
174
|
|
175 def getMaxPrimerSize( self ):
|
|
176 return self.maxPrimerSize
|
|
177
|
|
178 def setProductRange( self, range ):
|
|
179 self.productRange = range
|
|
180
|
|
181 def getProductRange( self ):
|
|
182 return self.productRange
|
|
183
|
|
184 class NoPrimersExistException( exceptions.BaseException ):
|
|
185
|
|
186 def __init__( self ):
|
|
187 exceptions.BaseException( self )
|
|
188
|
|
189 class ProgramNotFoundException( exceptions.BaseException ):
|
|
190
|
|
191 def __init__( self, programName, details ):
|
|
192 exceptions.BaseException.__init__(self)
|
|
193 self.programName = programName
|
|
194 self.details = details
|
|
195
|
|
196 class NoFileFoundException( exceptions.BaseException ):
|
|
197
|
|
198 def __init__( self, filename ):
|
|
199 exceptions.BaseException.__init__(self)
|
|
200 self.filename = filename
|
|
201
|
|
202
|
|
203 class ModuleNotInitializedException( exceptions.BaseException ):
|
|
204
|
|
205 def __init__( self, moduleName, reason ):
|
|
206 self.moduleName = moduleName
|
|
207 self.reason = reason
|