方法一:轉(zhuǎn)換格式的perl腳本
ftp://ftp.ncbi.nlm.nih.gov//toolbox/ncbi_tools/converters/scripts/gbf2tbl.pl
用法
perl gbf2tbl.pl genbankfile_name
方法二:在線程序 GB2sequin
網(wǎng)址 https://chlorobox.mpimp-golm.mpg.de/GenBank2Sequin.html
推薦文獻
GB2sequin — A file converter preparing custom Genbank files for database submission
葉綠體基因組提交到NCBI的流程
可以利用微信搜索 《如何優(yōu)雅地向NCBI上傳線粒體基因組序列》, 這篇文章介紹了利用Bankit提交線粒體基因組序列至NCBI的流程,同樣適用于葉綠體基因組序列
寫在結(jié)尾的廢話
這個學期一直在看和葉綠體基因組相關的文章,目前學習到向NCBI提交完整的葉綠體基因組序列,需要準備的文件包括葉綠體基因組fasta文件和注釋文件,注釋文件要求的格式為.tbl,按照常理應該會有已經(jīng)造好的輪子來利用常規(guī)的注釋文件(比如genbank格式,或者gff3格式)來生成.tbl文件,可是自己找了將近兩天的時間竟然沒有找到(找到了一些python腳本或者小軟件,但是都沒有運行成功;同時也找到了NCBI提供的小軟件table2asn_GFF3,目測功能是利用gff3格式的注釋文件生成.tbl文件,試運行了一下,可是參數(shù)太多,暫時還沒有搞明白該怎么使用),自己也嘗試著寫了一些腳本,奈何能力有限沒有能夠解決,前前后后大約折騰了4天左右的時間,之后因為忙一些其他事情中斷了一個星期左右,今天再次嘗試的時候發(fā)現(xiàn)原來葉綠體基因組注釋在線工具GeSeq https://chlorobox.mpimp-golm.mpg.de/geseq.html 中包括了格式轉(zhuǎn)換的工具GB2sequin,然后找到了這篇文獻來看又發(fā)現(xiàn)了格式轉(zhuǎn)換用到的perl腳本,暫時解決了提交序列的問題!
小小感悟:
面對解決不了的問題不要著急,只需要停下來讓腦子休息下然后在重新出發(fā)!
更新20190102
推薦一篇論文
Complete plastome sequences from Bertholletia excelsa and 23 related species yield informative markers for Lecythidaceae
-
論文中提供了部分分析結(jié)果和分析使用到的相關代碼:The scripts and alignments used in this study can be found at https://bitbucket.org/oscarvargash/lecythidaceae_plastomes;其中有一部分是向NCBI提交葉綠體基因組的數(shù)據(jù)
記錄自己慢慢理解的過程55.PNG -
自己使用Bankit向NCBI提交葉綠體基因組數(shù)據(jù)時要求的注釋文件中應該有對應的product內(nèi)容,自己注釋使用的是在線程序GeSeq,輸出的genbank文件中沒有product的內(nèi)容;那么如何把對應的product添加到已經(jīng)生成好的genbank文件中呢?今天想到了解決辦法:因為SeqIO模塊解析genbank文件后codon_start、transl_table、translation、product等內(nèi)容存儲在字典里;是可以手動添加其他內(nèi)容的,比如初始的genbank文件是這樣的56.PNG
然后可以把它變成這樣57.PNG
from Bio import SeqIO
with open("rpl16.gb","gb"):
for rec in SeqIO.parse("sequence.gb","gb"):
for feature in rec.features:
if feature.type == "CDS":
feature.qualifiers["yan"] = "ming"
feature.qualifiers["kobe"] = "bryant"
SeqIO.write(rec,fw,"gb")
- 自己的葉綠體基因組注釋是使用GeSeq做的,輸出的genBank文件中有一行’note‘;首先將這一行去掉
from Bio import SeqIO
for rec in SeqIO.parse("fileName.gb"):
for feature in rec.features:
if feature.type == "gene" and feature.qualifiers.__contains__("note"):
feature.qualifiers.pop("note")
fw = open("output_file.gb","w")
SeqIO.write(rec,fw,"gb")
fw.close()
- python小知識點:移除字典中指定的鍵:值 pop()
x = {}
x["yan"] = "ming"
x["kobe"] = "bryant"
x
x.pop("kobe")
x
- 然后在NCBI上選一些和自己研究物種親緣關系比較近的物種的葉綠體基因組的genbank文件,放到同一個文件夾下,分別將基因名的對應的產(chǎn)物名寫到字典中的鍵和值
python小知識點:fnmatch模塊,字符串匹配文件名的標準庫,主要有四個函數(shù)
fnmatch 判斷文件名是否符合特定的格式
fnmatchcase 區(qū)分大小寫
比如我想篩選出某個文件下以gb結(jié)尾的文件的文件名
import fnmatch
fnmatch.fnmatch("abc.gb","*.gb") #返回True
import os
for file in os.lsidir("./"):
if fnmatch.fnmatch(file,"*.gb"):
print(file)
接下來是為genbank文件添加product字段
import os
import fnmatch
from Bio import SeqIO
fileName = []
for file in os.listdir("./")
if fnmatch.fnmatch(file,"*.gb"):
fileName.append(file)
products = {}
for file in fileName:
for rec in SeqIO.parse(file,"gb"):
for feature in rec.features:
if feature.type == "CDS" or feature.type == "tRNA"
products[feature.qualifiers["gene"][0]] = features.qualifiers["product"][0]
with open("output_1.gb","w") as fw:
for rec in SeqIO.parse("own_gb_file.gb","gb"):
for feature in rec.features:
if feature.type == "CDS" or feature.type == "tRNA":
feature.qualifiers["product"] = products[feature.qualifiers["gene"][0]]
SeqIO.write(rec,fw,"gb")
理解了SeqIO解析genbank格式文件的數(shù)據(jù)存儲后,自己應該也可以寫一個簡單的腳本將genbank格式的文件轉(zhuǎn)化成.tbl文件,好好想一想該如何實現(xiàn);SeqIO模塊的源碼自己抽時間要多看幾遍!
更新2019018
自己的葉綠體基因組數(shù)據(jù)注釋是使用在線程序GeSeq做的,輸出結(jié)果genBank文件中包括intron和exon的信息,不想要這部分信息,想寫個腳本刪掉
- 第一版
for rec in SeqIo.parse(“input_file.gb”,"gb"):
fea_index = []
for a,b in enumerate(rec.features):
if b.type == "intron" or b.type == "exon":
fea_index.append(a)
for i in fea_index:
rec.features.pop(i)
fw = open("output_file.gb","w")
SeqIO.write(rec,fw,"gb")
fw.close()
一直遇到報錯IndexError: pop index out of range
想了好長時間才想明白: rec 里面存儲的內(nèi)容刪除一項后,對應的后面的內(nèi)容的index會相應遷移,比如有1,5,7,9,12五個數(shù)字,對應的位置分別是1,2,3,4,5;如果刪除前兩個,12對應的位置就有原來的5 改為了3
- 更改腳本
for rec in SeqIO.parse("注釋文件/完成/Malus_baccata_C108_1.gb","gb"):
fea_index = []
for a,b in enumerate(rec.features):
if b.type == "exon" or b.type == "intron":
fea_index.append(a)
for s,i in enumerate(fea_index):
rec.features.pop(i-s) ######
fw = open("1.gb","w")
SeqIO.write(rec,fw,"gb")
fw.close()