宏基因组去宿主序列:BWA mem生成的SAM文件格式错误导致samtools无法处理

记录一次宏基因组数据处理,没想到在序列比对还能踩一坑,debug硬控了一段时间。感谢万能的国外论坛老哥,给出了简单有效的解决方法。

错误信息:

主要是sam文件格式错误,导致samtools无法读取。查看sam文件,包含了bwa的日志信息[M::bwa_idx_load_from_disk] read 0 ALT contigs,[M::process] read 530342 sequences (80000264 bp)...等。

背景:

拿到了一批宏基因组的双端测序数据,虽然公司已经跑过一遍,提供了在线分析报告。但还是打算自己重新跑一遍。在跟着公司的pipeline跑数据时,在序列比对就出了问题。

使用了以下脚本来处理质控后的Cleandata。错误的根源,并且在debug时反复检查觉得没有问题,导致之后error一直无法解决。

#!/bin/bash
#SBATCH --job-name=bwa_host_removal      # 作业名称
#SBATCH --partition=cpuPartition         # 分区名称
#SBATCH --nodes=1                        # 一个节点
#SBATCH --ntasks-per-node=8              # 每个节点使用8个任务
#SBATCH --error=bwa_%j.err               # 错误日志文件
#SBATCH --output=bwa_%j.out              # 输出日志文件

# 激活 Conda 环境
source ~/miniconda3/bin/activate metageno

# 输入和输出目录
INPUT_DIR="~/cleandata"
OUTPUT_DIR="~/cleandata_no_host"
REFERENCE="~/index/index"

# 确保输出目录存在
mkdir -p ${OUTPUT_DIR}

# 批量处理所有样本
for SAMPLE in ${INPUT_DIR}/*_R1.clean.fastq.gz; do
    BASENAME=$(basename ${SAMPLE} _R1.clean.fastq.gz)
    R1="${INPUT_DIR}/${BASENAME}_R1.clean.fastq.gz"
    R2="${INPUT_DIR}/${BASENAME}_R2.clean.fastq.gz"
    SAM="${OUTPUT_DIR}/${BASENAME}.aligned.sam"
    CLEAN_R1="${OUTPUT_DIR}/${BASENAME}_R1.no_host.fastq.gz"
    CLEAN_R2="${OUTPUT_DIR}/${BASENAME}_R2.no_host.fastq.gz"

    # 比对到参考基因组
    bwa mem -t 8 ${REFERENCE} ${R1} ${R2} > ${SAM}

    # 去除宿主序列生成无污染的fastq
    samtools view -bS ${SAM} | samtools fastq -f 4 -1 ${CLEAN_R1} -2 ${CLEAN_R2}

    # 删除临时sam文件
    rm ${SAM}
done

# 停止conda环境
conda deactivate

脚本在调用samtools时开始报错,sam文件已损坏。单独调用samtools查看文件,确实存在格式问题。

查看了sam文件大小,看起来似乎正常,并且并且各样本间差异不大。

使用以下命令查看了sam文件的内容,得到了开始时的error信息。

# 查看sam文件前560行内容
head -n 560 L1EIJ2304789.aligned.sam

看到第1行[M::bwa_idx_load_from_disk] read 0 ALT contigs,以及第545行开始[M::process] read 530342 sequences (80000264 bp)...。sam 文件中出现了 bwa 的日志信息。

之后重新去下载了参考基因组生成索引。按照脚本的代码,单独调用bwa mem重新尝试运行了几次,结果都没变。

解决方案

不得不感谢国外论坛老哥,给出非常有效的解决方法。终于发现是因为生成sam文件时使用了重定向(>)的原因,似乎把bwa运行的stderr结果也输出到sam文件中了。

解决方法也很简单,可以使用管道把bwa的输出结果直接传给samtools。运行后生成了正常的bam文件,也能正常去除比对上的reads。

# 使用 bwa mem 进行比对并将结果转换为 BAM 格式
bwa mem -t 8 index ~/cleandata/L1EIJ2304789_R1.clean.fastq.gz ~/cleandata/L1EIJ2304789_R2.clean.fastq.gz | samtools view -Sb - > ~/cleandata_no_host/L1EIJ2304789.bam

#从 BAM 文件中提取无宿主序列
samtools fastq -f 4 -1 ~/nohost_fastq/L1EIJ2304789_R1.no_host.fastq.gz -2 ~/nohost_fastq/L1EIJ2304789_R2.no_host.fastq.gz ~/cleandata_no_host/L1EIJ2304789.bam

此外,在论坛上似乎有因为使用nohup挂起运行bwa导致同样的sam文件格式错误的情况,不使用nohup后问题解决。在debug时,单独运行bwa时同样使用了nohup,结果还是错误格式的sam文件,不确定在这个错误里是否有nohup的原因。但由于sam文件太大bwa运行时间久,暂时没有尝试这种解决方案。

验证宿主序列去除效果,使用samtools flagstat统计文件的比对情况。

samtools flagstat ~/cleandata_no_host/L1EIJ2304789.bam

7.56%的比对率,有92.44% 的 reads 没有比对到宿主,和公司报告的92.86%非常接近。可能由于使用的bwa和samtools版本不同,或者部分阈值设置不同导致。这些差异在统计时通常是可以接受的,于是问题基本解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值