[Bioperl-l] Sort for get_all_tags method

Jason Stajich jason at bioperl.org
Tue May 27 17:24:47 EDT 2008

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


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

More information about the Bioperl-l mailing list