2017-08-17 94 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

相關問題