对某个物种进行分子进化分析,保守序列提取以及CRISPR-gRN
对某个物种进行分子进化分析,保守序列提取以及CRISPR-gRNA设计
基因组序列的获取
这里我们直接获取完整的基因组组装序列
在ncbi的基因组数据中检索物种关键词,获取该物种所有组装好的序列,去FTP下载
- 基因组fasta序列(*.fna)
- 基因组注释文件(*.gff)
根据gff文件获取每个想要基因的序列
基因的获取:
通过查找相关物种的文献,提取出该物种的有效基因
从gff文件中获取位置坐标并提取序列
原理很简单,就是按照小标题所示,可以自己写一个脚本实现,这里我用python实现
import argparse
import os
import glob
import re
import pandas as pd
from Bio import SeqIO
from Bio.Alphabet import IUPAC
from Bio.Seq import Seq
parser = argparse.ArgumentParser(
description='This script was used to get seq from gff file')
parser.add_argument('-g', '--gtf', help='Please input your bam file')
parser.add_argument('-i', '--id', help='Please input your reference file')
#parser.add_argument('-f', '--fasta', help='Please input start position')
args = parser.parse_args()
def read_gtf(file):
with open(file) as f:
alldata = f.readlines()
start = pd.Series([line.split("\t")[3]
for line in alldata if not line.startswith("#") and line.split("\t")[2] == "gene"])
stop = pd.Series([line.split("\t")[4]
for line in alldata if not line.startswith("#") and line.split("\t")[2] == "gene"])
strand = pd.Series([line.split("\t")[6]
for line in alldata if not line.startswith("#") and line.split("\t")[2] == "gene"])
genename = pd.Series([re.findall("Name=\w+", line.split("\t")
[8])[0].replace("Name=", "") for line in alldata if not line.startswith("#") and line.split("\t")[2] == "gene"])
gtf_data = pd.DataFrame(
{'start': start, 'stop': stop, 'strand': strand, 'genename': genename})
# print(gtf_data.head)
return gtf_data
def get_gtffile(path):
name = glob.glob(os.path.join(path, "*.gff"))
# print(name)
return name
def read_fasta(file):
for seq_record in SeqIO.parse(file, "fasta"):
fasta = str(seq_record.seq)
return fasta
def read_fasta2(file):
for seq_record in SeqIO.parse(file, "fasta"):
nameid = seq_record.id.split(" ")[0]
return nameid
def main():
sequence = {}
gtf_file_lst = get_gtffile(args.gtf)
id = args.id
i = 0
for gtf in gtf_file_lst:
gtf_data = read_gtf(gtf)
if not gtf_data.empty:
all_sequence = read_fasta(".".join(gtf.split(".")[0:-1])+".fna")
all_sequence_name = read_fasta2(
".".join(gtf.split(".")[0:-1])+".fna")
if not gtf_data[gtf_data['genename'] == id].reset_index().empty:
start = gtf_data[gtf_data['genename']
== id].reset_index().loc[0, 'start']
stop = gtf_data[gtf_data['genename']
== id].reset_index().loc[0, 'stop']
strand = gtf_data[gtf_data['genename'] ==
id].reset_index().loc[0, 'strand']
# print(start)
# print(stop)
# print(strand)
transtable = str.maketrans("AGCT", "TCGA")
if strand == "+":
sequence[">{}_{}".format(all_sequence_name,
id)] = all_sequence[int(start)-1:int(stop)]
else:
sequence[">{}_{}".format(all_sequence_name,
id)] = all_sequence[int(start)-1:int(stop)][::-1].translate(transtable)
i = i+1
with open("{}.fasta".format(id), 'a') as f:
for key, val in sequence.items():
f.write(key+"\n"+val+"\n")
if __name__ == "__main__":
main()
直接输入-g gtf文件夹位置 -i genename
对所有的基因序列做保守序列分析
我这里使用了meme软件自动发现高度保守模型
可以使用在线版本,但并不适合大量序列
所以直接使用离线版
meme coding/*.fasta -dna -oc . -mod zoops -nmotifs 3 -minw 20 -maxw 100 -objfun classic -minsites 2 -markov_order 0
因为后续要设计gRNA,
所以限制序列长度在20-100bp之间(-minw,-maxw),
zoops模式是meme发现模式中保守型和速度相对居中的一种模型(-mod),
-oc代表新生成的文件会覆盖原来的
接着写脚本提取保守序列
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-i", "--input", help="increase output verbosity")
args = parser.parse_args()
with open("meme.txt") as f:
i=1
for line in f:
if line.startswith("MOTIF"):
print(">{}_{}".format(args.input,i))
print(line.split(" ")[1])
i=i+1
gRNA设计
大规模gRNA设计建议采用FlashFry
建立基因组索引文件
mkdir tmp
java -Xmx4g -jar FlashFry-assembly-1.9.2.jar \
index \
--tmpLocation ./tmp \
--database Hg19_database \
--reference Hg19.fa \
--enzyme spcas9ngg
寻找gRNA序列
java -Xmx4g -jar FlashFry-assembly-1.9.2.jar \
discover \
--database hg19_database \
--fasta A179L.motif.fasta \
--maxMismatch 3 \ #建议设置该参数
--output A179L.motif.output
分析脱靶个数并进行排序,提取出想要的序列
import pandas as pd
import glob
#我这里分别对人类基因组和猪基因组进行了gRNA设计并合并otcount,排序
def get_gRNA(gene):
df1=pd.read_csv("{}.motif.output".format(gene),header=0,sep="\t")
df2=pd.read_csv("{}.motif.output2".format(gene),header=0,sep="\t")
df1=df1[['contig','target','otCount']].set_index('target')
df1.columns=['contig','otCount_human']
df2=df2[['contig','target','otCount']].set_index('target')
df2.columns=['contig','otCount_pig']
fin=df1.join(df2[['otCount_pig']])
fin=fin.sort_values(['otCount_pig','otCount_human']).iloc[:3,]
return fin
old_table=get_gRNA("A179L")
#这里随便找个基因作为初始化DataFrame
for gene in glob.glob("*.output"):
new_gene=gene.replace(".motif.output","")
#print(new_gene)
table=get_gRNA(new_gene)
#print(table)
old_table=pd.concat([table,old_table])
#print(old_table.head)
old_table.to_csv("coding2.gRNA.csv",sep="\t")
~
构建物种树
为了结合多个基因的结果,并且方便建树,采用了ETE3
基于几个连锁比对重建物种树需要选择两个工作流程:
i)用于比对每个基因家族序列的基因树工作流程(-w)
ii)基于超矩阵连接和构建树的工作流程alignment(-m)
所有基因/蛋白质的序列必须在单个fasta文件中传递,并且还需要COG(直系同源组)文件。COGs文件必须是包含与输入文件中相同的序列ID的文本文件。每个TAB分隔线将被视为COG。
例如,以下示例将分别定义3个大小为3,2和4的COG:
sp1_seqA sp2_seqA sp3_seqA
sp1_seqB sp2_seqB
sp1_seqC sp3_seqC sp4_seqC sp5_seqC
建树命令:
ete3 build -a proteome_seqs.fa --cogs cogs.txt -o sptree1_results -m sptree_fasttree_100 -w standard_fasttree
这里在安装ETE3的时候千万不要使用python3,有极大的可能会莫名其妙报错
如果想要覆盖已有的输出,使用--clearall
cogs文件实例,蛋白序列实例
所以如果想要正确使用的话,我建议使用miniconda创建python2的虚拟环境进行安装
conda create -n ETE python=2
source activate ETE
conda install -c etetoolkit ete3 ete_toolchain
NUP62.aa.fa.final_tree.png