3 CXGN::Cvterm - a second-level object for Cvterm
9 This object was re-factored from CXGN::Chado::Cvterm and moosified.
10 Use CXGN::Cvterm for new code. CXGN::Chado::Cvterm is deprecated
15 Naama Menda <nm249@cornell.edu>
16 Lukas Mueller <lam87@cornell.edu>
20 package CXGN
::Cvterm
;
26 use Bio
::Chado
::Schema
;
27 use CXGN
::Metadata
::Schema
;
28 use SGN
::Model
::Cvterm
;
30 use base qw
/ CXGN::DB::Object / ;
34 =head2 accessor schema
39 isa
=> 'Bio::Chado::Schema',
44 =head2 accessor cvterm
46 Returns: Cv::Cvterm DBIx::Class object
51 isa
=> 'Bio::Chado::Schema::Result::Cv::Cvterm',
55 =head2 accessor cvterm_id
69 isa
=> 'Bio::Chado::Schema::Result::Cv::Cv',
82 =head2 accessor dbxref
87 isa
=> 'Bio::Chado::Schema::Result::General::Dbxref',
96 isa
=> 'Bio::Chado::Schema::Result::General::Db',
109 =head2 accessor definition
113 has
'definition' => (
118 =head2 accessor is_obsolete
123 has
'is_obsolete' => (
130 =head2 accessor accession
132 refers to dbxref.accession column
143 #########################################
150 if ($self->cvterm_id){
151 $cvterm = $self->schema()->resultset("Cv::Cvterm")->find({ cvterm_id
=> $self->cvterm_id() });
152 } elsif ($self->accession ) {
153 my ($db_name, $dbxref_accession) = split "\:", $self->accession;
155 #InterPro accessions have a namespace (db.name) that is different from the accession prefic
156 if ($self->accession =~ m/^IPR*/ ) {
157 $db_name = 'InterPro';
158 $dbxref_accession= $self->accession;
160 my $dbxref = $self->schema()->resultset("General::Dbxref")->find(
162 'db.name' => $db_name,
163 'me.accession' => $dbxref_accession,
168 if ($dbxref) { $cvterm = $dbxref->cvterm ; }
171 if (defined $cvterm) {
172 $self->cvterm($cvterm);
173 $self->cvterm_id($cvterm->cvterm_id);
174 $self->name($cvterm->name);
175 $self->definition($cvterm->definition || '' );
176 $self->is_obsolete($cvterm->is_obsolete);
178 $self->dbxref( $self->schema()->resultset("General::Dbxref")->find({ dbxref_id
=>$cvterm->dbxref_id() }) );
179 $self->cv_id( $cvterm->cv_id);
180 $self->cv( $self->schema()->resultset("Cv::Cv")->find( { cv_id
=> $cvterm->cv_id() }) );
181 $self->db( $self->dbxref->db );
182 $self->accession( $self->db->name . ':' . $self->dbxref->accession );
194 =head2 function get_image_ids
196 Synopsis: my @images = $self->get_image_ids()
198 Returns: a list of md_image_ids
200 Description: a method for fetching all images associated with a cvterm
207 my $q = "SELECT image_id FROM metadata.md_image_cvterm WHERE cvterm_id=? AND obsolete = 'f' ";
208 my $h = $self->schema->storage->dbh()->prepare($q);
209 $h->execute($self->cvterm_id);
210 while (my ($image_id) = $h->fetchrow_array()){
211 push @ids, [$image_id, 'cvterm'];
218 =head2 function get_is_relationshiptype
220 Usage: my $is_relationshiptype = $self->get_is_relationship_type
221 Desc: find the database value of teh cvterm column is_relationship_type (integer 0,1)
228 sub get_is_relationshiptype
{
230 return $self->cvterm->is_relationship_type;
238 Usage: my @synonyms = $self->synonyms()
239 Desc: Fetch all synonym names of a cvterm. use BCS cvterm->add_synonym and $cvterm->delete_synonym to manipulate cvtermsynonyms
240 Ret: an array of synonym strings
249 my $cvterm = $self->cvterm;
250 my $synonym_rs = $cvterm->cvtermsynonyms;
253 while ( my $s = $synonym_rs->next ) {
254 push (@synonyms, $s->synonym) ;
259 =head2 get_single_synonym
261 Usage: my $single_synonym = $self->get_single_synonym;
262 Desc: a method for fetching a single synonym, based on the synonym structure. This is ugly and it would be better if we used types and type ids
263 Ret: a single synonym
270 sub get_single_synonym
{
272 my $cvterm_id= $self->cvterm_id();
274 my $query= "SELECT synonym FROM cvtermsynonym WHERE cvterm_id= ? AND synonym NOT LIKE '% %' AND synonym NOT LIKE '%\\_%' LIMIT 1";
275 my $synonym_sth = $self->schema->storage->dbh->prepare($query);
276 $synonym_sth->execute($cvterm_id);
278 my $single_synonym = $synonym_sth->fetchrow_array();
280 return $single_synonym;
284 =head2 secondary_dbxrefs
286 Usage: $self->secondary_dbxrefs
287 Desc: find all secondary accessions associated with the cvterm
288 These are stored in cvterm_dbxref table
289 Ret: a list of full accession strings (PO:0001234)
296 sub secondary_dbxrefs
{
298 my $rs = $self->cvterm->search_related('cvterm_dbxrefs' , { is_for_definition
=> 0} );
300 while (my $r = $rs->next) {
301 push @list , $r->dbxref;
311 Usage: $self->def_dbxrefs
312 Desc: find all definition dbxrefs of the cvterm
313 These are stored in cvterm_dbxref table
314 Ret: an array of dbxref objects
323 my $cvterm = $self->cvterm;
324 my @defs = $cvterm->search_related('cvterm_dbxrefs' , { is_for_definition
=> 1} );
326 return @defs || undef ;
332 Usage: $self->cvtermprops
333 Desc: find all cvtermprops (names and values) of the cvterm
334 These are stored in cvtermprop table
335 Ret: hashref of arrays - key = cvtermprop type name, value = list of cvtermprop values of that type
345 my $cvtermprops = $self->cvterm->cvtermprops;
347 while ( my $prop = $cvtermprops->next ) {
348 push @
{ $properties->{$prop->type->name } } , $prop->value ;
354 ########################################
355 sub _retrieve_cvtermprop
{
361 my $cvtermprop_type_id = SGN
::Model
::Cvterm
->get_cvterm_row($self->schema, $type, 'trait_property')->cvterm_id();
362 my $rs = $self->schema()->resultset("Cv::Cvtermprop")->search({ cvterm_id
=> $self->cvterm_id(), type_id
=> $cvtermprop_type_id }, { order_by
=> {-asc
=> 'cvtermprop_id'} });
364 while (my $r = $rs->next()){
365 push @results, $r->value;
368 print STDERR
"Cvterm $type does not exist in this database\n";
371 my $res = join ',', @results;
375 sub _remove_cvtermprop
{
379 my $type_id = SGN
::Model
::Cvterm
->get_cvterm_row($self->schema, $type, 'trait_property')->cvterm_id();
380 my $rs = $self->schema()->resultset("Cv::Cvtermprop")->search( { type_id
=>$type_id, cvterm_id
=> $self->cvterm_id(), value
=>$value } );
382 if ($rs->count() == 1) {
383 $rs->first->delete();
386 elsif ($rs->count() == 0) {
390 print STDERR
"Error removing cvtermprop from cvterm ".$self->cvterm_id().". Please check this manually.\n";
396 sub _store_cvtermprop
{
400 my $cvtermprop = SGN
::Model
::Cvterm
->get_cvterm_row($self->schema, $type, 'trait_property')->name();
401 my $stored_cvtermprop = $self->cvterm->create_cvtermprops({ $cvtermprop => $value});
407 __PACKAGE__
->meta->make_immutable;