snakemake:规则的可选输入

时间:2018-07-16 12:47:27

标签: python bioinformatics snakemake

我想知道规则中是否可以有可选输入。 一个示例情况是排除未配对的读取以进行对齐(或仅包含未配对的读取)。伪规则示例:

rule hisat2_align:
    input:
        rU: lambda wildcards: ('-U '+ read_files[wildcards.reads]['unpaired']) if wildcards.read_type=='trimmed' else '',
        r1: lambda wildcards: '-1 '+ read_files[wildcards.reads]['R1'],
        r2: lambda wildcards: '-2 '+ read_files[wildcards.reads]['R2']
    output:
        'aligned.sam'
    params:
        idx: 'index_prefix',
        extra: ''
    shell:
        'hisat2 {params.extra} -x {params.idx} {input.rU} {input.r1} {input.r2}'

在这里,没有修剪的读取(rU='')会导致缺少输入文件错误。 我可以通过使用调整后的输入/ shell语句的重复规则或通过params处理输入来解决此问题(我敢肯定还有其他方法)。我正在尝试将其整齐地处理,以便可以通过蛇形包装器(当前为自定义包装器)运行此步骤。

我看到的最接近的示例是在https://groups.google.com/d/msg/snakemake/qX7RfXDTDe4/XTMOoJpMAAAJ上 和约翰内斯的回答。但是,我们有条件分配(例如input: 'a' if condition else 'b')不是可选的。

任何帮助/指导将不胜感激。

ps。可选的输入也可以帮助改变数量的hisat2索引(如此处所述:https://snakemake-wrappers.readthedocs.io/en/stable/wrappers/hisat2.html)。

编辑

要弄清潜在的投入,

1)单独使用单端读取,并在rU中声明它们。读取示例的文件可能是

sample1_single_1.fastq.gz
sample1_single_2.fastq.gz

在这种情况下,r1r2可能是空列表,或者根本没有声明。

2)使用双端读取,并在r1r2中声明它们。读取示例的文件可能是

sample1_paired_1_R1.fastq.gz
sample1_paired_1_R2.fastq.gz
sample1_paired_2_R1.fastq.gz
sample1_paired_2_R2.fastq.gz

在这种情况下,`rU``可能为空列表,或者在规则中完全未声明。

3)一起使用成对的和单端的读取(例如,trimmomatic的输出,其中一些对断开了)。读取示例的文件可能是

sample1_paired_1_R1.fastq.gz
sample1_paired_1_R2.fastq.gz
sample1_paired_2_R1.fastq.gz
sample1_paired_2_R2.fastq.gz
sample1_unpaired_1_R1.fastq.gz
sample1_unpaired_1_R2.fastq.gz
sample1_unpaired_2_R1.fastq.gz
sample1_unpaired_2_R2.fastq.gz

作为解决方案。我最终使用了@timofeyprodanov方法。我没有意识到可以为此使用一个空列表。感谢您的所有回答和评论!

3 个答案:

答案 0 :(得分:1)

一种解决方案是通过输出文件名或路径传递结尾信息。 the existing wrapper应该可以使用以下类似的方法:

def get_fastq_reads(wcs):
    if wcs.endedness == 'PE':  # Paired-end
        return ["reads/{wcs.sample}.1.fastq.gz", "reads/{wcs.sample}.2.fastq.gz"]

    if wcs.endedness == 'SE':  # Single-end
        return ["reads/{wcs.sample}.fastq.gz"]

    raise(ValueError("Unrecognized wildcard value for 'endedness': %s" % wcs.endedness))

rule hisat2:
    input:
      reads=get_fastq_reads
    output:
      "mapped/{sample}.{endedness}.bam"
    log:                                # optional
      "logs/hisat2/{sample}.{endedness}.log"
    params:                             # idx is required, extra is optional
      idx="genome",
      extra="--min-intronlen 1000"
    wildcard_constraints:
        endedness="(SE|PE)"
    threads: 8                          # optional, defaults to 1
    wrapper:
      "0.27.1/bio/hisat2"

使用此一条规则,然后可以将reads/tardigrade.fastq.gz映射为

> snakemake mapped/tardigrade.SE.bam

reads/tardigrade.{1,2}.fastq.gz

> snakemake mapped/tardigrade.PE.bam

关于索引注释的注释

我对the note on the index files感到困惑,并认为这可能是错误的。 HISAT2不接受该参数的文件,而是所有索引文件都具有相同前缀的单个前缀,因此,该参数只能有一个。文档中的示例idx="genome.fa"具有误导性。通过构建HISAT2附带的玩具参考(22_20-21M.fa)得出的索引为22_20-21M_snp.{1..8}.ht2,在这种情况下,将使用idx="22_20-21M_snp"

答案 1 :(得分:1)

我通常使用extend和空列表或非空列表来做到这一点:

rule a:
    input:
        extend('filename', proxy=[] if no_input else [None])

答案 2 :(得分:0)

我认为mere的方法,即让输出文件名包含有关尾音的信息,是Snakemake中最自然的方法。要求您有重复的规则但没有条件语句的另一种方法是使用ruleorder指令,例如ruleorder: align_pe > align_se。如果存在可选输入,则将使用较高优先级的规则。