Snakemake使用wildcard_constraints时出现缺失输入文件错误求助
Snakemake「Missing input files」错误排查与修复
以下是针对你遇到问题的具体排查方向和修复方案:
1. rule all 与 wildcard_constraints 范围不匹配
你在rule all中使用CONTIG_LIST展开输出,但RdTest_autosomes的wildcard_constraints仅限制chrom为常染色体(chr1-chr22)。如果CONTIG_LIST包含X/Y染色体,Snakemake找不到对应规则生成这些染色体的输出,会触发输入缺失错误。
- 修复:
- 若仅需处理常染色体,将
rule all中的chrom = CONTIG_LIST改为chrom = AUTOSOMAL; - 若需处理X/Y染色体,单独编写对应规则(如
RdTest_chrX、RdTest_chrY),并将这些规则的输出加入rule all的input列表。
- 若仅需处理常染色体,将
2. wildcard 顺序不匹配导致路径解析错误
你的bed输入路径是BATCH + '.{chrom}.{source}.bed'(chrom在前,source在后),但输出路径是BATCH + '.{source}.{chrom}.metrics'(source在前,chrom在后)。Snakemake会按照输出中的wildcard顺序去匹配输入,这会导致实际文件路径与Snakemake解析的路径不匹配,找不到输入文件。
- 修复:统一输入输出的wildcard顺序,例如调整输出路径为:
同时同步修改params中的metrics=OUTPUT_DIR + '/GenerateBatchMetrics/Metrics/' + BATCH + '.{chrom}.{source}.metrics'prefix为BATCH + '.{chrom}.{source}',保持一致性。
3. 验证输入文件的实际存在性
即使路径格式正确,也要确认:
OUTPUT_DIR/GenerateBatchMetrics/All_Beds/SEP/下存在对应{BATCH}.{chrom}.{source}.bed的文件;rules.ZPaste.output.matrix_file和rules.T_CalcMedCov.output指向的文件确实存在。- 可通过命令
snakemake --dry-run --printshellcmds查看Snakemake尝试寻找的具体文件路径,对比实际文件系统中的路径是否一致。
修改后的示例代码
rule all: input: # 仅展开常染色体输出 expand(rules.RdTest_autosomes.output, source=ALGO, chrom=AUTOSOMAL), # 若需处理X/Y,添加对应规则的输出 # expand(rules.RdTest_chrX.output, source=ALGO), # expand(rules.RdTest_chrY.output, source=ALGO), rule RdTest_autosomes: input: bed = OUTPUT_DIR + "/GenerateBatchMetrics/All_Beds/SEP/" + BATCH + '.{chrom}.{source}.bed', bincov = rules.ZPaste.output.matrix_file, medmat = rules.T_CalcMedCov.output, output: # 统一wildcard顺序与输入一致 metrics=OUTPUT_DIR + '/GenerateBatchMetrics/Metrics/' + BATCH + '.{chrom}.{source}.metrics', wildcard_constraints: chrom='(' + '|'.join(AUTOSOMAL) + ')' # <- from chr1 to chr22 params: prefix = BATCH + '.{chrom}.{source}', famfile = config['base']['fam_file'], sample = OUTPUT_DIR + "/sample_list.txt", op_dir = OUTPUT_DIR + '/GenerateBatchMetrics/Metrics/', singularity: "sif_images/rdtest.sif" threads: workflow.cores * 0.4 shell: """ Rscript src/RdTest/RdTest.R \ -b {input.bed} \ -n {params.prefix} \ -o {params.op_dir} \ -c {input.bincov} \ -m {input.medmat} \ -f {params.famfile} \ -w {params.sample} touch {output} """
内容的提问来源于stack exchange,提问作者Cuong pham gia
相关产品推荐
相关产品推荐

