Ensembl 是一项生物信息学研究计划,旨在开发一种能够对真核生物基因组进行自动诠释(automatic annotation)并加以维护的软件。该计划由英国Sanger研究所Wellcome基金会及欧洲分子生物学实验室所属分部欧洲生物信息学研究所共同协作运营(http://zh.wikipedia.org/wiki/Ensembl)。
Ensembl数据库本身提供了非常人性话的操作界面,可以很容易的通过Ensemble筛选到目标数据。但是当数据量比较大时,直接通过网页手动筛选变得不显示。为此Ensembl也提供了强大的perl API接口。通过API接口可以实现对数据的大批量处理。
----------------------------------------------
1)Perl API的安装 (http://asia.ensembl.org/info/docs/api/api_installation.html)2)安装DBD::MySQL 包
3)API模块的使用
set PERL5LIB=C:srcbioperl-live;C:srcensemblmodules;C:srcensembl-comparamodules;C:srcensembl-variationmodules;C:srcensembl-functgenomicsmodules 然后执行perl程序 4)连接ensembl库(http://asia.ensembl.org/info/docs/api/core/core_tutorial.html) use Bio::EnsEMBL::Registry; print "link to DB...n"; Bio::EnsEMBL::Registry->load_registry_from_db( -host => 'ensembldb.ensembl.org', -user => 'anonymous', -port => 5306); --------------------------------------------------- 5)从ensembl上获得ensembl ID 在ensembl上进行的许多搜索都需要ensembl ID,这个ID是ensembl给每个基因(序列)提供的类似access number之类的号。而一般情况下我们手里有的只是一个基因的名称,如COG6,那么怎么通过COG6基因名称获得ensembl ID。 use Bio::EnsEMBL::Registry; print "link to DB...n"; Bio::EnsEMBL::Registry->load_registry_from_db( -host => 'ensembldb.ensembl.org', -user => 'anonymous', -port => 5306); my $gene_adaptor = $registry->get_adaptor( 'Human', 'Core', 'Gene' ); print “get data...n”; my $gene = $gene_adaptor->fetch_by_display_label('COG6'); print $gene->stable_id(),"n"; 6)搜索同源序列 ensembl提供了一整套判断直系和并系同源序列的方法,这里我们并不关心这种算法。我们关心的是提交一个序列后,怎么得到它的直系和并系同源序列。 ensembl提供的模块是:Bio::EnsEMBL::Compara::DBSQL::DBAdaptor(http://asia.ensembl.org/info/docs/api/compara/compara_tutorial.html) 代码如下: use Bio::EnsEMBL::Registry; use strict;use warnings; use ForkManager; #多进程下载 my $pm = new Parallel::ForkManager(30); #最大进程数30,极耗系统资源。CPU:50%,RAM:800M; print "Link to DB, Waiting...n"; Bio::EnsEMBL::Registry->load_registry_from_db( -host => 'ensembldb.ensembl.org', -user => 'anonymous', -port => 5306); my $member_adaptor = Bio::EnsEMBL::Registry->get_adaptor('Multi', 'compara', 'Member'); my $homology_adaptor = Bio::EnsEMBL::Registry->get_adaptor('Multi', 'compara', 'Homology'); print "Download data from DB...n"; open(F,"ens.txt"); while(my $ID=<F>) { chomp $ID; my($ID1,$ID2)=split(/t/,$ID); $pm->start and next; #创建进程; &GETSEQ($ID2); $pm->finish; } $pm->wait_all_children; close(F); sub GETSEQ{ my($ID2)=@_; my $fh; my $member = $member_adaptor->fetch_by_source_stable_id('ENSEMBLGENE',$ID2); my $homologies = $homology_adaptor->fetch_all_by_Member($member); if(defined($homologies)) { open($fh,">>$ID2.txt"); foreach my $homology(@{$homologies}) { if($homology->description=~/one2one/) { my $member_attribute=$homology->get_all_Member_Attribute->[1]; my ($member, $attribute) = @{$member_attribute}; my $taxon=$member->taxon; my $species= $taxon->binomial;$species=~s/ /_/; my $slice_adaptor = Bio::EnsEMBL::Registry->get_adaptor($species, 'Core', 'Slice' ); #连接序列库; my $slice = $slice_adaptor->fetch_by_gene_stable_id($member->stable_id); #获得同源序列; print $fh $member->stable_id,"t",$slice->seq(),"n"; } } } my $slice_adaptor = Bio::EnsEMBL::Registry->get_adaptor('Human', 'Core', 'Slice' ); my $slice = $slice_adaptor->fetch_by_gene_stable_id($ID2); print $fh $ID2,"t",$slice->seq(),"n"; close($fh); print $ID2,"n"; } 7)抛砖引玉,其他模块的方法就不演示了。