如何让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依赖这个标记:
- 修改
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]}') # 生成标记文件
- 修改
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
相关产品推荐
相关产品推荐

