代码之家  ›  专栏  ›  技术社区  ›  Nikita Vlasenko

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

  •  0
  • Nikita Vlasenko  · 技术社区  · 6 年前

    我有一个生成规则输出的文件夹。我跑步真的很困难 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 ):

    数据文件/标准化/减去2/cl_节点.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=样本 ,也不起作用。如果我指定 目录 在下面 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}"
    

    版本为 5.2.2

    更新

    我修改了 Snakemake 文件使用建议 Mali Akmanalp 现在呢 统治一切

    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'])
    

    这样的规则:

    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的输入文件:

    更新

    我把这句话从 尼欧4J 规则: base_neo4j = 'results/neo4j/{sample}' 然后改变了主意 规则的作用是:

     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}"
    

    我不喜欢在每个参数中输入 输出 输出 但它只在第一个项目中的饲料 输出 ,其他的由于某种原因被忽略。我问了另外一个问题:

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

    除此之外,它正在发挥作用。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Mali Akmanalp    6 年前

    由于您没有提供完整的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 是一切开始的地方,所以你不能在那里使用通配符。

    请注意 只是通配符(它们中有{}并且引用了可能匹配文件的假设模式),而不是 全部的 扩展为具体的文件名(如'results/neo4j/123/单元格.csv').

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

    对于这种情况,您可能不需要使用dynamic/directory/etc。