我遇到的情况是程序的输出文件名不一致,因此很难定义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。
先谢谢大家。
答案 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!')