Snakemake:不同文件位置的通用输入函数

时间:2017-08-17 06:39:05

标签: snakemake

我有两个位置可以存储我的大量数据:/data/work

/data是在质量控制之后将(中间)结果移动到的文件夹。它以只读方式安装给标准用户。 /work是写入新结果的文件夹。显然,它是可写的。

我不想将数据从/data复制或链接到/work

所以我在/work文件夹中运行我的 snakemake ,并希望我的输入函数首先检查/data中是否存在所需文件(并返回绝对值{ {1}} path)如果没有返回/data目录中的相对路径。

/work

这很好但我必须为每个规则定义单独的输入函数,因为文件名不同。是否可以编写通用输入函数,将文件名(例如def in_func(wildcards): file_path = apply_wildcards('{id}/{visit}/{id}_{visit}-file_name_1.txt', wildcards) full_storage_path = os.path.join('/data', file_path) if os.path.isfile(full_storage_path): file_path = full_storage_path return {'myfile': file_path} rule do_something: input: unpack(in_func), params = '{id}/{visit}/{id}_{visit}_params.txt', 和通配符)作为输入?

我也试过像

这样的东西
{id}/{visit}/{id}_{visit}-file_name_1.txt

但是我无法访问def in_func(file_path): full_storage_path = os.path.join('/data', file_path) if os.path.isfile(full_storage_path): file_path = full_storage_path file_path rule do_something: input: myfile = in_func('{id}/{visit}/{id}_{visit}-file_name_1.txt') params = '{id}/{visit}/{id}_{visit}_params.txt', 中的通配符,是吗?

谢谢, 扬

1 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

def handle_storage(pattern):
    def handle_wildcards(wildcards):
        f = pattern.format(**wildcards)
        f_data = os.path.join("/data", f)
        if os.path.exists(f_data):
            return f_data
        return f

    return handle_wildcards


rule do_something:
    input:
        myfile = handle_storage('{id}/{visit}/{id}_{visit}-file_name_1.txt')
        params = '{id}/{visit}/{id}_{visit}_params.txt',

换句话说,函数handle_storage返回一个指向handle_wildcards函数的指针,该函数是为特定模式定制的。一旦知道了通配符值,后者就会被Snakemake自动应用。在该函数内部,我们首先格式化模式,然后检查它是否存在于/data