【发布时间】:2018-08-29 22:00:55
【问题描述】:
我有一个生成规则输出的文件夹。我在运行snakemake 时遇到了真正的麻烦。如果我没有在rule all 中指定输出,则根本不会运行规则(称为neo4j)。如果我尝试使用 snakemake neo4j 手动运行它(我不希望这样做),那么我会收到一个错误:
工作流程错误: 目标规则可能不包含通配符。请指定具体文件或不带通配符的规则。
我尝试以不同的方式指定规则的输出,但它们都不起作用。
-
使用
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 是所有输出的根文件夹之外,路径生成也完全混乱。
-
使用
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 但没有成功
-
只要
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可以工作的文件。那么,您认为应该改变什么以使其变得更好?