Snakemake分组输出

问题描述 投票:0回答:1

我对我的一条规则的output有一个相当复杂的要求。 我在CSV文件(samples.csv)中有样本,嵌套信息如下:

region,run_id,sample_id
A,1,150
A,3,111
A,3,145
A,3,153
B,4,105
B,4,107

我将它们存储在我的Snakefile中作为熊猫数据帧。

samples = pd.read_csv("samples.csv").set_index(
    ["region", "run_id", "sample_id"], drop=False
)

我有一个规则demultiplex,它接受一个fastq文件,它是sample_idrun_id的所有region读取的组合

rule demultiplex:
    input:
        "analysis/{region}/{run}/basecalled.fastq"

这个解复用规则的作用是接受这个组合的fastq文件,并为该sample_id中的每个run_id(条形码)返回一个fastq文件。

所以我在这里努力的是如何让output映射到input

我在运行示例中实际需要的是demultiplex规则为每个有效(regionrun_id)对执行一次,但生成多个文件。所以所需的分组将是这样的:

input:
    "analysis/A/1/basecalled.fastq"
output:
    ["analysis/A/1/demultiplex/150.fastq"]

input:
    "analysis/A/3/basecalled.fastq"
output:
    ["analysis/A/3/demultiplex/111.fastq", 
     "analysis/A/3/demultiplex/145.fastq", 
     "analysis/A/3/demultiplex/153.fastq"]

input:
    "analysis/B/4/basecalled.fastq"
output:
    ["analysis/B/4/demultiplex/105.fastq", 
     "analysis/B/4/demultiplex/107.fastq"]

因此,本例中的规则demultiplex将运行3次。

snakemake
1个回答
0
投票

解决方案可以是触摸需要解复用的每个fastq文件的文件。在下面的代码中,假设可以从样本表中的信息重建主fastq文件的路径(如果我理解正确,应该是这种情况):

import pandas as pd

samples = pd.read_csv("samples.csv").set_index(
    ["region", "run_id", "sample_id"], drop=False
)

fastq= samples[['region', 'run_id']].drop_duplicates()

rule all:
    input:
        expand('analysis/{region}/{run}/demultiplex/demux.done', zip, \
            region= list(fastq['region']), run= list(fastq['run_id']))

rule demultiplex:
    input:
        "analysis/{region}/{run}/basecalled.fastq",
    output:
        touch('analysis/{region}/{run}/demultiplex/demux.done'),
    shell:
        r"""    
        demux {input} 
        """
© www.soinside.com 2019 - 2024. All rights reserved.