Mercurial > repos > willmclaren > ensembl_vep
diff variant_effect_predictor/Bio/EnsEMBL/IntronSupportingEvidence.pm @ 0:21066c0abaf5 draft
Uploaded
author | willmclaren |
---|---|
date | Fri, 03 Aug 2012 10:04:48 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/EnsEMBL/IntronSupportingEvidence.pm Fri Aug 03 10:04:48 2012 -0400 @@ -0,0 +1,329 @@ +package Bio::EnsEMBL::IntronSupportingEvidence; + +=pod + +=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>. + +=head1 NAME + +Bio::EnsEMBL::IntronSupportingEvidence + +=head1 DESCRIPTION + +Formalises an Intron with information about why it is a believed Intron. This +serves as a parallel object to Bio::EnsEMBL::Intron which you can use +to populate values in this field from. They are different objects though +due to Intron's non-existence as a DB data structure. + +=head1 SYNOPSIS + + #Example setups a ISE from the first two Exons + my ($five_prime_exon, $three_prime_exon) = @{$transcript->get_all_Exons()}[0..1]; + my $intron = Bio::EnsEMBL::Intron->new($five_prime_exon, $three_prime_exon); + +=head1 METHODS + +=cut + + +use strict; +use warnings; +use base qw/Bio::EnsEMBL::Feature/; + +use Bio::EnsEMBL::Intron; +use Bio::EnsEMBL::Utils::Argument qw/rearrange/; +use Bio::EnsEMBL::Utils::Exception qw/throw/; +use Bio::EnsEMBL::Utils::Scalar qw/assert_ref/; + +our %SUPPORTED_TYPES = map { $_ => 1 } qw/NONE DEPTH/; + +=head2 new + + Arg [-ANALYSIS] : Bio::EnsEMBL::Analysis The analysis this intron is linked to + Arg [-START] : int - start postion of the IntronSupportingEvidence + Arg [-END] : int - end position of the IntronSupportingEvidence + Arg [-STRAND] : int - strand the IntronSupportingEvidence is on + Arg [-SLICE] : Bio::EnsEMBL::Slice - the slice the IntronSupportingEvidence is on + Arg [-INTRON] : Bio::EnsEMBL::Intron Intron the evidence is based + on. Useful if you are not specifying the location + parameters as we will take them from this + Arg [-HIT_NAME] : String The name of the hit + Arg [-SCORE] : Double The score associated with the supporting evidence + Arg [-SCORE_TYPE] : String The type of score we are representing + Example : Bio::EnsEMBL::IntronSupportingEvidence->new( + -ANALYSIS => $analysis, -INTRON => $intron, + -SCORE => 100, -SCORE_TYPE => 'DEPTH'); + Description : Returns a new instance of this object + Returntype : Bio::EnsEMBL::IntronSupportEvidence + Exceptions : Thrown if data is not as requested + +=cut + +sub new { + my ($class, @args) = @_; + + my $self = $class->SUPER::new(@args); + + my ($intron, $hit_name, $score, $score_type, $is_splice_canonical) = + rearrange([qw/intron hit_name score score_type is_splice_canonical/], @args); + + if($intron) { + $self->set_values_from_Intron($intron); + } + $self->hit_name($hit_name) if $hit_name; + $self->score($score) if $score; + $self->score_type($score_type) if $score_type; + $self->is_splice_canonical($is_splice_canonical) if $is_splice_canonical; + + return $self; +} + +=head2 set_values_from_Intron + + Arg [1] : Bio::EnsEMBL::Intron The intron to base this object on + Example : $ise->set_values_from_Intron($intron); + Description : Sets the start, end, strand and slice of this ISE instance + using values from the given Intron object. + Returntype : None + Exceptions : Thrown if data is not as requested + +=cut + +sub set_values_from_Intron { + my ($self, $intron) = @_; + assert_ref($intron, 'Bio::EnsEMBL::Intron', 'intron'); + $self->start($intron->start()); + $self->end($intron->end()); + $self->strand($intron->strand()); + $self->slice($intron->slice()); + $self->is_splice_canonical($intron->is_splice_canonical()); + return; +} + +=head2 is_splice_canonical + + Arg [1] : Boolean + Example : $ise->is_splice_canonical(1); + Description : Getter/setter for is_splice_canonical. Splice canonical + indicates those Introns which have a splice junction which + is structured as expected + Returntype : Boolean + Exceptions : + +=cut + +sub is_splice_canonical { + my ($self, $is_splice_canonical) = @_; + $self->{'is_splice_canonical'} = $is_splice_canonical if defined $is_splice_canonical; + return $self->{'is_splice_canonical'}; +} + +=head2 get_Intron + + Arg [1] : Bio::EnsEMBL::Transcript + Example : my $intron = $ise->intron($transcript); + Description : Provides access to an Intron object by using a given transcript + object and its associcated array of Exons. + Returntype : Bio::EnsEMBL::Intron + Exceptions : None + +=cut + +sub get_Intron { + my ($self, $transcript) = @_; + assert_ref($transcript, 'Bio::EnsEMBL::Transcript', 'transcript'); + my $five_prime = $self->find_previous_Exon($transcript); + my $three_prime = $self->find_next_Exon($transcript); + return Bio::EnsEMBL::Intron->new($five_prime, $three_prime); +} + +=head2 hit_name + + Arg [1] : String name of the hit + Example : $ise->hit_name('hit'); + Description : Getter/setter for hit name i.e. an identifier for the alignments + Returntype : String + Exceptions : None + +=cut + +sub hit_name { + my ($self, $hit_name) = @_; + $self->{'hit_name'} = $hit_name if defined $hit_name; + return $self->{'hit_name'}; +} + +=head2 score + + Arg [1] : Number; the score associated with this feature + Example : $ise->score(100); + Description : Getter/setter for score + Returntype : Number + Exceptions : None + +=cut + +sub score { + my ($self, $score) = @_; + $self->{'score'} = $score if defined $score; + return $self->{'score'}; +} + +=head2 score_type + + Arg [1] : String the enum type. Currently only allowed NONE or DEPTH + Example : $ise->score_type('DEPTH'); + Description : Gets and sets the type of score this instance represents + Returntype : String + Exceptions : Thrown if given an unsupported type of data + +=cut + +sub score_type { + my ($self, $score_type) = @_; + if(defined $score_type) { + if(! $SUPPORTED_TYPES{$score_type}) { + my $values = join(q{, }, keys %SUPPORTED_TYPES); + throw "The score_type '$score_type' is not allowed. Allowed values are [${values}]"; + } + } + $self->{'score_type'} = $score_type if defined $score_type; + return $self->{'score_type'}; +} + +=head2 has_linked_transcripts + + Example : $ise->has_linked_transcripts(); + Description : Returns true if we have transcripts linked to this ISE + Returntype : Boolean + Exceptions : Thrown if we do not have an attached adaptor + +=cut + +sub has_linked_transcripts { + my ($self) = @_; + throw "No attached adaptor. Cannot find linked Transcripts unless this is a persisted object" unless $self->adaptor(); + my $transcript_ids = $self->adaptor()->list_linked_transcript_ids($self); + return scalar(@{$transcript_ids}) ? 1 : 0; +} + +=head2 equals + + Arg [1] : Bio::EnsEMBL::IntronSupportEvidence Object to compare to + Example : $ise->equals($another_ise); + Description : Asserts if the given IntronSupportEvidence instance was equal to this + Returntype : Boolean + Exceptions : None + +=cut + +sub equals { + my ($self, $other) = @_; + my $equal = $self->SUPER::equals($other); + return 0 if ! $equal; + return ( + ($self->hit_name()||q{}) eq ($other->hit_name()||q{}) && + ($self->score_type() eq $other->score_type()) && + ($self->score() == $other->score())) ? 1 : 0; +} + +=head2 find_previous_Exon + + Arg [1] : Bio::EnsEMBL::Transcript Transcript to search for the Exons from + Example : $ise->find_previous_Exon($transcript); + Description : Loops through those Exons available from the Transcript and + attempts to find one which was the 5' flanking exon. If the + object has already been persisted we will use dbIDs to + find the Exons + Returntype : Bio::EnsEMBL::Exon + Exceptions : None + +=cut + +sub find_previous_Exon { + my ($self, $transcript) = @_; + + #Use DB IDs if we have them + my $exon_id; + if($self->adaptor()) { + my @ids = $self->adaptor()->fetch_flanking_exon_ids($self, $transcript); + $exon_id = $ids[0] if @ids; + } + + my $exons = $transcript->get_all_Exons(); + + my $start = $self->start(); + my $end = $self->end(); + foreach my $exon (@{$exons}) { + if($exon_id) { + return $exon if $exon->dbID() == $exon_id; + next; + } + if($self->strand() == 1) { + return $exon if $exon->end() == $start-1; + } + else { + return $exon if $exon->start() == $end+1; + } + } + return; +} + +=head2 find_next_Exon + + Arg [1] : Bio::EnsEMBL::Transcript Transcript to search for the Exons from + Example : $ise->find_next_Exon($transcript); + Description : Loops through those Exons available from the Transcript and + attempts to find one which was the 3' flanking exon. If the + object has already been persisted we will use dbIDs to + find the Exons + Returntype : Bio::EnsEMBL::Exon + Exceptions : None + +=cut + +sub find_next_Exon { + my ($self, $transcript) = @_; + + #Use DB IDs if we have them + my $exon_id; + if($self->adaptor()) { + my @ids = $self->adaptor()->fetch_flanking_exon_ids($self, $transcript); + $exon_id = $ids[1] if @ids; + } + + my $exons = $transcript->get_all_Exons(); + my $start = $self->start(); + my $end = $self->end(); + foreach my $exon (@{$exons}) { + if($exon_id) { + return $exon if $exon->dbID() == $exon_id; + next; + } + if($self->strand() == 1) { + return $exon if $exon->start() == $end+1; + } + else { + return $exon if $exon->end() == $start-1; + } + } + return; +} + +1;