我正在尝试使用一些文件作为生物信息学工具的输入。我的基本代码如下:
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.logn"
"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, ....]
这些应该是您期望作为输出的文件列表。snake makake背后的一般思想是,你可以定义依赖于通配符的抽象规则来"弄清楚"。当它们需要运行以产生期望的输出时。然而,在您的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
作为参数的前缀,所以我也没有在这里使用。但是我怀疑您可能需要这样做,以便让输出出现在预期的位置。