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