annotate kraken_filter.py @ 14:fd27c97c8366 draft default tip

Uploaded
author cschu
date Mon, 18 May 2015 15:55:47 -0400
parents 0916697409ea
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
0916697409ea Uploaded
cschu
parents:
diff changeset
1 #!/usr/bin/env python
0916697409ea Uploaded
cschu
parents:
diff changeset
2
0916697409ea Uploaded
cschu
parents:
diff changeset
3 import os
0916697409ea Uploaded
cschu
parents:
diff changeset
4 import sys
0916697409ea Uploaded
cschu
parents:
diff changeset
5 import argparse
0916697409ea Uploaded
cschu
parents:
diff changeset
6 import subprocess
0916697409ea Uploaded
cschu
parents:
diff changeset
7 import struct
0916697409ea Uploaded
cschu
parents:
diff changeset
8 import shutil
0916697409ea Uploaded
cschu
parents:
diff changeset
9 import tempfile
0916697409ea Uploaded
cschu
parents:
diff changeset
10
0916697409ea Uploaded
cschu
parents:
diff changeset
11 from checkFileFormat import verifyFileFormat
0916697409ea Uploaded
cschu
parents:
diff changeset
12
0916697409ea Uploaded
cschu
parents:
diff changeset
13 DEFAULT_KRAKEN_DB='/tsl/data/krakendb/ktest/db'
0916697409ea Uploaded
cschu
parents:
diff changeset
14 logfile = None
0916697409ea Uploaded
cschu
parents:
diff changeset
15
0916697409ea Uploaded
cschu
parents:
diff changeset
16
0916697409ea Uploaded
cschu
parents:
diff changeset
17 def getDescendents(taxID, tree):
0916697409ea Uploaded
cschu
parents:
diff changeset
18 descendents = set([taxID])
0916697409ea Uploaded
cschu
parents:
diff changeset
19 queue = [taxID]
0916697409ea Uploaded
cschu
parents:
diff changeset
20 while queue:
0916697409ea Uploaded
cschu
parents:
diff changeset
21 node = queue.pop()
0916697409ea Uploaded
cschu
parents:
diff changeset
22
0916697409ea Uploaded
cschu
parents:
diff changeset
23 children = tree.get(node, set())
0916697409ea Uploaded
cschu
parents:
diff changeset
24 if children:
0916697409ea Uploaded
cschu
parents:
diff changeset
25 descendents = descendents.union(children)
0916697409ea Uploaded
cschu
parents:
diff changeset
26 queue.extend(children)
0916697409ea Uploaded
cschu
parents:
diff changeset
27 pass
0916697409ea Uploaded
cschu
parents:
diff changeset
28 return descendents
0916697409ea Uploaded
cschu
parents:
diff changeset
29
0916697409ea Uploaded
cschu
parents:
diff changeset
30 def anabl_getSeqsFromFastX(fn, X=2):
0916697409ea Uploaded
cschu
parents:
diff changeset
31 it = open(fn)
0916697409ea Uploaded
cschu
parents:
diff changeset
32 for head in it:
0916697409ea Uploaded
cschu
parents:
diff changeset
33 try:
0916697409ea Uploaded
cschu
parents:
diff changeset
34 yield (head.strip(), tuple(map(lambda x:x.strip(),
0916697409ea Uploaded
cschu
parents:
diff changeset
35 ([it.next() for i in xrange(X - 1)]))))
0916697409ea Uploaded
cschu
parents:
diff changeset
36 except:
0916697409ea Uploaded
cschu
parents:
diff changeset
37 break
0916697409ea Uploaded
cschu
parents:
diff changeset
38 pass
0916697409ea Uploaded
cschu
parents:
diff changeset
39 it.close()
0916697409ea Uploaded
cschu
parents:
diff changeset
40 pass
0916697409ea Uploaded
cschu
parents:
diff changeset
41
0916697409ea Uploaded
cschu
parents:
diff changeset
42 def readTaxonomy(db):
0916697409ea Uploaded
cschu
parents:
diff changeset
43 nodeNames = []
0916697409ea Uploaded
cschu
parents:
diff changeset
44 for line in open(os.path.join(db, 'taxonomy', 'names.dmp')):
0916697409ea Uploaded
cschu
parents:
diff changeset
45 line = line.strip().strip('|').strip()
0916697409ea Uploaded
cschu
parents:
diff changeset
46 if not line: break
0916697409ea Uploaded
cschu
parents:
diff changeset
47 line = line.split('\t|\t')
0916697409ea Uploaded
cschu
parents:
diff changeset
48
0916697409ea Uploaded
cschu
parents:
diff changeset
49 if line[3].strip() == 'scientific name':
0916697409ea Uploaded
cschu
parents:
diff changeset
50 nodeNames.append((int(line[0].strip()), line[1].strip()))
0916697409ea Uploaded
cschu
parents:
diff changeset
51 # break
0916697409ea Uploaded
cschu
parents:
diff changeset
52 pass
0916697409ea Uploaded
cschu
parents:
diff changeset
53
0916697409ea Uploaded
cschu
parents:
diff changeset
54 nodeRanks = []
0916697409ea Uploaded
cschu
parents:
diff changeset
55 nodeChildren = {}
0916697409ea Uploaded
cschu
parents:
diff changeset
56 for line in open(os.path.join(db, 'taxonomy', 'nodes.dmp')):
0916697409ea Uploaded
cschu
parents:
diff changeset
57 line = line.strip().strip('|').strip()
0916697409ea Uploaded
cschu
parents:
diff changeset
58 if not line: break
0916697409ea Uploaded
cschu
parents:
diff changeset
59 line = map(lambda x:x.strip(), line.split('\t|\t'))
0916697409ea Uploaded
cschu
parents:
diff changeset
60 line[:2] = map(int, line[:2])
0916697409ea Uploaded
cschu
parents:
diff changeset
61 if line[0] == 1:
0916697409ea Uploaded
cschu
parents:
diff changeset
62 line[1] = 0
0916697409ea Uploaded
cschu
parents:
diff changeset
63 try:
0916697409ea Uploaded
cschu
parents:
diff changeset
64 nodeChildren[line[1]].add(line[0])
0916697409ea Uploaded
cschu
parents:
diff changeset
65 except:
0916697409ea Uploaded
cschu
parents:
diff changeset
66 nodeChildren[line[1]] = set([line[0]])
0916697409ea Uploaded
cschu
parents:
diff changeset
67 nodeRanks.append((line[0], line[2]))
0916697409ea Uploaded
cschu
parents:
diff changeset
68 # break
0916697409ea Uploaded
cschu
parents:
diff changeset
69
0916697409ea Uploaded
cschu
parents:
diff changeset
70 return dict(nodeNames), dict(nodeRanks), nodeChildren
0916697409ea Uploaded
cschu
parents:
diff changeset
71
0916697409ea Uploaded
cschu
parents:
diff changeset
72 def getFastqIdentifier(string):
0916697409ea Uploaded
cschu
parents:
diff changeset
73 if string.endswith('/1') or string.endswith('/2'):
0916697409ea Uploaded
cschu
parents:
diff changeset
74 return string[1:-2]
0916697409ea Uploaded
cschu
parents:
diff changeset
75 else:
0916697409ea Uploaded
cschu
parents:
diff changeset
76 return string.split()[0][1:]
0916697409ea Uploaded
cschu
parents:
diff changeset
77
0916697409ea Uploaded
cschu
parents:
diff changeset
78 def runFilter(db, taxID, inputClassification, inputR1, outputR1, inputR2=None, outputR2=None, fastx=4, debug=False):
0916697409ea Uploaded
cschu
parents:
diff changeset
79 global logfile
0916697409ea Uploaded
cschu
parents:
diff changeset
80 logfile.write('Reading taxonomy...\n')
0916697409ea Uploaded
cschu
parents:
diff changeset
81 logfile.flush()
0916697409ea Uploaded
cschu
parents:
diff changeset
82 taxonomyInfo = readTaxonomy(db)
0916697409ea Uploaded
cschu
parents:
diff changeset
83 keepSequences = set()
0916697409ea Uploaded
cschu
parents:
diff changeset
84 logfile.write('Traversing requested taxonomy branch...\n')
0916697409ea Uploaded
cschu
parents:
diff changeset
85 logfile.flush()
0916697409ea Uploaded
cschu
parents:
diff changeset
86 validIDs = getDescendents(taxID, taxonomyInfo[2])
0916697409ea Uploaded
cschu
parents:
diff changeset
87 logfile.write('Family tree of %s has %i descendents.\n' % (str(taxID), len(validIDs)))
0916697409ea Uploaded
cschu
parents:
diff changeset
88 logfile.flush()
0916697409ea Uploaded
cschu
parents:
diff changeset
89 if debug:
0916697409ea Uploaded
cschu
parents:
diff changeset
90 for vid in validIDs:
0916697409ea Uploaded
cschu
parents:
diff changeset
91 logfile.write('Added %s to validIDs.\n' % vid)
0916697409ea Uploaded
cschu
parents:
diff changeset
92 logfile.flush()
0916697409ea Uploaded
cschu
parents:
diff changeset
93
0916697409ea Uploaded
cschu
parents:
diff changeset
94
0916697409ea Uploaded
cschu
parents:
diff changeset
95 logfile.write('Filtering sequences...\n')
0916697409ea Uploaded
cschu
parents:
diff changeset
96 logfile.flush()
0916697409ea Uploaded
cschu
parents:
diff changeset
97 nseqs = 0
0916697409ea Uploaded
cschu
parents:
diff changeset
98 for line in open(inputClassification):
0916697409ea Uploaded
cschu
parents:
diff changeset
99 nseqs += 1
0916697409ea Uploaded
cschu
parents:
diff changeset
100 line = line.strip().split()
0916697409ea Uploaded
cschu
parents:
diff changeset
101 takeUnclassified = taxID == 0 and line[0] == 'U'
0916697409ea Uploaded
cschu
parents:
diff changeset
102 takeClassified = line[0] == 'C' and int(line[2]) in validIDs
0916697409ea Uploaded
cschu
parents:
diff changeset
103 if takeUnclassified or takeClassified:
0916697409ea Uploaded
cschu
parents:
diff changeset
104 keepSequences.add(line[1].strip())
0916697409ea Uploaded
cschu
parents:
diff changeset
105 if debug:
0916697409ea Uploaded
cschu
parents:
diff changeset
106 logfile.write('Added %s to keepSequences.\n' % line[1].strip())
0916697409ea Uploaded
cschu
parents:
diff changeset
107 logfile.flush()
0916697409ea Uploaded
cschu
parents:
diff changeset
108 logfile.write('Keeping %i of %i sequences (%.1f).\n' % (len(keepSequences), nseqs, float(len(keepSequences))/nseqs))
0916697409ea Uploaded
cschu
parents:
diff changeset
109 logfile.flush()
0916697409ea Uploaded
cschu
parents:
diff changeset
110 logfile.write('Writing filtered sequence sets...\n')
0916697409ea Uploaded
cschu
parents:
diff changeset
111 logfile.flush()
0916697409ea Uploaded
cschu
parents:
diff changeset
112 fwdOut = open(outputR1, 'wb')
0916697409ea Uploaded
cschu
parents:
diff changeset
113 fwdGen = anabl_getSeqsFromFastX(inputR1, X=fastx)
0916697409ea Uploaded
cschu
parents:
diff changeset
114
0916697409ea Uploaded
cschu
parents:
diff changeset
115 revOut, revGen = None, None
0916697409ea Uploaded
cschu
parents:
diff changeset
116 revSid, revSeq = None, None
0916697409ea Uploaded
cschu
parents:
diff changeset
117 if outputR2 is not None and inputR2 is not None:
0916697409ea Uploaded
cschu
parents:
diff changeset
118 revOut = open(outputR2, 'wb')
0916697409ea Uploaded
cschu
parents:
diff changeset
119 revGen = anabl_getSeqsFromFastX(inputR2, X=fastx)
0916697409ea Uploaded
cschu
parents:
diff changeset
120
0916697409ea Uploaded
cschu
parents:
diff changeset
121 fqid1, fqid2 = None, None
0916697409ea Uploaded
cschu
parents:
diff changeset
122 while True:
0916697409ea Uploaded
cschu
parents:
diff changeset
123 try:
0916697409ea Uploaded
cschu
parents:
diff changeset
124 fwdSid, fwdSeq = fwdGen.next()
0916697409ea Uploaded
cschu
parents:
diff changeset
125 fqid1 = getFastqIdentifier(fwdSid)
0916697409ea Uploaded
cschu
parents:
diff changeset
126 if revGen is not None:
0916697409ea Uploaded
cschu
parents:
diff changeset
127 revSid, revSeq = revGen.next()
0916697409ea Uploaded
cschu
parents:
diff changeset
128 fqid2 = getFastqIdentifier(revSid)
0916697409ea Uploaded
cschu
parents:
diff changeset
129 except:
0916697409ea Uploaded
cschu
parents:
diff changeset
130 break
0916697409ea Uploaded
cschu
parents:
diff changeset
131 if fqid1 != fqid2 and fqid2 is not None:
0916697409ea Uploaded
cschu
parents:
diff changeset
132 sys.stderr.write('Error: fqid-mismatch %s %s.\n' % (fqid1, fqid2))
0916697409ea Uploaded
cschu
parents:
diff changeset
133 sys.exit(1)
0916697409ea Uploaded
cschu
parents:
diff changeset
134 if fqid1 in keepSequences:
0916697409ea Uploaded
cschu
parents:
diff changeset
135 fwdOut.write(('%s\n' * fastx) % ((fwdSid,) + fwdSeq))
0916697409ea Uploaded
cschu
parents:
diff changeset
136 if revOut is not None:
0916697409ea Uploaded
cschu
parents:
diff changeset
137 revOut.write(('%s\n' * fastx) % ((revSid,) + revSeq))
0916697409ea Uploaded
cschu
parents:
diff changeset
138 else:
0916697409ea Uploaded
cschu
parents:
diff changeset
139 # sys.stdout.write('%s is not in keepSequences\n' % fqid1)
0916697409ea Uploaded
cschu
parents:
diff changeset
140 pass
0916697409ea Uploaded
cschu
parents:
diff changeset
141 fwdOut.close()
0916697409ea Uploaded
cschu
parents:
diff changeset
142 if revOut is not None:
0916697409ea Uploaded
cschu
parents:
diff changeset
143 revOut.close()
0916697409ea Uploaded
cschu
parents:
diff changeset
144 pass
0916697409ea Uploaded
cschu
parents:
diff changeset
145
0916697409ea Uploaded
cschu
parents:
diff changeset
146
0916697409ea Uploaded
cschu
parents:
diff changeset
147 def main(argv):
0916697409ea Uploaded
cschu
parents:
diff changeset
148
0916697409ea Uploaded
cschu
parents:
diff changeset
149 descr = ''
0916697409ea Uploaded
cschu
parents:
diff changeset
150 parser = argparse.ArgumentParser(description=descr)
0916697409ea Uploaded
cschu
parents:
diff changeset
151 parser.add_argument('--dbtype', default='builtinDB', help='Is database built-in or supplied externally?')
0916697409ea Uploaded
cschu
parents:
diff changeset
152 parser.add_argument('--db', default=DEFAULT_KRAKEN_DB, help='Path to kraken db')
0916697409ea Uploaded
cschu
parents:
diff changeset
153 parser.add_argument('--in1', help='The r1-file (single-end reads or left paired-end reads).')
0916697409ea Uploaded
cschu
parents:
diff changeset
154 parser.add_argument('--in2', help='The r2-file (right paired-end reads)')
0916697409ea Uploaded
cschu
parents:
diff changeset
155 parser.add_argument('--taxid', default=1, help='The root taxon id of the requested branch', type=int)
0916697409ea Uploaded
cschu
parents:
diff changeset
156 parser.add_argument('--kraken-results', type=str, help='A file containing kraken classification results for the input sequences.')
0916697409ea Uploaded
cschu
parents:
diff changeset
157 parser.add_argument('--input-format', help='Input sequences stored in fa or fq file(s).', default='fq')
0916697409ea Uploaded
cschu
parents:
diff changeset
158
0916697409ea Uploaded
cschu
parents:
diff changeset
159 parser.add_argument('--out1', type=str, help='The r1-output file.')
0916697409ea Uploaded
cschu
parents:
diff changeset
160 parser.add_argument('--out2', type=str, help='The r2-output file.')
0916697409ea Uploaded
cschu
parents:
diff changeset
161 parser.add_argument('--debug', action='store_true')
0916697409ea Uploaded
cschu
parents:
diff changeset
162 parser.add_argument('--logfile', type=str, help='A logfile.', default='kraken_filter.log')
0916697409ea Uploaded
cschu
parents:
diff changeset
163 args = parser.parse_args()
0916697409ea Uploaded
cschu
parents:
diff changeset
164
0916697409ea Uploaded
cschu
parents:
diff changeset
165 kraken_params = []
0916697409ea Uploaded
cschu
parents:
diff changeset
166 kraken_input = []
0916697409ea Uploaded
cschu
parents:
diff changeset
167
0916697409ea Uploaded
cschu
parents:
diff changeset
168 global logfile
0916697409ea Uploaded
cschu
parents:
diff changeset
169 logfile = open(args.logfile, 'wb')
0916697409ea Uploaded
cschu
parents:
diff changeset
170 if 'db' not in args or not os.path.exists(args.db):
0916697409ea Uploaded
cschu
parents:
diff changeset
171 sys.stderr.write('Error: database is missing.\n')
0916697409ea Uploaded
cschu
parents:
diff changeset
172 sys.exit(1)
0916697409ea Uploaded
cschu
parents:
diff changeset
173 kraken_params.extend(['--db', args.db])
0916697409ea Uploaded
cschu
parents:
diff changeset
174 # check whether input file(s) exist(s)
0916697409ea Uploaded
cschu
parents:
diff changeset
175
0916697409ea Uploaded
cschu
parents:
diff changeset
176 if 'kraken_results' in args and os.path.exists(args.kraken_results):
0916697409ea Uploaded
cschu
parents:
diff changeset
177 kraken_input.append(args.kraken_results)
0916697409ea Uploaded
cschu
parents:
diff changeset
178 else:
0916697409ea Uploaded
cschu
parents:
diff changeset
179 sys.stderr.write('Error: kraken-classification is missing.\n')
0916697409ea Uploaded
cschu
parents:
diff changeset
180 sys.exit(1)
0916697409ea Uploaded
cschu
parents:
diff changeset
181 pass
0916697409ea Uploaded
cschu
parents:
diff changeset
182
0916697409ea Uploaded
cschu
parents:
diff changeset
183 if not ('in1' in args and os.path.exists(args.in1)):
0916697409ea Uploaded
cschu
parents:
diff changeset
184 sys.stderr.write('Error: left/single input file (%s) is missing.\n' % args.in1)
0916697409ea Uploaded
cschu
parents:
diff changeset
185 sys.exit(1)
0916697409ea Uploaded
cschu
parents:
diff changeset
186 if not verifyFileFormat(args.in1, args.input_format):
0916697409ea Uploaded
cschu
parents:
diff changeset
187 sys.stderr.write('Error: fwd/single input file has the wrong format assigned.\n')
0916697409ea Uploaded
cschu
parents:
diff changeset
188 sys.exit(1)
0916697409ea Uploaded
cschu
parents:
diff changeset
189
0916697409ea Uploaded
cschu
parents:
diff changeset
190 kraken_input.append(args.in1)
0916697409ea Uploaded
cschu
parents:
diff changeset
191 if 'in2' in args:
0916697409ea Uploaded
cschu
parents:
diff changeset
192 if args.in2 is not None and not os.path.exists(args.in2):
0916697409ea Uploaded
cschu
parents:
diff changeset
193 sys.stderr.write('Error: right input file (%s) is missing.\n' % args.in2)
0916697409ea Uploaded
cschu
parents:
diff changeset
194 sys.exit(1)
0916697409ea Uploaded
cschu
parents:
diff changeset
195 elif args.in2 is not None and not verifyFileFormat(args.in2, args.input_format):
0916697409ea Uploaded
cschu
parents:
diff changeset
196 sys.stderr.write('Error: rev input file has the wrong format assigned.\n')
0916697409ea Uploaded
cschu
parents:
diff changeset
197 sys.exit(1)
0916697409ea Uploaded
cschu
parents:
diff changeset
198 elif args.in2 is not None:
0916697409ea Uploaded
cschu
parents:
diff changeset
199 kraken_params.append('--paired')
0916697409ea Uploaded
cschu
parents:
diff changeset
200 kraken_input.append(args.in2)
0916697409ea Uploaded
cschu
parents:
diff changeset
201 else:
0916697409ea Uploaded
cschu
parents:
diff changeset
202 pass
0916697409ea Uploaded
cschu
parents:
diff changeset
203 else:
0916697409ea Uploaded
cschu
parents:
diff changeset
204 pass
0916697409ea Uploaded
cschu
parents:
diff changeset
205
0916697409ea Uploaded
cschu
parents:
diff changeset
206 if 'out2' in args and 'in2' in args:
0916697409ea Uploaded
cschu
parents:
diff changeset
207 input2, output2 = args.in2, args.out2
0916697409ea Uploaded
cschu
parents:
diff changeset
208 else:
0916697409ea Uploaded
cschu
parents:
diff changeset
209 input2, output2 = None, None
0916697409ea Uploaded
cschu
parents:
diff changeset
210
0916697409ea Uploaded
cschu
parents:
diff changeset
211 if args.taxid < 0:
0916697409ea Uploaded
cschu
parents:
diff changeset
212 sys.stderr.write('Error: invalid taxon id %i\n' % args.taxid)
0916697409ea Uploaded
cschu
parents:
diff changeset
213 sys.exit(1)
0916697409ea Uploaded
cschu
parents:
diff changeset
214 kraken_params.extend(['--taxid', args.taxid])
0916697409ea Uploaded
cschu
parents:
diff changeset
215
0916697409ea Uploaded
cschu
parents:
diff changeset
216 if args.input_format == 'fq':
0916697409ea Uploaded
cschu
parents:
diff changeset
217 kraken_params.append('--fastq-input')
0916697409ea Uploaded
cschu
parents:
diff changeset
218 fastx = 4
0916697409ea Uploaded
cschu
parents:
diff changeset
219 else:
0916697409ea Uploaded
cschu
parents:
diff changeset
220 kraken_params.append('--fasta-input')
0916697409ea Uploaded
cschu
parents:
diff changeset
221 fastx = 2
0916697409ea Uploaded
cschu
parents:
diff changeset
222
0916697409ea Uploaded
cschu
parents:
diff changeset
223
0916697409ea Uploaded
cschu
parents:
diff changeset
224
0916697409ea Uploaded
cschu
parents:
diff changeset
225 # firstChar = open(args.in1).read(1)
0916697409ea Uploaded
cschu
parents:
diff changeset
226 # if firstChar == '>':
0916697409ea Uploaded
cschu
parents:
diff changeset
227 # kraken_params.append('--fasta-input')
0916697409ea Uploaded
cschu
parents:
diff changeset
228 # fastx = 2
0916697409ea Uploaded
cschu
parents:
diff changeset
229 # elif firstChar == '@':
0916697409ea Uploaded
cschu
parents:
diff changeset
230 # kraken_params.append('--fastq-input')
0916697409ea Uploaded
cschu
parents:
diff changeset
231 # fastx = 4
0916697409ea Uploaded
cschu
parents:
diff changeset
232 #else:
0916697409ea Uploaded
cschu
parents:
diff changeset
233 # """ This will currently disable working with gzipped/bzipped files. """
0916697409ea Uploaded
cschu
parents:
diff changeset
234 # sys.stderr.write('Error: Input file starts with unknown symbol %s.\n' % firstChar)
0916697409ea Uploaded
cschu
parents:
diff changeset
235 # sys.exit(1)
0916697409ea Uploaded
cschu
parents:
diff changeset
236 # pass
0916697409ea Uploaded
cschu
parents:
diff changeset
237
0916697409ea Uploaded
cschu
parents:
diff changeset
238 #open(args.kraken_filtered_r1, 'wb').write('\n'.join(map(str, kraken_params + kraken_input)))
0916697409ea Uploaded
cschu
parents:
diff changeset
239
0916697409ea Uploaded
cschu
parents:
diff changeset
240 runFilter(args.db, int(args.taxid), args.kraken_results,
0916697409ea Uploaded
cschu
parents:
diff changeset
241 args.in1, args.out1,
0916697409ea Uploaded
cschu
parents:
diff changeset
242 inputR2=input2, outputR2=output2, fastx=fastx,
0916697409ea Uploaded
cschu
parents:
diff changeset
243 debug=args.debug)
0916697409ea Uploaded
cschu
parents:
diff changeset
244
0916697409ea Uploaded
cschu
parents:
diff changeset
245 logfile.close()
0916697409ea Uploaded
cschu
parents:
diff changeset
246
0916697409ea Uploaded
cschu
parents:
diff changeset
247 pass
0916697409ea Uploaded
cschu
parents:
diff changeset
248
0916697409ea Uploaded
cschu
parents:
diff changeset
249
0916697409ea Uploaded
cschu
parents:
diff changeset
250
0916697409ea Uploaded
cschu
parents:
diff changeset
251
0916697409ea Uploaded
cschu
parents:
diff changeset
252 # main(sys.argv[1:])
0916697409ea Uploaded
cschu
parents:
diff changeset
253
0916697409ea Uploaded
cschu
parents:
diff changeset
254 if __name__ == '__main__': main(sys.argv[1:])