Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/EnsEMBL/Variation/Utils/BaseVepPlugin.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/Variation/Utils/BaseVepPlugin.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,332 @@ +=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::Utils::BaseVepPlugin + +=head1 SYNOPSIS + + package FunkyPlugin; + + use base qw(Bio::EnsEMBL::Variation::Utils::BaseVepPlugin); + + sub feature_types { + return ['Transcript']; + } + + sub get_header_info { + return { + FUNKY_PLUGIN => "Description of funky plugin" + }; + } + + sub run { + my ($self, $transcript_variation_allele) = @_; + + my $results = ... # do analysis + + return { + FUNKY_PLUGIN => $results + }; + } + + 1; + +=head1 DESCRIPTION + +To make writing plugin modules for the VEP easier, get +your plugin to inherit from this class, override (at least) +the feature_types, get_header_info and run methods to behave +according to the documentation below, and then run the VEP +with your plugin using the --plugin <module name> command +line option. + +=cut + +package Bio::EnsEMBL::Variation::Utils::BaseVepPlugin; + +use strict; +use warnings; + +=head2 new + + Arg [1] : a VEP configuration hashref + Arg [>1] : any parameters passed on the VEP command line, will be stored as a listref in $self->{params} + Description: Creates and returns a new instance of this plugin + Returntype : Bio::EnsEMBL::Variation::Utils::BaseVepPlugin instance (most likely a user-defined subclass) + Status : Experimental + +=cut + +sub new { + my ($class, $config, @params) = @_; + + # default to the current VEP version, and analysing VariationFeatures and + # Transcripts (which we expect to be the most common usage, this means that + # the run method will be called with a TranscriptVariationAllele as the + # first argument) + + return bless { + version => '2.3', + feature_types => ['Transcript'], + variant_feature_types => ['VariationFeature'], + config => $config, + params => \@params, + }, $class; +} + +=head2 version + + Arg [1] : (optional) a version number string in the form N.N.N + Description: Get/set the version of this plugin. The version should + match the version of the VEP that this plugin works with + (at least in the major version number). This is used to + detect compatibility between the VEP and plugins. + Returntype : string + Status : Experimental + +=cut + +sub version { + my ($self, $version) = @_; + $self->{version} = $version if $version; + return $self->{version}; +} + +=head2 config + + Arg [1] : a VEP configuration hashref + Description: Get/set the VEP configuration hashref + Returntype : hashref + Status : Experimental + +=cut + +sub config { + my ($self, $config) = @_; + $self->{config} = $config if $config; + return $self->{config}; +} + +=head2 params + + Arg [1] : (optional) a listref of plugin parameters + Description: Get/set the parameters of this plugin, typically as passed on the VEP command line. + Returntype : listref + Status : Experimental + +=cut + +sub params { + my ($self, $params) = @_; + $self->{params} = $params if $params; + return $self->{params} || []; +} + +=head2 get_header_info + + Description: Return a hashref with any Extra column keys as keys and a description + of the data as a value, this will be included in the VEP output file + header to help explain the results of this plugin. Plugins that do + not want to include anything in the header should return undef. + Returntype : hashref or undef + Status : Experimental + +=cut + +sub get_header_info { + my ($self) = @_; + return undef; +} + +=head2 variant_feature_types + + Description: To indicate which types of variation features a plugin is interested + in, plugins should return a listref of the types of variation feature + they can deal with. Currently this list should include one or more of: + 'VariationFeature' or 'StructuralVariationFeature' + Returntype : listref + Status : Experimental + +=cut + +sub variant_feature_types { + my ($self, $types) = @_; + $self->{variant_feature_types} = $types if $types; + return $self->{variant_feature_types}; +} + +=head2 feature_types + + Description: To indicate which types of genomic features a plugin is interested + in, plugins should return a listref of the types of feature they can deal + with. Currently this list should include one or more of: 'Transcript', + 'RegulatoryFeature' and 'MotifFeature' + Returntype : listref + Status : Experimental + +=cut + +sub feature_types { + my ($self, $types) = @_; + $self->{feature_types} = $types if $types; + return $self->{feature_types}; +} + +sub _check_types { + my ($self, $type_type, $type) = @_; + + # if we're passed an object instead of a type string + # get the type of reference and use that + if (ref $type) { + $type = ref $type; + } + + # $type_type will either be 'variant_feature' or 'feature' + # so construct the method to call and the hash key to + # store the cached results under + + my $method = $type_type.'_types'; + my $hash_key = $method.'_wanted'; + + unless (defined $self->{$hash_key}->{$type}) { + + # cache the result so we don't have to loop each time + + $self->{$hash_key}->{$type} = 0; + + for my $wanted (@{ $self->$method }) { + + # special case the intergenic class + + if ($wanted eq 'Intergenic') { + if ($wanted eq $type) { + $self->{$hash_key}->{$type} = 1; + last; + } + } + else { + + # we are fairly relaxed about how the user describes features, it can + # be the fully qualified class name, or just the specific module name, + # (i.e. the text after the last '::') in which case we automatically + # fully qualify it + + if ($wanted !~ /::/) { + + if ($type_type eq 'feature') { + + if ($wanted eq 'RegulatoryFeature' || $wanted eq 'MotifFeature') { + $wanted = "Bio::EnsEMBL::Funcgen::$wanted"; + } + else { + $wanted = "Bio::EnsEMBL::$wanted"; + } + } + elsif ($type_type eq 'variant_feature') { + $wanted = "Bio::EnsEMBL::Variation::$wanted"; + } + } + + if ($type->isa($wanted)) { + $self->{$hash_key}->{$type} = 1; + last; + } + } + } + } + + return $self->{$hash_key}->{$type}; +} + +=head2 check_feature_type + + Arg[1] : the feature type as a string (or a reference to an object of the desired type) + Description: Check if this plugin is interested in a particular feature type + Returntype : boolean + Status : Experimental + +=cut + +sub check_feature_type { + my ($self, $type) = @_; + return $self->_check_types('feature', $type); +} + +=head2 check_variant_feature_type + + Arg[1] : the variant feature type as a string (or a reference to an object of the desired type) + Description: Check if this plugin is interested in a particular variant feature type + Returntype : boolean + Status : Experimental + +=cut + +sub check_variant_feature_type { + my ($self, $type) = @_; + return $self->_check_types('variant_feature', $type); +} + +=head2 run + + Arg[1] : An instance of a subclass of Bio::EnsEMBL::Variation::BaseVariationFeatureOverlapAllele + Arg[2] : A hashref containing all the data that will be printed on this line, keyed by column name + Description: Run this plugin, this is where most of the plugin logic should reside. + When the VEP is about to finish one line of output (for a given variation-allele-feature + combination) it will call this method, passing it a relevant subclass of a + Bio::EnsEMBL::Variation::BaseVariationFeatureOverlapAllele object according to + feature types it is interested in, as specified by the plugin's feature_types method: + + feature type argument type + + 'Transcript' Bio::EnsEMBL::Variation::TranscriptVariationAllele + 'RegulatoryFeature' Bio::EnsEMBL::Variation::RegulatoryFeatureVariationAllele + 'MotifFeature' Bio::EnsEMBL::Variation::MotifFeatureVariationAllele + + Once the plugin has done its analysis it should return the results as a hashref + with a key for each type of data (which should match the keys described in + get_header_info) and a corresponding value for this particular object, or an empty + hash (*not* undef) if this plugin does not produce any annotation for this object. + Any edata will then be included in the Extra column in the VEP output file. + Please refer to the variation API documentation to see what methods are available + on each of the possible classes, bearing in mind that common functionality can be + found in the BaseVariationFeatureOverlapAllele superclass. + + If the plugin wants to filter this line out of the VEP output it can indicate + this by returning undef rather than a hashref. Using this mechanism a plugin + can act as a filter on the VEP output to limit lines to particular events + of interest. If you are writing a plugin to act as filter, consider subclassing + Bio::EnsEMBL::Variation::Utils::BaseVepFilterPlugin, a subclass of this class + which provides some convenient functionality for filter plugins. + + Returntype : hashref or undef if the plugin wants to filter out this line + Status : Experimental + +=cut + +sub run { + my ($self, $bvfoa, $line_hash) = @_; + warn "VEP plugins should implement the 'run' method\n"; + return {}; +} + +1; +