嗨,我是Snakemake的新手,有一个问题。我想对多个数据集运行一个工具。一个数据集代表一个组织,并且每个组织都存在fastq文件,这些文件存储在各自的组织目录中。这些工具的大致命令是:
python TEcount.py -rosette rosettefile -TE te_references -count result/tissue/output.csv -RNA <LIST OF FASTQ FILE FOR THE RESPECTIVE SAMPLE>
组织应为通配符。我怎样才能做到这一点?下面是我第一次尝试无效的方法。
import os
#collect data sets
SAMPLES=os.listdir("data/rnaseq/")
rule all:
input:
expand("results/{sample}/TEtools.{sample}.output.csv", sample=SAMPLES)
rule run_TEtools:
input:
TEcount='scripts/TEtools/TEcount.py',
rosette='data/prepared_data/rosette/rosette',
te_references='data/prepared_data/references/all_TE_instances.fa'
params:
#collect the fastq files in the tissue directory
fastq_files = os.listdir("data/rnaseq/{sample}")
output:
'results/{sample}/TEtools.{sample}.output.csv'
shell:
'python {input.TEcount} -rosette {input.rosette} -TE
{input.te_references} -count {output} -RNA {params.fastq_files}'
在规则run_TEtools中,它不知道{sample}是什么。
答案 0 :(得分:1)
snakemake通配符可以是任何东西。基本上只是一个字符串。
尝试实现所需目标的方式存在一些问题。
好的,这就是我要怎么做。解释如下:
import os
#collect data sets
# Beware no other directories or files (than those containing fastqs) should be in that folder
SAMPLES=os.listdir("data/rnaseq/")
def getFastqFilesForTissu(wildcards):
fastqs = list()
# Beware no other files than fastqs should be there
for s in os.listdir("data/rnaseq/"+wildcards.sample):
fastqs.append(os.path.join("data/rnaseq",wildcards.sample,s))
return fastqs
rule all:
input:
expand("results/{sample}/TEtools.{sample}.output.csv", sample=SAMPLES)
rule run_TEtools:
input:
TEcount='scripts/TEtools/TEcount.py',
rosette='data/prepared_data/rosette/rosette',
te_references='data/prepared_data/references/all_TE_instances.fa',
fastq_files = getFastqFilesForTissu
output:
'results/{sample}/TEtools.{sample}.output.csv'
shell:
'python {input.TEcount} -rosette {input.rosette} -TE {input.te_references} -count {output} -RNA {input.fastq_files}'
首先,应该将fastq文件定义为输入,以使snakemake知道它们是文件,并且如果更改了文件,则必须重新运行规则。将输入文件定义为params
是非常糟糕的做法。 params
用于参数,通常不用于文件。
其次,将脚本文件定义为输入。您必须知道,每次修改时,规则都会重新运行。也许这就是您想要的。
我将使用定义的函数来获取每个目录中的fastq文件。如果要使用功能(例如os.listdir()
),则不能直接使用通配符。您必须将其作为python对象注入到函数中。您可以定义一个将采用一个参数的函数,一个包含所有通配符的通配符对象,或者使用lambda关键字(例如:input = lamdba wildcards: myFuntion(wildcards.sample)
)。
您遇到的另一个问题是os.listdir()
返回的文件列表中没有相对路径。还要注意,os.listdir()
将返回fastq文件的顺序是未知的。也许这对您的命令无关紧要。