annotate Gene.pm @ 0:acc8d8bfeb9a

Uploaded
author jjohnson
date Wed, 08 Feb 2012 16:59:24 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
1 package Gene;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
2 use strict;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
3 use Transcript;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
4 use Carp;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
5 use Data::Dumper;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
6
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
7 # a light weight gene structure is used here
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
8
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
9 my @Gene_slots;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
10 BEGIN {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
11 @Gene_slots = qw(NAME CHR START END STRAND EXONS TRANSCRIPTS TYPE);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
12 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
13 use enum @Gene_slots;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
14
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
15 my %attribute = (
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
16 name => NAME,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
17 chr => CHR,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
18 start => START,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
19 end => END,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
20 strand => STRAND,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
21 transcripts => TRANSCRIPTS,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
22 type => TYPE,
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
23 );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
24
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
25 #using an array instead of a hash for the node
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
26 sub _accessor {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
27 my $index = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
28 return sub {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
29 my $self = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
30 return undef unless $self;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
31 if (@_) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
32 $self->[$index] = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
33 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
34 return $self->[$index];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
35 };
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
36 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
37
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
38 while(my($at, $idx) = each %attribute) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
39 no strict 'refs';
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
40 *$at = _accessor($idx);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
41 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
42
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
43 sub new {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
44 my $class = shift;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
45 my $obj = [];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
46 $obj->[TRANSCRIPTS] = [];
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
47 if (@_) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
48 my %arg = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
49 $obj->[NAME] = $arg{-NAME} if($arg{-NAME});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
50 $obj->[CHR] = $arg{-CHR} if($arg{-CHR});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
51 $obj->[START] = $arg{-START} if($arg{-START});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
52 $obj->[END] = $arg{-END} if($arg{-END});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
53 $obj->[STRAND] = $arg{-STRAND} if($arg{-STRAND});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
54 $obj->[TRANSCRIPTS] = $arg{-TRANSCRIPTS} if($arg{-TRANSCRIPTS});
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
55 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
56 return bless $obj, $class;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
57 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
58
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
59 sub add_transcript {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
60 my ($self, $fea) = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
61 croak "You must add a Transcript type into a gene"
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
62 unless ($fea->isa('Transcript'));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
63 if($self->[STRAND] && $self->[STRAND] ne $fea->strand) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
64 croak "The transcript has different orientation with the gene";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
65 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
66 if($self->[CHR] && $self->[CHR] ne $fea->chr) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
67 croak "The transcript is on different chr with the gene";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
68 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
69 # if($self->[TYPE] && $fea->type ne $fea->type) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
70 # croak "The type of the transcript are different from the gene";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
71 # }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
72 $self->[STRAND] = $fea->strand;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
73 $self->[CHR] = $fea->chr;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
74 # $self->[TYPE] = $fea->type;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
75
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
76 push @{$self->[TRANSCRIPTS]}, $fea;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
77
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
78 $self->[NAME] = $self->[NAME] ? $self->[NAME] . "," . $fea->name : $fea->name;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
79
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
80
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
81 #update the start and end of the gene
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
82 $self->[START] = $fea->start if(!$self->[START] || $self->[START] > $fea->start);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
83 $self->[END] = $fea->end if(!$self->[END] || $self->[END] < $fea->end);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
84 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
85
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
86 sub get_start {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
87 my ($self, $pos, $ext) = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
88 my $rtn = $pos;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
89 foreach my $t (@{$self->[TRANSCRIPTS]}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
90 my $tmp = $t->get_start($pos, $ext);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
91 $rtn = $tmp if($tmp < $rtn);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
92 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
93 return $rtn;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
94 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
95
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
96 sub get_end {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
97 my ($self, $pos, $ext) = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
98 my $rtn = $pos;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
99 foreach my $t (@{$self->[TRANSCRIPTS]}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
100 my $tmp = $t->get_end($pos, $ext);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
101 $rtn = $tmp if($tmp > $rtn);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
102 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
103 return $rtn;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
104 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
105
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
106 sub overlap {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
107 my ($self, $fea) = @_;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
108
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
109 if(ref($fea) eq 'ARRAY') {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
110 foreach my $t ( @{$self->[TRANSCRIPTS]} ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
111 return 1 if($t->overlap($fea));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
112 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
113 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
114 elsif($fea->isa('Transcript')) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
115 return if($fea->strand && $self->[STRAND] ne $fea->strand );
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
116 return if($fea->chr && $self->[CHR] ne $fea->chr) ;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
117 #return if($fea->type && $self->[TYPE] ne $fea->type);
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
118 foreach my $e ( @{$fea->exons}) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
119 foreach my $t ( @{$self->[TRANSCRIPTS]} ) {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
120 return 1 if($t->overlap($e));
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
121 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
122 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
123 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
124 else {
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
125 croak "Not implemented overlap";
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
126 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
127 return 0;
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
128 }
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
129
acc8d8bfeb9a Uploaded
jjohnson
parents:
diff changeset
130 1;