1 package SGN
::Controller
::AJAX
::QualityControl
;
4 use namespace
::autoclean
;
6 use Carp qw
/ carp confess croak /;
9 use File
::Temp qw
/ tempfile tempdir /;
10 use File
::Spec
::Functions qw
/ catfile catdir/;
11 use File
::Slurp qw
/write_file read_file/;
12 use File
::Path qw
/ mkpath /;
15 use CXGN
::Phenome
::Population
;
18 use Scalar
::Util qw
/weaken reftype/;
19 use Storable qw
/ nstore retrieve /;
20 BEGIN { extends
'Catalyst::Controller' }
23 sub check_pheno_qc_result
:Path
('/phenotype/qualityControl/check/result/') Args
(1) {
24 my ($self, $c, $pop_id) = @_;
26 $c->stash->{pop_id
} = $pop_id;
28 $self->pheno_qualityControl_output_files($c);
29 my $qc_output_file = $c->stash->{qc_messages_json_file
};
31 my $ret->{result
} = undef;
33 if (-s
$qc_output_file && $pop_id =~ /\d+/)
40 $c->res->content_type('application/json');
46 sub qualityControl_phenotype_data
:Path
('/qualityControl/phenotype/data/') Args
(0) {
49 my $pop_id = $c->req->param('population_id');
50 $c->stash->{pop_id
} = $pop_id;
52 my $referer = $c->req->referer;
56 if ($referer =~ /qtl/)
58 my $phenotype_dir = $c->stash->{solqtl_cache_dir
};
59 $phenotype_file = 'phenodata_' . $pop_id;
60 $phenotype_file = $c->controller('solGS::Files')->grep_file($phenotype_dir, $phenotype_file);
64 $c->controller('solGS::Files')->phenotype_file_name($c, $pop_id);
65 $phenotype_file = $c->stash->{phenotype_file_name
};
68 unless (-s
$phenotype_file)
70 $self->create_qualityControl_phenodata_file($c);
71 $phenotype_file = $c->stash->{phenotype_file_name
};
74 my $ret->{result
} = undef;
76 if (-s
$phenotype_file)
83 $c->res->content_type('application/json');
93 my $pop_id = $c->stash->{pop_id
};
94 $c->controller('solGS::Trait')->get_all_traits($c, $pop_id);
95 $c->controller('solGS::Trait')->get_acronym_pairs($c, $pop_id);
100 sub create_qualityControl_phenodata_file
{
103 my $referer = $c->req->referer;
106 my $pop_id = $c->stash->{pop_id
};
108 if ($referer =~ /qtl/)
110 my $pheno_exp = "phenodata_${pop_id}";
111 my $dir = $c->stash->{solqtl_cache_dir
};
113 $phenotype_file = $c->controller('solGS::Files')->grep_file($dir, $pheno_exp);
115 unless ($phenotype_file)
117 my $pop = CXGN
::Phenome
::Population
->new($c->dbc->dbh, $pop_id);
118 $phenotype_file = $pop->phenotype_file($c);
124 $self->qc_pheno_query_jobs_file($c);
125 my $queries =$c->stash->{qc_pheno_query_jobs_file
};
127 $c->stash->{dependent_jobs
} = $queries;
128 $c->controller('solGS::solGS')->run_async($c);
130 $c->controller("solGS::Files")->phenotype_file_name($c, $pop_id);
131 $phenotype_file = $c->stash->{phenotype_file_name
};
135 my $qc_cache_dir = $c->stash->{qualityControl_cache_dir
};
137 copy
($phenotype_file, $qc_cache_dir)
138 or die "could not copy $phenotype_file to $qc_cache_dir";
140 my $file = basename
($phenotype_file);
141 $c->stash->{phenotype_file_name
} = catfile
($qc_cache_dir, $file);
146 sub create_qualityControl_dir
{
149 $c->controller('solGS::Files')->get_solgs_dirs($c);
154 sub pheno_qualityControl_output_files
{
157 my $pop_id = $c->stash->{pop_id
};
159 $self->create_qualityControl_dir($c);
160 my $qc_cache_dir = $c->stash->{qualityControl_cache_dir
};
162 my $file_cache = Cache
::File
->new(cache_root
=> $qc_cache_dir);
163 $file_cache->purge();
165 my $key_table = 'qc_messages_table_' . $pop_id;
166 my $key_json = 'qc_messages_json_' . $pop_id;
167 my $qc_messages_file = $file_cache->get($key_table);
168 my $qc_messages_json_file = $file_cache->get($key_json);
170 unless ($qc_messages_file && $qc_messages_json_file )
172 $qc_messages_file = catfile
($qc_cache_dir, "qc_messages_table_${pop_id}");
174 write_file
($qc_messages_file);
175 $file_cache->set($key_table, $qc_messages_file, '30 days');
177 $qc_messages_json_file = catfile
($qc_cache_dir, "qc_messages_json_${pop_id}");
179 write_file
($qc_messages_json_file);
180 $file_cache->set($key_json, $qc_messages_json_file, '30 days');
183 $c->stash->{qc_messages_table_file
} = $qc_messages_file;
184 $c->stash->{qc_messages_json_file
} = $qc_messages_json_file;
189 sub pheno_qualityControl_analysis_output
:Path
('/phenotypic/qualityControl/analysis/output') Args
(0) {
192 my $pop_id = $c->req->param('population_id');
193 $c->stash->{pop_id
} = $pop_id;
195 $self->pheno_qualityControl_output_files($c);
196 my $qc_json_file = $c->stash->{qc_messages_json_file
};
197 my $qc_table_file = $c->stash->{qc_messages_table_file
};
198 my $ret->{status
} = 'failed';
200 if (!-s
$qc_json_file)
202 $self->run_pheno_qualityControl_analysis($c);
203 $qc_json_file = $c->stash->{qc_messages_json_file
};
204 $qc_table_file = $c->stash->{qc_messages_table_file
};
207 if (-s
$qc_json_file)
209 # $self->trait_acronyms($c);
210 # my $acronyms = $c->stash->{acronym};
212 # $ret->{acronyms} = $acronyms;
213 $ret->{status
} = 'success';
215 my $data = $c->controller('solGS::Utils')->read_file_data($qc_table_file);
216 $ret->{data
} = $data;
217 #$ret->{data} = read_file($qc_json_file);
220 $ret = to_json
($ret);
222 $c->res->content_type('application/json');
229 sub download_phenotypic_qualityControl
: Path
('/download/phenotypic/qualityControl/population') Args
(1) {
230 my ($self, $c, $id) = @_;
232 $self->create_qualityControl_dir($c);
233 my $qc_dir = $c->stash->{qualityControl_cache_dir
};
234 my $qc_file = catfile
($qc_dir, "qc_messages_table_${id}");
236 unless (!-e
$qc_file || -s
$qc_file <= 1)
241 foreach my $row ( read_file
($qc_file) )
243 if ($count==1) { $row = 'Traits,' . $row;}
245 $row = join(",", split(/\s/, $row));
248 push @qc_data, [ $row ];
252 $c->res->content_type("text/plain");
253 $c->res->body(join "", map{ $_->[0] } @qc_data);
258 sub temp_pheno_qc_output_file
{
261 my $pop_id = $c->stash->{pop_id
};
262 $self->pheno_qualityControl_output_files($c);
264 my $files = join ("\t",
265 $c->stash->{qc_messages_table_file
},
266 $c->stash->{qc_messages_json_file
},
269 my $tmp_dir = $c->stash->{qualityControl_temp_dir
};
270 my $name = "pheno_qc_output_files_${pop_id}";
271 my $tempfile = $c->controller('solGS::Files')->create_tempfile($tmp_dir, $name);
272 write_file
($tempfile, $files);
274 $c->stash->{temp_pheno_qc_output_file
} = $tempfile;
279 sub temp_pheno_qc_input_file
{
282 my $pop_id = $c->stash->{pop_id
};
284 $c->controller("solGS::Files")->phenotype_file_name($c, $pop_id);
285 #$self->create_qualityControl_phenodata_file($c);
287 my $pheno_file = $c->stash->{phenotype_file_name
};
289 $c->controller("solGS::Files")->formatted_phenotype_file($c);
290 my $formatted_pheno_file = $c->stash->{formatted_phenotype_file
};
292 $c->controller("solGS::Files")->phenotype_metadata_file($c);
293 my $metadata_file = $c->stash->{phenotype_metadata_file
};
295 my $files = join ("\t",
297 $formatted_pheno_file,
302 my $tmp_dir = $c->stash->{qualityControl_temp_dir
};
303 my $name = "pheno_qc_input_files_${pop_id}";
304 my $tempfile = $c->controller('solGS::Files')->create_tempfile($tmp_dir, $name);
305 write_file
($tempfile, $files);
306 $c->stash->{temp_pheno_qc_input_file
} = $tempfile;
312 sub run_pheno_qualityControl_analysis
{
315 my $pop_id = $c->stash->{pop_id
};
317 $self->temp_pheno_qc_input_file($c);
318 $self->temp_pheno_qc_output_file($c);
320 $c->stash->{qc_input_files
} = $c->stash->{temp_pheno_qc_input_file
};
321 $c->stash->{qc_output_files
} = $c->stash->{temp_pheno_qc_output_file
};
323 $c->stash->{qualityControl_type
} = "pheno-qualityControl";
325 $c->stash->{qualityControl_script
} = "R/qualityControl/qc_rscript.R";
327 $self->run_qualityControl_analysis($c);
329 $self->trait_acronyms($c);
333 sub run_qualityControl_analysis
{
336 my $pop_id = $c->stash->{pop_id
};
337 my $qc_type = $c->stash->{qualityControl_type
};
339 $self->qc_pheno_query_jobs_file($c);
340 my $queries_file = $c->stash->{qc_pheno_query_jobs_file
};
342 $self->qc_pheno_r_jobs_file($c);
343 my $r_jobs_file = $c->stash->{qc_pheno_r_jobs_file
};
345 $c->stash->{prerequisite_jobs
} = $queries_file if $queries_file;
346 $c->stash->{dependent_jobs
} = $r_jobs_file;
348 $c->controller('solGS::solGS')->run_async($c);
353 sub qc_pheno_r_jobs
{
356 my $pop_id = $c->stash->{trial_id
} || $c->stash->{pop_id
};
358 my $input_file = $c->stash->{qc_input_files
};
359 my $output_file = $c->stash->{qc_output_files
};
361 my $qc_type = $c->stash->{qualityControl_type
};
363 $c->stash->{input_files
} = $input_file;
364 $c->stash->{output_files
} = $output_file;
365 $c->stash->{r_temp_file
} = "${qc_type}-${pop_id}";
366 $c->stash->{r_script
} = $c->stash->{qualityControl_script
};
368 $c->stash->{analysis_tempfiles_dir
} = $c->stash->{qualityControl_temp_dir
};
370 $c->controller('solGS::AsyncJob')->get_cluster_r_job_args($c);
371 my $jobs = $c->stash->{cluster_r_job_args
};
373 if (reftype
$jobs ne 'ARRAY')
378 $c->stash->{qc_pheno_r_jobs
} = $jobs;
383 sub qc_pheno_r_jobs_file
{
386 $self->qc_pheno_r_jobs($c);
387 my $jobs = $c->stash->{qc_pheno_r_jobs
};
389 my $temp_dir = $c->stash->{qualityControl_temp_dir
};
390 my $jobs_file = $c->controller('solGS::Files')->create_tempfile($temp_dir, 'qc-r-jobs-file');
392 nstore
$jobs, $jobs_file
393 or croak
"qualityControl r jobs : $! serializing qualityControl r jobs to $jobs_file";
395 $c->stash->{qc_pheno_r_jobs_file
} = $jobs_file;
399 sub qc_pheno_query_jobs
{
402 my $trial_id = $c->stash->{pop_id
} || $c->stash->{trial_id
};
404 $c->controller('solGS::AsyncJob')->get_trials_phenotype_query_jobs_args($c, [$trial_id]);
405 my $jobs = $c->stash->{trials_phenotype_query_jobs_args
};
407 if (reftype
$jobs ne 'ARRAY')
412 $c->stash->{qc_pheno_query_jobs
} = $jobs;
417 sub qc_pheno_query_jobs_file
{
420 $self->qc_pheno_query_jobs($c);
421 my $jobs = $c->stash->{qc_pheno_query_jobs
};
427 my $temp_dir = $c->stash->{qualityControl_temp_dir
};
428 $jobs_file = $c->controller('solGS::Files')->create_tempfile($temp_dir, 'pheno-qc-query-jobs-file');
430 nstore
$jobs, $jobs_file
431 or croak
"qualityControl pheno query jobs : $! serializing qualityControl phenoquery jobs to $jobs_file";
434 $c->stash->{qc_pheno_query_jobs_file
} = $jobs_file;
439 sub begin
: Private
{
442 $c->controller('solGS::Files')->get_solgs_dirs($c);