在 Snakemake 中使用 cutadapt 适配器文件输入

Using cutadapt adapter file inputs in Snakemake

我是 Snakemake 的新手,正在尝试移植我的 BASH 代码以使用 Snakemake 规则。免责声明,我正在尝试使用带有 headers 和适配器序列的 fasta 文件,在 shell 块中对带有 cutadapt 的 fastq 文件进行多路分解。匹配 fasta headers 的样本名称被加载并指定为通配符规则 all:

rule all:
input:
    expand([os.path.join(outDir, "reads_trim.fq"),
            os.path.join(outDir, "{name}.tmp")], name=samples_list)

reads_trim 文件是标准的串联 fastq 文件(来自 Nanopore 测序)。我的问题是这个规则是 运行 12 次,因为我的“samples_list”中有 12 个样本。然后我得到 12 个输出文件,正如我应该的那样,命名正确,但它们都包含完全相同的内容。我想知道如果 运行 只输出一次,输出是否正确,但还没有找到强制该行为的方法。

rule demultiplex:
""" Demultiplex Nextera-styled barcodes using the compiled barcode fasta file """
input:
    barcodeFile=os.path.join(outDir, "barcodes_used.fasta"),
    fastqFile=os.path.join(outDir, "reads_trim.fq")
output: os.path.join(outDir, "{name}.tmp")
message: "Demultiplexing trimmed reads"
log: "logs/cutadapt/demultiplexing_{name}.log"
shell:
    """
    cutadapt -e 0.20 -O 10 -m 15 -M 15 -g file:{input.barcodeFile} -o {output} {input.fastqFile}
    """

知道如何获得一个文件进入的标准行为,x 个文件以不同的输出(找到适配器的地方)出现吗?

我不熟悉用于多路分解的 cutadapt,但快速浏览一下 docs, 我 认为您想要类似的东西(我简化了您的原始代码):

rule all:
    input:
        expand("{name}.tmp", name= samples_list),

rule demultiplex:
    input:
        barcodeFile= "barcodes_used.fasta",
        fastqFile= "reads_trim.fq"
    output: 
        expand("{name}.tmp", name=samples_list),
    shell:
        r"""
        cutadapt ... -g file:{input.barcodeFile} -o {{name}}.tmp {input.fastqFile}
        """

如果输入 reads_trim.fq 一次生成所有 12 个输出文件,则 您需要在 output 指令中列出所有 12 个输出。我用了 expand() 功能。注意 {{name}}.tmp 有双花括号 告诉 snakemake 这不是一个通配符,但它应该被完全理解为 {name}(根据 cutadapt 文档,如果我没看错的话)。

对了,你确定cutadapt能解复用Nanopore吗?