[Bioperl-l] Re: [BioSQL-l] removing features from a sequence
Hilmar Lapp
hlapp at gnf.org
Tue Oct 4 14:19:28 EDT 2005
On Oct 4, 2005, at 11:02 AM, Amit Indap wrote:
> Thanks Hilmar, this snippet worked:
>
> foreach my $pfeat( $dbseq->remove_SeqFeatures() ) {
>
> $pfeat->remove();
>
> }
> $dbseq->store();
Just as a small and technical note: if the only changes you made to the
object were to delete attached objects, then you don't need to call
$dbseq->store().
It doesn't hurt though either because the persistence adaptor will
check the is_dirty() property of a persistent object before issuing the
update command, and so if you only removed attached objects then
is_dirty() should still be false.
-hilmar
> $dbseq->commit();
>
>> Second, $dbseq->store() will only store it; i.e., it will update the
>> object and either update or insert all attached objects (like
>> features,
>> annotations, etc). If you want to delete attached objects then you
>> need
>> to do so explicitly by calling $pobj->remove().
>
> Thanks for clarifying this point. I was a bit confused about whether I
> needed to call store or remove. But you are right, I need to
> explicitly call remove.
>
> On 10/3/05, Hilmar Lapp <hlapp at gnf.org> wrote:
>> Yeah I guess this is one of the gotcha's that deserve better
>> documentation. The bioperl-db adaptors will not automatically 'sync'
>> the database with an object. The reason is that there are too many
>> flavors of what you could possibly want as a user, so instead of
>> making
>> decisions for you you need to make explicit what you want; however,
>> doing so should be reasonably simple.
>>
>> So here's what's going on and how you can fix it.
>>
>> First, $dbseq->remove_SeqFeatures() is a Bio::SeqI method present for
>> all SeqI objects, not just persistent ones. Except in a few cases
>> where
>> lazy loading is already implemented, methods from the native Bioperl
>> API are not overridden for persistent objects; i.e., you can
>> manipulate
>> your persistent object to your heart's content and nothing will happen
>> to the respective row(s) in the database. You need to say
>> $dbseq->store() to let your changes take effect. But see below!
>>
>> Second, $dbseq->store() will only store it; i.e., it will update the
>> object and either update or insert all attached objects (like
>> features,
>> annotations, etc). If you want to delete attached objects then you
>> need
>> to do so explicitly by calling $pobj->remove().
>>
>> For example, in your case:
>>
>> # ... find $dbseq ...
>> # delete all features from the database
>> # Note: I could use $dbseq->get_SeqFeatures() if I
>> # wanted to keep the features on the in-memory object
>> foreach my $pfeat ($dbseq->remove_SeqFeatures()) {
>> $pfeat->remove();
>> }
>> # now $dbseq and the object in the db don't have features
>>
>> Same thing for annotation. You can check out some of the sample
>> closure
>> implementations for merging objects provided in the scripts/biosql
>> directory of bioperl-db, for instance freshen-annot.pl deletes all
>> annotation (in the db) from the existing object.
>>
>> Hth,
>>
>> -hilmar
>>
>> On Oct 3, 2005, at 10:59 AM, Amit Indap wrote:
>>
>>> Hi,
>>>
>>> I was trying to remove features for sequences stored in my BioSQL
>>> database. Once I run the code snippet below to remove sequence
>>> features, I tested to see if the features really had been removed by
>>> running a script that reterieves seq features from bioentries.
>>> Unfortunately, the features are still there. I'm still learning my
>>> around the Bio::DB API
>>>
>>> Here is my code to attempts to remove sequence features:
>>>
>>> foreach (@accs) {
>>>
>>> my $acc = $_;
>>> my $adp = $dbadp->get_object_adaptor("Bio::SeqI");
>>>
>>> my $seq = Bio::Seq->new(-accession_number => $acc,
>>> -namespace => $namespace
>>> );
>>>
>>>
>>> my $dbseq = $adp->find_by_unique_key($seq);
>>> warn $acc, " not found in database $namespace" unless $dbseq;
>>>
>>> $dbseq->remove_SeqFeatures(); # remove seqfeatures
>>>
>>> $dbseq->commit();
>>> print LOG "removed all seq features for $acc\n";
>>> }
>>>
>>>
>>>
>>> --
>>> Amit Indap
>>> http://www.bscb.cornell.edu/Homepages/Amit_Indap/
>>>
>>> _______________________________________________
>>> BioSQL-l mailing list
>>> BioSQL-l at open-bio.org
>>> http://open-bio.org/mailman/listinfo/biosql-l
>>>
>> --
>> -------------------------------------------------------------
>> Hilmar Lapp email: lapp at gnf.org
>> GNF, San Diego, Ca. 92121 phone: +1-858-812-1757
>> -------------------------------------------------------------
>>
>>
>
>
> --
> Amit Indap
> http://www.bscb.cornell.edu/Homepages/Amit_Indap/
>
--
-------------------------------------------------------------
Hilmar Lapp email: lapp at gnf.org
GNF, San Diego, Ca. 92121 phone: +1-858-812-1757
-------------------------------------------------------------
More information about the Bioperl-l
mailing list