Snakemake:snakemake 管道中的 MissingInputException

Snakemake: MissingInputException in snakemake pipeline

我正在尝试 SnakeMake 管道,但遇到一个我真的不明白的错误。

我有一个目录 (raw_data),其中有输入文件:

ll /home/nico/labo/etudes/Optimal/data/raw_data
total 41M
drwxrwxr-x  2 nico nico 4,0K mars   6 16:09 ./
drwxrwxr-x 11 nico nico 4,0K mars   6 16:14 ../
-rw-rw-r--  1 nico nico  15M févr. 27 12:21 sampleA_R1.fastq.gz
-rw-rw-r--  1 nico nico  19M févr. 27 12:22 sampleA_R2.fastq.gz
-rw-rw-r--  1 nico nico 3,4M févr. 27 12:21 sampleB_R1.fastq.gz
-rw-rw-r--  1 nico nico 4,3M févr. 27 12:22 sampleB_R2.fastq.gz

此目录包含 2 个示例的 4 个文件。 我为名为 config_snakemake_Optimal_mapping_BaL.json:

的 SnakeMake 管道创建了一个配置 json 文件
{
    "fastqExtension": "fastq.gz",
    "fastqDir": "/home/nico/labo/etudes/Optimal/data/raw_data",
    "outputDir": "/home/nico/labo/etudes/Optimal/data/mapping_BaL",
    "logDir": "logs",
    "reference": {
        "fasta": "/home/nico/labo/references/genomes/HIV1/BaL_AY713409/BaL_AY713409.fasta",
        "index": "/home/nico/labo/references/genomes/HIV1/BaL_AY713409/BaL_AY713409.fasta.bwt"
    }
}

最后是 SnakeMake 文件 snakefile_bwa_samtools.py:

import subprocess
from os.path import join

### Globals ---------------------------------------------------------------------

# A Snakemake regular expression matching fastq files.

SAMPLES, = glob_wildcards(join(config["fastqDir"], "{sample}_R1."+config["fastqExtension"]))
print(SAMPLES)

### Rules -----------------------------------------------------------------------

# Pipeline output files
rule all:
    input: expand(join(config["outputDir"], "{sample}.bam.bai"), sample=SAMPLES)

# Reads alignment on reference genome and BAM file creation
rule bwa_mem_to_bam:
    input:
        index = config["reference"]["index"],
        fasta = config["reference"]["fasta"],
        fq1_ID = "{sample}_R1."+config["fastqExtension"],
        fq2_ID = "{sample}_R2."+config["fastqExtension"],
        fq1 = join(config["fastqDir"], "{sample}_R1."+config["fastqExtension"]),
        fq2 = join(config["fastqDir"], "{sample}_R2."+config["fastqExtension"])
    output:
        temp(join(config["outputDir"], "{sample}.bamUnsorted"))
    version:
        subprocess.getoutput(
        "man bwa | tail -n 1 | cut -d ' ' -f 1 | cut -d '-' -f 2"
        )
    log:
        join(config["outputDir"], config["logDir"], "{sample}.bwa_mem.log")
    message:
        "Alignment of {input.fq1_ID} and {input.fq2_ID} on {input.fasta} with BWA version {version}."
    shell:
        "bwa mem {input.fasta} {input.fq1} {input.fq2} 2> {log} | samtools view -Sbh - > {output}"

# Sorting the BAM files on genomic positions
rule bam_sort:
    input:
        join(config["outputDir"], "{sample}.bamUnsorted")
    output:
        join(config["outputDir"], "{sample}.bam")
    log:
        join(config["outputDir"], config["logDir"],  "{sample}.samtools_sort.log")
    version:
        subprocess.getoutput(
            "samtools --version | "
            "head -1 | "
            "cut -d' ' -f2"
        )
    message:
        "Genomic sorting of {input} with samtools version {version}."
    shell:
        "samtools sort -f {input} {output} 2> {log}"

# Indexing the BAM files
rule bam_index:
    input:
        join(config["outputDir"], "{sample}.bam")
    output:
        join(config["outputDir"], "{sample}.bam.bai")
    message:
        "Indexing {input}."
    shell:
        "samtools index {input}"

我运行这条管道:

snakemake --cores 3 --snakefile /home/nico/labo/scripts/pipeline_illumina/snakefile_bwa_samtools.py --configfile /home/nico/labo/etudes/Optimal/data/snakemake_config_files/config_snakemake_Optimal_mapping_BaL.json

我得到以下错误输出:

['sampleB', 'sampleA']
MissingInputException in line 18 of /home/nico/labo/scripts/pipeline_illumina/snakefile_bwa_samtools.py:
Missing input files for rule bwa_mem_to_bam:
sampleB_R1.fastq.gz
sampleB_R2.fastq.gz

或取决于时刻:

['sampleB', 'sampleA']
PeriodicWildcardError in line 40 of /home/nico/labo/scripts/pipeline_illumina/snakefile_bwa_samtools.py:
The value _unsorted in wildcard sample is periodically repeated (sampleB_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted_unsorted). This would lead to an infinite recursion. To avoid this, e.g. restrict the wildcards in this rule to certain values.

样本在列表中出现时被正确检测到(输出类型的第一行),我肯定在乱用规则 bwa_mem_to_bam 中的通配符,但我真的不明白为什么.. 有什么线索吗?

最后,我成功地删除了 rule bwa_mem_to_bam 中的 fq1_IDfq2_ID 变量,并替换了规则 input.fq1_IDmessageinput.fq2_ID 通过 input.fq1input.fq2.

消息不够优雅,但管道 运行 正确。还是不明白哪里错了,如果有人能解释一下,我还在听!

rule bwa_mem_to_bam的正确代码:

rule bwa_mem_to_bam:
input:
    index = config["reference"]["index"],
    fasta = config["reference"]["fasta"],
    fq1 = join(config["fastqDir"], "{sample}_R1."+config["fastqExtension"]),
    fq2 = join(config["fastqDir"], "{sample}_R2."+config["fastqExtension"])
output:
    temp(join(config["outputDir"], "{sample}.bamUnsorted"))
version:
    subprocess.getoutput(
    "man bwa | tail -n 1 | cut -d ' ' -f 1 | cut -d '-' -f 2"
    )
log:
    join(config["outputDir"], config["logDir"], "{sample}.bwa_mem.log")
message:
    "Alignment of {input.fq1} and {input.fq2} on {input.fasta} with BWA version {version}."
shell:
    "bwa mem {input.fasta} {input.fq1} {input.fq2} 2> {log} | samtools view -Sbh - > {output}"

我很快看了你的代码。

为什么第一个没有成功?

当你声明 fq1_IDfq1 时,与示例 2 相同。你没有分配相同的字符串。对于 fq1,您为文件添加一个目录 对于 fq1_ID 不存在,因此 snakemake 正在工作目录中搜索它(如果未设置 -d 选项,则为当前目录)a文件名与您的字符串。因为这些变量在输入部分。

所以通过删除两个 fq1/2_ID,它将消除所有文件搜索问题。

雨果

感谢雨果检查我的代码和你的解释,很有道理! 今天早上醒来我终于有了一个闪现的想法(最好的),并意识到我忽略了规则的 params 部分,fq1_ID 和 fq2_ID 不是输入而是参数.. 我将代码更改为:

rule bwa_mem_to_bam:
input:
    index = config["reference"]["index"],
    fasta = config["reference"]["fasta"],
    fq1 = join(config["fastqDir"], "{sample}_R1.fastq.gz"),
    fq2 = join(config["fastqDir"], "{sample}_R2.fastq.gz")
output:
    temp(join(config["outputDir"],"{sample}_unsorted.bam"))
params:
    fq1_ID = "{sample}_R1.fastq.gz",
    fq2_ID = "{sample}_R2.fastq.gz",
    ref_ID = os.path.basename(config["reference"]["fasta"])
version:
    subprocess.getoutput(
    "man bwa | tail -n 1 | cut -d ' ' -f 1 | cut -d '-' -f 2"
    )
log:
    join(config["outputDir"], config["logDir"], "{sample}.bwa_mem.log")
message:
    "Alignment of {params.fq1_ID} and {params.fq2_ID} on {params.ref_ID} with BWA version {version}."
shell:
    "bwa mem {input.fasta} {input.fq1} {input.fq2} 2> {log} | samtools view -Sbh - > {output}"

而且效果很好!

snakemake --cores 3 --snakefile /home/nico/labo/scripts/pipeline_illumina/snakefile_bwa_samtools.py --configfile /home/nico/labo/etudes/Optimal/data/snakemake_config_files/config_snakemake_Optimal_mapping_BaL.json 
Provided cores: 3
Rules claiming more threads will be scaled down.
Job counts:
    count   jobs
    1   all
    2   bam_index
    2   bam_sort
    2   bwa_mem_to_bam
    7
Alignment of sampleB_R1.fastq.gz and sampleB_R2.fastq.gz on BaL_AY713409.fasta with BWA version 0.7.12.

Alignment of sampleA_R1.fastq.gz and sampleA_R2.fastq.gz on BaL_AY713409.fasta with BWA version 0.7.12.

1 of 7 steps (14%) done
Genomic sorting of sampleB_unsorted.bam with samtools version 1.2.

Removing temporary output file /home/nico/labo/etudes/Optimal/data/mapping_BaL/sampleB_unsorted.bam.
2 of 7 steps (29%) done
Indexing sampleB.bam.

3 of 7 steps (43%) done
4 of 7 steps (57%) done
Genomic sorting of sampleA_unsorted.bam with samtools version 1.2.

Removing temporary output file /home/nico/labo/etudes/Optimal/data/mapping_BaL/sampleA_unsorted.bam.
5 of 7 steps (71%) done
Indexing sampleA.bam.

6 of 7 steps (86%) done
localrule all:
    input: /home/nico/labo/etudes/Optimal/data/mapping_BaL/sampleB.bam.bai, /home/nico/labo/etudes/Optimal/data/mapping_BaL/sampleA.bam.bai

7 of 7 steps (100%) done

终于收到我的正确消息:

  • sampleB_R1.fastq.gz 和 sampleB_R2.fastq.gz 对齐 BaL_AY713409.fasta BWA 版本 0.7.12。
  • sampleA_R1.fastq.gz 和 sampleA_R2.fastq.gz 在 BaL_AY713409.fasta 上的对齐 BWA 版本 0.7.12.