bwa index genome.fa
由于数据太多,无法存储过多的中间文件,因此写了一个脚本,边运行边删除中间文件,过程包括:
picard
软件合并来自同一个材料的sam文件,并输出排序后的bam文件,建立索引。picard
软件注释 Duplicates 信息。特殊的建库方式,如GBS、RAD-seq、RNA-seq数据可以忽略,因为它们或者用酶切建库,基因组打断的位置不随机,或者基于转录本建库,本身的表达丰度不同,都不适合去重。Tips:
/tmp
,可能会存储空间不足,导致程序强行终止。以下是运行代码:
#参考基因组(绝对路径)
Ref=genome.fa
#bwa 参数
#线程
t=10
#索引
FM_index="genome.fa"
#picard 参数
#最大运行内存
p_Xmx=20g
#GATK4参数
# 临时文件夹(绝对路径)
tmpdir="tmpdir"
# bam 文件(绝对路径)
bam_dir="."
# java 运行内存
G_Xmx=20g
#对fastq文件按reads group分组
while read id
do
#解压
gunzip -c /database/public/reseq355_clean/${id}_1.fq.gz >${id}_1.fq
gunzip -c /database/public/reseq355_clean/${id}_2.fq.gz >${id}_2.fq
#提取read group信息
grep "^@ST" ${id}_1.fq|cut -d ':' -f1-4|sort|uniq >${id}.RG.table
while read rg
do
affix=`echo $rg|tr ":" "-"`
#根据read group分隔文件
grep -A 3 ${rg} ${id}_1.fq >${id}-${affix}_1.fq
grep -A 3 ${rg} ${id}_2.fq >${id}-${affix}_2.fq
done <${id}.RG.table
#删除fastq文件,释放存储空间
rm ${id}_1.fq ${id}_2.fq
# bwa 比对
#比对成功后,删除相应fastq文件
while read rg
do
affix=`echo $rg|tr ":" "-"`
bwa mem -t $t -M -R "@RG\tID:${affix}\tSM:${id}\tLB:${id}\tPL:illumina" $FM_index ${id}-${affix}_1.fq ${id}-${affix}_2.fq >${id}-${affix}.sam && rm ${id}-${affix}_*.fq
done <${id}.RG.table
#用picard合并sam,排序,输出bam,index
ls ${id}-*.sam|xargs -I [] echo "I="[]|xargs -L 1000000 \
picard -Xmx${p_Xmx} MergeSamFiles \
O=${id}.merged.sorted.bam \
SORT_ORDER=coordinate \
CREATE_INDEX=true \
VALIDATION_STRINGENCY=LENIENT \
REFERENCE_SEQUENCE=$Ref \
TMP_DIR=${tmpdir} 2>${id%}.log \
&&rm ${id}-*.sam
# 用picard 进行Mark duplicates
picard -Xmx${p_Xmx} MarkDuplicates \
I=${id}.merged.sorted.bam \
O=${id}.merged.sorted.dedup.bam \
M=${id}.Marked_dup_metrics.txt \
CREATE_INDEX=true \
VALIDATION_STRINGENCY=LENIENT \
REFERENCE_SEQUENCE=$Ref \
TMP_DIR=${tmpdir} 2>${id%}.log \
&& rm ${id}.merged.sorted.bam*
#用gatk HaplotypeCaller进行SNP Calling
#“-DF NotDuplicateReadFilter”:使用该参数则禁止对reads duplicate进行过滤,GBS或RNA-seq数据可能需要。
# 为gatk建立临时存储文件夹
if [ ! -f "${tmpdir}/${id}_h" ];then
mkdir -p ${tmpdir}/${id}_h
else
rm -r ${tmpdir}/${id}_h/*
fi
gatk --java-options "-Xmx${G_Xmx} -Djava.io.tmpdir=${tmpdir}/${id}_h" \
HaplotypeCaller \
-ERC GVCF \
-R ${Ref} \
-I ${id}.merged.sorted.dedup.bam \
-O ${id}.gvcf.gz \
1>${id}.gvcf.log 2>&1 \
&& rm -r ${tmpdir}/${id}_h
done < $1