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 prokka
和 rule all
中指定一个文件作为输出。基于 prokka repo 上的示例,输出文件本质上是 {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"
如@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}"
我尝试 运行 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 prokka
和 rule all
中指定一个文件作为输出。基于 prokka repo 上的示例,输出文件本质上是 {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"
如@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}"