[Bioperl-l] about Bio::Annotation::Collection
Allen Day
allenday at ucla.edu
Mon Nov 1 13:39:48 EST 2004
a couple of points:
[1] Bio::Annotation::Collection won't accomodate anything that isn't an
annotation. This means it won't accept Bio::Location::Simple or
Bio::LocatableSeq objects. We need to write our own accessors into the
SeqFeature (or inherit from something that stores multiple locations)
[2] Bio::Location::Simple only stores a coordinate pair. It doesn't
store the reference sequence identifier -- something that is important for
a feature target.
I'm about to commit code for handling target objects. It requires you
instantiate a Bio::LocatableSeq outside the Bio::SeqFeature::Annotated,
and pass it in. We can try to make the method smarter so it can
understand strings like "chr1:+:1..100", but I've left it out for now.
Here's the patch (which has been applied):
--- ./Bio/SeqFeature/Annotated.pm 22 Oct 2004 14:55:15 -0000 1.5
+++ ./Bio/SeqFeature/Annotated.pm 1 Nov 2004 19:04:22 -0000
@@ -5,6 +5,7 @@ use base qw(Bio::Root::Root Bio::SeqFeat
use Bio::Root::Root;
use Bio::Annotation::Collection;
+use Bio::LocatableSeq;
use Bio::Location::Simple;
use Bio::Tools::GFF;
@@ -448,21 +449,20 @@ sub score {
return $self->{'_gsf_score'};
}
-=head2 phase
-
+=head2 phase
+
Title : phase
Usage : $phase = $feat->phase()
$feat->phase($phase)
Function: get/set on phase information
Returns : 0,1,2, '.'
Args : none if get, the new value if set
-
-
+
=cut
sub phase {
my $self = shift;
-
+
if ( @_ ) {
my $value = shift;
if ( defined $value &&
@@ -531,6 +531,40 @@ sub location {
}
return $self->{'_location'};
}
+
+=head2 add_target()
+
+ Usage : $seqfeature->add_target(Bio::LocatableSeq->new(...));
+ Function: adds a target location on another reference sequence for this feature
+ Returns : true on success
+ Args : a Bio::LocatableSeq object
+
+
+=cut
+
+sub add_target {
+ my ($self,$seq) = @_;
+ $self->throw("$seq is not a Bio::LocatableSeq, bailing out") unless ref($seq) and seq->isa('Bio::LocatableSeq');
+ push @{ $self->{'targets'} }, $seq;
+ return $seq;
+}
+
+=head2 each_target()
+
+ Usage : @targets = $seqfeature->each_target();
+ Function: Returns a list of Bio::LocatableSeqs which are the locations of this object.
+ To obtain the "primary" location, see L</location()>.
+ Returns : a list of 0..N Bio::LocatableSeq objects
+ Args : none
+
+
+=cut
+
+sub each_target {
+ my ($self) = @_;
+ return $self->{'targets'} ? @{ $self->{'targets'} } : ();
+}
+
sub _no_tags {
my $self = shift;
-Allen
On Mon, 1 Nov 2004, Steffen Grossmann wrote:
> Dear Scott,
>
> to make it work you have to write something like
>
> my $ta = Bio::Annotation::SimpleValue->new(-value => $target_loc);
> $ac->add_Annotation('Target',$ta);
>
> Do this for every target entry you want to add. You can then retrieve
> the targets from the collection by calling
>
> my @targets = $ac->get_Annotations('Target');
>
> or (from the point of view of the Bio::SeqFeature::Annotated object)
>
> my @targets = $feature->annotation->get_Annotations('Target');
>
> If you are writing your own 'target'-method (which should be a part of
> Bio::SeqFeature::Annotated) in the way you do it, you are outside the
> Bio::Annotation concept. But one can also think about writing a
> 'target'-method, which writes/reads into the feature's
> Bio::Annotation::Collection object.
>
> Hope this helps! Actually, I thought it to be more natural to use
> something like Bio::SeqFeature::FeaturePair to deal with the target
> entries in the GFF3 file. But obviously this is not compatible with
> Bio::SeqFeature::Annotated (cf.
> http://bioperl.org/pipermail/bioperl-l/2004-October/017195.html)...
>
> Steffen
>
>
> Scott Cain wrote:
>
> >Hello all,
> >
> >I am trying to flesh out Bio::FeatureIO::gff to handle Target strings in
> >GFF3 files. What I would like to do is to create an array of
> >Bio::Location::Simple objects to represent the (potentially more than
> >one) Target strings, and then add them to the annotations for for the
> >line, presumably as a Bio::Annotation::Collection. The thing is, I have
> >no idea how B::A::C works. Here is the documentation for the method
> >'add_Annotation', which is what I would want to use. Note the mention
> >of an archetype without defining it (though I think it refers to the
> >last line in the Usage section):
> >
> > add_Annotation
> >
> > Title : add_Annotation
> > Usage : $self->add_Annotation('reference',$object);
> > $self->add_Annotation($object,'Bio::MyInterface::DiseaseI');
> > $self->add_Annotation($object);
> > $self->add_Annotation('disease',$object,'Bio::MyInterface::DiseaseI');
> > Function: Adds an annotation for a specific key.
> >
> > If the key is omitted, the object to be added must provide a value
> > via its tagname().
> >
> >
> >
> > If the archetype is provided, this and future objects added under
> > that tag have to comply with the archetype and will be rejected
> > otherwise.
> >
> > Returns : none
> > Args : annotation key ('disease', 'dblink', ...)
> > object to store (must be Bio::AnnotationI compliant)
> > [optional] object archetype to map future storage of object
> > of these types to
> >
> >Here is the section of code from Bio::FeatureIO::gff where I would like
> >to use the Target string; my approach certainly seems to conflict with
> >what Bio::Annotation would like, but it is not clear to me how to use it
> >in this context.
> >
> > if($attr{Target}){
> > foreach my $target_string (@{ $attr{Target} } ) {
> > $target_string =~ s/\+/ /g;
> > my ($t_id,$tstart,$tend,$strand,$extra) = split /\s+/, $target_string;
> > if (!$tend || $extra) { # too much or too little stuff in the string
> > $self->throw("The value in the Target string, $target_string, does not conform to the GFF3 specification");
> > }
> > my $target_loc = Bio::Location::Simple->new(
> > -seq_id => $t_id,
> > -start => $tstart,
> > -end => $tend,
> > );
> >
> > if ($strand eq '+') {
> > $strand = 1;
> > } elsif ($strand eq '-') {
> > $strand = -1;
> > }
> > $target_loc->strand($strand) if $strand;
> > $target_loc->is_remote(1);
> >
> > $self->target($target_loc);
> > }
> > $ac->add_Annotation('Target',$self->target());
> > }
> >
> >... and ...
> >
> >=head2 target
> >
> > Title : target
> > Usage : $obj->target($newval)
> > Function: Either return an array ref with Bio::LocationI objects
> > representing the targets, or to add a target to the
> > internal target list
> > Example : my @targets = $obj->target();
> > $obj->target($newtarget);
> > Returns : A list of Bio::LocationI objects
> > Args : On set, a Bio::LocationI object
> >
> >
> >=cut
> >
> >sub target {
> > my $self = shift;
> > push @{$self->{'target'}}, shift if defined(@_);
> > return \@{$self->{'target'}};
> >}
> >
> >Thanks,
> >Scott
> >
> >
> >
> >
>
>
More information about the Bioperl-l
mailing list