我正在编写一个蛇形规则,该规则将处理对单端或配对末端测序数据执行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不允许可选输出,我可以分成两个规则,但是那不是我想要的。
答案 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}
"""