Snakemake 将文件夹定义为输出

Fel*_*iks 5 snakemake

我尝试使用snakemake运行prokka并统治一切。在后者中,我定义了 prokka 将生成的所有输出文件夹以写入结果。Prokka 需要提供一个文件夹作为输出而不是文件。

我所拥有的简化版本在这里:

PATIENTID_ls = range(2)
rule all:
input:
    expand("results_{subjectID}_outputfolder",subjectID=PATIENTID_ls), 

rule prokka:
    input:
        "contigs/subject_{subjectID}/contigs.fasta",
    output:
        "results/subject_{subjectID}_outputfolder",
    shell:
        "prokka --cpus 1 --proteins ../GCF_000009645.1_ASM964v1_genomic.gbff --outdir {output} --prefix contigs500_anno9ref {input} "
Run Code Online (Sandbox Code Playgroud)

运行时:

$snakemake -p
Building DAG of jobs...
MissingInputException in line 2 of Snakefile:
Missing input files for rule all:
results_1_outputfolder
results_0_outputfolder
Run Code Online (Sandbox Code Playgroud)

然而,当明确指定输出时它会起作用:

snakemake -p results/subject_1_outputfolder
Run Code Online (Sandbox Code Playgroud)

我确信这是我这边的菜鸟错误,但经过几个小时的尝试后我无法解决这个问题。非常感谢您的帮助。谢谢

小智 3

您的示例存在一些问题,因为您的rule all输出文件与您的不匹配rule prokka输出文件与输出文件

但是,实现您想要执行的操作的一种方法是使用params指定输出目录并将其用作 flag 的参数--outdir {params.outdir}

类似的例子如下所示:

PATIENTID_ls = [1,2]
PREFIX = "contigs500_anno9ref"

rule all:
    input:
        expand("results_{subjectID}_outputfolder/{prefix}.gff",subjectID=PATIENTID_ls, prefix=PREFIX), 

rule prokka:
    input:
        "contigs/contigs.fasta",
    params:
        outdir= "results_{subjectID}_outputfolder",
        prefix= PREFIX,
    output:
        "results_{subjectID}_outputfolder/{prefix}.gff",
    shell:
        "echo '{params.prefix}' > {params.outdir}/{PREFIX}.gff"
Run Code Online (Sandbox Code Playgroud)

rule prokka您仍然应该在和 中指定一个文件作为输出rule all。根据 prokka存储库上的示例,输出文件本质上是{outdir}/{prefix}.gff. 您可以将其指定为两者的输出rule all,而rule prokka无需在调用命令时直接使用它。


或者,即使似乎没有理由,您也可以使用模拟文件来表示规则的完成。

一个例子是:

PATIENTID_ls = [1,2]
rule all:
    input:
        expand("results_{subjectID}_outputfolder/mockfile.txt",subjectID=PATIENTID_ls), 

rule prokka:
    input:
        "contigs/contigs.fasta",
    params:
        outdir= "results_{subjectID}_outputfolder",
        prefix= "contigs500_anno9ref",
    output:
        "results_{subjectID}_outputfolder/mockfile.txt",
    shell:
        "echo '{params.prefix}' && touch {params.outdir}/mockfile.txt"
Run Code Online (Sandbox Code Playgroud)