2 package SGN
::Controller
::AJAX
::BreedersToolbox
;
6 use URI
::FromHash
'uri';
8 use File
::Slurp
"read_file";
11 use CXGN
::BreedersToolbox
::Projects
;
12 use CXGN
::BreedersToolbox
::Delete
;
13 use CXGN
::Trial
::TrialDesign
;
14 use CXGN
::Trial
::TrialCreate
;
15 use CXGN
::Stock
::StockLookup
;
20 use CXGN
::Dataset
::File
;
23 BEGIN { extends
'Catalyst::Controller::REST' }
26 default => 'application/json',
28 map => { 'application/json' => 'JSON' },
31 sub get_breeding_programs
: Path
('/ajax/breeders/all_programs') Args
(0) {
35 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
36 my $po = CXGN
::BreedersToolbox
::Projects
->new( { schema
=> $c->dbic_schema("Bio::Chado::Schema", undef, $sp_person_id) });
38 my $breeding_programs = $po->get_breeding_programs();
40 $c->stash->{rest
} = $breeding_programs;
43 sub store_breeding_program
:Path
('/breeders/program/store') Args
(0) {
46 my $id = $c->req->param("id") || undef;
47 my $name = $c->req->param("name");
48 my $desc = $c->req->param("desc");
50 if (!($c->user() || $c->user()->check_roles('submitter'))) {
51 $c->stash->{rest
} = { error
=> 'You need to be logged in and have sufficient privileges to add or edit a breeding program.' };
54 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
55 my $p = CXGN
::BreedersToolbox
::Projects
->new( {
56 schema
=> $c->dbic_schema("Bio::Chado::Schema", undef, $sp_person_id),
62 my $program = $p->store_breeding_program();
64 print STDERR
"Program is ".Dumper
($program)."\n";
66 $c->stash->{rest
} = $program;
70 sub delete_breeding_program
:Path
('/breeders/program/delete') Args
(1) {
73 my $program_id = shift;
74 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
75 if ($c->user && ($c->user->check_roles("curator"))) {
76 my $p = CXGN
::BreedersToolbox
::Projects
->new( { schema
=> $c->dbic_schema("Bio::Chado::Schema", undef, $sp_person_id) });
77 $p->delete_breeding_program($program_id);
78 $c->stash->{rest
} = [ 1 ];
81 $c->stash->{rest
} = { error
=> "You need to be logged in with curator privileges to delete a breeding program." };
86 sub get_breeding_programs_by_trial
:Path
('/breeders/programs_by_trial/') Args
(1) {
91 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
92 my $p = CXGN
::BreedersToolbox
::Projects
->new( { schema
=> $c->dbic_schema("Bio::Chado::Schema", undef, $sp_person_id) } );
94 my $projects = $p->get_breeding_programs_by_trial($trial_id);
96 $c->stash->{rest
} = { projects
=> $projects };
100 sub add_data_agreement
:Path
('/breeders/trial/add/data_agreement') Args
(0) {
104 my $project_id = $c->req->param('project_id');
105 my $data_agreement = $c->req->param('text');
108 $c->stash->{rest
} = { error
=> 'You need to be logged in to add a data agreement' };
112 if (!($c->user()->check_roles('curator') || $c->user()->check_roles('submitter'))) {
113 $c->stash->{rest
} = { error
=> 'You do not have the required privileges to add a data agreement to this trial.' };
117 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
118 my $schema = $c->dbic_schema('Bio::Chado::Schema', undef, $sp_person_id);
120 my $data_agreement_cvterm_id_rs = $schema->resultset('Cv::Cvterm')->search( { name
=> 'data_agreement' });
123 if ($data_agreement_cvterm_id_rs->count>0) {
124 $type_id = $data_agreement_cvterm_id_rs->first()->cvterm_id();
128 my $project_rs = $schema->resultset('Project::Project')->search(
129 { project_id
=> $project_id }
132 if ($project_rs->count() == 0) {
133 $c->stash->{rest
} = { error
=> "No such project $project_id", };
137 my $project = $project_rs->first();
139 my $projectprop_rs = $schema->resultset("Project::Projectprop")->search( { 'project_id' => $project_id, 'type_id'=>$type_id });
142 if ($projectprop_rs->count() > 0) {
143 $projectprop = $projectprop_rs->first();
144 $projectprop->value($data_agreement);
145 $projectprop->update();
146 $c->stash->{rest
} = { message
=> 'Updated data agreement.' };
149 $projectprop = $project->create_projectprops( { 'data_agreement' => $data_agreement,}, {autocreate
=>1});
150 $c->stash->{rest
} = { message
=> 'Inserted new data agreement.'};
154 $c->stash->{rest
} = { error
=> $@
};
159 sub get_data_agreement
:Path
('/breeders/trial/data_agreement/get') :Args
(0) {
163 my $project_id = $c->req->param('project_id');
165 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
166 my $schema = $c->dbic_schema('Bio::Chado::Schema', undef, $sp_person_id);
168 my $data_agreement_cvterm_id_rs = $schema->resultset('Cv::Cvterm')->search( { name
=> 'data_agreement' });
170 if ($data_agreement_cvterm_id_rs->count() == 0) {
171 $c->stash->{rest
} = { error
=> "No data agreements have been added yet." };
175 my $type_id = $data_agreement_cvterm_id_rs->first()->cvterm_id();
177 print STDERR
"PROJECTID: $project_id TYPE_ID: $type_id\n";
179 my $projectprop_rs = $schema->resultset('Project::Projectprop')->search(
180 { project_id
=> $project_id, type_id
=>$type_id }
183 if ($projectprop_rs->count() == 0) {
184 $c->stash->{rest
} = { error
=> "No such project $project_id", };
187 my $projectprop = $projectprop_rs->first();
188 $c->stash->{rest
} = { prop_id
=> $projectprop->projectprop_id(), text
=> $projectprop->value() };
192 sub get_all_years
: Path
('/ajax/breeders/trial/all_years' ) Args
(0) {
196 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
197 my $bp = CXGN
::BreedersToolbox
::Projects
->new({ schema
=> $c->dbic_schema("Bio::Chado::Schema", undef, $sp_person_id) });
198 my @years = $bp->get_all_years();
200 $c->stash->{rest
} = { years
=> \
@years };
203 sub get_trial_location
: Path
('/ajax/breeders/trial/location') Args
(1) {
206 my $trial_id = shift;
208 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
209 my $t = CXGN
::Trial
->new(
211 bcs_schema
=> $c->dbic_schema("Bio::Chado::Schema", undef, $sp_person_id),
212 trial_id
=> $trial_id
216 $c->stash->{rest
} = { location
=> $t->get_location() };
219 $c->stash->{rest
} = { error
=> "The trial with id $trial_id does not exist" };
224 sub get_trial_type
: Path
('/ajax/breeders/trial/type') Args
(1) {
227 my $trial_id = shift;
229 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
230 my $t = CXGN
::Trial
->new(
232 bcs_schema
=> $c->dbic_schema("Bio::Chado::Schema", undef, $sp_person_id),
233 trial_id
=> $trial_id
236 my $type = $t->get_project_type();
237 $c->stash->{rest
} = { type
=> $type };
240 sub get_all_trial_types
: Path
('/ajax/breeders/trial/alltypes') Args
(0) {
244 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
245 my @types = CXGN
::Trial
::get_all_project_types
($c->dbic_schema("Bio::Chado::Schema", undef, $sp_person_id));
247 $c->stash->{rest
} = { types
=> \
@types };
251 sub get_accession_plots
:Path
('/ajax/breeders/get_accession_plots') Args
(0) {
254 my $field_trial = $c->req->param("field_trial");
255 my $parent_accession = $c->req->param("parent_accession");
257 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
258 my $schema = $c->dbic_schema('Bio::Chado::Schema', 'sgn_chado', $sp_person_id);
259 my $field_layout_typeid = $c->model("Cvterm")->get_cvterm_row($schema, "field_layout", "experiment_type")->cvterm_id();
260 my $dbh = $schema->storage->dbh();
262 my $trial = $schema->resultset("Project::Project")->find ({name
=> $field_trial});
263 my $trial_id = $trial->project_id();
265 my $cross_accession = $schema->resultset("Stock::Stock")->find ({uniquename
=> $parent_accession});
266 my $cross_accession_id = $cross_accession->stock_id();
268 my $q = "SELECT stock.stock_id, stock.uniquename
269 FROM nd_experiment_project join nd_experiment on (nd_experiment_project.nd_experiment_id=nd_experiment.nd_experiment_id) AND nd_experiment.type_id= ?
270 JOIN nd_experiment_stock ON (nd_experiment.nd_experiment_id=nd_experiment_stock.nd_experiment_id)
271 JOIN stock_relationship on (nd_experiment_stock.stock_id = stock_relationship.subject_id) AND stock_relationship.object_id = ?
272 JOIN stock on (stock_relationship.subject_id = stock.stock_id)
273 WHERE nd_experiment_project.project_id= ? ";
275 my $h = $dbh->prepare($q);
276 $h->execute($field_layout_typeid, $cross_accession_id, $trial_id, );
279 while(my ($plot_id, $plot_name) = $h->fetchrow_array()){
281 push @plots, [$plot_id, $plot_name];
283 #print STDERR Dumper \@plots;
284 $c->stash->{rest
} = {data
=>\
@plots};
288 sub delete_uploaded_phenotype_files
: Path
('/ajax/breeders/phenotyping/delete/') Args
(1) {
292 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
293 my $schema = $c->dbic_schema('Bio::Chado::Schema', undef, $sp_person_id);
294 print STDERR
"Deleting phenotypes from File ID: $file_id and making file obsolete\n";
295 my $dbh = $c->dbc->dbh();
296 my $nd_experiment_type_id = SGN
::Model
::Cvterm
->get_cvterm_row($schema, 'phenotyping_experiment', 'experiment_type')->cvterm_id();
299 SELECT phenotype_id, nd_experiment_id, file_id
301 JOIN nd_experiment_phenotype using(phenotype_id)
302 JOIN nd_experiment_stock using(nd_experiment_id)
303 JOIN nd_experiment using(nd_experiment_id)
304 LEFT JOIN phenome.nd_experiment_md_files using(nd_experiment_id)
305 JOIN stock using(stock_id)
307 AND nd_experiment.type_id = $nd_experiment_type_id";
309 my $h = $dbh->prepare($q_search);
310 $h->execute($file_id);
312 my %phenotype_ids_and_nd_experiment_ids_to_delete;
314 while (my ($phenotype_id, $nd_experiment_id, $file_id) = $h->fetchrow_array()) {
315 push @
{$phenotype_ids_and_nd_experiment_ids_to_delete{phenotype_ids
}}, $phenotype_id;
316 push @
{$phenotype_ids_and_nd_experiment_ids_to_delete{nd_experiment_ids
}}, $nd_experiment_id;
321 my $dir = $c->tempfiles_subdir('/delete_nd_experiment_ids');
322 my $temp_file_nd_experiment_id = $c->config->{basepath
}."/".$c->tempfile( TEMPLATE
=> 'delete_nd_experiment_ids/fileXXXX');
323 my $delete_phenotype_values_error = CXGN
::Project
::delete_phenotype_values_and_nd_experiment_md_values
($c->config->{dbhost
}, $c->config->{dbname
}, $c->config->{dbuser
}, $c->config->{dbpass
}, $temp_file_nd_experiment_id, $c->config->{basepath
}, $schema, \
%phenotype_ids_and_nd_experiment_ids_to_delete);
324 if ($delete_phenotype_values_error) {
325 die "Error deleting phenotype values ".$delete_phenotype_values_error."\n";
329 my $h4 = $dbh->prepare("UPDATE metadata.md_metadata SET obsolete = 1 where metadata_id IN (SELECT metadata_id from metadata.md_files where file_id=?);");
330 $h4->execute($file_id);
331 print STDERR
"Phenotype file successfully made obsolete (AKA deleted).\n";
333 my $async_refresh = CXGN
::Tools
::Run
->new();
334 $async_refresh->run_async("perl " . $c->config->{basepath
} . "/bin/refresh_matviews.pl -H " . $c->config->{dbhost
} . " -D " . $c->config->{dbname
} . " -U " . $c->config->{dbuser
} . " -P " . $c->config->{dbpass
} . " -m fullview -c");
336 $c->stash->{rest
} = {success
=> 1};
339 sub progress
: Path
('/ajax/progress') Args
(0) {
343 my $trait_id = $c->req->param("trait_id");
345 print STDERR
"Trait id = $trait_id\n";
347 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
348 my $schema = $c->dbic_schema("Bio::Chado::Schema", undef, $sp_person_id);
349 my $dbh = $schema->storage->dbh();
351 my $q = "select projectprop.value, avg(phenotype.value::REAL), stddev(phenotype.value::REAL),count(*) from phenotype join cvterm on(cvalue_id=cvterm_id) join nd_experiment_phenotype using(phenotype_id) join nd_experiment_project using(nd_experiment_id) join projectprop using(project_id) where cvterm.cvterm_id=? and phenotype.value not in ('-', 'miss','#VALUE!','..') and projectprop.type_id=(SELECT cvterm_id FROM cvterm where name='project year') group by projectprop.type_id, projectprop.value order by projectprop.value";
353 my $h = $dbh->prepare($q);
355 $h->execute($trait_id);
359 while (my ($year, $mean, $stddev, $count) = $h->fetchrow_array()) {
360 push @
$data, [ $year, sprintf("%.2f", $mean), sprintf("%.2f", $stddev), $count ];
363 print STDERR
"Data = ".Dumper
($data);
365 $c->stash->{rest
} = { data
=> $data };
369 sub radarGraph
: Path
('/ajax/radargraph') Args
(0) {
372 my $dataset_id = $c->req->param('dataset_id');
374 my $sp_person_id = $c->user() ?
$c->user->get_object()->get_sp_person_id() : undef;
375 my $people_schema = $c->dbic_schema("CXGN::People::Schema", undef, $sp_person_id);
376 my $schema = $c->dbic_schema("Bio::Chado::Schema", "sgn_chado", $sp_person_id);
377 my $dbh = $schema->storage->dbh();
380 # my $stock_id = $c->req->param("stock_id");
381 # my $cvterm_id = $c->req->param("cvterm_id");
383 # my $q = 'select accessions.uniquename, cvterm.name, cvterm.cvterm_id, accessions.stock_id, avg(phenotype.value::REAL), stddev(phenotype.value::REAL), count(*)
385 # join phenotype on(cvalue_id=cvterm_id)
386 # join nd_experiment_phenotype using(phenotype_id)
387 # join nd_experiment_stock using(nd_experiment_id)
388 # join stock using(stock_id)
389 # join stock_relationship on(subject_id=stock.stock_id)
390 # join stock as accessions on(stock_relationship.object_id=accessions.stock_id)
391 # where stock.type_id=76393 and accessions.stock_id=? and cvterm.cvterm_id=? and phenotype.value ~ \'^[0-9]+\.?[0-9]*$\'
392 # group by accessions.uniquename, cvterm.name, cvterm.cvterm_id, accessions.stock_id;';
393 # my $h = $dbh->prepare($q);
396 my $ds = CXGN
::Dataset
->new(people_schema
=> $people_schema, schema
=> $schema, sp_dataset_id
=> $dataset_id);
397 my $trait_list = $ds->retrieve_phenotypes();
398 my $ds_name = $ds->name();
400 #print STDERR "Dataset Id = $dataset_id\n";
401 #print STDERR "Trait List = ".Dumper($trait_list);
403 $c->stash->{rest
} = {
404 data
=> \@
$trait_list,
409 #print STDERR "Dataset Id = $dataset_id\n";
410 #print STDERR "Trait List = ".Dumper($trait_list);