1

我想运行多个名为qc.smk ,的蛇文件dada2.smkpicrust2.smk使用奇异性。然后有一个名为longitudinal.smk我想有条件地运行的蛇文件。例如,如果正在使用纵向数据。

# 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")

上面的代码仅在我运行纵向数据集时才有效。但是,当我不运行纵向分析时,snakemake 会失败并说:

MissingInputException in line 70 of /mnt/c/Users/noahs/projects/tagseq-qiime2-snakemake-1/Snakefile:
Missing input files for rule all:

我想如果我能够添加一个类似的条件语句,就像我为我的外部蛇文件所拥有的那个,snakemake 不会因为不包括纵向蛇文件而吓坏我。

4

2 回答 2

2

您可以定义一个列表(或字典)作为 之外的输出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在规则 all 的输入中作为第一个放置:

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)中,命名位置参数总是在命名参数之前。

于 2020-11-22T08:22:01.730 回答
0

合并列表形式展开语句的解决方案:

我使用配置文件将语句传递给 Snakefile

## Config.yml ##
# longitudinal analysis
perform_longitudinal: 'yes' # yes for longitudinal analysis 

当在配置中输入“yes”时,Snakemake 将在 rule 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上工作

于 2021-10-02T19:33:49.657 回答