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

Hilmar Lapp hlapp at gmx.net
Sat Mar 28 19:35:07 UTC 2009


As I said earlier, it's worth keeping in mind that expressly unless  
told otherwise in a parser documentation, a sequence you get back from  
one of the SeqIO parsers (which is where most people will get them  
from) will *not* have $feature->annotation() populated.

And as I said, if you don't want to care where to look for the  
annotation, use SeqFeature::AnnotationAdapter:

	my $anncoll = Bio::SeqFeature::AnnotationAdaptor->new();
	foreach my $feat ($seq->get_all_SeqFeatures) {
		$anncoll->feature($feat);
		@vals = $anncoll->get_Annotations('locus_tag');
		# do something with @vals
	}

-hilmar

On Mar 27, 2009, at 4:09 PM, Mark A. Jensen wrote:

> Probably folks just starting to use 1.6 will be shunted in the
> right direction by the docs, but those making the switch
> might reasonably get confused (resulting in this thread, e.g.).
> If someone tries to do $feature->annotation- 
> >getAnnotations('locus_tag')
> when $feature->annotation is undef, then probably that user is
> not hip to $feature->get_tag_values('locus_tag'), and would appreciate
> something like
> "Annotation property undefined. Did you mean $feature- 
> >get_tag_values?"
> (not nec. that specific, but you get my drift?)
> MAJ
>
> ----- Original Message ----- From: "Chris Fields" <cjfields at illinois.edu 
> >
> To: "Mark A. Jensen" <maj at fortinbras.us>
> Cc: "Hilmar Lapp" <hlapp at gmx.net>; "Govind Chandra" <govind.chandra at bbsrc.ac.uk 
> >; <bioperl-l at lists.open-bio.org>
> Sent: Friday, March 27, 2009 3:49 PM
> Subject: Re: [Bioperl-l] Bio::AnnotatableI function annotation()
>
>
>> What exactly would the hint be?  I'm not sure, but I don't think  
>> there  is any documentation indicating that one should use anything  
>> other  than tag methods to retrieve generic data.  We *could*  
>> possibly add in  code to check the feature's  
>> Bio::Annotation::Collection for the same  tag name, then add any  
>> returned AnnotationI::display_text to the array  of returned values.
>>
>> This all depends on:
>>
>> 1) whether you want to mix your 'peanut butter' with your  
>> 'chocolate'  or keep them separate (amazingly, some people don't  
>> like Reese's  peanut butter cups), and
>> 2) whether you want to automatically check for the empty  
>> collection  each time (the Collection is lazily created on the fly  
>> if one isn't  supplied, so it may slow things down by creating the  
>> instance for  every has_tag check).
>>
>> chris
>>
>> On Mar 27, 2009, at 1:29 PM, Mark A. Jensen wrote:
>>
>>> Thanks Hilmar-- so there isn't really a bug, but would it
>>> be useful if the object warned a user who attempts to access an   
>>> empty $feature->annotation with a hint encapsulating
>>> your discussion below?
>>> MAJ
>>> ----- Original Message ----- From: "Hilmar Lapp" <hlapp at gmx.net>
>>> To: "Govind Chandra" <govind.chandra at bbsrc.ac.uk>
>>> Cc: "Mark A. Jensen" <maj at fortinbras.us>; <bioperl-l at lists.open-bio.org
>>> >
>>> Sent: Friday, March 27, 2009 2:14 PM
>>> Subject: Re: [Bioperl-l] Bio::AnnotatableI function annotation()
>>>
>>>
>>>> $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
>>
>>

-- 
===========================================================
: Hilmar Lapp  -:-  Durham, NC  -:-  hlapp at gmx dot net :
===========================================================






More information about the Bioperl-l mailing list