Raw content of Bio::EnsEMBL::IndividualSliceFactory
=head1 LICENSE
Copyright (c) 1999-2009 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
/info/about/code_licence.html
=head1 CONTACT
Please email comments or questions to the public Ensembl
developers list at .
Questions may also be sent to the Ensembl help desk at
.
=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 Data::Dumper;
=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'],@_);
return 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,
adaptor => $adaptor},$class;
}
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;