annotate variant_effect_predictor/Bio/Coordinate/Pair.pm @ 1:d6778b5d8382 draft default tip

Deleted selected files
author willmclaren
date Fri, 03 Aug 2012 10:05:43 -0400
parents 21066c0abaf5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1 # $Id: Pair.pm,v 1.9.2.1 2003/02/20 05:11:45 heikki Exp $
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 # bioperl module for Bio::Coordinate::Pair
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5 # Cared for by Heikki Lehvaslaiho <heikki@ebi.ac.uk>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 # Copyright Heikki Lehvaslaiho
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8 #
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 # You may distribute this module under the same terms as perl itself
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 # POD documentation - main docs before the code
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15 Bio::Coordinate::Pair - Continuous match between two coordinate sets
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 use Bio::Location::Simple;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20 use Bio::Coordinate::Pair;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22 my $match1 = Bio::Location::Simple->new
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23 (-seq_id => 'propeptide', -start => 21, -end => 40, -strand=>1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24 my $match2 = Bio::Location::Simple->new
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 (-seq_id => 'peptide', -start => 1, -end => 20, -strand=>1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 my $pair = Bio::Coordinate::Pair->new(-in => $match1,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 -out => $match2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 # location to match
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 $pos = Bio::Location::Simple->new
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 (-start => 25, -end => 25, -strand=> -1 );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 # results are in a Bio::Coordinate::Result
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34 # they can be Matches and Gaps; are Bio::LocationIs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 $res = $pair->map($pos);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 $res->isa('Bio::Coordinate::Result');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 $res->each_match == 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38 $res->each_gap == 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 $res->each_Location == 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 $res->match->start == 5;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41 $res->match->end == 5;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42 $res->match->strand == -1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43 $res->match->seq_id eq 'peptide';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 This class represents a one continuous match between two coordinate
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49 systems represented by Bio::Location::Simple objects. The relationship
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 is directed and reversible. It implements methods to ensure internal
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51 consistency, and map continuous and split locations from one
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52 coordinate system to another.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 The map() method returns Bio::Coordinate::Results with
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55 Bio::Coordinate::Result::Gaps. The calling code have to deal (process
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 or ignore) them.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58 =head1 FEEDBACK
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 =head2 Mailing Lists
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 User feedback is an integral part of the evolution of this and other
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 Bioperl modules. Send your comments and suggestions preferably to the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64 Bioperl mailing lists Your participation is much appreciated.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 bioperl-l@bioperl.org - General discussion
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67 http://bio.perl.org/MailList.html - About the mailing lists
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 =head2 Reporting Bugs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 report bugs to the Bioperl bug tracking system to help us keep track
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 the bugs and their resolution. Bug reports can be submitted via
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73 email or the web:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 bioperl-bugs@bio.perl.org
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76 http://bugzilla.bioperl.org/
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78 =head1 AUTHOR - Heikki Lehvaslaiho
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80 Email: heikki@ebi.ac.uk
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 Address:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 EMBL Outstation, European Bioinformatics Institute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 Wellcome Trust Genome Campus, Hinxton
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 Cambs. CB10 1SD, United Kingdom
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 =head1 CONTRIBUTORS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 Additional contributors names and emails here
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 =head1 APPENDIX
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 The rest of the documentation details each of the object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 methods. Internal methods are usually preceded with a _
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 # Let the code begin...
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 package Bio::Coordinate::Pair;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 use vars qw(@ISA );
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 # Object preamble - inherits from Bio::Root::Root
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106 use Bio::Root::Root;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 use Bio::Coordinate::MapperI;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108 use Bio::Coordinate::Result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 use Bio::Coordinate::Result::Match;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110 use Bio::Coordinate::Result::Gap;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 @ISA = qw(Bio::Root::Root Bio::Coordinate::MapperI);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 my($class,@args) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 my $self = $class->SUPER::new(@args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 my($in, $out) =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 $self->_rearrange([qw(IN
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 OUT
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122 )],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 @args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 $in && $self->in($in);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 $out && $self->out($out);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127 return $self; # success - we hope!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 =head2 in
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 Title : in
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 Usage : $obj->in('peptide');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 Function: Set and read the input coordinate system.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 Returns : value of input system
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 Args : new value (optional), Bio::LocationI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 sub in {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 if( defined $value) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144 $self->throw("Not a valid input Bio::Location [$value] ")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145 unless $value->isa('Bio::LocationI');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 $self->{'_in'} = $value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148 return $self->{'_in'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 =head2 out
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154 Title : out
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 Usage : $obj->out('peptide');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 Function: Set and read the output coordinate system.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 Returns : value of output system
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 Args : new value (optional), Bio::LocationI
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163 sub out {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165 if( defined $value) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 $self->throw("Not a valid output coordinate Bio::Location [$value] ")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 unless $value->isa('Bio::LocationI');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 $self->{'_out'} = $value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 return $self->{'_out'};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 =head2 swap
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 Title : swap
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177 Usage : $obj->swap;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 Function: Swap the direction of mapping; input <-> output
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 Returns : 1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 Args :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
182
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
183 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
184
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
185 sub swap {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 ($self->{'_in'}, $self->{'_out'}) = ($self->{'_out'}, $self->{'_in'});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 return 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191 =head2 strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193 Title : strand
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 Usage : $obj->strand;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 Function: Get strand value for the pair
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 Returns : ( 1 | 0 | -1 )
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 Args :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 sub strand {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 $self->warn("Outgoing coordinates are not defined")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 unless $self->out;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206 $self->warn("Incoming coordinates are not defined")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 unless $self->in;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 return $self->in->strand * $self->out->strand;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 =head2 test
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 Title : test
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 Usage : $obj->test;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216 Function: test that both components are of the same length
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 Returns : ( 1 | undef )
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 Args :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223 sub test {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 my ($self) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225 $self->warn("Outgoing coordinates are not defined")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 unless $self->out;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227 $self->warn("Incoming coordinates are not defined")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 unless $self->in;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 1 if $self->in->end - $self->in->start == $self->out->end - $self->out->start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234 =head2 map
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236 Title : map
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 Usage : $newpos = $obj->map($pos);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 Function: Map the location from the input coordinate system
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239 to a new value in the output coordinate system.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241 Returns : new Bio::LocationI in the output coordinate system or undef
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 Args : Bio::LocationI object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 sub map {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 $self->throw("Need to pass me a value.")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 unless defined $value;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251 $self->throw("I need a Bio::Location, not [$value]")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 unless $value->isa('Bio::LocationI');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 $self->throw("Input coordinate system not set")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 unless $self->in;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 $self->throw("Output coordinate system not set")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256 unless $self->out;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259 if ($value->isa("Bio::Location::SplitLocationI")) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261 my $result = new Bio::Coordinate::Result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262 my $split = new Bio::Location::Split(-seq_id=>$self->out->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 foreach my $loc ( $value->sub_Location(1) ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265 my $res = $self->_map($loc);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266 map { $result->add_sub_Location($_) } $res->each_Location;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 return $result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 return $self->_map($value);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278 =head2 _map
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280 Title : _map
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281 Usage : $newpos = $obj->_map($simpleloc);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 Function: Internal method that does the actual mapping. Called
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283 multiple times by map() if the location to be mapped is a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284 split location
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286 Returns : new location in the output coordinate system or undef
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287 Args : Bio::Location::Simple
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 sub _map {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292 my ($self,$value) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 my $result = new Bio::Coordinate::Result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 my $offset = $self->in->start - $self->out->start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297 my $start = $value->start - $offset;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 my $end = $value->end - $offset;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300 my $match = Bio::Location::Simple->new;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 $match->location_type($value->location_type);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302 $match->strand($self->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 #within
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 # |-------------------------|
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306 # |-|
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 if ($start >= $self->out->start and $end <= $self->out->end) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 $match->seq_id($self->out->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 $result->seq_id($self->out->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312 if ($self->strand == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313 $match->start($start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314 $match->end($end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316 $match->start($self->out->end - $end + $self->out->start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 $match->end($self->out->end - $start + $self->out->start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 if ($value->strand) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 $match->strand($match->strand * $value->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 $result->strand($match->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 bless $match, 'Bio::Coordinate::Result::Match';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324 $result->add_sub_Location($match);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326 #out
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 # |-------------------------|
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 # |-| or |-|
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 elsif ( ($end < $self->out->start or $start > $self->out->end ) or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 #insertions just outside the range need special settings
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331 ($value->location_type eq 'IN-BETWEEN' and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 ($end = $self->out->start or $start = $self->out->end))) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334 $match->seq_id($self->in->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 $result->seq_id($self->in->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 $match->start($value->start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337 $match->end($value->end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338 $match->strand($value->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340 bless $match, 'Bio::Coordinate::Result::Gap';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341 $result->add_sub_Location($match);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 #partial I
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 # |-------------------------|
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 # |-----|
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346 elsif ($start < $self->out->start and $end <= $self->out->end ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 $result->seq_id($self->out->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349 if ($value->strand) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350 $match->strand($match->strand * $value->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351 $result->strand($match->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353 my $gap = Bio::Location::Simple->new;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354 $gap->start($value->start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 $gap->end($self->in->start - 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356 $gap->strand($value->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357 $gap->seq_id($self->in->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359 bless $gap, 'Bio::Coordinate::Result::Gap';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360 $result->add_sub_Location($gap);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362 # match
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363 $match->seq_id($self->out->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365 if ($self->strand == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366 $match->start($self->out->start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367 $match->end($end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369 $match->start($self->out->end - $end + $self->out->start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 $match->end($self->out->end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 bless $match, 'Bio::Coordinate::Result::Match';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373 $result->add_sub_Location($match);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 #partial II
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376 # |-------------------------|
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 # |------|
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378 elsif ($start >= $self->out->start and $end > $self->out->end ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380 $match->seq_id($self->out->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381 $result->seq_id($self->out->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 if ($value->strand) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 $match->strand($match->strand * $value->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 $result->strand($match->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386 if ($self->strand == 1) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387 $match->start($start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388 $match->end($self->out->end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 $match->start($self->out->start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 $match->end($self->out->end - $start + $self->out->start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393 bless $match, 'Bio::Coordinate::Result::Match';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394 $result->add_sub_Location($match);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 my $gap = Bio::Location::Simple->new;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 $gap->start($self->in->end + 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398 $gap->end($value->end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 $gap->strand($value->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400 $gap->seq_id($self->in->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401 bless $gap, 'Bio::Coordinate::Result::Gap';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402 $result->add_sub_Location($gap);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 #enveloping
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406 # |-------------------------|
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 # |---------------------------------|
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 elsif ($start < $self->out->start and $end > $self->out->end ) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 $result->seq_id($self->out->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411 if ($value->strand) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412 $match->strand($match->strand * $value->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413 $result->strand($match->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 # gap1
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416 my $gap1 = Bio::Location::Simple->new;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 $gap1->start($value->start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 $gap1->end($self->in->start - 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419 $gap1->strand($value->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 $gap1->seq_id($self->in->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421 bless $gap1, 'Bio::Coordinate::Result::Gap';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422 $result->add_sub_Location($gap1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424 # match
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425 $match->seq_id($self->out->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427 $match->start($self->out->start);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428 $match->end($self->out->end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429 bless $match, 'Bio::Coordinate::Result::Match';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430 $result->add_sub_Location($match);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432 # gap2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433 my $gap2 = Bio::Location::Simple->new;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434 $gap2->start($self->in->end + 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435 $gap2->end($value->end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436 $gap2->strand($value->strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
437 $gap2->seq_id($self->in->seq_id);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
438 bless $gap2, 'Bio::Coordinate::Result::Gap';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
439 $result->add_sub_Location($gap2);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
440
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442 $self->throw("Should not be here!");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444 return $result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448 1;