I want to look at genera as a whole, across the animal kingdom to determine the range of sizes of genera. I have examined species richness and genetic diversity (pairwise distance from sequence data sets), but I am looking to find more ways to look at 'how big is a genus?' in terms of biodiversity. Any ideas or comments are greatly appreciated!

  • $\begingroup$ Or even species delineation techniques that could be used for genera? $\endgroup$
    – amymoshi
    May 27, 2015 at 12:47
  • 3
    $\begingroup$ If you are you aiming to compare genera widely across families and orders, you should consider that taxonomic levels (such as genus) are used very differently between orders. This means that taxonomists are using quite different criteria to delimitate genera, so the differences you might observe would probably be caused by these different definitions/criteria as much as "actual" differences. $\endgroup$ May 27, 2015 at 19:00

2 Answers 2


Bearing in mind that the information is bound to be incomplete (as is the list of existing species), you could use the NCBI taxonomy database. For example, checking the page for the Drosophila genus will give you an idea of its size.

For more precise numbers, you can download the taxdump.tar.gz file from NCBI's FTP server (link), extract it and run the script below on the file nodes.dmp (a dump of the database info).

use strict;
use warnings;
use Getopt::Std;
my (%opts,%children,%ranks);
getopts('t:',\%opts) || do { print STDERR "Invalid option"; exit(1); };

my $taxid=$opts{t}||die "Need a taxid: -t\n";

sub getchildren{
    my $p=shift; ## The taxid of interest
        my $found=0; ## will be 0 unless we find a new kid
    ## For each child of this taxid
    foreach my $kid (keys%{$children{$p}}){
    	## Get the kid's kids
    	foreach my $gkid (keys%{$children{$kid}}){
    	    ## If this one hasn't been seen before
    	    unless (defined($children{$p}{$gkid})) {
    		## Add it to the list of this taxid's children
    		## We found a new one, we need to test again. 
        ## If we found a new one, run again
        getchildren($p) if $found==1;
    while (<>) {
        ## Remove trailing newlines
        ## Parse the current line
        my ($name,$parent,$rank,$rest)=split(/\s*\|\s*/);
        ## Save the current taxid as a child of its parent
        ## Save its rank (species, genus, order etc)

## Recursively get all children of this taxid

# Count only species as children
my @kids=grep($ranks{$_} eq "species", keys(%{$children{$taxid}}));

# Print out the results
printf "Genus %s has %s members\n", $taxid, scalar(@kids);

Assuming you are on or have access to a *nix environment, save that file as genus.pl and run it on the nodes.dmp, giving the taxid of your genus of interest:

perl genus.pl -t 9257 nodes.dmp

The output of the above example (Ornithorhynchus) is:

$ perl genus.pl -t 9257 nodes.dmp 
Genus 9257 has 1 members

If we try on Drosophila, we get:

$ perl genus.pl -t 7215 nodes.dmp 
Genus 7215 has 738 members

This is realy not the most efficient way to do it (far better to do this in the script itself but I don't have the time to implement that now), but if you don't mind waiting, this will give you the numbers for all genera:

for i in $(grep -w genus nodes.dmp | awk '{print $1}'); do 
        perl genus.pl -t $i nodes.dmp; 

Genus sizes are usually measured in number of species, since a particular species under a single taxonomic authority shouldn't be found in more than one genus. Check out Strand and Panova, 2014 for some numbers on number of species found in each genus on average across several thousand genera from eight major taxonomic groups.


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .