diff variant_effect_predictor/Bio/EnsEMBL/DBSQL/AssemblySliceAdaptor.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/DBSQL/AssemblySliceAdaptor.pm	Thu Apr 11 02:01:53 2013 -0400
@@ -0,0 +1,240 @@
+=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::DBSQL::AssemblySliceAdaptor - adaptor/factory for MappedSlices
+representing alternative assemblies
+
+=head1 SYNOPSIS
+
+  my $slice =
+    $slice_adaptor->fetch_by_region( 'chromosome', 14, 900000, 950000 );
+
+  my $msc = Bio::EnsEMBL::MappedSliceContainer->new( -SLICE => $slice );
+
+  my $asa = Bio::EnsEMBL::DBSQL::AssemblySliceAdaptor->new;
+
+  my ($mapped_slice) = @{ $asa->fetch_by_version( $msc, 'NCBIM36' ) };
+
+=head1 DESCRIPTION
+
+NOTE: this code is under development and not fully functional nor tested
+yet.  Use only for development.
+
+This adaptor is a factory for creating MappedSlices representing
+alternative assemblies and attaching them to a MappedSliceContainer. A
+mapper will be created to map between the reference slice and the common
+container slice coordinate system.
+
+=head1 METHODS
+
+  new
+  fetch_by_version
+
+=head1 REALTED MODULES
+
+  Bio::EnsEMBL::MappedSlice
+  Bio::EnsEMBL::MappedSliceContainer
+  Bio::EnsEMBL::Compara::AlignSlice
+  Bio::EnsEMBL::Compara::AlignSlice::Slice
+  Bio::EnsEMBL::AlignStrainSlice
+  Bio::EnsEMBL::StrainSlice
+
+=cut
+
+package Bio::EnsEMBL::DBSQL::AssemblySliceAdaptor;
+
+use strict;
+use warnings;
+no warnings 'uninitialized';
+
+use Bio::EnsEMBL::Utils::Argument qw(rearrange);
+use Bio::EnsEMBL::Utils::Exception qw(throw warning);
+use Bio::EnsEMBL::MappedSlice;
+use Bio::EnsEMBL::Mapper;
+use Bio::EnsEMBL::DBSQL::BaseAdaptor;
+
+our @ISA = qw(Bio::EnsEMBL::DBSQL::BaseAdaptor);
+
+
+=head2 new
+
+  Example     : my $assembly_slice_adaptor =
+                  Bio::EnsEMBL::DBSQL::AssemblySliceAdaptor->new;
+  Description : Constructor.
+  Return type : Bio::EnsEMBL::DBSQL::AssemblySliceAdaptor
+  Exceptions  : none
+  Caller      : general
+  Status      : At Risk
+              : under development
+
+=cut
+
+sub new {
+  my $caller = shift;
+
+  my $class = ref($caller) || $caller;
+  my $self = $class->SUPER::new(@_);
+  
+  return $self;
+}
+
+
+=head2 fetch_by_version
+
+  Arg[1]      : Bio::EnsEMBL::MappedSliceContainer $container - the container
+                  to attach MappedSlices to
+  Arg[2]      : String $version - the assembly version to fetch
+  Example     : my ($mapped_slice) = @{ $msc->fetch_by_version('NCBIM36') };
+  Description : Creates a MappedSlice representing an alternative assembly
+                version of the container's reference slice.
+  Return type : listref of Bio::EnsEMBL::MappedSlice
+  Exceptions  : thrown on wrong or missing arguments
+  Caller      : general, Bio::EnsEMBL::MappedSliceContainer
+  Status      : At Risk
+              : under development
+
+=cut
+
+sub fetch_by_version {
+  my $self = shift;
+  my $container = shift;
+  my $version = shift;
+
+  # arguement check
+  unless ($container and ref($container) and
+          $container->isa('Bio::EnsEMBL::MappedSliceContainer')) {
+    throw("Need a MappedSliceContainer.");
+  }
+
+  unless ($version) {
+    throw("Need an assembly version.");
+  }
+
+  my $slice = $container->ref_slice;
+
+  # project slice onto other assembly and construct MappedSlice for result
+  my $mapped_slice = Bio::EnsEMBL::MappedSlice->new(
+      -ADAPTOR   => $self,
+      -CONTAINER => $container,
+      -NAME      => $slice->name."\#mapped_$version",
+  );
+
+  my $cs_name = $slice->coord_system_name;
+
+  foreach my $seg (@{ $slice->project($cs_name, $version) }) {
+  
+    my $proj_slice = $seg->to_Slice;
+    
+    # create a Mapper to map to/from the mapped_slice artificial coord system
+    my $mapper = Bio::EnsEMBL::Mapper->new('mapped_slice', 'native_slice');  
+    
+    # tell the mapper how to map this segment
+    $mapper->add_map_coordinates(
+        'mapped_slice',
+        $seg->from_start,
+        $seg->from_end,
+        ($slice->strand * $proj_slice->strand),
+        $proj_slice->seq_region_name,
+        $proj_slice->start,
+        $proj_slice->end
+    );
+    
+    # add the Slice/Mapper pair to the MappedSlice
+    $mapped_slice->add_Slice_Mapper_pair($proj_slice, $mapper);
+  }
+
+  return [$mapped_slice];
+}
+
+
+=head2 fetch_by_name
+
+  Arg[1]      : Bio::EnsEMBL::MappedSliceContainer $container - the container
+                  to attach MappedSlices to
+  Arg[2]      : String $name - the assembly name to fetch
+  Arg[3]      : (optional) String $version -- the version for the new assembly
+  Example     : my ($mapped_slice) = @{ $msc->fetch_by_name('LRG1','1') };
+  Description : Creates a MappedSlice representing an alternative assembly
+                version of the container's reference slice.
+  Return type : listref of Bio::EnsEMBL::MappedSlice
+  Exceptions  : thrown on wrong or missing arguments
+  Caller      : general, Bio::EnsEMBL::MappedSliceContainer
+  Status      : At Risk
+              : under development
+
+=cut
+
+sub fetch_by_name {
+  my $self = shift;
+  my $container = shift;
+  my $name = shift;
+  my $version = shift; 
+
+  # arguement check
+  unless ($container and ref($container) and
+          $container->isa('Bio::EnsEMBL::MappedSliceContainer')) {
+    throw("Need a MappedSliceContainer.");
+  }
+
+  unless ($name) {
+    throw("Need an assembly name.");
+  }
+
+  $version ||= '';
+  my $slice = $container->ref_slice;
+
+  # project slice onto other assembly and construct MappedSlice for result
+  my $mapped_slice = Bio::EnsEMBL::MappedSlice->new(
+      -ADAPTOR   => $self,
+      -CONTAINER => $container,
+      -NAME      => $slice->name."\#mapped_$name:$version",
+  );
+
+
+  foreach my $seg (@{ $slice->project($name, $version) }) {
+  
+    my $proj_slice = $seg->to_Slice;
+    
+    # create a Mapper to map to/from the mapped_slice artificial coord system
+    my $mapper = Bio::EnsEMBL::Mapper->new('mapped_slice', 'native_slice');  
+    
+    # tell the mapper how to map this segment
+    $mapper->add_map_coordinates(
+        'mapped_slice',
+        $seg->from_start,
+        $seg->from_end,
+        ($slice->strand * $proj_slice->strand),
+        $proj_slice->seq_region_name,
+        $proj_slice->start,
+        $proj_slice->end
+    );
+    
+    # add the Slice/Mapper pair to the MappedSlice
+    $mapped_slice->add_Slice_Mapper_pair($proj_slice, $mapper);
+  }
+
+  return [$mapped_slice];
+}
+
+
+1;
+