【问题标题】:Snakemake rule is not picked up and can not specify the output filesSnakemake 规则未拾取且无法指定输出文件
【发布时间】:2018-08-29 22:00:55
【问题描述】:

我有一个生成规则输出的文件夹。我在运行snakemake 时遇到了真正的麻烦。如果我没有在rule all 中指定输出,则根本不会运行规则(称为neo4j)。如果我尝试使用 snakemake neo4j 手动运行它(我不希望这样做),那么我会收到一个错误:

工作流程错误: 目标规则可能不包含通配符。请指定具体文件或不带通配符的规则。

我尝试以不同的方式指定规则的输出,但它们都不起作用。

  1. 使用expand

    expand('results/neo4j/{sample}/cells.csv', sample=samples),
    expand('results/neo4j/{sample}/genes.csv', sample=samples),
    expand('results/neo4j/{sample}/cl_nodes.csv', sample=samples),
    expand('results/neo4j/{sample}/cl_contains.csv', sample=samples),
    expand('results/neo4j/{sample}/cl_isin.csv', sample=samples),
    expand('results/neo4j/{sample}/expr_by.csv', sample=samples),
    expand('results/neo4j/{sample}/expr_ess.csv', sample=samples)
    

为完全不同的不相关规则(称为umap)生成一个非常奇怪的错误:

缺少规则 umap 的输入文件: data_files/normalized/minus_2/cl_nodes.csv.csv

即使文件夹没有以任何方式连接,除了 results 是所有输出的根文件夹之外,路径生成也完全混乱。

  1. 使用dynamic

    dynamic('results/neo4j/{sample}/cells.csv', sample=samples),
    dynamic('results/neo4j/{sample}/genes.csv', sample=samples),
    dynamic('results/neo4j/{sample}/cl_nodes.csv', sample=samples),
    dynamic('results/neo4j/{sample}/cl_contains.csv', sample=samples),
    dynamic('results/neo4j/{sample}/cl_isin.csv', sample=samples),
    dynamic('results/neo4j/{sample}/expr_by.csv', sample=samples),
    dynamic('results/neo4j/{sample}/expr_ess.csv', sample=samples)
    

给出错误:

dynamic() 得到了一个意外的关键字参数 'sample'

好的,我尝试删除 sample=samples 但没有成功

  1. 只要directory:

    directory('results/neo4j/{sample}/', sample=samples)
    

给出错误:

directory() 得到了一个意外的关键字参数 'sample'

如果我省略sample=samples,也不会工作。如果我在rule all output 下指定directory,则不起作用。

我遇到困难的规则如下:

rule neo4j:
    input:
        script = 'python/neo4j.py',
        path_to_cl = 'results/clusters/umap/{sample}_umap_clusters.csv',
        path_to_umap = 'results/umap/{sample}_umap.csv',
        path_to_mtx = 'data_files/normalized/{sample}.csv'
    output:
        base_neo4j = 'results/neo4j/{sample}'
    shell:
        "python {input.script} -path_to_cl {input.path_to_cl} -path_to_umap {input.path_to_umap} -path_to_mtx {input.path_to_mtx} -base_neo4j {output.base_neo4j}"

snakemake 版本为5.2.2

任何建议将不胜感激。

更新

我使用Mali Akmanalp 的建议修改了Snakemake 文件,现在rule all 看起来像这样:

samples,=glob_wildcards('data_files/normalized/{sample}.csv')
   rule all:
     input:
        expand('results/pca/img/{sample}_pca.png', sample=samples),
        expand('results/pca/{sample}_pca.csv', sample=samples),
        expand('results/tsne/{sample}_tsne.csv', sample=samples),
        expand('results/umap/{sample}_umap.csv', sample=samples),
        expand('results/umap/img/{sample}_umap.png', sample=samples),
        expand('results/tsne/img/{sample}_tsne.png', sample=samples),
        expand('results/clusters/umap/{sample}_umap_clusters.csv', sample=samples),
        expand('results/clusters/tsne/{sample}_tsne_clusters.csv', sample=samples),
        expand('results/neo4j/{sample}/{file}', sample=samples,    
          file=['cells.csv', 'genes.csv', 'cl_contains.csv', 'cl_isin.csv', 'cl_nodes.csv', 'expr_by.csv', 'expr_ess.csv'])

neo4j 这样的规则:

rule neo4j:
    input:
        script = 'python/neo4j.py',
        path_to_cl = 'results/clusters/umap/{sample}_umap_clusters.csv',
        path_to_umap = 'results/umap/{sample}_umap.csv',
        path_to_mtx = 'data_files/normalized/{sample}.csv',
        base_neo4j = 'results/neo4j/{sample}'
    output: 'results/neo4j/{sample}/cells.csv', 'results/neo4j/{sample}/genes.csv', 'results/neo4j/{sample}/cl_nodes.csv',
            'results/neo4j/{sample}/cl_contains.csv', 'results/neo4j/{sample}/expr_by.csv', 'results/neo4j/{sample}/expr_ess.csv',
            'results/neo4j/{sample}/cl_isin.csv'
    shell:
        "python {input.script} -path_to_cl {input.path_to_cl} -path_to_umap {input.path_to_umap} -path_to_mtx {input.path_to_mtx} -base_neo4j {input.base_neo4j}"

通过这样的设置,我得到了错误:

缺少规则 neo4j 的输入文件: 结果/neo4j/plus_1

更新

我从neo4j 规则中删除了这一行:base_neo4j = 'results/neo4j/{sample}',然后将规则的output 更改为:

 output: 
      cells = 'results/neo4j/{sample}/cells.csv', 
      genes = 'results/neo4j/{sample}/genes.csv', 
      cl_nodes = 'results/neo4j/{sample}/cl_nodes.csv',
      cl_contains = 'results/neo4j/{sample}/cl_contains.csv', 
      cl_isin = 'results/neo4j/{sample}/cl_isin.csv', 
      expr_by = 'results/neo4j/{sample}/expr_by.csv',
      expr_ess = 'results/neo4j/{sample}/expr_ess.csv'

shell 命令:

shell:
   "python {input.script} -path_to_cl {input.path_to_cl} -path_to_umap {input.path_to_umap} -path_to_mtx {input.path_to_mtx} -cells {output.cells} -genes {output.genes} -cl_nodes {output.cl_nodes} -cl_contains {output.cl_contains} -cl_isin {output.cl_isin} -expr_by {output.expr_by} -expr_ess {output.expr_ess}"

我不喜欢在output 中输入每个参数,但否则它不起作用。我尝试只输入output,但它只输入output 中的第一项,其他的由于某种原因被忽略。我问了一个单独的问题:

Snakemake passes only the first path in the output to shell command

除此之外,它现在正在工作。

【问题讨论】:

  • 您是否有理由避免使用rule all
  • 不确定你的意思。我绝对不是试图避免它,而是试图编写Snakemake 可以工作的文件。那么,您认为应该改变什么以使其变得更好?

标签: python snakemake


【解决方案1】:

由于您没有提供整个 Snakefile,因此诊断完整问题并不容易,但我可以从您指定的内容中推断出以下内容:

不幸的是,错误消息有点误导,但它的要点是 snakemake 从目标列表开始。这些目标要么是您通过命令行指定的文件,要么是作为蛇文件最顶层规则输入的文件。通常这条规则被命名为“all”或“main”。在这里,您将指定默认情况下要生成的文件的最终列表。您的案例的一个示例是:

rule all:
    input: expand('results/neo4j/{sample}/{file}.csv', sample=samples, file=['cells.csv', 'genes.csv', ...])

rule neo4j:
    ...
    output:'results/neo4j/{sample}/cells.csv', 'results/neo4j/{sample}/genes.csv'...

Snakemake 查看main 的输入以找出所有要生成的文件,然后找出使用哪些参数运行(neo4j)的规则,以便生成这些文件,以及哪些规则用于生成这些规则的输入等。所以在一天结束时,最后一条规则,即“目标规则”all 是一切开始的地方,所以你不能在那里使用通配符。

请注意,neo4j 的输出只是通配符(其中包含 {} 并指代可能匹配文件的假设模式),而 all 的输入被扩展为具体的文件名(如'结果/neo4j/123/cells.csv')。

通常人们得到这个错误的方式是他们的蛇文件顶部没有all 规则,这导致snakemake选择顶部的任何其他规则作为目标,这恰好是具有通配符的规则。

你可能不需要动态的 / 目录 / 等来做这样的事情。

【讨论】:

  • 谢谢!我根据您的建议更新了问题,但仍然出现错误(请参阅顶部)
  • 可能base_neo4j 也需要在rule all 中以某种方式指定,但我不确定
  • 好的,不用担心,我重写了它以使用直接路径。非常感谢!
  • 如果您有这样的静态值,您可以将其作为params 传递,然后使用params.base_neo4j 访问该值:snakemake.readthedocs.io/en/stable/snakefiles/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 2021-12-29
  • 2021-09-29
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多