2017-10-20 136 views
0

好吧,我一直试图整天解决这个问题,但无济于事......我正在下载和分析RNA测序数据,并且我的分析结合了公共数据集有两种形式:单端读取和双端读取。从本质上说,每个原始文件,我的工作流程开始工作就可以是一个单独的文件名为{sample}.fastq.gz两个文件,分别命名为{sample}_1.fastq.gz{sample}_2.fastq.gzSnakemake:将具有不同后缀的输入合并为相同后缀输出

我有一个元数据文件中的所有样品及其读取布局(以及其他一些信息),我与大熊猫成数据帧解析。我需要能够以给的参数在我的脚本(这里简单地抽象为touch {output})为他们视读布局(它们是使用命令行软件,如sratoolsSTAR所有的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(反之亦然)或者全部失败。我想出了两个非常不理想的解决方案:

  1. 有两个完全不同的工作流程,一个对末端配对的单端输入和其他工作,需要用户手动启动这两个
  2. 有无单个工作流,它通过添加前缀'single'/'paired'为在工作流程中的每一个文件分开的读布局(即single/{sample}.bam等)

首先是不令人满意的,因为用户必须启动两个不同的工作流程,和T他第二个是因为它增加了输出数据抽象层次,而输出数据抽象层次不存在于输出数据中(因为输出.bam-文件是通过子脚本中的选项输入读取布局而创建的)。

是否有人有更好的想法就如何实现这一目标?如果我不清楚自己在做什么之后会很乐意详细说明。

回答

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文件(S),和命令,以使该单个样本。通配符{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将每个样本见只有一条规则可以适用,因为输入文件丢失的其他规则,它没有规则来创建它们。

+0

好的,这对'align'规则很好,但是'download'呢?我可以使用类似的功能并创建所需的文件,但由于我只能使用函数进行输入,因此在下载完成之前文件不存在。如果我可以使用一个函数作为输出它会没事的......任何方式解决这个问题?(我不能只使用'expand()',因为即使在'download'规则中我需要访问'params'的通配符)。 – Sajber

+0

有两个下载规则,一个适用于pe,应该工作。 – Colin

+0

您的意思是?我试着为每个规则制作两个单独的规则(使用'expand'为每个规则创建输入文件),但是我无法成功地将它们合并到对齐规则中;当使用通配符“{sample}”时,它会尝试为两个读取布局查找两种类型的fastq文件,而不是将它们分开。 – Sajber