尝试在 Snakemake 中使用多个文件作为输入时出错

Error trying to use multiple file as input in Snakemake

我正在尝试使用一些文件作为生物信息学工具的输入。我的基本代码如下:

configfile: "config.yaml"


WORK_DATA = config["WORK_DATA"]

rule all:
  input:
    expand(WORK_DATA + "{sample}_{read}_quality-pass.fastq", sample=config["samples"], read=[1, 2])
     

rule filter:
  input:
    R1 = expand(WORK_DATA + "{sample}_1.fastq", sample=config["samples"]),
    R2 = expand(WORK_DATA + "{sample}_2.fastq", sample=config["samples"])
  
  output:
    expand(WORK_DATA + "{sample}_{read}_quality-pass.fastq", sample=config["samples"], read=[1, 2])
 
  params:
    outname1 = expand("{sample}_1", sample=config["samples"]),
    outname2 = expand("{sample}_2", sample=config["samples"])

  shell:
    "FilterSeq.py quality -s {input.R1} -q 20 --outname {params.outname1} --log FS1.log\n"
    "FilterSeq.py quality -s {input.R2} -q 20 --outname {params.outname2} --log FS2.log"

但是,我收到如下所示的错误:

Error in rule filter:
    jobid: 1
    output: /home/path/SRR1383456_1_quality-pass.fastq, /home/path/SRR1383456_2_quality-pass.fastq, /home/path/SRR1383457_1_quality-pass.fastq, /home/path/SRR1383457_2_quality-pass.fastq
    shell:
FilterSeq.py quality -s /home/path/SRR1383456_1.fastq /home/path/SRR1383457_1.fastq -q 20 --outname SRR1383456_1 SRR1383457_1 --log FS1.log
FilterSeq.py quality -s /home/path/SRR1383456_2.fastq /home/path/SRR1383457_2.fastq -q 20 --outname SRR1383456_2 SRR1383457_2 --log FS2.log
        (one of the commands exited with non-zero exit code; note that snakemake uses bash strict mode!)

Shutting down, this might take some time.
Exiting because a job execution failed. Look above for error message
Complete log: .snakemake/log/2022-04-28T113611.757898.snakemake.log

我不知道这个错误的确切原因,但似乎这些文件同时被放置为输入 (input.R1/R2)。因此,FilterSeq.py 程序变得混乱,因为它只接受每个 运行 的一个输入。我想知道我该如何解决这个问题,以便我可以顺利 运行 所有我想要的文件。如有任何帮助,我们将不胜感激!

我认为问题在于 expand 的多次使用。 在 all 规则中,它看起来不错。它将评估为一个看起来像

的列表
[sampleA_1_quality-pass.fastq, sampleA_2_quality-pass.fastq,
sampleB_1_quality-pass.fastq, sampleB_2_quality-pass.fastq, ....]

这些应该是您期望作为输出的文件列表。 snakemake 背后的总体思路是,您可以定义依赖通配符的抽象规则来“确定”它们何时需要 运行 产生所需的输出。但是,在您的 filter 规则中,expand 的使用是根据文件系统中匹配的任何文件明确定义所需的输入和输出。

这可能会产生问题,因为当 filter 规则试图为 sampleA_1_quality-pass.fastq 生成输出时,它也可能试图在 sampleB 期间将文件作为输入或输出。展开步骤。您可以在最终 运行 包含两个不同示例的命令中看到这一点 --outname SRR1383456_1 SRR1383457_1。我不确定您的 FilterSeq.py 程序在做什么,但我相信这可能是问题所在。

考虑以下建议:

configfile: "config.yaml"

WORK_DATA = config["WORK_DATA"]

rule all:
  input:
    expand(WORK_DATA + "{sample}_{read}_quality-pass.fastq", sample=config["samples"], read=[1, 2])
     
rule filter:
  input:
    WORK_DATA+"{sample}_{read}.fastq"      
  output:
    WORK_DATA+"{sample}_{read}_quality-pass.fastq"
  params:
    outname="{sample}_{read}"
  shell:
    "FilterSeq.py quality -s {input} -q 20 --outname {params.outname} --log FS{wildcards.read}.log"

这样,filter 规则将为 all 规则中指定的每个 sample/read 组合 运行 一次。最后一点,您没有将 WORK_DATA 作为参数的前缀,所以我也没有在这里。但我怀疑您可能需要这样做才能使输出出现在预期的位置。