2017-03-06 3 views
0

Ich versuche eine SnakeMake-Pipeline und ich bin auf einen Fehler stecken, den ich wirklich nicht verstehe.Snakemake: MissingInputException in Snakemake-Pipeline

Ich habe ein Verzeichnis bekam (raw_data), in dem ich die Eingabedateien haben:

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 

Dieses Verzeichnis enthält vier Dateien für 2 Proben. habe ich eine Config-JSON-Datei für die SnakeMake Pipeline config_snakemake_Optimal_mapping_BaL.json genannt:

{ 
    "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" 
    } 
} 

Und schließlich die SnakeMake snakefile_bwa_samtools.py Datei:

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}" 

Ich betreibe diese Pipeline:

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 

und ich habe folgende Fehlerausgänge:

['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 

oder je den Moment:

['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. 

Die Proben korrekt erkannt werden, wie sie in der Liste (erste Zeile der Art der Ausgänge) und ich bin sicher Herumspielen mit den Platzhalter in der Regel bwa_mem_to_bam erscheinen, aber ich verstehe wirklich nicht warum. Irgendwelche Hinweise?

Antwort

0

Dank Hugo für meinen Code und Ihre Erklärung Überprüfung, macht es Sinn! Ich bekomme endlich eine Flash-Idee, heute Morgen aufzuwachen (die besten), und erkannte, dass ich den params Teil der Regel vernachlässigt habe, fq1_ID und fq2_ID sind keine Eingaben, sondern Parameter. Ich änderte den Code zu, dass:

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}" 

Und es funktioniert gut!

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 

Und schließlich meine korrekten Meldungen erhalten:

  • Ausrichtung von sampleB_R1.fastq.gz und sampleB_R2.fastq.gz auf BaL_AY713409.fasta mit BWA-Version 0.7.12.
  • Ausrichtung von sampleA_R1.fastq.gz und sampleA_R2.fastq.gz auf BaL_AY713409.fasta mit BWA Version 0.7.12.
0

Schließlich succed ich mit der Pipeline der fq1_ID und fq2_ID Variablen in den rule bwa_mem_to_bam entfernt und in den message der Regel input.fq1_ID und input.fq2_ID von input.fq1 und input.fq2 ersetzen.

Die Nachricht ist weniger elegant, aber die Pipeline läuft ordnungsgemäß. Immer noch nicht genau verstanden wo der Fehler war, wenn jemand das erklären kann, höre ich immer noch zu!

Der richtige Code für 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}" 
0

Ich sah Ihren Code schnell.

Warum hat der erste nicht funktioniert?

Schauen Sie, wenn Sie erklären fq1_ID und fq1, gleiche für Probe 2. Sie haben die gleiche Zeichenfolge nicht zugeordnet werden. Für fq1 fügst du ein Repertorium für die Datei hinzu, das für fq1_ID nicht vorhanden ist, also sucht snakemake im workdir (aktuelles Verzeichnis wenn -d Option nicht gesetzt ist) einen Dateinamen mit deiner Zeichenkette. Weil diese Variablen im Eingabebereich sind.

Also durch das Entfernen der beiden fq1/2_ID, wird es alle Dateien suchen Probleme zu löschen.

Hugo

Verwandte Themen