Mercurial > repos > willmclaren > ensembl_vep
diff variant_effect_predictor/Bio/EnsEMBL/Variation/BaseVariationFeatureOverlapAllele.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/Variation/BaseVariationFeatureOverlapAllele.pm Fri Aug 03 10:04:48 2012 -0400 @@ -0,0 +1,279 @@ +=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::Variation::BaseVariationFeatureOverlapAllele + +=head1 SYNOPSIS + + use Bio::EnsEMBL::Variation::BaseVariationFeatureOverlapAllele; + + my $bvfoa = Bio::EnsEMBL::Variation::BaseVariationFeatureOverlapAllele->new( + -base_variation_feature_overlap => $bvfo, + -is_reference => 0, + ); + + print "consequence SO terms: ", (join ",", map { $_->SO_term } @{ $bvfoa->get_all_OverlapConsequences }), "\n"; + +=head1 DESCRIPTION + +A BaseVariationFeatureOverlapAllele object represents a single allele of a +BaseVariationFeatureOverlap. It is the super-class of variation feature specific +classes such as VariationFeatureOverlapAllele and StructuralVariationOverlapAllele +and contains methods not specific to any particular variation feature type. +Ordinarily you will not create these objects yourself, but instead you would +create one of the more specific subclasses. + +=cut + +package Bio::EnsEMBL::Variation::BaseVariationFeatureOverlapAllele; + +use strict; +use warnings; + +use Bio::EnsEMBL::Utils::Argument qw(rearrange); +use Bio::EnsEMBL::Utils::Scalar qw(assert_ref); +use Bio::EnsEMBL::Utils::Exception qw(throw); +use Bio::EnsEMBL::Variation::Utils::Constants qw(%OVERLAP_CONSEQUENCES); +use Scalar::Util qw(weaken); + +=head2 new + + Arg [-BASE_VARIATION_FEATURE_OVERLAP] : + The Bio::EnsEMBL::BaseVariationFeatureOverlap with which this allele is + associated + + Arg [-IS_REFERENCE] : + A flag indicating if this allele is the reference allele or not + + Example : + my $bvfoa = Bio::EnsEMBL::Variation::BaseVariationFeatureOverlapAllele->new( + -base_variation_feature_overlap => $bvfo, + -is_reference => 0 + ); + + Description: Constructs a new BaseVariationFeatureOverlapAllele instance given a + BaseVariationFeatureOverlap and a flag indicating if this is the + reference allele + Returntype : A new Bio::EnsEMBL::Variation::BaseVariationFeatureOverlapAllele instance + Exceptions : throws unlessBASE_VARIATION_FEATURE_OVERLAP is supplied + Status : At Risk + +=cut + +sub new { + my $class = shift; + + my ( + $base_variation_feature_overlap, + $is_reference + ) = rearrange([qw( + BASE_VARIATION_FEATURE_OVERLAP + IS_REFERENCE + )], @_); + + assert_ref($base_variation_feature_overlap, 'Bio::EnsEMBL::Variation::BaseVariationFeatureOverlap'); + + my $self = bless { + base_variation_feature_overlap => $base_variation_feature_overlap, + is_reference => $is_reference, + }, $class; + + # avoid a memory leak, because the bvfo also has a reference to us + weaken $self->{base_variation_feature_overlap}; + + return $self; +} + +sub new_fast { + my ($class, $hashref) = @_; + my $self = bless $hashref, $class; + # avoid a memory leak, because the bvfo also has a reference to us + weaken $self->{base_variation_feature_overlap} if $self->{base_variation_feature_overlap}; + return $self; +} + +=head2 base_variation_feature_overlap + + Description: Get/set the associated BaseVariationFeatureOverlap + Returntype : Bio::EnsEMBL::Variation::BaseVariationFeatureOverlap + Exceptions : throws if the argument is the wrong type + Status : At Risk + +=cut + +sub base_variation_feature_overlap { + my ($self, $bvfo) = @_; + + if ($bvfo) { + assert_ref($bvfo, 'Bio::EnsEMBL::Variation::BaseVariationFeatureOverlap'); + $self->{base_variation_feature_overlap} = $bvfo; + # avoid a memory leak, because the bvfo also has a reference to us + weaken $self->{base_variation_feature_overlap}; + } + + return $self->{base_variation_feature_overlap}; +} + +=head2 base_variation_feature + + Description: Get the associated BaseVariationFeature + Returntype : Bio::EnsEMBL::Variation::BaseVariationFeature + Exceptions : none + Status : At Risk + +=cut + +sub base_variation_feature { + my $self = shift; + return $self->base_variation_feature_overlap->base_variation_feature(@_); +} + +=head2 feature + + Description: Get the associated Feature + Returntype : Bio::EnsEMBL::Feature (or relevant subclass) + Exceptions : none + Status : At Risk + +=cut + +sub feature { + my $self = shift; + return $self->base_variation_feature_overlap->feature(@_); +} + +=head2 is_reference + + Args [1] : A boolean value + Description: Get/set a flag indicating if this allele is the reference allele + Returntype : bool + Exceptions : none + Status : At Risk + +=cut + +sub is_reference { + my ($self, $is_reference) = @_; + $self->{is_reference} = $is_reference if defined $is_reference; + return $self->{is_reference}; +} + +=head2 get_all_OverlapConsequences + + Description: Get a list of all the OverlapConsequences of this allele, calculating them + on the fly if necessary + Returntype : listref of Bio::EnsEMBL::Variation::OverlapConsequence objects + Exceptions : none + Status : At Risk + +=cut + +sub get_all_OverlapConsequences { + my $self = shift; + + unless ($self->{overlap_consequences}) { + + # calculate consequences on the fly + + my $cons = []; + + my $assigned_tier; + + # loop over all the possible consequences + for my $oc (@{$self->get_sorted_OverlapConsequences}) { + + last if defined($assigned_tier) and $oc->tier > $assigned_tier; + + # check that this consequence applies to this type of variation feature + + if ($oc->variant_feature_class && $self->base_variation_feature->isa($oc->variant_feature_class)) { + + # check that this consequence applies to this type of feature + + if ($self->feature->isa($oc->feature_class)) { + + # if so, check if the predicate of this consequence holds for this bvfoa + my $check = $oc->predicate->($self); + + #print STDERR $self->base_variation_feature->variation_name." ".$oc->{SO_term}." ".$self->feature->stable_id. " $check\n"; + + if ($check) { + push @$cons, $oc; + $assigned_tier = $oc->tier; + } + } + } + } + + $self->{overlap_consequences} = $cons; + } + + return $self->{overlap_consequences}; +} + +=head2 add_OverlapConsequence + + Arg [1] : Bio::EnsEMBL::Variation::OverlapConsequence instance + Description: Add an OverlapConsequence to this allele's list + Returntype : none + Exceptions : throws if the argument is the wrong type + Status : At Risk + +=cut + +sub add_OverlapConsequence { + my ($self, $oc) = @_; + assert_ref($oc, 'Bio::EnsEMBL::Variation::OverlapConsequence'); + $self->{overlap_consequences} ||= []; + push @{ $self->{overlap_consequences} }, $oc; +} + +sub SO_isa { + my ($self, $query) = @_; + + if (my $adap = $self->base_variation_feature_overlap->{adaptor}) { + if (my $ota = $adap->db->dnadb->get_OntologyTermAdaptor) { + my $term = $ota->fetch_by_accession(); + my @parents = $ota->fetch_by_child_term($term); + } + } + + for my $cons (@{ $self->get_all_OverlapConsequences }) { + if ($cons->SO_term eq $query) { + return 1; + } + } +} + +sub get_sorted_OverlapConsequences { + my $self = shift; + + if(!defined($self->base_variation_feature_overlap->adaptor->{sorted_cons})) { + my @sorted = sort {$a->tier <=> $b->tier} values %OVERLAP_CONSEQUENCES; + $self->base_variation_feature_overlap->adaptor->{sorted_cons} = \@sorted; + } + + return $self->base_variation_feature_overlap->adaptor->{sorted_cons}; +} + +1; +