Skip to content

xiangsui5/Genomics-Internship

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 

Repository files navigation

Genomics-Internship

1 根据diamond结果对蛋白序列进行聚类 -- 构建基因家族

任务:构建Brevibacillus基因家族

1.1 数据准备

根据链接https://www.ncbi.nlm.nih.gov/genome/browse#!/overview/Brevibacillus 中的信息完成https://docs.qq.com/sheet/DUEZiWFBEcktGTWROzz 中表的信息 根据老师再github所给的curl命令下载本次实验所需要的数据类似下图 image 在下载过程中可能有些文件会出现文件下载后不能解压的情况,可能是由于文件下载不完全导致的,可以使用curl -0 --data - binary的命令来下载。

1.2 对蛋白序列进行两两比对

在做diamond之前需要改一下序列名,在各自序列名后面加上GCF编号,如将WP_003333770.1改成WP_003333770.1:GCF_000010165,将所有蛋白序列合并到一个文件all_pro.faa。改完序列名之后的情况类似于下图 image 改序列名有利于之后分辨获得正确的单拷贝基因家族。

  • 首先先对蛋白质序列进行建库,diamond makedb --in all_pro.faa -d allpep,然后用diamond进行两两比对

work_diamod.sh

#!/bin/bash
#$ -S /bin/bash
#$ -N diamond
#$ -j y
#$ -cwd
source /opt/miniconda3/bin/activate
conda activate genomelab
diamond blastp -d allpep -q /data/stdata/genomic/bioinfo2019/201941660807/shixi/data/data_80/all_pro.faa -o allBlast.tsv -f 6 #不同人数据存放位置不同,根据实际情况改路径

将比对的结果放入了allBlast.tsv,结果图及过程图如下 结果图 image 过程图 image

1.3 提取每个hit的score值,构建一个表征两条序列的相似性的特征值

直接使用老师所给命令

cut -f 1,2,12 allBlast.tsv > allBlast.abc

结果图 image

1.4 用mcl进行聚类

在集群上需要在老师的代码里加点东西 work_mcl.sh

#!/bin/bash
#$ -S /bin/bash
#$ -N MCL
#$ -j y
#$ -cwd
source /opt/miniconda3/bin/activate
conda activate genomelab
mcxload -abc allBlast.abc --stream-mirror -write-tab data.tab -o data.mci
mcl data.mci -I 1.4
mcl data.mci -I 2
mcl data.mci -I 4
mcxdump -icl out.data.mci.I14 -tabr data.tab -o dump.data.mci.I14
mcxdump -icl out.data.mci.I20 -tabr data.tab -o dump.data.mci.I20
mcxdump -icl out.data.mci.I40 -tabr data.tab -o dump.data.mci.I40
clm dist --chain out.data.mci.I{14,20,40}

出现三个dump文件,随机选取一个进行分析就可以了,我们组选取了dump.data.mci.I20和dump.data.mci.I40进行后续的分析。在dump文件中每一行相当于一个基因家族,我们需要筛选的单拷贝基因家族的特征为每个家族有80个成员且GCF号不能重复 据上述要求得到一个python代码如下

d = "dump.data.mci.I14"#可以换成40,20
d1 = "dump.data.mci.I-14"#可以换成40,20
fo = open(d,"r")
f = open(d1,"a+")
fo = fo.readlines()
n = 0
for line in fo:
    line = line.split("\t")
    ID = []
    if len(line) == 80:
        for i in line:
            ID.append(i[15:29])
        ID_set = set(ID)
        if len(ID_set) == len(ID):
            f.write("\t".join(line))
            n += 1
f.close()
print("同学,一共{}个单拷贝基因家族".format(n))

根据上述代码知道dump.data.mci.I20和dump.datt.mci.I40中的单拷贝基因家族分别为72个,21个,且会生成两个包含单拷贝基因家族的文件dump.data.mci.I-20和dump.data.mci.I-40 image

dump.data.mci.I-20,如上图一行为一个单拷贝基因家族一共72行 image

dump.data.mci.I-40,如上图

2.构建物种进化树

2.1 提取单拷贝基因家族的基因序列

根据需求得出如下代码

def extract(filename1,filename2,prefix,suffix):#提取单序列家族序列
    f = open(filename1, "r")
    f_list = f.readlines()
    f.close()
    fo = open(filename2, "r")
    fo_list = fo.readlines()
    fo.close()
    for i in range(len(f_list)):
        t = open(prefix + str(i) + suffix, "a+")
        f_name = f_list[i].strip("\n")
        f_name = f_name.split("\t")
        lines = []
        for ID in f_name:
            line = ""
            n = 0
            for row in fo_list:
                if ID in row:
                    n += 1
                    line += row
                elif row[0] != ">" and n == 1:
                    line += row
                elif row[0] == ">" and n == 1:
                    break
                else:
                    continue
            lines.append(line)
        t.write("".join(lines))
        t.close()
    return "提取完成"
#示例:获取dump.data.mci.I-40中的每个基因家族的序列
d = "dump.data.mci.I-14"#此变量可以赋值为dump.data.mci.I-20(或者40)
a = "E:/R学习、/基因组学/实习/genomelab-1/all_pro.faa"
prefix = "I14-"#可以改为I20-或者I40
suffix = ".faa"
extract(d,a,prefix,suffix)

会得到等于单拷贝基因家族数的序列文件。 例:I40的家族成员序列文件 image

注:为什么要选择单拷贝基因? 一般是用单拷贝的直系同源基因研究系统发生。我个人理解,不一定完全准确。 1.相对于全基因组减少计算量 2.减少旁系同源基因对序列比对和后来进化树的影响。

2.2 多序列比对

关于muscle在Linux上的下载 #wget http://www.drive5.com/muscle/downloads3.8.31/muscle3.8.31_i86linux64.tar.gz

#tar -zxvf muscle3.8.31_i86linux64.tar.gz

#chmod +x muscle3.8.31_i86linux64

#mv muscle3.8.31_i86linux64 muscle

image

#export PATH=/data/stdata/genomic/bioinfo2019/201941632216/inter/muscle:$PATH

#./muscle#使用muscle

使用shell脚本建立一个循环,对每个单拷贝基因家族进行多序列比对

#!/bin/bash
#$ -S /bin/bash
#$ -N muscle
#$ -j y
#$ -cwd
compack="zip"
oldsuffix="faa"
newsuffix="afa"
pack="rar"
str="muscle finshed"
dir=$(eval pwd)
unzip *.${compack}
export PATH=/data/stdata/genomic/bioinfo2019/201941632216/inter/muscle:$PATH #加入临时环境变量
for file in $(ls $dir | grep .${oldsuffix}) #构建循环
    do
        name=$(ls ${file} | cut -d. -f1) #切割获取文件名
        ./muscle -in ${file} -out ${name}.${newsuffix} #muscle运行多序列比对
	echo ${name}-${str}
	rm ${name}.${oldsuffix}
	if [ ! -f "/data/stdata/genomic/bioinfo2019/201941632216/inter/excel/${name:0:3}.${pack}" ];then #判断文件是否存在
                tar -cf ${name:0:3}.${pack} ls *.${newsuffix} #若文件不存在则创建压缩包
        else
                echo "文件存在"
        fi
	tar -crf ${name:0:3}.${pack} ls *.${newsuffix} #打包文件,将单个文件压缩进压缩包
	rm -rf ${name}.${newsuffix} #删除多序列比对多余结果
    done
echo ${str}

I20的多序列比对后的结果文件数量 image

文件内容(只取了其中一个),经过多序列比对之后会将不等长的序列使用gap填充,使之等长。 image

I40的多序列比对后的结果文件数量 image

文件内容 image

2.3 比对后序列合并

对于每个菌株的ID(GCF号),都需要在每一个muscle比对文件中搜索对应的序列,将序列逐个粘贴成1条完整的序列 如果我们有80个菌株,那么合并的文件应该有160行(fasta格式,一行ID、一行序列) 由上述要求所得代码如下

def filenames(path,prefix,suffix):
    import os
    path_list = os.listdir(path)
    path_list1 = []
    for f in path_list:
        if f.find(suffix) != -1:
            path_list1.append(f)
    filename = []
    for i in range(len(path_list1)):
        filename.append(prefix + str(i) + suffix)
    return filename
def ID(filename,IDname):
    f = open(filename,"r").readlines()
    fo = open(IDname,"a+")
    for line in f:
        if line[0] == ">":
            fo.write(">"+line[16:29]+"\n")
    fo.close()
    return
def merge_seq(ID_merge_file,new_file,total_mergefilename):
    f = open(new_file, "a+")
    fo = open(ID_merge_file, "r")
    fo_list = fo.readlines()
    for i in fo_list:
        lines = i
        for I in total_mergefilename:
            seq = open(I, "r").readlines()
            n = 0
            for row in seq:
                if row.find(i[1:16].strip("\n")) != -1:
                    n += 1
                elif row[0] != ">" and n == 1:
                    row = row.strip("\n")
                    lines += row
                elif row[0] == ">" and n == 1:
                    break
                else:
                    continue
        f.write(lines + "\n")
    f.close()
    return "序列融合完毕"
if __name__ == '__main__':
    path = "E:/R学习、/基因组学/实习/results/I14"  # 20,40
    prefix = "I14-"  # 20,40
    suffix = ".afa"
    file = "I14-0.afa"  # 从中提取80个GCP名
    name = "ID_I14.faa"  # 80个GCP名字所在文件名字,此时为空
    I_filename = filenames(path, prefix, suffix)  # 获得需要合并的文件的总名称数且进行了顺序排列
    ID(file, name)  # 将80个GCP的ID储存在了name代表的文件名中
    after_mergefile = "all_I14.faa"  # 序列融合后得到的文件名称
    merge_seq(name, after_mergefile, I_filename)

分别运行完上述代码后得到两种聚类分别合并后的文件all_I20.faa和all_I40.faa 文件内容如图 all_I20.faa(部分) image all_I40.faa(部分) image

2.4 构建进化树

集群上有FastTree软件,可直接使用fastree protein_alignment > tree 最后,将tree文件放到mega或者其他的构树软件中,出图如下 I20 0Z~KO)A0O2RAIHRTTM4(FVA

I40 TL}ZGZ9KPS9 FT06BWNQV(E

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors