annotate variant_effect_predictor/Bio/EnsEMBL/IndividualSlice.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 =head1 LICENSE
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 Genome Research Limited. All rights reserved.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 This software is distributed under a modified Apache license.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 For license details, please see
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9 http://www.ensembl.org/info/about/code_licence.html
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 =head1 CONTACT
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 Please email comments or questions to the public Ensembl
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14 developers list at <dev@ensembl.org>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16 Questions may also be sent to the Ensembl help desk at
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17 <helpdesk@ensembl.org>.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 Bio::EnsEMBL::IndividualSlice - SubClass of the Slice. Represents the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24 slice of the genome for a certain individual (applying the alleles for
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25 this individual)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 $sa = $db->get_SliceAdaptor;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 $slice =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32 $sa->fetch_by_region( 'chromosome', 'X', 1_000_000, 2_000_000 );
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34 $individualSlice = $slice->get_by_Individual($individual_name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36 # Get the sequence from the Individual Slice: will contain IUPAC codes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 # for SNPs and Ensembl ambiguity codes for indels
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38 my $seq = $individualSlice->seq();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39 print $seq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41 # Get a subSlice of the Strain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 my $subSlice_individual =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43 $individualSlice->sub_Slice( 5_000, 8_000, 1 )
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45 # Compare two different individuals in the same Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 my $sliceIndividual2 = $slice->get_by_Individual($individual_name2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47 my $differences =
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48 $individualSlice->get_all_differences_IndividualSlice(
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49 $sliceIndividual2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 foreach my $af ( @{$differences} ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 print
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53 "There is a difference between $individual_name "
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 . "and $individual_name2 at ",
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55 $af->start, "-", $af->end,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56 " with allele ", $af->allele_string(), "\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 A IndividualSlice object represents a region of a genome for a certain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62 individual. It can be used to retrieve sequence or features from a
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 individual.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65 =head1 METHODS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69 package Bio::EnsEMBL::IndividualSlice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 use vars qw(@ISA);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73 use Bio::EnsEMBL::Utils::Argument qw(rearrange);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 use Bio::EnsEMBL::Utils::Sequence qw(reverse_comp);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75 use Bio::EnsEMBL::Slice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 use Bio::EnsEMBL::Mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77 use Bio::EnsEMBL::Utils::Exception qw(throw deprecate warning);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79 @ISA = qw(Bio::EnsEMBL::Slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 =head2 new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 Arg [1..N] : List of named arguments
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85 Bio::EnsEMBL::CoordSystem COORD_SYSTEM
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 string SEQ_REGION_NAME,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87 int START,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88 int END,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 string VERSION (optional, defaults to '')
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90 int STRAND, (optional, defaults to 1)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 Bio::EnsEMBL::DBSQL::SliceAdaptor ADAPTOR (optional)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92 Arg[N+1] : string $individual_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93 Example : $individualSlice = Bio::EnsEMBL::IndividualSlice->new(-coord_system => $cs,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 -start => 1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 -end => 10000,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 -strand => 1,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 -seq_region_name => 'X',
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98 -seq_region_length => 12e6,
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 -individual_name => $individual_name);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100 Description : Creates a new Bio::EnsEMBL::IndividualSlice object that will contain a shallow copy of the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 Slice object, plus additional information such as the individual this Slice refers to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 and listref of Bio::EnsEMBL::Variation::AlleleFeatures of differences with the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103 reference sequence
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 ReturnType : Bio::EnsEMBL::IndividualSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110 sub new{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 my $caller = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112 my $class = ref($caller) || $caller;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 #create the IndividualSlice object as the Slice, plus the individual attribute
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115 my ($individual_name, $sample_id) = rearrange(['INDIVIDUAL', 'SAMPLE_ID'],@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 my $self = $class->SUPER::new(@_);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 $self->{'individual_name'} = $individual_name;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 $self->{'sample_id'} = $sample_id;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122 return $self;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 =head2 individual_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 Arg [1] : (optional) string $individual_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 Example : my $individual_name = $individualSlice->individual_name();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 Description : Getter/Setter for the name of the individual in the slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 ReturnType : string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137 sub individual_name{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139 if (@_){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140 $self->{'individual_name'} = shift @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 return $self->{'individual_name'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 =head2 seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147 Arg [1] : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 Example : print "SEQUENCE = ", $strainSlice->seq();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 Description: Returns the sequence of the region represented by this
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150 StrainSlice formatted as a string.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 Returntype : string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157 sub seq {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 # special case for in-between (insert) coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 return '' if($self->start() == $self->end() + 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 return $self->{'seq'} if($self->{'seq'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 if($self->adaptor()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 my $seqAdaptor = $self->adaptor()->db()->get_SequenceAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 my $reference_sequence = $seqAdaptor->fetch_by_Slice_start_end_strand($self,1,undef,1); #get the reference sequence for that slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 #apply all differences to the reference sequence
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 # sort edits in reverse order to remove complication of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 # adjusting downstream edits
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172 my @allele_features_ordered = sort {$b->start() <=> $a->start() || $b->end() <=> $a->end()} @{$self->{'alleleFeatures'}} if (defined $self->{'alleleFeatures'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174 foreach my $af (@allele_features_ordered){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 $af->apply_edit($reference_sequence); #change, in the reference sequence, the af
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 # return substr(${$reference_sequence},0,1) if ($self->length == 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 return ${$reference_sequence}; #returns the reference sequence, applying the alleleFeatures
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 # no attached sequence, and no db, so just return Ns
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182 return 'N' x $self->length();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 =head2 get_all_differences_Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188 Example : my $differences = $individualSlice->get_all_differences_Slice()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 Description : Gets all differences between the IndividualSlice object and the Slice is defined
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190 ReturnType : listref of Bio::EnsEMBL::Variation::AlleleFeature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 sub get_all_differences_Slice{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 my $differences; #reference to the array with the differences between Slice and StrainSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 my $ref_allele;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 foreach my $difference (@{$self->{'alleleFeatures'}}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 if ($difference->length_diff == 0){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 #the difference is a SNP, check if it is the same as the reference allele
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 $ref_allele = $self->SUPER::subseq($difference->start,$difference->end,$difference->strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 $ref_allele = '-' if ($ref_allele eq '');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 if ($ref_allele ne $difference->allele_string){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 #when the alleleFeature is different from the reference allele, add to the differences list
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 push @{$differences},$difference;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211 push @{$differences},$difference;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 return $differences;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 =head2 get_all_differences_IndividualSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 Arg[1] : Bio::EnsEMBL::IndividualSlice $is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222 Example : my $differences = $individualSlice->get_all_differences_IndividualSlice($individualslice)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 Description : Gets differences between 2 IndividualSlice objects
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 ReturnType : listref of Bio::EnsEMBL::Variation::AlleleFeature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 Exceptions : thrown on bad argument
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 sub get_all_differences_IndividualSlice{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 my $individualSlice = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234 if (!ref($individualSlice) || !$individualSlice->isa('Bio::EnsEMBL::IndividualSlice')){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 throw('Bio::EnsEMBL::IndividualSlice arg expected');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 if ( @{$self->{'alleleFeatures'}} == 0 && @{$individualSlice->{'alleleFeatures'}} == 0){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 return undef; #there are no differences in any of the Individuals
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241 my $differences; #differences between individuals
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 if (@{$individualSlice->{'alleleFeatures'}} == 0){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243 #need to create a copy of alleleFeature for the first Individual
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 foreach my $difference (@{$self->{'alleleFeatures'}}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245 my %vf = %$difference;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 push @{$differences},bless \%vf,ref($difference);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249 elsif (@{$self->{'alleleFeatures'}} == 0){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 #need to create a copy of AlleleFeature, but changing the allele by the allele in the reference sequence
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 foreach my $difference (@{$individualSlice->{'alleleFeatures'}}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252 push @{$differences}, $individualSlice->_convert_difference($difference);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 #both individuals have differences
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 #create a hash with the differences in the first slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 my %allele_features_self = map {$_->start.'-'.$_->end => $_} @{$self->{'alleleFeatures'}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 foreach my $difference (@{$individualSlice->{'alleleFeatures'}}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 #there is no difference in the other individual slice, convert the allele
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 if (!defined $allele_features_self{$difference->start.'-'.$difference->end}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 push @{$differences},$individualSlice->_convert_difference($difference);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 #if it is defined and have the same allele, delete from the hash since it is not a difference
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 #between the individuals
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 if ($allele_features_self{$difference->start.'-'.$difference->end}->allele_string eq $difference->allele_string){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 delete $allele_features_self{$difference->start.'-'.$difference->end};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272 #and finally, make a shallow copy of the differences in the first individual
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 foreach my $difference (values %allele_features_self){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 my %vf = %$difference;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 push @{$differences},bless \%vf,ref($difference);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 #need to map differences to the first individual, self, since the coordinates are in the Slice coordinate system
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 my $mapper = $self->mapper(); #now that we have the differences, map them in the IndividualSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 my @results;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 foreach my $difference (@{$differences}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283 @results = $mapper->map_coordinates('Slice',$difference->start,$difference->end,$difference->strand,'Slice');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 #we can have 3 possibilities:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285 #the difference is an insertion and when mapping returns the boundaries of the insertion in the IndividualSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 if (@results == 2){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 #the first position in the result is the beginning of the insertion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 if($results[0]->start < $results[1]->start){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 $difference->start($results[0]->end+1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 $difference->end($results[1]->start-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 #it is the second position the beginning of the insertion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294 $difference->start($results[1]->end+1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295 $difference->end($results[0]->start-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 $difference->strand($results[0]->strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 #it can be either a SNP or a deletion, and we have the coordinates in the result, etither a Bio::EnsEMBL::Mapper::Coordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 # or a Bio::EnsEMBL::Mapper::IndelCoordinate
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 $difference->start($results[0]->start);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 $difference->end($results[0]->end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 $difference->strand($results[0]->strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308 return $differences;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 #for a given AlleleFeature, converts the allele into the reference allele and returns
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 #the converted AlleleFeature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 sub _convert_difference{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 my $difference = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 my %new_af = %$difference; #make a copy of the alleleFeature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318 #and change the allele with the one from the reference Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 $new_af{'allele_string'} = $self->SUPER::subseq($difference->start,$difference->end,$difference->strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320 return bless \%new_af,ref($difference);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323 =head2 mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326 Description: Getter for the mapper between the between the IndividualSlice and the Slice it refers to.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 It is done automatically when necessary to create subSlice or to get the differences between individuals
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 Returntype : Bio::EnsEMBL::Mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330 Caller : Internal function
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 sub mapper{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 if (@_) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 #allow to create again the mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 delete $self->{'mapper'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 if(!defined $self->{'mapper'}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 #create the mapper between the Slice and StrainSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 my $mapper = Bio::EnsEMBL::Mapper->new('Slice','IndividualSlice');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 #align with Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345 #get all the VariationFeatures in the Individual Slice, from start to end in the Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 my @allele_features_ordered = sort {$a->start() <=> $b->start() || $b->end() <=> $a->end()} @{$self->{'alleleFeatures'}} if (defined $self->{'alleleFeatures'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 my $start_slice = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 my $end_slice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 my $start_individual = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 my $end_individual;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 my $length_allele;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 my $total_length_diff = 0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 #we will walk from left to right in the slice object, updating the start and end individual every time
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 #there is a new alleleFeature in the Individual
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 foreach my $allele_feature (@allele_features_ordered){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 #we have a insertion/deletion: marks the beginning of new slice move coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 if ($allele_feature->length_diff != 0){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 $total_length_diff += $allele_feature->length_diff;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 $length_allele = $allele_feature->length + $allele_feature->length_diff(); #length of the allele in the Individual
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 $end_slice = $allele_feature->start() - 1; #set the end of the slice before the alleleFeature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 if ($end_slice >= $start_slice){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 #normal cases (not with gaps)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 $end_individual = $end_slice - $start_slice + $start_individual; #set the end of the individual from the beginning plus the offset
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 #add the sequence that maps
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 $mapper->add_map_coordinates('Slice',$start_slice,$end_slice,1,'IndividualSlice',$start_individual,$end_individual);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 #and add the indel
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 $mapper->add_indel_coordinates('Slice',$end_slice+1,$end_slice + $allele_feature->length,1,'IndividualSlice',$end_individual+1,$end_individual + $length_allele);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 $start_individual = $end_individual + $length_allele + 1; #set the beginning of the individual after the allele
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 else{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 #add the indel
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 $mapper->add_indel_coordinates('Slice',$end_slice+1,$end_slice + $allele_feature->length,1,'IndividualSlice',$end_individual+1,$end_individual + $length_allele);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374 $start_individual += $length_allele;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 $start_slice = $end_slice + $allele_feature->length+ 1; #set the beginning of the slice after the variation feature
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 if ($start_slice <= $self->length){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 #if we haven't reached the end of the IndividualSlice, add the final map coordinates between the individual and the slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 $mapper->add_map_coordinates('Slice',$start_slice,$self->length,1,'IndividualSlice',$start_individual,$start_individual + $self->length - $start_slice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384 $mapper->add_map_coordinates('Slice', -$self->start+1, 0,1, 'IndividualSlice', -$self->start +1,0) if ($self->start > 0); #before individualSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385 $mapper->add_map_coordinates('Slice', $self->length + 1,$self->seq_region_length - ($self->length +1),1, 'IndividualSlice', $self->length + 1 + $total_length_diff,$self->seq_region_length + $total_length_diff - ($self->length +1) ) if ($self->length <= $self->seq_region_length); #after strainSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 $self->{'mapper'} = $mapper;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 return $self->{'mapper'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 =head2 sub_Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 Arg 1 : int $start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394 Arg 2 : int $end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395 Arge [3] : int $strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 Example : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 Description: Makes another IndividualSlice that covers only part of this IndividualSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 with the appropriate differences to the reference Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399 If a slice is requested which lies outside of the boundaries
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 of this function will return undef. This means that
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401 behaviour will be consistant whether or not the slice is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 attached to the database (i.e. if there is attached sequence
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403 to the slice). Alternatively the expand() method or the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404 SliceAdaptor::fetch_by_region method can be used instead.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 Returntype : Bio::EnsEMBL::IndividualSlice or undef if arguments are wrong
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 Exceptions : thrown when trying to get the subSlice in the middle of a
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 insertion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 sub sub_Slice {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 my ( $self, $start, $end, $strand ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414 my $mapper = $self->mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 #map from the Individual to the Slice to get the sub_Slice, and then, apply the differences in the subSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 my @results = $mapper->map_coordinates('IndividualSlice',$start,$end,$strand,'IndividualSlice');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 my $new_start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 my $new_end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419 my $new_strand;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 my $new_seq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421 #Get need start and end for the subSlice of the IndividualSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422 my @results_ordered = sort {$a->start <=> $b->start} grep {ref($_) eq 'Bio::EnsEMBL::Mapper::Coordinate'} @results;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423 $new_start = $results_ordered[0]->start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 $new_strand = $results_ordered[0]->strand() if (ref($results_ordered[0]) eq 'Bio::EnsEMBL::Mapper::Coordinate');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 # $new_strand = $results_ordered[-1]->strand() if (ref($results_ordered[-1]) eq 'Bio::EnsEMBL::Mapper::Coordinate');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 $new_end = $results_ordered[-1]->end(); #get last element of the array, the end of the slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428 my $subSlice = $self->SUPER::sub_Slice($new_start,$new_end,$new_strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 $subSlice->{'individual_name'} = $self->{'individual_name'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431 my $new_alleles; #reference to an array that will contain the variationFeatures in the new subSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 #update the VariationFeatures in the sub_Slice of the Individual
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433 my %af;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 my $new_allele_feature;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 foreach my $alleleFeature (@{$self->{'alleleFeatures'}}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436 $new_allele_feature = $alleleFeature->transfer($subSlice);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437 #only transfer the coordinates to the SubSlice that are within the boundaries
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438 if ($new_allele_feature->start >= 1 && $new_allele_feature->end <= $subSlice->length){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439 push @{$new_alleles}, $new_allele_feature;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 $subSlice->{'alleleFeatures'} = $new_alleles;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 return $subSlice;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447 =head2 subseq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449 Arg [1] : int $startBasePair
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 relative to start of slice, which is 1.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451 Arg [2] : int $endBasePair
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452 relative to start of slice.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 Arg [3] : (optional) int $strand
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 The strand of the individual slice to obtain sequence from. Default
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 value is 1.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 Description: returns string of dna sequence
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457 Returntype : txt
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 Exceptions : end should be at least as big as start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459 strand must be set
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 sub subseq {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 my ( $self, $start, $end, $strand ) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 if ( $end+1 < $start ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468 throw("End coord + 1 is less than start coord");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 # handle 'between' case for insertions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 return '' if( $start == $end + 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 $strand = 1 unless(defined $strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476 if ( $strand != -1 && $strand != 1 ) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477 throw("Invalid strand [$strand] in call to Slice::subseq.");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480 my $subseq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481 my $seq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482 if($self->adaptor){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483 my $seqAdaptor = $self->adaptor()->db()->get_SequenceAdaptor();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484 $subseq = ${$seqAdaptor->fetch_by_Slice_start_end_strand($self,$start,$end,$strand)}; #get the reference sequence for that slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485 #apply all differences to the reference sequence
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486 # sort edits in reverse order to remove complication of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487 # adjusting downstream edits
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488 my @allele_features_ordered = sort {$b->start() <=> $a->start() || $b->end() <=> $a->end()} @{$self->{'alleleFeatures'}} if (defined $self->{'alleleFeatures'});
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489 my $af_start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 my $af_end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491 foreach my $af (@allele_features_ordered){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492 if (($af->start - $start +1 > 0) && ($end - $af->end > 0)){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 #save the current start and end of the alleleFeature before changing for apply_edit
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494 $af_start = $af->start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495 $af_end = $af->end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496 #apply the difference if the feature is in the new slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497 $af->start($af->start - $start +1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498 $af->end($af->end - $start +1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499 $af->apply_edit(\$subseq); #change, in the reference sequence, the af
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500 #restore the initial values of alleleFeature start and end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501 $af->start($af_start);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502 $af->end($af_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507 else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508 ## check for gap at the beginning and pad it with Ns
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509 if ($start < 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510 $subseq = "N" x (1 - $start);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 $start = 1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513 $subseq .= substr ($self->seq(), $start-1, $end - $start + 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514 ## check for gap at the end and pad it with Ns
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515 if ($end > $self->length()) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 $subseq .= "N" x ($end - $self->length());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518 reverse_comp(\$subseq) if($strand == -1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520 return $subseq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524 =head2 get_all_Transcripts
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 Args : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 Example : @transcripts = @{$individualslice->get_all_Transcripts)};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528 Description: Gets all transcripts which overlap this Individual Slice. If you want to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529 specify a particular analysis or type, then you are better off
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 using get_all_Genes or get_all_Genes_by_type and iterating
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531 through the transcripts of each gene.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532 Returntype : reference to a list of Bio::EnsEMBL::Transcripts
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538 sub get_all_Transcripts {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541 my $transcripts = $self->SUPER::get_all_Transcripts(1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542 $self->map_to_Individual($transcripts);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 return $transcripts;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548 =head2 get_all_Exons
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550 Arg [1] : (optional) string $dbtype
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551 The dbtype of exons to obtain. This assumes that the db has
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 been added to the DBAdaptor under this name (using the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 DBConnection::add_db_adaptor method).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 Example : @exons = @{$individualSlice->get_all_Exons};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555 Description: Gets all exons which overlap this IndividualSlice. Note that these exons
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 will not be associated with any transcripts, so this may not
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 be terribly useful.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558 Returntype : reference to a list of Bio::EnsEMBL::Exons
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 sub get_all_Exons {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 my $dbtype = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568 my $exons = $self->SUPER::get_all_Exons($dbtype);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569 $self->map_to_Individual($exons); #map the exons to the Individual
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571 return $exons;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574 =head2 get_all_Genes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576 Arg [1] : (optional) string $logic_name
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577 The name of the analysis used to generate the genes to retrieve
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578 Arg [2] : (optional) string $dbtype
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579 The dbtype of genes to obtain. This assumes that the db has
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580 been added to the DBAdaptor under this name (using the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 DBConnection::add_db_adaptor method).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582 Example : @genes = @{$individualSlice->get_all_Genes};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583 Description: Retrieves all genes that overlap this slice.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 Returntype : listref of Bio::EnsEMBL::Genes
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585 Exceptions : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586 Caller : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590 sub get_all_Genes{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591 my ($self, $logic_name, $dbtype) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 my $genes = $self->SUPER::get_all_Genes($logic_name, $dbtype, 1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 $self->map_to_Individual($genes);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597 foreach my $gene (@{$genes}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 $self->map_to_Individual($gene->get_all_Exons); #map the Exons to the Individual
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 $self->map_to_Individual($gene->get_all_Transcripts); #map the Transcripts to the Individual
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602 return $genes;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605 =head2 map_to_Individual
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607 Arg[1] : ref $features
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608 Example : $individualSlice->map_to_Individual($exons);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609 Description : Gets the features from the Slice and maps it in the IndividualSlice, using the mapper
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610 between Slice and IndividualSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611 ReturnType : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612 Exceptions : None
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613 Caller : general
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617 sub map_to_Individual{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619 my $features = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621 my $mapper = $self->mapper();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622 my (@results, @results_ordered, $new_start, $new_end, $new_strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623 #foreach of the transcripts, map them to the IndividualSlice and replace the Slice with the IndividualSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624 foreach my $feature (@{$features}){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625 $feature->slice($self); #replace the IndividualSlice as the Slice for this feature (the Slice plus the AlleleFeatures)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626 #map from the Slice to the Individual Slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627 my @results = $mapper->map_coordinates('Slice',$feature->start,$feature->end,$feature->strand,'Slice');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
628 #from the results, order them but filter out those that are not coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
629 @results_ordered = sort {$a->start <=> $b->start} grep {ref($_) eq 'Bio::EnsEMBL::Mapper::Coordinate'} @results;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
630 $new_start = $results_ordered[0]->start();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
631 $new_strand = $results_ordered[0]->strand();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
632 $new_end = $results_ordered[-1]->end(); #get last element of the array, the end of the slice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
633 $feature->start($new_start); #update new coordinates
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
634 $feature->end($new_end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
635 $feature->strand($new_strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
636 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
637 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
638
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
639 sub alleleFeatures{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
640 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
641 return $self->{'alleleFeatures'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
642 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
643
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
644 sub add_AlleleFeature{
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
645 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
646
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
647 if (@_){
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
648 if(!ref($_[0]) || !$_[0]->isa('Bio::EnsEMBL::Variation::AlleleFeature')) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
649 throw("Bio::EnsEMBL::Variation::AlleleFeature argument expected");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
650 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
651 #add the alleleFeature to the individualSlice
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
652 push @{$self->{'alleleFeatures'}},shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
653 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
654 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
655 1;