snakemake的新手,我一直在尝试将基于shell脚本的管道转换为今天的snakemake并遇到很多语法问题。我认为我遇到的大多数问题都是围绕特定文件获取所有文件目录和推断输入名称的输出名称,因为我是如何使用shell脚本(for循环),特别是,我试图在输出部分使用expand函数,它总是给我一个错误。
在检查了一些示例Snakefile之后,我意识到人们从不在输出部分使用expand。所以我的第一个问题是:输出唯一不能使用扩展的部分,如果是,为什么?如果我想将config.yaml文件中定义的前缀作为输出文件的一部分传递,并且无法从输入文件名中推断出该前缀,我该怎样才能实现这一点,就像我在下面的日志部分所做的那样{ runid}是我的前缀?
关于语法的第二个问题:我试图将配置文件(config.yaml)中的用户定义的id传递到日志部分,在我看来,我必须使用以下形式的expand,是有更好的方法来传递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"
答案 0 :(得分:3)
以下是小型工作流程的示例:
# 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}"
希望这有帮助!