我尝试使用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
我确定这不是我的错,但是经过数小时的尝试,我仍然无法解决问题。非常感谢您的帮助。 谢谢
答案 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 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"
答案 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}"