我在GNU / Linux Ubuntu 16.04.5上工作。
我在Snakefile中有以下规则:
rule cutadapt:
input:
reads = '{path2reads}/raw/reads.fq
output:
trimmed = '{path2reads}/trimmed/reads.fq
shell:
"cutadapt -q 20 --minimum-length 40 --output {output.trimmed} {input.reads}"
然后,在我的slurm.json文件中,我有:
...
"output": "output/log/job/output/{rule}%A.o",
"error": "output/log/job/error/{rule}%A.e",
...
在Snakefile中,我创建文件夹output/log/job/{error,output}
。
这很好用,大概是因为snakemake不必创建新文件夹来存储错误和作业的输出,我可以这样运行:
snakemake output/reads/trimmed/reads.fq --cluster-config slurm.json --cluster "sbatch ... --output {cluster.output} --error {cluster.error} ..."
因此path2reads
将被评估为output/reads
。
请注意,我省略了我认为与本次讨论无关的参数。
但是,我希望SLURM将结果存储在文件夹output/lob/job/error/{rule}{wildcards}.e
和output/lob/job/output/{rule}{wildcards}.o
中。如果将这些文件夹放在slurm.json文件中,则作业将失败。此结构...{rule}{wildcards}...
适用于不需要创建新文件夹的其他规则(因为通配符不包含文件夹路径`。
如何解决这个问题?我知道我可以事先找出所有文件夹并在运行snakemake之前创建它们,但这似乎效率很低。 snakemake中没有针对我的功能吗?毕竟,snakemake会创建所有输出,基准和日志文件夹(如果它们不存在)。为什么不针对SLURM错误和输出文件执行此操作?
我已将规则更改为:
rule cutadapt:
input:
reads = '{path2reads}/raw/reads.fq
output:
trimmed = '{path2reads}/trimmed/reads.fq
log:
output = 'output/log/snakemake/output/cutadapt/path2reads={path2reads}.o',
error = 'output/log/snakemake/error/cutadapt/path2reads={path2reads}.e',
jobError = 'output/log/job/error/cutadapt/path2reads={path2reads}.e',
jobOutput = 'output/log/job/output/cutadapt/path2reads={path2reads}.o',
shell:
'cutadapt -q 20 --minimum-length 40 --output {output.trimmed} {input.reads} > {log.output} 2> {log.error}'
并运行以下snakemake命令:
snakemake paths/2/reads/trimmed/reads.fq --cluster-config slurm.json --cluster "sbatch ... --output {cluster.output} --error {cluster.error} ..."
我的作业失败,并且缺少某些日志目录。我看到目录output/log/job/{error,output}
,但它们为空。我看不到目录output/log/snakemake
。但是,如果我首先创建目录output/log/{job,snakemake}/{error,output}/cutadapt/path2reads=path/2/reads/
,则作业成功。
如果我在头节点上运行snakemake,它也可以工作。请注意,我的slurm.json具有以下用于fastqc的参数(默认参数未显示):
"fastqc" :
{
"output" : "output/log/job/output/{rule}/{wildcards}.o",
"error" : "output/log/job/error/{rule}/{wildcards}.e"
},
你知道怎么回事吗?
答案 0 :(得分:1)
没有办法通过snakemake来确保这一点。但是,如果您使用snakemake本身的日志记录支持,则根本不会发生此问题,它具有独立于执行平台的额外好处:https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#log-files
在这种情况下,目录当然会由snakemake创建,因为它们尚不存在。此外,错误消息将直接将您指向正确的日志文件。