0
|
1 package Bio::EnsEMBL::Pipeline::FASTA::EmailSummary;
|
|
2
|
|
3 use strict;
|
|
4 use warnings;
|
|
5 use base qw/Bio::EnsEMBL::Hive::RunnableDB::NotifyByEmail Bio::EnsEMBL::Pipeline::Base/;
|
|
6 use Bio::EnsEMBL::Hive::Utils qw/destringify/;
|
|
7
|
|
8 sub fetch_input {
|
|
9 my ($self) = @_;
|
|
10
|
|
11 $self->assert_executable('sendmail');
|
|
12
|
|
13 my $dump_dna = $self->jobs('DumpDNA');
|
|
14 my $copy_dna = $self->jobs('CopyDNA');
|
|
15 my $dump_genes = $self->jobs('DumpGenes');
|
|
16 my $blast_dna = $self->jobs('BlastDNAIndex');
|
|
17 my $blast_gene = $self->jobs('BlastGeneIndex');
|
|
18 my $blast_pep = $self->jobs('BlastPepIndex');
|
|
19 my $blat = $self->jobs('BlatDNAIndex', 100);
|
|
20 my $blat_sm = $self->jobs('BlatSmDNAIndex', 100);
|
|
21
|
|
22 my @args = (
|
|
23 $dump_dna->{successful_jobs},
|
|
24 $dump_dna->{failed_jobs},
|
|
25 $copy_dna->{successful_jobs},
|
|
26 $copy_dna->{failed_jobs},
|
|
27 $dump_genes->{successful_jobs},
|
|
28 $dump_genes->{failed_jobs},
|
|
29 $blast_dna->{successful_jobs},
|
|
30 $blast_dna->{failed_jobs},
|
|
31 $blast_gene->{successful_jobs},
|
|
32 $blast_gene->{failed_jobs},
|
|
33 $blast_pep->{successful_jobs},
|
|
34 $blast_pep->{failed_jobs},
|
|
35 $blat->{successful_jobs},
|
|
36 $blat->{failed_jobs},
|
|
37 $blat_sm->{successful_jobs},
|
|
38 $blat_sm->{failed_jobs},
|
|
39 $self->failed(),
|
|
40 $self->summary($dump_dna),
|
|
41 $self->summary($copy_dna),
|
|
42 $self->summary($dump_genes),
|
|
43 $self->summary($blast_dna),
|
|
44 $self->summary($blast_gene),
|
|
45 $self->summary($blast_pep),
|
|
46 $self->summary($blat),
|
|
47 $self->summary($blat_sm),
|
|
48 );
|
|
49
|
|
50 my $msg = sprintf(<<'MSG', @args);
|
|
51 Your FASTA Pipeline has finished. We have:
|
|
52
|
|
53 * %d species with new DNA Dumped (%d failed)
|
|
54 * %d species with copied DNA (%d failed)
|
|
55 * %d species with genes dumped (%d failed)
|
|
56 * %d species with BLAST DNA indexes generated (%d failed)
|
|
57 * %d species with BLAST GENE indexes generated (%d failed)
|
|
58 * %d species with BLAST PEPTIDE indexes generated (%d failed)
|
|
59 * %d species with BLAT DNA generated (%d failed)
|
|
60 * %d species with BLAT soft-masked DNA generated (%d failed)
|
|
61
|
|
62 %s
|
|
63
|
|
64 ===============================================================================
|
|
65
|
|
66 Full breakdown follows ...
|
|
67
|
|
68 %s
|
|
69
|
|
70 %s
|
|
71
|
|
72 %s
|
|
73
|
|
74 %s
|
|
75
|
|
76 %s
|
|
77
|
|
78 %s
|
|
79
|
|
80 %s
|
|
81
|
|
82 %s
|
|
83
|
|
84 MSG
|
|
85 $self->param('text', $msg);
|
|
86 return;
|
|
87 }
|
|
88
|
|
89 sub jobs {
|
|
90 my ($self, $logic_name, $minimum_runtime) = @_;
|
|
91 my $aa = $self->db->get_AnalysisAdaptor();
|
|
92 my $aja = $self->db->get_AnalysisJobAdaptor();
|
|
93 my $analysis = $aa->fetch_by_logic_name($logic_name);
|
|
94 my $id = $analysis->dbID();
|
|
95 my @jobs = @{$aja->generic_fetch("j.analysis_id =$id")};
|
|
96 $_->{input} = destringify($_->input_id()) for @jobs;
|
|
97 @jobs =
|
|
98 sort { $a->{input}->{species} cmp $b->{input}->{species} }
|
|
99 grep {
|
|
100 if($minimum_runtime) {
|
|
101 if($minimum_runtime > $_->runtime_msec()) {
|
|
102 1;
|
|
103 }
|
|
104 else {
|
|
105 0;
|
|
106 }
|
|
107 }
|
|
108 else {
|
|
109 1;
|
|
110 }
|
|
111 }
|
|
112 @jobs;
|
|
113 my %passed_species = map { $_->{input}->{species}, 1 } grep { $_->status() eq 'DONE' } @jobs;
|
|
114 my %failed_species = map { $_->{input}->{species}, 1 } grep { $_->status() eq 'FAILED' } @jobs;
|
|
115 return {
|
|
116 analysis => $analysis,
|
|
117 name => $logic_name,
|
|
118 jobs => \@jobs,
|
|
119 successful_jobs => scalar(keys %passed_species),
|
|
120 failed_jobs => scalar(keys %failed_species),
|
|
121 };
|
|
122 }
|
|
123
|
|
124
|
|
125 sub failed {
|
|
126 my ($self) = @_;
|
|
127 my $failed = $self->db()->get_AnalysisJobAdaptor()->fetch_all_failed_jobs();
|
|
128 if(! @{$failed}) {
|
|
129 return 'No jobs failed. Congratulations!';
|
|
130 }
|
|
131 my $output = <<'MSG';
|
|
132 The following jobs have failed during this run. Please check your hive's error msg table for the following jobs:
|
|
133
|
|
134 MSG
|
|
135 foreach my $job (@{$failed}) {
|
|
136 my $analysis = $self->db()->get_AnalysisAdaptor()->fetch_by_dbID($job->analysis_id());
|
|
137 my $line = sprintf(q{ * job_id=%d %s(%5d) input_id='%s'}, $job->dbID(), $analysis->logic_name(), $analysis->dbID(), $job->input_id());
|
|
138 $output .= $line;
|
|
139 $output .= "\n";
|
|
140 }
|
|
141 return $output;
|
|
142 }
|
|
143
|
|
144 my $sorter = sub {
|
|
145 my $status_to_int = sub {
|
|
146 my ($v) = @_;
|
|
147 return ($v->status() eq 'FAILED') ? 0 : 1;
|
|
148 };
|
|
149 my $status_sort = $status_to_int->($a) <=> $status_to_int->($b);
|
|
150 return $status_sort if $status_sort != 0;
|
|
151 return $a->{input}->{species} cmp $b->{input}->{species};
|
|
152 };
|
|
153
|
|
154 sub summary {
|
|
155 my ($self, $data) = @_;
|
|
156 my $name = $data->{name};
|
|
157 my $underline = '~'x(length($name));
|
|
158 my $output = "$name\n$underline\n\n";
|
|
159 my @jobs = @{$data->{jobs}};
|
|
160 if(@jobs) {
|
|
161 foreach my $job (sort $sorter @{$data->{jobs}}) {
|
|
162 my $species = $job->{input}->{species};
|
|
163 $output .= sprintf(" * %s - job_id=%d %s\n", $species, $job->dbID(), $job->status());
|
|
164 }
|
|
165 }
|
|
166 else {
|
|
167 $output .= "No jobs run for this analysis\n";
|
|
168 }
|
|
169 $output .= "\n";
|
|
170 return $output;
|
|
171 }
|
|
172
|
|
173 1; |