comparison variant_effect_predictor/Bio/EnsEMBL/Gene.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1f6dce3d34e0
1 =head1 LICENSE
2
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
4 Genome Research Limited. All rights reserved.
5
6 This software is distributed under a modified Apache license.
7 For license details, please see
8
9 http://www.ensembl.org/info/about/code_licence.html
10
11 =head1 CONTACT
12
13 Please email comments or questions to the public Ensembl
14 developers list at <dev@ensembl.org>.
15
16 Questions may also be sent to the Ensembl help desk at
17 <helpdesk@ensembl.org>.
18
19 =cut
20
21 =head1 NAME
22
23 Bio::EnsEMBL::Gene - Object representing a genes
24
25 =head1 SYNOPSIS
26
27 my $gene = Bio::EnsEMBL::Gene->new(
28 -START => 123,
29 -END => 1045,
30 -STRAND => 1,
31 -SLICE => $slice
32 );
33
34 # print gene information
35 print("gene start:end:strand is "
36 . join( ":", map { $gene->$_ } qw(start end strand) )
37 . "\n" );
38
39 # set some additional attributes
40 $gene->stable_id('ENSG000001');
41 $gene->description('This is the gene description');
42
43 =head1 DESCRIPTION
44
45 A representation of a Gene within the Ensembl system. A gene is a set of one or
46 more alternative transcripts.
47
48 =head1 METHODS
49
50 =cut
51
52 package Bio::EnsEMBL::Gene;
53
54 use strict;
55
56 use POSIX;
57 use Bio::EnsEMBL::Feature;
58 use Bio::EnsEMBL::Utils::Argument qw(rearrange);
59 use Bio::EnsEMBL::Utils::Exception qw(throw warning deprecate);
60 use Bio::EnsEMBL::Utils::Scalar qw(assert_ref);
61
62 use vars qw(@ISA);
63 @ISA = qw(Bio::EnsEMBL::Feature);
64
65
66 =head2 new
67
68 Arg [-START] :
69 int - start postion of the gene
70 Arg [-END] :
71 int - end position of the gene
72 Arg [-STRAND] :
73 int - 1,-1 tehe strand the gene is on
74 Arg [-SLICE] :
75 Bio::EnsEMBL::Slice - the slice the gene is on
76 Arg [-STABLE_ID] :
77 string - the stable identifier of this gene
78 Arg [-VERSION] :
79 int - the version of the stable identifier of this gene
80 Arg [-EXTERNAL_NAME] :
81 string - the external database name associated with this gene
82 Arg [-EXTERNAL_DB] :
83 string - the name of the database the external name is from
84 Arg [-EXTERNAL_STATUS]:
85 string - the status of the external identifier
86 Arg [-DISPLAY_XREF]:
87 Bio::EnsEMBL::DBEntry - The external database entry that is used
88 to label this gene when it is displayed.
89 Arg [-TRANSCRIPTS]:
90 Listref of Bio::EnsEMBL::Transcripts - this gene's transcripts
91 Arg [-CREATED_DATE]:
92 string - the date the gene was created
93 Arg [-MODIFIED_DATE]:
94 string - the date the gene was last modified
95 Arg [-DESCRIPTION]:
96 string - the genes description
97 Arg [-BIOTYPE]:
98 string - the biotype e.g. "protein_coding"
99 Arg [-STATUS]:
100 string - the gene status i.e. "KNOWN","NOVEL"
101 Arg [-SOURCE]:
102 string - the genes source, e.g. "ensembl"
103 Arg [-IS_CURRENT]:
104 Boolean - specifies if this is the current version of the gene
105 Arg [-CANONICAL_TRANSCRIPT]:
106 Bio::EnsEMBL::Transcript - the canonical transcript of this gene
107 Arg [-CANONICAL_TRANSCRIPT_ID]:
108 integer - the canonical transcript dbID of this gene, if the
109 transcript object itself is not available.
110 Arg [-CANONICAL_ANNOTATION]:
111 string - canonical annotation
112
113 Example : $gene = Bio::EnsEMBL::Gene->new(...);
114 Description: Creates a new gene object
115 Returntype : Bio::EnsEMBL::Gene
116 Exceptions : none
117 Caller : general
118 Status : Stable
119
120 =cut
121
122 sub new {
123 my $caller = shift;
124
125 my $class = ref($caller) || $caller;
126 my $self = $class->SUPER::new(@_);
127 my (
128 $stable_id, $version,
129 $external_name, $type,
130 $external_db, $external_status,
131 $display_xref, $description,
132 $transcripts, $created_date,
133 $modified_date, $confidence,
134 $biotype, $source,
135 $status, $is_current,
136 $canonical_transcript_id, $canonical_transcript,
137 $canonical_annotation
138 )
139 = rearrange( [
140 'STABLE_ID', 'VERSION',
141 'EXTERNAL_NAME', 'TYPE',
142 'EXTERNAL_DB', 'EXTERNAL_STATUS',
143 'DISPLAY_XREF', 'DESCRIPTION',
144 'TRANSCRIPTS', 'CREATED_DATE',
145 'MODIFIED_DATE', 'CONFIDENCE',
146 'BIOTYPE', 'SOURCE',
147 'STATUS', 'IS_CURRENT',
148 'CANONICAL_TRANSCRIPT_ID', 'CANONICAL_TRANSCRIPT',
149 'CANONICAL_ANNOTATION'
150 ],
151 @_
152 );
153
154
155 if ($transcripts) {
156 $self->{'_transcript_array'} = $transcripts;
157 $self->recalculate_coordinates();
158 }
159
160 $self->stable_id($stable_id);
161 $self->version($version);
162 $self->{'created_date'} = $created_date;
163 $self->{'modified_date'} = $modified_date;
164
165 $self->external_name($external_name) if ( defined $external_name );
166 $self->external_db($external_db) if ( defined $external_db );
167 $self->external_status($external_status)
168 if ( defined $external_status );
169 $self->display_xref($display_xref) if ( defined $display_xref );
170 $self->biotype($type) if ( defined $type );
171 $self->biotype($biotype) if ( defined $biotype );
172 $self->description($description);
173 $self->status($confidence); # incase old naming is used.
174 # kept to ensure routine is backwards compatible.
175 $self->status($status); # add new naming
176 $self->source($source);
177
178 # default to is_current
179 $is_current = 1 unless (defined($is_current));
180 $self->{'is_current'} = $is_current;
181
182 # Add the canonical transcript if we were given one, otherwise add the
183 # canonical transcript internal ID if we were given one.
184 if ( defined($canonical_transcript) ) {
185 $self->canonical_transcript($canonical_transcript);
186 } elsif ( defined($canonical_transcript_id) ) {
187 $self->{'canonical_transcript_id'} = $canonical_transcript_id;
188 }
189
190 $self->canonical_annotation($canonical_annotation)
191 if ( defined $canonical_annotation );
192
193 return $self;
194 }
195
196
197 =head2 is_known
198
199 Example : print "Gene ".$gene->stable_id." is KNOWN\n" if $gene->is_known;
200 Description: Returns TRUE if this gene has a status of 'KNOWN'
201 Returntype : TRUE if known, FALSE otherwise
202 Exceptions : none
203 Caller : general
204 Status : Stable
205
206 =cut
207
208
209 sub is_known{
210 my $self = shift;
211 return ( $self->{'status'} eq "KNOWN" || $self->{'status'} eq "KNOWN_BY_PROJECTION" );
212 }
213
214
215 =head2 external_name
216
217 Arg [1] : (optional) String - the external name to set
218 Example : $gene->external_name('BRCA2');
219 Description: Getter/setter for attribute external_name.
220 Returntype : String or undef
221 Exceptions : none
222 Caller : general
223 Status : Stable
224
225 =cut
226
227 sub external_name {
228 my $self = shift;
229
230 $self->{'external_name'} = shift if (@_);
231
232 if (defined $self->{'external_name'}) {
233 return $self->{'external_name'};
234 }
235
236 my $display_xref = $self->display_xref();
237
238 if (defined $display_xref) {
239 return $display_xref->display_id();
240 } else {
241 return undef;
242 }
243 }
244
245
246 =head2 status
247
248 Arg [1] : (optional) String - status to set
249 Example : $gene->status('KNOWN');
250 Description: Getter/setter for attribute status
251 Returntype : String
252 Exceptions : none
253 Caller : general
254 Status : Medium Risk
255
256 =cut
257
258 sub status {
259 my $self = shift;
260 $self->{'status'} = shift if( @_ );
261 return $self->{'status'};
262 }
263
264
265 =head2 source
266
267 Arg [1] : (optional) String - the source to set
268 Example : $gene->source('ensembl');
269 Description: Getter/setter for attribute source
270 Returntype : String
271 Exceptions : none
272 Caller : general
273 Status : Stable
274
275 =cut
276
277 sub source {
278 my $self = shift;
279 $self->{'source'} = shift if( @_ );
280 return ( $self->{'source'} || "ensembl" );
281 }
282
283
284 =head2 external_db
285
286 Arg [1] : (optional) String - name of external db to set
287 Example : $gene->external_db('HGNC');
288 Description: Getter/setter for attribute external_db. The db is the one that
289 belongs to the external_name.
290 Returntype : String
291 Exceptions : none
292 Caller : general
293 Status : Stable
294
295 =cut
296
297 sub external_db {
298 my $self = shift;
299
300 $self->{'external_db'} = shift if( @_ );
301
302 if( exists $self->{'external_db'} ) {
303 return $self->{'external_db'};
304 }
305
306 my $display_xref = $self->display_xref();
307
308 if( defined $display_xref ) {
309 return $display_xref->dbname()
310 } else {
311 return undef;
312 }
313 }
314
315
316 =head2 external_status
317
318 Arg [1] : (optional) String - status of the external db
319 Example : $gene->external_status('KNOWNXREF');
320 Description: Getter/setter for attribute external_status. The status of
321 the external db of the one that belongs to the external_name.
322 Returntype : String
323 Exceptions : none
324 Caller : general
325 Status : Stable
326
327 =cut
328
329 sub external_status {
330 my $self = shift;
331
332 $self->{'_ext_status'} = shift if ( @_ );
333 return $self->{'_ext_status'} if exists $self->{'_ext_status'};
334
335 my $display_xref = $self->display_xref();
336
337 if( defined $display_xref ) {
338 return $display_xref->status()
339 } else {
340 return undef;
341 }
342 }
343
344
345 =head2 description
346
347 Arg [1] : (optional) String - the description to set
348 Example : $gene->description('This is the gene\'s description');
349 Description: Getter/setter for gene description
350 Returntype : String
351 Exceptions : none
352 Caller : general
353 Status : Stable
354
355 =cut
356
357 sub description {
358 my $self = shift;
359 $self->{'description'} = shift if( @_ );
360 return $self->{'description'};
361 }
362
363
364 =head2 equals
365
366 Arg [1] : Bio::EnsEMBL::Gene gene
367 Example : if ($geneA->equals($geneB)) { ... }
368 Description : Compares two genes for equality.
369 The test for eqality goes through the following list
370 and terminates at the first true match:
371
372 1. If Bio::EnsEMBL::Feature::equals() returns false,
373 then the genes are *not* equal.
374 2. If the biotypes differ, then the genes are *not*
375 equal.
376 3. If both genes have stable IDs: if these are the
377 same, the genes are equal, otherwise not.
378 4. If both genes have the same number of transcripts
379 and if these are (when compared pair-wise sorted by
380 start-position and length) the same, then they are
381 equal, otherwise not.
382
383 Return type : Boolean (0, 1)
384
385 Exceptions : Thrown if a non-gene is passed as the argument.
386
387 =cut
388
389 sub equals {
390 my ( $self, $gene ) = @_;
391
392 if ( !defined($gene) ) { return 0 }
393 if ( $self eq $gene ) { return 1 }
394
395 assert_ref( $gene, 'Bio::EnsEMBL::Gene' );
396
397 my $feature_equals = $self->SUPER::equals($gene);
398 if ( defined($feature_equals) && $feature_equals == 0 ) {
399 return 0;
400 }
401
402 if ( $self->biotype() ne $gene->biotype() ) {
403 return 0;
404 }
405
406 if ( defined( $self->stable_id() ) && defined( $gene->stable_id() ) )
407 {
408 if ( $self->stable_id() eq $gene->stable_id() ) { return 1 }
409 else { return 0 }
410 }
411
412 my @self_transcripts = sort {
413 $a->start() <=> $b->start() ||
414 $a->length() <=> $b->length()
415 } @{ $self->get_all_Transcripts() };
416 my @gene_transcripts = sort {
417 $a->start() <=> $b->start() ||
418 $a->length() <=> $b->length()
419 } @{ $gene->get_all_Transcripts() };
420
421 if ( scalar(@self_transcripts) != scalar(@gene_transcripts) ) {
422 return 0;
423 }
424
425 while (@self_transcripts) {
426 my $self_transcript = shift(@self_transcripts);
427 my $gene_transcript = shift(@gene_transcripts);
428
429 if ( !$self_transcript->equals($gene_transcript) ) {
430 return 0;
431 }
432 }
433
434 return 1;
435 } ## end sub equals
436
437 =head2 canonical_transcript
438
439 Arg [1] : (optional) Bio::EnsEMBL::Transcipt - canonical_transcript object
440 Example : $gene->canonical_transcript($canonical_transcript);
441 Description: Getter/setter for the canonical_transcript
442 Returntype : Bio::EnsEMBL::Transcript
443 Exceptions : Throws if argument is not a transcript object.
444 Caller : general
445 Status : Stable
446
447 =cut
448
449 sub canonical_transcript {
450 my ( $self, $transcript ) = @_;
451
452 if ( defined($transcript) ) {
453 # We're attaching a new canonical transcript.
454
455 assert_ref( $transcript, 'Bio::EnsEMBL::Transcript' );
456
457 # If there's already a canonical transcript, make sure it doesn't
458 # think it's still canonical.
459 if ( defined( $self->{'canonical_transcript'} ) ) {
460 $self->{'canonical_transcript'}->is_canonical(0);
461 }
462
463 $self->{'canonical_transcript'} = $transcript;
464 $self->{'canonical_transcript_id'} = $transcript->dbID();
465
466 $transcript->is_canonical(1);
467
468 } elsif ( !defined( $self->{'canonical_transcript'} )
469 && defined( $self->{'canonical_transcript_id'} )
470 && $self->{'canonical_transcript_id'} != 0 )
471 {
472 # We have not attached a canoncical transcript, but we have the dbID
473 # of one.
474
475 if ( defined( $self->adaptor() ) ) {
476 my $transcript_adaptor =
477 $self->adaptor()->db()->get_TranscriptAdaptor();
478
479 my $canonical_transcript =
480 $transcript_adaptor->fetch_by_dbID(
481 $self->{'canonical_transcript_id'} );
482
483 if ( defined($canonical_transcript) ) {
484 # Recusive call...
485 $self->canonical_transcript($canonical_transcript);
486 }
487
488 } else {
489 warning( "Gene has no adaptor "
490 . "when trying to fetch canonical transcript." );
491 }
492
493 } ## end elsif ( !defined( $self->...))
494
495 return $self->{'canonical_transcript'};
496 } ## end sub canonical_transcript
497
498
499 =head2 canonical_annotation
500
501 Arg [1] : (optional) String - canonical_annotation
502 Example : $gene->canonical_annotation('This is the canonical_annotation');
503 Description: Getter/setter for the canonical_annotation
504 Returntype : String
505 Exceptions : none
506 Caller : general
507 Status : Stable
508
509 =cut
510
511 sub canonical_annotation {
512 my $self = shift;
513 $self->{'canonical_annotation'} = shift if( @_ );
514 return $self->{'canonical_annotation'};
515 }
516
517 =head2 get_all_Attributes
518
519 Arg [1] : (optional) String $attrib_code
520 The code of the attribute type to retrieve values for
521 Example : my ($author) = @{ $gene->get_all_Attributes('author') };
522 my @gene_attributes = @{ $gene->get_all_Attributes };
523 Description: Gets a list of Attributes of this gene.
524 Optionally just get Attributes for given code.
525 Returntype : Listref of Bio::EnsEMBL::Attribute
526 Exceptions : warning if gene does not have attached adaptor and attempts lazy
527 load.
528 Caller : general
529 Status : Stable
530
531 =cut
532
533 sub get_all_Attributes {
534 my $self = shift;
535 my $attrib_code = shift;
536
537 if ( ! exists $self->{'attributes' } ) {
538 if (!$self->adaptor() ) {
539 return [];
540 }
541
542 my $attribute_adaptor = $self->adaptor->db->get_AttributeAdaptor();
543 $self->{'attributes'} = $attribute_adaptor->fetch_all_by_Gene($self);
544 }
545
546 if ( defined $attrib_code ) {
547 my @results = grep { uc($_->code()) eq uc($attrib_code) }
548 @{$self->{'attributes'}};
549 return \@results;
550 } else {
551 return $self->{'attributes'};
552 }
553 }
554
555
556 =head2 add_Attributes
557
558 Arg [1-N] : list of Bio::EnsEMBL::Attribute's @attribs
559 Attribute(s) to add
560 Example : my $attrib = Bio::EnsEMBL::Attribute->new(...);
561 $gene->add_Attributes($attrib);
562 Description: Adds an Attribute to the Gene. If you add an attribute before
563 you retrieve any from database, lazy loading will be disabled.
564 Returntype : none
565 Exceptions : throw on incorrect arguments
566 Caller : general
567 Status : Stable
568
569 =cut
570
571 sub add_Attributes {
572 my $self = shift;
573 my @attribs = @_;
574
575 if( ! exists $self->{'attributes'} ) {
576 $self->{'attributes'} = [];
577 }
578
579 for my $attrib ( @attribs ) {
580 if( ! $attrib->isa( "Bio::EnsEMBL::Attribute" )) {
581 throw( "Argument to add_Attribute has to be an Bio::EnsEMBL::Attribute" );
582 }
583 push( @{$self->{'attributes'}}, $attrib );
584 }
585
586 return;
587 }
588
589
590 =head2 add_DBEntry
591
592 Arg [1] : Bio::EnsEMBL::DBEntry $dbe
593 The dbEntry to be added
594 Example : my $dbe = Bio::EnsEMBL::DBEntery->new(...);
595 $gene->add_DBEntry($dbe);
596 Description: Associates a DBEntry with this gene. Note that adding DBEntries
597 will prevent future lazy-loading of DBEntries for this gene
598 (see get_all_DBEntries).
599 Returntype : none
600 Exceptions : thrown on incorrect argument type
601 Caller : general
602 Status : Stable
603
604 =cut
605
606 sub add_DBEntry {
607 my $self = shift;
608 my $dbe = shift;
609
610 unless($dbe && ref($dbe) && $dbe->isa('Bio::EnsEMBL::DBEntry')) {
611 throw('Expected DBEntry argument');
612 }
613
614 $self->{'dbentries'} ||= [];
615 push @{$self->{'dbentries'}}, $dbe;
616 }
617
618
619 =head2 get_all_DBEntries
620
621 Arg [1] : (optional) String, external database name
622
623 Arg [2] : (optional) String, external_db type
624
625 Example : @dbentries = @{ $gene->get_all_DBEntries() };
626
627 Description: Retrieves DBEntries (xrefs) for this gene. This does
628 *not* include DBEntries that are associated with the
629 transcripts and corresponding translations of this
630 gene (see get_all_DBLinks()).
631
632 This method will attempt to lazy-load DBEntries
633 from a database if an adaptor is available and no
634 DBEntries are present on the gene (i.e. they have not
635 already been added or loaded).
636
637 Return type: Listref of Bio::EnsEMBL::DBEntry objects
638 Exceptions : none
639 Caller : get_all_DBLinks, GeneAdaptor::store
640 Status : Stable
641
642 =cut
643
644 sub get_all_DBEntries {
645 my ( $self, $db_name_exp, $ex_db_type ) = @_;
646
647 my $cache_name = 'dbentries';
648
649 if ( defined($db_name_exp) ) {
650 $cache_name .= $db_name_exp;
651 }
652
653 if ( defined($ex_db_type) ) {
654 $cache_name .= $ex_db_type;
655 }
656
657 # if not cached, retrieve all of the xrefs for this gene
658 if ( !defined( $self->{$cache_name} ) && defined( $self->adaptor() ) )
659 {
660 $self->{$cache_name} =
661 $self->adaptor()->db()->get_DBEntryAdaptor()
662 ->fetch_all_by_Gene( $self, $db_name_exp, $ex_db_type );
663 }
664
665 $self->{$cache_name} ||= [];
666
667 return $self->{$cache_name};
668 } ## end sub get_all_DBEntries
669
670 =head2 get_all_object_xrefs
671
672 Arg [1] : (optional) String, external database name
673
674 Arg [2] : (optional) String, external_db type
675
676 Example : @oxrefs = @{ $gene->get_all_object_xrefs() };
677
678 Description: Retrieves xrefs for this gene. This does *not*
679 include xrefs that are associated with the
680 transcripts or corresponding translations of this
681 gene (see get_all_xrefs()).
682
683 This method will attempt to lazy-load xrefs from a
684 database if an adaptor is available and no xrefs are
685 present on the gene (i.e. they have not already been
686 added or loaded).
687
688 NB: This method is an alias for the
689 get_all_DBentries() method.
690
691 Return type: Listref of Bio::EnsEMBL::DBEntry objects
692
693 Status : Stable
694
695 =cut
696
697 sub get_all_object_xrefs {
698 my $self = shift;
699 return $self->get_all_DBEntries(@_);
700 }
701
702 =head2 get_all_DBLinks
703
704 Arg [1] : String database name (optional)
705 SQL wildcard characters (_ and %) can be used to
706 specify patterns.
707
708 Example : @dblinks = @{ $gene->get_all_DBLinks() };
709 @dblinks = @{ $gene->get_all_DBLinks('Uniprot%') };
710
711 Description: Retrieves *all* related DBEntries for this gene. This
712 includes all DBEntries that are associated with the
713 transcripts and corresponding translations of this
714 gene.
715
716 If you only want to retrieve the DBEntries
717 associated with the gene (and not the transcript
718 and translations) then you should use the
719 get_all_DBEntries() call instead.
720
721 Note: Each entry may be listed more than once. No
722 uniqueness checks are done. Also if you put in an
723 incorrect external database name no checks are done
724 to see if this exists, you will just get an empty
725 list.
726
727 Return type: Listref of Bio::EnsEMBL::DBEntry objects
728 Exceptions : none
729 Caller : general
730 Status : Stable
731
732 =cut
733
734 sub get_all_DBLinks {
735 my ( $self, $db_name_exp, $ex_db_type ) = @_;
736
737 my @links =
738 @{ $self->get_all_DBEntries( $db_name_exp, $ex_db_type ) };
739
740 # Add all of the transcript and translation xrefs to the return list.
741 foreach my $transcript ( @{ $self->get_all_Transcripts() } ) {
742 push( @links,
743 @{$transcript->get_all_DBLinks( $db_name_exp, $ex_db_type ) }
744 );
745 }
746
747 return \@links;
748 }
749
750 =head2 get_all_xrefs
751
752 Arg [1] : String database name (optional)
753 SQL wildcard characters (_ and %) can be used to
754 specify patterns.
755
756 Example : @xrefs = @{ $gene->get_all_xrefs() };
757 @xrefs = @{ $gene->get_all_xrefs('Uniprot%') };
758
759 Description: Retrieves *all* related xrefs for this gene. This
760 includes all xrefs that are associated with the
761 transcripts and corresponding translations of this
762 gene.
763
764 If you want to retrieve the xrefs associated
765 with only the gene (and not the transcript
766 or translations) then you should use the
767 get_all_object_xrefs() method instead.
768
769 Note: Each entry may be listed more than once. No
770 uniqueness checks are done. Also if you put in an
771 incorrect external database name no checks are done
772 to see if this exists, you will just get an empty
773 list.
774
775 NB: This method is an alias for the
776 get_all_DBLinks() method.
777
778 Return type: Listref of Bio::EnsEMBL::DBEntry objects
779
780 Status : Stable
781
782 =cut
783
784 sub get_all_xrefs {
785 my $self = shift;
786 return $self->get_all_DBLinks(@_);
787 }
788
789 =head2 get_all_Exons
790
791 Example : my @exons = @{ $gene->get_all_Exons };
792 Description: Returns a set of all the exons associated with this gene.
793 Returntype : Listref of Bio::EnsEMBL::Exon objects
794 Exceptions : none
795 Caller : general
796 Status : Stable
797
798 =cut
799
800
801 sub get_all_Exons {
802 my $self = shift;
803
804 my %h;
805 my @out = ();
806
807 foreach my $trans ( @{$self->get_all_Transcripts} ) {
808 foreach my $e ( @{$trans->get_all_Exons} ) {
809 $h{$e->start()."-".$e->end()."-".$e->strand()."-".$e->phase()."-".$e->end_phase()} = $e;
810 }
811 }
812
813 push @out, values %h;
814
815 return \@out;
816 }
817
818
819 =head2 get_all_homologous_Genes
820
821 Description: Queries the Ensembl Compara database and retrieves all
822 Genes from other species that are orthologous.
823 REQUIRES properly setup Registry conf file. Meaning that
824 one of the aliases for each core db has to be "Genus species"
825 e.g. "Homo sapiens" (as in the name column in genome_db table
826 in the compara database).
827 Returntype : listref [
828 Bio::EnsEMBL::Gene,
829 Bio::EnsEMBL::Compara::Homology,
830 string $species # needed as cannot get spp from Gene
831 ]
832 Exceptions : none
833 Caller : general
834 Status : Stable
835
836 =cut
837
838 sub get_all_homologous_Genes {
839 my $self = shift;
840
841 if( exists( $self->{'homologues'} ) ){
842 return $self->{'homologues'};
843 }
844 $self->{'homologues'} = [];
845
846 # TODO: Find a robust way of retrieving compara dba directly.
847 # For now look through all DBAs
848 my $compara_dba;
849 foreach my $dba( @{Bio::EnsEMBL::Registry->get_all_DBAdaptors} ){
850 if( $dba->isa('Bio::EnsEMBL::Compara::DBSQL::DBAdaptor') ){
851 $compara_dba = $dba;
852 last;
853 }
854 }
855 unless( $compara_dba ){
856 warning("No compara in Bio::EnsEMBL::Registry");
857 return $self->{'homologues'};
858 }
859
860 # Get the compara 'member' corresponding to self
861 my $member_adaptor = $compara_dba->get_adaptor('Member');
862 my $query_member = $member_adaptor->fetch_by_source_stable_id
863 ("ENSEMBLGENE",$self->stable_id);
864 unless( $query_member ){ return $self->{'homologues'} };
865
866 # Get the compara 'homologies' corresponding to 'member'
867 my $homology_adaptor = $compara_dba->get_adaptor('Homology');
868 my @homolos = @{$homology_adaptor->fetch_all_by_Member($query_member)};
869 unless( scalar(@homolos) ){ return $self->{'homologues'} };
870
871 # Get the ensembl 'genes' corresponding to 'homologies'
872 foreach my $homolo( @homolos ){
873 foreach my $member_attrib( @{$homolo->get_all_Member_Attribute} ){
874 my ($member, $attrib) = @{$member_attrib};
875 my $hstable_id = $member->stable_id;
876 next if ($hstable_id eq $query_member->stable_id); # Ignore self
877 my $hgene = undef;
878 eval { $hgene = $member->get_Gene;} ;
879 unless( $hgene ){
880 # Something up with DB. Create a new gene is best we can do
881 $hgene = Bio::EnsEMBL::Gene->new
882 ( -stable_id=>$hstable_id,
883 -description=>$member->description, );
884 }
885 my $hspecies = $member->genome_db->name;
886 push @{$self->{'homologues'}}, [$hgene,$homolo,$hspecies];
887 }
888 }
889 return $self->{'homologues'};
890 }
891
892
893 =head2 biotype
894
895 Arg [1] : (optional) String - the biotype to set
896 Example : $gene->biotype("protein_coding");
897 Description: Getter/setter for the attribute biotype
898 Returntype : String
899 Exceptions : none
900 Caller : general
901 Status : Stable
902
903 =cut
904
905 sub biotype {
906 my $self = shift;
907
908 $self->{'biotype'} = shift if( @_ );
909 return ( $self->{'biotype'} || "protein_coding" );
910 }
911
912
913 =head2 add_Transcript
914
915 Arg [1] : Bio::EnsEMBL::Transcript $trans
916 The transcript to add to the gene
917 Example : my $transcript = Bio::EnsEMBL::Transcript->new(...);
918 $gene->add_Transcript($transcript);
919 Description: Adds another Transcript to the set of alternatively
920 spliced Transcripts of this gene. If it shares exons
921 with another Transcript, these should be object-identical.
922 Returntype : none
923 Exceptions : none
924 Caller : general
925 Status : Stable
926
927 =cut
928
929 sub add_Transcript {
930 my ($self, $trans) = @_;
931
932 if( !ref $trans || ! $trans->isa("Bio::EnsEMBL::Transcript") ) {
933 throw("$trans is not a Bio::EnsEMBL::Transcript!");
934 }
935
936 $self->{'_transcript_array'} ||= [];
937 push(@{$self->{'_transcript_array'}},$trans);
938
939 $self->recalculate_coordinates();
940 }
941
942
943 =head2 get_all_Transcripts
944
945 Example : my @transcripts = @{ $gene->get_all_Transcripts };
946 Description: Returns the Transcripts in this gene.
947 Returntype : Listref of Bio::EnsEMBL::Transcript objects
948 Exceptions : none
949 Caller : general
950 Status : Stable
951
952 =cut
953
954 sub get_all_Transcripts {
955 my $self = shift;
956
957 if( ! exists $self->{'_transcript_array'} ) {
958 if( defined $self->adaptor() ) {
959 my $ta = $self->adaptor()->db()->get_TranscriptAdaptor();
960 my $transcripts = $ta->fetch_all_by_Gene( $self );
961 $self->{'_transcript_array'} = $transcripts;
962 }
963 }
964 return $self->{'_transcript_array'};
965 }
966
967
968 =head2 get_all_alt_alleles
969
970 Example : my @alt_genes = @{ $gene->get_all_alt_alleles };
971 foreach my $alt_gene (@alt_genes) {
972 print "Alternate allele: " . $alt_gene->stable_id() . "\n";
973 }
974 Description: Returns a listref of Gene objects that represent this Gene on
975 an alternative haplotype. Empty list if there is no such
976 Gene (eg there is no overlapping haplotype).
977 Returntype : listref of Bio::EnsEMBL::Gene objects
978 Exceptions : none
979 Caller : general
980 Status : Stable
981
982 =cut
983
984 sub get_all_alt_alleles {
985 my $self = shift;
986 my $result = $self->adaptor()->fetch_all_alt_alleles( $self );
987 return $result;
988 }
989
990
991 =head2 version
992
993 Arg [1] : (optional) Int
994 A version number for the stable_id
995 Example : $gene->version(2);
996 Description: Getter/setter for version number
997 Returntype : Int
998 Exceptions : none
999 Caller : general
1000 Status : Stable
1001
1002 =cut
1003
1004 sub version {
1005 my $self = shift;
1006 $self->{'version'} = shift if(@_);
1007 return $self->{'version'};
1008 }
1009
1010
1011 =head2 stable_id
1012
1013 Arg [1] : (optional) String - the stable ID to set
1014 Example : $gene->stable_id("ENSG0000000001");
1015 Description: Getter/setter for stable id for this gene.
1016 Returntype : String
1017 Exceptions : none
1018 Caller : general
1019 Status : Stable
1020
1021 =cut
1022
1023 sub stable_id {
1024 my $self = shift;
1025 $self->{'stable_id'} = shift if(@_);
1026 return $self->{'stable_id'};
1027 }
1028
1029
1030 =head2 is_current
1031
1032 Arg [1] : Boolean $is_current
1033 Example : $gene->is_current(1)
1034 Description: Getter/setter for is_current state of this gene.
1035 Returntype : Int
1036 Exceptions : none
1037 Caller : general
1038 Status : Stable
1039
1040 =cut
1041
1042 sub is_current {
1043 my $self = shift;
1044 $self->{'is_current'} = shift if (@_);
1045 return $self->{'is_current'};
1046 }
1047
1048
1049 =head2 created_date
1050
1051 Arg [1] : (optional) String - created date to set (as a UNIX time int)
1052 Example : $gene->created_date('1141948800');
1053 Description: Getter/setter for attribute created_date
1054 Returntype : String
1055 Exceptions : none
1056 Caller : general
1057 Status : Stable
1058
1059 =cut
1060
1061 sub created_date {
1062 my $self = shift;
1063 $self->{'created_date'} = shift if ( @_ );
1064 return $self->{'created_date'};
1065 }
1066
1067
1068 =head2 modified_date
1069
1070 Arg [1] : (optional) String - modified date to set (as a UNIX time int)
1071 Example : $gene->modified_date('1141948800');
1072 Description: Getter/setter for attribute modified_date
1073 Returntype : String
1074 Exceptions : none
1075 Caller : general
1076 Status : Stable
1077
1078 =cut
1079
1080 sub modified_date {
1081 my $self = shift;
1082 $self->{'modified_date'} = shift if ( @_ );
1083 return $self->{'modified_date'};
1084 }
1085
1086
1087 =head2 transform
1088
1089 Arg [1] : String - coordinate system name to transform to
1090 Arg [2] : String - coordinate system version
1091 Example : my $new_gene = $gene->transform('supercontig');
1092 Description: Moves this gene to the given coordinate system. If this gene has
1093 Transcripts attached, they move as well.
1094 Returntype : Bio::EnsEMBL::Gene
1095 Exceptions : throw on wrong parameters
1096 Caller : general
1097 Status : Stable
1098
1099 =cut
1100
1101 sub transform {
1102 my $self = shift;
1103
1104 # catch for old style transform calls
1105 if( !@_ || ( ref $_[0] && ($_[0]->isa( "Bio::EnsEMBL::Slice" ) or $_[0]->isa( "Bio::EnsEMBL::LRGSlice" )) )) {
1106 deprecate('Calling transform without a coord system name is deprecated.');
1107 return $self->_deprecated_transform(@_);
1108 }
1109
1110 my $new_gene = $self->SUPER::transform(@_);
1111
1112 if ( !defined($new_gene) ) {
1113 # check if this gene projects at all to requested coord system,
1114 # if not we are done.
1115 my @segments = @{ $self->project(@_) };
1116 if ( !@segments ) {
1117 return undef;
1118 }
1119 }
1120
1121 #
1122 # If you are transforming the gene then make sure the transcripts and exons are loaded
1123 #
1124
1125 foreach my $tran (@{$self->get_all_Transcripts}){
1126 $tran->get_all_Exons();
1127 }
1128
1129 if( exists $self->{'_transcript_array'} ) {
1130 my @new_transcripts;
1131 my ( $strand, $slice );
1132 my $low_start = POSIX::INT_MAX;
1133 my $hi_end = POSIX::INT_MIN;
1134 for my $old_transcript ( @{$self->{'_transcript_array'}} ) {
1135 my $new_transcript = $old_transcript->transform( @_ );
1136 # this can fail if gene transform failed
1137
1138 return undef unless $new_transcript;
1139
1140 if( ! defined $new_gene ) {
1141 if( $new_transcript->start() < $low_start ) {
1142 $low_start = $new_transcript->start();
1143 }
1144 if( $new_transcript->end() > $hi_end ) {
1145 $hi_end = $new_transcript->end();
1146 }
1147 $slice = $new_transcript->slice();
1148 $strand = $new_transcript->strand();
1149 }
1150 push( @new_transcripts, $new_transcript );
1151 }
1152
1153 if( ! defined $new_gene ) {
1154 %$new_gene = %$self;
1155 bless $new_gene, ref( $self );
1156
1157 $new_gene->start( $low_start );
1158 $new_gene->end( $hi_end );
1159 $new_gene->strand( $strand );
1160 $new_gene->slice( $slice );
1161 }
1162
1163 $new_gene->{'_transcript_array'} = \@new_transcripts;
1164 }
1165 return $new_gene;
1166 }
1167
1168
1169 =head2 transfer
1170
1171 Arg [1] : Bio::EnsEMBL::Slice $destination_slice
1172 Example : my $new_gene = $gene->transfer($slice);
1173 Description: Moves this Gene to given target slice coordinates. If Transcripts
1174 are attached they are moved as well. Returns a new gene.
1175 Returntype : Bio::EnsEMBL::Gene
1176 Exceptions : none
1177 Caller : general
1178 Status : Stable
1179
1180 =cut
1181
1182 sub transfer {
1183 my $self = shift;
1184
1185 my $new_gene = $self->SUPER::transfer( @_ );
1186 return undef unless $new_gene;
1187
1188 if( exists $self->{'_transcript_array'} ) {
1189 my @new_transcripts;
1190 for my $old_transcript ( @{$self->{'_transcript_array'}} ) {
1191 my $new_transcript = $old_transcript->transfer( @_ );
1192 push( @new_transcripts, $new_transcript );
1193 }
1194 $new_gene->{'_transcript_array'} = \@new_transcripts;
1195 }
1196 return $new_gene;
1197 }
1198
1199
1200 =head2 display_xref
1201
1202 Arg [1] : (optional) Bio::EnsEMBL::DBEntry - the display xref to set
1203 Example : $gene->display_xref($db_entry);
1204 Description: Getter/setter display_xref for this gene.
1205 Returntype : Bio::EnsEMBL::DBEntry
1206 Exceptions : none
1207 Caller : general
1208 Status : Stable
1209
1210 =cut
1211
1212 sub display_xref {
1213 my $self = shift;
1214 $self->{'display_xref'} = shift if(@_);
1215 return $self->{'display_xref'};
1216 }
1217
1218
1219 =head2 display_id
1220
1221 Example : print $gene->display_id();
1222 Description: This method returns a string that is considered to be
1223 the 'display' identifier. For genes this is (depending on
1224 availability and in this order) the stable Id, the dbID or an
1225 empty string.
1226 Returntype : String
1227 Exceptions : none
1228 Caller : web drawing code
1229 Status : Stable
1230
1231 =cut
1232
1233 sub display_id {
1234 my $self = shift;
1235 return $self->{'stable_id'} || $self->dbID || '';
1236 }
1237
1238
1239 =head2 recalculate_coordinates
1240
1241 Example : $gene->recalculate_coordinates;
1242 Description: Called when transcript added to the gene, tries to adapt the
1243 coords for the gene.
1244 Returntype : none
1245 Exceptions : none
1246 Caller : internal
1247 Status : Stable
1248
1249 =cut
1250
1251 sub recalculate_coordinates {
1252 my $self = shift;
1253
1254 my $transcripts = $self->get_all_Transcripts();
1255
1256 return if(!$transcripts || !@$transcripts);
1257
1258 my ( $slice, $start, $end, $strand );
1259 $slice = $transcripts->[0]->slice();
1260 $strand = $transcripts->[0]->strand();
1261 $start = $transcripts->[0]->start();
1262 $end = $transcripts->[0]->end();
1263
1264 my $transsplicing = 0;
1265
1266 for my $t ( @$transcripts ) {
1267 if( $t->start() < $start ) {
1268 $start = $t->start();
1269 }
1270
1271 if( $t->end() > $end ) {
1272 $end = $t->end();
1273 }
1274
1275 if( $t->slice()->name() ne $slice->name() ) {
1276 throw( "Transcripts with different slices not allowed on one Gene" );
1277 }
1278
1279 if( $t->strand() != $strand ) {
1280 $transsplicing = 1;
1281 }
1282 }
1283 if( $transsplicing ) {
1284 warning( "Gene contained trans splicing event" );
1285 }
1286
1287 $self->start( $start );
1288 $self->end( $end );
1289 $self->strand( $strand );
1290 $self->slice( $slice );
1291 }
1292
1293
1294 =head2 get_all_DASFactories
1295
1296 Example : $dasref = $prot->get_all_DASFactories
1297 Description: Retrieves a listref of registered DAS objects
1298 TODO: Abstract to a DBLinkContainer obj
1299 Returntype : [ DAS_objects ]
1300 Exceptions : none
1301 Caller : general
1302 Status : Stable
1303
1304 =cut
1305
1306 sub get_all_DASFactories {
1307 my $self = shift;
1308 return [ $self->adaptor()->db()->_each_DASFeatureFactory ];
1309 }
1310
1311
1312 =head2 get_all_DAS_Features
1313
1314 Example : $features = $prot->get_all_DAS_Features;
1315 Description: Retreives a hash reference to a hash of DAS feature
1316 sets, keyed by the DNS, NOTE the values of this hash
1317 are an anonymous array containing:
1318 (1) a pointer to an array of features
1319 (2) a pointer to the DAS stylesheet
1320 Returntype : hashref of Bio::SeqFeatures
1321 Exceptions : none
1322 Caller : webcode
1323 Status : Stable
1324
1325 =cut
1326
1327 sub get_all_DAS_Features{
1328 my ($self, @args) = @_;
1329 my $slice = $self->feature_Slice;
1330 return $self->SUPER::get_all_DAS_Features($slice);
1331 }
1332
1333
1334
1335
1336 =head2 add_unconventional_transcript_association
1337
1338 Arg [1] : Bio::EnsEMBL::Transcript $trans
1339 The transcript to associate with the gene, in an unconventional manner.
1340 Arg [2] : String $type
1341 The type of association between this gene and this transcript, e.g.
1342 "antisense","sense_intronic","sense_overlaping_exonic","chimeric_sense_exonic"
1343 Example : my $transcript = Bio::EnsEMBL::Transcript->new(...);
1344 $gene->add_unconventional_transcript_association($transcript, "antisense");
1345 Description: Associate a transcript with this gene in a way that is
1346 non-conventional.
1347 Returntype : none
1348 Exceptions : none
1349 Caller : general
1350 Status : At Risk.
1351
1352 =cut
1353
1354 sub add_unconventional_transcript_association {
1355
1356 my ($self, $transcript, $type) = @_;
1357
1358 if( !ref $transcript || ! $transcript->isa("Bio::EnsEMBL::Transcript") ) {
1359 throw("$transcript is not a Bio::EnsEMBL::Transcript!");
1360 }
1361
1362 my $uta = Bio::EnsEMBL::UnconventionalTranscriptAssociation->new($transcript, $self, $type);
1363 $self->{'_unconventional_transcript_array'} ||= [];
1364 push(@{$self->{'_unconventional_transcript_array'}}, $uta);
1365
1366 }
1367
1368
1369 =head2 get_all_unconventional_transcript_associations
1370
1371 Arg [1] : (optional) String - Only get transcripts where the association
1372 between this gene and the transcripts is of a certain type.
1373 Example : my @transcripts = @{ $gene->get_all_unconventional_transcript_associations, "antisense" };
1374 Description: Returns the unconventional transcripts associated with this gene.
1375 Returntype : Listref of Bio::EnsEMBL::UnconventionalTranscriptAssociation objects
1376 Exceptions : none
1377 Caller : general
1378 Status : At risk.
1379
1380 =cut
1381
1382 sub get_all_unconventional_transcript_associations {
1383
1384 my ($self, $type) = @_;
1385
1386 if( ! exists $self->{'_unconventional_transcript_array'} ) {
1387 $self->{'_unconventional_transcript_array'} = [];
1388 if( defined $self->adaptor() ) {
1389 my $utaa = $self->adaptor()->db()->get_UnconventionalTranscriptAssociationAdaptor();
1390 my $utas = $utaa->fetch_all_by_gene( $self, $type );
1391 $self->{'_unconventional_transcript_array'} = $utas;
1392 }
1393 }
1394
1395 return $self->{'_unconventional_transcript_array'};
1396 }
1397
1398 =head2 remove_unconventional_transcript_associations
1399
1400 Args : None
1401 Example : $gene->remove_unconventional_transcript_associations();
1402 Description: Returns the unconventional transcripts associated with this gene.
1403 Returntype : Listref of Bio::EnsEMBL::UnconventionalTranscriptAssociation objects
1404 Exceptions : none
1405 Caller : general
1406 Status : At risk.
1407
1408 =cut
1409
1410 sub remove_unconventional_transcript_associations {
1411
1412 my $self = shift;
1413
1414 $self->{'_unconventional_transcript_array'} = [];
1415
1416 }
1417
1418 =head2 load
1419
1420 Arg [1] : Boolean $load_xrefs
1421 Load (or don't load) xrefs. Default is to load xrefs.
1422 Example : $gene->load();
1423 Description : The Ensembl API makes extensive use of
1424 lazy-loading. Under some circumstances (e.g.,
1425 when copying genes between databases), all data of
1426 an object needs to be fully loaded. This method
1427 loads the parts of the object that are usually
1428 lazy-loaded. It will also call the equivalent
1429 method on all the transcripts of the gene.
1430 Returns :
1431
1432 =cut
1433
1434 sub load {
1435 my ( $self, $load_xrefs ) = @_;
1436
1437 if ( !defined($load_xrefs) ) { $load_xrefs = 1 }
1438
1439 foreach my $transcript ( @{ $self->get_all_Transcripts() } ) {
1440 $transcript->load($load_xrefs);
1441 }
1442
1443 $self->analysis();
1444 $self->get_all_Attributes();
1445 $self->stable_id();
1446 $self->canonical_transcript();
1447
1448 if ($load_xrefs) {
1449 $self->get_all_DBEntries();
1450 }
1451 }
1452
1453 =head2 is_ref
1454
1455 Description: getter setter for the gene attribute is_ref
1456 Arg [1] : (optional) 1 or 0
1457 return : boolean
1458
1459 =cut
1460
1461 sub is_reference{
1462 my ( $self, $is_ref) = @_;
1463
1464 if(defined($is_ref)){
1465 $self->{'is_ref'} = $is_ref;
1466 }
1467 else{
1468 $self->{'is_ref'} = $self->adaptor->is_ref($self->dbID);
1469 }
1470 return $self->{'is_ref'};
1471 }
1472
1473 =head2 summary_as_hash
1474
1475 Example : $gene_summary = $gene->summary_as_hash();
1476 Description : Extends Feature::summary_as_hash
1477 Retrieves a summary of this Gene object.
1478
1479 Returns : hashref of arrays of descriptive strings
1480 Status : Intended for internal use
1481 =cut
1482
1483 sub summary_as_hash {
1484 my $self = shift;
1485 my $summary_ref = $self->SUPER::summary_as_hash;
1486 $summary_ref->{'description'} = $self->description;
1487 $summary_ref->{'biotype'} = $self->biotype;
1488 $summary_ref->{'external_name'} = $self->external_name;
1489 return $summary_ref;
1490 }
1491
1492
1493 ###########################
1494 # DEPRECATED METHODS FOLLOW
1495 ###########################
1496
1497 =head2 DEPRECATED add_DBLink
1498
1499 Description: DEPRECATED This method has been deprecated in favour of the
1500 add_DBEntry method. Objects are responible for holding only
1501 xrefs directly associated with themselves now.
1502
1503 =cut
1504
1505
1506 sub add_DBLink{
1507 my ($self,$value) = @_;
1508
1509 throw("add_DBLink is deprecated. You probably want add_DBEntry.");
1510
1511 # unless(defined $value && ref $value
1512 # && $value->isa('Bio::Annotation::DBLink') ) {
1513 # throw("This [$value] is not a DBLink");
1514 # }
1515
1516 # if( !defined $self->{'_db_link'} ) {
1517 # $self->{'_db_link'} = [];
1518 # }
1519
1520 # push(@{$self->{'_db_link'}},$value);
1521 }
1522
1523
1524 =head2 temporary_id
1525
1526 Function: DEPRECATED: Use dbID or stable_id or something else instead
1527
1528 =cut
1529
1530 sub temporary_id {
1531 my ($obj,$value) = @_;
1532 deprecate( "I cant see what a temporary_id is good for, please use " .
1533 "dbID or stableID or\n try without an id." );
1534 if( defined $value) {
1535 $obj->{'temporary_id'} = $value;
1536 }
1537 return $obj->{'temporary_id'};
1538 }
1539
1540
1541 =head2 chr_name
1542
1543 Description: DEPRECATED. Use project, tranform, or transfer to obtain this
1544 gene in another coord system. Use $gene->slice->seq_region_name
1545 to get the name of the underlying coord system. Or
1546 $gene->slice->name().
1547
1548 =cut
1549
1550 sub chr_name {
1551 my $self = shift;
1552
1553 deprecate( "Use project() to obtain other coordinate systems" );
1554
1555 my $gene_slice = $self->slice();
1556 if( $gene_slice->coord_system()->name eq "chromosome" ) {
1557 return $gene_slice->seq_region_name();
1558 }
1559
1560 my $coords = $self->project( "toplevel" );
1561
1562 if( @$coords ) {
1563 return $coords->[0]->[2]->seq_region_name();
1564 }
1565 }
1566
1567
1568 =head2 fetch_coded_for_regulatory_factors
1569
1570 Arg [1] : none
1571 Example : $gene->fetch_coded_for_regualtory_factors()
1572 Description: DEPRECATED: Fetches any regulatory_factors that are coded for by
1573 this gene.
1574 Returntype : Listref of Bio::Ensembl::RegulatoryFactor
1575 Exceptions :
1576 Caller : ?
1577 Status : At Risk
1578 : under development
1579
1580 =cut
1581
1582 sub fetch_coded_for_regulatory_factors {
1583
1584 my ($self) = @_;
1585
1586 my $rfa = $self->adaptor->db->get_RegulatoryFactorAdaptor();
1587
1588 return $rfa->fetch_factors_coded_for_by_gene($self);
1589
1590 }
1591
1592
1593 =head2 type
1594
1595 Description: DEPRECATED. Use biotype() instead.
1596
1597 =cut
1598
1599 sub type {
1600 deprecate("Use biotype() instead");
1601 biotype(@_);
1602 }
1603
1604
1605 =head2 confidence
1606
1607 Description: DEPRECATED. Use status() instead.
1608
1609 =cut
1610
1611 sub confidence {
1612 deprecate("Use status() instead");
1613 status(@_);
1614 }
1615
1616
1617 1;
1618