Snakemake中是否可以有一个可选的输出文件?

时间:2019-05-30 10:20:42

标签: python bioinformatics snakemake

我正在编写一个蛇形规则,该规则将处理对单端或配对末端测序数据执行fastq修整。如果数据是配对的,则应该有两个输出文件;如果是单端的,则应该是一个输出文件。

到目前为止,我编写的规则仍然有效,但是我没有修剪的第二对是输出文件。这意味着snakemake不会检查该文件是否存在。它会输出,但不检查,是否可以提供可选输出?

    input:
    #get the value in the fast1 column
        fastq_file = lambda wildcards: return_fastq(wildcards.fastq_name,wildcards.unit,first_pair = True)
    output:
        out_fastqc = config["fastp_trimmed_output_folder"] + "{unit}/{fastq_name}_trimmed.fastq.gz",
        fastpjson = config["fastp_trimmed_output_folder"] + "{unit}/{fastq_name}_fastp.json",
        fastphtml = config["fastp_trimmed_output_folder"] + "{unit}/{fastq_name}_fastp.html"
    params:
        fastp_parameters = return_parsed_extra_params(config['fastp_parameters']),
        fastq_file2 = lambda wildcards: return_fastq(wildcards.fastq_name,wildcards.unit,first_pair = False),
        out_fastqc2 = lambda wildcards: return_fastq2_name(wildcards.fastq_name,wildcards.unit),
        fastpjson = config["fastp_trimmed_output_folder"] + "{unit}/{fastq_name}_fastp.json",
        fastphtml = config["fastp_trimmed_output_folder"] + "{unit}/{fastq_name}_fastp.html"
    run:
        if config["end_type"] == "se":
            shell("{config[fastp_path]} -i {input.fastq_file} -o {output.out_fastqc} --json {output.fastpjson} --html {output.fastphtml} {params.fastp_parameters}")
        if config["end_type"] == "pe":
            shell("{config[fastp_path]} --in1 {input.fastq_file} --in2 {params.fastq_file2} --out1 {output.out_fastqc} --out2  {params.out_fastqc2} --json {output.fastpjson} --html {output.fastphtml} {params.fastp_parameters}")

目标是将out_fastqc2作为规则的可选输出包括在内,以便snakemake将检查它是否存在,如果不存在,则会适当地给我一个错误。

如果Snakemake不允许可选输出,我可以分成两个规则,但是那不是我想要的。

2 个答案:

答案 0 :(得分:0)

查看expand函数的工作方式。在Snakemake构造依赖项的DAG的阶段将调用它,并使用此函数的结果来构造output部分的文件列表。

我建议您尝试相同的方法:构造一个可以为空或不为空的列表-取决于条件。

仅当您知道是否需要out_fastqc2时,此解决方案才有效(但是,定义2个具有优先级的规则的作用相同)。如果仅在运行规则时获得有关out_fastqc2需求的信息,则与需要检查点的情况完全不同。

答案 1 :(得分:0)

由于配置中配对端和单端之间的选择似乎是固定的,因此您可以尝试根据配置以两种方式定义规则:

if config["end_type"] == "se":
    rule do_fastp:
        input:
        #get the value in the fast1 column
            fastq_file = lambda wildcards: return_fastq(wildcards.fastq_name, wildcards.unit, first_pair = True)
        output:
            out_fastqc = config["fastp_trimmed_output_folder"] + "{unit}/{fastq_name}_trimmed.fastq.gz",
            fastpjson = config["fastp_trimmed_output_folder"] + "{unit}/{fastq_name}_fastp.json",
            fastphtml = config["fastp_trimmed_output_folder"] + "{unit}/{fastq_name}_fastp.html"
        params:
            fastp_parameters = return_parsed_extra_params(config['fastp_parameters']),
        shell:
            """
            {config[fastp_path]} -i {input.fastq_file} -o {output.out_fastqc} \\
                --json {output.fastpjson} --html {output.fastphtml} \\
                {params.fastp_parameters}
            """
if config["end_type"] == "pe":
    rule do_fastp:
        input:
        #get the value in the fast1 column
            fastq_file1 = lambda wildcards: return_fastq(wildcards.fastq_name, wildcards.unit, first_pair = True),
            fastq_file2 = lambda wildcards: return_fastq(wildcards.fastq_name, wildcards.unit, first_pair = False)
        output:
            out_fastqc1 = config["fastp_trimmed_output_folder"] + "{unit}/{fastq_name}_trimmed_1.fastq.gz",
            out_fastqc2 = config["fastp_trimmed_output_folder"] + "{unit}/{fastq_name}_trimmed_2.fastq.gz",
            fastpjson = config["fastp_trimmed_output_folder"] + "{unit}/{fastq_name}_fastp.json",
            fastphtml = config["fastp_trimmed_output_folder"] + "{unit}/{fastq_name}_fastp.html"
        params:
            fastp_parameters = return_parsed_extra_params(config['fastp_parameters']),
        shell:
            """
            {config[fastp_path]} \\
                --in1 {input.fastq_file1} --in2 {params.fastq_file2} \\
                --out1 {output.out_fastqc1} --out2 {output.out_fastqc2} \\
                --json {output.fastpjson} --html {output.fastphtml} \\
                {params.fastp_parameters}
            """