好吧,我一直试图整天解决这个问题,但无济于事......我正在下载和分析RNA测序数据,并且我的分析结合了公共数据集有两种形式:单端读取和双端读取。从本质上说,每个原始文件,我的工作流程开始工作就可以是一个单独的文件名为{sample}.fastq.gz
两个文件,分别命名为{sample}_1.fastq.gz
和{sample}_2.fastq.gz
。Snakemake:将具有不同后缀的输入合并为相同后缀输出
我有一个元数据文件中的所有样品及其读取布局(以及其他一些信息),我与大熊猫成数据帧解析。我需要能够以给的参数在我的脚本(这里简单地抽象为touch {output}
)为他们视读布局(它们是使用命令行软件,如sratools
和STAR
所有的bash脚本)执行其功能。我想实现的是沿着以下snakemake
伪的东西:
# Metadata in a pandas dataframe
metadata = data.frame(SAMPLES, LAYOUTS, ...)
# Function for retrieving metadata
def get_metadata(sample, column):
result = metadata.loc[metadata['sample'] == sample][column].values[0]
return result
# Rules
rule all:
input:
expand('{sample}.bam', sample = SAMPLES)
rule: download:
output:
'{sample}.fastq.gz' for 'SINGLE' in metadata[LAYOUT],
'{sample}_1.fastq.gz' for 'PAIRED' in metadata[LAYOUT]
params:
layout = lambda wildcards:
get_metadata(wildcards.sample, layout_col)
shell:
'touch {output}'
rule align:
input:
'{sample}.fastq.gz' for 'SINGLE' in metadata[LAYOUT],
'{sample}_1.fastq.gz' for 'PAIRED' in metadata[LAYOUT]
params:
layout = lambda wildcards:
get_metadata(wildcards.sample, layout_col)
output:
'{sample}.bam'
shell:
'touch {output}'
在我试图到目前为止,我可以创建暧昧规则,所有代码的变化,创造单端读取双端的ID(反之亦然)或者全部失败。我想出了两个非常不理想的解决方案:
- 有两个完全不同的工作流程,一个对末端配对的单端输入和其他工作,需要用户手动启动这两个
- 有无单个工作流,它通过添加前缀
'single'
/'paired'
为在工作流程中的每一个文件分开的读布局(即single/{sample}.bam
等)
首先是不令人满意的,因为用户必须启动两个不同的工作流程,和T他第二个是因为它增加了输出数据抽象层次,而输出数据抽象层次不存在于输出数据中(因为输出.bam
-文件是通过子脚本中的选项输入读取布局而创建的)。
是否有人有更好的想法就如何实现这一目标?如果我不清楚自己在做什么之后会很乐意详细说明。
好的,这对'align'规则很好,但是'download'呢?我可以使用类似的功能并创建所需的文件,但由于我只能使用函数进行输入,因此在下载完成之前文件不存在。如果我可以使用一个函数作为输出它会没事的......任何方式解决这个问题?(我不能只使用'expand()',因为即使在'download'规则中我需要访问'params'的通配符)。 – Sajber
有两个下载规则,一个适用于pe,应该工作。 – Colin
您的意思是?我试着为每个规则制作两个单独的规则(使用'expand'为每个规则创建输入文件),但是我无法成功地将它们合并到对齐规则中;当使用通配符“{sample}”时,它会尝试为两个读取布局查找两种类型的fastq文件,而不是将它们分开。 – Sajber