Python Snakemake-如何将输入文件的每一行用作通配符
我对使用Snakemake非常陌生,我已经环顾四周,看看下面是否有解决方案-我几乎非常接近解决方案,但还没有 我有一个包含SRA id列表的单列文件,我想使用snakemake定义我的规则,以便该文件中的每个SRA id都成为命令行上的一个参数Python Snakemake-如何将输入文件的每一行用作通配符,python,snakemake,Python,Snakemake,我对使用Snakemake非常陌生,我已经环顾四周,看看下面是否有解决方案-我几乎非常接近解决方案,但还没有 我有一个包含SRA id列表的单列文件,我想使用snakemake定义我的规则,以便该文件中的每个SRA id都成为命令行上的一个参数 #FileName = Samples.txt Samples SRR5597645 SRR5597646 SRR5597647 蛇形档案如下: from pathlib import Path shell.executable("bash") imp
#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'
下载_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文件中的每个记录,我想要并行fastq dump命令运行。因为Samples.txt中有3条记录,所以我希望执行这3条命令
parallel-fastq-dump --sra-id SRR5597645 --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'
提前感谢第一个解决方案是使用规则的
运行:
部分,而不是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}\u 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\u sample
下载单个样本,Snakemake工作流完成其余工作:它构建依赖关系图,并为每个样本创建规则download\u sample
的一个实例。此外,如果您希望它可以并行运行这些规则。在我看来,您需要的是使用通配符
对象访问示例
通配符:
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 "
非常感谢你。你的解决方案有道理,但我有个错误<代码>输入文件中的通配符无法从输出文件中确定:'sample'另外,为了澄清,如果我的输入文件
Samples.txt
中有sample\u a
和sample\u b
这两行,那么{input\u file}中的每一行都是shell中用于澄清的单独命令,然后将有两个不同的shell命令:parallel fastq dump--sra id sample_a…..
parallel fastq dump--sra id sample_b…..
我为您提供了两个解决方案,哪一个会产生错误?请更新您的问题。解决方案2会产生错误(我需要类似于解决方案2的东西,因为我打算并行运行它)。我在这个SO问题中也看到了类似的问题,但似乎没有得到回答:@user10101904,请给出产生错误的代码的完整示例。我已经用代码和错误更新了我的原始问题。感谢您的帮助,规则的输入部分必须引用文件(或在用相应值替换通配符后可以引用文件的模式)。Snakemake需要它,因为它根据规则所需的文件(input
section)和生成的文件(output
section)连接规则。SRA id不能属于输入
部分,因为它不是文件。它可能在参数部分,但这里似乎不需要它,因为SRA id只对应于{sample}
通配符,您可以在shell
部分直接使用它(请参见@dariober的答案)。谢谢@dariober-您的解决方案成功了
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 "
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 "