[Bioperl-l] Bio::AnnotatableI function annotation()

Chris Fields cjfields at illinois.edu
Fri Mar 27 15:34:41 EDT 2009


No, it's been that way for quite a while now. From the 1.2 branch (6  
yrs old) for Bio::SeqFeature::Generic:
@ISA = qw(Bio::Root::Root Bio::SeqFeatureI Bio::AnnotatableI  
Bio::FeatureHolderI);
I think there is still some contention about what the difference is  
between a Feature and an Annotation.  Our basic assumption is a  
Feature describes a specific section of the sequence while Annotation  
describes the full sequence.

However, we do have Annotation implementations that can describe parts  
of the sequence (Bio::Annotation::Reference, Bio::Annotation::Target)  
and Features that describe the entire sequence (the GenBank/EMBL  
'source' feature).  This is probably a good compromise.

Personally, I think all sequences should be RangeI (implement start/ 
end/strand) and have SeqFeature::Collections, that SeqFeatureI should  
be genericized to FeatureI to allow descriptives of any range  
(sequence, alignment, array, whatever), and that most object creation  
should be on the fly vs. up-front.  Oh if I only had the tuits...

chris

On Mar 27, 2009, at 2:14 PM, Mark A. Jensen wrote:

> So, is it right that the inheritance of AnnotatableI by  
> SeqFeature::Generic was
> essentially for backward-compatibility?
> MAJ
> ----- Original Message ----- From: "Chris Fields" <cjfields at illinois.edu 
> >
> To: "Hilmar Lapp" <hlapp at gmx.net>
> Cc: "Govind Chandra" <govind.chandra at bbsrc.ac.uk>; <bioperl-l at lists.open-bio.org 
> >; "Mark A. Jensen" <maj at fortinbras.us>
> Sent: Friday, March 27, 2009 3:02 PM
> Subject: Re: [Bioperl-l] Bio::AnnotatableI function annotation()
>
>
>> Right now SeqFeatureI doesn't inherit AnnotatableI, even though  
>> the  note about the deprecated *_tag_* methods imply that it does.   
>> We  should probably add back the abstract (unimplemented) tag  
>> methods to  Bio::SeqFeatureI and either remove them from  
>> Bio::AnnotatableI or  activate the deprecation (they have no place  
>> with annotations).  This  shouldn't hurt things (FLW).
>>
>> Not sure if we really need to add AnnotatableI to SeqFeatureI; I  
>> think  that would be up to the SeqFeatureI implementation, and it  
>> doesn't  hurt leaving it out.
>>
>> chris
>>
>> On Mar 27, 2009, at 1:14 PM, Hilmar Lapp wrote:
>>
>>> $feature->annotation() is a legitimate method call (it implements  
>>> AnnotatableI).
>>>
>>> SeqFeature::Generic has indeed two mechanism to store annotation,   
>>> the tag system and the annotation collection. This is because it   
>>> inherits from SeqFeatureI (which brings in the tag/value  
>>> annotation)  and from AnnotatableI (which brings in annotation()).
>>>
>>> I agree this can be confusing from a user's perspective. As a  
>>> rule  of thumb, SeqIO parsers will almost universally populate  
>>> only the  tag/value system, because typically they will (or  
>>> should) assume not  more than that the feature object they are  
>>> dealing with is a  SeqFeatureI.
>>>
>>> Once you have the feature objects in your hands, you can add to   
>>> either tag/values or annotation() to your heart's content. Just  
>>> be  aware that nearly all SeqIO writers won't use the  
>>> annotation()  collection when you pass the sequence back to them  
>>> since typically  they won't really know what to do with feature  
>>> annotation that isn't  tag/value (unlike as for sequence  
>>> annotation).
>>>
>>> If in your code you want to treat tag/value annotation in the  
>>> same  way as (i.e., as if it were part of) the annotation that's  
>>> in the  annotation collection then use  
>>> SeqFeature::AnnotationAdaptor. That's  in fact what Bioperl-db  
>>> does to ensure that all annotation gets  serialized to the  
>>> database no matter where it is.
>>>
>>> Hth,
>>>
>>> -hilmar
>>>
>>> On Mar 27, 2009, at 1:44 PM, Govind Chandra wrote:
>>>
>>>> Hi Mark,
>>>> Will it be unfair to say that the documentation as well as the
>>>> implementation are confusing. SeqFeature::Generic should cause  
>>>> an  error
>>>> when annotation() is called on it if it cannot do the right  
>>>> thing.  For
>>>> the time being I will stick with the old ways (has_tag etc.).  
>>>> Good to
>>>> know they are not deprecated in the way I intend to use them (via
>>>> SeqFeature::Generic).
>>>> Cheers
>>>> Govind
>>>>
>>>>
>>>>
>>>> On Fri, 2009-03-27 at 13:30 -0400, Mark A. Jensen wrote:
>>>>> Hey Govind--
>>>>> You're right-- SeqFeature::Generic object inherits from
>>>>> AnnotatableI-- but the *_tags_* methods are now
>>>>> SeqFeature::Generic methods--ie, you can use these
>>>>> on features, and they are no longer hitting AnnotableI.
>>>>> It appears that the feature's AnnotationCollection doesn't
>>>>> even get loaded now.
>>>>> [developer out there like to chime in?]
>>>>> cheers,
>>>>> Mark
>>>>> ----- Original Message -----
>>>>> From: "Govind Chandra" <govind.chandra at bbsrc.ac.uk>
>>>>> To: "Mark A. Jensen" <maj at fortinbras.us>
>>>>> Cc: <bioperl-l at lists.open-bio.org>
>>>>> Sent: Friday, March 27, 2009 1:09 PM
>>>>> Subject: [Bioperl-l] Bio::AnnotatableI function annotation()
>>>>>
>>>>>
>>>>>> Thanks Mark,
>>>>>>
>>>>>> Sorry for not putting a proper subject in the last post.
>>>>>>
>>>>>> What you suggest is what I have been doing for a long time. I  
>>>>>> am  just
>>>>>> trying to alter my code to conform to the latest bioperl  
>>>>>> version  and ran
>>>>>> into this issue. I could be wrong (I am more a user rather  
>>>>>> than  writer
>>>>>> of modules) but since $feature->annotation() does not result  
>>>>>> in  an error
>>>>>> I think $feature is-a Bio::AnnotatableI as well.
>>>>>>
>>>>>> Cheers
>>>>>>
>>>>>> Govind
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Fri, 2009-03-27 at 12:17 -0400, Mark A. Jensen wrote:
>>>>>>> Hi Govind-
>>>>>>>
>>>>>>> As near as I can tell, the *_tags methods are deprecated for
>>>>>>> Bio::AnnotatableI objects, but these methods are available
>>>>>>> off the SeqFeatureI objects themselves: i.e., rather than
>>>>>>>
>>>>>>>> $ac=$feature->annotation();
>>>>>>>> $temp1=$ac->get_Annotations("locus_tag");
>>>>>>>
>>>>>>> do
>>>>>>>
>>>>>>> $temp1 = $feature->get_tag_values("locus_tag");
>>>>>>>
>>>>>>> directly.
>>>>>>>
>>>>>>> hope it helps -
>>>>>>> Mark
>>>>>>>
>>>>>>> ----- Original Message -----
>>>>>>> From: "Govind Chandra" <govind.chandra at bbsrc.ac.uk>
>>>>>>> To: <bioperl-l at lists.open-bio.org>
>>>>>>> Sent: Friday, March 27, 2009 11:26 AM
>>>>>>> Subject: Re: [Bioperl-l] Bioperl-l Digest, Vol 71, Issue 15
>>>>>>>
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> The code below
>>>>>>>>
>>>>>>>>
>>>>>>>> ====== code begins =======
>>>>>>>> #use strict;
>>>>>>>> use Bio::SeqIO;
>>>>>>>>
>>>>>>>> $infile='NC_000913.gbk';
>>>>>>>> my $seqio=Bio::SeqIO->new(-file => $infile);
>>>>>>>> my $seqobj=$seqio->next_seq();
>>>>>>>> my @features=$seqobj->all_SeqFeatures();
>>>>>>>> my $count=0;
>>>>>>>> foreach my $feature (@features) {
>>>>>>>> unless($feature->primary_tag() eq 'CDS') {next;}
>>>>>>>> print($feature->start(),"   ", $feature->end(), "
>>>>>>>> ",$feature->strand(),"\n");
>>>>>>>> $ac=$feature->annotation();
>>>>>>>> $temp1=$ac->get_Annotations("locus_tag");
>>>>>>>> @temp2=$ac->get_Annotations();
>>>>>>>> print("$temp1   $temp2[0] @temp2\n");
>>>>>>>> if($count++ > 5) {last;}
>>>>>>>> }
>>>>>>>>
>>>>>>>> print(ref($ac),"\n");
>>>>>>>> exit;
>>>>>>>>
>>>>>>>> ======= code ends ========
>>>>>>>>
>>>>>>>> produces the output
>>>>>>>>
>>>>>>>> ========== output begins ========
>>>>>>>>
>>>>>>>> 190   255   1
>>>>>>>> 0
>>>>>>>> 337   2799   1
>>>>>>>> 0
>>>>>>>> 2801   3733   1
>>>>>>>> 0
>>>>>>>> 3734   5020   1
>>>>>>>> 0
>>>>>>>> 5234   5530   1
>>>>>>>> 0
>>>>>>>> 5683   6459   -1
>>>>>>>> 0
>>>>>>>> 6529   7959   -1
>>>>>>>> 0
>>>>>>>> Bio::Annotation::Collection
>>>>>>>>
>>>>>>>> =========== output ends ==========
>>>>>>>>
>>>>>>>> $ac is-a Bio::Annotation::Collection but does not actually   
>>>>>>>> contain any
>>>>>>>> annotation from the feature. Is this how it should be? I  
>>>>>>>> cannot  figure
>>>>>>>> out what is wrong with the script. Earlier I used to use   
>>>>>>>> has_tag(),
>>>>>>>> get_tag_values() etc. but the documentation says these are   
>>>>>>>> deprecated.
>>>>>>>>
>>>>>>>> Perl is 5.8.8. BioPerl version is 1.6 (installed today).  
>>>>>>>> Output  of uname
>>>>>>>> -a is
>>>>>>>>
>>>>>>>> Linux n61347 2.6.18-92.1.6.el5 #1 SMP Fri Jun 20 02:36:06  
>>>>>>>> EDT  2008
>>>>>>>> x86_64 x86_64 x86_64 GNU/Linux
>>>>>>>>
>>>>>>>> Thanks in advance for any help.
>>>>>>>>
>>>>>>>> Govind
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> _______________________________________________
>>>>>>>> Bioperl-l mailing list
>>>>>>>> Bioperl-l at lists.open-bio.org
>>>>>>>> http://lists.open-bio.org/mailman/listinfo/bioperl-l
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Bioperl-l mailing list
>>>>>> Bioperl-l at lists.open-bio.org
>>>>>> http://lists.open-bio.org/mailman/listinfo/bioperl-l
>>>>>>
>>>>>>
>>>>
>>>> _______________________________________________
>>>> Bioperl-l mailing list
>>>> Bioperl-l at lists.open-bio.org
>>>> http://lists.open-bio.org/mailman/listinfo/bioperl-l
>>>
>>> -- 
>>> ===========================================================
>>> : Hilmar Lapp  -:-  Durham, NC  -:-  hlapp at gmx dot net :
>>> ===========================================================
>>>
>>>
>>>
>>> _______________________________________________
>>> Bioperl-l mailing list
>>> Bioperl-l at lists.open-bio.org
>>> http://lists.open-bio.org/mailman/listinfo/bioperl-l
>>
>>
>



More information about the Bioperl-l mailing list