comparison variant_effect_predictor/Bio/SeqIO/FTHelper.pm @ 0:1f6dce3d34e0

Uploaded
author mahtabm
date Thu, 11 Apr 2013 02:01:53 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:1f6dce3d34e0
1 # $Id: FTHelper.pm,v 1.55 2002/11/05 02:55:12 lapp Exp $
2 #
3 # BioPerl module for Bio::SeqIO::FTHelper
4 #
5 # Cared for by Ewan Birney <birney@ebi.ac.uk>
6 #
7 # Copyright Ewan Birney
8 #
9 # You may distribute this module under the same terms as perl itself
10
11 # POD documentation - main docs before the code
12
13 =head1 NAME
14
15 Bio::SeqIO::FTHelper - Helper class for Embl/Genbank feature tables
16
17 =head1 SYNOPSIS
18
19 Used by Bio::SeqIO::EMBL to help process the Feature Table
20
21 =head1 DESCRIPTION
22
23 Represents one particular Feature with the following fields
24
25 key - the key of the feature
26 loc - the location string of the feature
27 <other fields> - other fields
28
29 =head1 FEEDBACK
30
31 =head2 Mailing Lists
32
33 User feedback is an integral part of the evolution of this and other
34 Bioperl modules. Send your comments and suggestions preferably to one
35 of the Bioperl mailing lists. Your participation is much appreciated.
36
37 bioperl-l@bioperl.org - General discussion
38 http://www.bioperl.org/MailList.shtml - About the mailing lists
39
40 =head2 Reporting Bugs
41
42 Report bugs to the Bioperl bug tracking system to help us keep track
43 the bugs and their resolution. Bug reports can be submitted via email
44 or the web:
45
46 bioperl-bugs@bio.perl.org
47 http://bugzilla.bioperl.org/
48
49 =head1 AUTHOR - Ewan Birney
50
51 Email birney@ebi.ac.uk
52
53 Describe contact details here
54
55 =head1 CONTRIBUTORS
56
57 Jason Stajich jason@bioperl.org
58
59 =head1 APPENDIX
60
61 The rest of the documentation details each of the object
62 methods. Internal methods are usually preceded with a _
63
64 =cut
65
66
67 # Let the code begin...
68
69
70 package Bio::SeqIO::FTHelper;
71 use vars qw(@ISA);
72 use strict;
73
74 use Bio::SeqFeature::Generic;
75 use Bio::Location::Simple;
76 use Bio::Location::Fuzzy;
77 use Bio::Location::Split;
78
79
80 use Bio::Root::Root;
81
82 @ISA = qw(Bio::Root::Root);
83
84 sub new {
85 my ($class, @args) = @_;
86
87 # no chained new because we make lots and lots of these.
88 my $self = {};
89 bless $self,$class;
90 $self->{'_field'} = {};
91 return $self;
92 }
93
94 =head2 _generic_seqfeature
95
96 Title : _generic_seqfeature
97 Usage : $fthelper->_generic_seqfeature($annseq, "GenBank")
98 Function: processes fthelper into a generic seqfeature
99 Returns : TRUE on success and otherwise FALSE
100 Args : The Bio::Factory::LocationFactoryI object to use for parsing
101 location strings. The ID (e.g., display_id) of the sequence on which
102 this feature is located, optionally a string indicating the source
103 (GenBank/EMBL/SwissProt)
104
105
106 =cut
107
108 sub _generic_seqfeature {
109 my ($fth, $locfac, $seqid, $source) = @_;
110 my ($sf);
111
112 # set a default if not specified
113 if(! defined($source)) {
114 $source = "EMBL/GenBank/SwissProt";
115 }
116
117 # initialize feature object
118 $sf = Bio::SeqFeature::Generic->direct_new();
119
120 # parse location; this may cause an exception, in which case we gently
121 # recover and ignore this feature
122 my $loc;
123 eval {
124 $loc = $locfac->from_string($fth->loc);
125 };
126 if(! $loc) {
127 $fth->warn("exception while parsing location line [" . $fth->loc .
128 "] in reading $source, ignoring feature " .
129 $fth->key() . " (seqid=" . $seqid . "): " . $@);
130 return;
131 }
132
133 # set additional location attributes
134 if($seqid && (! $loc->is_remote())) {
135 $loc->seq_id($seqid); # propagates if it is a split location
136 }
137
138 # set attributes of feature
139 $sf->location($loc);
140 $sf->primary_tag($fth->key);
141 $sf->source_tag($source);
142 foreach my $key ( keys %{$fth->field} ){
143 foreach my $value ( @{$fth->field->{$key}} ) {
144 $sf->add_tag_value($key,$value);
145 }
146 }
147 return $sf;
148 }
149
150
151 =head2 from_SeqFeature
152
153 Title : from_SeqFeature
154 Usage : @fthelperlist = Bio::SeqIO::FTHelper::from_SeqFeature($sf,
155 $context_annseq);
156 Function: constructor of fthelpers from SeqFeatures
157 :
158 : The additional annseq argument is to allow the building of FTHelper
159 : lines relevant to particular sequences (ie, when features are spread over
160 : enteries, knowing how to build this)
161 Returns : an array of FThelpers
162 Args : seq features
163
164
165 =cut
166
167 sub from_SeqFeature {
168 my ($sf, $context_annseq) = @_;
169 my @ret;
170
171 #
172 # If this object knows how to make FThelpers, then let it
173 # - this allows us to store *really* weird objects that can write
174 # themselves to the EMBL/GenBank...
175 #
176
177 if ( $sf->can("to_FTHelper") ) {
178 return $sf->to_FTHelper($context_annseq);
179 }
180
181 my $fth = Bio::SeqIO::FTHelper->new();
182 my $key = $sf->primary_tag();
183 my $locstr = $sf->location->to_FTstring;
184
185 # ES 25/06/01 Commented out this code, Jason to double check
186 #The location FT string for all simple subseqfeatures is already
187 #in the Split location FT string
188
189 # going into sub features
190 #foreach my $sub ( $sf->sub_SeqFeature() ) {
191 #my @subfth = &Bio::SeqIO::FTHelper::from_SeqFeature($sub);
192 #push(@ret, @subfth);
193 #}
194
195 $fth->loc($locstr);
196 $fth->key($key);
197 $fth->field->{'note'} = [];
198 #$sf->source_tag && do { push(@{$fth->field->{'note'}},"source=" . $sf->source_tag ); };
199
200 ($sf->can('score') && $sf->score) && do { push(@{$fth->field->{'note'}},
201 "score=" . $sf->score ); };
202 ($sf->can('frame') && $sf->frame) && do { push(@{$fth->field->{'note'}},
203 "frame=" . $sf->frame ); };
204 #$sf->strand && do { push(@{$fth->field->{'note'}},"strand=" . $sf->strand ); };
205
206 foreach my $tag ( $sf->all_tags ) {
207 # Tags which begin with underscores are considered
208 # private, and are therefore not printed
209 next if $tag =~ /^_/;
210 if ( !defined $fth->field->{$tag} ) {
211 $fth->field->{$tag} = [];
212 }
213 foreach my $val ( $sf->each_tag_value($tag) ) {
214 push(@{$fth->field->{$tag}},$val);
215 }
216 }
217 push(@ret, $fth);
218
219 unless (@ret) {
220 $context_annseq->throw("Problem in processing seqfeature $sf - no fthelpers. Error!");
221 }
222 foreach my $ft (@ret) {
223 if ( !$ft->isa('Bio::SeqIO::FTHelper') ) {
224 $sf->throw("Problem in processing seqfeature $sf - made a $fth!");
225 }
226 }
227
228 return @ret;
229
230 }
231
232
233 =head2 key
234
235 Title : key
236 Usage : $obj->key($newval)
237 Function:
238 Example :
239 Returns : value of key
240 Args : newvalue (optional)
241
242
243 =cut
244
245 sub key {
246 my ($obj, $value) = @_;
247 if ( defined $value ) {
248 $obj->{'key'} = $value;
249 }
250 return $obj->{'key'};
251
252 }
253
254 =head2 loc
255
256 Title : loc
257 Usage : $obj->loc($newval)
258 Function:
259 Example :
260 Returns : value of loc
261 Args : newvalue (optional)
262
263
264 =cut
265
266 sub loc {
267 my ($obj, $value) = @_;
268 if ( defined $value ) {
269 $obj->{'loc'} = $value;
270 }
271 return $obj->{'loc'};
272 }
273
274
275 =head2 field
276
277 Title : field
278 Usage :
279 Function:
280 Example :
281 Returns :
282 Args :
283
284
285 =cut
286
287 sub field {
288 my ($self) = @_;
289
290 return $self->{'_field'};
291 }
292
293 =head2 add_field
294
295 Title : add_field
296 Usage :
297 Function:
298 Example :
299 Returns :
300 Args :
301
302
303 =cut
304
305 sub add_field {
306 my ($self, $key, $val) = @_;
307
308 if ( !exists $self->field->{$key} ) {
309 $self->field->{$key} = [];
310 }
311 push( @{$self->field->{$key}} , $val);
312
313 }
314
315 1;