Mercurial > repos > mahtabm > ensembl
comparison variant_effect_predictor/Bio/EnsEMBL/PaddedSlice.pm @ 0:1f6dce3d34e0
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 02:01:53 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1f6dce3d34e0 |
---|---|
1 =head1 LICENSE | |
2 | |
3 Copyright (c) 1999-2012 The European Bioinformatics Institute and | |
4 Genome Research Limited. All rights reserved. | |
5 | |
6 This software is distributed under a modified Apache license. | |
7 For license details, please see | |
8 | |
9 http://www.ensembl.org/info/about/code_licence.html | |
10 | |
11 =head1 CONTACT | |
12 | |
13 Please email comments or questions to the public Ensembl | |
14 developers list at <dev@ensembl.org>. | |
15 | |
16 Questions may also be sent to the Ensembl help desk at | |
17 <helpdesk@ensembl.org>. | |
18 | |
19 =cut | |
20 | |
21 =head1 NAME | |
22 | |
23 Bio::EnsEMBL::PaddedSlice | |
24 | |
25 =head1 DESCRIPTION | |
26 | |
27 Used when dumping Slices which represet a portion of the sequence region | |
28 they map to e.g. the first section of human Y. The code will return N | |
29 as sequence if an attempt is made to retrieve sequence not covered by the | |
30 Slice given. This makes the code very memory efficient if sequence dumping | |
31 is carried out using C<subseq()> calls. | |
32 | |
33 =head1 METHODS | |
34 | |
35 =cut | |
36 | |
37 package Bio::EnsEMBL::PaddedSlice; | |
38 | |
39 use Bio::EnsEMBL::Utils::Argument qw/rearrange/; | |
40 use Bio::EnsEMBL::Utils::Scalar qw/assert_ref assert_strand/; | |
41 use base qw/Bio::EnsEMBL::Utils::Proxy/; | |
42 | |
43 =head2 new() | |
44 | |
45 Arg [SLICE] : The Slice to proxy | |
46 Example : my $newobj = Bio::EnsEMBL::PaddedSlice->new($myobj); | |
47 Description : Provides a new instance of a padded slice | |
48 Returntype : Bio::EnsEMBL::PaddedSlice | |
49 Exceptions : None | |
50 Caller : public | |
51 Status : - | |
52 | |
53 =cut | |
54 | |
55 sub new { | |
56 my ($class, @args) = @_; | |
57 my ($slice) = rearrange([qw/slice/], @args); | |
58 return $class->SUPER::new($slice); | |
59 } | |
60 | |
61 =head2 start() | |
62 | |
63 Example : $slice->start(); | |
64 Description : Always returns 1 since all padded slices start at 1 | |
65 Returntype : Int | |
66 Exceptions : None | |
67 Caller : public | |
68 Status : - | |
69 | |
70 =cut | |
71 | |
72 sub start { | |
73 my ($self) = @_; | |
74 return 1; | |
75 } | |
76 | |
77 =head2 end() | |
78 | |
79 Example : $slice->end(); | |
80 Description : Always returns the backing slice sequence region length | |
81 Returntype : Int | |
82 Exceptions : None | |
83 Caller : public | |
84 Status : - | |
85 | |
86 =cut | |
87 | |
88 sub end { | |
89 my ($self) = @_; | |
90 return $self->seq_region_length(); | |
91 } | |
92 | |
93 =head2 length() | |
94 | |
95 Example : $slice->length(); | |
96 Description : Delegates to C<end()> | |
97 Returntype : Int | |
98 Exceptions : None | |
99 Caller : public | |
100 Status : - | |
101 | |
102 =cut | |
103 | |
104 sub length { | |
105 my ($self) = @_; | |
106 return $self->end(); | |
107 } | |
108 | |
109 =head2 seq() | |
110 | |
111 Example : my $seq = $slice->seq() | |
112 Description : Returns the entire sequence of the backing slice but padded | |
113 with N's at the beginning and the end of the slice where | |
114 applicable | |
115 Returntype : Scalar string | |
116 Exceptions : None | |
117 Caller : public | |
118 Status : - | |
119 | |
120 =cut | |
121 | |
122 sub seq { | |
123 my ($self) = @_; | |
124 my $parent_slice = $self->__proxy(); | |
125 my $pad_start = 'N' x ( $parent_slice->start() - 1 ); | |
126 my $pad_end = 'N' x ( $parent_slice->seq_region_length() - $parent_slice->end() ); | |
127 my $seq = $parent_slice->seq(); | |
128 return $pad_start . $seq . $pad_end; | |
129 } | |
130 | |
131 =head2 subseq() | |
132 | |
133 Arg [1] : Int; start position of the subslice | |
134 Arg [2] : Int; end position of the subslice | |
135 Arg [3] : Int; strand of the subslice | |
136 Example : my $subseq = $slice->subseq(1, 1_000_000); | |
137 Description : Returns a portion of the sequence padded with N's if required | |
138 Returntype : Scalar string | |
139 Exceptions : None | |
140 Caller : public | |
141 Status : - | |
142 | |
143 =cut | |
144 | |
145 sub subseq { | |
146 my ( $self, $start, $end, $strand ) = @_; | |
147 | |
148 if ( $end+1 < $start ) { | |
149 throw("End coord + 1 is less than start coord"); | |
150 } | |
151 | |
152 return '' if( $start == $end + 1); | |
153 | |
154 $strand = 1 unless(defined $strand); | |
155 assert_strand($strand, 'strand'); | |
156 | |
157 my $parent_slice = $self->__proxy(); | |
158 | |
159 #Coords relative to the SeqRegion i.e. huge | |
160 my $parent_start = $parent_slice->start(); | |
161 my $parent_end = $parent_slice->end(); | |
162 | |
163 #Return if we were upstream of overlap | |
164 if($start < $parent_start && $end < $parent_start) { | |
165 return N x (( $end - $start )+1); | |
166 } | |
167 #Return if we were downstream of overlap | |
168 if($start > $parent_end && $end > $parent_end) { | |
169 return N x (( $end - $start )+1); | |
170 } | |
171 | |
172 my $prefix = ''; | |
173 my $suffix = ''; | |
174 my $subslice_start = ($start - $parent_start)+1; | |
175 my $subslice_end = ($end - $parent_start) + 1; | |
176 if($start < $parent_start) { | |
177 $prefix = N x ($parent_start - $start); | |
178 $subslice_start = 1; | |
179 } | |
180 if($end > $parent_end) { | |
181 $suffix = N x ($end - $parent_end); | |
182 $subslice_end = (($parent_end - $parent_start)+1); | |
183 } | |
184 | |
185 my $subseq = $parent_slice->subseq($subslice_start, $subslice_end, $strand); | |
186 | |
187 return $prefix . $subseq . $suffix; | |
188 } | |
189 | |
190 =head2 subseq() | |
191 | |
192 Arg [1] : Int; start position of the subslice | |
193 Arg [2] : Int; end position of the subslice | |
194 Arg [3] : Int; strand of the subslice | |
195 Example : my $subseq = $slice->subseq(1, 1_000_000); | |
196 Description : Returns a portion of the sequence padded with N's if required | |
197 Returntype : Scalar string | |
198 Exceptions : None | |
199 Caller : public | |
200 Status : - | |
201 | |
202 =cut | |
203 | |
204 sub sub_Slice { | |
205 die "Unsupported"; | |
206 } | |
207 | |
208 | |
209 =head2 __resolver() | |
210 | |
211 Description : Delegates all non-overriden actions onto the backing slice | |
212 Returntype : CodeRef | |
213 Exceptions : None | |
214 Caller : public | |
215 Status : - | |
216 | |
217 =cut | |
218 | |
219 sub __resolver { | |
220 my ($self, $package_name, $method) = @_; | |
221 return sub { | |
222 my ($local_self, @args) = @_; | |
223 return $local_self->__proxy()->$method(@args); | |
224 }; | |
225 } | |
226 | |
227 | |
228 1; |