代码之家  ›  专栏  ›  技术社区  ›  Jan Schreiber

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

  •  0
  • Jan Schreiber  · 技术社区  · 7 年前

    我有两个地方可以存储我的海量数据: /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() 是吗?

    谢谢

    1 回复  |  直到 7 年前
        1
  •  2
  •   Johannes Köster    7 年前

    你可以用这样的东西:

    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\u storage返回一个指针,指向为特定模式定制的handle\u通配符函数。一旦通配符值已知,Snakemake就会自动应用后者。在该函数中,我们首先格式化模式,然后检查它是否存在于 /data .