初始工作流程
我有一个可以从配对端数据生成一些输出的蛇文件。
在这个蛇文件中,我有一个规则,即“安装”给定存储在配置文件 ( get_raw_data
) 中的信息的数据。
然后我有一个规则,它使用该数据生成工作流的其余部分所依赖的中间文件(run_tophat
)。
以下是这些规则的输入和输出(OPJ
代表os.path.join
):
rule get_raw_data:
output:
OPJ(raw_data_dir, "{lib}_1.fastq.gz"),
OPJ(raw_data_dir, "{lib}_2.fastq.gz"),
(稍后将详细介绍此规则的实施)
rule run_tophat:
input:
transcriptome = OPJ(annot_dir, "dmel-all-r5.9.gff"),
fq1 = OPJ(raw_data_dir, "{lib}_1.fastq.gz"),
fq2 = OPJ(raw_data_dir, "{lib}_2.fastq.gz"),
output:
junctions = OPJ(output_dir, "{lib}", "junctions.bed"),
bam = OPJ(output_dir, "{lib}", "accepted_hits.bam"),
而且(简化)我的主要规则是这样的:
rule all:
input:
expand(OPJ(output_dir, "{lib}", "junctions.bed"), lib=LIBS),
将工作流程扩展到单端数据
我现在必须在单端数据上运行我的工作流程。
我想避免最终输出具有不同的名称模式,具体取决于数据是单端还是成对端。
我可以轻松地对上述两条规则进行变体,这些规则应该适用于单端数据(get_raw_data_single_end
和run_tophat_single_end
),其输入和输出如下:
rule get_raw_data_single_end:
output:
OPJ(raw_data_dir, "{lib}.fastq.gz")
rule run_tophat_single_end:
input:
transcriptome = OPJ(annot_dir, "dmel-all-r5.9.gff"),
fq = OPJ(raw_data_dir, "{lib}.fastq.gz"),
output:
junctions = OPJ(output_dir, "{lib}", "junctions.bed"),
bam = OPJ(output_dir, "{lib}", "accepted_hits.bam"),
如何为snakemake 提供足够的信息来选择正确的规则路径?
配置文件包含有关lib
通配符是否以以下方式与单端或双端数据相关联的信息: 库名称是 alib2raw
或lib2raw_single_end
字典中的键(两个字典都从配置文件中读取)。
我不希望相同的库名称成为两个字典中的键。因此,从某种意义上说,我希望工作流的单端或双端分支被执行,这并不模棱两可。
两者都使用一个函数lib2data
(使用这些字典)来确定运行什么 shell 命令来“安装”数据。get_raw_data
get_raw_data_single_end
这是此函数的简化版本(实际包含一个额外的分支,用于从 SRR 标识符生成数据命令):
def lib2data(wildcards):
lib = wildcards.lib
if lib in lib2raw:
raw = lib2raw[lib]
link_1 = "ln -s %s %s_1.fastq.gz" % (raw.format(mate="1"), lib)
link_2 = "ln -s %s %s_2.fastq.gz" % (raw.format(mate="2"), lib)
return "%s\n%s\n" % (link_1, link_2)
elif lib in lib2raw_single_end:
raw = lib2raw_single_end[lib]
return "ln -s %s %s.fastq.gz\n" % (raw, lib)
else:
raise ValueError("Procedure to get raw data for %s unknown." % lib)
除了它们的输出之外,这两个get_raw_data*
规则是相同的,并且工作方式如下:
params:
shell_command = lib2data,
shell:
"""
(
cd {raw_data_dir}
{params.shell_command}
)
"""
给定未在规则输入和输出中编码但仅在配置文件和函数中编码的信息,snakemake 是否能够确定正确的规则路径?
似乎并非如此。事实上,我正在尝试测试我的新蛇文件(添加*_single_end
规则),但是 a.KeyError
发生在规则执行期间get_raw_data
,而正在执行规则的库与单端数据相关联
如何实现所需的行为(能够使用配置中的信息选择正确分支的两个分支工作流)?
编辑:这KeyError
是由于错误lib2data
使用正确的字典获取与库名称关联的数据后,我最终遇到以下错误:
AmbiguousRuleException:
Rules run_tophat and run_tophat_single_end are ambiguous for the file tophat_junction_discovery_revision_supplement/HWT3/junctions.bed.
Expected input files:
run_tophat: ./HWT3_1.fastq.gz ./HWT3_2.fastq.gz Annotations/dmel-all-r5.9.gff
run_tophat_single_end: ./HWT3.fastq.gz Annotations/dmel-all-r5.9.gff
编辑 2:向get_raw_data*
规则添加输入
在阅读了蛇形邮件列表上的这篇文章后,我尝试在我的规则中添加一些输入以避免歧义。
def lib2data_input(wildcards):
lib = wildcards.lib
if lib in lib2raw:
raw = lib2raw[lib]
return [raw.format(mate="1"), raw.format(mate="2")]
elif lib in lib2raw_single_end:
raw = lib2raw_single_end[lib]
return [raw]
else:
raise ValueError("Procedure to get raw data for %s unknown." % lib)
rule get_raw_data:
input:
lib2data_input
# [same output, params and shell as before]
# [same modification for the single-end case]
这导致一个(无法重现这个,现在这导致:)MissingInputException
. 奇怪的是,据报道丢失的文件确实存在。这个技巧应该起作用吗?
AmbiguousRuleException:
Rules run_tophat_single_end and run_tophat are ambiguous for the file tophat_junction_discovery_revision_supplement/HTW2/junctions.bed.
Expected input files:
run_tophat_single_end: ./HTW2.fastq.gz Annotations/dmel-all-r5.9.gff
run_tophat: ./HTW2_1.fastq.gz ./HTW2_2.fastq.gz Annotations/dmel-all-r5.9.gff
我为“数据安装”规则指定输入的方式显然不足以将 snakemake 引导到正确的规则。