Как получить базовое имя для подстановочных значений в правиле вывода snakemake?
В следующем примере выходные файлы будут созданы в том же месте, что и входные файлы. Есть ли способ получить базовое имя подстановочного значения в разделе вывода, чтобы я мог использовать базовое имя входного файла, чтобы назвать выходной файл, но записать его в другое место?
infile=['/home/user/folder1/file1','/home/user/folder2/file2/']
rule one:
input: expand("{myfile}", myfile = infile)
output: "{myfile}" + ".out"
shell: "touch {wildcards.myfile}.out"
1 ответ
Существует простой способ сделать это в Snakemake, используя lambda
функция Python.
Сначала вы должны создать словарь ваших файлов с именем файла в качестве ключа и файла с путем в качестве значения следующим образом:
files = {'filesA' : 'path/to/fileA.ext', 'filesB' : 'path/to/fileB.ext'}
Этот словарь может быть в файле змеи или в файле конфигурации. Я предлагаю поместить это в файл конфигурации и назвать это так config['dict_name']
Итак, теперь давайте напишем ваше правило, используя lambda
функция:
rule all :
input :
#If you want to create in a different directory use this,
#but it has to be like output from rule one.
#expand('{directory}{filename}{extension}',
#directory = 'path/to/newdir',
#filename = config['dictname'].keys(),
#extension = '.out')
#Otherwise
expand('{filename}{extension}',
filename = config['dictname'].keys(),
extension = '.out')
rule one:
input: lambda wildcards: config['dictname'][wildcards.input]
output: "{input}" + ".out"
message: "Executing one using {input}"
shell: "touch {input}.out"
Здесь в коде у вас есть два правила, первое называется all
будет выполнен. Поэтому, когда вы запускаете snakemake
он захочет получить список файлов, соответствующих списку, созданному expand
функция.
Snakemake проверит, создает ли правило этот список файлов, если это не так, он будет искать их в каталоге. Как видите, вы можете указать все, что вы хотите с expand
каталоги, имена файлов, суффикс, префикс, расширение,...
В этом примере Snakemake хочет иметь несколько файлов с именами файлов словаря ключей и расширением .out
, Правило one
это идеальное правило для их производства.
Правило one
работает так: для каждого ключа словаря будет выполнено правило. Лямбда-функция в разделе ввода играет эту роль. Для записи подстановочный знак может называться как угодно input
это просто пример.
Чтобы быть более элегантным, вы можете поместить в переменную содержимое лямбда-функции следующим образом:
_input_One = lambda wildcards: config['dictname'][wildcards.input]
Затем напишите правило одного ввода следующим образом:
input: _input_One
Для получения дополнительной информации, пожалуйста, проверьте документацию на https://snakemake.readthedocs.io/en/stable/
Хьюго