2 package CXGN
::GEM
::ExperimentalDesign
;
7 use base qw
| CXGN
::DB
::Object
|;
8 use Bio
::Chado
::Schema
;
9 use CXGN
::GEM
::Experiment
;
10 use CXGN
::GEM
::Target
;
11 use CXGN
::Biosource
::Schema
;
12 use CXGN
::Metadata
::Metadbdata
;
14 use Carp qw
| croak cluck
|;
23 CXGN::GEM::ExperimentalDesign
24 a class to manipulate a experimental design data from the gem schema.
28 our $VERSION = '0.01';
29 $VERSION = eval $VERSION;
33 use CXGN::GEM::ExperimentalDesign;
37 my $expdesign = CXGN::GEM::ExperimentalDesign->new($schema, $expdesign_id);
41 my $expdesign_name = $expdesign->get_experimental_design_name();
42 $expdesign->set_experimental_design_name($new_name);
46 my @pub_id_list = $expdesign->get_publication_list();
47 $expdesign->add_publication($pub_id);
49 my @dbxref_id_list = $expdesign->get_dbxref_list();
50 $expdesign->add_dbxref($dbxref_id);
52 ## Metadata functions (aplicable to extended data as pub or dbxref)
54 my $metadbdata = $expdesign->get_experimental_design_metadbdata();
56 if ($expdesign->is_experimental_design_obsolete()) {
60 ## Store functions (aplicable to extended data as pub or dbxref)
62 $expdesign->store($metadbdata);
64 $expdesign->obsolete_experimental_design($metadata, 'change to obsolete test');
69 This object manage the experimental design information of the database
72 + gem.ge_experimental_design
73 + gem.ge_experimental_design_dbxref
74 + gem.ge_experimental_design_pub
76 This data is stored inside this object as dbic rows objects with the
79 %ExperimentalDesign_Object = (
81 ge_expdesign_row => GeExperimentalDesign_row,
83 ge_expdesign_dbxref_row => [ @GeExperimentalDesignDbxref_rows],
85 ge_expdesign_pub_row => [ @GeExperimentalDesignPub_rows],
92 Aureliano Bombarely <ab782@cornell.edu>
97 The following class methods are implemented:
102 ############################
103 ### GENERAL CONSTRUCTORS ###
104 ############################
106 =head2 constructor new
108 Usage: my $expdesign = CXGN::GEM::ExperimentalDesign->new($schema,
111 Desc: Create a new experimentla design object
113 Ret: a CXGN::GEM::ExperimentalDesign object
115 Args: a $schema a schema object, preferentially created using:
116 CXGN::GEM::Schema->connect(
117 sub{ CXGN::DB::Connection->new()->get_actual_dbh()},
119 A $expdesign, a scalar.
120 If $expdesign_id is omitted, an empty experimental design object is
123 Side_Effects: accesses the database, check if exists the database columns that
124 this object use. die if the id is not an integer.
126 Example: my $sample = CXGN::GEM::ExperimentalDesign->new($schema,
133 my $schema = shift ||
134 croak
("PARAMETER ERROR: None schema object was supplied to the $class->new() function.\n");
137 ### First, bless the class to create the object and set the schema into de object
138 ### (set_schema comes from CXGN::DB::Object).
140 my $self = $class->SUPER::new
($schema);
141 $self->set_schema($schema);
143 ### Second, check that ID is an integer. If it is right go and get all the data for
144 ### this row in the database and after that get the data for expdesign.
145 ### If don't find any, create an empty oject.
146 ### If it is not an integer, die
149 my @expdesign_pubs = ();
150 my @expdesign_dbxrefs = ();
153 unless ($id =~ m/^\d+$/) { ## The id can be only an integer... so it is better if we detect this fail before.
155 croak
("\nDATA TYPE ERROR: The experimental_design_id ($id) for $class->new() IS NOT AN INTEGER.\n\n");
158 ## Get the ge_expdesign_row object using a search based in the expdesign_id
160 ($expdesign) = $schema->resultset('GeExperimentalDesign')
161 ->search( { experimental_design_id
=> $id } );
164 ## If is not defined the $expdesign (the id does not exist in the db), it will create an empty object
166 if (defined $expdesign) {
168 ## Search experimenatl_design_pub associations (ge_experimental_design_pub_row objects) based in the expdesign_id
170 @expdesign_pubs = $schema->resultset('GeExperimentalDesignPub')
171 ->search( { experimental_design_id
=> $id } );
173 ## Search experimental_design_dbxref associations
175 @expdesign_dbxrefs = $schema->resultset('GeExperimentalDesignDbxref')
176 ->search( { experimental_design_id
=> $id } );
179 $expdesign = $schema->resultset('GeExperimentalDesign')
180 ->new({}); ### Create an empty object;
184 $expdesign = $schema->resultset('GeExperimentalDesign')
185 ->new({}); ### Create an empty object;
188 ## Finally it will load the rows into the object.
189 $self->set_geexpdesign_row($expdesign);
190 $self->set_geexpdesignpub_rows(\
@expdesign_pubs);
191 $self->set_geexpdesigndbxref_rows(\
@expdesign_dbxrefs);
196 =head2 constructor new_by_name
198 Usage: my $expdesign = CXGN::GEM::ExperimentalDesign->new_by_name($schema,
201 Desc: Create a new ExperimentalDesign object using experimental_design_name
203 Ret: a CXGN::GEM::ExperimentalDesign object
205 Args: a $schema a schema object, preferentially created using:
206 CXGN::GEM::Schema->connect(
207 sub{ CXGN::DB::Connection->new()->get_actual_dbh()},
209 a $experimental_design_name, a scalar
211 Side_Effects: accesses the database,
212 return a warning if the experimental design name do not exists
215 Example: my $expdesign = CXGN::GEM::ExperimentalDesign->new_by_name( $schema,
222 my $schema = shift ||
223 croak
("PARAMETER ERROR: None schema object was supplied to the $class->new_by_name() function.\n");
226 ### It will search the experimental_design_id for this name and it will get the experimental_design_id for that using the new
227 ### method to create a new object. If the name don't exists into the database it will create a empty object and
228 ### it will set the experimental_design_name for it
233 my ($expdesign_row) = $schema->resultset('GeExperimentalDesign')
234 ->search({ experimental_design_name
=> $name });
236 unless (defined $expdesign_row) {
238 cluck
("\nDATABASE OUTPUT WARNING: experimental_design_name ($name) for $class->new_by_name() DON'T EXISTS INTO THE DB.\n" );
240 ## If do not exists any experimental design with this name, it will return a warning and it will create an empty
241 ## object with the exprimental design name set in it.
243 $expdesign = $class->new($schema);
244 $expdesign->set_experimental_design_name($name);
248 ## if exists it will take the experimental_design_id to create the object with the new constructor
249 $expdesign = $class->new( $schema, $expdesign_row->get_column('experimental_design_id') );
253 $expdesign = $class->new($schema); ### Create an empty object;
261 ##################################
262 ### DBIX::CLASS ROWS ACCESSORS ###
263 ##################################
265 =head2 accessors get_geexpdesign_row, set_geexpdesign_row
267 Usage: my $geexpdesign_row = $self->get_geexpdesign_row();
268 $self->set_geexpdesign_row($geexpdesign_row_object);
270 Desc: Get or set a geexpdesign row object into a experimental
273 Ret: Get => $geexpdesign_row_object, a row object
274 (CXGN::GEM::Schema::GeExperimentalDesign).
278 Set => $geexpdesign_row_object, a row object
279 (CXGN::GEM::Schema::GeExperimentalDesign).
281 Side_Effects: With set check if the argument is a row object. If fail, dies.
283 Example: my $geexpdesign_row = $self->get_geexpdesign_row();
284 $self->set_geexpdesign_row($geexpdesign_row);
288 sub get_geexpdesign_row
{
291 return $self->{geexpdesign_row
};
294 sub set_geexpdesign_row
{
296 my $geexpdesign_row = shift
297 || croak
("FUNCTION PARAMETER ERROR: None geexpdesign_row object was supplied for $self->set_geexpdesign_row function.\n");
299 if (ref($geexpdesign_row) ne 'CXGN::GEM::Schema::GeExperimentalDesign') {
300 croak
("SET ARGUMENT ERROR: $geexpdesign_row isn't a geexpdesign_row obj. (CXGN::GEM::Schema::GeExperimentalDesign).\n");
302 $self->{geexpdesign_row
} = $geexpdesign_row;
307 =head2 accessors get_geexpdesignpub_rows, set_geexpdesignpub_rows
309 Usage: my @geexpdesignpub_rows = $self->get_geexpdesignpub_rows();
310 $self->set_geexpdesignpub_rows(\@geexpdesignpub_rows);
312 Desc: Get or set a list of geexpdesignpub rows object into an
313 experimental design object
315 Ret: Get => @geexpdesignpub_row_object, a list of row objects
316 (CXGN::GEM::Schema::GeExperimentalDesignPub).
320 Set => \@gexpdesignpub_row_object, an array ref of row objects
321 (CXGN::GEM::Schema::GeExperimentalDesignPub).
323 Side_Effects: With set check if the argument is a row object. If fail, dies.
325 Example: my @geexpdesignpub_rows = $self->get_geexpdesignpub_rows();
326 $self->set_geexpdesignpub_rows(\@geexpdesignpub_rows);
330 sub get_geexpdesignpub_rows
{
333 return @
{$self->{geexpdesignpub_rows
}};
336 sub set_geexpdesignpub_rows
{
338 my $geexpdesignpub_row_aref = shift
339 || croak
("FUNCTION PARAMETER ERROR: None geexpdesignpub_row array ref was supplied for $self->set_geexpdesignpub_rows function.\n");
341 if (ref($geexpdesignpub_row_aref) ne 'ARRAY') {
342 croak
("SET ARGUMENT ERROR: $geexpdesignpub_row_aref isn't an array reference for $self->set_geexpdesignpub_rows function.\n");
345 foreach my $geexpdesignpub_row (@
{$geexpdesignpub_row_aref}) {
346 if (ref($geexpdesignpub_row) ne 'CXGN::GEM::Schema::GeExperimentalDesignPub') {
347 croak
("SET ARGUMENT ERROR:$geexpdesignpub_row isn't geexpdesignpub_row obj(CXGN::GEM::Schema::GeExperimentalDesignPub).\n");
351 $self->{geexpdesignpub_rows
} = $geexpdesignpub_row_aref;
355 =head2 accessors get_geexpdesigndbxref_rows, set_geexpdesigndbxref_rows
357 Usage: my @geexpdesigndbxref_rows = $self->get_geexpdesigndbxref_rows();
358 $self->set_geexpdesigndbxref_rows(\@geexpdesigndbxref_rows);
360 Desc: Get or set a list of geexpdesigndbxref rows object into an
361 experimental design object
363 Ret: Get => @geexpdesigndbxref_row_object, a list of row objects
364 (CXGN::GEM::Schema::GeExperimentalDesignDbxref).
368 Set => \@gexpdesigndbxref_row_object, an array ref of row objects
369 (CXGN::GEM::Schema::GeExperimentalDesignDbxref).
371 Side_Effects: With set check if the argument is a row object. If fail, dies.
373 Example: my @geexpdesigndbxref_rows = $self->get_geexpdesigndbxref_rows();
374 $self->set_geexpdesigndbxref_rows(\@geexpdesigndbxref_rows);
378 sub get_geexpdesigndbxref_rows
{
381 return @
{$self->{geexpdesigndbxref_rows
}};
384 sub set_geexpdesigndbxref_rows
{
386 my $geexpdesigndbxref_row_aref = shift
387 || croak
("FUNCTION PARAMETER ERROR: None geexpdesigndbxref_row array ref was supplied for $self->set_geexpdesigndbxref_rows().\n");
389 if (ref($geexpdesigndbxref_row_aref) ne 'ARRAY') {
390 croak
("SET ARGUMENT ERROR: $geexpdesigndbxref_row_aref isn't an array reference for $self->set_geexpdesigndbxref_rows function.\n");
393 foreach my $geexpdesigndbxref_row (@
{$geexpdesigndbxref_row_aref}) {
394 if (ref($geexpdesigndbxref_row) ne 'CXGN::GEM::Schema::GeExperimentalDesignDbxref') {
395 croak
("SET ARGUMENT ERROR:$geexpdesigndbxref_row isn't geexpdesigndbxref_row obj.\n");
399 $self->{geexpdesigndbxref_rows
} = $geexpdesigndbxref_row_aref;
404 ##############################################
405 ### DATA ACCESSORS FOR EXPERIMENTAL DESIGN ###
406 ##############################################
408 =head2 get_experimental_design_id, force_set_experimental_design_id
410 Usage: my $expdesign_id = $expdesign->get_experimental_design_id();
411 $expdesign->force_set_experimental_design_id($expdesign_id);
413 Desc: get or set a experimental_design_id in a experimental design object.
414 set method should be USED WITH PRECAUTION
415 If you want set a experimental_design_id that do not exists into the
416 database you should consider that when you store this object you
417 CAN STORE a experimental_design_id that do not follow the
418 gem.ge_experimental_design_experimental_design_id_seq
420 Ret: get=> $expdesign_id, a scalar.
424 set=> $expdesign_id, a scalar (constraint: it must be an integer)
428 Example: my $expdesign_id = $expdesign->get_experimental_design_id();
432 sub get_experimental_design_id
{
434 return $self->get_geexpdesign_row->get_column('experimental_design_id');
437 sub force_set_experimental_design_id
{
440 croak
("FUNCTION PARAMETER ERROR: None experimental_design_id was supplied for force_set_experimental_design_id function");
442 unless ($data =~ m/^\d+$/) {
443 croak
("DATA TYPE ERROR: The experimental_design_id ($data) for $self->force_set_experimental_design_id() ISN'T AN INTEGER.\n");
446 $self->get_geexpdesign_row()
447 ->set_column( experimental_design_id
=> $data );
451 =head2 accessors get_experimental_design_name, set_experimental_design_name
453 Usage: my $expdesign_name = $expdesign->get_experimental_design_name();
454 $expdesign->set_experimental_design_name($expdesign_name);
456 Desc: Get or set the experimental_design_name from experimental design object.
458 Ret: get=> $experimental_design_name, a scalar
462 set=> $experimental_design_name, a scalar
466 Example: my $expdesign_name = $sample->get_experimental_design_name();
467 $expdesign->set_experimental_design_name($new_name);
470 sub get_experimental_design_name
{
472 return $self->get_geexpdesign_row->get_column('experimental_design_name');
475 sub set_experimental_design_name
{
478 || croak
("FUNCTION PARAMETER ERROR: None data was supplied for $self->set_experimental_design_name function.\n");
480 $self->get_geexpdesign_row()
481 ->set_column( experimental_design_name
=> $data );
484 =head2 accessors get_design_type, set_design_type
486 Usage: my $expdesign_type = $expdesign->get_design_type();
487 $expdesign->set_design_type($expdesign_type);
489 Desc: Get or set design_type from a experimental design object.
491 Ret: get=> $expdesign_type, a scalar
495 set=> $expdesign_type, a scalar
499 Example: my $expdesign_type = $expdesign->get_design_type();
503 sub get_design_type
{
505 return $self->get_geexpdesign_row->get_column('design_type');
508 sub set_design_type
{
511 || croak
("FUNCTION PARAMETER ERROR: None data was supplied for $self->set_design_type function.\n");
513 $self->get_geexpdesign_row()
514 ->set_column( design_type
=> $data );
517 =head2 accessors get_description, set_description
519 Usage: my $description = $expdesign->get_description();
520 $expdesign->set_description($description);
522 Desc: Get or set the description from an experimental design object
524 Ret: get=> $description, a scalar
528 set=> $description, a scalar
532 Example: my $description = $expdesign->get_description();
533 $expdesign->set_description($description);
536 sub get_description
{
538 return $self->get_geexpdesign_row->get_column('description');
541 sub set_description
{
545 $self->get_geexpdesign_row()
546 ->set_column( description
=> $data );
550 ###################################################
551 ### DATA ACCESSORS FOR EXPERIMENTAL DESIGN PUBS ###
552 ###################################################
554 =head2 add_publication
556 Usage: $expdesign->add_publication($pub_id);
558 Desc: Add a publication to the pub_ids associated to experimental design
559 object using different arguments as pub_id, title or dbxref_accession
563 Args: $pub_id, a publication id.
565 $expdesign->add_publication($pub_id);
566 To use with $pub_title
567 $expdesign->add_publication({ title => $pub_title } );
568 To use with pubmed accession
569 $expdesign->add_publication({ dbxref_accession => $accesssion});
571 Side_Effects: die if the parameter is not an object
573 Example: $expdesign->add_publication($pub_id);
577 sub add_publication
{
580 croak
("FUNCTION PARAMETER ERROR: None pub was supplied for $self->add_publication function.\n");
583 if ($pub =~ m/^\d+$/) {
586 elsif (ref($pub) eq 'HASH') {
588 if (exists $pub->{'title'}) {
589 ($pub_row) = $self->get_schema()
590 ->resultset('Pub::Pub')
591 ->search( {title
=> $pub->{'title'} });
593 elsif (exists $pub->{'dbxref_accession'}) {
594 ($pub_row) = $self->get_schema()
595 ->resultset('Pub::Pub')
597 { 'dbxref.accession' => $pub->{'dbxref_accession'} },
598 { join => { 'pub_dbxrefs' => 'dbxref' } },
603 unless (defined $pub_row) {
604 croak
("DATABASE ARGUMENT ERROR: Publication data used as argument for $self->add_publication function don't exists in DB.\n");
606 $pub_id = $pub_row->get_column('pub_id');
610 croak
("SET ARGUMENT ERROR: The publication ($pub) isn't a pub_id, or hash with title or dbxref_accession keys.\n");
612 my $expdesignpub_row = $self->get_schema()
613 ->resultset('GeExperimentalDesignPub')
614 ->new({ pub_id
=> $pub_id});
616 if (defined $self->get_experimental_design_id() ) {
617 $expdesignpub_row->set_column( experimental_design_id
=> $self->get_experimental_design_id() );
620 my @expdesignpub_rows = $self->get_geexpdesignpub_rows();
621 push @expdesignpub_rows, $expdesignpub_row;
622 $self->set_geexpdesignpub_rows(\
@expdesignpub_rows);
625 =head2 get_publication_list
627 Usage: my @pub_list = $expdesign->get_publication_list();
629 Desc: Get a list of publications associated to this experimental design.
631 Ret: An array of pub_ids by default, but can be titles
632 or accessions using an argument 'title' or 'dbxref.accession'
634 Args: None or a column to get.
636 Side_Effects: die if the parameter is not an object
638 Example: my @pub_id_list = $expdesign->get_publication_list();
639 my @pub_title_list = $expdesign->get_publication_list('title');
640 my @pub_title_accs = $expdesign->get_publication_list('dbxref.accession');
645 sub get_publication_list
{
651 my @expdesignpub_rows = $self->get_geexpdesignpub_rows();
652 foreach my $expdesignpub_row (@expdesignpub_rows) {
653 my $pub_id = $expdesignpub_row->get_column('pub_id');
654 my ($pub_row) = $self->get_schema()
655 ->resultset('Pub::Pub')
657 { 'me.pub_id' => $pub_id },
659 '+select' => ['dbxref.accession'],
660 '+as' => ['accession'],
661 join => { 'pub_dbxrefs' => 'dbxref' },
665 if (defined $field) {
666 push @pub_list, $pub_row->get_column($field);
669 push @pub_list, $pub_row->get_column('pub_id');
677 #####################################################
678 ### DATA ACCESSORS FOR EXPERIMENTAL DESIGN DBXREF ###
679 #####################################################
683 Usage: $expdesign->add_dbxref($dbxref_id);
685 Desc: Add a dbxref to the dbxref_ids associated to experimental design
686 object using dbxref_id or accesion + database_name
690 Args: $dbxref_id, a dbxref id.
691 To use with accession and dbxname:
692 $expdesign->add_dbxref(
694 accession => $accesssion,
699 Side_Effects: die if the parameter is not an hash reference
701 Example: $expdesign->add_dbxref($dbxref_id);
702 $expdesign->add_dbxref(
704 accession => 'GSE3380',
705 dbxname => 'GEO Accession Display',
714 my $dbxref = shift ||
715 croak
("FUNCTION PARAMETER ERROR: None dbxref data was supplied for $self->add_dbxref function.\n");
719 ## If the imput parameter is an integer, treat it as id, if not do it as hash reference
721 if ($dbxref =~ m/^\d+$/) {
722 $dbxref_id = $dbxref;
724 elsif (ref($dbxref) eq 'HASH') {
725 if (exists $dbxref->{'dbxname'}) {
726 my ($db_row) = $self->get_schema()
727 ->resultset('General::Db')
728 ->search( { name
=> $dbxref->{'dbxname'} });
729 if (defined $db_row) {
730 my $db_id = $db_row->get_column('db_id');
732 my ($dbxref_row) = $self->get_schema()
733 ->resultset('General::Dbxref')
736 accession
=> $dbxref->{'accession'},
740 if (defined $dbxref_row) {
741 $dbxref_id = $dbxref_row->get_column('dbxref_id');
744 croak
("DATABASE ARGUMENT ERROR: accession specified as argument in function $self->add_dbxref dont exists in db.\n");
748 croak
("DATABASE ARGUMENT ERROR: dbxname specified as argument in function $self->add_dbxref dont exists in db.\n");
752 croak
("INPUT ARGUMENT ERROR: None dbxname was supplied as hash ref. argument in the function $self->add_dbxref.\n ");
756 croak
("SET ARGUMENT ERROR: The dbxref ($dbxref) isn't a dbxref_id, or hash ref. with accession and dbxname keys.\n");
759 my $expdesigndbxref_row = $self->get_schema()
760 ->resultset('GeExperimentalDesignDbxref')
761 ->new({ dbxref_id
=> $dbxref_id});
763 if (defined $self->get_experimental_design_id() ) {
764 $expdesigndbxref_row->set_column( experimental_design_id
=> $self->get_experimental_design_id() );
767 my @expdesigndbxref_rows = $self->get_geexpdesigndbxref_rows();
768 push @expdesigndbxref_rows, $expdesigndbxref_row;
769 $self->set_geexpdesigndbxref_rows(\
@expdesigndbxref_rows);
772 =head2 get_dbxref_list
774 Usage: my @dbxref_id_list = $expdesign->get_dbxref_list();
776 Desc: Get a list of dbxref_id associated to this experimental design.
778 Ret: An array of dbxref_id
780 Args: None or a column to get.
782 Side_Effects: die if the parameter is not an object
784 Example: my @dbxref_id_list = $expdesign->get_dbxref_list();
788 sub get_dbxref_list
{
791 my @dbxref_list = ();
793 my @expdesigndbxref_rows = $self->get_geexpdesigndbxref_rows();
794 foreach my $expdesigndbxref_row (@expdesigndbxref_rows) {
795 my $dbxref_id = $expdesigndbxref_row->get_column('dbxref_id');
796 push @dbxref_list, $dbxref_id;
803 #####################################
804 ### METADBDATA ASSOCIATED METHODS ###
805 #####################################
807 =head2 accessors get_experimental_design_metadbdata
809 Usage: my $metadbdata = $expdesign->get_experimental_design_metadbdata();
811 Desc: Get metadata object associated to experimental design data
812 (see CXGN::Metadata::Metadbdata).
814 Ret: A metadbdata object (CXGN::Metadata::Metadbdata)
816 Args: Optional, a metadbdata object to transfer metadata creation variables
820 Example: my $metadbdata = $sample->get_experimental_design_metadbdata();
822 $sample->get_experimental_design_metadbdata($metadbdata);
826 sub get_experimental_design_metadbdata
{
828 my $metadata_obj_base = shift;
831 my $metadata_id = $self->get_geexpdesign_row
832 ->get_column('metadata_id');
834 if (defined $metadata_id) {
835 $metadbdata = CXGN
::Metadata
::Metadbdata
->new($self->get_schema(), undef, $metadata_id);
836 if (defined $metadata_obj_base) {
838 ## This will transfer the creation data from the base object to the new one
839 $metadbdata->set_object_creation_date($metadata_obj_base->get_object_creation_date());
840 $metadbdata->set_object_creation_user($metadata_obj_base->get_object_creation_user());
845 ## If do not exists the metadata_id, check the possible reasons.
846 my $experimental_design_id = $self->get_experimental_design_id();
847 if (defined $experimental_design_id) {
848 croak
("DATABASE INTEGRITY ERROR: The metadata_id for the experimental_design_id=$experimental_design_id is undefined.\n");
851 croak
("OBJECT MANAGEMENT ERROR: Object haven't defined any experimental_design_id. Probably it hasn't been stored yet.\n");
858 =head2 is_experimental_design_obsolete
860 Usage: $expdesign->is_experimental_design_obsolete();
862 Desc: Get obsolete field form metadata object associated to
863 protocol data (see CXGN::Metadata::Metadbdata).
865 Ret: 0 -> false (it is not obsolete) or 1 -> true (it is obsolete)
871 Example: unless ($expdesign->is_experimental_design_obsolete()) {
877 sub is_experimental_design_obsolete
{
880 my $metadbdata = $self->get_experimental_design_metadbdata();
881 my $obsolete = $metadbdata->get_obsolete();
883 if (defined $obsolete) {
892 =head2 accessors get_experimental_design_pub_metadbdata
894 Usage: my %metadbdata = $expdesign->get_experimental_design_pub_metadbdata();
896 Desc: Get metadata object associated to tool data
897 (see CXGN::Metadata::Metadbdata).
899 Ret: A hash with keys=pub_id and values=metadbdata object
900 (CXGN::Metadata::Metadbdata) for pub relation
902 Args: Optional, a metadbdata object to transfer metadata creation variables
906 Example: my %metadbdata = $expdesign->get_experimental_design_pub_metadbdata();
908 $expdesign->get_experimental_design_pub_metadbdata($metadbdata);
912 sub get_experimental_design_pub_metadbdata
{
914 my $metadata_obj_base = shift;
917 my @geexpdesignpub_rows = $self->get_geexpdesignpub_rows();
919 foreach my $geexpdesignpub_row (@geexpdesignpub_rows) {
920 my $pub_id = $geexpdesignpub_row->get_column('pub_id');
921 my $metadata_id = $geexpdesignpub_row->get_column('metadata_id');
923 if (defined $metadata_id) {
924 my $metadbdata = CXGN
::Metadata
::Metadbdata
->new($self->get_schema(), undef, $metadata_id);
925 if (defined $metadata_obj_base) {
927 ## This will transfer the creation data from the base object to the new one
928 $metadbdata->set_object_creation_date($metadata_obj_base->get_object_creation_date());
929 $metadbdata->set_object_creation_user($metadata_obj_base->get_object_creation_user());
931 $metadbdata{$pub_id} = $metadbdata;
934 my $expdesign_pub_id = $geexpdesignpub_row->get_column('experimental_design_pub_id');
935 unless (defined $expdesign_pub_id) {
936 croak
("OBJECT MANIPULATION ERROR: Object $self haven't any experimental_design_pub_id. Probably it hasn't been stored\n");
939 croak
("DATABASE INTEGRITY ERROR: The metadata_id for the experimental_design_pub_id=$expdesign_pub_id is undefined.\n");
946 =head2 is_experimental_design_pub_obsolete
948 Usage: $expdesign->is_experimental_design_pub_obsolete($pub_id);
950 Desc: Get obsolete field form metadata object associated to
951 protocol data (see CXGN::Metadata::Metadbdata).
953 Ret: 0 -> false (it is not obsolete) or 1 -> true (it is obsolete)
955 Args: $pub_id, a publication_id
959 Example: unless ( $expdesign->is_experimental_design_pub_obsolete($pub_id) ) {
965 sub is_experimental_design_pub_obsolete
{
969 my %metadbdata = $self->get_experimental_design_pub_metadbdata();
970 my $metadbdata = $metadbdata{$pub_id};
973 if (defined $metadbdata) {
974 $obsolete = $metadbdata->get_obsolete() || 0;
980 =head2 accessors get_experimental_design_dbxref_metadbdata
982 Usage: my %metadbdata =
983 $expdesign->get_experimental_design_dbxref_metadbdata();
985 Desc: Get metadata object associated to tool data
986 (see CXGN::Metadata::Metadbdata).
988 Ret: A hash with keys=dbxref_id and values=metadbdata object
989 (CXGN::Metadata::Metadbdata) for pub relation
991 Args: Optional, a metadbdata object to transfer metadata creation variables
995 Example: my %metadbdata =
996 $expdesign->get_experimental_design_dbxref_metadbdata();
998 $expdesign->get_experimental_design_dbxref_metadbdata($metadbdata);
1002 sub get_experimental_design_dbxref_metadbdata
{
1004 my $metadata_obj_base = shift;
1007 my @geexpdesigndbxref_rows = $self->get_geexpdesigndbxref_rows();
1009 foreach my $geexpdesigndbxref_row (@geexpdesigndbxref_rows) {
1010 my $dbxref_id = $geexpdesigndbxref_row->get_column('dbxref_id');
1011 my $metadata_id = $geexpdesigndbxref_row->get_column('metadata_id');
1013 if (defined $metadata_id) {
1014 my $metadbdata = CXGN
::Metadata
::Metadbdata
->new($self->get_schema(), undef, $metadata_id);
1015 if (defined $metadata_obj_base) {
1017 ## This will transfer the creation data from the base object to the new one
1018 $metadbdata->set_object_creation_date($metadata_obj_base->get_object_creation_date());
1019 $metadbdata->set_object_creation_user($metadata_obj_base->get_object_creation_user());
1021 $metadbdata{$dbxref_id} = $metadbdata;
1024 my $expdesign_dbxref_id = $geexpdesigndbxref_row->get_column('experimental_design_dbxref_id');
1025 unless (defined $expdesign_dbxref_id) {
1026 croak
("OBJECT MANIPULATION ERROR: Object $self haven't any experimental_design_dbxref_id.Probably it hasn't been stored\n");
1029 croak
("DATABASE INTEGRITY ERROR: metadata_id for the experimental_design_dbxref_id=$expdesign_dbxref_id is undefined.\n");
1036 =head2 is_experimental_design_dbxref_obsolete
1038 Usage: $expdesign->is_experimental_design_dbxref_obsolete($dbxref_id);
1040 Desc: Get obsolete field form metadata object associated to
1041 protocol data (see CXGN::Metadata::Metadbdata).
1043 Ret: 0 -> false (it is not obsolete) or 1 -> true (it is obsolete)
1045 Args: $dbxref_id, a dbxref_id
1049 Example: unless ($expdesign->is_experimental_design_dbxref_obsolete($dbxref_id)){
1055 sub is_experimental_design_dbxref_obsolete
{
1057 my $dbxref_id = shift;
1059 my %metadbdata = $self->get_experimental_design_dbxref_metadbdata();
1060 my $metadbdata = $metadbdata{$dbxref_id};
1063 if (defined $metadbdata) {
1064 $obsolete = $metadbdata->get_obsolete() || 0;
1071 #######################
1072 ### STORING METHODS ###
1073 #######################
1078 Usage: $expdesign->store($metadbdata);
1080 Desc: Store in the database the all experimental design data for the
1081 experimental design object.
1082 See the methods store_experimental_design, store_pub_associations
1083 and store_dbxref_associations for more details
1087 Args: $metadata, a metadata object (CXGN::Metadata::Metadbdata object).
1089 Side_Effects: Die if:
1090 1- None metadata object is supplied.
1091 2- The metadata supplied is not a CXGN::Metadata::Metadbdata
1094 Example: $expdesign->store($metadata);
1101 ## FIRST, check the metadata_id supplied as parameter
1102 my $metadata = shift
1103 || croak
("STORE ERROR: None metadbdata object was supplied to $self->store().\n");
1105 unless (ref($metadata) eq 'CXGN::Metadata::Metadbdata') {
1106 croak
("STORE ERROR: Metadbdata supplied to $self->store() is not CXGN::Metadata::Metadbdata object.\n");
1109 ## SECOND, the store functions return the updated object, so it will chain the different store functions
1111 $self->store_experimental_design($metadata);
1112 $self->store_pub_associations($metadata);
1113 $self->store_dbxref_associations($metadata);
1118 =head2 store_experimental_design
1120 Usage: $expdesign->store_experimental_design($metadata);
1122 Desc: Store in the database the experimental data for the experimental
1123 design object (Only the geexpdesign row, don't store any
1124 experimental_design_pub or experimental_design_dbxref data)
1128 Args: $metadata, a metadata object (CXGN::Metadata::Metadbdata object).
1130 Side_Effects: Die if:
1131 1- None metadata object is supplied.
1132 2- The metadata supplied is not a CXGN::Metadata::Metadbdata
1135 Example: $expdesign->store_experimental_design($metadata);
1139 sub store_experimental_design
{
1142 ## FIRST, check the metadata_id supplied as parameter
1143 my $metadata = shift
1144 || croak
("STORE ERROR: None metadbdata object was supplied to $self->store_experimental_design().\n");
1146 unless (ref($metadata) eq 'CXGN::Metadata::Metadbdata') {
1147 croak
("STORE ERROR: Metadbdata supplied to $self->store_experimental_design() is not CXGN::Metadata::Metadbdata object.\n");
1150 ## It is not necessary check the current user used to store the data because should be the same than the used
1151 ## to create a metadata_id. In the medadbdata object, it is checked.
1153 ## SECOND, check if exists or not experimental_design_id.
1154 ## if exists experimental_design_id => update
1155 ## if do not exists experimental_design_id => insert
1157 my $geexpdesign_row = $self->get_geexpdesign_row();
1158 my $expdesign_id = $geexpdesign_row->get_column('experimental_design_id');
1160 unless (defined $expdesign_id) { ## NEW INSERT and DISCARD CHANGES
1162 my $metadata_id = $metadata->store()
1163 ->get_metadata_id();
1165 $geexpdesign_row->set_column( metadata_id
=> $metadata_id ); ## Set the metadata_id column
1167 $geexpdesign_row->insert()
1168 ->discard_changes(); ## It will set the row with the updated row
1170 ## Now we set the experimental_design_id value for all the rows that depends of it
1172 my @geexpdesignpub_rows = $self->get_geexpdesignpub_rows();
1173 foreach my $geexpdesignpub_row (@geexpdesignpub_rows) {
1174 $geexpdesignpub_row->set_column( experimental_design_id
=> $geexpdesign_row->get_column('experimental_design_id'));
1177 my @geexpdesigndbxref_rows = $self->get_geexpdesigndbxref_rows();
1178 foreach my $geexpdesigndbxref_row (@geexpdesigndbxref_rows) {
1179 $geexpdesigndbxref_row->set_column( experimental_design_id
=> $geexpdesign_row->get_column('experimental_design_id'));
1184 else { ## UPDATE IF SOMETHING has change
1186 my @columns_changed = $geexpdesign_row->is_changed();
1188 if (scalar(@columns_changed) > 0) { ## ...something has change, it will take
1190 my @modification_note_list; ## the changes and the old metadata object for
1191 foreach my $col_changed (@columns_changed) { ## this dbiref and it will create a new row
1192 push @modification_note_list, "set value in $col_changed column";
1195 my $modification_note = join ', ', @modification_note_list;
1197 my $mod_metadata_id = $self->get_experimental_design_metadbdata($metadata)
1198 ->store({ modification_note
=> $modification_note })
1199 ->get_metadata_id();
1201 $geexpdesign_row->set_column( metadata_id
=> $mod_metadata_id );
1203 $geexpdesign_row->update()
1204 ->discard_changes();
1210 =head2 obsolete_experimental_design
1212 Usage: $expdesign->obsolete_experimental_design($metadata, $note, 'REVERT');
1214 Desc: Change the status of a data to obsolete.
1215 If revert tag is used the obsolete status will be reverted to 0 (false)
1219 Args: $metadata, a metadata object (CXGN::Metadata::Metadbdata object).
1220 $note, a note to explain the cause of make this data obsolete
1223 Side_Effects: Die if:
1224 1- None metadata object is supplied.
1225 2- The metadata supplied is not a CXGN::Metadata::Metadbdata
1227 Example: $expdesign->obsolete_experimental_design($metadata, 'change to obsolete test');
1231 sub obsolete_experimental_design
{
1234 ## FIRST, check the metadata_id supplied as parameter
1236 my $metadata = shift
1237 || croak
("OBSOLETE ERROR: None metadbdata object was supplied to $self->obsolete_experimental_design().\n");
1239 unless (ref($metadata) eq 'CXGN::Metadata::Metadbdata') {
1240 croak
("OBSOLETE ERROR: Metadbdata obj. supplied to $self->obsolete_experimental_design isn't CXGN::Metadata::Metadbdata obj.\n");
1243 my $obsolete_note = shift
1244 || croak
("OBSOLETE ERROR: None obsolete note was supplied to $self->obsolete_experimental_design().\n");
1246 my $revert_tag = shift;
1249 ## If exists the tag revert change obsolete to 0
1252 my $modification_note = 'change to obsolete';
1253 if (defined $revert_tag && $revert_tag =~ m/REVERT/i) {
1255 $modification_note = 'revert obsolete';
1258 ## Create a new metadata with the obsolete tag
1260 my $mod_metadata_id = $self->get_experimental_design_metadbdata($metadata)
1261 ->store( { modification_note
=> $modification_note,
1262 obsolete
=> $obsolete,
1263 obsolete_note
=> $obsolete_note } )
1264 ->get_metadata_id();
1266 ## Modify the group row in the database
1268 my $geexpdesign_row = $self->get_geexpdesign_row();
1270 $geexpdesign_row->set_column( metadata_id
=> $mod_metadata_id );
1272 $geexpdesign_row->update()
1273 ->discard_changes();
1277 =head2 store_pub_associations
1279 Usage: $expdesign->store_pub_associations($metadata);
1281 Desc: Store in the database the pub association for the experimental design
1286 Args: $metadata, a metadata object (CXGN::Metadata::Metadbdata object).
1288 Side_Effects: Die if:
1289 1- None metadata object is supplied.
1290 2- The metadata supplied is not a CXGN::Metadata::Metadbdata
1293 Example: $expdesign->store_pub_associations($metadata);
1297 sub store_pub_associations
{
1300 ## FIRST, check the metadata_id supplied as parameter
1301 my $metadata = shift
1302 || croak
("STORE ERROR: None metadbdata object was supplied to $self->store_pub_associations().\n");
1304 unless (ref($metadata) eq 'CXGN::Metadata::Metadbdata') {
1305 croak
("STORE ERROR: Metadbdata supplied to $self->store_pub_associations() is not CXGN::Metadata::Metadbdata object.\n");
1308 ## It is not necessary check the current user used to store the data because should be the same than the used
1309 ## to create a metadata_id. In the medadbdata object, it is checked.
1311 ## SECOND, check if exists or not experimental_design_pub_id.
1312 ## if exists experimental_design_pub_id => update
1313 ## if do not exists experimental_design_pub_id => insert
1315 my @geexpdesignpub_rows = $self->get_geexpdesignpub_rows();
1317 foreach my $geexpdesignpub_row (@geexpdesignpub_rows) {
1319 my $expdesign_pub_id = $geexpdesignpub_row->get_column('experimental_design_pub_id');
1320 my $pub_id = $geexpdesignpub_row->get_column('pub_id');
1322 unless (defined $expdesign_pub_id) { ## NEW INSERT and DISCARD CHANGES
1324 my $metadata_id = $metadata->store()
1325 ->get_metadata_id();
1327 $geexpdesignpub_row->set_column( metadata_id
=> $metadata_id ); ## Set the metadata_id column
1329 $geexpdesignpub_row->insert()
1330 ->discard_changes(); ## It will set the row with the updated row
1333 else { ## UPDATE IF SOMETHING has change
1335 my @columns_changed = $geexpdesignpub_row->is_changed();
1337 if (scalar(@columns_changed) > 0) { ## ...something has change, it will take
1339 my @modification_note_list; ## the changes and the old metadata object for
1340 foreach my $col_changed (@columns_changed) { ## this dbiref and it will create a new row
1341 push @modification_note_list, "set value in $col_changed column";
1344 my $modification_note = join ', ', @modification_note_list;
1346 my %aspub_metadata = $self->get_experimental_design_pub_metadbdata($metadata);
1347 my $mod_metadata_id = $aspub_metadata{$pub_id}->store({ modification_note
=> $modification_note })
1348 ->get_metadata_id();
1350 $geexpdesignpub_row->set_column( metadata_id
=> $mod_metadata_id );
1352 $geexpdesignpub_row->update()
1353 ->discard_changes();
1359 =head2 obsolete_pub_association
1361 Usage: $expdesign->obsolete_pub_association($metadata, $note, $pub_id, 'REVERT');
1363 Desc: Change the status of a data to obsolete.
1364 If revert tag is used the obsolete status will be reverted to 0 (false)
1368 Args: $metadata, a metadata object (CXGN::Metadata::Metadbdata object).
1369 $note, a note to explain the cause of make this data obsolete
1370 $pub_id, a publication id associated to this tool
1373 Side_Effects: Die if:
1374 1- None metadata object is supplied.
1375 2- The metadata supplied is not a CXGN::Metadata::Metadbdata
1377 Example: $expdesign->obsolete_pub_association($metadata,
1378 'change to obsolete test',
1383 sub obsolete_pub_association
{
1386 ## FIRST, check the metadata_id supplied as parameter
1388 my $metadata = shift
1389 || croak
("OBSOLETE ERROR: None metadbdata object was supplied to $self->obsolete_pub_association().\n");
1391 unless (ref($metadata) eq 'CXGN::Metadata::Metadbdata') {
1392 croak
("OBSOLETE ERROR: Metadbdata object supplied to $self->obsolete_pub_association is not CXGN::Metadata::Metadbdata obj.\n");
1395 my $obsolete_note = shift
1396 || croak
("OBSOLETE ERROR: None obsolete note was supplied to $self->obsolete_pub_association().\n");
1399 || croak
("OBSOLETE ERROR: None pub_id was supplied to $self->obsolete_pub_association().\n");
1401 my $revert_tag = shift;
1404 ## If exists the tag revert change obsolete to 0
1407 my $modification_note = 'change to obsolete';
1408 if (defined $revert_tag && $revert_tag =~ m/REVERT/i) {
1410 $modification_note = 'revert obsolete';
1413 ## Create a new metadata with the obsolete tag
1415 my %aspub_metadata = $self->get_experimental_design_pub_metadbdata($metadata);
1416 my $mod_metadata_id = $aspub_metadata{$pub_id}->store( { modification_note
=> $modification_note,
1417 obsolete
=> $obsolete,
1418 obsolete_note
=> $obsolete_note } )
1419 ->get_metadata_id();
1421 ## Modify the group row in the database
1423 my @geexpdesignpub_rows = $self->get_geexpdesignpub_rows();
1424 foreach my $geexpdesignpub_row (@geexpdesignpub_rows) {
1425 if ($geexpdesignpub_row->get_column('pub_id') == $pub_id) {
1427 $geexpdesignpub_row->set_column( metadata_id
=> $mod_metadata_id );
1429 $geexpdesignpub_row->update()
1430 ->discard_changes();
1436 =head2 store_dbxref_associations
1438 Usage: $expdesign->store_dbxref_associations($metadata);
1440 Desc: Store in the database the dbxref association for the experimental design
1445 Args: $metadata, a metadata object (CXGN::Metadata::Metadbdata object).
1447 Side_Effects: Die if:
1448 1- None metadata object is supplied.
1449 2- The metadata supplied is not a CXGN::Metadata::Metadbdata
1452 Example: $expdesign->store_dbxref_associations($metadata);
1456 sub store_dbxref_associations
{
1459 ## FIRST, check the metadata_id supplied as parameter
1460 my $metadata = shift
1461 || croak
("STORE ERROR: None metadbdata object was supplied to $self->store_dbxref_associations().\n");
1463 unless (ref($metadata) eq 'CXGN::Metadata::Metadbdata') {
1464 croak
("STORE ERROR: Metadbdata supplied to $self->store_dbxref_associations() is not CXGN::Metadata::Metadbdata object.\n");
1467 ## It is not necessary check the current user used to store the data because should be the same than the used
1468 ## to create a metadata_id. In the medadbdata object, it is checked.
1470 ## SECOND, check if exists or not experimental_design_dbxref_id.
1471 ## if exists experimental_design_dbxref_id => update
1472 ## if do not exists experimental_design_dbxref_id => insert
1474 my @geexpdesigndbxref_rows = $self->get_geexpdesigndbxref_rows();
1476 foreach my $geexpdesigndbxref_row (@geexpdesigndbxref_rows) {
1478 my $expdesign_dbxref_id = $geexpdesigndbxref_row->get_column('experimental_design_dbxref_id');
1479 my $dbxref_id = $geexpdesigndbxref_row->get_column('dbxref_id');
1481 unless (defined $expdesign_dbxref_id) { ## NEW INSERT and DISCARD CHANGES
1483 my $metadata_id = $metadata->store()
1484 ->get_metadata_id();
1486 $geexpdesigndbxref_row->set_column( metadata_id
=> $metadata_id ); ## Set the metadata_id column
1488 $geexpdesigndbxref_row->insert()
1489 ->discard_changes(); ## It will set the row with the updated row
1492 else { ## UPDATE IF SOMETHING has change
1494 my @columns_changed = $geexpdesigndbxref_row->is_changed();
1496 if (scalar(@columns_changed) > 0) { ## ...something has change, it will take
1498 my @modification_note_list; ## the changes and the old metadata object for
1499 foreach my $col_changed (@columns_changed) { ## this dbiref and it will create a new row
1500 push @modification_note_list, "set value in $col_changed column";
1503 my $modification_note = join ', ', @modification_note_list;
1505 my %asdbxref_metadata = $self->get_experimental_design_dbxref_metadbdata($metadata);
1506 my $mod_metadata_id = $asdbxref_metadata{$dbxref_id}->store({ modification_note
=> $modification_note })
1507 ->get_metadata_id();
1509 $geexpdesigndbxref_row->set_column( metadata_id
=> $mod_metadata_id );
1511 $geexpdesigndbxref_row->update()
1512 ->discard_changes();
1518 =head2 obsolete_dbxref_association
1520 Usage: $expdesign->obsolete_dbxref_association($metadata, $note, $dbxref_id, 'REVERT');
1522 Desc: Change the status of a data to obsolete.
1523 If revert tag is used the obsolete status will be reverted to 0 (false)
1527 Args: $metadata, a metadata object (CXGN::Metadata::Metadbdata object).
1528 $note, a note to explain the cause of make this data obsolete
1529 $dbxref_id, a dbxref id
1532 Side_Effects: Die if:
1533 1- None metadata object is supplied.
1534 2- The metadata supplied is not a CXGN::Metadata::Metadbdata
1536 Example: $expdesign->obsolete_dbxref_association($metadata,
1537 'change to obsolete test',
1542 sub obsolete_dbxref_association
{
1545 ## FIRST, check the metadata_id supplied as parameter
1547 my $metadata = shift
1548 || croak
("OBSOLETE ERROR: None metadbdata object was supplied to $self->obsolete_dbxref_association().\n");
1550 unless (ref($metadata) eq 'CXGN::Metadata::Metadbdata') {
1551 croak
("OBSOLETE ERROR: Metadbdata obj. supplied to $self->obsolete_dbxref_association is not CXGN::Metadata::Metadbdata obj.\n");
1554 my $obsolete_note = shift
1555 || croak
("OBSOLETE ERROR: None obsolete note was supplied to $self->obsolete_dbxref_association().\n");
1557 my $dbxref_id = shift
1558 || croak
("OBSOLETE ERROR: None dbxref_id was supplied to $self->obsolete_dbxref_association().\n");
1560 my $revert_tag = shift;
1563 ## If exists the tag revert change obsolete to 0
1566 my $modification_note = 'change to obsolete';
1567 if (defined $revert_tag && $revert_tag =~ m/REVERT/i) {
1569 $modification_note = 'revert obsolete';
1572 ## Create a new metadata with the obsolete tag
1574 my %asdbxref_metadata = $self->get_experimental_design_dbxref_metadbdata($metadata);
1575 my $mod_metadata_id = $asdbxref_metadata{$dbxref_id}->store( { modification_note
=> $modification_note,
1576 obsolete
=> $obsolete,
1577 obsolete_note
=> $obsolete_note } )
1578 ->get_metadata_id();
1580 ## Modify the group row in the database
1582 my @geexpdesigndbxref_rows = $self->get_geexpdesigndbxref_rows();
1583 foreach my $geexpdesigndbxref_row (@geexpdesigndbxref_rows) {
1584 if ($geexpdesigndbxref_row->get_column('dbxref_id') == $dbxref_id) {
1586 $geexpdesigndbxref_row->set_column( metadata_id
=> $mod_metadata_id );
1588 $geexpdesigndbxref_row->update()
1589 ->discard_changes();
1594 #####################
1595 ### OTHER METHODS ###
1596 #####################
1599 =head2 get_experiment_list
1601 Usage: my @experiments = $expdesign->get_experiment_list();
1603 Desc: Get a list of CXGN::GEM::Experiment objects.
1605 Ret: An array with a list of CXGN::GEM::Experiment objects.
1609 Side_Effects: die if the experiment_design_object have not any
1610 experimental_design_id
1612 Example: my @experiments = $expdesign->get_experiment_list();
1616 sub get_experiment_list
{
1619 my @experiments = ();
1621 my $experimental_design_id = $self->get_experimental_design_id();
1623 unless (defined $experimental_design_id) {
1624 croak
("OBJECT MANIPULATION ERROR: The $self object haven't any experimental_design_id. Probably it hasn't store yet.\n");
1627 my @exp_rows = $self->get_schema()
1628 ->resultset('GeExperiment')
1629 ->search( { experimental_design_id
=> $experimental_design_id } );
1631 foreach my $exp_row (@exp_rows) {
1632 my $experiment = CXGN
::GEM
::Experiment
->new($self->get_schema(), $exp_row->get_column('experiment_id'));
1634 push @experiments, $experiment;
1637 return @experiments;
1641 =head2 get_po_sorted_experiment_list
1643 Usage: my @experiments = $expdesign->get_po_sorted_experiment_list();
1645 Desc: Get a list of CXGN::GEM::Experiment objects, ordered by its PO
1647 Ret: An array with a list of CXGN::GEM::Experiment objects.
1651 Side_Effects: die if the experiment_design_object have not any
1652 experimental_design_id
1654 Example: my @experiments = $expdesign->get_experiment_list();
1658 sub get_po_sorted_experiment_list
{
1661 my @experiments_sorted = ();
1662 my @experiments = $self->get_experiment_list();
1664 ## Define the PO Root accessions (they will be used to define the
1665 ## shortest path and to sepparate PO in structure or develop based
1668 my $po_structure_root = 'PO:0009011';
1669 my $po_development_root = 'PO:0009012';
1671 ## First, transfer the PO annotations from sample to experiments
1673 ## Define the hash that will contain the paths
1675 my %experiment_objs = ();
1676 my %default_experiment_objs = ();
1677 my %exp_structure_popath = ();
1678 my %exp_develop_popath = ();
1679 my %str_popath_count = ();
1680 my %dev_popath_count = ();
1682 foreach my $exp (@experiments) {
1685 my @targets = $exp->get_target_list();
1686 my $experiment_id = $exp->get_experiment_id();
1688 ## Store the experiment objects in a hash with key=experiment_id
1689 ## to access to them faster after the order
1691 my $exp_name = $exp->get_experiment_name();
1692 $experiment_objs{$experiment_id} = $exp;
1694 ## Store the names to sort alphabetically by default if none dbxref is associated
1695 ## with the experiments of this expdesign
1696 $default_experiment_objs{$exp_name} = $exp;
1699 foreach my $target (@targets) {
1701 my $target_name = $target->get_target_name();
1702 my @samples = $target->get_sample_list();
1704 foreach my $sample (@samples) {
1706 my $sample_name = $sample->get_sample_name();
1707 my %dbxref_po = $sample->get_dbxref_related('PO');
1709 foreach my $dbxref_id (keys %dbxref_po) {
1710 unless (exists $exp_po{$dbxref_id}) {
1711 $exp_po{$dbxref_id} = $dbxref_po{$dbxref_id};
1717 ## Now it will take the path as PO:XXXXXXXX from each cvterm (PO)
1718 ## (It will use PO:XXXXXX instead cvterm_id to be able to have the same
1719 ## order independently from the cvterm load in the database).
1720 ## The last element will be always the cvterm.name, so after the path
1721 ## it will be orther by name
1723 foreach my $dbxrefid (keys %exp_po) {
1729 my $cvterm_id = $exp_po{$dbxrefid}->{'cvterm.cvterm_id'};
1730 my $complete_accession = $exp_po{$dbxrefid}->{'db.name'} . ':' . $exp_po{$dbxrefid}->{'dbxref.accession'};
1732 ## Last element in the path (first element to be added) will be the cvterm.name
1734 push @path, $exp_po{$dbxrefid}->{'cvterm.name'};
1736 ## It will take the path for that cvterm (only parents... so pathdistance > 0)
1738 my @cvtermpath_rows = $self->get_schema()
1739 ->resultset('Cv::Cvtermpath')
1741 { subject_id
=> $cvterm_id, pathdistance
=> { '>', 0 } },
1742 { order_by
=> 'pathdistance', }
1745 ## This will get all the path for this cvterm, they are redundant so
1746 ## it will remove this redundancy using a hash
1748 my %parent_po_terms = ();
1750 foreach my $cvtermpath_row (@cvtermpath_rows) {
1752 my $parent_cvterm_id = $cvtermpath_row->get_column('object_id');
1753 my $parent_distance = $cvtermpath_row->get_column('pathdistance');
1755 my ($parent_cvterm_row) = $self->get_schema()
1756 ->resultset('Cv::Cvterm')
1757 ->search({'cvterm_id' => $parent_cvterm_id});
1759 my ($dbxref_row) = $self->get_schema()
1760 ->resultset('General::Dbxref')
1761 ->search({'dbxref_id' => $parent_cvterm_row->get_column('dbxref_id')});
1763 my ($db_row) = $self->get_schema()
1764 ->resultset('General::Db')
1765 ->search({'db_id' => $dbxref_row->get_column('db_id')});
1767 ## Now it will add the po_terms from closest to farest... in the array the first element will be the root
1768 ## (the farest parent po term)
1770 if (defined $dbxref_row && defined $db_row) {
1772 my $po_term = $db_row->get_column('name') . ':' . $dbxref_row->get_column('accession');
1773 unless (exists $parent_po_terms{$po_term}) {
1775 ## The last po_term added should be the roots 'PO:0009011' or 'PO:0009012'
1778 if (defined $path[0]) {
1779 if ($path[0] eq $po_structure_root) {
1782 elsif ($path[0] eq $po_development_root) {
1788 unshift @path, $po_term;
1791 $parent_po_terms{$po_term} = $parent_distance;
1796 ## Now it will add the path to two different hashes, po_structure and po_development, corresponding with the two
1797 ## different roots for po terms ()
1799 ## Each parent-root will be $path[0]
1800 ## Define the po_path, and store the count for each po_path. Later, if some po_path_count (by structure) > 0
1801 ## it will take a secondary order (by development)
1803 my $po_path = join(',', @path);
1805 if ($path[0] eq $po_structure_root) { ## That means 'plant structure'
1806 unless (exists $exp_structure_popath{$experiment_id}) {
1807 $exp_structure_popath{$experiment_id} = $po_path;
1808 unless (exists $str_popath_count{$po_path}) {
1809 $str_popath_count{$po_path} = 1;
1812 $str_popath_count{$po_path}++;
1816 elsif ($path[0] eq $po_development_root) { ## That means 'plant growth and development stages'
1817 unless (exists $exp_develop_popath{$experiment_id}) {
1818 $exp_develop_popath{$experiment_id} = $po_path;
1819 unless (exists $dev_popath_count{$po_path}) {
1820 $dev_popath_count{$po_path} = 1;
1823 $dev_popath_count{$po_path}++;
1830 ## Now it will take all the experiments from the object
1832 my %exp_combined_po;
1834 foreach my $exp_id (keys %experiment_objs) {
1835 my $exp_str_po = $exp_structure_popath{$exp_id} || 'Z';
1836 my $exp_dev_po = $exp_develop_popath{$exp_id} || 'Z';
1838 $exp_combined_po{$exp_id} = $exp_str_po . '-' . $exp_dev_po . '-' . $experiment_objs{$exp_id}->get_experiment_name();
1841 ## Finally it will be sorted by the values in the exp_combined_po... if there are some dbxref associated with these
1842 ## experiments, if not, return a list sorted by default by alphabetical name
1844 if (scalar(keys %exp_structure_popath) > 0 && scalar(keys %exp_develop_popath) > 0) {
1845 foreach my $sort_exp_id (sort {$exp_combined_po{$a} cmp $exp_combined_po{$b}} keys %exp_combined_po) {
1846 push @experiments_sorted, $experiment_objs{$sort_exp_id};
1850 foreach my $experim_name (sort keys %default_experiment_objs) {
1851 push @experiments_sorted, $default_experiment_objs{$experim_name};
1855 return @experiments_sorted;
1858 =head2 get_target_list
1860 Usage: my @targets = $expdesign->get_target_list();
1862 Desc: Get a list of CXGN::GEM::Target objects.
1864 Ret: An array with a list of CXGN::GEM::Target objects.
1868 Side_Effects: die if the experiment_design_object have not any
1869 experimental_design_id
1871 Example: my @targets = $expdesign->get_target_list();
1875 sub get_target_list
{
1880 my $experimental_design_id = $self->get_experimental_design_id();
1882 unless (defined $experimental_design_id) {
1883 croak
("OBJECT MANIPULATION ERROR: The $self object haven't any experimental_design_id. Probably it hasn't store yet.\n");
1886 my @exp_rows = $self->get_schema()
1887 ->resultset('GeExperiment')
1888 ->search( { experimental_design_id
=> $experimental_design_id } );
1890 foreach my $exp_row (@exp_rows) {
1891 my $experiment_id = $exp_row->get_column('experiment_id');
1893 my @target_rows = $self->get_schema()
1894 ->resultset('GeTarget')
1895 ->search( { experiment_id
=> $experiment_id } );
1897 foreach my $target_row (@target_rows) {
1898 my $target = CXGN
::GEM
::Target
->new($self->get_schema(), $target_row->get_column('target_id') );
1900 push @targets, $target;