小麦三代转录组融合基因定量

小麦三代转录组融合基因定量

  三代转录组的序列普遍比较长,得到的是完整的全长的转录本,在后期处理过程中无需组装,大大的降低了错误率。二代转录组测序得到的结果通常都是打断后的序列,长度一般为150bp左右,一般下机质控后需要进行拼接处理,对于多倍体,重复序列多的物种而言,在拼接的过程中易造成错拼。全长转录组测序技术出现,对多倍体作物研究全长转录本的信息提供新的方法。

三代转录组几大法宝:全长转录本、鉴定异构体(Isoforms)、鉴定可变剪接、鉴定基因融合,鉴定变异(SNP和INDEL),长读长带来二代测序不可比拟的优势!

第三代测序的常用的两大平台(Pacific Biosciences)、(Oxford Nanopore)。更为常用的是pacbio平台的实时单分子测序技术。对于融合基因的鉴定比二代更为准确。在植物领域中,融合基因的研究较少,融合基因定量软件体系也不成熟。该文章记录我对小麦的融合基因的定量。使用二代测序数据对三代转录组进行定量。


一、定量思路:

    1、首先使用RSEM定量软件对融合基因进行正常定量

    2、对比对得到的bam文件中的reads进行筛选,得到至少包含Junction位点的read

    3、构建表达矩阵    

二、步骤

    1、使用RSEM进行对融合基因定量

首先要得到由cDNA_Cupcake软件中的fusion_finder.py(cDNA_Cupcake链接)脚本对sample_clustered.hq.fasta文件(由pacbio官方提供的三代质控pipeline得到 IsoSeq链接),得到下图中的文件。

    其中ALL_SAMPLE.rep.fa文件的内容如下:

ALL_SAMPLE_corrected.fasta文件内容如下,后面我们将从此文件提取两个基因片段的位置,从而确定融合连接点。>PBfusion.1.1表示融合基因的左边序列,>PBfusion.1.2表示融合基因的右边序列,根据左边序列长度从而确定junction位置。

1、构建索引文件,以ALL_SAMPLE.rep.fa文件中的序列作为reference建立索引

rsem-prepare-reference --bowtie2 ALL_SAMPLE.rep.fa /name

   --bowtie2 :调用 bowtie2软件作为比对软件,以构建索引文件

    ALL_SAMPLE.rep.fa:构建索引对象文件

    /name:是储存索引文件路径,name是索引名称

结果如下:


索引文件

2、RSEM开始比对定量

rsem-calculate-expression -p 8 --bowtie2 --bowtie2-mismatch-rate 0 \

--paired-end sample_R1.fastp.fq.gz sample_R2.fastp.fq.gz \

/Wheat_fusion_ref /sample

-p:线程数

--bowtie2:调用bowtie2软件进行比对

--bowtie2-mismatch-rate:比对错配率,默认为0.1

--paired-end:输入文件为二代双端测序文件,sample_R1.fastp.fq.gz为二代测序上游文件,sample_R2.fastp.fq.gz为二代测序下游文件

/Wheat_fusion_ref:bowtie2构建索引文件位置及名称

/sample:生成结果的路径与文件前缀名

结果如下:


主要的比对结果文件


sample.genes.results:基因表达量

sample.isoforms.results:异构体表达量

sample.transcript.bam:比对结果bam文件

比对模式

我们只需要得到有效比对的reads数量,而上面的比对结果文件以及定量文件都包含了无效比对和有效比对两种情况。下面对上面的结果文件进行提取有效比对结果。


    2、筛选比对结果,获得表达矩阵

1、首先将bam文件转为sam文件

 samtools view -h sample.transcript.bam > sample.transcript.sam

2、筛选比对结果,使用下面python脚本

使用下面脚本需要:ALL_SAMPLE_corrected.fasta、sample.isoforms.results文件

usage:python Exac_fusion_junction_sq.py ./sample

#提取符合融合基因链接位点两端若干bp的aligned reads并计数

import sys

import os

import pandas as pd

from pandas import Series,DataFrame

import numpy as np

input=sys.argv[1] #输入参数一般格式为./sample_name sample_name:样本名

os.chdir(input) #修改工作目录

sample_id=input.split("/")[1] #样品名

sample_r1=sample_id+"_r1.transcript.sam" #比对后的sam文件,重复1

sample_r2=sample_id+"_r2.transcript.sam" #比对后的sam文件,重复2 ,若无重复可删除

sample_r3=sample_id+"_r3.transcript.sam" #比对后的sam文件,重复3 ,若无重复可删除

sample_list=[sample_r1,sample_r2,sample_r3] #比对后的sam文件列表

##获取每个融合基因的junction位置

with open("/**/ALL_SAMPLE_corrected.fasta","r") as file: #打开上面的ALL_SAMPLE_corrected.fasta文件提取junction

    ID_lib={}

    for info in file:

        info=info.strip()

        if info[0] == ">" :

            id=info

            ID_lib[id]=""

         else:

                ID_lib[id] += info

Counts_lib={}

ID_junc={}

for key in ID_lib.keys():

    suffix=key.rsplit(".",maxsplit=1)[1]

    fusion_gen_id=key.rsplit(".",maxsplit=1)[0].split(">")[1]

    if int(suffix) == 1:

        junction_pos=len(ID_lib[key])

        ID_junc[fusion_gen_id]=junction_pos

        Counts_lib[fusion_gen_id]=0

##处理sam文件,选出符合junction的reads

for sample in sample_list:

#生成文件符合筛选条件的read

    out1=open(sample.rsplit(".",maxsplit=1)[0]+"_.30.aligned.txt","a+")

#符合条件的计数文件

    out2=open(sample.rsplit(".",maxsplit=2)[0]+".30.Isoforms.results","a+")

with open(sample,"r") as file1:

    for line in file1:

        line=line.strip()

        if line[0] != "@":

            ref_id=line.split("\t")[2]

            #确定筛选条件,下面这个条件为read必须覆盖junction位点左右至少30个bp,此值可根据需要进行修改

            if ID_junc.__contains__(ref_id) and int(line.split("\t")[3]) <= (ID_junc[ref_id]-30) and int(line.split("\t")[3])+abs(len(line.split("\t")[9])) >= (ID_junc[ref_id]+30):

                    Counts_lib[ref_id]=Counts_lib[ref_id]+list(np.array(line.rsplit(":",maxsplit=1)[1],dtype=np.float64).reshape(1,1)[0])[0]

                     out1.write(line+"\n")

##计算表达矩阵

    exp_df=pd.read_table("sample.isoforms.results",index_col=0)#导入一个表达矩阵模板,运行RSEM程序生成的

    exp_df[["expected_count","TPM","FPKM","IsoPct"]]=0 #表达量初始化

    for exp_id in exp_df["gene_id"]:

        exp_df.loc[exp_id,"expected_count"]=round(Counts_lib[exp_id]/2,2)

    Sum_counts=sum(exp_df["expected_count"])

    for exp_id in exp_df["gene_id"]:

        exp_df.loc[exp_id,"FPKM"]=round((exp_df.loc[exp_id,"expected_count"]*10**9)/(exp_df.loc[exp_id,"length"]*Sum_counts),2)

    Sum_fpkm=sum(exp_df["FPKM"])

    for exp_id in exp_df["gene_id"]:

        exp_df.loc[exp_id,"TPM"]=round(exp_df.loc[exp_id,"FPKM"]/Sum_fpkm*10**6,2)

    exp_df.to_csv(out2,sep="\t")

       3、结果文件

上面脚本运行完成后会得到两个文件。


结果文件

1、sample.transcrip_.30.aligned.txt 文件


sample.transcrip_.30.aligned.txt

   2、sample.30.Isoforms.results

sample.30.Isoforms.results

得到这两个文件,融合基因的表达定量就完成了。

你可能感兴趣的:(小麦三代转录组融合基因定量)