Bio::SeqFeature FeaturePair
SummaryIncluded librariesPackage variablesSynopsisDescriptionGeneral documentationMethods
Summary
Bio::SeqFeature::FeaturePair - hold pair feature information e.g. blast hits
Package variables
No package variables defined.
Included modules
Bio::Factory::ObjectFactory
Bio::SeqFeature::Generic
Bio::SeqFeatureI
Inherit
Bio::SeqFeature::Generic
Synopsis
    my $feat  = new Bio::SeqFeature::FeaturePair(-feature1 => $f1,
						 -feature2 => $f2,
					      );

    # Bio::SeqFeatureI methods can be used

    my $start = $feat->start;
    my $end   = $feat->end;

    # Bio::FeaturePair methods can be used
    my $hstart = $feat->hstart;
    my $hend   = $feat->hend;

   my $feature1 = $feat->feature1;  # returns feature1 object
Description
A sequence feature object where the feature is itself a feature on
another sequence - e.g. a blast hit where residues 1-40 of a protein
sequence SW:HBA_HUMAN has hit to bases 100 - 220 on a genomic sequence
HS120G22. The genomic sequence coordinates are used to create one
sequence feature $f1 and the protein coordinates are used to create
feature $f2. A FeaturePair object can then be made
    my $fp = new Bio::SeqFeature::FeaturePair(-feature1 => $f1,   # genomic
					      -feature2 => $f2,   # protein
					      );
This object can be used as a standard Bio::SeqFeatureI in which case
    my $gstart = $fp->start  # returns start coord on feature1 - genomic seq.
    my $gend   = $fp->end    # returns end coord on feature1.
In general standard Bio::SeqFeatureI method calls return information
in feature1.
Data in the feature 2 object are generally obtained using the standard
methods prefixed by h (for hit!)
    my $pstart = $fp->hstart # returns start coord on feature2 = protein seq.
    my $pend   = $fp->hend   # returns end coord on feature2.
If you wish to swap feature1 and feature2 around :
    $feat->invert
so...
    $feat->start # etc. returns data in $feature2 object
No sub_SeqFeatures or tags can be stored in this object directly. Any
features or tags are expected to be stored in the contained objects
feature1, and feature2.
Methods
newDescriptionCode
feature1DescriptionCode
feature2DescriptionCode
startDescriptionCode
endDescriptionCode
strandDescriptionCode
locationDescriptionCode
scoreDescriptionCode
frameDescriptionCode
primary_tagDescriptionCode
source_tagDescriptionCode
seq_id
No description
Code
hseq_id
No description
Code
hstartDescriptionCode
hendDescriptionCode
hstrandDescriptionCode
hscoreDescriptionCode
hframeDescriptionCode
hprimary_tagDescriptionCode
hsource_tagDescriptionCode
invertDescriptionCode
feature_factoryDescriptionCode
hseqnameDescriptionCode
cleanup_fp
No description
Code
Methods description
newcode    nextTop
 Title   : new
 Usage   :
 Function: Constructor for this module. Accepts the following parameters:

             -feature1   Bio::SeqFeatureI-compliant object
             -feature2   Bio::SeqFeatureI-compliant object
             -feature_factory  Bio::Factory::ObjectFactoryI compliant
                         object to be used when feature1 and/or feature2
                         are accessed without explicitly set before. This
                         is mostly useful for derived classes who want to
                         set their preferred class for feature objects.

 Example :
 Returns : 
 Args    : see above
feature1codeprevnextTop
 Title   : feature1
 Usage   : $f = $featpair->feature1
           $featpair->feature1($feature)
 Function: Get/set for the query feature
 Returns : Bio::SeqFeatureI
 Args    : Bio::SeqFeatureI
feature2codeprevnextTop
 Title   : feature2
 Usage   : $f = $featpair->feature2
           $featpair->feature2($feature)
 Function: Get/set for the hit feature
 Returns : Bio::SeqFeatureI
 Args    : Bio::SeqFeatureI
startcodeprevnextTop
 Title   : start
 Usage   : $start = $featpair->start
           $featpair->start(20)
 Function: Get/set on the start coordinate of feature1
 Returns : integer
 Args    : [optional] beginning of feature
endcodeprevnextTop
 Title   : end
 Usage   : $end = $featpair->end
           $featpair->end($end)
 Function: get/set on the end coordinate of feature1
 Returns : integer
 Args    : [optional] ending point of feature
strandcodeprevnextTop
 Title   : strand
 Usage   : $strand = $feat->strand()
           $feat->strand($strand)
 Function: get/set on strand information, being 1,-1 or 0
 Returns : -1,1 or 0
 Args    : [optional] strand information to set
locationcodeprevnextTop
 Title   : location
 Usage   : $location = $featpair->location
           $featpair->location($location)
 Function: Get/set location object (using feature1)
 Returns : Bio::LocationI object
 Args    : [optional] LocationI to store
scorecodeprevnextTop
 Title   : score
 Usage   : $score = $feat->score()
           $feat->score($score)
 Function: get/set on score information
 Returns : float
 Args    : none if get, the new value if set
framecodeprevnextTop
 Title   : frame
 Usage   : $frame = $feat->frame()
           $feat->frame($frame)
 Function: get/set on frame information
 Returns : 0,1,2
 Args    : none if get, the new value if set
primary_tagcodeprevnextTop
 Title   : primary_tag
 Usage   : $ptag = $featpair->primary_tag
 Function: get/set on the primary_tag of feature1
 Returns : 0,1,2
 Args    : none if get, the new value if set
source_tagcodeprevnextTop
 Title   : source_tag
 Usage   : $tag = $feat->source_tag()
           $feat->source_tag('genscan');
 Function: Returns the source tag for a feature,
           eg, 'genscan' 
 Returns : a string 
 Args    : none
hstartcodeprevnextTop
 Title   : hstart
 Usage   : $start = $featpair->hstart
           $featpair->hstart(20)
 Function: Get/set on the start coordinate of feature2
 Returns : integer
 Args    : none
hendcodeprevnextTop
 Title   : hend
 Usage   : $end = $featpair->hend
           $featpair->hend($end)
 Function: get/set on the end coordinate of feature2
 Returns : integer
 Args    : none
hstrandcodeprevnextTop
 Title   : hstrand
 Usage   : $strand = $feat->strand()
           $feat->strand($strand)
 Function: get/set on strand information, being 1,-1 or 0
 Returns : -1,1 or 0
 Args    : none
hscorecodeprevnextTop
 Title   : hscore
 Usage   : $score = $feat->score()
           $feat->score($score)
 Function: get/set on score information
 Returns : float
 Args    : none if get, the new value if set
hframecodeprevnextTop
 Title   : hframe
 Usage   : $frame = $feat->frame()
           $feat->frame($frame)
 Function: get/set on frame information
 Returns : 0,1,2
 Args    : none if get, the new value if set
hprimary_tagcodeprevnextTop
 Title   : hprimary_tag
 Usage   : $ptag = $featpair->hprimary_tag
 Function: Get/set on the primary_tag of feature2
 Returns : 0,1,2
 Args    : none if get, the new value if set
hsource_tagcodeprevnextTop
 Title   : hsource_tag
 Usage   : $tag = $feat->hsource_tag()
           $feat->source_tag('genscan');
 Function: Returns the source tag for a feature,
           eg, 'genscan' 
 Returns : a string 
 Args    : none
invertcodeprevnextTop
 Title   : invert
 Usage   : $tag = $feat->invert
 Function: Swaps feature1 and feature2 around
 Returns : Nothing
 Args    : none
feature_factorycodeprevnextTop
 Title   : feature_factory
 Usage   : $obj->feature_factory($newval)
 Function: Get/set the feature object factory for this feature pair.

           The feature object factory will be used to create a feature
           object if feature1() or feature2() is called in get mode
           without having been set before.

           The default is an instance of Bio::Factory::ObjectFactory
           and hence allows the type to be changed dynamically at any
           time.

 Example : 
 Returns : The feature object factory in use (a 
           Bio::Factory::ObjectFactoryI compliant object)
 Args    : on set, a Bio::Factory::ObjectFactoryI compliant object
hseqnamecodeprevnextTop
 Title   : hseqname
 Usage   : $featpair->hseqname($newval)
 Function: Get/set method for the name of
           feature2.
 Returns : value of $feature2->seq_id
 Args    : newvalue (optional)
Methods code
newdescriptionprevnextTop
sub new {
    my ($class, @args) = @_;

    #
# We've got a certain problem here that somewhat relates to chicken and
# eggs. The problem is, we override a lot of SeqFeatureI methods here
# to delegate them to either feature1 or feature2. If we pass along
# those attributes right away, we need feature1 or feature2 or the feature
# factory in place, or there is no way around the dreaded default, which
# is ugly too (as it necessitates subsequent copying if you wanted a
# different feature object class).
#
# So I decided to go with the lesser of two evils here: we need to assume
# here that we can set all attributes through set_attributes(), which we
# assume is no different from setting them through the constructor. This
# gives us a window to set the feature objects and the factory, such that
# any derived class doesn't have to worry about this any more.
#
# I'm happy to hear a better solution, but I think this one isn't so bad.
#
my $self = $class->SUPER::new(); my ($feature1,$feature2,$featfact) = $self->_rearrange([qw(FEATURE1 FEATURE2 FEATURE_FACTORY )],@args); $self->_register_for_cleanup(\&cleanup_fp); # initialize the feature object factory if not provided
if(! $featfact) { $featfact = Bio::Factory::ObjectFactory->new( -type => "Bio::SeqFeature::Generic", -interface => "Bio::SeqFeatureI"); } $self->feature_factory($featfact); # Store the features in the object
$feature1 && $self->feature1($feature1); $feature2 && $self->feature2($feature2); # OK. Now we're setup to store all the attributes, and they'll go right
# away into the right objects.
$self->set_attributes(@args); # done - we hope
return $self;
}
feature1descriptionprevnextTop
sub feature1 {
    my ($self,$arg) = @_;    
    if ( defined($arg) || !defined $self->{'feature1'} ) {
	$self->throw("internal error: feature factory not set!") 
	    unless $self->feature_factory;
	$arg = $self->feature_factory->create_object() unless( defined $arg);
	$self->throw("Argument [$arg] must be a Bio::SeqFeatureI") 
	    unless (ref($arg) && $arg->isa("Bio::SeqFeatureI"));
	$self->{'feature1'} = $arg;
    }
    return $self->{'feature1'};
}
feature2descriptionprevnextTop
sub feature2 {
    my ($self,$arg) = @_;

    if ( defined($arg) || ! defined $self->{'feature2'}) {
	$self->throw("internal error: feature factory not set!") 
	    unless $self->feature_factory;
	$arg = $self->feature_factory->create_object() unless( defined $arg);
	$self->throw("Argument [$arg] must be a Bio::SeqFeatureI") 
	    unless (ref($arg) && $arg->isa("Bio::SeqFeatureI"));
	$self->{'feature2'} = $arg;
    }
    return $self->{'feature2'};
}
startdescriptionprevnextTop
sub start {
    return shift->feature1->start(@_);
}
enddescriptionprevnextTop
sub end {
    return shift->feature1->end(@_);
}
stranddescriptionprevnextTop
sub strand {
    return shift->feature1->strand(@_);
}
locationdescriptionprevnextTop
sub location {
    return shift->feature1->location(@_);
}
scoredescriptionprevnextTop
sub score {
    return shift->feature1->score(@_);
}
framedescriptionprevnextTop
sub frame {
    return shift->feature1->frame(@_);
}
primary_tagdescriptionprevnextTop
sub primary_tag {
    return shift->feature1->primary_tag(@_);
}
source_tagdescriptionprevnextTop
sub source_tag {
    return shift->feature1->source_tag(@_);
}
seq_iddescriptionprevnextTop
sub seq_id {
    return shift->feature1->seq_id(@_);
}
hseq_iddescriptionprevnextTop
sub hseq_id {
    return shift->feature2->seq_id(@_);
}
hstartdescriptionprevnextTop
sub hstart {
    return shift->feature2->start(@_);
}
henddescriptionprevnextTop
sub hend {
    return shift->feature2->end(@_);
}
hstranddescriptionprevnextTop
sub hstrand {
    return shift->feature2->strand(@_);
}
hscoredescriptionprevnextTop
sub hscore {
    return shift->feature2->score(@_);
}
hframedescriptionprevnextTop
sub hframe {
    return shift->feature2->frame(@_);
}
hprimary_tagdescriptionprevnextTop
sub hprimary_tag {
    return shift->feature2->primary_tag(@_);
}
hsource_tagdescriptionprevnextTop
sub hsource_tag {
    return shift->feature2->source_tag(@_);
}
invertdescriptionprevnextTop
sub invert {
    my ($self) = @_;

    my $tmp = $self->feature1;
    
    $self->feature1($self->feature2);
    $self->feature2($tmp);
    return undef;
}
feature_factorydescriptionprevnextTop
sub feature_factory {
    my $self = shift;

    return $self->{'feature_factory'} = shift if @_;
    return $self->{'feature_factory'};
}
hseqnamedescriptionprevnextTop
sub hseqname {
    my $self = shift;
    $self->warn("SeqFeatureI::seqname() is deprecated. Please use seq_id() instead.");
    return $self->hseq_id(@_);
}
cleanup_fpdescriptionprevnextTop
sub cleanup_fp {
    my $self = shift;
    $self->{'feature1'} = $self->{'feature2'} = undef;
}
General documentation
CONTACTTop
Ewan Birney <birney@sanger.ac.uk>
APPENDIXTop
The rest of the documentation details each of the object
methods. Internal methods are usually preceded with a _
seqnameTop
 Title   : seqname
 Usage   : $obj->seq_id($newval)
 Function: There are many cases when you make a feature that you
           do know the sequence name, but do not know its actual
           sequence. This is an attribute such that you can store 
           the seqname.

           This attribute should *not* be used in GFF dumping, as
           that should come from the collection in which the seq
           feature was found.
 Returns : value of seqname
 Args    : newvalue (optional)