diff variant_effect_predictor/Bio/EnsEMBL/IndividualSliceFactory.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/IndividualSliceFactory.pm	Thu Apr 11 02:01:53 2013 -0400
@@ -0,0 +1,159 @@
+=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
+
+package Bio::EnsEMBL::IndividualSliceFactory;
+
+use strict;
+use Bio::EnsEMBL::Utils::Argument qw(rearrange);
+use Bio::EnsEMBL::Utils::Sequence qw(reverse_comp);
+use Bio::EnsEMBL::Slice;
+use Bio::EnsEMBL::Mapper;
+use Bio::EnsEMBL::Utils::Exception qw(throw deprecate warning);
+use Scalar::Util qw(weaken);
+
+=head2 new
+=cut
+
+sub new{
+    my $caller = shift;
+    my $class = ref($caller) || $caller;
+
+    #creates many IndividualSlice objects from the Population
+
+    my ($population_name, $coord_system, $start, $end, $strand, $seq_region_name, $seq_region_length, $adaptor) = rearrange(['POPULATION', 'COORD_SYSTEM','START','END','STRAND','SEQ_REGION_NAME','SEQ_REGION_LENGTH', 'ADAPTOR'],@_);
+
+    my $self = bless {
+	population_name => $population_name,
+	coord_system => $coord_system,
+	start => $start,
+	end => $end,
+	strand => $strand,
+	seq_region_name => $seq_region_name,
+	seq_region_length => $seq_region_length},$class;
+
+    $self->adaptor($adaptor);
+    return $self;
+}
+
+sub adaptor {
+  my $self = shift;
+
+  if(@_) {
+    my $ad = shift;
+    if($ad && (!ref($ad) || !$ad->isa('Bio::EnsEMBL::DBSQL::BaseAdaptor'))) {
+      throw('Adaptor argument must be a Bio::EnsEMBL::DBSQL::BaseAdaptor');
+    }
+    weaken($self->{'adaptor'} = $ad);
+  }
+
+  return $self->{'adaptor'}
+}
+
+sub get_all_IndividualSlice{
+    my $self = shift;
+
+    my $slice;
+    if(!$self->adaptor) {
+	warning('Cannot get IndividualSlice features without attached adaptor');
+	return '';
+    }
+    my $variation_db = $self->adaptor->db->get_db_adaptor('variation');
+
+    unless($variation_db) {
+	warning("Variation database must be attached to core database to " .
+		"retrieve variation information" );
+	return '';
+    }
+    #get the AlleleFeatures in the Population
+    my $af_adaptor = $variation_db->get_AlleleFeatureAdaptor;
+    
+    if( $af_adaptor ) {
+	#set the adaptor to retrieve data from genotype table
+	$af_adaptor->from_IndividualSlice(1);
+	#get the Individual for the given strain
+	my $population_adaptor = $variation_db->get_PopulationAdaptor;
+	my $individual_adaptor = $variation_db->get_IndividualAdaptor;
+	if ($population_adaptor && $individual_adaptor){
+	    $slice = Bio::EnsEMBL::Slice->new(-coord_system => $self->{'coord_system'},
+					      -start => $self->{'start'},
+					      -end => $self->{'end'},
+					      -strand => $self->{'strand'},
+					      -seq_region_name => $self->{'seq_region_name'},
+					      -seq_region_length => $self->{'seq_region_length'},
+					      -adaptor => $self->adaptor
+					      );
+	    my $population = $population_adaptor->fetch_by_name($self->{'population_name'}); 
+	    #check that there is such population in the database
+	    if (defined $population){
+		#get all the AlleleFeatures in the $population and the Slice given
+		my $allele_features = $af_adaptor->fetch_all_by_Slice($slice,$population);
+		#get Individuals in the Population
+		my $individuals = $individual_adaptor->fetch_all_by_Population($population);		
+		return $self->_rearrange_Individuals_Alleles($individuals,$allele_features);
+	    }
+	    else{ 
+		warning("Population not in the database");
+		return '';
+ 
+	    }
+	}
+	else{
+	    warning("Not possible to retrieve PopulationAdaptor from the variation database");
+	    return '';
+	}	
+    }
+    
+    else{
+	warning("Not possible to retrieve AlleleFeatureAdaptor from variation database");
+	return '';
+    }
+}
+
+sub _rearrange_Individuals_Alleles{
+    my $self = shift;
+    my $individuals = shift;
+    my $allele_features;
+    my $individual_slice;
+    #create the hash with all the individuals
+    my %individuals_ids;
+    #foreach of the individual, create the IndividualSlice object and add it to the mapping hash
+    foreach my $individual (@{$individuals}){
+	$individual_slice = Bio::EnsEMBL::Variation::IndividualSlice->new(
+	    -coord_system => $self->{'coord_system'},
+	    -start => $self->{'$start'},
+	    -end  => $self->{'end'},
+	    -strand => $self->{'strand'},
+	    -seq_region_name => $self->{'seq_region_name'},
+	    -seq_region_length => $self->{'seq_region_length'},
+	    -individual => $individual->name);
+	
+	$individuals_ids{$individual->dbID} = $individual_slice;
+    }
+
+    #and rearrange all the AlleleFeatures to the individuals
+    foreach my $allele_feature (@{$allele_features}){
+	$individuals_ids{$allele_feature->{'_sample_id'}}->add_AlleleFeature($allele_feature);
+    }
+    my @result = values %individuals_ids;
+    return \@result;
+}
+
+
+1;