How*_*man 4 parameters expand snakemake
我正在尝试构建一个简单的工作流程来将参数列表提供给脚本。为了显示:
SAMPLES=['A','B']
rule test:
params:
sample=expand("{sample}", sample=SAMPLES)
script:
"test.py {params.sample}"
Run Code Online (Sandbox Code Playgroud)
但是,snakemake 只执行带有 sample 的脚本A,而不是B. 换句话说,我相信它正在执行python test.py A B,而不是python test.py A然后python test.py B。同样,我认为这可以通过以下方式说明:
SAMPLES=['A','B']
rule print_samples:
params:
sample=expand("{sample}", sample=SAMPLES)
script:
"echo {params.sample} \n"
Run Code Online (Sandbox Code Playgroud)
我希望看到A并B打印在不同的行上,但它打印A B在同一行上。
我是否遗漏了扩展与参数一起工作的方式?理想情况下,我想添加-j标志以并行运行它们(目前-j只是A单独执行)。
这就是预期的输出。在这种情况下,扩展只是一个包装器
[str(sample) for sample in SAMPLES]
Run Code Online (Sandbox Code Playgroud)
当输入到 shell 或脚本时,它变成了用空格连接的项目A B。
相反,您需要一个适用于任何样本的一般规则(您还需要一个输出文件):
rule test:
output: "{sample}.out"
shell:
"test.py {wildcards.sample}" # no need for params, assume this writes output {sample}.out
Run Code Online (Sandbox Code Playgroud)
这里 test.py 是一个可执行文件。所以当你要求 A.out 时,test.py A运行,对于 B.out 你得到test.py B.
接下来,您必须询问您想要的输出。这通常是蛇文件中的第一条规则,并称为全部:
rule all:
input: expand('{sample}.out', sample=SAMPLES)
Run Code Online (Sandbox Code Playgroud)
同样, expand 会给你一个样本列表,在你的情况下,规则全部变成:
rule all:
input: 'A.out', 'B.out'
Run Code Online (Sandbox Code Playgroud)
指定输出文件后,snakemake 确定规则测试需要运行两次,一次使用 A,一次使用 B。
所以请记住,将您的规则写成对任何一个样本的概括。您可能只需要在规则 all 中进行一个扩展即可为每个样本专门化您的规则。Snakemake 负责确定需要运行什么,如果你给它额外的内核,它可以同时为不同的作业执行。
| 归档时间: |
|
| 查看次数: |
881 次 |
| 最近记录: |