无参物种背景基因GO注释

相似的基因在不同物种中,其功能往往是保守的。通过GO注释可获得跨物种的同源基因及其基因产物的功能描述。对于非模式生物或者无参考基因组的项目,经常需要进行背景基因的GO注释,以便后期差异基因功能富集或者整体背景基因功能了解。

这里提供一种本地无参物种背景基因GO注释,依赖Uniprot2GO脚本。仅做记录。

参考:

https://www.jianshu.com/p/ea2da43b52b9
https://www.thinbug.com/q/51173860
https://blog.csdn.net/ygyxl/article/details/79742751

准备文件:

(1)swissprot数据库文件
(2)idmapping.tb.gz文件和Uniprot2GO_annotated.py文件

准备工具:

diamond, TBtools

一、diamond blast比对

  1. 前提通过Trinity组装得到的Unigene文件,如下所示


    组装得到的Unigene序列文件
  2. swissprot数据库比对

(1)下载swissprot数据库

ascp下载(推荐)

~/.aspera/connect/bin/ascp  -QT \
 -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh \
-k1 -l 300m \
anonftp@ftp.ncbi.nlm.nih.gov:/blast/db/FASTA/swissprot.gz ./

wget下载

wget ftp://ftp.ncbi.nih.gov/blast/db/FASTA/swissprot.gz

(2)diamond建库

diamond makedb --in swissprot.gz -d diamond_swiss -p 24

(3)blast比对:e-value设置为1e-5,输出最好hits

diamond blastx --max-hsps 1 --max-target-seqs 1  \
-d ~database/swissport/diamond_swiss -q ~/Unigene.fa \
-o swiss_match_out6 --sensitive --outfmt 6 --evalue 1e-5 -p 20

得到的swiss_match_out6文件,如下所示,第二列为Uniprot ID:


swiss_match_out6 文件

二、GO注释

  1. 获取idmapping.tb.gz文件(~10G)

(1)Uniprot官网获取:(最新)

https://ftp.uniprot.org/pub/databases/uniprot/knowledgebase/idmapping/idmapping_selected.tab.gz

(2)TBtools分享

https://tbtools.cowtransfer.com/s/566e88227a0045

本地下载后上传服务器,得到idmapping文件,以Tab分隔,第1列为Uniprot ID,第8列为GOID


idmapping文件
  1. 修改swissprot比对得到文件swiss_match_out6

GO注释只需要前2列,即Uniprot ID,并且第2列只取“.”前的字符,通过以下得到:

awk -F '.' '$2=$2' OFS="\t" swiss_match_out6 > swiss_out6_tmp.txt
cut -f 1,2 swiss_out6_tmp.txt > swiss_out6.txt
swiss_out6_tmp.txt
  1. 修改Uniprot2GO_annotated.py文件

(1)第7行修改为:

print (USAGE)

(2)由idmapping.tb.gz文件格式可知:
为swissprot比对结果做GO注释时,第16行应改为:

UniProt_GO[lsplit[0]] =lsplit[7]

为NR比对结果作GO注释时,第16行应改为:

UniProt_GO[lsplit[3]] =lsplit[7]

(3)如果报lsplit = line.rstrip().split("\t") TypeError: a bytes-like object is require错误,第14行需要加上decode()函数:

lsplit =line.decode().rstrip().split("\t")
  1. 运行Uniprot2GO_annotated.py文件进行GO注释:
python Uniprot2GO_annotated.py idmapping.tb.gz swiss_out6.txt swiss_go.out

得到GO注释文件,一行对应多行,如下所示:


GO注释文件

如果要改成一行对应一行,可以通过下面的方式:
(1)

while read line;do
    left=$(echo $line|grep -oE '^[^ ]+ +')  #the left part + a blank
    echo $line |
        grep -oE '[^ ]+$' |                 #take the right part
        sed -r "s/([^,]+),?/$left\1\n/g" |  
        #prefix every GO::, with the left part and go back to line
        grep 'c' |                          #remove the empty line added by the very last group
        tee -a swiss_go_single.out #输出文件名
done< swiss_go.out

(2)

while read line
do
    var1=$(echo $line | awk '{print $1}')                           # assign first field to var1
    Arrayvals=($(echo $line | awk '{print $2}' | sed -e 's/,/ /g')) 
   # create an array from second filed

    for (( i=0; i < ${#Arrayvals[@]} ; i++ ))  # iterate the array using a for loop , ${#Arrayvals[@]} -> gives the length of array
    do
        echo "${var1}    ${Arrayvals[${i}]}"   # echo in desired format
    done
done < swiss_go.out > swiss_go_single.out

附:Uniprot2GO_annotated.py修改后

import sys
import gzip

USAGE = "\nusage: python %s idmapping.tb.gz blastout outputfile\n" % sys.argv[0]

if len(sys.argv) != 4:
    print (USAGE)
    sys.exit()

def parseIDmapping(filename):
    UniProt_GO = {}
    with gzip.open(filename, 'r') as f:
        for line in f:
            lsplit = line.decode().rstrip().split("\t")
            if lsplit[7]:
                UniProt_GO[lsplit[0]] = lsplit[7]
    return UniProt_GO

def parseBlastOut(filename):
    tab_res = {}
    with open(filename, 'r') as f:
        for line in f:
            lsplit = line.split()
            tab_res.setdefault(lsplit[0], set()).add(lsplit[1])
    return tab_res
 
UniProtKB_GO = parseIDmapping(sys.argv[1])
BlastOut = parseBlastOut(sys.argv[2])
OUT = open(sys.argv[3], 'w')
 
for i in BlastOut:
    temp = []
    for j in BlastOut[i]:
        if j in UniProtKB_GO:
            go = UniProtKB_GO[j].split("; ")
            temp = temp + go
        else:
            continue
    if temp:
        OUT.write(i + "\t" +  ",".join(set(temp)) + "\n")

OUT.close()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容