snakemake 将文件夹定义为输出

snakemake define folder as output

我尝试 运行 prokka 使用 snakemake 并统治所有。在后者中,我定义了将由 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} "

当运行宁:

$snakemake -p
Building DAG of jobs...
MissingInputException in line 2 of Snakefile:
Missing input files for rule all:
results_1_outputfolder
results_0_outputfolder

然而,当明确指定输出时它有效:

snakemake -p results/subject_1_outputfolder

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

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

但是,实现您想要执行的操作的一种方法是使用 params 指定输出目录并将其用作标志 --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"

您仍然应该在 rule prokkarule all 中指定一个文件作为输出。基于 prokka repo 上的示例,输出文件本质上是 {outdir}/{prefix}.gff。您可以将其指定为 rule allrule 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"

如@JohnnyBD 所述,您的主要问题似乎是 rule all 输出与 rule prokka 不匹配。如果您仍然需要将目录用作 output 而不是文件,您可能需要使用 directory() 因为它可以更好地处理边缘情况。

您可以创建一个引用您的输出目录的变量,并根据规则调用它:

outputdir= "your_output_directory"

rule Align_Sequences:
    input: sequence.fasta
    output: outputdir + "/sequence_aligned.fasta"
    shell: "mafft  {input} > {output}"