gpt4 book ai didi

python - 无法让这个正则表达式在 snakemake 中为 wildcard_constraints 工作

转载 作者:太空宇宙 更新时间:2023-11-04 09:53:34 25 4
gpt4 key购买 nike

我有一个用 Snakemake 编写的工作流程,用于分析生物测序数据。工作流程期望所有数据文件都经过组织,以便每个原始读取文件都以检测类型(RNASeq、DNaseSeq 等)开头,并且在工作流程生成的所有文件中都保持这种文件名约定。

我有一个规则来比对来自除 RNASeq 之外的每个分析的数据的读取,还有一个不同的规则应该只应用于 RNASeq 数据。我在设置这些规则时遇到了麻烦,以便 snakemake 知道对哪些文件使用哪个规则。

在 RNASeq 规则中,我有这个:

wildcard_constraints: library='RNASeq_.+'

这可以确保 RNASeq 文库使用该规则。不过,我仍然收到关于其他检测的模糊规则的错误,所以我认为我需要在其他规则中限制通配符。我试过这个:

wildcard_constraints: library='(!?RNASeq)_.+'

说匹配任何没有 RNASeq 的东西,但是如果我在 python 解释器中尝试它,虽然这有效,但 snakemake 似乎无法将任何东西与这个正则表达式匹配。我尝试过其他方式,例如“[^R][^N][^A]”,但无法正常工作。

由于这些正则表达式在我针对字符串手动尝试时有效,我认为 snakemake 如何应用正则表达式存在错误,或者我不了解 snakemake 如何使用它们。我假设它只是“如果此正则表达式匹配通配符字符串,则使用此规则。如果不匹配,则不要使用此规则。”

最佳答案

我相信以下说明了您要实现的目标:

# Snakefile

rule sam_startswith_dna:
output: '{pattern}.sam'
wildcard_constraints: pattern='dna.+'
shell: 'touch {output}'

rule sam_not_startswith_dna:
output: '{pattern}.sam'
wildcard_constraints: pattern='(?!dna).+' # negative lookahead assertion
shell: 'touch {output}'

rule bam_endswith_rna:
output: '{pattern}.bam'
wildcard_constraints: pattern='.+rna'
shell: 'touch {output}'

rule bam_not_endswith_rna:
output: '{pattern}.bam'
wildcard_constraints: pattern='.+(?<!rna)' # negative lookbehind assertion
shell: 'touch {output}'

使用它(snakemake 4.6.0,python 3.6):

$ snakemake -n dna_sample.sam   # runs rule: sam_startswith_sam

$ snakemake -n sample.sam # runs rule: sam_not_startswith_sam
$ snakemake -n sample_dna.sam # runs rule: sam_not_startswith_sam

$ snakeamke -n sample_rna.bam # runs rule: bam_endswith_rna

$ snakemake -n sample.bam # runs rule: bam_not_endswith_rna
$ snakemake -n rna_sample.bam # runs rule: bam_not_endswith_rna

这是我认为您正在做的事情:

# Snakefile2

rule sam_startswith_dna_:
output: '{pattern}.sam'
wildcard_constraints: pattern='dna_.+'
shell: 'touch {output}'

rule sam_not_startswith_dna_:
output: '{pattern}.sam'
wildcard_constraints: pattern='(?!dna)_.+'
shell: 'touch {output}'

使用它:

$ snakemake -s Snakefile2 dna_data.sam  # runs rule: sam_startswith_dna_

$ snakemake -s Snakefile2 rna_data.sam # raises MissingRuleException :( :( :(

这是您可以修复它的方法:

# Snakefile3

rule sam_startswith_dna_:
output: '{pattern}.sam'
wildcard_constraints: pattern='dna_.+'
shell: 'touch {output}'

rule sam_not_startswith_dna_:
output: '{pattern}.sam'
wildcard_constraints: pattern='(?!dna)[^_]{3}_.+'
shell: 'touch {output}'

使用它:

$ snakemake -s Snakefile3 -n dna_data.sam  # runs rule: sam_startswith_dna_

$ snakemake -s Snakefile3 -n rna_data.sam # runs rule: sam_not_startswith_dna_

但是 由于硬编码 {3} 不是很通用:

$ snakemake -s Snakefile3 -n gdna_data.sam  # raises MissingRuleException

以下内容基于我对 snakemake.io.regex 的简要阅读还有一些四处闲逛;可能包含错误

一般来说,给定这样的规则:

rule some_rule:
output: 'some.{pattern}.txt'
wildcard_constraints: pattern='[a-z_]+'
shell: 'touch {output}'

和这样的命令行调用:

$ snakemake some.tar_get.txt

规则some_rule将被执行,如果

re.search('some\.(?P<pattern>[a-z_]+)\.txt$', 'some.tar_get.txt')

返回匹配项(假设其他检查通过(例如歧义、循环 dag 等))。

有趣的是,$附加到模式,但 ^没有前置。

这种行为与我最初的想法不同,我最初的想法是这样的(这将允许在您的 ^ 中使用 $wildcard_constraints):

# python3, pseudo-code-ish

output = 'some.{pattern}.txt'
pattern = '[a-z_]+'

target = 'some.tar_get.txt'

# First test: does the target file name match the output (without the constraint)?
m = re.search('some\.(?P<pattern>.+)\.txt', target)
if not m:
raise MissingInputException

# Second test: does the wildcard satisfy user-supplied constraint?
m = re.search(pattern, m.group('pattern'))
if not m:
raise MissingInputException

run_rule()

关于python - 无法让这个正则表达式在 snakemake 中为 wildcard_constraints 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46856698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com