根据相似性原理,序列相似,功能相似,所有功能注释无非是用比对工具将输入序列比对到数据库序列,再将输入ID对应数据库ID,进一步对应到功能条目的关系。

数据库要么建到本地,要么联网调用API,一般的软件或包做注释都是通过联网来获得,或者调用依赖的一些专门注释的包(文件较大)。工业生产中,一般需要构建本地数据库。

如果不对原始数据库按物种或其他分类来进行拆分的话,整个数据库会很大,比对和注释消耗的时间和资源都会很大,显然不经济,而且也会有一些假阳性的结果。比如将人特有的功能比对到了小鼠上,客户无法结果。所以分库是很有必要的,只是怎么分以及分多大的问题。

KEGG本地库文件

  • 序列数据库文件

    如kegg_all_clean.fa

  • ko系列文件(ko与其他ID的对应关系),ko与不同类型数据库

    我们这里要用到的是ko和geneID的对应关系,其他数据库类似

  • 物种文件

    misc下的taxonomy文件,按物种分库的依据。

  • map目录,通路图。

    每条通路有三个文件:png是通路图,html是网页通路,conf是通路的配置



    conf文件内容

  • map_title.tab文件,是通路的三个层级

  • ko_map.tab文件,是K与通路的全部物种对应文件

    是联系注释结果之间对应关系的必需文件。

  • komap目录下,是各个物种(三个字母缩写)的通路图(png)及其配置(conf),以及该物种对应的通路。

    如人的komap/hsa目录:



    当然也可以不细分到单物种,可以划分物种大类,如动物、植物等,相对应地文件animal_ko_map.tab、plant_ko_map.tab

利用上面的这些文件,其实我们就可以进行KEGG Pathway功能注释了,即存在这样的关系:蛋白——序列ID(基因)——K号——ko(pathway)——Level1-3——通路图。这样得到的通路图,都是map开头,即reference pathway;如果是物种特异通路,即ko开头,则用komap目录结果。KEGG的5种通路类型等基础知识这里不讲,不懂可去查。

如果要按物种进行拆库,则需要将上面的文件都按物种进行分类,使用是一样的。

KEGG数据库非常庞大,除了Pathway,genes等数据库外,还有很多其他的文件,比如:

  • links目录,pathway与其他ID的对应关系



    如pathway_ko.list

  • ligand目录,即配体数据库,不做介绍。

按物种拆分KEGG数据库

1.获得物种分类信息

按物种拆分可大可小:最大就是原始库,最小就是单一物种,中间可以按不同分类来拆。关键取决于你的输入序列是什么成分,当然不大不小恰好能全部包含是最理想的分库结果。比如taxonomy文件(misc目录下)格式是:



我们可以按Eukaryotes、Animals、Vertebrates、Mammals中的任一个层级来分。也可以自定义分类,将不同物种添加到一起进行归类。

这里写一个简单脚本来用上面文件中的第二层级物种来进行数据库分库:

#!urs/bin/perl
open F , $ARGV[0];
while (<F>){
chomp;
if (/^## (.+)/){
$spec=$1;
open OUT, ">>$spec.specie.xls";
}
elsif (!/^#/){
@aa=split/\t/,$_;
print OUT "$spec\t$aa[1]\t$aa[3]\n";
}
}

拆分后得到Animals.specie.xls、 Archaea.specie.xls、 Bacteria.specie.xls、 Fungi.specie.xls、 Plants.specie.xls、 Protists.specie.xls等系列分类文件。如Animals.specie.xls文件如下:

2.获得物种分类的序列信息并建库

从全部物种的原始序列数据库中拆分出以上分类物种的序列,编写如下get_fasta.pl脚本:

#!/usr/bin/perl
use strict;
use warnings;
use diagnostics; unless(@ARGV>=2){
print "perl $0 list.txt db.fa specie.fa\n";
exit(1);
}
my %hash;
open L,"$ARGV[0]" or die "$!\n";
my %list;
while(<L>){
chomp;
my @aa=split/\t/,$_;
$list{$aa[1]}='';
}
close L; my $num_need = scalar keys %list;
print("begin fetch $num_need sequence...\n");
open F,"$ARGV[1]" or die "$!\n";
my %seq;
while(<F>){
LINE: #if(m/^>([^\|]+)/){
if(/^>([^:]+):([^\s]+)/){
chomp;
my $acc = $1;
my $line=$_;
my $idd=$1.':'.$2;
$hash{$idd}=$line;
next unless exists $list{$acc};
while(<F>){
goto LINE if /^>/;
s/[^a-z]//gsi;
$seq{$idd} .= $_;
}
last;
}
elsif (/^>(12122[^\s]+)(.*)/){
chomp;
my $acc = $1;
$hash{$1}=$_;
next unless exists $list{$acc};
while(<F>){
goto LINE if /^>/;
s/[^a-z]//gsi;
$seq{$acc} .= $_;
}
last;
}
}
close F;
open O,">$ARGV[2]" or die "$!\n";
foreach my $acc (keys %seq){
print O "$hash{$acc}\n$seq{$acc}\n";
}
my $yesn = scalar keys %seq;
my $non = $num_need - $yesn;
if($non>=1){
print "have $non sequence not found!\n";
}else{
print "you have successfully got $yesn sequence!\n";
}
close O;

获得分类后的序列:

perl get_fasta.pl Animals.specie.xls kegg_all_clean.fa animals.fa

获得分类后的数据库后,可用blast/diamond等软件进行建库,以便进行输入序列的比对。

3.获得物种分类的K-ko对应文件

从全部物种的ko_map.tab文件(K与通路的对应关系文件)中获取物种分类后的子文件。编写脚本get_species_komap.pl

#!/usr/bin/perl
=pod
this script is subsplit species komap
perl $0 species.xls ko_genes.list ko_map.tab species_ko_map.tab
=cut
my $spe=shift;
my $ko_gene=shift;
my $ko_map=shift;
my $map=shift; my (%spe,%ko); open F,"<$spe";
while(<F>){
chomp;
my @F=split/\t/,$_;
$spe{$F[1]}=1;
}
close F; open F,"<$ko_gene";
while(<F>){
chomp;
my @F=split/\t/,$_;
my $ko=(split/:/,$F[0])[1];
my $spe=(split/:/,$F[1])[0];
if(exists $spe{$spe}){
$ko{$ko}=1;
}
}
close F;
open F,"<$ko_map";
open O,">$map";
while(<F>){
chomp;
my @F=split/\t/,$_;
if(exists ($ko{$F[0]})){
print O "$_\n";
}
}
close F;
close O;

得到animal_ko_map.tab文件,其他分类物种也是类似。

拆分子库后比对获得该子库中的功能信息,后续注释的数据处理其实和不分库时是一样的,都是一些文本的格式转换以及可视化。

比如我们可将KEGG数据库拆分:动物animal.fa、植物plant.fa、真菌fungi.fa、真核eukaryotes.fa、原核prokaryote.fa、原生生物microorganism.fa,以及包含原核、真菌和原生生物三种组合的微生物库other.fa,除动植物、真菌、原核、原生之外但在KEGG数据库中的其他生物unknow.fa。

后面比对注释时只需设置物种参数即可。

【数据库】本地KEGG数据库如何拆分子库?的更多相关文章

  1. KEGG数据库的使用方法与介绍

    KEGG数据库的使用方法与介绍 KEGG的数据 KEGG中的pathway是根据相关知识手绘的,这里的手绘的意思可能是指人工以特定的语言格式来确定通路各组件的联系:基因组信息主要是从NCBI等数据库中 ...

  2. KEGG数据库

    参考:KEGG数据库中文教程 - 博奥  &[学习笔记]KEGG数据库 - 微信 学习一个技能最主要的事情你必须知道,那就是能通过它来做什么? KEGG数据库里面有什么? 如何查询某一特定的代 ...

  3. WebService访问oracle数据库本地调试

    WebService访问oracle数据库本地调试-一步一个坑 上篇文章提到我们额数据库挂了,重装了数据库,然后呢我需要在本地调试WebService,看看那些数据结构缺失,迁移到新数据库中去.踩坑之 ...

  4. android本地数据库,微信数据库WCDB for Android 使用实例

    android本地数据库,微信数据库WCDB for Android 使用实例 Home · Tencent/wcdb Wikihttps://github.com/Tencent/wcdb/wiki ...

  5. 本地存储数据库indexedDB实现离线预览的功能

    今天在学习<高级JS编程>,看到离线存储,cookie和session都十分的熟悉,但是书中还提到了indexedDB和webSQL(已废弃),indexedDB可以像mysql一样建表, ...

  6. 【数据库】本地NR数据库如何按物种拆分?

    目录 1.准备本地数据库文件 1.1 NR库下载 1.2 Taxonomy数据库下载 2.按物种拆分NR库 2.1 第一步:获得Aceesson和分类物种的对应关系 2.2 第二步:获得分类物种的序列 ...

  7. 如何构建自己的KEGG数据库

    本文转自Y叔公众号 自己KEGG数据库好处: 可重复性好 没网也可以进行分析 步骤 1 在KEGG官网找到自己物种的3字符缩写 2 加载Y叔获取kegg.db 的R包 1 ##安装Y叔的包 2 lib ...

  8. 在数据库访问项目中使用微软企业库Enterprise Library,实现多种数据库的支持

    在我们开发很多项目中,数据访问都是必不可少的,有的需要访问Oracle.SQLServer.Mysql这些常规的数据库,也有可能访问SQLite.Access,或者一些我们可能不常用的PostgreS ...

  9. Winform开发框架中实现多种数据库类型切换以及分拆数据库的支持

    在很多应用系统里面,虽然一般采用一种数据库运行,但是由于各种情况的需要,可能业务系统会部署在不同类型的数据库上,如果开发的系统能够很方便支持多种数据库的切换,那可以为我们减少很多烦恼,同时提高系统的适 ...

随机推荐

  1. 封装ARX给.Net调用

    1:创建工程名.def的文件,内容如下: 2:def文件位置: 3:属性页配置: 4:acrxEntryPoint.cpp下面添加如下代码(可以传参数) 5:c#调用 怕自己忘记,记录一下.

  2. Beta阶段第七次会议

    Beta阶段第七次会议 时间:2020.5.23 完成工作 姓名 工作 难度 完成度 ltx 1.修改小程序页面无法加载bug2.修改条件语句,使得页面能够正常显示 中 90% xyq 1.根据api ...

  3. android tcp通讯

    Andoird TCP通讯 前言 最近在写一个即时通讯的项目,有一些心得,写出来给大家分享指正一下. 简单描述一下这个项目: 实时查询车辆运行状态的项目,走TCP通迅. 接口采用GZIP压缩. 后台是 ...

  4. 零基础入门c语言函数之递归函数

    今天来总结一下关于递归函数的使用方面的问题. 递归函数就是在函数使用的时候自己调用自己,层层调用,来实现你想要的功能. 有两个最常用的例子,我们来写一下. (1)计算阶乘 #include int f ...

  5. 第01课 OpenGL窗口(3)

    接下来的代码段创建我们的OpenGL窗口.我花了很多时间来做决定是否创建固定的全屏模式这样不需要许多额外的代码,还是创建一个容易定制的友好的窗口但需要更多的代码.当然最后我选择了后者.我经常在EMai ...

  6. 非对称加密和linux上的 ssh-keygen 工具使用

    rsa :创造非对称加密的三个人名.原理是两个1024到2048之间的素数,以此为乘积.等... a*b=c  一般a*b为私钥端,c为公钥端.因为 c非常难算出a和b. ssh-keygen -t ...

  7. VulnHub-[DC-8-9]-系列通关手册

    DC8-通关手册 DC-8是另一个专门构建的易受攻击的实验室,目的是在渗透测试领域积累经验. 这个挑战有点复杂,既是实际挑战,又是关于在Linux上安装和配置的两因素身份验证是否可以阻止Linux服务 ...

  8. 【Go语言学习笔记】Go的函数

    函数还是这几块: 参数 返回值 作用域 执行顺序 参数和返回值 func FuncName(/*参数列表*/) (o1 type1, o2 type2/*返回类型*/) { //函数体 return ...

  9. glibc memcpy() 源码浅谈

    其实我本来只是想搞懂为什么memcpy()函数的参数类型是void *的: 我以为会在memcpy()源码中能找到答案,其实并没有,void *只是在传递参数的时候起了作用,可以让memcpy()接受 ...

  10. ES6模块化引入

    //a.js 导出的关键字 export export let str = "laowang"; export function add(a,b){ return a + b ; ...