Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/SeqIO/FTHelper.pm @ 0:1f6dce3d34e0
Uploaded
author | mahtabm |
---|---|
date | Thu, 11 Apr 2013 02:01:53 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/variant_effect_predictor/Bio/SeqIO/FTHelper.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,315 @@ +# $Id: FTHelper.pm,v 1.55 2002/11/05 02:55:12 lapp Exp $ +# +# BioPerl module for Bio::SeqIO::FTHelper +# +# Cared for by Ewan Birney <birney@ebi.ac.uk> +# +# Copyright Ewan Birney +# +# You may distribute this module under the same terms as perl itself + +# POD documentation - main docs before the code + +=head1 NAME + +Bio::SeqIO::FTHelper - Helper class for Embl/Genbank feature tables + +=head1 SYNOPSIS + +Used by Bio::SeqIO::EMBL to help process the Feature Table + +=head1 DESCRIPTION + +Represents one particular Feature with the following fields + + key - the key of the feature + loc - the location string of the feature + <other fields> - other fields + +=head1 FEEDBACK + +=head2 Mailing Lists + +User feedback is an integral part of the evolution of this and other +Bioperl modules. Send your comments and suggestions preferably to one +of the Bioperl mailing lists. Your participation is much appreciated. + + bioperl-l@bioperl.org - General discussion + http://www.bioperl.org/MailList.shtml - About the mailing lists + +=head2 Reporting Bugs + +Report bugs to the Bioperl bug tracking system to help us keep track +the bugs and their resolution. Bug reports can be submitted via email +or the web: + + bioperl-bugs@bio.perl.org + http://bugzilla.bioperl.org/ + +=head1 AUTHOR - Ewan Birney + +Email birney@ebi.ac.uk + +Describe contact details here + +=head1 CONTRIBUTORS + +Jason Stajich jason@bioperl.org + +=head1 APPENDIX + +The rest of the documentation details each of the object +methods. Internal methods are usually preceded with a _ + +=cut + + +# Let the code begin... + + +package Bio::SeqIO::FTHelper; +use vars qw(@ISA); +use strict; + +use Bio::SeqFeature::Generic; +use Bio::Location::Simple; +use Bio::Location::Fuzzy; +use Bio::Location::Split; + + +use Bio::Root::Root; + +@ISA = qw(Bio::Root::Root); + +sub new { + my ($class, @args) = @_; + + # no chained new because we make lots and lots of these. + my $self = {}; + bless $self,$class; + $self->{'_field'} = {}; + return $self; +} + +=head2 _generic_seqfeature + + Title : _generic_seqfeature + Usage : $fthelper->_generic_seqfeature($annseq, "GenBank") + Function: processes fthelper into a generic seqfeature + Returns : TRUE on success and otherwise FALSE + Args : The Bio::Factory::LocationFactoryI object to use for parsing + location strings. The ID (e.g., display_id) of the sequence on which + this feature is located, optionally a string indicating the source + (GenBank/EMBL/SwissProt) + + +=cut + +sub _generic_seqfeature { + my ($fth, $locfac, $seqid, $source) = @_; + my ($sf); + + # set a default if not specified + if(! defined($source)) { + $source = "EMBL/GenBank/SwissProt"; + } + + # initialize feature object + $sf = Bio::SeqFeature::Generic->direct_new(); + + # parse location; this may cause an exception, in which case we gently + # recover and ignore this feature + my $loc; + eval { + $loc = $locfac->from_string($fth->loc); + }; + if(! $loc) { + $fth->warn("exception while parsing location line [" . $fth->loc . + "] in reading $source, ignoring feature " . + $fth->key() . " (seqid=" . $seqid . "): " . $@); + return; + } + + # set additional location attributes + if($seqid && (! $loc->is_remote())) { + $loc->seq_id($seqid); # propagates if it is a split location + } + + # set attributes of feature + $sf->location($loc); + $sf->primary_tag($fth->key); + $sf->source_tag($source); + foreach my $key ( keys %{$fth->field} ){ + foreach my $value ( @{$fth->field->{$key}} ) { + $sf->add_tag_value($key,$value); + } + } + return $sf; +} + + +=head2 from_SeqFeature + + Title : from_SeqFeature + Usage : @fthelperlist = Bio::SeqIO::FTHelper::from_SeqFeature($sf, + $context_annseq); + Function: constructor of fthelpers from SeqFeatures + : + : The additional annseq argument is to allow the building of FTHelper + : lines relevant to particular sequences (ie, when features are spread over + : enteries, knowing how to build this) + Returns : an array of FThelpers + Args : seq features + + +=cut + +sub from_SeqFeature { + my ($sf, $context_annseq) = @_; + my @ret; + + # + # If this object knows how to make FThelpers, then let it + # - this allows us to store *really* weird objects that can write + # themselves to the EMBL/GenBank... + # + + if ( $sf->can("to_FTHelper") ) { + return $sf->to_FTHelper($context_annseq); + } + + my $fth = Bio::SeqIO::FTHelper->new(); + my $key = $sf->primary_tag(); + my $locstr = $sf->location->to_FTstring; + + # ES 25/06/01 Commented out this code, Jason to double check + #The location FT string for all simple subseqfeatures is already + #in the Split location FT string + + # going into sub features + #foreach my $sub ( $sf->sub_SeqFeature() ) { + #my @subfth = &Bio::SeqIO::FTHelper::from_SeqFeature($sub); + #push(@ret, @subfth); + #} + + $fth->loc($locstr); + $fth->key($key); + $fth->field->{'note'} = []; + #$sf->source_tag && do { push(@{$fth->field->{'note'}},"source=" . $sf->source_tag ); }; + + ($sf->can('score') && $sf->score) && do { push(@{$fth->field->{'note'}}, + "score=" . $sf->score ); }; + ($sf->can('frame') && $sf->frame) && do { push(@{$fth->field->{'note'}}, + "frame=" . $sf->frame ); }; + #$sf->strand && do { push(@{$fth->field->{'note'}},"strand=" . $sf->strand ); }; + + foreach my $tag ( $sf->all_tags ) { + # Tags which begin with underscores are considered + # private, and are therefore not printed + next if $tag =~ /^_/; + if ( !defined $fth->field->{$tag} ) { + $fth->field->{$tag} = []; + } + foreach my $val ( $sf->each_tag_value($tag) ) { + push(@{$fth->field->{$tag}},$val); + } + } + push(@ret, $fth); + + unless (@ret) { + $context_annseq->throw("Problem in processing seqfeature $sf - no fthelpers. Error!"); + } + foreach my $ft (@ret) { + if ( !$ft->isa('Bio::SeqIO::FTHelper') ) { + $sf->throw("Problem in processing seqfeature $sf - made a $fth!"); + } + } + + return @ret; + +} + + +=head2 key + + Title : key + Usage : $obj->key($newval) + Function: + Example : + Returns : value of key + Args : newvalue (optional) + + +=cut + +sub key { + my ($obj, $value) = @_; + if ( defined $value ) { + $obj->{'key'} = $value; + } + return $obj->{'key'}; + +} + +=head2 loc + + Title : loc + Usage : $obj->loc($newval) + Function: + Example : + Returns : value of loc + Args : newvalue (optional) + + +=cut + +sub loc { + my ($obj, $value) = @_; + if ( defined $value ) { + $obj->{'loc'} = $value; + } + return $obj->{'loc'}; +} + + +=head2 field + + Title : field + Usage : + Function: + Example : + Returns : + Args : + + +=cut + +sub field { + my ($self) = @_; + + return $self->{'_field'}; +} + +=head2 add_field + + Title : add_field + Usage : + Function: + Example : + Returns : + Args : + + +=cut + +sub add_field { + my ($self, $key, $val) = @_; + + if ( !exists $self->field->{$key} ) { + $self->field->{$key} = []; + } + push( @{$self->field->{$key}} , $val); + +} + +1;