2017-08-17 36 views
0

我有两个位置可以存储我的大量数据:/data/workSnakemake:不同文件位置的通用输入函数

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

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

所以我从/work文件夹中运行我snakemake,并希望我的输入功能,首先要检查,如果所需的文件中/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()访问通配符,难道不是吗?

感谢, 扬

回答

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中。

+0

这也解决了我的问题,因为我想将配置字典传递给一个单独的文件中的输入函数。太棒了,谢谢! – mitoRibo

相关问题