annotate SkewIT/src/skewi.py @ 3:e42d30da7a74 draft

Uploaded
author dereeper
date Thu, 30 May 2024 11:52:25 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
1 #! /usr/bin/env python
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
2 ##########################################################################
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
3 #skewi.py calculates a single SkewI value for a given chromosome
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
4 #Copyright (C) 2020 Jennifer Lu, jlu26@jhmi.edu
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
5 #
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
6 #This file is part of SkewIT
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
7 #
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
8 #SkewIT is free software; you can redistribute it and/or modify
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
9 #it under the terms of the GNU General Public License as published by
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
10 #the Free Software Foundation; either version 3 of the license, or
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
11 #(at your option) any later version.
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
12
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
13 #This program is distributed in the hope that it will be useful,
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
14 #but WITHOUT ANY WARRANTY; without even the implied warranty of
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
15 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
16 #GNU General Public License for more details.
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
17
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
18 #You should have received a copy of the GNU General Public License
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
19 #along with this program; if not, see <http://www.gnu.org/licenses/>.
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
20
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
21 #####################################################################
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
22 #Jennifer Lu, jennifer.lu717@gmail.com
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
23 #02/17/2020
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
24 #
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
25 #This program calculates a Skew Index (SkewI)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
26 #for a given genome within the range 0 to 1. Higher SkewI values
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
27 #indicate a strong GC Skew signal while lower SkewI values
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
28 #indicate a potentially low GC Skew signal
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
29 #
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
30 #Given a multi-fasta file, the program will output one SkewI per sequence
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
31 ######################################################################
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
32 import sys, os, argparse
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
33 from time import gmtime
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
34 from time import strftime
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
35 from Bio import SeqIO
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
36 import numpy as np
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
37 #####################################################################
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
38 def usage():
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
39 sys.stderr.write("\n #########################################################################################\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
40 sys.stderr.write(" ################################## USAGE: SKEWI.PY ######################################\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
41 sys.stderr.write(" ## > python skewi.py -i SEQ.FASTA -o SKEW.TXT\t\t\t\t\t\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
42 sys.stderr.write(" ## \t -i SEQ.FASTA............fasta file (multi-fasta permitted)\t\t\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
43 sys.stderr.write(" ## Optional Parameters:\t\t\t\t\t\t\t\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
44 sys.stderr.write(" ## \t -o SKEW.TXT.............output file (see below)\t\t\t\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
45 sys.stderr.write(" ## \t -k WINDOW_SIZE..........length of subsequences for which to calculate gc skew\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
46 sys.stderr.write(" ## \t .....................[default:20000]\t\t\t\t\t##\n" )
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
47 sys.stderr.write(" ## \t -f FREQUENCY............number of bases between the start of each window\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
48 sys.stderr.write(" ## \t .....................[default: k == f]\t\t\t\t\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
49 sys.stderr.write(" ## \t --min-seq-len LEN.......set a minimum sequence length\t\t\t\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
50 sys.stderr.write(" ## \t .....................[default: 500,000bp]\t\t\t\t\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
51 sys.stderr.write(" ## \t --complete/--all........only analyze sequences with 'complete' in header\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
52 sys.stderr.write(" ## \t .....................[default: --complete]\t\t\t\t\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
53 sys.stderr.write(" ## \t --plasmid/--no-plasmid..include/exclude plasmid sequences from analysis\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
54 sys.stderr.write(" ## \t .....................[default: --no-plasmid]\t\t\t\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
55 sys.stderr.write(" ## Output file: If no output file is provided, SkewI will be printed to standard out\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
56 sys.stderr.write(" ## \t Otherwise, a tab-delimited file will be generated:\t\t\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
57 sys.stderr.write(" ## \t with two columns: 1) sequence ID 2) skewI value\t\t\t\t##\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
58 sys.stderr.write(" #########################################################################################\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
59 sys.stderr.write(" #########################################################################################\n\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
60 exit(0)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
61 #####################################################################
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
62 def main():
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
63 parser = argparse.ArgumentParser()
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
64 #Required parameter:
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
65 parser.add_argument("-i","--input","-s","--seq",
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
66 dest="in_file", required=False, default="",
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
67 help="Sequence file for which to calculate gc_skew")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
68 #Defaults =20K/Same as window size
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
69 parser.add_argument("-k","-w","--window-len",
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
70 dest="window_size", required=False, default=20000, type=int,
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
71 help="Window size for which to calculate each sign(g-c) [default: 20kb]")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
72 parser.add_argument("-f","--freq", dest="freq", type=int, default=-1,
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
73 help="Length between the start indices of each window. \
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
74 [default: same as window_len, must be less than window size]")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
75 #No output provided = standard out
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
76 parser.add_argument('-o','--output', required=False,
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
77 dest="out_file",default="",
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
78 help="Output text file to save skewi (skew index values)")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
79 #Complete Genomes/Plasmid Sequence options
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
80 parser.add_argument('--complete', required=False, dest='complete_tf',
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
81 action='store_true', default=True, help='Only analyze complete genomes')
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
82 parser.add_argument('--all', required=False, dest='complete_tf',
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
83 action='store_false', default=True, help='Analyze complete and draft genomes')
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
84 parser.add_argument('--plasmid', required=False, dest='plasmid_tf',
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
85 action='store_true', default=False, help='Analyze plasmid sequences')
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
86 parser.add_argument('--no-plasmid', required=False, dest='plasmid_tf',
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
87 action='store_false', default=False, help='Exclude plasmid sequences')
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
88 #Sequence length minimum
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
89 parser.add_argument('--min-len', required=False, dest='min_seq_len',
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
90 type=int, default=500000,
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
91 help='Minimum sequence length to analyze [default: 500kb]')
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
92 #Usage option
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
93 parser.add_argument('--usage', required=False, dest='usage',
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
94 action='store_true', default=False,
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
95 help='Prints usage information for this program')
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
96 args=parser.parse_args()
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
97
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
98 ########################
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
99 #Test parameters
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
100 if args.usage:
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
101 usage()
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
102 if (args.in_file == ""):
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
103 sys.stderr.write(" >> Please provide an input sequence file\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
104 usage()
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
105 exit(1)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
106 if (not os.path.isfile(args.in_file)):
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
107 sys.stderr.write(" >> ERROR: %s is not a valid file\n" % args.in_file)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
108 exit(1)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
109 #Lengths
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
110 if (args.freq == -1):
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
111 args.freq = args.window_size
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
112 if (args.window_size < 0):
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
113 sys.stderr.write(" >> ERROR: --window-size must be greater than 0\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
114 exit(1)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
115 if (args.freq < 0):
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
116 sys.stderr.write(" >> ERROR: --freq must be greater than 0\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
117 exit(1)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
118 if (args.freq > args.window_size):
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
119 sys.stderr.write(" >> ERROR: window size must be >= frequency\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
120 exit(1)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
121 ########################
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
122 #Start program
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
123 time = strftime("%m-%d-%Y %H:%M:%S", gmtime())
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
124 sys.stderr.write(" >> PROGRAM START TIME: " + time + '\n')
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
125 sys.stderr.write(" Input file: %s\n" % args.in_file)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
126 if args.out_file != "":
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
127 sys.stderr.write(" Output: %s\n" % args.out_file)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
128 else:
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
129 sys.stderr.write(" Output: system standard out\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
130 sys.stderr.write(" Window size (bp): %i\n" % args.window_size)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
131 sys.stderr.write(" Frequency (bp): %i\n" % args.freq)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
132 sys.stderr.write(" Minimum sequence length (bp): %i\n" % args.min_seq_len)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
133 sys.stderr.write(" Complete sequences only: %s\n" % args.complete_tf)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
134 sys.stderr.write(" Exclude plasmids: %s\n" % (not args.plasmid_tf))
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
135 sys.stderr.flush()
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
136 ########################
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
137 count_seqs = 0
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
138 argmax = []
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
139 seq2skewi = {}
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
140 sys.stderr.write("\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
141 sys.stderr.write(" >> Processing file: %s\n" % args.in_file)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
142 sys.stderr.write("\r\t%i seqs evaluated: " % (count_seqs))
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
143 for record in SeqIO.parse(args.in_file,'fasta'):
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
144 my_description = str(record.description)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
145 if ("complete" not in my_description) and args.complete_tf:
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
146 continue
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
147 if ("plasmid" in my_description) and not args.plasmid_tf:
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
148 continue
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
149 my_seq = str(record.seq)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
150 if len(my_seq) < args.min_seq_len:
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
151 continue
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
152 count_seqs += 1
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
153 #Get sequence and description
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
154 #Print Update
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
155 count = 0
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
156 tot = len(my_seq)/args.window_size
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
157 #Calculate skew
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
158 skew = []
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
159 for i in range(0,len(my_seq),args.window_size):
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
160 g = my_seq[i:i+args.window_size].count("G")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
161 c = my_seq[i:i+args.window_size].count("C")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
162 if (g-c) > 0:
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
163 skew.append(1)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
164 elif (g-c) < 0:
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
165 skew.append(-1)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
166 else:
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
167 skew.append(0)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
168 #Final print
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
169 curr_size = len(skew)/2
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
170 sys.stdout.flush()
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
171 skew += skew[:curr_size]
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
172 #Calculate abs(T2-T1) where T is sum of values
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
173 curr_diffs = []
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
174 x = sum(skew[0:curr_size])
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
175 y = sum(skew[curr_size:2*curr_size])
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
176 for i in range(0, curr_size-1):
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
177 curr_diffs.append(abs(x-y))
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
178 x = x - skew[i] + skew[i+curr_size]
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
179 y = y - skew[i+curr_size] + skew[i+2*curr_size]
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
180 curr_diffs.append(abs(x-y))
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
181 if len(curr_diffs) > 0:
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
182 max_cd = float(max(curr_diffs))
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
183 seq2skewi[my_description] = max_cd/float(len(my_seq))*float(args.window_size)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
184 sys.stderr.write("\r\t%i sequences evaluated" % (count_seqs))
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
185 sys.stderr.flush()
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
186
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
187 sys.stderr.write("\r\t%i total sequences evaluated (all finished)\n" % (count_seqs))
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
188 sys.stderr.flush()
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
189
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
190 if args.out_file == "":
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
191 sys.stdout.write("Sequence\tSkewI\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
192 for seq in seq2skewi:
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
193 sys.stdout.write("%s\t%0.10f\n" % (seq,seq2skewi[seq]))
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
194 else:
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
195 sys.stdout.write(" >> Printing SkewI values to file: %s\n" % args.out_file)
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
196 o_file = open(args.out_file,'w')
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
197 o_file.write("Sequence\tSkewI\n")
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
198 for seq in seq2skewi:
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
199 o_file.write("%s\t%0.10f\n" % (seq,seq2skewi[seq]))
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
200 o_file.close()
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
201
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
202 #End program
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
203 time = strftime("%m-%d-%Y %H:%M:%S", gmtime())
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
204 sys.stderr.write(" >> PROGRAM FINISH TIME: " + time + '\n')
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
205 if __name__== "__main__":
e42d30da7a74 Uploaded
dereeper
parents:
diff changeset
206 main()