2017-03-06 2 views
0

SnakeMake 파이프 라인을 시도하고 있는데 실제로 이해가 안되는 오류에 집착했습니다.Snakemake : Snakemake 파이프 라인의 MissingInputException

내가 입력 파일이있는 디렉토리 (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 

이 디렉토리는이 개 샘플 4 개 파일이 포함되어 있습니다. 마지막으로 SnakeMake이 snakefile_bwa_samtools.py 파일

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

그리고 :

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 

을 나는 ' 나는 config_snakemake_Optimal_mapping_BaL.json를라는 SnakeMake 파이프 라인의 구성 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에 와일드 카드로 장난 해요로 샘플이 제대로 감지, 그러나 나는 정말로 이유를 알지 못한다. .. 어떤 단서?

답변

0

내 코드와 설명을 확인해 주셔서 감사합니다. 나는 마침내 오늘 아침에 일어나는 플래시 아이디어를 얻었고 (가장 좋은 것들) 규칙의 일부인 params을 무시했다는 것을 깨달았습니다. fq1_ID와 fq2_ID는 입력이 아니라 params ..

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의 BWA 버전 0.7.12와 BaL_AY713409.fasta 에 있습니다.
  • BWA 버전 0.7.12 인 BaL_AY713409.fasta 에 대한 sampleA_R1.fastq.gz 및 sampleA_R2.fastq.gz의 정렬.
0

마지막 I 파이프 라인은 rule bwa_mem_to_bamfq1_IDfq2_ID 변수를 제거하고 input.fq1input.fq2하여 규칙 input.fq1_IDinput.fq2_IDmessage에 교체가 성공으로.

메시지가 덜 우아하지만 파이프 라인이 올바르게 실행 중입니다. 누군가가 설명 할 수 있으면, 나는 아직도 듣고있다! 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

내가 빨리 코드를 보았다.

왜 처음에는 해결되지 않았습니까?

fq1_IDfq1을 선언 할 때 표본 2와 동일하게 나타납니다. 동일한 문자열을 지정하지 않았습니다. fq1의 경우 wq가 fq1_ID에없는 파일에 대한 레퍼토리를 추가하므로 snakemake는 문자열을 사용하여 파일 이름을 workdir (현재 디렉토리 -d 옵션이 설정되지 않은 경우 현재 디렉토리)에서 검색합니다. 이 변수들은 입력 섹션에 있습니다.

따라서 두 개의 fq1/2_ID를 제거하면 문제를 검색하는 모든 파일이 지워집니다.

휴고

관련 문제