【问题标题】:snakemake - Missing input files for rule allsnakemake - 缺少规则所有的输入文件
【发布时间】:2021-01-29 02:40:01
【问题描述】:

我正在尝试创建一个管道,该管道将采用config.yml 中的用户配置目录(他们已从 BaseSpace 下载了 .fastq.gz 文件的项目目录),以在序列文件上运行 fastqc。我已经有了按车道合并 fastqs 并在合并文件上运行 fastqc 的下游步骤。

但是,通配符给我在原始基本空间文件上运行 fastqc 带来了问题。以下是我尝试运行snakemake时的错误。

Missing input files for rule all:
qc/fastqc_premerge/DEX-13_S9_L001_ngc1838-10_L001_ds.9fd1f6dff0df47ab821125aab07be69b_r1_fastqc.zip
qc/fastqc_premerge/BOMB-3-2-19D_S8_L002_ngc1838-8_L002_ds.b81c308d62ba447b8caf074ffb27917e_r1_fastqc.zip
qc/fastqc_premerge/DEX-13_S9_L002_ngc1838-10_L002_ds.6369bc71fac44f00931eecb9b0a45d59_r1_fastqc.zip

任何建议将不胜感激。以下是重现此问题的最少代码。

import glob

configfile: "config.yaml"

wildcard_constraints:
   bsdir = '\w+_L\d+_ds.\w+',
   lanenum = '\d+'

inputdirectory=config["directory"]
DIRECTORY, SAMPLES, LANENUMS = glob_wildcards(inputdirectory+"/{bsdir}/{sample}_L{lanenum}_R1_001.fastq.gz")
DIRECTORY, SAMPLES, LANENUMS = glob_wildcards(inputdirectory+"/{bsdir}/{sample}_L{lanenum}_R2_001.fastq.gz")


##### target rules #####
rule all:
    input:
       #expand('qc/fastqc_premerge/{sample}_L{lanenum}_{bsdir}_r1_fastqc.zip', sample=SAMPLES, bsdir=DIRECTORY, lanenum=LANENUMS)
        expand('qc/fastqc_premerge/{sample}_L{lanenum}_{bsdir}_r1_fastqc.zip', zip, sample=SAMPLES, bsdir=DIRECTORY, lanenum=LANENUMS)  ##Changed to this from commenters suggestion, however, snakemake still wont run


rule fastqc_premerge_r1:
    input:
        f"{config['directory']}/{{bsdir}}/{{sample}}_L{{lanenum}}_R1_001.fastq.gz"
    output:
        html="qc/fastqc_premerge/{sample}_L{lanenum}_{bsdir}_r1.html",
        zip="qc/fastqc_premerge/{sample}_L{lanenum}_{bsdir}_r1_fastqc.zip" # the suffix _fastqc.zip is necessary for multiqc to find the file. If not using multiqc, you are free to choose an arbitrary filename
    params: ""
    log:
        "logs/fastqc_premerge/{sample}_L{lanenum}_{bsdir}_r1.log"
    threads: 1
    wrapper:
        "v0.69.0/bio/fastqc"

目录结构:

ngc1838-10_L001_ds.9fd1f6dff0df47ab821125aab07be69b/DEX-13_S9_L001_R1_001.fastq.gz
ngc1838-10_L001_ds.9fd1f6dff0df47ab821125aab07be69b/DEX-13_S9_L001_R2_001.fastq.gz
ngc1838-10_L002_ds.6369bc71fac44f00931eecb9b0a45d59/DEX-13_S9_L002_R1_001.fastq.gz
ngc1838-10_L002_ds.6369bc71fac44f00931eecb9b0a45d59/DEX-13_S9_L002_R2_001.fastq.gz
ngc1838-8_L002_ds.b81c308d62ba447b8caf074ffb27917e/BOMB-3-2-19D_S8_L002_R1_001.fastq.gz
ngc1838-8_L002_ds.b81c308d62ba447b8caf074ffb27917e/BOMB-3-2-19D_S8_L002_R2_001.fastq.gz

在上述情况下,我想在所有 6 个输入 R1/R2 文件上运行 fastqc,然后在下游,为 DEX_13_S9(用于合并的两个输入)和 BOMB-3_2_19D(这将是一个副本)创建一个合并文件的 1 个输入)。然后为这些生成的 R1 和 R2 文件创建 4 个 fastqc 报告。

编辑:我必须更改以下内容才能运行 snakemake

inputdirectory=config["directory"]
PROJECTDIR, RANDOMINT, LANENUM1, BSSTRINGS, SAMPLES, LANENUMS = glob_wildcards(inputdirectory+"/{proj}-{randint}_L{lanenum1}_ds.{bsstring}/{sample}_L{lanenum}_R1_001.fastq.gz", followlinks=True)
PROJECTDIR, RANDOMINT, LANENUM1, BSSTRINGS, SAMPLES, LANENUMS = glob_wildcards(inputdirectory+"/{proj}-{randint}_L{lanenum1}_ds.{bsstring}/{sample}_L{lanenum}_R2_001.fastq.gz", followlinks=True)


##### target rules #####
rule all:
    input:
       "qc/multiqc_report_premerge.html"




rule fastqc_premerge_r1:
    input:
        f"{config['directory']}/{{proj}}-{{randint}}_L{{lanenum1}}_ds.{{bsstring}}/{{sample}}_L{{lanenum}}_R1_001.fastq.gz"
    output:
        html="qc/fastqc_premerge/{sample}_L{lanenum}_{proj}-{randint}_L{lanenum1}_ds.{bsstring}_r1.html",
        zip="qc/fastqc_premerge/{sample}_L{lanenum}_{proj}-{randint}_L{lanenum1}_ds.{bsstring}_r1_fastqc.zip" # the suffix _fastqc.zip is necessary for multiqc
    params: ""
    log:
        "logs/fastqc_premerge/{sample}_L{lanenum}_{proj}-{randint}_L{lanenum1}_ds.{bsstring}_r1.log"
    threads: 1
    wrapper:
        "v0.69.0/bio/fastqc"

rule fastqc_premerge_r2:
    input:
        f"{config['directory']}/{{proj}}-{{randint}}_L{{lanenum1}}_ds.{{bsstring}}/{{sample}}_L{{lanenum}}_R2_001.fastq.gz"
    output:
        html="qc/fastqc_premerge/{sample}_L{lanenum}_{proj}-{randint}_L{lanenum1}_ds.{bsstring}_r2.html",
        zip="qc/fastqc_premerge/{sample}_L{lanenum}_{proj}-{randint}_L{lanenum1}_ds.{bsstring}_r2_fastqc.zip" # the suffix _fastqc.zip is necessary for multiqc
    params: ""
    log:
        "logs/fastqc_premerge/{sample}_L{lanenum}_{proj}-{randint}_L{lanenum1}_ds.{bsstring}_r2.log"
    threads: 1
    wrapper:
        "v0.69.0/bio/fastqc"

rule multiqc_pre:
    input:
        expand("qc/fastqc_premerge/{sample}_L{lanenum}_{proj}-{randint}_L{lanenum1}_ds.{bsstring}_r1_fastqc.zip", zip, sample=SAMPLES, lanenum=LANENUMS, proj=PROJECTDIR, randint=RANDOMINT, lanenum1=LANENUM1, bsstring=BSSTRINGS),
        expand("qc/fastqc_premerge/{sample}_L{lanenum}_{proj}-{randint}_L{lanenum1}_ds.{bsstring}_r2_fastqc.zip", zip, sample=SAMPLES, lanenum=LANENUMS, proj=PROJECTDIR, randint=RANDOMINT, lanenum1=LANENUM1, bsstring=BSSTRINGS)
    output:
        "qc/multiqc_report_premerge.html"
    log:
        "logs/multiqc_premerge.log"
    wrapper:
        "0.62.0/bio/multiqc"

【问题讨论】:

  • 恐怕你需要自己找出来。通常,Snakemake 会立即开始构建 DAG。如果没有,您的 Snakefile 中有一些 Python 代码需要很长时间才能完成。尝试调试一下,添加打印语句等。堆栈跟踪指向 Snakefile 中的第 70 行。
  • 谢谢 Johannes,我搞定了。我将固定的 Snakemake 代码放在评论的底部。我的原始代码中有两个关键问题。 1) 需要在扩展规则中使用 zip。 2)需要将子目录通配符从 bsdir 拆分为多个通配符,以便我可以正确构建路径。

标签: snakemake


【解决方案1】:

它会告诉您缺少哪些文件;这就是“所有规则缺少输入文件”下的行。

话虽如此,要回答您最初的问题,如果您进行试运行,那应该会告诉您在运行命令中要运行的每个计划规则的输入/输出文件是什么(使用标志 -n -r) .

【讨论】:

  • 感谢您的建议。是的,列出的那些文件是所有规则的输入。但是,我试图弄清楚为什么规则 fastqc_premerge_r1 没有运行。该规则应该产生丢失的输入文件来统治所有。 ```构建作业的 DAG.../data/projects/nathan_ernster/my_basespace_qc_pipeline/Snakefile 第 21 行中的 MissingInputException:缺少规则所有的输入文件:qc/fastqc_premerge/DEX-13_S9_L001_ngc1838-10_L001_ds.9fd1f6dff0df47ab821125aab07be69b_r1`
  • 试试snakemake -n -r -F?据我了解,这应该可行。
  • 我尝试了snakemake --use-conda -n -r -Fsnakemake --use-conda -n -R fastqc_premerge_r1 来尝试运行 fastqc_pre_merge_r1 规则,但收到与上述相同的错误。
【解决方案2】:

在您的rule all 中,您有:

expand('qc/fastqc_premerge/{sample}_L{lanenum}_{bsdir}_r1_fastqc.zip', sample=SAMPLES, bsdir=DIRECTORY, lanenum=LANENUMS)

这应该会生成 SAMPLES、DIRECTORY 和 LANENUMS 的所有组合。这是你想要的吗?我怀疑不是,因为这意味着所有样本都在所有目录中并且它们在所有通道上。也许您希望zip 函数扩展列表:

expand('qc/fastqc_premerge/{sample}_L{lanenum}_{bsdir}_r1_fastqc.zip', zip, sample=SAMPLES, bsdir=DIRECTORY, lanenum=LANENUMS)

【讨论】:

  • 感谢您的建议。你是对的,我不想要所有组合,应该使用 zip 功能。但是,我得到了同样的缺失输入错误。我已经更新了上面的问题,以包含我的文件测试用例。
  • 有没有一种简单的方法可以打印我的输入文件的名称“丢失”?似乎我应该正确构建文件路径,但很高兴找到。我尝试将 -p 添加到我的命令中,但它不会打印输入文件的路径。
  • 尝试运行Snakemake(在dryrun中),其中一个文件被打印为缺少目标(在命令行中)。然后,它会告诉你为什么它不能使用 fastqc 规则来生成它。
  • 我尝试使用目标运行它,但它错误地说“MissingRuleException:没有生成的规则”。但是,规则 fastqc_premerge_r1 output: 参数不应该有 zip 输出文件的定义吗?我不确定为什么snakemake 不知道如何生成这个 fastqc.zip 文件。完整日志:pastebin.com/14s5RWtK
  • 您的 bsdir 通配符约束将 bsdir 限制为实际包含lanenum。但是在规则的输出文件定义中,您有一个单独的通道通配符。
猜你喜欢
  • 2021-12-29
  • 2021-09-29
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 2020-07-13
  • 2022-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多