Col*_*lin 2 python regex snakemake
我有一个用 Snakemake 编写的工作流程,用于分析生物测序数据。工作流程期望对所有数据文件进行组织,以便每个原始读取文件都以检测类型(RNASeq、DNaseSeq 等)开头,并且在工作流程生成的所有文件中都保持此文件名约定。
我有一个规则来对齐除 RNASeq 之外的每个测定中的数据的读数,以及一个仅应用于 RNASeq 数据的不同规则。我在设置这些规则时遇到了麻烦,以便 Snakemake 知道对哪些文件使用哪些规则。
在 RNASeq 规则中,我有这个:
wildcard_constraints: library='RNASeq_.+'
Run Code Online (Sandbox Code Playgroud)
这可以确保 RNASeq 库使用该规则。不过,我仍然收到有关其他分析的不明确规则的错误,因此我认为我需要限制其他规则中的通配符。我试过这个:
wildcard_constraints: library='(!?RNASeq)_.+'
Run Code Online (Sandbox Code Playgroud)
说匹配任何没有 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}'
Run Code Online (Sandbox Code Playgroud)
使用它(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
Run Code Online (Sandbox Code Playgroud)
这就是我认为你在做的事情:
# 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}'
Run Code Online (Sandbox Code Playgroud)
使用它:
$ snakemake -s Snakefile2 dna_data.sam # runs rule: sam_startswith_dna_
$ snakemake -s Snakefile2 rna_data.sam # raises MissingRuleException :( :( :(
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方法修复它:
# 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}'
Run Code Online (Sandbox Code Playgroud)
使用它:
$ 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_
Run Code Online (Sandbox Code Playgroud)
但由于硬编码,它不是很通用{3}:
$ snakemake -s Snakefile3 -n gdna_data.sam # raises MissingRuleException
Run Code Online (Sandbox Code Playgroud)
以下内容是基于我的简要阅读snakemake.io.regex和一些探索;可能包含错误
一般来说,给出这样的规则:
rule some_rule:
output: 'some.{pattern}.txt'
wildcard_constraints: pattern='[a-z_]+'
shell: 'touch {output}'
Run Code Online (Sandbox Code Playgroud)
和这样的命令行调用:
$ snakemake some.tar_get.txt
Run Code Online (Sandbox Code Playgroud)
该规则some_rule将被执行,如果
re.search('some\.(?P<pattern>[a-z_]+)\.txt$', 'some.tar_get.txt')
Run Code Online (Sandbox Code Playgroud)
返回匹配项(假设其他检查通过(例如歧义、循环 dag 等))。
有趣的是,$被附加到模式中,但^没有前置。
这种行为与我最初的想法不同,我最初的想法是这样的(这将允许在你的 中使用^and ):$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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1624 次 |
| 最近记录: |