Mercurial > repos > willmclaren > ensembl_vep
diff variant_effect_predictor/Bio/EnsEMBL/Funcgen/FeatureSet.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/Funcgen/FeatureSet.pm Fri Aug 03 10:04:48 2012 -0400 @@ -0,0 +1,458 @@ +# +# Ensembl module for Bio::EnsEMBL::Funcgen::FeatureSet +# + +=head1 LICENSE + + Copyright (c) 1999-2011 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 <ensembl-dev@ebi.ac.uk>. + + Questions may also be sent to the Ensembl help desk at + <helpdesk@ensembl.org>. + + +=head1 NAME + +Bio::EnsEMBL::FeatureSet - A module to represent FeatureSet. + + +=head1 SYNOPSIS + +use Bio::EnsEMBL::Funcgen::FeatureSet; + +my $result_set = Bio::EnsEMBL::Funcgen::FeatureSet->new( + +); + + + +=head1 DESCRIPTION + +A FeatureSet object provides access to a set of feature predictions and their details, which may have been generated from a +single or multiple Experiments with potentially differing analyses. The FeatureSet itself will only have a single analysis +which may be one or a combination of programs but will be represented by one analysis record. + +=cut + +use strict; +use warnings; + +package Bio::EnsEMBL::Funcgen::FeatureSet; + +use Bio::EnsEMBL::Utils::Argument qw( rearrange ); +use Bio::EnsEMBL::Utils::Exception qw( throw warning deprecate); +use Bio::EnsEMBL::Funcgen::Set; + +use vars qw(@ISA); +@ISA = qw(Bio::EnsEMBL::Funcgen::Set); + +my %valid_classes = ( annotated => undef, + regulatory => undef, + external => undef, + segmentation => undef, ); + +=head2 new + + -name => $name, + -feature_type => $ftype, + -cell_type => $ctype, + -name => $name, + -description => 'Release 3.1', + -display_label => 'Short name', + -analysis => $analysis, + Arg [-EXPERIMENT_ID] : Experiment dbID + -dbid => $dbid, +Arg [-ADAPTOR] + + Example : my $feature = Bio::EnsEMBL::Funcgen::FeatureSet->new( + -dbid => $dbid, + -analysis => $analysis, + -feature_type => $ftype, + -cell_type => $ctype, + -name => $name, + -feature_class => 'annotated', + -description => 'Release 3.1', + -display_label => 'Short name', + -input_set => $iset, + ); + Description: Constructor for FeatureSet objects. + Returntype : Bio::EnsEMBL::Funcgen::FeatureSet + Exceptions : Throws if FeatureType defined + Caller : General + Status : At risk + +=cut + +sub new { + my $caller = shift; + my $class = ref($caller) || $caller; + my $self = $class->SUPER::new(@_); + + my ( $desc, $dlabel, $iset_id, $iset, $exp_id, $exp ) = + rearrange( [ + 'DESCRIPTION', 'DISPLAY_LABEL', + 'INPUT_SET_ID', 'INPUT_SET', 'EXPERIMENT_ID', 'EXPERIMENT' + ], + @_ ); + + + if($exp_id || $exp){ + throw('Passing an Experiment or an experiment_id is now deprecated,'. + ' please use -input_set or -input_set_id instead'); + } + + #Allow exp or exp_id to be passed to support storing and lazy loading + + #Mandatory params checks here (setting done in Set.pm) + throw('Must provide a FeatureType') + if ( !defined $self->feature_type ); + + #explicit type check here to avoid invalid types being imported as NULL + #subsequently throwing errors on retrieval + my $type = $self->feature_class; + + if ( !( $type && exists $valid_classes{$type} ) ) { + throw( 'You must define a valid FeatureSet type e.g. ' . + join( ', ', keys %valid_classes ) ); + } + + #Direct assignment to prevent need for set arg test in method + + $self->{'description'} = $desc if defined $desc; + $self->{'display_label'} = $dlabel if defined $dlabel; + $self->{'input_set_id'} = $iset_id if defined $iset_id; + + if ( defined $iset ) { + #Exp obj is only passed during object storing + #so let the adaptor do is_stored_and_valid + $self->{'input_set'} = $iset; + } + + return $self; +} ## end sub new + + + +=head2 new_fast + + Args : Hashref with all internal attributes set + Example : none + Description: Quick and dirty version of new. Only works if the code is very + disciplined. + Returntype : Bio::EnsEMBL::Funcgen::FeatureSet + Exceptions : None + Caller : General + Status : At Risk + +=cut + + +sub new_fast { + return bless ($_[1], $_[0]); +} + + +=head2 description + + Example : print "Feature set description is:\t".$fset->description."\n"; + Description: Getter for the description of this FeatureSet. e.g. Release 3.1 + Returntype : String + Exceptions : None + Caller : General + Status : At Risk + +=cut + +sub description { + return $_[0]->{'description'}; +} + + + +=head2 display_label + + Example : print $rset->display_label; + Description: Getter for the display_label attribute for this FeatureSet. + Returntype : String + Exceptions : None + Caller : General + Status : At Risk + +=cut + +sub display_label { + my $self = shift; + + if ( !$self->{'display_label'} ) { + + if ( $self->feature_type->class() eq 'Regulatory Feature' ) { + $self->{'display_label'} = $self->name; + } + else { + #This still fails here if we don't have a class or a cell_type set + + $self->{'display_label'} = + $self->feature_type->name() . " - " . $self->cell_type->name() . + " Enriched Sites"; + } + } + + return $self->{'display_label'}; +} + + + + +=head2 get_FeatureAdaptor + + Example : + Description: Retrieves and caches FeatureAdaptor of feature_set type + Returntype : Bio::EnsEMBL::Funcgen::DBSQL::ucfirst($self->feature_class())FeatureAdaptor + Exceptions : None + Caller : General + Status : At Risk + +=cut + + +sub get_FeatureAdaptor{ + my $self = shift; + + if(! exists $self->{'adaptor_refs'}){ + + foreach my $valid_class(keys %valid_classes){ + my $method = 'get_'.ucfirst($valid_class).'FeatureAdaptor'; + + $self->{'adaptor_refs'}{$valid_class} = $self->adaptor->db->$method; + } + } + + return $self->{'adaptor_refs'}->{$self->feature_class()}; + +} + + + +=head2 get_Features_by_Slice + + Example : my @features = @{$FeatureSet->get_Features_by_Slice($slice)}; + Description: Retrieves all Features for this FeatureSet for a given Slice + Returntype : ARRAYREF containing Features of the feature_set type i.e. Annotated, Regulatory or Supporting; + Exceptions : None + Caller : General + Status : At Risk + +=cut + +sub get_Features_by_Slice{ + my ($self, $slice) = @_; + + return $self->get_FeatureAdaptor->fetch_all_by_Slice_FeatureSets($slice, [$self]); +} + + +=head2 get_Features_by_FeatureType + + Arg[0] : Bio::EnsEMBL::Funcgen::FeatureType + Example : my @features = @{$FeatureSet->get_Features_by_FeatureType($ftype)}; + Description: Retrieves all Features for this FeatureSet for a given FeatureType + or associated FeatureType. This is mainly used by external FeatureSets + which can sometimes have more than one associated FeatureType. + Returntype : ARRAYREF + Exceptions : None + Caller : General + Status : At Risk + +=cut + + +sub get_Features_by_FeatureType{ + my ($self, $type) = @_; + + return $self->get_FeatureAdaptor->fetch_all_by_FeatureType_FeatureSets($type, [$self]); +} + + +=head2 get_all_Features + + Example : my @features = @{$FeatureSet->get_all_Features}; + Description: Retrieves all Features for this FeatureSet + Returntype : ARRAYREF + Exceptions : None + Caller : General + Status : At Risk + +=cut + +sub get_all_Features{ + my $self = shift; + + return $self->get_FeatureAdaptor->fetch_all_by_FeatureSets([$self]); +} + + + + +=head2 is_focus_set + + Args : None + Example : if($fset->is_focus_set){ ... } + Description: Returns true if FeatureSet is a focus set used in the RegulatoryBuild + Returntype : Boolean + Exceptions : Throws if meta entry not present + Caller : General + Status : At Risk + +=cut + +sub is_focus_set{ + my $self = shift; + + if(! defined $self->{focus_set}){ + + if(! defined $self->cell_type){ + warn "FeatureSet without an associated CellType cannot be a focus set:\t".$self->name; + $self->{focus_set} = 0; + } + else{ + $self->{focus_set} = $self->adaptor->fetch_focus_set_config_by_FeatureSet($self); + } + } + + return $self->{focus_set}; +} + + +=head2 is_attribute_set + + Args : None + Example : if($fset->is_attribute_set){ ... } + Description: Returns true if FeatureSet is a supporting/attribute(focus or not) set used in the RegulatoryBuild + Returntype : Boolean + Exceptions : Throws if meta entry not present + Caller : General + Status : At Risk + +=cut + +sub is_attribute_set{ + my $self = shift; + + if(! defined $self->{attribute_set}){ + + if(! defined $self->cell_type){ + warn "FeatureSet without an associated CellType cannot be a attribute set:\t".$self->name; + $self->{attribute_set} = 0; + } + else{ + $self->{attribute_set} = $self->adaptor->fetch_attribute_set_config_by_FeatureSet($self); + } + } + + return $self->{attribute_set}; +} + + +=head2 get_InputSet + + Example : my $input_set = $FeatureSet->get_InputSet; + Description: Retrieves the InputSet for this FeatureSet + Returntype : Bio::EnsEMBL::Funcgen::InputSet + Exceptions : None + Caller : General + Status : At Risk + +=cut + +sub get_InputSet{ + my $self = shift; + + if( (! defined $self->{input_set}) && + (defined $self->{input_set_id}) ){ + $self->{input_set} = $self->adaptor->db->get_InputSetAdaptor->fetch_by_dbID($self->{input_set_id}); + } + + return $self->{input_set}; +} + + + +=head2 source_label + + Example : my $source_label = $fset->source_label; + Description: Retrieves the source label this FeatureSet, used in zmenus + Returntype : Arrayref of Strings + Exceptions : None + Caller : Webcode zmenus + Status : At Risk - remove, to be done by webcode? + +=cut + +#These are used to link through to the experiment view based on feature_set_id + +sub source_label{ + my $self = shift; + + if (! defined $self->{source_label}) { + my $input_set = $self->get_InputSet; + my @source_labels; + + if ($input_set) { + + + foreach my $isset(@{$input_set->get_InputSubsets}){ + + if(defined $isset->archive_id){ + push @source_labels, $isset->archive_id; + } + #Archive IDs e.g. SRX identifiers or undef. + } + + #Append project name + my $exp_group = $input_set->get_Experiment->experimental_group; + + if ($exp_group && + $exp_group->is_project) { + push @source_labels, $exp_group->name; + } + } + + + $self->{source_label} = join(' ', @source_labels); + } + + return $self->{source_label}; +} + + + + +### DEPRECATED ### + +=head2 get_Experiment +# +# Example : my $exp = $FeatureSet->get_Experiment; +# Description: Retrieves the Experiment for this FeatureSet +# Returntype : Bio::EnsEMBL::Funcgen::Experiment +# Exceptions : None +# Caller : General + Status : DEPRECATED + +=cut + +sub get_Experiment{ + throw('FeatureSet::get_Experiment is not longer supported, please use FeatureSet::get_InputSet'); +} + + +1;