Snakemake-如何将输入文件的每一行用作通配符

时间:2019-06-11 02:39:29

标签: python snakemake

我对使用Snakemake还是很陌生的,我四处看看是否有以下解决方案-我几乎很接近解决方案,但还没有。

我有一个包含SRA ID列表的单列文件,我想使用snakemake定义规则,以便该文件中的每个SRA ID都成为命令行上的参数。

#FileName = Samples.txt
Samples
SRR5597645
SRR5597646
SRR5597647

下面的蛇文件:

from pathlib import Path
shell.executable("bash")
import pandas as pd
import os
import glob
import shutil

configfile: "config.json"

data_dir=os.getcwd()

units_table = pd.read_table("Samples.txt")
samples= list(units_table.Samples.unique())

#print(samples)

rule all:
    input:
           expand("out/{sample}.fastq.gz",sample=samples)

rule clean:
     shell: "rm -rf .snakemake/"

include: 'rules/download_sample.smk'

download_sample.smk

rule download_sample:
    """
    Download RNA-Seq data from SRA.
    """
    input: "{sample}"
    output: expand("out/{sample}.fastq.gz", sample=samples)
    params:
        outdir = "out",
        threads = 16
    priority:85
    shell: "parallel-fastq-dump --sra-id {input} --threads {params.threads} --outdir {params.outdir}  --gzip "

我尝试了上述代码的许多不同变体,但在某个地方我弄错了。

我想要的是:对于文件Samples.txt中的每个记录,我希望运行parallel-fastq-dump命令。由于我在Samples.txt中有3条记录,所以我希望这3条命令得以执行

parallel-fastq-dump --sra-id SRR5597645 --threads 16 --outdir out --gzip
parallel-fastq-dump --sra-id SRR5597646 --threads 16 --outdir out --gzip
parallel-fastq-dump --sra-id SRR5597647 --threads 16 --outdir out --gzip

这是我得到的错误

snakemake -np
WildcardError in line 1 of rules/download_sample.smk:
Wildcards in input files cannot be determined from output files:
'sample'

预先感谢

2 个答案:

答案 0 :(得分:2)

在我看来,您需要使用sample对象访问wildcards通配符:

rule all:
    input: expand("out/{sample}_fastq.gz", sample=samples)

rule download_sample:
    output: 
        "out/{sample}_fastq.gz"
    params:
        outdir = "out",
        threads = 16
    priority:85
    shell:"parallel-fastq-dump --sra-id {wildcards.sample} --threads {params.threads} --outdir {params.outdir}  --gzip "

答案 1 :(得分:1)

第一个解决方案可能是使用规则的run:部分而不是shell:。这使您可以使用python代码:

rule download_sample:
    # ...
    run:
        for input_file in input:
            shell(f"parallel-fastq-dump --sra-id {input_file} --threads {params.threads} --outdir {params.outdir} --gzip")

但是,这种简单的解决方案不是惯用的。据我所知,输入样本和输出文件之间存在一对一的关系。换句话说,要生成一个out/{sample}_fastq.gz文件,您需要一个{sample}。最好的解决方案是将您的规则减少到只创建一个文件的规则:

rule download_sample:
    input: "{sample}"
    output: "out/{sample}_fastq.gz"
    params:
        outdir = "out",
        threads = 16
    priority:85
    shell: "parallel-fastq-dump --sra-id {input} --threads {params.threads} --outdir {params.outdir} --gzip "

规则all:现在要求所有目标;规则download_sample下载一个样本,其余的工作由Snakemake工作流程完成:它构造了一个依赖关系图,并为每个样本创建了规则download_sample的一个实例。而且,如果您希望它可以并行运行这些规则。