使用ensembl的API下载数据

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个需要的模块
  • ensembl
  • ensembl-compara
  • ensembl-variation
  • ensembl-functgenomics
     解压到本地目录,如: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=)
{    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);    #获得同源序列;
      

你可能感兴趣的:(perl)