0

snakemake 的新手,我一直在尝试将基于 shell 脚本的管道转换为基于 snakemake 的管道,但遇到了很多语法问题。我认为我遇到的大部分问题是获取特定目录中的所有文件并推断从输入名称输出名称,因为这就是我使用 shell 脚本(for 循环)的方式,特别是,我尝试在输出部分使用 expand 函数,它总是给我一个错误。

在检查了一些示例 Snakefile 之后,我意识到人们从不在输出部分使用 expand。所以我的第一个问题是:输出是唯一不能使用扩展的部分,如果是,为什么?如果我想将 config.yaml 文件中定义的前缀作为输出文件的一部分传递并且无法从输入文件名中推断出该前缀怎么办,我该如何实现呢,就像我在下面为日志部分所做的那样 { runid} 是我的前缀?

关于语法的第二个问题:我试图将配置文件(config.yaml)中的用户定义的 id 传递到日志部分,在我看来,这里我必须使用以下形式的扩展,有没有更好的传递方式config.yaml 文件中定义的字符串?

log:    
    expand("fastq/fastqc/{runid}_fastqc_log.txt",runid=config["run"])

在 config.yaml 中的位置

run:
    "run123"

第三个问题:我最初尝试了以下两种方法,但它们给了我错误,这是否意味着在日志(可能是输入和输出)部分内部,没有遵循 Python 语法?

log:
    "fastq/fastqc/"+config["run"]+"_fastqc_log.txt"

log:
    "fastq/fastqc/{config["run"]}_fastqc_log.txt"
4

1 回答 1

4

这是一个小型工作流程的示例:

# Sample IDs
SAMPLES = ["sample1", "sample2"]
CONTROL = ["sample1"]
TREATMENT = ["sample2"]

rule all:
    input: expand("{treatment}_vs_{control}.bed", treatment=TREATMENT, control=CONTROL)

rule peak_calling:
    input: control="{control}.sam", treatment="{treatment}.sam"
    output: "{treatment}_vs_{control}.bed"
    shell: "touch {output}"

rule mapping:
    input: "{samples}.fastq"
    output: "{samples}.sam"
    shell: "cp {input} {output}"

我只在我的最终目标中使用了扩展功能。从那里,snakemake 可以推断出规则“mapping”和“peak_calling”中使用的通配符的不同值。

至于最后一部分,正确的说法应该是第一部分:

log:
    "fastq/fastqc/" + config["run"] + "_fastqc_log.txt"

但同样,snakemake 可以从您的目标中推断出它(在我的示例中为全部规则)。

rule mapping:
    input: "{samples}.fastq"
    output: "{samples}.sam"
    log: "{samples}.log"
    shell: "cp {input} {output}"

希望这可以帮助!

于 2016-11-18T13:28:30.703 回答