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)window下安裝比較方便,直接下載4個需要的模塊 解壓到本地目錄,如:C:/src/
2)安裝DBD::MySQL 包
通過PPM搜索DBD-MySQL,安裝
3)API模塊的使用
因爲下載的ensembl包不在perl的標準庫中,所以在使用這4個模塊時需要特別聲明:
第一種方法就是在程序中加入 use lib "模塊路徑";第二種方法是在CMD中輸入
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); #獲得同源序列;