annotate variant_effect_predictor/Bio/DB/GFF/RelSegment.pm @ 3:d30fa12e4cc5 default tip

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