我有一个文件夹,其中生成规则的输出。用它来运行snakemake
真的很麻烦。如果我没有在rule all
中指定输出,则根本不运行规则(称为neo4j
)。如果我尝试用snakemake neo4j
手动运行它(我不想这样做),那么我得到一个错误:
WorkflowError:目标规则可能不包含通配符。请指定具体文件或没有通配符的规则。
我尝试以不同的方式指定规则的输出,但没有一个工作。
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
,也不工作。如果我在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
除此之外,它现在正在运作。
由于您没有提供整个Snakefile,因此诊断完整问题并不是一件容易的事,但是我可以从您指定的内容中推断出:
不幸的是,错误消息有点误导,但它的要点是snakemake从目标列表开始。这些目标是您通过命令行指定的文件,或者是snakefile最顶层规则的输入文件。通常此规则名为“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
的输入则扩展为具体文件名(如'results / neo4j / 123 / cells.csv')。
通常人们得到这个错误的方式是他们没有在他们的snakefile顶部有一个all
规则,这导致snakemake选择顶部的任何其他规则作为目标,这恰好是一个带有通配符的规则。
对于像这样的东西,你可能不需要动态/目录/等。