annotate variant_effect_predictor/Bio/DB/GFF/RelSegment.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 =head1 NAME
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
2
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
3 Bio::DB::GFF::RelSegment -- Sequence segment with relative coordinate support
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
4
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
5 =head1 SYNOPSIS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
6
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
7 See L<Bio::DB::GFF>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
8
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
9 =head1 DESCRIPTION
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
10
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
11 Bio::DB::GFF::RelSegment is a stretch of sequence that can handle
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
12 relative coordinate addressing. It inherits from
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
13 Bio::DB::GFF::Segment, and is the base class for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
14 Bio::DB::GFF::Feature.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
15
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
16 In addition to the source sequence, a relative segment has a
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
17 "reference sequence", which is used as the basis for its coordinate
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
18 system. The reference sequence can be changed at will, allowing you
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
19 freedom to change the "frame of reference" for features contained
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
20 within the segment. For example, by setting a segment's reference
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
21 sequence to the beginning of a gene, you can view all other features
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
22 in gene-relative coordinates.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
23
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
24 The reference sequence and the source sequence must be on the same
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
25 physical stretch of DNA, naturally. However, they do not have to be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
26 on the same strand. The strandedness of the reference sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
27 determines whether coordinates increase to the right or the left.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
28
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
29 Generally, you will not create or manipulate Bio::DB::GFF::RelSeg0ment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
30 objects directly, but use those that are returned by the Bio::DB::GFF
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
31 module.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
32
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
33 =head2 An Example
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
34
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
35 To understand how relative coordinates work, consider the following
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
36 example from the C. elegans database. First we create the appropriate
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
37 GFF accessor object (the factory):
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
38
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
39 my $db = Bio::DB::GFF->new(-dsn => 'dbi:mysql:elegans',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
40 -adaptor=>'dbi:mysqlopt');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
41
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
42 Now we fetch out a segment based on cosmid clone ZK909:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
43
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
44 my $seg = $db->segment('ZK909');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
45
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
46 If we call the segment's refseq() method, we see that the base of the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
47 coordinate system is the sequence "ZK154", and that its start and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
48 stop positions are 1 and the length of the cosmid:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
49
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
50 print $seg->refseq;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
51 => ZK909
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
52
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
53 print $seg->start,' - ',$seg->stop;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
54 => 1 - 33782
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
55
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
56 As a convenience, the "" operator is overloaded in this class, to give
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
57 the reference sequence, and start and stop positions:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
58
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
59 print $seg;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
60 => ZK909:1,33782
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
61
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
62 Internally, Bio::DB::GFF::RelSegment has looked up the absolute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
63 coordinates of this segment and maintains the source sequence and the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
64 absolute coordinates relative to the source sequence. We can see this
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
65 information using sourceseq() (inherited from Bio::DB::GFF::Segment)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
66 and the abs_start() and abs_end() methods:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
67
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
68 print $seg->sourceseq;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
69 => CHROMOSOME_I
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
70
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
71 print $seg->abs_start,' - ',$seg->abs_end;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
72 => 14839545 - 14873326
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
73
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
74 We can also put the segment into absolute mode, so that it behaves
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
75 like Bio::DB::Segment, and always represents coordinates on the source
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
76 sequence. This is done by passing a true value to the absolute()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
77 method:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
78
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
79 $seq->absolute(1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
80 print $seg;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
81 => CHROMOSOME_I:14839545,14873326
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
82
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
83 We can change the reference sequence at any time. One way is to call
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
84 the segment's ref() method, giving it the ID (and optionally the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
85 class) of another landmark on the genome. For example, if we know
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
86 that cosmid ZK337 is adjacent to ZK909, then we can view ZK909 in
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
87 ZK337-relative coordinates:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
88
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
89 $seg->refseq('ZK337');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
90 print $seg;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
91 => ZK337:-33670,111
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
92
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
93 We can call the segment's features() method in order to get the list
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
94 of contigs that overlap this segment (in the C. elegans database,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
95 contigs have feature type "Sequence:Link"):
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
96
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
97 @links = $seg->features('Sequence:Link');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
98
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
99 We can now set the reference sequence to the first of these contigs like so:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
100
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
101 $seg->refseq($links[0]);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
102 print $seg;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
103 => Sequence:Link(LINK_Y95D11A):3997326,4031107
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
104
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
105 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
106
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
107 package Bio::DB::GFF::RelSegment;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
108
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
109 use strict;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
110
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
111 use Bio::DB::GFF::Feature;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
112 use Bio::DB::GFF::Util::Rearrange;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
113 use Bio::DB::GFF::Segment;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
114 use Bio::RangeI;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
115
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
116 use vars qw(@ISA);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
117 @ISA = qw(Bio::DB::GFF::Segment);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
118
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
119 use overload '""' => 'asString',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
120 'bool' => sub { overload::StrVal(shift) },
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
121 fallback=>1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
122
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
123 =head1 API
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
124
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
125 The remainder of this document describes the API for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
126 Bio::DB::GFF::Segment.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
127
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
128 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
129
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
130 =head2 new
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
131
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
132 Title : new
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
133 Usage : $s = Bio::DB::GFF::RelSegment->new(@args)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
134 Function: create a new relative segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
135 Returns : a new Bio::DB::GFF::RelSegment object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
136 Args : see below
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
137 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
138
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
139 This method creates a new Bio::DB::GFF::RelSegment object. Generally
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
140 this is called automatically by the Bio::DB::GFF module and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
141 derivatives.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
142
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
143 This function uses a named-argument style:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
144
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
145 -factory a Bio::DB::GFF::Adaptor to use for database access
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
146 -seq ID of the source sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
147 -class class of the source sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
148 -start start of the desired segment relative to source sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
149 -stop stop of the desired segment relative to source sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
150 -ref ID of the reference sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
151 -refclass class of the reference sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
152 -offset 0-based offset from source sequence to start of segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
153 -length length of desired segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
154 -absolute, -force_absolute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
155 use absolute coordinates, rather than coordinates relative
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
156 to the start of self or the reference sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
157
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
158 The -seq argument accepts the ID of any landmark in the database. The
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
159 stored source sequence becomes whatever the GFF file indicates is the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
160 proper sequence for this landmark. A class of "Sequence" is assumed
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
161 unless otherwise specified in the -class argument.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
162
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
163 If the argument to -seq is a Bio::GFF::Featname object (such as
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
164 returned by the group() method), then the class is taken from that.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
165
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
166 The optional -start and -stop arguments specify the end points for the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
167 retrieved segment. For those who do not like 1-based indexing,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
168 -offset and -length are provided. If both -start/-stop and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
169 -offset/-length are provided, the latter overrides the former.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
170 Generally it is not a good idea to mix metaphors.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
171
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
172 -ref and -refclass together indicate a sequence to be used for
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
173 relative coordinates. If not provided, the source sequence indicated
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
174 by -seq is used as the reference sequence. If the argument to -ref is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
175 a Bio::GFF::Featname object (such as returned by the group() method),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
176 then the class is taken from that.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
177
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
178 -force_absolute should be used if you wish to skip the lookup of the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
179 absolute position of the source sequence that ordinarily occurs when
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
180 you create a relative segment. In this case, the source sequence must
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
181 be a sequence that has been specified as the "source" in the GFF file.
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 # Create a new Bio::DB::GFF::RelSegment Object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
186 # arguments are:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
187 # -factory => factory and DBI interface
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
188 # -seq => $sequence_name
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
189 # -start => $start_relative_to_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
190 # -stop => $stop_relative_to_sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
191 # -ref => $sequence which establishes coordinate system
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
192 # -offset => 0-based offset relative to sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
193 # -length => length of segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
194 # -nocheck => turn off checking, force segment to be constructed
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
195 # -absolute => use absolute coordinate addressing
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
196 #'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
197 sub new {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
198 my $package = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
199 my ($factory,$name,$start,$stop,$refseq,$class,$refclass,$offset,$length,$force_absolute,$nocheck) =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
200 rearrange([
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
201 'FACTORY',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
202 [qw(NAME SEQ SEQUENCE SOURCESEQ)],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
203 [qw(START BEGIN)],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
204 [qw(STOP END)],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
205 [qw(REFSEQ REF REFNAME)],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
206 [qw(CLASS SEQCLASS)],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
207 qw(REFCLASS),
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
208 [qw(OFFSET OFF)],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
209 [qw(LENGTH LEN)],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
210 [qw(ABSOLUTE)],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
211 [qw(NOCHECK FORCE)],
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
212 ],@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
213
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
214 $package = ref $package if ref $package;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
215 $factory or $package->throw("new(): provide a -factory argument");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
216
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
217 # to allow people to use segments as sources
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
218 if (ref($name) && $name->isa('Bio::DB::GFF::Segment')) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
219 $start = 1 unless defined $start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
220 $stop = $name->length unless defined $stop;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
221 return $name->subseq($start,$stop);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
222 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
223
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
224 my @object_results;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
225
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
226 # support for Featname objects
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
227 if (ref($name) && $name->can('class')) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
228 $class = $name->class;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
229 $name = $name->name;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
230 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
231 # if the class of the landmark is not specified then default to 'Sequence'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
232 $class ||= eval{$factory->default_class} || 'Sequence';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
233
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
234 # confirm that indicated sequence is actually in the database!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
235 my @abscoords;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
236
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
237 # abscoords() will now return an array ref, each element of which is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
238 # ($absref,$absclass,$absstart,$absstop,$absstrand)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
239
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
240 if ($nocheck) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
241 $force_absolute++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
242 $start = 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
243 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
244
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
245 if ($force_absolute && defined($start)) { # absolute position is given to us
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
246 @abscoords = ([$name,$class,$start,$stop,'+']);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
247 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
248 my $result = $factory->abscoords($name,$class,$force_absolute ? $name : ()) or return;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
249 @abscoords = @$result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
250 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
251
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
252 foreach (@abscoords) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
253 my ($absref,$absclass,$absstart,$absstop,$absstrand,$sname) = @$_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
254 $sname = $name unless defined $sname;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
255 my ($this_start,$this_stop,$this_length) = ($start,$stop,$length);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
256
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
257 # partially fill in object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
258 my $self = bless { factory => $factory },$package;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
259
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
260 $absstrand ||= '+';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
261
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
262 # an explicit length overrides start and stop
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
263 if (defined $offset) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
264 warn "new(): bad idea to call new() with both a start and an offset"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
265 if defined $this_start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
266 $this_start = $offset+1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
267 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
268 if (defined $this_length) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
269 warn "new(): bad idea to call new() with both a stop and a length"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
270 if defined $this_stop;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
271 $this_stop = $this_start + $length - 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
272 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
273
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
274 # this allows a SQL optimization way down deep
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
275 $self->{whole}++ if $absref eq $sname and !defined($this_start) and !defined($this_stop);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
276
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
277 $this_start = 1 if !defined $this_start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
278 $this_stop = $absstop-$absstart+1 if !defined $this_stop;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
279 $this_length = $this_stop - $this_start + 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
280
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
281 # now offset to correct subsegment based on desired start and stop
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
282 if ($force_absolute) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
283 ($this_start,$this_stop) = ($absstart,$absstop);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
284 $self->absolute(1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
285 } elsif ($absstrand eq '+') {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
286 $this_start = $absstart + $this_start - 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
287 $this_stop = $this_start + $this_length - 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
288 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
289 $this_start = $absstop - ($this_start - 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
290 $this_stop = $absstop - ($this_stop - 1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
291 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
292
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
293 # handle truncation in either direction
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
294 # This only happens if the segment runs off the end of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
295 # the reference sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
296 if ($factory->strict_bounds_checking &&
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
297 (($this_start < $absstart) || ($this_stop > $absstop))) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
298 # return empty if we are completely off the end of the ref se
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
299 next unless $this_start<=$absstop && $this_stop>=$absstart;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
300 if (my $a = $factory->abscoords($absref,'Sequence')) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
301 my $refstart = $a->[0][2];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
302 my $refstop = $a->[0][3];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
303 if ($this_start < $refstart) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
304 $this_start = $refstart;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
305 $self->{truncated}{start}++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
306 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
307 if ($this_stop > $refstop) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
308 $this_stop = $absstop;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
309 $self->{truncated}{stop}++;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
310 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
311 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
312 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
313
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
314 @{$self}{qw(sourceseq start stop strand class)}
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
315 = ($absref,$this_start,$this_stop,$absstrand,$absclass);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
316
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
317 # handle reference sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
318 if (defined $refseq) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
319 $refclass = $refseq->class if $refseq->can('class');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
320 $refclass ||= 'Sequence';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
321 my ($refref,$refstart,$refstop,$refstrand) = $factory->abscoords($refseq,$refclass);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
322 unless ($refref eq $absref) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
323 $self->error("reference sequence is on $refref but source sequence is on $absref");
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
324 return;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
325 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
326 $refstart = $refstop if $refstrand eq '-';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
327 @{$self}{qw(ref refstart refstrand)} = ($refseq,$refstart,$refstrand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
328 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
329 $absstart = $absstop if $absstrand eq '-';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
330 @{$self}{qw(ref refstart refstrand)} = ($sname,$absstart,$absstrand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
331 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
332 push @object_results,$self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
333 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
334
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
335 return wantarray ? @object_results : $object_results[0];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
336 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
337
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
338 # overridden methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
339 # start, stop, length
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
340 sub start {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
341 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
342 return $self->strand < 0 ? $self->{stop} : $self->{start} if $self->absolute;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
343 $self->_abs2rel($self->{start});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
344 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
345 sub end {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
346 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
347 return $self->strand < 0 ? $self->{start} : $self->{stop} if $self->absolute;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
348 $self->_abs2rel($self->{stop});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
349 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
350 *stop = \&end;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
351
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
352 sub length {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
353 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
354 return unless defined $self->abs_end;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
355 abs($self->abs_end - $self->abs_start) + 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
356 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
357
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
358 sub abs_start {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
359 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
360 if ($self->absolute) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
361 my ($a,$b) = ($self->SUPER::abs_start,$self->SUPER::abs_end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
362 return ($a<$b) ? $a : $b;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
363 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
364 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
365 return $self->SUPER::abs_start(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
366 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
367 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
368 sub abs_end {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
369 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
370 if ($self->absolute) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
371 my ($a,$b) = ($self->SUPER::abs_start,$self->SUPER::abs_end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
372 return ($a>$b) ? $a : $b;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
373 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
374
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
375 else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
376 return $self->SUPER::abs_end(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
377 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
378 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
379
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
380 =head2 refseq
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
381
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
382 Title : refseq
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
383 Usage : $ref = $s->refseq([$newseq] [,$newseqclass])
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
384 Function: get/set reference sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
385 Returns : current reference sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
386 Args : new reference sequence and class (optional)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
387 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
388
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
389 This method will get or set the reference sequence. Called with no
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
390 arguments, it returns the current reference sequence. Called with
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
391 either a sequence ID and class, a Bio::DB::GFF::Segment object (or
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
392 subclass) or a Bio::DB::GFF::Featname object, it will set the current
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
393 reference sequence and return the previous one.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
394
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
395 The method will generate an exception if you attempt to set the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
396 reference sequence to a sequence that isn't contained in the database,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
397 or one that has a different source sequence from the segment.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
398
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
399 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
400
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
401 #'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
402 sub refseq {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
403 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
404 my $g = $self->{ref};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
405 if (@_) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
406 my ($newref,$newclass);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
407 if (@_ == 2) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
408 $newclass = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
409 $newref = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
410 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
411 $newref = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
412 $newclass = 'Sequence';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
413 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
414
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
415 defined $newref or $self->throw('refseq() called with an undef reference sequence');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
416
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
417 # support for Featname objects
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
418 $newclass = $newref->class if ref($newref) && $newref->can('class');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
419
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
420 # $self->throw("Cannot define a segment's reference sequence in terms of itself!")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
421 # if ref($newref) and overload::StrVal($newref) eq overload::StrVal($self);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
422
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
423 my ($refsource,undef,$refstart,$refstop,$refstrand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
424 if ($newref->isa('Bio::DB::GFF::RelSegment')) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
425 ($refsource,undef,$refstart,$refstop,$refstrand) =
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
426 ($newref->sourceseq,undef,$newref->abs_start,$newref->abs_end,$newref->abs_strand >= 0 ? '+' : '-');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
427 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
428 my $coords = $self->factory->abscoords($newref,$newclass);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
429 foreach (@$coords) { # find the appropriate one
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
430 ($refsource,undef,$refstart,$refstop,$refstrand) = @$_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
431 last if $refsource eq $self->{sourceseq};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
432 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
433
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
434 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
435 $self->throw("can't set reference sequence: $newref and $self are on different sequence segments")
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
436 unless $refsource eq $self->{sourceseq};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
437
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
438 @{$self}{qw(ref refstart refstrand)} = ($newref,$refstart,$refstrand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
439 $self->absolute(0);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
440 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
441 return $self->absolute ? $self->sourceseq : $g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
442 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
443
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
444
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
445 =head2 abs_low
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
446
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
447 Title : abs_low
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
448 Usage : $s->abs_low
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
449 Function: the absolute lowest coordinate of the segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
450 Returns : an integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
451 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
452 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
453
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
454 This is for GadFly compatibility, and returns the low coordinate in
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
455 absolute coordinates;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
456
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
457 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
458
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
459 sub abs_low {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
460 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
461 my ($a,$b) = ($self->abs_start,$self->abs_end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
462 return ($a<$b) ? $a : $b;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
463 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
464
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
465 =head2 abs_high
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
466
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
467 Title : abs_high
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
468 Usage : $s->abs_high
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
469 Function: the absolute highest coordinate of the segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
470 Returns : an integer
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
471 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
472 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
473
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
474 This is for GadFly compatibility, and returns the high coordinate in
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
475 absolute coordinates;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
476
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
477 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
478
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
479 sub abs_high {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
480 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
481 my ($a,$b) = ($self->abs_start,$self->abs_end);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
482 return ($a>$b) ? $a : $b;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
483 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
484
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
485
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
486 =head2 asString
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
487
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
488 Title : asString
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
489 Usage : $s->asString
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
490 Function: human-readable representation of the segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
491 Returns : a string
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
492 Args : none
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
493 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
494
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
495 This method will return a human-readable representation of the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
496 segment. It is the overloaded method call for the "" operator.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
497
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
498 Currently the format is:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
499
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
500 refseq:start,stop
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
501
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
502 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
503
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
504 sub asString {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
505 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
506 return $self->SUPER::asString if $self->absolute;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
507 my $label = $self->{ref};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
508 my $start = $self->start || '';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
509 my $stop = $self->stop || '';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
510 if (ref($label) && overload::StrVal($self) eq overload::StrVal($label->ref)) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
511 $label = $self->abs_ref;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
512 $start = $self->abs_start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
513 $stop = $self->abs_end;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
514 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
515 return "$label:$start,$stop";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
516 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
517
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
518 sub name { shift->asString }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
519
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
520 =head2 absolute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
521
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
522 Title : absolute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
523 Usage : $abs = $s->absolute([$abs])
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
524 Function: get/set absolute coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
525 Returns : a boolean flag
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
526 Args : new setting for flag (optional)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
527 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
528
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
529 Called with a boolean flag, this method controls whether to display
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
530 relative coordinates (relative to the reference sequence) or absolute
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
531 coordinates (relative to the source sequence). It will return the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
532 previous value of the setting.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
533
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
534 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
535
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
536 sub absolute {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
537 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
538 my $g = $self->{absolute};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
539 $self->{absolute} = shift if @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
540 $g;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
541 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
542
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
543 =head2 features
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
544
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
545 Title : features
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
546 Usage : @features = $s->features(@args)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
547 Function: get features that overlap this segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
548 Returns : a list of Bio::DB::GFF::Feature objects
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
549 Args : see below
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
550 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
551
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
552 This method will find all features that overlap the segment and return
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
553 a list of Bio::DB::GFF::Feature objects. The features will use
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
554 coordinates relative to the reference sequence in effect at the time
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
555 that features() was called.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
556
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
557 The returned list can be limited to certain types of feature by
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
558 filtering on their method and/or source. In addition, it is possible
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
559 to obtain an iterator that will step through a large number of
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
560 features sequentially.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
561
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
562 Arguments can be provided positionally or using the named arguments
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
563 format. In the former case, the arguments are a list of feature types
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
564 in the format "method:source". Either method or source can be
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
565 omitted, in which case the missing component is treated as a wildcard.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
566 If no colon is present, then the type is treated as a method name.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
567 Multiple arguments are ORed together.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
568
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
569 Examples:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
570
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
571 @f = $s->features('exon:curated'); # all curated exons
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
572 @f = $s->features('exon:curated','intron'); # curated exons and all introns
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
573 @f = $s->features('similarity:.*EST.*'); # all similarities
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
574 # having something to do
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
575 # with ESTs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
576
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
577 The named parameter form gives you control over a few options:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
578
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
579 -types an array reference to type names in the format
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
580 "method:source"
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
581
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
582 -merge Whether to apply aggregators to the generated features (default yes)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
583
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
584 -rare Turn on an optimization suitable for a relatively rare feature type,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
585 where it will be faster to filter by feature type first
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
586 and then by position, rather than vice versa.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
587
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
588 -attributes a hashref containing a set of attributes to match
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
589
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
590 -iterator Whether to return an iterator across the features.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
591
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
592 -binsize A true value will create a set of artificial features whose
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
593 start and stop positions indicate bins of the given size, and
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
594 whose scores are the number of features in the bin. The
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
595 class and method of the feature will be set to "bin",
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
596 its source to "method:source", and its group to "bin:method:source".
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
597 This is a handy way of generating histograms of feature density.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
598
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
599 -merge is a boolean flag that controls whether the adaptor's
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
600 aggregators wll be applied to the features returned by this method.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
601
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
602 If -iterator is true, then the method returns a single scalar value
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
603 consisting of a Bio::SeqIO object. You can call next_seq() repeatedly
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
604 on this object to fetch each of the features in turn. If iterator is
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
605 false or absent, then all the features are returned as a list.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
606
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
607 The -attributes argument is a hashref containing one or more
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
608 attributes to match against:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
609
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
610 -attributes => { Gene => 'abc-1',
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
611 Note => 'confirmed' }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
612
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
613 Attribute matching is simple string matching, and multiple attributes
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
614 are ANDed together.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
615
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
616 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
617
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
618 #'
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
619
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
620 # return all features that overlap with this segment;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
621 # optionally modified by a list of types to filter on
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
622 sub features {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
623 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
624 my @args = $self->_process_feature_args(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
625 return $self->factory->overlapping_features(@args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
626 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
627
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
628 =head2 top_SeqFeatures
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
629
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
630 Title : top_SeqFeatures
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
631 Usage :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
632 Function:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
633 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
634 Returns :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
635 Args :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
636
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
637 Alias for features(). Provided for Bio::SeqI compatibility.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
638
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
639 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
640
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
641 =head2 all_SeqFeatures
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
642
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
643 Title : all_SeqFeatures
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
644 Usage :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
645 Function:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
646 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
647 Returns :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
648 Args :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
649
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
650 Alias for features(). Provided for Bio::SeqI compatibility.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
651
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
652 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
653
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
654 =head2 sub_SeqFeatures
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
655
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
656 Title : sub_SeqFeatures
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
657 Usage :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
658 Function:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
659 Example :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
660 Returns :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
661 Args :
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
662
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
663 Alias for features(). Provided for Bio::SeqI compatibility.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
664
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
665 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
666
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
667 *top_SeqFeatures = *all_SeqFeatures = \&features;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
668
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
669 =head2 get_feature_stream
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
670
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
671 Title : features
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
672 Usage : $stream = $s->get_feature_stream(@args)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
673 Function: get a stream of features that overlap this segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
674 Returns : a Bio::SeqIO::Stream-compliant stream
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
675 Args : see below
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
676 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
677
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
678 This is the same as features(), but returns a stream. Use like this:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
679
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
680 $stream = $s->get_feature_stream('exon');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
681 while (my $exon = $stream->next_seq) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
682 print $exon->start,"\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
683 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
684
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
685 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
686
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
687 sub get_feature_stream {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
688 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
689 my @args = $_[0] =~ /^-/ ? (@_,-iterator=>1) : (-types=>\@_,-iterator=>1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
690 $self->features(@args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
691 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
692
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
693 =head2 get_seq_stream
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
694
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
695 Title : get_seq_stream
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
696 Usage : $stream = $s->get_seq_stream(@args)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
697 Function: get a stream of features that overlap this segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
698 Returns : a Bio::SeqIO::Stream-compliant stream
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
699 Args : see below
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
700 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
701
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
702 This is the same as feature_stream(), and is provided for Bioperl
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
703 compatibility. Use like this:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
704
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
705 $stream = $s->get_seq_stream('exon');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
706 while (my $exon = $stream->next_seq) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
707 print $exon->start,"\n";
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
708 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
709
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
710 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
711
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
712 *get_seq_stream = \&get_feature_stream;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
713
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
714
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
715 =head2 overlapping_features
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
716
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
717 Title : overlapping_features
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
718 Usage : @features = $s->overlapping_features(@args)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
719 Function: get features that overlap this segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
720 Returns : a list of Bio::DB::GFF::Feature objects
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
721 Args : see features()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
722 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
723
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
724 This is an alias for the features() method, and takes the same
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
725 arguments.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
726
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
727 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
728
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
729 *overlapping_features = \&features;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
730
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
731 =head2 contained_features
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
732
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
733 Title : contained_features
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
734 Usage : @features = $s->contained_features(@args)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
735 Function: get features that are contained by this segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
736 Returns : a list of Bio::DB::GFF::Feature objects
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
737 Args : see features()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
738 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
739
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
740 This is identical in behavior to features() except that it returns
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
741 only those features that are completely contained within the segment,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
742 rather than any that overlap.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
743
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
744 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
745
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
746 # return all features completely contained within this segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
747 sub contained_features {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
748 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
749 local $self->{whole} = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
750 my @args = $self->_process_feature_args(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
751 return $self->factory->contained_features(@args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
752 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
753
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
754 # *contains = \&contained_features;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
755
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
756 =head2 contained_in
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
757
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
758 Title : contained_in
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
759 Usage : @features = $s->contained_in(@args)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
760 Function: get features that contain this segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
761 Returns : a list of Bio::DB::GFF::Feature objects
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
762 Args : see features()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
763 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
764
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
765 This is identical in behavior to features() except that it returns
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
766 only those features that completely contain the segment.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
767
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
768 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
769
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
770 # return all features completely contained within this segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
771 sub contained_in {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
772 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
773 local $self->{whole} = 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
774 my @args = $self->_process_feature_args(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
775 return $self->factory->contained_in(@args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
776 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
777
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
778 =head2 _process_feature_args
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
779
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
780 Title : _process_feature_args
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
781 Usage : @args = $s->_process_feature_args(@args)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
782 Function: preprocess arguments passed to features,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
783 contained_features, and overlapping_features
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
784 Returns : a list of parsed arguents
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
785 Args : see feature()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
786 Status : Internal
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
787
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
788 This is an internal method that is used to check and format the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
789 arguments to features() before passing them on to the adaptor.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
790
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
791 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
792
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
793 sub _process_feature_args {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
794 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
795
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
796 my ($ref,$class,$start,$stop,$strand,$whole)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
797 = @{$self}{qw(sourceseq class start stop strand whole)};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
798
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
799 ($start,$stop) = ($stop,$start) if $strand eq '-';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
800
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
801 my @args = (-ref=>$ref,-class=>$class);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
802
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
803 # indicating that we are fetching the whole segment allows certain
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
804 # SQL optimizations.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
805 push @args,(-start=>$start,-stop=>$stop) unless $whole;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
806
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
807 if (@_) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
808 if ($_[0] =~ /^-/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
809 push @args,@_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
810 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
811 my @types = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
812 push @args,-types=>\@types;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
813 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
814 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
815 push @args,-parent=>$self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
816 @args;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
817 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
818
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
819 =head2 types
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
820
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
821 Title : types
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
822 Usage : @types = $s->types([-enumerate=>1])
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
823 Function: list feature types that overlap this segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
824 Returns : a list of Bio::DB::GFF::Typename objects or a hash
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
825 Args : see below
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
826 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
827
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
828 The types() method will return a list of Bio::DB::GFF::Typename
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
829 objects, each corresponding to a feature that overlaps the segment.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
830 If the optional -enumerate parameter is set to a true value, then the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
831 method will return a hash in which the keys are the type names and the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
832 values are the number of times a feature of that type is present on
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
833 the segment. For example:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
834
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
835 %count = $s->types(-enumerate=>1);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
836
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
837 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
838
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
839 # wrapper for lower-level types() call.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
840 sub types {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
841 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
842 my ($ref,$class,$start,$stop,$strand) = @{$self}{qw(sourceseq class start stop strand)};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
843 ($start,$stop) = ($stop,$start) if $strand eq '-';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
844
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
845 my @args;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
846 if (@_ && $_[0] !~ /^-/) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
847 @args = (-type => \@_)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
848 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
849 @args = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
850 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
851 $self->factory->types(-ref => $ref,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
852 -class => $class,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
853 -start=> $start,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
854 -stop => $stop,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
855 @args);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
856 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
857
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
858 =head1 Internal Methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
859
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
860 The following are internal methods and should not be called directly.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
861
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
862 =head2 new_from_segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
863
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
864 Title : new_from_segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
865 Usage : $s = $segment->new_from_segment(@args)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
866 Function: create a new relative segment
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
867 Returns : a new Bio::DB::GFF::RelSegment object
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
868 Args : see below
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
869 Status : Internal
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
870
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
871 This constructor is used internally by the subseq() method. It forces
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
872 the new segment into the Bio::DB::GFF::RelSegment package, regardless
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
873 of the package that it is called from. This causes subclass-specfic
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
874 information, such as feature types, to be dropped when a subsequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
875 is created.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
876
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
877 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
878
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
879 sub new_from_segment {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
880 my $package = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
881 $package = ref $package if ref $package;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
882 my $segment = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
883 my $new = {};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
884 @{$new}{qw(factory sourceseq start stop strand class ref refstart refstrand)}
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
885 = @{$segment}{qw(factory sourceseq start stop strand class ref refstart refstrand)};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
886 return bless $new,__PACKAGE__;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
887 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
888
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
889 =head2 _abs2rel
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
890
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
891 Title : _abs2rel
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
892 Usage : @coords = $s->_abs2rel(@coords)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
893 Function: convert absolute coordinates into relative coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
894 Returns : a list of relative coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
895 Args : a list of absolute coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
896 Status : Internal
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
897
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
898 This is used internally to map from absolute to relative
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
899 coordinates. It does not take the offset of the reference sequence
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
900 into account, so please use abs2rel() instead.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
901
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
902 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
903
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
904 sub _abs2rel {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
905 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
906 my @result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
907 return unless defined $_[0];
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
908
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
909 if ($self->absolute) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
910 @result = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
911 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
912 my ($refstart,$refstrand) = @{$self}{qw(refstart refstrand)};
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
913 @result = defined($refstrand) && $refstrand eq '-' ? map { $refstart - $_ + 1 } @_
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
914 : map { $_ - $refstart + 1 } @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
915 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
916 # if called with a single argument, caller will expect a single scalar reply
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
917 # not the size of the returned array!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
918 return $result[0] if @result == 1 and !wantarray;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
919 @result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
920 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
921
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
922 =head2 rel2abs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
923
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
924 Title : rel2abs
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
925 Usage : @coords = $s->rel2abs(@coords)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
926 Function: convert relative coordinates into absolute coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
927 Returns : a list of absolute coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
928 Args : a list of relative coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
929 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
930
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
931 This function takes a list of positions in relative coordinates to the
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
932 segment, and converts them into absolute coordinates.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
933
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
934 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
935
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
936 sub rel2abs {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
937 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
938 my @result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
939
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
940 if ($self->absolute) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
941 @result = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
942 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
943 my ($abs_start,$abs_strand) = ($self->abs_start,$self->abs_strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
944 @result = $abs_strand < 0 ? map { $abs_start - $_ + 1 } @_
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
945 : map { $_ + $abs_start - 1 } @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
946 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
947 # if called with a single argument, caller will expect a single scalar reply
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
948 # not the size of the returned array!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
949 return $result[0] if @result == 1 and !wantarray;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
950 @result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
951 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
952
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
953 =head2 abs2rel
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
954
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
955 Title : abs2rel
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
956 Usage : @rel_coords = $s-abs2rel(@abs_coords)
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
957 Function: convert absolute coordinates into relative coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
958 Returns : a list of relative coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
959 Args : a list of absolutee coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
960 Status : Public
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
961
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
962 This function takes a list of positions in absolute coordinates
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
963 and returns a list expressed in relative coordinates.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
964
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
965 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
966
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
967 sub abs2rel {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
968 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
969 my @result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
970
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
971 if ($self->absolute) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
972 @result = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
973 } else {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
974 my ($abs_start,$abs_strand) = ($self->abs_start,$self->abs_strand);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
975 @result = $abs_strand < 0 ? map { $abs_start - $_ + 1 } @_
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
976 : map { $_ - $abs_start + 1 } @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
977 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
978 # if called with a single argument, caller will expect a single scalar reply
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
979 # not the size of the returned array!
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
980 return $result[0] if @result == 1 and !wantarray;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
981 @result;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
982 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
983
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
984 sub subseq {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
985 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
986 my $obj = $self->SUPER::subseq(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
987 bless $obj,__PACKAGE__; # always bless into the generic RelSegment package
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
988 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
989
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
990 sub strand {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
991 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
992 if ($self->absolute) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
993 return _to_strand($self->{strand});
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
994 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
995 return $self->stop <=> $self->start;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
996 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
997
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
998 sub _to_strand {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
999 my $s = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1000 return -1 if $s eq '-';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1001 return +1 if $s eq '+';
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1002 return 0;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1003 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1004
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1005 =head2 Bio::RangeI Methods
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1006
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1007 The following Bio::RangeI methods are supported:
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1008
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1009 overlaps(), contains(), equals(),intersection(),union(),overlap_extent()
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1010
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1011 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1012
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1013 sub intersection {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1014 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1015 my (@ranges) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1016 unshift @ranges,$self if ref $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1017 $ranges[0]->isa('Bio::DB::GFF::RelSegment')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1018 or return $self->SUPER::intersection(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1019
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1020 my $ref = $ranges[0]->abs_ref;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1021 my ($low,$high);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1022 foreach (@ranges) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1023 return unless $_->can('abs_ref');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1024 $ref eq $_->abs_ref or return;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1025 $low = $_->abs_low if !defined($low) or $low < $_->abs_low;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1026 $high = $_->abs_high if !defined($high) or $high > $_->abs_high;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1027 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1028 return unless $low < $high;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1029 $self->new(-factory=> $self->factory,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1030 -seq => $ref,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1031 -start => $low,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1032 -stop => $high);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1033 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1034
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1035 sub overlaps {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1036 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1037 my($other,$so) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1038 return $self->SUPER::overlaps(@_) unless $other->isa('Bio::DB::GFF::RelSegment');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1039 return if $self->abs_ref ne $other->abs_ref;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1040 return if $self->abs_low > $other->abs_high;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1041 return if $self->abs_high < $other->abs_low;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1042 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1043 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1044
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1045 sub contains {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1046 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1047 my($other,$so) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1048 return $self->SUPER::overlaps(@_) unless $other->isa('Bio::DB::GFF::RelSegment');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1049 return if $self->abs_ref ne $other->abs_ref;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1050 return unless $self->abs_low <= $other->abs_low;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1051 return unless $self->abs_high >= $other->abs_high;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1052 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1053 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1054
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1055 sub union {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1056 my $self = shift;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1057 my (@ranges) = @_;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1058 unshift @ranges,$self if ref $self;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1059 $ranges[0]->isa('Bio::DB::GFF::RelSegment')
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1060 or return $self->SUPER::union(@_);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1061
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1062 my $ref = $ranges[0]->abs_ref;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1063 my ($low,$high);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1064 foreach (@ranges) {
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1065 return unless $_->can('abs_ref');
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1066 $ref eq $_->abs_ref or return;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1067 $low = $_->abs_low if !defined($low) or $low > $_->abs_low;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1068 $high = $_->abs_high if !defined($high) or $high < $_->abs_high;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1069 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1070 $self->new(-factory=> $self->factory,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1071 -seq => $ref,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1072 -start => $low,
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1073 -stop => $high);
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1074 }
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1075
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1076
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1077 1;
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1078
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1079 __END__
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1080
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1081 =head1 BUGS
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1082
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1083 Schemas need some work.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1084
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1085 =head1 SEE ALSO
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1086
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1087 L<bioperl>
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1088
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1089 =head1 AUTHOR
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1090
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1091 Lincoln Stein E<lt>lstein@cshl.orgE<gt>.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1092
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1093 Copyright (c) 2001 Cold Spring Harbor Laboratory.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1094
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1095 This library is free software; you can redistribute it and/or modify
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1096 it under the same terms as Perl itself.
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1097
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1098 =cut
21066c0abaf5 Uploaded
willmclaren
parents:
diff changeset
1099