Snakemake:将具有不同后缀的输入合并到samesuffix outpu

2024-10-02 12:26:39 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,我一整天都在想办法解决这个问题,但没用。。。我正在下载和分析RNA测序数据,我的分析包含了两种风格的公共数据集:单端读取和成对末端读取。本质上,我的工作流开始处理的每个原始文件可以是一个名为{sample}.fastq.gz的文件,也可以是两个分别名为{sample}_1.fastq.gz和{}的文件。在

我把所有的示例和它们的读取布局(以及一些其他信息)放在一个元数据文件中,我用pandas将其解析为一个数据帧。我需要能够为我的脚本提供参数(这里简单地抽象为touch {output}),以便它们根据读取布局执行其功能(它们都是bash脚本,使用命令行软件,如sratools和{})。我想实现的是以下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等)来分隔读布局

第一个不能令人满意是因为用户必须启动两个不同的工作流,第二个是因为它添加了输出数据中不存在的输入数据抽象级别(因为输出.bam-文件是创建的,而不考虑我在子脚本中的输入读取布局选项)。在

作为一个有人怎样才能更好地实现这一点?如果不清楚我想要什么,我很乐意详细说明。在


Tags: 文件数据samplein脚本foroutput布局
1条回答
网友
1楼 · 发布于 2024-10-02 12:26:39

您可以使用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: ...

一件事是,您编写了align规则,其中输入列出了所有示例的每个fastq文件。您需要编写规则,以便输入只有一个样本的fastq文件,以及对齐该单一样本的命令。通配符{sample}表示它将对您拥有的所有示例应用该规则,一次一个。你应该对你的下载规则做一些类似的事情。在

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

^{pr2}$

由于fastq文件已经存在,snakemake将看到每个示例只能应用其中一个规则,因为另一个规则缺少输入文件,并且没有创建规则。在

相关问题 更多 >

    热门问题