[Bio] / FortyEight / batch_rast.pl Repository:
ViewVC logotype

Annotation of /FortyEight/batch_rast.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.11 - (view) (download) (as text)

1 : olson 1.1
2 :     use strict;
3 :     use Carp;
4 :     use Job48;
5 :     use FIG_Config;
6 :     use FIG;
7 : olson 1.3 use Getopt::Long;
8 : olson 1.1
9 :     #
10 :     # Run a jobdirectory in one shot. For batch offload to a remote cluster that
11 :     # doesn't have our scheduler, etc available.
12 :     #
13 :    
14 :     #
15 :     # Stages are as follows; for now this is a copy and paste exercise from
16 :     # FortyEight/check_jobs.pl. Use caution, don't run with scissors.
17 :     #
18 :    
19 :     #
20 :     # upload
21 :     # rp
22 :     # Check status of keep_genecalls, then qc
23 :     # Check status of correction, then correction
24 :     # preprocess_sims
25 :     # sims
26 :     # bbhs
27 :     # auto_assign
28 :     # glue_contigs
29 :     # pchs
30 :     # scenario
31 :     # export
32 :     #
33 :    
34 : olson 1.3 my $parallel = 1;
35 : olson 1.4 my @phase;
36 : olson 1.2
37 : olson 1.4 my $usage = "Usage: $0 [--parallel N] -phase N [--phase N ..] jobdir\n";
38 : olson 1.3
39 :     if (!GetOptions("parallel=i" => \$parallel,
40 : olson 1.4 "phase=i" => \@phase))
41 : olson 1.3 {
42 :     die $usage;
43 :     }
44 :    
45 :     @ARGV == 1 or die $usage;
46 : olson 1.1
47 : olson 1.4 @phase > 0 or die $usage;
48 :     my %phase = map { $_ => 1 } @phase;
49 :    
50 : olson 1.1 my $job_dir = shift;
51 :    
52 : olson 1.11 if (-f "$job_dir/CANCEL")
53 :     {
54 :     die "Job exiting due to earlier CANCEL\n";
55 :     }
56 :    
57 : olson 1.1 my $job = new Job48($job_dir);
58 :    
59 : olson 1.2 my $sims_data_dir = $FIG_Config::rast_sims_data;
60 :    
61 :     if (!defined($sims_data_dir))
62 :     {
63 :     $sims_data_dir = $FIG_Config::fortyeight_data;
64 :     }
65 :    
66 :     my $sims_nr = "$sims_data_dir/nr";
67 :     my $sims_peg_synonyms = "$sims_data_dir/peg.synonyms";
68 :     my $sims_keep_count = 300;
69 :    
70 : olson 1.7 my $job48 = new Job48($job_dir);
71 :     my $meta = $job48->meta;
72 :    
73 :     my $host = `hostname`;
74 :     chomp $host;
75 :     $meta->add_log_entry($0, "Running phases @phase on $host");
76 :    
77 : olson 1.4 #
78 :     # Emulate execution of SGE parallel environment via the
79 :     # --parallel N argument.
80 :     #
81 : olson 1.3 if ($parallel > 1)
82 :     {
83 :     $ENV{PE} = 'cluster';
84 :     $ENV{NSLOTS} = $parallel;
85 :     }
86 : olson 1.2
87 : olson 1.5 if ($phase{1})
88 : olson 1.3 {
89 :     &do_upload($job);
90 :     &do_rp($job);
91 :     }
92 :    
93 : olson 1.5 if ($phase{2})
94 : olson 1.3 {
95 :     &do_qc($job);
96 :     &do_correction($job);
97 :     &do_sims_preprocess($job);
98 :     }
99 :    
100 : olson 1.5 if ($phase{3})
101 : olson 1.3 {
102 : olson 1.4 #
103 :     # If running inside a SGE task array job, execute
104 :     # our task. Otherwise run all of them.
105 :     #
106 :     if ($ENV{SGE_TASK_ID})
107 :     {
108 :     &run("$FIG_Config::bin/rp_compute_sims", $job->dir);
109 :     }
110 :     else
111 :     {
112 :     &do_sims($job);
113 :     }
114 : olson 1.3 }
115 :    
116 : olson 1.5 if ($phase{4})
117 : olson 1.3 {
118 : olson 1.6 &do_sims_postprocess($job);
119 : olson 1.3 &do_bbhs($job);
120 :     &do_auto_assign($job);
121 :     &do_glue_contigs($job);
122 :     &do_pchs($job);
123 :     &do_scenario($job);
124 :     &do_export($job);
125 : olson 1.8 &mark_job_user_complete($job);
126 : olson 1.3 }
127 : olson 1.1
128 :     sub do_upload
129 :     {
130 :     my($job) = @_;
131 :     return;
132 :     }
133 :    
134 :     sub do_rp
135 :     {
136 :     my($job) = @_;
137 :     &run("$FIG_Config::bin/rp_rapid_propagation", $job->dir);
138 :     }
139 :    
140 :     sub do_qc
141 :     {
142 :     my($job) = @_;
143 :    
144 :     if ($job->meta->get_metadata("keep_genecalls"))
145 :     {
146 :     $job->meta->add_log_entry($0, "keep_genecalls is enabled: marking qc as complete");
147 :     $job->meta->set_metadata("status.qc", "complete");
148 :     return;
149 :     }
150 :    
151 :     &run("$FIG_Config::bin/rp_quality_check", $job->dir);
152 :     }
153 :    
154 :     sub do_correction
155 :     {
156 :     my($job) = @_;
157 :    
158 :     if ($job->meta->get_metadata("keep_genecalls"))
159 :     {
160 :     $job->meta->add_log_entry($0, "keep_genecalls is enabled: marking correction as complete");
161 :     $job->meta->set_metadata("status.correction", "complete");
162 :     return;
163 :     }
164 :    
165 :     my $correction_list = $job->meta->get_metadata("correction.request");
166 : olson 1.3
167 :     if (ref($correction_list))
168 :     {
169 :     my $correction_str = join(",", @$correction_list);
170 :     &run("$FIG_Config::bin/rp_correction", $job->dir, $correction_str);
171 :     }
172 : olson 1.1 }
173 :    
174 :     sub do_sims_preprocess
175 :     {
176 :     my($job) = @_;
177 : olson 1.2
178 :     &run("$FIG_Config::bin/rp_preprocess_sims", $job->dir, $sims_nr, $sims_peg_synonyms);
179 :    
180 : olson 1.1 }
181 :    
182 :     sub do_sims
183 :     {
184 :     my($job) = @_;
185 : olson 1.2
186 :     if (!open(CHUNK, "<", $job->dir. "/sims.job/chunk.out"))
187 :     {
188 :     die "Error opening $job_dir/sims.job/chunk.out: $!";
189 :     }
190 :    
191 :     #
192 :     # Extract created task ids
193 :     #
194 :    
195 :     my($task_start, $task_end);
196 :     while (<CHUNK>)
197 :     {
198 :     print;
199 :     chomp;
200 :     if (/^tasks\s+(\d+)\s+(\d+)/)
201 :     {
202 :     $task_start = $1;
203 :     $task_end = $2;
204 :     }
205 :     }
206 :     close(CHUNK);
207 :    
208 :     if (!defined($task_start))
209 :     {
210 :     die "Tasks not found";
211 :     }
212 :    
213 : olson 1.6 for my $task ($task_start .. $task_end)
214 :     {
215 :     $ENV{SGE_TASK_ID} = $task;
216 :     &run("$FIG_Config::bin/rp_compute_sims", $job->dir);
217 :     }
218 :     }
219 :    
220 :     sub do_sims_postprocess
221 :     {
222 :     my($job) = @_;
223 :    
224 : olson 1.2 my $sims_nr_len = $sims_nr;
225 :     if (-f "$sims_nr-len.btree")
226 :     {
227 :     $sims_nr_len = "$sims_nr-len.btree";
228 :     }
229 :    
230 : olson 1.6 &run("$FIG_Config::bin/rp_postproc_sims", $job->dir, $sims_nr_len, $sims_peg_synonyms, $sims_keep_count);
231 : olson 1.1 }
232 :    
233 :     sub do_bbhs
234 :     {
235 :     my($job) = @_;
236 : olson 1.2 &run("$FIG_Config::bin/rp_compute_bbhs", $job->dir);
237 : olson 1.1 }
238 :    
239 :     sub do_auto_assign
240 :     {
241 :     my($job) = @_;
242 : olson 1.2 &run("$FIG_Config::bin/rp_auto_assign", $job->dir);
243 : olson 1.1 }
244 :    
245 :     sub do_glue_contigs
246 :     {
247 :     my($job) = @_;
248 : olson 1.2 &run("$FIG_Config::bin/rp_glue_contigs", $job->dir);
249 : olson 1.1 }
250 :    
251 :     sub do_pchs
252 :     {
253 :     my($job) = @_;
254 : olson 1.2 &run("$FIG_Config::bin/rp_compute_pchs", $job->dir);
255 : olson 1.1 }
256 :    
257 :     sub do_scenario
258 :     {
259 :     my($job) = @_;
260 : olson 1.2 &run("$FIG_Config::bin/rp_scenarios", $job->dir);
261 : olson 1.1 }
262 :    
263 :     sub do_export
264 :     {
265 :     my($job) = @_;
266 : olson 1.2 &run("$FIG_Config::bin/rp_write_exports", $job->dir);
267 : olson 1.1 }
268 :    
269 : olson 1.8 sub mark_job_user_complete
270 :     {
271 :     my($job) = @_;
272 :    
273 :     my $job_dir = $job->dir;
274 :     my $meta = $job->meta;
275 :     my $job_id = $job->id;
276 :    
277 :     system("$FIG_Config::bin/send_job_completion_email", $job_dir);
278 :    
279 :     $meta->set_metadata("status.final", "complete");
280 :    
281 :     #
282 :     # If the job is a SEED candidate, send VV email.
283 :     #
284 :    
285 :     if ($meta->get_metadata("import.suggested") or
286 :     $meta->get_metadata("import.candidate"))
287 :     {
288 :     my $gname = $job->genome_name;
289 :     my $mail = Mail::Mailer->new();
290 :     $mail->open({
291 :     To => 'Veronika Vonstein <veronika@thefig.info>, Robert Olson<olson@mcs.anl.gov>, Andreas Wilke<wilke@mcs.anl.gov>',
292 :     From => 'Annotation Server <rast@mcs.anl.gov>',
293 :     Subject => "RAST job $job_id marked for SEED inclusion",
294 :     });
295 :    
296 :     print $mail <<END;
297 :     RAST job #$job_id ($gname) was submitted for inclusion into the SEED, and has finished its processing.
298 :     END
299 :     $mail->close();
300 :    
301 :     #
302 :     # We also mark the job as ACTIVE again so that the
303 :     # normal post-seed-acceptance pipeline stages may execute.
304 :     #
305 :     open(F, ">$job_dir/ACTIVE");
306 :     close(F);
307 :     }
308 :     else
309 :     {
310 :     #
311 :     # Otherwise it is completely done.
312 :     #
313 :     &mark_job_done($job);
314 :     }
315 :     }
316 :    
317 :     sub mark_job_done
318 :     {
319 :     my($job) = @_;
320 :    
321 :     #
322 :     # If we spooled the job out onto the lustre disk, we need to
323 :     # spool it back.
324 :     #
325 :    
326 :     my $meta = $job->meta;
327 :     my $job_dir = $job->dir;
328 :    
329 :     if ($meta->get_metadata("lustre_required"))
330 :     {
331 :     &run("$FIG_Config::bin/rp_lustre_finish", $job_dir);
332 :     }
333 :     if (open(D, ">$job_dir/DONE"))
334 :     {
335 :     print D time . "\n";
336 :     close(D);
337 :     }
338 :     else
339 :     {
340 :     warn "Error opening $job_dir/DONE: $!\n";
341 :     }
342 :    
343 :     unlink("$job_dir/ACTIVE");
344 :     }
345 : olson 1.1
346 :     sub run
347 :     {
348 :     my(@cmd) = @_;
349 :    
350 : olson 1.9 my $cmd_str = join(" ", @cmd);
351 :     print "Start: $cmd_str\n";
352 : olson 1.10 $meta->add_log_entry($0, ['Start', $cmd_str]);
353 : olson 1.1 my $rc = system(@cmd);
354 :     if ($rc != 0)
355 :     {
356 : olson 1.9 $meta->add_log_entry($0, ['Failed', $rc, $cmd_str]);
357 : olson 1.11 if (open(FH, ">$job_dir/CANCEL"))
358 :     {
359 :     print FH "Cancel job due to error in $0 @cmd\n";
360 :     close(FH);
361 :     }
362 :     #
363 :     # Attempt to qdel any other parts of this job that are queued or running.
364 :     #
365 :     my @jobs;
366 :     for my $k ($meta->get_metadata_keys())
367 :     {
368 :     if ($k =~ /ph_.*\.sge_job_id/)
369 :     {
370 :     my $job_id = $meta->get_metadata($k);
371 :     #
372 :     # Don't qdel this job.
373 :     #
374 :     if ($job_id =~ /^\d+$/ && $job_id != $ENV{JOB_ID})
375 :     {
376 :     push(@jobs, $job_id);
377 :     }
378 :    
379 :     }
380 :     }
381 :     if (@jobs)
382 :     {
383 :     my $rc2 = system("qdel", @jobs);
384 :     print "qdel @jobs returned $rc2\n";
385 :     $meta->add_log_entry($0, "Qdel @jobs due to failure returned status $rc2");
386 :     }
387 :    
388 : olson 1.9 confess "Cmd failed with rc=$rc: $cmd_str\n";
389 : olson 1.1 }
390 : olson 1.9 $meta->add_log_entry($0, ['Done', $cmd_str]);
391 :     print "Done: $cmd_str\n";
392 : olson 1.1 }

MCS Webmaster
ViewVC Help
Powered by ViewVC 1.0.3