基因組共線性分析-JCVI

由于忙課題的原因,斷更了好久,雖然斷更的時間內學習到了很多東西,但細想一下還是記錄在自己博客里比較好,方便自己查閱也方便其他人學習

JCVI這個軟件網上有太多教程,再記錄一次是想按照自己平時的使用習慣把整個流程從頭到尾捋一遍

安裝

能conda就conda,就一個字,省心!

conda create -n jcvi
conda install jcvi

準備文件

分析需要用到 最長的轉錄本,很多軟件分析時其實已經內置了相應的程序,可以使用以下的方法來提取

less your_gff.gff |grep "mRNA"|cut -d ";" -f1|cut -f1,4,5,7,9|awk -vOFS="\t" '{print$1,($2-1),$3,$5,"0",$4}'|sed 's/ID=//g' > your.bed
conda activate jcvi
python -m jcvi.formats.bed uniq your.bed
seqkit grep -f <(cut -f4 your.uniq.bed) your_pep.fa > your_pep.long.fa

利用上面的方法把需要分析的物種的bed文件以及蛋白或cds的fasta文件準備好
姑且稱之為A.bed, A.pep, B.bed, B.pep

分析

python -m jcvi.compara.catalog ortholog A B  --dbtype prot --cscore=.99

我用的是蛋白序列文件,所以加個 --dbtype prot,cds序列則不需要

1,先分析整體的共線性(可視化)

1.1
對上面分析的結果進行一個簡單過濾

python -m jcvi.compara.synteny screen --minspan=30 --simple A.B.anchors A.B.anchors.new

--minspan: remove blocks with less span than this.跨度小于30個基因的block將會移除

1.2
創建seqid文件,想展示哪些染色體就將其寫入到這個文件中

Chr1A,Chr2A,Chr3A,Chr4A,Chr5A
Chr1B,Chr2B,Chr3B,Chr4B,Chr5B

1.3
創建layout文件,用于設置繪圖參數,最終出圖都是通過調整這個文件來達到自己想要的效果。

# y, xstart, xend, rotation, color, label, va,  bed
 .6,     .2,    .8,       0,      , A, top, A.bed
 .4,     .2,    .8,       0,      , B, top, B.bed
# edges
e, 0, 1, aly.ath.anchors.simple

y為縱軸位置,x為橫軸位置,rotation為旋轉角度,比如45或者-45啥的,看自己需求,label就是基因組名字了,后面的top表示名字在染色體上方表示,也可以設置left,right,bottom。
edges那里就是連線,0是第一個基因組,1是第二個,然后就是3,4...,想讓哪兩個連線就設置好對應的edgessimple文件

最后運行命令

python -m jcvi.graphics.karyotype seqids layout
2,局部共線性分析(可視化)

獲得block文件

python -m jcvi.compara.synteny mcscan A.bed A.B.lifted.anchors --iter=1 -o A.B.i1.blocks

解釋一下的話就是,以A基因組作為標準,從B中得到對應的共線性基因,假如B中有的基因而A中沒有的話是無法知道的,--iter=1表示基因是一對一,參數調整范圍為1-100
如果有更多基因組的話,可以繼續按照上面的流程得到blocks

python -m jcvi.compara.synteny mcscan A.bed A.C.lifted.anchors --iter=1 -o A.C.i1.blocks
#然后將這些block合并到一起
paste *.i1.blocks|cut -f1,2,4 > all.i1.blocks
#合并bed文件
cat A.bed B.bed C.bed > all.bed

準備layout文件

# x,   y, rotation,     ha,     va, color, ratio,            label
0.2, 0.3,        0,  center,    bottom,   ,    .8,         1A
0.8, 0.3,        0,  center,    bottom,   ,    .8,         1B
0.47, 0.3,        0,  center,    bottom,   ,    .8,         1C
# edges
e, 0, 1
e, 1, 2
e, 2, 3

三個基因組的話差不多就這樣,跟上面的差不多,不做過多解釋了,這些數字是我亂寫的,畫的時候多試試就知道了

最后!畫圖!

python -m jcvi.graphics.synteny all.i1.blocks all.bed layout

寫在最后

以上就是全部內容了,除了沒放結果展示,基本上分析下來是沒有問題的,當然主要是寫給我看的,所以不會像其他博主一樣面面俱到

更新一下內容

之前一直用的舊版本的JCVI,今天才發現有更新
如果不想在共線性圖上展示染色體編號的話可以加一個--nocircles

python -m jcvi.graphics.karyotype seqids layout.2 --nocircle

如果不想用曲線,可以加--shadestyle=line
最后展示下多基因組的共線性圖

測試下

再次更新

展示整個基因組內感興趣基因的共線性
近期想要在兩個小麥基因組間看一下感興趣基因的共線性,并需要把相應的基因標識出來,有需求就有更新,這個操作跟全基因組展示基因家族的共線性是一個道理,做基因家族的朋友也可以參考一下。要畫這個圖其實很簡單,跟 1.3 的流程是一樣的,關鍵是獲得xxx.simple文件,然后才能開始下面的繪圖,現在需要獲得兩個基因組感興趣基因的1對1文件,那就需要走一遍 2,局部共線性分析(可視化) 這個流程,得到i1.blocks后,根據感興趣基因的列表來匹配1對1blocks中的基因,很簡單,寫個程序就可以:

import sys
gene_list = open(sys.argv[1],'r')
blocks = open(sys.argv[2],'r')
list = []
for i in gene_list:
    i = i.strip()
    list.append(i)
for line in blocks:
    line = line.strip()
    item1 = line.split("\t")[0]
    item2 = line.split("\t")[1]
    if item1 in list and item2 != ".":
        print(item1+"\t"+item2)
    else:
        continue

python get_interestedGene_from_i1_blocks.py gene_list all.i1.blocks > interestedGene.i1.blocks

然后根據這個新blcoks弄成一個simple文件,可以使用以下代碼:

cat interestedGene.i1.blocks|awk -vOFS="\t" '{print"#FF0000*"$1,$1,$2,$2,"10","+"}' > interestedGene.simple

如果想在circos上展示共線性,那就需要弄一個link文件,需要基因的bed文件,以及上面的interestedGene.i1.blocks,這里也把代碼貼上:

from sys import argv
bed = argv[1]
syn = argv[2]
ref_dict = {line.split("\t")[3]:line.split("\t")[0:3] for line in open(bed)}
for line in open(syn):
    items = line.strip().split("\t")
    s_gene = items[0]
    e_gene = items[1]
    s_chr,s_gene_s,s_gene_e = ref_dict[s_gene][0:3]
    e_chr,e_gene_s,e_gene_e = ref_dict[e_gene][0:3]
    circos_input = [s_chr,s_gene_s,s_gene_e,e_chr,e_gene_s,e_gene_e]
    out = '\t'.join(circos_input)
    print(out)

python get_link_from_i1.blocks.py all.gene.bed interestedGene.i1.blocks > interestedGene.links

微觀共線性分析就簡單了,直接在i1.blocks文件前面加上顏色就可以了,想看哪一段blocks,就去bed文件里找基因位置,然后把這一段的截出來就行了

更新這一段內容是因為前段時間看了發表在MP上的Genetribe軟件文章,這篇文章使用優化的算法鑒定不同基因組之前的共線性基因,并將這些基因分為1對1最佳(RBH)基因,單向最佳匹配基因(SBH),以及1對多基因等,最近在用這個軟件分析自己的課題,最后的可視化用jcvi的程序就可以做到,感興趣的可以看看https://doi.org/10.1016/j.molp.2020.09.019

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容