snakemake将文件夹定义为输出

时间:2018-12-12 18:49:30

标签: 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} "

运行时:

$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

我确定这不是我的错,但是经过数小时的尝试,我仍然无法解决问题。非常感谢您的帮助。 谢谢

3 个答案:

答案 0 :(得分:1)

您的示例存在一些问题,因为您的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"

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

outputdir= "your_output_directory"

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