是否可以在snakemake的rule all中加入条件语句?
Is it possible to add a conditional statement in snakemake's rule all?
我想 运行 多个名为 qc.smk
、dada2.smk
、picrust2.smk
的蛇文件使用奇点。然后有一个名为 longitudinal.smk
的 snakefile,我想有条件地 运行。例如,如果纵向数据是
正在使用。
# set vars
LONGITUDINAL = config['perform_longitudinal']
rule all:
input:
# fastqc output before trimming
raw_html = expand("{scratch}/fastqc/{sample}_{num}_fastqc.html", scratch = SCRATCH, sample=SAMPLE_SET, num=SET_NUMS),
raw_zip = expand("{scratch}/fastqc/{sample}_{num}_fastqc.zip", scratch = SCRATCH, sample=SAMPLE_SET, num=SET_NUMS),
raw_multi_html = SCRATCH + "/fastqc/raw_multiqc.html",
raw_multi_stats = SCRATCH + "/fastqc/raw_multiqc_general_stats.txt"
# there are many more files in rule all
##### setup singularity #####
singularity: "docker://continuumio/miniconda3"
##### load rules #####
include: "rules/qc.smk"
include: "rules/dada2.smk"
include: "rules/phylogeny.smk"
include: "rules/picrust2.smk"
if LONGITUDINAL == 'yes':
include: 'rules/longitudinal.smk'
print("Will perform a longitudinal analysis")
else:
print("no longitudinal analysis")
以上代码仅在我 运行 纵向数据集时有效。但是,当我不 运行ning 时,纵向分析 snakemake 失败并显示类似:
MissingInputException in line 70 of /mnt/c/Users/noahs/projects/tagseq-qiime2-snakemake-1/Snakefile:
Missing input files for rule all:
我想如果我能够添加一个类似的条件语句,就像我为我的外部 snakefile 设置的那样,snakemake 就不会因为我不包括纵向 snakefile 而感到害怕。
您可以在 rule all
之外定义一个您想要的输出列表(或字典),并将其提供给输入,这样的方法可行:
myoutput = list()
if condition_1 == True:
myoutput.append("file_1.txt")
if condition_2 == True:
myoutput.append("file_2.txt")
rule all:
input:
myoutput
编辑:
将myoutput
放在规则全部输入的第一位:
rule all:
input:
myoutput,
raw_html = "raw_html_path",
raw_zip = "raw_zip_path"
或者给它命名,然后把它放在任何地方:
rule all:
input:
raw_html = "raw_html_path",
myoutput = myoutput,
raw_zip = "raw_zip_path"
在 Python(和 snakemake)中,命名位置参数总是在命名参数之前。
合并列表形式扩展语句的解决方法:
我使用配置文件将语句传递给 Snakefile
## Config.yml ##
# longitudinal analysis
perform_longitudinal: 'yes' # yes for longitudinal analysis
当在配置中输入 'yes' 时,Snakemake 将在规则 all 中包含其他变量,并 运行 添加一个 Snakefile 来生成这些文件。最终有多个 Snakefile,所以我使用奇点让 Snakemake 知道规则所有输入文件都适用于所有 6 个 Snakefile。
## Snakefile ##
configfile: "config.yaml"
LONGITUDINAL = config['perform_longitudinal']
# rule all input files
raw_html=file.txt,
raw_zip=file.txt,
raw_multi_htmt=file.txt,
raw_multi_stats=file.txt,
Longitudinal_analaysis_files=file.txt
# rule all files excluding longitudinal analysis
rule_all_input_list=['raw_html','raw_zip','raw_multi_htmt','raw_multi_stats']
#longitudinal analysis files
rule_all_longitudinal_input=['Longitudinal_analaysis_files']
if LONGITUDINAL == 'yes':
rule_all_input_list.extend(rule_all_longitudinal_input)
# conditionally add Snakefile to workflow
include: 'rules/longitudinal.smk'
print("Will perform a longitudinal analysis")
else:
print("no longitudinal analysis")
rule all:
input:
data = rule_all_input_list
##### setup singularity #####
# this container defines the underlying OS for each job when using the workflow
# with --use-conda --use-singularity
singularity: "docker://continuumio/miniconda3"
##### load rules #####
include: "rules/qc.smk"
include: "rules/dada2.smk"
include: "rules/phylogeny.smk"
include: "rules/picrust2.smk"
include: "rules/differential.smk"
我有一个不太简单的版本来说明我是如何工作的 GitHub https://github.com/nasiegel88/tagseq-qiime2-snakemake-1
我想 运行 多个名为 qc.smk
、dada2.smk
、picrust2.smk
的蛇文件使用奇点。然后有一个名为 longitudinal.smk
的 snakefile,我想有条件地 运行。例如,如果纵向数据是
正在使用。
# set vars
LONGITUDINAL = config['perform_longitudinal']
rule all:
input:
# fastqc output before trimming
raw_html = expand("{scratch}/fastqc/{sample}_{num}_fastqc.html", scratch = SCRATCH, sample=SAMPLE_SET, num=SET_NUMS),
raw_zip = expand("{scratch}/fastqc/{sample}_{num}_fastqc.zip", scratch = SCRATCH, sample=SAMPLE_SET, num=SET_NUMS),
raw_multi_html = SCRATCH + "/fastqc/raw_multiqc.html",
raw_multi_stats = SCRATCH + "/fastqc/raw_multiqc_general_stats.txt"
# there are many more files in rule all
##### setup singularity #####
singularity: "docker://continuumio/miniconda3"
##### load rules #####
include: "rules/qc.smk"
include: "rules/dada2.smk"
include: "rules/phylogeny.smk"
include: "rules/picrust2.smk"
if LONGITUDINAL == 'yes':
include: 'rules/longitudinal.smk'
print("Will perform a longitudinal analysis")
else:
print("no longitudinal analysis")
以上代码仅在我 运行 纵向数据集时有效。但是,当我不 运行ning 时,纵向分析 snakemake 失败并显示类似:
MissingInputException in line 70 of /mnt/c/Users/noahs/projects/tagseq-qiime2-snakemake-1/Snakefile:
Missing input files for rule all:
我想如果我能够添加一个类似的条件语句,就像我为我的外部 snakefile 设置的那样,snakemake 就不会因为我不包括纵向 snakefile 而感到害怕。
您可以在 rule all
之外定义一个您想要的输出列表(或字典),并将其提供给输入,这样的方法可行:
myoutput = list()
if condition_1 == True:
myoutput.append("file_1.txt")
if condition_2 == True:
myoutput.append("file_2.txt")
rule all:
input:
myoutput
编辑:
将myoutput
放在规则全部输入的第一位:
rule all:
input:
myoutput,
raw_html = "raw_html_path",
raw_zip = "raw_zip_path"
或者给它命名,然后把它放在任何地方:
rule all:
input:
raw_html = "raw_html_path",
myoutput = myoutput,
raw_zip = "raw_zip_path"
在 Python(和 snakemake)中,命名位置参数总是在命名参数之前。
合并列表形式扩展语句的解决方法:
我使用配置文件将语句传递给 Snakefile
## Config.yml ##
# longitudinal analysis
perform_longitudinal: 'yes' # yes for longitudinal analysis
当在配置中输入 'yes' 时,Snakemake 将在规则 all 中包含其他变量,并 运行 添加一个 Snakefile 来生成这些文件。最终有多个 Snakefile,所以我使用奇点让 Snakemake 知道规则所有输入文件都适用于所有 6 个 Snakefile。
## Snakefile ##
configfile: "config.yaml"
LONGITUDINAL = config['perform_longitudinal']
# rule all input files
raw_html=file.txt,
raw_zip=file.txt,
raw_multi_htmt=file.txt,
raw_multi_stats=file.txt,
Longitudinal_analaysis_files=file.txt
# rule all files excluding longitudinal analysis
rule_all_input_list=['raw_html','raw_zip','raw_multi_htmt','raw_multi_stats']
#longitudinal analysis files
rule_all_longitudinal_input=['Longitudinal_analaysis_files']
if LONGITUDINAL == 'yes':
rule_all_input_list.extend(rule_all_longitudinal_input)
# conditionally add Snakefile to workflow
include: 'rules/longitudinal.smk'
print("Will perform a longitudinal analysis")
else:
print("no longitudinal analysis")
rule all:
input:
data = rule_all_input_list
##### setup singularity #####
# this container defines the underlying OS for each job when using the workflow
# with --use-conda --use-singularity
singularity: "docker://continuumio/miniconda3"
##### load rules #####
include: "rules/qc.smk"
include: "rules/dada2.smk"
include: "rules/phylogeny.smk"
include: "rules/picrust2.smk"
include: "rules/differential.smk"
我有一个不太简单的版本来说明我是如何工作的 GitHub https://github.com/nasiegel88/tagseq-qiime2-snakemake-1