mashengwei的个人博客分享 http://blog.sciencenet.cn/u/mashengwei

博文

call variants from wheat RNA_seq

已有 4314 次阅读 2018-1-25 22:39 |系统分类:科研笔记| 小麦, 基因组, EMS, RNA_seq, 突变体

call variants from wheat RNA_seq

1
24

本期作者:Neal


call variants from wheat RNA_seq

上周我们推送的何中虎研究员的文章(中国小麦产业发展与科技进步——小麦里我见过的最豪华作者阵容),目前阅读人数是8400多人,也是迄今为止我们公众号阅读人数最高的推送之一,这也直接让我们的关注人数猛增到3000人。过去一段时间,有不少小麦育种老师和专家也关注了我们,我们非常欢迎各位分享育种方面的经验。

今天要说一些说从RNAseq数据里得到序列变异的步骤。首先要交代一下背景,我们要研究一个EMS突变体(已回交多次),前期已经将突变基因定位到一个染色体区间,根据中国春参考序列,我们已经发现一个候选基因已经在水稻里被报道过了,测序发现,该基因确实发生了变异。后期安排了RNAseq实验,想在机制方面做一个有益的尝试。另外我们也想通过这样一个RNA_seq数据,比较在定位区间内还有那些基因发生了变异,因此就有了今天这样一个推送。

这里还要特别强调一点,这不是混池数据,分析过程中的一些参数请根据实验目的调整。

使用STAR将reads mapping至小麦基因组,然后使用sentieon流程(本质是GATK)call variant,接着使用SnpSift筛选高质量SNP,结合EMS诱变的特点,进一步排除可能的假阳性SNP,最后获得大概300个SNP,使用SnpEff注释SNP。根据前期遗传定位结果,我们发现只有4个SNP位于我们的区间内(20Mb),但是只有一个SNP导致蛋白提前终止,该SNP所在的基因其在水稻里的直系同源基因已被报道,突变之后与我们的突变体表型非常相似。

下面是具体的流程,如果有兴趣欢迎交流。这个需要具有一定的高通量数据分析基础,其他的就没有什么特别的地方了。

  1. # 工作目录

  2. cd /data/rna_seq/genome/

  3. #构建 A 基因组 index

  4. STAR --runThreadN 10--runMode genomeGenerate --genomeDir ./--genomeFastaFiles CS_A_genome_part.fasta --sjdbFileChrStartEnd TGACv1_part_A.ss --limitGenomeGenerateRAM 68800833920

  1. #!/usr/bin/env python

  2. # -*- coding: utf-8 -*-

  3. __author__ ='wheatomics'

  4. import subprocess

  5. # inpu.txt放着fastq文件的名字

  6. with open('input.txt','r')as f:

  7.    for line in f:

  8.        line = line.strip().split()

  9.        fq1, fq2 = line

  10.        print fq1, fq2

  11.        # 1. Mapping reads with STAR

  12.        proc = subprocess.Popen(

  13.            ['STAR','--twopassMode','Basic','--genomeDir','/data2/masw_data/rna_seq/dqyRNA-seq/masw_analysis/genome/','--runThreadN','20','--limitSjdbInsertNsj','5000000','--outSAMtype','BAM','SortedByCoordinate','--twopass1readsN','-1','--readFilesCommand','zcat','--sjdbOverhang','100','--outFilterMismatchNmax','10','--readFilesIn', fq1, fq2,

  14.             '--outSAMattrRGline','ID:'+ fq1.split('_')[0],'SM:'+ fq1.split('_')[0],'PL:ILLUMINA'], shell=False)

  15.        proc.wait()

  16.        proc = subprocess.Popen(['mv','Aligned.sortedByCoord.out.bam','sorted1.bam'], shell=False)

  17.        proc.wait()

  18.        proc = subprocess.Popen(['samtools','view','-@','10','-h','-q','255','-o','sorted.bam','-O','BAM','sorted1.bam'], shell=False)

  19.        proc.wait()

  20.        proc = subprocess.Popen(['sentieon','util','index','sorted.bam'], shell=False)

  21.        proc.wait()

  22.        # 2. Metrics

  23.        proc = subprocess.Popen(['sentieon','driver','-r','/data2/masw_data/rna_seq/dqyRNA-seq/masw_analysis/genome/CS_A_genome_part.fasta','-t','20','-i','sorted.bam','--algo','MeanQualityByCycle','mq_metrics.txt','--algo','QualDistribution','qd_metrics.txt','--algo','GCBias','--summary','gc_summary.txt','gc_metrics.txt','--algo','AlignmentStat','--adapter_seq',"''",'aln_metrics.txt','--algo','InsertSizeMetricAlgo','is_metrics.txt'], shell=False)

  24.        proc.wait()

  25.        proc = subprocess.Popen(['sentieon','plot','metrics','-o', fq1.split('_')[0]+'-metrics-report.pdf','gc=gc_metrics.txt','qd=qd_metrics.txt','mq=mq_metrics.txt','isize=is_metrics.txt'], shell=False)

  26.        proc.wait()

  27.        # 3. Remove Duplicate Reads

  28.        proc = subprocess.Popen(['sentieon','driver','-t','20','-i','sorted.bam','--algo','LocusCollector','--fun','score_info','score.txt'], shell=False)

  29.        proc.wait()

  30.        proc = subprocess.Popen(['sentieon','driver','-t','20','-i','sorted.bam','--algo','Dedup','--rmdup','--score_info','score.txt','--metrics','dedup_metrics.txt','deduped.bam'], shell=False)

  31.        proc.wait()

  32.        # 4. Split reads at Junction

  33.        proc = subprocess.Popen(['sentieon','driver','-r','/data2/masw_data/rna_seq/dqyRNA-seq/masw_analysis/genome/CS_A_genome_part.fasta','-t','20','-i','deduped.bam','--algo','RNASplitReadsAtJunction','--reassign_mapq','255:60','splitted.bam'], shell=False)

  34.        proc.wait()

  35.        # 5. Indel realigner

  36.        proc = subprocess.Popen(['sentieon','driver','-r','/data2/masw_data/rna_seq/dqyRNA-seq/masw_analysis/genome/CS_A_genome_part.fasta','--read_filter','MapQualFilter,min_map_qual=40','-t','20','-i','splitted.bam','--algo','Realigner', fq1.split('_')[0]+'.realigned.bam'], shell=False)

  37.        proc.wait()

Call SNP

  1. #此处只统计了unique mapped的reads

  2. sentieon driver -r /data2/masw_data/rna_seq/dqyRNA-seq/masw_analysis/genome/CS_A_genome_part.fasta --read_filter MapQualFilter,min_map_qual=60-t 10-i WT.realigned.bam -i br.realigned.bam --algo Genotyper--emit_conf 20--call_conf 20 WT_br_UG.vcf

筛选SNP

  1. #

  2. # 要注意,EMS诱变的变异一般是C/T和A/G的变异,其他类型的变异频率很低很低。另外,突变里的关键功能变异理论上与参考序列不同。EMS mutations result in G:C to A:T mutations, whereas false positives could be any change. Thus, we retained only the alleles that corresponded to G:C to A:T mutations using SnpSift

  3. cat WT_ms_UG.vcf | java -jar /data/snpEff/SnpSift.jar filter "(QUAL > 30) &(MQ > 40) & (QD > 5) & (FS < 30.0) & GEN[0].DP > 5 & GEN[1].DP > 5 & (((GEN[0].GT = '0/0') & (GEN[1].GT = '1/1')) | ((GEN[0].GT = '1/1') & (GEN[1].GT = '0/0')))"> WT_ms_UG_filtered.vcf

  4. #上述筛选参数不是固定的,要根据实验和分析结果调整。具体每个参数表示的意思,请Google搜索SnpSift即可。

vcf文件里的一条染色体还是拆开的,需要合并成一个整体。

  1. #!/usr/bin/env python

  2. # -*- coding: utf-8 -*-

  3. __author__ ='wheatomics'

  4. chr =[['chr1A',471304005],['chr1B',438720154],['chr1D',452179604],['chr2A',462376173],['chr2B',453218924],

  5.       ['chr2D',462216879],['chr3A',454103970],['chr3B',448155269],['chr3D',476235359],['chr4A',452555092],

  6.       ['chr4B',451014251],['chr4D',451004620],['chr5A',453230519],['chr5B',451372872],['chr5D',451901030],

  7.       ['chr6A',452440856],['chr6B',452077197],['chr6D',450509124],['chr7A',450046986],['chr7B',453822637],

  8.       ['chr7D',453812268]]

  9. with open('WT_br_UG_filtered.vcf','r')as f:

  10.    for line in f:

  11.        if line.startswith('#'):

  12.            print line,

  13.        else:

  14.            line = line.replace('_part1','')

  15.            line = line.strip().split('')

  16.            if line[0].endswith('part2'):

  17.                for i in chr:

  18.                    if line[0].split('_')[0]== i[0]:

  19.                        line[1]= int(line[1])+ int(i[1])

  20.                        line[0]= line[0].split('_')[0]

  21.            for m in line[:-1]:

  22.                print str(m)+'',

  23.            print line[-1]+'',

最好再修改下vcf的表头信息

  1. ##contig=<ID=chr1A,length=594102056,assembly=unknown>

  2. ##contig=<ID=chr2A,length=780798557,assembly=unknown>

  3. ##contig=<ID=chr3A,length=750843639,assembly=unknown>

  4. ##contig=<ID=chr4A,length=744588157,assembly=unknown>

  5. ##contig=<ID=chr5A,length=709773743,assembly=unknown>

  6. ##contig=<ID=chr6A,length=618079260,assembly=unknown>

  7. ##contig=<ID=chr7A,length=736706236,assembly=unknown>

  8. ##contig=<ID=chrUn,length=480980714,assembly=unknown>

转换之后就要统计SNP的信息,比如染色体上的SNP个数等

  1. #使用snpEff注释SNP

  2. java -Xmx8g-jar snpEff.jar IWGSCv1.0 WT_itr_UG_filtered_whole.vcf > WT_itr_UG_filtered_whole_eff.vcf

根据上述结果,即可进行下一步的分析。

SnpEff这个我们前面也介绍过,可以参考使用SnpEff 对SNP结果进行分析

欢迎关注小麦研究联盟”,了解小麦新进展

投稿、转载、合作以及信息分布等请联系:wheatgenome


原始链接




https://blog.sciencenet.cn/blog-1094241-1096831.html

上一篇:​“我要上PC”—小麦领域Plant Cell上论文合辑(八)
下一篇:谁说传统抗病基因的研究过时了—看看人家的LRR
收藏 IP: 58.213.93.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-28 03:58

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部