Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/Seq/QualI.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/Seq/QualI.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,563 @@ +# $Id: QualI.pm,v 1.4 2002/10/22 07:38:40 lapp Exp $ +# +# BioPerl module for Bio::Seq::QualI +# +# Cared for by Chad Matsalla <bioinformatics@dieselwurks.com +# +# Copyright Chad Matsalla +# +# You may distribute this module under the same terms as perl itself + +# POD documentation - main docs before the code + +=head1 NAME + +Bio::Seq::QualI - Interface definition for a Bio::Seq::Qual + +=head1 SYNOPSIS + + # get a Bio::Seq::Qual compliant object somehow + + # to test this is a seq object + + $obj->isa("Bio::Seq::QualI") || $obj->throw("$obj does not implement the Bio::Seq::QualI interface"); + + # accessors + + $string = $obj->qual(); + $substring = $obj->subqual(12,50); + $display = $obj->display_id(); # for human display + $id = $obj->primary_id(); # unique id for this object, implementation defined + $unique_key= $obj->accession_number(); + # unique biological id + + + +=head1 DESCRIPTION + +This object defines an abstract interface to basic quality +information. PrimaryQual is an object just for the quality and its +name(s), nothing more. There is a pure perl implementation of this in +Bio::Seq::PrimaryQual. If you just want to use Bio::Seq::PrimaryQual +objects, then please read that module first. This module defines the +interface, and is of more interest to people who want to wrap their own +Perl Objects/RDBs/FileSystems etc in way that they "are" bioperl quality +objects, even though it is not using Perl to store the sequence etc. + +This interface defines what bioperl consideres necessary to "be" a +sequence of qualities, without providing an implementation of this. (An +implementation is provided in Bio::Seq::PrimaryQual). If you want to +provide a Bio::Seq::PrimaryQual 'compliant' object which in fact wraps +another object/database/out-of-perl experience, then this is the correct +thing to wrap, generally by providing a wrapper class which would inheriet +from your object and this Bio::Seq::QualI interface. The wrapper +class then would have methods lists in the "Implementation Specific +Functions" which would provide these methods for your object. + + +=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 - Chad Matsalla + +This module is heavily based on Bio::Seq::PrimarySeq and is modeled after +or outright copies sections of it. Thanks Ewan! + +Email bioinformatics@dieselwurks.com + +=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::Seq::QualI; +use vars qw(@ISA); +use strict; +use Carp; + +=head1 Implementation Specific Functions + +These functions are the ones that a specific implementation must +define. + +=head2 qual() + + Title : qual() + Usage : @quality_values = @{$obj->qual()}; + Function: Returns the quality as a reference to an array containing the + quality values. The individual elements of the quality array are + not validated and can be any numeric value. + Returns : A reference to an array. + Status : + +=cut + +sub qual { + my ($self) = @_; + if( $self->can('throw') ) { + $self->throw("Bio::Seq::QualI definition of qual - implementing class did not provide this method"); + } else { + confess("Bio::Seq::QualI definition of qual - implementing class did not provide this method"); + } +} + +=head2 subqual($start,$end) + + Title : subqual($start,$end) + Usage : @subset_of_quality_values = @{$obj->subseq(10,40)}; + Function: returns the quality values from $start to $end, where the + first value is 1 and the number is inclusive, ie 1-2 are the first + two bases of the sequence. Start cannot be larger than end but can + be equal. + Returns : A reference to an array. + Args : a start position and an end position + + +=cut + +sub subqual { + my ($self) = @_; + + if( $self->can('throw') ) { + $self->throw("Bio::Seq::QualI definition of subqual - implementing class did not provide this method"); + } else { + confess("Bio::Seq::QualI definition of subqual - implementing class did not provide this method"); + } + +} + +=head2 display_id() + + Title : display_id() + Usage : $id_string = $obj->display_id() _or_ + $id_string = $obj->display_id($new_display_id); + Function: Returns the display id, aka the common name of the Quality + object. + The semantics of this is that it is the most likely string to be + used as an identifier of the quality sequence, and likely to have + "human" readability. The id is equivalent to the ID field of the + GenBank/EMBL databanks and the id field of the Swissprot/sptrembl + database. In fasta format, the >(\S+) is presumed to be the id, + though some people overload the id to embed other information. + Bioperl does not use any embedded information in the ID field, + and people are encouraged to use other mechanisms (accession field + for example, or extending the sequence object) to solve this. + Notice that $seq->id() maps to this function, mainly for + legacy/convience issues + Returns : A string + Args : If an arg is provided, it will replace the existing display_id + in the object. + + +=cut + +sub display_id { + my ($self) = @_; + + if( $self->can('throw') ) { + $self->throw("Bio::Seq::QualI definition of id - implementing class did not provide this method"); + } else { + confess("Bio::Seq::QualI definition of id - implementing class did not provide this method"); + } + +} + + +=head2 accession_number() + + Title : accession_number() + Usage : $unique_biological_key = $obj->accession_number(); _or_ + $unique_biological_key = $obj->accession_number($new_acc_num); + Function: Returns the unique biological id for a sequence, commonly + called the accession_number. For sequences from established + databases, the implementors should try to use the correct + accession number. Notice that primary_id() provides the unique id + for the implemetation, allowing multiple objects to have the same + accession number in a particular implementation. For sequences + with no accession number, this method should return "unknown". + Returns : A string. + Args : If an arg is provided, it will replace the existing + accession_number in the object. + +=cut + +sub accession_number { + my ($self,@args) = @_; + + if( $self->can('throw') ) { + $self->throw("Bio::Seq::QualI definition of seq - implementing class did not provide this method"); + } else { + confess("Bio::Seq::QualI definition of seq - implementing class did not provide this method"); + } + +} + + + +=head2 primary_id() + + Title : primary_id() + Usage : $unique_implementation_key = $obj->primary_id(); _or_ + $unique_implementation_key = $obj->primary_id($new_prim_id); + Function: Returns the unique id for this object in this implementation. + This allows implementations to manage their own object ids in a + way the implementaiton can control clients can expect one id to + map to one object. For sequences with no accession number, this + method should return a stringified memory location. + Returns : A string + Args : If an arg is provided, it will replace the existing + primary_id in the object. + +=cut + +sub primary_id { + my ($self,@args) = @_; + + if( $self->can('throw') ) { + $self->throw("Bio::Seq::QualI definition of qual - implementing class did not provide this method"); + } else { + confess("Bio::Seq::QualI definition of qual - implementing class did not provide this method"); + } + +} + + +=head2 can_call_new() + + Title : can_call_new() + Usage : if( $obj->can_call_new ) { + $newobj = $obj->new( %param ); + } + Function: can_call_new returns 1 or 0 depending on whether an + implementation allows new constructor to be called. If a new + constructor is allowed, then it should take the followed hashed + constructor list. + $myobject->new( -qual => $quality_as_string, + -display_id => $id, + -accession_number => $accession, + ); + Example : + Returns : 1 or 0 + Args : + + +=cut + +sub can_call_new{ + my ($self,@args) = @_; + # we default to 0 here + return 0; +} + +=head2 qualat($position) + + Title : qualat($position) + Usage : $quality = $obj->qualat(10); + Function: Return the quality value at the given location, where the + first value is 1 and the number is inclusive, ie 1-2 are the first + two bases of the sequence. Start cannot be larger than end but can + be equal. + Returns : A scalar. + Args : A position. + +=cut + +sub qualat { + my ($self,$value) = @_; + if( $self->can('warn') ) { + $self->warn("Bio::Seq::QualI definition of qualat - implementing class did not provide this method"); + } else { + warn("Bio::Seq::QualI definition of qualat - implementing class did not provide this method"); + } + return ''; +} + +=head1 Optional Implementation Functions + +The following functions rely on the above functions. A implementing +class does not need to provide these functions, as they will be +provided by this class, but is free to override these functions. + +All of revcom(), trunc(), and translate() create new sequence +objects. They will call new() on the class of the sequence object +instance passed as argument, unless can_call_new() returns FALSE. In +the latter case a Bio::PrimarySeq object will be created. Implementors +which really want to control how objects are created (eg, for object +persistence over a database, or objects in a CORBA framework), they +are encouraged to override these methods + +=head2 revcom + + Title : revcom + Usage : @rev = @{$qual->revcom()}; + Function: Produces a new Bio::Seq::QualI implementing object which + is reversed from the original quality array. + The id is the same id as the orginal sequence, and the accession number + is also indentical. If someone wants to track that this sequence has + been reversed, it needs to define its own extensions + + To do an inplace edit of an object you can go: + + $qual = $qual->revcom(); + + This of course, causes Perl to handle the garbage collection of the old + object, but it is roughly speaking as efficient as an inplace edit. + Returns : A new (fresh) Bio::Seq::PrimaryQualI object + Args : none + +=cut + +sub revcom{ + my ($self) = @_; + # this is the cleanest way + my @qualities = @{$self->seq()}; + my @reversed_qualities = reverse(@qualities); + my $seqclass; + if($self->can_call_new()) { + $seqclass = ref($self); + } else { + $seqclass = 'Bio::Seq::PrimaryQual'; + # Wassat? + # $self->_attempt_to_load_Seq(); + } + # the \@reverse_qualities thing works simply because I will it to work. + my $out = $seqclass->new( '-qual' => \@reversed_qualities, + '-display_id' => $self->display_id, + '-accession_number' => $self->accession_number, + '-desc' => $self->desc() + ); + return $out; +} + +=head2 trunc() + + Title : trunc + Usage : $subseq = $myseq->trunc(10,100); + Function: Provides a truncation of a sequence, + Returns : a fresh Bio::Seq::QualI implementing object + Args : Two integers denoting first and last base of the sub-sequence. + + +=cut + +sub trunc { + my ($self,$start,$end) = @_; + + if( !$end ) { + if( $self->can('throw') ) { + $self->throw("trunc start,end"); + } else { + confess("[$self] trunc start,end"); + } + } + + if( $end < $start ) { + if( $self->can('throw') ) { + $self->throw("$end is smaller than $start. if you want to truncated and reverse complement, you must call trunc followed by revcom. Sorry."); + } else { + confess("[$self] $end is smaller than $start. If you want to truncated and reverse complement, you must call trunc followed by revcom. Sorry."); + } + } + + my $r_qual = $self->subqual($start,$end); + + my $seqclass; + if($self->can_call_new()) { + $seqclass = ref($self); + } else { + $seqclass = 'Bio::Seq::PrimaryQual'; + # wassat? + # $self->_attempt_to_load_Seq(); + } + my $out = $seqclass->new( '-qual' => $r_qual, + '-display_id' => $self->display_id, + '-accession_number' => $self->accession_number, + '-desc' => $self->desc() + ); + return $out; +} + + +=head2 translate() + + Title : translate() + Usage : $protein_seq_obj = $dna_seq_obj->translate + #if full CDS expected: + $protein_seq_obj = $cds_seq_obj->translate(undef,undef,undef,undef,1); + Function: Completely useless in this interface. + Returns : Nothing. + Args : Nothing. + +=cut + + +sub translate { + return 0; +} + + +=head2 id() + + Title : id() + Usage : $id = $qual->id() + Function: ID of the quality. This should normally be (and actually is in + the implementation provided here) just a synonym for display_id(). + Example : + Returns : A string. + Args : + + +=cut + +sub id { + my ($self)= @_; + return $self->display_id(); +} + +=head2 length() + + Title : length() + Usage : $length = $qual->length(); + Function: Return the length of the array holding the quality values. + Under most circumstances, this should match the number of quality + values but no validation is done when the PrimaryQual object is + constructed and non-digits could be put into this array. Is this a + bug? Just enough rope... + Returns : A scalar (the number of elements in the quality array). + Args : None. + +=cut + +sub length { + my ($self)= @_; + if( $self->can('throw') ) { + $self->throw("Bio::Seq::QualI definition of length - implementing class did not provide this method"); + } else { + confess("Bio::Seq::QualI definition of length - implementing class did not provide this method"); + } +} + + +=head2 desc() + + Title : desc() + Usage : $qual->desc($newval); + $description = $seq->desc(); + Function: Get/set description text for a qual object + Example : + Returns : value of desc + Args : newvalue (optional) + +=cut + +sub desc { + my ($self,$value) = @_; + if( $self->can('warn') ) { + $self->warn("Bio::Seq::QualI definition of desc - implementing class did not provide this method"); + } else { + warn("Bio::Seq::QualI definition of desc - implementing class did not provide this method"); + } + return ''; +} + +# These methods are here for backward compatibility with the old, 0.5 +# Seq objects. They all throw warnings that someone is using a +# deprecated method, and may eventually be removed completely from +# this object. However, they are important to ease the transition from +# the old system. + +=head1 Private functions + +These are some private functions for the PrimarySeqI interface. You do not +need to implement these functions + +=head2 _attempt_to_load_Seq + + Title : _attempt_to_load_Seq + Usage : + Function: + Example : + Returns : + Args : + + +=cut + +sub _attempt_to_load_Seq{ + my ($self) = @_; + + if( $main::{'Bio::Seq::PrimaryQual'} ) { + return 1; + } else { + eval { + require Bio::Seq::PrimaryQual; + }; + if( $@ ) { + if( $self->can('throw') ) { + $self->throw("Bio::Seq::PrimaryQual could not be loaded for $self\nThis indicates that you are using Bio::Seq::PrimaryQualI without Bio::Seq::PrimaryQual loaded and without providing a complete solution\nThe most likely problem is that there has been a misconfiguration of the bioperl environment\nActual exception\n\n$@\n"); + } else { + confess("Bio::Seq::PrimarySeq could not be loaded for $self\nThis indicates that you are usnig Bio::Seq::PrimaryQualI without Bio::Seq::PrimaryQual loaded and without providing a complete solution\nThe most likely problem is that there has been a misconfiguration of the bioperl environment\nActual exception\n\n$@\n"); + } + return 0; + } + return 1; + } + +} + + +=head2 qualtype() + + Title : qualtype() + Usage : if( $obj->qualtype eq 'phd' ) { /Do Something/ } + Function: At this time, this function is not used for + Bio::Seq::PrimaryQual objects. In fact, now it is a month later and + I just completed the Bio::Seq::SeqWithQuality object and this is + definitely deprecated. + Returns : Nothing. (not implemented) + Args : none + Status : Virtual + + +=cut + +sub qualtype { + my ($self,@args) = @_; + if( $self->can('throw') ) { + # $self->throw("Bio::Seq::QualI definition of qual - implementing class did not provide this method"); + $self->throw("qualtypetype is not used with quality objects."); + } else { + # confess("Bio::Seq::QualI definition of qual - implementing class did not provide this method"); + confess("qualtype is not used with quality objects."); + } + + +} + + + + +1;