从CSV定义输入文件

时间:2019-11-19 11:00:34

标签: snakemake

我想定义从csv提取的不同变量的输入文件名。我建立了以下简化示例:

我有一个文件test.csv:

data/samples/A.fastq
data/samples/B.fastq

我在json配置文件中给出了test.csv的路径:

{
  "samples": {
    "summaryFile": "somepath/test.csv"
  }
} 

现在,我想在规则内的每个文件上运行bwa。我的感觉是我必须使用lambda通配符,但是我不确定。我的Snakefile看起来像这样:

#only for bcf_tools

import pandas

input_table = config["samples"]["summaryFile"]
samplesData = pandas.read_csv(input_table)


def returnSamples(table):
  # Have tried different things here but nothing worked
  return table


rule all:
    input:
        expand("mapped_reads/{sample}.bam", sample= samplesData)

rule bwa_map:
    input:
        "data/genome.fa",
        lambda wildcards: returnSamples(wildcards.sample)
    output:
        "mapped_reads/{sample}.bam"
    shell:
        "bwa mem {input} | samtools view -Sb - > {output}"

我已经尝试了上百万种方法,包括使用expand(它可以工作,但是没有在每个文件上调用该规则)。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

Snakemake通过定义所需的输出来工作(就像在rule all中所做的那样)。您非常接近可行的解决方案,但是有些小问题出了错:

  • 读取pandas数据框没有达到您的期望(尝试打印samplesData来查看其作用/作用)。因此,rule all中的扩展无法正常工作。
  • 您不需要使用lambda作为输入,可以重复使用通配符。

这应该适用于您的示例:

import pandas
import re

input_table = config["samples"]["summaryFile"]
samplesData = pandas.read_csv(input_table, header=None).loc[:, 0].tolist()
samples = [re.findall("[^/]+\.", sample)[0][:-1] for sample in samplesData]  # overly complicated regex

rule all:
    input:
        expand("mapped_reads/{sample}.bam", sample=samples)

rule bwa_map:
    input:
        "data/genome.fa",
        "data/samples/{sample}.fastq"
    output:
        "mapped_reads/{sample}.bam"
    shell:
        "bwa mem {input} | samtools view -Sb - > {output}"

但是,我认为更改test.csv中的描述是最容易的。现在,我们必须做一些奇怪的魔术才能从文件中获取样品名称,最好将样品名称存储在其中。