好的,我一整天都在努力解决这个问题,无济于事......我正在下载和分析RNA测序数据,我的分析结合了两种口味的公共数据集:结束读取和配对末端读取。实质上,我的工作流开始处理的每个原始文件可以是名为{sample}.fastq.gz
的单个文件,也可以是分别名为{sample}_1.fastq.gz
和{sample}_2.fastq.gz
的两个文件。
我在元数据文件中包含了所有示例及其读取布局(以及其他一些信息),我将pandas解析为数据帧。我需要能够为我的脚本提供参数(这里简单地抽象为touch {output}
),以便它们根据读取布局执行它们的功能(它们都是使用命令行软件的所有bash脚本,如{{1}和sratools
)。我想要实现的是以下STAR
伪代码:
snakemake
在迄今为止我尝试的所有代码变体中,我要么创建不明确的规则,要为配对端ID创建单端读取(反之亦然),否则它们都会失败。我提出了两个非常不令人满意的解决方案:
# 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}'
/ 'single'
,只需一个工作流即可分隔阅读布局(即 'paired'
等。 )第一个是不能令人满意的,因为用户必须启动两个不同的工作流,第二个是因为它增加了输出数据中不存在的输入数据抽象级别(因为输出single/{sample}.bam
- 创建了文件无论通过子脚本中的选项输入读取布局如何。
对于如何实现这一目标,有人有更好的想法吗?在我很乐意详细阐述之后,如果我不知道该怎么做。
答案 0 :(得分:0)
您可以使用function as input:
def align_input(wildcards):
# Check if wildcards.sample is paired end or single end
# If single end, return '{sample}.fastq.gz'.format(wildcards.sample)
# Else, return '{sample}_1.fastq.gz'.format(wildcards.sample) and
# '{sample}_2.fastq.gz'.format(wildcards.sample) as list
rule align:
input: align_input
output: '{sample}.bam'
shell: ...
有一点是您已将对齐规则写入,其中输入列出了所有样本的每个fastq文件。您希望编写规则,以便输入具有仅针对单个样本的fastq文件,以及用于对齐该单个样本的命令。通配符{sample}表示它将为您拥有的所有样本应用该规则,一次一个。您可能应该使用下载规则执行类似操作。
另一个解决方案是预先下载工作流程之外的所有文件,然后您可以使用两个单独的对齐规则:
rule align_se:
input: '{sample}.fastq.gz'
output: '{sample}.bam'
rule align_pe:
input: '{sample}_1.fastq.gz', '{sample}_2.fastq.gz'
output: '{sample}.bam'
由于fastq文件已经存在,所以snakemake会看到每个样本只能应用其中一个规则,因为其他规则缺少输入文件,并且没有规则可以创建它们。