annotate pathoscope2.py @ 3:313b8c47015d draft

Uploaded
author jasper
date Tue, 10 Jan 2017 15:40:30 -0500
parents d153ec2e2fec
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
1 #!/usr/bin/env python
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
2 # Initial author: Solaiappan Manimaran
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
3 # Wrapper file for the following modules:
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
4 # patholib: generates host/target genome libraries from ncbi nt database for given taxon IDs
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
5 # pathomap: aligns reads to host/target database independent of read type using Bowtie2
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
6 # pathoid: reassigns ambiguous reads to the correct genome using statistical models
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
7 # pathoreport: Writes sam files to xml format
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
8
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
9 #usage information: pathoscope.py -h
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
10
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
11 # Pathoscope 2.0 - Predicts strains of genomes in unassembled Nextgen seq data
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
12 # Copyright (C) 2013 Johnson Lab - Boston University
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
13 #
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
14 # This program is free software: you can redistribute it and/or modify
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
15 # it under the terms of the GNU General Public License as published by
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
16 # the Free Software Foundation, either version 3 of the License, or
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
17 # any later version.
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
18 #
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
19 # This program is distributed in the hope that it will be useful,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
20 # but WITHOUT ANY WARRANTY; without even the implied warranty of
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
21 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
22 # GNU General Public License for more details.
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
23 #
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
24 # You should have received a copy of the GNU General Public License
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
25 # along with this program. If not, see <http://www.gnu.org/licenses/>.
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
26
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
27 import os, sys
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
28 pathoscopedir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
29 sys.path.insert(0,pathoscopedir)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
30
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
31 import argparse
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
32 import pathoscope
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
33 from pathoscope.patholib import pathoLib
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
34 from pathoscope.pathomap import PathoMapA
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
35 from pathoscope.pathoid import PathoID
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
36 from pathoscope.pathoreport import PathoReportA
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
37 from time import time
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
38
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
39 # ===========================================================
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
40 # main ()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
41 parser = argparse.ArgumentParser(description="Pathoscope")
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
42
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
43 # create the top-level parser
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
44 parser.add_argument('--version', action='version', version='%(prog)s 2.0.6')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
45 parser.add_argument('--verbose', action='store_const', dest='verbose',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
46 required=False, const=True, default=False, help='Prints verbose text while running')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
47 subparsers = parser.add_subparsers(dest='subcommand', help='Select one of the following sub-commands')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
48
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
49 # create the parser for the "LIB" command
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
50 parser_a = subparsers.add_parser('LIB', help='Pathoscope taxon level reference genome Library creation Module')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
51 parser_a.add_argument('-genomeFile', action='store', dest='lib_reference', required=True,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
52 help='Specify reference genome(Download ftp://ftp.ncbi.nih.gov/blast/db/FASTA/nt.gz)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
53 parser_a.add_argument('-taxonIds', action='store', dest='lib_taxon_ids', required=False, default='X',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
54 help='Specify taxon ids of your interest with comma separated '
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
55 '(if you have multiple taxon ids). If you do not specify this option, '
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
56 'it will work on all entries in the reference file. For taxonomy id lookup, '
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
57 'refer to http://www.ncbi.nlm.nih.gov/taxonomy')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
58 parser_a.add_argument('-excludeTaxonIds', action='store', dest='lib_exclude_taxon_ids',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
59 required=False, default='X',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
60 help='Specify taxon ids to exclude with comma separated '
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
61 '(if you have multiple taxon ids to exclude).')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
62 parser_a.add_argument('--noDesc', action='store_const', dest='lib_nodesc', required=False, const=True,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
63 default=False, help='Do not keep an additional description in original fasta seq header.'
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
64 'Depending on NGS aligner, a long sequence header may slow down its mapping process.')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
65 parser_a.add_argument('--subTax', action='store_const', dest='lib_subtax', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
66 const=True, default=False, help='To include all sub taxonomies under the query taxonomy id.'
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
67 ' e.g., if you set -t 4751 --subtax, it will cover all sub taxonomies under taxon id 4751 '
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
68 '(fungi).')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
69 parser_a.add_argument('--online', action='store_const', dest='lib_online_search', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
70 const=True, default=False, help='To enable online searching in case you cannot find a '
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
71 'correct taxonomy id for a given gi. When there are many entries in nt whose gi is invalid, '
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
72 'this option may slow down the overall process.')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
73 parser_a.add_argument('-dbhost', action='store', dest='lib_dbhost', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
74 default='localhost', help='specify hostname running mysql if you want to use mysql '
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
75 'instead of hash method in mapping gi to taxonomy id')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
76 parser_a.add_argument('-dbport', action='store', dest='lib_dbport', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
77 default=3306, type=int, help='provide mysql server port if different from default (3306)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
78 parser_a.add_argument('-dbuser', action='store', dest='lib_dbuser', required=False, default='X',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
79 help='user name to access mysql')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
80 parser_a.add_argument('-dbpasswd', action='store', dest='lib_dbpasswd', required=False, default='X',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
81 help='provide password associate with user')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
82 parser_a.add_argument('-db', action='store', dest='lib_db', required=False, default='pathodb',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
83 help='mysql pathoscope database name (default: pathodb)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
84 parser_a.add_argument('-outDir', action='store', default='.', dest='lib_outdir',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
85 help='Output Directory (Default=. (current directory))')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
86 parser_a.add_argument('-outPrefix', action='store', dest='lib_outprefix', required=True,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
87 help='specify an output prefix to name your target database')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
88
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
89 # create the parser for the "MAP" command
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
90 parser_b = subparsers.add_parser('MAP', help='Pathoscope MAP Module')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
91 parser_b.add_argument('-U', default='', action='store', dest='map_inputread', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
92 help='Input Read Fastq File (Unpaired/Single-end)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
93 parser_b.add_argument('-1', default='', action='store', dest='map_inputread1', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
94 help='Input Read Fastq File (Pair 1)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
95 parser_b.add_argument('-2', default='', action='store', dest='map_inputread2', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
96 help='Input Read Fastq File (Pair 2)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
97 parser_b.add_argument('-targetRefFiles', default='', action='store',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
98 dest='map_targetref', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
99 help='Target Reference Genome Fasta Files Full Path (Comma Separated)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
100 parser_b.add_argument('-filterRefFiles', default='', action='store',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
101 dest='map_filterref', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
102 help='Filter Reference Genome Fasta Files Full Path (Comma Separated)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
103 parser_b.add_argument('-targetAlignParams', action='store',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
104 dest='map_targetalignparams', default=None, required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
105 help='Target Mapping Bowtie2 Parameters (Default: Pathoscope chosen best parameters)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
106 parser_b.add_argument('-filterAlignParams', action='store',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
107 dest='map_filteralignparams', default=None, required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
108 help='Filter Mapping Bowtie2 Parameters (Default: Use the same Target Mapping Bowtie2 parameters)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
109 parser_b.add_argument('-outDir', action='store', default='.',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
110 dest='map_outdir', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
111 help='Output Directory (Default=. (current directory))')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
112 parser_b.add_argument('-outAlign', action='store', default='outalign.sam',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
113 dest='map_outalign', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
114 help='Output Alignment File Name (Default=outalign.sam)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
115 parser_b.add_argument('-indexDir', action='store', default='.',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
116 dest='map_indexdir', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
117 help='Index Directory (Default=. (current directory))')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
118 parser_b.add_argument('-targetIndexPrefixes', default='', action='store',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
119 dest='map_targetindex', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
120 help='Target Index Prefixes (Comma Separated)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
121 parser_b.add_argument('-filterIndexPrefixes', default='', action='store',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
122 dest='map_filterindex', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
123 help='Filter Index Prefixes (Comma Separated)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
124 parser_b.add_argument('-targetAlignFiles', default='', action='store',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
125 dest='map_targetalign', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
126 help='Target Alignment Files Full Path (Comma Separated)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
127 parser_b.add_argument('-filterAlignFiles', default='', action='store',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
128 dest='map_filteralign', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
129 help='Filter Alignment Files Full Path (Comma Separated)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
130 parser_b.add_argument('-btHome', default=None, action='store',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
131 dest='map_bthome', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
132 help='Full Path to Bowtie2 binary directory (Default: Uses bowtie2 in system path)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
133 parser_b.add_argument('-numThreads', action='store', dest='map_numthreads', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
134 default=8, type=int, help='Number of threads to use by aligner (bowtie2) if different from default (8)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
135 parser_b.add_argument('-expTag', action='store', default='pathomap', dest='map_exp_tag',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
136 help='Experiment Tag added to files generated for identification (Default: pathomap)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
137 parser_b.add_argument('-outputFile', action='store', default='patho', dest='output',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
138 help='OutputFile (Default: pathomap)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
139
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
140 # create the parser for the "ID" command
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
141 parser_c = subparsers.add_parser('ID', help='Pathoscope ID Module')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
142 parser_c.add_argument('--outMatrix', action='store_true', default=False, dest='id_out_matrix',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
143 help='Output alignment matrix')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
144 parser_c.add_argument('--noUpdatedAlignFile', action='store_true', default=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
145 dest='id_noalign', help='Do not generate an updated alignment file')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
146 parser_c.add_argument('--noDisplayCutoff', action='store_true', default=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
147 dest='id_nocutoff', help='Do not cutoff display of genomes, even if it is insignificant')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
148 parser_c.add_argument('-scoreCutoff', action='store', default=0.01, type=float,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
149 dest='id_score_cutoff', help='Score Cutoff')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
150 parser_c.add_argument('-emEpsilon', action='store', default=1e-7, type=float,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
151 dest='id_emEpsilon', help='EM Algorithm Epsilon cutoff')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
152 parser_c.add_argument('-maxIter', action='store', default=50, type=int,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
153 dest='id_maxIter', help='EM Algorithm maximum iterations')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
154 parser_c.add_argument('-piPrior', action='store', default=0, type=int, dest='id_piPrior',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
155 help='EM Algorithm Pi Prior equivalent to adding n unique reads (Default: n=0)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
156 parser_c.add_argument('-thetaPrior', action='store', default=0, type=int, dest='id_thetaPrior',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
157 help='EM Algorithm Theta Prior equivalent to adding n non-unique reads (Default: n=0)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
158 parser_c.add_argument('-expTag', action='store', default='pathoid', dest='id_exp_tag',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
159 help='Experiment tag added to output file for easy identification (Default: pathoid)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
160 parser_c.add_argument('-outDir', action='store', default='.', dest='id_outdir',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
161 help='Output Directory (Default=. (current directory))')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
162 parser_c.add_argument('-fileType', action='store', default='sam', dest='id_ali_format',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
163 help='Alignment Format: sam/bl8/gnu-sam (Default: sam)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
164 parser_c.add_argument('-alignFile', action='store', dest='id_ali_file', required=True,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
165 help='Alignment file path')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
166 parser_c.add_argument('-tableFile', action='store', dest='id_tab_file', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
167 help='Output Table file')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
168 parser_c.add_argument('-reAlignFile', action='store', dest='id_re_file', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
169 help='Realignment file')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
170
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
171 # create the parser for the "REPORT" command
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
172 parser_d = subparsers.add_parser('REP', help='Pathoscope Report Module')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
173 parser_d.add_argument('-samtoolsHome', default=None, action='store',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
174 dest='rep_samtoolshome', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
175 help='Full Path to samtools binary directory (Default: Uses samtools in system path)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
176 parser_d.add_argument('-dbhost', action='store', dest='rep_dbhost', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
177 default='localhost', help='specify hostname running mysql if you want to use mysql '
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
178 'instead of hash method in mapping gi to taxonomy id')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
179 parser_d.add_argument('-dbport', action='store', dest='rep_dbport', required=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
180 default=3306, type=int, help='provide mysql server port if different from default (3306)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
181 parser_d.add_argument('-dbuser', action='store', dest='rep_dbuser', required=False, default='X',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
182 help='user name to access mysql')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
183 parser_d.add_argument('-dbpasswd', action='store', dest='rep_dbpasswd', required=False, default='X',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
184 help='provide password associate with user')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
185 parser_d.add_argument('-db', action='store', dest='rep_db', required=False, default='pathodb',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
186 help='mysql pathoscope database name (default: pathodb)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
187 parser_d.add_argument('-outDir', action='store', default='.', dest='rep_outdir',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
188 help='Output Directory')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
189 parser_d.add_argument('--contig', action='store_true', default=False, dest='rep_contig_flag',
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
190 help='Generate Contig Information (Needs samtools package installed)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
191 parser_d.add_argument('-samfile', action='store', dest='rep_ali_file', required=True,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
192 help='SAM Alignment file path')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
193 parser_d.add_argument('-xmlFile', action='store', dest='xml_file', required=True,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
194 help='SAM Alignment file path')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
195 parser_d.add_argument('-tableFile', action='store', dest='tsv_file', required=True,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
196 help='SAM Alignment file path')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
197 parser_d.add_argument('--noDisplayCutoff', action='store_true', default=False,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
198 dest='rep_nocutoff', help='Do not cutoff display of genomes, even if it is insignificant')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
199
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
200 parser_e = subparsers.add_parser('QC', help="PathoQC: Quality control program for high throughput sequencing reads")
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
201 parser_e.add_argument('-1', action='store', dest='qc_read1', required=True, default='', help='1st pair of read in PER or SER')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
202 parser_e.add_argument('-2', action='store', dest='qc_read2', required=False, default='', help='2nd pair of read in PER')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
203 parser_e.add_argument('-r', action='store', dest='qc_readL', required=False, default=0, type = int, help='let us know a mean read length (0:ignore. [1]:I want to know the range of read length after trimming, i:user_specified_mean_read_length)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
204 parser_e.add_argument('-t', action='store', dest='qc_phred_offset', required=False, default=33, type = int, help='specify a phred offset used in encoding base quality(0:not sure?, [33]:phred+33, 64:phred+64)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
205 parser_e.add_argument('-o', action='store', dest='qc_outdir', required=False, default='', help='specify output directory in full path')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
206 parser_e.add_argument('-s', action='store', dest='qc_sequencer', required=False, default='Illumina', help='tell us which sequencer generates the reads ([Illumina], PacBio, Roche454, IonTorrent)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
207 parser_e.add_argument('-m', action='store', dest='qc_len_cutoff', required=False, type=int, default=35, help='specify the min read length cutoff[35]')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
208 parser_e.add_argument('-a', action='store', dest='qc_adaptor', required=False, default='N', help='specify an adaptor (Y:have pathoQC detect it, [N]:ignore, ACGT:adaptor)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
209 parser_e.add_argument('-a2', action='store', dest='qc_adaptor2', required=False, default='N', help='specify a second adaptor if it is different from the first one (Y:have pathoQC detect it, [N]:ignore, ACGT:adaptor)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
210 #parser_e.add_argument('-k', action='store', dest='qc_primer', required=False, default='N', help='specify a primer')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
211 parser_e.add_argument('-q', action='store', dest='qc_qual_cutoff', required=False, type=int, default=0, help='specify a cutoff of base quality value to trim at the end of reads([0]:ignore, 1:let pathoQC take care of it, i:user_specified_cutoff_value)')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
212 parser_e.add_argument('-R', action='store', dest='qc_lower454', required=False, type=int, default=0, help='set to 1 if you want to mask all lower case bases that may correspond to sequence tag or adaptor in Roche454 or IonTorrent')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
213 parser_e.add_argument('-e', action='store', dest='qc_coff_entropy', required=False, type=int, default=30, help='specify a cutoff of entropy of low sequence complexity to filter out[0..100],default:30, set 0 to disable')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
214 parser_e.add_argument('-d', action='store', dest='qc_derep', required=False, type=int, default=1, help='filtering duplicates: [1] (exact duplicate), 2 (5\' duplicate), 3 (3\' duplicate), 4 (reverse complement exact duplicate), 5 (reverse complement 5\'/3\' duplicate)');
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
215 parser_e.add_argument('-g', action='store', dest='qc_add_valid_single', required=False, type=int, default=0, help='Set to 1 if you want to add a valid single read into a reduced valid PER set. Note that this option works only with PER')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
216 parser_e.add_argument('--no_prinseq', action='store_const', dest='qc_on_prinseq', required=False, const=False, default=True, help='to force to skip prinseq module')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
217
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
218 parser_e.add_argument('-p', action='store', dest='qc_num_threads', required=False, type=int, default=1, help='specify a total number of cpus to use[1]')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
219 parser_e.add_argument('--debug', action='store_const', dest='qc_debugF', required=False, const=True, default=False, help='working on debug mode')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
220 parser_e.add_argument('--version', action='version', version='PathoQC 1.0')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
221
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
222 def main():
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
223 # parse some argument lists
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
224 inputArgs = parser.parse_args()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
225
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
226 #### PathoID modules ####
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
227
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
228 start = time();
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
229
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
230 if (inputArgs.subcommand=='LIB'):
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
231 ################################################$
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
232 #append taxon id in the front of sequence header
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
233 ################################################$
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
234 NAs = 'X'
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
235 if inputArgs.lib_dbuser!=NAs and inputArgs.lib_dbpasswd==NAs:
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
236 print 'if you want to use mysql, make sure that you install pathoDB and '
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
237 'also specify the corresponding mysql password correctly '
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
238 '(Ask your mysql admin to access the database).'
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
239 MysqlConf=(inputArgs.lib_dbhost,inputArgs.lib_dbport,inputArgs.lib_dbuser,inputArgs.lib_dbpasswd,inputArgs.lib_db)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
240 taxon_ids=pathoLib.parse_input_app_build_nt_tgt(inputArgs.lib_taxon_ids)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
241 exclude_taxon_ids=pathoLib.parse_input_app_build_nt_tgt(inputArgs.lib_exclude_taxon_ids)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
242 (ncbiNt_ti,ncbiNt_invalid) = pathoLib.append_ti_into_fasta_app(inputArgs.lib_reference,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
243 taxon_ids, exclude_taxon_ids, inputArgs.lib_subtax,MysqlConf,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
244 not(inputArgs.lib_nodesc), inputArgs.lib_online_search, inputArgs.lib_outprefix,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
245 inputArgs.lib_outdir)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
246
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
247 if (inputArgs.subcommand=='MAP'):
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
248 pathoMapOptions = PathoMapA.PathoMapOptions()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
249 pathoMapOptions.verbose = inputArgs.verbose
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
250 pathoMapOptions.outDir = inputArgs.map_outdir
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
251 pathoMapOptions.indexDir = inputArgs.map_indexdir
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
252 pathoMapOptions.outAlignFile = inputArgs.map_outalign
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
253 pathoMapOptions.inReadFile = inputArgs.map_inputread
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
254 pathoMapOptions.inReadFilePair1 = inputArgs.map_inputread1
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
255 pathoMapOptions.inReadFilePair2 = inputArgs.map_inputread2
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
256 pathoMapOptions.targetAlignParameters = inputArgs.map_targetalignparams
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
257 pathoMapOptions.filterAlignParameters = inputArgs.map_filteralignparams
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
258 if (len(inputArgs.map_targetref)>0):
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
259 pathoMapOptions.targetRefFiles = inputArgs.map_targetref.split(",")
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
260 if (len(inputArgs.map_filterref)>0):
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
261 pathoMapOptions.filterRefFiles = inputArgs.map_filterref.split(",")
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
262 if (len(inputArgs.map_targetindex)>0):
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
263 pathoMapOptions.targetIndexPrefixes = inputArgs.map_targetindex.split(",")
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
264 if (len(inputArgs.map_filterindex)>0):
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
265 pathoMapOptions.filterIndexPrefixes = inputArgs.map_filterindex.split(",")
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
266 if (len(inputArgs.map_targetalign)>0):
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
267 pathoMapOptions.targetAlignFiles = [inputArgs.map_targetalign]
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
268 if (len(inputArgs.map_filteralign)>0):
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
269 pathoMapOptions.filterAlignFiles = [inputArgs.map_filteralign]
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
270 pathoMapOptions.btHome = inputArgs.map_bthome
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
271 pathoMapOptions.numThreads = inputArgs.map_numthreads
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
272 pathoMapOptions.exp_tag = inputArgs.map_exp_tag + "-"
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
273 PathoMapA.processPathoMap(pathoMapOptions)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
274 f1 = open('outalign.sam', 'r')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
275 # for line in f1:
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
276 # print line
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
277 f2 = open(inputArgs.output, 'wt')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
278 for line in f1:
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
279 f2.write(line)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
280 f1.close()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
281 f2.close()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
282 # f = open(output, 'wt')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
283 # f1 = open(outAlignFile, 'r')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
284 # for line in f1:
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
285 # print line
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
286 # f.write(line)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
287 # f.close()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
288 # f1.close()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
289
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
290 if (inputArgs.subcommand=='ID'):
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
291 pathoIdOptions = PathoID.PathoIdOptions(inputArgs.id_ali_file)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
292 pathoIdOptions.ali_format = inputArgs.id_ali_format
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
293 pathoIdOptions.verbose = inputArgs.verbose
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
294 pathoIdOptions.out_matrix_flag = inputArgs.id_out_matrix
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
295 pathoIdOptions.score_cutoff = inputArgs.id_score_cutoff
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
296 pathoIdOptions.exp_tag = inputArgs.id_exp_tag
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
297 pathoIdOptions.outdir = inputArgs.id_outdir
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
298 pathoIdOptions.emEpsilon = inputArgs.id_emEpsilon
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
299 pathoIdOptions.maxIter = inputArgs.id_maxIter
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
300 pathoIdOptions.piPrior = inputArgs.id_piPrior
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
301 pathoIdOptions.thetaPrior = inputArgs.id_thetaPrior
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
302 pathoIdOptions.noalign = inputArgs.id_noalign
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
303 pathoIdOptions.noCutOff = inputArgs.id_nocutoff
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
304 values = PathoID.pathoscope_reassign(pathoIdOptions)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
305 finalReport = values[0]
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
306 reAlignfile = values[-1]
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
307 tableFile = inputArgs.id_tab_file
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
308 realignFile = inputArgs.id_re_file
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
309
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
310 f = open(tableFile, 'wt')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
311 f1 = open(finalReport, 'r')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
312 for line in f1:
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
313 f.write(line)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
314 f.close()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
315 f1.close()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
316 f2 = open(realignFile, 'wt')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
317 f3 = open(reAlignfile, 'r')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
318 for line in f3:
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
319 f2.write(line)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
320 f2.close()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
321 f3.close()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
322
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
323 if (inputArgs.subcommand=='REP'):
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
324 pathoReportOptions = PathoReportA.PathoReportOptions(inputArgs.rep_ali_file)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
325 pathoReportOptions.verbose = inputArgs.verbose
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
326 pathoReportOptions.contigFlag = inputArgs.rep_contig_flag
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
327 pathoReportOptions.outDir = inputArgs.rep_outdir
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
328 pathoReportOptions.samtoolsHome = inputArgs.rep_samtoolshome
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
329 pathoReportOptions.noCutOff = inputArgs.rep_nocutoff
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
330 mysqlConf=(inputArgs.rep_dbhost,inputArgs.rep_dbport,inputArgs.rep_dbuser,
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
331 inputArgs.rep_dbpasswd,inputArgs.rep_db)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
332 pathoReportOptions.mysqlConf = mysqlConf
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
333 outTsv, outXml = PathoReportA.processPathoReport(pathoReportOptions)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
334 tsvfile = inputArgs.tsv_file
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
335 xmlfile = inputArgs.xml_file
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
336
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
337 f = open(tsvfile, 'wt')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
338 f1 = open(outTsv, 'r')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
339 for line in f1:
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
340 f.write(line)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
341 f.close()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
342 f1.close()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
343 f2 = open(xmlfile, 'wt')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
344 f3 = open(outXml, 'r')
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
345 for line in f3:
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
346 f2.write(line)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
347 f2.close()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
348 f3.close()
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
349
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
350 if (inputArgs.subcommand=='QC'):
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
351 qcargs = sys.argv[2:]
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
352 pathoqcdir = pathoscopedir + os.path.sep + 'pathoscope' + os.path.sep + 'pathoqc'
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
353 pathoqcfile = pathoqcdir + os.path.sep + 'pathoqc.py'
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
354 if os.path.exists(pathoqcfile):
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
355 cmd = sys.executable
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
356 cmd += " " + pathoqcfile + " "
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
357 cmd += " ".join(qcargs)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
358 print(cmd)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
359 os.system(cmd)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
360 else:
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
361 print("PathoQC (" + pathoqcfile + ") not found. Please download pathoqc_vXXX.tar.gz and "
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
362 "install it ("+pathoqcdir+") from http://sourceforge.net/projects/pathoscope/")
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
363
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
364 elapsed = time() - start;
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
365 if inputArgs.verbose:
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
366 print "Total Elapsed Time: %d" % (elapsed)
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
367
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
368
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
369 if __name__ == "__main__":
d153ec2e2fec Uploaded
jasper
parents:
diff changeset
370 main()