comparison variant_effect_predictor/Bio/EnsEMBL/IndividualSliceFactory.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1f6dce3d34e0
1 =head1 LICENSE
2
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
4 Genome Research Limited. All rights reserved.
5
6 This software is distributed under a modified Apache license.
7 For license details, please see
8
9 http://www.ensembl.org/info/about/code_licence.html
10
11 =head1 CONTACT
12
13 Please email comments or questions to the public Ensembl
14 developers list at <dev@ensembl.org>.
15
16 Questions may also be sent to the Ensembl help desk at
17 <helpdesk@ensembl.org>.
18
19 =cut
20
21 package Bio::EnsEMBL::IndividualSliceFactory;
22
23 use strict;
24 use Bio::EnsEMBL::Utils::Argument qw(rearrange);
25 use Bio::EnsEMBL::Utils::Sequence qw(reverse_comp);
26 use Bio::EnsEMBL::Slice;
27 use Bio::EnsEMBL::Mapper;
28 use Bio::EnsEMBL::Utils::Exception qw(throw deprecate warning);
29 use Scalar::Util qw(weaken);
30
31 =head2 new
32 =cut
33
34 sub new{
35 my $caller = shift;
36 my $class = ref($caller) || $caller;
37
38 #creates many IndividualSlice objects from the Population
39
40 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'],@_);
41
42 my $self = bless {
43 population_name => $population_name,
44 coord_system => $coord_system,
45 start => $start,
46 end => $end,
47 strand => $strand,
48 seq_region_name => $seq_region_name,
49 seq_region_length => $seq_region_length},$class;
50
51 $self->adaptor($adaptor);
52 return $self;
53 }
54
55 sub adaptor {
56 my $self = shift;
57
58 if(@_) {
59 my $ad = shift;
60 if($ad && (!ref($ad) || !$ad->isa('Bio::EnsEMBL::DBSQL::BaseAdaptor'))) {
61 throw('Adaptor argument must be a Bio::EnsEMBL::DBSQL::BaseAdaptor');
62 }
63 weaken($self->{'adaptor'} = $ad);
64 }
65
66 return $self->{'adaptor'}
67 }
68
69 sub get_all_IndividualSlice{
70 my $self = shift;
71
72 my $slice;
73 if(!$self->adaptor) {
74 warning('Cannot get IndividualSlice features without attached adaptor');
75 return '';
76 }
77 my $variation_db = $self->adaptor->db->get_db_adaptor('variation');
78
79 unless($variation_db) {
80 warning("Variation database must be attached to core database to " .
81 "retrieve variation information" );
82 return '';
83 }
84 #get the AlleleFeatures in the Population
85 my $af_adaptor = $variation_db->get_AlleleFeatureAdaptor;
86
87 if( $af_adaptor ) {
88 #set the adaptor to retrieve data from genotype table
89 $af_adaptor->from_IndividualSlice(1);
90 #get the Individual for the given strain
91 my $population_adaptor = $variation_db->get_PopulationAdaptor;
92 my $individual_adaptor = $variation_db->get_IndividualAdaptor;
93 if ($population_adaptor && $individual_adaptor){
94 $slice = Bio::EnsEMBL::Slice->new(-coord_system => $self->{'coord_system'},
95 -start => $self->{'start'},
96 -end => $self->{'end'},
97 -strand => $self->{'strand'},
98 -seq_region_name => $self->{'seq_region_name'},
99 -seq_region_length => $self->{'seq_region_length'},
100 -adaptor => $self->adaptor
101 );
102 my $population = $population_adaptor->fetch_by_name($self->{'population_name'});
103 #check that there is such population in the database
104 if (defined $population){
105 #get all the AlleleFeatures in the $population and the Slice given
106 my $allele_features = $af_adaptor->fetch_all_by_Slice($slice,$population);
107 #get Individuals in the Population
108 my $individuals = $individual_adaptor->fetch_all_by_Population($population);
109 return $self->_rearrange_Individuals_Alleles($individuals,$allele_features);
110 }
111 else{
112 warning("Population not in the database");
113 return '';
114
115 }
116 }
117 else{
118 warning("Not possible to retrieve PopulationAdaptor from the variation database");
119 return '';
120 }
121 }
122
123 else{
124 warning("Not possible to retrieve AlleleFeatureAdaptor from variation database");
125 return '';
126 }
127 }
128
129 sub _rearrange_Individuals_Alleles{
130 my $self = shift;
131 my $individuals = shift;
132 my $allele_features;
133 my $individual_slice;
134 #create the hash with all the individuals
135 my %individuals_ids;
136 #foreach of the individual, create the IndividualSlice object and add it to the mapping hash
137 foreach my $individual (@{$individuals}){
138 $individual_slice = Bio::EnsEMBL::Variation::IndividualSlice->new(
139 -coord_system => $self->{'coord_system'},
140 -start => $self->{'$start'},
141 -end => $self->{'end'},
142 -strand => $self->{'strand'},
143 -seq_region_name => $self->{'seq_region_name'},
144 -seq_region_length => $self->{'seq_region_length'},
145 -individual => $individual->name);
146
147 $individuals_ids{$individual->dbID} = $individual_slice;
148 }
149
150 #and rearrange all the AlleleFeatures to the individuals
151 foreach my $allele_feature (@{$allele_features}){
152 $individuals_ids{$allele_feature->{'_sample_id'}}->add_AlleleFeature($allele_feature);
153 }
154 my @result = values %individuals_ids;
155 return \@result;
156 }
157
158
159 1;