annotate variant_effect_predictor/Bio/EnsEMBL/IndividualSlice.pm @ 0:2bc9b66ada89 draft default tip

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