Snakemake可以在SLURM群集上自动创建作业错误并输出文件吗?

时间:2019-04-22 18:32:55

标签: snakemake

我在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}.eoutput/lob/job/output/{rule}{wildcards}.o中。如果将这些文件夹放在slurm.json文件中,则作业将失败。此结构...{rule}{wildcards}...适用于不需要创建新文件夹的其他规则(因为通配符不包含文件夹路径`。

如何解决这个问题?我知道我可以事先找出所有文件夹并在运行snakemake之前创建它们,但这似乎效率很低。 snakemake中没有针对我的功能吗?毕竟,snakemake会创建所有输出,基准和日志文件夹(如果它们不存在)。为什么不针对SLURM错误和输出文件执行此操作?

2019年4月24日根据约翰内斯·科斯特(Johannes Koester)的回复进行了更新:

我已将规则更改为:

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"
      },

你知道怎么回事吗?

1 个答案:

答案 0 :(得分:1)

没有办法通过snakemake来确保这一点。但是,如果您使用snakemake本身的日志记录支持,则根本不会发生此问题,它具有独立于执行平台的额外好处:https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#log-files

在这种情况下,目录当然会由snakemake创建,因为它们尚不存在。此外,错误消息将直接将您指向正确的日志文件。