我对我的一条规则的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_id
中run_id
的所有region
读取的组合
rule demultiplex:
input:
"analysis/{region}/{run}/basecalled.fastq"
这个解复用规则的作用是接受这个组合的fastq文件,并为该sample_id
中的每个run_id
(条形码)返回一个fastq文件。
所以我在这里努力的是如何让output
映射到input
。
我在运行示例中实际需要的是demultiplex
规则为每个有效(region
,run_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次。
解决方案可以是触摸需要解复用的每个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}
"""