Mercurial > repos > mahtabm > ensembl
comparison variant_effect_predictor/Bio/EnsEMBL/Translation.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::Translation - A class representing the translation of a | |
| 24 transcript | |
| 25 | |
| 26 =head1 SYNOPSIS | |
| 27 | |
| 28 my $translation = Bio::EnsEMBL::Translation->new( | |
| 29 -START_EXON => $exon1, | |
| 30 -END_EXON => $exon2, | |
| 31 -SEQ_START => 98, | |
| 32 -SEQ_END => 39 | |
| 33 ); | |
| 34 | |
| 35 # stable ID setter | |
| 36 $translation->stable_id('ENSP00053458'); | |
| 37 | |
| 38 # get start and end position in start/end exons | |
| 39 my $start = $translation->start; | |
| 40 my $end = $translation->end; | |
| 41 | |
| 42 =head1 DESCRIPTION | |
| 43 | |
| 44 A Translation object defines the CDS and UTR regions of a Transcript | |
| 45 through the use of start_Exon/end_Exon, and start/end attributes. | |
| 46 | |
| 47 =cut | |
| 48 | |
| 49 | |
| 50 package Bio::EnsEMBL::Translation; | |
| 51 | |
| 52 use vars qw($AUTOLOAD @ISA); | |
| 53 use strict; | |
| 54 | |
| 55 use Scalar::Util qw(weaken isweak); | |
| 56 | |
| 57 use Bio::EnsEMBL::Utils::Exception qw( deprecate throw warning ); | |
| 58 use Bio::EnsEMBL::Utils::Argument qw( rearrange ); | |
| 59 use Bio::EnsEMBL::Utils::Scalar qw( assert_ref ); | |
| 60 | |
| 61 use Bio::EnsEMBL::Storable; | |
| 62 | |
| 63 @ISA = qw(Bio::EnsEMBL::Storable); | |
| 64 | |
| 65 | |
| 66 =head2 new | |
| 67 | |
| 68 Arg [-START_EXON] : The Exon object in which the translation (CDS) starts | |
| 69 Arg [-END_EXON] : The Exon object in which the translation (CDS) ends | |
| 70 Arg [-SEQ_START] : The offset in the start_Exon indicating the start | |
| 71 position of the CDS. | |
| 72 Arg [-SEQ_END] : The offset in the end_Exon indicating the end | |
| 73 position of the CDS. | |
| 74 Arg [-STABLE_ID] : The stable identifier for this Translation | |
| 75 Arg [-VERSION] : The version of the stable identifier | |
| 76 Arg [-DBID] : The internal identifier of this Translation | |
| 77 Arg [-ADAPTOR] : The TranslationAdaptor for this Translation | |
| 78 Arg [-SEQ] : Manually sets the peptide sequence of this translation. | |
| 79 May be useful if this translation is not stored in | |
| 80 a database. | |
| 81 Arg [-CREATED_DATE]: the date the translation was created | |
| 82 Arg [-MODIFIED_DATE]: the date the translation was modified | |
| 83 Example : my $tl = Bio::EnsEMBL::Translation->new | |
| 84 (-START_EXON => $ex1, | |
| 85 -END_EXON => $ex2, | |
| 86 -SEQ_START => 98, | |
| 87 -SEQ_END => 39); | |
| 88 Description: Constructor. Creates a new Translation object | |
| 89 Returntype : Bio::EnsEMBL::Translation | |
| 90 Exceptions : none | |
| 91 Caller : general | |
| 92 Status : Stable | |
| 93 | |
| 94 =cut | |
| 95 | |
| 96 sub new { | |
| 97 my $caller = shift; | |
| 98 | |
| 99 my $class = ref($caller) || $caller; | |
| 100 | |
| 101 my ( $start_exon, $end_exon, $seq_start, $seq_end, | |
| 102 $stable_id, $version, $dbID, $adaptor, $seq, | |
| 103 $created_date, $modified_date ) = | |
| 104 rearrange( [ "START_EXON", "END_EXON", "SEQ_START", "SEQ_END", | |
| 105 "STABLE_ID", "VERSION", "DBID", "ADAPTOR", | |
| 106 "SEQ", "CREATED_DATE", "MODIFIED_DATE" ], @_ ); | |
| 107 | |
| 108 my $self = bless { | |
| 109 'start_exon' => $start_exon, | |
| 110 'end_exon' => $end_exon, | |
| 111 'dbID' => $dbID, | |
| 112 'start' => $seq_start, | |
| 113 'end' => $seq_end, | |
| 114 'stable_id' => $stable_id, | |
| 115 'version' => $version, | |
| 116 'created_date' => $created_date, | |
| 117 'modified_date' => $modified_date, | |
| 118 'seq' => $seq | |
| 119 }, $class; | |
| 120 | |
| 121 $self->adaptor($adaptor); | |
| 122 | |
| 123 return $self; | |
| 124 } | |
| 125 | |
| 126 =head2 new_fast | |
| 127 | |
| 128 Arg [1] : hashref to be blessed | |
| 129 Description: Construct a new Bio::EnsEMBL::Translation using the hashref. | |
| 130 Exceptions : none | |
| 131 Returntype : Bio::EnsEMBL::Translation | |
| 132 Caller : general, subclass constructors | |
| 133 Status : Stable | |
| 134 | |
| 135 =cut | |
| 136 | |
| 137 | |
| 138 sub new_fast { | |
| 139 my $class = shift; | |
| 140 my $hashref = shift; | |
| 141 my $self = bless $hashref, $class; | |
| 142 weaken($self->{adaptor}) if ( ! isweak($self->{adaptor}) ); | |
| 143 return $self; | |
| 144 } | |
| 145 | |
| 146 =head2 transcript | |
| 147 | |
| 148 Arg [1] : Transcript object (optional) | |
| 149 Description : Sets or retrieves the transcript object associated | |
| 150 with this translation object. | |
| 151 Exceptions : Throws if there is no adaptor or no dbID defined for | |
| 152 the translation object. | |
| 153 Returntype : Bio::EnsEMBL::Transcript | |
| 154 =cut | |
| 155 | |
| 156 sub transcript { | |
| 157 my ( $self, $transcript ) = @_; | |
| 158 | |
| 159 if ( defined($transcript) ) { | |
| 160 assert_ref( $transcript, 'Bio::EnsEMBL::Transcript' ); | |
| 161 | |
| 162 $self->{'transcript'} = $transcript; | |
| 163 | |
| 164 weaken( $self->{'transcript'} ); # Avoid circular references. | |
| 165 | |
| 166 } elsif ( @_ > 1 ) { | |
| 167 # Break connection to transcript. | |
| 168 delete( $self->{'transcript'} ); | |
| 169 } elsif ( !defined( $self->{'transcript'} ) ) { | |
| 170 my $adaptor = $self->adaptor; | |
| 171 if ( !defined($adaptor) ) { | |
| 172 throw( "Adaptor is not set for translation, " | |
| 173 . "can not fetch its transcript." ); | |
| 174 } | |
| 175 | |
| 176 my $dbID = $self->{'dbID'}; | |
| 177 if ( !defined($dbID) ) { | |
| 178 throw( "dbID is not set for translation, " | |
| 179 . " can not fetch its transcript." ); | |
| 180 } | |
| 181 | |
| 182 $self->{'transcript'} = | |
| 183 $adaptor->db()->get_TranscriptAdaptor() | |
| 184 ->fetch_by_translation_id($dbID); | |
| 185 | |
| 186 # Do not weaken the reference if we had to get the transcript from the | |
| 187 # database. The user is probably working on translations directly, | |
| 188 # not going through transcripts. | |
| 189 #weaken( $self->{'transcript'} ); # Avoid circular references. | |
| 190 } | |
| 191 | |
| 192 return $self->{'transcript'}; | |
| 193 } ## end sub transcript | |
| 194 | |
| 195 | |
| 196 =head2 start | |
| 197 | |
| 198 Arg [1] : (optional) int $start - start position to set | |
| 199 Example : $translation->start(17); | |
| 200 Description: Getter/setter for the value of start, which is a position within | |
| 201 the exon given by start_Exon. | |
| 202 | |
| 203 If you need genomic coordinates, use the genomic_start() | |
| 204 method. | |
| 205 Returntype : int | |
| 206 Exceptions : none | |
| 207 Caller : general | |
| 208 Status : Stable | |
| 209 | |
| 210 =cut | |
| 211 | |
| 212 sub start{ | |
| 213 my $obj = shift; | |
| 214 if( @_ ) { | |
| 215 my $value = shift; | |
| 216 | |
| 217 $obj->{'start'} = $value; | |
| 218 } | |
| 219 return $obj->{'start'}; | |
| 220 | |
| 221 } | |
| 222 | |
| 223 | |
| 224 =head2 end | |
| 225 | |
| 226 Arg [1] : (optional) int $end - end position to set | |
| 227 Example : $translation->end(8); | |
| 228 Description: Getter/setter for the value of end, which is a position within | |
| 229 the exon given by end_Exon. | |
| 230 | |
| 231 If you need genomic coordinates, use the genomic_end() | |
| 232 method. | |
| 233 Returntype : int | |
| 234 Exceptions : none | |
| 235 Caller : general | |
| 236 Status : Stable | |
| 237 | |
| 238 =cut | |
| 239 | |
| 240 sub end { | |
| 241 my $self = shift; | |
| 242 if( @_ ) { | |
| 243 my $value = shift; | |
| 244 | |
| 245 $self->{'end'} = $value; | |
| 246 } | |
| 247 return $self->{'end'}; | |
| 248 | |
| 249 } | |
| 250 | |
| 251 | |
| 252 =head2 start_Exon | |
| 253 | |
| 254 Arg [1] : (optional) Bio::EnsEMBL::Exon - start exon to assign | |
| 255 Example : $translation->start_Exon($exon1); | |
| 256 Description: Getter/setter for the value of start_Exon, which denotes the | |
| 257 exon at which translation starts (and within this exon, at the | |
| 258 position indicated by start, see above). | |
| 259 Returntype : Bio::EnsEMBL::Exon | |
| 260 Exceptions : thrown on wrong argument type | |
| 261 Caller : general | |
| 262 Status : Stable | |
| 263 | |
| 264 =cut | |
| 265 | |
| 266 sub start_Exon { | |
| 267 my $self = shift; | |
| 268 | |
| 269 if( @_ ) { | |
| 270 my $value = shift; | |
| 271 if( !ref $value || !$value->isa('Bio::EnsEMBL::Exon') ) { | |
| 272 throw("Got to have an Exon object, not a $value"); | |
| 273 } | |
| 274 $self->{'start_exon'} = $value; | |
| 275 } | |
| 276 return $self->{'start_exon'}; | |
| 277 } | |
| 278 | |
| 279 | |
| 280 =head2 end_Exon | |
| 281 | |
| 282 Arg [1] : (optional) Bio::EnsEMBL::Exon - start exon to assign | |
| 283 Example : $translation->start_Exon($exon1); | |
| 284 Description: Getter/setter for the value of end_Exon, which denotes the | |
| 285 exon at which translation ends (and within this exon, at the | |
| 286 position indicated by end, see above). | |
| 287 Returntype : Bio::EnsEMBL::Exon | |
| 288 Exceptions : thrown on wrong argument type | |
| 289 Caller : general | |
| 290 Status : Stable | |
| 291 | |
| 292 =cut | |
| 293 | |
| 294 sub end_Exon { | |
| 295 my $self = shift; | |
| 296 if( @_ ) { | |
| 297 my $value = shift; | |
| 298 if( !ref $value || !$value->isa('Bio::EnsEMBL::Exon') ) { | |
| 299 throw("Got to have an Exon object, not a $value"); | |
| 300 } | |
| 301 $self->{'end_exon'} = $value; | |
| 302 } | |
| 303 | |
| 304 return $self->{'end_exon'}; | |
| 305 } | |
| 306 | |
| 307 =head2 cdna_start | |
| 308 | |
| 309 Arg [1] : (optional) Bio::EnsEMBL::Transcript $transcript | |
| 310 The transcript which this is a translation of. | |
| 311 Example : $translation_cdna_start = $translation->cdna_start(); | |
| 312 Description : Returns the start position of the translation in cDNA | |
| 313 coordinates. | |
| 314 If no transcript is given, the method will use | |
| 315 TranscriptAdaptor->fetch_by_translation_id() to locate | |
| 316 the correct transcript. | |
| 317 Return type : Integer | |
| 318 Exceptions : Throws if the given (optional) argument is not a | |
| 319 transcript. | |
| 320 Caller : General | |
| 321 Status : At Risk (Under Development) | |
| 322 | |
| 323 =cut | |
| 324 | |
| 325 sub cdna_start { | |
| 326 my ( $self, $transcript ) = @_; | |
| 327 | |
| 328 if ( defined($transcript) | |
| 329 && ( !ref($transcript) | |
| 330 || !$transcript->isa('Bio::EnsEMBL::Transcript') ) ) | |
| 331 { | |
| 332 throw("Argument is not a transcript"); | |
| 333 } | |
| 334 | |
| 335 if ( !exists( $self->{'cdna_start'} ) ) { | |
| 336 if ( !defined($transcript) ) { | |
| 337 # We were not given a transcript, get the transcript out of | |
| 338 # the database. | |
| 339 $transcript = $self->transcript(); | |
| 340 } | |
| 341 | |
| 342 $self->{'cdna_start'} = | |
| 343 $self->start_Exon()->cdna_coding_start($transcript); | |
| 344 } | |
| 345 | |
| 346 return $self->{'cdna_start'}; | |
| 347 } | |
| 348 | |
| 349 =head2 cdna_end | |
| 350 | |
| 351 Arg [1] : (optional) Bio::EnsEMBL::Transcript $transcript | |
| 352 The transcript which this is a translation of. | |
| 353 Example : $translation_cdna_end = $translation->cdna_end(); | |
| 354 Description : Returns the end position of the translation in cDNA | |
| 355 coordinates. | |
| 356 If no transcript is given, the method will use | |
| 357 TranscriptAdaptor->fetch_by_translation_id() to locate | |
| 358 the correct transcript. | |
| 359 Return type : Integer | |
| 360 Exceptions : Throws if the given (optional) argument is not a | |
| 361 transcript. | |
| 362 Caller : General | |
| 363 Status : At Risk (Under Development) | |
| 364 | |
| 365 =cut | |
| 366 | |
| 367 sub cdna_end { | |
| 368 my ( $self, $transcript ) = @_; | |
| 369 | |
| 370 if ( defined($transcript) | |
| 371 && ( !ref($transcript) | |
| 372 || !$transcript->isa('Bio::EnsEMBL::Transcript') ) ) | |
| 373 { | |
| 374 throw("Argument is not a transcript"); | |
| 375 } | |
| 376 | |
| 377 if ( !exists( $self->{'cdna_end'} ) ) { | |
| 378 if ( !defined($transcript) ) { | |
| 379 # We were not given a transcript, get the transcript out of | |
| 380 # the database. | |
| 381 $transcript = $self->transcript(); | |
| 382 } | |
| 383 | |
| 384 $self->{'cdna_end'} = | |
| 385 $self->end_Exon()->cdna_coding_end($transcript); | |
| 386 } | |
| 387 | |
| 388 return $self->{'cdna_end'}; | |
| 389 } | |
| 390 | |
| 391 =head2 genomic_start | |
| 392 | |
| 393 Args : None | |
| 394 Example : $translation_genomic_start = | |
| 395 $translation->genomic_start(); | |
| 396 Description : Returns the start position of the translation in | |
| 397 genomic coordinates on the forward strand. | |
| 398 Return type : Integer | |
| 399 Exceptions : None | |
| 400 Caller : General | |
| 401 Status : At Risk (Under Development) | |
| 402 | |
| 403 =cut | |
| 404 | |
| 405 sub genomic_start { | |
| 406 my $self = shift; | |
| 407 | |
| 408 if ( !exists $self->{'genomic_start'} ) { | |
| 409 if ( $self->start_Exon()->strand() >= 0 ) { | |
| 410 $self->{'genomic_start'} = | |
| 411 $self->start_Exon()->start() + ( $self->start() - 1 ); | |
| 412 } else { | |
| 413 $self->{'genomic_start'} = | |
| 414 $self->end_Exon()->end() - ( $self->end() - 1 ); | |
| 415 } | |
| 416 } | |
| 417 | |
| 418 return $self->{'genomic_start'}; | |
| 419 } | |
| 420 | |
| 421 =head2 genomic_end | |
| 422 | |
| 423 Args : None | |
| 424 Example : $translation_genomic_end = $translation->genomic_end(); | |
| 425 Description : Returns the end position of the translation in genomic | |
| 426 coordinates on the forward strand. | |
| 427 Return type : Integer | |
| 428 Exceptions : None | |
| 429 Caller : General | |
| 430 Status : At Risk (Under Development) | |
| 431 | |
| 432 =cut | |
| 433 | |
| 434 sub genomic_end { | |
| 435 my $self = shift; | |
| 436 | |
| 437 if ( !exists $self->{'genomic_end'} ) { | |
| 438 if ( $self->end_Exon()->strand() >= 0 ) { | |
| 439 $self->{'genomic_end'} = | |
| 440 $self->end_Exon()->start() + ( $self->end() - 1 ); | |
| 441 } else { | |
| 442 $self->{'genomic_end'} = | |
| 443 $self->start_Exon()->end() - ( $self->start() - 1 ); | |
| 444 } | |
| 445 } | |
| 446 | |
| 447 return $self->{'genomic_end'}; | |
| 448 } | |
| 449 | |
| 450 =head2 version | |
| 451 | |
| 452 Arg [1] : (optional) string $version - version to set | |
| 453 Example : $translation->version(2); | |
| 454 Description: Getter/setter for attribute version | |
| 455 Returntype : string | |
| 456 Exceptions : none | |
| 457 Caller : general | |
| 458 Status : Stable | |
| 459 | |
| 460 =cut | |
| 461 | |
| 462 sub version { | |
| 463 my $self = shift; | |
| 464 $self->{'version'} = shift if( @_ ); | |
| 465 return $self->{'version'}; | |
| 466 } | |
| 467 | |
| 468 | |
| 469 =head2 stable_id | |
| 470 | |
| 471 Arg [1] : (optional) string $stable_id - stable ID to set | |
| 472 Example : $translation->stable_id('ENSP0059890'); | |
| 473 Description: Getter/setter for attribute stable_id | |
| 474 Returntype : string | |
| 475 Exceptions : none | |
| 476 Caller : general | |
| 477 Status : Stable | |
| 478 | |
| 479 =cut | |
| 480 | |
| 481 sub stable_id { | |
| 482 my $self = shift; | |
| 483 $self->{'stable_id'} = shift if( @_ ); | |
| 484 return $self->{'stable_id'}; | |
| 485 } | |
| 486 | |
| 487 =head2 created_date | |
| 488 | |
| 489 Arg [1] : (optional) string $created_date - created date to set | |
| 490 Example : $translation->created_date('2007-01-10 20:52:00'); | |
| 491 Description: Getter/setter for attribute created date | |
| 492 Returntype : string | |
| 493 Exceptions : none | |
| 494 Caller : general | |
| 495 Status : Stable | |
| 496 | |
| 497 =cut | |
| 498 | |
| 499 sub created_date { | |
| 500 my $self = shift; | |
| 501 $self->{'created_date'} = shift if ( @_ ); | |
| 502 return $self->{'created_date'}; | |
| 503 } | |
| 504 | |
| 505 | |
| 506 =head2 modified_date | |
| 507 | |
| 508 Arg [1] : (optional) string $modified_date - modification date to set | |
| 509 Example : $translation->modified_date('2007-01-10 20:52:00'); | |
| 510 Description: Getter/setter for attribute modified date | |
| 511 Returntype : string | |
| 512 Exceptions : none | |
| 513 Caller : general | |
| 514 Status : Stable | |
| 515 | |
| 516 =cut | |
| 517 | |
| 518 sub modified_date { | |
| 519 my $self = shift; | |
| 520 $self->{'modified_date'} = shift if ( @_ ); | |
| 521 return $self->{'modified_date'}; | |
| 522 } | |
| 523 | |
| 524 | |
| 525 | |
| 526 =head2 transform | |
| 527 | |
| 528 Arg [1] : hashref $old_new_exon_map | |
| 529 a hash that maps old to new exons for a whole gene | |
| 530 Description: maps start end end exon according to mapping table. | |
| 531 If an exon is not mapped, just keep the old one. | |
| 532 Returntype : none | |
| 533 Exceptions : none | |
| 534 Caller : Transcript->transform() | |
| 535 Status : Stable | |
| 536 | |
| 537 =cut | |
| 538 | |
| 539 sub transform { | |
| 540 my $self = shift; | |
| 541 my $href_exons = shift; | |
| 542 | |
| 543 my $start_exon = $self->start_Exon(); | |
| 544 my $end_exon = $self->end_Exon(); | |
| 545 | |
| 546 if ( exists $href_exons->{$start_exon} ) { | |
| 547 $self->start_Exon($href_exons->{$start_exon}); | |
| 548 } else { | |
| 549 # do nothing, the start exon wasnt mapped | |
| 550 } | |
| 551 | |
| 552 if ( exists $href_exons->{$end_exon} ) { | |
| 553 $self->end_Exon($href_exons->{$end_exon}); | |
| 554 } else { | |
| 555 # do nothing, the end exon wasnt mapped | |
| 556 } | |
| 557 } | |
| 558 | |
| 559 | |
| 560 =head2 get_all_DBEntries | |
| 561 | |
| 562 Arg [1] : (optional) String, external database name | |
| 563 | |
| 564 Arg [2] : (optional) String, external_db type | |
| 565 | |
| 566 Example : @dbentries = @{ $translation->get_all_DBEntries() }; | |
| 567 | |
| 568 Description: Retrieves DBEntries (xrefs) for this translation. | |
| 569 | |
| 570 This method will attempt to lazy-load DBEntries | |
| 571 from a database if an adaptor is available and no | |
| 572 DBEntries are present on the translation (i.e. they | |
| 573 have not already been added or loaded). | |
| 574 | |
| 575 Returntype : Listref to Bio::EnsEMBL::DBEntry objects | |
| 576 Exceptions : none | |
| 577 Caller : TranslationAdaptor::store | |
| 578 Status : Stable | |
| 579 | |
| 580 =cut | |
| 581 | |
| 582 sub get_all_DBEntries { | |
| 583 my ( $self, $ex_db_exp, $ex_db_type ) = @_; | |
| 584 | |
| 585 my $cache_name = 'dbentries'; | |
| 586 | |
| 587 if ( defined($ex_db_exp) ) { | |
| 588 $cache_name .= $ex_db_exp; | |
| 589 } | |
| 590 | |
| 591 if ( defined($ex_db_type) ) { | |
| 592 $cache_name .= $ex_db_type; | |
| 593 } | |
| 594 | |
| 595 # if not cached, retrieve all of the xrefs for this translation | |
| 596 if ( !defined( $self->{$cache_name} ) && defined( $self->adaptor() ) ) | |
| 597 { | |
| 598 $self->{$cache_name} = | |
| 599 $self->adaptor()->db()->get_DBEntryAdaptor() | |
| 600 ->fetch_all_by_Translation( $self, $ex_db_exp, $ex_db_type ); | |
| 601 } | |
| 602 | |
| 603 $self->{$cache_name} ||= []; | |
| 604 | |
| 605 return $self->{$cache_name}; | |
| 606 } ## end sub get_all_DBEntries | |
| 607 | |
| 608 =head2 get_all_object_xrefs | |
| 609 | |
| 610 Arg [1] : (optional) String, external database name | |
| 611 | |
| 612 Arg [2] : (optional) String, external_db type | |
| 613 | |
| 614 Example : @oxrefs = @{ $translation->get_all_object_xrefs() }; | |
| 615 | |
| 616 Description: Retrieves xrefs for this translation. | |
| 617 | |
| 618 This method will attempt to lazy-load xrefs from a | |
| 619 database if an adaptor is available and no xrefs | |
| 620 are present on the translation (i.e. they have not | |
| 621 already been added or loaded). | |
| 622 | |
| 623 NB: This method is an alias for the | |
| 624 get_all_DBentries() method. | |
| 625 | |
| 626 Return type: Listref of Bio::EnsEMBL::DBEntry objects | |
| 627 | |
| 628 Status : Stable | |
| 629 | |
| 630 =cut | |
| 631 | |
| 632 sub get_all_object_xrefs { | |
| 633 my $self = shift; | |
| 634 return $self->get_all_DBEntries(@_); | |
| 635 } | |
| 636 | |
| 637 =head2 add_DBEntry | |
| 638 | |
| 639 Arg [1] : Bio::EnsEMBL::DBEntry $dbe | |
| 640 The dbEntry to be added | |
| 641 Example : $translation->add_DBEntry($xref); | |
| 642 Description: Associates a DBEntry with this translation. Note that adding | |
| 643 DBEntries will prevent future lazy-loading of DBEntries for this | |
| 644 translation (see get_all_DBEntries). | |
| 645 Returntype : none | |
| 646 Exceptions : thrown on incorrect argument type | |
| 647 Caller : general | |
| 648 Status : Stable | |
| 649 | |
| 650 =cut | |
| 651 | |
| 652 sub add_DBEntry { | |
| 653 my $self = shift; | |
| 654 my $dbe = shift; | |
| 655 | |
| 656 unless($dbe && ref($dbe) && $dbe->isa('Bio::EnsEMBL::DBEntry')) { | |
| 657 throw('Expected DBEntry argument'); | |
| 658 } | |
| 659 | |
| 660 $self->{'dbentries'} ||= []; | |
| 661 push @{$self->{'dbentries'}}, $dbe; | |
| 662 } | |
| 663 | |
| 664 | |
| 665 =head2 get_all_DBLinks | |
| 666 | |
| 667 Arg [1] : String database name (optional) | |
| 668 SQL wildcard characters (_ and %) can be used to | |
| 669 specify patterns. | |
| 670 | |
| 671 Example : my @dblinks = @{ $translation->get_all_DBLinks() }; | |
| 672 my @dblinks = @{ $translation->get_all_DBLinks('Uniprot%') }; | |
| 673 | |
| 674 Description: This is here for consistancy with the Transcript | |
| 675 and Gene classes. It is a synonym for the | |
| 676 get_all_DBEntries() method. | |
| 677 | |
| 678 Return type: Listref to Bio::EnsEMBL::DBEntry objects | |
| 679 Exceptions : none | |
| 680 Caller : general | |
| 681 Status : Stable | |
| 682 | |
| 683 =cut | |
| 684 | |
| 685 sub get_all_DBLinks { | |
| 686 my $self = shift; | |
| 687 return $self->get_all_DBEntries(@_); | |
| 688 } | |
| 689 | |
| 690 =head2 get_all_xrefs | |
| 691 | |
| 692 Arg [1] : String database name (optional) | |
| 693 SQL wildcard characters (_ and %) can be used to | |
| 694 specify patterns. | |
| 695 | |
| 696 Example : @xrefs = @{ $translation->get_all_xrefs() }; | |
| 697 @xrefs = @{ $translation->get_all_xrefs('Uniprot%') }; | |
| 698 | |
| 699 Description: This method is here for consistancy with the Gene | |
| 700 and Transcript classes. It is an alias for the | |
| 701 get_all_DBLinks() method, which in turn directly | |
| 702 calls get_all_DBEntries(). | |
| 703 | |
| 704 Return type: Listref of Bio::EnsEMBL::DBEntry objects | |
| 705 | |
| 706 Status : Stable | |
| 707 | |
| 708 =cut | |
| 709 | |
| 710 sub get_all_xrefs { | |
| 711 my $self = shift; | |
| 712 return $self->get_all_DBLinks(@_); | |
| 713 } | |
| 714 | |
| 715 =head2 get_all_ProteinFeatures | |
| 716 | |
| 717 Arg [1] : (optional) string $logic_name | |
| 718 The analysis logic_name of the features to retrieve. If not | |
| 719 specified, all features are retrieved instead. | |
| 720 Example : $features = $self->get_all_ProteinFeatures('PFam'); | |
| 721 Description: Retrieves all ProteinFeatures associated with this | |
| 722 Translation. If a logic_name is specified, only features with | |
| 723 that logic_name are returned. If no logic_name is provided all | |
| 724 associated protein_features are returned. | |
| 725 | |
| 726 ProteinFeatures are lazy-loaded from the database unless they | |
| 727 added manually to the Translation or had already been loaded. | |
| 728 Returntype : Bio::EnsEMBL::ProteinFeature | |
| 729 Exceptions : none | |
| 730 Caller : general | |
| 731 Status : Stable | |
| 732 | |
| 733 =cut | |
| 734 | |
| 735 sub get_all_ProteinFeatures { | |
| 736 my $self = shift; | |
| 737 my $logic_name = shift; | |
| 738 | |
| 739 if(!$self->{'protein_features'}) { | |
| 740 my $adaptor = $self->adaptor(); | |
| 741 my $dbID = $self->dbID(); | |
| 742 | |
| 743 return [] if (!$adaptor || !$dbID); | |
| 744 | |
| 745 my %hash; | |
| 746 $self->{'protein_features'} = \%hash; | |
| 747 | |
| 748 my $pfa = $adaptor->db()->get_ProteinFeatureAdaptor(); | |
| 749 my $name; | |
| 750 foreach my $f (@{$pfa->fetch_all_by_translation_id($dbID)}) { | |
| 751 my $analysis = $f->analysis(); | |
| 752 if($analysis) { | |
| 753 $name = lc($f->analysis->logic_name()); | |
| 754 } else { | |
| 755 warning("ProteinFeature has no attached analysis\n"); | |
| 756 $name = ''; | |
| 757 } | |
| 758 $hash{$name} ||= []; | |
| 759 push @{$hash{$name}}, $f; | |
| 760 } | |
| 761 } | |
| 762 | |
| 763 # a specific type of protein feature was requested | |
| 764 if(defined($logic_name)) { | |
| 765 $logic_name = lc($logic_name); | |
| 766 return $self->{'protein_features'}->{$logic_name} || []; | |
| 767 } | |
| 768 | |
| 769 my @features = (); | |
| 770 | |
| 771 # all protein features were requested | |
| 772 foreach my $type (keys %{$self->{'protein_features'}}) { | |
| 773 push @features, @{$self->{'protein_features'}->{$type}}; | |
| 774 } | |
| 775 | |
| 776 return \@features; | |
| 777 } | |
| 778 | |
| 779 | |
| 780 =head2 get_all_DomainFeatures | |
| 781 | |
| 782 Example : @domain_feats = @{$translation->get_all_DomainFeatures}; | |
| 783 Description: A convenience method which retrieves all protein features | |
| 784 that are considered to be 'Domain' features. Features which | |
| 785 are 'domain' features are those with analysis logic names: | |
| 786 'pfscan', 'scanprosite', 'superfamily', 'pfam', 'prints', | |
| 787 'smart', 'pirsf', 'tigrfam'. | |
| 788 Returntype : listref of Bio::EnsEMBL::ProteinFeatures | |
| 789 Exceptions : none | |
| 790 Caller : webcode (protview) | |
| 791 Status : Stable | |
| 792 | |
| 793 =cut | |
| 794 | |
| 795 sub get_all_DomainFeatures{ | |
| 796 my ($self) = @_; | |
| 797 | |
| 798 my @features; | |
| 799 | |
| 800 my @types = ('pfscan', #profile (prosite or pfam motifs) | |
| 801 'scanprosite', #prosite | |
| 802 'superfamily', | |
| 803 'pfam', | |
| 804 'smart', | |
| 805 'tigrfam', | |
| 806 'pirsf', | |
| 807 'prints'); | |
| 808 | |
| 809 foreach my $type (@types) { | |
| 810 push @features, @{$self->get_all_ProteinFeatures($type)}; | |
| 811 } | |
| 812 | |
| 813 return \@features; | |
| 814 } | |
| 815 | |
| 816 | |
| 817 =head2 add_ProteinFeature | |
| 818 | |
| 819 Arg [1] : Bio::EnsEMBL::ProteinFeature $pf | |
| 820 The ProteinFeature to be added | |
| 821 Example : $translation->add_ProteinFeature($pf); | |
| 822 Description: Associates a ProteinFeature with this translation. Note that | |
| 823 adding ProteinFeatures will prevent future lazy-loading of | |
| 824 ProteinFeatures for this translation (see | |
| 825 get_all_ProteinFeatures). | |
| 826 Returntype : none | |
| 827 Exceptions : thrown on incorrect argument type | |
| 828 Caller : general | |
| 829 Status : Stable | |
| 830 | |
| 831 =cut | |
| 832 | |
| 833 sub add_ProteinFeature { | |
| 834 my $self = shift; | |
| 835 my $pf = shift; | |
| 836 | |
| 837 unless ($pf && ref($pf) && $pf->isa('Bio::EnsEMBL::ProteinFeature')) { | |
| 838 throw('Expected ProteinFeature argument'); | |
| 839 } | |
| 840 | |
| 841 my $analysis = $pf->analysis; | |
| 842 throw("ProteinFeature has no attached Analysis.") unless $analysis; | |
| 843 | |
| 844 push @{ $self->{'protein_features'}->{$analysis->logic_name} }, $pf; | |
| 845 } | |
| 846 | |
| 847 | |
| 848 =head2 display_id | |
| 849 | |
| 850 Example : print $translation->display_id(); | |
| 851 Description: This method returns a string that is considered to be | |
| 852 the 'display' identifier. For translations this is (depending on | |
| 853 availability and in this order) the stable Id, the dbID or an | |
| 854 empty string. | |
| 855 Returntype : string | |
| 856 Exceptions : none | |
| 857 Caller : web drawing code | |
| 858 Status : Stable | |
| 859 | |
| 860 =cut | |
| 861 | |
| 862 sub display_id { | |
| 863 my $self = shift; | |
| 864 return $self->{'stable_id'} || $self->dbID || ''; | |
| 865 } | |
| 866 | |
| 867 | |
| 868 =head2 length | |
| 869 | |
| 870 Example : print "Peptide length =", $translation->length(); | |
| 871 Description: Retrieves the length of the peptide sequence (i.e. number of | |
| 872 amino acids) represented by this Translation object. | |
| 873 Returntype : int | |
| 874 Exceptions : none | |
| 875 Caller : webcode (protview etc.) | |
| 876 Status : Stable | |
| 877 | |
| 878 =cut | |
| 879 | |
| 880 sub length { | |
| 881 my $self = shift; | |
| 882 my $seq = $self->seq(); | |
| 883 | |
| 884 return ($seq) ? CORE::length($seq) : 0; | |
| 885 } | |
| 886 | |
| 887 | |
| 888 =head2 seq | |
| 889 | |
| 890 Example : print $translation->seq(); | |
| 891 Description: Retrieves a string representation of the peptide sequence | |
| 892 of this Translation. This retrieves the transcript from the | |
| 893 database and gets its sequence, or retrieves the sequence which | |
| 894 was set via the constructor. | |
| 895 Returntype : string | |
| 896 Exceptions : warning if the sequence is not set and cannot be retrieved from | |
| 897 the database. | |
| 898 Caller : webcode (protview etc.) | |
| 899 Status : Stable | |
| 900 | |
| 901 =cut | |
| 902 | |
| 903 sub seq { | |
| 904 my ( $self, $sequence ) = @_; | |
| 905 | |
| 906 if ( defined($sequence) ) { | |
| 907 | |
| 908 $self->{'seq'} = $sequence; | |
| 909 | |
| 910 } elsif ( !defined( $self->{'seq'} ) ) { | |
| 911 | |
| 912 my $transcript = $self->transcript(); | |
| 913 | |
| 914 my $canonical_translation = $transcript->translation(); | |
| 915 my $is_alternative; | |
| 916 if(!$canonical_translation) { | |
| 917 throw "Transcript does not have a canonical translation"; | |
| 918 } | |
| 919 if ( defined( $canonical_translation->stable_id() ) | |
| 920 && defined( $self->stable_id() ) ) | |
| 921 { | |
| 922 # Try stable ID. | |
| 923 $is_alternative = | |
| 924 ( $canonical_translation->stable_id() ne $self->stable_id() ); | |
| 925 } elsif ( defined( $canonical_translation->dbID() ) | |
| 926 && defined( $self->dbID() ) ) | |
| 927 { | |
| 928 # Try dbID. | |
| 929 $is_alternative = | |
| 930 ( $canonical_translation->dbID() != $self->dbID() ); | |
| 931 } else { | |
| 932 # Resort to using geomic start/end coordinates. | |
| 933 $is_alternative = ( ($canonical_translation->genomic_start() != | |
| 934 $self->genomic_start() ) | |
| 935 || ( $canonical_translation->genomic_end() != | |
| 936 $self->genomic_end() ) ); | |
| 937 } | |
| 938 | |
| 939 if ($is_alternative) { | |
| 940 # To deal with non-canonical (alternative) translations, subsitute | |
| 941 # the canonical translation in the transcript with $self for a | |
| 942 # while. | |
| 943 | |
| 944 $transcript->translation($self); | |
| 945 } | |
| 946 | |
| 947 my $seq = $transcript->translate(); | |
| 948 if ( defined($seq) ) { | |
| 949 $self->{'seq'} = $seq->seq(); | |
| 950 } | |
| 951 | |
| 952 if ($is_alternative) { | |
| 953 # Reinstate the real canonical translation. | |
| 954 | |
| 955 $transcript->translation($canonical_translation); | |
| 956 } | |
| 957 | |
| 958 } ## end elsif ( !defined( $self->...)) | |
| 959 | |
| 960 if ( !defined( $self->{'seq'} ) ) { | |
| 961 return ''; # Empty string | |
| 962 } | |
| 963 | |
| 964 return $self->{'seq'}; | |
| 965 | |
| 966 } ## end sub seq | |
| 967 | |
| 968 | |
| 969 =head2 get_all_Attributes | |
| 970 | |
| 971 Arg [1] : optional string $attrib_code | |
| 972 The code of the attribute type to retrieve values for. | |
| 973 Example : ($sc_attr) = @{$tl->get_all_Attributes('_selenocysteine')}; | |
| 974 @tl_attributes = @{$translation->get_all_Attributes()}; | |
| 975 Description: Gets a list of Attributes of this translation. | |
| 976 Optionally just get Attrubutes for given code. | |
| 977 Recognized attribute "_selenocysteine" | |
| 978 Returntype : listref Bio::EnsEMBL::Attribute | |
| 979 Exceptions : warning if translation does not have attached adaptor and | |
| 980 attempts lazy load. | |
| 981 Caller : general, modify_translation | |
| 982 Status : Stable | |
| 983 | |
| 984 =cut | |
| 985 | |
| 986 sub get_all_Attributes { | |
| 987 my $self = shift; | |
| 988 my $attrib_code = shift; | |
| 989 | |
| 990 if( ! exists $self->{'attributes' } ) { | |
| 991 if(!$self->adaptor() ) { | |
| 992 # warning('Cannot get attributes without an adaptor.'); | |
| 993 return []; | |
| 994 } | |
| 995 | |
| 996 my $aa = $self->adaptor->db->get_AttributeAdaptor(); | |
| 997 $self->{'attributes'} = $aa->fetch_all_by_Translation( $self ); | |
| 998 } | |
| 999 | |
| 1000 if( defined $attrib_code ) { | |
| 1001 my @results = grep { uc($_->code()) eq uc($attrib_code) } | |
| 1002 @{$self->{'attributes'}}; | |
| 1003 return \@results; | |
| 1004 } else { | |
| 1005 return $self->{'attributes'}; | |
| 1006 } | |
| 1007 } | |
| 1008 | |
| 1009 | |
| 1010 =head2 add_Attributes | |
| 1011 | |
| 1012 Arg [1..N] : Bio::EnsEMBL::Attribute $attribute | |
| 1013 Attributes to add. | |
| 1014 Example : $translation->add_Attributes($selenocysteine_attribute); | |
| 1015 Description: Adds an Attribute to the Translation. Usefull to | |
| 1016 do _selenocysteine. | |
| 1017 If you add an attribute before you retrieve any from database, | |
| 1018 lazy load will be disabled. | |
| 1019 Returntype : none | |
| 1020 Exceptions : throw on incorrect arguments | |
| 1021 Caller : general | |
| 1022 Status : Stable | |
| 1023 | |
| 1024 =cut | |
| 1025 | |
| 1026 sub add_Attributes { | |
| 1027 my $self = shift; | |
| 1028 my @attribs = @_; | |
| 1029 | |
| 1030 if( ! exists $self->{'attributes'} ) { | |
| 1031 $self->{'attributes'} = []; | |
| 1032 } | |
| 1033 | |
| 1034 for my $attrib ( @attribs ) { | |
| 1035 if( ! $attrib->isa( "Bio::EnsEMBL::Attribute" )) { | |
| 1036 throw( "Argument to add_Attribute must be a Bio::EnsEMBL::Attribute" ); | |
| 1037 } | |
| 1038 push( @{$self->{'attributes'}}, $attrib ); | |
| 1039 $self->{seq}=undef; | |
| 1040 } | |
| 1041 } | |
| 1042 | |
| 1043 | |
| 1044 =head2 get_all_SeqEdits | |
| 1045 | |
| 1046 Example : my @seqeds = @{$transcript->get_all_SeqEdits()}; | |
| 1047 Description: Retrieves all post transcriptional sequence modifications for | |
| 1048 this transcript. | |
| 1049 Returntype : Bio::EnsEMBL::SeqEdit | |
| 1050 Exceptions : none | |
| 1051 Caller : spliced_seq() | |
| 1052 Status : Stable | |
| 1053 | |
| 1054 =cut | |
| 1055 | |
| 1056 sub get_all_SeqEdits { | |
| 1057 my $self = shift; | |
| 1058 | |
| 1059 my @seqeds; | |
| 1060 | |
| 1061 my $attribs; | |
| 1062 | |
| 1063 my @edits = ('initial_met', '_selenocysteine', 'amino_acid_sub'); | |
| 1064 | |
| 1065 | |
| 1066 foreach my $edit(@edits){ | |
| 1067 $attribs = $self->get_all_Attributes($edit); | |
| 1068 | |
| 1069 # convert attributes to SeqEdit objects | |
| 1070 foreach my $a (@$attribs) { | |
| 1071 push @seqeds, Bio::EnsEMBL::SeqEdit->new(-ATTRIB => $a); | |
| 1072 } | |
| 1073 } | |
| 1074 return \@seqeds; | |
| 1075 } | |
| 1076 | |
| 1077 | |
| 1078 =head2 modify_translation | |
| 1079 | |
| 1080 Arg [1] : Bio::Seq $peptide | |
| 1081 Example : my $seq = Bio::Seq->new(-SEQ => $dna)->translate(); | |
| 1082 $translation->modify_translation($seq); | |
| 1083 Description: Applies sequence edits such as selenocysteines to the Bio::Seq | |
| 1084 peptide thats passed in | |
| 1085 Returntype : Bio::Seq | |
| 1086 Exceptions : none | |
| 1087 Caller : Bio::EnsEMBL::Transcript->translate | |
| 1088 Status : Stable | |
| 1089 | |
| 1090 =cut | |
| 1091 | |
| 1092 sub modify_translation { | |
| 1093 my ( $self, $seq ) = @_; | |
| 1094 | |
| 1095 my @seqeds = @{ $self->get_all_SeqEdits() }; | |
| 1096 | |
| 1097 # Sort in reverse order to avoid complication of adjusting | |
| 1098 # downstream edits. | |
| 1099 # HACK: The translation ENSP00000420939 somehow makes the next line | |
| 1100 # bomb out ($a or $b becomes undef) if the start() method | |
| 1101 # is used. I haven't been able to find out why. It has 10 | |
| 1102 # Selenocysteine seqedits that looks correct. | |
| 1103 # /Andreas (release 59) | |
| 1104 @seqeds = sort { $b->{'start'} <=> $a->{'start'} } @seqeds; | |
| 1105 | |
| 1106 # Apply all edits. | |
| 1107 my $peptide = $seq->seq(); | |
| 1108 foreach my $se (@seqeds) { | |
| 1109 $se->apply_edit( \$peptide ); | |
| 1110 } | |
| 1111 | |
| 1112 $seq->seq($peptide); | |
| 1113 | |
| 1114 return $seq; | |
| 1115 } | |
| 1116 | |
| 1117 =head2 load | |
| 1118 | |
| 1119 Arg [1] : Boolean $load_xrefs | |
| 1120 Load (or don't load) xrefs. Default is to load xrefs. | |
| 1121 Example : $translation->load(); | |
| 1122 Description : The Ensembl API makes extensive use of | |
| 1123 lazy-loading. Under some circumstances (e.g., | |
| 1124 when copying genes between databases), all data of | |
| 1125 an object needs to be fully loaded. This method | |
| 1126 loads the parts of the object that are usually | |
| 1127 lazy-loaded. | |
| 1128 Returns : none | |
| 1129 | |
| 1130 =cut | |
| 1131 | |
| 1132 sub load { | |
| 1133 my ( $self, $load_xrefs ) = @_; | |
| 1134 | |
| 1135 if ( !defined($load_xrefs) ) { $load_xrefs = 1 } | |
| 1136 | |
| 1137 $self->seq(); | |
| 1138 | |
| 1139 $self->stable_id(); | |
| 1140 $self->get_all_Attributes(); | |
| 1141 $self->get_all_ProteinFeatures(); | |
| 1142 | |
| 1143 if ($load_xrefs) { | |
| 1144 $self->get_all_DBEntries(); | |
| 1145 } | |
| 1146 } | |
| 1147 | |
| 1148 =head2 temporary_id | |
| 1149 | |
| 1150 Description: DEPRECATED This method should not be needed. Use dbID, | |
| 1151 stable_id or something else. | |
| 1152 | |
| 1153 =cut | |
| 1154 | |
| 1155 sub temporary_id { | |
| 1156 my $self = shift; | |
| 1157 deprecate( "I cant see what a temporary_id is good for, please use " . | |
| 1158 "dbID or stableID or\n try without an id." ); | |
| 1159 $self->{'temporary_id'} = shift if( @_ ); | |
| 1160 return $self->{'temporary_id'}; | |
| 1161 } | |
| 1162 | |
| 1163 | |
| 1164 =head2 get_all_DASFactories | |
| 1165 | |
| 1166 Function : Retrieves a listref of registered DAS objects | |
| 1167 Returntype: Listref of DAS Objects | |
| 1168 Exceptions: none | |
| 1169 Caller : webcode | |
| 1170 Example : $dasref = $prot->get_all_DASFactories; | |
| 1171 Status : Stable | |
| 1172 | |
| 1173 =cut | |
| 1174 | |
| 1175 sub get_all_DASFactories { | |
| 1176 my $self = shift; | |
| 1177 return [ $self->adaptor()->db()->_each_DASFeatureFactory ]; | |
| 1178 } | |
| 1179 | |
| 1180 | |
| 1181 =head2 get_all_DAS_Features | |
| 1182 | |
| 1183 Example : $features = $prot->get_all_DAS_Features; | |
| 1184 Description: Retreives a hash reference to a hash of DAS feature | |
| 1185 sets, keyed by the DNS, NOTE the values of this hash | |
| 1186 are an anonymous array containing: | |
| 1187 (1) a pointer to an array of features; | |
| 1188 (2) a pointer to the DAS stylesheet | |
| 1189 Returntype : hashref of Bio::SeqFeatures | |
| 1190 Exceptions : none | |
| 1191 Caller : webcode | |
| 1192 Status : Stable | |
| 1193 | |
| 1194 =cut | |
| 1195 | |
| 1196 sub get_all_DAS_Features{ | |
| 1197 my $self = shift; | |
| 1198 | |
| 1199 my $db = $self->adaptor->db; | |
| 1200 my $GeneAdaptor = $db->get_GeneAdaptor; | |
| 1201 my $Gene = $GeneAdaptor->fetch_by_translation_stable_id($self->stable_id) || return; | |
| 1202 my $slice = $Gene->feature_Slice; | |
| 1203 | |
| 1204 return $self->SUPER::get_all_DAS_Features($slice); | |
| 1205 } | |
| 1206 | |
| 1207 =head2 summary_as_hash | |
| 1208 | |
| 1209 Example : $translation_summary = $translation->summary_as_hash(); | |
| 1210 Description : Retrieves a textual summary of this Translation. | |
| 1211 Not inherited from Feature. | |
| 1212 Returns : hashref of arrays of descriptive strings | |
| 1213 Status : Intended for internal use | |
| 1214 =cut | |
| 1215 | |
| 1216 sub summary_as_hash { | |
| 1217 my $self = shift; | |
| 1218 my %summary; | |
| 1219 $summary{'ID'} = $self->display_id; | |
| 1220 $summary{'genomic_start'} = $self->genomic_start; | |
| 1221 $summary{'genomic_end'} = $self->genomic_end; | |
| 1222 my $transcript = $self->transcript; | |
| 1223 $summary{'Parent'} = $transcript->display_id; | |
| 1224 return \%summary; | |
| 1225 } | |
| 1226 | |
| 1227 1; |
