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

如何让Snakemake的cellranger_count规则等待merge_fastqs执行完成?

解决Snakemake中cellranger_count提前启动的问题

你的问题核心在于cellranger_count规则的输入是merged目录,而Snakemake只要检测到目录存在就会认为输入条件满足,不会等待目录内的文件生成完成。以下是两种可行的解决方案:

方法一:直接依赖合并后的fastq文件(推荐)

让cellranger_count规则明确依赖merge_fastqs生成的两个fastq文件,这样Snakemake会确保文件完全生成后才启动该规则。修改后的cellranger_count规则如下:

rule cellranger_count:
    input:
        # 明确依赖merge_fastqs的输出文件,而非仅目录
        r1 = 'merged/{sampleID}_S1_L001_R1_001.fastq.gz',
        r2 = 'merged/{sampleID}_S1_L001_R2_001.fastq.gz'
    output:
        maxtrix_h5 = '{sampleID}_TenXAnalysis/outs/raw_feature_bc_matrix.h5',
        metrics = '{sampleID}_TenXAnalysis/outs/metrics_summary.csv',
        dir = directory('{sampleID}_TenXAnalysis/outs/raw_feature_bc_matrix'),
        barcodes = '{sampleID}_TenXAnalysis/outs/raw_feature_bc_matrix/barcodes.tsv.gz',
        features = '{sampleID}_TenXAnalysis/outs/raw_feature_bc_matrix/features.tsv.gz',
        matrix = '{sampleID}_TenXAnalysis/outs/raw_feature_bc_matrix/matrix.mtx.gz',
        html = '{sampleID}_TenXAnalysis/outs/web_summary.html',
    threads: 16
    params:
        ref = '/PATH/refdata-gex-GRCh38-2020-A',
    shell: """
    rm -rf {wildcards.sampleID}_TenXAnalysis

    cellranger count --id={wildcards.sampleID}_TenXAnalysis \\
        --fastqs=merged \\  # 这里依然使用目录路径,cellranger需要读取目录下的文件
        --sample={wildcards.sampleID} \\
        --transcriptome={params.ref} \\
        --localcores={threads} \\
        --localmem=128
    """

方法二:使用touch生成完成标记文件

如果需要保留目录作为输入的逻辑,可以在merge_fastqs规则完成后生成一个标记文件,让cellranger_count依赖这个标记:

  1. 修改merge_fastqs规则,添加标记文件输出并生成它:
rule merge_fastqs:
    input: input_fastq
    output:
        'merged/{sampleID}_S1_L001_R1_001.fastq.gz',
        'merged/{sampleID}_S1_L001_R2_001.fastq.gz',
        'merged/{sampleID}_merge_complete.txt'  # 添加标记文件
    threads: 4
    params:
        r1 = config['pair_id'][0],
        r2 = config['pair_id'][1],
    run:
        r1 = [x for x in input if params.r1 in x]
        r2 = [x for x in input if params.r2 in x]
        shell('cat %s > {output[0]}' %' '.join(r1))
        shell('cat %s > {output[1]}' %' '.join(r2))
        shell('touch {output[2]}')  # 生成标记文件
  1. 修改cellranger_count规则的输入为标记文件:
rule cellranger_count:
    input:
        'merged/{sampleID}_merge_complete.txt'  # 依赖标记文件
    output:
        # 保持原输出不变
        maxtrix_h5 = '{sampleID}_TenXAnalysis/outs/raw_feature_bc_matrix.h5',
        metrics = '{sampleID}_TenXAnalysis/outs/metrics_summary.csv',
        dir = directory('{sampleID}_TenXAnalysis/outs/raw_feature_bc_matrix'),
        barcodes = '{sampleID}_TenXAnalysis/outs/raw_feature_bc_matrix/barcodes.tsv.gz',
        features = '{sampleID}_TenXAnalysis/outs/raw_feature_bc_matrix/features.tsv.gz',
        matrix = '{sampleID}_TenXAnalysis/outs/raw_feature_bc_matrix/matrix.mtx.gz',
        html = '{sampleID}_TenXAnalysis/outs/web_summary.html',
    threads: 16
    params:
        ref = '/PATH/refdata-gex-GRCh38-2020-A',
    shell: """
    rm -rf {wildcards.sampleID}_TenXAnalysis

    cellranger count --id={wildcards.sampleID}_TenXAnalysis \\
        --fastqs=merged \\
        --sample={wildcards.sampleID} \\
        --transcriptome={params.ref} \\
        --localcores={threads} \\
        --localmem=128
    """

额外注意事项

确保rule all中的completeflag包含了cellranger_count的所有输出文件,这样整个流程的依赖链才能正确触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:31:33