我对使用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'
预先感谢
答案 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
的一个实例。而且,如果您希望它可以并行运行这些规则。