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

Chris Fields cjfields at illinois.edu
Fri Mar 27 14:55:13 EDT 2009


(I think I'm generally right on this, but this may be where someone  
needs to step in to correct me)

To go over why things were set up this way (and then reverted), is a  
bit of a history lesson.  I believe prior to 1.5.0,  
Bio::SeqFeature::Generic stored most second-class data (dbxrefs,  
simple secondary tags, etc) as simple untyped text via tags but also  
allowed a Bio::Annotation::Collection.  Therefore one effectively gets  
a mixed bag of first-class untyped data like 'display_id' and  
'primary_tag', untyped tagged text, and 'typed' Bio::AnnotationI  
objects.

Some of this was an attempt to somewhat 'correct' this for those who  
wanted a cohesive collection of typed data out-of-the-box.   
Essentially, everything becomes a Bio::AnnotationI.  I believe  
Bio::SeqFeature::Annotated went a step further and made almost  
everything Bio::AnnotationI (including score, primary_tag, etc) and  
type-checked tag data against SOFA.

As there were collisions between SeqFeature-like 'tag' methods and  
CollectionI-like methods, the design thought was to store all tag data  
as Bio::Annotation in a Bio::Annotation::Collection, then eventually  
deprecate the tag methods in favor of those available via the  
CollectionI.  These deprecations were placed in Bio::AnnotatableI, so  
any future Bio::SeqFeatureI implementations would also  get the  
deprecation.  As noted, Bio::SeqFeature::Generic implements these  
methods so isn't affected.

Now, layer in the fact that many of these (very dramatic) code changes  
were literally introduced just prior to the 1.5.0 release, AFAIK w/o  
much code review, and contained additional unwanted changes such as  
operator overloading and so on.  Very little discussion about this  
occurred on list until after the changes were introduced (a good  
argument for small commits).  Some very good arguments against this  
were made, including other lightweight implementations.  Lots of angry  
devs!

Though the intentions were noble we ended up with a mess.  I yanked  
these out a couple of years ago frankly out of frustration with the  
overloading issues:

http://www.bioperl.org/wiki/Feature_Annotation_rollback

You may be seeing some relics that haven't been removed yet.

(just noticed Hilmar's post, which is more succinct, d'oh)

chris

On Mar 27, 2009, at 12: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



More information about the Bioperl-l mailing list