[Bioperl-l] Sort for get_all_tags method

Chris Fields cjfields at uiuc.edu
Wed May 28 01:48:45 UTC 2008


I posted this to bugzilla as an enhancement request (so it doesn't get  
lost in the mail archives).  The question is, do we want to pass in a  
code ref as a sort function, defaulting to the original 'no sort'  
behavior?

chris

On May 27, 2008, at 4:24 PM, Jason Stajich wrote:

> Again, please ask these questions on the list.
>
> yes it is possible, but I don't specifically have any code for doing  
> the sorting myself, but have hacked up some untested code at the end  
> of this msg. The main problem for bioperl is the Feature object  
> needs a new method to accept setting a sort function, something we  
> can easily do, but someone just needs to put in a little time to  
> test it out and make sure it all works.
>
> It would boil down to updating the function that is implemented in  
> Bio::SeqFeature::Generic :
>
> sub get_all_tags {
>   my ($self, @args) = @_;
>   return sort keys %{ $self->{'_gsf_tag_hash'}};
> }
>
> If you are looking for more example code, you might try the Perl  
> Cookbook from O'Reilly.  I would implement a specific sort function  
> by probably mapping the keys to a number based on your pre- 
> determined preference (ie 'note' would map to 0, 'gene' to 1, etc)  
> and then all tags without a mapping would get ordered alphabetically.
> Something like this
>
>
> The solution of updating the module to accept a general sort  
> function would be a more general solution, but you can always  
> override this all_tags function in your local script by including  
> this code in the beginning of your script:
>
>
> use Bio::SeqFeature::Generic;
> my %lookup = ( 'note' => 0, 'gene' => 1, 'locus' => 2 );
> sub Bio::SeqFeature::Generic::get_all_tags {
>   my ($self, @args) = @_;
>   return sort { my ($amap,$bmap) = map { $lookup{$_} } ($a,$b);
>                 my $rc = undef;
> 		 if( defined $amap && ! defined $bmap ) {
> 	          $rc = -1; # only $a is in the lookup, it should come first
>                 } elsif( ! defined $amap && defined $bmap ) {
>                  $rc = 1;  # only $b is in the lookup, it should  
> come first
>                 } elsif( defined $amap && defined $bmap ) {
>                  $rc = $amap <=> $bmap; # numeric compare, these are  
> both in the lookup
>                 } else {
>                  $rc = $amap cmp $bmap; # alpha compare, neither are  
> in the lookup;
>                 }
>              $rc; # return code from the function passed to sort
>            } keys %{ $self->{'_gsf_tag_hash'}};
> } # end routine
>
> -jason
>
> On May 22, 2008, at 12:24 PM, Mgavi Brathwaite wrote:
>
>> Hi Jason,
>>
>> I looked at your comment and I agree that there should be a sort  
>> method to
>> return the tags in a predictable order. Would you be willing to  
>> share you
>> code for sorting tags with the get_all_tags method ?
>>
>> M
>>
>
> _______________________________________________
> Bioperl-l mailing list
> Bioperl-l at lists.open-bio.org
> http://lists.open-bio.org/mailman/listinfo/bioperl-l

Christopher Fields
Postdoctoral Researcher
Lab of Dr. Marie-Claude Hofmann
College of Veterinary Medicine
University of Illinois Urbana-Champaign







More information about the Bioperl-l mailing list