Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/SeqFeature/Computation.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/SeqFeature/Computation.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,568 @@ +# $Id: Computation.pm,v 1.11 2002/10/22 07:38:41 lapp Exp $ +# +# BioPerl module for Bio::SeqFeature::Generic +# +# Cared for by mark Fiers <m.w.e.j.fiers@plant.wag-ur.nl> +# +# Copyright Ewan Birney, Mark Fiers +# +# You may distribute this module under the same terms as perl itself + +# POD documentation - main docs before the code + +=head1 NAME + +Bio::SeqFeature::Computation - Computation SeqFeature + +=head1 SYNOPSIS + + $feat = new Bio::SeqFeature::Computation ( + -start => 10, -end => 100, + -strand => -1, -primary => 'repeat', + -program_name => 'GeneMark', + -program_date => '12-5-2000', + -program_version => 'x.y', + -database_name => 'Arabidopsis', + -database_date => '12-dec-2000', + -computation_id => 2231, + -score => { no_score => 334 } ); + + +=head1 DESCRIPTION + +Bio::SeqFeature::Computation extends the Generic seqfeature object with +a set of computation related fields and a more flexible set of storing +more types of score and subseqfeatures. It is compatible with the Generic +SeqFeature object. + +The new way of storing score values is similar to the tag structure in the +Generic object. For storing sets of subseqfeatures the array containg the +subseqfeatures is now a hash which contains arrays of seqfeatures +Both the score and subSeqfeature methods can be called in exactly the same +way, the value's will be stored as a 'default' score or subseqfeature. + +=cut + +#' + +=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://bio.perl.org/MailList.html - 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, Mark Fiers + +Ewan Birney E<lt>birney@sanger.ac.ukE<gt> +Mark Fiers E<lt>m.w.e.j.fiers@plant.wag-ur.nlE<gt> + +=head1 DEVELOPERS + +This class has been written with an eye out of inheritance. The fields +the actual object hash are: + + _gsf_sub_hash = reference to a hash containing sets of sub arrays + _gsf_score_hash= reference to a hash for the score values + +=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::SeqFeature::Computation; +use vars qw(@ISA); +use strict; + +use Bio::Root::Root; +use Bio::SeqFeature::Generic; + +@ISA = qw(Bio::SeqFeature::Generic); + +sub new { + my ( $class, @args) = @_; + + my $self = $class->SUPER::new(@args); + + + my ( $computation_id, + $program_name, $program_date, $program_version, + $database_name, $database_date, $database_version) = + $self->_rearrange([qw(COMPUTATION_ID + PROGRAM_NAME + PROGRAM_DATE + PROGRAM_VERSION + DATABASE_NAME + DATABASE_DATE + DATABASE_VERSION + )],@args); + + $program_name && $self->program_name($program_name); + $program_date && $self->program_date($program_date); + $program_version && $self->program_version($program_version); + $database_name && $self->database_name($database_name); + $database_date && $self->database_date($database_date); + $database_version && $self->database_version($database_version); + $computation_id && $self->computation_id($computation_id); + + return $self; +} + +=head2 has_score + + Title : has_score + Usage : $value = $self->has_score('some_score') + Function: Tests wether a feature contains a score + Returns : TRUE if the SeqFeature has the score, + and FALSE otherwise. + Args : The name of a score + +=cut + +sub has_score { + my ($self, $score) = @_; + return undef unless defined $score; + return exists $self->{'_gsf_score_hash'}->{$score}; +} + +=head2 add_score_value + + Title : add_score_value + Usage : $self->add_score_value('P_value',224); + Returns : TRUE on success + Args : score (string) and value (any scalar) + +=cut + +sub add_score_value { + my ($self, $score, $value) = @_; + if( ! defined $score || ! defined $value ) { + $self->warn("must specify a valid $score and $value to add_score_value"); + return 0; + } + + if ( !defined $self->{'_gsf_score_hash'}->{$score} ) { + $self->{'_gsf_score_hash'}->{$score} = []; + } + + push(@{$self->{'_gsf_score_hash'}->{$score}},$value); +} + +=head2 score + + Title : score + Usage : $value = $comp_obj->score() + $comp_obj->score($value) + Function: Returns the 'default' score or sets the 'default' score + This method exist for compatibility options + It would equal ($comp_obj->each_score_value('default'))[0]; + Returns : A value + Args : (optional) a new value for the 'default' score + +=cut + +sub score { + my ($self, $value) = @_; + my @v; + if (defined $value) { + + if( ref($value) =~ /HASH/i ) { + while( my ($t,$val) = each %{ $value } ) { + $self->add_score_value($t,$val); + } + } else { + @v = $value; + $self->add_score_value('default', $value); + } + + } else { + @v = $self->each_score_value('default'); + } + return $v[0]; +} + +=head2 each_score_value + + Title : each_score_value + Usage : @values = $gsf->each_score_value('note'); + Function: Returns a list of all the values stored + under a particular score. + Returns : A list of scalars + Args : The name of the score + +=cut + +sub each_score_value { + my ($self, $score) = @_; + if ( ! exists $self->{'_gsf_score_hash'}->{$score} ) { + $self->warn("asking for score value that does not exist $score"); + return undef; + } + return @{$self->{'_gsf_score_hash'}->{$score}}; +} + + +=head2 all_scores + + Title : all_scores + Usage : @scores = $feat->all_scores() + Function: Get a list of all the scores in a feature + Returns : An array of score names + Args : none + + +=cut + +sub all_scores { + my ($self, @args) = @_; + + return keys %{$self->{'_gsf_score_hash'}}; +} + + +=head2 remove_score + + Title : remove_score + Usage : $feat->remove_score('some_score') + Function: removes a score from this feature + Returns : nothing + Args : score (string) + + +=cut + +sub remove_score { + my ($self, $score) = @_; + + if ( ! exists $self->{'_gsf_score_hash'}->{$score} ) { + $self->warn("trying to remove a score that does not exist: $score"); + } + + delete $self->{'_gsf_score_hash'}->{$score}; +} + +=head2 computation_id + + Title : computation_id + Usage : $computation_id = $feat->computation_id() + $feat->computation_id($computation_id) + Function: get/set on program name information + Returns : string + Args : none if get, the new value if set + + +=cut + +sub computation_id { + my ($self,$value) = @_; + + if (defined($value)) { + $self->{'_gsf_computation_id'} = $value; + } + + return $self->{'_gsf_computation_id'}; +} + + + + +=head2 program_name + + Title : program_name + Usage : $program_name = $feat->program_name() + $feat->program_name($program_name) + Function: get/set on program name information + Returns : string + Args : none if get, the new value if set + + +=cut + +sub program_name { + my ($self,$value) = @_; + + if (defined($value)) { + $self->{'_gsf_program_name'} = $value; + } + + return $self->{'_gsf_program_name'}; +} + +=head2 program_date + + Title : program_date + Usage : $program_date = $feat->program_date() + $feat->program_date($program_date) + Function: get/set on program date information + Returns : date (string) + Args : none if get, the new value if set + + +=cut + +sub program_date { + my ($self,$value) = @_; + + if (defined($value)) { + $self->{'_gsf_program_date'} = $value; + } + + return $self->{'_gsf_program_date'}; +} + + +=head2 program_version + + Title : program_version + Usage : $program_version = $feat->program_version() + $feat->program_version($program_version) + Function: get/set on program version information + Returns : date (string) + Args : none if get, the new value if set + + +=cut + +sub program_version { + my ($self,$value) = @_; + + if (defined($value)) { + $self->{'_gsf_program_version'} = $value; + } + + return $self->{'_gsf_program_version'}; +} + +=head2 database_name + + Title : database_name + Usage : $database_name = $feat->database_name() + $feat->database_name($database_name) + Function: get/set on program name information + Returns : string + Args : none if get, the new value if set + +=cut + +sub database_name { + my ($self,$value) = @_; + + if (defined($value)) { + $self->{'_gsf_database_name'} = $value; + } + + return $self->{'_gsf_database_name'}; +} + +=head2 database_date + + Title : database_date + Usage : $database_date = $feat->database_date() + $feat->database_date($database_date) + Function: get/set on program date information + Returns : date (string) + Args : none if get, the new value if set + + +=cut + +sub database_date { + my ($self,$value) = @_; + + if (defined($value)) { + $self->{'_gsf_database_date'} = $value; + } + + return $self->{'_gsf_database_date'}; +} + + +=head2 database_version + + Title : database_version + Usage : $database_version = $feat->database_version() + $feat->database_version($database_version) + Function: get/set on program version information + Returns : date (string) + Args : none if get, the new value if set + + +=cut + +sub database_version { + my ($self,$value) = @_; + + if (defined($value)) { + $self->{'_gsf_database_version'} = $value; + } + + return $self->{'_gsf_database_version'}; + +} + +=head2 sub_SeqFeature_type + + Title : sub_SeqFeature_type + Usage : $sub_SeqFeature_type = $feat->sub_SeqFeature_type() + $feat->sub_SeqFeature_type($sub_SeqFeature_type) + Function: sub_SeqFeature_type is automatically set when adding + a sub_computation (sub_SeqFeature) to a computation object + Returns : sub_SeqFeature_type (string) + Args : none if get, the new value if set + +=cut + +sub sub_SeqFeature_type { + my ($self, $value) = @_; + + if (defined($value)) { + $self->{'_gsf_sub_SeqFeature_type'} = $value; + } + return $self->{'_gsf_sub_SeqFeature_type'}; +} + +=head2 all_sub_SeqFeature_types + + Title : all_Sub_SeqFeature_types + Usage : @all_sub_seqfeature_types = $comp->all_Sub_SeqFeature_types(); + Function: Returns an array with all subseqfeature types + Returns : An array + Args : none + +=cut + +sub all_sub_SeqFeature_types { + my ($self) = @_; + return keys ( %{$self->{'gsf_sub_hash'}} ); +} + +=head2 sub_SeqFeature + + Title : sub_SeqFeature('sub_feature_type') + Usage : @feats = $feat->sub_SeqFeature(); + @feats = $feat->sub_SeqFeature('sub_feature_type'); + Function: Returns an array of sub Sequence Features of a specific + type or, if the type is ommited, all sub Sequence Features + Returns : An array + Args : (optional) a sub_SeqFeature type (ie exon, pattern) + +=cut + +sub sub_SeqFeature { + my ($self, $ssf_type) = @_; + my (@return_array) = (); + if ($ssf_type eq '') { + #return all sub_SeqFeatures + foreach (keys ( %{$self->{'gsf_sub_hash'}} )){ + push @return_array, @{$self->{'gsf_sub_hash'}->{$_}}; + } + return @return_array; + } else { + if (defined ($self->{'gsf_sub_hash'}->{$ssf_type})) { + return @{$self->{'gsf_sub_hash'}->{$ssf_type}}; + } else { + $self->warn("$ssf_type is not a valid sub SeqFeature type"); + } + } +} + +=head2 add_sub_SeqFeature + + Title : add_sub_SeqFeature + Usage : $feat->add_sub_SeqFeature($subfeat); + $feat->add_sub_SeqFeature($subfeat,'sub_seqfeature_type') + $feat->add_sub_SeqFeature($subfeat,'EXPAND') + $feat->add_sub_SeqFeature($subfeat,'EXPAND','sub_seqfeature_type') + Function: adds a SeqFeature into a specific subSeqFeature array. + with no 'EXPAND' qualifer, subfeat will be tested + as to whether it lies inside the parent, and throw + an exception if not. + If EXPAND is used, the parents start/end/strand will + be adjusted so that it grows to accommodate the new + subFeature, + optionally a sub_seqfeature type can be defined. + Returns : nothing + Args : An object which has the SeqFeatureI interface + : (optional) 'EXPAND' + : (optional) 'sub_SeqFeature_type' + +=cut + +sub add_sub_SeqFeature{ + my ($self,$feat,$var1, $var2) = @_; + $var1 = '' unless( defined $var1); + $var2 = '' unless( defined $var2); + my ($expand, $ssf_type) = ('', $var1 . $var2); + $expand = 'EXPAND' if ($ssf_type =~ s/EXPAND//); + + if ( !$feat->isa('Bio::SeqFeatureI') ) { + $self->warn("$feat does not implement Bio::SeqFeatureI. Will add it anyway, but beware..."); + } + + if($expand eq 'EXPAND') { + $self->_expand_region($feat); + } else { + if ( !$self->contains($feat) ) { + $self->throw("$feat is not contained within parent feature, and expansion is not valid"); + } + } + + $ssf_type = 'default' if ($ssf_type eq ''); + + if (!(defined ($self->{'gsf_sub_hash'}->{$ssf_type}))) { + @{$self->{'gsf_sub_hash'}->{$ssf_type}} = (); + } + $feat->sub_SeqFeature_type($ssf_type); + push @{$self->{'gsf_sub_hash'}->{$ssf_type}}, $feat; +} + +=head2 flush_sub_SeqFeature + + Title : flush_sub_SeqFeature + Usage : $sf->flush_sub_SeqFeature + $sf->flush_sub_SeqFeature('sub_SeqFeature_type'); + Function: Removes all sub SeqFeature or all sub SeqFeatures + of a specified type + (if you want to remove a more specific subset, take + an array of them all, flush them, and add + back only the guys you want) + Example : + Returns : none + Args : none + + +=cut + +sub flush_sub_SeqFeature { + my ($self, $ssf_type) = @_; + if ($ssf_type) { + if ((defined ($self->{'gsf_sub_hash'}->{$ssf_type}))) { + delete $self->{'gsf_sub_hash'}->{$ssf_type}; + } else { + $self->warn("$ssf_type is not a valid sub SeqFeature type"); + } + } else { + $self->{'_gsf_sub_hash'} = {}; # zap the complete hash implicitly. + } +} + + + +1;