Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/EnsEMBL/Intron.pm @ 0:1f6dce3d34e0
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 02:01:53 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/EnsEMBL/Intron.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,199 @@ +=head1 LICENSE + + Copyright (c) 1999-2012 The European Bioinformatics Institute and + Genome Research Limited. All rights reserved. + + This software is distributed under a modified Apache license. + For license details, please see + + http://www.ensembl.org/info/about/code_licence.html + +=head1 CONTACT + + Please email comments or questions to the public Ensembl + developers list at <dev@ensembl.org>. + + Questions may also be sent to the Ensembl help desk at + <helpdesk@ensembl.org>. + +=cut + +=head1 NAME Bio::EnsEMBL::Intron - A class representing an Intron + +=head1 SYNOPSIS + + $intron = Bio::EnsEMBL::Intron->new( exon1, exon2, $analysis ); + +=cut + + +package Bio::EnsEMBL::Intron; +use strict; +use warnings; + +use Bio::EnsEMBL::Utils::Exception qw( warning throw ); + +use base qw(Bio::EnsEMBL::Feature); + +=head2 new + + Arg [1] : Bio::EnsEMBL::Exon The 5' exon for the intron; required + Arg [2] : Bio::EnsEMBL::Exon The 3' exon for the intron; required + Arg [3] : Bio::EnsEMBL::Analysis Analysis to link to this Intron + Example : $intron = new Bio::EnsEMBL::Intron($exon1, $exon2) + Description: Create an Intron object from two exons and an optional analysis + Returntype : Bio::EnsEMBL::Intron + Exceptions : exons not on the same strand or slice. + Caller : general + Status : Stable + +=cut + +sub new { + my ( $proto, $e1, $e2, $analysis ) = @_; + + my $class = ref $proto || $proto; + + my $self = $class->SUPER::new(); + + if ( $e1->strand() == -1 ) { + $self->{'end'} = $e1->start() - 1; + $self->{'start'} = $e2->end() + 1; + } else { + $self->{'start'} = $e1->end() + 1; + $self->{'end'} = $e2->start() - 1; + } + + if ( $e1->strand() != $e2->strand() ) { + # throw("Exons on different strand. Not allowed"); + } else { + $self->{'strand'} = $e1->strand(); + } + + if ( $e1->slice() ne $e2->slice() ) { + if ( ( $e1->slice()->seq_region_name() ne + $e2->slice()->seq_region_name() ) + && ( $e1->slice()->coord_system_name() ne + $e2->slice()->coord_system_name() ) ) + { + throw("Exons on different slices. Not allowed"); + } else { + warning("Exons have different slice references to the same seq_region"); + } + } else { + $self->{'slice'} = $e1->slice(); + } + + if($analysis) { + $self->analysis($analysis); + } + + $self->{'prev'} = $e1; + $self->{'next'} = $e2; + + return $self; +} ## end sub new + +=head2 length + + Args : none + Example : $length = $intron->length(); + Description: Returns the length of this intron + Returntype : Integer + Exceptions : none + Caller : general + Status : Stable + +=cut + +sub length { + my ($self) = @_; + + # TODO: Introns on circular slices, see Feature.pm but allow for + # zero-length introns. + + return $self->{'end'} - $self->{'start'} + 1; +} + + +=head2 prev_Exon + + Args : none + Example : $exon = $intron->prev_Exon + Description: Returns the exon before this Intron + Returntype : Bio::EnsEMBL::Exon + Exceptions : none + Caller : general + Status : Stable + +=cut + +sub prev_Exon { + my ($self) = shift; + + return $self->{'prev'}; +} + + +=head2 next_Exon + + Args : none + Example : $exon = $intron->next_Exon + Description: Returns the exon after this Intron + Returntype : Bio::EnsEMBL::Exon + Exceptions : none + Caller : general + Status : Stable + +=cut + +sub next_Exon { + my ($self) = shift; + + return $self->{'next'}; +} + +=head2 is_splice_canonical + + Example : my $canonical = $intron->is_splice_canonical(); + Description : Indicates if the splice site is considered normal. This means + splice site variants equal to (D == donor, A == acceptor) + GT (D) => AG (A) + AT (D) => AC (A) + GC (D) => AG (A) + Returntype : Boolean indicating if the splice was as expected + Exceptions : See splice_seq + +=cut + +sub is_splice_canonical { + my ($self) = @_; + my $splice = join q{}, @{$self->splice_seq()}; + my $canonical = { + 'GTAG' => 1, 'ATAC' => 1, 'GCAG' => 1 + }->{$splice}; + return $canonical || 0; +} + +=head2 splice_seq + + Example : my ($donor, $acceptor) = @{$intron->splice_seq}; + Description : Get the donor and acceptor splice sites for this intron + Returntype : ArrayRef[String] The donor and acceptor sequences as Strings + Exceptions : Thrown if a feature Slice cannot be found + +=cut + +sub splice_seq { + my ($self) = @_; + my $slice = $self->feature_Slice(); + throw "Cannot retrieve feature_Slice() for this Intron" unless $slice; + my $length = $self->length(); + my $donor_seq = uc($slice->subseq(1,2)); + my $acceptor_seq = uc($slice->subseq($length - 1, $length)); + return [$donor_seq, $acceptor_seq]; +} + +1; + +