Snakemake:不同文件位置的通用输入功能
Snakemake: Generic input function for different file locations
我有两个可以存储大量数据的位置:/data
和 /work
。
/data
是质量控制后(中间)结果移动到的文件夹。对于标准用户,它以只读方式安装。
/work
是写入新结果的文件夹。显然,它是可写的。
我不想将 /data
中的数据或 link 数据复制到 /work
。
所以我 运行 我的 snakemake 来自 /work
文件夹,并希望我的输入功能首先检查 [=] 中是否存在所需的文件12=](和 return 绝对 /data
路径),如果不是 return /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()
中的通配符,是吗?
谢谢,
一月
你可以使用这样的东西:
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 returns 指向为特定模式定制的 handle_wildcards 函数的指针。一旦知道通配符值,Snakemake 就会自动应用后者。在该函数内部,我们首先格式化模式,然后检查它是否存在于 /data
.
中
我有两个可以存储大量数据的位置:/data
和 /work
。
/data
是质量控制后(中间)结果移动到的文件夹。对于标准用户,它以只读方式安装。
/work
是写入新结果的文件夹。显然,它是可写的。
我不想将 /data
中的数据或 link 数据复制到 /work
。
所以我 运行 我的 snakemake 来自 /work
文件夹,并希望我的输入功能首先检查 [=] 中是否存在所需的文件12=](和 return 绝对 /data
路径),如果不是 return /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()
中的通配符,是吗?
谢谢, 一月
你可以使用这样的东西:
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 returns 指向为特定模式定制的 handle_wildcards 函数的指针。一旦知道通配符值,Snakemake 就会自动应用后者。在该函数内部,我们首先格式化模式,然后检查它是否存在于 /data
.