Snakemake 规则未被拾取且无法指定输出文件

Snakemake rule is not picked up and can not specify the output files

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

WorkflowError: Target rules may not contain wildcards. Please specify concrete files or a rule without wildcards.

我尝试以不同的方式指定规则的输出,但其中 none 有效。

  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)生成一个非常奇怪的错误:

Missing input files for rule 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() got an unexpected keyword argument 'sample'

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

  1. directory:

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

给出错误:

directory() got an unexpected keyword argument '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

如有任何建议,我们将不胜感激。

Update

我根据 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}"

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

Missing input files for rule neo4j: results/neo4j/plus_1

Update

我从 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 中的第一项,其他的由于某种原因被忽略。我问了一个单独的问题:

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

由于您没有提供完整的 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) 的规则和参数,为了生成这些规则,以及使用什么规则来生成这些规则的输入,等等。所以在一天结束时,最后一条规则,即 "target rule" all 是一切的地方开始,所以你不能在那里使用通配符。

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

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

对于这样的事情,您可能不需要动态/目录/等。