Я хочу посмотреть на роды в целом, на весь животный мир, чтобы определить диапазон размеров родов. Я изучил видовое богатство и генетическое разнообразие (попарное расстояние от наборов данных о последовательностях), но я ищу другие способы взглянуть на то, «насколько велик род?» с точки зрения биоразнообразия. Любые идеи или комментарии приветствуются!
Принимая во внимание, что информация будет неполной (как и список существующих видов), вы можете использовать таксономическую базу данных NCBI . Например, проверка страницы рода Drosophila даст вам представление о его размере.
Чтобы получить более точные цифры, вы можете загрузить taxdump.tar.gz
файл с FTP-сервера NCBI ( ссылка ), извлечь его и запустить приведенный ниже скрипт для файла nodes.dmp
(дамп информации базы данных).
#!/usr/bin/perl
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
$children{$p}{$gkid}++;
## We found a new one, we need to test again.
$found=1;
}
}
}
## If we found a new one, run again
getchildren($p) if $found==1;
}
while (<>) {
## Remove trailing newlines
chomp;
## Parse the current line
my ($name,$parent,$rank,$rest)=split(/\s*\|\s*/);
## Save the current taxid as a child of its parent
$children{$parent}{$name}++;
## Save its rank (species, genus, order etc)
$ranks{$name}=$rank;
}
## Recursively get all children of this taxid
getchildren($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);
Предполагая, что вы находитесь в среде *nix или имеете к ней доступ, сохраните этот файл как genus.pl
и запустите его на nodes.dmp
, указав таксид интересующего вас рода:
perl genus.pl -t 9257 nodes.dmp
Результат приведенного выше примера (Ornithorhynchus):
$ perl genus.pl -t 9257 nodes.dmp
Genus 9257 has 1 members
Если мы попробуем на дрозофиле, то получим:
$ perl genus.pl -t 7215 nodes.dmp
Genus 7215 has 738 members
Это действительно не самый эффективный способ сделать это (гораздо лучше сделать это в самом скрипте, но у меня нет времени на это сейчас), но если вы не против подождать, это даст вам числа для всех родов:
for i in $(grep -w genus nodes.dmp | awk '{print $1}'); do
perl genus.pl -t $i nodes.dmp;
done
Размеры рода обычно измеряются количеством видов, поскольку конкретный вид, относящийся к одному таксономическому органу, не должен встречаться более чем в одном роде. Ознакомьтесь со Strand and Panova, 2014, где приведены некоторые данные о количестве видов, обнаруженных в каждом роде в среднем по нескольким тысячам родов из восьми основных таксономических групп.
амимоси
файлподводный