diff variant_effect_predictor/Bio/EnsEMBL/Utils/Converter.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/Utils/Converter.pm	Thu Apr 11 02:01:53 2013 -0400
@@ -0,0 +1,213 @@
+=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 AUTHOR
+
+Juguang Xiao <juguang@tll.org.sg>
+
+=cut
+
+=head1 NAME
+
+Bio::EnsEMBL::Utils::Converter, a converter factory
+
+=head1 SYNOPSIS
+
+  my $converter = Bio::EnsEMBL::Utils::Converter->new(
+    -in  => 'Bio::SeqFeature::Generic',
+    -out => 'Bio::EnsEMBL::SimpleFeature'
+  );
+
+  my ( $fearture1, $feature2 );
+  my $ens_simple_features =
+    $converter->convert( [ $feature1, $feature2 ] );
+  my @ens_simple_features = @{$ens_simple_features};
+
+=head1 DESCRIPTION
+
+Module to converter the business objects between EnsEMBL and any other
+projects, currently BioPerl.
+
+What the ready conversions are,
+
+    Bio::SeqFeature::Generic <-> Bio::EnsEMBL::SeqFeature, Bio::EnsEMBL::SimpleFeature
+    Bio::SeqFeature::FeaturePair <-> Bio::EnsEMBL::SeqFeature, Bio::EnsEMBL::RepeatFeature
+    Bio::Search::HSP::GenericHSP -> Bio::EnsEMBL::BaseAlignFeature's submodules
+    Bio::Tools::Prediction::Gene -> Bio::EnsEMBL::PredictionTranscript
+    Bio::Tools::Prediction::Exon -> Bio::EnsEMBL::Exon
+    Bio::Pipeline::Analysis -> Bio::EnsEMBL::Analysis
+
+=head1 METHODS
+
+=cut
+
+
+package Bio::EnsEMBL::Utils::Converter;
+
+use strict;
+use Bio::EnsEMBL::Root;
+our @ISA =qw(Bio::EnsEMBL::Root);
+
+=head2 new
+
+  Title   : new
+  Usage   : 
+        my $converter = Bio::EnsEMBL::Utils::Converter->new(
+            -in => 'Bio::SeqFeature::Generic',
+             -out => 'Bio::EnsEMBL::SimpleFeature'
+         );
+
+  Function: constructor for converter object
+  Returns : L<Bio::EnsEMBL::Utils::Converter>
+  Args    : 
+    in - the module name of the input.
+    out - the module name of the output.
+    analysis - a Bio::EnsEMBL::Analysis object, if converting other objects to EnsEMBL features.
+    contig - a Bio::EnsEMBL::RawContig object, if converting other objects to EnsEMBL features.
+
+=cut
+
+sub new {
+    my ($caller, @args) = @_;
+    my $class = ref($caller) || $caller;
+    
+    if($class =~ /Bio::EnsEMBL::Utils::Converter::(\S+)/){
+        my $self = $class->SUPER::new(@args);
+        $self->_initialize(@args);
+        return $self;
+    }else{
+        my %params = @args;
+        @params{map {lc $_} keys %params} = values %params;
+        my $module = $class->_guess_module($params{-in}, $params{-out});
+
+        return undef unless($class->_load_module($module));
+        return "$module"->new(@args);
+    }
+}
+
+# This would be invoked by sub-module's _initialize.
+
+sub _initialize {
+    my ($self, @args) = @_;
+    
+    my ($in, $out) = $self->_rearrange([qw(IN OUT)], @args);
+
+    $self->in($in);
+    $self->out($out);
+}
+
+=head2 _guess_module
+  
+  Usage   : $module = $class->_guess_module(
+    'Bio::EnsEMBL::SimpleFeature',
+    'Bio::EnsEMBL::Generic'
+  );
+
+=cut
+
+sub _guess_module {
+    my ($self, $in, $out) = @_;
+    if($in =~ /^Bio::EnsEMBL::(\S+)/ and $out =~ /^Bio::EnsEMBL::(\S+)/){
+        $self->throw("Cannot convert between EnsEMBL objects.\n[$in] to [$out]");
+    }elsif($in =~ /^Bio::EnsEMBL::(\S+)/){
+        return 'Bio::EnsEMBL::Utils::Converter::ens_bio';
+    }elsif($out =~ /^Bio::EnsEMBL::(\S+)/){
+        return 'Bio::EnsEMBL::Utils::Converter::bio_ens';
+    }else{
+        $self->throw("Cannot convert between non-EnsEMBL objects.\n[$in] to [$out]");
+    }
+}
+
+=head2 convert
+    
+    Title   : convert
+    Usage   : my $array_ref = $converter->convert(\@input);
+    Function: does the actual conversion
+    Returns : an array ref of converted objects
+    Args    : an array ref of converting objects
+
+=cut
+
+sub convert{
+    my ($self, $input) = @_;
+
+    $input || $self->throw("Need a ref of array of input objects to convert");
+    
+    my $output_module = $self->out;
+    $self->throw("Cannot load [$output_module] perl module") 
+        unless $self->_load_module($output_module);
+
+    unless(ref($input) eq 'ARRAY'){
+        $self->warn("The input is supposed to be an array ref");
+        return $self->_convert_single($input);
+    }
+
+    my @output = ();
+    foreach(@{$input}){
+        push(@output, $self->_convert_single($_));
+    }
+
+    return \@output;
+}
+
+sub _convert_single{
+    shift->throw("Not implemented. Please check the instance subclass");
+}
+
+foreach my $field (qw(in out)){
+    my $slot=__PACKAGE__ ."::$field";
+    no strict 'refs';
+    *$field=sub{
+        my $self=shift;
+        $self->{$slot}=shift if @_;
+        return $self->{$slot};
+    };
+}
+
+=head2 _load_module
+  
+  This method is copied from Bio::Root::Root
+
+=cut
+
+sub _load_module {
+    my ($self, $name) = @_;
+    my ($module, $load, $m);
+    $module = "_<$name.pm";
+    return 1 if $main::{$module};
+
+    # untaint operation for safe web-based running (modified after a fix
+    # a fix by Lincoln) HL
+    if ($name !~ /^([\w:]+)$/) {
+        $self->throw("$name is an illegal perl package name");
+    }
+
+    $load = "$name.pm";
+    my $io = Bio::Root::IO->new();
+    # catfile comes from IO
+    $load = $io->catfile((split(/::/,$load)));
+    eval {
+        require $load;
+    };
+    if ( $@ ) {
+        $self->throw("Failed to load module $name. ".$@);
+    }
+    return 1;
+}
+
+1;