Snakemake:将具有不同后缀的输入合并到相同后缀输出

时间:2017-10-20 19:23:10

标签: python snakemake

好的,我一整天都在努力解决这个问题,无济于事......我正在下载和分析RNA测序数据,我的分析结合了两种口味的公共数据集:结束读取和配对末端读取。实质上,我的工作流开始处理的每个原始文件可以是名为{sample}.fastq.gz的单个文件,也可以是分别名为{sample}_1.fastq.gz{sample}_2.fastq.gz的两个文件。

我在元数据文件中包含了所有示例及其读取布局(以及其他一些信息),我将pandas解析为数据帧。我需要能够为我的脚本提供参数(这里简单地抽象为touch {output}),以便它们根据读取布局执行它们的功能(它们都是使用命令行软件的所有bash脚本,如{{1}和sratools)。我想要实现的是以下STAR伪代码:

snakemake

在迄今为止我尝试的所有代码变体中,我要么创建不明确的规则,要为配对端ID创建单端读取(反之亦然),否则它们都会失败。我提出了两个非常不令人满意的解决方案:

  1. 有两个完全独立的工作流程,一个用于单端输入,另一个用于配对端,需要用户手动启动
  2. 通过为工作流程中的每个文件添加前缀# 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}' / 'single',只需一个工作流即可分隔阅读布局( 'paired'等。 )
  3. 第一个是不能令人满意的,因为用户必须启动两个不同的工作流,第二个是因为它增加了输出数据中不存在的输入数据抽象级别(因为输出single/{sample}.bam - 创建了文件无论通过子脚本中的选项输入读取布局如何。

    对于如何实现这一目标,有人有更好的想法吗?在我很乐意详细阐述之后,如果我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

您可以使用function as input

def align_input(wildcards):
   # Check if wildcards.sample is paired end or single end
   # If single end, return '{sample}.fastq.gz'.format(wildcards.sample)
   # Else, return '{sample}_1.fastq.gz'.format(wildcards.sample) and
   #              '{sample}_2.fastq.gz'.format(wildcards.sample) as list

rule align:
    input: align_input
    output: '{sample}.bam'
    shell: ...

有一点是您已将对齐规则写入,其中输入列出了所有样本的每个fastq文件。您希望编写规则,以便输入具有仅针对单个样本的fastq文件,以及用于对齐该单个样本的命令。通配符{sample}表示它将为您拥有的所有样本应用该规则,一次一个。您可能应该使用下载规则执行类似操作。

另一个解决方案是预先下载工作流程之外的所有文件,然后您可以使用两个单独的对齐规则:

rule align_se:
    input: '{sample}.fastq.gz'
    output: '{sample}.bam'

rule align_pe:
    input: '{sample}_1.fastq.gz', '{sample}_2.fastq.gz'
    output: '{sample}.bam'

由于fastq文件已经存在,所以snakemake会看到每个样本只能应用其中一个规则,因为其他规则缺少输入文件,并且没有规则可以创建它们。