我是snakemake的新手,我正在使用它将两个管道中的步骤合并为一个更大的管道。几个步骤创建类似命名文件的问题,我找不到限制通配符的方法,所以我在一步上遇到Missing input files for rule
错误,我无法解决。
完整的snakefile很长,可以在这里找到:https://mdd.li/snakefile
相关部分是(下面缺少文件的部分):
wildcard_constraints:
sdir="[^/]+",
name="[^/]+",
prefix="[^/]+"
# Several mapping rules here
rule find_intersecting_snps:
input:
bam="hic_mapping/bowtie_results/bwt2/{sdir}/{prefix}_hg19.bwt2pairs.bam"
params:
hornet=os.path.expanduser(config['hornet']),
snps=config['snps']
output:
"hic_mapping/bowtie_results/bwt2/{sdir}/{prefix}_hg19.bwt2pairs.remap.fq1.gz",
"hic_mapping/bowtie_results/bwt2/{sdir}/{prefix}_hg19.bwt2pairs.remap.fq2.gz",
"hic_mapping/bowtie_results/bwt2/{sdir}/{prefix}_hg19.bwt2pairs.keep.bam",
"hic_mapping/bowtie_results/bwt2/{sdir}/{prefix}_hg19.bwt2pairs.to.remap.bam",
"hic_mapping/bowtie_results/bwt2/{sdir}/{prefix}_hg19.bwt2pairs.to.remap.num.gz"
shell:
dedent(
"""\
python2 {params.hornet}/find_intersecting_snps.py \
-p {input.bam} {params.snps}
"""
)
# Several remapping steps, similar to the first mapping steps, but in a different directory
rule wasp_merge:
input:
"hic_mapping/bowtie_results/bwt2/{sdir}/{prefix}_hg19.bwt2pairs.keep.bam",
"hic_mapping/wasp_results/{sdir}_{prefix}_filt_hg19.remap.kept.bam"
output:
"hic_mapping/wasp_results/{sdir}_{prefix}_filt_hg19.bwt2pairs.filt.bam"
params:
threads=config['job_cores']
shell:
dedent(
"""\
{module}
module load samtools
samtools merge --threads {params.threads} {output} {input}
"""
)
# All future steps use the name style wildcard, like below
rule move_results:
input:
"hic_mapping/wasp_results/{name}_filt_hg19.bwt2pairs.filt.bam"
output:
"hic_mapping/wasp_results/{name}_filt_hg19.bwt2pairs.bam"
shell:
dedent(
"""\
mv {input} {output}
"""
)
这个管道实际上是在一个目录结构中执行一些映射步骤,看起来像hic_mapping/bowtie_results/bwt2/<subdir>/<file>
,(其中subdir是三个不同的目录)然后过滤结果,并在hic_remap/bowtie_results/bwt2/<subdir>/<file>
中执行另一个几乎相同的映射步骤,在将结果合并到一个全新的目录并将子目录折叠到文件名中之前:hic_mapping/wasp_results/<subdir>_<file>
。
我遇到的问题是wasp_merge
步骤会破坏find_intersecting_snps
步骤如果我将子目录名称折叠到文件名中。如果我只是维护子目录结构,一切正常。这样做会破坏管道的未来步骤。
我得到的错误是:
MissingInputException in line 243 of /godot/quertermous/PooledHiChip/pipeline/Snakefile:
Missing input files for rule find_intersecting_snps:
hic_mapping/bowtie_results/bwt2/HCASMC5-8_HCASMC-8-CAGAGAGG-TACTCCTT_S8_L006/001_hg19.bwt2pairs.bam
正确的文件是:
hic_mapping/bowtie_results/bwt2/HCASMC5-8/HCASMC-8-CAGAGAGG-TACTCCTT_S8_L006_001_hg19.bwt2pairs.bam
但它正在寻找:
hic_mapping/bowtie_results/bwt2/HCASMC5-8_HCASMC-8-CAGAGAGG-TACTCCTT_S8_L006/001_hg19.bwt2pairs.bam
不是在任何地方创建的,也不是由任何规则定义的。我认为它在某种程度上被wasp_merge
步骤创建的文件的存在所困惑:
hic_mapping/wasp_results/HCASMC5-8_HCASMC-8-CAGAGAGG-TACTCCTT_S8_L006_001_filt_hg19.bwt2pairs.filt.bam
或者可能是下游文件(在创建此错误的目标之后):
hic_mapping/wasp_results/HCASMC5-8_HCASMC-8-CAGAGAGG-TACTCCTT_S8_L006_001_filt_hg19.bwt2pairs.bam
但是,我不知道为什么这些文件会混淆find_intersecting_snps
规则,因为目录结构完全不同。
我觉得我必须遗漏一些明显的东西,因为这个错误是如此荒谬,但我无法弄清楚它是什么。
答案 0 :(得分:0)
问题是目录名和文件名都包含下划线,在最终文件名中,我用下划线分隔两个组件。
通过更改分隔字符,或者用从其他地方获取名称的python函数替换规则,我可以解决问题。
这有效:
rule wasp_merge:
input:
"hic_mapping/bowtie_results/bwt2/{sdir}/{prefix}_hg19.bwt2pairs.keep.bam",
"hic_mapping/wasp_results/{sdir}{prefix}_filt_hg19.remap.kept.bam"
output:
"hic_mapping/wasp_results/{sdir}{prefix}_filt_hg19.bwt2pairs.filt.bam"
params:
threads=config['job_cores']
shell:
dedent(
"""\
{module}
module load samtools
samtools merge --threads {params.threads} {output} {input}
"""
)