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

时间:2018-08-29 22:00:56

标签: python snakemake

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

  

WorkflowError:   目标规则可能不包含通配符。请指定具体文件或不带通配符的规则。

我尝试以不同的方式指定规则的输出,但是没有一个起作用。

  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,则也不起作用。如果我在directory rule all下指定output,则无法正常工作。

我遇到的困难规则如下:

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

任何建议将不胜感激。

  

更新

我使用Snakemake的建议修改了Mali Akmanalp文件,现在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的输入文件:   results / 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

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

1 个答案:

答案 0 :(得分:2)

由于您没有提供完整的Snakefile,因此很难诊断出完整的问题,但这是我可以从您指定的内容中得出的结论:

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

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的输入则扩展为具体的通配符文件名(如“ results / neo4j / 123 / cells.csv”)。

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

您可能不需要像这样的动态/目录/等。