0
|
1 # $Id: CytoPosition.pm,v 1.4 2002/10/22 07:38:35 lapp Exp $
|
|
2 #
|
|
3 # BioPerl module for Bio::Map::CytoPosition
|
|
4 #
|
|
5 # Cared for by Heikki Lehvaslaiho <heikki@ebi.ac.uk>
|
|
6 #
|
|
7 # Copyright Heikki Lehvaslaiho
|
|
8 #
|
|
9 # You may distribute this module under the same terms as perl itself
|
|
10
|
|
11 # POD documentation - main docs before the code
|
|
12
|
|
13 =head1 NAME
|
|
14
|
|
15 Bio::Map::CytoPosition - Marker class with cytogenetic band storing attributes
|
|
16
|
|
17 =head1 SYNOPSIS
|
|
18
|
|
19 $m1 = Bio::Map::CytoPosition->new ( '-id' => 'A1',
|
|
20 '-value' => '2q1-3'
|
|
21 );
|
|
22 $m2 = Bio::Map::CytoPosition->new ( '-id' => 'A2',
|
|
23 '-value' => '2q2'
|
|
24 );
|
|
25
|
|
26 if ($m1->cytorange->overlaps($m2->cytorange)) {
|
|
27 print "Makers overlap\n";
|
|
28 }
|
|
29
|
|
30
|
|
31 =head1 DESCRIPTION
|
|
32
|
|
33 CytoPosition is marker (Bio::Map::MarkerI compliant) with a location in a
|
|
34 cytogenetic map. See L<Bio::Map::MarkerI> for more information.
|
|
35
|
|
36 Cytogenetic locations are names of bands visible in stained mitotic
|
|
37 eucaryotic chromosomes. The naming follows strict rules which are
|
|
38 consistant at least in higher vertebates, e.g. mammals. The chromosome
|
|
39 name preceds the band names.
|
|
40
|
|
41 The shorter arm of the chromosome is called 'p' ('petit') and usually
|
|
42 drawn pointing up. The lower arm is called 'q' ('queue'). The bands
|
|
43 are named from the region separting these, a centromere (cen), towards
|
|
44 the tips or telomeric regions (ter) counting from 1 upwards. Depending
|
|
45 of the resolution used the bands are identified with one or more
|
|
46 digit. The first digit determines the major band and subsequent digits
|
|
47 sub bands: p1 band can be divided into subbands p11, p12 and 13 and
|
|
48 p11 can furter be divided into subbands p11.1 and p11.2. The dot after
|
|
49 second digit makes it easier to read the values. A region between ands
|
|
50 is given from the centromere outwards towards the telomere (e.g. 2p2-5
|
|
51 or 3p21-35) or from a band in the p arm to a band in the q arm.
|
|
52
|
|
53 =head1 FEEDBACK
|
|
54
|
|
55 =head2 Mailing Lists
|
|
56
|
|
57 User feedback is an integral part of the evolution of this and other
|
|
58 Bioperl modules. Send your comments and suggestions preferably to the
|
|
59 Bioperl mailing lists Your participation is much appreciated.
|
|
60
|
|
61 bioperl-l@bioperl.org - General discussion
|
|
62 http://bio.perl.org/MailList.html - About the mailing lists
|
|
63
|
|
64 =head2 Reporting Bugs
|
|
65
|
|
66 report bugs to the Bioperl bug tracking system to help us keep track
|
|
67 the bugs and their resolution. Bug reports can be submitted via
|
|
68 email or the web:
|
|
69
|
|
70 bioperl-bugs@bio.perl.org
|
|
71 http://bugzilla.bioperl.org/
|
|
72
|
|
73 =head1 AUTHOR - Heikki Lehvaslaiho
|
|
74
|
|
75 Email: heikki@ebi.ac.uk
|
|
76 Address:
|
|
77
|
|
78 EMBL Outstation, European Bioinformatics Institute
|
|
79 Wellcome Trust Genome Campus, Hinxton
|
|
80 Cambs. CB10 1SD, United Kingdom
|
|
81
|
|
82
|
|
83 =head1 APPENDIX
|
|
84
|
|
85 The rest of the documentation details each of the object
|
|
86 methods. Internal methods are usually preceded with a _
|
|
87
|
|
88 =cut
|
|
89
|
|
90
|
|
91 # Let the code begin...
|
|
92
|
|
93 package Bio::Map::CytoPosition;
|
|
94 use vars qw(@ISA $VERSION);
|
|
95
|
|
96 use strict;
|
|
97 use integer;
|
|
98
|
|
99 $VERSION=1.0;
|
|
100
|
|
101 # Object preamble - inheritance
|
|
102
|
|
103 use Bio::Variation::VariantI;
|
|
104 use Bio::RangeI;
|
|
105 use Bio::Map::Position;
|
|
106
|
|
107 @ISA = qw( Bio::Map::Position Bio::Variation::VariantI );
|
|
108
|
|
109
|
|
110 =head2 cytorange
|
|
111
|
|
112 Title : cytorange
|
|
113 Usage : $obj->cytorange();
|
|
114 Function:
|
|
115
|
|
116 Converts cytogenetic location set by value method into
|
|
117 an integer range. The chromosome number determines the
|
|
118 "millions" in the values. Human X and Y chromosome
|
|
119 symbols are represented by values 100 and 101.
|
|
120
|
|
121 The localization within chromosomes are converted into
|
|
122 values between the range of 0 and 200,000:
|
|
123
|
|
124 pter cen qter
|
|
125 |------------------------|-------------------------|
|
|
126 0 100,000 200,000
|
|
127
|
|
128 The values between -100,000 through 0 for centromere to
|
|
129 100,000 would have reflected the band numbering better but
|
|
130 use of positive integers was choosen since the
|
|
131 transformation is very easy. These values are not metric.
|
|
132
|
|
133 Each band defines a range in a chromosome. A band string
|
|
134 is converted into a range by padding it with lower and and
|
|
135 higher end digits (for q arm: '0' and '9') to the length
|
|
136 of five. The arm and chromosome values are added to these:
|
|
137 e.g. 21000 & 21999 (band 21) + 100,000 (q arm) + 2,000,000
|
|
138 (chromosome 2) => 2q21 : 2,121,000 .. 2,121,999. Note that
|
|
139 this notation breaks down if there is a band or a subband
|
|
140 using digit 9 in its name! This is not the case in human
|
|
141 karyotype.
|
|
142
|
|
143 The full algorithm used for bands:
|
|
144
|
|
145 if arm is 'q' then
|
|
146 pad char for start is '0', for end '9'
|
|
147 range is chromosome + 100,000 + padded range start or end
|
|
148 elsif arm is 'p' then
|
|
149 pad char for start is '9', for end '0'
|
|
150 range is chromosome + 100,000 - padded range start or end
|
|
151
|
|
152 Example : Returns : Bio::Range object or undef
|
|
153 Args : none
|
|
154
|
|
155 =cut
|
|
156
|
|
157
|
|
158 sub cytorange {
|
|
159 my ($self) = @_;
|
|
160 my ($chr, $r, $band, $band2, $arm, $arm2, $lc, $uc, $lcchar, $ucchar) = undef;
|
|
161
|
|
162 return $r if not defined $self->value; # returns undef
|
|
163 $self->value =~
|
|
164 # -----1----- --------2--------- -----3----- -------4------- ---6---
|
|
165 m/([XY]|[0-9]+)(cen|qcen|pcen|[pq])?(ter|[.0-9]+)?-?([pq]?(cen|ter)?)?([.0-9]+)?/;
|
|
166 $self->warn("Not a valid value: ". $self->value), return $r
|
|
167 if not defined $1 ; # returns undef
|
|
168
|
|
169 $chr = uc $1;
|
|
170 $self->chr($chr);
|
|
171
|
|
172 $chr = 100 if $chr eq 'X';
|
|
173 $chr = 101 if $chr eq 'Y';
|
|
174 $chr *= 1000000;
|
|
175
|
|
176 $r = new Bio::Range();
|
|
177
|
|
178 $band = '';
|
|
179 if (defined $3 ) {
|
|
180 $2 || $self->throw("$& does not make sense: 'arm' or 'cen' missing");
|
|
181 $band = $3;
|
|
182 $band =~ tr/\.//d;
|
|
183 }
|
|
184 if (defined $6 ) {
|
|
185 $arm2 = $4;
|
|
186 $arm2 = $2 if $4 eq ''; # it is not necessary to repeat the arm [p|q]
|
|
187 $band2 = $6;
|
|
188 $band2 =~ tr/\.//d;
|
|
189 #find the correct order
|
|
190 # print STDERR "-|$&|----2|$2|-----3|$band|---4|$4|--------arm2|$arm2|-------------\n";
|
|
191 if ($band ne '' and (defined $arm2 and $2 ne $arm2 and $arm2 eq 'q') ) {
|
|
192 $lc = 'start'; $lcchar = '9';
|
|
193 $uc = 'end'; $ucchar = '9';
|
|
194 }
|
|
195 elsif ($band ne 'ter' and $2 ne $arm2 and $arm2 eq 'p') {
|
|
196 $lc = 'end'; $lcchar = '9';
|
|
197 $uc = 'start'; $ucchar = '9';
|
|
198 }
|
|
199 elsif ($band eq 'ter' and $arm2 eq 'p') {
|
|
200 $uc = 'start'; $ucchar = '9';
|
|
201 } # $2 eq $arm2
|
|
202 elsif ($arm2 eq 'q') {
|
|
203 if (_pad($band, 5, '0') < _pad($band2, 5, '0')) {
|
|
204 $lc = 'start'; $lcchar = '0';
|
|
205 $uc = 'end'; $ucchar = '9';
|
|
206 } else {
|
|
207 $lc = 'end'; $lcchar = '9';
|
|
208 $uc = 'start'; $ucchar = '0';
|
|
209 }
|
|
210 }
|
|
211 elsif ($arm2 eq 'p') {
|
|
212 if (_pad($band, 5, '0') < _pad($band2, 5, '0')) {
|
|
213 $lc = 'end'; $lcchar = '0';
|
|
214 $uc = 'start'; $ucchar = '9';
|
|
215 } else {
|
|
216 $lc = 'start'; $lcchar = '9';
|
|
217 $uc = 'end'; $ucchar = '0';
|
|
218 }
|
|
219 }
|
|
220 else {
|
|
221 $self->throw("How did you end up here? $&");
|
|
222 }
|
|
223
|
|
224 #print STDERR "-------$arm2--------$band2---------$ucchar--------------\n";
|
|
225 if ( (defined $arm2 and $arm2 eq 'p') or (defined $arm2 and $arm2 eq 'p') ) {
|
|
226 $r->$uc(-(_pad($band2, 5, $ucchar)) + 100000 + $chr );
|
|
227 if (defined $3 and $3 eq 'ter') {
|
|
228 $r->end(200000 + $chr);
|
|
229 }
|
|
230 elsif ($2 eq 'cen' or $2 eq 'qcen' or $2 eq 'pcen'){
|
|
231 $r->$lc(100000 + $chr);
|
|
232 }
|
|
233 elsif ($2 eq 'q') {
|
|
234 $r->$lc(_pad($band, 5, $lcchar) + 100000 + $chr );
|
|
235 } else {
|
|
236 $r->$lc(-(_pad($band, 5, $lcchar)) + 100000 + $chr );
|
|
237 }
|
|
238 } else { #if:$arm2=q e.g. 9p22-q32
|
|
239 #print STDERR "-------$arm2--------$band2---------$ucchar--------------\n";
|
|
240 $r->$uc(_pad($band2, 5, $ucchar) + 100000 + $chr);
|
|
241 if ($2 eq 'cen' or $2 eq 'pcen') {
|
|
242 $r->$lc(100000 + $chr);
|
|
243 }
|
|
244 elsif ($2 eq 'p') {
|
|
245 if ($3 eq 'ter') {
|
|
246 $r->$lc(200000 + $chr);
|
|
247 } else {
|
|
248 $r->$lc(-(_pad($band, 5, $lcchar)) + 100000 + $chr);
|
|
249 }
|
|
250 } else { #$2.==q
|
|
251 $r->$lc(_pad($band, 5, $lcchar) + 100000 + $chr);
|
|
252 }
|
|
253 }
|
|
254 }
|
|
255 #
|
|
256 # e.g. 10p22.1-cen
|
|
257 #
|
|
258 elsif (defined $4 and $4 ne '') {
|
|
259 #print STDERR "$4-----$&----\n";
|
|
260 if ($4 eq 'cen' || $4 eq 'qcen' || $4 eq 'pcen') { # e.g. 10p22.1-cen;
|
|
261 # '10pcen-qter' does not really make sense but lets have it in anyway
|
|
262 $r->end(100000 + $chr);
|
|
263 if ($2 eq 'p') {
|
|
264 if ($3 eq 'ter') {
|
|
265 $r->start($chr);
|
|
266 } else {
|
|
267 $r->start(_pad($band, 5, '9') + $chr);
|
|
268 }
|
|
269 }
|
|
270 elsif ($2 eq 'cen') {
|
|
271 $self->throw("'cen-cen' does not make sense: $&");
|
|
272 } else {
|
|
273 $self->throw("Only order p-cen is valid: $&");
|
|
274 }
|
|
275 }
|
|
276 elsif ($4 eq 'qter' || $4 eq 'ter') { # e.g. 10p22.1-qter, 1p21-qter, 10pcen-qter, 7q34-qter
|
|
277 $r->end(200000 + $chr);
|
|
278 if ($2 eq 'p'){
|
|
279 $r->start(-(_pad($band, 5, '9')) + 100000 + $chr); #??? OK?
|
|
280 }
|
|
281 elsif ($2 eq 'q') {
|
|
282 $r->start(_pad($band, 5, '0') + 100000 + $chr);
|
|
283 }
|
|
284 elsif ($2 eq 'cen' || $2 eq 'qcen' || $2 eq 'pcen' ) {
|
|
285 $r->start(100000 + $chr);
|
|
286 }
|
|
287 }
|
|
288 elsif ($4 eq 'pter' ) {
|
|
289 #print STDERR "$2,$3--$4-----$&----\n";
|
|
290 $r->start( $chr);
|
|
291 if ($2 eq 'p'){
|
|
292 $r->end(-(_pad($band, 5, '0')) + 100000 + $chr);
|
|
293 }
|
|
294 elsif ($2 eq 'q') {
|
|
295 $r->end(_pad($band, 5, '9') + 100000 + $chr);
|
|
296 }
|
|
297 elsif ($2 eq 'cen' || $2 eq 'qcen' || $2 eq 'pcen' ) {
|
|
298 $r->end(100000 + $chr);
|
|
299 }
|
|
300 } else { # -p or -q at the end of the range
|
|
301 $self->throw("lone '$4' in $& does not make sense");
|
|
302 }
|
|
303 }
|
|
304 #
|
|
305 # e.g 10p22.1, 10pter
|
|
306 #
|
|
307 elsif (defined $3 ) {
|
|
308 if ($2 eq 'p') {
|
|
309 if ($3 eq 'ter') { # e.g. 10pter
|
|
310 $r = new Bio::Range('-start' => $chr,
|
|
311 '-end' => $chr,
|
|
312 );
|
|
313 } else { # e.g 10p22.1
|
|
314 $r = new Bio::Range('-start' => -(_pad($band, 5, '9')) + 100000 + $chr,
|
|
315 '-end' => -(_pad($band, 5, '0')) + 100000 + $chr,
|
|
316 );
|
|
317 }
|
|
318 } elsif ($2 eq 'q') {
|
|
319 if ($3 eq 'ter') { # e.g. 10qter
|
|
320 $r = new Bio::Range('-start' => 200000 + $chr,
|
|
321 '-end' => 200000 + $chr,
|
|
322 );
|
|
323 } else { # e.g 10q22.1
|
|
324 $r = new Bio::Range('-start' => _pad($band, 5, '0') + 100000 + $chr,
|
|
325 '-end' => _pad($band, 5, '9') + 100000 + $chr,
|
|
326 );
|
|
327 }
|
|
328 } else { # e.g. 10qcen1.1 !
|
|
329 $self->throw("'cen' in $& does not make sense");
|
|
330 }
|
|
331 }
|
|
332 #
|
|
333 # e.g. 10p
|
|
334 #
|
|
335 elsif (defined $2 ) { # e.g. 10p
|
|
336 if ($2 eq'p' ) {
|
|
337 $r = new Bio::Range('-start' => $chr,
|
|
338 '-end' => 100000 + $chr
|
|
339 );
|
|
340 }
|
|
341 elsif ($2 eq'q' ) {
|
|
342 $r = new Bio::Range('-start' => 100000 + $chr,
|
|
343 '-end' => 200000 + $chr
|
|
344 );
|
|
345 } else { # $2 eq 'cen' || 'qcen'
|
|
346 $r = new Bio::Range('-start' => 100000 + $chr,
|
|
347 '-end' => 100000 + $chr
|
|
348 );
|
|
349 }
|
|
350 }
|
|
351 #
|
|
352 # chr only, e.g. X
|
|
353 #
|
|
354 else {
|
|
355 $r = new Bio::Range('-start' => $chr,
|
|
356 '-end' => 200000 + $chr
|
|
357 );
|
|
358 }
|
|
359 return $r;
|
|
360 }
|
|
361
|
|
362
|
|
363 sub _pad {
|
|
364 my ($string, $len, $pad_char) = @_;
|
|
365 die "function _pad needs a positive integer length, not [$len]"
|
|
366 unless $len =~ /^\+?\d+$/;
|
|
367 die "function _pad needs a single character pad_char, not [$pad_char]"
|
|
368 unless length $pad_char == 1;
|
|
369 $string ||= '';
|
|
370 # $padded = $text . $pad_char x ( $pad_len - length( $text ) );
|
|
371 return $string . $pad_char x ( $len - length( $string ) );
|
|
372
|
|
373 # my $slen = length $string;
|
|
374 # my $add = $len - $slen;
|
|
375 # return $string if $add <= 0;
|
|
376 # return $string .= $char x $add;
|
|
377 }
|
|
378
|
|
379
|
|
380 =head2 range2value
|
|
381
|
|
382 Title : range2value
|
|
383 Usage : $obj->range2value();
|
|
384 Function:
|
|
385
|
|
386 Sets and returns the value string based on start and end
|
|
387 values of the Bio::Range object passes as an argument.
|
|
388
|
|
389 Example :
|
|
390 Returns : string or false
|
|
391 Args : Bio::Range object
|
|
392
|
|
393 =cut
|
|
394
|
|
395 sub range2value {
|
|
396 my ($self,$value) = @_;
|
|
397 if( defined $value) {
|
|
398 if( ! $value->isa('Bio::Range') ) {
|
|
399 $self->throw("Is not a Bio::Range object but a [$value]");
|
|
400 return undef;
|
|
401 }
|
|
402 if( ! $value->start ) {
|
|
403 $self->throw("Start is not defined in [$value]");
|
|
404 return undef;
|
|
405 }
|
|
406 if( ! $value->end ) {
|
|
407 $self->throw("End is not defined in [$value]");
|
|
408 return undef;
|
|
409 }
|
|
410 if( $value->start < 100000 ) {
|
|
411 $self->throw("Start value has to be in millions, not ". $value->start);
|
|
412 return undef;
|
|
413 }
|
|
414 if( $value->end < 100000 ) {
|
|
415 $self->throw("End value has to be in millions, not ". $value->end);
|
|
416 return undef;
|
|
417 }
|
|
418
|
|
419 my ($chr, $arm, $band) = $value->start =~ /(\d+)(\d)(\d{5})/;
|
|
420 my ($chr2, $arm2, $band2) = $value->end =~ /(\d+)(\d)(\d{5})/;
|
|
421
|
|
422 #print STDERR join ("\t", $value->start, $value->end ),"\n";
|
|
423 #print STDERR join ("\t", $chr, $arm, $band, $chr2, $arm2, $band2), "\n";
|
|
424
|
|
425 my ($chrS, $armS, $bandS, $arm2S, $band2S, $sep) = ('', '', '', '', '', '' );
|
|
426 LOC: {
|
|
427 #
|
|
428 # chromosome
|
|
429 #
|
|
430 if ($chr == 100) {
|
|
431 $chrS = 'X';
|
|
432 }
|
|
433 elsif ($chr == 100) {
|
|
434 $chrS = 'Y';
|
|
435 } else {
|
|
436 $chrS = $chr;
|
|
437 }
|
|
438 last LOC if $arm == 0 and $arm2 == 2 and $band == 0 and $band2 == 0 ;
|
|
439 #
|
|
440 # arm
|
|
441 #
|
|
442 if ($arm == $arm2 ) {
|
|
443 if ($arm == 0) {
|
|
444 $armS = 'p';
|
|
445 #$armS = 'pter' if $band == 0 and $band2 == 0;
|
|
446 $bandS = 'ter' if $band == 0;
|
|
447 #$arm2S = 'p'; #?
|
|
448 }
|
|
449 elsif ($arm == 2) {
|
|
450 $armS = 'q';
|
|
451 $bandS = 'ter' if $band == 0;
|
|
452 } else {
|
|
453 $armS = 'q';
|
|
454 #$arm2S = 'q'; #?
|
|
455 $armS = 'cen', if $band == 0;# and $band2 == 0;
|
|
456 }
|
|
457 } else {
|
|
458 if ($arm == 0) {
|
|
459 $armS = 'p';
|
|
460 $arm2S = 'q';
|
|
461 $arm2S = '' if $band == 0 and $band2 == 0;
|
|
462 } else {
|
|
463 $armS = 'q';
|
|
464 $arm2S = 'p';
|
|
465 $arm2S = '' if $arm2 == 2 and $band == 0 and $band2 == 0;
|
|
466 }
|
|
467 }
|
|
468 last LOC if $band == $band2 ;
|
|
469 my $c;
|
|
470 #
|
|
471 # first band (ter is hadled with the arm)
|
|
472 #
|
|
473 if ($bandS ne 'ter') {
|
|
474 if ($armS eq 'p') {
|
|
475 $band = 100000 - $band;
|
|
476 $c = '9';
|
|
477 } else {
|
|
478 $c = '0';
|
|
479 }
|
|
480 $band =~ s/$c+$//;
|
|
481 $bandS = $band;
|
|
482 $bandS = substr($band, 0, 2). '.'. substr($band, 2) if length $band > 2;
|
|
483 }
|
|
484 last LOC unless $band2;
|
|
485 #
|
|
486 # second band
|
|
487 #
|
|
488 if ($arm2 == 0) {
|
|
489 $arm2S = 'p';
|
|
490 $band2 = 100000 - $band2;
|
|
491 $c = '0';
|
|
492 } else { # 1 or 2
|
|
493 $arm2S = 'q';
|
|
494 $c = '9';
|
|
495 }
|
|
496 if ($band2 == 0) {
|
|
497 if ($arm2 == 1) {
|
|
498 $arm2S = 'p';
|
|
499 $band2S = 'cen';
|
|
500 } else {
|
|
501 $band2S = 'ter';
|
|
502 }
|
|
503 last LOC;
|
|
504 }
|
|
505 last LOC if $band eq $band2 and $arm == $arm2;
|
|
506
|
|
507 $band2 =~ s/$c+$//;
|
|
508 $band2S = $band2;
|
|
509 $band2S = substr($band2, 0, 2). '.'. substr($band2, 2) if length $band2 > 2;
|
|
510
|
|
511 } # end of LOC:
|
|
512
|
|
513 if ($armS eq 'p' and $arm2S eq 'p') {
|
|
514 my $tmp = $band2S;
|
|
515 $band2S = $bandS;
|
|
516 $bandS = $tmp;
|
|
517 }
|
|
518 $band2S = '' if $bandS eq $band2S ;
|
|
519 $armS = '' if $bandS eq 'cen';
|
|
520 $arm2S = '' if $armS eq $arm2S and $band2S ne 'ter';
|
|
521 $sep = '-' if $arm2S || $band2S;
|
|
522 $self->value( $chrS. $armS. $bandS. $sep. $arm2S. $band2S);
|
|
523 }
|
|
524 return $self->value;
|
|
525 }
|
|
526
|
|
527 =head2 value
|
|
528
|
|
529 Title : value
|
|
530 Usage : my $pos = $position->value;
|
|
531 Function: Get/Set the value for this postion
|
|
532 Returns : scalar, value
|
|
533 Args : [optional] new value to set
|
|
534
|
|
535 =cut
|
|
536
|
|
537 sub value {
|
|
538 my ($self,$value) = @_;
|
|
539 if( defined $value ) {
|
|
540 $self->{'_value'} = $value;
|
|
541 $self->{'_numeric'} = $self->cytorange($value);
|
|
542 }
|
|
543 return $self->{'_value'};
|
|
544 }
|
|
545
|
|
546 =head2 numeric
|
|
547
|
|
548 Title : numeric
|
|
549 Usage : my $num = $position->numeric;
|
|
550 Function: Read-only method that is guarantied to return a numeric
|
|
551 representation for this position.
|
|
552
|
|
553 This instanse of the method can also be set, but you better
|
|
554 know what you are doing.
|
|
555
|
|
556 Returns : Bio::RangeI object
|
|
557 Args : optional Bio::RangeI object
|
|
558
|
|
559 See L<Bio::RangeI> for more information.
|
|
560
|
|
561 =cut
|
|
562
|
|
563 sub numeric {
|
|
564 my ($self, $value) = @_;
|
|
565
|
|
566 if ($value) {
|
|
567 $self->throw("This is not a Bio::RangeI object but a [$value]")
|
|
568 unless $value->isa('Bio::RangeI');
|
|
569 $self->{'_numeric'} = $value;
|
|
570 $self->{'_value'} = $self->range2value($value);
|
|
571 }
|
|
572 return $self->{'_numeric'};
|
|
573 }
|
|
574
|
|
575
|
|
576 =head2 chr
|
|
577
|
|
578 Title : chr
|
|
579 Usage : my $mychr = $position->chr();
|
|
580 Function: Get/Set method for the chromosome string of the location.
|
|
581 Returns : chromosome value
|
|
582 Args : [optional] new chromosome value
|
|
583
|
|
584 =cut
|
|
585
|
|
586 sub chr {
|
|
587 my ($self,$chr) = @_;
|
|
588 if( defined $chr ) {
|
|
589 $self->{'_chr'} = $chr;
|
|
590 }
|
|
591 return $self->{'_chr'};
|
|
592 }
|
|
593
|
|
594
|
|
595 1;
|