[Bioperl-l] Bio::AnnotatableI function annotation()
Chris Fields
cjfields at illinois.edu
Fri Mar 27 18:55:13 UTC 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