diff dir_plugins/DAS.pm @ 0:e545d0a25ffe draft

Uploaded
author dvanzessen
date Mon, 15 Jul 2019 05:17:17 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dir_plugins/DAS.pm	Mon Jul 15 05:17:17 2019 -0400
@@ -0,0 +1,127 @@
+=head1 LICENSE
+                                                                                                                     
+ Copyright (c) 1999-2015 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                                                                                                       
+
+ Ensembl <http://www.ensembl.org/info/about/contact/index.html>
+    
+=cut
+
+=head1 NAME
+
+ DAS
+
+=head1 SYNOPSIS
+
+ mv DAS.pm ~/.vep/Plugins
+ ./vep -i variations.vcf --plugin DAS,<DAS_server>,<DAS_source>,<proxy>
+
+=head1 DESCRIPTION
+
+ A simple VEP plugin that checks for DAS features overlapping variants. Currently assumes that
+ the assemblies match, and doesn't do any smart fetching of chunks of features (i.e. the plugin
+ will query the DAS server once for every variant in the input file).
+
+ You can run multiple instances of this plugin at the same time so you can query multiple DAS
+ servers and sources. If you are querying multiple sources from the same server it is 
+ convenient to store the server name in an environment variable to avoid specifying it
+ multiple times, e.g.:
+
+ export DAS="http://somewhere/das"
+ ./vep -i variations.vcf --plugin DAS,$DAS,source1 --plugin DAS,$DAS,source2
+
+ Requires the Bio::Das::Lite module from CPAN.
+
+=cut
+
+package DAS;
+
+use strict;
+use warnings;
+
+use Bio::Das::Lite;
+use Data::Dumper;
+
+use Bio::EnsEMBL::Variation::Utils::BaseVepPlugin;
+
+use base qw(Bio::EnsEMBL::Variation::Utils::BaseVepPlugin);
+
+sub get_header_info {
+    my $self = shift;
+    return {
+        $self->header => $self->{source}." features from DAS server ".$self->{server},
+    };
+}
+
+sub feature_types {
+    return ['Transcript','RegulatoryFeature','MotifFeature','Intergenic'];
+}
+
+sub new {
+    my $class = shift;
+    
+    my $self = $class->SUPER::new(@_);
+
+    my ($server, $source, $proxy) = @{ $self->params };
+
+    # strip off any trailing slash from the server URL
+    $server =~ s/\/$//;
+
+    $self->{das} = Bio::Das::Lite->new({
+        timeout     => 10000,
+        dsn         => "$server/$source",
+        http_proxy  => $proxy,
+    }) || die "Failed to connect to DAS source: $server/$source";
+
+    $self->{source} = $source;
+    $self->{server} = $server;
+
+    return $self;
+}
+
+sub header {
+    my $self = shift;
+    return 'DAS_'.$self->{source};
+}
+
+sub run {
+    my ($self, $vfoa) = @_;
+
+    my $vf = $vfoa->variation_feature;
+
+    my $segment = $vf->seq_region_name .':'.$vf->seq_region_start.','.$vf->seq_region_end;
+
+    # cache the results on the variation feature, making sure the cache key is unique given
+    # that there may be multiple DAS plugins running
+
+    my $cache_key = '_vep_das_cache_'.$self->{server}.$self->{source};
+
+    unless (exists $vf->{$cache_key}->{$segment}) {
+
+        $vf->{$cache_key}->{$segment} = [];
+
+        if (my $response = $self->{das}->features($segment)) {
+            for my $url (keys %$response) {
+                if (ref $response->{$url} eq 'ARRAY') { 
+                    for my $feat (@{ $response->{$url} }) {
+                        push @{ $vf->{$cache_key}->{$segment} }, $feat->{feature_label}.'('.$feat->{type}.')';
+                    }
+                }
+            }
+        }
+    }
+    
+    my $res = join ',', @{ $vf->{$cache_key}->{$segment} };
+
+    return $res ? {$self->header => $res} : {};
+}
+
+1;
+