comparison variant_effect_predictor/Bio/Coordinate/ExtrapolatingPair.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 # $Id: ExtrapolatingPair.pm,v 1.6.2.1 2003/02/20 05:11:45 heikki Exp $
2 #
3 # bioperl module for Bio::Coordinate::ExtrapolatingPair
4 #
5 # Cared for by Heikki Lehvaslaiho <heikki@ebi.ac.uk>
6 #
7 # Copyright Heikki Lehvaslaiho
8 #
9 # You may distribute this module under the same terms as perl itself
10
11 # POD documentation - main docs before the code
12
13 =head1 NAME
14
15 Bio::Coordinate::ExtrapolatingPair - Continuous match between two coordinate sets
16
17 =head1 SYNOPSIS
18
19
20 use Bio::Location::Simple;
21 use Bio::Coordinate::ExtrapolatingPair;
22
23
24 $match1 = Bio::Location::Simple->new
25 (-seq_id => 'propeptide', -start => 21, -end => 40, -strand=>1 );
26 $match2 = Bio::Location::Simple->new
27 (-seq_id => 'peptide', -start => 1, -end => 20, -strand=>1 );
28
29 $pair = Bio::Coordinate::ExtrapolatingPair->
30 new(-in => $match1,
31 -out => $match2,
32 -strict => 1
33 );
34
35 $pos = Bio::Location::Simple->new
36 (-start => 40, -end => 60, -strand=> 1 );
37 $res = $pair->map($pos);
38 $res->start eq 20;
39 $res->end eq 20;
40
41 =head1 DESCRIPTION
42
43 This class represents a one continuous match between two coordinate
44 systems represented by Bio::Location::Simple objects. The relationship
45 is directed and reversible. It implements methods to ensure internal
46 consistency, and map continuous and split locations from one
47 coordinate system to another.
48
49 This class is an elaboration of Bio::Coordoinate::Pair. The map
50 function returns only matches which is the mode needed most of
51 tehtime. By default the matching regions between coordinate systems
52 are boundless, so that you can say e.g. that gene starts from here in
53 the chromosomal coordinate system and extends indefinetely in both
54 directions. If you want to define the matching regions exactly, you
55 can do that and set strict() to true.
56
57
58 =head1 FEEDBACK
59
60 =head2 Mailing Lists
61
62 User feedback is an integral part of the evolution of this and other
63 Bioperl modules. Send your comments and suggestions preferably to the
64 Bioperl mailing lists Your participation is much appreciated.
65
66 bioperl-l@bioperl.org - General discussion
67 http://bio.perl.org/MailList.html - About the mailing lists
68
69 =head2 Reporting Bugs
70
71 report bugs to the Bioperl bug tracking system to help us keep track
72 the bugs and their resolution. Bug reports can be submitted via email
73 or the web:
74
75 bioperl-bugs@bio.perl.org
76 http://bugzilla.bioperl.org/
77
78 =head1 AUTHOR - Heikki Lehvaslaiho
79
80 Email: heikki@ebi.ac.uk
81 Address:
82
83 EMBL Outstation, European Bioinformatics Institute
84 Wellcome Trust Genome Campus, Hinxton
85 Cambs. CB10 1SD, United Kingdom
86
87 =head1 APPENDIX
88
89 The rest of the documentation details each of the object
90 methods. Internal methods are usually preceded with a _
91
92 =cut
93
94
95 # Let the code begin...
96
97 package Bio::Coordinate::ExtrapolatingPair;
98 use vars qw(@ISA );
99 use strict;
100
101 # Object preamble - inherits from Bio::Root::Root
102 use Bio::Root::Root;
103 use Bio::LocationI;
104 use Bio::Coordinate::Pair;
105
106 @ISA = qw(Bio::Coordinate::Pair);
107
108
109 sub new {
110 my($class,@args) = @_;
111 my $self = $class->SUPER::new(@args);
112
113 my($strict) =
114 $self->_rearrange([qw(STRICT
115 )],
116 @args);
117
118 $strict && $self->strict($strict);
119 return $self;
120 }
121
122
123 =head2 strict
124
125 Title : strict
126 Usage : $obj->strict(1);
127 Function: Set and read the strictness of the coordinate system.
128 Example :
129 Returns : value of input system
130 Args : boolean
131
132 =cut
133
134 sub strict {
135 my ($self,$value) = @_;
136 if( defined $value) {
137 $self->{'_strict'} = 1 if $value;
138 }
139 return $self->{'_strict'};
140 }
141
142
143 =head2 map
144
145 Title : map
146 Usage : $newpos = $obj->map($loc);
147 Function: Map the location from the input coordinate system
148 to a new value in the output coordinate system.
149
150 In extrapolating coodinate system there is no location zero.
151 Locations are...
152 Example :
153 Returns : new location in the output coordinate system or undef
154 Args : Bio::Location::Simple
155
156 =cut
157
158 sub map {
159 my ($self,$value) = @_;
160
161 $self->throw("Need to pass me a value.")
162 unless defined $value;
163 $self->throw("I need a Bio::Location, not [$value]")
164 unless $value->isa('Bio::LocationI');
165 $self->throw("Input coordinate system not set")
166 unless $self->in;
167 $self->throw("Output coordinate system not set")
168 unless $self->out;
169
170 my $match;
171
172 if ($value->isa("Bio::Location::SplitLocationI")) {
173
174 my $split = Bio::Coordinate::Result->new(-seq_id=>$self->out->seq_id);
175 foreach my $loc ( sort { $a->start <=> $b->start }
176 $value->sub_Location ) {
177
178 $match = $self->_map($loc);
179 $split->add_sub_Location($match) if $match;
180
181 }
182 $split->each_Location ? (return $split) : (return undef) ;
183
184 } else {
185 return $self->_map($value);
186 }
187 }
188
189
190 =head2 _map
191
192 Title : _map
193 Usage : $newpos = $obj->_map($simpleloc);
194 Function: Internal method that does the actual mapping. Called
195 multiple times by map() if the location to be mapped is a
196 split location
197
198 Example :
199 Returns : new location in the output coordinate system or undef
200 Args : Bio::Location::Simple
201
202 =cut
203
204 sub _map {
205 my ($self,$value) = @_;
206
207 my ($offset, $start, $end);
208
209 if ($self->strand == -1) {
210 $offset = $self->in->end + $self->out->start;
211 $start = $offset - $value->end;
212 $end = $offset - $value->start ;
213 } else { # undef, 0 or 1
214 $offset = $self->in->start - $self->out->start;
215 $start = $value->start - $offset;
216 $end = $value->end - $offset;
217 }
218
219 # strict prevents matches outside stated range
220 if ($self->strict) {
221 return undef if $start < 0 and $end < 0;
222 return undef if $start > $self->out->end;
223 $start = 1 if $start < 0;
224 $end = $self->out->end if $end > $self->out->end;
225 }
226
227 my $match = Bio::Location::Simple->
228 new(-start => $start,
229 -end => $end,
230 -strand => $self->strand,
231 -seq_id => $self->out->seq_id,
232 -location_type => $value->location_type
233 );
234 $match->strand($match->strand * $value->strand) if $value->strand;
235 bless $match, 'Bio::Coordinate::Result::Match';
236
237 return $match;
238 }
239
240 1;