【问题标题】:snakemake interpreting full path as relative pathsnakemake 将完整路径解释为相对路径
【发布时间】:2020-04-15 13:26:42
【问题描述】:

我正在编写一个snakemake 来执行多个操作。除最后一条 (mvQsubLogs) 之外的所有规则都适用于测试文件。最后一条规则应该将qsub 命令(我在集群上运行snakemake)生成的.e.o 文件从-e-o 标志指定的目录移动到指定的目录在我的规则的输出指令中,一旦完成一些操作(请参见下面规则中的input指令):

rule mvQsubLogs:
    input:
        # FastQC
        rules.fastQC.output,

        # Markduplicates
        rules.markDups.output.markDupBam,
        rules.markDups.output.markDupMetrics,

        # mosdepth
        rules.mosdepth.output.DIR,

        # editflagStat
        rules.edit_flagStat.output,

        # edit idxStats
        rules.edit_idxStats.output,

        # insertSizeMetrics
        rules.insertSizeMetrics.output.METRICS,
        rules.insertSizeMetrics.output.PDF

    output:
        directory("{sample}/logs")
    shell:
        "mkdir -p {wildcards.sample}/logs " 
        "| mv {LOGDIR}{wildcards.sample}* {output}"

可以在下面找到包含我想要执行的所有作业的 DAG:

我用来向集群启动作业的命令是

snakemake -p -s Snakefile_v6_ngs_bngs05b --cluster "qsub -q onlybngs05b -e {LOGD
IR} -o {LOGDIR}" -j 5 --use-conda --jobname "{wildcards.sample}.{rule}.{jobid}"

注意.e.o 文件的生成位置很重要,在本示例中为LOGDIRLOGDIR 实际上是从配置文件中检索到的(LOGDIR = config['logsOutDir'] - 在蛇文件本身中,logsOutDir: "/home/ngs/jobout/" - 在配置文件中指定)。

当我调用完整的 snakemake 时,我得到的规则 mvQsubLogs 的命令是:

rule mvQsubLogs:
    input: NIPT-PearlPPlasma-03-PPx_S3downSample/fastQC, NIPT-PearlPPlasma-03-PPx_S3downSample/aligned/NIPT-PearlPPlasma-03-PPx_S3downSample.sorted.markDup.bam, NIPT-PearlPPlasma-03-PPx_S3downSample/dups/NIPT-PearlPPlasma-03-PPx_S3downSample.markDups.metrics.txt, NIPT-PearlPPlasma-03-PPx_S3downSample/depth/, NIPT-PearlPPlasma-03-PPx_S3downSample/dups/NIPT-PearlPPlasma-03-PPx_S3downSample.sorted.markDup.flagstat.edited.csv, NIPT-PearlPPlasma-03-PPx_S3downSample/readsDist/NIPT-PearlPPlasma-03-PPx_S3downSample.sorted.markDup.idxstats.edited.csv, NIPT-PearlPPlasma-03-PPx_S3downSample/insertSizeDist/NIPT-PearlPPlasma-03-PPx_S3downSample_ISmetrics.txt, NIPT-PearlPPlasma-03-PPx_S3downSample/insertSizeDist/NIPT-PearlPPlasma-03-PPx_S3downSample_ISHist.pdf
    output: NIPT-PearlPPlasma-03-PPx_S3downSample/logs
    jobid: 7
    wildcards: sample=NIPT-PearlPPlasma-03-PPx_S3downSample

mkdir -p NIPT-PearlPPlasma-03-PPx_S3downSample/logs | mv /home/ngs/jobout/NIPT-PearlPPlasma-03-PPx_S3downSample* NIPT-PearlPPlasma-03-PPx_S3downSample/logs

这听起来对我来说是正确的:(在创建文件应该移动到的目录之后,为了安全起见)我应该移动所有以NIPT-PearlPPlasma-03-PPx_S3downSample(即wildcards.sample)开头的文件,位于/home/ngs/jobout/NIPT-PearlPPlasma-03-PPx_S3downSample/logs,而最后一个目录相对于工作目录

查看由mvQsubLogs 规则生成的.e 文件,我得到:

mkdir -p NIPT-PearlPPlasma-03-PPx_S3downSample/logs | mv /home/ngs/jobout/NIPT-PearlPPlasma-03-PPx_S3downSample* NIPT-PearlPPlasma-03-PPx_S3downSample/logs
mv: target ‘NIPT-PearlPPlasma-03-PPx_S3downSample/logs’ is not a directory

这对我来说没有意义,因为应该已经创建了输出目录 NIPT-PearlPPlasma-03-PPx_S3downSample/logs

我已经尝试指定文件应该移动到的完整路径,虽然它也不起作用,但我得到了同样的错误。

谁能发现我的代码中的错误在哪里?

【问题讨论】:

    标签: python snakemake


    【解决方案1】:

    尝试以下方法:

        shell:
            "mkdir -p {output} \n" 
            "mv {LOGDIR}{wildcards.sample}* {output}/"
    

    两次都使用输出来保持代码干燥。如果您决定稍后更改位置,这将有所帮助。

    用第二个命令(换行符)替换管道。

    为要移动的第二个参数添加一个斜杠。似乎与嵌套目录一样,如果斜杠不存在,则将其视为文件。例如

    mkdir -p test/log | mv *.out test/log
    # mv: target ‘test/log’ is not a directory
    
    mkdir -p test/log | mv *.out test/log/
    # ok
    

    【讨论】:

    • 它有效,非常感谢。您对为什么需要事先创建目录有任何解释吗?为什么必须用新线更换管道?
    • 手工制作目录是snakemake的一部分,尽管文档没有说明原因。您可以根据需要使用管道,但由于这是用于管道输入/输出,因此并不是真正的标准用法;如果第一个命令成功,&& 将执行第二个命令。设置为两个命令也可以。
    猜你喜欢
    • 2014-10-29
    • 2012-04-01
    • 2011-12-11
    • 2014-10-01
    • 2011-10-13
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    相关资源
    最近更新 更多