0

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

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

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

所以我从文件夹中运行我的snakemake/work ,并希望我的输入函数首先检查所需的文件是否存在/data(并返回绝对/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',

但是我无法访问 中的通配符in_func(),对吗?

谢谢,扬

4

1 回答 1

2

你可以使用这样的东西:

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.

于 2017-08-18T06:35:42.610 回答