Mercurial > repos > mahtabm > ensembl
diff variant_effect_predictor/Bio/Seq/PrimedSeq.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/PrimedSeq.pm Thu Apr 11 02:01:53 2013 -0400 @@ -0,0 +1,480 @@ +# BioPerl module for Bio::PrimedSeq +# +# Cared for by Chad Matsalla <bioinformatics1@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 Bio::Seq::PrimedSeq + +Bio::Seq::PrimedSeq - A representation of a sequence and two primers flanking a +target region for amplification + +=head1 SYNOPSIS + + # create a sequence + my $sequence = "ctagctagctagctagctagctagctagctgatcgtagctagctagct"; + # create left and right primer seqfeatures + # unfortunately, I haven't created constructors for these yet. + my $left = Bio::SeqFeature::Primer(); + my $right = Bio::SeqFeature::Primer(); + # now create the PrimedSeq + $primedseq = new Bio::Seq::PrimedSeq( + -seq => $sequence, + -display_id => "chads_fantastic_sequence", + -LEFT_PRIMER => $left, + -RIGHT_PRIMER => $right, + -TARGET => '513,26' + -PRIMER_PRODUCT_SIZE_RANGE => '100-500' + -PRIMER_FILE_FLAG => '0' + -PRIMER_LIBERAL_BASE => '1' + -PRIMER_NUM_RETURN => '1' + -PRIMER_FIRST_BASE_INDEX => '1' + -PRIMER_EXPLAIN_FLAG => '1' + -PRIMER_PRODUCT_SIZE => '185' + ); + # get the amplified region + my $amplified_sequence = $primed_seq->get_amplified_sequence(); + +=head1 DESCRIPTION + +This module is a slightly glorified capsule containg a primed seqBuence. It was +created to address the fact that a primer is more the a seqfeature and there +need to be ways to represent the primer-sequence complex and the behaviors and +attributes that are associated with the complex. + +=head1 FEEDBACK + +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 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::PrimedSeq; +use vars qw(@ISA); +use strict; + +use Bio::RangeI; + +@ISA = qw(Bio::Seq); + + +=head2 new + + Title : new() + Usage : $primed_sequence = new Bio::SeqFeature::Primer( -seq => $sequence, + -left_primer => $left_primer, + -right_primer => $right_primer); + Function: A constructor for an object representing a primed sequence + Returns : A Bio::Seq::PrimedSeq object + Args : + -seq => a Bio::Seq object + -left_primer => a Bio::SeqFeature::Primer object + -right_primer => a Bio::SeqFeature::Primer object + Many other parameters can be included including all of the output + parameters from the primer3 program. +Developer Notes: This is incomplete and doesn't work. As of ISMB2002 I am working on it. + + +=cut + +sub new { + my($class,@args) = @_; + my %arguments = @args; + my $self = $class->SUPER::new(@args); + # these are the absolute minimum components required to make + # a primedseq + my $newkey; + foreach my $key (sort keys %arguments) { + ($newkey = $key) =~ s/-//; + $self->{$newkey} = $arguments{$key}; + push @{$self->{arguments}},$newkey; + } + # and now the insurance- make sure that things are ok + if (!$self->{target_sequence} || !$self->{left_primer} || !$self->{right_primer} ) { + $self->throw("You must provide a target_sequence, left_primer, and right_primer to create this object."); + } + if (ref($self->{target_sequence}) ne "Bio::Seq") { + $self->throw("The target_sequence must be a Bio::Seq to create this object."); + } + if (ref($self->{left_primer}) ne "Bio::SeqFeature::Primer" || ref($self->{right_primer}) ne "Bio::SeqFeature::Primer") { + $self->throw("You must provide a left_primer and right_primer, both as Bio::SeqFeature::Primer to create this object."); + } + return $self; +} + + +=head2 get_left_primer + + Title : get_left_primer(); + Usage : $left_primer = $primedseq->get_left_primer(); + Function: A getter for the left primer in thie PrimedSeq object. + Returns : A Bio::SeqFeature::Primer object + Args : None. + +=cut + +sub get_left_primer() { + my $self = shift; + + + + +} + + + + + + + + + + + + +=head2 Bio::RangeI methods + +List of interfaces inherited from Bio::RangeI (see L<Bio::RangeI> +for details). + +=head2 start + + Title : start + Usage : $start = $feat->start + Function: Returns the start coordinate of the feature + Returns : integer + Args : none +Developer Notes: + This is entirely dependent on the sequence to which this primer is attached! + I think that there could be trouble if one takes this primer from sequence 1 + and naively place it on sequence 2 without updating this + ** This is incomplete at this time. +=cut + +sub start() { + my $self = shift; + + +} + + + + +=head2 end + + Title : end + Usage : $end = $feat->end + Function: Returns the end coordinate of the feature + Returns : integer + Args : none +Developer Notes: + ** This is incomplete at this time. +=cut + +sub end() { + my $self = shift; + + +} + +=head2 strand + + Title : strand + Usage : $strand = $feat->strand() + Function: Returns strand information, being 1,-1 or 0 + Returns : -1,1 or 0 + Args : none +Developer Notes: + ** This is incomplete at this time. + + +=cut + +sub strand() { + my $self = shift; +} + + +=head2 SeqFeatureI specific methods + +New method interfaces. + +=head2 sub_SeqFeature + + Title : sub_SeqFeature + Usage : @feats = $feat->sub_SeqFeature(); + Function: Returns an array of sub Sequence Features + Returns : An array + Args : none + +=cut + +sub sub_SeqFeature{ + my ($self,@args) = @_; + + $self->throw_not_implemented(); +} + +=head2 display_id + + Title : display_id + Usage : $name = $feat->display_id() + Function: Returns the human-readable ID of the + feature for displays. + Returns : a string + Args : none + +=cut + +sub display_id { + my ($self,@args) = @_; + $self->throw_not_implemented(); +} + +=head2 primary_tag + + Title : primary_tag + Usage : $tag = $feat->primary_tag() + Function: Returns the primary tag for a feature, + eg 'exon' + Returns : a string + Args : none + + +=cut + +sub primary_tag{ + my ($self,@args) = @_; + + $self->throw_not_implemented(); + +} + +=head2 source_tag + + Title : source_tag + Usage : $tag = $feat->source_tag() + Function: Returns the source tag for a feature, + eg, 'genscan' + Returns : a string + Args : none + + +=cut + +sub source_tag{ + my ($self,@args) = @_; + + $self->throw_not_implemented(); +} + +=head2 has_tag + + Title : has_tag + Usage : $tag_exists = $self->has_tag('some_tag') + Function: + Returns : TRUE if the specified tag exists, and FALSE otherwise + Args : + + +=cut + +sub has_tag{ + my ($self,@args) = @_; + + $self->throw_not_implemented(); + +} + +=head2 each_tag_value + + Title : each_tag_value + Usage : @values = $self->each_tag_value('some_tag') + Function: + Returns : An array comprising the values of the specified tag. + Args : + + +=cut + +sub each_tag_value { + my ($self,@args) = @_; + + $self->throw_not_implemented(); +} + +=head2 all_tags + + Title : all_tags + Usage : @tags = $feat->all_tags() + Function: gives all tags for this feature + Returns : an array of strings + Args : none + + +=cut + +sub all_tags{ + my ($self,@args) = @_; + + $self->throw_not_implemented(); +} + +=head2 gff_string + + Title : gff_string + Usage : $str = $feat->gff_string; + $str = $feat->gff_string($gff_formatter); + Function: Provides the feature information in GFF format. + + The implementation provided here returns GFF2 by default. If you + want a different version, supply an object implementing a method + gff_string() accepting a SeqFeatureI object as argument. E.g., to + obtain GFF1 format, do the following: + + my $gffio = Bio::Tools::GFF->new(-gff_version => 1); + $gff1str = $feat->gff_string($gff1io); + + Returns : A string + Args : Optionally, an object implementing gff_string(). + + +=cut + +sub gff_string{ + my ($self,$formatter) = @_; + + $formatter = $self->_static_gff_formatter unless $formatter; + return $formatter->gff_string($self); +} + +my $static_gff_formatter = undef; + +=head2 _static_gff_formatter + + Title : _static_gff_formatter + Usage : + Function: + Example : + Returns : + Args : + + +=cut + +sub _static_gff_formatter{ + my ($self,@args) = @_; + + if( !defined $static_gff_formatter ) { + $static_gff_formatter = Bio::Tools::GFF->new('-gff_version' => 2); + } + return $static_gff_formatter; +} + + + +=head1 RangeI methods + +These methods are inherited from RangeI and can be used +directly from a SeqFeatureI interface. Remember that a +SeqFeature is-a RangeI, and so wherever you see RangeI you +can use a feature ($r in the below documentation). + +=head2 overlaps + + Title : overlaps + Usage : if($feat->overlaps($r)) { do stuff } + if($feat->overlaps(200)) { do stuff } + Function: tests if $feat overlaps $r + Args : a RangeI to test for overlap with, or a point + Returns : true if the Range overlaps with the feature, false otherwise + + +=head2 contains + + Title : contains + Usage : if($feat->contains($r) { do stuff } + Function: tests whether $feat totally contains $r + Args : a RangeI to test for being contained + Returns : true if the argument is totaly contained within this range + + +=head2 equals + + Title : equals + Usage : if($feat->equals($r)) + Function: test whether $feat has the same start, end, strand as $r + Args : a RangeI to test for equality + Returns : true if they are describing the same range + + +=head1 Geometrical methods + +These methods do things to the geometry of ranges, and return +triplets (start, stop, strand) from which new ranges could be built. + +=head2 intersection + + Title : intersection + Usage : ($start, $stop, $strand) = $feat->intersection($r) + Function: gives the range that is contained by both ranges + Args : a RangeI to compare this one to + Returns : nothing if they do not overlap, or the range that they do overlap + +=head2 union + + Title : union + Usage : ($start, $stop, $strand) = $feat->union($r); + : ($start, $stop, $strand) = Bio::RangeI->union(@ranges); + Function: finds the minimal range that contains all of the ranges + Args : a range or list of ranges to find the union of + Returns : the range containing all of the ranges + +=cut + +=head2 location + + Title : location + Usage : my $location = $seqfeature->location() + Function: returns a location object suitable for identifying location + of feature on sequence or parent feature + Returns : Bio::LocationI object + Args : none + + +=cut + +sub location { + my ($self) = @_; + + $self->throw_not_implemented(); +} + + +1;