annotate ALFA/ALFA_wrapper.py @ 24:887c6cb328e9 draft

Uploaded
author charles-bernard
date Thu, 27 Oct 2016 10:49:16 -0400
parents 1714165f5df0
children f1a20d50c495
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
1 #!/usr/bin/python
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
2
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
3 import argparse
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
4 import logging
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
5 import os
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
6 import re
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
7 import shutil
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
8 import subprocess
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
9 import sys
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
10 import tempfile
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
11
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
12 def exit_and_explain(msg):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
13 logging.critical(msg)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
14 sys.exit(msg)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
15
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
16 def cleanup_before_exit(tmp_dir):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
17 if tmp_dir and os.path.exists(tmp_dir):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
18 shutil.rmtree(tmp_dir)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
19
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
20 def get_arg():
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
21 parser = argparse.ArgumentParser()
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
22 parser.add_argument('--project_name', dest='project_name', action='store', nargs=1, metavar='project_name', type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
23 #Input 1: Annotation File
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
24 parser.add_argument('--index', dest='indexes', action='store', nargs=2, metavar=('stranded_index_filename', 'unstranded_index_filename'), type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
25 parser.add_argument('--bi_index', dest='bi_indexes', action='store', nargs=1, metavar='built_in_indexes_dir_path', type=str )
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
26 parser.add_argument('--annotation', dest='annotation_file', action='store', nargs=1, metavar='annotation_gtf_file', type=str )
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
27 #Input 2: Mapped Reads
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
28 parser.add_argument('--reads_format', dest='reads_format', action='store', nargs=1, choices=['bam', 'bedgraph'], metavar='reads_format', type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
29 parser.add_argument('--reads', dest='reads', action='store', nargs='+', metavar=('bam_file1 label1',""), type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
30 parser.add_argument('--strandness', dest='strandness', action='store', nargs=1, default=['unstranded'], choices=['unstranded', 'forward', 'reverse'], metavar='strandness', type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
31 #Output files
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
32 parser.add_argument('--output_pdf', dest='output_pdf', action='store', nargs=1, metavar='output_pdf_filename', type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
33 parser.add_argument('--output_svg', dest='output_svg', action='store', nargs=2, metavar=('categories_svg_filename', 'biotypes_svg_filename'), type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
34 parser.add_argument('--output_png', dest='output_png', action='store', nargs=2, metavar=('categories_png_filename', 'biotypes_png_filename'), type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
35 parser.add_argument('--output_count', dest='output_count', action='store', nargs=1, metavar='output_count_filename', type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
36 parser.add_argument('--output_index', dest='output_indexes', action='store', nargs=2, metavar=('output_stranded_index_filename', 'output_unstranded_index_filename'), type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
37 #Output Options
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
38 parser.add_argument('--categories_depth', dest='categories_depth', action='store', nargs=1, default=[3], choices=range(1,5), metavar='categories_depth', type=int)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
39 parser.add_argument('--plot_format', dest='plot_format', action='store', nargs=1, choices=['pdf', 'png', 'svg'], metavar='plot_format', type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
40 parser.add_argument('--threshold', dest='threshold', action='store', nargs=2, metavar=('yMin', 'yMax'), type=float)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
41 #Internal variables
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
42 parser.add_argument('--log_report', dest='log_report', action='store', nargs=1, metavar='log_filename', type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
43 parser.add_argument('--galaxy_root', dest='GALAXY_ROOT_DIR', action='store', nargs=1, metavar='galaxy_root_path', type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
44 parser.add_argument('--tool_dir', dest='GALAXY_TOOL_DIR', action='store', nargs=1, metavar='galaxy_tool_dir_path', type=str)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
45 args = parser.parse_args()
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
46 return args
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
47
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
48 def make_tmp_dir(galaxy_root):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
49 parent_dir = os.path.join(galaxy_root, 'database/tmp/')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
50 if os.path.exists(parent_dir):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
51 tmp_dir = tempfile.mkdtemp(prefix='tmp', suffix='', dir=parent_dir)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
52 else:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
53 tmp_dir = tempfile.mkdtemp(prefix='tmp', suffix='', dir='.')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
54 return tmp_dir
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
55
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
56 def mv_and_rename_user_indexes(stranded_index, unstranded_index):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
57 index='index'
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
58 shutil.copy(stranded_index, index + '.stranded.index')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
59 shutil.copy(unstranded_index, index + '.unstranded.index')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
60 return index
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
61
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
62 def get_input2_args(reads_list, format):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
63 n = len(reads_list)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
64 if n%2 != 0:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
65 exit_and_explain('Problem with pairing reads filename and reads label')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
66 input2_args='-i'
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
67 k = 0
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
68 reads_filenames = [''] * (n/2)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
69 reads_labels = [''] * (n/2)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
70 for i in range(0, n, 2):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
71 reads_filenames[k] = reads_list[i].split('__fname__')[1]
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
72 reads_labels[k] = reads_list[i+1].split('__label__')[1]
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
73 if not reads_labels[k]:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
74 reads_labels[k] = 'sample_%s' % str(k+1)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
75 input2_args='%s %s %s' % (input2_args, reads_filenames[k], reads_labels[k])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
76 k += 1
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
77 if format == 'bedgraph':
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
78 input2_args = input2_args + ' --bedgraph'
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
79 return input2_args, reads_filenames, reads_labels
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
80
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
81 def redirect_errors(alfa_out, alfa_err):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
82 # When the option --n is enabled, alfa prints '### End of the program' in stderr even if the process worked-
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
83 # The following lines to avoid the tool from crashing in this case
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
84 if alfa_err and not re.search('### End of program', alfa_err):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
85 # When alfa prints '### End of program' in stdout, all the messages in stderr are considered
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
86 # as warnings and not as errors.
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
87 if re.search('### End of program', alfa_out):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
88 logging.warning("The script ALFA.py encountered the following warning:\n\n%s" % alfa_err)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
89 logging.info("\n******************************************************************\n")
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
90 # True errors make the script exits
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
91 else:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
92 exit_and_explain("The script ALFA.py encountered the following error:\n\n%s" % alfa_err)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
93
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
94 def merge_count_files(reads_labels):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
95 merged_count_file = open('count_file.txt', 'wb')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
96 for i in range(0, len(reads_labels)):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
97 current_count_file = open(reads_labels[i] + '.categories_counts', 'r')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
98 reads_label = reads_labels[i]
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
99 merged_count_file.write('##LABEL: %s\n\n' % reads_label)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
100 merged_count_file.write(current_count_file.read())
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
101 merged_count_file.write('__________________________________________________________________\n')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
102 current_count_file.close()
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
103 merged_count_file.close()
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
104 return 'count_file.txt'
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
105
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
106 def main():
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
107 args = get_arg()
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
108
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
109 if not (args.output_pdf or args.output_png or args.output_svg or args.output_indexes or args.output_count):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
110 exit_and_explain('Error: no output to return\nProcess Aborted\n')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
111
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
112 tmp_dir = make_tmp_dir(args.GALAXY_TOOL_DIR[0])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
113 os.chdir(tmp_dir)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
114
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
115 logging.basicConfig(level=logging.INFO, filename=args.log_report[0], filemode="a+", format='%(message)s')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
116
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
117 alfa_path = os.path.join(args.GALAXY_TOOL_DIR[0], 'ALFA.py')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
118
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
119 #INPUT1: Annotation File
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
120 if args.indexes:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
121 # The indexes submitted by the user must exhibit the suffix '.(un)stranded.index' and will be called by alfa by their prefix
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
122 index = mv_and_rename_user_indexes(args.indexes[0], args.indexes[1])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
123 input1_args = '-g %s' % index
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
124 elif args.bi_indexes:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
125 input1_args = '-g %s' % args.bi_indexes[0]
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
126 elif args.annotation_file:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
127 input1_args = '-a %s' % args.annotation_file[0]
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
128 else:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
129 exit_and_explain('No annotation file submitted !')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
130
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
131 #INPUT 2: Mapped Reads
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
132 if args.reads:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
133 input2_args, reads_filenames, reads_labels = get_input2_args(args.reads, args.reads_format[0])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
134 strandness = '-s %s' % args.strandness[0]
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
135 else:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
136 exit_and_explain('No reads submitted !')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
137
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
138 ##Output options
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
139 categories_depth = '-d %s' % args.categories_depth[0]
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
140 if not (args.output_pdf or args.output_png or args.output_svg):
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
141 output_args = '--n'
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
142 else:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
143 if args.output_pdf:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
144 output_args = '--pdf plot.pdf'
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
145 if args.output_png:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
146 output_args = '--png plot'
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
147 if args.output_svg:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
148 output_args = '--svg plot'
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
149 if args.threshold:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
150 output_args = '%s -t %.3f %.3f' % (output_args, args.threshold[0], args.threshold[1])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
151
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
152 ##Run alfa
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
153 cmd = 'python %s %s %s %s %s %s' % (alfa_path, input1_args, input2_args, strandness, categories_depth, output_args)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
154 logging.info("__________________________________________________________________\n")
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
155 logging.info("Alfa execution")
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
156 logging.info("__________________________________________________________________\n")
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
157 logging.info("Command Line:\n%s\n" % cmd)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
158 logging.info("------------------------------------------------------------------\n")
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
159 alfa_result = subprocess.Popen(args=cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
160 alfa_out, alfa_err = alfa_result.communicate()
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
161
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
162 ##Handle stdout, warning, errors...
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
163 redirect_errors(alfa_out, alfa_err)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
164
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
165 logging.info("Alfa prompt:\n%s" % alfa_out)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
166
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
167 ##Redirect outputs
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
168 if args.output_pdf:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
169 shutil.move('plot.pdf', args.output_pdf[0])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
170 if args.output_png:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
171 shutil.move('plot' + '.categories.png', args.output_png[0])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
172 shutil.move('plot' + '.biotypes.png', args.output_png[1])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
173 if args.output_svg:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
174 shutil.move('plot' + '.categories.svg', args.output_svg[0])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
175 shutil.move('plot' + '.biotypes.svg', args.output_svg[1])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
176 if args.output_count:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
177 count_filename = merge_count_files(reads_labels)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
178 shutil.move(count_filename, args.output_count[0])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
179 if args.output_indexes:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
180 if args.annotation_file:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
181 indexes_regex = re.compile('.*\.index')
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
182 indexes = filter(indexes_regex.search, os.listdir('.'))
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
183 indexes.sort()
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
184 shutil.move(indexes[0], args.output_indexes[0])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
185 shutil.move(indexes[1], args.output_indexes[1])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
186 if args.indexes:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
187 shutil.move(index + '.stranded.index', args.output_indexes[0])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
188 shutil.move(index + '.unstranded.index', args.output_indexes[1])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
189 if args.bi_indexes:
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
190 shutil.move(args.bi_indexes[0] + '.stranded.index', args.output_index[0])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
191 shutil.move(args.bi_indexes[1] + '.unstranded.index', args.output_index[1])
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
192
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
193 cleanup_before_exit(tmp_dir)
1714165f5df0 Uploaded
charles-bernard
parents:
diff changeset
194 main()