You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snakemake规则合并问题:如何关联自动生成的{sample}_unmapped.bam

解决方法

1. 提取library_params.txt中的样本列表

首先需要从library_params.txt中获取所有样本名称,让Snakemake明确要生成的{sample}_unmapped.bam文件范围。假设文件为制表符分隔、第一列是样本名,可在Snakefile开头添加以下代码:

import pandas as pd

# 根据实际文件格式调整读取逻辑,这里假设第一列是样本名
library_df = pd.read_csv("library_params.txt", sep="\t")
samples = library_df.iloc[:, 0].tolist()

2. 修改rule1,显式声明输出文件

问题核心是Snakemake无法追踪{sample}_unmapped.bam——因为你没把它声明为rule1的输出。必须显式添加该文件到output,让Snakemake将其视为rule1的产物:

rule rule1:
    input:
        basecalls_dir="/RUN1/Data/Intensities/BaseCalls/",
        barcodes_dir=directory("barcodes"),
        library_params="library_params.txt",
        metrics_file="metrics_output.txt"
    output:
        log="barcodes.log",
        # 声明所有样本的unmapped.bam为规则产物
        unmapped_bams=expand("{sample}_unmapped.bam", sample=samples)
    shell:
        """
        java -Djava.io.tmpdir=/path/to/tmp -Xmx2g -jar picard.jar IlluminaBasecallsToSam BASECALLS_DIR={input.basecalls_dir} BARCODES_DIR={input.barcodes_dir} LANE=1 READ_STRUCTURE=151T8B9M8B151T RUN_BARCODE=run1 LIBRARY_PARAMS={input.library_params} MOLECULAR_INDEX_TAG=RX ADAPTERs_TO_CHECK=INDEXED READ_GROUP_ID=BO NUM_PROCESSORS=2 IGNORE_UNEXPECTED_BARCODES=true > {output.log}
        """

3. 调整rule2的依赖逻辑

去掉rule2对barcodes.log的依赖(日志文件写入完成不代表bam文件生成完毕),直接依赖对应样本的{sample}_unmapped.bam,这样Snakemake会自动确保rule1生成该文件后再运行rule2:

rule rule2:
    input:
        infile="{sample}_unmapped.bam"
    params:
        ref="ref.fasta"
    output:
        outfile="{sample}.mapped.bam"
    shell:
        """
        java -Djava.io.tmpdir=/path/to/tmp -Xmx2g -jar picard.jar SamToFastq I={input.infile} F=/dev/stdout INTERLEAVE=true | bwa mem -p -t 7 {params.ref} /dev/stdin | java -Djava.io.tmpdir=/path/to/tmp -Xmx4g -jar picard.jar MergeBamAlignment UNMAPPED={input.infile} ALIGNED=/dev/stdin O={output.outfile} R={params.ref} SORT_ORDER=coordinate MAX_GAPS=-1 ORIENTATIONS=FR
        """

4. 添加全局目标(可选)

如果需要一次性生成所有样本的{sample}.mapped.bam,可在Snakefile末尾添加:

rule all:
    input:
        expand("{sample}.mapped.bam", sample=samples)

关键说明

  • Snakemake完全依赖规则的输入输出建立调度关系,只有显式声明为output的文件,才会被视为规则产物,后续规则才能等待其生成。
  • 使用expand函数可以根据样本列表批量生成文件路径,确保规则覆盖所有样本。
  • 直接依赖产物文件而非日志,是保证依赖关系可靠的核心。

内容的提问来源于stack exchange,提问作者user3224522

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:01:05