我正在使用snakemake设计RNAseq数据分析管道。虽然我已经做到了这一点,但我想让我的管道尽可能具有适应性,并使其能够在同一次分析中处理单读(SE(数据或成对端(PE(数据,而不是在一次分析SE数据,在另一次分析PE数据。
我的管道应该是这样设计的:
- 数据集下载,提供1个文件(SE数据(或2个文件(PE数据(->
- 特定于1个文件的规则集A 或特定于2个文件的一组规则B-->
- 获取1或2个输入文件并将其合并的规则转换为单个输出-->
- 最后一套规则
注意:A的所有规则都有1个输入和1个输出,B的所有规则有2个输入和2个输出,它们各自的命令看起来像:
- 1输入:
somecommand -i {input} -o {output}
- 2个输入:
somecommand -i1 {input1} -i2 {input2} -o1 {output1} -o2 {output2}
注意2:集合A和B的所有规则除了输入/输出不同之外,都有相同的命令、参数等。。。
换句话说,我希望我的管道能够根据样本在规则集A或规则集B的执行之间切换,要么在开始时在配置文件中为其提供有关样本的信息(样本1是SE,样本2是PE……这是已知的(,要么让snakemake在数据集下载后统计文件数量,为每个样本选择正确的下一组规则。如果你看到了另一种方法,欢迎你告诉我。
我考虑过使用检查点、输入函数和if/else语句,但我还没有设法解决这些问题。
你有什么建议吗;开关";发生
如果你事先知道布局,那么最简单的方法是将其存储在某个变量中,比如这样(或者从配置文件中读取到字典中(:
layouts = {"sample1": "paired", "sample2": "single", ... etc}
然后你可以做的是";合并";你的规则是这样的(我猜你说的是修剪和对齐,所以这是我的例子(:
ruleorder: B > A
rule A:
input:
{sample}.fastq.gz
output:
trimmed_{sample}.fastq.gz
shell:
"somecommand -i {input} -o {output}"
rule B:
input:
input1={sample}_R1.fastq.gz,
input2={sample}_R2.fastq.gz
output:
output1=trimmed_{sample}_R1.fastq.gz,
output2=trimmed_{sample}_R2.fastq.gz
shell:
"somecommand -i1 {input.input1} -i2 {input.input2} -o1 {output.output1} -o2 {output.output2}"
def get_fastqs(wildcards):
output = dict()
if layouts[wildcards.sample] == "single":
output["input"] = "trimmed_sample2.fastq.gz"
elif layouts[wildcards.sample] == "paired":
output["input1"] = "trimmed_sample1_R1.fastq.gz"
output["input2"] = "trimmed_sample1_R2.fastq.gz"
return output
rule alignment:
def input:
unpack(get_fastqs)
def output:
somepath/{sample}.bam
shell:
...
这里发生了很多事情。
- 首先,你需要一个规则顺序,这样snakemake就知道如何处理模棱两可的情况
- 规则A和B都必须存在(除非你对输出文件做了一些不好的事情(
- 对齐规则需要一个输入函数来确定它需要哪个输入
一些自我宣传:我做了一个蛇形管道,它可以做很多事情,包括RNA-seq和在线下载样本,并自动确定它们的布局(单端与成对端(。请看一看,看看它是否能解决您的问题:https://vanheeringen-lab.github.io/seq2science/content/workflows/rna_seq.html
编辑:
- 当你说"合并"规则时,你指的是规则A、B和对齐吗
我的措辞不清楚;合并单端、成对端和成对端逻辑在一起,因此您可以继续使用单个规则(例如,您命名的计数表(。
- 规则顺序:为什么选择B>A.要确保配对样本最终不会在单端规则中运行
没错!当一个规则需要trimmed_sample1_R1.fastq.gz时,Snakemaker如何知道您的样本名称?样本的名称是sample1,还是sample1_R1?两者都有可能,这让snakemake抱怨它不知道如何解决这个问题。当你添加规则顺序时,你会告诉Snakemake,当它不清楚时,按照这个顺序解决。
- 对齐规则中的命令需要1或2个输入。我打算使用if/else-in-params指令来选择输入。我这样想对吗?(我认为你在计划中也做得很好(
是的,我们就是这样解决的。我们这样做是因为我们希望每个规则都有自己的环境。如果你不使用单独的conda环境进行对齐,那么你可以做得更干净/更漂亮,就像一样
rule alignment:
input:
unpack(get_fastqs)
output:
somepath/{sample}.bam
run:
if layouts[wildcards.sample] == "single":
shell("single-end command")
if layouts[wildcards.sample] == "paired":
shell("paired-end command")
我觉得这个选项比我们在seq2science管道中所做的要清楚得多。然而,在seq2science管道中,我们支持许多不同的对齐器,它们都有不同的conda环境,因此不能使用run
指令。