好吧,我一整天都在想办法解决这个问题,但没用。。。我正在下载和分析RNA测序数据,我的分析包含了两种风格的公共数据集:单端读取和成对末端读取。本质上,我的工作流开始处理的每个原始文件可以是一个名为{sample}.fastq.gz
的文件,也可以是两个分别名为{sample}_1.fastq.gz
和{
我把所有的示例和它们的读取布局(以及一些其他信息)放在一个元数据文件中,我用pandas将其解析为一个数据帧。我需要能够为我的脚本提供参数(这里简单地抽象为touch {output}
),以便它们根据读取布局执行其功能(它们都是bash脚本,使用命令行软件,如sratools
和{snakemake
伪代码:
# Metadata in a pandas dataframe
metadata = data.frame(SAMPLES, LAYOUTS, ...)
# Function for retrieving metadata
def get_metadata(sample, column):
result = metadata.loc[metadata['sample'] == sample][column].values[0]
return result
# Rules
rule all:
input:
expand('{sample}.bam', sample = SAMPLES)
rule: download:
output:
'{sample}.fastq.gz' for 'SINGLE' in metadata[LAYOUT],
'{sample}_1.fastq.gz' for 'PAIRED' in metadata[LAYOUT]
params:
layout = lambda wildcards:
get_metadata(wildcards.sample, layout_col)
shell:
'touch {output}'
rule align:
input:
'{sample}.fastq.gz' for 'SINGLE' in metadata[LAYOUT],
'{sample}_1.fastq.gz' for 'PAIRED' in metadata[LAYOUT]
params:
layout = lambda wildcards:
get_metadata(wildcards.sample, layout_col)
output:
'{sample}.bam'
shell:
'touch {output}'
或者只创建一个或多个ID的所有代码都失效(反之亦然)。我提出了两个非常令人不满意的解决方案:
'single'
/'paired'
(即single/{sample}.bam
等)来分隔读布局第一个不能令人满意是因为用户必须启动两个不同的工作流,第二个是因为它添加了输出数据中不存在的输入数据抽象级别(因为输出.bam
-文件是创建的,而不考虑我在子脚本中的输入读取布局选项)。在
作为一个有人怎样才能更好地实现这一点?如果不清楚我想要什么,我很乐意详细说明。在
您可以使用function as input:
一件事是,您编写了align规则,其中输入列出了所有示例的每个fastq文件。您需要编写规则,以便输入只有一个样本的fastq文件,以及对齐该单一样本的命令。通配符{sample}表示它将对您拥有的所有示例应用该规则,一次一个。你应该对你的下载规则做一些类似的事情。在
另一种解决方案是在工作流之外预先下载所有文件,然后可以使用两个单独的对齐规则:
^{pr2}$由于fastq文件已经存在,snakemake将看到每个示例只能应用其中一个规则,因为另一个规则缺少输入文件,并且没有创建规则。在
相关问题 更多 >
编程相关推荐