annotate variant_effect_predictor/Bio/LiveSeq/Transcript.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
1 # $Id: Transcript.pm,v 1.17 2002/09/25 08:58:23 heikki Exp $
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
2 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
3 # bioperl module for Bio::LiveSeq::Transcript
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
4 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
5 # Cared for by Joseph Insana <insana@ebi.ac.uk> <jinsana@gmx.net>
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
6 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
7 # Copyright Joseph Insana
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
8 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
9 # You may distribute this module under the same terms as perl itself
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
10 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
11 # POD documentation - main docs before the code
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
12
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
13 =head1 NAME
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
14
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
15 Bio::LiveSeq::Transcript - Transcript class for LiveSeq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
16
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
17 =head1 SYNOPSIS
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
18
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
19 # documentation needed
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
20
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
21 =head1 DESCRIPTION
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
22
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
23 This stores informations about coding sequences (CDS).
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
24 The implementation is that a Transcript object accesses a collection of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
25 Exon objects, inferring from them the nucleotide structure and sequence.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
26
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
27 =head1 AUTHOR - Joseph A.L. Insana
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
28
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
29 Email: Insana@ebi.ac.uk, jinsana@gmx.net
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
30
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
31 Address:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
32
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
33 EMBL Outstation, European Bioinformatics Institute
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
34 Wellcome Trust Genome Campus, Hinxton
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
35 Cambs. CB10 1SD, United Kingdom
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
36
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
37 =head1 APPENDIX
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
38
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
39 The rest of the documentation details each of the object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
40 methods. Internal methods are usually preceded with a _
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
41
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
42 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
43
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
44 # Let the code begin...
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
45
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
46 package Bio::LiveSeq::Transcript;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
47 $VERSION=5.2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
48
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
49 # Version history:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
50 # Tue Mar 21 14:38:02 GMT 2000 v 1.0 begun
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
51 # Tue Mar 21 17:45:31 GMT 2000 v 1.1 new() created
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
52 # Wed Mar 22 19:40:13 GMT 2000 v 1.4 all_Exons() seq(), length(), all_labels()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
53 # Thu Mar 23 19:08:36 GMT 2000 v 1.5 follows() replaces is_downstream()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
54 # Thu Mar 23 20:59:02 GMT 2000 v 2.0 valid _inside_position label position
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
55 # Fri Mar 24 18:33:18 GMT 2000 v 2.2 rewritten position(), now should work with diverse coordinate_starts
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
56 # Sat Mar 25 04:08:18 GMT 2000 v 2.21 added firstlabel to position and label so that Translation can exploit it
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
57 # Sat Mar 25 06:39:27 GMT 2000 v 2.3 started override of subseq, works just internally
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
58 # Mon Mar 27 19:05:15 BST 2000 v 2.4 subseq finished, it works with coord_start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
59 # Fri Mar 31 18:48:07 BST 2000 v 2.5 started downstream_seq()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
60 # Mon Apr 3 17:37:34 BST 2000 v 2.52 upstream_seq added
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
61 # Fri Apr 7 03:29:43 BST 2000 v 2.6 up/downstream now can use Gene information
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
62 # Sat Apr 8 12:59:58 BST 2000 v 3.0 all_Exons now skips no more valid exons
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
63 # Sat Apr 8 13:32:08 BST 2000 v 3.1 get_Translation added
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
64 # Wed Apr 12 12:37:08 BST 2000 v 3.2 all_Exons updates Transcript's start/end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
65 # Wed Apr 12 12:41:22 BST 2000 v 3.3 each Exon has "transcript" attribute added
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
66 # Wed Apr 12 16:35:56 BST 2000 v 3.4 started coding _deletecheck
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
67 # Wed Apr 12 23:40:19 BST 2000 v 3.5 start and end redefined here, no more checks after deletion to refix start/end attributes. And no need of those. Eliminated hence from new()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
68 # Wed Apr 12 23:47:02 BST 2000 v 3.9 finished _deletecheck, debugging starts
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
69 # Thu Apr 13 00:37:16 BST 2000 v 4.0 debugging done: seems working OK
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
70 # Thu Apr 27 16:18:55 BST 2000 v 4.1 translation_table added
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
71 # Tue May 16 17:57:40 BST 2000 v 4.11 corrected bug in docs of downstream_seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
72 # Wed May 17 16:48:34 BST 2000 v 4.2 frame() added
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
73 # Mon May 22 15:22:12 BST 2000 v 4.21 labelsubseq tweaked for cases where startlabel==endlabel (no useless follow() query!)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
74 # Thu Jun 22 20:02:39 BST 2000 v 4.3 valid() moved to SeqI, to be inherited as the general one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
75 # Thu Jun 22 20:27:57 BST 2000 v 4.4 optimized labelsubseq coded!
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
76 # Thu Jun 22 21:17:51 BST 2000 v 4.44 in_which_Exon() added
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
77 # Sat Jun 24 00:49:55 BST 2000 v 4.5 new subseq() that exploits the new fast labelsubseq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
78 # Thu Jun 29 16:31:19 BST 2000 v 5.0 downsream_seq and upstream_seq recoded so that if entry is RNA it will return sequences up to the entry limits -> it should be properly debugged, expecially the upstream_seq one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
79 # Wed Jul 12 04:01:53 BST 2000 v 5.1 croak -> carp+return(-1)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
80 # Wed Mar 28 15:16:21 BST 2001 v 5.2 carp -> warn,throw (coded methods in SeqI)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
81
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
82 use strict;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
83 # use Carp qw(carp cluck);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
84 use vars qw($VERSION @ISA);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
85 use Bio::LiveSeq::SeqI 3.2; # uses SeqI, inherits from it
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
86 use Bio::LiveSeq::Exon 1.0; # uses Exon to create new exon in case of deletion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
87 @ISA=qw(Bio::LiveSeq::SeqI);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
88
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
89 =head2 new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
90
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
91 Title : new
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
92 Usage : $transcript = Bio::LiveSeq::Transcript->new(-exons => \@obj_refs);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
93
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
94 Function: generates a new Bio::LiveSeq::Transcript
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
95 Returns : reference to a new object of class Transcript
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
96 Errorcode -1
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
97 Args : reference to an array of Exon object references
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
98
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
99 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
100
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
101 sub new {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
102 my ($thing, %args) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
103 my $class = ref($thing) || $thing;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
104 my ($obj,%transcript);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
105
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
106 my @exons=@{$args{-exons}};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
107
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
108 $obj = \%transcript;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
109 $obj = bless $obj, $class;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
110
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
111 unless (@exons) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
112 $obj->warn("$class not initialised because exons array empty");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
113 return(-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
114 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
115
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
116 # now useless, after start and end methods have been overridden here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
117 my $firstexon = $exons[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
118 #my $lastexon = $exons[-1];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
119 #my $start = $firstexon->start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
120 #my $end = $lastexon->end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
121 my $strand = $firstexon->strand;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
122 my $seq = $firstexon->{'seq'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
123 $obj->alphabet('rna');
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
124
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
125 unless (_checkexons(\@exons)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
126 $obj->warn("$class not initialised because of problems in the exon structure");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
127 return(-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
128 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
129 $obj->{'strand'}=$strand;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
130 $obj->{'exons'}=\@exons;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
131 $obj->{'seq'}=$seq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
132
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
133 # set Transcript into each Exon
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
134 my $exon;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
135 foreach $exon (@exons) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
136 $exon->{'transcript'}=$obj;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
137 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
138 return $obj;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
139 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
140
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
141
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
142 =head2 all_Exons
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
143
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
144 Title : all_Exons
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
145 Usage : $transcript_obj->all_Exons()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
146 Function: returns references to all Exon objects the Transcript is composed of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
147 Example : foreach $exon ($transcript->all_Exons()) { do_something }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
148 Returns : array of object references
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
149 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
150
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
151 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
152
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
153 sub all_Exons {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
154 my $self=shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
155 my $exonsref=$self->{'exons'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
156 my @exons=@{$exonsref};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
157 my @newexons;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
158 my $exon;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
159 foreach $exon (@exons) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
160 unless ($exon->obj_valid) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
161 $self->warn("$exon no more valid, start or end label lost, skipping....",1); # ignorable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
162 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
163 push(@newexons,$exon);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
164 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
165 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
166 if ($#exons != $#newexons) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
167 # update exons field
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
168 $self->{'exons'}=\@newexons;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
169 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
170 return (@newexons);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
171 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
172
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
173 =head2 downstream_seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
174
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
175 Title : downstream_seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
176 Usage : $transcript_obj->downstream_seq()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
177 : $transcript_obj->downstream_seq(64)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
178 Function: returns a string of nucleotides downstream of the end of the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
179 CDS. If there is some information of the real mRNA, from features in
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
180 an attached Gene object, it will return up to those boundaries.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
181 Otherwise it will return 1000 nucleotides.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
182 If an argument is given it will override the default 1000 number
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
183 and return instead /that/ requested number of nucleotides.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
184 But if a Gene object is attached, this argument will be ignored.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
185 Returns : string
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
186 Args : an optional integer number of nucleotides to be returned instead of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
187 the default if no gene attached
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
188
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
189 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
190
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
191 sub downstream_seq {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
192 my ($self,$howmany)=@_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
193 my $str;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
194 if (defined ($howmany)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
195 unless ($howmany > 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
196 $self->throw("No sense in asking less than 1 downstream nucleotides!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
197 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
198 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
199 unless ($self->{'seq'}->alphabet eq 'rna') { # if rna retrieve until the end
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
200 #$str=$DNAobj->labelsubseq($self->end,undef,undef,"unsecuremoderequested");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
201 #return(substr($str,1)); # delete first nucleotide that is the last of Transcript
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
202 if ($self->gene) { # if there is Gene object attached fetch relevant info
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
203 $str=$self->{'seq'}->labelsubseq($self->end,undef,$self->gene->maxtranscript->end); # retrieve from end of this Transcript to end of the maxtranscript
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
204 $str=substr($str,1); # delete first nucleotide that is the last of Transcript
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
205 if (CORE::length($str) > 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
206 return($str);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
207 } else { # if there was no downstream through the gene's maxtranscript, go the usual way
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
208 $howmany = 1000;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
209 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
210 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
211 $howmany = 1000;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
212 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
213 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
214 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
215 my @exons=$self->all_Exons;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
216 my $strand=$self->strand();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
217 my $lastexon=$exons[-1];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
218 my $lastexonlength=$lastexon->length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
219 # $howmany nucs after end of last exon
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
220 #my $downstream_seq=$lastexon->subseq($lastexonlength+1,undef,$howmany);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
221 my $downstream_seq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
222
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
223 if ($howmany) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
224 $downstream_seq=substr($lastexon->labelsubseq($self->end,$howmany,undef,"unsecuremoderequested"),1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
225 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
226 if ($strand == 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
227 $downstream_seq=substr($lastexon->labelsubseq($self->end,undef,$self->{'seq'}->end,"unsecuremoderequested"),1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
228 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
229 $downstream_seq=substr($lastexon->labelsubseq($self->end,undef,$self->{'seq'}->start,"unsecuremoderequested"),1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
230 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
231 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
232 return $downstream_seq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
233 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
234
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
235 =head2 upstream_seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
236
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
237 Title : upstream_seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
238 Usage : $transcript_obj->upstream_seq()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
239 : $transcript_obj->upstream_seq(64)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
240 Function: just like downstream_seq but returns nucleotides before the ATG
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
241 Note : the default, if no Gene information present and no nucleotides
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
242 number given, is to return up to 400 nucleotides.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
243
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
244 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
245
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
246 sub upstream_seq {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
247 my ($self,$howmany)=@_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
248 if (defined ($howmany)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
249 unless ($howmany > 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
250 $self->throw("No sense in asking less than 1 upstream nucleotides!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
251 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
252 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
253 unless ($self->{'seq'}->alphabet eq 'rna') { # if rna retrieve from the start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
254 if ($self->gene) { # if there is Gene object attached fetch relevant info
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
255 my $str=$self->{'seq'}->labelsubseq($self->gene->maxtranscript->start,undef,$self->start); # retrieve from start of maxtranscript to start of this Transcript
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
256 chop $str; # delete last nucleotide that is the A of starting ATG
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
257 if (length($str) > 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
258 return($str);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
259 } else { # if there was no upstream through the gene's maxtranscript, go the usual way
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
260 $howmany = 400;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
261 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
262 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
263 $howmany = 400;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
264 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
265 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
266 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
267 my @exons=$self->all_Exons;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
268 my $firstexon=$exons[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
269
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
270 my $upstream_seq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
271 my $strand=$self->strand();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
272
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
273 if ($howmany) {# $howmany nucs before begin of first exon
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
274 my $labelbefore=$firstexon->label(-$howmany,$firstexon->start);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
275 if ($labelbefore < 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
276 if ($strand == 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
277 $labelbefore=$self->{'seq'}->start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
278 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
279 $labelbefore=$self->{'seq'}->end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
280 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
281 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
282 $upstream_seq=$firstexon->labelsubseq($labelbefore,undef,$firstexon->start,"unsecuremoderequested");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
283 chop $upstream_seq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
284 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
285 if ($strand == 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
286 $upstream_seq=$firstexon->labelsubseq($self->{'seq'}->start,undef,$self->start,"unsecuremoderequested");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
287 chop $upstream_seq; # delete last nucleotide that is the A of starting ATG
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
288 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
289 $upstream_seq=$firstexon->labelsubseq($self->{'seq'}->end,undef,$self->start,"unsecuremoderequested");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
290 chop $upstream_seq; # delete last nucleotide that is the A of starting ATG
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
291 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
292 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
293 return $upstream_seq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
294 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
295
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
296 # These get redefined here, overriding the SeqI one because they draw their
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
297 # information from the Exons a Transcript is built of
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
298 # optional argument: firstlabel. If not given, it checks coordinate_start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
299 # This is useful when called by Translation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
300 # also used by _delete
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
301 sub label {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
302 my ($self,$position,$firstlabel)=@_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
303 unless ($position) { # if position = 0 complain ?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
304 $self->warn("Position not given or position 0");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
305 return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
306 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
307 my ($start,$end,$strand)=($self->start(),$self->end(),$self->strand());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
308 my ($label,@labels,$length,$arraypos);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
309 unless (defined ($firstlabel)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
310 $firstlabel=$self->coordinate_start; # this is inside Transcript obj
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
311 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
312 my $coord_pos=$self->_inside_position($firstlabel);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
313 $length=$self->length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
314 #if ($strand == 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
315 if ($position < 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
316 $position++; # to account for missing of 0 position
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
317 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
318 $arraypos=$position+$coord_pos-2;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
319 #print "\n=-=-=-=-DEBUG: arraypos $arraypos, pos $position, coordpos: $coord_pos";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
320 if ($arraypos < 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
321 $label=$self->{'seq'}->label($arraypos,$start,$strand); #?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
322 } elsif ($arraypos >= $length) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
323 $label=$self->{'seq'}->label($arraypos-$length+2,$end,$strand); #?
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
324 } else { # inside the Transcript
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
325 @labels=$self->all_labels;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
326 $label=$labels[$arraypos];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
327 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
328 #}
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
329 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
330
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
331 # argument: label
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
332 # returns: position of label according to coord_start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
333 # errorcode: 0 label not found
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
334 # optional argument: firstlabel. If not given, it checks coordinate_start
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
335 # This is useful when called by Translation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
336 sub position {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
337 my ($self,$label,$firstlabel)=@_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
338 unless ($self->{'seq'}->valid($label)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
339 $self->warn("label is not valid");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
340 return (0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
341 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
342 unless (defined ($firstlabel)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
343 $firstlabel=$self->coordinate_start; # this is inside Transcript obj
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
344 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
345 if ($label == $firstlabel) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
346 return (1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
347 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
348 my ($start,$end,$strand)=($self->start(),$self->end(),$self->strand());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
349 my ($position,$in_pos,$out_pos,$coord_pos);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
350 my $length=$self->length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
351 $coord_pos=$self->_inside_position($firstlabel);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
352 if ($self->valid($label)) { # if label is inside the Transcript
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
353 $in_pos=$self->_inside_position($label);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
354 $position=$in_pos-$coord_pos+1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
355 if ($position <= 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
356 return ($position-1); # accounts for the missing of the 0 position
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
357 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
358 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
359 if ($self->follows($end,$label)) { # label after end of transcript
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
360 $out_pos=$self->{'seq'}->position($label,$end,$strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
361 #print "\n+++++++++DEBUG label $label FOLLOWS end $end outpos $out_pos coordpos $coord_pos";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
362 $position=$out_pos+$length-$coord_pos;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
363 } elsif ($self->follows($label,$start)) { # label before begin of transcript
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
364 #print "\n+++++++++DEBUG label $label BEFORE start $start outpos $out_pos coordpos $coord_pos";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
365 $out_pos=$self->{'seq'}->position($label,$start,$strand);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
366 $position=$out_pos-$coord_pos+1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
367 } else { # label is in intron (not valid, not after, not before)!
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
368 $self->warn("Cannot give position of label pointing to intron according to CDS numbering!",1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
369 return (0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
370 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
371 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
372 return ($position);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
373 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
374
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
375 sub seq {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
376 my $self=shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
377 my ($exon,$str);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
378 my @exons=$self->all_Exons();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
379 foreach $exon (@exons) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
380 $str .= $exon->seq();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
381 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
382 return $str;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
383 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
384
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
385 sub length {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
386 my $self=shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
387 my ($exon,$length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
388 my @exons=$self->all_Exons();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
389 foreach $exon (@exons) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
390 $length += $exon->length();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
391 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
392 return $length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
393 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
394
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
395 sub all_labels {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
396 my $self=shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
397 my ($exon,@labels);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
398 my @exons=$self->all_Exons();
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
399 foreach $exon (@exons) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
400 push (@labels,$exon->all_labels());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
401 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
402 return @labels;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
403 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
404
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
405 # redefined here so that it will retrieve effective subseq without introns
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
406 # otherwise it would have retrieved an underlying DNA (possibly with introns)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
407 # subsequence
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
408 # Drawback: this is really bulky, label->position and then a call to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
409 # subseq that will do the opposite position-> label
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
410 #
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
411 # one day this can be rewritten as the main one so that the normal subseq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
412 # will rely on this one and hence avoid this double (useless and lengthy)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
413 # conversion between labels and positions
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
414 sub old_labelsubseq {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
415 my ($self,$start,$length,$end)=@_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
416 my ($pos1,$pos2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
417 if ($start) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
418 unless ($self->valid($start)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
419 $self->warn("Start label not valid"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
420 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
421 $pos1=$self->position($start);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
422 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
423 if ($end) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
424 if ($end == $start) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
425 $length=1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
426 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
427 unless ($self->valid($end)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
428 $self->warn("End label not valid"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
429 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
430 unless ($self->follows($start,$end) == 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
431 $self->warn("End label does not follow Start label!"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
432 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
433 $pos2=$self->position($end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
434 undef $length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
435 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
436 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
437 return ($self->subseq($pos1,$pos2,$length));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
438 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
439
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
440 # rewritten, eventually
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
441
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
442 sub labelsubseq {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
443 my ($self,$start,$length,$end,$unsecuremode)=@_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
444 unless (defined $unsecuremode &&
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
445 $unsecuremode eq "unsecuremoderequested")
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
446 { # to skip security checks (faster)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
447 if ($start) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
448 unless ($self->valid($start)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
449 $self->warn("Start label not valid"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
450 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
451 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
452 $start=$self->start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
453 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
454 if ($end) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
455 if ($end == $start) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
456 $length=1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
457 undef $end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
458 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
459 undef $length; # end argument overrides length argument
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
460 unless ($self->valid($end)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
461 $self->warn("End label not valid"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
462 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
463 unless ($self->follows($start,$end) == 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
464 $self->warn("End label does not follow Start label!"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
465 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
466 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
467 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
468 $end=$self->end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
469 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
470 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
471 my ($seq,$exon,$startexon,$endexon); my @exonlabels;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
472 my @exons=$self->all_Exons;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
473 EXONCHECK:
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
474 foreach $exon (@exons) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
475 if ((!(defined($startexon)))&&($exon->valid($start))) { # checks only if not yet found
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
476 $startexon=$exon;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
477 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
478 if ($exon->valid($end)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
479 $endexon=$exon;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
480 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
481 if ((!(defined($seq)) && (defined($startexon)))) { # initializes only once
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
482 if ((defined($endexon)) && ($endexon eq $startexon)) { # then perfect, we are finished
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
483 if ($length) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
484 $seq = $startexon->labelsubseq($start,$length,undef,"unsecuremoderequested");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
485
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
486
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
487 last EXONCHECK;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
488 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
489 $seq = $startexon->labelsubseq($start,undef,$end,"unsecuremoderequested");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
490 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
491 last EXONCHECK;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
492 } else { # get up to the end of the exon
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
493 $seq = $startexon->labelsubseq($start,undef,undef,"unsecuremoderequested");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
494 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
495 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
496 if (($startexon)&&($exon ne $startexon)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
497 if (defined($endexon)) { # we arrived to the last exon
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
498 $seq .= $endexon->labelsubseq(undef,undef,$end,"unsecuremoderequested"); # get from the start of the exon
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
499 last EXONCHECK;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
500
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
501 } elsif (defined($startexon)) { # we are in a whole-exon-in-the-middle case
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
502 $seq .= $exon->seq; # we add it completely to the seq
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
503 } # else, we still have to reach the start point, exon useless, we move on
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
504 if ($length) { # if length argument specified
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
505 if (($seq && (CORE::length($seq) >= $length))) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
506 last EXONCHECK;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
507 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
508 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
509 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
510 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
511 if ($length) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
512 return (substr($seq,0,$length));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
513 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
514 return ($seq);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
515 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
516 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
517
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
518
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
519 # argument: label
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
520 # returns: the objref and progressive number of the Exon containing that label
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
521 # errorcode: -1
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
522 sub in_which_Exon {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
523 my ($self,$label)=@_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
524 my ($count,$exon);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
525 my @exons=$self->all_Exons;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
526 foreach $exon (@exons) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
527 $count++; # 1st exon is numbered "1"
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
528 if ($exon->valid($label)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
529 return ($exon,$count)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
530 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
531 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
532 return (-1); # if nothing found
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
533 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
534
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
535 # recoded to exploit the new fast labelsubseq()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
536 # valid only inside Transcript
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
537 sub subseq {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
538 my ($self,$pos1,$pos2,$length) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
539 my ($str,$startlabel,$endlabel);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
540 if (defined ($pos1)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
541 if ($pos1 == 0) { # if position = 0 complain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
542 $self->warn("Position cannot be 0!"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
543 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
544 if ((defined ($pos2))&&($pos1>$pos2)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
545 $self->warn("1st position($pos1) cannot be > 2nd position($pos2)!"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
546 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
547 $startlabel=$self->label($pos1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
548 unless ($self->valid($startlabel)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
549 $self->warn("Start label not valid"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
550 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
551 if ($startlabel < 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
552 $self->warn("position $pos1 not valid as start of subseq!"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
553 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
554 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
555 $startlabel=$self->start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
556 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
557 if (defined ($pos2)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
558 if ($pos2 == 0) { # if position = 0 complain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
559 $self->warn("Position cannot be 0!"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
560 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
561 undef $length;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
562 if ((defined ($pos1))&&($pos1>$pos2)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
563 $self->warn("1st position($pos1) cannot be > 2nd position($pos2)!"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
564 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
565 $endlabel=$self->label($pos2);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
566 unless ($self->valid($endlabel)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
567 $self->warn("End label not valid"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
568 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
569 if ($endlabel < 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
570 $self->warn("position $pos2 not valid as end of subseq!"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
571 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
572 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
573 unless (defined ($length)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
574 $endlabel=$self->end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
575 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
576 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
577 return ($self->labelsubseq($startlabel,$length,$endlabel,"unsecuremoderequested"));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
578 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
579
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
580 # works only inside the transcript, complains if asked outside
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
581 sub old_subseq {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
582 my ($self,$pos1,$pos2,$length) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
583 my ($str,$startcount,$endcount,$seq,$seqlength);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
584 if (defined ($length)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
585 if ($length < 1) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
586 $self->warn("No sense asking for a subseq of length < 1");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
587 return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
588 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
589 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
590 my $firstlabel=$self->coordinate_start; # this is inside Transcript obj
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
591 my $coord_pos=$self->_inside_position($firstlabel); # TESTME old
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
592 $seq=$self->seq;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
593 $seqlength=CORE::length($seq);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
594 unless (defined ($pos1)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
595 $startcount=1+$coord_pos-1; # i.e. coord_pos
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
596 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
597 if ($pos1 == 0) { # if position = 0 complain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
598 $self->warn("Position cannot be 0!"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
599 } elsif ($pos1 < 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
600 $pos1++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
601 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
602 if ((defined ($pos2))&&($pos1>$pos2)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
603 $self->warn("1st position ($pos1) cannot be > 2nd position ($pos2)!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
604 return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
605 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
606 $startcount=$pos1+$coord_pos-1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
607 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
608 unless (defined ($pos2)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
609 ;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
610 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
611 if ($pos2 == 0) { # if position = 0 complain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
612 $self->warn("Position cannot be 0!"); return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
613 } elsif ($pos2 < 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
614 $pos2++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
615 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
616 if ((defined ($pos1))&&($pos1>$pos2)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
617 $self->warn("1st position ($pos1) cannot be > 2nd position ($pos2)!");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
618 return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
619 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
620 $endcount=$pos2+$coord_pos-1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
621 if ($endcount > $seqlength) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
622 #print "\n###DEBUG###: pos1 $pos1 pos2 $pos2 coordpos $coord_pos endcount $endcount seqln $seqlength\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
623 $self->warn("Cannot access end position after the end of Transcript");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
624 return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
625 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
626 $length=$endcount-$startcount+1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
627 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
628 #print "\n###DEBUG pos1 $pos1 pos2 $pos2 start $startcount end $endcount length $length coordpos $coord_pos\n";
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
629 my $offset=$startcount-1;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
630 if ($offset < 0) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
631 $self->warn("Cannot access startposition before the beginning of Transcript, returning from start",1); # ignorable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
632 return (substr($seq,0,$length));
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
633 } elsif ($offset >= $seqlength) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
634 $self->warn("Cannot access startposition after the end of Transcript");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
635 return (-1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
636 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
637 $str=substr($seq,$offset,$length);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
638 if (CORE::length($str) < $length) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
639 $self->warn("Attention, cannot return the length requested ".
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
640 "for subseq",1) if $self->verbose > 0; # ignorable
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
641 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
642 return $str;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
643 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
644 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
645
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
646 # redefined so that it doesn't require other methods (after deletions) to
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
647 # reset it.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
648 sub start {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
649 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
650 my $exonsref=$self->{'exons'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
651 my @exons=@{$exonsref};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
652 return ($exons[0]->start);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
653 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
654
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
655 sub end {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
656 my $self = shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
657 my $exonsref=$self->{'exons'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
658 my @exons=@{$exonsref};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
659 return ($exons[-1]->end);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
660 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
661
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
662
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
663 # internal methods begin here
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
664
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
665 # returns: position of label in transcript's all_labels
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
666 # with STARTlabel == 1
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
667 # errorcode 0 -> label not found
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
668 # argument: label
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
669 sub _inside_position {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
670 my ($self,$label)=@_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
671 my ($start,$end,$strand)=($self->start(),$self->end(),$self->strand());
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
672 my ($position,$checkme);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
673 my @labels=$self->all_labels;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
674 foreach $checkme (@labels) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
675 $position++;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
676 if ($label == $checkme) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
677 return ($position);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
678 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
679 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
680 return (0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
681 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
682
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
683 # returns 1 OK or 0 ERROR
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
684 # arguments: reference to array of Exon object references
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
685 sub _checkexons {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
686 my ($exon,$thisstart);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
687 my $self=$exon;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
688 my $exonsref=$_[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
689 my @exons=@{$exonsref};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
690
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
691 my $firstexon = $exons[0];
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
692
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
693 unless (ref($firstexon) eq "Bio::LiveSeq::Exon") {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
694 $self->warn("Object not of class Exon");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
695 return (0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
696 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
697 my $strand = $firstexon->strand;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
698
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
699 my $prevend = $firstexon->end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
700 shift @exons; # skip first one
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
701 foreach $exon (@exons) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
702 unless (ref($exon) eq "Bio::LiveSeq::Exon") { # object class check
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
703 $self->warn("Object not of class Exon");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
704 return (0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
705 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
706 if ($exon->strand != $strand) { # strand consistency check
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
707 $self->warn("Exons' strands not consistent when trying to create Transcript");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
708 return (0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
709 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
710 $thisstart = $exon->start;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
711 unless ($exon->{'seq'}->follows($prevend,$thisstart,$strand)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
712 $self->warn("Exons not in correct order when trying to create Transcript");
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
713 return (0);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
714 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
715 $prevend = $exon->end;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
716 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
717 return (1);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
718 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
719
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
720 =head2 get_Translation
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
721
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
722 Title : valid
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
723 Usage : $translation = $obj->get_Translation()
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
724 Function: retrieves the reference to the object of class Translation (if any)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
725 attached to a LiveSeq object
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
726 Returns : object reference
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
727 Args : none
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
728
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
729 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
730
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
731 sub get_Translation {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
732 my $self=shift;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
733 return ($self->{'translation'}); # this is set when Translation->new is called
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
734 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
735
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
736 # this checks so that deletion spanning multiple exons is
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
737 # handled accordingly and correctly
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
738 # arguments: begin and end label of a deletion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
739 # this is called BEFORE any deletion in the chain
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
740 sub _deletecheck {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
741 my ($self,$startlabel,$endlabel)=@_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
742 my $exonsref=$self->{'exons'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
743 my @exons=@{$exonsref};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
744 my ($startexon,$endexon,$exon);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
745 $startexon=$endexon=0;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
746 foreach $exon (@exons) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
747 if (($startexon == 0)&&($exon->valid($startlabel))) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
748 $startexon=$exon; # exon containing start of deletion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
749 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
750 if (($endexon == 0)&&($exon->valid($endlabel))) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
751 $endexon=$exon; # exon containing end of deletion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
752 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
753 if (($startexon)&&($endexon)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
754 last; # don't check further
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
755 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
756 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
757 my $nextend=$self->label(2,$endlabel); # retrieve the next label
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
758 my $prevstart=$self->label(-1,$startlabel); # retrieve the prev label
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
759
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
760 if ($startexon eq $endexon) { # intra-exon deletion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
761 if (($startexon->start eq $startlabel) && ($startexon->end eq $endlabel)) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
762 # let's delete the entire exon
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
763 my @newexons;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
764 foreach $exon (@exons) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
765 unless ($exon eq $startexon) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
766 push(@newexons,$exon);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
767 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
768 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
769 $self->{'exons'}=\@newexons;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
770 } elsif ($startexon->start eq $startlabel) { # special cases
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
771 $startexon->{'start'}=$nextend; # set a new start of exon
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
772 } elsif ($startexon->end eq $endlabel) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
773 $startexon->{'end'}=$prevstart; # set a new end of exon
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
774 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
775 return; # no problem
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
776 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
777 } else { # two new exons to be created, inter-exons deletion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
778 my @newexons;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
779 my $exonobj;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
780 my $dna=$self->{'seq'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
781 my $strand=$self->strand;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
782 my $notmiddle=1; # flag for skipping exons in the middle of deletion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
783 foreach $exon (@exons) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
784 if ($exon eq $startexon) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
785 $exonobj=Bio::LiveSeq::Exon->new('-seq'=>$dna,'-start'=>$exon->start,'-end'=>$prevstart,'-strand'=>$strand); # new partial exon
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
786 push(@newexons,$exonobj);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
787 $notmiddle=0; # now we enter totally deleted exons
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
788 } elsif ($exon eq $endexon) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
789 $exonobj=Bio::LiveSeq::Exon->new('-seq'=>$dna,'-start'=>$nextend,'-end'=>$exon->end,'-strand'=>$strand); # new partial exon
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
790 push(@newexons,$exonobj);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
791 $notmiddle=1; # exiting totally deleted exons
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
792 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
793 if ($notmiddle) { # if before or after exons with deletion
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
794 push(@newexons,$exon);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
795 }# else skip them
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
796 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
797 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
798 $self->{'exons'}=\@newexons;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
799 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
800 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
801
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
802 =head2 translation_table
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
803
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
804 Title : translation_table
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
805 Usage : $name = $obj->translation_table;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
806 : $name = $obj->translation_table(11);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
807 Function: Returns or sets the translation_table used for translating the
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
808 transcript.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
809 If it has never been set, it will return undef.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
810 Returns : an integer
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
811
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
812 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
813
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
814 sub translation_table {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
815 my ($self,$value) = @_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
816 if (defined $value) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
817 $self->{'translation_table'} = $value;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
818 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
819 unless (exists $self->{'translation_table'}) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
820 return (undef);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
821 } else {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
822 return $self->{'translation_table'};
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
823 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
824 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
825
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
826 =head2 frame
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
827
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
828 Title : frame
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
829 Usage : $frame = $transcript->frame($label);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
830 Function: Returns the frame of a particular nucleotide.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
831 Frame can be 0 1 or 2 and means the position in the codon triplet
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
832 of the particulat nucleotide. 0 is the first codon_position.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
833 Codon_position (1 2 3) is simply frame+1.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
834 If the label asked for is not inside the Transcript, -1 will be
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
835 returned.
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
836 Args : a label
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
837 Returns : 0 1 or 2
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
838 Errorcode -1
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
839
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
840 =cut
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
841
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
842 # args: label
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
843 # returns: frame of nucleotide (0 1 2)
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
844 # errorcode: -1
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
845 sub frame {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
846 my ($self,$inputlabel)=@_;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
847 my @labels=$self->all_labels;
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
848 my ($label,$frame,$count);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
849 foreach $label (@labels) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
850 if ($inputlabel == $label) {
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
851 return ($count % 3);
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
852 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
853 $count++; # 0 1 2 3 4....
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
854 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
855 return (-1); # label not found amid Transcript labels
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
856 }
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
857
1f6dce3d34e0 Uploaded
mahtabm
parents:
diff changeset
858 1;