annotate multigps.py @ 5:7b15099378a7 draft

Uploaded
author greg
date Sat, 02 Jan 2016 14:07:37 -0500
parents
children afba8c2a3b32
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
7b15099378a7 Uploaded
greg
parents:
diff changeset
1 import argparse
7b15099378a7 Uploaded
greg
parents:
diff changeset
2 import os
7b15099378a7 Uploaded
greg
parents:
diff changeset
3 import shutil
7b15099378a7 Uploaded
greg
parents:
diff changeset
4 import subprocess
7b15099378a7 Uploaded
greg
parents:
diff changeset
5 import sys
7b15099378a7 Uploaded
greg
parents:
diff changeset
6 import tempfile
7b15099378a7 Uploaded
greg
parents:
diff changeset
7
7b15099378a7 Uploaded
greg
parents:
diff changeset
8 BUFF_SIZE = 1048576
7b15099378a7 Uploaded
greg
parents:
diff changeset
9 DESIGN_FILE = 'design.tabular'
7b15099378a7 Uploaded
greg
parents:
diff changeset
10
7b15099378a7 Uploaded
greg
parents:
diff changeset
11
7b15099378a7 Uploaded
greg
parents:
diff changeset
12 def generate_design_file(input_items, filename):
7b15099378a7 Uploaded
greg
parents:
diff changeset
13 design_file = open(filename, 'wb')
7b15099378a7 Uploaded
greg
parents:
diff changeset
14 for items in input_items:
7b15099378a7 Uploaded
greg
parents:
diff changeset
15 filename, ext, signal_control, condition_name, replicate_name, read_distribution_file, fixed_read = items
7b15099378a7 Uploaded
greg
parents:
diff changeset
16 # MultiGPS version 0.5 does not support the newer scidx datatype.
7b15099378a7 Uploaded
greg
parents:
diff changeset
17 if ext == 'scidx':
7b15099378a7 Uploaded
greg
parents:
diff changeset
18 datatype = 'IDX'
7b15099378a7 Uploaded
greg
parents:
diff changeset
19 else:
7b15099378a7 Uploaded
greg
parents:
diff changeset
20 datatype = ext.upper()
7b15099378a7 Uploaded
greg
parents:
diff changeset
21 design_file.write('%s\n' % '\t'.join([filename, signal_control, datatype, condition_name, replicate_name, read_distribution_file, fixed_read]))
7b15099378a7 Uploaded
greg
parents:
diff changeset
22 design_file.close()
7b15099378a7 Uploaded
greg
parents:
diff changeset
23
7b15099378a7 Uploaded
greg
parents:
diff changeset
24
7b15099378a7 Uploaded
greg
parents:
diff changeset
25 def get_stderr_exception(tmp_err, tmp_stderr, tmp_out, tmp_stdout, include_stdout=False):
7b15099378a7 Uploaded
greg
parents:
diff changeset
26 tmp_stderr.close()
7b15099378a7 Uploaded
greg
parents:
diff changeset
27 # Get stderr, allowing for case where it's very large.
7b15099378a7 Uploaded
greg
parents:
diff changeset
28 tmp_stderr = open(tmp_err, 'rb')
7b15099378a7 Uploaded
greg
parents:
diff changeset
29 stderr_str = ''
7b15099378a7 Uploaded
greg
parents:
diff changeset
30 buffsize = BUFF_SIZE
7b15099378a7 Uploaded
greg
parents:
diff changeset
31 try:
7b15099378a7 Uploaded
greg
parents:
diff changeset
32 while True:
7b15099378a7 Uploaded
greg
parents:
diff changeset
33 stderr_str += tmp_stderr.read(buffsize)
7b15099378a7 Uploaded
greg
parents:
diff changeset
34 if not stderr_str or len(stderr_str) % buffsize != 0:
7b15099378a7 Uploaded
greg
parents:
diff changeset
35 break
7b15099378a7 Uploaded
greg
parents:
diff changeset
36 except OverflowError:
7b15099378a7 Uploaded
greg
parents:
diff changeset
37 pass
7b15099378a7 Uploaded
greg
parents:
diff changeset
38 tmp_stderr.close()
7b15099378a7 Uploaded
greg
parents:
diff changeset
39 if include_stdout:
7b15099378a7 Uploaded
greg
parents:
diff changeset
40 tmp_stdout = open(tmp_out, 'rb')
7b15099378a7 Uploaded
greg
parents:
diff changeset
41 stdout_str = ''
7b15099378a7 Uploaded
greg
parents:
diff changeset
42 buffsize = BUFF_SIZE
7b15099378a7 Uploaded
greg
parents:
diff changeset
43 try:
7b15099378a7 Uploaded
greg
parents:
diff changeset
44 while True:
7b15099378a7 Uploaded
greg
parents:
diff changeset
45 stdout_str += tmp_stdout.read(buffsize)
7b15099378a7 Uploaded
greg
parents:
diff changeset
46 if not stdout_str or len(stdout_str) % buffsize != 0:
7b15099378a7 Uploaded
greg
parents:
diff changeset
47 break
7b15099378a7 Uploaded
greg
parents:
diff changeset
48 except OverflowError:
7b15099378a7 Uploaded
greg
parents:
diff changeset
49 pass
7b15099378a7 Uploaded
greg
parents:
diff changeset
50 tmp_stdout.close()
7b15099378a7 Uploaded
greg
parents:
diff changeset
51 if include_stdout:
7b15099378a7 Uploaded
greg
parents:
diff changeset
52 return 'STDOUT\n%s\n\nSTDERR\n%s\n' % (stdout_str, stderr_str)
7b15099378a7 Uploaded
greg
parents:
diff changeset
53 return stderr_str
7b15099378a7 Uploaded
greg
parents:
diff changeset
54
7b15099378a7 Uploaded
greg
parents:
diff changeset
55
7b15099378a7 Uploaded
greg
parents:
diff changeset
56 def stop_err(msg):
7b15099378a7 Uploaded
greg
parents:
diff changeset
57 sys.stderr.write(msg)
7b15099378a7 Uploaded
greg
parents:
diff changeset
58 sys.exit(1)
7b15099378a7 Uploaded
greg
parents:
diff changeset
59
7b15099378a7 Uploaded
greg
parents:
diff changeset
60 parser = argparse.ArgumentParser()
7b15099378a7 Uploaded
greg
parents:
diff changeset
61 parser.add_argument('--input_item', dest='input_items', action='append', nargs=7, help="Input datasets and associated parameters")
7b15099378a7 Uploaded
greg
parents:
diff changeset
62 parser.add_argument('--threads', dest='threads', type=int, default=4, help='The number of threads to run')
7b15099378a7 Uploaded
greg
parents:
diff changeset
63 parser.add_argument('--multigps_jar', dest='multigps_jar', help='Path to the MultiGPS jar file')
7b15099378a7 Uploaded
greg
parents:
diff changeset
64 parser.add_argument('--geninfo', dest='geninfo', help='File listing the lengths of all chromosomes')
7b15099378a7 Uploaded
greg
parents:
diff changeset
65 parser.add_argument('--use_motif', dest='use_motif', help='Perform motif-finding or use a motif-prior')
7b15099378a7 Uploaded
greg
parents:
diff changeset
66 parser.add_argument('--seq_dir', dest='seq_dir', default=None, help='Directory containing fasta files corresponding to every named chromosome')
7b15099378a7 Uploaded
greg
parents:
diff changeset
67 parser.add_argument('--positional_prior', dest='positional_prior', default=None, help='Perform inter-experiment positional prior')
7b15099378a7 Uploaded
greg
parents:
diff changeset
68 parser.add_argument('--events_shared_probability', dest='events_shared_probability', type=float, default=0.9, help='Probability that events are shared across conditions')
7b15099378a7 Uploaded
greg
parents:
diff changeset
69 parser.add_argument('--motifs', dest='motifs', default=None, help='Perform motif-finding and motif priors')
7b15099378a7 Uploaded
greg
parents:
diff changeset
70 parser.add_argument('--motif_finding_only', dest='motif_finding_only', default=None, help='Perform motif-finding only')
7b15099378a7 Uploaded
greg
parents:
diff changeset
71 parser.add_argument('--num_motifs', dest='num_motifs', type=int, default=None, help='Number of motifs MEME should find for each condition')
7b15099378a7 Uploaded
greg
parents:
diff changeset
72 parser.add_argument('--mememinw', dest='mememinw', type=int, default=None, help='Minimum motif width for MEME')
7b15099378a7 Uploaded
greg
parents:
diff changeset
73 parser.add_argument('--mememaxw', dest='mememaxw', type=int, default=None, help='Maximum motif width for MEME')
7b15099378a7 Uploaded
greg
parents:
diff changeset
74 parser.add_argument('--fixedpb', dest='fixedpb', type=int, default=None, help='Fixed per-base limit')
7b15099378a7 Uploaded
greg
parents:
diff changeset
75 parser.add_argument('--poissongausspb', dest='poissongausspb', type=int, default=None, help='Poisson threshold for filtering per base')
7b15099378a7 Uploaded
greg
parents:
diff changeset
76 parser.add_argument('--non_unique_reads', dest='non_unique_reads', default=None, help='Use non-unique reads')
7b15099378a7 Uploaded
greg
parents:
diff changeset
77 parser.add_argument('--minqvalue', dest='minqvalue', type=int, default=None, help='Minimum Q-value (corrected p-value) of reported binding events')
7b15099378a7 Uploaded
greg
parents:
diff changeset
78 parser.add_argument('--minfold', dest='minfold', type=int, default=None, help='Minimum event fold-change vs scaled control')
7b15099378a7 Uploaded
greg
parents:
diff changeset
79 parser.add_argument('--diff_enrichment_tests', dest='diff_enrichment_tests', help='Run differential enrichment tests')
7b15099378a7 Uploaded
greg
parents:
diff changeset
80 parser.add_argument('--edgerod', dest='edgerod', type=int, default=None, help='EdgeR over-dispersion parameter value')
7b15099378a7 Uploaded
greg
parents:
diff changeset
81 parser.add_argument('--diffp', dest='diffp', type=int, default=None, help='Minimum p-value for reporting differential enrichment')
7b15099378a7 Uploaded
greg
parents:
diff changeset
82 parser.add_argument('--noscaling', dest='noscaling', default=None, help='Do not use signal vs control scaling')
7b15099378a7 Uploaded
greg
parents:
diff changeset
83 parser.add_argument('--medianscale', dest='medianscale', default=None, help='Use the median signal/control ratio as the scaling factor')
7b15099378a7 Uploaded
greg
parents:
diff changeset
84 parser.add_argument('--sesscale', dest='sesscale', default=None, help='Estimate scaling factor by SES')
7b15099378a7 Uploaded
greg
parents:
diff changeset
85 parser.add_argument('--scalewin', dest='scalewin', type=int, default=None, help='Window size for estimating scaling ratios')
7b15099378a7 Uploaded
greg
parents:
diff changeset
86 parser.add_argument('--max_training_rounds', dest='max_training_rounds', type=int, default=None, help='Maximum number of training rounds for updating binding event read distributions')
7b15099378a7 Uploaded
greg
parents:
diff changeset
87 parser.add_argument('--exclude_file', dest='exclude_file', default=None, help='File containing a set of regions to ignore during MultiGPS training')
7b15099378a7 Uploaded
greg
parents:
diff changeset
88 parser.add_argument('--binding_model_updates', dest='binding_model_updates', default=None, help='Perform binding model updates')
7b15099378a7 Uploaded
greg
parents:
diff changeset
89 parser.add_argument('--minmodelupdateevents', dest='minmodelupdateevents', type=int, default=None, help='Minimum number of events to support an update of the read distribution')
7b15099378a7 Uploaded
greg
parents:
diff changeset
90 parser.add_argument('--binding_model_smoothing', dest='binding_model_smoothing', default=None, help='Binding model smoothing')
7b15099378a7 Uploaded
greg
parents:
diff changeset
91 parser.add_argument('--spline_smooth', dest='spline_smooth', type=int, default=None, help='Binding model smoothing value')
7b15099378a7 Uploaded
greg
parents:
diff changeset
92 parser.add_argument('--gauss_smooth', dest='gauss_smooth', type=int, default=None, help='Gaussian smoothing std dev')
7b15099378a7 Uploaded
greg
parents:
diff changeset
93 parser.add_argument('--joint_in_model', dest='joint_in_model', default=None, help='Allow joint events in model updates')
7b15099378a7 Uploaded
greg
parents:
diff changeset
94 parser.add_argument('--ml_config_not_shared', dest='ml_config_not_shared', default=None, help='Share component configs in the ML step')
7b15099378a7 Uploaded
greg
parents:
diff changeset
95 parser.add_argument('--output_html_path', dest='output_html_path', help='Output html results file')
7b15099378a7 Uploaded
greg
parents:
diff changeset
96 parser.add_argument('--output_html_files_path', dest='output_html_files_path', help='Output html extra files')
7b15099378a7 Uploaded
greg
parents:
diff changeset
97 parser.add_argument('--output_process_path', dest='output_process_path', default=None, help='Output file for capturing stdout')
7b15099378a7 Uploaded
greg
parents:
diff changeset
98 args = parser.parse_args()
7b15099378a7 Uploaded
greg
parents:
diff changeset
99
7b15099378a7 Uploaded
greg
parents:
diff changeset
100 try:
7b15099378a7 Uploaded
greg
parents:
diff changeset
101 # Preparation.
7b15099378a7 Uploaded
greg
parents:
diff changeset
102 tmp_dir = tempfile.mkdtemp(prefix="tmp-multigps-")
7b15099378a7 Uploaded
greg
parents:
diff changeset
103 generate_design_file(args.input_items, DESIGN_FILE)
7b15099378a7 Uploaded
greg
parents:
diff changeset
104 # Build the command line.
7b15099378a7 Uploaded
greg
parents:
diff changeset
105 cmd_list = ['java -jar %s --verbose' % args.multigps_jar]
7b15099378a7 Uploaded
greg
parents:
diff changeset
106 cmd_list.append('--threads %d' % args.threads)
7b15099378a7 Uploaded
greg
parents:
diff changeset
107 cmd_list.append('--geninfo %s' % args.geninfo)
7b15099378a7 Uploaded
greg
parents:
diff changeset
108 if args.use_motif == 'yes':
7b15099378a7 Uploaded
greg
parents:
diff changeset
109 cmd_list.append('--seq %s' % args.seq_dir)
7b15099378a7 Uploaded
greg
parents:
diff changeset
110 if args.positional_prior == 'no':
7b15099378a7 Uploaded
greg
parents:
diff changeset
111 cmd_list.append('--noposprior')
7b15099378a7 Uploaded
greg
parents:
diff changeset
112 cmd_list.append('--probshared %3f' % args.events_shared_probability)
7b15099378a7 Uploaded
greg
parents:
diff changeset
113 if args.motifs == 'no':
7b15099378a7 Uploaded
greg
parents:
diff changeset
114 cmd_list.append('--nomotifs')
7b15099378a7 Uploaded
greg
parents:
diff changeset
115 if args.motif_finding_only == 'yes':
7b15099378a7 Uploaded
greg
parents:
diff changeset
116 cmd_list.append('--nomotifprior')
7b15099378a7 Uploaded
greg
parents:
diff changeset
117 if args.num_motifs is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
118 cmd_list.append('--memenmotifs %d' % args.num_motifs)
7b15099378a7 Uploaded
greg
parents:
diff changeset
119 if args.mememinw is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
120 cmd_list.append('--mememinw %d' % args.mememinw)
7b15099378a7 Uploaded
greg
parents:
diff changeset
121 if args.mememaxw is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
122 cmd_list.append('--mememaxw %d' % args.mememaxw)
7b15099378a7 Uploaded
greg
parents:
diff changeset
123 if args.fixedpb is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
124 cmd_list.append('--fixedpb %d' % args.fixedpb)
7b15099378a7 Uploaded
greg
parents:
diff changeset
125 if args.poissongausspb is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
126 cmd_list.append('--poissongausspb %d' % args.poissongausspb)
7b15099378a7 Uploaded
greg
parents:
diff changeset
127 if args.non_unique_reads == 'yes':
7b15099378a7 Uploaded
greg
parents:
diff changeset
128 cmd_list.append('--nonunique')
7b15099378a7 Uploaded
greg
parents:
diff changeset
129 if args.minqvalue is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
130 cmd_list.append('--q %d' % args.minqvalue)
7b15099378a7 Uploaded
greg
parents:
diff changeset
131 if args.minfold is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
132 cmd_list.append('--minfold %d' % args.minfold)
7b15099378a7 Uploaded
greg
parents:
diff changeset
133 if args.diff_enrichment_tests == 'no':
7b15099378a7 Uploaded
greg
parents:
diff changeset
134 cmd_list.append('--nodifftests')
7b15099378a7 Uploaded
greg
parents:
diff changeset
135 if args.edgerod is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
136 cmd_list.append('--edgerod %d' % args.edgerod)
7b15099378a7 Uploaded
greg
parents:
diff changeset
137 if args.diffp is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
138 cmd_list.append('--diffp %d' % args.diffp)
7b15099378a7 Uploaded
greg
parents:
diff changeset
139 if args.noscaling == 'no':
7b15099378a7 Uploaded
greg
parents:
diff changeset
140 cmd_list.append('--noscaling')
7b15099378a7 Uploaded
greg
parents:
diff changeset
141 if args.medianscale == "yes":
7b15099378a7 Uploaded
greg
parents:
diff changeset
142 cmd_list.append('--medianscale')
7b15099378a7 Uploaded
greg
parents:
diff changeset
143 if args.sesscale == "yes":
7b15099378a7 Uploaded
greg
parents:
diff changeset
144 cmd_list.append('--sesscale')
7b15099378a7 Uploaded
greg
parents:
diff changeset
145 if args.scalewin is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
146 cmd_list.append('--scalewin %d' % args.scalewin)
7b15099378a7 Uploaded
greg
parents:
diff changeset
147 if args.max_training_rounds is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
148 cmd_list.append('--r %d' % args.max_training_rounds)
7b15099378a7 Uploaded
greg
parents:
diff changeset
149 if args.exclude_file not in [None, 'None']:
7b15099378a7 Uploaded
greg
parents:
diff changeset
150 cmd_list.append('--exclude %s' % args.exclude_file)
7b15099378a7 Uploaded
greg
parents:
diff changeset
151 if args.binding_model_updates == 'no':
7b15099378a7 Uploaded
greg
parents:
diff changeset
152 cmd_list.append('--nomodelupdate')
7b15099378a7 Uploaded
greg
parents:
diff changeset
153 if args.minmodelupdateevents is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
154 cmd_list.append('--minmodelupdateevents %d' % args.minmodelupdateevents)
7b15099378a7 Uploaded
greg
parents:
diff changeset
155 if args.binding_model_smoothing == 'yes':
7b15099378a7 Uploaded
greg
parents:
diff changeset
156 if args.spline_smooth is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
157 cmd_list.append('--splinesmoothparam %d' % args.spline_smooth)
7b15099378a7 Uploaded
greg
parents:
diff changeset
158 else:
7b15099378a7 Uploaded
greg
parents:
diff changeset
159 cmd_list.append('--nomodelsmoothing')
7b15099378a7 Uploaded
greg
parents:
diff changeset
160 if args.gauss_smooth is not None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
161 cmd_list.append('--gaussmodelsmoothing')
7b15099378a7 Uploaded
greg
parents:
diff changeset
162 cmd_list.append('--gausssmoothparam %d' % args.gauss_smooth)
7b15099378a7 Uploaded
greg
parents:
diff changeset
163 if args.joint_in_model == 'yes':
7b15099378a7 Uploaded
greg
parents:
diff changeset
164 cmd_list.append('--jointinmodel')
7b15099378a7 Uploaded
greg
parents:
diff changeset
165 if args.ml_config_not_shared == 'no':
7b15099378a7 Uploaded
greg
parents:
diff changeset
166 cmd_list.append('--mlconfignotshared')
7b15099378a7 Uploaded
greg
parents:
diff changeset
167 cmd_list.append('--design %s' % DESIGN_FILE)
7b15099378a7 Uploaded
greg
parents:
diff changeset
168 cmd_list.append('--out %s' % args.output_html_files_path)
7b15099378a7 Uploaded
greg
parents:
diff changeset
169 if args.output_process_path is None:
7b15099378a7 Uploaded
greg
parents:
diff changeset
170 cmd_list.append('2>/dev/null')
7b15099378a7 Uploaded
greg
parents:
diff changeset
171 else:
7b15099378a7 Uploaded
greg
parents:
diff changeset
172 cmd_list.append('2>%s' % args.output_process_path)
7b15099378a7 Uploaded
greg
parents:
diff changeset
173 cmd = ' '.join(cmd_list)
7b15099378a7 Uploaded
greg
parents:
diff changeset
174 # Define command response buffers.
7b15099378a7 Uploaded
greg
parents:
diff changeset
175 tmp_out = tempfile.NamedTemporaryFile(dir=tmp_dir).name
7b15099378a7 Uploaded
greg
parents:
diff changeset
176 tmp_stdout = open(tmp_out, 'wb')
7b15099378a7 Uploaded
greg
parents:
diff changeset
177 tmp_err = tempfile.NamedTemporaryFile(dir=tmp_dir).name
7b15099378a7 Uploaded
greg
parents:
diff changeset
178 tmp_stderr = open(tmp_err, 'wb')
7b15099378a7 Uploaded
greg
parents:
diff changeset
179 tmp_filename = tempfile.NamedTemporaryFile(dir=tmp_dir).name
7b15099378a7 Uploaded
greg
parents:
diff changeset
180 # Execute the command.
7b15099378a7 Uploaded
greg
parents:
diff changeset
181 proc = subprocess.Popen(args=cmd, stderr=tmp_stderr, stdout=tmp_stdout, shell=True)
7b15099378a7 Uploaded
greg
parents:
diff changeset
182 rc = proc.wait()
7b15099378a7 Uploaded
greg
parents:
diff changeset
183 if rc != 0:
7b15099378a7 Uploaded
greg
parents:
diff changeset
184 error_message = get_stderr_exception(tmp_err, tmp_stderr, tmp_out, tmp_stdout)
7b15099378a7 Uploaded
greg
parents:
diff changeset
185 stop_err(error_message)
7b15099378a7 Uploaded
greg
parents:
diff changeset
186 # Move the output HTML file to the output dataset path.
7b15099378a7 Uploaded
greg
parents:
diff changeset
187 output_html_filename = 'multiGPS_%s_results.html' % os.path.split(args.output_html_files_path)[1]
7b15099378a7 Uploaded
greg
parents:
diff changeset
188 shutil.move(os.path.join(args.output_html_files_path, output_html_filename), args.output_html_path)
7b15099378a7 Uploaded
greg
parents:
diff changeset
189 except Exception, e:
7b15099378a7 Uploaded
greg
parents:
diff changeset
190 stop_err('Error running MultiGPS\n%s\n' % str(e))
7b15099378a7 Uploaded
greg
parents:
diff changeset
191 finally:
7b15099378a7 Uploaded
greg
parents:
diff changeset
192 if os.path.exists(tmp_dir):
7b15099378a7 Uploaded
greg
parents:
diff changeset
193 shutil.rmtree(tmp_dir)