annotate Transcript.pm @ 1:4f6952e0af48 default tip

CREST - add crest.loc.sample
author Jim Johnson <jj@umn.edu>
date Wed, 08 Feb 2012 16:08:01 -0600
parents acc8d8bfeb9a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1 package Transcript;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
2 use strict;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
3 use Carp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
4 use Data::Dumper;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
5
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
6 # we are going to use a light weight Transcript model here
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
7 my @Transcript_slots;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
8 BEGIN {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
9 @Transcript_slots = qw(NAME REFSEQ_ID CHR START END STRAND CDS_START CDS_END EXONS TYPE);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
10 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
11 use enum @Transcript_slots;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
12
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
13 my %attribute = (
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
14 name => NAME,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
15 refseq_id => REFSEQ_ID,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
16 chr => CHR,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
17 start => START,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
18 end => END,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
19 strand => STRAND,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
20 cds_start => CDS_START,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
21 cds_end => CDS_END,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
22 exons => EXONS,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
23 type => TYPE,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
24 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
25
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
26 #using an array instead of a hash for the node
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
27 sub _accessor {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
28 my $index = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
29 return sub {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
30 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
31 return undef unless $self;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
32 if (@_) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
33 $self->[$index] = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
34 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
35 return $self->[$index];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
36 };
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
37 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
38
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
39 while(my($at, $idx) = each %attribute) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
40 no strict 'refs';
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
41 *$at = _accessor($idx);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
42 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
43
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
44 sub new {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
45 my $class = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
46 my $obj = [];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
47
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
48 if (@_) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
49 my %arg = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
50 $obj->[NAME] = $arg{-NAME} if($arg{-NAME});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
51 $obj->[REFSEQ_ID] = $arg{-REFSEQ_ID} if($arg{-REFSEQ_ID});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
52 $obj->[CHR] = $arg{-CHR} if($arg{-CHR});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
53 $obj->[START] = $arg{-START} if($arg{-START});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
54 $obj->[END] = $arg{-END} if($arg{-END});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
55 $obj->[STRAND] = $arg{-STRAND} if($arg{-STRAND});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
56 $obj->[CDS_START] = $arg{-CDS_START} if($arg{-CDS_START});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
57 $obj->[CDS_END] = $arg{-CDS_END} if($arg{-CDS_END});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
58 $obj->[EXONS] = $arg{-EXONS} if($arg{-EXONS});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
59 $obj->[TYPE] = $arg{-TYPE} if($arg{-TYPE});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
60 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
61 return bless $obj, $class;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
62 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
63
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
64 sub get_start {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
65 my ($self, $pos, $ext) = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
66 my @tmp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
67 foreach my $e( @{$self->[EXONS]} ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
68 if($e->[1] < $pos) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
69 push @tmp, $e;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
70 next;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
71 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
72 last;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
73 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
74 my $len = 0;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
75 while(scalar @tmp > 0) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
76 my $e = pop @tmp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
77 if($e->[1] >= $pos) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
78 my $l = $pos - $e->[0];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
79 if($l + $len < $ext) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
80 $len = $l;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
81 next;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
82 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
83 return $pos - $ext;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
84 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
85 if($e->[1] - $e->[0] + 1 + $len < $ext) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
86 $len += ($e->[1] - $e->[0] + 1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
87 next;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
88 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
89 return ($e->[1] - $ext + $len);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
90 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
91 return $self->start;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
92 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
93
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
94 sub get_end {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
95 my ($self, $pos, $ext) = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
96 my @tmp = @{$self->[EXONS]};
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
97 my $len = 0;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
98 while(scalar @tmp > 0) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
99 my $e = shift @tmp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
100 next if($e->[1] < $pos);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
101 if($e->[0] <= $pos ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
102 return $pos + $ext if($e->[1] - $pos >= $ext);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
103 $len = $e->[1] - $pos;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
104 next;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
105 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
106 if($e->[1] - $e->[0] + 1 + $len < $ext) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
107 $len += ($e->[1] - $e->[0] + 1);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
108 next;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
109 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
110 return ($e->[0] + $ext - $len);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
111 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
112 return $self->end;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
113 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
114
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
115 sub overlap {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
116 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
117 my $range = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
118 croak "Range must be a ref of array" unless(ref($range) eq 'ARRAY');
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
119
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
120 foreach my $e ( @{$self->[EXONS]} ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
121 return 1 if($e->[0] <= $range->[1] && $e->[1] >= $range->[0]);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
122 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
123 return;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
124 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
125
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
126 1;