如何使用Snakemake

时间:2019-06-14 13:57:54

标签: bioinformatics snakemake

我遇到的情况是程序的输出文件名不一致,因此很难定义snakemake规则。

我正在从SRA检索数据,我不知道该程序将返回1个文件还是2个文件

这是两种情况:

情况1

Retrieve SE data - this generates 1 output file named SRR5597649_1.fastq.gz

parallel-fastq-dump --sra-id SRR5597649 --threads 16 --outdir out/ --gzip --skip-technical --readids --dumpbase --split-files --clip

情况2

Retrieve PE data - this generates 2 output files SRR390728_1.fastq.gz  SRR390728_2.fastq.gz

parallel-fastq-dump --sra-id SRR390728 --threads 16 --outdir out/ --gzip --skip-technical --readids --dumpbase --split-files --clip

我想从Snakemake社区中了解他们如何解决上述情况,以及如何定义各个规则以及rule:all

注意 :在尝试@dariober解决方案后,我将向此问题添加更多信息

Snakefile

shell.executable("bash")
import pandas as pd
import glob
import os

configfile: "config.json"

data_dir=os.getcwd()

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

rule all:
    input:
       expand("raw_fastq/{sample}.dump.done", sample=samples),
       expand("results/salmon/{sample}_salmon_quant",sample=samples),
       expand("results/logs/salmon/{sample}.salmon.log",sample=samples)

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

include: 'rules/download_sra.smk'
include: 'rules/salmon_quant.smk'

download_sra.smk

rule download_sra:
    """
    Download RNA-Seq data from SRA.
    """
    output: touch("raw_fastq/{sample}.dump.done"),
    params:
        outdir = "raw_fastq",
        threads = 16
    priority:85
    shell: "parallel-fastq-dump --sra-id {wildcards.sample} ... "

salmon_quant.smk

rule salmon_quant:
     input:
             touchfile = 'raw_fastq/{sample}.dump.done',
             index = config['salmon_rat_gentrome_Index']
     output:
             directory("results/salmon/{sample}_salmon_quant")
     log:
             'results/logs/salmon/{sample}.salmon.log'
     priority: 85
     threads: 20
     run:
        fq= sorted(glob.glob(os.path.join('raw_fastq',  wildcards.sample + '_[12].fastq.gz')))

        if len(fq) == 1:
            shell("salmon quant -i {input.index} -l A  -r %s  ..." % fq) # Process as SE
        elif len(fq) == 2:
            shell("salmon quant -i {input.index} -l A -1 %s -2 %s ...." % (fq[0], fq[1])) # Process as PE
        else:
            raise Exception('Wrong number of fastq files!')

我面临的问题:当我尝试使用“ dariober”建议的解决方案时,运行shell命令时替换%s时似乎出了点问题。例如,它将被替换为

-r ['raw_fastq/SRR5597645_1.fastq.gz']

应将其已替换为

-r raw_fastq/SRR5597645_1.fastq.gz

可能是我在某个地方弄错了-如上面的代码所示,%s引起了方括号和单引号的标记。

此外,我想在download_sra规则中用temp指令将其包裹起来,以便可以在作业完成后自动删除fastq文件和touchfile。

先谢谢大家。

1 个答案:

答案 0 :(得分:2)

一种解决方案可能是在fastq-dump完成后触摸文件,然后将该文件用作其他规则的输入。

在您发布的情况下,可以从SRR id重构实际的fastq文件的名称,并且可以根据后缀_1.fastq.gz_2.fastq.gz来判断您有1个或2个fastq文件。

这是一个例子:

import glob
import os

sra_id= ['SRR1234', 'SRR4567']

rule all:
    input:
        expand('{sra_id}.dump.done', sra_id= sra_id),
        expand('{sra_id}.bam', sra_id= sra_id),

rule sra_dump:
    output:
        touch('{sra_id}.dump.done'),
    shell:
        r"""
        parallel-fastq-dump --sra-id {wildcards.sra_id} ... 
        """

rule align:
    input:
        '{sra_id}.dump.done',
    output:
        '{sra_id}.bam',
    run:
        fq= sorted(glob.glob(os.path.join(wildcards.sra_id, wildcards.sra_id + '_[12].fastq.gz')))

        if len(fq) == 1:
            shell("bwa mem %s ..." % fq) # Process as SE
        elif len(fq) == 2:
            shell("bwa mem %s %s ..." % (fq[0], fq[1])) # Process as PE
        else:
            raise Exception('Wrong number of fastq files!')