我想定义从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(它可以工作,但是没有在每个文件上调用该规则)。
任何帮助将不胜感激。
答案 0 :(得分:1)
Snakemake通过定义所需的输出来工作(就像在rule all
中所做的那样)。您非常接近可行的解决方案,但是有些小问题出了错:
rule all
中的扩展无法正常工作。这应该适用于您的示例:
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
中的描述是最容易的。现在,我们必须做一些奇怪的魔术才能从文件中获取样品名称,最好将样品名称存储在其中。