1

使用扩展功能时,我正在努力使用正则表达式。出于某种原因,通配符总是作为纯文本而不是执行的正则表达式导入。正则表达式是先作为通配符引入还是与扩展函数相关联都没有区别(请参阅 all_decompress 与 all_decompress2)。错误总是:

Missing input files for rule DECOMPRESS:
Resources/raw/run1_lane1_read[1,2]_index\d+-\d+=[1-9], [11-32].fastq.gz

-

#!/usr/bin/env python3

import re

###### WILDCARDS #####

## General descriptive parameters
read = "[1,2]"
index_prefix = r"\d{3}-\d{3}"
index = r"[1-9], [11-32]"

##### RULES #####

### CONJUNCTION RULES ("all") ###
# PREANALYSIS #
rule all_decompress:
    input:
        expand("Resources/decompressed/read{read}_index{index_prefix}={index}.fastq", read=read, index_prefix=index_prefix, index=index)

rule all_decompress2:
    input:
        expand("Resources/decompressed/read{read}_index{index_prefix}={index}.fastq", read=[1,2], index_prefix=r"\d{3}-\d{3}", index=r"[1-9], [11-32]")

### TASK RULES ###
# PREANALYSIS #

# Decompress .gz zipped raw files
rule DECOMPRESS:
    input:
        "Resources/raw/run1_lane1_read{read}_index{index_prefix}={index}.fastq.gz"
    output:
        "Resources/decompressed/read{read}_index{index_prefix}={index}.fastq"
    shell:
        "gzip -d -c {input} > {output}"
4

3 回答 3

1

你查看过 bl 的链接吗?

具体来说,这部分文档

这是我如何使用它来生成 png、pdf 或两者的简单示例:

rule all:
  input: expand("{graph}.png", graph=["dag", "rulegraph"])

rule dot_to_image:
    input: "{graph}.dot"
    output: "{graph}.{ext,(pdf|png)}"
    shell: "dot -T{wildcards.ext} -o {output} {input}"

希望这可以帮助。

于 2017-03-09T11:37:38.863 回答
1

如果我是对的,Snakemake 中的函数 expand 会生成一个字符串列表。此函数用于文件名,就像您使用它一样。

我不知道扩展函数是否可以与正则表达式相关联以创建列表。

但是您可以在 python 中生成此列表并将其提供给规则 all 或 expand 函数。

在您的情况下,您可以使用以下代码获取并制作文件名列表:

import re
import os

path='.'
listoffiles=[]
for file in os.listdir(path):
  if(re.search('read[1-2]_index\d{3}-\d{3}=[1-9]',file)):
    listoffiles.append(os.path.splitext(file)[0])

然后在 listofiles 你有你所有的文件名,你只需要像这样使用你的扩展:

expand("{repertory}{filename}{extension},
       repertory = "Resources/decompressed/",
       filename = listoffiles,
       extension = ".fastq")

然后一切都应该完美无缺。

请记住,蛇文件中的所有 python 代码将在所有规则和 dag 创建之前的工作流开始时执行。所以它可以很强大。

于 2017-02-21T14:26:56.887 回答
0

我认为在扩展中执行正则表达式可能是不可能的。但是我找到了解决方法。对于其中的两个通配符,我找到了不同的方式来描述它们(“read”和“index”),而对于第三个通配符,我准备了一个函数并将其用作输入。

#!/usr/bin/env python3

import re

###### WILDCARDS #####

## General descriptive parameters
read = (1,2)
index = list(range(1,9)) + list(range(11,32))

## Functions
def getDCinput(wildcards):
    read = wildcards.read
    index = wildcards.index
    path = wd + "Resources/raw/run1_lane1_read" + read + r"_index[0-9]??-[0-9]??=" + sample + ".fastq.gz"
    return(glob.glob(path))

##### RULES #####

### CONJUNCTION RULES ("all") ###
# PREANALYSIS #

rule all_decompress:
    input:
        expand("Resources/decompressed/read{read}_index{index}.fastq", read=read, index=index)

### TASK RULES ###
# FILE PREPARATION AND SMOOTHING #

# Decompress .gz zipped raw files
rule DECOMPRESS:
    input:
        getDCinput
    output:
        "Resources/decompressed/read{read}_index{index}.fastq"
    shell:
        "gzip -d -c {input} > {output}"
于 2017-02-22T13:25:14.883 回答