annotate Matrix_Validations.py @ 1:f1bcd79cd923 draft default tip

Uploaded
author insilico-bob
date Tue, 27 Nov 2018 14:20:40 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
1 '''
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
2 Created on Jun 7, 2017 modified Feb2018
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
3
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
4 @author: Bob Brown and cjacoby
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
5 '''
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
6
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
7 import sys, traceback, argparse
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
8 import numpy as np
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
9 import os
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
10 from Matrix_Validate_import import reader, Labeler
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
11
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
12 #Define The Four Arguments Used in the Program
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
13 def get_args():
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
14 parser = argparse.ArgumentParser()
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
15 parser.add_argument('input_file_txt', help='tab delimited text file input matrix(include .txt in name)')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
16 parser.add_argument('replacement', type=str, help='Choose Replacement for Missing Value. Valid Choices are strings: "Mean" or "Zero"')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
17 parser.add_argument('axes', type=str, help='Choose Axes to Normalize On (Either "Row" or "Column"')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
18 parser.add_argument('output_file_txt' ,help='tab delimited text file output name (include .txt in name)')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
19 args = parser.parse_args()
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
20 return args
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
21
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
22
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
23 #Define Function to Replace Null Values with Row Mean
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
24 def nan_replacer_mean_rows(matrix):
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
25
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
26 nonNumCnt= 0
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
27 nanCnt = 0 #valid NANs are "NA","N/A","-","?"
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
28
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
29 #Loop Replacing all Null Values with Row Mean
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
30 for i in range(0,len(matrix)):
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
31 temp_mean = np.nanmean(matrix[i])
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
32 for j in range(0,len(matrix[0])):
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
33 #if matrix[i][j] == "NA": #np.isnan(matrix[i][j]) == True:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
34 if np.isnan(matrix[i][j]) == True:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
35 matrix[i][j] = temp_mean
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
36 nanCnt = nanCnt + 1
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
37 return matrix, nonNumCnt, nanCnt
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
38
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
39 #Define Function to Replace Null Values with Column Mean
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
40 def nan_replacer_mean_columns(matrix):
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
41
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
42 nonNumCnt= 0
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
43 nanCnt = 0 #valid NANs are "NA","N/A","-","?"
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
44
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
45 #Loop Replacing all Null Values with Column Mean
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
46 for i in range(0,len(matrix[0])):
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
47 col = [row[i] for row in matrix]
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
48 temp_mean = np.nanmean(col)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
49 for j in range(0,len(matrix)):
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
50 #if matrix[i][j] == "NA": #elif np.isnan(matrix[j][i]) == True:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
51 if np.isnan(matrix[j][i]) == True:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
52 matrix[j][i] = temp_mean
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
53 nanCnt = nanCnt + 1
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
54
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
55 return matrix, nonNumCnt, nanCnt
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
56
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
57 #Define Function to Replace Null Values with Zero (axis orientation is irrelevant)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
58 def nan_replacer_zero(matrix):
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
59
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
60 nonNumCnt= 0
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
61 nanCnt = 0 #valid NANs are "NA","N/A","-","?"
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
62
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
63 #Loop Replacing all Null Values with Row Range
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
64 for i in range(0,len(matrix)):
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
65 for j in range(0,len(matrix[0])):
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
66 #if matrix[i][j] =="NA":
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
67 if np.isnan(matrix[i][j]) == True:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
68 matrix[i][j] = 0
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
69
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
70 return matrix, nonNumCnt, nanCnt
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
71
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
72 #Define Function to Re-Label Output Matrix
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
73 #!!!! not needed no output matrix from Validate tool
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
74 def OLD_labeler(matrix, og_cols, og_rows, output_file_txt):
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
75 #Write Data to Specified Text File Output
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
76 with open(output_file_txt,'w') as f:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
77 f.write("Use original input file for further processing\n")
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
78 f.close()
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
79 # f.write("")
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
80 # for k in range(0,len(og_cols)):
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
81 # f.write('\t' + str(og_cols[k]))
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
82 # f.write('\n')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
83 # for i in range(0,len(og_rows)):
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
84 # f.write(og_rows[i])
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
85 # for j in range(0,len(matrix[0])):
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
86 # f.write('\t' + format(matrix[i][j]))
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
87 # f.write('\n')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
88
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
89 #Main Function
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
90 def main():
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
91 args = get_args()
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
92 #print(args)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
93 #sys.stdout.write(str(args))
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
94 #sys.stdout.write( '\nValid NAN identifiers are "NA","N/A","-", and "?"')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
95
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
96 matrix,og_cols,og_rows = reader(args.input_file_txt)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
97
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
98 # if nonNumCnt > 0:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
99 # print('\nERROR Matrix has non-numbers that are non-NAN identifiers in matrix. Total and percent unknown strings found = '+str(nonNumCnt)+ ', %.2f' % (100.0*nonNumCnt/(1.0*len(og_cols)*len(og_rows)))+'%' )
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
100 # #sys.stderr.write('\nERROR Matrix has non-numbers that are non-NAN identifiers in matrix. Total and percent unknown strings found = '+str(nonNumCnt)+ ', %.2f' % (100.0*nonNumCnt/(1.0*len(og_cols)*len(og_rows)))+'%' )
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
101 # if nanCnt > 0:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
102 # print('\nWARNING Matrix has '+str(nanCnt)+' that is %.2f' % (100.0*nanCnt/(1.0*len(og_cols)*len(og_rows)))+'% known NAN identifiers')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
103 # sys.exit(-1)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
104 # else:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
105 # if nanCnt > 0:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
106 # print('\nWARNING Matrix has NO unknown non-numbers in matrix, but contains '+str(nanCnt)+' that is %.2f' % (100.0*nanCnt/(1.0*len(og_cols)*len(og_rows)))+'% known NAN identifiers')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
107 # else:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
108 # print('Matrix is Good-to-Go -- all numbers in data area. ')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
109
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
110 #with open(args.output_file_txt,'w') as f:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
111 # f.write("Use original input file for further processing\n")
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
112 #f.close()
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
113 #sys.exit(0)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
114
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
115 # TODO !!!!! Below if MDA decides to use it TURNED OFF FOR NOW
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
116 # TODO !!!!! Below if MDA decides to use it TURNED OFF FOR NOW
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
117
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
118 if args.replacement == "Mean":
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
119 if args.axes == "Row":
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
120 matrix, nonNumCnt, nanCnt = nan_replacer_mean_rows(matrix)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
121 Labeler(matrix,og_cols,og_rows,args.output_file_txt)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
122 #OLD_labeler(matrix, og_cols, og_rows, args.output_file_txt)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
123 #print('Mean,Row')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
124 if nonNumCnt > 0:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
125 print('ERROR Matrix has non-numbers that are non-NAN identifiers in matrix. Total and percent unknown strings found = '+str(nonNumCnt)+ ', %.2f' % (100.0*nonNumCnt/(1.0*len(og_cols)*len(og_rows)))+'%' )
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
126 sys.stderr.write('ERROR Matrix has non-numbers that are non-NAN identifiers in matrix. Total and percent unknown strings found = '+str(nonNumCnt)+ ', %.2f' % (100.0*nonNumCnt/(1.0*len(og_cols)*len(og_rows)))+'%' )
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
127 if nanCnt > 0:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
128 print('WARNING Matrix has '+str(nanCnt)+' that is %.2f' % (100.0*nanCnt/(1.0*len(og_cols)*len(og_rows)))+'% known NAN identifiers')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
129 sys.exit(-1)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
130 else:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
131 if nanCnt > 0:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
132 print('\nWARNING Matrix has '+str(nanCnt)+' that is %.2f' % (100.0*nanCnt/(1.0*len(og_cols)*len(og_rows)))+'% known NAN identifiers')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
133 else:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
134 print('\nMatrix is Good-to-Go -- all numbers in matrix. ')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
135 sys.exit(0)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
136 elif args.axes == "Column":
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
137 matrix, nonNumCnt, nanCnt = nan_replacer_mean_columns(matrix)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
138 Labeler(matrix,og_cols,og_rows,args.output_file_txt)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
139 #OLD_labeler(matrix, og_cols, og_rows, args.output_file_txt)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
140 #print('Mean,Column')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
141 if nonNumCnt > 0:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
142 print('\nERROR Matrix has non-numbers that are non-NAN identifiers in matrix. Total and percent unknown strings found = '+str(nonNumCnt)+ ', %.2f' % (100.0*nonNumCnt/(1.0*len(og_cols)*len(og_rows)))+'%' )
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
143 sys.stderr.write('\nERROR Matrix has non-numbers that are non-NAN identifiers in matrix. Total and percent unknown strings found = '+str(nonNumCnt)+ ', %.2f' % (100.0*nonNumCnt/(1.0*len(og_cols)*len(og_rows)))+'%' )
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
144 if nanCnt > 0:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
145 print('\nWARNING Matrix has '+str(nanCnt)+' that is %.2f' % (100.0*nanCnt/(1.0*len(og_cols)*len(og_rows)))+'% known NAN identifiers')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
146 sys.exit(-1)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
147 else:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
148 if nanCnt > 0:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
149 print('\nWARNING Matrix has '+str(nanCnt)+' that is %.2f' % (100.0*nanCnt/(1.0*len(og_cols)*len(og_rows)))+'% known NAN identifiers')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
150 else:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
151 print('\nMatrix is Good-to-Go -- all numbers in matrix. ')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
152 sys.exit(0)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
153 else:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
154 print('Mean, but given Invalid Axis= '+str(args.axes))
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
155 sys.stderr.write('Mean, but given Invalid Axis= '+str(args.axes))
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
156 elif args.replacement == "Zero":
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
157 matrix, nonNumCnt, nanCnt = nan_replacer_zero(matrix)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
158 Labeler(matrix,og_cols,og_rows,args.output_file_txt)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
159 #OLD_labeler(matrix, og_cols, og_rows, args.output_file_txt)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
160 if nonNumCnt > 0:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
161 print('\nERROR Matrix has non-numbers that are non-NAN identifiers in matrix. Total and percent unknown strings found = '+str(nonNumCnt)+ ', %.2f' % (100.0*nonNumCnt/(1.0*len(og_cols)*len(og_rows)))+'%' )
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
162 sys.stderr.write('\nERROR Matrix has non-numbers that are non-NAN identifiers in matrix. Total and percent unknown strings found = '+str(nonNumCnt)+ ', %.2f' % (100.0*nonNumCnt/(1.0*len(og_cols)*len(og_rows)))+'%' )
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
163 if nanCnt > 0:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
164 print('\nWARNING Matrix has '+str(nanCnt)+' that is %.2f' % (100.0*nanCnt/(1.0*len(og_cols)*len(og_rows)))+'% known NAN identifiers')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
165 sys.exit(-1)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
166 else:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
167 if nanCnt > 0:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
168 print('\nWARNING Matrix has '+str(nanCnt)+' that is %.2f' % (100.0*nanCnt/(1.0*len(og_cols)*len(og_rows)))+'% known NAN identifiers')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
169 else:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
170 print('\nMatrix is Good-to-Go -- all numbers in matrix. ')
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
171 sys.exit(0)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
172 else:
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
173 print('zero, but given Invalid Axis= '+str(args.axes))
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
174 sys.stderr.write('zero, but given Invalid Axis= '+str(args.axes))
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
175 sys.exit(-2)
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
176
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
177
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
178 if __name__ == '__main__':
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
179 main()
f1bcd79cd923 Uploaded
insilico-bob
parents:
diff changeset
180 print("done")